commit e52ddb7dd44b7399c81ffa2142bfacdb29f23fac Author: wehub-resource-sync Date: Mon Jul 13 12:10:17 2026 +0800 chore: import upstream snapshot with attribution diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..789a761 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git/ +.vscode/ +static/ +tests/ +*.txt +!/requirements.txt +venv/ + diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 0000000..e5f6490 --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,10 @@ +#!/bin/sh +echo 'Activating update_sitesmd hook script...' +poetry run update_sitesmd + +echo 'Regenerating db_meta.json...' +poetry run python utils/generate_db_meta.py + +git add maigret/resources/db_meta.json +git add maigret/resources/data.json +git add sites.md diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..b8951c3 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,5 @@ +# These are supported funding model platforms + +patreon: soxoj +github: soxoj +buy_me_a_coffee: soxoj \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/add-a-site.md b/.github/ISSUE_TEMPLATE/add-a-site.md new file mode 100644 index 0000000..f17453b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/add-a-site.md @@ -0,0 +1,13 @@ +--- +name: Add a site +about: I want to add a new site for Maigret checks +title: New site +labels: new-site +assignees: soxoj + +--- + +Link to the site main page: https://example.com +Link to an existing account: https://example.com/users/john +Link to a nonexistent account: https://example.com/users/noonewouldeverusethis7 +Tags: photo, us, ... diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..c1295e7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,28 @@ +--- +name: Maigret bug report +about: I want to report a bug in Maigret functionality +title: '' +labels: bug +assignees: soxoj + +--- + +## Checklist + +- [ ] I'm reporting a bug in Maigret functionality +- [ ] I've checked for similar bug reports including closed ones +- [ ] I've checked for pull requests that attempt to fix this bug + +## Description + +Info about Maigret version you are running and environment (`--version`, operation system, ISP provider): + + +How to reproduce this bug (commandline options / conditions): + + + + + + + diff --git a/.github/ISSUE_TEMPLATE/report-false-result.md b/.github/ISSUE_TEMPLATE/report-false-result.md new file mode 100644 index 0000000..f757dcb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/report-false-result.md @@ -0,0 +1,20 @@ +--- +name: Report invalid result +about: I want to report invalid result of Maigret search +title: Invalid result +labels: false-result +assignees: soxoj + +--- + +Invalid link: + + + +- [ ] I'm sure that the link leads to "not found" page diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..b38df29 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "daily" diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml new file mode 100644 index 0000000..179ca62 --- /dev/null +++ b/.github/workflows/build-docker-image.yml @@ -0,0 +1,90 @@ +name: Build docker image and push to DockerHub + +on: + push: + branches: [ main, dev ] + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - + name: Checkout + uses: actions/checkout@v4 + - + name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - + name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + - + name: Extract metadata (CLI) + id: meta_cli + uses: docker/metadata-action@v5 + with: + images: ${{ secrets.DOCKER_HUB_USERNAME }}/maigret + # Order matters: last-listed tag is pushed last by buildx and shows + # up first in Docker Hub UI. So we want latest at the bottom. + tags: | + type=sha,prefix= + type=ref,event=branch + type=raw,value=latest,enable={{is_default_branch}} + - + name: Extract metadata (Web UI) + id: meta_web + uses: docker/metadata-action@v5 + with: + images: ${{ secrets.DOCKER_HUB_USERNAME }}/maigret + # Same ordering trick as above: `web` should rank above its siblings. + tags: | + type=sha,prefix=web- + type=ref,event=branch,suffix=-web + type=raw,value=web,enable={{is_default_branch}} + # Build Web UI first so CLI (`latest`) becomes the most-recent push + # and shows up at the top of the Docker Hub tags list. + - + name: Build and push (Web UI) + id: docker_build_web + uses: docker/build-push-action@v6 + with: + push: true + target: web + tags: ${{ steps.meta_web.outputs.tags }} + labels: ${{ steps.meta_web.outputs.labels }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + - + name: Build and push (CLI, default) + id: docker_build_cli + uses: docker/build-push-action@v6 + with: + push: true + target: cli + tags: ${{ steps.meta_cli.outputs.tags }} + labels: ${{ steps.meta_cli.outputs.labels }} + platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + - + name: Image digests + run: | + echo "cli: ${{ steps.docker_build_cli.outputs.digest }}" + echo "web: ${{ steps.docker_build_web.outputs.digest }}" + - + name: Update DockerHub repository description + if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch) + uses: peter-evans/dockerhub-description@v4 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + repository: ${{ secrets.DOCKER_HUB_USERNAME }}/maigret + short-description: ${{ github.event.repository.description }} + readme-filepath: ./README.md + enable-url-completion: true diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..745c89c --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,67 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ main ] + schedule: + - cron: '23 6 * * 6' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'python' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://git.io/codeql-language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/pyinstaller.yml b/.github/workflows/pyinstaller.yml new file mode 100644 index 0000000..60c539f --- /dev/null +++ b/.github/workflows/pyinstaller.yml @@ -0,0 +1,82 @@ +name: Package exe with PyInstaller - Windows + +on: + push: + branches: [main, dev] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + # Wine Python (not Linux) runs PyInstaller; altgraph needs pkg_resources — reinstall setuptools after all deps. + - name: Prepare requirements for Wine (setuptools last) + run: | + set -euo pipefail + cp pyinstaller/requirements.txt pyinstaller/requirements-wine.txt + { + echo "" + echo "# CI: setuptools last so pkg_resources exists for PyInstaller/altgraph in Wine" + echo "setuptools==70.0.0" + } >> pyinstaller/requirements-wine.txt + + - name: PyInstaller Windows Build + uses: JackMcKew/pyinstaller-action-windows@main + with: + path: pyinstaller + requirements: requirements-wine.txt + + - name: Upload PyInstaller Binary to Workflow as Artifact + if: success() + uses: actions/upload-artifact@v4 + with: + name: maigret_standalone_win32 + path: pyinstaller/dist/windows + + - name: Download PyInstaller Binary + if: success() + uses: actions/download-artifact@v4 + with: + name: maigret_standalone_win32 + + - name: Create New Release and Upload PyInstaller Binary to Release + if: success() + uses: ncipollo/release-action@v1.14.0 + id: create_release + with: + allowUpdates: true + draft: false + prerelease: false + artifactErrorsFailBuild: true + makeLatest: true + replacesArtifacts: true + artifacts: maigret_standalone.exe + name: Development Windows Release [${{ github.ref_name }}] + tag: ${{ github.ref_name }} + body: | + This is a development release built from the **${{ github.ref_name }}** branch. + + Take into account that `dev` releases may be unstable. + Please, use [the development release](https://github.com/soxoj/maigret/releases/tag/main) build from the **main** branch. + + ## How to run + + 1. Download the attached `maigret_standalone.exe`. + 2. Either: + - **Double-click it** — Maigret will ask you for a username, run a default search, and pause at the end so the output stays visible. + - **Run it from a terminal** for full options. Press `Win+R`, type `cmd`, hit Enter (or open PowerShell), then: + + ```cmd + cd %USERPROFILE%\Downloads + maigret_standalone.exe USERNAME + maigret_standalone.exe USERNAME --html :: also save an HTML report + maigret_standalone.exe --help :: list all options + ``` + + Video guide: https://youtu.be/qIgwTZOmMmM + Full documentation: https://maigret.readthedocs.io/en/latest/ + + env: + GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml new file mode 100644 index 0000000..6c2fa32 --- /dev/null +++ b/.github/workflows/python-package.yml @@ -0,0 +1,78 @@ +name: Linting and testing + +on: + push: + branches: [main] + pull_request: + branches: [main] + types: [opened, synchronize, reopened] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libcairo2-dev + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install poetry + python -m poetry install --with dev + + - name: Test with Coverage and Pytest (fail if coverage is low) + run: | + poetry run coverage run --source=./maigret -m pytest --reruns 3 --reruns-delay 5 tests + poetry run coverage report --fail-under=60 + poetry run coverage html + + - name: Upload coverage report + uses: actions/upload-artifact@v4 + with: + name: htmlcov-${{ strategy.job-index }} + path: htmlcov + + minimal-install: + # Verify a fresh `pip install maigret` succeeds and the test suite + # passes WITHOUT the optional [pdf] extra and WITHOUT system cairo. + # Catches regressions where core code accidentally grows a hard + # dependency on xhtml2pdf / pycairo / libcairo2. + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install Maigret without [pdf] extra (no libcairo on host) + run: | + python -m pip install --upgrade pip + pip install . + pip install pytest pytest-asyncio pytest-rerunfailures pytest-httpserver + + - name: Smoke-check the install + run: | + python -c "import maigret; from maigret.report import save_pdf_report; print('import OK')" + maigret --version + + - name: Run tests without [pdf] extra + run: pytest --reruns 3 --reruns-delay 5 tests \ No newline at end of file diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 0000000..679a113 --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,30 @@ +name: Upload Python Package to PyPI when a Release is Published + +on: + release: + types: [published] + +jobs: + pypi-publish: + name: Publish release to PyPI + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/maigret + permissions: + id-token: write + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install build + - name: Build package + run: | + python -m build + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/update-site-data.yml b/.github/workflows/update-site-data.yml new file mode 100644 index 0000000..aa1732e --- /dev/null +++ b/.github/workflows/update-site-data.yml @@ -0,0 +1,56 @@ +name: Update sites rating and statistics + +on: + push: + branches: [ main ] + +concurrency: + group: update-sites-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: main + fetch-depth: 0 # otherwise, there would be errors pushing refs to the destination repository. + + - name: Build application + run: | + pip3 install . + python3 ./utils/update_site_data.py --empty-only + + - name: Regenerate db_meta.json + run: python3 utils/generate_db_meta.py + + - name: Remove ambiguous main tag + run: git tag -d main || true + + - name: Check for meaningful changes + id: check + run: | + REAL_CHANGES=$(git diff --unified=0 sites.md | grep '^[+-][^+-]' | grep -v 'The list was updated at' | wc -l) + if [ "$REAL_CHANGES" -gt 0 ]; then + echo "has_changes=true" >> $GITHUB_OUTPUT + else + echo "has_changes=false" >> $GITHUB_OUTPUT + fi + + - name: Delete existing PR branch + if: steps.check.outputs.has_changes == 'true' + run: git push origin --delete auto/update-sites-list || true + + - name: Create Pull Request + if: steps.check.outputs.has_changes == 'true' + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "Updated site list and statistics" + title: "Automated Sites List Update" + body: "Automated changes to sites.md based on new Alexa rankings/statistics." + branch: "auto/update-sites-list" + base: main + delete-branch: true \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ef6ceb5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,51 @@ +# Virtual Environment +venv/ +.venv/ + +# Editor Configurations +.vscode/ +.idea/ + +# Python +__pycache__/ + +# Pip +src/ + +# Jupyter Notebook +.ipynb_checkpoints +*.ipynb + +# Logs and backups +*.log +*.bak + +# Output files, except requirements.txt +*.txt +!requirements.txt + +# Comma-Separated Values (CSV) Reports +*.csv + +# MacOS Folder Metadata File +.DS_Store +/reports/ + +# Testing +.coverage +dist/ +htmlcov/ +/test_* + +# Maigret files +settings.json + +# other +*.egg-info +build +LLM +lib +.claude/ + +# Sphinx i18n: .mo are compiled from .po at build time +docs/source/locale/**/*.mo diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..743c41b --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,16 @@ +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.10" + +sphinx: + configuration: docs/source/conf.py + +formats: + - pdf + +python: + install: + - requirements: docs/requirements.txt diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d5f8d1b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,990 @@ +# Changelog + +## [0.6.2] - 2026-07-01 + +## What's Changed +* Bump to 0.6.1 by @soxoj in https://github.com/soxoj/maigret/pull/2661 +* Document Tor/proxy usage, add Advanced usage docs section (closes #544) by @soxoj in https://github.com/soxoj/maigret/pull/2663 +* fix(checking): reject URLs and emails extracted as usernames by @soxoj in https://github.com/soxoj/maigret/pull/2673 +* fix(Instagram): refresh rate-limit marker for stale Login title by @soxoj in https://github.com/soxoj/maigret/pull/2674 +* build(deps-dev): bump black from 26.3.1 to 26.5.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2676 +* build(deps): bump aiodns from 4.0.0 to 4.0.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2677 +* build(deps-dev): bump tuna from 0.5.13 to 0.5.15 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2683 +* build(deps): bump lxml from 6.1.0 to 6.1.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2681 +* build(deps-dev): bump black from 26.5.0 to 26.5.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2680 +* Added donation links by @soxoj in https://github.com/soxoj/maigret/pull/2686 +* fix(web): sanitize username in report file paths to prevent path traversal by @sebastiondev in https://github.com/soxoj/maigret/pull/2678 +* Added 3 sites by @soxoj in https://github.com/soxoj/maigret/pull/2687 +* build(deps): bump yarl from 1.23.0 to 1.24.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2685 +* Windows version improvements and docs by @soxoj in https://github.com/soxoj/maigret/pull/2690 +* Enhance README with AI profiling and analysis details by @soxoj in https://github.com/soxoj/maigret/pull/2691 +* build(deps): bump aiodns from 4.0.3 to 4.0.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2684 +* build(deps): bump idna from 3.15 to 3.16 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2692 +* build(deps): bump certifi from 2026.4.22 to 2026.5.20 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2689 +* Add docs FAQ for top search queries; document translation workflow by @soxoj in https://github.com/soxoj/maigret/pull/2694 +* Fix docs build: dedup link targets, gate SVG badges to HTML by @soxoj in https://github.com/soxoj/maigret/pull/2695 +* build(deps-dev): bump pytest-rerunfailures from 16.2 to 16.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2698 +* Fix Chinese name false positives: add CJK regexCheck to 27 sites (#2633) by @soxoj in https://github.com/soxoj/maigret/pull/2699 +* Add Cloudflare bypass (FlareSolverr) support to web UI + docs by @soxoj in https://github.com/soxoj/maigret/pull/2700 +* build(deps): bump soupsieve from 2.8.3 to 2.8.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2697 +* feature: add keywords parameter and filter by its matching #979 by @dmarakom6 in https://github.com/soxoj/maigret/pull/2702 +* build(deps): bump socid-extractor from 0.0.28 to 0.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2703 +* build(deps-dev): bump pytest-asyncio from 1.3.0 to 1.4.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2704 +* build(deps-dev): bump coverage from 7.14.0 to 7.14.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2705 +* build(deps): bump platformdirs from 4.9.6 to 4.10.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2708 +* Docker build workflow: update README in DockerHub, change order of labels by @soxoj in https://github.com/soxoj/maigret/pull/2712 +* Dockerhub build update by @soxoj in https://github.com/soxoj/maigret/pull/2713 +* build(deps): bump idna from 3.16 to 3.17 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2711 +* Fix site checks: 4 fixed, 1 disabled by @soxoj in https://github.com/soxoj/maigret/pull/2715 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2716 +* Fix DNS resolver failures: classify aiodns errors, add --dns-resolver threaded fallback (#2688) by @soxoj in https://github.com/soxoj/maigret/pull/2717 +* Graceful Ctrl+C + error UX improvements by @soxoj in https://github.com/soxoj/maigret/pull/2719 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2720 +* Fix site checks: 1 fixed, 8 disabled, 2 added by @soxoj in https://github.com/soxoj/maigret/pull/2722 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2723 +* Added sponsor logo and text to the README files by @soxoj in https://github.com/soxoj/maigret/pull/2728 +* Added sponsor logo and CLI proxy recommendation by @soxoj in https://github.com/soxoj/maigret/pull/2729 +* refactor: update query for leetcode by @kaifcodec in https://github.com/soxoj/maigret/pull/2727 +* Sponsorship text update for README by @soxoj in https://github.com/soxoj/maigret/pull/2730 +* refactor: update instagram entry structure by @kaifcodec in https://github.com/soxoj/maigret/pull/2731 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2733 +* build(deps): bump aiohttp from 3.13.5 to 3.14.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2736 +* Update PDF dependency for web variant by @7677865466 in https://github.com/soxoj/maigret/pull/2739 +* build(deps): bump idna from 3.17 to 3.18 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2735 +* Warn on engine dict merge conflicts by @puneetdixit200 in https://github.com/soxoj/maigret/pull/2737 +* Fix site checks: 2 fixed, 2 disabled by @soxoj in https://github.com/soxoj/maigret/pull/2745 +* Refactor error detection and username extraction by @ashton-andersonaap in https://github.com/soxoj/maigret/pull/2701 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2747 +* fix: update_site() now replaces list element instead of local variable by @ashvinctrl in https://github.com/soxoj/maigret/pull/2751 +* build(deps): bump aiohttp from 3.14.0 to 3.14.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2748 +* fix: pass value v not key k to is_country_tag in generate_report_context by @ashvinctrl in https://github.com/soxoj/maigret/pull/2753 +* Add Tor entries for Whonix Forum and Stacker News by @nyxst4ck in https://github.com/soxoj/maigret/pull/2755 +* build(deps): bump pypdf from 6.10.2 to 6.12.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2767 +* Fix async activation retry handling by @fancyboi999 in https://github.com/soxoj/maigret/pull/2765 +* build(deps-dev): bump pytest from 9.0.3 to 9.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2772 +* build(deps): bump pyinstaller from 6.20.0 to 6.21.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2773 +* fix(data): fix absence string for myjane by @0xseal in https://github.com/soxoj/maigret/pull/2770 +* build(deps): bump cryptography from 46.0.7 to 48.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2775 +* build(deps): bump pypdf from 6.12.0 to 6.13.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2776 +* build(deps): bump svglib from 1.6.0 to 2.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2777 +* Add AI Wiki links by @soxoj in https://github.com/soxoj/maigret/pull/2778 +* build(deps): bump svglib from 2.0.0 to 2.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2782 +* docs: fix typos by @juliosuas in https://github.com/soxoj/maigret/pull/2779 +* build(deps): bump certifi from 2026.5.20 to 2026.6.17 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2781 +* Fix HackerNews and Rajce.net false positives by @Ashley-996 in https://github.com/soxoj/maigret/pull/2780 +* build(deps): bump svglib from 2.0.1 to 2.0.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2783 +* build(deps): bump pypdf from 6.13.0 to 6.13.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2784 +* Update README with sponsorship details by @soxoj in https://github.com/soxoj/maigret/pull/2785 +* ORCID support by @soxoj in https://github.com/soxoj/maigret/pull/2786 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2787 +* Fix error-percentage rounding tripping thresholds at whole-percent granularity by @jichaowang02-lang in https://github.com/soxoj/maigret/pull/2788 +* Code cleanup and refactoring after ponytail audit by @soxoj in https://github.com/soxoj/maigret/pull/2789 +* build(deps-dev): bump pytest from 9.1.0 to 9.1.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2793 +* test: cover #2666 TODO-test paths (cookie_jar, extract_ids_from_results) by @aznikline in https://github.com/soxoj/maigret/pull/2795 +* build(deps): update stem requirement from >=1.8.1 to >=1.8.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2790 +* build(deps): update chardet requirement from >=5.0.0 to >=7.4.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2797 +* refactor: drop dead 'if not dictionary' guards across report paths by @aznikline in https://github.com/soxoj/maigret/pull/2796 +* build(deps-dev): bump coverage from 7.14.1 to 7.14.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2798 +* build(deps): update requests-futures requirement from >=1.0.0 to >=1.0.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2794 +* build(deps): update mock requirement from >=4.0.3 to >=5.2.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2791 +* build(deps): update future requirement from >=0.18.3 to >=1.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2792 +* Refactor sponsor section in README.md by @soxoj in https://github.com/soxoj/maigret/pull/2799 +* Add archive.org and archive.is links to profile URL blocks by @yyq1043-cloud in https://github.com/soxoj/maigret/pull/2803 +* Fix get_dict_ascii_tree ignoring new_line=False by @jichaowang02-lang in https://github.com/soxoj/maigret/pull/2805 +* Compare raw error percentage against threshold (don't round before the check) by @jichaowang02-lang in https://github.com/soxoj/maigret/pull/2809 +* Fix URLMatcher eating leading host characters (unescaped dots in www./m. prefix) by @jichaowang02-lang in https://github.com/soxoj/maigret/pull/2808 +* fix: preserve report error reasons by @Sushanth012 in https://github.com/soxoj/maigret/pull/2802 +* Add Neo4j Cypher export (--neo4j) by @thunderstornX in https://github.com/soxoj/maigret/pull/2774 +* Added docs for Neo4j integration by @soxoj in https://github.com/soxoj/maigret/pull/2818 +* Make include-tag site filter case-insensitive (match the exclude filter) by @jichaowang02-lang in https://github.com/soxoj/maigret/pull/2811 +* build(deps): bump python-bidi from 0.6.10 to 0.6.11 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2825 +* Fix site checks: 6 fixed, 5 disabled by @soxoj in https://github.com/soxoj/maigret/pull/2826 + +## New Contributors +* @sebastiondev made their first contribution in https://github.com/soxoj/maigret/pull/2678 +* @dmarakom6 made their first contribution in https://github.com/soxoj/maigret/pull/2702 +* @kaifcodec made their first contribution in https://github.com/soxoj/maigret/pull/2727 +* @7677865466 made their first contribution in https://github.com/soxoj/maigret/pull/2739 +* @puneetdixit200 made their first contribution in https://github.com/soxoj/maigret/pull/2737 +* @ashton-andersonaap made their first contribution in https://github.com/soxoj/maigret/pull/2701 +* @ashvinctrl made their first contribution in https://github.com/soxoj/maigret/pull/2751 +* @nyxst4ck made their first contribution in https://github.com/soxoj/maigret/pull/2755 +* @fancyboi999 made their first contribution in https://github.com/soxoj/maigret/pull/2765 +* @0xseal made their first contribution in https://github.com/soxoj/maigret/pull/2770 +* @Ashley-996 made their first contribution in https://github.com/soxoj/maigret/pull/2780 +* @jichaowang02-lang made their first contribution in https://github.com/soxoj/maigret/pull/2788 +* @aznikline made their first contribution in https://github.com/soxoj/maigret/pull/2795 +* @yyq1043-cloud made their first contribution in https://github.com/soxoj/maigret/pull/2803 +* @Sushanth012 made their first contribution in https://github.com/soxoj/maigret/pull/2802 +* @thunderstornX made their first contribution in https://github.com/soxoj/maigret/pull/2774 + +**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.6.1...v0.6.2 + +## [0.6.1] - 2026-05-15 + +## What's Changed +* build(deps): bump pypdf from 6.9.2 to 6.10.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2512 +* Fix duplicate attribute initialization in SimpleAiohttpChecker.__init__ by @MichaelMVS in https://github.com/soxoj/maigret/pull/2513 +* Support Python 3.14 in tests by @soxoj in https://github.com/soxoj/maigret/pull/2515 +* build(deps-dev): bump tuna from 0.5.11 to 0.5.13 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2516 +* build(deps): bump lxml from 6.0.3 to 6.0.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2519 +* build(deps): bump chardet from 7.4.1 to 7.4.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2517 +* build(deps-dev): bump mypy from 1.20.0 to 1.20.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2518 +* build(deps): bump pillow from 12.1.1 to 12.2.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2520 +* build(deps): bump chardet from 7.4.2 to 7.4.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2521 +* build(deps): bump pypdf from 6.10.0 to 6.10.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2527 +* Checks fixes by @soxoj in https://github.com/soxoj/maigret/pull/2528 +* Update of Readme and documentation by @soxoj in https://github.com/soxoj/maigret/pull/2514 +* build(deps): bump lxml from 6.0.4 to 6.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2533 +* Fix site checks: recover 6 CF sites via tls_fingerprint, 500px GraphQ… by @soxoj in https://github.com/soxoj/maigret/pull/2535 +* fix site checks: 14 sites → ip_reputation, 7 disabled, 5 dead deleted by @soxoj in https://github.com/soxoj/maigret/pull/2536 +* Fix site checks: 4 fixed, 14 → ip_reputation, 8 disabled, 5 dead deleted by @soxoj in https://github.com/soxoj/maigret/pull/2537 +* Fix site checks: 3 fixed, 2 → ip_reputation, 7 disabled, 1 dead deleted by @soxoj in https://github.com/soxoj/maigret/pull/2539 +* Add 3 crypto sites (Polymarket, Zora, Revolut.me), added crypto inves… by @soxoj in https://github.com/soxoj/maigret/pull/2538 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2541 +* Fix site checks: 3 fixed, 2 → ip_reputation, 7 disabled, 1 dead deleted by @soxoj in https://github.com/soxoj/maigret/pull/2543 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2545 +* Add OnlyFans with activation mechanism; updated site ranks by @soxoj in https://github.com/soxoj/maigret/pull/2546 +* build(deps-dev): bump mypy from 1.20.1 to 1.20.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2547 +* build(deps): bump idna from 3.11 to 3.12 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2548 +* Fix site checks: 3 → ip_reputation, 10 fixed, 6 disabled, 2 dead deleted by @soxoj in https://github.com/soxoj/maigret/pull/2549 +* Fix site checks: 12 fixed, 19 disabled; add new protection tags by @soxoj in https://github.com/soxoj/maigret/pull/2550 +* build(deps): bump certifi from 2026.2.25 to 2026.4.22 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2552 +* AI mode by @soxoj in https://github.com/soxoj/maigret/pull/2529 +* Fix site checks: 4 → ip_reputation, 9 fixed, 16 disabled, 3 dead dele… by @soxoj in https://github.com/soxoj/maigret/pull/2555 +* Fix Google Cloud Shell launch by @soxoj in https://github.com/soxoj/maigret/pull/2557 +* build(deps): bump pyinstaller from 6.19.0 to 6.20.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2554 +* build(deps): bump idna from 3.12 to 3.13 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2553 +* test: loosen executor timing upper bounds for slower CI by @juliosuas in https://github.com/soxoj/maigret/pull/2558 +* Fix site checks: 5 fixed; readme fix by @soxoj in https://github.com/soxoj/maigret/pull/2562 +* Add Docker web image with multi-stage building by @soxoj in https://github.com/soxoj/maigret/pull/2564 +* Fix site checks: 7 fixed, 1 disabled by @soxoj in https://github.com/soxoj/maigret/pull/2565 +* Fix site checks: 5 fixed, 4 disabled; fix UA leak bug by @soxoj in https://github.com/soxoj/maigret/pull/2569 +* build(deps): bump arabic-reshaper from 3.0.0 to 3.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2573 +* Add site checks: 18 new sites by @soxoj in https://github.com/soxoj/maigret/pull/2575 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2576 +* build(deps): bump reportlab from 4.4.10 to 4.5.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2578 +* Fix ID extraction crash when regex groups are optional by @egrezeli in https://github.com/soxoj/maigret/pull/2572 +* Update CONTRIBUTING.md with instructions for developers by @soxoj in https://github.com/soxoj/maigret/pull/2589 +* Fix outdated Google Colab setup and dependency installation by @SayanDey322 in https://github.com/soxoj/maigret/pull/2591 +* fix: disable RomanticCollection check by @juliosuas in https://github.com/soxoj/maigret/pull/2588 +* docs: add Simplified Chinese (zh-CN) README translation by @whtis in https://github.com/soxoj/maigret/pull/2606 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2607 +* Improve startup error message for missing dependencies by @SayanDey322 in https://github.com/soxoj/maigret/pull/2593 +* Modernize python package workflow by @SayanDey322 in https://github.com/soxoj/maigret/pull/2594 +* Fix site checks: 8 → ip_reputation, 6 fixed, 9 disabled, 1 dead deleted by @soxoj in https://github.com/soxoj/maigret/pull/2611 +* Reddit fix by @soxoj in https://github.com/soxoj/maigret/pull/2614 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2615 +* Fix site checks: 7 fixed, 1 disabled, 1 dead deleted by @soxoj in https://github.com/soxoj/maigret/pull/2616 +* Fixed duplicates of YouTube and Periscope by @soxoj in https://github.com/soxoj/maigret/pull/2618 +* Fix network graph height to be viewport-responsive instead of fixed 750px by @SayanDey322 in https://github.com/soxoj/maigret/pull/2590 +* Add web interface tests by @soxoj in https://github.com/soxoj/maigret/pull/2619 +* refactor:reduces the cognitive complexity of get_ai_analysis by @odanilosalve in https://github.com/soxoj/maigret/pull/2581 +* AI mode documentation by @soxoj in https://github.com/soxoj/maigret/pull/2620 +* build(deps): bump python-bidi from 0.6.7 to 0.6.9 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2622 +* build(deps-dev): bump mypy from 1.20.2 to 2.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2625 +* Cloudflare bypass webgate by @soxoj in https://github.com/soxoj/maigret/pull/2628 +* Fix context field using class instead of instance in error handling by @disappear00 in https://github.com/soxoj/maigret/pull/2627 +* Add test for CheckError bug by @soxoj in https://github.com/soxoj/maigret/pull/2631 +* Update download badge links in README.md by @soxoj in https://github.com/soxoj/maigret/pull/2636 +* fix(security): harden /reports path containment via send_from_directory by @aaronjmars in https://github.com/soxoj/maigret/pull/2635 +* build(deps-dev): bump coverage from 7.13.5 to 7.14.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2638 +* build(deps): bump idna from 3.13 to 3.14 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2639 +* Update links to the community Telegram bot by @soxoj in https://github.com/soxoj/maigret/pull/2641 +* build(deps): bump urllib3 from 2.6.3 to 2.7.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2642 +* build(deps-dev): bump mypy from 2.0.0 to 2.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2644 +* Refresh stale Duolingo usernameClaimed sample (blue → duolingo) by @razbenya in https://github.com/soxoj/maigret/pull/2650 +* Fix linktr.ee detector (status_code, not stale message check) by @razbenya in https://github.com/soxoj/maigret/pull/2649 +* Apply --proxy to CurlCffiChecker (tls_fingerprint sites) by @razbenya in https://github.com/soxoj/maigret/pull/2648 +* Refresh stale Gravatar usernameClaimed sample (blue → automattic) by @razbenya in https://github.com/soxoj/maigret/pull/2651 +* Add regression tests for CurlCffiChecker proxy forwarding (#2648 follow-up) by @razbenya in https://github.com/soxoj/maigret/pull/2652 +* build(deps): bump idna from 3.14 to 3.15 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2647 +* build(deps): bump reportlab from 4.5.0 to 4.5.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2645 +* build(deps): bump requests from 2.33.1 to 2.34.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2656 +* build(deps-dev): bump pytest-rerunfailures from 16.1 to 16.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2654 +* build(deps): bump python-bidi from 0.6.9 to 0.6.10 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2655 +* Make xhtml2pdf optional, fix install on Linux without libcairo by @soxoj in https://github.com/soxoj/maigret/pull/2659 +* build(deps): bump requests from 2.34.1 to 2.34.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2658 +* Fix site checks: 2 fixed, 3 disabled; add Faceit; fix utils import by @soxoj in https://github.com/soxoj/maigret/pull/2660 + +**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.6.0...v0.6.1 + +## [0.6.0] - 2025-04-10 + +## What's Changed +* Updated workflows: added 3.13 to test, updated pypi upload by @soxoj in https://github.com/soxoj/maigret/pull/2111 +* Bump pypdf from 5.1.0 to 6.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2122 +* Bump coverage from 7.9.2 to 7.10.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2117 +* Bump soupsieve from 2.6 to 2.7 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2118 +* Bump mock from 5.1.0 to 5.2.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2116 +* Bump pytest-asyncio from 1.0.0 to 1.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2114 +* Bump pytest-cov from 6.0.0 to 6.2.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2115 +* Bump xhtml2pdf from 0.2.16 to 0.2.17 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2149 +* Bump requests from 2.32.4 to 2.32.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2165 +* Bump lxml from 5.3.0 to 6.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2146 +* Bump aiodns from 3.2.0 to 3.5.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2148 +* Bump alive-progress from 3.2.0 to 3.3.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2145 +* Bump certifi from 2025.6.15 to 2025.8.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2147 +* Disabled some sites giving false positive results by @soxoj in https://github.com/soxoj/maigret/pull/2170 +* Bump flask from 3.1.1 to 3.1.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2175 +* Bump pyinstaller from 6.11.1 to 6.15.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2174 +* Bump mypy from 1.14.1 to 1.17.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2173 +* Bump pytest from 8.3.4 to 8.4.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2172 +* Bump flake8 from 7.1.1 to 7.3.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2171 +* Bump aiohttp from 3.12.14 to 3.12.15 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2181 +* Bump coverage from 7.10.3 to 7.10.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2180 +* Bump psutil from 6.1.1 to 7.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2179 +* Bump lxml from 6.0.0 to 6.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2178 +* Bump multidict from 6.6.3 to 6.6.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2177 +* Bump soupsieve from 2.7 to 2.8 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2185 +* Bump typing-extensions from 4.14.1 to 4.15.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2182 +* Bump python-bidi from 0.6.3 to 0.6.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2183 +* Bump platformdirs from 4.3.8 to 4.4.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2184 +* Make web interface accessible for Docker deployment by default by @soxoj in https://github.com/soxoj/maigret/pull/2189 +* Bump coverage from 7.10.5 to 7.10.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2192 +* Bump pytest-rerunfailures from 15.1 to 16.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2191 +* Bump pytest-rerunfailures from 15.1 to 16.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2193 +* Bump pytest from 8.4.1 to 8.4.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2194 +* Bump pytest-cov from 6.2.1 to 6.3.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2195 +* Bump pytest-cov from 6.3.0 to 7.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2196 +* Bump mypy from 1.17.1 to 1.18.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2197 +* Bump black from 25.1.0 to 25.9.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2203 +* Bump mypy from 1.18.1 to 1.18.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2202 +* Bump pytest-asyncio from 1.1.0 to 1.2.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2200 +* Bump pyinstaller from 6.15.0 to 6.16.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2199 +* Bump reportlab from 4.4.3 to 4.4.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2206 +* Bump coverage from 7.10.6 to 7.10.7 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2207 +* Bump psutil from 7.0.0 to 7.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2201 +* Bump asgiref from 3.9.1 to 3.9.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2204 +* Bump lxml from 6.0.1 to 6.0.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2208 +* Bump platformdirs from 4.4.0 to 4.5.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2223 +* Bump asgiref from 3.9.2 to 3.10.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2220 +* Bump yarl from 1.20.1 to 1.22.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2221 +* Bump markupsafe from 3.0.2 to 3.0.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2209 +* Bump multidict from 6.6.4 to 6.7.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2224 +* Bump idna from 3.10 to 3.11 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2227 +* Bump aiohttp from 3.12.15 to 3.13.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2225 +* Bump coverage from 7.10.7 to 7.11.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2230 +* Bump certifi from 2025.8.3 to 2025.10.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2228 +* Bump pytest-rerunfailures from 16.0.1 to 16.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2229 +* Bump attrs from 25.3.0 to 25.4.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2226 +* Bump aiohttp from 3.13.0 to 3.13.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2237 +* Bump pypdf from 6.0.0 to 6.1.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2233 +* Bump black from 25.9.0 to 25.11.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2239 +* Bump python-bidi from 0.6.6 to 0.6.7 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2234 +* Bump psutil from 7.1.0 to 7.1.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2240 +* Bump coverage from 7.11.0 to 7.12.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2241 +* Bump werkzeug from 3.1.3 to 3.1.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2248 +* Bump pypdf from 6.1.3 to 6.4.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2245 +* Bump asgiref from 3.10.0 to 3.11.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2243 +* Bump pytest-asyncio from 1.2.0 to 1.3.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2242 +* Bump aiohttp from 3.13.2 to 3.13.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2261 +* Bump pytest from 8.4.2 to 9.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2244 +* Bump mypy from 1.18.2 to 1.19.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2250 +* ♻️ Refactor: Hardcoded relative path for database file by @tang-vu in https://github.com/soxoj/maigret/pull/2285 +* ✨ Quality: Missing tests for settings cascade and override logic by @tang-vu in https://github.com/soxoj/maigret/pull/2287 +* ✨ Quality: Unexpanded tilde in file path by @tang-vu in https://github.com/soxoj/maigret/pull/2283 +* Bump urllib3 from 2.5.0 to 2.6.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2262 +* Bump pillow from 11.0.0 to 12.1.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2271 +* Bump black from 25.11.0 to 26.3.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2280 +* Bump cryptography from 44.0.1 to 46.0.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2270 +* Bump pypdf from 6.4.0 to 6.9.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2281 +* Dockerfile fix by @soxoj in https://github.com/soxoj/maigret/pull/2290 +* Fixed false positives in top-500 by @soxoj in https://github.com/soxoj/maigret/pull/2292 +* Update Telegram bot link in README by @soxoj in https://github.com/soxoj/maigret/pull/2293 +* Pyinstaller GitHub workflow fix by @soxoj in https://github.com/soxoj/maigret/pull/2298 +* Twitter fixed, mirrors mechanism improvement by @soxoj in https://github.com/soxoj/maigret/pull/2299 +* build(deps): bump flask from 3.1.2 to 3.1.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2289 +* Bump reportlab from 4.4.4 to 4.4.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2251 +* build(deps): bump werkzeug from 3.1.4 to 3.1.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2288 +* Bump certifi from 2025.10.5 to 2025.11.12 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2249 +* Update Telegram bot link in README by @soxoj in https://github.com/soxoj/maigret/pull/2300 +* Improve site-check quality by @soxoj in https://github.com/soxoj/maigret/pull/2301 +* feat(sites): fix false positives: disable 74 broken sites, fix 8 with… by @soxoj in https://github.com/soxoj/maigret/pull/2302 +* Update sites list workflow by @soxoj in https://github.com/soxoj/maigret/pull/2303 +* Bump svglib from 1.5.1 to 1.6.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2205 +* feat(workflow): fix update site data workflow dependency by @soxoj in https://github.com/soxoj/maigret/pull/2306 +* Re-enable taplink.cc with browser User-Agent to bypass Cloudflare by @Copilot in https://github.com/soxoj/maigret/pull/2308 +* feat(workflow): fix update site data workflow err by @soxoj in https://github.com/soxoj/maigret/pull/2312 +* Update site data workflow fix: remove ambiguous main tag by @soxoj in https://github.com/soxoj/maigret/pull/2313 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2314 +* Fix Love.Mail.ru: update to numeric-only identifiers and new profile URL by @Copilot in https://github.com/soxoj/maigret/pull/2307 +* Remove dead site xxxforum.org by @Copilot in https://github.com/soxoj/maigret/pull/2310 +* Disable forums.developer.nvidia.com (auth-gated user profiles) by @Copilot in https://github.com/soxoj/maigret/pull/2305 +* Pin requests-toolbelt>=1.0.0 to fix urllib3 v2 incompatibility by @Copilot in https://github.com/soxoj/maigret/pull/2316 +* build(deps): bump reportlab from 4.4.5 to 4.4.10 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2323 +* build(deps-dev): bump coverage from 7.12.0 to 7.13.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2321 +* build(deps-dev): bump pytest-cov from 7.0.0 to 7.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2320 +* build(deps): bump aiohttp-socks from 0.10.1 to 0.11.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2319 +* Disable false-positive site probe: amateurvoyeurforum.com by @Copilot in https://github.com/soxoj/maigret/pull/2332 +* Disable forums.stevehoffman.tv due to false positives by @Copilot in https://github.com/soxoj/maigret/pull/2331 +* [WIP] Fix false-positive probe for vegalab site by @Copilot in https://github.com/soxoj/maigret/pull/2336 +* Fix RoyalCams site check using BongaCams white-label pattern by @Copilot in https://github.com/soxoj/maigret/pull/2334 +* Fix Setlist site check: switch to message checkType with proper markers by @Copilot in https://github.com/soxoj/maigret/pull/2333 +* [WIP] Fix invalid link on forums.imore.com by @Copilot in https://github.com/soxoj/maigret/pull/2337 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2315 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2339 +* Fix false-positive site probe: Re-enable Taplink with message checkType by @Copilot in https://github.com/soxoj/maigret/pull/2326 +* build(deps): bump aiodns from 3.5.0 to 4.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2345 +* build(deps-dev): bump mypy from 1.19.0 to 1.19.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2347 +* Disable Librusec site check (false positive) by @Copilot in https://github.com/soxoj/maigret/pull/2349 +* Disable MirTesen site check (false positive) by @Copilot in https://github.com/soxoj/maigret/pull/2350 +* build(deps): bump attrs from 25.4.0 to 26.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2344 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2341 +* feat: add cybersecurity platforms + re-enable Root-Me by @juliosuas in https://github.com/soxoj/maigret/pull/2318 +* Fix club.cnews.ru false positive: switch from status_code to message checkType by @Copilot in https://github.com/soxoj/maigret/pull/2342 +* Fix SoundCloud false-positive: switch to message-based check by @Copilot in https://github.com/soxoj/maigret/pull/2355 +* build(deps): bump certifi from 2025.11.12 to 2026.2.25 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2346 +* feat: add tag blacklisting via `--exclude-tags` by @Copilot in https://github.com/soxoj/maigret/pull/2352 +* Fix domain substring matching and NoneType crash in submit dialog by @Copilot in https://github.com/soxoj/maigret/pull/2367 +* feat(core): add POST request support, new sites, migrate to Majestic Million ranking by @soxoj in https://github.com/soxoj/maigret/pull/2317 +* Fix update-site-data workflow race condition on branch push by @Copilot in https://github.com/soxoj/maigret/pull/2366 +* Fix false-positive site checks reported by Maigret Bot by @soxoj in https://github.com/soxoj/maigret/pull/2376 +* build(deps): bump pycountry from 24.6.1 to 26.2.16 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2382 +* Added Max.ru check; --no-progressbar flag fixed by @soxoj in https://github.com/soxoj/maigret/pull/2386 +* build(deps): bump asgiref from 3.11.0 to 3.11.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2384 +* build(deps): bump yarl from 1.22.0 to 1.23.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2383 +* build(deps): bump pypdf from 6.9.1 to 6.9.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2392 +* build(deps-dev): bump pytest-httpserver from 1.1.0 to 1.1.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2397 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2399 +* build(deps): bump requests from 2.32.5 to 2.33.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2394 +* Readme update: commercial use by @soxoj in https://github.com/soxoj/maigret/pull/2403 +* build(deps): bump pyinstaller from 6.16.0 to 6.19.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2405 +* build(deps): bump psutil from 7.1.3 to 7.2.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2406 +* build(deps-dev): bump pytest from 9.0.1 to 9.0.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2381 +* build(deps): bump soupsieve from 2.8 to 2.8.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2404 +* Sites re-check by @soxoj in https://github.com/soxoj/maigret/pull/2423 +* Add urlProbes by @soxoj in https://github.com/soxoj/maigret/pull/2425 +* build(deps): bump cryptography from 46.0.5 to 46.0.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2422 +* Tags and site names improvements by @soxoj in https://github.com/soxoj/maigret/pull/2427 +* Overhaul site tags and naming: add social tag to 33 networks, fill mi… by @soxoj in https://github.com/soxoj/maigret/pull/2430 +* build(deps): bump multidict from 6.7.0 to 6.7.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2396 +* build(deps): bump chardet from 5.2.0 to 7.4.0.post2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2436 +* build(deps): bump platformdirs from 4.5.0 to 4.9.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2434 +* build(deps): bump aiohttp from 3.13.3 to 3.13.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2435 +* build(deps): bump pygments from 2.18.0 to 2.20.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2440 +* build(deps): bump requests from 2.33.0 to 2.33.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2444 +* build(deps-dev): bump mypy from 1.19.1 to 1.20.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2447 +* build(deps): bump aiohttp from 3.13.4 to 3.13.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2448 +* Add site protection tracking system, fix broken site checks (Instagra… by @soxoj in https://github.com/soxoj/maigret/pull/2452 +* Multiple lint and types fixes by @soxoj in https://github.com/soxoj/maigret/pull/2454 +* fix(data): update InterPals absence string to match current site response by @juliosuas in https://github.com/soxoj/maigret/pull/2442 +* Update of MIT License by @soxoj in https://github.com/soxoj/maigret/pull/2455 +* Added Crypto/Web3 site checks by @soxoj in https://github.com/soxoj/maigret/pull/2457 +* DB update mechanism by @soxoj in https://github.com/soxoj/maigret/pull/2458 +* Fix false positives by @soxoj in https://github.com/soxoj/maigret/pull/2459 +* False positive fixes by @soxoj in https://github.com/soxoj/maigret/pull/2460 +* build(deps): bump curl-cffi from 0.14.0 to 0.15.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2462 +* Add Markdown reports for LLM analysis by @soxoj in https://github.com/soxoj/maigret/pull/2463 +* Sites fixes by @soxoj in https://github.com/soxoj/maigret/pull/2464 +* Add installation troubleshooting for missing system dependencies by @Copilot in https://github.com/soxoj/maigret/pull/2465 +* Fix Spotify, add Spotify Community forum by @soxoj in https://github.com/soxoj/maigret/pull/2467 +* Fix crash on `-a --self-check` by adding exception handling to site check coroutines by @Copilot in https://github.com/soxoj/maigret/pull/2466 +* Fix failing test for custom DB path resolution by @soxoj in https://github.com/soxoj/maigret/pull/2468 +* Bump lxml minimum to 6.0.2 for Python 3.14 compatibility by @ocervell in https://github.com/soxoj/maigret/pull/2279 +* build(deps-dev): bump pytest from 9.0.2 to 9.0.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2473 +* Update HackTheBox and Wikipedia to use new API endpoints by @Copilot in https://github.com/soxoj/maigret/pull/2470 +* Automated Sites List Update by @github-actions[bot] in https://github.com/soxoj/maigret/pull/2474 +* build(deps): bump chardet from 7.4.0.post2 to 7.4.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2472 +* build(deps): bump cryptography from 46.0.6 to 46.0.7 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2475 +* vBulletin cleanup, Flarum sites, engine stats, UA bump by @soxoj in https://github.com/soxoj/maigret/pull/2476 +* build(deps): bump platformdirs from 4.9.4 to 4.9.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2477 +* Re-enable 69 stale-disabled sites validated via self-check by @soxoj in https://github.com/soxoj/maigret/pull/2478 +* Fix false positives by @soxoj in https://github.com/soxoj/maigret/pull/2499 +* build(deps): bump socid-extractor from 0.0.27 to 0.0.28 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2502 +* build(deps): bump lxml from 6.0.2 to 6.0.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2501 +* Disable Kinja.com site check by @Copilot in https://github.com/soxoj/maigret/pull/2503 +* Added 3 sites, fixed 6, disabled 8 by @soxoj in https://github.com/soxoj/maigret/pull/2505 +* Bump to 0.6.0 by @soxoj in https://github.com/soxoj/maigret/pull/2506 +* Update workflow to trigger on published releases by @soxoj in https://github.com/soxoj/maigret/pull/2508 + +**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.5.0...v0.6.0 + +## [0.5.0] - 2025-08-10 +* Site Supression by @C3n7ral051nt4g3ncy in https://github.com/soxoj/maigret/pull/627 +* Bump yarl from 1.7.2 to 1.8.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/626 +* Streaming sites by @soxoj in https://github.com/soxoj/maigret/pull/628 +* Mirrors by @fen0s in https://github.com/soxoj/maigret/pull/630 +* Added Instagram scrapers by @soxoj in https://github.com/soxoj/maigret/pull/633 +* Bump psutil from 5.9.1 to 5.9.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/624 +* Bump pypdf2 from 2.10.4 to 2.10.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/625 +* Invalid results fixes by @soxoj in https://github.com/soxoj/maigret/pull/634 +* Bump pytest-httpserver from 1.0.5 to 1.0.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/638 +* Bump pypdf2 from 2.10.5 to 2.10.8 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/641 +* Bump certifi from 2022.6.15 to 2022.9.14 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/644 +* Bump idna from 3.3 to 3.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/640 +* fix false positives from bot by @fen0s in https://github.com/soxoj/maigret/pull/663 +* Add pre commit hook by @fen0s in https://github.com/soxoj/maigret/pull/664 +* site deletion by @C3n7ral051nt4g3ncy in https://github.com/soxoj/maigret/pull/648 +* Changed docker run to interactive and remove on exit by @dr-BEat in https://github.com/soxoj/maigret/pull/675 +* Corrected grammar in README.md by @Trkzi-Omar in https://github.com/soxoj/maigret/pull/674 +* fix sites from issues by @fen0s in https://github.com/soxoj/maigret/pull/680 +* correct username in usage examples by @LeonGr in https://github.com/soxoj/maigret/pull/673 +* Update README.md by @johanburati in https://github.com/soxoj/maigret/pull/669 +* Fix typos by @LorenzoSapora in https://github.com/soxoj/maigret/pull/681 +* Build docker images for arm64 and amd64 by @krydos in https://github.com/soxoj/maigret/pull/687 +* Bump certifi from 2022.9.14 to 2022.9.24 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/652 +* Bump aiohttp from 3.8.1 to 3.8.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/651 +* Bump arabic-reshaper from 2.1.3 to 2.1.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/650 +* Update README.md, Repl.it -> Replit with new badge by @PeterDaveHello in https://github.com/soxoj/maigret/pull/692 +* Refactor Dockerfile with best practices by @PeterDaveHello in https://github.com/soxoj/maigret/pull/691 +* Improve README.md Installation section by @PeterDaveHello in https://github.com/soxoj/maigret/pull/690 +* Bump pytest-cov from 3.0.0 to 4.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/688 +* Bump stem from 1.8.0 to 1.8.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/689 +* Bump typing-extensions from 4.3.0 to 4.4.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/698 +* Typo fixes in error.py by @Ben-Chapman in https://github.com/soxoj/maigret/pull/711 +* Fixed docs about tags by @soxoj in https://github.com/soxoj/maigret/pull/715 +* Fixed lightstalking.com by @soxoj in https://github.com/soxoj/maigret/pull/716 +* Fixed YouTube by @soxoj in https://github.com/soxoj/maigret/pull/717 +* Bump pytest-asyncio from 0.19.0 to 0.20.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/732 +* Updated snapcraft yaml by @kz6fittycent in https://github.com/soxoj/maigret/pull/720 +* Bump colorama from 0.4.5 to 0.4.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/733 +* Bump pytest from 7.1.3 to 7.2.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/734 +* disable not working sites by @fen0s in https://github.com/soxoj/maigret/pull/739 +* disable broken sites by @fen0s in https://github.com/soxoj/maigret/pull/756 +* Bump cloudscraper from 1.2.64 to 1.2.66 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/769 +* fix opensea and shutterstock, disable a few dead sites by @fen0s in https://github.com/soxoj/maigret/pull/798 +* Fixed documentation URL by @soxoj in https://github.com/soxoj/maigret/pull/799 +* Small readme fix by @soxoj in https://github.com/soxoj/maigret/pull/857 +* docs spelling error by @Nadeem-05 in https://github.com/soxoj/maigret/pull/866 +* Fix Pinterest false positive by @therealchiendat in https://github.com/soxoj/maigret/pull/862 +* Added new Websites by @codyMar30 in https://github.com/soxoj/maigret/pull/838 +* Update "future" package to v0.18.3 by @PeterDaveHello in https://github.com/soxoj/maigret/pull/834 +* Bump certifi from 2022.9.24 to 2022.12.7 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/793 +* Update dependency - networkx from v2.5.1 to v2.6 by @PeterDaveHello in https://github.com/soxoj/maigret/pull/738 +* Bump reportlab from 3.6.11 to 3.6.12 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/735 +* Bump typing-extensions from 4.4.0 to 4.5.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/888 +* Bump psutil from 5.9.2 to 5.9.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/741 +* Bump attrs from 22.1.0 to 22.2.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/892 +* Bump multidict from 6.0.2 to 6.0.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/891 +* Fixed false positives, updated networkx dep, some lint fixes by @soxoj in https://github.com/soxoj/maigret/pull/894 +* Bump lxml from 4.9.1 to 4.9.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/900 +* Bump yarl from 1.8.1 to 1.8.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/899 +* Fixed false positives on Mastodon sites by @soxoj in https://github.com/soxoj/maigret/pull/901 +* Added valid regex for Mastodon instances (#848) by @soxoj in https://github.com/soxoj/maigret/pull/906 +* Fix missing Mastodon Regex on #906 by @therealchiendat in https://github.com/soxoj/maigret/pull/908 +* Bump tqdm from 4.64.1 to 4.65.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/905 +* Bump requests from 2.28.1 to 2.28.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/904 +* Bump psutil from 5.9.4 to 5.9.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/910 +* fix deployment of tests by @noraj in https://github.com/soxoj/maigret/pull/933 +* Added 26 ENS and similar domains with tag `crypto` by @soxoj in https://github.com/soxoj/maigret/pull/942 +* Bump requests from 2.28.2 to 2.31.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/957 +* Update wizard.py by @engNoori in https://github.com/soxoj/maigret/pull/1016 +* Improved search through UnstoppableDomains by @soxoj in https://github.com/soxoj/maigret/pull/1040 +* Added memory.lol (Twitter usernames archive) by @soxoj in https://github.com/soxoj/maigret/pull/1067 +* Disabled and fixed several sites by @soxoj in https://github.com/soxoj/maigret/pull/1132 +* Fixed some sites (again) by @soxoj in https://github.com/soxoj/maigret/pull/1133 +* fix(sec): upgrade reportlab to 3.6.13 by @realize096 in https://github.com/soxoj/maigret/pull/1051 +* Add compatibility with pytest >= 7.3.0 by @tjni in https://github.com/soxoj/maigret/pull/1117 +* Additionally fixed sites, win32 build fix by @soxoj in https://github.com/soxoj/maigret/pull/1148 +* Sites fixes 250823 by @soxoj in https://github.com/soxoj/maigret/pull/1149 +* Bump reportlab from 3.6.12 to 4.0.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1160 +* Bump certifi from 2022.12.7 to 2023.7.22 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1070 +* fix(sec): upgrade certifi to 2022.12.07 by @realize096 in https://github.com/soxoj/maigret/pull/1173 +* Bump cloudscraper from 1.2.66 to 1.2.71 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/914 +* Some sites fixed & cloudflare detection by @soxoj in https://github.com/soxoj/maigret/pull/1178 +* EasyInstaller because everyone likes saving time :) by @CatchySmile in https://github.com/soxoj/maigret/pull/1212 +* Tests fixes + last updates by @soxoj in https://github.com/soxoj/maigret/pull/1228 +* Bump pypdf2 from 2.10.8 to 3.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/815 +* Bump pyvis from 0.2.1 to 0.3.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/861 +* Bump xhtml2pdf from 0.2.8 to 0.2.11 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/935 +* Bump flake8 from 5.0.4 to 6.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1091 +* Bump aiohttp from 3.8.3 to 3.8.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1222 +* Specified pyinstaller version by @soxoj in https://github.com/soxoj/maigret/pull/1230 +* Pyinstaller fix by @soxoj in https://github.com/soxoj/maigret/pull/1231 +* Test pyinstaller on dev branch by @soxoj in https://github.com/soxoj/maigret/pull/1233 +* Update main from dev again by @soxoj in https://github.com/soxoj/maigret/pull/1234 +* Bump typing-extensions from 4.5.0 to 4.8.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1239 +* Bump pytest-rerunfailures from 10.2 to 12.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1237 +* Bump async-timeout from 4.0.2 to 4.0.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1238 +* Changed pyinstaller dir by @soxoj in https://github.com/soxoj/maigret/pull/1245 +* Bump tqdm from 4.65.0 to 4.66.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1235 +* Updating site checkers, disabling suspended sites by @MeowyPouncer in https://github.com/soxoj/maigret/pull/1266 +* Updated site statistics by @soxoj in https://github.com/soxoj/maigret/pull/1273 +* Compat RegataOS (Opensuse) by @Jeiel0rbit in https://github.com/soxoj/maigret/pull/1308 +* fix reddit by @hhhtylerw in https://github.com/soxoj/maigret/pull/1296 +* Added Telegram bot link by @soxoj in https://github.com/soxoj/maigret/pull/1321 +* Added SOWEL classification by @soxoj in https://github.com/soxoj/maigret/pull/1453 +* Bump jinja2 from 3.1.2 to 3.1.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1358 +* Fixed/Disabled sites. Update requirements.txt by @rly0nheart in https://github.com/soxoj/maigret/pull/1517 +* Fixed 4 sites, added 6 sites, disabled 27 sites by @rly0nheart in https://github.com/soxoj/maigret/pull/1536 +* Fixed 3 sites, disabed 3, added by @rly0nheart in https://github.com/soxoj/maigret/pull/1539 +* Bump socid-extractor from 0.0.24 to 0.0.26 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1546 +* Added code conventions to CONTRIBUTING.md by @Lord-Topa in https://github.com/soxoj/maigret/pull/1589 +* Readme by @Lord-Topa in https://github.com/soxoj/maigret/pull/1588 +* Update data.json by @ranlo in https://github.com/soxoj/maigret/pull/1559 +* Adding permutator feature for usernames by @balestek in https://github.com/soxoj/maigret/pull/1575 +* Alik.cz indirectly requests removal by @ppfeister in https://github.com/soxoj/maigret/pull/1671 +* Fixed 1 site, PyInstaller workflow, Google Colab example by @Ixve in https://github.com/soxoj/maigret/pull/1558 +* Bump soupsieve from 2.5 to 2.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1708 +* Added dev documentation, fixed some sites, removed GitHub issue links… by @soxoj in https://github.com/soxoj/maigret/pull/1869 +* Bump cryptography from 42.0.7 to 43.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1870 +* Bump requests-futures from 1.0.1 to 1.0.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1868 +* Bump werkzeug from 3.0.3 to 3.0.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1846 +* Added .readthedocs.yaml, fixed Pyinstaller and Docker workflows by @soxoj in https://github.com/soxoj/maigret/pull/1874 +* Added GitHub and BuyMeACoffee sponsorships by @soxoj in https://github.com/soxoj/maigret/pull/1875 +* Bump psutil from 5.9.5 to 6.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1839 +* Bump flake8 from 6.1.0 to 7.1.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1692 +* Bump future from 0.18.3 to 1.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1545 +* Bump urllib3 from 2.2.1 to 2.2.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1600 +* Bump certifi from 2023.11.17 to 2024.8.30 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1840 +* Fixed test for aiohttp 3.10 by @soxoj in https://github.com/soxoj/maigret/pull/1876 +* Bump aiohttp from 3.9.5 to 3.10.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1721 +* Added new badges to README by @soxoj in https://github.com/soxoj/maigret/pull/1877 +* Show detailed error statistics for `-v` by @soxoj in https://github.com/soxoj/maigret/pull/1879 +* Disabled unavailable sites by @soxoj in https://github.com/soxoj/maigret/pull/1880 +* Added 7 sites, implemented integration with Marple, docs update by @soxoj in https://github.com/soxoj/maigret/pull/1881 +* Bump pefile from 2022.5.30 to 2024.8.26 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1883 +* Bump lxml from 4.9.4 to 5.3.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1884 +* New sites added by @soxoj in https://github.com/soxoj/maigret/pull/1888 +* Improved self-check mode, added 15 sites by @soxoj in https://github.com/soxoj/maigret/pull/1887 +* Bump pyinstaller from 6.1 to 6.11.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1882 +* Bump pytest-asyncio from 0.23.7 to 0.23.8 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1885 +* Pyinstaller bump & pefile fix by @soxoj in https://github.com/soxoj/maigret/pull/1890 +* Bump python-bidi from 0.4.2 to 0.6.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1886 +* Sites checks fixes by @soxoj in https://github.com/soxoj/maigret/pull/1896 +* Parallel execution optimization by @soxoj in https://github.com/soxoj/maigret/pull/1897 +* Maigret bot support (custom progress function fixed) by @soxoj in https://github.com/soxoj/maigret/pull/1898 +* Bump markupsafe from 2.1.5 to 3.0.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1895 +* Retries set to 0 by default, refactored code of executor with progress by @soxoj in https://github.com/soxoj/maigret/pull/1899 +* Bump aiohttp-socks from 0.7.1 to 0.9.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1900 +* Bump pycountry from 23.12.11 to 24.6.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1903 +* Bump pytest-cov from 4.1.0 to 6.0.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1902 +* Bump pyvis from 0.2.1 to 0.3.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1893 +* Close http connections (#1595) by @soxoj in https://github.com/soxoj/maigret/pull/1905 +* New logo by @soxoj in https://github.com/soxoj/maigret/pull/1906 +* Fixed dateutil parsing error for CDT timezone by @soxoj in https://github.com/soxoj/maigret/pull/1907 +* Bump alive-progress from 2.4.1 to 3.2.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1910 +* Permutator output and documentation updates by @soxoj in https://github.com/soxoj/maigret/pull/1914 +* Bump aiohttp from 3.11.7 to 3.11.8 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1912 +* Bump async-timeout from 4.0.3 to 5.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1909 +* An recursive search animation in README has been updated by @soxoj in https://github.com/soxoj/maigret/pull/1915 +* Bump pytest-rerunfailures from 12.0 to 15.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1911 +* Bump attrs from 22.2.0 to 24.2.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1913 +* Sites fixes by @soxoj in https://github.com/soxoj/maigret/pull/1917 +* Update README.md by @soxoj in https://github.com/soxoj/maigret/pull/1919 +* Refactored sites module, updated documentation by @soxoj in https://github.com/soxoj/maigret/pull/1918 +* Bump aiohttp from 3.11.8 to 3.11.9 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1920 +* Bump pytest from 7.4.4 to 8.3.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1923 +* Bump yarl from 1.18.0 to 1.18.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1922 +* Bump pytest-asyncio from 0.23.8 to 0.24.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1925 +* Documentation update by @soxoj in https://github.com/soxoj/maigret/pull/1926 +* Bump mock from 4.0.3 to 5.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1921 +* Bump pywin32-ctypes from 0.2.1 to 0.2.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1924 +* Installation docs update by @soxoj in https://github.com/soxoj/maigret/pull/1927 +* Disabled Figma check by @soxoj in https://github.com/soxoj/maigret/pull/1928 +* Put Windows executable in Releases for each dev and main commit by @soxoj in https://github.com/soxoj/maigret/pull/1929 +* Updated PyInstaller workflow by @soxoj in https://github.com/soxoj/maigret/pull/1930 +* Documentation update by @soxoj in https://github.com/soxoj/maigret/pull/1931 +* Fixed Figma check and some bugs by @soxoj in https://github.com/soxoj/maigret/pull/1932 +* Bump six from 1.16.0 to 1.17.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1933 +* Activation mechanism documentation added by @soxoj in https://github.com/soxoj/maigret/pull/1935 +* Readme/docs update based on GH discussions by @soxoj in https://github.com/soxoj/maigret/pull/1936 +* Bump aiohttp from 3.11.9 to 3.11.10 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1937 +* Weibo site check fix, activation mechanism added by @soxoj in https://github.com/soxoj/maigret/pull/1938 +* Fixed Ebay and BongaCams checks by @soxoj in https://github.com/soxoj/maigret/pull/1939 +* Sites fixes by @soxoj in https://github.com/soxoj/maigret/pull/1940 +* Fixed Linktr and discourse.mozilla.org by @soxoj in https://github.com/soxoj/maigret/pull/1941 +* Refactored self-check method, code formatting, small lint fixes by @soxoj in https://github.com/soxoj/maigret/pull/1942 +* Refactoring, test coverage increased to 60% by @soxoj in https://github.com/soxoj/maigret/pull/1943 +* Added a test for submitter by @soxoj in https://github.com/soxoj/maigret/pull/1944 +* Update README.md by @soxoj in https://github.com/soxoj/maigret/pull/1949 +* Updated OP.GG checks by @soxoj in https://github.com/soxoj/maigret/pull/1950 +* Fixed ProductHunt check by @soxoj in https://github.com/soxoj/maigret/pull/1951 +* Improved check feature extraction function, added tests by @soxoj in https://github.com/soxoj/maigret/pull/1952 +* Submit improvements and site check fixes by @soxoj in https://github.com/soxoj/maigret/pull/1956 +* chore: update submit.py by @eltociear in https://github.com/soxoj/maigret/pull/1957 +* Fixed Gravatar parsing (socid_extractor) by @soxoj in https://github.com/soxoj/maigret/pull/1958 +* Site check fixes by @soxoj in https://github.com/soxoj/maigret/pull/1962 +* fix bad linux filename generation by @overcuriousity in https://github.com/soxoj/maigret/pull/1961 +* Bump pytest-asyncio from 0.24.0 to 0.25.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1963 +* Fixed flaky tests to check cookies by @soxoj in https://github.com/soxoj/maigret/pull/1965 +* Preparation of 0.5.0 alpha version by @soxoj in https://github.com/soxoj/maigret/pull/1966 +* Created web frontend launched via --web flag by @overcuriousity in https://github.com/soxoj/maigret/pull/1967 +* Bump certifi from 2024.8.30 to 2024.12.14 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1969 +* Bump attrs from 24.2.0 to 24.3.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1970 +* Added web interface docs by @soxoj in https://github.com/soxoj/maigret/pull/1972 +* Small docs and parameters fixes for web interface mode by @soxoj in https://github.com/soxoj/maigret/pull/1973 +* [ImgBot] Optimize images by @imgbot[bot] in https://github.com/soxoj/maigret/pull/1974 +* Improving the web interface by @overcuriousity in https://github.com/soxoj/maigret/pull/1975 +* make graph more meaningful by @overcuriousity in https://github.com/soxoj/maigret/pull/1977 +* Async generator-executor for site checks by @soxoj in https://github.com/soxoj/maigret/pull/1978 +* Bump aiohttp from 3.11.10 to 3.11.11 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1979 +* Bump psutil from 6.1.0 to 6.1.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1980 +* Bump aiohttp-socks from 0.9.1 to 0.10.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1985 +* Bump mypy from 1.13.0 to 1.14.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1983 +* Bump aiohttp-socks from 0.10.0 to 0.10.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1987 +* Bump jinja2 from 3.1.4 to 3.1.5 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1982 +* Bump coverage from 7.6.9 to 7.6.10 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1986 +* Bump pytest-asyncio from 0.25.0 to 0.25.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1989 +* Bump mypy from 1.14.0 to 1.14.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1988 +* Bump pytest-asyncio from 0.25.1 to 0.25.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/1990 +* docs: update usage-examples.rst by @eltociear in https://github.com/soxoj/maigret/pull/1996 +* upload-artifact action in python test workflow updated to v4 by @soxoj in https://github.com/soxoj/maigret/pull/2024 +* Pass db_file configuration to web interface by @pykereaper in https://github.com/soxoj/maigret/pull/2019 +* Fix usage of data.json files from web by @pykereaper in https://github.com/soxoj/maigret/pull/2020 +* Bump black from 24.10.0 to 25.1.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2001 +* Important Update Installer.bat by @CatchySmile in https://github.com/soxoj/maigret/pull/1994 +* Bump cryptography from 44.0.0 to 44.0.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2005 +* Bump jinja2 from 3.1.5 to 3.1.6 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2011 +* [#2010] Add 6 more websites to manage by @pylapp in https://github.com/soxoj/maigret/pull/2009 +* Bump flask from 3.1.0 to 3.1.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2028 +* Bump requests from 2.32.3 to 2.32.4 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2026 +* Bump pycares from 4.5.0 to 4.9.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2025 +* Bump pytest-asyncio from 0.25.2 to 0.26.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2016 +* Bump urllib3 from 2.2.3 to 2.5.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2027 +* Disable ICQ site by @Echo-Darlyson in https://github.com/soxoj/maigret/pull/1993 +* Bump attrs from 24.3.0 to 25.3.0 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2014 +* Bump certifi from 2024.12.14 to 2025.1.31 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2004 +* Bump typing-extensions from 4.12.2 to 4.14.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2038 +* Disable AskFM by @MR-VL in https://github.com/soxoj/maigret/pull/2037 +* Bump platformdirs from 4.3.6 to 4.3.8 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2033 +* Bump coverage from 7.6.10 to 7.9.2 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2039 +* Bump aiohttp from 3.11.11 to 3.12.14 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2041 +* Bump yarl from 1.18.3 to 1.20.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2032 +* Fixed test dialog_adds_site_negative by @soxoj in https://github.com/soxoj/maigret/pull/2107 +* Bump reportlab from 4.2.5 to 4.4.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2063 +* Bump asgiref from 3.8.1 to 3.9.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2040 +* Bump multidict from 6.1.0 to 6.6.3 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2034 +* Bump pytest-rerunfailures from 15.0 to 15.1 by @dependabot[bot] in https://github.com/soxoj/maigret/pull/2030 + +**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.4.4...v0.5.0 + +## [0.4.4] - 2022-09-03 +* Fixed some false positives by @soxoj in https://github.com/soxoj/maigret/pull/433 +* Drop Python 3.6 support by @soxoj in https://github.com/soxoj/maigret/pull/434 +* Bump xhtml2pdf from 0.2.5 to 0.2.7 by @dependabot in https://github.com/soxoj/maigret/pull/409 +* Bump reportlab from 3.6.6 to 3.6.9 by @dependabot in https://github.com/soxoj/maigret/pull/403 +* Bump markupsafe from 2.0.1 to 2.1.1 by @dependabot in https://github.com/soxoj/maigret/pull/389 +* Bump pycountry from 22.1.10 to 22.3.5 by @dependabot in https://github.com/soxoj/maigret/pull/384 +* Bump pypdf2 from 1.26.0 to 1.27.4 by @dependabot in https://github.com/soxoj/maigret/pull/438 +* Update GH actions by @soxoj in https://github.com/soxoj/maigret/pull/439 +* Bump tqdm from 4.63.0 to 4.64.0 by @dependabot in https://github.com/soxoj/maigret/pull/440 +* Bump jinja2 from 3.0.3 to 3.1.1 by @dependabot in https://github.com/soxoj/maigret/pull/441 +* Bump soupsieve from 2.3.1 to 2.3.2 by @dependabot in https://github.com/soxoj/maigret/pull/436 +* Bump pypdf2 from 1.26.0 to 1.27.4 by @dependabot in https://github.com/soxoj/maigret/pull/442 +* Bump pyvis from 0.1.9 to 0.2.0 by @dependabot in https://github.com/soxoj/maigret/pull/443 +* Bump pypdf2 from 1.27.4 to 1.27.6 by @dependabot in https://github.com/soxoj/maigret/pull/448 +* Bump typing-extensions from 4.1.1 to 4.2.0 by @dependabot in https://github.com/soxoj/maigret/pull/447 +* Bump soupsieve from 2.3.2 to 2.3.2.post1 by @dependabot in https://github.com/soxoj/maigret/pull/444 +* Bump pypdf2 from 1.27.6 to 1.27.7 by @dependabot in https://github.com/soxoj/maigret/pull/449 +* Bump pypdf2 from 1.27.7 to 1.27.8 by @dependabot in https://github.com/soxoj/maigret/pull/450 +* XMind 8 report warning and some docs update by @soxoj in https://github.com/soxoj/maigret/pull/452 +* False positive fixes 24.04.22 by @soxoj in https://github.com/soxoj/maigret/pull/455 +* Bump pypdf2 from 1.27.8 to 1.27.9 by @dependabot in https://github.com/soxoj/maigret/pull/456 +* Bump pytest from 7.0.1 to 7.1.2 by @dependabot in https://github.com/soxoj/maigret/pull/457 +* Bump jinja2 from 3.1.1 to 3.1.2 by @dependabot in https://github.com/soxoj/maigret/pull/460 +* Ubisoft forums addition by @fen0s in https://github.com/soxoj/maigret/pull/461 +* Add BYOND, Figma, BeatStars by @fen0s in https://github.com/soxoj/maigret/pull/462 +* fix Figma username definition, add a bunch of sites by @fen0s in https://github.com/soxoj/maigret/pull/464 +* Bump pypdf2 from 1.27.9 to 1.27.10 by @dependabot in https://github.com/soxoj/maigret/pull/465 +* Bump pypdf2 from 1.27.10 to 1.27.12 by @dependabot in https://github.com/soxoj/maigret/pull/466 +* Sites fixes 05 05 22 by @soxoj in https://github.com/soxoj/maigret/pull/469 +* Bump pyvis from 0.2.0 to 0.2.1 by @dependabot in https://github.com/soxoj/maigret/pull/472 +* Social analyzer websites, also fixing presense strs by @fen0s in https://github.com/soxoj/maigret/pull/471 +* Updated logic of false positive risk estimating by @soxoj in https://github.com/soxoj/maigret/pull/475 +* Improved usability of external progressbar func by @soxoj in https://github.com/soxoj/maigret/pull/476 +* New sites added, some tags/rank update by @soxoj in https://github.com/soxoj/maigret/pull/477 +* Added new sites by @soxoj in https://github.com/soxoj/maigret/pull/480 +* Added new forums, updated ranks, some utils improvements by @soxoj in https://github.com/soxoj/maigret/pull/481 +* Disabled sites with false positives results by @soxoj in https://github.com/soxoj/maigret/pull/482 +* Bump certifi from 2021.10.8 to 2022.5.18.1 by @dependabot in https://github.com/soxoj/maigret/pull/488 +* Bump psutil from 5.9.0 to 5.9.1 by @dependabot in https://github.com/soxoj/maigret/pull/490 +* Bump pypdf2 from 1.27.12 to 1.28.1 by @dependabot in https://github.com/soxoj/maigret/pull/491 +* Bump pypdf2 from 1.28.1 to 1.28.2 by @dependabot in https://github.com/soxoj/maigret/pull/493 +* added and fixed some websites in data.json by @kustermariocoding in https://github.com/soxoj/maigret/pull/494 +* Bump pypdf2 from 1.28.2 to 2.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/504 +* Bump pefile from 2021.9.3 to 2022.5.30 by @dependabot in https://github.com/soxoj/maigret/pull/499 +* Updated sites list, added disabled Anilist by @soxoj in https://github.com/soxoj/maigret/pull/502 +* Bump lxml from 4.8.0 to 4.9.0 by @dependabot in https://github.com/soxoj/maigret/pull/503 +* Compatibility with Python 10 by @soxoj in https://github.com/soxoj/maigret/pull/509 +* feat: add .log & .bak files to gitignore in https://github.com/soxoj/maigret/pull/511 +* fix some sites and delete abandoned by @fen0s in https://github.com/soxoj/maigret/pull/526 +* Fixesjulyfirst by @fen0s in https://github.com/soxoj/maigret/pull/533 +* yazbel, aboutcar, zhihu by @fen0s in https://github.com/soxoj/maigret/pull/531 +* Fixes july third by @fen0s in https://github.com/soxoj/maigret/pull/535 +* Update data.json by @fen0s in https://github.com/soxoj/maigret/pull/539 +* Update data.json by @fen0s in https://github.com/soxoj/maigret/pull/540 +* Bump reportlab from 3.6.9 to 3.6.11 by @dependabot in https://github.com/soxoj/maigret/pull/543 +* Bump requests from 2.27.1 to 2.28.1 by @dependabot in https://github.com/soxoj/maigret/pull/530 +* Bump pypdf2 from 2.0.0 to 2.5.0 by @dependabot in https://github.com/soxoj/maigret/pull/542 +* Bump xhtml2pdf from 0.2.7 to 0.2.8 by @dependabot in https://github.com/soxoj/maigret/pull/522 +* Bump lxml from 4.9.0 to 4.9.1 by @dependabot in https://github.com/soxoj/maigret/pull/538 +* disable yandex music + set utf8 encoding by @fen0s in https://github.com/soxoj/maigret/pull/562 +* fix false positives by @fen0s in https://github.com/soxoj/maigret/pull/577 +* disable Instagram, fix two false positives by @fen0s in https://github.com/soxoj/maigret/pull/578 +* Bump certifi from 2022.5.18.1 to 2022.6.15 by @dependabot in https://github.com/soxoj/maigret/pull/551 +* August15 by @fen0s in https://github.com/soxoj/maigret/pull/591 +* Bump pytest-httpserver from 1.0.4 to 1.0.5 by @dependabot in https://github.com/soxoj/maigret/pull/583 +* Bump typing-extensions from 4.2.0 to 4.3.0 by @dependabot in https://github.com/soxoj/maigret/pull/549 +* Bump colorama from 0.4.4 to 0.4.5 by @dependabot in https://github.com/soxoj/maigret/pull/548 +* Bump chardet from 4.0.0 to 5.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/550 +* Bump cloudscraper from 1.2.60 to 1.2.63 by @dependabot in https://github.com/soxoj/maigret/pull/600 +* Bump flake8 from 4.0.1 to 5.0.4 by @dependabot in https://github.com/soxoj/maigret/pull/598 +* Bump attrs from 21.4.0 to 22.1.0 by @dependabot in https://github.com/soxoj/maigret/pull/597 +* Bump pytest-asyncio from 0.18.2 to 0.19.0 by @dependabot in https://github.com/soxoj/maigret/pull/601 +* Bump pypdf2 from 2.5.0 to 2.10.4 by @dependabot in https://github.com/soxoj/maigret/pull/606 +* Bump pytest from 7.1.2 to 7.1.3 by @dependabot in https://github.com/soxoj/maigret/pull/613 +* Update sites.md -Gitmemory.com suppression by @C3n7ral051nt4g3ncy in https://github.com/soxoj/maigret/pull/610 +* Bump cloudscraper from 1.2.63 to 1.2.64 by @dependabot in https://github.com/soxoj/maigret/pull/614 +* Bump pycountry from 22.1.10 to 22.3.5 by @dependabot in https://github.com/soxoj/maigret/pull/607 +* add ProtonMail, disable 3 broken sites by @fen0s in https://github.com/soxoj/maigret/pull/619 +* Bump tqdm from 4.64.0 to 4.64.1 by @dependabot in https://github.com/soxoj/maigret/pull/618 + +**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.4.3...v0.4.4 + +## [0.4.3] - 2022-04-13 +* Added Sites to data.json by @kustermariocoding in https://github.com/soxoj/maigret/pull/386 +* added new Websites to data.json by @kustermariocoding in https://github.com/soxoj/maigret/pull/390 +* Skipped broken tests by @soxoj in https://github.com/soxoj/maigret/pull/397 +* Added new Websites to data.json by @kustermariocoding in https://github.com/soxoj/maigret/pull/401 +* Added new Websites to data.json by @kustermariocoding in https://github.com/soxoj/maigret/pull/404 +* Updated statistics by @soxoj in https://github.com/soxoj/maigret/pull/406 +* Added new Websites to data.json by @kustermariocoding in https://github.com/soxoj/maigret/pull/413 +* Disabled houzz.com, updated sites statistics by @soxoj in https://github.com/soxoj/maigret/pull/422 +* Fixed last false positives by @soxoj in https://github.com/soxoj/maigret/pull/424 +* Fixed actual false positives by @soxoj in https://github.com/soxoj/maigret/pull/431 + +**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.4.2...v0.4.3 + +## [0.4.2] - 2022-03-07 +* [ImgBot] Optimize images by @imgbot in https://github.com/soxoj/maigret/pull/319 +* Bump pytest-asyncio from 0.17.0 to 0.17.1 by @dependabot in https://github.com/soxoj/maigret/pull/321 +* Bump pytest-asyncio from 0.17.1 to 0.17.2 by @dependabot in https://github.com/soxoj/maigret/pull/323 +* Disabled Ruboard by @soxoj in https://github.com/soxoj/maigret/pull/327 +* Disable kinooh, sites list update workflow added by @soxoj in https://github.com/soxoj/maigret/pull/329 +* Bump multidict from 5.2.0 to 6.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/332 +* Bump multidict from 6.0.1 to 6.0.2 by @dependabot in https://github.com/soxoj/maigret/pull/333 +* Bump pytest-httpserver from 1.0.3 to 1.0.4 by @dependabot in https://github.com/soxoj/maigret/pull/334 +* Bump pytest from 6.2.5 to 7.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/339 +* Bump pytest-asyncio from 0.17.2 to 0.18.0 by @dependabot in https://github.com/soxoj/maigret/pull/340 +* Bump pytest-asyncio from 0.18.0 to 0.18.1 by @dependabot in https://github.com/soxoj/maigret/pull/343 +* Bump pytest from 7.0.0 to 7.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/345 +* Bump typing-extensions from 4.0.1 to 4.1.1 by @dependabot in https://github.com/soxoj/maigret/pull/346 +* Bump lxml from 4.7.1 to 4.8.0 by @dependabot in https://github.com/soxoj/maigret/pull/350 +* Pin reportlab version by @cyb3rk0tik in https://github.com/soxoj/maigret/pull/351 +* Fix reportlab not only for testing by @cyb3rk0tik in https://github.com/soxoj/maigret/pull/352 +* Added some scripts by @soxoj in https://github.com/soxoj/maigret/pull/355 +* Added package publishing instruction by @soxoj in https://github.com/soxoj/maigret/pull/356 +* Added DB statistics autoupdate and write to sites.md by @soxoj in https://github.com/soxoj/maigret/pull/357 +* CI autoupdate by @soxoj in https://github.com/soxoj/maigret/pull/359 +* Op.gg fixes by @soxoj in https://github.com/soxoj/maigret/pull/363 +* Wikipedia fix by @soxoj in https://github.com/soxoj/maigret/pull/365 +* Disabled Netvibes and LeetCode by @soxoj in https://github.com/soxoj/maigret/pull/366 +* Fixed several false positives, improved statistics info by @soxoj in https://github.com/soxoj/maigret/pull/368 +* Fix false positives by @soxoj in https://github.com/soxoj/maigret/pull/370 +* Fixed the rest of false positives for now by @soxoj in https://github.com/soxoj/maigret/pull/371 +* Fix false positive and CI by @soxoj in https://github.com/soxoj/maigret/pull/372 +* Added new sites to data.json by @kustermariocoding in https://github.com/soxoj/maigret/pull/375 +* Fixed issue with str alexaRank by @soxoj in https://github.com/soxoj/maigret/pull/382 +* Bump tqdm from 4.62.3 to 4.63.0 by @dependabot in https://github.com/soxoj/maigret/pull/374 +* Bump pytest-asyncio from 0.18.1 to 0.18.2 by @dependabot in https://github.com/soxoj/maigret/pull/380 +* @imgbot made their first contribution in https://github.com/soxoj/maigret/pull/319 +* @kustermariocoding made their first contribution in https://github.com/soxoj/maigret/pull/375 + +**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.4.1...v0.4.2 + +## [0.4.1] - 2022-01-15 +* Added dozen of sites, improved submit mode by @soxoj in https://github.com/soxoj/maigret/pull/288 +* Bump requests from 2.26.0 to 2.27.0 by @dependabot in https://github.com/soxoj/maigret/pull/292 +* changed Bayoushooter to use XenForo and foursquare to use correct checkType by @antomarsi in https://github.com/soxoj/maigret/pull/289 +* Bump requests from 2.27.0 to 2.27.1 by @dependabot in https://github.com/soxoj/maigret/pull/293 +* Added aparat.com by @soxoj in https://github.com/soxoj/maigret/pull/294 +* Fixed BongaCams, links parsing improved by @soxoj in https://github.com/soxoj/maigret/pull/297 +* Temporary fix for Twitter (#299) by @soxoj in https://github.com/soxoj/maigret/pull/300 +* Fixed TikTok checks (#303) by @soxoj in https://github.com/soxoj/maigret/pull/306 +* Bump pycountry from 20.7.3 to 22.1.10 by @dependabot in https://github.com/soxoj/maigret/pull/313 +* Pornhub search improved by @soxoj in https://github.com/soxoj/maigret/pull/315 +* Codacademy fixed by @soxoj in https://github.com/soxoj/maigret/pull/316 +* Bump pytest-asyncio from 0.16.0 to 0.17.0 by @dependabot in https://github.com/soxoj/maigret/pull/314 + +**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.4.0...v0.4.1 + +## [0.4.0] - 2022-01-03 +* Delayed import of requests module, speed check command, reqs updated by @soxoj in https://github.com/soxoj/maigret/pull/189 +* Snapcraft yaml added by @soxoj in https://github.com/soxoj/maigret/pull/190 +* Create codeql-analysis.yml by @soxoj in https://github.com/soxoj/maigret/pull/191 +* Move wiki pages to ReadTheDocs by @egornagornov in https://github.com/soxoj/maigret/pull/194 +* Created ReadTheDocs requirements file by @soxoj in https://github.com/soxoj/maigret/pull/195 +* Fix incompatible version requirements by @JasperJuergensen in https://github.com/soxoj/maigret/pull/196 +* Added link to documentation by @soxoj in https://github.com/soxoj/maigret/pull/198 +* Upgraded base docker image by @soxoj in https://github.com/soxoj/maigret/pull/199 +* Run CodeQL only aflter merge and each Saturday by @soxoj in https://github.com/soxoj/maigret/pull/201 +* Added cascade settings loading from /.maigret/settings.json and ./settings.json by @soxoj in https://github.com/soxoj/maigret/pull/200 +* Documentation and settings improved by @soxoj in https://github.com/soxoj/maigret/pull/203 +* New config options added by @soxoj in https://github.com/soxoj/maigret/pull/204 +* Added export of cli entrypoint by @soxoj in https://github.com/soxoj/maigret/pull/207 +* Removed redundant logging by @soxoj in https://github.com/soxoj/maigret/pull/210 +* PyInstaller workflow by @soxoj in https://github.com/soxoj/maigret/pull/206 +* Create bug.md by @soxoj in https://github.com/soxoj/maigret/pull/213 +* Fixed path and names of report files by @soxoj in https://github.com/soxoj/maigret/pull/216 +* Box drawing logic improved, added new settings by @soxoj in https://github.com/soxoj/maigret/pull/217 +* Fixes for win32 release by @soxoj in https://github.com/soxoj/maigret/pull/218 +* Bump six from 1.15.0 to 1.16.0 by @dependabot in https://github.com/soxoj/maigret/pull/221 +* Bump flake8 from 3.8.4 to 4.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/219 +* Bump aiohttp from 3.7.4 to 3.8.0 by @dependabot in https://github.com/soxoj/maigret/pull/220 +* Bump aiohttp-socks from 0.5.5 to 0.6.0 by @dependabot in https://github.com/soxoj/maigret/pull/222 +* Bump typing-extensions from 3.7.4.3 to 3.10.0.2 by @dependabot in https://github.com/soxoj/maigret/pull/224 +* Bump multidict from 5.1.0 to 5.2.0 by @dependabot in https://github.com/soxoj/maigret/pull/225 +* Bump idna from 2.10 to 3.3 by @dependabot in https://github.com/soxoj/maigret/pull/228 +* Bump pytest-cov from 2.10.1 to 3.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/227 +* Bump mock from 4.0.2 to 4.0.3 by @dependabot in https://github.com/soxoj/maigret/pull/226 +* Bump certifi from 2020.12.5 to 2021.10.8 by @dependabot in https://github.com/soxoj/maigret/pull/233 +* Bump pytest-httpserver from 1.0.0 to 1.0.2 by @dependabot in https://github.com/soxoj/maigret/pull/232 +* Bump lxml from 4.6.3 to 4.6.4 by @dependabot in https://github.com/soxoj/maigret/pull/231 +* Bump pefile from 2019.4.18 to 2021.9.3 by @dependabot in https://github.com/soxoj/maigret/pull/229 +* Bump pytest-rerunfailures from 9.1.1 to 10.2 by @dependabot in https://github.com/soxoj/maigret/pull/230 +* Bump yarl from 1.6.3 to 1.7.2 by @dependabot in https://github.com/soxoj/maigret/pull/237 +* Bump async-timeout from 4.0.0 to 4.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/236 +* Bump psutil from 5.7.0 to 5.8.0 by @dependabot in https://github.com/soxoj/maigret/pull/234 +* Bump jinja2 from 3.0.2 to 3.0.3 by @dependabot in https://github.com/soxoj/maigret/pull/235 +* Bump pytest from 6.2.4 to 6.2.5 by @dependabot in https://github.com/soxoj/maigret/pull/238 +* Bump tqdm from 4.55.0 to 4.62.3 by @dependabot in https://github.com/soxoj/maigret/pull/242 +* Bump arabic-reshaper from 2.1.1 to 2.1.3 by @dependabot in https://github.com/soxoj/maigret/pull/243 +* Bump pytest-asyncio from 0.14.0 to 0.16.0 by @dependabot in https://github.com/soxoj/maigret/pull/240 +* Bump chardet from 3.0.4 to 4.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/241 +* Bump soupsieve from 2.1 to 2.3.1 by @dependabot in https://github.com/soxoj/maigret/pull/239 +* Bump aiohttp from 3.8.0 to 3.8.1 by @dependabot in https://github.com/soxoj/maigret/pull/246 +* Bump typing-extensions from 3.10.0.2 to 4.0.0 by @dependabot in https://github.com/soxoj/maigret/pull/245 +* Bump aiohttp-socks from 0.6.0 to 0.6.1 by @dependabot in https://github.com/soxoj/maigret/pull/249 +* Bump aiohttp-socks from 0.6.1 to 0.7.1 by @dependabot in https://github.com/soxoj/maigret/pull/250 +* Bump typing-extensions from 4.0.0 to 4.0.1 by @dependabot in https://github.com/soxoj/maigret/pull/253 +* Fixed some false positives by @soxoj in https://github.com/soxoj/maigret/pull/254 +* Disabled non-working sites by @soxoj in https://github.com/soxoj/maigret/pull/255 +* Added false results buttons to reports, fixed some falses by @soxoj in https://github.com/soxoj/maigret/pull/256 +* Fixed xHamster, added support of proxies to self-check mode by @soxoj in https://github.com/soxoj/maigret/pull/259 +* Disabled non-working sites, updated public sites list by @soxoj in https://github.com/soxoj/maigret/pull/263 +* Bump lxml from 4.6.4 to 4.6.5 by @dependabot in https://github.com/soxoj/maigret/pull/266 +* Bump lxml from 4.6.5 to 4.7.1 by @dependabot in https://github.com/soxoj/maigret/pull/269 +* Bump pytest-httpserver from 1.0.2 to 1.0.3 by @dependabot in https://github.com/soxoj/maigret/pull/270 +* Fixed failed tests (thx to Meta aka Facebook) by @soxoj in https://github.com/soxoj/maigret/pull/273 +* Fixed votetags, updated issue template by @soxoj in https://github.com/soxoj/maigret/pull/278 +* Bump async-timeout from 4.0.1 to 4.0.2 by @dependabot in https://github.com/soxoj/maigret/pull/275 +* Fixed some false positives by @soxoj in https://github.com/soxoj/maigret/pull/280 +* Bump attrs from 21.2.0 to 21.3.0 by @dependabot in https://github.com/soxoj/maigret/pull/281 +* Bump psutil from 5.8.0 to 5.9.0 by @dependabot in https://github.com/soxoj/maigret/pull/282 +* Bump attrs from 21.3.0 to 21.4.0 by @dependabot in https://github.com/soxoj/maigret/pull/283 + +**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.3.1...v0.4.0 + +## [0.3.1] - 2021-10-31 +* fixed false positives +* accelerated maigret start time by 3 times + +## [0.3.0] - 2021-06-02 +* added support of Tor and I2P sites +* added experimental DNS checking feature +* implemented sorting by data points for reports +* reports fixes + +## [0.2.4] - 2021-05-18 +* cli output report +* various improvements + +## [0.2.3] - 2021-05-12 +* added Yelp and yelp_userid support +* tags markup stabilization +* improved errors detection + +## [0.2.2] - 2021-05-07 +* improved ids extractors +* updated sites and engines +* updates CLI options + +## [0.2.1] - 2021-05-02 +* fixed json reports generation bug, added tests + +## [0.2.0] - 2021-05-02 +* added `--retries` option +* added `source` feature for sites' mirrors +* improved `submit` mode +* lot of style and logic fixes + +## [0.1.20] - 2021-05-02 [YANKED] + +## [0.1.19] - 2021-04-14 +* added `--no-progressbar` option +* fixed ascii tree bug +* fixed `python -m maigret` run +* fixed requests freeze with timeout async tasks + +## [0.1.18] - 2021-03-30 +* some API improvements + +## [0.1.17] - 2021-03-30 +* simplified maigret search API +* improved documentation +* fixed 403 response code ignoring bug + +## [0.1.16] - 2021-03-21 +* improved URL parsing mode +* improved sites submit mode +* added uID.me uguid support +* improved requests processing + +## [0.1.15] - 2021-03-14 +* improved HTML reports +* fixed python-3.6-specific error +* false positives fixes + +## [0.1.14] - 2021-02-25 +* added JSON export formats +* improved tags markup +* realized username detection in userinfo links +* added DB stats CLI option +* added site submit logic and CLI option +* added Spotify parsing activation +* main logic refactoring +* fixed Dockerfile +* fixed requirements + +## [0.1.13] - 2021-02-06 +* improved sites list filtering +* pretty console messages +* Yandex services updates +* false positives fixes + +## [0.1.12] - 2021-01-28 +* added support of custom cookies +* fixed lots of false positives + +## [0.1.11] - 2021-01-16 +* tags and custom data checks bugfixes +* added parsing activation logic + +## [0.1.10] - 2021-01-13 +* added report static resources into package + +## [0.1.9] - 2021-01-11 +* added HTML and PDF report export +* fixed support of Python 3.6 +* fixed tags filtering and ranking +* more than 2000 sites supported +* refactored sites and engines logic +* added tests + +## [0.1.8] - 2020-12-31 +* added XMind export +* more than 1500 sites supported +* parallel processing of requests + +## [0.1.7] - 2020-12-11 +* fixed proxies support +* fixed aiohttp stuff to prevent python 3.7 bugs +* fixed self-checking database saving error + +## [0.1.6] - 2020-12-05 +* fixed Dockerfile and README + +## [0.1.5] - 2020-12-05 [YANKED] + +## [0.1.4] - 2020-12-05 [YANKED] + +## [0.1.3] - 2020-12-05 [YANKED] + +## [0.1.2] - 2020-12-05 [YANKED] + +## [0.1.1] - 2020-12-05 [YANKED] + +## [0.1.0] - 2020-12-05 +* initial release diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..35904ce --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +https://t.me/soxoj. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..f720f57 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,196 @@ +# How to contribute + +Hey! I'm really glad you're reading this. Maigret contains a lot of sites, and it is very hard to keep all the sites operational. That's why any fix is important. + +## Code of Conduct + +Please read and follow the [Code of Conduct](CODE_OF_CONDUCT.md) to foster a welcoming and inclusive community. + +## Local setup + +Install Maigret with development dependencies via [Poetry](https://python-poetry.org/): + +```bash +git clone https://github.com/soxoj/maigret && cd maigret +poetry install --with dev +``` + +Activate the repo's git hooks **once after cloning**: + +```bash +git config --local core.hooksPath .githooks/ +``` + +The pre-commit hook does two things every time you commit changes that touch the site database: + +- regenerates the database signature `maigret/resources/db_meta.json` (used to detect compatible auto-updates), and +- regenerates `sites.md` (the human-readable list of supported sites with per-engine statistics). + +It also auto-stages the regenerated files so they land in the same commit as your edits. **Always run `git commit` from inside the repo so the hook can fire** — without it, your PR will land with a stale signature and a stale `sites.md`, and database auto-update will misbehave for users on your branch. + +## How to contribute + +There are two main ways to help. + +### 1. Add a new site + +**Beginner.** Use the `--submit` mode — Maigret takes a single existing-account URL, auto-detects the site engine, picks `presenseStrs` / `absenceStrs`, and offers to add the entry: + +```bash +maigret --submit https://example.com/users/alice +``` + +`--submit` works well when the site has clean status codes and no anti-bot protection. It will *not* discover a public JSON API (`urlProbe`), classify protection (`tls_fingerprint`, `cf_js_challenge`, `ip_reputation`, ...), or recognise SPA / soft-404 pages. For those, fall back to manual editing. + +**Advanced.** Edit `maigret/resources/data.json` by hand — see *Editing `data.json` safely* below. There is also an `add-a-site` issue template if you want a maintainer to do it for you. + +### 2. Fix existing sites + +The most useful work in this project is keeping checks accurate over time. Sites change layout, switch engines, add Cloudflare, redirect to login walls — every fix is welcome. + +**Where to start.** Good candidates: + +- Issues with the `false-positive` label. +- Sites currently `disabled: true` in `data.json` — many were disabled on a transient symptom and have since healed. +- Sites for which `--self-check --diagnose` reports a problem. +- A focused audit of one engine (vBulletin, XenForo, phpBB, Discourse, Flarum, ...). Engine-wide breakage usually has a single root cause and several sites can be fixed in one PR. + +**Diagnose with built-in tools.** + +> By default, Maigret skips entries with `disabled: true` in every mode (`--self-check`, `--site`, plain search). Whenever your target is a disabled site — diagnosing it, validating a fix, running the two-filter check below — pass **`--use-disabled-sites`** explicitly. Without the flag, the site is silently dropped from the run and you get an empty result that looks like "everything's fine". + +- Per-site diagnosis with recommendations: + + ```bash + maigret --self-check --site "SiteName" --diagnose + # add --use-disabled-sites if the entry is currently disabled + ``` + + Without `--auto-disable`, this only reports — it never edits the database. Add `--auto-disable` only when you really want to write the result back. + +- Single-site comparison of claimed vs unclaimed responses (status, markers, headers): + + ```bash + python utils/site_check.py --site "SiteName" --diagnose + python utils/site_check.py --site "SiteName" --compare-methods # raw aiohttp vs Maigret's checker + ``` + +- Mass check of top-N sites: + + ```bash + python utils/check_top_n.py --top 100 --only-broken + ``` + +### Understanding `checkType` + +Each site entry uses one of three `checkType` modes to decide whether a profile exists. Picking the right one for your site is the most important data-modeling decision in `data.json`: + +- **`message`** (most common, most flexible) — Maigret fetches the page and inspects the HTML body. The profile is reported as found when the body contains at least one substring from `presenseStrs` **and** none of the substrings from `absenceStrs`. Pick narrow, profile-specific markers: a `` fragment unique to profile pages, a CSS class only rendered on profiles (e.g. `"profile-card"`), or a JSON field name from an embedded data blob (`"displayName":`). Avoid generic words (`name`, `email`) and HTML/ARIA boilerplate (`polite`, `alert`, `navigation`, `status`) — they match on every page including error and anti-bot challenge pages, and produce false positives. If the marker contains non-ASCII text, double-check the page is UTF-8 (some legacy sites serve KOI8-R or Windows-1251, in which case byte-level matching silently fails — prefer ASCII markers or a JSON API). + +- **`status_code`** — Maigret only looks at the HTTP status code; 2xx means "found", anything else means "not found". Use this only when the site reliably returns proper status codes — typically clean JSON APIs that return HTTP 200 for real users and HTTP 404 for missing ones. Don't use it for sites that return HTTP 200 with a soft "user not found" page (this is the single most common cause of false-positive checks). + +- **`response_url`** — Maigret follows the redirect chain and inspects the final URL. Useful when the server reliably redirects missing-user URLs to a different path (e.g. `/login`, `/404`, the homepage) while existing-user URLs stay put. For most sites `message` is a better fit; reach for `response_url` only when a redirect-based signal is genuinely the most stable one. + +**`urlProbe` (optional, works with any `checkType`).** If the most reliable signal lives at a different URL than the public profile page — a JSON API, a GraphQL endpoint, a mobile-app route — set `urlProbe` to that URL. Maigret fetches `urlProbe` for the check, but reports continue to show the human-readable `url` so users see a profile link they can click. Examples: GitHub uses `https://github.com/{username}` as `url` and `https://api.github.com/users/{username}` as `urlProbe`; Picsart uses the web profile as `url` and `https://api.picsart.com/users/show/{username}.json` as `urlProbe`. A clean public API is almost always more stable than parsing HTML — it's worth probing for one before settling on `message` against the SPA shell. + +**Errors vs absence.** Anything that means "the server can't answer right now" — rate limits, captchas, "Checking your browser", "unusual traffic", maintenance pages — belongs in `errors` (mapping the substring to a human-readable error string), not in `absenceStrs`. The `errors` mechanism produces an UNKNOWN result instead of a false CLAIMED or false AVAILABLE. + +Full reference for `checkType`, `urlProbe`, `engine`, and the rest of the `data.json` schema is in the [development guide](docs/source/development.rst), section *How to fix false-positives*. + +### Editing `data.json` safely + +`data.json` is a single ~36 000-line JSON file. **Make surgical, line-level edits only.** Never rewrite it by reading it into a Python dict and dumping it back — `json.load` + `json.dump` reformats every entry and produces an unreviewable 70 000-line diff. The same rule applies to any helper script that touches the file: it must preserve the original formatting of untouched entries. + +If your editor reformats JSON on save, disable that for `data.json` before editing. + +### Two-filter validation when re-enabling a site + +Removing `disabled: true` requires **two** independent checks. `--self-check` alone is not sufficient — it only verifies the two specific usernames recorded in the entry, so a site that returns CLAIMED for *any* arbitrary username will still pass the self-check. + +```bash +# Filter 1: self-check on the recorded claimed/unclaimed pair +maigret --self-check --site "SiteName" --use-disabled-sites + +# Filter 2: live probe with a clearly fake username — nothing should match +maigret noonewouldeverusethis7 --site "SiteName" --use-disabled-sites --print-not-found +``` + +Both filters need `--use-disabled-sites`, since a candidate for re-enable still has `disabled: true` in the working tree until your edit lands. If you forget the flag, both commands silently no-op. + +If the second command reports `[+]` for the fake username, the check is a false positive — do not enable. This step takes seconds and is non-negotiable for any re-enable PR. + +## Site naming, tags, and protection + +- **Site naming conventions** (Title Case by default, brand-specific exceptions, no `www.` prefix, etc.) are documented in the [development guide](docs/source/development.rst), section *Site naming conventions*. + +- **Country tags** (`us`, `ru`, `kr`, ...) attribute an account to a country of origin or residence — they're not a traffic-share label. Global services (GitHub, YouTube, Reddit) get **no** country tag; regional services (VK → `ru`, Naver → `kr`) **must** have one. Don't assign a country tag from Alexa/SimilarWeb audience stats. + +- **Category tags** must come from the canonical `"tags"` array at the bottom of `data.json`. The `test_tags_validity` test fails if you introduce an unregistered tag. If no existing tag fits well, either pick the closest reasonable match or add the new tag to the canonical list as an explicit, separate change. Don't use platform names (`writefreely`, `pixelfed`) — use category names (`blog`, `photo`). + +- **Protection tags** (`tls_fingerprint`, `ip_reputation`, `cf_js_challenge`, `cf_firewall`, `aws_waf_js_challenge`, `ddos_guard_challenge`, `js_challenge`, `custom_bot_protection`) describe the kind of anti-bot protection a site uses. One of them — **`tls_fingerprint`** — is load-bearing: when a site fingerprints the TLS handshake (JA3/JA4) and blocks non-browser clients, tagging it with `tls_fingerprint` makes Maigret automatically swap its HTTP client to [`curl_cffi`](https://github.com/lexiforest/curl_cffi) with Chrome browser emulation, which is usually enough to pass. The site stays `enabled` — no `disabled: true` is needed. Examples: Instagram, NPM, Codepen, Kickstarter, Letterboxd. The remaining tags are documentation-only and pair with `disabled: true` until a per-provider solver is integrated. The full taxonomy and the rules for picking the right tag are in the [development guide](docs/source/development.rst), section *protection (site protection tracking)*. Don't add a protection tag without empirical evidence it applies in the current environment. + +## Editing documentation + +The docs under `docs/source/` use Sphinx (reStructuredText) with a Simplified Chinese translation in `docs/source/locale/zh_CN/`. **If you edit any `.rst` file, refresh the translation catalogs so the Chinese build does not silently fall back to English on the changed strings:** + +```bash +cd docs +make intl-update LANG=zh_CN +``` + +This regenerates the `.po` files — new strings appear with empty `msgstr ""` and changed ones get a `#, fuzzy` marker. Translating them is optional for a PR (a maintainer or translator can fill them in later), but committing the regenerated `.po` files is **not** optional — otherwise the next person who runs `intl-update` gets a noisy diff for changes that aren't theirs. Full workflow, CJK-specific gotchas, and how to add a new language: [development guide](docs/source/development.rst), section *Translations*. + +## Testing + +CI runs the same checks on every PR, but please run them locally first: + +```bash +make format # auto-format with black +make lint # flake / mypy +make test # pytest with coverage +``` + +## Submitting changes + +Open a [GitHub PR](https://github.com/soxoj/maigret/pulls) against `main`. Always write a clear log message: + +``` +$ git commit -m "A brief summary of the commit +> +> A paragraph describing what changed and its impact." +``` + +One-line messages are fine for small changes; bigger changes should explain the *why* in the body. + +## Coding conventions + +### General + +- Follow [PEP 8](https://www.python.org/dev/peps/pep-0008/) for Python. +- Make sure all tests pass before opening the PR. + +### Code style + +- **Indentation**: 4 spaces per level. +- **Imports**: standard library first, third-party next, project-local last; group them logically. + +### Naming + +- **Variables and functions**: `snake_case`. +- **Classes**: `CamelCase`. +- **Constants**: `UPPER_CASE`. + +Start reading the code and you'll get the hang of it. + +## Getting help + +If you're stuck on something — a check that won't behave, a setup error, an unclear field in `data.json`, or just want to discuss an approach before opening a PR — there are two places to ask: + +- [GitHub Discussions](https://github.com/soxoj/maigret/discussions) — searchable, public, good for technical questions and design ideas. Prefer this for anything other contributors might run into too. +- Telegram: [@soxoj](https://t.me/soxoj) — direct channel to the maintainer, good for quick questions and informal chat. + +Bug reports and feature requests still belong in [GitHub Issues](https://github.com/soxoj/maigret/issues). + +## License + +Maigret is MIT-licensed; by submitting a contribution you agree to publish it under the same license. There is no CLA. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..072c455 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM python:3.11-slim AS base +LABEL maintainer="Soxoj <soxoj@protonmail.com>" +WORKDIR /app +RUN pip install --no-cache-dir --upgrade pip +RUN apt-get update && \ + apt-get install --no-install-recommends -y \ + build-essential \ + python3-dev \ + pkg-config \ + libcairo2-dev \ + libxml2-dev \ + libxslt1-dev \ + && rm -rf /var/lib/apt/lists/* /tmp/* +COPY . . +RUN YARL_NO_EXTENSIONS=1 python3 -m pip install --no-cache-dir . +# For production use, set FLASK_HOST to a specific IP address for security +ENV FLASK_HOST=0.0.0.0 + +# Web UI variant: auto-launches the web interface on $PORT +FROM base AS web +RUN pip install --no-cache-dir '.[pdf]' +ENV PORT=5000 +EXPOSE 5000 +ENTRYPOINT ["sh", "-c", "exec maigret --web \"$PORT\""] + +# Default variant (last stage = `docker build .` target): CLI, backwards-compatible +FROM base AS cli +ENTRYPOINT ["maigret"] diff --git a/Installer.bat b/Installer.bat new file mode 100644 index 0000000..a474424 --- /dev/null +++ b/Installer.bat @@ -0,0 +1,118 @@ +@echo off +goto check_Permissions + +:check_Permissions +net session >nul 2>&1 +if %errorLevel% == 0 ( + echo Success: Elevated permissions granted. +) else ( + echo Failure: Requires elevated permissions. + pause >nul +) + +cls +echo -------------------------------------------------------- +echo Python 3.8 or higher and pip3 required. +echo -------------------------------------------------------- +echo Press [I] to begin installation. +echo Press [R] If already installed. +echo -------------------------------------------------------- +choice /c IR +if %errorlevel%==1 goto check_python +if %errorlevel%==2 goto after + +:check_python +cls +for /f "tokens=2 delims= " %%i in ('python --version 2^>nul') do ( + for /f "tokens=1,2 delims=." %%j in ("%%i") do ( + if %%j GEQ 3 ( + if %%k GEQ 8 ( + goto check_pip + ) + ) + ) +) +echo Python 3.8 or higher is required. Please install it first. +pause +exit /b + +:check_pip +pip --version 2>nul | findstr /r /c:"pip" >nul +if %errorlevel% neq 0 ( + echo pip is required. Please install it first. + pause + exit /b +) +goto install1 + +:install1 +cls +echo ======================================================== +echo Maigret Installation +echo ======================================================== +echo. +echo -------------------------------------------------------- +echo If your pip installation is outdated, it could cause +echo cryptography to fail on installation. +echo -------------------------------------------------------- +echo Check for and install pip 23.3.2 now? +echo -------------------------------------------------------- +choice /c YN +if %errorlevel%==1 goto install2 +if %errorlevel%==2 goto install3 + +:install2 +cls +python -m pip install --upgrade pip==23.3.2 +if %errorlevel% neq 0 ( + echo Failed to update pip to version 23.3.2. Please check your installation. + pause + exit /b +) +goto install3 + +:install3 +cls +echo ======================================================== +echo Maigret Installation +echo ======================================================== +echo. +echo -------------------------------------------------------- +echo Installing Maigret... +python -m pip install maigret +if %errorlevel% neq 0 ( + echo Failed to install Maigret. Please check your installation. + pause + exit /b +) +echo. +echo +------------------------------------------------------+ +echo Maigret installed successfully. +echo +------------------------------------------------------+ +pause +goto after + +:after +cls +echo ======================================================== +echo Maigret Usage +echo ======================================================== +echo. +echo +--------------------------------------------------------+ +echo To use Maigret, you can run the following command: +echo. +echo maigret [options] [username] +echo. +echo For example, to search for a username: +echo. +echo maigret example_username +echo. +echo For more options and usage details, refer to the Maigret documentation. +echo. +echo https://github.com/soxoj/maigret/blob/5b3b81b4822f6deb2e9c31eb95039907f25beb5e/README.md +echo +--------------------------------------------------------+ +echo. +cmd +pause +exit /b +exit /b diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..df0f2e5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2026 Soxoj + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1e0bdf0 --- /dev/null +++ b/Makefile @@ -0,0 +1,41 @@ +LINT_FILES=maigret wizard.py tests + +test: + coverage run --source=./maigret,./maigret/web -m pytest tests + coverage report -m + coverage html + +rerun-tests: + pytest --lf -vv + +lint: + @echo 'syntax errors or undefined names' + flake8 --count --select=E9,F63,F7,F82 --show-source --statistics ${LINT_FILES} + + @echo 'warning' + flake8 --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --ignore=E731,W503,E501 ${LINT_FILES} + + @echo 'mypy' + mypy --check-untyped-defs ${LINT_FILES} + +speed: + time python3 -m maigret --version + python3 -c "import timeit; t = timeit.Timer('import maigret'); print(t.timeit(number = 1000000))" + python3 -X importtime -c "import maigret" 2> maigret-import.log + python3 -m tuna maigret-import.log + +format: + @echo 'black' + black --skip-string-normalization ${LINT_FILES} + +pull: + git stash + git checkout main + git pull origin main + git stash pop + +clean: + rm -rf reports htmcov dist + +install: + pip3 install . diff --git a/README.md b/README.md new file mode 100644 index 0000000..6be6e26 --- /dev/null +++ b/README.md @@ -0,0 +1,389 @@ +# Maigret + +<div align="center"> + <div> + <a href="https://pypi.org/project/maigret/"> + <img alt="PyPI version badge for Maigret" src="https://img.shields.io/pypi/v/maigret?style=flat-square" /> + </a> + <a href="https://pepy.tech/project/maigret"> + <img alt="Total downloads" src="https://static.pepy.tech/badge/maigret" /> + <img alt="Downloads/month" src="https://static.pepy.tech/badge/maigret/month" /> + </a> + </div> + <div> + <a href="https://github.com/soxoj/maigret"> + <img alt="View count for Maigret project" src="https://komarev.com/ghpvc/?username=maigret&color=brightgreen&label=views&style=flat-square" /> + </a> + <a href="https://github.com/soxoj/maigret"> + <img alt="Minimum Python version required: 3.10+" src="https://img.shields.io/badge/Python-3.10%2B-brightgreen?style=flat-square" /> + </a> + <a href="https://github.com/soxoj/maigret/blob/main/LICENSE"> + <img alt="License badge for Maigret" src="https://img.shields.io/github/license/soxoj/maigret?style=flat-square" /> + </a> + </div> + <br> + <div> + <img src="https://raw.githubusercontent.com/soxoj/maigret/main/static/maigret.png" height="300" alt="Maigret logo"/> + </div> + <br> + <div> + <a href="https://codewiki.google/github.com/soxoj/maigret"> + <img alt="Ask Code Wiki about Maigret" src="https://img.shields.io/badge/Code_Wiki-ask_about_repo-yellow?logo=googlegemini" /> + </a> + <a href="https://deepwiki.com/soxoj/maigret"> + <img alt="Ask DeepWiki about Maigret" src="https://img.shields.io/badge/DeepWiki-ask_about_repo-yellow" /> + </a> + </div> + <br> + <div> + <b>English</b> · <a href="README.zh-CN.md">简体中文</a> + </div> + <br> +</div> + +**Maigret** collects a dossier on a person **by username only**, checking for accounts on a huge number of sites and gathering all the available information from web pages. No API keys required. **[AI profiling (demo)](#ai-analysis)**. + +## Sponsors + +<p align="center"> + <a href="https://www.711proxy.com/?utm_t=1&utm_i=538"> + <img src="https://i.imgur.com/s1JHMun.gif" width="250" alt="711Proxy"> + </a> +</p> + +<p> + <a href="https://www.711proxy.com/?utm_t=1&utm_i=538"><b>711Proxy</b></a> provides reliable residential proxies for web scraping, username lookups, and public data collection. Over <b>100M</b> residential IPs across <b>200+</b> countries • High Success Rates • Fast & Reliable Connections. <br> +<b>Special Offer</b>: Free trial available! Rotating residential proxies from just <b>$0.55/GB</b>. Unlimited residential proxies from <b>$15/hour</b> with no concurrency limits. +</p> + +<br> + +<p align="center"> + <a href="https://9proxy.com/?utm_source=Github&utm_campaign=obscura"> + <img src="https://i.imgur.com/FleHdvu.gif" width="250" alt="9Proxy"> + </a> +</p> + +<p> + <a href="https://9proxy.com/?utm_source=Github&utm_campaign=obscura"><b>9Proxy</b></a> provides residential proxies from just <b>$0.018/IP or $0.68/GB</b>. 20M+ IPs across 90+ countries. Sticky or rotating sessions, managed from desktop or mobile app. +</p> + +<br> + +<p align="center"> + <a href="https://www.rapidproxy.io/?ref=soxoj"> + <img src="https://github.com/user-attachments/assets/4ed589d1-37cb-4a40-9273-bff4d6f1a514" width="500" alt="RapidProxy"> + </a> +</p> + +<p> + <a href="https://www.rapidproxy.io/?ref=soxoj"><b>RapidProxy</b></a> provides high-performance residential proxies for Twitter scraping, Selenium automation, and web data extraction. 90M+ IPs • Smart rotation • Anti-block • Non-expiring traffic. <br> +<b>Special Offer</b>: Try it free — Plans from $0.65/GB. Use code <b>RAPID10</b> for 10% off. +</p> + +## Contents + +- [In one minute](#in-one-minute) +- [Main features](#main-features) +- [Demo](#demo) +- [Installation](#installation) +- [Usage](#usage) +- [Contributing](#contributing) +- [Commercial Use](#commercial-use) +- [About](#about) + +<a id="one-minute"></a> +## In one minute + +Ensure you have Python 3.10 or higher. + +```bash +pip install maigret +maigret YOUR_USERNAME +``` + +No install? Try the [community Telegram bot](https://sites.google.com/view/maigret-bot-link) or a [Cloud Shell](#cloud-shells). + +Want a web UI? See [how to launch it](#web-interface). + +See also: [Quick start](https://maigret.readthedocs.io/en/latest/quick-start.html). + +## Main features + +- Supports 3,000+ sites ([see full list](https://github.com/soxoj/maigret/blob/main/sites.md)). A default run checks the 500 highest-ranked sites by traffic; pass `-a` to scan everything, or `--tags` to narrow by category/country. +- Embeddable in Python projects — import `maigret` and run searches programmatically (see [library usage](https://maigret.readthedocs.io/en/latest/library-usage.html)). +- [Extracts](https://github.com/soxoj/socid_extractor) all available information about the account owner from profile pages and site APIs, including links to other accounts. +- Performs recursive search using discovered usernames and other IDs. +- Allows filtering by tags (site categories, countries). +- Detects and partially bypasses blocks, censorship, and CAPTCHA. +- Fetches an [auto-updated site database](https://maigret.readthedocs.io/en/latest/settings.html#database-auto-update) from GitHub each run (once per 24 hours), and falls back to the built-in database if offline. +- Works with Tor and I2P websites; able to check domains. +- Ships with a [web interface](#web-interface) for browsing results as a graph and downloading reports in every format from a single page. +- Optional [AI analysis mode](#ai-analysis) (`--ai`) that turns raw findings into a short investigation summary using an OpenAI-compatible API. + +For the complete feature list, see the [features documentation](https://maigret.readthedocs.io/en/latest/features.html). + +### Used by + +Professional OSINT and social-media analysis tools built on Maigret: + +<a href="https://github.com/SocialLinks-IO/sociallinks-api"><img height="60" alt="Social Links API" src="https://github.com/user-attachments/assets/789747b2-d7a0-4d4e-8868-ffc4427df660"></a> +<a href="https://sociallinks.io/products/sl-crimewall"><img height="60" alt="Social Links Crimewall" src="https://github.com/user-attachments/assets/0b18f06c-2f38-477b-b946-1be1a632a9d1"></a> +<a href="https://usersearch.ai/"><img height="60" alt="UserSearch" src="https://github.com/user-attachments/assets/66daa213-cf7d-40cf-9267-42f97cf77580"></a> + +## Demo + +### Video + +<a href="https://asciinema.org/a/Ao0y7N0TTxpS0pisoprQJdylZ"> + <img src="https://asciinema.org/a/Ao0y7N0TTxpS0pisoprQJdylZ.svg" alt="asciicast" width="600"> +</a> + +### Reports + +[PDF report](https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotographycars.pdf), [HTML report](https://htmlpreview.github.io/?https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotographycars.html) + +![HTML report screenshot](https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotography_html_screenshot.png) + +![XMind 8 report screenshot](https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotography_xmind_screenshot.png) + +[Full console output](https://raw.githubusercontent.com/soxoj/maigret/main/static/recursive_search.md) + +## Installation + +Already ran the [In one minute](#one-minute) steps? You're set. Below are alternative methods. + +Don't want to install anything? Use the [community Telegram bot](https://sites.google.com/view/maigret-bot-link). + +### Windows + +Download `maigret_standalone.exe` from [Releases](https://github.com/soxoj/maigret/releases). You can launch it two ways: + +- **Double-click it** — Maigret will ask for a username, run a default search, and wait at the end so the report links stay visible. +- **Run it from a terminal** — open Command Prompt (press `Win+R`, type `cmd`, hit Enter) or PowerShell to pass extra options: + +```cmd +cd %USERPROFILE%\Downloads +maigret_standalone.exe USERNAME +maigret_standalone.exe USERNAME --html :: also save an HTML report +maigret_standalone.exe --help :: list all options +``` + +Video guide: https://youtu.be/qIgwTZOmMmM. + +<a id="cloud-shells"></a> +### Cloud Shells + +Run Maigret in the browser via cloud shells or Jupyter notebooks: + +<a href="https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=cloudshell-tutorial.md"><img src="https://user-images.githubusercontent.com/27065646/92304704-8d146d80-ef80-11ea-8c29-0deaabb1c702.png" alt="Open in Cloud Shell" height="50"></a> +<a href="https://repl.it/github/soxoj/maigret"><img src="https://replit.com/badge/github/soxoj/maigret" alt="Run on Replit" height="50"></a> + +<a href="https://colab.research.google.com/gist/soxoj/879b51bc3b2f8b695abb054090645000/maigret-collab.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab" height="45"></a> +<a href="https://mybinder.org/v2/gist/soxoj/9d65c2f4d3bec5dd25949197ea73cf3a/HEAD"><img src="https://mybinder.org/badge_logo.svg" alt="Open In Binder" height="45"></a> + +### Local installation (pip) + +```bash +# install from pypi +pip3 install maigret + +# usage +maigret username +``` + +### From source + +```bash +# or clone and install manually +git clone https://github.com/soxoj/maigret && cd maigret + +# build and install +pip3 install . + +# usage +maigret username +``` + +### Docker + +Two image variants are published: + +- `soxoj/maigret:latest` — CLI mode (default) +- `soxoj/maigret:web` — auto-launches the [web interface](#web-interface) + +```bash +# official image (CLI) +docker pull soxoj/maigret + +# CLI usage +docker run -v /mydir:/app/reports soxoj/maigret:latest username --html + +# Web UI (open http://localhost:5000) +docker run -p 5000:5000 soxoj/maigret:web + +# Web UI on a custom port +docker run -e PORT=8080 -p 8080:8080 soxoj/maigret:web + +# manual build +docker build -t maigret . # CLI image (default target) +docker build --target web -t maigret-web . # Web UI image +``` + +### Troubleshooting + +Build errors? See the [troubleshooting guide](https://maigret.readthedocs.io/en/latest/installation.html#troubleshooting). + +PDF reports (`--pdf`) are an optional extra — install with `pip install 'maigret[pdf]'`. They need system-level graphics libraries on Linux/macOS; see the [PDF reports section](https://maigret.readthedocs.io/en/latest/installation.html#optional-pdf-reports-maigret-pdf) for per-OS install steps. + +## Usage + +### Examples + +```bash +# make HTML, PDF, and Xmind8 reports +maigret user --html +maigret user --pdf +maigret user --xmind #Output not compatible with xmind 2022+ + +# machine-readable exports +maigret user --json ndjson # newline-delimited JSON (also: --json simple) +maigret user --csv +maigret user --txt +maigret user --graph # interactive D3 graph (HTML) +maigret user --neo4j # Neo4j Cypher script (graph database) + +# search on sites marked with tags photo & dating +maigret user --tags photo,dating + +# search on sites marked with tag us +maigret user --tags us + +# highlight sites whose page also mentions specific keywords +maigret user --keywords python rust +# keyword-matched sites are shown with "[++]" in bright green + +# search for three usernames on all available sites +maigret user1 user2 user3 -a + +# AI-assisted investigation summary (needs OPENAI_API_KEY) +maigret user --ai +``` + +`--neo4j` writes a `*_neo4j.cypher` script of the results graph; import it with `cypher-shell -u neo4j -p <password> < report_user_neo4j.cypher` or paste it into the Neo4j Browser. Re-imports are idempotent. See the [Neo4j export docs](https://maigret.readthedocs.io/en/latest/command-line-options.html#neo4j-export). + +Run `maigret --help` for all options. Docs: [CLI options](https://maigret.readthedocs.io/en/latest/command-line-options.html), [more examples](https://maigret.readthedocs.io/en/latest/usage-examples.html). Running into 403s or timeouts? See [TROUBLESHOOTING.md](TROUBLESHOOTING.md). + +<a id="web-interface"></a> +### Web interface + +Maigret has a built-in web UI with a results graph and downloadable reports. + +<details> +<summary>Web Interface Screenshots</summary> + +![Web interface: how to start](https://raw.githubusercontent.com/soxoj/maigret/main/static/web_interface_screenshot_start.png) + +![Web interface: results](https://raw.githubusercontent.com/soxoj/maigret/main/static/web_interface_screenshot.png) + +</details> + +```console +maigret --web 5000 +``` + +Open http://127.0.0.1:5000, enter a username, and view results. + +### Python library + +**Maigret can be embedded in your own Python projects.** The CLI is a thin wrapper around an async function you can call directly — build custom pipelines, feed results into your own tooling, or run it inside a larger OSINT workflow. + +See the full [library usage guide](https://maigret.readthedocs.io/en/latest/library-usage.html) for a working example, async patterns, and how to filter sites by tag. + +### Useful CLI flags + +- `--parse URL` — parse a profile page, extract IDs/usernames, and use them to kick off a recursive search. +- `--permute` — generate likely username variants from two or more inputs (e.g. `john doe` → `johndoe`, `j.doe`, …) and search for all of them. +- `--self-check [--auto-disable]` — verify `usernameClaimed` / `usernameUnclaimed` pairs against live sites for maintainers auditing the database. +- `--ai` / `--ai-model` — run the [AI analysis](#ai-analysis) over the search results and stream a short investigation summary to the terminal. + +<a id="ai-analysis"></a> +### AI analysis + +[![asciicast](https://asciinema.org/a/979404.svg)](https://asciinema.org/a/979404) + +`--ai` collects the search results, builds an internal Markdown report, and sends it to an OpenAI-compatible chat completion endpoint to produce a short, neutral investigation summary (likely real name, location, occupation, interests, languages, confidence, follow-up leads). Per-site progress is suppressed and the model's output is streamed to stdout. + +```bash +export OPENAI_API_KEY=sk-... +maigret user --ai + +# pick a different model +maigret user --ai --ai-model gpt-4o-mini +``` + +The key can also be set as `openai_api_key` in `settings.json`. The endpoint defaults to `https://api.openai.com/v1`, but `openai_api_base_url` in `settings.json` can point to any OpenAI-compatible API (Azure OpenAI, OpenRouter, a local server, …). See the [settings docs](https://maigret.readthedocs.io/en/latest/settings.html) for the full list of options. + +### Tor / I2P / proxies + +Maigret can route checks through a proxy, Tor, or I2P — useful for `.onion` / `.i2p` sites and for bypassing WAFs that block datacenter IPs. + +```bash +# any HTTP/SOCKS proxy +maigret user --proxy socks5://127.0.0.1:1080 + +# Tor (default gateway socks5://127.0.0.1:9050) +maigret user --tor-proxy socks5://127.0.0.1:9050 + +# I2P (default gateway http://127.0.0.1:4444) +maigret user --i2p-proxy http://127.0.0.1:4444 +``` + +Start your Tor / I2P daemon before running the command — Maigret does not manage these gateways. + +### Cloudflare bypass + +> **Experimental.** The Cloudflare webgate is under active development; the configuration schema, CLI behaviour, and the set of routed sites may change without backwards-compatibility guarantees. + +A subset of sites in the database require a real browser to solve a JavaScript challenge. Maigret can offload these checks to a local [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) instance: + +```bash +docker run -d -p 8191:8191 --name flaresolverr ghcr.io/flaresolverr/flaresolverr:latest +maigret --cloudflare-bypass <username> +``` + +The bypass is opt-in (`--cloudflare-bypass` or `cloudflare_bypass.enabled` in `settings.json`) and only fires for sites whose `protection` field matches. See the [feature docs](https://maigret.readthedocs.io/en/latest/features.html#cloudflare-bypass) for backend options and configuration. + +## Contributing + +Add or fix new sites surgically in `data.json` (no `json.load`/`json.dump`), then run `./utils/update_site_data.py` to regenerate `sites.md` and the database metadata, and open a pull request. For more details, see the [CONTRIBUTING guide](https://github.com/soxoj/maigret/blob/main/CONTRIBUTING.md) and [development docs](https://maigret.readthedocs.io/en/latest/development.html). Release history: [CHANGELOG.md](CHANGELOG.md). + +## Commercial Use + +The open-source Maigret is MIT-licensed and free for commercial use without restriction — but site checks break over time and need active maintenance. + +For serious commercial use — with a **daily-updated site database** or a **username-check API** — reach out: 📧 [maigret@soxoj.com](mailto:maigret@soxoj.com) + +- Private site database — 5 000+ sites, updated daily (separate from the public open-source database) +- Username check API — integrate Maigret into your product + +## About + +### Disclaimer + +**For educational and lawful purposes only.** You are responsible for complying with all applicable laws (GDPR, CCPA, etc.) in your jurisdiction. The authors bear no responsibility for misuse. + +### Feedback + +[Open an issue](https://github.com/soxoj/maigret/issues) · [GitHub Discussions](https://github.com/soxoj/maigret/discussions) · [Telegram](https://t.me/soxoj) + +### SOWEL classification + +OSINT techniques used: +- [SOTL-2.2. Search For Accounts On Other Platforms](https://sowel.soxoj.com/other-platform-accounts) +- [SOTL-6.1. Check Logins Reuse To Find Another Account](https://sowel.soxoj.com/logins-reuse) +- [SOTL-6.2. Check Nicknames Reuse To Find Another Account](https://sowel.soxoj.com/nicknames-reuse) + +### License + +MIT © [Maigret](https://github.com/soxoj/maigret) diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..d7b1c0d --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`soxoj/maigret` +- 原始仓库:https://github.com/soxoj/maigret +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/README.zh-CN.md b/README.zh-CN.md new file mode 100644 index 0000000..cfd9e5e --- /dev/null +++ b/README.zh-CN.md @@ -0,0 +1,392 @@ +# Maigret + +<div align="center"> + <div> + <a href="https://pypi.org/project/maigret/"> + <img alt="Maigret 的 PyPI 版本" src="https://img.shields.io/pypi/v/maigret?style=flat-square" /> + </a> + <a href="https://pepy.tech/project/maigret"> + <img alt="Maigret 总下载量" src="https://static.pepy.tech/badge/maigret" /> + <img alt="Maigret 月下载量" src="https://static.pepy.tech/badge/maigret/month" /> + </a> + </div> + <div> + <a href="https://github.com/soxoj/maigret"> + <img alt="Maigret 项目访问量" src="https://komarev.com/ghpvc/?username=maigret&color=brightgreen&label=views&style=flat-square" /> + </a> + <a href="https://github.com/soxoj/maigret"> + <img alt="所需最低 Python 版本:3.10+" src="https://img.shields.io/badge/Python-3.10%2B-brightgreen?style=flat-square" /> + </a> + <a href="https://github.com/soxoj/maigret/blob/main/LICENSE"> + <img alt="Maigret 的开源许可证" src="https://img.shields.io/github/license/soxoj/maigret?style=flat-square" /> + </a> + </div> + <br> + <div> + <img src="https://raw.githubusercontent.com/soxoj/maigret/main/static/maigret.png" height="300" alt="Maigret logo"/> + </div> + <br> + <div> + <a href="https://codewiki.google/github.com/soxoj/maigret"> + <img alt="向 Code Wiki 询问 Maigret" src="https://img.shields.io/badge/Code_Wiki-ask_about_repo-yellow?logo=googlegemini" /> + </a> + <a href="https://deepwiki.com/soxoj/maigret"> + <img alt="向 DeepWiki 询问 Maigret" src="https://img.shields.io/badge/DeepWiki-ask_about_repo-yellow" /> + </a> + </div> + <br> + <div> + <a href="README.md">English</a> · <b>简体中文</b> + </div> + <br> +</div> + +**Maigret** 仅凭一个用户名,就能在大量站点上查找其账号,并从网页中收集所有可获取的公开信息,为目标人物生成一份档案。无需任何 API 密钥。**[AI 画像(演示)](#ai-analysis)**。 + +## 赞助商 + +<p align="center"> + <a href="https://www.711proxy.com/?utm_t=1&utm_i=538"> + <img src="https://i.imgur.com/s1JHMun.gif" width="250" alt="711Proxy"> + </a> +</p> + +<p> + <a href="https://www.711proxy.com/?utm_t=1&utm_i=538"><b>711Proxy</b></a> 提供可靠的住宅代理,适用于网页抓取、用户名查询及公开数据采集。覆盖 <b>200+</b> 个国家超 <b>1 亿</b>住宅 IP · 高成功率 · 稳定快速。<br> +<b>特别优惠</b>:免费试用!轮换住宅代理低至 <b>$0.55/GB</b>。无并发限制的不限量住宅代理低至 <b>$15/小时</b>。 +</p> + +<br> + +<p align="center"> + <a href="https://9proxy.com/?utm_source=Github&utm_campaign=obscura"> + <img src="https://i.imgur.com/FleHdvu.gif" width="250" alt="9Proxy"> + </a> +</p> + +<p> + <a href="https://9proxy.com/?utm_source=Github&utm_campaign=obscura"><b>9Proxy</b></a> 提供住宅代理,低至 <b>$0.018/IP 或 $0.68/GB</b>。覆盖 90+ 国家超 2000 万 IP,支持长效或轮换会话,可通过桌面或移动端应用管理。 +</p> + +<br> + +<p align="center"> + <a href="https://www.rapidproxy.io/?ref=soxoj"> + <img src="https://github.com/user-attachments/assets/4ed589d1-37cb-4a40-9273-bff4d6f1a514" width="500" alt="RapidProxy"> + </a> +</p> + +<p> + <a href="https://www.rapidproxy.io/?ref=soxoj"><b>RapidProxy</b></a> 提供高性能住宅代理,适用于 Twitter 抓取、Selenium 自动化和网页数据提取。9000万+ IP · 智能轮换 · 反封锁 · 流量永不过期。<br> +<b>特别优惠</b>:免费试用 — 套餐低至 $0.65/GB。使用优惠码 <b>RAPID10</b> 享九折优惠。 +</p> + +## 目录 + +- [一分钟上手](#one-minute) +- [核心特性](#main-features) +- [演示](#demo) +- [安装](#installation) +- [使用](#usage) +- [参与贡献](#contributing) +- [商业使用](#commercial-use) +- [关于](#about) + +<a id="one-minute"></a> +## 一分钟上手 + +请先确认本机的 Python 版本不低于 3.10。 + +```bash +pip install maigret +maigret YOUR_USERNAME +``` + +不想本地安装?可以试试[社区 Telegram 机器人](https://sites.google.com/view/maigret-bot-link),或者使用[云端 Shell](#cloud-shells)。 + +想要一个 Web 界面?参见[启动方式](#web-interface)。 + +延伸阅读:[快速入门](https://maigret.readthedocs.io/en/latest/quick-start.html)。 + +<a id="main-features"></a> +## 核心特性 + +- 支持 3000+ 站点(完整列表见 [sites.md](https://github.com/soxoj/maigret/blob/main/sites.md))。默认仅检查访问量排名前 500 的站点;加上 `-a` 可全量扫描,或使用 `--tags` 按分类/国家筛选。 +- 可作为 Python 库嵌入到自己的项目中——直接 `import maigret` 即可在代码里发起搜索(参见[库使用文档](https://maigret.readthedocs.io/en/latest/library-usage.html))。 +- 通过 [socid_extractor](https://github.com/soxoj/socid_extractor) 从个人主页和站点 API 中[提取](https://github.com/soxoj/socid_extractor)账号所有者的所有可获取信息,包括指向其他账号的链接。 +- 基于已发现的用户名和其他 ID,执行递归搜索。 +- 支持按标签(站点分类、国家)进行筛选。 +- 能够检测并部分绕过封锁、审查和 CAPTCHA。 +- 每次运行时(每 24 小时一次)从 GitHub 拉取一份[自动更新的站点数据库](https://maigret.readthedocs.io/en/latest/settings.html#database-auto-update);离线时会回退到内置数据库。 +- 可访问 Tor 与 I2P 站点;支持检查域名。 +- 自带一个 [Web 界面](#web-interface),可在同一页面将结果以图谱方式浏览,并下载各种格式的报告。 +- 可选的 [AI 分析模式](#ai-analysis)(`--ai`),通过 OpenAI 兼容 API 将原始搜索结果整理成一份简短的调查摘要。 + +完整特性列表请见[特性文档](https://maigret.readthedocs.io/en/latest/features.html)。 + +### 谁在使用 + +基于 Maigret 构建的专业 OSINT 与社交媒体分析工具: + +<a href="https://github.com/SocialLinks-IO/sociallinks-api"><img height="60" alt="Social Links API" src="https://github.com/user-attachments/assets/789747b2-d7a0-4d4e-8868-ffc4427df660"></a> +<a href="https://sociallinks.io/products/sl-crimewall"><img height="60" alt="Social Links Crimewall" src="https://github.com/user-attachments/assets/0b18f06c-2f38-477b-b946-1be1a632a9d1"></a> +<a href="https://usersearch.ai/"><img height="60" alt="UserSearch" src="https://github.com/user-attachments/assets/66daa213-cf7d-40cf-9267-42f97cf77580"></a> + +<a id="demo"></a> +## 演示 + +### 视频 + +<a href="https://asciinema.org/a/Ao0y7N0TTxpS0pisoprQJdylZ"> + <img src="https://asciinema.org/a/Ao0y7N0TTxpS0pisoprQJdylZ.svg" alt="asciicast" width="600"> +</a> + +### 报告示例 + +[PDF 报告](https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotographycars.pdf)、[HTML 报告](https://htmlpreview.github.io/?https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotographycars.html) + +![HTML 报告截图](https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotography_html_screenshot.png) + +![XMind 8 报告截图](https://raw.githubusercontent.com/soxoj/maigret/main/static/report_alexaimephotography_xmind_screenshot.png) + +[完整的命令行输出示例](https://raw.githubusercontent.com/soxoj/maigret/main/static/recursive_search.md) + +<a id="installation"></a> +## 安装 + +如果你已经按[一分钟上手](#one-minute)的步骤跑通了,就无需再装。下面列出几种可选的安装方式。 + +什么都不想装?直接用[社区 Telegram 机器人](https://sites.google.com/view/maigret-bot-link)。 + +### Windows + +从 [Releases](https://github.com/soxoj/maigret/releases) 下载 `maigret_standalone.exe`。有两种启动方式: + +- **双击运行** —— Maigret 会询问用户名、执行一次默认搜索,并在结束时停留,方便你查看报告链接。 +- **从终端运行** —— 打开命令提示符(按 `Win+R`,输入 `cmd`,回车)或 PowerShell,以便传入额外参数: + +```cmd +cd %USERPROFILE%\Downloads +maigret_standalone.exe USERNAME +maigret_standalone.exe USERNAME --html :: 同时保存 HTML 报告 +maigret_standalone.exe --help :: 列出所有选项 +``` + +视频指引:https://youtu.be/qIgwTZOmMmM。 + +<a id="cloud-shells"></a> +### 云端 Shell + +通过云端 Shell 或 Jupyter Notebook 在浏览器里运行 Maigret: + +<a href="https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=cloudshell-tutorial.md"><img src="https://user-images.githubusercontent.com/27065646/92304704-8d146d80-ef80-11ea-8c29-0deaabb1c702.png" alt="Open in Cloud Shell" height="50"></a> +<a href="https://repl.it/github/soxoj/maigret"><img src="https://replit.com/badge/github/soxoj/maigret" alt="Run on Replit" height="50"></a> + +<a href="https://colab.research.google.com/gist/soxoj/879b51bc3b2f8b695abb054090645000/maigret-collab.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab" height="45"></a> +<a href="https://mybinder.org/v2/gist/soxoj/9d65c2f4d3bec5dd25949197ea73cf3a/HEAD"><img src="https://mybinder.org/badge_logo.svg" alt="Open In Binder" height="45"></a> + +### 本地安装(pip) + +```bash +# 从 PyPI 安装 +pip3 install maigret + +# 使用 +maigret username +``` + +### 从源码安装 + +```bash +# 也可以克隆仓库后手动安装 +git clone https://github.com/soxoj/maigret && cd maigret + +# 构建并安装 +pip3 install . + +# 使用 +maigret username +``` + +### Docker + +官方提供两个镜像变体: + +- `soxoj/maigret:latest` —— CLI 模式(默认) +- `soxoj/maigret:web` —— 自动启动 [Web 界面](#web-interface) + +```bash +# 拉取官方镜像(CLI) +docker pull soxoj/maigret + +# CLI 用法 +docker run -v /mydir:/app/reports soxoj/maigret:latest username --html + +# Web UI(在 http://localhost:5000 打开) +docker run -p 5000:5000 soxoj/maigret:web + +# 自定义 Web UI 端口 +docker run -e PORT=8080 -p 8080:8080 soxoj/maigret:web + +# 手动构建 +docker build -t maigret . # CLI 镜像(默认 target) +docker build --target web -t maigret-web . # Web UI 镜像 +``` + +### 故障排查 + +构建报错?请见[故障排查指南](https://maigret.readthedocs.io/en/latest/installation.html#troubleshooting)。 + +PDF 报告(`--pdf`)是可选扩展 —— 通过 `pip install 'maigret[pdf]'` 安装。在 Linux/macOS 上还需要系统级图形库;各操作系统的安装步骤详见 [PDF 报告章节](https://maigret.readthedocs.io/en/latest/installation.html#optional-pdf-reports-maigret-pdf)。 + +<a id="usage"></a> +## 使用 + +### 示例 + +```bash +# 生成 HTML、PDF、XMind 8 报告 +maigret user --html +maigret user --pdf +maigret user --xmind # 与 XMind 2022+ 不兼容 + +# 机器可读的导出格式 +maigret user --json ndjson # 行分隔 JSON(也支持 --json simple) +maigret user --csv +maigret user --txt +maigret user --graph # 交互式 D3 图谱(HTML) +maigret user --neo4j # Neo4j Cypher 脚本(图数据库) + +# 仅在带有 photo 与 dating 标签的站点上搜索 +maigret user --tags photo,dating + +# 仅在带有 us 标签的站点上搜索 +maigret user --tags us + +# 同时在所有站点上搜索三个用户名 +maigret user1 user2 user3 -a + +# AI 辅助调查摘要(需要 OPENAI_API_KEY) +maigret user --ai +``` + +`--neo4j` 会生成结果图谱的 `*_neo4j.cypher` 脚本;可用 `cypher-shell -u neo4j -p <password> < report_user_neo4j.cypher` 导入,或粘贴到 Neo4j Browser 中。重复导入是幂等的。详见 [Neo4j 导出文档](https://maigret.readthedocs.io/en/latest/command-line-options.html#neo4j-export)。 + +完整选项请运行 `maigret --help`。文档:[命令行选项](https://maigret.readthedocs.io/en/latest/command-line-options.html)、[更多示例](https://maigret.readthedocs.io/en/latest/usage-examples.html)。遇到 403 或超时?参见 [TROUBLESHOOTING.md](TROUBLESHOOTING.md)。 + +<a id="web-interface"></a> +### Web 界面 + +Maigret 内置一个 Web UI,提供结果图谱视图和报告下载。 + +<details> +<summary>Web 界面截图</summary> + +![Web 界面:启动页](https://raw.githubusercontent.com/soxoj/maigret/main/static/web_interface_screenshot_start.png) + +![Web 界面:结果页](https://raw.githubusercontent.com/soxoj/maigret/main/static/web_interface_screenshot.png) + +</details> + +```console +maigret --web 5000 +``` + +在浏览器中打开 http://127.0.0.1:5000,输入用户名即可查看结果。 + +### Python 库 + +**Maigret 可以嵌入到你自己的 Python 项目里使用。** CLI 只是对一个异步函数的薄包装,你完全可以直接调用它——构建自定义流水线、把结果接入自家工具,或将其嵌入更大的 OSINT 工作流。 + +完整示例(包含异步用法和按标签筛选站点)请参见[库使用指南](https://maigret.readthedocs.io/en/latest/library-usage.html)。 + +### 常用 CLI 参数 + +- `--parse URL` —— 解析一个个人主页,从中提取 ID/用户名,并以此为起点发起递归搜索。 +- `--permute` —— 基于两个或更多输入生成可能的用户名变体(例如 `john doe` → `johndoe`、`j.doe` …)并对其逐一搜索。 +- `--self-check [--auto-disable]` —— 维护者用于核对数据库的工具:针对线上站点验证 `usernameClaimed` / `usernameUnclaimed` 配对是否仍然有效。 +- `--ai` / `--ai-model` —— 启用 [AI 分析](#ai-analysis),将搜索结果交给 OpenAI 兼容 API,并把简短的调查摘要流式输出到终端。 + +<a id="ai-analysis"></a> +### AI 分析 + +[![asciicast](https://asciinema.org/a/979404.svg)](https://asciinema.org/a/979404) + +`--ai` 会先收集搜索结果、在内存中构建 Markdown 报告,再将其发送到一个 OpenAI 兼容的 chat completion 接口,生成一份简短、克制的调查摘要(最可能的真实姓名、所在地、职业、兴趣、语言、置信度以及后续线索)。开启该模式后,逐站点的进度输出会被静默,模型的输出会以流式方式打印到 stdout。 + +```bash +export OPENAI_API_KEY=sk-... +maigret user --ai + +# 切换到其它模型 +maigret user --ai --ai-model gpt-4o-mini +``` + +API key 也可以写入 `settings.json` 的 `openai_api_key` 字段。接口地址默认为 `https://api.openai.com/v1`,通过在 `settings.json` 中设置 `openai_api_base_url`,可以指向任何 OpenAI 兼容的服务(Azure OpenAI、OpenRouter、本地推理服务等)。完整选项见[配置文档](https://maigret.readthedocs.io/en/latest/settings.html)。 + +### Tor / I2P / 代理 + +Maigret 支持通过代理、Tor 或 I2P 转发请求——这对访问 `.onion` / `.i2p` 站点,以及绕过会拦截数据中心 IP 的 WAF 都很有用。 + +```bash +# 任意 HTTP/SOCKS 代理 +maigret user --proxy socks5://127.0.0.1:1080 + +# Tor(默认网关 socks5://127.0.0.1:9050) +maigret user --tor-proxy socks5://127.0.0.1:9050 + +# I2P(默认网关 http://127.0.0.1:4444) +maigret user --i2p-proxy http://127.0.0.1:4444 +``` + +请先启动 Tor / I2P 守护进程再运行上述命令——Maigret 不会替你管理这些网关。 + +### Cloudflare 绕过 + +> **实验特性。** Cloudflare webgate 仍在积极开发中;配置项、CLI 行为以及命中该机制的站点集合都可能发生变化,不保证向后兼容。 + +数据库中有一部分站点需要真实浏览器才能通过 JavaScript 挑战。Maigret 可以将这些检查转交给本地运行的 [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr): + +```bash +docker run -d -p 8191:8191 --name flaresolverr ghcr.io/flaresolverr/flaresolverr:latest +maigret --cloudflare-bypass <username> +``` + +该功能为按需启用(命令行加 `--cloudflare-bypass`,或在 `settings.json` 中设置 `cloudflare_bypass.enabled`),并且只对 `protection` 字段匹配的站点生效。后端选项与配置详见[功能文档](https://maigret.readthedocs.io/en/latest/features.html#cloudflare-bypass)。 + +<a id="contributing"></a> +## 参与贡献 + +请精确地在 `data.json` 里新增或修复站点(不要使用 `json.load`/`json.dump` 整体读写),然后运行 `./utils/update_site_data.py` 重新生成 `sites.md` 和数据库元数据,再提交 Pull Request。更多细节见 [CONTRIBUTING 指南](https://github.com/soxoj/maigret/blob/main/CONTRIBUTING.md) 和[开发文档](https://maigret.readthedocs.io/en/latest/development.html)。版本历史见 [CHANGELOG.md](CHANGELOG.md)。 + +<a id="commercial-use"></a> +## 商业使用 + +开源版本的 Maigret 采用 MIT 许可证,可不受限制地用于商业用途——但站点检查会随时间失效,需要持续维护。 + +如果你有更严肃的商业需求——希望使用**每日更新的站点数据库**或**用户名查询 API**——欢迎联系:📧 [maigret@soxoj.com](mailto:maigret@soxoj.com) + +- 私有站点数据库 —— 5000+ 站点,每日更新(独立于公开开源数据库) +- 用户名查询 API —— 将 Maigret 集成进你的产品 + +<a id="about"></a> +## 关于 + +### 免责声明 + +**仅供教育与合法用途。** 使用者需自行承担遵守所在司法辖区相关法律(GDPR、CCPA 等)的责任。作者不对任何滥用行为负责。 + +### 反馈 + +[提交 issue](https://github.com/soxoj/maigret/issues) · [GitHub Discussions](https://github.com/soxoj/maigret/discussions) · [Telegram](https://t.me/soxoj) + +### SOWEL 分类 + +涉及到的 OSINT 技术: +- [SOTL-2.2. Search For Accounts On Other Platforms](https://sowel.soxoj.com/other-platform-accounts) +- [SOTL-6.1. Check Logins Reuse To Find Another Account](https://sowel.soxoj.com/logins-reuse) +- [SOTL-6.2. Check Nicknames Reuse To Find Another Account](https://sowel.soxoj.com/nicknames-reuse) + +### 许可证 + +MIT © [Maigret](https://github.com/soxoj/maigret) diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md new file mode 100644 index 0000000..3ee79c0 --- /dev/null +++ b/TROUBLESHOOTING.md @@ -0,0 +1,104 @@ +# Troubleshooting + +Common issues when running Maigret and how to fix them. If none of this helps, [open an issue](https://github.com/soxoj/maigret/issues) with the output of `maigret --version` and the exact command you ran. + +## "Lots of sites fail / timeout / return 403" + +This is by far the most common report. It almost always comes from anti-bot protection (Cloudflare, DDoS-Guard, Akamai, etc.) or a slow network — not from a bug in Maigret. + +**Results vary a lot depending on where you run from.** The same command on the same username can produce very different output on: + +- **Mobile internet** (4G/5G) — usually the best results. Carrier NAT shares your IP with thousands of real users, so WAFs rarely block it. +- **Home broadband** — generally good, though some ISPs are reputation-flagged. +- **Hosting / cloud / VPS infrastructure** (AWS, GCP, DigitalOcean, Hetzner, etc.) — the worst case. Datacenter IP ranges are blanket-blocked or challenged by most WAFs, so you will see many false negatives and 403s. + +If a run looks suspiciously empty, **try a different network before assuming Maigret is broken**: tether from your phone, switch between Wi-Fi and mobile, or move the run off a VPS onto a residential machine. Comparing results across two networks is also the fastest way to tell whether a missing account is genuinely missing or just blocked on the current IP. + +Once you have a sense of the baseline, try these tweaks in order: + +1. **Raise the timeout.** The default is 30 seconds. On mobile networks or for slow sites, bump it: + ```bash + maigret user --timeout 60 + ``` +2. **Retry failed checks.** Transient 5xx / timeouts often clear on a second try: + ```bash + maigret user --retries 2 + ``` +3. **Lower parallelism.** Some WAFs rate-limit aggressively. Maigret defaults to 100 concurrent connections (`-n` / `--max-connections`) — dropping this makes you look less like a scanner: + ```bash + maigret user -n 20 + ``` +4. **Route through a residential proxy.** Datacenter IPs (AWS, GCP, DigitalOcean) are blanket-blocked by many WAFs. A residential / mobile proxy usually fixes this: + ```bash + maigret user --proxy http://user:pass@residential-proxy:port + ``` + Note: Tor (`--tor-proxy`) rarely helps here — most WAFs block Tor exit nodes just as aggressively as datacenter IPs. Use Tor only when you actually need to reach `.onion` sites (see below). + +If specific sites *always* fail regardless of the above, they are likely broken in the database (stale markers, new WAF, site redesign). Report them with `--print-errors` output so a maintainer can look at the check config. + +## "No results at all" / "maigret: command not found" + +- **`command not found`** — `pip install maigret` put the binary under `~/.local/bin` (Linux/macOS) or `%APPDATA%\Python\Scripts` (Windows). Add that directory to `PATH`, or run `python3 -m maigret user` instead. +- **Empty output** — check that you actually passed a username; `maigret` alone prints help. Also confirm Python 3.10+ with `python3 --version`. + +## "SSL / certificate errors" + +Usually caused by a corporate MITM proxy or an outdated `certifi` bundle. + +```bash +pip install --upgrade certifi +``` + +If you are behind a corporate proxy, set `HTTPS_PROXY` / `HTTP_PROXY` environment variables and pass `--proxy "$HTTPS_PROXY"` so Maigret uses the same route. + +## Running over Tor, I2P, or Tails OS + +Two different goals, two different flags: + +- **Route only `.onion` / `.i2p` sites through their gateway** (clearweb checks still use your direct connection). Use `--tor-proxy` / `--i2p-proxy`: + ```bash + maigret user --tor-proxy socks5://127.0.0.1:9050 # only .onion goes via Tor + maigret user --i2p-proxy http://127.0.0.1:4444 # only .i2p goes via I2P + ``` + Without these flags, `.onion` / `.i2p` sites are silently skipped. + +- **Route the whole run through Tor / a proxy** (e.g. on Tails OS, or to anonymise the scan). Use `--proxy`: + ```bash + # system tor daemon (apt install tor, Tails) + maigret user --proxy socks5://127.0.0.1:9050 --timeout 60 --retries 2 + + # Tor Browser bundle (different SOCKS port!) + maigret user --proxy socks5://127.0.0.1:9150 --timeout 60 --retries 2 + ``` + Most public WAFs block Tor exits, so expect more UNKNOWNs over Tor than on a residential line — this is the cost of anonymity, not a bug. Raising `--timeout` to 60 and adding `--retries 2` materially reduces noise. + +On Tails, `torsocks maigret …` / `torify maigret …` do **not** work — Maigret's HTTP client bypasses libc, so the wrapper has no effect. Use `--proxy` instead. To install Maigret over Tor: `torsocks pip install --user maigret`. + +Maigret does not launch or manage Tor / I2P daemons — they must already be running. + +For the full walkthrough (Tor Browser vs system `tor` ports, Tails persistence, reports paths), see the [Tor, I2P, and proxies](https://maigret.readthedocs.io/en/latest/tor-and-proxies.html) page on readthedocs. + +## "The PDF / XMind / HTML report looks wrong" + +- **PDF** — requires `weasyprint` and its system dependencies (Pango, Cairo, GDK-PixBuf). On Debian/Ubuntu: `apt install libpango-1.0-0 libpangoft2-1.0-0`. macOS: `brew install pango`. +- **XMind** — the `--xmind` flag generates **XMind 8** files. XMind 2022+ (Zen / XMind 2023) uses a different format and will not open them. Use XMind 8 or convert via `--html`. +- **HTML** looks unstyled — open it through a local file path (`file:///...`), not via a preview pane that strips CSS. + +## "The site database is out of date" + +Maigret auto-fetches a fresh `data.json` from GitHub once every 24 hours. To force-refresh now: + +```bash +maigret user --force-update +``` + +To run entirely against the local built-in copy (e.g. offline): + +```bash +maigret user --no-autoupdate +``` + +## Still stuck? + +- [Open an issue](https://github.com/soxoj/maigret/issues) — include your OS, Python version, Maigret version, and the full command. +- Ask in [GitHub Discussions](https://github.com/soxoj/maigret/discussions) or the [Telegram](https://t.me/soxoj) channel. diff --git a/cloudshell-tutorial.md b/cloudshell-tutorial.md new file mode 100644 index 0000000..1cc704b --- /dev/null +++ b/cloudshell-tutorial.md @@ -0,0 +1,69 @@ +# Maigret + +<div align="center"> + <img src="https://raw.githubusercontent.com/soxoj/maigret/main/static/maigret.png" height="220" alt="Maigret logo"/> +</div> + +**Maigret** collects a dossier on a person **by username only**, checking for accounts on a huge number of sites and gathering all the available information from web pages. No API keys required. + +## Installation + +Google Cloud Shell does not ship with all the system libraries Maigret needs (`libcairo2-dev`, `pkg-config`). The helper script below installs them and then builds Maigret from the cloned source. + +Copy the command and run it in the Cloud Shell terminal: + +```bash +./utils/cloudshell_install.sh +``` + +When the script finishes, verify the install: + +```bash +maigret --version +``` + +## Usage examples + +Run a basic search for a username. By default Maigret checks the **500 highest-ranked sites by traffic** — pass `-a` to scan the full 3,000+ database. + +```bash +maigret soxoj +``` + +Search several usernames at once: + +```bash +maigret user1 user2 user3 +``` + +Narrow the run to sites related to cryptocurrency via the `crypto` tag (you can also use country tags): + +```bash +maigret vitalik.eth --tags crypto +``` + +Generate reports in HTML, PDF, and XMind 8 formats: + +```bash +maigret soxoj --html +maigret soxoj --pdf +maigret soxoj --xmind +``` + +Download a generated report from Cloud Shell to your local machine: + +```bash +cloudshell download reports/report_soxoj.pdf +``` + +Tune reliability on flaky networks — raise the timeout and retry failed checks: + +```bash +maigret soxoj --timeout 60 --retries 2 +``` + +For the full list of options see `maigret --help` or the [CLI documentation](https://maigret.readthedocs.io/en/latest/command-line-options.html). + +## Further reading + +Full project documentation: [maigret.readthedocs.io](https://maigret.readthedocs.io/) diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..f8950a3 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,40 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile gettext intl-update html-zh_CN + +# Translation pipeline +# +# 1. `make gettext` regenerates .pot files from the English .rst sources. +# 2. `make intl-update LANG=zh_CN` syncs the .po files for that language +# against the new .pot files (new strings get empty msgstrs, removed +# strings get commented out, changed strings get a `fuzzy` marker). +# 3. `make html-zh_CN` builds a local Simplified Chinese HTML preview. +# +# To bootstrap a new language, run `make intl-update LANG=<code>`. +LANG ?= zh_CN + +gettext: + $(SPHINXBUILD) -b gettext $(SPHINXOPTS) "$(SOURCEDIR)" "$(BUILDDIR)/gettext" + +intl-update: gettext + sphinx-intl update -p "$(BUILDDIR)/gettext" -l $(LANG) -d "$(SOURCEDIR)/locale" + +html-zh_CN: + $(SPHINXBUILD) -b html -D language=zh_CN $(SPHINXOPTS) "$(SOURCEDIR)" "$(BUILDDIR)/html_zh_CN" + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..9534b01 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..e6e7d6f --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +sphinx-copybutton +sphinx_rtd_theme +sphinx-intl diff --git a/docs/source/command-line-options.rst b/docs/source/command-line-options.rst new file mode 100644 index 0000000..7650daa --- /dev/null +++ b/docs/source/command-line-options.rst @@ -0,0 +1,412 @@ +.. _command-line-options: + +Command line options +==================== + +Usernames +--------- + +``maigret username1 username2 ...`` + +You can specify several usernames separated by space. Usernames are +**not** mandatory as there are other operations modes (see below). + +Parsing of account pages and online documents +--------------------------------------------- + +``maigret --parse URL`` + +Maigret will try to extract information about the document/account owner +(including username and other ids) and will make a search by the +extracted username and ids. See examples in the :ref:`extracting-information-from-pages` section. + +Main options +------------ + +Options are also configurable through settings files, see +:doc:`settings section <settings>`. + +``--tags`` - Filter sites for searching by tags: sites categories and +two-letter country codes (**not a language!**). E.g. photo, dating, sport; jp, us, global. +Multiple tags can be associated with one site. **Warning**: tags markup is +not stable now. Read more :doc:`in the separate section <tags>`. + +``--exclude-tags`` - Exclude sites with specific tags from the search +(blacklist). E.g. ``--exclude-tags porn,dating`` will skip all sites +tagged with ``porn`` or ``dating``. Can be combined with ``--tags`` to +include certain categories while excluding others. Read more +:doc:`in the separate section <tags>`. + +``-n``, ``--max-connections`` - Allowed number of concurrent connections +**(default: 100)**. + +``-a``, ``--all-sites`` - Use all sites for scan **(default: top 500)**. + +``--top-sites`` - Count of sites for scan ranked by Majestic Million +**(default: top 500)**. + +**Mirrors:** After the top *N* sites by Majestic Million rank are chosen (respecting +``--tags``, ``--use-disabled-sites``, etc.), Maigret may add extra sites +whose database field ``source`` names a **parent platform** that itself falls +in the Majestic Million top *N* when ranking **including disabled** sites. For example, +if ``Twitter`` ranks in the first 500 by Majestic Million, a mirror such as ``memory.lol`` +(with ``source: Twitter``) is included even though it has no rank and would +otherwise be cut off. The same applies to Instagram-related mirrors (e.g. +Picuki) when ``Instagram`` is in that parent top *N* by rank—even if the +official ``Instagram`` entry is disabled and not scanned by default, its +mirrors can still be pulled in. The final list is the ranked top *N* plus +these mirrors (no fixed upper bound on mirror count). + +``--timeout`` - Time (in seconds) to wait for responses from sites +**(default: 30)**. A longer timeout will be more likely to get results +from slow sites. On the other hand, this may cause a long delay to +gather all results. The choice of the right timeout should be carried +out taking into account the bandwidth of the Internet connection. + +Network and proxy options +~~~~~~~~~~~~~~~~~~~~~~~~~ + +``--proxy PROXY_URL`` / ``-p PROXY_URL`` - Route **every** check through +the given HTTP or SOCKS proxy. Example: ``socks5://127.0.0.1:1080``, +``http://user:pass@proxy.example:3128``. This is the flag to use for +routing the whole run through Tor (``--proxy socks5://127.0.0.1:9050``), +a residential proxy, or any corporate gateway. No default. + +``--tor-proxy TOR_PROXY_URL`` - Gateway used **only** for ``.onion`` +sites in the database **(default: socks5://127.0.0.1:9050)**. Clearweb +sites are unaffected — for them Maigret uses your direct connection or +``--proxy`` if you set one. Without this flag, ``.onion`` sites are +silently skipped. + +``--i2p-proxy I2P_PROXY_URL`` - Gateway used **only** for ``.i2p`` +sites in the database **(default: http://127.0.0.1:4444)**. Same +"only matching protocol" rule as ``--tor-proxy``. + +Maigret does not start the Tor or I2P daemon for you — launch it first. +For a full walkthrough (Tor Browser vs system ``tor`` port numbers, +Tails OS recipe, timeout/retry tuning), see :doc:`tor-and-proxies`. + +``--cookies-jar-file`` - File with custom cookies in Netscape format +(aka cookies.txt). You can install an extension to your browser to +download own cookies (`Chrome <https://chrome.google.com/webstore/detail/get-cookiestxt/bgaddhkoddajcdgocldbbfleckgcbcid>`_, `Firefox <https://addons.mozilla.org/en-US/firefox/addon/cookies-txt/>`_). + +``--no-recursion`` - Disable parsing pages for other usernames and +recursive search by them. + +``--use-disabled-sites`` - Use disabled sites to search (may cause many +false positives). + +``--id-type`` - Specify identifier(s) type (default: username). +Supported types: gaia_id, vk_id, yandex_public_id, ok_id, wikimapia_uid. +Currently, you must add ``-a`` flag to run a scan on sites with custom +id types, sites will be filtered automatically. + +``--ignore-ids`` - Do not make search by the specified username or other +ids. Useful for repeated scanning with found known irrelevant usernames. + +``--db`` - Load Maigret database from a JSON file or an online, valid, +JSON file. See :ref:`custom-database` below. + +``--no-autoupdate`` - Disable the automatic database update check that +runs at startup. The currently cached (or bundled) database is used +as-is. + +``--force-update`` - Force a database update check at startup, ignoring +the usual check interval. Implies ``--no-autoupdate`` for the rest of +the run after the explicit update finishes. + +``--retries RETRIES`` - Count of attempts to restart temporarily failed +requests. + +``--with-domains`` *(experimental)* - Also resolve a small set of +``{username}.<tld>`` patterns through DNS (A-records) in parallel with +the normal HTTP checks. Currently 7 entries in the database use this +path (``.ddns.net``, ``.com``, ``.pro``, ``.me``, ``.biz``, ``.email``, +``.guru``). DNS-only hits can include parking domains and catch-all +wildcards, so treat results as a lead rather than confirmation. +See the :doc:`FAQ entry on DNS domain checks <faq>`. + +``--cloudflare-bypass`` *(experimental)* - Route checks for sites tagged +``protection: ["cf_js_challenge"]`` / ``["cf_firewall"]`` / ``["webgate"]`` +through a local Chrome-based solver (FlareSolverr by default). The bypass +is opt-in — without this flag (or +``settings.cloudflare_bypass.enabled = true``) those sites are checked +the usual way, which Cloudflare almost always blocks: you get an UNKNOWN +status with a JS-challenge / firewall error rather than a real result. +Configure the backend in ``settings.cloudflare_bypass.modules``. +See :ref:`cloudflare-bypass`. **Experimental** — the flag, schema and +routing rules may change without backwards-compatibility guarantees. + +.. _custom-database: + +Using a custom sites database +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``--db`` flag accepts three forms: + +1. **HTTP(S) URL** — fetched as-is, e.g. + ``--db https://example.com/my_db.json``. +2. **Local file path** — absolute (``--db /tmp/private.json``) or + relative to the current working directory + (``--db LLM/maigret_private_db.json``). +3. **Module-relative path** — kept for backwards compatibility, resolved + against the installed ``maigret/`` package directory (e.g. the + default ``resources/data.json``). + +Resolution order for local paths: the path is first tried as given +(absolute or cwd-relative); if that file does not exist, Maigret falls +back to the legacy module-relative resolution. If neither location +contains the file, Maigret exits with an error rather than silently +loading the bundled database. + +When ``--db`` points to a custom file, automatic database updates are +skipped — the file is used exactly as provided. + +On every run Maigret prints the database it actually loaded, for +example:: + + [+] Using sites database: /path/to/maigret_private_db.json (6 sites) + +If loading the requested database fails for any other reason (corrupt +JSON, missing required keys, …), Maigret prints a warning, falls back +to the bundled database, and reports the fallback explicitly:: + + [-] Falling back to bundled database: /…/maigret/resources/data.json + [+] Using sites database: /…/maigret/resources/data.json (3154 sites) + +A typical invocation against a private database, with auto-update +disabled and all sites scanned, looks like:: + + python3 -m maigret username \ + --db LLM/maigret_private_db.json \ + --no-autoupdate -a + +Reports +------- + +``-P``, ``--pdf`` - Generate a PDF report (general report on all +usernames). + +``-H``, ``--html`` - Generate an HTML report file (general report on all +usernames). + +``-X``, ``--xmind`` - Generate an XMind 8 mindmap (one report per +username). + +``-C``, ``--csv`` - Generate a CSV report (one report per username). + +``-T``, ``--txt`` - Generate a TXT report (one report per username). + +``-J``, ``--json`` - Generate a JSON report of specific type: simple, +ndjson (one report per username). E.g. ``--json ndjson`` + +``-M``, ``--md`` - Generate a Markdown report (general report on all +usernames). See :ref:`markdown-report` below. + +``--neo4j`` - Generate a Neo4j Cypher report: a ``.cypher`` script that +recreates the maigret graph (the same one produced by ``--graph``) in a +Neo4j database, importable with ``cypher-shell`` or the Neo4j Browser +(general report on all usernames). See :ref:`neo4j-export` below. + +``--ai`` - Run an AI-powered analysis of the search results using an +OpenAI-compatible chat completion API. The internal Markdown report is +sent to the model, which returns a short investigation summary that is +streamed to the terminal. See :ref:`ai-analysis` below. + +``--ai-model`` - Model name to use with ``--ai``. Defaults to +``openai_model`` from settings (``gpt-4o`` out of the box). + +``-fo``, ``--folderoutput`` - Results will be saved to this folder, +``results`` by default. Will be created if doesn’t exist. + +``--web PORT`` - Start the built-in web interface on the given port and +serve results / downloadable reports from a single page. Example: +``maigret --web 5000`` → open ``http://127.0.0.1:5000``. Full +walkthrough with screenshots: :ref:`web-interface`. + +Output options +-------------- + +``-v``, ``--verbose`` - Display extra information and metrics. +*(loglevel=WARNING)* + +``-vv``, ``--info`` - Display service information. *(loglevel=INFO)* + +``-vvv``, ``--debug``, ``-d`` - Display debugging information and site +responses. *(loglevel=DEBUG)* + +``--print-not-found`` - Print sites where the username was not found. + +``--print-errors`` - Print errors messages: connection, captcha, site +country ban, etc. + +Other operations modes +---------------------- + +``--version`` - Display version information and dependencies. + +``--self-check`` - Do self-checking for sites and database. Each site is +tested by looking up its known-claimed and known-unclaimed usernames and +verifying that the results match expectations. Individual site failures +(network errors, unexpected exceptions, etc.) are caught and logged +without stopping the overall process, so the check always runs to +completion. After checking, Maigret reports a summary of issues found. +If any sites were disabled (see ``--auto-disable``), Maigret asks if you +want to save updates; answering y/Y will rewrite the local database. + +``--auto-disable`` - Used with ``--self-check``: automatically disable +sites that fail checks (incorrect detection of claimed/unclaimed +usernames, connection errors, or unexpected exceptions). Without this +flag, ``--self-check`` only **reports** issues without modifying the +database. + +``--diagnose`` - Used with ``--self-check``: print detailed diagnosis +information for each failing site, including the check type, the list +of issues found, and recommendations (e.g. suggesting a different +``checkType``). + +``--submit URL`` - Do an automatic analysis of the given account URL or +site main page URL to determine the site engine and methods to check +account presence. After checking Maigret asks if you want to add the +site, answering y/Y will rewrite the local database. + +.. _markdown-report: + +Markdown report (LLM-friendly) +------------------------------ + +The ``--md`` / ``-M`` flag generates a Markdown report designed for both human reading and analysis by AI assistants (ChatGPT, Claude, etc.). + +.. code-block:: console + + maigret username --md + +The report includes: + +- **Summary** with aggregated personal data (all fullnames, locations, bios found across accounts), country tags, website tags, first/last seen timestamps. +- **Per-account sections** with profile URL, site tags, and all extracted fields (username, bio, follower count, linked accounts, etc.). +- **Possible false positives** disclaimer explaining that accounts may belong to different people. +- **Ethical use** notice about applicable data protection laws. + +**Using with AI tools:** + +The Markdown format is optimized for LLM context windows. You can feed the report directly to an AI assistant for follow-up analysis: + +.. code-block:: console + + # Generate the report + maigret johndoe --md + + # Feed it to an AI tool + cat reports/report_johndoe.md | llm "Analyze this OSINT report and summarize key findings" + +The structured Markdown with per-site sections makes it easy for AI tools to extract relationships, cross-reference identities, and identify patterns across accounts. + +For a built-in alternative that calls the model for you and prints the +summary directly, see :ref:`ai-analysis` below. + +.. _ai-analysis: + +AI analysis (built-in) +---------------------- + +The ``--ai`` flag turns the search results into a short investigation +summary by sending the internal Markdown report to an OpenAI-compatible +chat completion API and streaming the model's reply to the terminal. + +.. code-block:: console + + export OPENAI_API_KEY=sk-... + maigret username --ai + + # use a smaller / cheaper model + maigret username --ai --ai-model gpt-4o-mini + +While ``--ai`` is active, per-site progress lines and the short text +report at the end are suppressed so the streamed summary is the main +output. The Markdown report itself is built in memory and is **not** +written to disk by ``--ai`` alone — combine with ``--md`` if you also +want the file on disk. + +The summary follows a fixed format with sections for the most likely +real name, location, occupation, interests, languages, main website, +username variants, number of platforms, active years, a confidence +rating, and a short list of follow-up leads. The model is instructed +to rely only on what is supported by the report and to avoid mixing +clearly unrelated profiles into the main identity. + +**Configuration.** The API key is resolved from +``settings.openai_api_key`` first, then from the ``OPENAI_API_KEY`` +environment variable. The endpoint defaults to +``https://api.openai.com/v1`` and can be redirected to any +OpenAI-compatible service (Azure OpenAI, OpenRouter, a local server, +…) by setting ``openai_api_base_url`` in ``settings.json``. See +:ref:`settings` for the full list of options. + +.. note:: + + ``--ai`` makes a network request to the configured chat completion + endpoint and sends the full Markdown report (which contains the + gathered profile data). Use it only with providers and accounts + you trust with that data. + +.. _neo4j-export: + +Neo4j export +------------ + +The ``--neo4j`` flag serializes the maigret graph — the same nodes and +relationships behind ``--graph`` — into a ``*_neo4j.cypher`` script you +can load into a `Neo4j <https://neo4j.com/>`_ database for querying and +visual exploration of how identities, accounts, sites, and extracted +data points link together. + +.. code-block:: console + + maigret username --neo4j + +This writes ``reports/report_username_neo4j.cypher``. No extra runtime +dependency is required (it reuses the ``networkx`` graph that ``--graph`` +already builds). + +**What the script contains.** + +- A ``CREATE CONSTRAINT ... IF NOT EXISTS`` ensuring the ``name`` + property of every ``:MaigretNode`` is unique. +- One ``MERGE`` per node. Each node carries three properties: + ``name`` (the unique key, e.g. ``account: https://github.com/user``), + ``type`` (``username``, ``account``, ``fullname``, ``uid``, …) and + ``label`` (the human-readable value). +- One ``MERGE`` per edge as a ``[:LINKED_TO]`` relationship. + +Because every node and edge is ``MERGE``-d on its unique key, importing +the same report twice is **idempotent** — it updates existing nodes +instead of creating duplicates. + +**Importing.** + +.. code-block:: console + + # via cypher-shell (Neo4j must be running; default Bolt port 7687) + cypher-shell -u neo4j -p <password> < reports/report_username_neo4j.cypher + +Alternatively, open the Neo4j Browser at ``http://localhost:7474`` and +paste the script contents into the query editor. Drop the ``-p`` flag if +authentication is disabled, or let ``cypher-shell`` prompt for the +password interactively. + +**Exploring the graph.** Once imported, inspect it with Cypher, e.g.: + +.. code-block:: cypher + + // show the whole graph + MATCH (n:MaigretNode)-[r:LINKED_TO]->(m) RETURN n, r, m; + + // accounts linked to a given username + MATCH (u:MaigretNode {type: 'username'})-[:LINKED_TO]->(a:MaigretNode {type: 'account'}) + RETURN u.label, a.label; + +The ``CREATE CONSTRAINT ... IF NOT EXISTS FOR ... REQUIRE`` syntax +requires Neo4j 4.4+; the ``MERGE`` statements themselves work on any +version. + diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..9dfaedd --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,48 @@ +# Configuration file for the Sphinx documentation builder. + +import os + +# -- Project information + +project = 'Maigret' +copyright = '2025, soxoj' +author = 'soxoj' + +release = '0.6.2' +version = '0.6' + +# -- Internationalization +# +# Default to English. Translation projects on Read the Docs set the +# ``READTHEDOCS_LANGUAGE`` env var (e.g. ``zh_CN``); locally the language +# can be overridden via ``sphinx-build -D language=zh_CN``. +language = os.environ.get('READTHEDOCS_LANGUAGE', 'en') +locale_dirs = ['locale/'] +gettext_compact = False +gettext_uuid = True + +# -- General configuration + +extensions = [ + 'sphinx.ext.duration', + 'sphinx.ext.doctest', + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', + 'sphinx_copybutton' +] + +intersphinx_mapping = { + 'python': ('https://docs.python.org/3/', None), + 'sphinx': ('https://www.sphinx-doc.org/en/master/', None), +} +intersphinx_disabled_domains = ['std'] + +templates_path = ['_templates'] + +# -- Options for HTML output + +html_theme = 'sphinx_rtd_theme' + +# -- Options for EPUB output +epub_show_urls = 'footnote' diff --git a/docs/source/development.rst b/docs/source/development.rst new file mode 100644 index 0000000..9ece78b --- /dev/null +++ b/docs/source/development.rst @@ -0,0 +1,443 @@ +.. _development: + +Development +============== + +Frequently Asked Questions +-------------------------- + +1. Where to find the list of supported sites? + +The human-readable list of supported sites is available in the `sites.md <https://github.com/soxoj/maigret/blob/main/sites.md>`_ file in the repository. +It's been generated automatically from the main JSON file with the list of supported sites. + +The machine-readable JSON file with the list of supported sites is available in the +`data.json <https://github.com/soxoj/maigret/blob/main/maigret/resources/data.json>`_ file in the directory `resources`. + +2. Which methods to check the account presence are supported? + +The supported methods (``checkType`` values in ``data.json``) are: + +- ``message`` - the most reliable method, checks if any string from ``presenceStrs`` is present and none of the strings from ``absenceStrs`` are present in the HTML response +- ``status_code`` - checks that status code of the response is 2XX +- ``response_url`` - check if there is not redirect and the response is 2XX + +.. note:: + Maigret natively treats specific anti-bot HTTP status codes (like LinkedIn's ``HTTP 999``) as a standard "Not Found/Available" signal instead of throwing an infrastructure Server Error, gracefully preventing false positives. + +See the details of check mechanisms in the `checking.py <https://github.com/soxoj/maigret/blob/main/maigret/checking.py#L339>`_ file. + +.. note:: + Maigret now uses the **Majestic Million** dataset for site popularity sorting instead of the discontinued Alexa Rank API. For backward compatibility with existing configurations and parsers, the ranking field in `data.json` and internal site models remains named ``alexaRank`` and ``alexa_rank``. + +**Mirrors and ``--top-sites``:** When you limit scans with ``--top-sites N``, Maigret also includes *mirror* sites (entries whose ``source`` field points at a parent platform such as Twitter or Instagram) if that parent would appear in the Majestic Million top *N* when disabled sites are considered for ranking. See the **Mirrors** paragraph under ``--top-sites`` in :doc:`command-line-options`. + +Testing +------- + +It is recommended use Python 3.10 for testing. + +Install test requirements: + +.. code-block:: console + + poetry install --with dev + + +Use the following commands to check Maigret: + +.. code-block:: console + + # run linter and typing checks + # order of checks: + # - critical syntax errors or undefined names + # - flake checks + # - mypy checks + make lint + + # run black formatter + make format + + # run testing with coverage html report + # current test coverage is 58% + make test + + # open html report + open htmlcov/index.html + + # get flamechart of imports to estimate startup time + make speed + + +Site naming conventions +----------------------------------------------- + +Site names are the keys in ``data.json`` and appear in user-facing reports. Follow these rules: + +- **Title Case** by default: ``Product Hunt``, ``Hacker News``. +- **Lowercase** only if the brand itself is written that way: ``kofi``, ``note``, ``hi5``. +- **No domain suffix** (``calendly.com`` → ``Calendly``), unless the domain is part of the recognized brand name: ``last.fm``, ``VC.ru``, ``Archive.org``. +- **No full UPPERCASE** unless the brand is an acronym: ``VK``, ``CNET``, ``ICQ``, ``IFTTT``. +- **No** ``www.`` **or** ``https://`` **prefix** in the name. +- **Spaces** are allowed when the brand uses them: ``Star Citizen``, ``Google Maps``. +- **{username} templates** in names are acceptable: ``{username}.tilda.ws``. + +When in doubt, check how the service refers to itself on its homepage. + +How to fix false-positives +----------------------------------------------- + +If you want to work with sites database, don't forget to activate statistics update git hook, command for it would look like this: ``git config --local core.hooksPath .githooks/``. + +You should make your git commits from your maigret git repo folder, or else the hook wouldn't find the statistics update script. + +1. Determine the problematic site. + +If you already know which site has a false-positive and want to fix it specifically, go to the next step. + +Otherwise, simply run a search with a random username (e.g. `laiuhi3h4gi3u4hgt`) and check the results. +Alternatively, you can use the `community Telegram bot <https://sites.google.com/view/maigret-bot-link>`_. + +2. Open the account link in your browser and check: + +- If the site is completely gone, remove it from the list +- If the site still works but looks different, update in data.json how we check it +- If the site requires login to view profiles, disable checking it + +3. Find the site in the `data.json <https://github.com/soxoj/maigret/blob/main/maigret/resources/data.json>`_ file. + +If the ``checkType`` method is not ``message`` and you are going to fix check, update it: +- put ``message`` in ``checkType`` +- put in ``absenceStrs`` a keyword that is present in the HTML response for an non-existing account +- put in ``presenceStrs`` a keyword that is present in the HTML response for an existing account + +If you have trouble determining the right keywords, you can use automatic detection by passing the account URL with the ``--submit`` option: + +.. code-block:: console + + maigret --submit https://my.mail.ru/bk/alex + +To disable checking, set ``disabled`` to ``true`` or simply run: + +.. code-block:: console + + maigret --self-check --site My.Mail.ru@bk.ru + +To debug the check method using the response HTML, you can run: + +.. code-block:: console + + maigret soxoj --site My.Mail.ru@bk.ru -d 2> response.txt + +There are few options for sites data.json helpful in various cases: + +- ``engine`` - a predefined check for the sites of certain type (e.g. forums), see the ``engines`` section in the JSON file +- ``headers`` - a dictionary of additional headers to be sent to the site +- ``requestHeadOnly`` - set to ``true`` if it's enough to make a HEAD request to the site +- ``regexCheck`` - a regex to check if the username is valid, in case of frequent false-positives +- ``requestMethod`` - set the HTTP method to use (e.g., ``POST``). By default, Maigret natively defaults to GET or HEAD. +- ``requestPayload`` - a dictionary with the JSON payload to send for POST requests (e.g., ``{"username": "{username}"}``), extremely useful for parsing GraphQL or modern JSON APIs. +- ``protection`` - a list of protection types detected on the site (see below). + +``protection`` (site protection tracking) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``protection`` field records what kind of anti-bot protection a site uses. Maigret reads this field and automatically applies the appropriate bypass mechanism where one exists. + +Two categories of tag: + +- **Load-bearing.** Maigret changes its HTTP client or headers based on the tag. Currently only ``tls_fingerprint`` (switches to ``curl_cffi`` with Chrome-class TLS). +- **Documentation-only.** Maigret does **not** change behavior based on the tag; it records *why* the site is hard so a future solver can target the right set of sites without re-auditing. + +Within the documentation-only tags, there is a further split that dictates whether the site is ``disabled: true``: + +- ``ip_reputation`` is the **only** doc-tag that **keeps the site enabled**. It means "works for most users, fails from datacenter/cloud IPs." Disabling would silently hide a working site from anyone with a clean IP. The fix is **external** to Maigret (residential IP or ``--proxy``). +- ``cf_js_challenge``, ``cf_firewall``, ``aws_waf_js_challenge``, ``ddos_guard_challenge``, ``custom_bot_protection``, ``js_challenge`` all pair with ``disabled: true``. They mean "does not work for anyone right now"; the tag identifies the provider so that when a bypass ships, every site with that tag can be re-enabled in one pass. + +Supported values: + +- ``tls_fingerprint`` *(load-bearing; site stays enabled)* — the site fingerprints the TLS handshake (JA3/JA4) and blocks non-browser clients. Maigret automatically uses ``curl_cffi`` with Chrome browser emulation to bypass this. Requires the ``curl_cffi`` package (included as a dependency). Examples: Instagram, NPM, Codepen, Kickstarter, Letterboxd. +- ``ip_reputation`` *(documentation-only; site stays enabled)* — the site blocks requests from datacenter/cloud IPs regardless of headers or TLS. Cannot be bypassed automatically; run Maigret from a regular internet connection (not a datacenter) or use a proxy (``--proxy``). The site is **not** marked ``disabled`` because it continues to work for users on residential IPs. Examples: Reddit, Patreon, Figma, OnlyFans. +- ``cf_js_challenge`` *(documentation-only; pair with ``disabled: true``)* — Cloudflare Managed Challenge / Turnstile JS challenge. Symptom: HTTP 403 with ``cf-mitigated: challenge`` header; body contains ``challenges.cloudflare.com``, ``_cf_chl_opt``, ``window._cf_chl``, or "Just a moment". Not bypassable via ``curl_cffi`` TLS impersonation (verified across Chrome 123/124/131, Safari 17/18, Firefox 133/135, Edge 101 — all return the same 403 challenge page); a real browser executing the challenge JS is required to obtain the clearance cookie. Sites stay ``disabled: true`` until a CF-challenge solver is integrated. Examples: DMOJ, Elakiri, Fanlore, Bdoutdoors, TheStudentRoom, forum.hr. +- ``cf_firewall`` *(documentation-only; pair with ``disabled: true``)* — Cloudflare firewall rule / bot score block (WAF action=block, **not** action=challenge). Symptom: HTTP 403 served by Cloudflare (``server: cloudflare``, ``cf-ray`` header) **without** JS-challenge markers — body typically shows "Access denied", "Attention Required", or just a bare 1015/1016/1020 error page. Unlike ``ip_reputation``, residential IPs are **not** sufficient to bypass — Cloudflare decides based on a composite of bot score, TLS fingerprint, UA, ASN, and custom site-owner rules, so ``curl_cffi`` Chrome impersonation from a residential line still returns 403. Sites stay ``disabled: true`` until a per-site bypass (cookies, real browser, or residential+clean session) is found. Examples: Fark, Fodors, Huntingnet, Hunttalk. +- ``aws_waf_js_challenge`` *(documentation-only; pair with ``disabled: true``)* — the site is protected by AWS WAF with a JavaScript challenge. Symptom: HTTP 202 with empty body and ``x-amzn-waf-action: challenge`` header (a token-granting challenge that requires executing the CAPTCHA/challenge JS bundle). Neither ``curl_cffi`` TLS impersonation nor User-Agent changes bypass this — a real browser or the official AWS WAF challenge-solver SDK is required. Sites stay ``disabled: true`` until a solver is integrated. Example: Dreamwidth. +- ``ddos_guard_challenge`` *(documentation-only; pair with ``disabled: true``)* — DDoS-Guard (ddos-guard.net) anti-bot page. Symptom: HTTP 403 with ``server: ddos-guard`` header; body contains "DDoS-Guard". DDoS-Guard fingerprints different UAs per source IP, so a single User-Agent override does not work across environments; a JS-capable bypass or DDoS-Guard-aware solver is required. Sites stay ``disabled: true`` until a solver is integrated. Example: ForumHouse. +- ``js_challenge`` *(documentation-only; pair with ``disabled: true``)* — **fallback** for JavaScript-challenge systems whose provider cannot be identified (custom in-house challenge pages that are not Cloudflare, AWS WAF, or any other recognized vendor). Prefer a provider-specific tag whenever the provider can be pinned down from response headers or body signatures. +- ``custom_bot_protection`` *(documentation-only; pair with ``disabled: true``)* — **fallback** for non-JS-challenge bot protection served by a custom/in-house system (not Cloudflare, not AWS WAF, not DDoS-Guard). Typical symptom: HTTP 403 from the site's own origin server (``server: nginx``, AWS ELB, etc.) with a branded block page, returned regardless of TLS fingerprint or residential IP. Not generically bypassable; investigate per site (cookies, session, proxy geography). Examples: Hackerearth ("HackerEarth Guardian"), FreelanceJob (nginx-level block). + +**Rule: prefer provider-specific protection tags.** When a site is blocked by an identifiable anti-bot vendor, always record the vendor in the tag (``cf_js_challenge``, ``cf_firewall``, ``aws_waf_js_challenge``, ``ddos_guard_challenge``, and future additions such as ``sucuri_challenge``, ``incapsula_challenge``). The generic ``js_challenge`` and ``custom_bot_protection`` tags are reserved for custom/unknown systems. Rationale: bypass solvers are inherently provider-specific (a Cloudflare Turnstile solver does not help with AWS WAF); recording the provider in advance lets us fan out fixes the moment a per-provider solver is added, without re-auditing every disabled site. The same principle applies to other protection categories when the provider is identifiable. + +Example: + +.. code-block:: json + + "Instagram": { + "url": "https://www.instagram.com/{username}/", + "checkType": "message", + "presenseStrs": ["\"routePath\":\"\\/"], + "absenceStrs": ["\"routePath\":null"], + "protection": ["tls_fingerprint"] + } + +``urlProbe`` (optional profile probe URL) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default Maigret performs the HTTP request to the same URL as ``url`` (the public profile link pattern). + +If you set ``urlProbe`` in ``data.json``, Maigret **fetches** that URL for the presence check (API, GraphQL, JSON endpoint, etc.), while **reports and ``url_user``** still use ``url`` — the human-readable profile page users should open. + +Placeholders: ``{username}``, ``{urlMain}``, ``{urlSubpath}`` (same as for ``url``). Example: GitHub uses ``url`` ``https://github.com/{username}`` and ``urlProbe`` ``https://api.github.com/users/{username}``; Picsart uses the web profile ``https://picsart.com/u/{username}`` and probes ``https://api.picsart.com/users/show/{username}.json``. + +.. warning:: + ``url`` must **always** stay a human-openable profile page — it is shown to the + user and printed as the clickable result link. Never put an API / JSON / GraphQL + endpoint in ``url``; that belongs in ``urlProbe``. If the check needs an API + endpoint, keep the browsable profile in ``url`` and add the API URL as + ``urlProbe`` (e.g. Weibo: ``url`` ``https://weibo.com/n/{username}``, ``urlProbe`` + ``https://weibo.com/ajax/profile/info?screen_name={username}``). + +Implementation: ``make_site_result`` in `checking.py <https://github.com/soxoj/maigret/blob/main/maigret/checking.py>`__. + +Site check fixes using LLM +-------------------------- + +.. note:: + The ``LLM/`` directory at the root of the repository contains detailed instructions for editing site checks (in Markdown format): checklist, full guide to ``checkType`` / ``data.json`` / ``urlProbe``, handling false positives, searching for public JSON APIs, and the proposal log for ``socid_extractor``. + +Main files: + +- `site-checks-playbook.md <https://github.com/soxoj/maigret/blob/main/LLM/site-checks-playbook.md>`_ — short checklist +- `site-checks-guide.md <https://github.com/soxoj/maigret/blob/main/LLM/site-checks-guide.md>`_ — detailed guide +- `socid_extractor_improvements.log <https://github.com/soxoj/maigret/blob/main/LLM/socid_extractor_improvements.log>`_ — template and entries for identity extractor improvements + +These files should be kept up-to-date whenever changes are made to the check logic in the code or in ``data.json``. + +.. _activation-mechanism: + +Activation mechanism +-------------------- + +The activation mechanism helps make requests to sites requiring additional authentication like cookies, JWT tokens, or custom headers. + +Let's study the Vimeo site check record from the Maigret database: + +.. code-block:: json + + "Vimeo": { + "tags": [ + "us", + "video" + ], + "headers": { + "Authorization": "jwt eyJ0..." + }, + "activation": { + "url": "https://vimeo.com/_rv/viewer", + "marks": [ + "Something strange occurred. Please get in touch with the app's creator." + ], + "method": "vimeo" + }, + "urlProbe": "https://api.vimeo.com/users/{username}?fields=name...", + "checkType": "status_code", + "alexaRank": 148, + "urlMain": "https://vimeo.com/", + "url": "https://vimeo.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + +The activation method is: + +.. code-block:: python + + def vimeo(site, logger, cookies={}): + headers = dict(site.headers) + if "Authorization" in headers: + del headers["Authorization"] + import requests + + r = requests.get(site.activation["url"], headers=headers) + jwt_token = r.json()["jwt"] + site.headers["Authorization"] = "jwt " + jwt_token + +Here's how the activation process works when a JWT token becomes invalid: + +1. The site check makes an HTTP request to ``urlProbe`` with the invalid token +2. The response contains an error message specified in the ``activation``/``marks`` field +3. When this error is detected, the ``vimeo`` activation function is triggered +4. The activation function obtains a new JWT token and updates it in the site check record +5. On the next site check (either through retry or a new Maigret run), the valid token is used and the check succeeds + +Examples of activation mechanism implementation are available in `activation.py <https://github.com/soxoj/maigret/blob/main/maigret/activation.py>`_ file. + +How to publish new version of Maigret +------------------------------------- + +**Collaborats rights are requires, write Soxoj to get them**. + +For new version publishing you must create a new branch in repository +with a bumped version number and actual changelog first. After it you +must create a release, and GitHub action automatically create a new +PyPi package. + +- New branch example: https://github.com/soxoj/maigret/commit/e520418f6a25d7edacde2d73b41a8ae7c80ddf39 +- Release example: https://github.com/soxoj/maigret/releases/tag/v0.4.1 + +1. Make a new branch locally with a new version name. Check the current version number here: https://pypi.org/project/maigret/. +**Increase only patch version (third number)** if there are no breaking changes. + +.. code-block:: console + + git checkout -b 0.4.0 + +2. Update Maigret version in four files manually. **All four must be in +sync** — the previous bump missed ``docs/source/conf.py`` and +``snapcraft.yaml`` and they fell behind by a release. + +- ``pyproject.toml`` — single line ``version = "X.Y.Z"`` under + ``[tool.poetry]``. +- ``maigret/__version__.py`` — single line ``__version__ = 'X.Y.Z'``. +- ``docs/source/conf.py`` — **two** Sphinx fields. ``release`` is the + full version (``'X.Y.Z'``); ``version`` is the short ``major.minor`` + (``'X.Y'``, **without** the patch number). Update **both**. +- ``snapcraft.yaml`` — single line ``version: X.Y.Z`` (no quotes, no + ``v`` prefix). + +After editing, sanity-check with ``grep -rE '0\.5\.|0\.6\.|<old>'`` to +catch any straggler reference. + +3. Create a new empty text section in the beginning of the file `CHANGELOG.md` with a current date: + +.. code-block:: console + + ## [0.4.0] - 2022-01-03 + +4. Get auto-generate release notes: + +- Open https://github.com/soxoj/maigret/releases/new +- Click `Choose a tag`, enter `v0.4.0` (your version) +- Click `Create new tag` +- Press `+ Auto-generate release notes` +- Copy all the text from description text field below +- Paste it to empty text section in `CHANGELOG.txt` +- Remove redundant lines `## What's Changed` and `## New Contributors` section if it exists +- *Close the new release page* + +5. Commit all the changes, push, make pull request + +.. code-block:: console + + git add -p + git commit -m 'Bump to YOUR VERSION' + git push origin head + + +6. Merge pull request + +7. Create new release + +- Open https://github.com/soxoj/maigret/releases/new again +- Click `Choose a tag` +- Enter actual version in format `v0.4.0` +- Also enter actual version in the field `Release title` +- Click `Create new tag` +- Press `+ Auto-generate release notes` +- **Press "Publish release" button** + +8. That's all, now you can simply wait push to PyPi. You can monitor it in Action page: https://github.com/soxoj/maigret/actions/workflows/python-publish.yml + +Documentation updates +--------------------- + +Documentations is auto-generated and auto-deployed from the ``docs`` directory. + +To manually update documentation: + +1. Change something in the ``.rst`` files in the ``docs/source`` directory. +2. Install ``python -m pip install -e .`` in the docs directory. +3. Run ``make singlehtml`` in the terminal in the docs directory. +4. Open ``build/singlehtml/index.html`` in your browser to see the result. +5. If you edited any English ``.rst`` text (not just code blocks), refresh the + per-language translation catalogs — see *Translations* below. Skipping this + step lets the non-English builds silently fall back to English on the + changed strings. +6. If everything is ok, commit and push your changes to GitHub. + +Translations +------------ + +The docs are translated via Sphinx's standard gettext workflow. English ``.rst`` files +are the source of truth; translations live as ``.po`` catalogs under +``docs/source/locale/<lang>/LC_MESSAGES/`` (currently only ``zh_CN``). + +After editing any English ``.rst`` file, refresh the catalogs so existing +translations stay aligned with the new strings: + +.. code-block:: bash + + cd docs + make intl-update LANG=zh_CN + +This regenerates the ``.pot`` files via ``sphinx-build -b gettext`` and runs +``sphinx-intl update`` to merge them into the per-language ``.po`` files. New +English strings appear with an empty ``msgstr ""``; changed strings get a +``#, fuzzy`` marker that translators should review and re-translate. + +Preview a translated build locally: + +.. code-block:: bash + + make html-zh_CN + open build/html_zh_CN/index.html + +CJK escape-spaces gotcha +^^^^^^^^^^^^^^^^^^^^^^^^ + +reStructuredText inline markup (bold, inline code, hyperlinks) requires +whitespace or punctuation on both sides to close. In English this is free: a +space or full stop always follows. In Chinese / Japanese / Korean translations +the next character is often a CJK letter with no separator, and docutils then +emits warnings like:: + + <translated>:1: WARNING: Inline strong start-string without end-string. + <translated>:1: WARNING: Inline interpreted text or phrase reference start-string without end-string. + +The fix is an explicit RST escape-space — a backslash followed by a space — +between the closing marker and the next CJK character. In the rendered ``.rst`` +this is written as ``\<space>``; inside a ``.po`` ``msgstr`` it must be +written as ``\\<space>`` because the ``.po`` parser eats one backslash level. + +.. code-block:: po + + # WRONG — warning, markup leaks past the bold + msgstr "让**所有**检查请求通过指定代理" + + # RIGHT — regular space breaks markup cleanly + msgstr "让 **所有** 检查请求通过指定代理" + + # RIGHT — escape-space when no visual space is wanted + msgstr "让\\ **所有**\\ 检查请求通过指定代理" + +The same rule applies after inline code before a CJK character, and after a +hyperlink before a CJK opening bracket — always insert ``\\<space>``. After +editing any ``.po`` file, run ``make html-zh_CN``; these warnings only surface +at build time. + +To add a new language, run ``make intl-update LANG=<code>`` (e.g. ``ja``, +``de``, ``pt_BR``) — this scaffolds an empty catalog. Read the Docs publishes +each language as a separate project linked under the parent (see the +`Localization guide <https://docs.readthedocs.com/platform/stable/localization.html>`_); +a maintainer needs to create the translation project once in the RTD admin UI, +set its language, and mark it as a translation of the main ``maigret`` project +to enable the language switcher. + +Roadmap +------- + +.. warning:: + This roadmap requires updating to reflect the current project status and future plans. + +.. figure:: https://i.imgur.com/kk8cFdR.png + :target: https://i.imgur.com/kk8cFdR.png + :align: center diff --git a/docs/source/faq.rst b/docs/source/faq.rst new file mode 100644 index 0000000..87ea1d6 --- /dev/null +++ b/docs/source/faq.rst @@ -0,0 +1,175 @@ +.. _faq: + +FAQ +=== + +Short answers to the questions users most often type into the docs +search. For deeper coverage each section links to the relevant page. + +Can I search by email address? +------------------------------ + +**No.** Maigret only takes a username (or one of the +:doc:`supported identifier types <supported-identifier-types>`) as +input — searching by an email or mail address is out of scope. +Looking up a mail address requires different techniques (probing +password-reset flows, registration endpoints) and is the job of a +separate class of tool. + +Recommended open-source tools for email lookup: + +- `mailcat <https://github.com/sharsil/mailcat>`_ +- `holehe <https://github.com/megadose/holehe>`_ +- `user-scanner <https://github.com/kaifcodec/user-scanner>`_ + +Online services: + +- `Noimosiny <https://noimosiny.com>`_ +- `OSINT Industries <https://osint.industries>`_ +- `Epieos <https://epieos.com>`_ + +Note: if Maigret has already found an account for a username, it often +extracts the linked email from the profile page automatically — see +:ref:`extracting-information-from-pages`. + +Can I configure a proxy / SOCKS / Tor / I2P? +-------------------------------------------- + +**Yes.** Three flags cover three distinct goals: + +- ``--proxy URL`` — route **every** check through the given HTTP or + SOCKS proxy (also the right flag for routing the whole run through Tor + with ``socks5://127.0.0.1:9050``, a residential proxy, or a corporate + gateway). +- ``--tor-proxy URL`` — used **only** for ``.onion`` sites in the + database. Clearweb sites still go via your direct connection (or + ``--proxy`` if set). +- ``--i2p-proxy URL`` — same idea, only for ``.i2p`` hosts. + +The most common confusion is ``--proxy`` vs ``--tor-proxy``: ``--proxy`` +is "everything through this gateway", ``--tor-proxy`` is "only onion +sites through Tor". + +Full walkthrough (Tor Browser vs system ``tor`` port numbers, Tails OS, +timeout / retry tuning): :doc:`tor-and-proxies`. + +If your goal is actually "bypass WAF blocks / fix 403 errors", see the +*Sites fail / timeout / 403* section below — a residential proxy almost +always outperforms Tor or a VPN for that. + +Can I use a VPN with Maigret? +----------------------------- + +**Yes**, but ``--proxy`` is usually a better choice. A VPN works +transparently at the OS level — Maigret needs no special configuration +to use one. However: + +- ``--proxy`` is per-process: it does not affect other apps and does not + leak when toggled. +- ``--proxy`` makes the egress IP visible in logs, which is useful when + diagnosing why a batch of sites returned ``UNKNOWN``. +- ``--proxy`` accepts a different value per run, so you can rotate + between residential and datacenter exits without touching system + network settings. + +If a lot of sites are returning 403, the cause is almost certainly that +the VPN exit IP is on a WAF blocklist (Cloudflare, DDoS-Guard, Akamai +all blanket-block common VPN ranges). A residential proxy via +``--proxy`` is the usual fix — see the +`"Lots of sites fail / timeout / return 403" section +<https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md#lots-of-sites-fail--timeout--return-403>`_ +in TROUBLESHOOTING.md. + +Does Maigret check domains via DNS? +----------------------------------- + +**Yes, experimentally.** With ``--with-domains`` Maigret resolves a +small set of ``{username}.<tld>`` patterns through DNS (A-records) in +parallel with the normal HTTP checks. The current set is +``.ddns.net``, ``.com``, ``.pro``, ``.me``, ``.biz``, ``.email``, +``.guru`` — 7 entries in the database with ``protocol: dns``. + +.. code-block:: console + + maigret <username> --with-domains + +The flag is marked **experimental**: DNS-only checks can flag parking +domains and catch-all wildcards as if the username were registered, so +treat hits as a lead rather than confirmation. + +If your task is wider DNS reconnaissance — subdomain enumeration, WHOIS +history, typo-squatting — Maigret is the wrong tool. Established +alternatives: + +- `dnstwist <https://github.com/elceef/dnstwist>`_ — typo-squatting and + look-alike domains. +- `amass <https://github.com/owasp-amass/amass>`_ / + `subfinder <https://github.com/projectdiscovery/subfinder>`_ — + subdomain enumeration. +- `theHarvester <https://github.com/laramies/theHarvester>`_ — + email / host / subdomain harvesting by domain. + +Is there a Maigret Telegram bot? +-------------------------------- + +**Yes.** A community-maintained bot lets you run Maigret without +installing anything locally: + +- Working instance: `sites.google.com/view/maigret-bot-link + <https://sites.google.com/view/maigret-bot-link>`_ (redirect — the + hosted bot may move between providers). +- Source code: `github.com/soxoj/maigret-tg-bot + <https://github.com/soxoj/maigret-tg-bot>`_. + +On the question of *searching Telegram itself*: Maigret checks whether a +``t.me/<user>`` page exists as part of the normal run, but it does not +parse channels, posts, members, or message contents. For Telegram +content OSINT you need a dedicated tool. + +Where is the web interface? +--------------------------- + +.. code-block:: console + + maigret --web 5000 + +Then open http://127.0.0.1:5000. Screenshots and a full walkthrough are +in :ref:`web-interface`. + +Sites fail / timeout / return 403 — connection failures +------------------------------------------------------- + +This is the most common report and is almost always caused by anti-bot +protection (Cloudflare, DDoS-Guard, Akamai) or a slow link, not by a +bug in Maigret. Quick tweaks, in order: + +1. ``--timeout 60`` — the default 30 s is tight for slow networks and + for Tor. +2. ``--retries 2`` — covers transient failures. +3. ``-n 20`` — lower concurrency reduces WAF rate-limiting. +4. ``--proxy http://user:pass@residential-proxy:port`` — datacenter IPs + (AWS, GCP, DigitalOcean) and most VPN ranges are blanket-blocked; + residential / mobile exits usually fix the bulk of 403s. + +The full troubleshooting matrix (per-error recipes for 403, timeout, +SSL, captcha, ``UNKNOWN`` floods) lives in +`TROUBLESHOOTING.md +<https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md>`_. + +How do I generate a PDF report? +------------------------------- + +PDF support is an optional extra because it pulls heavy graphics +dependencies: + +.. code-block:: console + + pip install 'maigret[pdf]' + maigret <username> --pdf + +On Linux / macOS you also need system libraries (Pango, Cairo, +GDK-PixBuf). Per-OS install steps are in the +*Optional: PDF reports* section of :doc:`installation`. + +For other report formats (``--html``, ``--md``, ``--json``, ``--csv``, +``--txt``, ``--xmind``), see :doc:`command-line-options`. diff --git a/docs/source/features.rst b/docs/source/features.rst new file mode 100644 index 0000000..329d913 --- /dev/null +++ b/docs/source/features.rst @@ -0,0 +1,377 @@ +.. _features: + +Features +======== + +This is the list of Maigret features. + +.. _web-interface: + +Web Interface +------------- + +You can run Maigret with a web interface, where you can view the graph with results and download reports of all formats on a single page. + + +.. image:: https://raw.githubusercontent.com/soxoj/maigret/main/static/web_interface_screenshot_start.png + :alt: Web interface: how to start + + +.. image:: https://raw.githubusercontent.com/soxoj/maigret/main/static/web_interface_screenshot.png + :alt: Web interface: results + + +Instructions: + +1. Run Maigret with the ``--web`` flag and specify the port number. + +.. code-block:: console + + maigret --web 5000 + +2. Open http://127.0.0.1:5000 in your browser and enter one or more usernames to make a search. + +3. Wait a bit for the search to complete and view the graph with results, the table with all accounts found, and download reports of all formats. + +.. _telegram-bot: + +Telegram bot +------------ + +A community-maintained Telegram bot lets you run Maigret without +installing anything locally. + +- Working instance: `sites.google.com/view/maigret-bot-link + <https://sites.google.com/view/maigret-bot-link>`_ (redirect — the + hosted bot may move between providers). +- Source code: `github.com/soxoj/maigret-tg-bot + <https://github.com/soxoj/maigret-tg-bot>`_. + +Personal info gathering +----------------------- + +Maigret does the `parsing of accounts webpages and extraction <https://github.com/soxoj/socid-extractor>`_ of personal info, links to other profiles, etc. +Extracted info displayed as an additional result in CLI output and as tables in HTML and PDF reports. +Also, Maigret use found ids and usernames from links to start a recursive search. + +Enabled by default, can be disabled with ``--no extracting``. + +.. code-block:: text + + $ python3 -m maigret soxoj --timeout 5 + [-] Starting a search on top 500 sites from the Maigret database... + [!] You can run search by full list of sites with flag `-a` + [*] Checking username soxoj on: + ... + [+] GitHub: https://github.com/soxoj + ├─uid: 31013580 + ├─image: https://avatars.githubusercontent.com/u/31013580?v=4 + ├─created_at: 2017-08-14T17:03:07Z + ├─location: Amsterdam, Netherlands + ├─follower_count: 1304 + ├─following_count: 54 + ├─fullname: Soxoj + ├─public_gists_count: 3 + ├─public_repos_count: 88 + ├─twitter_username: sox0j + ├─bio: Head of OSINT Center of Excellence in @SocialLinks-IO + ├─is_company: Social Links + └─blog_url: soxoj.com + ... + +Recursive search +---------------- + +Maigret has the ability to scan account pages for :ref:`common identifiers <supported-identifier-types>` and usernames found in links. +When people include links to their other social media accounts, Maigret can automatically detect and initiate new searches for those profiles. +Any information discovered through this process will be shown in both the command-line interface output and generated reports. + +Enabled by default, can be disabled with ``--no-recursion``. + + +.. code-block:: text + + $ python3 -m maigret soxoj --timeout 5 + [-] Starting a search on top 500 sites from the Maigret database... + [!] You can run search by full list of sites with flag `-a` + [*] Checking username soxoj on: + ... + [+] GitHub: https://github.com/soxoj + ├─uid: 31013580 + ├─image: https://avatars.githubusercontent.com/u/31013580?v=4 + ├─created_at: 2017-08-14T17:03:07Z + ├─location: Amsterdam, Netherlands + ├─follower_count: 1304 + ├─following_count: 54 + ├─fullname: Soxoj + ├─public_gists_count: 3 + ├─public_repos_count: 88 + ├─twitter_username: sox0j <===== another username found here + ├─bio: Head of OSINT Center of Excellence in @SocialLinks-IO + ├─is_company: Social Links + └─blog_url: soxoj.com + ... + Searching |████████████████████████████████████████| 500/500 [100%] in 9.1s (54.85/s) + [-] You can see detailed site check errors with a flag `--print-errors` + [*] Checking username sox0j on: + [+] Telegram: https://t.me/sox0j + ├─fullname: @Sox0j + ... + +Username permutations +--------------------- + +Maigret can generate permutations of usernames. Just pass a few usernames in the CLI and use ``--permute`` flag. +Thanks to `@balestek <https://github.com/balestek>`_ for the idea and implementation. + +.. code-block:: text + + $ python3 -m maigret --permute hope dream --timeout 5 + [-] 12 permutations from hope dream to check... + ├─ hopedream + ├─ _hopedream + ├─ hopedream_ + ├─ hope_dream + ├─ hope-dream + ├─ hope.dream + ├─ dreamhope + ├─ _dreamhope + ├─ dreamhope_ + ├─ dream_hope + ├─ dream-hope + └─ dream.hope + [-] Starting a search on top 500 sites from the Maigret database... + [!] You can run search by full list of sites with flag `-a` + [*] Checking username hopedream on: + ... + +Reports +------- + +Maigret currently supports HTML, PDF, TXT, CSV, XMind 8 mindmap, JSON, and +Markdown reports, plus graph exports: an interactive HTML graph (``--graph``) +and a Neo4j Cypher script (``--neo4j``) for loading the results into a graph +database. + +HTML/PDF reports contain: + +- profile photo +- all the gathered personal info +- additional information about supposed personal data (full name, gender, location), resulting from statistics of all found accounts + +Also, there is a short text report in the CLI output after the end of a searching phase. + +The ``--neo4j`` flag serialises the same graph that ``--graph`` builds into an +idempotent ``.cypher`` script, importable with ``cypher-shell`` or the Neo4j +Browser. See :ref:`neo4j-export` for the schema and import instructions. + +.. warning:: + XMind 8 mindmaps are incompatible with XMind 2022! + +AI analysis +----------- + +Maigret can produce a short, human-readable investigation summary on top +of the raw search results using the ``--ai`` flag. It builds the +internal Markdown report, sends it to an OpenAI-compatible chat +completion endpoint, and streams the model's reply directly to the +terminal. + +.. code-block:: console + + export OPENAI_API_KEY=sk-... + maigret username --ai + +The summary uses a fixed format with the most likely real name, +location, occupation, interests, languages, main website, username +variants, number of platforms, active years, a confidence rating, and a +short list of follow-up leads. While ``--ai`` is active, per-site +progress and the short text report are suppressed so the streamed +summary is the main output. + +The endpoint, model, and API key are configured via ``settings.json`` +(``openai_api_key``, ``openai_model``, ``openai_api_base_url``) or the +``OPENAI_API_KEY`` environment variable. Any OpenAI-compatible API can +be used (Azure OpenAI, OpenRouter, a local server, …). See +:ref:`ai-analysis` and :ref:`settings` for details. + +Tags +---- + +The Maigret sites database very big (and will be bigger), and it is maybe an overhead to run a search for all the sites. +Also, it is often hard to understand, what sites more interesting for us in the case of a certain person. + +Tags markup allows selecting a subset of sites by interests (photo, messaging, finance, etc.) or by country. Tags of found accounts grouped and displayed in the reports. + +See full description :doc:`in the Tags Wiki page <tags>`. + +Censorship and captcha detection +-------------------------------- + +Maigret can detect common errors such as censorship stub pages, CloudFlare captcha pages, and others. +If you get more them 3% errors of a certain type in a session, you've got a warning message in the CLI output with recommendations to improve performance and avoid problems. + +Retries +------- + +Maigret will do retries of the requests with temporary errors got (connection failures, proxy errors, etc.). + +One attempt by default, can be changed with option ``--retries N``. + +Database self-check +------------------- + +Maigret includes a self-check mode (``--self-check``) that validates every site +in the database by looking up its known-claimed and known-unclaimed usernames +and verifying that the detection results match expectations. + +The self-check is **error-resilient**: if an individual site check raises an +unexpected exception (e.g. a network error or a parsing failure), the error is +caught, logged, and recorded as an issue — the remaining sites continue to be +checked without interruption. This means the process always runs to completion, +even when checking hundreds of sites with ``-a --self-check``. + +Use ``--auto-disable`` together with ``--self-check`` to automatically disable +sites that fail checks. Without it, issues are only reported. Use ``--diagnose`` +to print detailed per-site diagnosis including the check type, specific issues, +and recommendations. + +.. code-block:: console + + # Report-only mode (no changes to the database) + maigret --self-check + + # Automatically disable failing sites and save updates + maigret -a --self-check --auto-disable + + # Show detailed diagnosis for each failing site + maigret -a --self-check --diagnose + +Archives and mirrors checking +----------------------------- + +The Maigret database contains not only the original websites, but also mirrors, archives, and aggregators. For example: + +- `Picuki <https://www.picuki.com/>`_, Instagram mirror +- (no longer available) `Reddit BigData search <https://camas.github.io/reddit-search/>`_ +- (no longer available) `Twitter shadowban <https://shadowban.eu/>`_ checker + +It allows getting additional info about the person and checking the existence of the account even if the main site is unavailable (bot protection, captcha, etc.) + +.. _cloudflare-bypass: + +Cloudflare webgate bypass +------------------------- + +.. warning:: + + **Experimental feature.** The Cloudflare webgate is under active + development. The configuration schema, CLI flag behaviour, and the set + of sites that route through it may change without backwards-compatibility + guarantees. Expect rough edges (CF rate limits, occasional solver + failures) and report issues so they can be ironed out. + +Some sites sit behind a full Cloudflare JavaScript challenge or a CF firewall +hard block — these are tagged ``protection: ["cf_js_challenge"]`` or +``protection: ["cf_firewall"]`` in the database and are normally kept disabled +because neither aiohttp nor curl_cffi can solve the JS challenge on their own. + +Maigret can offload these checks to a local Chrome-based solver. Two backends +are supported, configured in ``settings.json`` under +``cloudflare_bypass.modules`` (the first reachable module wins; subsequent +ones are tried as a fallback chain): + +* **FlareSolverr** (recommended). Runs a real Chrome instance and exposes a + JSON API. The upstream HTTP status, headers and final URL are preserved, so + ``checkType: status_code`` and ``checkType: response_url`` keep working + through the bypass. + + .. code-block:: console + + docker run -d -p 8191:8191 --name flaresolverr ghcr.io/flaresolverr/flaresolverr:latest + +* **CloudflareBypassForScraping** (legacy fallback). Returns rendered HTML + only, so the upstream status code is lost — ``checkType: message`` keeps + working but ``status_code`` checks misfire (treated as 200 on success). + +Activate the bypass either with the CLI flag:: + + maigret --cloudflare-bypass <username> + +or by setting ``cloudflare_bypass.enabled`` to ``true`` in ``settings.json``. +The web UI (``python -m maigret.web.app``) reads the same setting — there is +no separate toggle in the form, so flipping ``enabled`` is what activates +the bypass for browser-driven runs. + +The bypass only fires for sites whose ``protection`` field intersects +``cloudflare_bypass.trigger_protection`` (default +``["cf_js_challenge", "cf_firewall", "webgate"]``); all other sites use the +normal aiohttp / curl_cffi path. + +If all configured modules are unreachable, affected sites get an UNKNOWN +status with an actionable error pointing at the first module's URL — the +fix is almost always to start the FlareSolverr container. + +FlareSolverr session reuse is automatic: Maigret pins a single +``session: <session_prefix>-<pid>`` per run, so cf_clearance cookies are +shared between checks of the same domain (5–10× faster on subsequent +requests to that host). + +Activation +---------- +The activation mechanism helps make requests to sites requiring additional authentication like cookies, JWT tokens, or custom headers. + +It works by implementing a custom function that: + +1. Makes a specialized HTTP request to a specific website endpoint +2. Processes the response +3. Updates the headers/cookies for that site in the local Maigret database + +Since activation only triggers after encountering specific errors, a retry (or another Maigret run) is needed to obtain a valid response with the updated authentication. + +The activation mechanism is enabled by default, and cannot be disabled at the moment. + +See for more details in Development section :ref:`activation-mechanism`. + +.. _extracting-information-from-pages: + +Extraction of information from account pages +-------------------------------------------- + +Maigret can parse URLs and content of web pages by URLs to extract info about account owner and other meta information. + +You must specify the URL with the option ``--parse``, it's can be a link to an account or an online document. List of supported sites `see here <https://github.com/soxoj/socid-extractor#sites>`_. + +After the end of the parsing phase, Maigret will start the search phase by :doc:`supported identifiers <supported-identifier-types>` found (usernames, ids, etc.). + +.. code-block:: console + + $ maigret --parse https://docs.google.com/spreadsheets/d/1HtZKMLRXNsZ0HjtBmo0Gi03nUPiJIA4CC4jTYbCAnXw/edit\#gid\=0 + + Scanning webpage by URL https://docs.google.com/spreadsheets/d/1HtZKMLRXNsZ0HjtBmo0Gi03nUPiJIA4CC4jTYbCAnXw/edit#gid=0... + ┣╸org_name: Gooten + ┗╸mime_type: application/vnd.google-apps.ritz + Scanning webpage by URL https://clients6.google.com/drive/v2beta/files/1HtZKMLRXNsZ0HjtBmo0Gi03nUPiJIA4CC4jTYbCAnXw?fields=alternateLink%2CcopyRequiresWriterPermission%2CcreatedDate%2Cdescription%2CdriveId%2CfileSize%2CiconLink%2Cid%2Clabels(starred%2C%20trashed)%2ClastViewedByMeDate%2CmodifiedDate%2Cshared%2CteamDriveId%2CuserPermission(id%2Cname%2CemailAddress%2Cdomain%2Crole%2CadditionalRoles%2CphotoLink%2Ctype%2CwithLink)%2Cpermissions(id%2Cname%2CemailAddress%2Cdomain%2Crole%2CadditionalRoles%2CphotoLink%2Ctype%2CwithLink)%2Cparents(id)%2Ccapabilities(canMoveItemWithinDrive%2CcanMoveItemOutOfDrive%2CcanMoveItemOutOfTeamDrive%2CcanAddChildren%2CcanEdit%2CcanDownload%2CcanComment%2CcanMoveChildrenWithinDrive%2CcanRename%2CcanRemoveChildren%2CcanMoveItemIntoTeamDrive)%2Ckind&supportsTeamDrives=true&enforceSingleParent=true&key=AIzaSyC1eQ1xj69IdTMeii5r7brs3R90eck-m7k... + ┣╸created_at: 2016-02-16T18:51:52.021Z + ┣╸updated_at: 2019-10-23T17:15:47.157Z + ┣╸gaia_id: 15696155517366416778 + ┣╸fullname: Nadia Burgess + ┣╸email: nadia@gooten.com + ┣╸image: https://lh3.googleusercontent.com/a-/AOh14GheZe1CyNa3NeJInWAl70qkip4oJ7qLsD8vDy6X=s64 + ┗╸email_username: nadia + +.. code-block:: console + + $ maigret.py --parse https://steamcommunity.com/profiles/76561199113454789 + Scanning webpage by URL https://steamcommunity.com/profiles/76561199113454789... + ┣╸steam_id: 76561199113454789 + ┣╸nickname: Pok + ┗╸username: Machine42 + + +Simple API +---------- + +Maigret can be easily integrated with the use of Python package `maigret <https://pypi.org/project/maigret/>`_. + +Example: the community `Telegram bot <https://github.com/soxoj/maigret-tg-bot>`_ diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..5d5fb7c --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,64 @@ +.. _index: + +Welcome to the Maigret docs! +============================ + +**Maigret** is an easy-to-use and powerful OSINT tool for collecting a dossier on a person by a username (alias) only. + +This is achieved by checking for accounts on a huge number of sites and gathering all the available information from web pages. + +The project's main goal — give to OSINT researchers and pentesters a **universal tool** to get maximum information +about a person of interest by a username and integrate it with other tools in automatization pipelines. + +.. warning:: + **This tool is intended for educational and lawful purposes only.** + The developers do not endorse or encourage any illegal activities or misuse of this tool. + Regulations regarding the collection and use of personal data vary by country and region, + including but not limited to GDPR in the EU, CCPA in the USA, and similar laws worldwide. + + It is your sole responsibility to ensure that your use of this tool complies with all applicable laws + and regulations in your jurisdiction. Any illegal use of this tool is strictly prohibited, + and you are fully accountable for your actions. + + The authors and developers of this tool bear no responsibility for any misuse + or unlawful activities conducted by its users. + +You may be interested in: +------------------------- +- :doc:`Quick start <quick-start>` +- :doc:`Usage examples <usage-examples>` +- :doc:`FAQ <faq>` +- :doc:`Command line options <command-line-options>` +- :doc:`Features list <features>` +- :doc:`Library usage <library-usage>` +- :doc:`Tor, I2P, and proxies <tor-and-proxies>` + +.. toctree:: + :hidden: + :caption: Sections + + quick-start + installation + usage-examples + faq + command-line-options + features + philosophy + supported-identifier-types + tags + development + +.. toctree:: + :hidden: + :caption: Advanced usage + + library-usage + settings + tor-and-proxies + +.. toctree:: + :hidden: + :caption: Use cases + + use-cases/crypto + use-cases/scientists diff --git a/docs/source/installation.rst b/docs/source/installation.rst new file mode 100644 index 0000000..1fd73a4 --- /dev/null +++ b/docs/source/installation.rst @@ -0,0 +1,327 @@ +.. _installation: + +Installation +============ + +Maigret can be installed using pip, Docker, or simply can be launched from the cloned repo. +Also, it is available online via the `community Telegram bot <https://sites.google.com/view/maigret-bot-link>`_, +source code of a bot is `available on GitHub <https://github.com/soxoj/maigret-tg-bot>`_. + +Windows Standalone EXE-binaries +------------------------------- + +A standalone ``maigret_standalone.exe`` for Windows is published in the +`Releases section <https://github.com/soxoj/maigret/releases>`_ of the GitHub +repository. A fresh build is produced automatically after each commit to the +**main** and **dev** branches. + +There are two ways to launch the EXE: + +* **Double-click it from Explorer.** Maigret will prompt you for a username, + run a default search, and pause at the end so the printed report links + remain on screen until you press Enter. +* **Run it from a terminal** for full control over options: + + 1. Press ``Win+R``, type ``cmd``, and hit Enter (or use PowerShell). + 2. Change to the folder where you saved the file, e.g. + ``cd %USERPROFILE%\Downloads``. + 3. Run it with at least one username: + + .. code-block:: bat + + maigret_standalone.exe USERNAME + maigret_standalone.exe USERNAME --html :: also save an HTML report + maigret_standalone.exe USERNAME --pdf :: also save a PDF report + maigret_standalone.exe --help :: list all options + +Reports are written next to the EXE in a ``reports\`` subfolder. + +Video guide on how to run it: https://youtu.be/qIgwTZOmMmM. + + +Cloud Shells and Jupyter notebooks +---------------------------------- + +In case you don't want to install Maigret locally, you can use cloud shells and Jupyter notebooks. +Press one of the buttons below and follow the instructions to launch it in your browser. + +.. only:: html + + .. image:: https://user-images.githubusercontent.com/27065646/92304704-8d146d80-ef80-11ea-8c29-0deaabb1c702.png + :target: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=README.md + :alt: Open in Cloud Shell + + .. image:: https://replit.com/badge/github/soxoj/maigret + :target: https://repl.it/github/soxoj/maigret + :alt: Run on Replit + :height: 50 + + .. image:: https://colab.research.google.com/assets/colab-badge.svg + :target: https://colab.research.google.com/gist/soxoj/879b51bc3b2f8b695abb054090645000/maigret-collab.ipynb + :alt: Open In Colab + :height: 45 + + .. image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gist/soxoj/9d65c2f4d3bec5dd25949197ea73cf3a/HEAD + :alt: Open In Binder + :height: 45 + +.. only:: latex + + Cloud Shell: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=README.md + + Replit: https://repl.it/github/soxoj/maigret + + Google Colab: https://colab.research.google.com/gist/soxoj/879b51bc3b2f8b695abb054090645000/maigret-collab.ipynb + + Binder: https://mybinder.org/v2/gist/soxoj/9d65c2f4d3bec5dd25949197ea73cf3a/HEAD + +Local installation from PyPi +---------------------------- + +Maigret ships with a bundled site database. After installation from PyPI (or any other method), it can **automatically fetch a newer compatible database from GitHub** when you run it—see :ref:`database-auto-update` in :doc:`settings`. + +.. note:: + Python 3.10 or higher and pip is required, **Python 3.11 is recommended.** + +.. code-block:: bash + + # install from pypi + pip3 install maigret + + # usage + maigret username + +PDF report support is shipped as an **optional extra** because it relies on +system-level graphics libraries that pip cannot install for you. If you plan to +use ``--pdf``, install Maigret with the ``pdf`` extra: + +.. code-block:: bash + + pip3 install 'maigret[pdf]' + +See :ref:`pdf-extra` below for the full background on why PDF support is +optional and how to fix the most common build errors. + +Development version (GitHub) +---------------------------- + +.. code-block:: bash + + git clone https://github.com/soxoj/maigret && cd maigret + pip3 install . + + # OR + pip3 install git+https://github.com/soxoj/maigret.git + + # usage + maigret username + + # OR use poetry in case you plan to develop Maigret + pip3 install poetry + poetry run maigret + +Docker +------ + +.. code-block:: bash + + # official image of the development version, updated from the github repo + docker pull soxoj/maigret + + # usage + docker run -v /mydir:/app/reports soxoj/maigret:latest username --html + + # manual build + docker build -t maigret . + +Troubleshooting +--------------- + +If you encounter build errors during installation such as ``cannot find ft2build.h`` +or errors related to ``reportlab`` / ``_renderPM``, you need to install system-level +dependencies required to compile native extensions. + +**Debian/Ubuntu/Kali:** + +.. code-block:: bash + + sudo apt install -y libfreetype6-dev libjpeg-dev libffi-dev + +**Fedora/RHEL/CentOS:** + +.. code-block:: bash + + sudo dnf install -y freetype-devel libjpeg-devel libffi-devel + +**Arch Linux:** + +.. code-block:: bash + + sudo pacman -S freetype2 libjpeg-turbo libffi + +**macOS (Homebrew):** + +.. code-block:: bash + + brew install freetype + +After installing the system dependencies, retry the maigret installation. + +If you continue to have issues, consider using Docker instead, which includes all +necessary dependencies. + +.. _pdf-extra: + +Optional: PDF reports (``maigret[pdf]``) +---------------------------------------- + +The ``--pdf`` report format is shipped as an optional extra. To enable it: + +.. code-block:: bash + + pip3 install 'maigret[pdf]' + +If PDF support is not installed and you pass ``--pdf``, Maigret prints a +warning and continues without crashing — every other output format +(``--html``, ``--json``, ``--csv``, ``--txt``, ``--xmind``, ``--graph``) +keeps working. + +Why is PDF optional? +~~~~~~~~~~~~~~~~~~~~ + +Maigret renders PDFs by converting an HTML template, and that conversion +pipeline ultimately depends on the ``cairo`` graphics library through a +chain of Python packages roughly shaped like:: + + maigret[pdf] → xhtml2pdf → svglib → rlPyCairo → pycairo → libcairo2 (system) + +The bottom of that chain is a C library — ``libcairo2`` — that has to exist +on the host *before* pip can build the Python bindings. The Python binding +package (``pycairo``) currently ships **only Windows wheels** on PyPI; on +Linux and macOS pip falls back to building from source, and the build fails +the moment ``pkg-config`` cannot find ``cairo``. The error looks like:: + + ../cairo/meson.build:31:12: ERROR: Dependency "cairo" not found (tried pkg-config) + note: This error originates from a subprocess, and is likely not a problem with pip. + error: metadata-generation-failed + +Pulling this whole chain for every Maigret install just so the much smaller +group of users who actually want PDFs can have them is a poor trade — so +``xhtml2pdf`` is gated behind the ``pdf`` extra. + +Two more packages — ``arabic-reshaper`` and ``python-bidi`` — are bundled +into the same extra. Maigret core never imports them; they are only used +by ``xhtml2pdf`` to shape Arabic glyphs and lay out right-to-left text in +PDFs. ``python-bidi`` v0.5+ is also a Rust binding, so on niche platforms +without a published wheel it would otherwise pull in a Cargo build for +users who never asked for PDF support. + +Installing the system prerequisites +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Install the cairo headers, ``pkg-config``, and a working C toolchain +*before* running ``pip install 'maigret[pdf]'``. + +**Debian / Ubuntu / Linux Mint / Kali:** + +.. code-block:: bash + + sudo apt update + sudo apt install -y libcairo2-dev pkg-config python3-dev build-essential + pip3 install --upgrade pip setuptools wheel + pip3 install 'maigret[pdf]' + +**Fedora / RHEL / CentOS:** + +.. code-block:: bash + + sudo dnf install -y cairo-devel pkgconfig python3-devel gcc + pip3 install 'maigret[pdf]' + +**Arch Linux:** + +.. code-block:: bash + + sudo pacman -S cairo pkgconf base-devel + pip3 install 'maigret[pdf]' + +**Alpine Linux:** + +.. code-block:: bash + + sudo apk add cairo-dev pkgconf python3-dev build-base + pip3 install 'maigret[pdf]' + +**macOS (Homebrew):** + +.. code-block:: bash + + brew install cairo pkg-config + pip3 install --upgrade pip setuptools wheel + pip3 install 'maigret[pdf]' + +**Windows:** + +No system packages are needed — ``pycairo`` ships prebuilt wheels for +Windows. Just run: + +.. code-block:: bash + + pip install 'maigret[pdf]' + +**Google Cloud Shell / Colab / Replit / generic CI:** + +These environments behave like Debian/Ubuntu — install the same +``libcairo2-dev pkg-config python3-dev build-essential`` triple before +``pip install 'maigret[pdf]'``. If you do not control the base image and +cannot ``apt install``, skip the extra and use ``--html`` reports instead; +HTML reports contain the same data and open in any browser. + +``maigret: command not found`` after install +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If pip prints warnings like:: + + WARNING: The scripts maigret and update_sitesmd are installed in + '/home/<user>/.local/bin' which is not on PATH. + +…and ``maigret --version`` then fails with ``command not found``, your +``--user`` install put the entry-point script in a directory the shell does +not search. Add it to ``PATH``: + +.. code-block:: bash + + echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc + source ~/.bashrc + +Or install into a virtual environment, where the entry point lands in the +venv's ``bin/`` automatically: + +.. code-block:: bash + + python3 -m venv ~/.venvs/maigret + source ~/.venvs/maigret/bin/activate + pip install 'maigret[pdf]' # or just `pip install maigret` + +Optional: Cloudflare bypass solver +---------------------------------- + +.. warning:: + + **Experimental.** The Cloudflare webgate is under active development; + the configuration schema and CLI behaviour may change without + backwards-compatibility guarantees. + +Sites tagged ``cf_js_challenge`` / ``cf_firewall`` need a real browser to pass +their JavaScript challenge. To check those sites you can run a local +`FlareSolverr <https://github.com/FlareSolverr/FlareSolverr>`_ instance — +Maigret will route protected checks to it when ``--cloudflare-bypass`` is set: + +.. code-block:: bash + + docker run -d -p 8191:8191 --name flaresolverr ghcr.io/flaresolverr/flaresolverr:latest + +This is **optional** — Maigret runs without it; only sites whose +``protection`` field intersects ``settings.cloudflare_bypass.trigger_protection`` +require the solver. See :ref:`cloudflare-bypass` for details. diff --git a/docs/source/library-usage.rst b/docs/source/library-usage.rst new file mode 100644 index 0000000..c54e802 --- /dev/null +++ b/docs/source/library-usage.rst @@ -0,0 +1,139 @@ +.. _library-usage: + +Library usage +============= + +Maigret's CLI is a thin wrapper around an async Python API. You can embed Maigret in your own tools, pipelines, and OSINT workflows — no need to shell out. + +This page covers the common patterns. For the full argument list of the underlying function, see ``maigret.checking.maigret`` in the source. + +Installation +------------ + +.. code-block:: bash + + pip install maigret + +Minimal example +--------------- + +A working end-to-end search against the top 500 sites: + +.. code-block:: python + + import asyncio + import logging + + from maigret import search as maigret_search + from maigret.sites import MaigretDatabase + + # Load the bundled site database + db = MaigretDatabase().load_from_path( + "maigret/resources/data.json" + ) + + # Pick which sites to scan (same filtering the CLI uses) + sites = db.ranked_sites_dict(top=500) + + results = asyncio.run( + maigret_search( + username="soxoj", + site_dict=sites, + logger=logging.getLogger("maigret"), + timeout=30, + is_parsing_enabled=True, + ) + ) + + for site_name, result in results.items(): + if result["status"].is_found(): + print(site_name, result["url_user"]) + +Key points: + +- ``maigret_search`` is an ``async`` function — wrap it with ``asyncio.run(...)`` or ``await`` it from inside your own event loop. +- ``is_parsing_enabled=True`` turns on ``socid_extractor`` so ``result["ids_data"]`` is populated with profile fields (bio, linked accounts, uids, etc.). +- Each entry in the returned dict has a ``"status"`` object with ``is_found()``, plus ``url_user``, ``http_status``, ``rank``, ``ids_data``, and more. + +Filtering sites +--------------- + +``ranked_sites_dict`` accepts the same filters as the CLI: + +.. code-block:: python + + # All sites tagged as coding, top 200 by rank + sites = db.ranked_sites_dict(top=200, tags=["coding"]) + + # Exclude NSFW and dating sites + sites = db.ranked_sites_dict(excluded_tags=["nsfw", "dating"]) + + # Only specific sites by name + sites = db.ranked_sites_dict(names=["GitHub", "Reddit", "VK"]) + + # Include disabled sites (useful for maintenance / self-check) + sites = db.ranked_sites_dict(disabled=True) + +Running inside an existing event loop +------------------------------------- + +If your application already runs an asyncio loop (FastAPI, aiohttp server, a Discord bot, etc.), ``await`` ``maigret_search`` directly instead of calling ``asyncio.run``: + +.. code-block:: python + + async def check_username(username: str) -> dict: + results = await maigret_search( + username=username, + site_dict=sites, + logger=logger, + timeout=30, + ) + return { + name: r["url_user"] + for name, r in results.items() + if r["status"].is_found() + } + +Routing through a proxy +----------------------- + +The same proxy / Tor / I2P flags the CLI exposes are plain keyword arguments: + +.. code-block:: python + + results = await maigret_search( + username="soxoj", + site_dict=sites, + logger=logger, + proxy="socks5://127.0.0.1:1080", + tor_proxy="socks5://127.0.0.1:9050", # used for .onion sites + i2p_proxy="http://127.0.0.1:4444", # used for .i2p sites + timeout=30, + ) + +Full function signature +----------------------- + +.. code-block:: python + + async def maigret( + username: str, + site_dict: Dict[str, MaigretSite], + logger, + query_notify=None, + proxy=None, + tor_proxy=None, + i2p_proxy=None, + timeout=30, + is_parsing_enabled=False, + id_type="username", + debug=False, + forced=False, + max_connections=100, + no_progressbar=False, + cookies=None, + retries=0, + check_domains=False, + ) -> Dict[str, Any] + +See :doc:`command-line-options` for a description of each option — the semantics match the CLI flags one-to-one. diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/command-line-options.po b/docs/source/locale/zh_CN/LC_MESSAGES/command-line-options.po new file mode 100644 index 0000000..9990d4f --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/command-line-options.po @@ -0,0 +1,736 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-23 09:20+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/command-line-options.rst:4 f407954fa4604408bcf616f2c4d9e546 +msgid "Command line options" +msgstr "命令行选项" + +#: ../../source/command-line-options.rst:7 de65474ed32040cdb6f5df32b44ae67b +msgid "Usernames" +msgstr "用户名" + +#: ../../source/command-line-options.rst:9 f1f5dd56badc42a1a7f9adac620981d5 +msgid "``maigret username1 username2 ...``" +msgstr "``maigret username1 username2 ...``" + +#: ../../source/command-line-options.rst:11 2e481c46cdaa43308c4b92f573e94ba3 +msgid "" +"You can specify several usernames separated by space. Usernames are " +"**not** mandatory as there are other operations modes (see below)." +msgstr "可以用空格分隔传入多个用户名。\\ **不一定**\\ 必须传入用户名 —— 还有其它运行模式(见下文)。" + +#: ../../source/command-line-options.rst:15 bbc3f676aab74709a36b1537a3b1846d +msgid "Parsing of account pages and online documents" +msgstr "解析账号页面与在线文档" + +#: ../../source/command-line-options.rst:17 08808b412866468e94f13dcee1f1b196 +msgid "``maigret --parse URL``" +msgstr "``maigret --parse URL``" + +#: ../../source/command-line-options.rst:19 579f2cee066c4dd085fad1ef0df68324 +msgid "" +"Maigret will try to extract information about the document/account owner " +"(including username and other ids) and will make a search by the " +"extracted username and ids. See examples in the :ref:`extracting-" +"information-from-pages` section." +msgstr "" +"Maigret 会尝试抽取该文档/账号所有者的信息(包括用户名和其它 ID),并以抽取到的用户名和 ID 进行搜索。示例见 :ref" +":`extracting-information-from-pages` 一节。" + +#: ../../source/command-line-options.rst:24 18e92dec39484389b324a50823b4c0ad +msgid "Main options" +msgstr "主要选项" + +#: ../../source/command-line-options.rst:26 6357b34278fc4546a57d7cb38f712a69 +msgid "" +"Options are also configurable through settings files, see :doc:`settings " +"section <settings>`." +msgstr "各项选项也可以通过配置文件设置,参见 :doc:`配置一节 <settings>`\\ 。" + +#: ../../source/command-line-options.rst:29 44f82332afe24dfb95c0bdf178cb9ba2 +msgid "" +"``--tags`` - Filter sites for searching by tags: sites categories and " +"two-letter country codes (**not a language!**). E.g. photo, dating, " +"sport; jp, us, global. Multiple tags can be associated with one site. " +"**Warning**: tags markup is not stable now. Read more :doc:`in the " +"separate section <tags>`." +msgstr "" +"``--tags`` —— 按标签筛选搜索站点:站点分类,或两位国家代码(**不是语言代码!**)。例如 " +"photo、dating、sport;jp、us、global。一个站点可以关联多个标签。\\ **注意**:标签体系目前尚未稳定。详见 " +":doc:`独立章节 <tags>`\\ 。" + +#: ../../source/command-line-options.rst:34 ca25af40db7b429f8ad2174805c4594e +msgid "" +"``--exclude-tags`` - Exclude sites with specific tags from the search " +"(blacklist). E.g. ``--exclude-tags porn,dating`` will skip all sites " +"tagged with ``porn`` or ``dating``. Can be combined with ``--tags`` to " +"include certain categories while excluding others. Read more :doc:`in the" +" separate section <tags>`." +msgstr "" +"``--exclude-tags`` —— 从搜索中排除带有特定标签的站点(黑名单)。例如 ``--exclude-tags " +"porn,dating`` 会跳过所有打上 ``porn`` 或 ``dating`` 标签的站点。可与 ``--tags`` " +"组合使用,在包含某些类别的同时排除另一些。详见 :doc:`独立章节 <tags>`\\ 。" + +#: ../../source/command-line-options.rst:40 dfdcfacf726340a9bf52b29b42bf3fd9 +msgid "" +"``-n``, ``--max-connections`` - Allowed number of concurrent connections " +"**(default: 100)**." +msgstr "``-n``\\ 、\\ ``--max-connections`` —— 允许的并发连接数 **(默认:100)**\\ 。" + +#: ../../source/command-line-options.rst:43 dcc9b5cfae384a6eb20182e90a0a1ddf +msgid "``-a``, ``--all-sites`` - Use all sites for scan **(default: top 500)**." +msgstr "``-a``\\ 、\\ ``--all-sites`` —— 扫描全部站点 **(默认仅前 500 名)**\\ 。" + +#: ../../source/command-line-options.rst:45 e2223531796c4faea69f91fcb27a04c3 +msgid "" +"``--top-sites`` - Count of sites for scan ranked by Majestic Million " +"**(default: top 500)**." +msgstr "``--top-sites`` —— 按 Majestic Million 排名扫描站点的数量 **(默认:前 500 名)**\\ 。" + +#: ../../source/command-line-options.rst:48 a3fc16e927d04d7288dcd2fff85165b6 +msgid "" +"**Mirrors:** After the top *N* sites by Majestic Million rank are chosen " +"(respecting ``--tags``, ``--use-disabled-sites``, etc.), Maigret may add " +"extra sites whose database field ``source`` names a **parent platform** " +"that itself falls in the Majestic Million top *N* when ranking " +"**including disabled** sites. For example, if ``Twitter`` ranks in the " +"first 500 by Majestic Million, a mirror such as ``memory.lol`` (with " +"``source: Twitter``) is included even though it has no rank and would " +"otherwise be cut off. The same applies to Instagram-related mirrors (e.g." +" Picuki) when ``Instagram`` is in that parent top *N* by rank—even if the" +" official ``Instagram`` entry is disabled and not scanned by default, its" +" mirrors can still be pulled in. The final list is the ranked top *N* " +"plus these mirrors (no fixed upper bound on mirror count)." +msgstr "" +"**镜像站:** 在按 Majestic Million 排名选出前 *N* 个站点(同时考虑 ``--tags``\\ 、\\ ``--use-" +"disabled-sites`` 等)之后,Maigret 还可能额外加入一些站点 —— 它们的数据库字段 ``source`` 指向某个\\ " +"**父平台**,且该父平台(在\\ **包含已禁用站点**\\ 进行排名时)落在 Majestic Million 的前 *N* " +"名内。例如,如果\\ ``Twitter`` 在 Majestic Million 前 500 名内,即便 ``memory.lol`` " +"这样的镜像(``source: Twitter``)本身没有排名、按规则会被剔除,也仍会被加入。Instagram相关镜像(如 " +"Picuki)同理:即便官方的 ``Instagram`` 条目被禁用、默认不被扫描,只要 ``Instagram`` 在父级排名的前 *N* " +"名内,其镜像就仍可能被纳入。最终的站点列表 = 排名前 *N* + 这些镜像(镜像数量没有固定上限)。" + +#: ../../source/command-line-options.rst:60 88df9b7417d34d8693e526309d34ab4b +msgid "" +"``--timeout`` - Time (in seconds) to wait for responses from sites " +"**(default: 30)**. A longer timeout will be more likely to get results " +"from slow sites. On the other hand, this may cause a long delay to gather" +" all results. The choice of the right timeout should be carried out " +"taking into account the bandwidth of the Internet connection." +msgstr "" +"``--timeout`` —— 等待站点响应的时长,单位为秒 **(默认:30)**\\ " +"。超时设得越长,越有机会从慢站点拿到结果;另一方面,这也会拉长整体结果汇总的时间。具体取值应结合自身网络带宽来权衡。" + +#: ../../source/command-line-options.rst:67 eefa478db1c04aa3850a7fc3d3630447 +msgid "Network and proxy options" +msgstr "网络与代理选项" + +#: ../../source/command-line-options.rst:69 acd45006cd324eb9ba01dcc6468d5379 +msgid "" +"``--proxy PROXY_URL`` / ``-p PROXY_URL`` - Route **every** check through " +"the given HTTP or SOCKS proxy. Example: ``socks5://127.0.0.1:1080``, " +"``http://user:pass@proxy.example:3128``. This is the flag to use for " +"routing the whole run through Tor (``--proxy socks5://127.0.0.1:9050``), " +"a residential proxy, or any corporate gateway. No default." +msgstr "" +"``--proxy PROXY_URL`` / ``-p PROXY_URL`` —— 让\\ **所有**\\ 检查都通过指定的 HTTP 或 " +"SOCKS 代理。示例:``socks5://127.0.0.1:1080``\\ 、\\ " +"``http://user:pass@proxy.example:3128``\\ 。这是把整次运行都走 Tor(``--proxy " +"socks5://127.0.0.1:9050``)、住宅代理或企业网关时应当使用的参数。无默认值。" + +#: ../../source/command-line-options.rst:75 cd34c112c42e4fe1b40dddc08407f4a6 +msgid "" +"``--tor-proxy TOR_PROXY_URL`` - Gateway used **only** for ``.onion`` " +"sites in the database **(default: socks5://127.0.0.1:9050)**. Clearweb " +"sites are unaffected — for them Maigret uses your direct connection or " +"``--proxy`` if you set one. Without this flag, ``.onion`` sites are " +"silently skipped." +msgstr "" +"``--tor-proxy TOR_PROXY_URL`` —— **仅**\\ 用于数据库中 ``.onion`` 站点的网关 " +"**(默认:socks5://127.0.0.1:9050)**\\ 。明网站点不受影响 —— 对它们,Maigret " +"会使用你本机的直连,或者你设置的 ``--proxy``\\ 。不传该参数时,\\ ``.onion`` 站点会被静默跳过。" + +#: ../../source/command-line-options.rst:81 ec07be13427d47e6b701fa3c73d821b8 +msgid "" +"``--i2p-proxy I2P_PROXY_URL`` - Gateway used **only** for ``.i2p`` sites " +"in the database **(default: http://127.0.0.1:4444)**. Same \"only " +"matching protocol\" rule as ``--tor-proxy``." +msgstr "" +"``--i2p-proxy I2P_PROXY_URL`` —— **仅**\\ 用于数据库中 ``.i2p`` 站点的网关 " +"**(默认:http://127.0.0.1:4444)**\\ 。规则与 ``--tor-proxy`` 一致 —— 只对匹配的协议生效。" + +#: ../../source/command-line-options.rst:85 3883a2b23935446bb4fc52ad1c3ed69a +msgid "" +"Maigret does not start the Tor or I2P daemon for you — launch it first. " +"For a full walkthrough (Tor Browser vs system ``tor`` port numbers, Tails" +" OS recipe, timeout/retry tuning), see :doc:`tor-and-proxies`." +msgstr "" +"Maigret 不会替你启动 Tor 或 I2P 守护进程 —— 请先把它们跑起来。完整指南(包括 Tor 浏览器与系统 ``tor`` " +"端口的差别、Tails 操作系统下的配方、超时/重试调优等)请参见 :doc:`tor-and-proxies`\\ 。" + +#: ../../source/command-line-options.rst:89 e320ba07df8c4de6a4fcf19dc81a54a1 +msgid "" +"``--cookies-jar-file`` - File with custom cookies in Netscape format (aka" +" cookies.txt). You can install an extension to your browser to download " +"own cookies (`Chrome <https://chrome.google.com/webstore/detail/get-" +"cookiestxt/bgaddhkoddajcdgocldbbfleckgcbcid>`_, `Firefox " +"<https://addons.mozilla.org/en-US/firefox/addon/cookies-txt/>`_)." +msgstr "" +"``--cookies-jar-file`` —— Netscape 格式(即 cookies.txt)的自定义 cookie " +"文件。你可以在浏览器里安装对应扩展来导出自己的 cookie(`Chrome " +"<https://chrome.google.com/webstore/detail/get-" +"cookiestxt/bgaddhkoddajcdgocldbbfleckgcbcid>`_、\\ `Firefox " +"<https://addons.mozilla.org/en-US/firefox/addon/cookies-txt/>`_)。" + +#: ../../source/command-line-options.rst:93 d55a21187e5d4c51beb9b433595cccce +msgid "" +"``--no-recursion`` - Disable parsing pages for other usernames and " +"recursive search by them." +msgstr "``--no-recursion`` —— 禁用页面解析,以及基于发现的其它用户名进行递归搜索。" + +#: ../../source/command-line-options.rst:96 61e5e8f7907d4b1dbf239e183fb1f802 +msgid "" +"``--use-disabled-sites`` - Use disabled sites to search (may cause many " +"false positives)." +msgstr "``--use-disabled-sites`` —— 把已禁用的站点也纳入搜索范围(可能产生大量误报)。" + +#: ../../source/command-line-options.rst:99 20ce94c212df49338e550f7ecf71cc28 +msgid "" +"``--id-type`` - Specify identifier(s) type (default: username). Supported" +" types: gaia_id, vk_id, yandex_public_id, ok_id, wikimapia_uid. " +"Currently, you must add ``-a`` flag to run a scan on sites with custom id" +" types, sites will be filtered automatically." +msgstr "" +"``--id-type`` —— " +"指定标识符类型(默认:username)。支持的类型有:gaia_id、vk_id、yandex_public_id、ok_id、wikimapia_uid。目前必须同时加" +" ``-a``,才能扫描支持自定义 ID 类型的站点 —— 站点会被自动筛选。" + +#: ../../source/command-line-options.rst:104 ef2bfbd405b1471abfed99b2b82974d7 +msgid "" +"``--ignore-ids`` - Do not make search by the specified username or other " +"ids. Useful for repeated scanning with found known irrelevant usernames." +msgstr "``--ignore-ids`` —— 不对指定的用户名或其它 ID 发起搜索。适用于在多次重复扫描中,屏蔽已知与目标无关的用户名。" + +#: ../../source/command-line-options.rst:107 8eb8e891848f4c0c940843698b63497b +msgid "" +"``--db`` - Load Maigret database from a JSON file or an online, valid, " +"JSON file. See :ref:`custom-database` below." +msgstr "" +"``--db`` —— 从一个本地 JSON 文件,或一个在线的有效 JSON 文件加载 Maigret 数据库。详见下文 :ref" +":`custom-database`\\ 。" + +#: ../../source/command-line-options.rst:110 6413fe29bf874d50acd8025d0a2bdf30 +msgid "" +"``--no-autoupdate`` - Disable the automatic database update check that " +"runs at startup. The currently cached (or bundled) database is used as-" +"is." +msgstr "``--no-autoupdate`` —— 禁用启动时的自动数据库更新检查。直接使用当前已缓存(或内置)的数据库,不做任何变动。" + +#: ../../source/command-line-options.rst:114 cbfeb6479805402ba3c609e992dd66be +msgid "" +"``--force-update`` - Force a database update check at startup, ignoring " +"the usual check interval. Implies ``--no-autoupdate`` for the rest of the" +" run after the explicit update finishes." +msgstr "" +"``--force-update`` —— " +"在启动时强制执行一次数据库更新检查,忽略常规的检查间隔。强制更新结束后,本次运行剩余阶段相当于隐含开启了 ``--no-" +"autoupdate``\\ 。" + +#: ../../source/command-line-options.rst:118 67b357544dd746d88351d5c3ac4d041c +msgid "" +"``--retries RETRIES`` - Count of attempts to restart temporarily failed " +"requests." +msgstr "``--retries RETRIES`` —— 对临时性失败的请求,允许重启重试的次数。" + +#: ../../source/command-line-options.rst:121 1bc0e2cbf5f34a589897cd97f32c227a +#, python-brace-format +msgid "" +"``--with-domains`` *(experimental)* - Also resolve a small set of " +"``{username}.<tld>`` patterns through DNS (A-records) in parallel with " +"the normal HTTP checks. Currently 7 entries in the database use this path" +" (``.ddns.net``, ``.com``, ``.pro``, ``.me``, ``.biz``, ``.email``, " +"``.guru``). DNS-only hits can include parking domains and catch-all " +"wildcards, so treat results as a lead rather than confirmation. See the " +":doc:`FAQ entry on DNS domain checks <faq>`." +msgstr "" +"``--with-domains`` *(实验性)* —— 在执行普通 HTTP 检查的同时,通过 DNS" +"(A 记录)再解析一小组 ``{username}.<tld>`` 模式。当前数据库中有 7 条记录走" +"这条路径(``.ddns.net``、\\ ``.com``、\\ ``.pro``、\\ ``.me``、\\ " +"``.biz``、\\ ``.email``、\\ ``.guru``)。仅靠 DNS 的命中可能包括停放域名" +"和通配符记录,所以应当把结果当作线索而非确认结果。参见 :doc:`常见问题中关于" +" DNS 域名检查的条目 <faq>`。" + +#: ../../source/command-line-options.rst:129 f25c6830550a44219e0d387848857f72 +msgid "" +"``--cloudflare-bypass`` *(experimental)* - Route checks for sites tagged " +"``protection: [\"cf_js_challenge\"]`` / ``[\"cf_firewall\"]`` / " +"``[\"webgate\"]`` through a local Chrome-based solver (FlareSolverr by " +"default). The bypass is opt-in — without this flag (or " +"``settings.cloudflare_bypass.enabled = true``) those sites are checked " +"the usual way, which Cloudflare almost always blocks: you get an UNKNOWN " +"status with a JS-challenge / firewall error rather than a real result. " +"Configure the backend in ``settings.cloudflare_bypass.modules``. See :ref" +":`cloudflare-bypass`. **Experimental** — the flag, schema and routing " +"rules may change without backwards-compatibility guarantees." +msgstr "" +"``--cloudflare-bypass`` *(实验性)* —— 将 ``protection: " +"[\"cf_js_challenge\"]`` / ``[\"cf_firewall\"]`` / ``[\"webgate\"]`` " +"标记的站点交给本地基于 Chrome 的求解器(默认 FlareSolverr)处理。该绕过为按需启用 —— 不传该参数(也未在 " +"``settings.cloudflare_bypass.enabled`` 中设为 " +"``true``)时,这类站点会按常规方式被检查,而几乎肯定被 Cloudflare 拦下,得到的是 UNKNOWN 状态加上 JS " +"挑战/防火墙错误,而不是真实结果。后端可在 ``settings.cloudflare_bypass.modules`` 中配置。详见 :ref" +":`cloudflare-bypass`\\ 。\\ **实验性** —— 参数本身、配置结构以及路由规则均可能发生变化,不保证向后兼容。" + +#: ../../source/command-line-options.rst:143 480a4a0211a44ab3884625356c0e27c4 +msgid "Using a custom sites database" +msgstr "使用自定义站点数据库" + +#: ../../source/command-line-options.rst:145 824c6462cdca48a7a1c792a10f605035 +msgid "The ``--db`` flag accepts three forms:" +msgstr "``--db`` 参数支持以下三种形式:" + +#: ../../source/command-line-options.rst:147 3c00a1005cd54a3081ebf8cdc37d8c85 +msgid "" +"**HTTP(S) URL** — fetched as-is, e.g. ``--db " +"https://example.com/my_db.json``." +msgstr "**HTTP(S) URL** —— 按原样拉取,例如 ``--db https://example.com/my_db.json``\\ 。" + +#: ../../source/command-line-options.rst:149 975d5a4ff3154d42b233654ca8df2e18 +msgid "" +"**Local file path** — absolute (``--db /tmp/private.json``) or relative " +"to the current working directory (``--db LLM/maigret_private_db.json``)." +msgstr "" +"**本地文件路径** —— 可以是绝对路径(``--db /tmp/private.json``),也可以是相对当前工作目录的路径(``--db " +"LLM/maigret_private_db.json``)。" + +#: ../../source/command-line-options.rst:152 abbe569364f343b5a19aad5cb1b638c5 +msgid "" +"**Module-relative path** — kept for backwards compatibility, resolved " +"against the installed ``maigret/`` package directory (e.g. the default " +"``resources/data.json``)." +msgstr "" +"**相对模块的路径** —— 出于向后兼容保留,基于已安装的 ``maigret/`` 包目录解析(例如默认的 " +"``resources/data.json``)。" + +#: ../../source/command-line-options.rst:156 dca2c80645e54b5e97f4032a2bf5c627 +msgid "" +"Resolution order for local paths: the path is first tried as given " +"(absolute or cwd-relative); if that file does not exist, Maigret falls " +"back to the legacy module-relative resolution. If neither location " +"contains the file, Maigret exits with an error rather than silently " +"loading the bundled database." +msgstr "" +"本地路径的解析顺序:先按用户给的形式(绝对路径或基于当前目录的相对路径)尝试;若该文件不存在,再回退到旧的“相对模块路径”解析。如果两处都找不到,Maigret" +" 会报错退出,而不会悄悄加载内置数据库。" + +#: ../../source/command-line-options.rst:162 e483264d6cdf49caac506883eed82aec +msgid "" +"When ``--db`` points to a custom file, automatic database updates are " +"skipped — the file is used exactly as provided." +msgstr "当 ``--db`` 指向自定义文件时,会跳过自动更新 —— 直接使用你提供的文件。" + +#: ../../source/command-line-options.rst:165 07d9cd1ee7aa41d2851ce5b6afe0444d +msgid "On every run Maigret prints the database it actually loaded, for example::" +msgstr "每次运行时,Maigret 都会打印实际加载的数据库,例如::" + +#: ../../source/command-line-options.rst:170 c8bd9320a67f425383801203ac0a643a +msgid "" +"If loading the requested database fails for any other reason (corrupt " +"JSON, missing required keys, …), Maigret prints a warning, falls back to " +"the bundled database, and reports the fallback explicitly::" +msgstr "如果加载请求的数据库因其它原因失败(JSON 损坏、缺少必需字段等),Maigret 会打印警告并显式回退到内置数据库,并在输出中明确告知::" + +#: ../../source/command-line-options.rst:177 53da78b4c7ce47ef8f530004cc09caad +msgid "" +"A typical invocation against a private database, with auto-update " +"disabled and all sites scanned, looks like::" +msgstr "一个典型的命令:针对私有数据库、关闭自动更新、扫描全部站点 ——::" + +#: ../../source/command-line-options.rst:185 00d2c6ddbefe4172bc0ee88c37e87582 +msgid "Reports" +msgstr "报告" + +#: ../../source/command-line-options.rst:187 0cad7e0c6a6c43aea7bdc0b91853a1f4 +msgid "" +"``-P``, ``--pdf`` - Generate a PDF report (general report on all " +"usernames)." +msgstr "``-P``\\ 、\\ ``--pdf`` —— 生成 PDF 报告(覆盖所有用户名的整体报告)。" + +#: ../../source/command-line-options.rst:190 8025b2f344b74156b6642395fea2ddb8 +msgid "" +"``-H``, ``--html`` - Generate an HTML report file (general report on all " +"usernames)." +msgstr "``-H``\\ 、\\ ``--html`` —— 生成 HTML 报告文件(覆盖所有用户名的整体报告)。" + +#: ../../source/command-line-options.rst:193 fea6b4f5114d4fe98b73734d509805a1 +msgid "" +"``-X``, ``--xmind`` - Generate an XMind 8 mindmap (one report per " +"username)." +msgstr "``-X``\\ 、\\ ``--xmind`` —— 生成 XMind 8 思维导图(每个用户名生成一份)。" + +#: ../../source/command-line-options.rst:196 54fae6515d004e25b4d634d4047b2c7e +msgid "``-C``, ``--csv`` - Generate a CSV report (one report per username)." +msgstr "``-C``\\ 、\\ ``--csv`` —— 生成 CSV 报告(每个用户名生成一份)。" + +#: ../../source/command-line-options.rst:198 49a1c608a75e4efcbeb63fe8c969295a +msgid "``-T``, ``--txt`` - Generate a TXT report (one report per username)." +msgstr "``-T``\\ 、\\ ``--txt`` —— 生成 TXT 报告(每个用户名生成一份)。" + +#: ../../source/command-line-options.rst:200 542b9ac68ab24286848241f5504c00d3 +msgid "" +"``-J``, ``--json`` - Generate a JSON report of specific type: simple, " +"ndjson (one report per username). E.g. ``--json ndjson``" +msgstr "" +"``-J``\\ 、\\ ``--json`` —— 生成指定类型的 JSON 报告:simple、ndjson(每个用户名生成一份)。例如 " +"``--json ndjson``\\ 。" + +#: ../../source/command-line-options.rst:203 de062e12c0e849d6ae0766e3afcb6899 +msgid "" +"``-M``, ``--md`` - Generate a Markdown report (general report on all " +"usernames). See :ref:`markdown-report` below." +msgstr "" +"``-M``\\ 、\\ ``--md`` —— 生成 Markdown 报告(覆盖所有用户名的整体报告)。详见下文 :ref" +":`markdown-report`\\ 。" + +#: ../../source/command-line-options.rst:206 cbdcc8708d624fbeb7fe053d660ee98d +msgid "" +"``--ai`` - Run an AI-powered analysis of the search results using an " +"OpenAI-compatible chat completion API. The internal Markdown report is " +"sent to the model, which returns a short investigation summary that is " +"streamed to the terminal. See :ref:`ai-analysis` below." +msgstr "" +"``--ai`` —— 通过一个 OpenAI 兼容的 chat completion 接口,对搜索结果做一次 AI 分析。内部 Markdown" +" 报告会被发送给模型,模型返回的简短调查摘要会以流式方式打印到终端。详见下文 :ref:`ai-analysis`\\ 。" + +#: ../../source/command-line-options.rst:211 6e6a139b2eaf453fbccf5f91642944fb +msgid "" +"``--ai-model`` - Model name to use with ``--ai``. Defaults to " +"``openai_model`` from settings (``gpt-4o`` out of the box)." +msgstr "" +"``--ai-model`` —— 与 ``--ai`` 搭配使用的模型名。默认取配置中的 ``openai_model``\\ (开箱即用为 " +"``gpt-4o``)。" + +#: ../../source/command-line-options.rst:214 7e584a9aa20f4a179a75e9b19f491211 +msgid "" +"``-fo``, ``--folderoutput`` - Results will be saved to this folder, " +"``results`` by default. Will be created if doesn’t exist." +msgstr "``-fo``\\ 、\\ ``--folderoutput`` —— 结果保存到此目录,默认 ``results``\\ 。如果不存在会自动创建。" + +#: ../../source/command-line-options.rst:217 e86fadc1aa274c0cb74a74b49252a4fb +msgid "" +"``--web PORT`` - Start the built-in web interface on the given port and " +"serve results / downloadable reports from a single page. Example: " +"``maigret --web 5000`` → open ``http://127.0.0.1:5000``. Full walkthrough" +" with screenshots: :ref:`web-interface`." +msgstr "" +"``--web PORT`` —— 在指定端口启动内置 Web 界面,在一个页面上提供搜索结果和" +"可下载的报告。例如:``maigret --web 5000`` → 在浏览器中打开 " +"``http://127.0.0.1:5000``。带截图的完整说明见 :ref:`web-interface`。" + +#: ../../source/command-line-options.rst:223 2fefea5f68854596860a467f801351d4 +msgid "Output options" +msgstr "输出选项" + +#: ../../source/command-line-options.rst:225 f1ee27d6d1424578b7eb1c2630a63afa +msgid "" +"``-v``, ``--verbose`` - Display extra information and metrics. " +"*(loglevel=WARNING)*" +msgstr "``-v``\\ 、\\ ``--verbose`` —— 展示更多信息和指标。*(loglevel=WARNING)*" + +#: ../../source/command-line-options.rst:228 d82d5a8a8fb74653afd70b97f406edd6 +msgid "``-vv``, ``--info`` - Display service information. *(loglevel=INFO)*" +msgstr "``-vv``\\ 、\\ ``--info`` —— 展示运行信息。*(loglevel=INFO)*" + +#: ../../source/command-line-options.rst:230 13ddfc9f5fdd4418b3af1a7894f00edf +msgid "" +"``-vvv``, ``--debug``, ``-d`` - Display debugging information and site " +"responses. *(loglevel=DEBUG)*" +msgstr "" +"``-vvv``\\ 、\\ ``--debug``\\ 、\\ ``-d`` —— " +"展示调试信息以及站点响应内容。*(loglevel=DEBUG)*" + +#: ../../source/command-line-options.rst:233 d3f6f33a968e4e69aedf63e6f3e4cac9 +msgid "``--print-not-found`` - Print sites where the username was not found." +msgstr "``--print-not-found`` —— 打印那些没有找到该用户名的站点。" + +#: ../../source/command-line-options.rst:235 74d0e809c3d649ccaac4b8072191e609 +msgid "" +"``--print-errors`` - Print errors messages: connection, captcha, site " +"country ban, etc." +msgstr "``--print-errors`` —— 打印错误信息:连接错误、CAPTCHA、按国家封禁等。" + +#: ../../source/command-line-options.rst:239 eb1c3d7bc2a74c4584bec4db4e6876ee +msgid "Other operations modes" +msgstr "其它运行模式" + +#: ../../source/command-line-options.rst:241 ef8d45d364824f4f82caab5750059f40 +msgid "``--version`` - Display version information and dependencies." +msgstr "``--version`` —— 展示版本信息和依赖。" + +#: ../../source/command-line-options.rst:243 dda0b9c369994a18af5a95576f384224 +msgid "" +"``--self-check`` - Do self-checking for sites and database. Each site is " +"tested by looking up its known-claimed and known-unclaimed usernames and " +"verifying that the results match expectations. Individual site failures " +"(network errors, unexpected exceptions, etc.) are caught and logged " +"without stopping the overall process, so the check always runs to " +"completion. After checking, Maigret reports a summary of issues found. If" +" any sites were disabled (see ``--auto-disable``), Maigret asks if you " +"want to save updates; answering y/Y will rewrite the local database." +msgstr "" +"``--self-check`` —— " +"对站点和数据库执行自检。对每个站点,会分别查询其已知被占用、已知未被占用的用户名,并验证结果是否符合预期。单个站点的失败(网络错误、意外异常等)会被捕获并记录,而不会中断整体流程,因此自检总能跑到结束。检查完毕后,Maigret" +" 会汇总报告发现的问题。如果有站点被禁用了(参见 ``--auto-disable``),Maigret 会询问是否保存改动;输入 y/Y " +"会改写本地数据库。" + +#: ../../source/command-line-options.rst:252 d90dd8924f484ed89c26a1498906d376 +msgid "" +"``--auto-disable`` - Used with ``--self-check``: automatically disable " +"sites that fail checks (incorrect detection of claimed/unclaimed " +"usernames, connection errors, or unexpected exceptions). Without this " +"flag, ``--self-check`` only **reports** issues without modifying the " +"database." +msgstr "" +"``--auto-disable`` —— 与 ``--self-check`` " +"搭配使用:自动禁用检查失败的站点(claimed/unclaimed 用户名识别不正确、连接错误、意外异常等)。不加该参数时,\\ " +"``--self-check`` 仅\\ **报告**\\ 问题,不会修改数据库。" + +#: ../../source/command-line-options.rst:258 4abd8317982f4e42835299b7609a2d4f +msgid "" +"``--diagnose`` - Used with ``--self-check``: print detailed diagnosis " +"information for each failing site, including the check type, the list of " +"issues found, and recommendations (e.g. suggesting a different " +"``checkType``)." +msgstr "" +"``--diagnose`` —— 与 ``--self-check`` " +"搭配使用:打印每个检查失败站点的详细诊断信息,包括检查类型、发现的问题列表,以及修复建议(例如建议改用另一种 ``checkType``)。" + +#: ../../source/command-line-options.rst:263 ce42fe61bfb0482dbc89ef2c3911519f +msgid "" +"``--submit URL`` - Do an automatic analysis of the given account URL or " +"site main page URL to determine the site engine and methods to check " +"account presence. After checking Maigret asks if you want to add the " +"site, answering y/Y will rewrite the local database." +msgstr "" +"``--submit URL`` —— 对给定的账号 URL 或站点主页 URL " +"做一次自动分析,判断该站点的引擎以及检测账号是否存在的方式。结束后,Maigret 会询问是否要把该站点加入数据库;输入 y/Y " +"会改写本地数据库。" + +#: ../../source/command-line-options.rst:271 4d6f6cbccf7a451ca20856047705749f +msgid "Markdown report (LLM-friendly)" +msgstr "Markdown 报告(对 LLM 友好)" + +#: ../../source/command-line-options.rst:273 169c9c5850df41be928a3b97d0053eaf +msgid "" +"The ``--md`` / ``-M`` flag generates a Markdown report designed for both " +"human reading and analysis by AI assistants (ChatGPT, Claude, etc.)." +msgstr "" +"``--md`` / ``-M`` 参数会生成一份 Markdown 报告,既方便人类阅读,也便于AI 助手(ChatGPT、Claude " +"等)分析。" + +#: ../../source/command-line-options.rst:279 bdd50a6d6ea0417fbf43fe41de094513 +msgid "The report includes:" +msgstr "该报告包含:" + +#: ../../source/command-line-options.rst:281 2c1e1915c3274e6a8bc2c0e084819107 +msgid "" +"**Summary** with aggregated personal data (all fullnames, locations, bios" +" found across accounts), country tags, website tags, first/last seen " +"timestamps." +msgstr "**摘要**,包括跨账号汇总的个人数据(出现过的所有真实姓名、所在地、个人简介)、国家标签、站点标签、首次/最近一次出现的时间戳。" + +#: ../../source/command-line-options.rst:282 e68e7e3fcb6d447f84f4c3db5576d2cb +msgid "" +"**Per-account sections** with profile URL, site tags, and all extracted " +"fields (username, bio, follower count, linked accounts, etc.)." +msgstr "**每个账号一节**,包含主页 URL、站点标签,以及所有抽取出的字段(用户名、简介、关注者数、关联账号等)。" + +#: ../../source/command-line-options.rst:283 0399652878474aca95cb31aab128a9a3 +msgid "" +"**Possible false positives** disclaimer explaining that accounts may " +"belong to different people." +msgstr "**可能的误报**\\ 声明,提醒不同账号有可能属于不同的人。" + +#: ../../source/command-line-options.rst:284 3e8bb2a7b47e48edb3ac863d7dd7971f +msgid "**Ethical use** notice about applicable data protection laws." +msgstr "**伦理使用**\\ 提示,涉及相关数据保护法律。" + +#: ../../source/command-line-options.rst:286 7d11f4af4bc64f47acfff800307964dd +msgid "**Using with AI tools:**" +msgstr "**搭配 AI 工具使用:**" + +#: ../../source/command-line-options.rst:288 eb246a42d256435095cc135fc0663933 +msgid "" +"The Markdown format is optimized for LLM context windows. You can feed " +"the report directly to an AI assistant for follow-up analysis:" +msgstr "该 Markdown 格式针对 LLM 上下文窗口做了优化。你可以直接把报告投喂给 AI 助手,做后续分析:" + +#: ../../source/command-line-options.rst:298 dc7df4be38eb4e87904519db90ddcfaa +msgid "" +"The structured Markdown with per-site sections makes it easy for AI tools" +" to extract relationships, cross-reference identities, and identify " +"patterns across accounts." +msgstr "按站点分段的结构化 Markdown,使得 AI 工具更容易抽取关系、对照身份、并在多个账号之间识别模式。" + +#: ../../source/command-line-options.rst:300 afe2ae91795446b0a33b0b1280d85508 +msgid "" +"For a built-in alternative that calls the model for you and prints the " +"summary directly, see :ref:`ai-analysis` below." +msgstr "如果想要由 Maigret 自己调用模型并直接打印摘要,请参见下文的 :ref:`ai-analysis`\\ 。" + +#: ../../source/command-line-options.rst:306 74b535f2764f4fc6a1517b76af1feccc +msgid "AI analysis (built-in)" +msgstr "AI 分析(内置)" + +#: ../../source/command-line-options.rst:308 aff26f7a190b42c9972a8dd47884abef +msgid "" +"The ``--ai`` flag turns the search results into a short investigation " +"summary by sending the internal Markdown report to an OpenAI-compatible " +"chat completion API and streaming the model's reply to the terminal." +msgstr "" +"``--ai`` 参数会把搜索结果转化为一份简短的调查摘要 —— 将内部 Markdown 报告发送至一个 OpenAI 兼容的 chat " +"completion 接口,并把模型回复以流式方式输出到终端。" + +#: ../../source/command-line-options.rst:320 37cd9626351146ae95977a26d64827ee +msgid "" +"While ``--ai`` is active, per-site progress lines and the short text " +"report at the end are suppressed so the streamed summary is the main " +"output. The Markdown report itself is built in memory and is **not** " +"written to disk by ``--ai`` alone — combine with ``--md`` if you also " +"want the file on disk." +msgstr "" +"``--ai`` 启用期间,逐站点进度行以及末尾的简短文本报告都会被抑制,以便流式摘要成为主要输出。Markdown " +"报告本身只构建于内存中,单独使用 ``--ai`` 时\\ **不会**\\ 落盘 —— 如果同时也想把文件保存到磁盘,请配合 ``--md`` " +"使用。" + +#: ../../source/command-line-options.rst:326 e34c3a4ea5364123a895c6ef7006852b +msgid "" +"The summary follows a fixed format with sections for the most likely real" +" name, location, occupation, interests, languages, main website, username" +" variants, number of platforms, active years, a confidence rating, and a " +"short list of follow-up leads. The model is instructed to rely only on " +"what is supported by the report and to avoid mixing clearly unrelated " +"profiles into the main identity." +msgstr "摘要采用固定格式,分别给出最可能的真实姓名、所在地、职业、兴趣、语言、主要使用的网站、用户名变体、平台数量、活跃年份、置信度评级以及一份简短的后续线索清单。模型被明确要求:只能依据报告所支持的内容来作答,避免把明显无关的账号也并入主身份。" + +#: ../../source/command-line-options.rst:333 1b0f6bb02ecc49e28da3fc9c59ddebcc +msgid "" +"**Configuration.** The API key is resolved from " +"``settings.openai_api_key`` first, then from the ``OPENAI_API_KEY`` " +"environment variable. The endpoint defaults to " +"``https://api.openai.com/v1`` and can be redirected to any OpenAI-" +"compatible service (Azure OpenAI, OpenRouter, a local server, …) by " +"setting ``openai_api_base_url`` in ``settings.json``. See :ref:`settings`" +" for the full list of options." +msgstr "" +"**配置说明。** API key 的取值顺序:先取 ``settings.openai_api_key``,再回退到 " +"``OPENAI_API_KEY`` 环境变量。接口地址默认为 ``https://api.openai.com/v1``,通过在 " +"``settings.json`` 中设置 ``openai_api_base_url``,可以重定向到任意 OpenAI 兼容服务(Azure " +"OpenAI、OpenRouter、本地推理服务等)。完整选项请见 :ref:`settings`\\ 。" + +#: ../../source/command-line-options.rst:343 714f46dbe1fa4747b900ca499b6bf4a7 +msgid "" +"``--ai`` makes a network request to the configured chat completion " +"endpoint and sends the full Markdown report (which contains the gathered " +"profile data). Use it only with providers and accounts you trust with " +"that data." +msgstr "" +"``--ai`` 会向所配置的 chat completion 接口发起网络请求,并将完整的 Markdown " +"报告(其中包含已收集到的个人主页数据)一并发送过去。请仅在你信任的服务商和账号上使用该功能。" + + +#: ../../source/command-line-options.rst:206 +msgid "" +"``--neo4j`` - Generate a Neo4j Cypher report: a ``.cypher`` script that " +"recreates the maigret graph (the same one produced by ``--graph``) in a " +"Neo4j database, importable with ``cypher-shell`` or the Neo4j Browser " +"(general report on all usernames). See :ref:`neo4j-export` below." +msgstr "``--neo4j`` —— 生成 Neo4j Cypher 报告:一个 ``.cypher``\\ 脚本,可在 Neo4j 数据库中重建 maigret 图谱(与 ``--graph``\\ 生成的图谱相同),可用 ``cypher-shell``\\ 或 Neo4j Browser 导入(针对所有用户名的汇总报告)。参见下文的 :ref:`neo4j-export`\\ 。" + +#: ../../source/command-line-options.rst:356 +msgid "Neo4j export" +msgstr "Neo4j 导出" + +#: ../../source/command-line-options.rst:358 +msgid "" +"The ``--neo4j`` flag serializes the maigret graph — the same nodes and " +"relationships behind ``--graph`` — into a ``*_neo4j.cypher`` script you " +"can load into a `Neo4j <https://neo4j.com/>`_ database for querying and " +"visual exploration of how identities, accounts, sites, and extracted data" +" points link together." +msgstr "``--neo4j``\\ 选项会把 maigret 图谱(与 ``--graph``\\ 背后相同的节点和关系)序列化为一个 ``*_neo4j.cypher``\\ 脚本,你可以将其载入 `Neo4j <https://neo4j.com/>`_\\ 数据库,用于查询并可视化地探索身份、账号、站点与抽取到的数据点之间是如何相互关联的。" + +#: ../../source/command-line-options.rst:368 +msgid "" +"This writes ``reports/report_username_neo4j.cypher``. No extra runtime " +"dependency is required (it reuses the ``networkx`` graph that ``--graph``" +" already builds)." +msgstr "该命令会写出 ``reports/report_username_neo4j.cypher``\\ 。无需额外的运行时依赖(它复用了 ``--graph``\\ 已经构建的 ``networkx``\\ 图谱)。" + +#: ../../source/command-line-options.rst:372 +msgid "**What the script contains.**" +msgstr "**脚本包含哪些内容。**" + +#: ../../source/command-line-options.rst:374 +msgid "" +"A ``CREATE CONSTRAINT ... IF NOT EXISTS`` ensuring the ``name`` property " +"of every ``:MaigretNode`` is unique." +msgstr "一条 ``CREATE CONSTRAINT ... IF NOT EXISTS``\\ 语句,确保每个 ``:MaigretNode``\\ 的 ``name``\\ 属性唯一。" + +#: ../../source/command-line-options.rst:376 +msgid "" +"One ``MERGE`` per node. Each node carries three properties: ``name`` (the" +" unique key, e.g. ``account: https://github.com/user``), ``type`` " +"(``username``, ``account``, ``fullname``, ``uid``, …) and ``label`` (the " +"human-readable value)." +msgstr "每个节点一条 ``MERGE``\\ 。每个节点带有三个属性:``name`` (唯一键,例如 ``account: https://github.com/user``)、``type`` (``username``\\ 、\\ ``account``\\ 、\\ ``fullname``\\ 、\\ ``uid``\\ 等)以及 ``label`` (便于阅读的值)。" + +#: ../../source/command-line-options.rst:380 +msgid "One ``MERGE`` per edge as a ``[:LINKED_TO]`` relationship." +msgstr "每条边一条 ``MERGE``\\ ,作为 ``[:LINKED_TO]``\\ 关系。" + +#: ../../source/command-line-options.rst:382 +msgid "" +"Because every node and edge is ``MERGE``-d on its unique key, importing " +"the same report twice is **idempotent** — it updates existing nodes " +"instead of creating duplicates." +msgstr "由于每个节点和每条边都按其唯一键进行 ``MERGE``\\ ,因此重复导入同一份报告是\\ **幂等的**\\ —— 它会更新已有节点,而不会创建重复项。" + +#: ../../source/command-line-options.rst:386 +msgid "**Importing.**" +msgstr "**导入。**" + +#: ../../source/command-line-options.rst:393 +msgid "" +"Alternatively, open the Neo4j Browser at ``http://localhost:7474`` and " +"paste the script contents into the query editor. Drop the ``-p`` flag if " +"authentication is disabled, or let ``cypher-shell`` prompt for the " +"password interactively." +msgstr "或者,在 ``http://localhost:7474``\\ 打开 Neo4j Browser,把脚本内容粘贴到查询编辑器中。如果未启用身份验证,可省略 ``-p``\\ 参数;也可以让 ``cypher-shell``\\ 交互式地提示输入密码。" + +#: ../../source/command-line-options.rst:398 +msgid "**Exploring the graph.** Once imported, inspect it with Cypher, e.g.:" +msgstr "**探索图谱。** 导入后,可用 Cypher 查询进行检视,例如:" + +#: ../../source/command-line-options.rst:409 +msgid "" +"The ``CREATE CONSTRAINT ... IF NOT EXISTS FOR ... REQUIRE`` syntax " +"requires Neo4j 4.4+; the ``MERGE`` statements themselves work on any " +"version." +msgstr "``CREATE CONSTRAINT ... IF NOT EXISTS FOR ... REQUIRE``\\ 语法需要 Neo4j 4.4+;而 ``MERGE``\\ 语句本身在任何版本上都可用。" \ No newline at end of file diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/development.po b/docs/source/locale/zh_CN/LC_MESSAGES/development.po new file mode 100644 index 0000000..c1a0f84 --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/development.po @@ -0,0 +1,1077 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-23 10:03+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/development.rst:4 3051b2f22a2647f58e1c59f625665d25 +msgid "Development" +msgstr "开发" + +#: ../../source/development.rst:7 b119dac56665480c8a0b49caadd7ca34 +msgid "Frequently Asked Questions" +msgstr "常见问题" + +#: ../../source/development.rst:9 aa0781c042194b94a23f443d04dc7cf3 +msgid "Where to find the list of supported sites?" +msgstr "支持的站点列表在哪里?" + +#: ../../source/development.rst:11 ef6d8bf77fdb47149d5ec9d70733d75d +msgid "" +"The human-readable list of supported sites is available in the `sites.md " +"<https://github.com/soxoj/maigret/blob/main/sites.md>`_ file in the " +"repository. It's been generated automatically from the main JSON file " +"with the list of supported sites." +msgstr "" +"人类可读的支持站点列表位于仓库的 `sites.md " +"<https://github.com/soxoj/maigret/blob/main/sites.md>`_ 文件。它由主 JSON " +"文件(其中保存了支持的站点列表)自动生成。" + +#: ../../source/development.rst:14 6a8bd4fff6c54a73bfd62dcf35286be6 +msgid "" +"The machine-readable JSON file with the list of supported sites is " +"available in the `data.json " +"<https://github.com/soxoj/maigret/blob/main/maigret/resources/data.json>`_" +" file in the directory `resources`." +msgstr "" +"机器可读的 JSON 文件 `data.json " +"<https://github.com/soxoj/maigret/blob/main/maigret/resources/data.json>`_" +" 位于 `resources` 目录下。" + +#: ../../source/development.rst:17 52e17ec366da465582a1ed1b6bf0e869 +msgid "Which methods to check the account presence are supported?" +msgstr "支持哪些检查账号存在性的方式?" + +#: ../../source/development.rst:19 8606efe88424475da2acd5b173aa9bbe +msgid "The supported methods (``checkType`` values in ``data.json``) are:" +msgstr "支持以下几种方式(对应 ``data.json`` 中的 ``checkType`` 值):" + +#: ../../source/development.rst:21 8da51daa744b4ab289dcc2795f83fec2 +msgid "" +"``message`` - the most reliable method, checks if any string from " +"``presenceStrs`` is present and none of the strings from ``absenceStrs`` " +"are present in the HTML response" +msgstr "" +"``message`` —— 最可靠的方式,检查 HTML 响应中是否包含 ``presenceStrs`` 中任一字符串,同时不包含 " +"``absenceStrs`` 中的任何字符串" + +#: ../../source/development.rst:22 4300da10b23d446fb9b04a05d1fafd13 +msgid "``status_code`` - checks that status code of the response is 2XX" +msgstr "``status_code`` —— 检查响应的状态码是否为 2XX" + +#: ../../source/development.rst:23 27538679c60f44e191a6cb32847f7e4c +msgid "``response_url`` - check if there is not redirect and the response is 2XX" +msgstr "``response_url`` —— 检查响应是否未发生重定向,且状态码为 2XX" + +#: ../../source/development.rst:26 2b432a52cc85440e94287ae7d2c68298 +msgid "" +"Maigret natively treats specific anti-bot HTTP status codes (like " +"LinkedIn's ``HTTP 999``) as a standard \"Not Found/Available\" signal " +"instead of throwing an infrastructure Server Error, gracefully preventing" +" false positives." +msgstr "" +"对于某些反爬虫返回的特殊 HTTP 状态码(例如 LinkedIn 的 ``HTTP 999``),Maigret 会原生地将其视为标准的“未找到" +" / 不存在”信号,而不是抛出基础设施层面的服务器错误,从而优雅地避免误报。" + +#: ../../source/development.rst:28 2f512782791f418aab8e274dbe8349d5 +msgid "" +"See the details of check mechanisms in the `checking.py " +"<https://github.com/soxoj/maigret/blob/main/maigret/checking.py#L339>`_ " +"file." +msgstr "" +"检查机制的具体细节请见 `checking.py " +"<https://github.com/soxoj/maigret/blob/main/maigret/checking.py#L339>`_。" + +#: ../../source/development.rst:31 a6f2d3244c0f4a0a96de7a6b98c38c78 +msgid "" +"Maigret now uses the **Majestic Million** dataset for site popularity " +"sorting instead of the discontinued Alexa Rank API. For backward " +"compatibility with existing configurations and parsers, the ranking field" +" in `data.json` and internal site models remains named ``alexaRank`` and " +"``alexa_rank``." +msgstr "" +"Maigret 目前使用 **Majestic Million** 数据集来对站点人气进行排序,以替代已停服的 Alexa Rank " +"API。为了与既有配置和解析器保持向后兼容,\\ `data.json` 以及内部站点模型中的排名字段仍然沿用 ``alexaRank`` 和 " +"``alexa_rank``\\ 。" + +#: ../../source/development.rst:33 1fe5b7d86a6849b1ab3a9172d672c3c9 +msgid "" +"**Mirrors and ``--top-sites``:** When you limit scans with ``--top-sites " +"N``, Maigret also includes *mirror* sites (entries whose ``source`` field" +" points at a parent platform such as Twitter or Instagram) if that parent" +" would appear in the Majestic Million top *N* when disabled sites are " +"considered for ranking. See the **Mirrors** paragraph under ``--top-" +"sites`` in :doc:`command-line-options`." +msgstr "" +"**镜像站与 ``--top-sites``:** 使用 ``--top-sites N`` 限定扫描范围时,Maigret " +"还会额外纳入*镜像*站点(即 ``source`` 字段指向 Twitter、Instagram " +"等父平台的条目),只要在“也将已禁用站点纳入排名”的前提下,该父平台位于 Majestic Million 的前 *N* 名内。详见 :doc" +":`command-line-options` 中 ``--top-sites`` 下的 **Mirrors** 段落。" + +#: ../../source/development.rst:36 141fb06e0c314b03b32b84ad4f59154e +msgid "Testing" +msgstr "测试" + +#: ../../source/development.rst:38 a62dc0104d4b4069aa717263ddb30a38 +msgid "It is recommended use Python 3.10 for testing." +msgstr "建议使用 Python 3.10 进行测试。" + +#: ../../source/development.rst:40 6c0891d8a647439582e92adeb7d86f24 +msgid "Install test requirements:" +msgstr "安装测试依赖:" + +#: ../../source/development.rst:47 19012105d83b4791b2040dbe22ade69c +msgid "Use the following commands to check Maigret:" +msgstr "使用以下命令对 Maigret 进行检查:" + +#: ../../source/development.rst:73 86e32dee5e4046d9bbac01870a404095 +msgid "Site naming conventions" +msgstr "站点命名规范" + +#: ../../source/development.rst:75 998f4d72864b4e2c893fe8cd75082d74 +msgid "" +"Site names are the keys in ``data.json`` and appear in user-facing " +"reports. Follow these rules:" +msgstr "站点名称是 ``data.json`` 中的键,也会出现在面向用户的报告中。请遵循以下规则:" + +#: ../../source/development.rst:77 f63c206bde2b4013a397c193f4184eab +msgid "**Title Case** by default: ``Product Hunt``, ``Hacker News``." +msgstr "默认使用\\ **首字母大写(Title Case)**:``Product Hunt``\\ 、\\ ``Hacker News``\\ 。" + +#: ../../source/development.rst:78 bdd3f0c6c0c34972806ed33681e6f4d4 +msgid "" +"**Lowercase** only if the brand itself is written that way: ``kofi``, " +"``note``, ``hi5``." +msgstr "仅当品牌方本身就这样书写时,才使用\\ **全小写**:``kofi``\\ 、\\ ``note``\\ 、\\ ``hi5``\\ 。" + +#: ../../source/development.rst:79 f70cadc9e2f44fd1b582a6e5db4dfba8 +msgid "" +"**No domain suffix** (``calendly.com`` → ``Calendly``), unless the domain" +" is part of the recognized brand name: ``last.fm``, ``VC.ru``, " +"``Archive.org``." +msgstr "" +"**不要带域名后缀**\\ (``calendly.com`` → " +"``Calendly``);除非该域名本身就是品牌名的一部分:``last.fm``\\ 、\\ ``VC.ru``\\ 、\\ " +"``Archive.org``\\ 。" + +#: ../../source/development.rst:80 10bb26c91d3e4b8a8863d38169d7717b +msgid "" +"**No full UPPERCASE** unless the brand is an acronym: ``VK``, ``CNET``, " +"``ICQ``, ``IFTTT``." +msgstr "" +"**除非品牌是缩写,否则不要全大写**:``VK``\\ 、\\ ``CNET``\\ 、\\ ``ICQ``\\ 、\\ ``IFTTT``\\" +" 。" + +#: ../../source/development.rst:81 f4123287f2fa413d8cc2db9ce0c33ff0 +msgid "**No** ``www.`` **or** ``https://`` **prefix** in the name." +msgstr "名称中\\ **不要**\\ 带 ``www.`` **或** ``https://`` **前缀**\\ 。" + +#: ../../source/development.rst:82 7cb9a8f60c6c4d2e93c3ca8f1d1d13a4 +msgid "" +"**Spaces** are allowed when the brand uses them: ``Star Citizen``, " +"``Google Maps``." +msgstr "如果品牌名本身带空格,允许保留\\ **空格**:``Star Citizen``\\ 、\\ ``Google Maps``\\ 。" + +#: ../../source/development.rst:83 072adc091b88456ea60da347555f2e65 +#, python-brace-format +msgid "**{username} templates** in names are acceptable: ``{username}.tilda.ws``." +msgstr "名称中可以使用 **{username} 模板**:``{username}.tilda.ws``\\ 。" + +#: ../../source/development.rst:85 6b6e77a06f4840418d7aa75325c9cea3 +msgid "When in doubt, check how the service refers to itself on its homepage." +msgstr "拿不准时,看看该服务在自家主页上是怎么称呼自己的。" + +#: ../../source/development.rst:88 88d19c58d0374da6bb0b16900bda2539 +msgid "How to fix false-positives" +msgstr "如何修复误报" + +#: ../../source/development.rst:90 2f3c3bf93f8342c589af55710b3adeb8 +msgid "" +"If you want to work with sites database, don't forget to activate " +"statistics update git hook, command for it would look like this: ``git " +"config --local core.hooksPath .githooks/``." +msgstr "" +"如果你要处理站点数据库,别忘了启用统计信息更新的 git hook —— 对应命令为:``git config --local " +"core.hooksPath .githooks/``\\ 。" + +#: ../../source/development.rst:92 24d75bb37d76425eb370b7aa22a0a26a +msgid "" +"You should make your git commits from your maigret git repo folder, or " +"else the hook wouldn't find the statistics update script." +msgstr "请务必在 maigret 的 git 仓库目录下执行 git 提交,否则该 hook 找不到对应的统计更新脚本。" + +#: ../../source/development.rst:94 388456ec9ac7441d9c40323585f89518 +msgid "Determine the problematic site." +msgstr "确定出问题的站点。" + +#: ../../source/development.rst:96 fa558b2eefe448d1be3c042e970dfd5c +msgid "" +"If you already know which site has a false-positive and want to fix it " +"specifically, go to the next step." +msgstr "如果你已经知道是哪个站点存在误报,并打算专门修它,可以直接跳到下一步。" + +#: ../../source/development.rst:98 3edb28b450d4463a92211af2d1c8259c +msgid "" +"Otherwise, simply run a search with a random username (e.g. " +"`laiuhi3h4gi3u4hgt`) and check the results. Alternatively, you can use " +"the `community Telegram bot <https://sites.google.com/view/maigret-bot-" +"link>`_." +msgstr "" +"否则,用一个随机用户名(例如 `laiuhi3h4gi3u4hgt`)跑一次搜索,然后看结果即可。你也可以使用\\ `社区 Telegram " +"机器人 <https://sites.google.com/view/maigret-bot-link>`_。" + +#: ../../source/development.rst:101 3c9fad0eb7784febb9727fc15793f2e3 +msgid "Open the account link in your browser and check:" +msgstr "在浏览器中打开该账号链接,并检查:" + +#: ../../source/development.rst:103 69e0c85e67784fd6a7df4c85dac9294c +msgid "If the site is completely gone, remove it from the list" +msgstr "如果站点已彻底下线,将其从列表中移除" + +#: ../../source/development.rst:104 3ca0379d915a4c2bb318061f0228894f +msgid "" +"If the site still works but looks different, update in data.json how we " +"check it" +msgstr "如果站点仍在运行但页面已变化,在 data.json 中相应地更新检查方式" + +#: ../../source/development.rst:105 21c2abf191404c60ad3f17793f23f3dc +msgid "If the site requires login to view profiles, disable checking it" +msgstr "如果站点必须登录才能查看主页,则禁用对它的检查" + +#: ../../source/development.rst:107 45287e8a6dd741159297207746921fe7 +msgid "" +"Find the site in the `data.json " +"<https://github.com/soxoj/maigret/blob/main/maigret/resources/data.json>`_" +" file." +msgstr "" +"在 `data.json " +"<https://github.com/soxoj/maigret/blob/main/maigret/resources/data.json>`_" +" 中找到该站点。" + +#: ../../source/development.rst:109 55d0ec12978e42f3ae1c5bfae15c29ac +msgid "" +"If the ``checkType`` method is not ``message`` and you are going to fix " +"check, update it: - put ``message`` in ``checkType`` - put in " +"``absenceStrs`` a keyword that is present in the HTML response for an " +"non-existing account - put in ``presenceStrs`` a keyword that is present " +"in the HTML response for an existing account" +msgstr "" +"如果原先的 ``checkType`` 不是 ``message``,而你打算修这个检查,请按下面的方式更新:把 ``checkType`` 改为" +" ``message``;在 ``absenceStrs`` 中填入一个仅出现在“账号不存在”响应 HTML 中的关键词;在 " +"``presenceStrs`` 中填入一个仅出现在“账号存在”响应 HTML 中的关键词。" + +#: ../../source/development.rst:114 ee572f18adea48f1b7e603236e4099d7 +msgid "" +"If you have trouble determining the right keywords, you can use automatic" +" detection by passing the account URL with the ``--submit`` option:" +msgstr "如果你不太能挑出合适的关键词,可以通过 ``--submit`` 选项传入账号 URL,让 Maigret 自动检测:" + +#: ../../source/development.rst:120 737bc34235df4f46974e9b74570bd1e5 +msgid "To disable checking, set ``disabled`` to ``true`` or simply run:" +msgstr "要禁用对某站点的检查,将 ``disabled`` 设为 ``true``,或直接运行:" + +#: ../../source/development.rst:126 abae1631134d4c5aa9fd9c183b80866c +msgid "To debug the check method using the response HTML, you can run:" +msgstr "要基于响应 HTML 来调试检查方式,可以运行:" + +#: ../../source/development.rst:132 4167df7d708e49e7b5e1a786939150b3 +msgid "There are few options for sites data.json helpful in various cases:" +msgstr "在不同场景下,data.json 中还有几个有用的可选字段:" + +#: ../../source/development.rst:134 46c20be0c6eb497988cc4326f86a33ec +msgid "" +"``engine`` - a predefined check for the sites of certain type (e.g. " +"forums), see the ``engines`` section in the JSON file" +msgstr "``engine`` —— 针对某类站点(如论坛)的预定义检查;参见 JSON 文件中的 ``engines`` 节" + +#: ../../source/development.rst:135 3145d565394045e1a97c0383b500f2ec +msgid "``headers`` - a dictionary of additional headers to be sent to the site" +msgstr "``headers`` —— 一组额外的请求头,会随请求一并发送给该站点" + +#: ../../source/development.rst:136 8225235e7afd444994388232afd56bcf +msgid "" +"``requestHeadOnly`` - set to ``true`` if it's enough to make a HEAD " +"request to the site" +msgstr "``requestHeadOnly`` —— 如果对该站点用 HEAD 请求即可完成检查,将其设为 ``true``" + +#: ../../source/development.rst:137 f5764018332443fba7747bef9f5f8869 +msgid "" +"``regexCheck`` - a regex to check if the username is valid, in case of " +"frequent false-positives" +msgstr "``regexCheck`` —— 用于校验用户名是否合法的正则,适用于频繁出现误报的场景" + +#: ../../source/development.rst:138 0d8ba47bc89f46dfad98457c4af38289 +msgid "" +"``requestMethod`` - set the HTTP method to use (e.g., ``POST``). By " +"default, Maigret natively defaults to GET or HEAD." +msgstr "" +"``requestMethod`` —— 指定使用的 HTTP 方法(例如 ``POST``)。默认情况下,Maigret 原生使用 GET 或 " +"HEAD。" + +#: ../../source/development.rst:139 108842b286774076874a072d5149253d +#, python-brace-format +msgid "" +"``requestPayload`` - a dictionary with the JSON payload to send for POST " +"requests (e.g., ``{\"username\": \"{username}\"}``), extremely useful for" +" parsing GraphQL or modern JSON APIs." +msgstr "" +"``requestPayload`` —— 用于 POST 请求的 JSON 负载字典(例如 ``{\"username\": " +"\"{username}\"}``),在对接 GraphQL 或现代 JSON API 时非常有用。" + +#: ../../source/development.rst:140 6b7dab6b7a8c4f2ca639273bf6c5a0de +msgid "" +"``protection`` - a list of protection types detected on the site (see " +"below)." +msgstr "``protection`` —— 在该站点上检测到的防护类型列表(详见下文)。" + +#: ../../source/development.rst:143 97847bf201034dce8372df356f89e5c3 +msgid "``protection`` (site protection tracking)" +msgstr "``protection``\\ (站点防护跟踪)" + +#: ../../source/development.rst:145 1372f6b0b9c841d59cfcbb22c8b745ff +msgid "" +"The ``protection`` field records what kind of anti-bot protection a site " +"uses. Maigret reads this field and automatically applies the appropriate " +"bypass mechanism where one exists." +msgstr "``protection`` 字段用于记录站点使用了哪种反爬虫防护。Maigret 会读取该字段,并在有对应绕过机制可用时自动启用它。" + +#: ../../source/development.rst:147 5b730e5dedce4b10b1c98ad6a30e3172 +msgid "Two categories of tag:" +msgstr "标签分为两类:" + +#: ../../source/development.rst:149 73a42b8f816b45759481aa1a1e6ff905 +msgid "" +"**Load-bearing.** Maigret changes its HTTP client or headers based on the" +" tag. Currently only ``tls_fingerprint`` (switches to ``curl_cffi`` with " +"Chrome-class TLS)." +msgstr "" +"**有实际效果的标签。** Maigret 会根据该标签更换 HTTP 客户端或请求头。目前只有 ``tls_fingerprint``\\ " +"(会切换到带 Chrome 级 TLS 的 ``curl_cffi``)。" + +#: ../../source/development.rst:150 e3857b93a5474dbabe8f812a9d4468c3 +msgid "" +"**Documentation-only.** Maigret does **not** change behavior based on the" +" tag; it records *why* the site is hard so a future solver can target the" +" right set of sites without re-auditing." +msgstr "" +"**仅供记录的标签。** Maigret **不会**\\ " +"因该标签改变行为;它只是记录该站点“为什么难”,以便未来引入对应的求解器后,可以直接定位到正确的站点集合,不必再重新审计一遍。" + +#: ../../source/development.rst:152 87671cdf55d74fcd820824c66c272c0f +msgid "" +"Within the documentation-only tags, there is a further split that " +"dictates whether the site is ``disabled: true``:" +msgstr "在“仅供记录”这一类标签内部,还有一道进一步的划分,决定该站点是否被设为 ``disabled: true``:" + +#: ../../source/development.rst:154 104c82d048b949faa1a4bb7c4f58b081 +msgid "" +"``ip_reputation`` is the **only** doc-tag that **keeps the site " +"enabled**. It means \"works for most users, fails from datacenter/cloud " +"IPs.\" Disabling would silently hide a working site from anyone with a " +"clean IP. The fix is **external** to Maigret (residential IP or " +"``--proxy``)." +msgstr "" +"``ip_reputation`` 是\\ **唯一**\\ 一个\\ **保留站点为启用状态**\\ " +"的记录类标签。它的意思是“对大多数用户可用,但从数据中心 / 云 IP 访问会失败”。如果禁用了,那些拥有干净 IP " +"的用户就会被静默地挡在外面,看不到这个本来正常的站点。修复方法在 Maigret 之\\ **外**\\ (住宅 IP 或 " +"``--proxy``)。" + +#: ../../source/development.rst:155 83f77bd3ccc245a697f2b5965737f4b2 +msgid "" +"``cf_js_challenge``, ``cf_firewall``, ``aws_waf_js_challenge``, " +"``ddos_guard_challenge``, ``custom_bot_protection``, ``js_challenge`` all" +" pair with ``disabled: true``. They mean \"does not work for anyone right" +" now\"; the tag identifies the provider so that when a bypass ships, " +"every site with that tag can be re-enabled in one pass." +msgstr "" +"``cf_js_challenge``\\ 、\\ ``cf_firewall``\\ 、\\ " +"``aws_waf_js_challenge``\\ 、\\ ``ddos_guard_challenge``\\ 、\\ " +"``custom_bot_protection``\\ 、\\ ``js_challenge`` 都与 ``disabled: true`` " +"搭配出现。它们的含义是“目前对所有人都不能用”;标签本身用于标明防护提供方,这样一旦相应绕过手段就绪,所有打了该标签的站点就可以一次性重新启用。" + +#: ../../source/development.rst:157 97acf3d5c1654afb80641530b169fce3 +msgid "Supported values:" +msgstr "支持的取值:" + +#: ../../source/development.rst:159 782e50f0a6864819b580e3a058aecb81 +msgid "" +"``tls_fingerprint`` *(load-bearing; site stays enabled)* — the site " +"fingerprints the TLS handshake (JA3/JA4) and blocks non-browser clients. " +"Maigret automatically uses ``curl_cffi`` with Chrome browser emulation to" +" bypass this. Requires the ``curl_cffi`` package (included as a " +"dependency). Examples: Instagram, NPM, Codepen, Kickstarter, Letterboxd." +msgstr "" +"``tls_fingerprint`` *(有实际效果;站点保持启用)* —— 该站点会对 TLS " +"握手(JA3/JA4)进行指纹识别,阻挡非浏览器客户端。Maigret 会自动改用带 Chrome 浏览器模拟的 ``curl_cffi`` " +"来绕过。需要 ``curl_cffi`` " +"包(已作为依赖一并安装)。示例:Instagram、NPM、Codepen、Kickstarter、Letterboxd。" + +#: ../../source/development.rst:160 d436a20278b4486e8d013b474956e66a +msgid "" +"``ip_reputation`` *(documentation-only; site stays enabled)* — the site " +"blocks requests from datacenter/cloud IPs regardless of headers or TLS. " +"Cannot be bypassed automatically; run Maigret from a regular internet " +"connection (not a datacenter) or use a proxy (``--proxy``). The site is " +"**not** marked ``disabled`` because it continues to work for users on " +"residential IPs. Examples: Reddit, Patreon, Figma, OnlyFans." +msgstr "" +"``ip_reputation`` *(仅供记录;站点保持启用)* —— 不论请求头还是 TLS,只要来自数据中心 / 云 IP " +"都会被站点拦截。无法自动绕过;请从普通网络(而不是数据中心)上运行 Maigret,或使用 ``--proxy``\\ 。该站点\\ " +"**不会**\\ 被标为 ``disabled``,因为对住宅 IP " +"的用户它仍然可用。示例:Reddit、Patreon、Figma、OnlyFans。" + +#: ../../source/development.rst:161 84fc01b3886b4e6586e64a203f2e1815 +msgid "" +"``cf_js_challenge`` *(documentation-only; pair with ``disabled: true``)* " +"— Cloudflare Managed Challenge / Turnstile JS challenge. Symptom: HTTP " +"403 with ``cf-mitigated: challenge`` header; body contains " +"``challenges.cloudflare.com``, ``_cf_chl_opt``, ``window._cf_chl``, or " +"\"Just a moment\". Not bypassable via ``curl_cffi`` TLS impersonation " +"(verified across Chrome 123/124/131, Safari 17/18, Firefox 133/135, Edge " +"101 — all return the same 403 challenge page); a real browser executing " +"the challenge JS is required to obtain the clearance cookie. Sites stay " +"``disabled: true`` until a CF-challenge solver is integrated. Examples: " +"DMOJ, Elakiri, Fanlore, Bdoutdoors, TheStudentRoom, forum.hr." +msgstr "" +"``cf_js_challenge`` *(仅供记录;与 ``disabled: true`` 搭配)* —— Cloudflare " +"Managed Challenge / Turnstile JS 挑战。症状:HTTP 403,响应头含 ``cf-mitigated: " +"challenge``;响应体中含有 ``challenges.cloudflare.com``\\ 、\\ ``_cf_chl_opt``\\ " +"、\\ ``window._cf_chl`` 或 \"Just a moment\"。无法通过 ``curl_cffi`` TLS 模拟绕过(已在" +" Chrome 123/124/131、Safari 17/18、Firefox 133/135、Edge 101 等多个版本上验证 —— " +"全部返回同样的 403 挑战页);必须由真实浏览器执行挑战 JS 才能获得 clearance cookie。在引入 CF " +"挑战求解器之前,这些站点会一直保持 ``disabled: true``\\ " +"。示例:DMOJ、Elakiri、Fanlore、Bdoutdoors、TheStudentRoom、forum.hr。" + +#: ../../source/development.rst:162 8882cb39d7d14ceab8270ee180779540 +msgid "" +"``cf_firewall`` *(documentation-only; pair with ``disabled: true``)* — " +"Cloudflare firewall rule / bot score block (WAF action=block, **not** " +"action=challenge). Symptom: HTTP 403 served by Cloudflare (``server: " +"cloudflare``, ``cf-ray`` header) **without** JS-challenge markers — body " +"typically shows \"Access denied\", \"Attention Required\", or just a bare" +" 1015/1016/1020 error page. Unlike ``ip_reputation``, residential IPs are" +" **not** sufficient to bypass — Cloudflare decides based on a composite " +"of bot score, TLS fingerprint, UA, ASN, and custom site-owner rules, so " +"``curl_cffi`` Chrome impersonation from a residential line still returns " +"403. Sites stay ``disabled: true`` until a per-site bypass (cookies, real" +" browser, or residential+clean session) is found. Examples: Fark, Fodors," +" Huntingnet, Hunttalk." +msgstr "" +"``cf_firewall`` *(仅供记录;与 ``disabled: true`` 搭配)* —— Cloudflare 防火墙规则 / " +"机器人分数级封禁(WAF action=block,\\ **不是** action=challenge)。症状:由 Cloudflare 返回的" +" HTTP 403(``server: cloudflare``\\ 、含 ``cf-ray`` 响应头),且响应体中\\ **没有** JS " +"挑战相关标记 —— 内容通常是 \"Access denied\"、\"Attention Required\",或一个简单的 " +"1015/1016/1020 错误页。与 ``ip_reputation`` 不同,\\ **仅靠**\\ 住宅 IP 也不足以绕过 —— " +"Cloudflare 会综合机器人分数、TLS 指纹、UA、ASN 以及站点方的自定义规则进行判定,因此即便从住宅线路上用 " +"``curl_cffi`` 模拟 Chrome,依然会拿到 403。这些站点会一直保持 ``disabled: " +"true``,直到为其找到针对性的绕过方式(cookie、真实浏览器,或住宅 + " +"干净会话)。示例:Fark、Fodors、Huntingnet、Hunttalk。" + +#: ../../source/development.rst:163 ba22757e556d49a8b96c4b25a1264a81 +msgid "" +"``aws_waf_js_challenge`` *(documentation-only; pair with ``disabled: " +"true``)* — the site is protected by AWS WAF with a JavaScript challenge. " +"Symptom: HTTP 202 with empty body and ``x-amzn-waf-action: challenge`` " +"header (a token-granting challenge that requires executing the " +"CAPTCHA/challenge JS bundle). Neither ``curl_cffi`` TLS impersonation nor" +" User-Agent changes bypass this — a real browser or the official AWS WAF " +"challenge-solver SDK is required. Sites stay ``disabled: true`` until a " +"solver is integrated. Example: Dreamwidth." +msgstr "" +"``aws_waf_js_challenge`` *(仅供记录;与 ``disabled: true`` 搭配)* —— 站点使用 AWS WAF" +" 并启用了 JavaScript 挑战。症状:HTTP 202、响应体为空,且响应头含 ``x-amzn-waf-action: " +"challenge``\\ (一个需要执行 CAPTCHA / 挑战 JS 包才能获得 token 的挑战)。无论是 ``curl_cffi`` " +"的 TLS 模拟,还是更换 User-Agent,都无法绕过 —— 需要真实浏览器,或官方的 AWS WAF challenge-solver " +"SDK。在求解器接入前,这些站点会一直保持 ``disabled: true``\\ 。示例:Dreamwidth。" + +#: ../../source/development.rst:164 7bf8a2e7e06e42f5af52c63f4fe48c72 +msgid "" +"``ddos_guard_challenge`` *(documentation-only; pair with ``disabled: " +"true``)* — DDoS-Guard (ddos-guard.net) anti-bot page. Symptom: HTTP 403 " +"with ``server: ddos-guard`` header; body contains \"DDoS-Guard\". DDoS-" +"Guard fingerprints different UAs per source IP, so a single User-Agent " +"override does not work across environments; a JS-capable bypass or DDoS-" +"Guard-aware solver is required. Sites stay ``disabled: true`` until a " +"solver is integrated. Example: ForumHouse." +msgstr "" +"``ddos_guard_challenge`` *(仅供记录;与 ``disabled: true`` 搭配)* —— DDoS-Guard" +"(ddos-guard.net)反爬虫页。症状:HTTP 403,响应头含 ``server: ddos-guard``,响应体内含 " +"\"DDoS-Guard\"。DDoS-Guard 会按不同的源 IP 对 UA 进行指纹识别,因此仅在一个环境中替换 User-Agent " +"并不能在其它环境通用;需要支持执行 JS 的绕过手段,或专门针对 DDoS-Guard 的求解器。在求解器接入前,这些站点会一直保持 " +"``disabled: true``\\ 。示例:ForumHouse。" + +#: ../../source/development.rst:165 5787ace1eff549f996dc3f19ef903e85 +msgid "" +"``js_challenge`` *(documentation-only; pair with ``disabled: true``)* — " +"**fallback** for JavaScript-challenge systems whose provider cannot be " +"identified (custom in-house challenge pages that are not Cloudflare, AWS " +"WAF, or any other recognized vendor). Prefer a provider-specific tag " +"whenever the provider can be pinned down from response headers or body " +"signatures." +msgstr "" +"``js_challenge`` *(仅供记录;与 ``disabled: true`` 搭配)* —— 针对\\ **无法识别提供方**\\ 的" +" JavaScript 挑战系统的\\ **兜底标签**\\ (即:不是 Cloudflare、AWS WAF " +"或其它已知厂商的、自研挑战页)。只要能从响应头或响应体特征中确定提供方,就应优先使用对应的具体厂商标签。" + +#: ../../source/development.rst:166 541c1d0e4b7e4411bb89b6c57936dc85 +msgid "" +"``custom_bot_protection`` *(documentation-only; pair with ``disabled: " +"true``)* — **fallback** for non-JS-challenge bot protection served by a " +"custom/in-house system (not Cloudflare, not AWS WAF, not DDoS-Guard). " +"Typical symptom: HTTP 403 from the site's own origin server (``server: " +"nginx``, AWS ELB, etc.) with a branded block page, returned regardless of" +" TLS fingerprint or residential IP. Not generically bypassable; " +"investigate per site (cookies, session, proxy geography). Examples: " +"Hackerearth (\"HackerEarth Guardian\"), FreelanceJob (nginx-level block)." +msgstr "" +"``custom_bot_protection`` *(仅供记录;与 ``disabled: true`` 搭配)* —— 针对\\ **非 JS" +" 挑战**\\ 类、自研 / 内部反爬虫系统(非 Cloudflare、非 AWS WAF、非 DDoS-Guard)的\\ **兜底标签**\\" +" 。典型症状:由站点自身源站返回 HTTP 403(``server: nginx``\\ 、AWS ELB 等),并带有定制的拦截页;无论 " +"TLS 指纹还是住宅 IP " +"都同样会被挡。无法通用地绕过;需要逐站点研究(cookie、会话、代理地理位置等)。示例:Hackerearth(\"HackerEarth " +"Guardian\")、FreelanceJob(nginx 层封禁)。" + +#: ../../source/development.rst:168 5dd6641558c54634965ea2befc5565f1 +msgid "" +"**Rule: prefer provider-specific protection tags.** When a site is " +"blocked by an identifiable anti-bot vendor, always record the vendor in " +"the tag (``cf_js_challenge``, ``cf_firewall``, ``aws_waf_js_challenge``, " +"``ddos_guard_challenge``, and future additions such as " +"``sucuri_challenge``, ``incapsula_challenge``). The generic " +"``js_challenge`` and ``custom_bot_protection`` tags are reserved for " +"custom/unknown systems. Rationale: bypass solvers are inherently " +"provider-specific (a Cloudflare Turnstile solver does not help with AWS " +"WAF); recording the provider in advance lets us fan out fixes the moment " +"a per-provider solver is added, without re-auditing every disabled site. " +"The same principle applies to other protection categories when the " +"provider is identifiable." +msgstr "" +"**原则:优先使用厂商特定的防护标签。** " +"当某站点被一个可识别的反爬虫厂商封禁时,务必在标签中记录该厂商(``cf_js_challenge``\\ 、\\ " +"``cf_firewall``\\ 、\\ ``aws_waf_js_challenge``\\ 、\\ " +"``ddos_guard_challenge``,以及未来可能新增的 ``sucuri_challenge``\\ 、\\ " +"``incapsula_challenge`` 等)。通用的 ``js_challenge`` 和 " +"``custom_bot_protection`` 标签仅留给自研 / 无法识别的系统。原因在于:绕过求解器在本质上是厂商相关的(一个 " +"Cloudflare Turnstile 求解器对 AWS WAF " +"没用);提前在标签里记下厂商,就能在某种厂商求解器接入的瞬间一次性把所有相关站点全部启用,而无需再次审计每一个被禁用的站点。其它防护类别在能识别厂商时,也适用同一原则。" + +#: ../../source/development.rst:170 70813dfc49db4081a172c9fc51de5464 +msgid "Example:" +msgstr "示例:" + +#: ../../source/development.rst:183 e6173482d0c3427bb9b54bf5ccdfe12b +msgid "``urlProbe`` (optional profile probe URL)" +msgstr "``urlProbe``\\ (可选的主页探测 URL)" + +#: ../../source/development.rst:185 2a4a832f6e8f4ebc88870dabb7357cd1 +msgid "" +"By default Maigret performs the HTTP request to the same URL as ``url`` " +"(the public profile link pattern)." +msgstr "默认情况下,Maigret 会向与 ``url`` 相同的地址(也就是面向公众的主页链接模板)发起 HTTP 请求。" + +#: ../../source/development.rst:187 1fe31097e69648259e248b1d64c05d00 +msgid "" +"If you set ``urlProbe`` in ``data.json``, Maigret **fetches** that URL " +"for the presence check (API, GraphQL, JSON endpoint, etc.), while " +"**reports and ``url_user``** still use ``url`` — the human-readable " +"profile page users should open." +msgstr "" +"如果你在 ``data.json`` 中设置了 ``urlProbe``,Maigret 会\\ **抓取**\\ 该 URL " +"来做存在性检查(API、GraphQL、JSON 接口等);而\\ **报告和 ``url_user``** 仍然使用 ``url`` —— " +"即用户应当打开的、人类可读的主页地址。" + +#: ../../source/development.rst:189 e561c1da87ad40059926a8689d010b8a +#, python-brace-format +msgid "" +"Placeholders: ``{username}``, ``{urlMain}``, ``{urlSubpath}`` (same as " +"for ``url``). Example: GitHub uses ``url`` " +"``https://github.com/{username}`` and ``urlProbe`` " +"``https://api.github.com/users/{username}``; Picsart uses the web profile" +" ``https://picsart.com/u/{username}`` and probes " +"``https://api.picsart.com/users/show/{username}.json``." +msgstr "" +"占位符:``{username}``\\ 、\\ ``{urlMain}``\\ 、\\ ``{urlSubpath}``\\ (与 " +"``url`` 一致)。示例:GitHub 的 ``url`` 是 ``https://github.com/{username}``,而 " +"``urlProbe`` 是 ``https://api.github.com/users/{username}``;Picsart 的网页主页是" +" ``https://picsart.com/u/{username}``,探测地址则是 " +"``https://api.picsart.com/users/show/{username}.json``\\ 。" + +#: ../../source/development.rst:191 +#, python-brace-format +msgid "" +"``url`` must **always** stay a human-openable profile page — it is shown to " +"the user and printed as the clickable result link. Never put an API / JSON /" +" GraphQL endpoint in ``url``; that belongs in ``urlProbe``. If the check " +"needs an API endpoint, keep the browsable profile in ``url`` and add the API" +" URL as ``urlProbe`` (e.g. Weibo: ``url`` " +"``https://weibo.com/n/{username}``, ``urlProbe`` " +"``https://weibo.com/ajax/profile/info?screen_name={username}``)." +msgstr "" +"``url`` 必须\\ **始终**\\ 是人类可打开的主页——它会展示给用户,并作为可点击的结果" +"链接输出。切勿在 ``url`` 中放入 API / JSON / GraphQL 端点;那应放在 ``urlProbe`` " +"中。如果检查需要 API 端点,请在 ``url`` 中保留可浏览的主页,并将 API 地址作为 " +"``urlProbe``\\ (例如 Weibo:``url`` 为 ``https://weibo.com/n/{username}``," +"``urlProbe`` 为 ``https://weibo.com/ajax/profile/info?screen_name={username}``\\ )。" + +#: ../../source/development.rst:199 5e12482b51e34df887d078b80bb91ec0 +msgid "" +"Implementation: ``make_site_result`` in `checking.py " +"<https://github.com/soxoj/maigret/blob/main/maigret/checking.py>`__." +msgstr "" +"实现位置:`checking.py " +"<https://github.com/soxoj/maigret/blob/main/maigret/checking.py>`__ 中的 " +"``make_site_result``\\ 。" + +#: ../../source/development.rst:194 e63dc8db4d4d4d15bd9b4323eb9f145f +msgid "Site check fixes using LLM" +msgstr "借助 LLM 修复站点检查" + +#: ../../source/development.rst:197 70490c1762a04ee890944f1d2b9a84fa +msgid "" +"The ``LLM/`` directory at the root of the repository contains detailed " +"instructions for editing site checks (in Markdown format): checklist, " +"full guide to ``checkType`` / ``data.json`` / ``urlProbe``, handling " +"false positives, searching for public JSON APIs, and the proposal log for" +" ``socid_extractor``." +msgstr "" +"仓库根目录下的 ``LLM/`` 目录中,以 Markdown 形式保存了编辑站点检查的详细指南:检查清单、关于 ``checkType`` / " +"``data.json`` / ``urlProbe`` 的完整说明、处理误报的方法、寻找公开 JSON API 的思路,以及面向 " +"``socid_extractor`` 的改动提案日志。" + +#: ../../source/development.rst:199 5d8b27e0fd99416a9e92869bc4ac64e5 +msgid "Main files:" +msgstr "主要文件:" + +#: ../../source/development.rst:201 64c774a95454489a9b4e4ee0d9306a3f +msgid "" +"`site-checks-playbook.md <https://github.com/soxoj/maigret/blob/main/LLM" +"/site-checks-playbook.md>`_ — short checklist" +msgstr "" +"`site-checks-playbook.md <https://github.com/soxoj/maigret/blob/main/LLM" +"/site-checks-playbook.md>`_ —— 精简的检查清单" + +#: ../../source/development.rst:202 b4e90c5cbfe541ce81df5d7060345bc6 +msgid "" +"`site-checks-guide.md <https://github.com/soxoj/maigret/blob/main/LLM" +"/site-checks-guide.md>`_ — detailed guide" +msgstr "" +"`site-checks-guide.md <https://github.com/soxoj/maigret/blob/main/LLM" +"/site-checks-guide.md>`_ —— 详细指南" + +#: ../../source/development.rst:203 b9fd7455501c4ef2903e682ac54fc9f8 +msgid "" +"`socid_extractor_improvements.log " +"<https://github.com/soxoj/maigret/blob/main/LLM/socid_extractor_improvements.log>`_" +" — template and entries for identity extractor improvements" +msgstr "" +"`socid_extractor_improvements.log " +"<https://github.com/soxoj/maigret/blob/main/LLM/socid_extractor_improvements.log>`_" +" —— 身份信息抽取器改进项的模板与记录" + +#: ../../source/development.rst:205 53286ba37db94831adda43dee21158c6 +msgid "" +"These files should be kept up-to-date whenever changes are made to the " +"check logic in the code or in ``data.json``." +msgstr "每当代码或 ``data.json`` 中的检查逻辑发生改动时,这些文件都应同步更新。" + +#: ../../source/development.rst:210 85ff4ef402624608b22cf55649c21e76 +msgid "Activation mechanism" +msgstr "激活机制" + +#: ../../source/development.rst:212 e4fb11d9f3e44154b45bf761b47d5f23 +msgid "" +"The activation mechanism helps make requests to sites requiring " +"additional authentication like cookies, JWT tokens, or custom headers." +msgstr "激活机制用于向那些需要额外认证(cookie、JWT token、自定义请求头等)的站点发起请求。" + +#: ../../source/development.rst:214 73440cf6695e4874b5d9b96df8000958 +msgid "Let's study the Vimeo site check record from the Maigret database:" +msgstr "我们以 Maigret 数据库中的 Vimeo 站点检查记录为例:" + +#: ../../source/development.rst:242 4a2c9113a2e54b85a4ff1b84afa41474 +msgid "The activation method is:" +msgstr "其激活方法如下:" + +#: ../../source/development.rst:256 e4844d04bac94d4a9df572dd9709e395 +msgid "Here's how the activation process works when a JWT token becomes invalid:" +msgstr "当 JWT token 失效时,激活流程的工作方式如下:" + +#: ../../source/development.rst:258 1c0200aedbde4dd7b8fe1d800eaf5d78 +msgid "" +"The site check makes an HTTP request to ``urlProbe`` with the invalid " +"token" +msgstr "站点检查会带上失效的 token,向 ``urlProbe`` 发起 HTTP 请求" + +#: ../../source/development.rst:259 73dc603c767843bda5dc08f027a0eb3e +msgid "" +"The response contains an error message specified in the " +"``activation``/``marks`` field" +msgstr "响应中包含 ``activation`` / ``marks`` 字段指定的错误信息" + +#: ../../source/development.rst:260 15017fd02c4e43d6acc239ce8f8300e0 +msgid "" +"When this error is detected, the ``vimeo`` activation function is " +"triggered" +msgstr "一旦检测到该错误,就会触发 ``vimeo`` 对应的激活函数" + +#: ../../source/development.rst:261 ca36c430e40b4debb5e393ba09875ba1 +msgid "" +"The activation function obtains a new JWT token and updates it in the " +"site check record" +msgstr "激活函数获取新的 JWT token,并将其更新到该站点检查记录中" + +#: ../../source/development.rst:262 13d034e97a894522a02f13c6054a3db6 +msgid "" +"On the next site check (either through retry or a new Maigret run), the " +"valid token is used and the check succeeds" +msgstr "下一次站点检查(无论是重试还是新一次 Maigret 运行)使用新的有效 token,检查随即成功" + +#: ../../source/development.rst:264 7a045582b2e0433ab7b68582602d17db +msgid "" +"Examples of activation mechanism implementation are available in " +"`activation.py " +"<https://github.com/soxoj/maigret/blob/main/maigret/activation.py>`_ " +"file." +msgstr "" +"激活机制的实现示例位于 `activation.py " +"<https://github.com/soxoj/maigret/blob/main/maigret/activation.py>`_ 中。" + +#: ../../source/development.rst:267 2d04665a97194d54a614856a51f9053d +msgid "How to publish new version of Maigret" +msgstr "如何发布新版本的 Maigret" + +#: ../../source/development.rst:269 1ab6f7a9bbdb4c19822c6a4a9ea5594b +msgid "**Collaborats rights are requires, write Soxoj to get them**." +msgstr "**需要协作者权限,请联系 Soxoj 获取**\\ 。" + +#: ../../source/development.rst:271 f21cdf7d304e48888d55bf6b6776eed0 +msgid "" +"For new version publishing you must create a new branch in repository " +"with a bumped version number and actual changelog first. After it you " +"must create a release, and GitHub action automatically create a new PyPi " +"package." +msgstr "" +"发布新版本时,需要先在仓库中创建一个新分支,提升版本号并补全实际的changelog;然后再创建一次 release,GitHub Action " +"会自动构建并发布一个新的PyPI 包。" + +#: ../../source/development.rst:276 02e001a6393c4e27b260483c19d53b37 +msgid "" +"New branch example: " +"https://github.com/soxoj/maigret/commit/e520418f6a25d7edacde2d73b41a8ae7c80ddf39" +msgstr "新分支示例:https://github.com/soxoj/maigret/commit/e520418f6a25d7edacde2d73b41a8ae7c80ddf39" + +#: ../../source/development.rst:277 80f08ebfab804af785e035b63ce03aa0 +msgid "Release example: https://github.com/soxoj/maigret/releases/tag/v0.4.1" +msgstr "Release 示例:https://github.com/soxoj/maigret/releases/tag/v0.4.1" + +#: ../../source/development.rst:279 2323ac6de51e476db5bc7711ce7c8929 +msgid "" +"1. Make a new branch locally with a new version name. Check the current " +"version number here: https://pypi.org/project/maigret/. **Increase only " +"patch version (third number)** if there are no breaking changes." +msgstr "" +"1. " +"在本地新建一个分支,分支名使用新版本号。当前版本号可在此查看:https://pypi.org/project/maigret/。如果没有破坏性改动,\\" +" **只递增 patch 版本(第三位数字)**\\ 。" + +#: ../../source/development.rst:286 a417fe5e5d9a46a8966b1437adf66709 +msgid "" +"2. Update Maigret version in four files manually. **All four must be in " +"sync** — the previous bump missed ``docs/source/conf.py`` and " +"``snapcraft.yaml`` and they fell behind by a release." +msgstr "" +"2. 在四个文件中手动更新 Maigret 版本号。\\ **这四处必须保持同步** —— 上一次升级遗漏了 " +"``docs/source/conf.py`` 和 ``snapcraft.yaml``,导致它们晚了一个版本。" + +#: ../../source/development.rst:290 c852c3160d914c52901b381e1c497756 +msgid "" +"``pyproject.toml`` — single line ``version = \"X.Y.Z\"`` under " +"``[tool.poetry]``." +msgstr "``pyproject.toml`` —— ``[tool.poetry]`` 下的一行 ``version = \"X.Y.Z\"``\\ 。" + +#: ../../source/development.rst:292 387319e7a775440e957e24a5eeecdf2d +msgid "``maigret/__version__.py`` — single line ``__version__ = 'X.Y.Z'``." +msgstr "``maigret/__version__.py`` —— 一行 ``__version__ = 'X.Y.Z'``\\ 。" + +#: ../../source/development.rst:293 bd11c1f50c204dd6bfdd6e991ce31dc1 +msgid "" +"``docs/source/conf.py`` — **two** Sphinx fields. ``release`` is the full " +"version (``'X.Y.Z'``); ``version`` is the short ``major.minor`` " +"(``'X.Y'``, **without** the patch number). Update **both**." +msgstr "" +"``docs/source/conf.py`` —— **两个** Sphinx 字段。\\ ``release`` " +"为完整版本号(``'X.Y.Z'``);\\ ``version`` 为简写的 ``major.minor``\\ (``'X.Y'``,\\ " +"**不包含**\\ 补丁号)。\\ **两处都要更新**\\ 。" + +#: ../../source/development.rst:296 5a4c8fb4e0e24151b55a4a13fc23d5e8 +msgid "" +"``snapcraft.yaml`` — single line ``version: X.Y.Z`` (no quotes, no ``v`` " +"prefix)." +msgstr "``snapcraft.yaml`` —— 一行 ``version: X.Y.Z``\\ (不带引号,也不带 ``v`` 前缀)。" + +#: ../../source/development.rst:299 fd407df427f64d2da27335629a9c7f6c +msgid "" +"After editing, sanity-check with ``grep -rE '0\\.5\\.|0\\.6\\.|<old>'`` " +"to catch any straggler reference." +msgstr "改完后,用 ``grep -rE '0\\.5\\.|0\\.6\\.|<old>'`` 做一次粗略检查,以防还有漏掉的旧版本号。" + +#: ../../source/development.rst:302 45d614c695ee416cb9caaef468a68793 +msgid "" +"Create a new empty text section in the beginning of the file " +"`CHANGELOG.md` with a current date:" +msgstr "在 `CHANGELOG.md` 文件开头新增一个空的段落,并写入当天日期:" + +#: ../../source/development.rst:308 bd9e9962100c48718fccb09a50c39de6 +msgid "Get auto-generate release notes:" +msgstr "获取自动生成的 release notes:" + +#: ../../source/development.rst:310 b9a6d0263d434ca19518fd7fbc4995ee +msgid "Open https://github.com/soxoj/maigret/releases/new" +msgstr "打开 https://github.com/soxoj/maigret/releases/new" + +#: ../../source/development.rst:311 ea8fbc71ae1e423d850d48247dd5e881 +msgid "Click `Choose a tag`, enter `v0.4.0` (your version)" +msgstr "点击 `Choose a tag`,输入 `v0.4.0`\\ (你的版本号)" + +#: ../../source/development.rst:312 ../../source/development.rst:336 +#: cded7c2c6c69470f955f13c698134d32 d1254bb2239d4cb2b213dc045570c509 +msgid "Click `Create new tag`" +msgstr "点击 `Create new tag`" + +#: ../../source/development.rst:313 ../../source/development.rst:337 +#: 3fe6064b63ae4806af1b2b2597c5a4c9 928dcb126c194560ac759427f296601d +msgid "Press `+ Auto-generate release notes`" +msgstr "点击 `+ Auto-generate release notes`" + +#: ../../source/development.rst:314 c46b55ddf1ff4355a2a4407ee241acca +msgid "Copy all the text from description text field below" +msgstr "复制下方描述文本框中的全部内容" + +#: ../../source/development.rst:315 075eff52777346f59cf3122b3b34fdb6 +msgid "Paste it to empty text section in `CHANGELOG.txt`" +msgstr "粘贴到 `CHANGELOG.txt` 中你刚刚新建的那个空段落里" + +#: ../../source/development.rst:316 bccfa6e075b14f1987b9cf5edc34f82c +msgid "" +"Remove redundant lines `## What's Changed` and `## New Contributors` " +"section if it exists" +msgstr "删除冗余的 `## What's Changed` 行,如果存在 `## New Contributors` 段落也一并删除" + +#: ../../source/development.rst:317 958f767ee172477bb161cc467e644adc +msgid "*Close the new release page*" +msgstr "*关闭新建 release 的页面*" + +#: ../../source/development.rst:319 fe124945cd6343fbaf83b10cacfc17b6 +msgid "Commit all the changes, push, make pull request" +msgstr "提交所有改动,push 上去,并创建 pull request" + +#: ../../source/development.rst:328 b034507056f54222a79e2ce93a3a6478 +msgid "Merge pull request" +msgstr "合并 pull request" + +#: ../../source/development.rst:330 6dc1a70971a54fb3939ab5a1b714995b +msgid "Create new release" +msgstr "创建新的 release" + +#: ../../source/development.rst:332 81eb5a47979e45e1a403831dbbabcbe7 +msgid "Open https://github.com/soxoj/maigret/releases/new again" +msgstr "再次打开 https://github.com/soxoj/maigret/releases/new" + +#: ../../source/development.rst:333 7412d2e589d64c79b20eacaf14fa07bf +msgid "Click `Choose a tag`" +msgstr "点击 `Choose a tag`" + +#: ../../source/development.rst:334 6e91e68c154b4c1d8157c61a97ff5d7d +msgid "Enter actual version in format `v0.4.0`" +msgstr "按 `v0.4.0` 格式输入当前实际版本号" + +#: ../../source/development.rst:335 5a897e547091472ca2c90a3b161636b5 +msgid "Also enter actual version in the field `Release title`" +msgstr "同时把当前版本号填入 `Release title` 字段" + +#: ../../source/development.rst:338 cf24140f06194486aae034fbddb360df +msgid "**Press \"Publish release\" button**" +msgstr "**点击 \"Publish release\" 按钮**" + +#: ../../source/development.rst:340 deaf36a198974e539944e6990b590696 +msgid "" +"That's all, now you can simply wait push to PyPi. You can monitor it in " +"Action page: https://github.com/soxoj/maigret/actions/workflows/python-" +"publish.yml" +msgstr "" +"就这些 —— 接下来只需等候推送到 PyPI。你可以在 Action " +"页面查看进度:https://github.com/soxoj/maigret/actions/workflows/python-" +"publish.yml" + +#: ../../source/development.rst:343 22387b8fc0c3412ba3857f37baf70a42 +msgid "Documentation updates" +msgstr "文档更新" + +#: ../../source/development.rst:345 1aaa7f96438642fd9ddb2e02b5443902 +msgid "" +"Documentations is auto-generated and auto-deployed from the ``docs`` " +"directory." +msgstr "文档由 ``docs`` 目录自动生成、自动部署。" + +#: ../../source/development.rst:347 e3a3ebf6f6bf4a9fb6138ccfcb679749 +msgid "To manually update documentation:" +msgstr "手动更新文档的步骤如下:" + +#: ../../source/development.rst:349 596f4b048d3d4aa29b9b2827d8558b4e +msgid "Change something in the ``.rst`` files in the ``docs/source`` directory." +msgstr "修改 ``docs/source`` 目录下的某个 ``.rst`` 文件。" + +#: ../../source/development.rst:350 e996ba7328c64a5da1f103ed333fdd44 +msgid "Install ``python -m pip install -e .`` in the docs directory." +msgstr "在 docs 目录下执行 ``python -m pip install -e .`` 进行安装。" + +#: ../../source/development.rst:351 cca444ddf50f4918ad763e26ef885da3 +msgid "Run ``make singlehtml`` in the terminal in the docs directory." +msgstr "在 docs 目录下的终端中运行 ``make singlehtml``\\ 。" + +#: ../../source/development.rst:352 c8eb08d4ce724355b00b939ae9f939f1 +msgid "Open ``build/singlehtml/index.html`` in your browser to see the result." +msgstr "在浏览器中打开 ``build/singlehtml/index.html`` 查看效果。" + +#: ../../source/development.rst:353 53e59f59429f47309b87b093254232dd +msgid "" +"If you edited any English ``.rst`` text (not just code blocks), refresh " +"the per-language translation catalogs — see *Translations* below. " +"Skipping this step lets the non-English builds silently fall back to " +"English on the changed strings." +msgstr "" +"如果你修改了任何英文 ``.rst`` 正文(而不只是代码块),请刷新各语言的翻译目录 —— 见下文 *翻译* " +"一节。跳过这一步会让非英语版本在被改动的字符串上静默回退到英文。" + +#: ../../source/development.rst:357 f5378c34027b46baaeebbab909969ef9 +msgid "If everything is ok, commit and push your changes to GitHub." +msgstr "如果一切正常,提交并把改动推到 GitHub。" + +#: ../../source/development.rst:360 6510a4468f054933a8d9924f72982cd2 +msgid "Translations" +msgstr "翻译" + +#: ../../source/development.rst:362 1554a378883f4d5789f449d02d3467fd +msgid "" +"The docs are translated via Sphinx's standard gettext workflow. English " +"``.rst`` files are the source of truth; translations live as ``.po`` " +"catalogs under ``docs/source/locale/<lang>/LC_MESSAGES/`` (currently only" +" ``zh_CN``)." +msgstr "" +"文档通过 Sphinx 的标准 gettext 工作流进行翻译。英文 ``.rst`` 文件是事实来源(source of truth);翻译以 " +"``.po`` 目录形式存放在 ``docs/source/locale/<lang>/LC_MESSAGES/`` 之下(目前只有 " +"``zh_CN``)。" + +#: ../../source/development.rst:366 92131512d2e146ebbc98e23c3fb2bb53 +msgid "" +"After editing any English ``.rst`` file, refresh the catalogs so existing" +" translations stay aligned with the new strings:" +msgstr "修改任何英文 ``.rst`` 文件后,请刷新一次翻译目录,使已有的翻译与新字符串保持对齐:" + +#: ../../source/development.rst:374 1c7355043753465688645b1bb155c4b9 +msgid "" +"This regenerates the ``.pot`` files via ``sphinx-build -b gettext`` and " +"runs ``sphinx-intl update`` to merge them into the per-language ``.po`` " +"files. New English strings appear with an empty ``msgstr \"\"``; changed " +"strings get a ``#, fuzzy`` marker that translators should review and re-" +"translate." +msgstr "" +"该命令会先通过 ``sphinx-build -b gettext`` 重新生成 ``.pot`` 文件,再用 ``sphinx-intl " +"update`` 把更新合并到各语言的 ``.po`` 文件中。新出现的英文字符串会以空的 ``msgstr \"\"`` " +"形式列出;发生变化的字符串则会被打上 ``#, fuzzy`` 标记,需要由译者复核并重新翻译。" + +#: ../../source/development.rst:379 82ffbecd97574c0d94650881519f5d4d +msgid "Preview a translated build locally:" +msgstr "在本地预览翻译后的构建:" + +#: ../../source/development.rst:387 f4739ddcbc55429db8596df4cc4934a8 +msgid "CJK escape-spaces gotcha" +msgstr "CJK 转义空格的坑" + +#: ../../source/development.rst:389 37020ea707964d3fb7c81d47c65d03cd +msgid "" +"reStructuredText inline markup (bold, inline code, hyperlinks) requires " +"whitespace or punctuation on both sides to close. In English this is " +"free: a space or full stop always follows. In Chinese / Japanese / Korean" +" translations the next character is often a CJK letter with no separator," +" and docutils then emits warnings like::" +msgstr "" +"reStructuredText " +"的内联标记(粗体、行内代码、超链接)要求两侧都有空白或标点才能正确闭合。英文里这是自然的:总会跟上一个空格或句点。但在中文 / 日文 / " +"韩文译文里,下一个字符常常是没有分隔符的 CJK 字符,docutils 就会发出如下警告::" + +#: ../../source/development.rst:398 1847d4a4585c4e8f8bed5bbe478c01c2 +msgid "" +"The fix is an explicit RST escape-space — a backslash followed by a space" +" — between the closing marker and the next CJK character. In the rendered" +" ``.rst`` this is written as ``\\<space>``; inside a ``.po`` ``msgstr`` " +"it must be written as ``\\\\<space>`` because the ``.po`` parser eats one" +" backslash level." +msgstr "" +"修复办法是在闭合标记与下一个 CJK 字符之间显式插入一个 RST 转义空格 —— 反斜杠加一个空格。在渲染后的 ``.rst`` 里写作 " +"``\\<space>``;在 ``.po`` 的 ``msgstr`` 内必须写作 ``\\\\<space>``,因为 ``.po`` " +"解析器会吃掉一层反斜杠。" + +#: ../../source/development.rst:414 e93cd2e469a047a0a8268153c48d5f27 +msgid "" +"The same rule applies after inline code before a CJK character, and after" +" a hyperlink before a CJK opening bracket — always insert " +"``\\\\<space>``. After editing any ``.po`` file, run ``make html-zh_CN``;" +" these warnings only surface at build time." +msgstr "" +"同样的规则也适用于行内代码后紧跟 CJK 字符的情况,以及超链接后紧跟 CJK 圆括号的情况 —— 一律插入 " +"``\\\\<space>``。修改任何 ``.po`` 文件后请运行 ``make html-zh_CN``;这类警告只会在构建阶段暴露。" + +#: ../../source/development.rst:419 c9cd812b6e284a129092e4480c826f3c +msgid "" +"To add a new language, run ``make intl-update LANG=<code>`` (e.g. ``ja``," +" ``de``, ``pt_BR``) — this scaffolds an empty catalog. Read the Docs " +"publishes each language as a separate project linked under the parent " +"(see the `Localization guide " +"<https://docs.readthedocs.com/platform/stable/localization.html>`_); a " +"maintainer needs to create the translation project once in the RTD admin " +"UI, set its language, and mark it as a translation of the main " +"``maigret`` project to enable the language switcher." +msgstr "" +"如需新增一种语言,执行 ``make intl-update LANG=<code>``(例如 " +"``ja``、``de``、``pt_BR``)即可生成一份空目录。Read the Docs " +"会把每种语言作为一个独立项目发布,并挂在父项目下(参见 `Localization 指南 " +"<https://docs.readthedocs.com/platform/stable/localization.html>`_);维护者需要在" +" RTD 管理界面中创建一次该翻译项目,设置其语言,并将其标记为主项目 ``maigret`` 的翻译版本,这样才能启用语言切换器。" + +#: ../../source/development.rst:428 dd4eeda6097c4332b63f623b692ad26d +msgid "Roadmap" +msgstr "路线图" + +#: ../../source/development.rst:431 32ee335744c04c81a2760fbcdc03fab1 +msgid "" +"This roadmap requires updating to reflect the current project status and " +"future plans." +msgstr "该路线图需要更新,以反映项目当前状态以及未来计划。" + +#~ msgid "" +#~ "The fix is an explicit RST " +#~ "escape-space — a backslash followed " +#~ "by a space (``\\\\ `` in the " +#~ "``.po`` source, ``\\ `` in the " +#~ "rendered RST) — between the closing " +#~ "marker and the next CJK character. " +#~ "Examples:" +#~ msgstr "" +#~ "修复办法是在闭合标记与下一个 CJK 字符之间显式插入一个 RST 转义空格 " +#~ "—— 反斜杠加一个空格(在 ``.po`` 源里写作 ``\\\\ " +#~ "``,渲染后的 RST 里写作 ``\\ ``)。示例:" + diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/faq.po b/docs/source/locale/zh_CN/LC_MESSAGES/faq.po new file mode 100644 index 0000000..9d66cac --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/faq.po @@ -0,0 +1,376 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-23 09:37+0200\n" +"PO-Revision-Date: 2026-05-23 09:30+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/faq.rst:4 e40cd7b2142f466fbf5f49c80433cbdb +msgid "FAQ" +msgstr "常见问题" + +#: ../../source/faq.rst:6 d5980e032ec54e73a6636bd6d8e88c8d +msgid "" +"Short answers to the questions users most often type into the docs " +"search. For deeper coverage each section links to the relevant page." +msgstr "针对用户在文档搜索中出现频率最高的问题给出简短回答。需要更深入的内容时,每个小节都会链接到对应的详细页面。" + +#: ../../source/faq.rst:10 4f7d8da7b4024ada94f6b494212b546c +msgid "Can I search by email address?" +msgstr "可以用邮箱地址进行搜索吗?" + +#: ../../source/faq.rst:12 eb6cb9de3d2240c886510c777c23911e +msgid "" +"**No.** Maigret only takes a username (or one of the :doc:`supported " +"identifier types <supported-identifier-types>`) as input — searching by " +"an email or mail address is out of scope. Looking up a mail address " +"requires different techniques (probing password-reset flows, registration" +" endpoints) and is the job of a separate class of tool." +msgstr "" +"**不可以。** Maigret 只接受用户名(或 :doc:`受支持的标识符类型 " +"<supported-identifier-types>` 之一)作为输入 —— 通过 email 或 mail 地址进行" +"搜索不在其能力范围内。查询邮箱地址需要另一类技术(探测密码重置流程、注册" +"端点),属于另一类工具的工作。" + +#: ../../source/faq.rst:19 74fe6aa4775b448fad555f57cdaddb0e +msgid "Recommended open-source tools for email lookup:" +msgstr "推荐用于邮箱查询的开源工具:" + +#: ../../source/faq.rst:21 3432ec400d1e431182c9299305cc0d87 +msgid "`mailcat <https://github.com/sharsil/mailcat>`_" +msgstr "`mailcat <https://github.com/sharsil/mailcat>`_" + +#: ../../source/faq.rst:22 c24f3826f52f41d68e1b85f64d5dfea4 +msgid "`holehe <https://github.com/megadose/holehe>`_" +msgstr "`holehe <https://github.com/megadose/holehe>`_" + +#: ../../source/faq.rst:23 896b565ff8e54e14baf3ffb73978cbaf +msgid "`user-scanner <https://github.com/kaifcodec/user-scanner>`_" +msgstr "`user-scanner <https://github.com/kaifcodec/user-scanner>`_" + +#: ../../source/faq.rst:25 cfe0c3f0de4a4369be5ca3cfaec25011 +msgid "Online services:" +msgstr "在线服务:" + +#: ../../source/faq.rst:27 0e76f0ed0a6841dc88475a7550952678 +msgid "`Noimosiny <https://noimosiny.com>`_" +msgstr "`Noimosiny <https://noimosiny.com>`_" + +#: ../../source/faq.rst:28 af71ec52140443739608101da59ad807 +msgid "`OSINT Industries <https://osint.industries>`_" +msgstr "`OSINT Industries <https://osint.industries>`_" + +#: ../../source/faq.rst:29 ae0c6b5a20b2455e8f98469eaa40c68e +msgid "`Epieos <https://epieos.com>`_" +msgstr "`Epieos <https://epieos.com>`_" + +#: ../../source/faq.rst:31 b877c79107cc4264a539ee43bfd9118b +msgid "" +"Note: if Maigret has already found an account for a username, it often " +"extracts the linked email from the profile page automatically — see :ref" +":`extracting-information-from-pages`." +msgstr "" +"注意:如果 Maigret 已经通过用户名找到了账号,它往往会自动从资料页中提取出关联的邮箱地址 —— 参见 :ref:`extracting-" +"information-from-pages`。" + +#: ../../source/faq.rst:36 eae13968aee54ce6b4b31536c8b403b7 +msgid "Can I configure a proxy / SOCKS / Tor / I2P?" +msgstr "可以配置代理 / SOCKS / Tor / I2P 吗?" + +#: ../../source/faq.rst:38 6e76c51d1261462e9a2843aada43ec07 +msgid "**Yes.** Three flags cover three distinct goals:" +msgstr "**可以。** 三个参数分别对应三种不同目标:" + +#: ../../source/faq.rst:40 8c234ba9cedc4f828ca4bd83cbe35a9f +msgid "" +"``--proxy URL`` — route **every** check through the given HTTP or SOCKS " +"proxy (also the right flag for routing the whole run through Tor with " +"``socks5://127.0.0.1:9050``, a residential proxy, or a corporate " +"gateway)." +msgstr "" +"``--proxy URL`` —— 让 **所有** 检查请求都通过指定的 HTTP 或 SOCKS 代理转发(如果想让整次运行都走 " +"Tor,使用 ``socks5://127.0.0.1:9050``;或者用于住宅代理、公司网关,也用这个参数)。" + +#: ../../source/faq.rst:44 01aac87b54df48dfaf6b215f45dde233 +msgid "" +"``--tor-proxy URL`` — used **only** for ``.onion`` sites in the database." +" Clearweb sites still go via your direct connection (or ``--proxy`` if " +"set)." +msgstr "" +"``--tor-proxy URL`` —— **只** 对数据库中 ``.onion`` 站点生效。明网站点仍走你的直连(或 " +"``--proxy``,如果你设置了的话)。" + +#: ../../source/faq.rst:47 7139f8e1fb5f48dbaedae73a219b7964 +msgid "``--i2p-proxy URL`` — same idea, only for ``.i2p`` hosts." +msgstr "``--i2p-proxy URL`` —— 同样的思路,只对 ``.i2p`` 域名生效。" + +#: ../../source/faq.rst:49 0e042a4962cd42b084483fb10bd5c81c +msgid "" +"The most common confusion is ``--proxy`` vs ``--tor-proxy``: ``--proxy`` " +"is \"everything through this gateway\", ``--tor-proxy`` is \"only onion " +"sites through Tor\"." +msgstr "" +"最常见的混淆是 ``--proxy`` 与 ``--tor-proxy`` 的区别:``--proxy`` 是\"所有流量走这个网关\",而 " +"``--tor-proxy`` 是\"只有 onion 站点走 Tor\"。" + +#: ../../source/faq.rst:53 d3b4785e4c9e4600bc6c12dd573d25c6 +msgid "" +"Full walkthrough (Tor Browser vs system ``tor`` port numbers, Tails OS, " +"timeout / retry tuning): :doc:`tor-and-proxies`." +msgstr "" +"完整说明(Tor Browser 与系统 ``tor`` 守护进程端口差异、Tails 系统、超时与重试调优)::doc:`tor-and-" +"proxies`。" + +#: ../../source/faq.rst:56 f9cf19afe2c443caa0effba4efa1f980 +msgid "" +"If your goal is actually \"bypass WAF blocks / fix 403 errors\", see the " +"*Sites fail / timeout / 403* section below — a residential proxy almost " +"always outperforms Tor or a VPN for that." +msgstr "" +"如果你的目标实际上是\"绕过 WAF 拦截 / 修复 403 错误\",请参见下文 *站点失败 / 超时 / 403* 一节 —— " +"对此场景,住宅代理几乎总是优于 Tor 或 VPN。" + +#: ../../source/faq.rst:61 d2d6f885aeea4ca088a589df8df26641 +msgid "Can I use a VPN with Maigret?" +msgstr "可以配合 VPN 使用 Maigret 吗?" + +#: ../../source/faq.rst:63 10108a9dbc4943e087a901f3cb2cefbc +msgid "" +"**Yes**, but ``--proxy`` is usually a better choice. A VPN works " +"transparently at the OS level — Maigret needs no special configuration to" +" use one. However:" +msgstr "" +"**可以**,但通常 ``--proxy`` 是更好的选择。VPN 在操作系统层透明工作 —— Maigret 不需要任何特殊配置就能用上 " +"VPN。不过:" + +#: ../../source/faq.rst:67 f2a5a564b66145ed806a4d69d70eb231 +msgid "" +"``--proxy`` is per-process: it does not affect other apps and does not " +"leak when toggled." +msgstr "``--proxy`` 是按进程生效的:不会影响其它应用,在切换时也不会泄露。" + +#: ../../source/faq.rst:69 f5c5e385abe0443b9b085ec37699e131 +msgid "" +"``--proxy`` makes the egress IP visible in logs, which is useful when " +"diagnosing why a batch of sites returned ``UNKNOWN``." +msgstr "``--proxy`` 会让出口 IP 出现在日志里,在排查为什么某批站点返回 ``UNKNOWN`` 时很有用。" + +#: ../../source/faq.rst:71 bf3de5bb7878478990cb7f6b6029ac19 +msgid "" +"``--proxy`` accepts a different value per run, so you can rotate between " +"residential and datacenter exits without touching system network " +"settings." +msgstr "``--proxy`` 每次运行都可以传入不同的值,因此可以在住宅出口和数据中心出口之间轮换,而不必动系统的网络设置。" + +#: ../../source/faq.rst:75 fcfb61d7f06f434e8095a2d92d88f45f +msgid "" +"If a lot of sites are returning 403, the cause is almost certainly that " +"the VPN exit IP is on a WAF blocklist (Cloudflare, DDoS-Guard, Akamai all" +" blanket-block common VPN ranges). A residential proxy via ``--proxy`` is" +" the usual fix — see the `\"Lots of sites fail / timeout / return 403\" " +"section <https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md" +"#lots-of-sites-fail--timeout--return-403>`_ in TROUBLESHOOTING.md." +msgstr "" +"如果很多站点都返回 403,原因几乎可以肯定是 VPN 出口 IP 在某个 WAF 黑名单上(Cloudflare、DDoS-" +"Guard、Akamai 都会对常见 VPN 网段做整体封锁)。通常的修复办法是通过 ``--proxy`` 使用住宅代理 —— 参见 " +"TROUBLESHOOTING.md 中的 `\"Lots of sites fail / timeout / return 403\" 章节 " +"<https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md#lots-of-" +"sites-fail--timeout--return-403>`_。" + +#: ../../source/faq.rst:84 60bdb99512fc49228e835d0860f91e8a +msgid "Does Maigret check domains via DNS?" +msgstr "Maigret 会通过 DNS 检查域名吗?" + +#: ../../source/faq.rst:86 4a265a61c38f498099a8c7b605d73942 +#, python-brace-format +msgid "" +"**Yes, experimentally.** With ``--with-domains`` Maigret resolves a small" +" set of ``{username}.<tld>`` patterns through DNS (A-records) in parallel" +" with the normal HTTP checks. The current set is ``.ddns.net``, ``.com``," +" ``.pro``, ``.me``, ``.biz``, ``.email``, ``.guru`` — 7 entries in the " +"database with ``protocol: dns``." +msgstr "" +"**可以,处于实验阶段。** 加上 ``--with-domains``,Maigret 会在执行普通 HTTP 检查的同时,通过 DNS(A " +"记录)解析一小组 ``{username}.<tld>`` 模式。当前包含的后缀有 ``.ddns.net``、\\ ``.com``、\\ " +"``.pro``、\\ ``.me``、\\ ``.biz``、\\ ``.email``、\\ ``.guru`` —— 数据库中共有 7 条 " +"``protocol: dns`` 的记录。" + +#: ../../source/faq.rst:96 20a9b14798984df78d034196fd4ecfe7 +msgid "" +"The flag is marked **experimental**: DNS-only checks can flag parking " +"domains and catch-all wildcards as if the username were registered, so " +"treat hits as a lead rather than confirmation." +msgstr "该参数被标记为 **实验性**:仅靠 DNS 的检查可能会把停放域名和通配符记录也识别为\"用户名已注册\",所以命中应当视为线索,而不是确认结果。" + +#: ../../source/faq.rst:100 9448f73809274579befe33918ad996bb +msgid "" +"If your task is wider DNS reconnaissance — subdomain enumeration, WHOIS " +"history, typo-squatting — Maigret is the wrong tool. Established " +"alternatives:" +msgstr "如果你的任务是更广义的 DNS 侦察 —— 子域名枚举、WHOIS 历史、相似域名 —— 那么 Maigret 不是合适的工具。常用替代方案如下:" + +#: ../../source/faq.rst:104 0ac035429e394a33939ca5a86ff608c4 +msgid "" +"`dnstwist <https://github.com/elceef/dnstwist>`_ — typo-squatting and " +"look-alike domains." +msgstr "`dnstwist <https://github.com/elceef/dnstwist>`_ —— 用于发现拼写错误抢注与相似域名。" + +#: ../../source/faq.rst:106 e476d2783f9847a7b911a3ea70c941b4 +msgid "" +"`amass <https://github.com/owasp-amass/amass>`_ / `subfinder " +"<https://github.com/projectdiscovery/subfinder>`_ — subdomain " +"enumeration." +msgstr "" +"`amass <https://github.com/owasp-amass/amass>`_ / `subfinder " +"<https://github.com/projectdiscovery/subfinder>`_ —— 子域名枚举。" + +#: ../../source/faq.rst:109 41f9b96fe0a54d7e87118f27ffa22385 +msgid "" +"`theHarvester <https://github.com/laramies/theHarvester>`_ — email / host" +" / subdomain harvesting by domain." +msgstr "" +"`theHarvester <https://github.com/laramies/theHarvester>`_ —— 按域名收集邮箱 / " +"主机 / 子域名信息。" + +#: ../../source/faq.rst:113 714faff2c1b344fba86dacbd49bd9805 +msgid "Is there a Maigret Telegram bot?" +msgstr "有 Maigret 的 Telegram 机器人吗?" + +#: ../../source/faq.rst:115 0d1fc1eac9f847c2806efabc79f3f601 +msgid "" +"**Yes.** A community-maintained bot lets you run Maigret without " +"installing anything locally:" +msgstr "**有。** 社区维护的一个 Telegram 机器人让你无需在本地安装就能运行 Maigret:" + +#: ../../source/faq.rst:118 21e6de736cc84ffc85818194eacd5f0b +msgid "" +"Working instance: `sites.google.com/view/maigret-bot-link " +"<https://sites.google.com/view/maigret-bot-link>`_ (redirect — the hosted" +" bot may move between providers)." +msgstr "" +"在线实例:`sites.google.com/view/maigret-bot-link " +"<https://sites.google.com/view/maigret-bot-link>`_\\ (跳转链接 —— " +"托管实例可能会在不同服务商之间迁移)。" + +#: ../../source/faq.rst:121 2c720ea08a8a49c28db091f66d631991 +msgid "" +"Source code: `github.com/soxoj/maigret-tg-bot <https://github.com/soxoj" +"/maigret-tg-bot>`_." +msgstr "" +"源代码:`github.com/soxoj/maigret-tg-bot <https://github.com/soxoj/maigret-" +"tg-bot>`_。" + +#: ../../source/faq.rst:124 f90e3de745a5439ca62e76bdcd50721b +msgid "" +"On the question of *searching Telegram itself*: Maigret checks whether a " +"``t.me/<user>`` page exists as part of the normal run, but it does not " +"parse channels, posts, members, or message contents. For Telegram content" +" OSINT you need a dedicated tool." +msgstr "" +"关于*搜索 Telegram 本身*这个问题:Maigret 在常规扫描中会检查 ``t.me/<user>`` " +"页面是否存在,但不会解析频道、帖子、成员或消息内容。如需对 Telegram 内容进行OSINT 调查,需要使用专门的工具。" + +#: ../../source/faq.rst:130 ff8d899b55ad4981878d800059744c37 +msgid "Where is the web interface?" +msgstr "Web 界面在哪里?" + +#: ../../source/faq.rst:136 92c24ac940b246d6b83a1bb9e994bd99 +msgid "" +"Then open http://127.0.0.1:5000. Screenshots and a full walkthrough are " +"in :ref:`web-interface`." +msgstr "然后在浏览器中打开 http://127.0.0.1:5000。截图和完整说明见 :ref:`web-interface`。" + +#: ../../source/faq.rst:140 5f9121c254c74f99871615b9e560d30f +msgid "Sites fail / timeout / return 403 — connection failures" +msgstr "站点失败 / 超时 / 返回 403 —— 连接失败 (connection failure)" + +#: ../../source/faq.rst:142 d58c22a1e28f4bf8b6ce44ae4f23d9b4 +msgid "" +"This is the most common report and is almost always caused by anti-bot " +"protection (Cloudflare, DDoS-Guard, Akamai) or a slow link, not by a bug " +"in Maigret. Quick tweaks, in order:" +msgstr "" +"这是被反映得最多的问题,几乎总是由反机器人防护(Cloudflare、DDoS-Guard、Akamai)或缓慢的网络链路引起的,而不是 " +"Maigret 的 bug。可按下面的顺序逐步调整:" + +#: ../../source/faq.rst:146 deef74a8e0b742028aa031a6e21b7cd5 +msgid "" +"``--timeout 60`` — the default 30 s is tight for slow networks and for " +"Tor." +msgstr "``--timeout 60`` —— 在慢速网络和 Tor 环境下,默认 30 秒往往太紧。" + +#: ../../source/faq.rst:148 3040ea861ee64362af875c54e26f2f52 +msgid "``--retries 2`` — covers transient failures." +msgstr "``--retries 2`` —— 覆盖偶发性失败。" + +#: ../../source/faq.rst:149 9f77e97c68e4455b9b1191914871e81c +msgid "``-n 20`` — lower concurrency reduces WAF rate-limiting." +msgstr "``-n 20`` —— 降低并发可以减少 WAF 的速率限制。" + +#: ../../source/faq.rst:150 22857912134d407e975e8c35506c6e51 +msgid "" +"``--proxy http://user:pass@residential-proxy:port`` — datacenter IPs " +"(AWS, GCP, DigitalOcean) and most VPN ranges are blanket-blocked; " +"residential / mobile exits usually fix the bulk of 403s." +msgstr "" +"``--proxy http://user:pass@residential-proxy:port`` —— 数据中心 " +"IP(AWS、GCP、DigitalOcean)以及大多数 VPN 网段都被整体封锁;住宅 / 移动出口通常能解决大部分 403。" + +#: ../../source/faq.rst:154 a35607cae3e44d2f9a45c559af21994d +msgid "" +"The full troubleshooting matrix (per-error recipes for 403, timeout, SSL," +" captcha, ``UNKNOWN`` floods) lives in `TROUBLESHOOTING.md " +"<https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md>`_." +msgstr "" +"完整的故障排查矩阵(针对 403、超时、SSL、验证码、大量 ``UNKNOWN`` 等各类错误的处理办法)见 " +"`TROUBLESHOOTING.md " +"<https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md>`_。" + +#: ../../source/faq.rst:160 6cb6194574c84ee989588bd042af2717 +msgid "How do I generate a PDF report?" +msgstr "如何生成 PDF 报告?" + +#: ../../source/faq.rst:162 c78fb658396542ecb0def972847707e5 +msgid "" +"PDF support is an optional extra because it pulls heavy graphics " +"dependencies:" +msgstr "PDF 支持是一个可选附加项,因为它会引入较重的图形库依赖:" + +#: ../../source/faq.rst:170 db7268f5192b4a128ba05c0a8521e70b +msgid "" +"On Linux / macOS you also need system libraries (Pango, Cairo, GDK-" +"PixBuf). Per-OS install steps are in the *Optional: PDF reports* section " +"of :doc:`installation`." +msgstr "" +"在 Linux / macOS 上还需要安装系统级图形库(Pango、Cairo、GDK-PixBuf)。各操作系统的安装步骤见 " +":doc:`installation` 中 *Optional: PDF reports* 一节。" + +#: ../../source/faq.rst:174 dedfb921abb6432d95ce8379721a615a +msgid "" +"For other report formats (``--html``, ``--md``, ``--json``, ``--csv``, " +"``--txt``, ``--xmind``), see :doc:`command-line-options`." +msgstr "" +"其它报告格式(``--html``、\\ ``--md``、\\ ``--json``、\\ ``--csv``、\\ ``--txt``、\\ " +"``--xmind``)见 :doc:`command-line-options`。" + +#~ msgid "" +#~ "`holehe <https://github.com/megadose/holehe>`_ — " +#~ "checks whether an email is registered" +#~ " on ~120 sites by probing their " +#~ "password-reset endpoints." +#~ msgstr "" +#~ "`holehe <https://github.com/megadose/holehe>`_ —— " +#~ "通过探测各站点的密码重置端点,检测某个邮箱是否在约 120 个网站上注册过。" + diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/features.po b/docs/source/locale/zh_CN/LC_MESSAGES/features.po new file mode 100644 index 0000000..649da96 --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/features.po @@ -0,0 +1,557 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-25 18:02+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/features.rst:4 eca41ada7a9f4545800a2d110503a14a +msgid "Features" +msgstr "特性" + +#: ../../source/features.rst:6 b24b658bc3bd4954af7bd8307d12dd42 +msgid "This is the list of Maigret features." +msgstr "以下是 Maigret 的特性列表。" + +#: ../../source/features.rst:11 8d83920098174365a4969a42ba7ceac6 +msgid "Web Interface" +msgstr "Web 界面" + +#: ../../source/features.rst:13 5957db1bd94f4d7ab214b92c06d67e73 +msgid "" +"You can run Maigret with a web interface, where you can view the graph " +"with results and download reports of all formats on a single page." +msgstr "你可以以 Web 界面的方式运行 Maigret —— 在同一个页面里查看结果图谱、并下载所有格式的报告。" + +#: ../../source/features.rst:16 7631566c1cfd402b80ba138921568711 +msgid "Web interface: how to start" +msgstr "Web 界面:启动页" + +#: ../../source/features.rst:20 deda308a1ecb4354a06c77ae44d74f64 +msgid "Web interface: results" +msgstr "Web 界面:结果页" + +#: ../../source/features.rst:24 035b97ee389442efa904d58e7675819d +msgid "Instructions:" +msgstr "使用步骤:" + +#: ../../source/features.rst:26 7d8d5e3519cd45f8996e3901d59b4745 +msgid "Run Maigret with the ``--web`` flag and specify the port number." +msgstr "使用 ``--web`` 参数运行 Maigret,并指定端口号。" + +#: ../../source/features.rst:32 f99c4e96a1794fdebbca1eb8de276e7e +msgid "" +"Open http://127.0.0.1:5000 in your browser and enter one or more " +"usernames to make a search." +msgstr "在浏览器中打开 http://127.0.0.1:5000,输入一个或多个用户名以发起搜索。" + +#: ../../source/features.rst:34 d7e33c3780724f95bf553821485840b8 +msgid "" +"Wait a bit for the search to complete and view the graph with results, " +"the table with all accounts found, and download reports of all formats." +msgstr "稍等片刻搜索完成后,即可查看结果图谱、列出全部已发现账号的表格,并下载所有格式的报告。" + +#: ../../source/features.rst:39 20f45c4b369b419e883745ee1d31152f +msgid "Telegram bot" +msgstr "Telegram 机器人" + +#: ../../source/features.rst:41 06eb5827613b479583d051a01176b920 +msgid "" +"A community-maintained Telegram bot lets you run Maigret without " +"installing anything locally." +msgstr "社区维护的一个 Telegram 机器人让你无需在本地安装就能运行 Maigret。" + +#: ../../source/features.rst:44 7465f025cb9141fbb92af0576662eccc +msgid "" +"Working instance: `sites.google.com/view/maigret-bot-link " +"<https://sites.google.com/view/maigret-bot-link>`_ (redirect — the hosted" +" bot may move between providers)." +msgstr "" +"在线实例:`sites.google.com/view/maigret-bot-link " +"<https://sites.google.com/view/maigret-bot-link>`_\\ (跳转链接 —— " +"托管实例可能会在不同服务商之间迁移)。" + +#: ../../source/features.rst:47 eb79c93a7e8b4de4a207568ffdd52b35 +msgid "" +"Source code: `github.com/soxoj/maigret-tg-bot <https://github.com/soxoj" +"/maigret-tg-bot>`_." +msgstr "" +"源代码:`github.com/soxoj/maigret-tg-bot <https://github.com/soxoj/maigret-" +"tg-bot>`_。" + +#: ../../source/features.rst:51 f83b69f1fcba4abeb66a12a711d151f1 +msgid "Personal info gathering" +msgstr "个人信息收集" + +#: ../../source/features.rst:53 2913acff61f8466e80dc03285b75c54b +msgid "" +"Maigret does the `parsing of accounts webpages and extraction " +"<https://github.com/soxoj/socid-extractor>`_ of personal info, links to " +"other profiles, etc. Extracted info displayed as an additional result in " +"CLI output and as tables in HTML and PDF reports. Also, Maigret use found" +" ids and usernames from links to start a recursive search." +msgstr "" +"Maigret 会\\ `解析账号网页并抽取 <https://github.com/soxoj/socid-extractor>`_ " +"个人信息、指向其它主页的链接等内容。抽取结果会以附加信息的形式出现在 CLI 输出中,并在 HTML 和 PDF " +"报告中以表格呈现。此外,Maigret 还会用从链接中发现的 ID 和用户名,启动递归搜索。" + +#: ../../source/features.rst:57 774c604cfa0d48ac83687ae40bfb8098 +msgid "Enabled by default, can be disabled with ``--no extracting``." +msgstr "默认启用,可通过 ``--no extracting`` 关闭。" + +#: ../../source/features.rst:83 3e586217eafe436fbd566dc44751ae72 +msgid "Recursive search" +msgstr "递归搜索" + +#: ../../source/features.rst:85 98a5a5561deb463ca15440072947bd04 +msgid "" +"Maigret has the ability to scan account pages for :ref:`common " +"identifiers <supported-identifier-types>` and usernames found in links. " +"When people include links to their other social media accounts, Maigret " +"can automatically detect and initiate new searches for those profiles. " +"Any information discovered through this process will be shown in both the" +" command-line interface output and generated reports." +msgstr "" +"Maigret 能在账号页面中扫描 :ref:`常见标识符 <supported-identifier-types>` " +"和链接中出现的用户名。当用户在主页里贴出指向其它社交账号的链接时,Maigret " +"会自动识别并对这些账号发起新的搜索。在此过程中发现的全部信息,都会同时显示在命令行输出和生成的报告中。" + +#: ../../source/features.rst:89 305f7071bf074687aaca8511531ea186 +msgid "Enabled by default, can be disabled with ``--no-recursion``." +msgstr "默认启用,可通过 ``--no-recursion`` 关闭。" + +#: ../../source/features.rst:122 a1ec13a8b3fc4091a9d9aad8fc4536e2 +msgid "Username permutations" +msgstr "用户名变体生成" + +#: ../../source/features.rst:124 e4c00d35553049a9b73c4203e77df5f2 +msgid "" +"Maigret can generate permutations of usernames. Just pass a few usernames" +" in the CLI and use ``--permute`` flag. Thanks to `@balestek " +"<https://github.com/balestek>`_ for the idea and implementation." +msgstr "" +"Maigret 可以生成用户名的各种变体组合。只需在命令行传入几个用户名并加上 ``--permute`` 参数即可。感谢 `@balestek " +"<https://github.com/balestek>`_ 提供的想法和实现。" + +#: ../../source/features.rst:149 9dad12744e69420aa749fcf646f5fc8f +msgid "Reports" +msgstr "报告" + +#: ../../source/features.rst:151 e70802a82a1f4c7d978558399b52c3ed +msgid "" +"Maigret currently supports HTML, PDF, TXT, XMind 8 mindmap, and JSON " +"reports." +msgstr "Maigret 目前支持 HTML、PDF、TXT、XMind 8 思维导图和 JSON 等格式的报告。" + +#: ../../source/features.rst:153 f81c37a3ae254c37a69c1e8fad6a3fa0 +msgid "HTML/PDF reports contain:" +msgstr "HTML / PDF 报告包含以下内容:" + +#: ../../source/features.rst:155 4c8b2dab41734e20b0266c76890bcd89 +msgid "profile photo" +msgstr "头像" + +#: ../../source/features.rst:156 c642caf9ffcf4136ae84e93354e19313 +msgid "all the gathered personal info" +msgstr "已收集到的全部个人信息" + +#: ../../source/features.rst:157 9744f896e29f47a09724faa36f4f126b +msgid "" +"additional information about supposed personal data (full name, gender, " +"location), resulting from statistics of all found accounts" +msgstr "基于所有已发现账号的统计,推测出的额外个人数据(真实姓名、性别、所在地)" + +#: ../../source/features.rst:159 cdfdc97558fa4c278e462f6bcf9c2fd1 +msgid "" +"Also, there is a short text report in the CLI output after the end of a " +"searching phase." +msgstr "此外,在搜索结束后,CLI 输出中也会附上一份简短的文本报告。" + +#: ../../source/features.rst:162 1389dbc9efba49b499252807bb1eb12b +msgid "XMind 8 mindmaps are incompatible with XMind 2022!" +msgstr "XMind 8 思维导图与 XMind 2022 不兼容!" + +#: ../../source/features.rst:165 7855ecf44a5a4139ac24cfac44f659ff +msgid "AI analysis" +msgstr "AI 分析" + +#: ../../source/features.rst:167 a7bc7ddbf02841a7acf6773a6aec39b5 +msgid "" +"Maigret can produce a short, human-readable investigation summary on top " +"of the raw search results using the ``--ai`` flag. It builds the internal" +" Markdown report, sends it to an OpenAI-compatible chat completion " +"endpoint, and streams the model's reply directly to the terminal." +msgstr "" +"通过 ``--ai`` 参数,Maigret 可以基于原始搜索结果生成一份简短、易读的调查摘要。它会先构建一份内部 Markdown " +"报告,将其发送至一个 OpenAI 兼容的 chat completion 接口,并把模型的回复以流式方式直接输出到终端。" + +#: ../../source/features.rst:178 47a99e86b6ae4a1588e09ef7fd44ea0c +msgid "" +"The summary uses a fixed format with the most likely real name, location," +" occupation, interests, languages, main website, username variants, " +"number of platforms, active years, a confidence rating, and a short list " +"of follow-up leads. While ``--ai`` is active, per-site progress and the " +"short text report are suppressed so the streamed summary is the main " +"output." +msgstr "" +"该摘要采用固定格式,包含最可能的真实姓名、所在地、职业、兴趣、语言、主要使用的网站、用户名变体、出现过的平台数量、活跃年份、置信度评级,以及一份简短的后续线索清单。\\" +" ``--ai`` 启用期间,逐站点进度和简短文本报告都会被抑制,以让这份流式摘要成为主要输出。" + +#: ../../source/features.rst:185 85733bb1fa11414dba02e6f0627cb59e +msgid "" +"The endpoint, model, and API key are configured via ``settings.json`` " +"(``openai_api_key``, ``openai_model``, ``openai_api_base_url``) or the " +"``OPENAI_API_KEY`` environment variable. Any OpenAI-compatible API can be" +" used (Azure OpenAI, OpenRouter, a local server, …). See :ref:`ai-" +"analysis` and :ref:`settings` for details." +msgstr "" +"接口地址、模型名和 API key 可通过 ``settings.json``\\ (对应字段 ``openai_api_key``\\ 、\\ " +"``openai_model``\\ 、\\ ``openai_api_base_url``)或 ``OPENAI_API_KEY`` " +"环境变量进行配置。可使用任意 OpenAI 兼容接口(Azure OpenAI、OpenRouter、本地推理服务等)。详情参见 :ref" +":`ai-analysis` 与 :ref:`settings`\\ 。" + +#: ../../source/features.rst:192 8bba3181c9ec4009badf240909ff5ba2 +msgid "Tags" +msgstr "标签" + +#: ../../source/features.rst:194 ac119f2a446745e19e1e0fc51f4ca717 +msgid "" +"The Maigret sites database very big (and will be bigger), and it is maybe" +" an overhead to run a search for all the sites. Also, it is often hard to" +" understand, what sites more interesting for us in the case of a certain " +"person." +msgstr "" +"Maigret " +"的站点数据库已经很庞大(并且还会继续扩张),对所有站点都跑一遍搜索未必划算。同时,在调查某个具体人物时,也不容易判断哪些站点更值得关注。" + +#: ../../source/features.rst:197 c159b2fb30c0405d83ac51d2f7501c02 +msgid "" +"Tags markup allows selecting a subset of sites by interests (photo, " +"messaging, finance, etc.) or by country. Tags of found accounts grouped " +"and displayed in the reports." +msgstr "标签体系允许按兴趣(摄影、即时通讯、金融等)或国家挑选站点子集。已发现账号上的标签会被分组,并显示在报告中。" + +#: ../../source/features.rst:199 ed4a4e7541064e3687afe3712d64d77d +msgid "See full description :doc:`in the Tags Wiki page <tags>`." +msgstr "完整说明请参见 :doc:`标签页 <tags>`\\ 。" + +#: ../../source/features.rst:202 96dc25e63f79489ba87542fdedd8123f +msgid "Censorship and captcha detection" +msgstr "审查和 CAPTCHA 检测" + +#: ../../source/features.rst:204 c05b9f998478422b9c480a2191f383dd +#, python-format +msgid "" +"Maigret can detect common errors such as censorship stub pages, " +"CloudFlare captcha pages, and others. If you get more them 3% errors of a" +" certain type in a session, you've got a warning message in the CLI " +"output with recommendations to improve performance and avoid problems." +msgstr "" +"Maigret 能够识别一些常见错误,例如审查占位页、CloudFlare 验证码页等等。如果在一次会话中某类错误超过了 3%,CLI " +"输出里就会打印一条警告,并附上用于改善表现、规避问题的建议。" + +#: ../../source/features.rst:208 ad8458e0de4a4b019049b57af0ee2460 +msgid "Retries" +msgstr "重试" + +#: ../../source/features.rst:210 64853719d00a4542a5a3c4e33e5fda82 +msgid "" +"Maigret will do retries of the requests with temporary errors got " +"(connection failures, proxy errors, etc.)." +msgstr "对于遇到临时性错误(连接失败、代理错误等)的请求,Maigret 会进行重试。" + +#: ../../source/features.rst:212 712591ee78254a809879ad313f69220f +msgid "One attempt by default, can be changed with option ``--retries N``." +msgstr "默认尝试一次,可通过 ``--retries N`` 参数调整。" + +#: ../../source/features.rst:215 e20338540d6847bda34963bb81d8db8f +msgid "Database self-check" +msgstr "数据库自检" + +#: ../../source/features.rst:217 37eb44c6abd440708fbbbd72785d0d9d +msgid "" +"Maigret includes a self-check mode (``--self-check``) that validates " +"every site in the database by looking up its known-claimed and known-" +"unclaimed usernames and verifying that the detection results match " +"expectations." +msgstr "" +"Maigret 内置了一个自检模式(``--self-" +"check``),它会针对数据库中每个站点,分别查询已知被占用和已知未被占用的用户名,并验证检测结果是否符合预期。" + +#: ../../source/features.rst:221 d1e875423487428381e6bc8fa17867bd +msgid "" +"The self-check is **error-resilient**: if an individual site check raises" +" an unexpected exception (e.g. a network error or a parsing failure), the" +" error is caught, logged, and recorded as an issue — the remaining sites " +"continue to be checked without interruption. This means the process " +"always runs to completion, even when checking hundreds of sites with ``-a" +" --self-check``." +msgstr "" +"自检过程是\\ " +"**容错的**:如果某个站点的检查抛出意外异常(例如网络错误或解析失败),该错误会被捕获并记录为一个问题项,而其余站点会继续被检查,不会被中断。因此,即便使用" +" ``-a --self-check`` 检查上百个站点,该流程也总能顺利跑完。" + +#: ../../source/features.rst:227 d75031d71d3941528aa337fbf56cbc8d +msgid "" +"Use ``--auto-disable`` together with ``--self-check`` to automatically " +"disable sites that fail checks. Without it, issues are only reported. Use" +" ``--diagnose`` to print detailed per-site diagnosis including the check " +"type, specific issues, and recommendations." +msgstr "" +"配合 ``--self-check`` 使用 ``--auto-disable`` " +"可以把检查失败的站点自动禁用;不加该参数时,问题项只会被报告出来,而不会真正禁用。使用 ``--diagnose`` " +"则可以打印每个站点的详细诊断信息,包括检查类型、具体问题和修复建议。" + +#: ../../source/features.rst:244 97ad227189b34c2b8e80b9055dd0f48e +msgid "Archives and mirrors checking" +msgstr "归档站与镜像站检查" + +#: ../../source/features.rst:246 cab6bb0dc9e34379ae002ec46981c079 +msgid "" +"The Maigret database contains not only the original websites, but also " +"mirrors, archives, and aggregators. For example:" +msgstr "Maigret 数据库中不仅包含原始网站,还包含镜像、归档和聚合站点。例如:" + +#: ../../source/features.rst:248 500d9a939ca14b2a981b1c9435cdcd73 +msgid "`Picuki <https://www.picuki.com/>`_, Instagram mirror" +msgstr "`Picuki <https://www.picuki.com/>`_,Instagram 镜像" + +#: ../../source/features.rst:249 53f6db7eb7044cf294720e6239282686 +msgid "" +"(no longer available) `Reddit BigData search <https://camas.github.io" +"/reddit-search/>`_" +msgstr "" +"(已不再可用)\\ `Reddit BigData search <https://camas.github.io/reddit-" +"search/>`_" + +#: ../../source/features.rst:250 60124ff7e1e244d79c62846abb0cabbe +msgid "(no longer available) `Twitter shadowban <https://shadowban.eu/>`_ checker" +msgstr "(已不再可用)\\ `Twitter shadowban <https://shadowban.eu/>`_ 检查器" + +#: ../../source/features.rst:252 44ebab596acb41229bbe2ea989503b85 +msgid "" +"It allows getting additional info about the person and checking the " +"existence of the account even if the main site is unavailable (bot " +"protection, captcha, etc.)" +msgstr "通过这些站点,可以获取关于目标人物的额外信息;即便主站点不可用(机器人防护、CAPTCHA 等),也仍能验证账号是否存在。" + +#: ../../source/features.rst:257 ff0ab7835ec44e148d82397581bb4290 +msgid "Cloudflare webgate bypass" +msgstr "Cloudflare webgate 绕过" + +#: ../../source/features.rst:261 99737687941844dfae996c262a4b1a85 +msgid "" +"**Experimental feature.** The Cloudflare webgate is under active " +"development. The configuration schema, CLI flag behaviour, and the set of" +" sites that route through it may change without backwards-compatibility " +"guarantees. Expect rough edges (CF rate limits, occasional solver " +"failures) and report issues so they can be ironed out." +msgstr "" +"**实验性特性。** Cloudflare webgate 正处于积极开发阶段。配置项、CLI " +"参数行为以及经由其路由的站点集合都可能发生变化,不保证向后兼容。你可能会遇到一些不完善之处(CF 限速、求解器偶尔失败等),欢迎反馈以便逐步打磨。" + +#: ../../source/features.rst:267 d67e2b25a2544422861e89866939e627 +msgid "" +"Some sites sit behind a full Cloudflare JavaScript challenge or a CF " +"firewall hard block — these are tagged ``protection: " +"[\"cf_js_challenge\"]`` or ``protection: [\"cf_firewall\"]`` in the " +"database and are normally kept disabled because neither aiohttp nor " +"curl_cffi can solve the JS challenge on their own." +msgstr "" +"部分站点位于完整的 Cloudflare JavaScript 挑战或 CF 防火墙硬封锁之后 —— 它们在数据库中被打上 " +"``protection: [\"cf_js_challenge\"]`` 或 ``protection: [\"cf_firewall\"]``" +" 标记,并通常被禁用,因为 aiohttp 和 curl_cffi 都无法自行解出 JS 挑战。" + +#: ../../source/features.rst:272 887722f5e6c9401fb789e6ada2e62b2c +msgid "" +"Maigret can offload these checks to a local Chrome-based solver. Two " +"backends are supported, configured in ``settings.json`` under " +"``cloudflare_bypass.modules`` (the first reachable module wins; " +"subsequent ones are tried as a fallback chain):" +msgstr "" +"Maigret 可以把这类检查转交给本地的 Chrome 类求解器。目前支持两种后端,通过 ``settings.json`` 中的 " +"``cloudflare_bypass.modules`` 配置(第一个能连通的模块生效,后续模块作为兜底链依次尝试):" + +#: ../../source/features.rst:277 603de15a7c18429a94037f714af3e69f +msgid "" +"**FlareSolverr** (recommended). Runs a real Chrome instance and exposes a" +" JSON API. The upstream HTTP status, headers and final URL are preserved," +" so ``checkType: status_code`` and ``checkType: response_url`` keep " +"working through the bypass." +msgstr "" +"**FlareSolverr**\\ (推荐)。运行一个真实的 Chrome 实例,并暴露 JSON API。上游真实的 HTTP " +"状态码、响应头和最终 URL 都会被保留,因此 ``checkType: status_code`` 和 ``checkType: " +"response_url`` 在绕过模式下依然能正常工作。" + +#: ../../source/features.rst:286 54d61596bbce43e8a82cb1141379a276 +msgid "" +"**CloudflareBypassForScraping** (legacy fallback). Returns rendered HTML " +"only, so the upstream status code is lost — ``checkType: message`` keeps " +"working but ``status_code`` checks misfire (treated as 200 on success)." +msgstr "" +"**CloudflareBypassForScraping**\\ (旧版兜底)。只返回渲染后的 HTML,因此上游真实状态码会丢失 —— " +"``checkType: message`` 仍然可用,但 ``status_code`` 类检查会失准(成功时会被视为 200)。" + +#: ../../source/features.rst:290 d6f5bd6b3ac043e1a9153827b0492c00 +msgid "Activate the bypass either with the CLI flag::" +msgstr "启用绕过有两种方式,一是命令行参数::" + +#: ../../source/features.rst:294 8a9237637b414665bc1a30722539d650 +msgid "" +"or by setting ``cloudflare_bypass.enabled`` to ``true`` in " +"``settings.json``. The web UI (``python -m maigret.web.app``) reads the " +"same setting — there is no separate toggle in the form, so flipping " +"``enabled`` is what activates the bypass for browser-driven runs." +msgstr "" +"或在 ``settings.json`` 中将 ``cloudflare_bypass.enabled`` 设为 ``true``。" +"Web 界面(``python -m maigret.web.app``)读取的是同一份配置 —— 表单中" +"没有单独的开关,因此切换 ``enabled`` 就是浏览器场景下启用绕过的唯一方式。" + +#: ../../source/features.rst:299 8cd7c8ef31e845cfa7bef77caa8b4a47 +msgid "" +"The bypass only fires for sites whose ``protection`` field intersects " +"``cloudflare_bypass.trigger_protection`` (default ``[\"cf_js_challenge\"," +" \"cf_firewall\", \"webgate\"]``); all other sites use the normal aiohttp" +" / curl_cffi path." +msgstr "" +"该绕过只对 ``protection`` 字段与 ``cloudflare_bypass.trigger_protection``" +"\\ (默认 ``[\"cf_js_challenge\", \"cf_firewall\", \"webgate\"]``)有交集" +"的站点生效;其它站点仍走常规的 aiohttp / curl_cffi 路径。" + +#: ../../source/features.rst:304 98d59ab2376c44fc89adf426a612366d +msgid "" +"If all configured modules are unreachable, affected sites get an UNKNOWN " +"status with an actionable error pointing at the first module's URL — the " +"fix is almost always to start the FlareSolverr container." +msgstr "" +"如果所有配置的模块都不可达,受影响的站点会被标记为 UNKNOWN,并附上一条可操作的错误信息,指向首个模块的 URL —— " +"绝大多数情况下,只需把 FlareSolverr 容器跑起来就能解决。" + +#: ../../source/features.rst:308 2ee4a6ee33f847ce87472cd442bcd18e +msgid "" +"FlareSolverr session reuse is automatic: Maigret pins a single ``session:" +" <session_prefix>-<pid>`` per run, so cf_clearance cookies are shared " +"between checks of the same domain (5–10× faster on subsequent requests to" +" that host)." +msgstr "" +"FlareSolverr 的 session 复用是自动的:Maigret 会在每次运行时固定一个 ``session: " +"<session_prefix>-<pid>``,这样对同一域名的多次检查就会共享 cf_clearance cookie(后续对该主机的请求会快" +" 5–10 倍)。" + +#: ../../source/features.rst:314 3f43bfb6c70e48e285a7cc862d7988e6 +msgid "Activation" +msgstr "激活机制" + +#: ../../source/features.rst:315 f3fbc5aaaadc475cb27e6050ed392c72 +msgid "" +"The activation mechanism helps make requests to sites requiring " +"additional authentication like cookies, JWT tokens, or custom headers." +msgstr "激活机制用于向那些需要额外认证(cookie、JWT token、自定义请求头等)的站点发起请求。" + +#: ../../source/features.rst:317 8904ac193b06468aa8c2a0eac03387f0 +msgid "It works by implementing a custom function that:" +msgstr "其实现方式是通过一个自定义函数,完成以下三步:" + +#: ../../source/features.rst:319 9ff5a4ab39284a55aed726ed75aebe6e +msgid "Makes a specialized HTTP request to a specific website endpoint" +msgstr "向某个特定网站端点发起一个专门的 HTTP 请求" + +#: ../../source/features.rst:320 c96edc4ff8654074b71ce45af7fa84c1 +msgid "Processes the response" +msgstr "处理响应内容" + +#: ../../source/features.rst:321 418b7eb1dd824175b3fad35d3ea9d33c +msgid "Updates the headers/cookies for that site in the local Maigret database" +msgstr "在本地 Maigret 数据库中更新该站点对应的请求头/cookie" + +#: ../../source/features.rst:323 30f2c88b051546539456ce0c98957a82 +msgid "" +"Since activation only triggers after encountering specific errors, a " +"retry (or another Maigret run) is needed to obtain a valid response with " +"the updated authentication." +msgstr "由于激活只在遇到特定错误后才会触发,因此要拿到使用新认证信息的有效响应,还需要再触发一次重试(或重新运行一次 Maigret)。" + +#: ../../source/features.rst:325 9da1a6a8d5d848e7a9987a6e864d6da5 +msgid "" +"The activation mechanism is enabled by default, and cannot be disabled at" +" the moment." +msgstr "激活机制默认启用,目前无法关闭。" + +#: ../../source/features.rst:327 0573ae8856364e819e56931340bc6fb7 +msgid "See for more details in Development section :ref:`activation-mechanism`." +msgstr "更多细节请参见开发文档中的 :ref:`activation-mechanism` 一节。" + +#: ../../source/features.rst:332 efe6f17c461a44e099b06d44a597b5b2 +msgid "Extraction of information from account pages" +msgstr "从账号页面抽取信息" + +#: ../../source/features.rst:334 c820edcca1184d4382c8a57eded6cc47 +msgid "" +"Maigret can parse URLs and content of web pages by URLs to extract info " +"about account owner and other meta information." +msgstr "Maigret 可以根据给定 URL 解析网页地址及其内容,抽取账号所有者及其它元信息。" + +#: ../../source/features.rst:336 540ba0732e5348e0838f7cdafcdee244 +msgid "" +"You must specify the URL with the option ``--parse``, it's can be a link " +"to an account or an online document. List of supported sites `see here " +"<https://github.com/soxoj/socid-extractor#sites>`_." +msgstr "" +"需要使用 ``--parse`` 选项指定 URL,可以是某个账号的链接,也可以是在线文档的链接。支持的站点列表请\\ `查看此处 " +"<https://github.com/soxoj/socid-extractor#sites>`_。" + +#: ../../source/features.rst:338 7db26f80206f49e4ac99971c8829c8ef +msgid "" +"After the end of the parsing phase, Maigret will start the search phase " +"by :doc:`supported identifiers <supported-identifier-types>` found " +"(usernames, ids, etc.)." +msgstr "" +"解析阶段结束后,Maigret 会根据从中找到的 :doc:`受支持标识符 <supported-identifier-types>`\\ " +"(用户名、ID 等)进入搜索阶段。" + +#: ../../source/features.rst:366 a1bd40f9e8a24be2b76cb9fbdb3c03e1 +msgid "Simple API" +msgstr "简单 API" + +#: ../../source/features.rst:368 c032748ecb4847ecb5590a4fa6629ba0 +msgid "" +"Maigret can be easily integrated with the use of Python package `maigret " +"<https://pypi.org/project/maigret/>`_." +msgstr "" +"借助 Python 包 `maigret <https://pypi.org/project/maigret/>`_,可以很方便地把 " +"Maigret 集成到自己的项目中。" + +#: ../../source/features.rst:370 115fa7827cea4dc68871f2a516999f7d +msgid "" +"Example: the community `Telegram bot <https://github.com/soxoj/maigret-" +"tg-bot>`_" +msgstr "示例:社区维护的 `Telegram 机器人 <https://github.com/soxoj/maigret-tg-bot>`_" + + +#: ../../source/features.rst:151 +msgid "" +"Maigret currently supports HTML, PDF, TXT, CSV, XMind 8 mindmap, JSON, " +"and Markdown reports, plus graph exports: an interactive HTML graph " +"(``--graph``) and a Neo4j Cypher script (``--neo4j``) for loading the " +"results into a graph database." +msgstr "Maigret 目前支持 HTML、PDF、TXT、CSV、XMind 8 思维导图、JSON 和 Markdown 报告,以及图谱导出:交互式 HTML 图谱(``--graph``)和 Neo4j Cypher 脚本(``--neo4j``,用于将结果载入图数据库)。" + +#: ../../source/features.rst:164 +msgid "" +"The ``--neo4j`` flag serialises the same graph that ``--graph`` builds " +"into an idempotent ``.cypher`` script, importable with ``cypher-shell`` " +"or the Neo4j Browser. See :ref:`neo4j-export` for the schema and import " +"instructions." +msgstr "``--neo4j``\\ 选项会把 ``--graph``\\ 所构建的同一图谱序列化为一个幂等的 ``.cypher``\\ 脚本,可用 ``cypher-shell``\\ 或 Neo4j Browser 导入。其结构与导入说明详见 :ref:`neo4j-export`\\ 。" diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/index.po b/docs/source/locale/zh_CN/LC_MESSAGES/index.po new file mode 100644 index 0000000..f329246 --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/index.po @@ -0,0 +1,115 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-23 09:20+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/index.rst:36 +msgid "Sections" +msgstr "目录" + +#: ../../source/index.rst:51 +msgid "Advanced usage" +msgstr "进阶用法" + +#: ../../source/index.rst:59 +msgid "Use cases" +msgstr "使用案例" + +#: ../../source/index.rst:4 d318259213394f2d875338f2252e31e2 +msgid "Welcome to the Maigret docs!" +msgstr "欢迎阅读 Maigret 文档!" + +#: ../../source/index.rst:6 e4629e1ffd874446b8f7835dc05fde8a +msgid "" +"**Maigret** is an easy-to-use and powerful OSINT tool for collecting a " +"dossier on a person by a username (alias) only." +msgstr "**Maigret** 是一款简单易用而又强大的 OSINT 工具,仅凭一个用户名(别名)即可为目标人物生成一份档案。" + +#: ../../source/index.rst:8 9edc9c82d8554bcba5891fbdb4c09f30 +msgid "" +"This is achieved by checking for accounts on a huge number of sites and " +"gathering all the available information from web pages." +msgstr "实现方式是:在大量站点上查找该用户名对应的账号,并从相关网页中收集所有可获取的公开信息。" + +#: ../../source/index.rst:10 3b64dbc62d2846a5b272a673960df8a1 +msgid "" +"The project's main goal — give to OSINT researchers and pentesters a " +"**universal tool** to get maximum information about a person of interest " +"by a username and integrate it with other tools in automatization " +"pipelines." +msgstr "" +"项目的主要目标 —— 为 OSINT 研究人员和渗透测试人员提供一款\\ " +"**通用工具**,使其能够仅凭用户名获取关于目标人物的最大化信息,并将该工具集成到自动化流水线中与其它工具协同使用。" + +#: ../../source/index.rst:14 0bcc4da8c5e24b7492cc983360da8498 +msgid "" +"**This tool is intended for educational and lawful purposes only.** The " +"developers do not endorse or encourage any illegal activities or misuse " +"of this tool. Regulations regarding the collection and use of personal " +"data vary by country and region, including but not limited to GDPR in the" +" EU, CCPA in the USA, and similar laws worldwide." +msgstr "" +"**本工具仅供教育及合法用途使用。** " +"开发者不认可、亦不鼓励任何非法行为或对本工具的滥用。关于个人数据收集和使用的法律法规因国家和地区而异,包括但不限于欧盟 GDPR、美国 " +"CCPA,以及世界各地与之类似的法律。" + +#: ../../source/index.rst:19 b4878674298248f3b2b7c26e26947dc9 +msgid "" +"It is your sole responsibility to ensure that your use of this tool " +"complies with all applicable laws and regulations in your jurisdiction. " +"Any illegal use of this tool is strictly prohibited, and you are fully " +"accountable for your actions." +msgstr "使用者需独立承担相应责任,确保自身对本工具的使用符合所在司法辖区的全部相关法律法规。严禁以任何非法方式使用本工具;由此产生的一切后果概由使用者本人承担。" + +#: ../../source/index.rst:23 af1975d9166b40679d670b8cab1643a4 +msgid "" +"The authors and developers of this tool bear no responsibility for any " +"misuse or unlawful activities conducted by its users." +msgstr "对于使用者实施的任何滥用或违法行为,本工具的作者与开发者概不负责。" + +#: ../../source/index.rst:27 42ec2bdda2f8465cbb8a42b65b6dcf9e +msgid "You may be interested in:" +msgstr "你可能会感兴趣的内容:" + +#: ../../source/index.rst:28 af3ee16dfae24fcda671492cd9405c33 +msgid ":doc:`Quick start <quick-start>`" +msgstr ":doc:`快速入门 <quick-start>`" + +#: ../../source/index.rst:29 61982997ec074ab48a4fc94efc2fec42 +msgid ":doc:`Usage examples <usage-examples>`" +msgstr ":doc:`使用示例 <usage-examples>`" + +#: ../../source/index.rst:30 5a2e6eec62ad49c297d7edf16fd64a7a +msgid ":doc:`FAQ <faq>`" +msgstr ":doc:`常见问题 <faq>`" + +#: ../../source/index.rst:31 847ca51eb7774066a6b316c86f47970e +msgid ":doc:`Command line options <command-line-options>`" +msgstr ":doc:`命令行选项 <command-line-options>`" + +#: ../../source/index.rst:32 ddb043bd72714e37b7f7d30f84c43c56 +msgid ":doc:`Features list <features>`" +msgstr ":doc:`特性列表 <features>`" + +#: ../../source/index.rst:33 9ed0d068b9574bb8b7f30d4acc657795 +msgid ":doc:`Library usage <library-usage>`" +msgstr ":doc:`库使用 <library-usage>`" + +#: ../../source/index.rst:34 e7ce2f8ada8942c1b0d43ca57f52b24f +msgid ":doc:`Tor, I2P, and proxies <tor-and-proxies>`" +msgstr ":doc:`Tor、I2P 与代理 <tor-and-proxies>`" + diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/installation.po b/docs/source/locale/zh_CN/LC_MESSAGES/installation.po new file mode 100644 index 0000000..7fd4488 --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/installation.po @@ -0,0 +1,406 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-23 10:03+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/installation.rst:4 65ec572b79974a2b8617da6557093010 +msgid "Installation" +msgstr "安装" + +#: ../../source/installation.rst:6 672da475753e42ba98d2da7764d622f2 +msgid "" +"Maigret can be installed using pip, Docker, or simply can be launched " +"from the cloned repo. Also, it is available online via the `community " +"Telegram bot <https://sites.google.com/view/maigret-bot-link>`_, source " +"code of a bot is `available on GitHub <https://github.com/soxoj/maigret-" +"tg-bot>`_." +msgstr "" +"Maigret 可以通过 pip 或 Docker 安装,也可以直接从克隆下来的仓库运行。此外,还可以在线使用\\ `社区 Telegram " +"机器人 <https://sites.google.com/view/maigret-bot-link>`_,其源码 `已在 GitHub 上开源" +" <https://github.com/soxoj/maigret-tg-bot>`_。" + +#: ../../source/installation.rst:11 09b47ba6acdb4e18af6e1ecc069a8e6c +msgid "Windows Standalone EXE-binaries" +msgstr "Windows 独立 EXE 二进制文件" + +#: ../../source/installation.rst:13 3f62cebffe3e42a2a70477cec9f7b968 +msgid "" +"A standalone ``maigret_standalone.exe`` for Windows is published in the " +"`Releases section <https://github.com/soxoj/maigret/releases>`_ of the " +"GitHub repository. A fresh build is produced automatically after each " +"commit to the **main** and **dev** branches." +msgstr "" +"用于 Windows 的独立程序 ``maigret_standalone.exe`` 发布在 GitHub 仓库的\\ `Releases 页面" +" <https://github.com/soxoj/maigret/releases>`_。每次合并到 **main** 与 **dev** " +"分支后,都会自动构建一个新版本。" + +#: ../../source/installation.rst:18 c7dc8ed554194a0986d61bad0ecc8dbc +msgid "There are two ways to launch the EXE:" +msgstr "启动该 EXE 的方式有两种:" + +#: ../../source/installation.rst:20 615cf386dba948059a0081c26abe2124 +msgid "" +"**Double-click it from Explorer.** Maigret will prompt you for a " +"username, run a default search, and pause at the end so the printed " +"report links remain on screen until you press Enter." +msgstr "" +"**在资源管理器中双击运行。** Maigret 会让你输入一个用户名,执行一次默认搜索,并在结束时暂停,这样屏幕上打印的报告链接会保留到你按下 " +"Enter 为止。" + +#: ../../source/installation.rst:23 691f5aee31f74e6195a90017856889ec +msgid "**Run it from a terminal** for full control over options:" +msgstr "**从终端启动**,以便完整控制各项参数:" + +#: ../../source/installation.rst:25 cdf73ace14e74e57badedcbb0595b332 +msgid "Press ``Win+R``, type ``cmd``, and hit Enter (or use PowerShell)." +msgstr "按 ``Win+R``,输入 ``cmd`` 后回车(或使用 PowerShell)。" + +#: ../../source/installation.rst:26 e201a1c4a85a4fadb1a012c94873b34d +msgid "" +"Change to the folder where you saved the file, e.g. ``cd " +"%USERPROFILE%\\Downloads``." +msgstr "切换到你保存 EXE 文件的目录,例如 ``cd %USERPROFILE%\\Downloads``\\ 。" + +#: ../../source/installation.rst:28 7ef431d9114647ceb3c892d61fcca306 +msgid "Run it with at least one username:" +msgstr "至少传入一个用户名后再运行:" + +#: ../../source/installation.rst:37 0e249c27e4934f0dbb1f826b88fa085f +msgid "Reports are written next to the EXE in a ``reports\\`` subfolder." +msgstr "报告会写入 EXE 同级的 ``reports\\`` 子目录。" + +#: ../../source/installation.rst:39 236594a8b8e04daebe4a59f74aa7e8e7 +msgid "Video guide on how to run it: https://youtu.be/qIgwTZOmMmM." +msgstr "如何运行的视频指引:https://youtu.be/qIgwTZOmMmM。" + +#: ../../source/installation.rst:43 345ab80862ae4393965a1ae62c6f9225 +msgid "Cloud Shells and Jupyter notebooks" +msgstr "云端 Shell 与 Jupyter Notebook" + +#: ../../source/installation.rst:45 fbe1675fd2dc41e48a3f29c4e008700e +msgid "" +"In case you don't want to install Maigret locally, you can use cloud " +"shells and Jupyter notebooks. Press one of the buttons below and follow " +"the instructions to launch it in your browser." +msgstr "如果你不想在本地安装 Maigret,可以使用云端 Shell 或 Jupyter Notebook。点击下方任一按钮,按提示在浏览器中启动即可。" + +#: ../../source/installation.rst:50 a23f0d4b7bd94cd6967787bd4d2c7bed +msgid "Open in Cloud Shell" +msgstr "在 Cloud Shell 中打开" + +#: ../../source/installation.rst:54 6e7de23fcf6e4e6a81536f0af747b9df +msgid "Run on Replit" +msgstr "在 Replit 上运行" + +#: ../../source/installation.rst:59 087c932a0a914b5baaf8a0522a8bf892 +msgid "Open In Colab" +msgstr "在 Colab 中打开" + +#: ../../source/installation.rst:64 eda20a4373ec47cf999aeb50e11a0a30 +msgid "Open In Binder" +msgstr "在 Binder 中打开" + +#: ../../source/installation.rst:71 0dbe84b6c46e41ebac52324d23a53926 +msgid "" +"Cloud Shell: " +"https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=README.md" +msgstr "" +"Cloud Shell:" +"https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/soxoj/maigret&tutorial=README.md" + +#: ../../source/installation.rst:73 dec4f6a14fff41c588d3dfe7307474fa +msgid "Replit: https://repl.it/github/soxoj/maigret" +msgstr "Replit:https://repl.it/github/soxoj/maigret" + +#: ../../source/installation.rst:75 64bc9d1b5e4b431c84de9fd7d8e7b56e +msgid "" +"Google Colab: " +"https://colab.research.google.com/gist/soxoj/879b51bc3b2f8b695abb054090645000" +"/maigret-collab.ipynb" +msgstr "" +"Google Colab:" +"https://colab.research.google.com/gist/soxoj/879b51bc3b2f8b695abb054090645000" +"/maigret-collab.ipynb" + +#: ../../source/installation.rst:77 b23a024d4da346d38434796ae40cfb1b +msgid "" +"Binder: " +"https://mybinder.org/v2/gist/soxoj/9d65c2f4d3bec5dd25949197ea73cf3a/HEAD" +msgstr "" +"Binder:" +"https://mybinder.org/v2/gist/soxoj/9d65c2f4d3bec5dd25949197ea73cf3a/HEAD" + +#: ../../source/installation.rst:80 cf642441c7ad4ce6a077b082c9d12948 +msgid "Local installation from PyPi" +msgstr "通过 PyPI 本地安装" + +#: ../../source/installation.rst:82 cd52af3ccddc498aaee8a9c7d47d9138 +msgid "" +"Maigret ships with a bundled site database. After installation from PyPI " +"(or any other method), it can **automatically fetch a newer compatible " +"database from GitHub** when you run it—see :ref:`database-auto-update` in" +" :doc:`settings`." +msgstr "" +"Maigret 自带一份站点数据库。无论通过 PyPI 还是其它方式安装完毕后,在每次运行时,它都可以\\ **自动从 GitHub " +"拉取兼容的更新版数据库** —— 详见 :doc:`settings` 中的 :ref:`database-auto-update`\\ 。" + +#: ../../source/installation.rst:85 23ec41899c0140918a3137e15b14c404 +msgid "Python 3.10 or higher and pip is required, **Python 3.11 is recommended.**" +msgstr "需要 Python 3.10 或更高版本以及 pip,\\ **推荐使用 Python 3.11。**" + +#: ../../source/installation.rst:95 368a3bbb1b3243fb89e88a73ad2d2319 +msgid "" +"PDF report support is shipped as an **optional extra** because it relies " +"on system-level graphics libraries that pip cannot install for you. If " +"you plan to use ``--pdf``, install Maigret with the ``pdf`` extra:" +msgstr "" +"PDF 报告支持作为\\ **可选扩展**\\ 单独提供,因为它依赖一些 pip 无法替你安装的系统级图形库。如果你打算使用 " +"``--pdf``,请带上 ``pdf`` extra 进行安装:" + +#: ../../source/installation.rst:103 6f105be5f2b746559320d154598fe441 +msgid "" +"See :ref:`pdf-extra` below for the full background on why PDF support is " +"optional and how to fix the most common build errors." +msgstr "关于 PDF 为何是可选项,以及最常见构建错误的修复方法,请见下文 :ref:`pdf-extra`\\ 。" + +#: ../../source/installation.rst:107 c40814fb664941eab04c0db77f59fdcc +msgid "Development version (GitHub)" +msgstr "开发版本(GitHub)" + +#: ../../source/installation.rst:125 4335f4b3b2bc422b84577aaf71a14404 +msgid "Docker" +msgstr "Docker" + +#: ../../source/installation.rst:139 88ca87d239464cd9a746d476bb0604e0 +msgid "Troubleshooting" +msgstr "故障排查" + +#: ../../source/installation.rst:141 5a58ace323ad4422b6bbdb4e8aa76400 +msgid "" +"If you encounter build errors during installation such as ``cannot find " +"ft2build.h`` or errors related to ``reportlab`` / ``_renderPM``, you need" +" to install system-level dependencies required to compile native " +"extensions." +msgstr "" +"如果你在安装过程中遇到 ``cannot find ft2build.h``,或与 ``reportlab`` / ``_renderPM`` " +"相关的构建错误,那就需要先安装编译原生扩展所需的系统级依赖。" + +#: ../../source/installation.rst:145 04b94becaa584dc08daef25362ee93b5 +msgid "**Debian/Ubuntu/Kali:**" +msgstr "**Debian / Ubuntu / Kali:**" + +#: ../../source/installation.rst:151 36f58a3216b146719fd706a5c7d02e01 +msgid "**Fedora/RHEL/CentOS:**" +msgstr "**Fedora / RHEL / CentOS:**" + +#: ../../source/installation.rst:157 ../../source/installation.rst:242 +#: 0042f1613fe7432d9e8a54d1ce76c351 8a5a2d81fefe41e99521afdc646122f0 +msgid "**Arch Linux:**" +msgstr "**Arch Linux:**" + +#: ../../source/installation.rst:163 ../../source/installation.rst:256 +#: a9ba82933f014aadabe3f45946cc3bff c13ecc1e9acd40f9ad11eea33f9854f8 +msgid "**macOS (Homebrew):**" +msgstr "**macOS(Homebrew):**" + +#: ../../source/installation.rst:169 9e67043b0a664a0ca57bb9013de182df +msgid "After installing the system dependencies, retry the maigret installation." +msgstr "安装好上述系统依赖后,再重新安装 maigret。" + +#: ../../source/installation.rst:171 e83ac2ad5cd945109734e3fc34a0b5f2 +msgid "" +"If you continue to have issues, consider using Docker instead, which " +"includes all necessary dependencies." +msgstr "如果仍有问题,可以考虑改用 Docker —— 其镜像中已包含所有必需的依赖。" + +#: ../../source/installation.rst:177 b0bf899a36ed4bf087844c1f8c490df0 +msgid "Optional: PDF reports (``maigret[pdf]``)" +msgstr "可选项:PDF 报告(``maigret[pdf]``)" + +#: ../../source/installation.rst:179 2915e92406e0446fa1db73ea4c07ccac +msgid "The ``--pdf`` report format is shipped as an optional extra. To enable it:" +msgstr "``--pdf`` 报告格式作为可选 extra 提供,启用方式如下:" + +#: ../../source/installation.rst:185 95fedc1010fa4702a97d63b255511f56 +msgid "" +"If PDF support is not installed and you pass ``--pdf``, Maigret prints a " +"warning and continues without crashing — every other output format " +"(``--html``, ``--json``, ``--csv``, ``--txt``, ``--xmind``, ``--graph``) " +"keeps working." +msgstr "" +"如果未安装 PDF 支持但传入了 ``--pdf``,Maigret 会打印一条警告并继续运行,而不会崩溃 —— " +"其它输出格式(``--html``\\ 、\\ ``--json``\\ 、\\ ``--csv``\\ 、\\ ``--txt``\\ 、\\ " +"``--xmind``\\ 、\\ ``--graph``)依然正常可用。" + +#: ../../source/installation.rst:191 9da2a7b6441d44069013972619981f94 +msgid "Why is PDF optional?" +msgstr "为什么 PDF 是可选的?" + +#: ../../source/installation.rst:193 b23ac592343143308b7802b858b361f4 +msgid "" +"Maigret renders PDFs by converting an HTML template, and that conversion " +"pipeline ultimately depends on the ``cairo`` graphics library through a " +"chain of Python packages roughly shaped like::" +msgstr "" +"Maigret 通过转换 HTML 模板来渲染 PDF,而这条转换流水线最终通过一连串 Python 包依赖 ``cairo`` " +"图形库,大致的依赖链如下::" + +#: ../../source/installation.rst:199 7250ee19355c47d7904ee0e80d2ac064 +msgid "" +"The bottom of that chain is a C library — ``libcairo2`` — that has to " +"exist on the host *before* pip can build the Python bindings. The Python " +"binding package (``pycairo``) currently ships **only Windows wheels** on " +"PyPI; on Linux and macOS pip falls back to building from source, and the " +"build fails the moment ``pkg-config`` cannot find ``cairo``. The error " +"looks like::" +msgstr "" +"这条依赖链最底层是一个 C 库 —— ``libcairo2`` —— 必须在 pip 构建 Python 绑定*之前*就已存在于主机上。其 " +"Python 绑定包(``pycairo``)目前在 PyPI 上\\ **只发布了 Windows wheel**;在 Linux 和 " +"macOS 上,pip 会回退为从源码构建,只要 ``pkg-config`` 找不到 ``cairo``,构建就会失败,报错形如::" + +#: ../../source/installation.rst:209 8519c15dd39d4238bcd3f42d9330e330 +msgid "" +"Pulling this whole chain for every Maigret install just so the much " +"smaller group of users who actually want PDFs can have them is a poor " +"trade — so ``xhtml2pdf`` is gated behind the ``pdf`` extra." +msgstr "" +"为了让一小部分确实需要 PDF 的用户能用上,而对每一次 Maigret 安装都强行拉入这一整条依赖链,显然不划算 —— 因此 " +"``xhtml2pdf`` 被收进了 ``pdf`` extra 中。" + +#: ../../source/installation.rst:213 3d0e063fb7334859b5f9570b910c6c00 +msgid "" +"Two more packages — ``arabic-reshaper`` and ``python-bidi`` — are bundled" +" into the same extra. Maigret core never imports them; they are only used" +" by ``xhtml2pdf`` to shape Arabic glyphs and lay out right-to-left text " +"in PDFs. ``python-bidi`` v0.5+ is also a Rust binding, so on niche " +"platforms without a published wheel it would otherwise pull in a Cargo " +"build for users who never asked for PDF support." +msgstr "" +"另有两个包 —— ``arabic-reshaper`` 和 ``python-bidi`` —— 也被一并收入了同一个 " +"extra。Maigret 核心从不导入它们;它们仅被 ``xhtml2pdf`` 用于在 PDF 中塑造阿拉伯字符并排版从右到左的文字。\\ " +"``python-bidi`` 0.5 及以上版本是 Rust 绑定,在某些没有预编译 wheel 的小众平台上,如果不这样隔离,就会让从未要求 " +"PDF 支持的用户也被迫触发一次 Cargo 构建。" + +#: ../../source/installation.rst:221 80f71336475d47cb9873448795ae9c21 +msgid "Installing the system prerequisites" +msgstr "安装系统前置依赖" + +#: ../../source/installation.rst:223 1e879f0511414a6e942dcd7be741f285 +msgid "" +"Install the cairo headers, ``pkg-config``, and a working C toolchain " +"*before* running ``pip install 'maigret[pdf]'``." +msgstr "" +"在执行 ``pip install 'maigret[pdf]'`` *之前*,先安装 cairo 头文件、\\ ``pkg-config`` " +"以及一套可用的 C 工具链。" + +#: ../../source/installation.rst:226 4bab90ae63914beebdc87f7bb848fe9b +msgid "**Debian / Ubuntu / Linux Mint / Kali:**" +msgstr "**Debian / Ubuntu / Linux Mint / Kali:**" + +#: ../../source/installation.rst:235 edea2b08b8d44a1daafc0317fe8099a2 +msgid "**Fedora / RHEL / CentOS:**" +msgstr "**Fedora / RHEL / CentOS:**" + +#: ../../source/installation.rst:249 fb81460a3ae44c23bff7dbdc6cdbfabf +msgid "**Alpine Linux:**" +msgstr "**Alpine Linux:**" + +#: ../../source/installation.rst:264 abb8643d8c4b4d6bbd3002fee178ebf1 +msgid "**Windows:**" +msgstr "**Windows:**" + +#: ../../source/installation.rst:266 6bcbcc0664d24c879cda8422cb9fb46f +msgid "" +"No system packages are needed — ``pycairo`` ships prebuilt wheels for " +"Windows. Just run:" +msgstr "不需要安装任何系统包 —— ``pycairo`` 在 Windows 上提供了预编译 wheel。直接执行:" + +#: ../../source/installation.rst:273 c9c4b06a92954316b3c9223f3649e8b0 +msgid "**Google Cloud Shell / Colab / Replit / generic CI:**" +msgstr "**Google Cloud Shell / Colab / Replit / 通用 CI:**" + +#: ../../source/installation.rst:275 81a59c7198c04a218b644c5493ae8dfd +msgid "" +"These environments behave like Debian/Ubuntu — install the same " +"``libcairo2-dev pkg-config python3-dev build-essential`` triple before " +"``pip install 'maigret[pdf]'``. If you do not control the base image and " +"cannot ``apt install``, skip the extra and use ``--html`` reports " +"instead; HTML reports contain the same data and open in any browser." +msgstr "" +"这些环境的表现与 Debian/Ubuntu 类似 —— 在 ``pip install 'maigret[pdf]'`` 之前,安装相同的 " +"``libcairo2-dev pkg-config python3-dev build-essential`` " +"组合即可。如果你无法控制基础镜像、也不能执行 ``apt install``,那就跳过这个 extra,改用 ``--html`` 报告;HTML" +" 报告承载的数据完全一致,任何浏览器都能打开。" + +#: ../../source/installation.rst:282 798403d50a8348169c437f2050dce6b9 +msgid "``maigret: command not found`` after install" +msgstr "安装后出现 ``maigret: command not found``" + +#: ../../source/installation.rst:284 92141864a3804547a8e9b13b9aeaae94 +msgid "If pip prints warnings like::" +msgstr "如果 pip 打印出类似下面的警告::" + +#: ../../source/installation.rst:289 2c7ce540fd1e43c0a3a32f881a0a6fd5 +msgid "" +"…and ``maigret --version`` then fails with ``command not found``, your " +"``--user`` install put the entry-point script in a directory the shell " +"does not search. Add it to ``PATH``:" +msgstr "" +"…而 ``maigret --version`` 又报 ``command not found``,这说明你用 ``--user`` " +"安装时,入口脚本被放进了一个不在 shell 搜索路径里的目录。把它加入 ``PATH``:" + +#: ../../source/installation.rst:298 efe742649ce6451ea3cace0789712bae +msgid "" +"Or install into a virtual environment, where the entry point lands in the" +" venv's ``bin/`` automatically:" +msgstr "或者改在虚拟环境中安装 —— 入口脚本会自动出现在该 venv 的 ``bin/`` 下:" + +#: ../../source/installation.rst:308 e3c75239517d4e2c842320df68b3f58b +msgid "Optional: Cloudflare bypass solver" +msgstr "可选项:Cloudflare 绕过求解器" + +#: ../../source/installation.rst:312 d4efdfc93ad14983b7e21a30881bc04c +msgid "" +"**Experimental.** The Cloudflare webgate is under active development; the" +" configuration schema and CLI behaviour may change without backwards-" +"compatibility guarantees." +msgstr "**实验特性。** Cloudflare webgate 仍在积极开发中;配置项和 CLI 行为都可能发生变化,不保证向后兼容。" + +#: ../../source/installation.rst:316 ad0d8e94beec4c2bbfff01354b2294f3 +msgid "" +"Sites tagged ``cf_js_challenge`` / ``cf_firewall`` need a real browser to" +" pass their JavaScript challenge. To check those sites you can run a " +"local `FlareSolverr <https://github.com/FlareSolverr/FlareSolverr>`_ " +"instance — Maigret will route protected checks to it when ``--cloudflare-" +"bypass`` is set:" +msgstr "" +"打上 ``cf_js_challenge`` / ``cf_firewall`` 标签的站点需要真实浏览器才能通过 JavaScript " +"挑战。要检查这些站点,你可以在本地运行一个 `FlareSolverr " +"<https://github.com/FlareSolverr/FlareSolverr>`_ 实例 —— 在传入 " +"``--cloudflare-bypass`` 后,Maigret 会把受保护站点的检查请求转交给它:" + +#: ../../source/installation.rst:325 09e7149d2d8f4f469db6483203330229 +msgid "" +"This is **optional** — Maigret runs without it; only sites whose " +"``protection`` field intersects " +"``settings.cloudflare_bypass.trigger_protection`` require the solver. See" +" :ref:`cloudflare-bypass` for details." +msgstr "" +"该求解器是\\ **可选项** —— 没有它 Maigret 一样能跑;只有那些 ``protection`` 字段与 " +"``settings.cloudflare_bypass.trigger_protection`` 有交集的站点,才会实际依赖求解器。详情参见 " +":ref:`cloudflare-bypass`\\ 。" + diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/library-usage.po b/docs/source/locale/zh_CN/LC_MESSAGES/library-usage.po new file mode 100644 index 0000000..59346d7 --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/library-usage.po @@ -0,0 +1,125 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-22 20:48+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/library-usage.rst:4 0e3b47fe98c44e169eff36fc278d43d3 +msgid "Library usage" +msgstr "作为库使用" + +#: ../../source/library-usage.rst:6 1795f987c28745229ba9a09a14083804 +msgid "" +"Maigret's CLI is a thin wrapper around an async Python API. You can embed" +" Maigret in your own tools, pipelines, and OSINT workflows — no need to " +"shell out." +msgstr "" +"Maigret 的 CLI 只是对一套异步 Python API 的薄包装。你完全可以将 Maigret 嵌入" +"自己的工具、流水线和 OSINT 工作流中,无需通过 shell 调用。" + +#: ../../source/library-usage.rst:8 83987665fd604f0eb68aa7ca68be4f49 +msgid "" +"This page covers the common patterns. For the full argument list of the " +"underlying function, see ``maigret.checking.maigret`` in the source." +msgstr "" +"本页介绍常见用法。底层函数的完整参数列表请参见源码中的 " +"``maigret.checking.maigret``\ 。" + +#: ../../source/library-usage.rst:11 6b066ed2cf054a00b5c3e753d7cf4bd6 +msgid "Installation" +msgstr "安装" + +#: ../../source/library-usage.rst:18 bc7986312a6745f291fe5e40659f0733 +msgid "Minimal example" +msgstr "最小示例" + +#: ../../source/library-usage.rst:20 92fe494f90544f2bae74193f83b245eb +msgid "A working end-to-end search against the top 500 sites:" +msgstr "一个可直接运行、面向访问量排名前 500 站点的端到端搜索示例:" + +#: ../../source/library-usage.rst:52 aafe2765921648228f18a5290818a94d +msgid "Key points:" +msgstr "关键点:" + +#: ../../source/library-usage.rst:54 c9e560325a0b40f9a18b03d2fbd66895 +msgid "" +"``maigret_search`` is an ``async`` function — wrap it with " +"``asyncio.run(...)`` or ``await`` it from inside your own event loop." +msgstr "" +"``maigret_search`` 是一个 ``async`` 函数 —— 在脚本中用 " +"``asyncio.run(...)`` 包裹,或在你自己的事件循环中 ``await`` 调用即可。" + +#: ../../source/library-usage.rst:55 b0281cf7f39c4d6fa358d5cc4b13d1ae +msgid "" +"``is_parsing_enabled=True`` turns on ``socid_extractor`` so " +"``result[\"ids_data\"]`` is populated with profile fields (bio, linked " +"accounts, uids, etc.)." +msgstr "" +"``is_parsing_enabled=True`` 会启用 ``socid_extractor``,从而把个人主页中" +"的字段(个人简介、关联账号、各类 uid 等)填充到 ``result[\"ids_data\"]``\ 。" + +#: ../../source/library-usage.rst:56 886c9269cbf346819fd029eb0c86b1ff +msgid "" +"Each entry in the returned dict has a ``\"status\"`` object with " +"``is_found()``, plus ``url_user``, ``http_status``, ``rank``, " +"``ids_data``, and more." +msgstr "" +"返回字典中的每一项都包含一个带有 ``is_found()`` 方法的 ``\"status\"`` " +"对象,以及 ``url_user``\ 、\ ``http_status``\ 、\ ``rank``\ 、\ ``ids_data`` 等字段。" + +#: ../../source/library-usage.rst:59 542863605bc8418f9ddbcc5fd64a036d +msgid "Filtering sites" +msgstr "站点过滤" + +#: ../../source/library-usage.rst:61 7fd59c0ee4fb48cb90cc6ec62a86c751 +msgid "``ranked_sites_dict`` accepts the same filters as the CLI:" +msgstr "``ranked_sites_dict`` 支持的过滤参数与 CLI 完全一致:" + +#: ../../source/library-usage.rst:78 8813c2686bb74458b2dfdffa2a3476af +msgid "Running inside an existing event loop" +msgstr "在已有事件循环中运行" + +#: ../../source/library-usage.rst:80 25560e5994a547e5b634d8995c5c3d75 +msgid "" +"If your application already runs an asyncio loop (FastAPI, aiohttp " +"server, a Discord bot, etc.), ``await`` ``maigret_search`` directly " +"instead of calling ``asyncio.run``:" +msgstr "" +"如果你的应用本身就在运行一个 asyncio 事件循环(例如 FastAPI、aiohttp " +"服务、Discord 机器人等),请直接 ``await`` ``maigret_search``,不要再调用 " +"``asyncio.run``:" + +#: ../../source/library-usage.rst:98 8935761064444371b1ef71f426d3ab29 +msgid "Routing through a proxy" +msgstr "通过代理转发" + +#: ../../source/library-usage.rst:100 d54f955ba79144bb923dbc88d72d4888 +msgid "" +"The same proxy / Tor / I2P flags the CLI exposes are plain keyword " +"arguments:" +msgstr "CLI 中暴露的代理 / Tor / I2P 选项,在库中就是普通的关键字参数:" + +#: ../../source/library-usage.rst:115 9c0e258bf007420fa47cf79815ab4152 +msgid "Full function signature" +msgstr "完整函数签名" + +#: ../../source/library-usage.rst:139 7cd14f1926dd4a5db137982b74294344 +msgid "" +"See :doc:`command-line-options` for a description of each option — the " +"semantics match the CLI flags one-to-one." +msgstr "" +"每个选项的含义请参见 :doc:`命令行选项 <command-line-options>` —— 这些参数" +"与 CLI 选项一一对应,语义完全相同。" diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/philosophy.po b/docs/source/locale/zh_CN/LC_MESSAGES/philosophy.po new file mode 100644 index 0000000..4d8d11f --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/philosophy.po @@ -0,0 +1,105 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-22 20:48+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/philosophy.rst:4 48807e936bde4ac1ab63debcc1939e6e +msgid "Philosophy" +msgstr "项目理念" + +#: ../../source/philosophy.rst:6 db0dc9d9dfb442bbaa66ecdf816d2f07 +msgid "" +"*The Commissioner Jules Maigret is a fictional French police detective, " +"created by Georges Simenon. His investigation method is based on " +"understanding the personality of different people and their " +"interactions.*" +msgstr "" +"*Jules Maigret 探长是由 Georges Simenon 创作的法国虚构警探。他的侦查方法" +"建立在理解不同人物的性格,以及他们之间的相互关系之上。*" + +#: ../../source/philosophy.rst:10 73fa31505603406f9316541034d7f8e3 +msgid "TL;DR: Username => Dossier" +msgstr "一句话总结:用户名 => 档案" + +#: ../../source/philosophy.rst:12 593fd204fbf24c6bb8a92f34dfd1ee1f +msgid "" +"Maigret is designed to gather all the available information about person " +"by his username." +msgstr "" +"Maigret 的设计目标,是仅凭一个用户名,就尽可能收集关于此人的全部可获取信息。" + +#: ../../source/philosophy.rst:14 2dcbea0926ac4fc09759ffacdd43a7f2 +msgid "" +"What kind of information is this? First, links to person accounts. " +"Secondly, all the machine-extractable pieces of info, such as: other " +"usernames, full name, URLs to people's images, birthday, location " +"(country, city, etc.), gender." +msgstr "" +"具体包括哪些信息?一是指向此人各个账号的链接;二是一切可被机器抽取的字段," +"例如:其它用户名、真实姓名、头像 URL、生日、所在地(国家、城市等)、性别。" + +#: ../../source/philosophy.rst:18 c18a634161624488ad6ea8732fe063da +msgid "" +"All this information forms some dossier, but it also useful for other " +"tools and analytical purposes. Each collected piece of data has a label " +"of a certain format (for example, ``follower_count`` for the number of " +"subscribers or ``created_at`` for account creation time) so that it can " +"be parsed and analyzed by various systems and stored in databases." +msgstr "" +"这些数据汇总起来构成一份档案,同时也方便其它工具进一步处理和分析。每一项" +"数据都带有固定格式的标签(例如关注者数量为 ``follower_count``,账号创建时间" +"为 ``created_at``),以便各类系统对其进行解析、分析,并存入数据库。" + +#: ../../source/philosophy.rst:24 7efd25a3f90c4da087311e23478d0ba9 +msgid "Origins" +msgstr "项目起源" + +#: ../../source/philosophy.rst:26 f74cfcc6c3924f92a8d44aa1d42a1051 +msgid "" +"Maigret started from studying what OSINT investigators actually use in " +"practice — and from the realization that many popular tools do not " +"deliver real investigative value. The original research behind this " +"observation is summarized in the article `What's wrong with namecheckers " +"<https://soxoj.medium.com/whats-wrong-with-namecheckers-981e5cba600e>`_. " +"For a broader landscape of username-checking tools, see the curated " +"`OSINT namecheckers list <https://github.com/soxoj/osint-namecheckers-" +"list>`_." +msgstr "" +"Maigret 始于一次对 OSINT 调查人员实际使用工具的研究,以及由此得出的结论:许多流行工具并没有真正带来调查价值。这一观察的原始研究总结在文章 `What's wrong with namecheckers <https://soxoj.medium.com/whats-wrong-with-namecheckers-981e5cba600e>`_ 中。如需更全面地了解用户名检查类工具的全景,请参见整理好的 `OSINT namecheckers list <https://github.com/soxoj/osint-namecheckers-list>`_。" + +#: ../../source/philosophy.rst:33 d6e18afa687c4308bc803dcc2f991b0f +msgid "Two ideas grew out of that research:" +msgstr "由此衍生出两个想法:" + +#: ../../source/philosophy.rst:35 bb7a5044518943068fff752a527be1eb +msgid "" +"`socid-extractor <https://github.com/soxoj/socid-extractor>`_ — a library" +" focused on pulling structured identity data (user IDs, full names, " +"linked accounts, bios, timestamps, etc.) out of account pages and public " +"API responses, so that finding an account is not the end of the pipeline." +msgstr "" +"`socid-extractor <https://github.com/soxoj/socid-extractor>`_ —— 一个专注于从账号页面和公开 API 响应中抽取结构化身份数据(用户 ID、真实姓名、关联账号、个人简介、时间戳等)的库,让“找到账号”不再是流水线的终点。" + +#: ../../source/philosophy.rst:38 d8778348b35e4514998f83f1ba7bb49a +msgid "" +"**Maigret** itself — which started as a fork of `Sherlock " +"<https://github.com/sherlock-project/sherlock>`_ but has long since " +"outgrown the original project in coverage, extraction depth, and check " +"reliability. Today Maigret is used as a component by major OSINT vendors " +"in their commercial products." +msgstr "" +"**Maigret** 本身 —— 最初是 `Sherlock <https://github.com/sherlock-project/sherlock>`_ 的 fork,但在覆盖范围、信息抽取深度和检查可靠性等方面早已远超原项目。如今,主流 OSINT 厂商已把 Maigret 作为组件集成进各自的商业产品中。" diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/quick-start.po b/docs/source/locale/zh_CN/LC_MESSAGES/quick-start.po new file mode 100644 index 0000000..6383fac --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/quick-start.po @@ -0,0 +1,48 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-22 20:48+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/quick-start.rst:4 297881c55bde4ddb8f503a1758fd54dc +msgid "Quick start" +msgstr "快速入门" + +#: ../../source/quick-start.rst:6 1d4989eaa3cd4181a0d57335e41f649a +msgid "" +"After :doc:`installing Maigret <installation>`, you can begin searching " +"by providing one or more usernames to look up:" +msgstr "" +"在 :doc:`安装 Maigret <installation>` 之后,你可以提供一个或多个待查的用户名" +"来发起搜索:" + +#: ../../source/quick-start.rst:8 9c0c37c565874d4090be5edf00885c55 +msgid "``maigret username1 username2 ...``" +msgstr "``maigret username1 username2 ...``" + +#: ../../source/quick-start.rst:10 69c10fb6163a421fa0ef1fd65f0df2b6 +msgid "" +"Maigret will search for accounts with the specified usernames across a " +"vast number of websites. It will provide you with a list of URLs to any " +"discovered accounts, along with relevant information extracted from those" +" profiles." +msgstr "" +"Maigret 会在大量站点上搜索与指定用户名匹配的账号,并向你返回已发现账号的 " +"URL 列表,以及从这些个人主页中提取出的相关信息。" + +#: ../../source/quick-start.rst:13 771e3fb4af5c434280dd9b5288fde81b +msgid "Maigret search results screenshot" +msgstr "Maigret 搜索结果截图" diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/settings.po b/docs/source/locale/zh_CN/LC_MESSAGES/settings.po new file mode 100644 index 0000000..7c95b9e --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/settings.po @@ -0,0 +1,442 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-25 18:02+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/settings.rst:4 fe76c47d0aa1445c891f588fa40b146c +msgid "Settings" +msgstr "配置" + +#: ../../source/settings.rst:7 53c34f2bdb7d4be498b654113d7d6231 +msgid "The settings system is under development and may be subject to change." +msgstr "配置系统仍在开发中,后续可能发生变化。" + +#: ../../source/settings.rst:9 4d4fd09541ce4883bfcdc64d646caf16 +msgid "" +"Options are also configurable through settings files. See `settings JSON " +"file " +"<https://github.com/soxoj/maigret/blob/main/maigret/resources/settings.json>`_" +" for the list of currently supported options." +msgstr "" +"各项选项也可以通过配置文件进行设置。当前支持的完整选项列表请参见 `settings JSON 文件 " +"<https://github.com/soxoj/maigret/blob/main/maigret/resources/settings.json>`_。" + +#: ../../source/settings.rst:13 0c0a9cd3c69b41c1b577466ebc33e36d +msgid "" +"After start Maigret tries to load configuration from the following " +"sources in exactly the same order:" +msgstr "启动后,Maigret 会\\ **按以下顺序**\\ 依次尝试从这些位置加载配置:" + +#: ../../source/settings.rst:26 15ad0a7667b246b081ad08074d479d8d +msgid "" +"Missing any of these files is not an error. If the next settings file " +"contains already known option, this option will be rewrited. So it is " +"possible to make custom configuration for different users and " +"directories." +msgstr "上述文件中任何一个不存在都不算错误。如果后一个配置文件包含了已经出现过的选项,该选项就会被覆盖。因此你可以针对不同用户和不同目录设置不同的自定义配置。" + +#: ../../source/settings.rst:34 018bbabf2f414554a59579239aa70d06 +msgid "Database auto-update" +msgstr "数据库自动更新" + +#: ../../source/settings.rst:36 652f6ed1943a4bbf95290f956eb7b28a +msgid "" +"Maigret ships with a bundled site database, but it gets outdated between " +"releases. To keep the database current, Maigret automatically checks for " +"updates on startup." +msgstr "Maigret 自带一份站点数据库,但它会随着新版本发布而逐渐过时。为了保持数据库是最新的,Maigret 在启动时会自动检查更新。" + +#: ../../source/settings.rst:38 c9681e2aab35468e9af30b1b684301a0 +msgid "**How it works:**" +msgstr "**工作机制:**" + +#: ../../source/settings.rst:40 def91bc9f8e84dcebce7e2fa602ae0f5 +msgid "" +"On startup, Maigret checks if more than 24 hours have passed since the " +"last update check." +msgstr "启动时,Maigret 会检查距离上次更新检查是否已超过 24 小时。" + +#: ../../source/settings.rst:41 dfab33e815164c86a4ebe0e7e78ed6ee +msgid "" +"If so, it fetches a lightweight metadata file (~200 bytes) from GitHub to" +" see if a newer database is available." +msgstr "如果超过了,就从 GitHub 拉取一份轻量元数据文件(约 200 字节),查看是否有更新版本的数据库。" + +#: ../../source/settings.rst:42 209b0131bfdd48c2b68e7088c2cb6014 +msgid "" +"If a newer, compatible database exists, Maigret downloads it to " +"``~/.maigret/data.json`` and uses it instead of the bundled copy." +msgstr "如果存在更新且兼容的数据库,Maigret 会把它下载到 ``~/.maigret/data.json``,并用它替代内置的版本。" + +#: ../../source/settings.rst:43 d8aa5049e4ee40929e746b6f5b4c6be8 +msgid "" +"If the download fails or the new database is incompatible with your " +"Maigret version, the bundled database is used as a fallback." +msgstr "如果下载失败,或新数据库与你的 Maigret 版本不兼容,就回退到内置数据库。" + +#: ../../source/settings.rst:45 26696d84d93342dfbd89b6ca614f29a5 +msgid "" +"The downloaded database has **higher priority** than the bundled one — it" +" replaces, not overlays." +msgstr "下载下来的数据库\\ **优先级高于**\\ 内置数据库 —— 它是替换关系,而不是叠加。" + +#: ../../source/settings.rst:47 93ce61948c464569a7efdd07ae269fb2 +msgid "**Status messages** are printed only when an action occurs:" +msgstr "**状态消息**\\ 仅在实际发生某种动作时才会打印:" + +#: ../../source/settings.rst:56 0845742ea7ed4b44a6194a7a9f8faca2 +msgid "**Forcing an update:**" +msgstr "**强制更新:**" + +#: ../../source/settings.rst:58 ee8fcb44764949dcb422d9523f203837 +msgid "" +"Use the ``--force-update`` flag to check for updates immediately, " +"ignoring the check interval:" +msgstr "使用 ``--force-update`` 参数会忽略检查间隔,立刻检查更新:" + +#: ../../source/settings.rst:64 abcac12715f6447283a54b1d21eb3f26 +msgid "" +"The update happens at startup, then the search continues normally with " +"the freshly downloaded database." +msgstr "更新只在启动时进行,完成后即用新下载的数据库继续执行正常搜索。" + +#: ../../source/settings.rst:66 8dfdb9ddb94742d6916accf6a637b621 +msgid "**Disabling auto-update:**" +msgstr "**禁用自动更新:**" + +#: ../../source/settings.rst:68 e63059a385e042989dbffc8faa6620be +msgid "Use the ``--no-autoupdate`` flag to skip the update check entirely:" +msgstr "使用 ``--no-autoupdate`` 参数可以完全跳过更新检查:" + +#: ../../source/settings.rst:74 4538e0b662e74117ac60feb580ea14cf +msgid "Or set it permanently in ``~/.maigret/settings.json``:" +msgstr "或者在 ``~/.maigret/settings.json`` 中永久设置:" + +#: ../../source/settings.rst:82 01fb39cf9f6648cb818421edd235e9bd +msgid "" +"This is recommended for **Docker containers**, **CI pipelines**, and " +"**air-gapped environments**." +msgstr "该选项推荐用于 **Docker 容器**\\ 、\\ **CI 流水线**\\ 以及\\ **离线隔离环境**\\ 。" + +#: ../../source/settings.rst:84 4d8f3a1e5313475ab522313771b11096 +msgid "**Configuration options** (in ``settings.json``):" +msgstr "**配置项**\\ (位于 ``settings.json``):" + +#: ../../source/settings.rst:90 ../../source/settings.rst:242 +#: 8ee43c194a614f57b2f10cf306622d9d 9bce6a59ddf14978a8a6b536b266d6cb +msgid "Setting" +msgstr "选项" + +#: ../../source/settings.rst:91 ../../source/settings.rst:243 +#: 0961df2fea32498a82984fcd2a6cd428 e8446230ddf34848bbbc331cfefb4745 +msgid "Default" +msgstr "默认值" + +#: ../../source/settings.rst:92 ../../source/settings.rst:183 +#: ../../source/settings.rst:244 2dbd3a0f5c00431a908b42aec54f648c +#: 6d42f72550974316980c6bf1806ff29c e84d99a18c264735a2adfa5099d4b0fd +msgid "Description" +msgstr "说明" + +#: ../../source/settings.rst:93 ffec75c5cdea4c9aa0c69125f639339a +msgid "``no_autoupdate``" +msgstr "``no_autoupdate``" + +#: ../../source/settings.rst:94 16b9c70c0b6a412d9bde98cb2a60e216 +msgid "``false``" +msgstr "``false``" + +#: ../../source/settings.rst:95 2381445bb42b40fdacaebd43988daa49 +msgid "Disable auto-update entirely" +msgstr "完全禁用自动更新" + +#: ../../source/settings.rst:96 c6ad3238aab14a3d9070588c11ae8ed4 +msgid "``autoupdate_check_interval_hours``" +msgstr "``autoupdate_check_interval_hours``" + +#: ../../source/settings.rst:97 6cf231184c7740ffb6e8116d11387e4f +msgid "``24``" +msgstr "``24``" + +#: ../../source/settings.rst:98 3c1ea4469c8d425492ec6cccce8aac55 +msgid "How often to check for updates (in hours)" +msgstr "检查更新的间隔(单位:小时)" + +#: ../../source/settings.rst:99 efb1d0e86cac42c3adf1f3ef4c76c91a +msgid "``db_update_meta_url``" +msgstr "``db_update_meta_url``" + +#: ../../source/settings.rst:100 1a0cf0e2a938494689e926cdf7f7ac9e +msgid "GitHub raw URL" +msgstr "GitHub raw URL" + +#: ../../source/settings.rst:101 25a72fbd4eb74ff7b5b0b28e8e43addf +msgid "URL of the metadata file (for custom mirrors)" +msgstr "元数据文件的 URL(用于自建镜像)" + +#: ../../source/settings.rst:103 4a02e3e5680c477d8a03b2c5a1b5ca8c +msgid "" +"**Using a custom database** with ``--db`` always skips auto-update — you " +"are explicitly choosing your data source." +msgstr "使用 ``--db`` 指定自定义数据库时,\\ **总是会跳过**\\ 自动更新 —— 因为你已经明确选择了数据源。" + +#: ../../source/settings.rst:106 f7ea5acf3a354a2681d7a150e277f086 +msgid "Cloudflare webgate" +msgstr "Cloudflare webgate" + +#: ../../source/settings.rst:110 9a059aba51304c1aa1c47c4e681511e6 +msgid "" +"**Experimental.** The ``cloudflare_bypass`` block is under active " +"development; field names, defaults, and the trigger-protection routing " +"rules may change without backwards-compatibility guarantees." +msgstr "" +"**实验特性。** ``cloudflare_bypass`` 这一节仍在积极开发中;字段名、默认值以及 trigger-protection " +"的路由规则都可能发生变化,不保证向后兼容。" + +#: ../../source/settings.rst:114 3121d43837664c1f9818c7099732eb09 +msgid "" +"The ``cloudflare_bypass`` block in ``settings.json`` configures the " +"optional bypass described in :ref:`cloudflare-bypass`. The same block is " +"honoured by the CLI, the Python API, and the web UI (``python -m " +"maigret.web.app``); set ``enabled: true`` once and every entry point " +"routes cf-protected sites through the solver." +msgstr "" +"``settings.json`` 中的 ``cloudflare_bypass`` 配置块用于配置 " +":ref:`cloudflare-bypass` 所述的可选绕过机制。CLI、Python API 以及 Web 界面" +"(``python -m maigret.web.app``)都会读取同一份配置:只需将 ``enabled`` 设为" +" ``true``,所有入口都会把受 cf 保护的站点转发给求解器。" + +#: ../../source/settings.rst:120 a98ec36b3f954c30af38363e9bea6ec3 +msgid "" +"**Minimal FlareSolverr setup.** Start the solver in Docker, then drop the" +" following snippet into ``~/.maigret/settings.json`` (or any path listed " +"in :ref:`settings`):" +msgstr "" +"**FlareSolverr 最小化配置。** 先用 Docker 启动求解器,然后把下面这段配置" +"写入 ``~/.maigret/settings.json``\\ (或 :ref:`settings` 中列出的任意路径):" + +#: ../../source/settings.rst:145 d8dc102a6ea247d991b6c09f917bc37a +msgid "" +"That is enough — ``session_prefix`` and ``trigger_protection`` fall back " +"to sensible defaults (``\"maigret\"`` and ``[\"cf_js_challenge\", " +"\"cf_firewall\", \"webgate\"]`` respectively). On the next run, Maigret " +"logs ``Cloudflare webgate active: ...`` and routes matching sites through" +" the solver." +msgstr "" +"这样就够了 —— ``session_prefix`` 和 ``trigger_protection`` 会回退到合理的" +"默认值(分别为 ``\"maigret\"`` 和 " +"``[\"cf_js_challenge\", \"cf_firewall\", \"webgate\"]``)。下次运行时," +"Maigret 会输出 ``Cloudflare webgate active: ...`` 日志,并把命中的站点" +"路由到求解器。" + +#: ../../source/settings.rst:151 bfff9d4907664fc3862b5a6a20da88be +msgid "Default value (full schema with every supported field):" +msgstr "默认值(包含全部受支持字段的完整结构):" + +#: ../../source/settings.rst:176 46b6a3845ba548aa8823e049281bda6d +msgid "**Fields.**" +msgstr "**字段说明。**" + +#: ../../source/settings.rst:182 bad54b56ab2945058697d7054a6055fa +msgid "Field" +msgstr "字段" + +#: ../../source/settings.rst:184 610f1da5f28040079ae2bcb10618573c +msgid "``enabled``" +msgstr "``enabled``" + +#: ../../source/settings.rst:185 c3149bfa418c4e3b95dde5611ef4717b +msgid "" +"When ``true``, the bypass is active for every run; when ``false`` (the " +"default), it activates only on ``--cloudflare-bypass``." +msgstr "" +"为 ``true`` 时,每次运行都会启用绕过;为 ``false``\\ (默认)时,仅在传入 ``--cloudflare-bypass`` " +"时才启用。" + +#: ../../source/settings.rst:187 5c92e71e8ec144be83f8abbca6e37d01 +msgid "``trigger_protection``" +msgstr "``trigger_protection``" + +#: ../../source/settings.rst:188 38557548995949a5b8121d81ffc51178 +msgid "" +"List of ``site.protection`` values that route a check through the " +"webgate. Sites whose protection is empty or doesn't intersect this list " +"use the default (aiohttp / curl_cffi) checker." +msgstr "" +"一个 ``site.protection`` 值的列表;命中其中任何一个时,检查请求都会经由webgate 转发。\\ " +"``protection`` 为空、或与本列表无交集的站点,仍使用默认的检查器(aiohttp / curl_cffi)。" + +#: ../../source/settings.rst:191 4b93a27e05b34050837eccffbcb40bed +msgid "``session_prefix``" +msgstr "``session_prefix``" + +#: ../../source/settings.rst:192 c54f79f2b5ca4c42805b948cbbb3c3d2 +msgid "" +"Prefix for the FlareSolverr ``session`` field. Maigret appends the " +"process PID so concurrent runs don't collide. Reusing a session caches " +"cf_clearance between checks of the same domain." +msgstr "" +"FlareSolverr ``session`` 字段的前缀。Maigret 会在其后追加进程 PID,避免并发运行相互冲突。复用同一个 " +"session 会在对同一域名的多次检查之间缓存 cf_clearance。" + +#: ../../source/settings.rst:195 9742c805b326433aac2ad92e1e48a880 +msgid "``modules``" +msgstr "``modules``" + +#: ../../source/settings.rst:196 8c7a26caf24040fc9afce140b739ba89 +msgid "" +"Ordered list of backend modules. The first reachable module handles the " +"check; later ones serve as a fallback chain." +msgstr "后端模块的有序列表。第一个能连通的模块负责处理该检查,后续模块作为兜底链。" + +#: ../../source/settings.rst:199 262a0c13a9ae4815962b16733ef6016e +msgid "**Module methods.**" +msgstr "**模块方法。**" + +#: ../../source/settings.rst:201 a3145c584a0e453aac0ca51f67ee12db +msgid "" +"``json_api`` — FlareSolverr-compatible POST endpoint at ``url``. " +"Preserves real upstream HTTP status, headers and final URL. Optional " +"``max_timeout_ms`` (default ``60000``) is the per-request budget the " +"solver is allowed to spend on the JS challenge." +msgstr "" +"``json_api`` —— 在 ``url`` 上提供的 FlareSolverr 兼容 POST 接口。会保留上游真实的 HTTP " +"状态码、响应头和最终 URL。可选字段 ``max_timeout_ms``\\ (默认 ``60000``)是允许求解器在 JS " +"挑战上花费的单次请求时间预算。" + +#: ../../source/settings.rst:205 fe03ccdb70144c77adc1b7280d9f71ca +#, python-brace-format +msgid "" +"``url_rewrite`` — legacy CloudflareBypassForScraping endpoint. The " +"``url`` must contain a ``{url}`` placeholder; the original probe URL is " +"URL-encoded and substituted in. Returns rendered HTML only — ``checkType:" +" status_code`` and ``response_url`` checks misfire under this method " +"(treated as a synthetic HTTP 200 on success)." +msgstr "" +"``url_rewrite`` —— 旧版 CloudflareBypassForScraping 接口。\\ ``url`` 中必须包含 " +"``{url}`` 占位符;原始探测 URL 会被 URL 编码后代入。该方式仅返回渲染后的 HTML —— 因此在此方法下,\\ " +"``checkType: status_code`` 和 ``response_url`` 两类检查会失准(成功时会被当作一个虚构的 HTTP " +"200)。" + +#: ../../source/settings.rst:211 7dd51af2a40f4b64ab35e75a7291ad88 +msgid "**Optional ``proxy`` field (``json_api`` only).**" +msgstr "**可选的 ``proxy`` 字段(仅 ``json_api`` 支持)。**" + +#: ../../source/settings.rst:213 08bf49a34630456db598e3e585a3e128 +msgid "" +"A module may carry a ``proxy`` entry that the solver routes the upstream " +"request through. Useful when a site enforces ``ip_reputation`` rules that" +" block the solver host. Two forms are accepted:" +msgstr "" +"每个模块都可以带一个 ``proxy`` 字段 —— 求解器会通过该代理转发上游请求。在站点启用了会封锁求解器主机的 " +"``ip_reputation`` 规则时,这会非常有用。接受两种写法:" + +#: ../../source/settings.rst:227 7e0856096ecb44599b40a1e0efbb7fbb +msgid "" +"Only ``url``/``username``/``password`` are forwarded; other keys are " +"dropped. Cloudflare ``Error 1015 / 1020`` responses indicate the IP is " +"rate-limited or banned — switch the proxy rather than retrying. .. _ai-" +"analysis-settings:" +msgstr "" +"仅 ``url``/``username``/``password`` 会被转发;其它字段会被丢弃。Cloudflare ``Error 1015" +" / 1020`` 响应表示该 IP 被限速或被封 —— 此时请更换代理,而不是反复重试。 .. _ai-analysis-settings:" + +#: ../../source/settings.rst:233 c0352f79365140edadb45dfe6e0373d3 +msgid "AI analysis" +msgstr "AI 分析" + +#: ../../source/settings.rst:235 bf3d82f2b15745cb8a1b4dfed7c9f836 +msgid "" +"The ``--ai`` flag (see :ref:`ai-analysis`) talks to an OpenAI-compatible " +"chat completion API. Three settings control how that request is made:" +msgstr "" +"``--ai`` 参数(参见 :ref:`ai-analysis`)会调用一个 OpenAI 兼容的 chat completion " +"接口。以下三个配置项决定该请求的具体行为:" + +#: ../../source/settings.rst:245 5fbd903f98e64b349c146792cc7ab2e9 +msgid "``openai_api_key``" +msgstr "``openai_api_key``" + +#: ../../source/settings.rst:246 c73824b01b8e4cb8aabfed01c94ea2ad +msgid "``\"\"`` (empty)" +msgstr "``\"\"``\\ (空)" + +#: ../../source/settings.rst:247 82aaaef9d7cc4665813cdd874130bdb7 +msgid "" +"API key. If empty, Maigret falls back to the ``OPENAI_API_KEY`` " +"environment variable." +msgstr "API key。为空时,Maigret 会回退到 ``OPENAI_API_KEY`` 环境变量。" + +#: ../../source/settings.rst:249 037412797a4c42519aef357c77d1833f +msgid "``openai_model``" +msgstr "``openai_model``" + +#: ../../source/settings.rst:250 2562a1def3be41889c3b05620eb1870b +msgid "``gpt-4o``" +msgstr "``gpt-4o``" + +#: ../../source/settings.rst:251 0d3623bf37a84a0399c893f90dae649a +msgid "Default model name. Overridable per-run with ``--ai-model``." +msgstr "默认模型名。可在单次运行中通过 ``--ai-model`` 覆盖。" + +#: ../../source/settings.rst:252 f6ae5711a47f42e4a6effae3c90c2560 +msgid "``openai_api_base_url``" +msgstr "``openai_api_base_url``" + +#: ../../source/settings.rst:253 4aac62c2d35148328d255646e18623d4 +msgid "``https://api.openai.com/v1``" +msgstr "``https://api.openai.com/v1``" + +#: ../../source/settings.rst:254 6096b4d81ac248a09f6f49f5d8303676 +msgid "" +"Base URL of the chat completion API. Point this at any OpenAI-compatible " +"service (Azure OpenAI, OpenRouter, a local server, …) to use it instead " +"of OpenAI directly." +msgstr "" +"chat completion 接口的基础 URL。把它指向任何 OpenAI 兼容的服务(Azure " +"OpenAI、OpenRouter、本地推理服务等),即可用其代替 OpenAI 官方服务。" + +#: ../../source/settings.rst:258 186158107d2b4ee1af1a46a7e45f6c1a +msgid "Example ``~/.maigret/settings.json`` snippet using a non-OpenAI endpoint:" +msgstr "下面是一个使用非 OpenAI 接口的 ``~/.maigret/settings.json`` 片段示例:" + +#: ../../source/settings.rst:269 2e37565d7dd74e9898cacf648c27476a +msgid "" +"The key resolution order is ``settings.openai_api_key`` → " +"``OPENAI_API_KEY`` environment variable; the first non-empty value wins." +msgstr "" +"API key 的取值顺序为:``settings.openai_api_key`` → ``OPENAI_API_KEY`` " +"环境变量;以第一个非空值为准。" + +#: ../../source/settings.rst:274 0bb83aab896446628c567ec9e33644a1 +msgid "" +"``--ai`` sends the full internal Markdown report (which contains the " +"gathered profile data) to the configured endpoint. Only use providers and" +" accounts you trust with that data." +msgstr "" +"``--ai`` 会把完整的内部 Markdown " +"报告(其中包含收集到的所有个人主页数据)发送至所配置的接口。请仅在你信任的服务商和账号上使用该功能。" + +#~ msgid "" +#~ "The ``cloudflare_bypass`` block in " +#~ "``settings.json`` configures the optional " +#~ "bypass described in :ref:`cloudflare-bypass`." +#~ " Default value:" +#~ msgstr "" +#~ "``settings.json`` 中的 ``cloudflare_bypass`` 配置块用于配置" +#~ " :ref:`cloudflare-bypass` 所述的可选绕过机制。默认值如下:" + diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/supported-identifier-types.po b/docs/source/locale/zh_CN/LC_MESSAGES/supported-identifier-types.po new file mode 100644 index 0000000..421981d --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/supported-identifier-types.po @@ -0,0 +1,80 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-22 20:48+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/supported-identifier-types.rst:4 +#: 33063447be45418d8712a5f1e6f0f26f +msgid "Supported identifier types" +msgstr "支持的标识符类型" + +#: ../../source/supported-identifier-types.rst:6 +#: 650e5fb3b81b455ebec318e5e5eaef39 +msgid "" +"Maigret can search against not only ordinary usernames, but also through " +"certain common identifiers. There is a list of all currently supported " +"identifiers." +msgstr "" +"Maigret 不仅可以基于普通用户名进行搜索,还可以基于若干常见的标识符进行搜索。" +"以下是当前支持的全部标识符列表。" + +#: ../../source/supported-identifier-types.rst:8 +#: d89f32e75ed54a29968fa59b9cae2226 +msgid "" +"**gaia_id** - Google inner numeric user identifier, in former times was " +"placed in a Google Plus account URL." +msgstr "" +"**gaia_id** —— Google 内部的数字用户标识符,过去会出现在 Google Plus 账号 " +"URL 中。" + +#: ../../source/supported-identifier-types.rst:9 +#: 8625cfbcf5e14b9b86b1067ea0f11b5f +msgid "**steam_id** - Steam inner numeric user identifier." +msgstr "**steam_id** —— Steam 内部的数字用户标识符。" + +#: ../../source/supported-identifier-types.rst:10 +#: 3136248733fe40488f23f5bf448de51b +msgid "**wikimapia_uid** - Wikimapia.org inner numeric user identifier." +msgstr "**wikimapia_uid** —— Wikimapia.org 内部的数字用户标识符。" + +#: ../../source/supported-identifier-types.rst:11 +#: 363bd8c96cef4411811b3c141d60a2a1 +msgid "**uidme_uguid** - uID.me inner numeric user identifier." +msgstr "**uidme_uguid** —— uID.me 内部的数字用户标识符。" + +#: ../../source/supported-identifier-types.rst:12 +#: 10477c76097549c9a59caacd6a9957c4 +msgid "" +"**yandex_public_id** - Yandex sites inner letter user identifier. See " +"also: `YaSeeker <https://github.com/HowToFind-bot/YaSeeker>`_." +msgstr "" +"**yandex_public_id** —— Yandex 系站点内部的字母型用户标识符。延伸阅读:`YaSeeker <https://github.com/HowToFind-bot/YaSeeker>`_。" + +#: ../../source/supported-identifier-types.rst:13 +#: 10b9f7a111604b84b8b03395336afbbb +msgid "**vk_id** - VK.com inner numeric user identifier." +msgstr "**vk_id** —— VK.com 内部的数字用户标识符。" + +#: ../../source/supported-identifier-types.rst:14 +#: b0a7e5c93dec4af8b78ca3c6a65541f3 +msgid "**ok_id** - OK.ru inner numeric user identifier." +msgstr "**ok_id** —— OK.ru 内部的数字用户标识符。" + +#: ../../source/supported-identifier-types.rst:15 +#: 5eac68e6daa548d4a0559b3c70fc5de8 +msgid "**yelp_userid** - Yelp inner user identifier." +msgstr "**yelp_userid** —— Yelp 内部的用户标识符。" diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/tags.po b/docs/source/locale/zh_CN/LC_MESSAGES/tags.po new file mode 100644 index 0000000..833b22c --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/tags.po @@ -0,0 +1,160 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-22 20:48+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/tags.rst:4 dfd4dbb048734bd08dd4e7b916240c7a +msgid "Tags" +msgstr "标签" + +#: ../../source/tags.rst:6 efaa336b0e2d455d99374fd69e49b69f +msgid "" +"The use of tags allows you to select a subset of the sites from big " +"Maigret DB for search." +msgstr "" +"通过标签,你可以从庞大的 Maigret 数据库中挑选出一个子集进行搜索。" + +#: ../../source/tags.rst:9 69aba3e9c9034688a05b6b56dc1ce422 +msgid "Tags markup is still not stable." +msgstr "标签体系目前尚未稳定。" + +#: ../../source/tags.rst:11 e6166e567f43487eb602492f6230b3bb +msgid "There are several types of tags:" +msgstr "标签分为以下几类:" + +#: ../../source/tags.rst:13 3e93c919597347b1b17bbe8b1a6e0099 +msgid "" +"**Country codes**: ``us``, ``jp``, ``br``... (`ISO 3166-1 alpha-2 " +"<https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2>`_). A country tag " +"means that having an account on the site implies a connection to that " +"country — either origin or residence. The goal is attribution, not " +"perfect accuracy." +msgstr "" +"**国家代码**:``us``\ 、\ ``jp``\ 、\ ``br`` 等(`ISO 3166-1 alpha-2 <https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2>`_)。国家标签的含义是:在该站点拥有账号,意味着此人与该国家存在关联 —— 出生地或居住地。其目标是做出归属判断,而非追求完美准确。" + +#: ../../source/tags.rst:15 1bb17b8af4e846d28db19f90fa60ea87 +msgid "" +"**Global sites** (GitHub, YouTube, Reddit, Medium, etc.) get **no country" +" tag** — an account there says nothing about where a person is from." +msgstr "" +"**全球性站点**\ (GitHub、YouTube、Reddit、Medium 等)\ **不打国家标签** —— " +"在这些站点上有账号并不能说明此人来自哪里。" + +#: ../../source/tags.rst:16 b02bc81d7a424f628bbd10bbbfa538ae +msgid "" +"**Regional/local sites** where an account implies a specific country " +"**must** have a country tag: ``VK`` → ``ru``, ``Naver`` → ``kr``, " +"``Zhihu`` → ``cn``." +msgstr "" +"**区域性/本地站点**,如果拥有账号意味着归属于某个特定国家,\ **必须**\ 打上" +"国家标签:``VK`` → ``ru``,\ ``Naver`` → ``kr``,\ ``Zhihu`` → ``cn``\ 。" + +#: ../../source/tags.rst:17 51204b29bfb8444bb66e090d71f0d298 +msgid "" +"Multiple country tags are allowed when a service is used predominantly in" +" a few countries (e.g. ``Xing`` → ``de``, ``eu``)." +msgstr "" +"如果某个服务主要在少数几个国家使用,可以打多个国家标签(例如 ``Xing`` → " +"``de``\ 、\ ``eu``)。" + +#: ../../source/tags.rst:18 e7b136f5d67744babdf5b2548c053156 +msgid "" +"Do **not** assign country tags based on traffic statistics alone — a site" +" popular in India by traffic is not \"Indian\" if it is used globally." +msgstr "" +"**不要**\ 仅凭流量统计就给站点打国家标签 —— 某站点即使在印度流量很高,只要其" +"用户群是全球性的,就不算“印度站点”。" + +#: ../../source/tags.rst:20 c8179b6d4a9c46028e5ee6b564e1be42 +msgid "" +"**Site engines**. Most of them are forum engines now: ``uCoz``, " +"``vBulletin``, ``XenForo`` et al. Full list of engines stored in the " +"Maigret database." +msgstr "" +"**站点引擎**\ 。目前大多为论坛引擎,例如 ``uCoz``\ 、\ ``vBulletin``\ 、\ ``XenForo`` 等。完整的引擎列表存储于 Maigret 数据库中。" + +#: ../../source/tags.rst:22 54452d52c2ec4ca4aa7014e8b2b2fc6a +msgid "" +"**Sites' subject/type and interests of its users**. Full list of " +"\"standard\" tags is `present in the source code " +"<https://github.com/soxoj/maigret/blob/main/maigret/sites.py#L13>`_ only " +"for a moment." +msgstr "" +"**站点的主题/类型,以及用户兴趣**\ 。完整的“标准”标签列表目前只在\ `源码 <https://github.com/soxoj/maigret/blob/main/maigret/sites.py#L13>`_ 中维护。" + +#: ../../source/tags.rst:25 34282854dc044d0d985cb3e06dfc2ce0 +msgid "Usage" +msgstr "使用方法" + +#: ../../source/tags.rst:26 575fe2076f99476185e5b8d26fb5c4e2 +msgid "" +"``--tags us,jp`` -- search on US and Japanese sites (actually marked as " +"such in the Maigret database)" +msgstr "" +"``--tags us,jp`` —— 在美国和日本站点上搜索(以 Maigret 数据库中实际打的" +"标签为准)" + +#: ../../source/tags.rst:28 ba09e85ba8a24daaaf40ff9543c203d3 +msgid "``--tags coding`` -- search on sites related to software development." +msgstr "``--tags coding`` —— 在软件开发相关站点上搜索。" + +#: ../../source/tags.rst:30 f4a3ae2c95d44082941910d88b697337 +msgid "``--tags ucoz`` -- search on uCoz sites only (mostly CIS countries)" +msgstr "``--tags ucoz`` —— 只在 uCoz 系站点上搜索(主要为独联体国家)" + +#: ../../source/tags.rst:33 7a6bb72b86b548b09ee0362827a0f527 +msgid "Blacklisting (excluding) tags" +msgstr "按标签排除(黑名单)" + +#: ../../source/tags.rst:34 1f51439352e849aa851bf499267cc2d0 +msgid "" +"You can exclude sites with certain tags from the search using " +"``--exclude-tags``:" +msgstr "通过 ``--exclude-tags`` 可以从搜索中排除带有指定标签的站点:" + +#: ../../source/tags.rst:36 0d4f7bb04e6d4d178c8f18341e61cb0b +msgid "" +"``--exclude-tags porn,dating`` -- skip all sites tagged with ``porn`` or " +"``dating``." +msgstr "" +"``--exclude-tags porn,dating`` —— 跳过所有打上 ``porn`` 或 ``dating`` " +"标签的站点。" + +#: ../../source/tags.rst:38 dd07939a21de48dba2d1e8cf2c61ebd4 +msgid "``--exclude-tags ru`` -- skip all Russian sites." +msgstr "``--exclude-tags ru`` —— 跳过所有俄罗斯站点。" + +#: ../../source/tags.rst:40 491ae6de296e48bdaad0f9f508a6c4ba +msgid "" +"You can combine ``--tags`` and ``--exclude-tags`` to fine-tune your " +"search:" +msgstr "也可以将 ``--tags`` 和 ``--exclude-tags`` 组合使用,对搜索范围进行精细控制:" + +#: ../../source/tags.rst:42 2531e53d09c142a7ae52e8867fe34de2 +msgid "" +"``--tags forum --exclude-tags ru`` -- search on forum sites, but skip " +"Russian ones." +msgstr "``--tags forum --exclude-tags ru`` —— 在论坛类站点上搜索,但跳过俄罗斯站点。" + +#: ../../source/tags.rst:44 10637ee8975e4848816ce7a5883cd645 +msgid "" +"In the web interface, the tag cloud supports three states per tag: click " +"once to **include** (green), click again to **exclude** " +"(dark/strikethrough), and click once more to return to **neutral** (red)." +msgstr "" +"在 Web 界面中,标签云对每个标签支持三种状态:第一次点击为\ **包含**\ (绿色)," +"再次点击为\ **排除**\ (深色/带删除线),第三次点击恢复为\ **中性**\ (红色)。" diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/tor-and-proxies.po b/docs/source/locale/zh_CN/LC_MESSAGES/tor-and-proxies.po new file mode 100644 index 0000000..54de3c9 --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/tor-and-proxies.po @@ -0,0 +1,309 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-23 10:03+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/tor-and-proxies.rst:4 8799af869fb8498ca9136204833c12bc +msgid "Tor, I2P, and proxies" +msgstr "Tor、I2P 与代理" + +#: ../../source/tor-and-proxies.rst:6 18b3f3e7045a4504be0c719800d9d74c +msgid "" +"Maigret can route checks through an HTTP/SOCKS proxy, the Tor network, or" +" I2P. Three CLI flags cover three distinct goals — knowing which one you " +"need is the most common stumbling block." +msgstr "" +"Maigret 可以将检查请求通过 HTTP/SOCKS 代理、Tor 网络或 I2P 转发。三个 CLI 参数分别对应三种不同目标 —— " +"弄清楚自己到底需要哪一个,是最常见的拦路虎。" + +#: ../../source/tor-and-proxies.rst:9 c7e16af249aa4f778513ddced342b2c8 +msgid "``--proxy`` vs ``--tor-proxy`` (and ``--i2p-proxy``)" +msgstr "``--proxy`` 与 ``--tor-proxy``\\ (以及 ``--i2p-proxy``)的区别" + +#: ../../source/tor-and-proxies.rst:11 a99844d2182148a9bb794847e86d2ba5 +msgid "" +"The most-asked question (see `issue #544 " +"<https://github.com/soxoj/maigret/issues/544>`_):" +msgstr "最常被问到的问题(参见 `issue #544 <https://github.com/soxoj/maigret/issues/544>`_):" + +#: ../../source/tor-and-proxies.rst:13 fbd98e4eaedf4574908ed7a7f451dc63 +msgid "" +"**You want every check to go through Tor** (e.g. you're on Tails OS, or " +"behind a country-level block, or your IP is rate-limited). → Use " +"``--proxy``, pointing at your Tor SOCKS port:" +msgstr "" +"**希望所有检查请求都通过 Tor 发出**\\ (比如你在 Tails 操作系统下、处于国家级封锁之后,或本机 IP 被限速)。→ 使用 " +"``--proxy`` 并指向你的 Tor SOCKS 端口:" + +#: ../../source/tor-and-proxies.rst:19 4b55c77cbbe643f3a5db220b5711e698 +msgid "" +"**You want to reach ``.onion`` sites in the Maigret database**, while the" +" rest of the run still uses your normal connection. → Use ``--tor-" +"proxy``:" +msgstr "**只想访问 Maigret 数据库中的 ``.onion`` 站点**,其它站点继续走你本机的正常连接。→ 使用 ``--tor-proxy``:" + +#: ../../source/tor-and-proxies.rst:25 e2944b6a49024d9b8875fe75ca9e145c +msgid "" +"``--tor-proxy`` is **only** consulted for sites whose ``url`` is a " +"``.onion`` host. For every other site Maigret uses your direct connection" +" (or ``--proxy`` if set). Without ``--tor-proxy``, ``.onion`` sites are " +"silently skipped." +msgstr "" +"``--tor-proxy`` **只**\\ 对 ``url`` 为 ``.onion`` 域名的站点生效。其它站点会走你本机的直连(或者 " +"``--proxy``,如果你设置了的话)。如果不传 ``--tor-proxy``,\\ ``.onion`` 站点会被静默跳过。" + +#: ../../source/tor-and-proxies.rst:27 b7021bbaa1e44f3fb63c528ac3dc9de2 +msgid "" +"The same split applies to ``--i2p-proxy``: it is consulted only for " +"``.i2p`` hosts, never for clearweb sites." +msgstr "``--i2p-proxy`` 的逻辑相同:只对 ``.i2p`` 域名生效,绝不会用于明网站点。" + +#: ../../source/tor-and-proxies.rst:29 3743546b2784445dad8092c822bbe33e +msgid "" +"Defaults: ``--tor-proxy`` defaults to ``socks5://127.0.0.1:9050`` and " +"``--i2p-proxy`` to ``http://127.0.0.1:4444``. ``--proxy`` has no default." +" Maigret does **not** launch ``tor`` or an I2P router for you — start the" +" daemon first." +msgstr "" +"默认值:``--tor-proxy`` 默认为 ``socks5://127.0.0.1:9050``,\\ ``--i2p-proxy`` " +"默认为 ``http://127.0.0.1:4444``\\ 。\\ ``--proxy`` 没有默认值。Maigret **不会**\\ " +"替你启动 ``tor`` 或 I2P 路由器 —— 请先把守护进程跑起来。" + +#: ../../source/tor-and-proxies.rst:32 5f21c934dc37477bb494409e9bac0ac0 +msgid "Tor Browser vs system ``tor``: port numbers" +msgstr "Tor 浏览器 vs 系统级 ``tor``:端口号差异" + +#: ../../source/tor-and-proxies.rst:34 d9ac1b375147453288de6411fa79eb06 +msgid "The SOCKS port differs by Tor installation:" +msgstr "不同的 Tor 安装方式监听的 SOCKS 端口不同:" + +#: ../../source/tor-and-proxies.rst:36 ad205064c5394cbba1e596552f71f374 +msgid "" +"**System ``tor`` daemon** (``apt install tor``, ``brew install tor``, " +"Tails) listens on ``9050``." +msgstr "" +"**系统级 ``tor`` 守护进程**\\ (``apt install tor``\\ 、\\ ``brew install tor``\\ " +"、Tails)监听 ``9050``\\ 。" + +#: ../../source/tor-and-proxies.rst:37 9e3a803c6b924430bc61b4462005b015 +msgid "**Tor Browser bundle** ships its own ``tor`` listening on ``9150``." +msgstr "**Tor 浏览器套件**\\ 自带的 ``tor`` 监听在 ``9150``\\ 。" + +#: ../../source/tor-and-proxies.rst:39 4c82ce8f33a344abb8aaeb852b762a7a +msgid "If a connection refuses, try the other port:" +msgstr "如果连接被拒绝,请换另一个端口试试:" + +#: ../../source/tor-and-proxies.rst:50 8fde99f033d0470abd7164e97eab656d +msgid "A note on results over Tor" +msgstr "关于在 Tor 上结果的说明" + +#: ../../source/tor-and-proxies.rst:52 99e2940611824ba0a08166be4788f7c7 +msgid "" +"Most public WAFs (Cloudflare, DDoS-Guard, AWS WAF, Akamai) block Tor exit" +" nodes by default — usually more aggressively than they block datacenter " +"IPs. A Tor run typically produces **more UNKNOWNs and fewer CLAIMEDs** " +"than the same run from a residential connection. This is not a bug in " +"Maigret; it is the cost of anonymity." +msgstr "" +"大多数公共 WAF(Cloudflare、DDoS-Guard、AWS WAF、Akamai)都会默认封锁 Tor 出口节点,而且通常比封数据中心" +" IP 更激进。因此走 Tor 跑一次,通常会比从居民宽带跑同样一次得到\\ **更多 UNKNOWN、更少 CLAIMED**\\ 。这不是 " +"Maigret 的 bug,而是匿名带来的代价。" + +#: ../../source/tor-and-proxies.rst:54 cffac7c98141464eaed495930432725c +msgid "Recommended flags for a Tor run:" +msgstr "走 Tor 时推荐的参数:" + +#: ../../source/tor-and-proxies.rst:60 4ddc5f7075c44db6b0b935c06251d907 +msgid "" +"``--timeout 60`` — Tor circuits add 1–3 seconds per request; the default " +"30 s causes spurious timeouts." +msgstr "``--timeout 60`` —— Tor 链路会给每个请求增加 1–3 秒延迟;默认的 30 秒会导致虚假的超时。" + +#: ../../source/tor-and-proxies.rst:61 92bd328e957e4868a8700b9439758a47 +msgid "" +"``--retries 2`` — retries cover transient circuit failures, which are " +"common on Tor." +msgstr "``--retries 2`` —— 重试可以兜住 Tor 上很常见的短暂链路故障。" + +#: ../../source/tor-and-proxies.rst:62 bbec2be7ef214c86af5b12bee9578b22 +msgid "" +"Optional ``-n 20`` — lowering concurrency (default 100) reduces the " +"chance of exits rate-limiting you." +msgstr "可选项 ``-n 20`` —— 降低并发度(默认 100),减少被出口节点限速的概率。" + +#: ../../source/tor-and-proxies.rst:64 96449803c8404e35a03ec728f0e6021f +msgid "" +"If you mainly need to bypass WAFs (rather than to remain anonymous), a " +"residential proxy will usually outperform Tor by a wide margin. See the " +"**\"Lots of sites fail / timeout / return 403\"** section in " +"`TROUBLESHOOTING.md " +"<https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md>`_." +msgstr "" +"如果你的主要目的是绕过 WAF(而不是保持匿名),那么住宅代理在表现上通常会远好于 Tor。具体可参见 `TROUBLESHOOTING.md " +"<https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md>`_ 中\\ " +"**\"Lots of sites fail / timeout / return 403\"** 一节。" + +#: ../../source/tor-and-proxies.rst:67 b06fbc34282845e795752cdbea4f9002 +msgid "Running on Tails OS" +msgstr "在 Tails 操作系统下运行" + +#: ../../source/tor-and-proxies.rst:69 9b3d8be6c13a43909bee721b25bf677a +msgid "" +"Tails forces every outbound connection through Tor at the network layer. " +"Maigret needs no special configuration to comply — pointing ``--proxy`` " +"at the Tails Tor daemon is enough:" +msgstr "" +"Tails 会在网络层强制所有出站连接走 Tor。Maigret 不需要任何额外配置就能符合这一约束 —— 把 ``--proxy`` 指向 " +"Tails 的 Tor 守护进程即可:" + +#: ../../source/tor-and-proxies.rst:75 b3ea70059964418d89589f95a5eafad2 +msgid "Things that are **not** needed:" +msgstr "以下做法\\ **没有必要**:" + +#: ../../source/tor-and-proxies.rst:77 6b7359d44b3c4af4a78e88ad527a9034 +msgid "" +"``torsocks maigret …`` and ``torify maigret …`` — these wrap libc socket " +"calls, but Maigret's HTTP client (``aiohttp`` / ``curl_cffi``) bypasses " +"libc for network I/O, so the wrapper has no effect. Use ``--proxy`` " +"instead." +msgstr "" +"``torsocks maigret …`` 与 ``torify maigret …`` —— 这类工具是包装 libc 的 socket " +"调用,但 Maigret 的 HTTP 客户端(``aiohttp`` / ``curl_cffi``)在网络 I/O 上绕过了 " +"libc,所以这层包装实际上不会起作用。请改用 ``--proxy``\\ 。" + +#: ../../source/tor-and-proxies.rst:78 e8164ca48e07422897e800fb28060e16 +msgid "" +"``--tor-proxy`` — on Tails, *everything* must go via Tor (the OS enforces" +" this), so the niche \"only .onion via Tor\" mode that ``--tor-proxy`` " +"provides does not apply." +msgstr "" +"``--tor-proxy`` —— 在 Tails 下,*所有*流量都必须走 Tor(由系统强制),因此 ``--tor-proxy`` " +"提供的“仅 .onion 走 Tor”这个小众模式在这里并不适用。" + +#: ../../source/tor-and-proxies.rst:81 250efb2bdd5440559aa8ed695cf7f94a +msgid "Installation over Tor on Tails" +msgstr "在 Tails 上通过 Tor 进行安装" + +#: ../../source/tor-and-proxies.rst:83 249743f00a9f4c648532b8dcb67a3849 +msgid "" +"``pip`` itself does not know about Tor; on Tails you need ``torsocks`` to" +" wrap it:" +msgstr "``pip`` 自己并不知道 Tor 的存在;在 Tails 上需要用 ``torsocks`` 把它包起来:" + +#: ../../source/tor-and-proxies.rst:89 d7028e56fbe64a80ae5bbe1d89c52043 +msgid "" +"After install, the binary lands in ``~/.local/bin/maigret``. If " +"``maigret: command not found``, either add ``~/.local/bin`` to ``PATH`` " +"or invoke it as ``python3 -m maigret <username>``." +msgstr "" +"安装完成后,可执行文件位于 ``~/.local/bin/maigret``\\ 。如果遇到 ``maigret: command not " +"found``,要么把 ``~/.local/bin`` 加进 ``PATH``,要么以 ``python3 -m maigret " +"<username>`` 方式调用。" + +#: ../../source/tor-and-proxies.rst:92 4fe964b5b15f48859b86b50ca7aaf6df +msgid "Persisting Maigret across Tails sessions" +msgstr "让 Maigret 跨 Tails 会话保留" + +#: ../../source/tor-and-proxies.rst:94 e24c907641a94caf8ad08b730021ca4e +msgid "" +"Tails wipes ``~/.local/`` on reboot unless you configure the Persistent " +"Storage to keep it. This is Tails configuration, not Maigret " +"configuration — see the official Tails docs:" +msgstr "" +"除非你配置了 Tails 的“持久化存储”,否则 ``~/.local/`` 会在重启时被清空。这属于 Tails 的配置,与 Maigret " +"无关 —— 请参考官方文档:" + +#: ../../source/tor-and-proxies.rst:96 5746e67fcb8e4d1692ee1b0f6d1d6f5d +msgid "" +"`Persistent Storage on Tails " +"<https://tails.boum.org/doc/persistent_storage/>`_" +msgstr "`Tails 的持久化存储 <https://tails.boum.org/doc/persistent_storage/>`_" + +#: ../../source/tor-and-proxies.rst:97 2ef228cce1ca4daf851f50adb07a5ad4 +msgid "" +"`Configuring Persistent Storage features " +"<https://tails.boum.org/doc/persistent_storage/configure/>`_" +msgstr "`配置持久化存储的具体功能 <https://tails.boum.org/doc/persistent_storage/configure/>`_" + +#: ../../source/tor-and-proxies.rst:99 51476935068a4586b6d90a8b3af2be59 +msgid "" +"A step-by-step recipe contributed by a user (persisting " +"``~/.local/lib/python3.9`` and ``~/.local/bin`` and patching ``.bashrc``)" +" is in `issue #544 " +"<https://github.com/soxoj/maigret/issues/544#issuecomment-1356469171>`__." +" Treat it as a starting point: the Python version and Tails internals " +"change between Tails releases." +msgstr "" +"`issue #544 " +"<https://github.com/soxoj/maigret/issues/544#issuecomment-1356469171>`__ " +"中有一位用户贡献的逐步操作配方(持久化 ``~/.local/lib/python3.9`` 与 ``~/.local/bin``,并修改 " +"``.bashrc``)。请把它当作起点即可:Tails 的 Python 版本和系统内部结构会随版本变化。" + +#: ../../source/tor-and-proxies.rst:102 b9a8f9016be14e60b8f81eb0aa237568 +msgid "Reports on Tails — where to save them" +msgstr "Tails 上的报告 —— 应该保存到哪里" + +#: ../../source/tor-and-proxies.rst:104 ece3ef6d8a32412eba76e97e7b505d66 +msgid "" +"The default ``reports/`` directory lives next to the working directory " +"and is wiped with the amnesiac session. To save reports somewhere " +"persistent, either pass ``-fo``:" +msgstr "默认的 ``reports/`` 目录位于工作目录旁,会随这次健忘式会话一起被清空。要把报告保存到持久化的位置,可以传入 ``-fo``:" + +#: ../../source/tor-and-proxies.rst:110 df1fb36e79994387b87c2b3e26243fb7 +msgid "" +"or set ``\"reports_path\"`` in your ``settings.json`` to a persistent " +"path. See :doc:`settings`." +msgstr "" +"或者把 ``settings.json`` 中的 ``\"reports_path\"`` 设为一个持久化路径。详见 " +":doc:`settings`\\ 。" + +#: ../../source/tor-and-proxies.rst:113 46ae196a8d704cb3ad43e87fb0da7703 +msgid "Programmatic equivalents (Python library)" +msgstr "以 Python 库形式使用时的等价写法" + +#: ../../source/tor-and-proxies.rst:115 53560bf488684147b1af9098edc5f147 +msgid "" +"The same options are available through the Python API. See :doc:`library-" +"usage` — the relevant keyword arguments are ``proxy=``, ``tor_proxy=`` " +"and ``i2p_proxy=``, accepting the same URL formats as the CLI flags." +msgstr "" +"上述全部选项都可以通过 Python API 使用。详见 :doc:`library-usage` —— 对应的关键字参数为 " +"``proxy=``\\ 、\\ ``tor_proxy=`` 和 ``i2p_proxy=``,接受的 URL 格式与 CLI 选项完全一致。" + +#: ../../source/tor-and-proxies.rst:118 0442e42c309748caa809a94ffcbd15c4 +msgid "See also" +msgstr "延伸阅读" + +#: ../../source/tor-and-proxies.rst:120 627d782f87af47159601ea834f7f23b8 +msgid ":doc:`command-line-options` — full reference for the three flags." +msgstr ":doc:`command-line-options` —— 上述三个参数的完整说明。" + +#: ../../source/tor-and-proxies.rst:121 bad3a48187aa46099c7d7dd83d385521 +msgid "" +"`TROUBLESHOOTING.md " +"<https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md>`_ — quick" +" recipes for ``.onion`` / I2P sites and for WAF-induced 403s." +msgstr "" +"`TROUBLESHOOTING.md " +"<https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md>`_ —— 针对 " +"``.onion`` / I2P 站点以及 WAF 触发的 403 问题的快速排查方案。" + +#: ../../source/tor-and-proxies.rst:122 5e475ebc7e784d9b95950e8a06a9da08 +msgid ":doc:`library-usage` — proxy options for embedded use." +msgstr ":doc:`library-usage` —— 嵌入式使用场景下的代理选项。" + diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/usage-examples.po b/docs/source/locale/zh_CN/LC_MESSAGES/usage-examples.po new file mode 100644 index 0000000..2e6e9ac --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/usage-examples.po @@ -0,0 +1,126 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-22 20:48+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/usage-examples.rst:4 f20bb5db270a45b9a46f9ea9235e8046 +msgid "Usage examples" +msgstr "使用示例" + +#: ../../source/usage-examples.rst:6 29bd6b2971534bebac4719eb5606ebf6 +msgid "You can use Maigret as:" +msgstr "你可以以下列方式使用 Maigret:" + +#: ../../source/usage-examples.rst:8 0d13962bb83c496ca9185b4957ce729a +msgid "a command line tool: initial and a default mode" +msgstr "命令行工具:最初的、也是默认的使用方式" + +#: ../../source/usage-examples.rst:9 7335113bff4c4ff2811042119bdd7a34 +msgid "" +"a `web interface <#web-interface>`_: view the graph with results and " +"download all report formats on a single page" +msgstr "" +"`Web 界面 <#web-interface>`_:在同一个页面里查看结果图谱,并下载所有格式的报告" + +#: ../../source/usage-examples.rst:10 2e4d1ff6ac8142a285499de3dbaf4b99 +msgid "a library: integrate Maigret into your own project" +msgstr "Python 库:将 Maigret 集成进你自己的项目" + +#: ../../source/usage-examples.rst:13 639d7206182f49fe8c0516827db36791 +msgid "Use Cases" +msgstr "使用案例" + +#: ../../source/usage-examples.rst:16 c3afa53b1cb94d35ac6fef0493b044f0 +msgid "" +"Search for accounts with username ``machine42`` on top 500 sites (by " +"default, according to Majestic Million rank) from the Maigret DB." +msgstr "" +"在 Maigret 数据库中、按 Majestic Million 排名前 500 的站点(默认范围)上" +"搜索用户名为 ``machine42`` 的账号。" + +#: ../../source/usage-examples.rst:22 d0977ee969484a1eb5c857f3cf45fa65 +msgid "" +"Search for accounts with username ``machine42`` on **all sites** from the" +" Maigret DB." +msgstr "" +"在 Maigret 数据库中的\ **所有站点**\ 上搜索用户名为 ``machine42`` 的账号。" + +#: ../../source/usage-examples.rst:29 bb49f44d1bd1407c9d512e3923663590 +msgid "" +"Maigret will search for accounts on a huge number of sites, and some of " +"them may return false positive results. At the moment, we are working on " +"autorepair mode to deliver the most accurate results." +msgstr "" +"Maigret 会在大量站点上进行搜索,其中部分站点可能给出误报。目前我们正在开发" +"自动修复模式,以提供最准确的结果。" + +#: ../../source/usage-examples.rst:33 09e5da08de63493d83adbb25ca2bc415 +msgid "If you experience many false positives, you can do the following:" +msgstr "如果你遇到了较多误报,可以尝试以下做法:" + +#: ../../source/usage-examples.rst:35 89b8e37d364f487f9f0475e81c771482 +msgid "Install the last development version of Maigret from GitHub" +msgstr "从 GitHub 安装 Maigret 的最新开发版本" + +#: ../../source/usage-examples.rst:36 495b144f263c4f78803509d7f162cea3 +msgid "" +"Run Maigret with ``--self-check --auto-disable`` flag and agree on " +"disabling of problematic sites" +msgstr "" +"使用 ``--self-check --auto-disable`` 参数运行 Maigret,并同意自动禁用" +"有问题的站点" + +#: ../../source/usage-examples.rst:38 c94bf3d4bd19499289bef6561bcfaaf3 +msgid "" +"Search for accounts with username ``machine42`` and generate HTML and PDF" +" reports." +msgstr "" +"搜索用户名为 ``machine42`` 的账号,并生成 HTML 与 PDF 格式的报告。" + +#: ../../source/usage-examples.rst:44 39bc7cdeb1b3406c8b68295ef37cc15b +msgid "or" +msgstr "或:" + +#: ../../source/usage-examples.rst:51 e63cc4ef7c46427693eb487bd22efcd7 +msgid "Search for accounts with username ``machine42`` on Facebook only." +msgstr "仅在 Facebook 上搜索用户名为 ``machine42`` 的账号。" + +#: ../../source/usage-examples.rst:57 52ba0b41f8f54a13b846a976a8fcd201 +msgid "" +"Extract information from the Steam page by URL and start a search for " +"accounts with found username ``machine42``." +msgstr "" +"通过 URL 从一个 Steam 页面中抽取信息,并以其中发现的用户名 ``machine42`` " +"为起点发起搜索。" + +#: ../../source/usage-examples.rst:63 da17a981cdfe44ada63b1925dca1f676 +msgid "" +"Search for accounts with username ``machine42`` only on US and Japanese " +"sites." +msgstr "只在美国和日本的站点上搜索用户名为 ``machine42`` 的账号。" + +#: ../../source/usage-examples.rst:69 173e16cb0c8c44bfaf9df2fe96118bc7 +msgid "" +"Search for accounts with username ``machine42`` only on sites related to " +"software development." +msgstr "只在软件开发相关的站点上搜索用户名为 ``machine42`` 的账号。" + +#: ../../source/usage-examples.rst:75 9e6b3b424d064cde99cf312ec2864121 +msgid "" +"Search for accounts with username ``machine42`` on uCoz sites only " +"(mostly CIS countries)." +msgstr "只在 uCoz 系站点(主要为独联体国家)上搜索用户名为 ``machine42`` 的账号。" diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/use-cases/crypto.po b/docs/source/locale/zh_CN/LC_MESSAGES/use-cases/crypto.po new file mode 100644 index 0000000..8d4d699 --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/use-cases/crypto.po @@ -0,0 +1,499 @@ +# Simplified Chinese translation of the Maigret documentation. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-22 20:48+0200\n" +"PO-Revision-Date: 2026-05-22 21:00+0200\n" +"Last-Translator: \n" +"Language: zh_CN\n" +"Language-Team: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/use-cases/crypto.rst:4 6a36cde76cb44081bf4d2fe545c36f32 +msgid "Cryptocurrency & Web3 Investigations" +msgstr "加密货币与 Web3 调查" + +#: ../../source/use-cases/crypto.rst:6 446f8286401e46219fbc5618c4a874fa +msgid "" +"Blockchain transactions are public, but the people behind wallets are " +"not. Maigret helps bridge this gap by finding Web3 accounts tied to a " +"username, revealing the person behind a pseudonymous crypto persona." +msgstr "" +"链上交易是公开的,但钱包背后的人不是。Maigret 通过依据用户名定位与之关联" +"的 Web3 账号,帮助弥合这道鸿沟,揭示匿名加密身份背后的真实人物。" + +#: ../../source/use-cases/crypto.rst:9 3a9d880c2bfe4cfe83b745e3cc738721 +msgid "Why it matters" +msgstr "意义所在" + +#: ../../source/use-cases/crypto.rst:11 25d4bd14a8d24865a9ebdbe8d9f7690b +msgid "" +"Crypto investigations often start with a wallet address or an ENS name " +"but hit a wall — the blockchain tells you *what* happened, not *who* did " +"it. A username, however, is reused across platforms. If someone trades on" +" OpenSea as ``zachxbt`` and posts on Warpcast as ``zachxbt``, Maigret " +"connects the dots and builds a full profile." +msgstr "" +"加密相关调查通常以钱包地址或 ENS 名为起点,但很快就会撞墙 —— 区块链能告诉" +"你*发生了什么*,却不会告诉你*是谁干的*。然而,用户名往往会跨平台复用。如果" +"某人在 OpenSea 上以 ``zachxbt`` 进行交易,同时又以 ``zachxbt`` 的身份在 " +"Warpcast 上发帖,Maigret 就能把这些点连起来,构建出一份完整画像。" + +#: ../../source/use-cases/crypto.rst:13 7b5220423458480d81d6a9744aedc69a +msgid "Common scenarios:" +msgstr "常见场景:" + +#: ../../source/use-cases/crypto.rst:15 7d0ffb5af12e4e2bb8925ce75c49224e +msgid "" +"**Scam attribution.** A rug-pull promoter uses the same alias on Fragment" +" (Telegram username marketplace), OpenSea, and a personal blog." +msgstr "" +"**诈骗归因。** 一名 rug-pull 推手在 Fragment(Telegram 用户名交易市场)、" +"OpenSea 以及个人博客上使用同一个别名。" + +#: ../../source/use-cases/crypto.rst:16 f2be36892ccb42d5ae3d95415d584de2 +msgid "" +"**Sanctions compliance.** Verifying whether a counterparty's online " +"footprint matches known sanctioned individuals." +msgstr "" +"**制裁合规。** 验证交易对手在网络上的活动痕迹是否与已知受制裁人物相吻合。" + +#: ../../source/use-cases/crypto.rst:17 72830f7113ca477ba6775d1f04686fd4 +msgid "" +"**Due diligence.** Before an OTC deal or DAO vote, checking whether the " +"other party has a consistent online presence or is a freshly created " +"sockpuppet." +msgstr "" +"**尽职调查。** 在 OTC 交易或 DAO 投票之前,核查对方是否拥有一致、长期的" +"在线身份,还是新近创建的马甲账号。" + +#: ../../source/use-cases/crypto.rst:18 92a4d86b40e843999c45d84248ba8843 +msgid "" +"**Stolen funds tracing.** A stolen NFT appears on OpenSea under a new " +"account — but the username matches a Warpcast profile with real-world " +"links." +msgstr "" +"**被盗资金追踪。** 一枚被盗的 NFT 出现在 OpenSea 上的一个新账号下 —— 但其" +"用户名却与某个 Warpcast 主页相匹配,而后者还带有现实身份的线索。" + +#: ../../source/use-cases/crypto.rst:21 88e142c2d4104353b3e29c26dfe7eba3 +msgid "Supported sites" +msgstr "支持的站点" + +#: ../../source/use-cases/crypto.rst:23 d7675ff36f6844449d615d365b692c50 +msgid "Maigret currently checks the following crypto and Web3 platforms:" +msgstr "Maigret 目前可以检查以下加密 / Web3 平台:" + +#: ../../source/use-cases/crypto.rst:29 36479686d5bc4b80b6c626b898a3fcda +msgid "Site" +msgstr "站点" + +#: ../../source/use-cases/crypto.rst:30 396d36b953a6426b8067653c9caa9389 +msgid "What it reveals" +msgstr "能揭示的信息" + +#: ../../source/use-cases/crypto.rst:31 401a64d61a774e96aa33dd2a7bb4318a +msgid "Notes" +msgstr "备注" + +#: ../../source/use-cases/crypto.rst:32 e0886b1eb4504204be03671fc2779641 +msgid "**OpenSea**" +msgstr "**OpenSea**" + +#: ../../source/use-cases/crypto.rst:33 018bb624aa814081a0604ba034ad62e4 +msgid "NFT collections, trading history, profile bio, linked website" +msgstr "NFT 收藏、交易历史、个人简介、关联网站" + +#: ../../source/use-cases/crypto.rst:35 ea3b4a2e47614186b3ddbab9646a19be +msgid "**Rarible**" +msgstr "**Rarible**" + +#: ../../source/use-cases/crypto.rst:36 fd0496f01d174dc3bc9accfce493732d +msgid "NFT marketplace profile, collections, listing history" +msgstr "NFT 市场主页、收藏、挂单历史" + +#: ../../source/use-cases/crypto.rst:37 328b6ef534234f8a80dd362226fd20e1 +msgid "Complements OpenSea for NFT attribution across marketplaces" +msgstr "在跨市场的 NFT 归因中,可作为 OpenSea 的补充" + +#: ../../source/use-cases/crypto.rst:38 4261580262c549d097c7fb6882265b12 +msgid "**Zora**" +msgstr "**Zora**" + +#: ../../source/use-cases/crypto.rst:39 2399fac946c045cab0ef07b24e66a305 +msgid "Zora Network profile, minted NFTs, creator activity" +msgstr "Zora Network 主页、已铸造 NFT、创作者活动" + +#: ../../source/use-cases/crypto.rst:40 6ff049235f9f4cfe9d7b74fc6540d0fa +msgid "Ethereum L2 creator platform; useful for on-chain art attribution" +msgstr "以太坊 L2 上的创作者平台;适用于链上艺术品归因" + +#: ../../source/use-cases/crypto.rst:41 e1018c24556144fdbf2fb840d3daf49c +msgid "**Polymarket**" +msgstr "**Polymarket**" + +#: ../../source/use-cases/crypto.rst:42 d4be83a2949445ca8c18a35fa002c8c8 +msgid "Prediction-market profile, positions, public portfolio P&L" +msgstr "预测市场主页、持仓、公开投资组合的盈亏(P&L)" + +#: ../../source/use-cases/crypto.rst:43 720b43eda58f41d291e12f5b72f1d062 +msgid "Useful for political/financial prediction attribution" +msgstr "适用于政治 / 财经类预测的归因分析" + +#: ../../source/use-cases/crypto.rst:44 1529266027b742a8b7246a2e63d16d3c +msgid "**Warpcast** (Farcaster)" +msgstr "**Warpcast**\ (Farcaster)" + +#: ../../source/use-cases/crypto.rst:45 2ab39c49d51643f2828ba632646663f6 +msgid "Decentralized social profile, posts, follower graph, Farcaster ID" +msgstr "去中心化社交主页、帖子、关注者关系图、Farcaster ID" + +#: ../../source/use-cases/crypto.rst:46 012aec8cfc5748f7a5333b64f160a23f +msgid "" +"Every Farcaster ID maps to an Ethereum address via the on-chain ID " +"registry" +msgstr "每个 Farcaster ID 都通过链上的 ID 注册合约映射到一个以太坊地址" + +#: ../../source/use-cases/crypto.rst:47 150075eb065148a79d79ab23146c587a +msgid "**Fragment**" +msgstr "**Fragment**" + +#: ../../source/use-cases/crypto.rst:48 52316f945d114b6c85205c2bb2779043 +msgid "Telegram username ownership, TON wallet address, purchase date and price" +msgstr "Telegram 用户名的所有权、TON 钱包地址、购买日期与价格" + +#: ../../source/use-cases/crypto.rst:49 19f2fa34a5cf4f70b8952e639a0ba83f +msgid "Valuable for linking Telegram identities to TON wallets" +msgstr "在把 Telegram 身份与 TON 钱包关联起来这件事上非常有价值" + +#: ../../source/use-cases/crypto.rst:50 23d1eda868054a15999e548214cfed59 +msgid "**Paragraph**" +msgstr "**Paragraph**" + +#: ../../source/use-cases/crypto.rst:51 04ff000179da43b594b86e2bad1b2a44 +msgid "Web3 blog/newsletter, ETH wallet address, linked Twitter handle" +msgstr "Web3 博客 / Newsletter、ETH 钱包地址、关联的 Twitter handle" + +#: ../../source/use-cases/crypto.rst:52 a9355ba0d54e4db6b3c7f295e402d511 +msgid "Richest cross-platform data among crypto sites" +msgstr "在加密类站点中,跨平台数据最为丰富" + +#: ../../source/use-cases/crypto.rst:53 d6b87473a4c24f91887880bfcb6d60fa +msgid "**Tonometerbot**" +msgstr "**Tonometerbot**" + +#: ../../source/use-cases/crypto.rst:54 b9fa8e5d654a417faccb1e06172cfbe0 +msgid "TON wallet balance, subscriber count, NFT collection, rankings" +msgstr "TON 钱包余额、订阅数、NFT 收藏、各类排名" + +#: ../../source/use-cases/crypto.rst:55 d9a9d072ac734075aad957cf5360dfc1 +msgid "TON blockchain analytics" +msgstr "TON 区块链分析" + +#: ../../source/use-cases/crypto.rst:56 d28f61e2e9364e148af40ecf2a7a4801 +msgid "**Spatial**" +msgstr "**Spatial**" + +#: ../../source/use-cases/crypto.rst:57 253757f68abc46c3bcd2c89d46288ea0 +msgid "" +"Metaverse profile, linked social accounts (Discord, Twitter, Instagram, " +"LinkedIn, TikTok)" +msgstr "元宇宙主页、关联的社交账号(Discord、Twitter、Instagram、LinkedIn、TikTok)" + +#: ../../source/use-cases/crypto.rst:58 097b7928f50a465884c00a9a3a28d6c8 +msgid "Rich cross-platform links" +msgstr "跨平台链接丰富" + +#: ../../source/use-cases/crypto.rst:59 73cf117adfb841e8a73e4adbab43dc70 +msgid "**Revolut.me**" +msgstr "**Revolut.me**" + +#: ../../source/use-cases/crypto.rst:60 7ba0f8054e6146c791aa6eb60156ffb4 +msgid "" +"Payment handle: first/last name, country code, base currency, supported " +"payment methods" +msgstr "支付 handle:姓名、国家代码、基础币种、支持的支付方式" + +#: ../../source/use-cases/crypto.rst:61 1ff17cb8fa324e8d87af5dada107866a +msgid "" +"Not strictly Web3, but widely used by crypto OTC traders for fiat off-" +"ramps; the public API returns structured KYC-adjacent data" +msgstr "" +"严格意义上不算 Web3,但加密 OTC 交易员普遍用它作为法币出口;其公开 API " +"返回的是结构化的、接近 KYC 的数据" + +#: ../../source/use-cases/crypto.rst:64 f81736e0bc4248328708dac2646e0eeb +msgid "Real-world example: zachxbt" +msgstr "真实案例:zachxbt" + +#: ../../source/use-cases/crypto.rst:66 30ec801d7c774c33b231f9a2e225e093 +msgid "" +"`ZachXBT <https://twitter.com/zachxbt>`_ is a well-known on-chain " +"investigator. Let's see what Maigret can find from just the username " +"``zachxbt``:" +msgstr "" +"`ZachXBT <https://twitter.com/zachxbt>`_ 是一位知名的链上调查员。我们来看看仅凭用户名 ``zachxbt``,Maigret 能挖出些什么:" + +#: ../../source/use-cases/crypto.rst:72 af592d7feeb54257a3f4d0272a872d7c +msgid "" +"Maigret finds 5 accounts and automatically extracts structured data from " +"each:" +msgstr "" +"Maigret 找到 5 个账号,并自动从每个账号中抽取结构化数据:" + +#: ../../source/use-cases/crypto.rst:74 2aa9253cc3ef444190395e9313a23922 +msgid "" +"**Fragment** — confirms the Telegram username ``@zachxbt`` is claimed, " +"reveals the TON wallet address (``EQBisZrk...``), purchase price (10 " +"TON), and date (January 2023)." +msgstr "" +"**Fragment** —— 确认 Telegram 用户名 ``@zachxbt`` 已被占用,披露其 TON " +"钱包地址(``EQBisZrk...``)、购买价格(10 TON)以及日期(2023 年 1 月)。" + +#: ../../source/use-cases/crypto.rst:76 d4210fa5dce642609d0e804626a428b6 +msgid "" +"**Paragraph** — the richest result. Returns the real name used on the " +"platform (``ZachXBT``), bio (``Scam survivor turned 2D investigator``), " +"an Ethereum wallet address (``0x23dBf066...``), and a linked Twitter " +"handle (``zachxbt``). The ``wallet_address`` field is especially valuable" +" — it directly links the pseudonym to an on-chain identity." +msgstr "" +"**Paragraph** —— 信息最丰富的一项。返回该平台上使用的姓名(``ZachXBT``)、个人简介(``Scam survivor turned 2D investigator``)、一个以太坊钱包地址(``0x23dBf066...``)以及关联的 Twitter handle(``zachxbt``)。\ ``wallet_address`` 字段尤其有价值 —— 它直接把这个化名与一个链上身份关联在了一起。" + +#: ../../source/use-cases/crypto.rst:78 80ff1d93437b497c9d3fbe95c5ddbcd6 +msgid "" +"**Warpcast** — Farcaster profile with a Farcaster ID (``fid: 20931``), " +"profile image, and social graph (33K followers). Every Farcaster ID is " +"tied to an Ethereum address via the on-chain ID registry, so this is " +"another on-chain anchor." +msgstr "" +"**Warpcast** —— Farcaster 主页,包含 Farcaster ID(``fid: 20931``)、头像" +"以及社交图谱(3.3 万关注者)。每个 Farcaster ID 都通过链上的 ID 注册合约" +"绑定到一个以太坊地址,因此这又是一个链上锚点。" + +#: ../../source/use-cases/crypto.rst:80 08511f31a12b436589e00f1c5a6681d5 +msgid "" +"**OpenSea** — NFT marketplace profile with bio (``On-chain sleuth | 10x " +"rug pull survivor``), avatar (hosted on ``seadn.io`` with an Ethereum " +"address in the URL path), and a link to an external investigations page." +msgstr "" +"**OpenSea** —— NFT 市场主页,包含个人简介(``On-chain sleuth | 10x rug pull survivor``)、头像(托管在 ``seadn.io`` 上,URL 路径中带有一个以太坊地址),以及一个指向外部调查页面的链接。" + +#: ../../source/use-cases/crypto.rst:82 80d74c0512d94d86ad70c587e206b9a4 +msgid "" +"**Hive Blog** — blockchain-based blog account created in March 2025. Low " +"activity (1 post), but confirms the username is claimed across blockchain" +" ecosystems." +msgstr "" +"**Hive Blog** —— 基于区块链的博客账号,创建于 2025 年 3 月。活跃度较低" +"(仅 1 条帖子),但可以证明该用户名在多个区块链生态中均被占用。" + +#: ../../source/use-cases/crypto.rst:84 514341ad3ff4473587b1183df9ce902c +msgid "From a single username, Maigret produces:" +msgstr "仅凭一个用户名,Maigret 就产出了:" + +#: ../../source/use-cases/crypto.rst:86 9b7cf6d5440645ddbff26636a94b51b3 +msgid "" +"**2 wallet addresses** — one TON (from Fragment), one Ethereum (from " +"Paragraph)" +msgstr "" +"**2 个钱包地址** —— 一个 TON(来自 Fragment),一个以太坊(来自 Paragraph)" + +#: ../../source/use-cases/crypto.rst:87 f12a75c8bd554626bb776d265b0d03db +msgid "**1 confirmed Twitter handle** — ``zachxbt`` (from Paragraph)" +msgstr "**1 个已确认的 Twitter handle** —— ``zachxbt``\ (来自 Paragraph)" + +#: ../../source/use-cases/crypto.rst:88 ee2b8a4d2d654460b1426150cde12138 +msgid "**1 Telegram username** — ``@zachxbt`` (from Fragment)" +msgstr "**1 个 Telegram 用户名** —— ``@zachxbt``\ (来自 Fragment)" + +#: ../../source/use-cases/crypto.rst:89 fb02a867fe9041688628fd93a80c7b9c +msgid "**1 external link** — ``investigations.notion.site`` (from OpenSea)" +msgstr "**1 个外部链接** —— ``investigations.notion.site``\ (来自 OpenSea)" + +#: ../../source/use-cases/crypto.rst:90 bea84cf7fa664843a3659a79d1ca09c2 +msgid "**Social graph data** — 33K Farcaster followers, blog activity timestamps" +msgstr "**社交图谱数据** —— 3.3 万 Farcaster 关注者、博客活动时间戳" + +#: ../../source/use-cases/crypto.rst:92 da5d6e12494449358fbedcf8ce518e3f +msgid "" +"This is enough to pivot into blockchain analysis tools (Etherscan, " +"Arkham, Nansen) using the wallet addresses, or into social media analysis" +" using the Twitter handle." +msgstr "" +"凭这些信息,你可以借助钱包地址转向区块链分析工具(Etherscan、Arkham、" +"Nansen)继续深挖,也可以借助 Twitter handle 转入社交媒体分析。" + +#: ../../source/use-cases/crypto.rst:95 24f6a25beba34fe3a3ae1a03d000edf1 +msgid "Workflow: from username to wallet" +msgstr "工作流:从用户名到钱包" + +#: ../../source/use-cases/crypto.rst:97 8ea66b29b70a4897b6592e5ff2cd8979 +msgid "**Step 1: Search crypto platforms**" +msgstr "**步骤 1:搜索加密类平台**" + +#: ../../source/use-cases/crypto.rst:103 cf0ac1ee52654a4d9e777b70e34fa09f +msgid "Review the results. Pay attention to:" +msgstr "查看结果,重点关注:" + +#: ../../source/use-cases/crypto.rst:105 3791046ddb614f74860bc4900ef1e0a9 +msgid "" +"**Fragment** — if the username is claimed, you get a TON wallet address " +"directly." +msgstr "" +"**Fragment** —— 如果该用户名已被占用,你就能直接拿到一个 TON 钱包地址。" + +#: ../../source/use-cases/crypto.rst:106 8f9b65f0f9074ff3adcb90e07e3ee597 +msgid "" +"**Paragraph** — blog profiles often contain an ETH address and a Twitter " +"handle." +msgstr "" +"**Paragraph** —— 博客主页中常常包含一个 ETH 地址和一个 Twitter handle。" + +#: ../../source/use-cases/crypto.rst:107 cde260dfc7f144c69db4362f24df1c68 +msgid "" +"**Warpcast** — Farcaster IDs map to Ethereum addresses via the on-chain " +"registry." +msgstr "" +"**Warpcast** —— Farcaster ID 通过链上注册合约映射到以太坊地址。" + +#: ../../source/use-cases/crypto.rst:108 a3197c64fedd4b8692e27af02ad0c125 +msgid "**OpenSea** — avatar URLs sometimes contain wallet addresses in the path." +msgstr "**OpenSea** —— 头像 URL 的路径中,有时会嵌入钱包地址。" + +#: ../../source/use-cases/crypto.rst:110 6b73b4fbc38040918cbffda20c3b621b +msgid "**Step 2: Expand with extracted identifiers**" +msgstr "**步骤 2:基于抽取出的标识符进行扩展**" + +#: ../../source/use-cases/crypto.rst:112 1165778c3df34d3aa460923e430fa731 +msgid "" +"Maigret automatically extracts additional identifiers from found profiles" +" (real names, linked accounts, profile URLs) and recursively searches for" +" them. This is enabled by default. If Maigret finds a linked Twitter " +"handle on a Paragraph profile, it will automatically search for that " +"handle across all sites." +msgstr "" +"Maigret 会自动从已发现的主页中抽取更多标识符(真实姓名、关联账号、主页 " +"URL 等),并对其进行递归搜索。此功能默认启用。如果 Maigret 在某个 " +"Paragraph 主页上发现了一个关联的 Twitter handle,它会自动对该 handle 在" +"所有站点上发起搜索。" + +#: ../../source/use-cases/crypto.rst:114 3e2968b0ab304d0d9148dda88cc3dd4e +msgid "**Step 3: Cross-reference with non-crypto platforms**" +msgstr "**步骤 3:与非加密类平台交叉比对**" + +#: ../../source/use-cases/crypto.rst:116 943a68e9bbcc48a6b945ce1e40e0cf30 +msgid "" +"The real power is connecting crypto personas to mainstream accounts. Drop" +" the tag filter:" +msgstr "" +"真正的威力在于把加密身份与主流账号串联起来。去掉标签过滤即可:" + +#: ../../source/use-cases/crypto.rst:122 be3642062cc84d63b2d6f5fc1d15135e +msgid "" +"This checks all 3000+ sites. A match on GitHub, Reddit, or a forum can " +"reveal the person behind the wallet." +msgstr "" +"这会检查全部 3000+ 个站点。如果在 GitHub、Reddit 或某个论坛上匹配上了," +"就可能揭示钱包背后的真人身份。" + +#: ../../source/use-cases/crypto.rst:125 dd079778b09d4c10be312d6dbe665757 +msgid "Workflow: from wallet to identity" +msgstr "工作流:从钱包到身份" + +#: ../../source/use-cases/crypto.rst:127 41314afd5a5d4372a104b4d4f16f6597 +msgid "" +"If you start with a wallet address rather than a username, you can use " +"complementary tools to get a username first:" +msgstr "" +"如果你的起点是钱包地址而不是用户名,可以先借助一些辅助工具,把它转成用户名:" + +#: ../../source/use-cases/crypto.rst:129 c3027e423cf944efbd507d19142c4ad1 +msgid "" +"**ENS / Unstoppable Domains** — resolve the wallet address to a human-" +"readable name (``vitalik.eth``). Then search that name in Maigret." +msgstr "" +"**ENS / Unstoppable Domains** —— 把钱包地址解析为人类可读的名字" +"(``vitalik.eth``),然后在 Maigret 中搜索该名字。" + +#: ../../source/use-cases/crypto.rst:130 be0dc030b5934f40882b4613fa6b2abe +msgid "" +"**Etherscan labels** — check if the address has a public label (exchange," +" known entity)." +msgstr "" +"**Etherscan 标签** —— 查看该地址是否带有公开标签(交易所、已知实体等)。" + +#: ../../source/use-cases/crypto.rst:131 97011ce2b6e245edae02ce7466bdca05 +msgid "" +"**Fragment** — search the TON wallet address to find which Telegram " +"usernames it purchased." +msgstr "" +"**Fragment** —— 用 TON 钱包地址进行搜索,查看它曾经购买过哪些 Telegram " +"用户名。" + +#: ../../source/use-cases/crypto.rst:132 44d52297818b4d3d844ffe9b7ead8003 +msgid "" +"**Arkham Intelligence / Nansen** — blockchain attribution platforms that " +"may tag the address with a known identity." +msgstr "" +"**Arkham Intelligence / Nansen** —— 这些区块链归因平台可能已将该地址打上" +"已知身份的标签。" + +#: ../../source/use-cases/crypto.rst:134 34f2071cdf9d49108bb8062e095e8aec +msgid "Once you have a username candidate, feed it to Maigret." +msgstr "一旦得到候选用户名,就把它喂给 Maigret。" + +#: ../../source/use-cases/crypto.rst:137 4380ee2c21f5418e8031e1db57083e86 +msgid "Tips" +msgstr "技巧" + +#: ../../source/use-cases/crypto.rst:139 fbd1e7f1f06e48ef888f18d9bcbd931c +msgid "" +"**Username reuse is the #1 signal.** Crypto-native users often reuse " +"their ENS name (``alice.eth``) or a variation (``alice_eth``, " +"``aliceeth``) across platforms. Try all variations." +msgstr "" +"**用户名复用是最重要的信号。** 加密原生用户经常跨平台复用自己的 ENS 名" +"(``alice.eth``)或其变体(``alice_eth``\ 、\ ``aliceeth``)。务必把所有变体" +"都试一遍。" + +#: ../../source/use-cases/crypto.rst:140 8bb6fe7926234043aa8a11d5bf5b21dc +msgid "" +"**Fragment is uniquely valuable** because it directly links Telegram " +"usernames to TON wallet addresses — a rare on-chain / off-chain bridge." +msgstr "" +"**Fragment 的价值无可替代**,因为它直接把 Telegram 用户名和 TON 钱包地址" +"绑在了一起 —— 这是一座少见的“链上 / 链下”桥梁。" + +#: ../../source/use-cases/crypto.rst:141 358b7cdcaec046a082ee101df7df939f +msgid "" +"**Warpcast profiles are Ethereum-native.** Every Farcaster account is " +"tied to an Ethereum address via the ID registry contract. If you find a " +"Warpcast profile, you implicitly have a wallet address." +msgstr "" +"**Warpcast 主页本质上是以太坊原生的。** 每个 Farcaster 账号都通过 ID " +"注册合约绑定到一个以太坊地址。找到一个 Warpcast 主页,就相当于隐式拿到了" +"一个钱包地址。" + +#: ../../source/use-cases/crypto.rst:142 0d2489ee349b458c8e9ce0314d732a51 +msgid "" +"**Paragraph often has the richest data** — wallet address, Twitter " +"handle, bio, and activity timestamps in a single API response." +msgstr "" +"**Paragraph 通常是信息最丰富的一项** —— 钱包地址、Twitter handle、个人简介" +"以及活动时间戳,常常在同一份 API 响应中一并返回。" + +#: ../../source/use-cases/crypto.rst:143 c5fa5df259ca4db0b2989c65d5f8074d +msgid "" +"**Use** ``--exclude-tags`` **to skip irrelevant sites** when you're " +"focused on crypto:" +msgstr "" +"在专注于加密调查时,\ **使用** ``--exclude-tags`` **跳过无关站点**:" diff --git a/docs/source/locale/zh_CN/LC_MESSAGES/use-cases/scientists.po b/docs/source/locale/zh_CN/LC_MESSAGES/use-cases/scientists.po new file mode 100644 index 0000000..a54debf --- /dev/null +++ b/docs/source/locale/zh_CN/LC_MESSAGES/use-cases/scientists.po @@ -0,0 +1,353 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2025, soxoj +# This file is distributed under the same license as the Maigret package. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2026. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Maigret 0.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-05-30 14:25+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language: zh_CN\n" +"Language-Team: zh_CN <LL@li.org>\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: ../../source/use-cases/scientists.rst:4 7b5ff03b9c0f472b8c3cd95f60c1f8e1 +msgid "Academic & Research Investigations" +msgstr "" + +#: ../../source/use-cases/scientists.rst:6 e3ac16b61b1f4945a3bf64e154d5d262 +msgid "" +"Academic identity has a unique anchor that social-media identity does " +"not: the **ORCID** (Open Researcher and Contributor ID). Every ORCID is " +"verified, globally unique, and tied to a confirmed email — a single " +"confirmed ORCID match between two platforms means the **same human**, " +"with effectively zero false-positive rate." +msgstr "" + +#: ../../source/use-cases/scientists.rst:8 d782c133394947f3aa209a9346a99e3e +msgid "" +"Maigret uses ORCID as a first-class identifier: extract it once from a " +"username-keyed profile (iNaturalist, GitHub bio, lab homepage), then " +"pivot into the academic graph (ORCID, OpenAlex, arXiv, DBLP, Scholia) — a" +" chain of HTTP calls that turns an anonymous handle into a CV with " +"employer, education, publication list, citation count, co-author graph, " +"and topical area." +msgstr "" + +#: ../../source/use-cases/scientists.rst:11 867228e9de47484e83d1807fd4e6eb26 +msgid "Why it matters" +msgstr "" + +#: ../../source/use-cases/scientists.rst:13 f5b624f1dd494a4b9457fbb827dc23d5 +msgid "" +"Most OSINT work on academic targets stalls at the same bottleneck: people" +" use one alias on a citizen-science site, a different alias on Twitter, a" +" third in a forum signature, and only their real name on PubMed. " +"Connecting the personas by hand means trawling Google Scholar, " +"ResearchGate, university web pages, and old conference programmes. ORCID " +"short-circuits this entirely — one verified identifier resolves all of " +"them." +msgstr "" + +#: ../../source/use-cases/scientists.rst:15 b64f4161731e428199f9b3ea7c14f228 +msgid "Common scenarios:" +msgstr "" + +#: ../../source/use-cases/scientists.rst:17 5deba3f670f64edc8a1bb0fb9f8c23f2 +msgid "" +"**Researcher background check.** Before a collaboration, a preprint " +"review, or a grant decision — verifying that a claimed h-index, " +"employment history, and publication count actually match the public ORCID" +" record." +msgstr "" + +#: ../../source/use-cases/scientists.rst:18 cbe573103ee549938e66d27db5682fb2 +msgid "" +"**Co-author graph reconstruction.** From a single ORCID, OpenAlex returns" +" every co-author, their institutions, and topical clusters — useful for " +"spotting undisclosed conflicts of interest." +msgstr "" + +#: ../../source/use-cases/scientists.rst:19 e8757165fe994f439ff329ebd840d5b3 +msgid "" +"**Paper mill / fraud investigation.** When a suspicious paper's authors " +"share an ORCID-claimed identity, the cross-platform footprint (or absence" +" of one) is itself evidence." +msgstr "" + +#: ../../source/use-cases/scientists.rst:20 c7da890638cb4e7598e1abbe83deb77c +msgid "" +"**Pseudonym deanonymisation.** A wildlife photographer posts naturalist " +"observations under the handle ``kueda``. iNaturalist's public API returns" +" their ORCID, and one further request reveals their real name, employer " +"(California Academy of Sciences), education (UC Berkeley), and 700+ " +"citable observations." +msgstr "" + +#: ../../source/use-cases/scientists.rst:21 90a41c759dbe4c18a168180597059fb6 +msgid "" +"**Award / appointment due diligence.** Confirming a Turing-Award claim, a" +" tenure status, or a society fellowship via the DBLP and ORCID activity " +"timelines rather than a CV PDF." +msgstr "" + +#: ../../source/use-cases/scientists.rst:24 c4c61174c75945dc9ff5f5c0b88dfff4 +msgid "Supported sites" +msgstr "" + +#: ../../source/use-cases/scientists.rst:26 89387151cb984ef29a906e1e6010b0b7 +msgid "" +"Maigret currently checks the following ORCID-keyed platforms (use ``--id-" +"type orcid`` when starting from a bare ORCID, or rely on the recursive " +"chain when starting from a username):" +msgstr "" + +#: ../../source/use-cases/scientists.rst:32 7018dd5767c34188852e8849b4f7963d +msgid "Site" +msgstr "" + +#: ../../source/use-cases/scientists.rst:33 90d3927d6b5541ef911b851a8b202352 +msgid "What it reveals" +msgstr "" + +#: ../../source/use-cases/scientists.rst:34 3300c20b483c4730b27f8acbfa5d5309 +msgid "Notes" +msgstr "" + +#: ../../source/use-cases/scientists.rst:35 165a217f9d334f37ba8c9ba6bea6b6c3 +msgid "**ORCID**" +msgstr "" + +#: ../../source/use-cases/scientists.rst:36 ed3a9670c6224bb8ac3e5f47ccf94e26 +msgid "" +"Full name, biography, employment, education, researcher URLs (homepages " +"and social), keywords, country, linked external IDs (Scopus, " +"ResearcherID, Loop), publication summary, email-verified status" +msgstr "" + +#: ../../source/use-cases/scientists.rst:37 66cbb10c920544feb9857a7d6aa94395 +msgid "" +"All disciplines — ORCID is a field-agnostic identifier issued to any " +"researcher." +msgstr "" + +#: ../../source/use-cases/scientists.rst:38 b5f4938be8634202aa2ef55a2bab7231 +msgid "**OpenAlex**" +msgstr "" + +#: ../../source/use-cases/scientists.rst:39 4274c0b3ce134202a5fe26d2fab4539c +msgid "" +"Display name and name alternatives, works count, total citations, " +"h-index, i10-index, last-known institutions (with country), topical " +"areas, raw author-name variants from publications" +msgstr "" + +#: ../../source/use-cases/scientists.rst:40 1231967f924f44638ab08e7ab8f51a6d +msgid "" +"All disciplines — indexes works across the entire scholarly literature, " +"from humanities to medicine." +msgstr "" + +#: ../../source/use-cases/scientists.rst:41 8dd55c43c3814466924b05161b7bbf44 +msgid "**arXiv**" +msgstr "" + +#: ../../source/use-cases/scientists.rst:42 ffdbe5ff004544beba1352c016a4fdf6 +msgid "Author preprint listing — paper titles, IDs, dates" +msgstr "" + +#: ../../source/use-cases/scientists.rst:43 e49114fe565a4e0bbdb180046e7fd2a0 +msgid "" +"Strongly biased toward physics, math, CS (and quantitative biology, " +"statistics, EE, quantitative finance, economics)." +msgstr "" + +#: ../../source/use-cases/scientists.rst:44 9093d0eb93c8445d8229512dcda2361e +msgid "**DBLP**" +msgstr "" + +#: ../../source/use-cases/scientists.rst:45 c36bcf7b35f44e38871046b2ade683b4 +msgid "" +"Full name, DBLP person ID, paper count, affiliation, awards (e.g. Turing " +"Award), homepage URLs, links to Google Scholar / ResearchGate / Scopus" +msgstr "" + +#: ../../source/use-cases/scientists.rst:46 a99b909aaa494a638e30b89c24406004 +msgid "" +"Computer science only — a biologist or pure economist will not be in the " +"index." +msgstr "" + +#: ../../source/use-cases/scientists.rst:47 4e012a634eac4833bd2f5c11140a6778 +msgid "**Scholia**" +msgstr "" + +#: ../../source/use-cases/scientists.rst:48 dc081b477db34543a4f5734800bb6bb7 +msgid "" +"Wikidata QID for the author, linked publications, co-author graph, " +"employer/affiliation timeline, topical clusters" +msgstr "" + +#: ../../source/use-cases/scientists.rst:49 feb7693e07684c1bbab49d2befc782ec +msgid "" +"All disciplines, but only if the author has been curated in Wikidata — " +"coverage is broadest for prominent figures (award winners, senior " +"faculty, deceased researchers)." +msgstr "" + +#: ../../source/use-cases/scientists.rst:52 eab5a8d300404c0eb8fbd7ebbcb80333 +msgid "Workflow: from username to ORCID" +msgstr "" + +#: ../../source/use-cases/scientists.rst:54 808d5ce53d964749887069bae38c807c +msgid "**Step 1: Find a profile that publishes ORCID**" +msgstr "" + +#: ../../source/use-cases/scientists.rst:56 d1234c3240e242a287bc35d4ed4bc7ad +msgid "" +"The most reliable bridges from a username to an ORCID are platforms whose" +" users *want* their academic identity discoverable. In practice:" +msgstr "" + +#: ../../source/use-cases/scientists.rst:58 82b0e296494b48c7b85603018e3bbe87 +#, python-brace-format +msgid "" +"**iNaturalist** — biologists, naturalists, citizen scientists. Public API" +" ``api.inaturalist.org/v1/users/{username}`` returns the ORCID directly " +"in the ``orcid`` field. Maigret extracts it automatically." +msgstr "" + +#: ../../source/use-cases/scientists.rst:59 a1f675cec421482ea6f97a690ea06ed3 +#, python-brace-format +msgid "" +"**GitHub** — scientists often paste their ORCID URL into the **bio** or " +"**blog** field on their GitHub profile, or under a *generic* entry in " +"``/users/{u}/social_accounts``. A pattern like " +"``orcid\\.org/(\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dX])`` matches both " +"``http://orcid.org/...`` and ``orcid.org/...`` variants." +msgstr "" + +#: ../../source/use-cases/scientists.rst:60 79c5a098a2ad412e875dda25af551ee2 +msgid "" +"**Lab homepage / institutional bio.** Use ``--parse <URL>`` to scrape an " +"arbitrary page for known identifiers — useful when the target's footprint" +" lives at ``faculty.example.edu/~jdoe``." +msgstr "" + +#: ../../source/use-cases/scientists.rst:62 5239ba6c999445f8ab55e37b84366969 +msgid "**Step 2: Let the recursive search run**" +msgstr "" + +#: ../../source/use-cases/scientists.rst:68 2a6e2072e73a4f36ae2d17c296e53ae7 +msgid "" +"Recursive search is enabled by default. As soon as Maigret extracts an " +"``orcid`` field from any found profile, it queues an ``--id-type orcid`` " +"second wave automatically. No manual chaining needed." +msgstr "" + +#: ../../source/use-cases/scientists.rst:70 80271d7bde6244ae8bae4efa2e8b6932 +msgid "**Step 3: Start from a bare ORCID**" +msgstr "" + +#: ../../source/use-cases/scientists.rst:72 9e5b19c6bdb646deaeb1e132dfb00b4a +msgid "" +"If you already have the ORCID (e.g. from a paper's author footer, a grant" +" database, or a Wikidata entry):" +msgstr "" + +#: ../../source/use-cases/scientists.rst:78 d996f47f9c8b4f4e911e4cd407482945 +msgid "This bypasses the username-bridge step entirely." +msgstr "" + +#: ../../source/use-cases/scientists.rst:81 dc57bde7ca0043b790d9b2fae391e7ca +msgid "Workflow: from ORCID to mainstream identity" +msgstr "" + +#: ../../source/use-cases/scientists.rst:83 cbfc17b9a07a40c391018b99089aa0c5 +msgid "" +"The ORCID record itself contains the link back to ordinary social " +"platforms:" +msgstr "" + +#: ../../source/use-cases/scientists.rst:85 aecd3e6275544d1ebcc0e05617e1eeb9 +msgid "" +"**ORCID ``researcher-urls``** — a list of self-declared external links. " +"Typical entries: lab homepage, Twitter/Bluesky/Mastodon profile, personal" +" blog. These are entered by the researcher and therefore confirmed." +msgstr "" + +#: ../../source/use-cases/scientists.rst:86 00baf7aced6e4013a70030dad1e95196 +msgid "" +"**ORCID ``external-identifiers``** — IDs from sibling academic systems " +"(Scopus Author ID, ResearcherID/Publons, Loop profile). Each unlocks " +"another extraction pipeline." +msgstr "" + +#: ../../source/use-cases/scientists.rst:87 74ffab64a3d041ec83e361347a40fb46 +msgid "" +"**OpenAlex ``last_known_institutions``** — current employer with country," +" ROR ID, and OpenAlex institution ID; useful for pivoting into the " +"institution's directory." +msgstr "" + +#: ../../source/use-cases/scientists.rst:88 77fab68f62a544769f76eb08c872deb6 +msgid "" +"**DBLP** ``<url>`` **tags** — DBLP records often embed direct links to " +"Google Scholar, ResearchGate, and personal pages." +msgstr "" + +#: ../../source/use-cases/scientists.rst:89 e6efabbec6634f1384c1c03caf2990a4 +msgid "" +"**Scholia ``wikidata_qid``** — once you have a Wikidata QID, the SPARQL " +"endpoint unlocks the broadest external ID set in any single OSINT system:" +" VIAF, LCCN, GND, Twitter handle, Mastodon handle, IMDb, GitHub, ORCID, " +"and ~200 others." +msgstr "" + +#: ../../source/use-cases/scientists.rst:92 8dca4a2181844b9a9e7ef231ddb66d1f +msgid "Tips" +msgstr "" + +#: ../../source/use-cases/scientists.rst:94 b2e8e4b9c2f74a4ea9d6a3e7c0d5f1a8 +msgid "" +"**Email comes from ORCID** — within the academic chain (ORCID, OpenAlex, " +"arXiv, DBLP, Scholia) it is the only source that returns an email " +"address, and only when the researcher has marked their primary email " +"public. The same response also carries ``history.verified-primary-" +"email``, an ORCID-confirmed flag that means the address was email-" +"validated at registration. Use this as a strong pivot into email-keyed " +"lookups (Holehe, HIBP, Gravatar, etc.)." +msgstr "" + +#: ../../source/use-cases/scientists.rst:95 c3f9f5cad3e85b5fb0e7b4f8d1e6f2b9 +msgid "" +"**Outside the academic chain, GitLab is the dev platform most likely to " +"leak an email** via its public ``public_email`` field — relevant for " +"scientists who self-host code on a CERN/research-institute GitLab. " +"GitHub's REST API does not expose email by default." +msgstr "" + +#: ../../source/use-cases/scientists.rst:96 a465848b418c416c8eccf6f06e35b3d3 +msgid "" +"**Compare OpenAlex** ``raw_author_names`` **against the ORCID** ``other-" +"names``. Discrepancies often expose pre-marriage names, transliterations " +"from non-Latin scripts, or co-author misattributions worth flagging." +msgstr "" + +#: ../../source/use-cases/scientists.rst:97 44313424c1a14ebfbb94b92ec821e228 +#, python-brace-format +msgid "" +"**Anything fed into** ``--id-type orcid`` **must match** " +"``^\\d{4}-\\d{4}-\\d{4}-\\d{3}[\\dX]$``. The trailing character may " +"legitimately be ``X`` (ISO checksum); strip ``https://orcid.org/`` " +"prefixes before passing the bare ID." +msgstr "" + diff --git a/docs/source/maigret_screenshot.png b/docs/source/maigret_screenshot.png new file mode 100644 index 0000000..704b1dc Binary files /dev/null and b/docs/source/maigret_screenshot.png differ diff --git a/docs/source/philosophy.rst b/docs/source/philosophy.rst new file mode 100644 index 0000000..4ff44db --- /dev/null +++ b/docs/source/philosophy.rst @@ -0,0 +1,41 @@ +.. _philosophy: + +Philosophy +========== + + *The Commissioner Jules Maigret is a fictional French police detective, created by Georges Simenon. + His investigation method is based on understanding the personality of different people and their + interactions.* + +TL;DR: Username => Dossier + +Maigret is designed to gather all the available information about person by his username. + +What kind of information is this? First, links to person accounts. Secondly, all the machine-extractable +pieces of info, such as: other usernames, full name, URLs to people's images, birthday, location (country, +city, etc.), gender. + +All this information forms some dossier, but it also useful for other tools and analytical purposes. +Each collected piece of data has a label of a certain format (for example, ``follower_count`` for the number +of subscribers or ``created_at`` for account creation time) so that it can be parsed and analyzed by various +systems and stored in databases. + +Origins +------- + +Maigret started from studying what OSINT investigators actually use in practice — and from +the realization that many popular tools do not deliver real investigative value. The original +research behind this observation is summarized in the article +`What's wrong with namecheckers <https://soxoj.medium.com/whats-wrong-with-namecheckers-981e5cba600e>`_. +For a broader landscape of username-checking tools, see the curated +`OSINT namecheckers list <https://github.com/soxoj/osint-namecheckers-list>`_. + +Two ideas grew out of that research: + +- `socid-extractor <https://github.com/soxoj/socid-extractor>`_ — a library focused on pulling + structured identity data (user IDs, full names, linked accounts, bios, timestamps, etc.) out of + account pages and public API responses, so that finding an account is not the end of the pipeline. +- **Maigret** itself — which started as a fork of + `Sherlock <https://github.com/sherlock-project/sherlock>`_ but has long since outgrown the + original project in coverage, extraction depth, and check reliability. Today Maigret is used + as a component by major OSINT vendors in their commercial products. diff --git a/docs/source/quick-start.rst b/docs/source/quick-start.rst new file mode 100644 index 0000000..912d11d --- /dev/null +++ b/docs/source/quick-start.rst @@ -0,0 +1,15 @@ +.. _quick-start: + +Quick start +=========== + +After :doc:`installing Maigret <installation>`, you can begin searching by providing one or more usernames to look up: + +``maigret username1 username2 ...`` + +Maigret will search for accounts with the specified usernames across a vast number of websites. It will provide you with a list +of URLs to any discovered accounts, along with relevant information extracted from those profiles. + +.. image:: maigret_screenshot.png + :alt: Maigret search results screenshot + :align: center diff --git a/docs/source/settings.rst b/docs/source/settings.rst new file mode 100644 index 0000000..d5a4871 --- /dev/null +++ b/docs/source/settings.rst @@ -0,0 +1,276 @@ +.. _settings: + +Settings +============== + +.. warning:: + The settings system is under development and may be subject to change. + +Options are also configurable through settings files. See +`settings JSON file <https://github.com/soxoj/maigret/blob/main/maigret/resources/settings.json>`_ +for the list of currently supported options. + +After start Maigret tries to load configuration from the following sources in exactly the same order: + +.. code-block:: console + + # relative path, based on installed package path + resources/settings.json + + # absolute path, configuration file in home directory + ~/.maigret/settings.json + + # relative path, based on current working directory + settings.json + +Missing any of these files is not an error. +If the next settings file contains already known option, +this option will be rewritten. So it is possible to make +custom configuration for different users and directories. + +.. _database-auto-update: + +Database auto-update +-------------------- + +Maigret ships with a bundled site database, but it gets outdated between releases. To keep the database current, Maigret automatically checks for updates on startup. + +**How it works:** + +1. On startup, Maigret checks if more than 24 hours have passed since the last update check. +2. If so, it fetches a lightweight metadata file (~200 bytes) from GitHub to see if a newer database is available. +3. If a newer, compatible database exists, Maigret downloads it to ``~/.maigret/data.json`` and uses it instead of the bundled copy. +4. If the download fails or the new database is incompatible with your Maigret version, the bundled database is used as a fallback. + +The downloaded database has **higher priority** than the bundled one — it replaces, not overlays. + +**Status messages** are printed only when an action occurs: + +.. code-block:: text + + [*] DB auto-update: checking for updates... + [+] DB auto-update: database updated successfully (3180 sites) + [*] DB auto-update: database is up to date (3157 sites) + [!] DB auto-update: latest database requires maigret >= 0.6.0, you have 0.5.0 + +**Forcing an update:** + +Use the ``--force-update`` flag to check for updates immediately, ignoring the check interval: + +.. code-block:: console + + maigret username --force-update + +The update happens at startup, then the search continues normally with the freshly downloaded database. + +**Disabling auto-update:** + +Use the ``--no-autoupdate`` flag to skip the update check entirely: + +.. code-block:: console + + maigret username --no-autoupdate + +Or set it permanently in ``~/.maigret/settings.json``: + +.. code-block:: json + + { + "no_autoupdate": true + } + +This is recommended for **Docker containers**, **CI pipelines**, and **air-gapped environments**. + +**Configuration options** (in ``settings.json``): + +.. list-table:: + :header-rows: 1 + :widths: 35 15 50 + + * - Setting + - Default + - Description + * - ``no_autoupdate`` + - ``false`` + - Disable auto-update entirely + * - ``autoupdate_check_interval_hours`` + - ``24`` + - How often to check for updates (in hours) + * - ``db_update_meta_url`` + - GitHub raw URL + - URL of the metadata file (for custom mirrors) + +**Using a custom database** with ``--db`` always skips auto-update — you are explicitly choosing your data source. + +Cloudflare webgate +------------------ + +.. warning:: + + **Experimental.** The ``cloudflare_bypass`` block is under active + development; field names, defaults, and the trigger-protection routing + rules may change without backwards-compatibility guarantees. + +The ``cloudflare_bypass`` block in ``settings.json`` configures the optional +bypass described in :ref:`cloudflare-bypass`. The same block is honoured by +the CLI, the Python API, and the web UI (``python -m maigret.web.app``); set +``enabled: true`` once and every entry point routes cf-protected sites +through the solver. + +**Minimal FlareSolverr setup.** Start the solver in Docker, then drop the +following snippet into ``~/.maigret/settings.json`` (or any path listed in +:ref:`settings`): + +.. code-block:: bash + + docker run -d -p 8191:8191 --name flaresolverr \ + ghcr.io/flaresolverr/flaresolverr:latest + +.. code-block:: json + + { + "cloudflare_bypass": { + "enabled": true, + "modules": [ + { + "name": "flaresolverr", + "method": "json_api", + "url": "http://localhost:8191/v1", + "max_timeout_ms": 60000 + } + ] + } + } + +That is enough — ``session_prefix`` and ``trigger_protection`` fall back to +sensible defaults (``"maigret"`` and +``["cf_js_challenge", "cf_firewall", "webgate"]`` respectively). On the next +run, Maigret logs ``Cloudflare webgate active: ...`` and routes matching +sites through the solver. + +Default value (full schema with every supported field): + +.. code-block:: json + + { + "cloudflare_bypass": { + "enabled": false, + "session_prefix": "maigret", + "trigger_protection": ["cf_js_challenge", "cf_firewall", "webgate"], + "modules": [ + { + "name": "flaresolverr", + "method": "json_api", + "url": "http://localhost:8191/v1", + "max_timeout_ms": 60000 + }, + { + "name": "chrome_webgate", + "method": "url_rewrite", + "url": "http://localhost:8000/html?url={url}&retries=1" + } + ] + } + } + +**Fields.** + +.. list-table:: + :header-rows: 1 + :widths: 30 70 + + * - Field + - Description + * - ``enabled`` + - When ``true``, the bypass is active for every run; when ``false`` + (the default), it activates only on ``--cloudflare-bypass``. + * - ``trigger_protection`` + - List of ``site.protection`` values that route a check through the + webgate. Sites whose protection is empty or doesn't intersect this + list use the default (aiohttp / curl_cffi) checker. + * - ``session_prefix`` + - Prefix for the FlareSolverr ``session`` field. Maigret appends the + process PID so concurrent runs don't collide. Reusing a session + caches cf_clearance between checks of the same domain. + * - ``modules`` + - Ordered list of backend modules. The first reachable module + handles the check; later ones serve as a fallback chain. + +**Module methods.** + +* ``json_api`` — FlareSolverr-compatible POST endpoint at ``url``. + Preserves real upstream HTTP status, headers and final URL. + Optional ``max_timeout_ms`` (default ``60000``) is the per-request + budget the solver is allowed to spend on the JS challenge. +* ``url_rewrite`` — legacy CloudflareBypassForScraping endpoint. The + ``url`` must contain a ``{url}`` placeholder; the original probe URL + is URL-encoded and substituted in. Returns rendered HTML only — + ``checkType: status_code`` and ``response_url`` checks misfire under + this method (treated as a synthetic HTTP 200 on success). + +**Optional ``proxy`` field (``json_api`` only).** + +A module may carry a ``proxy`` entry that the solver routes the upstream +request through. Useful when a site enforces ``ip_reputation`` rules +that block the solver host. Two forms are accepted: + +.. code-block:: json + + { "proxy": "socks5://localhost:1080" } + +.. code-block:: json + + { "proxy": { "url": "http://gw.example:3128", + "username": "u", + "password": "p" } } + +Only ``url``/``username``/``password`` are forwarded; other keys are +dropped. Cloudflare ``Error 1015 / 1020`` responses indicate the IP is +rate-limited or banned — switch the proxy rather than retrying. +.. _ai-analysis-settings: + +AI analysis +----------- + +The ``--ai`` flag (see :ref:`ai-analysis`) talks to an OpenAI-compatible +chat completion API. Three settings control how that request is made: + +.. list-table:: + :header-rows: 1 + :widths: 35 25 40 + + * - Setting + - Default + - Description + * - ``openai_api_key`` + - ``""`` (empty) + - API key. If empty, Maigret falls back to the ``OPENAI_API_KEY`` + environment variable. + * - ``openai_model`` + - ``gpt-4o`` + - Default model name. Overridable per-run with ``--ai-model``. + * - ``openai_api_base_url`` + - ``https://api.openai.com/v1`` + - Base URL of the chat completion API. Point this at any + OpenAI-compatible service (Azure OpenAI, OpenRouter, a local + server, …) to use it instead of OpenAI directly. + +Example ``~/.maigret/settings.json`` snippet using a non-OpenAI +endpoint: + +.. code-block:: json + + { + "openai_api_key": "sk-...", + "openai_model": "gpt-4o-mini", + "openai_api_base_url": "https://openrouter.ai/api/v1" + } + +The key resolution order is ``settings.openai_api_key`` → ``OPENAI_API_KEY`` +environment variable; the first non-empty value wins. + +.. note:: + + ``--ai`` sends the full internal Markdown report (which contains the + gathered profile data) to the configured endpoint. Only use providers + and accounts you trust with that data. diff --git a/docs/source/supported-identifier-types.rst b/docs/source/supported-identifier-types.rst new file mode 100644 index 0000000..312a223 --- /dev/null +++ b/docs/source/supported-identifier-types.rst @@ -0,0 +1,15 @@ +.. _supported-identifier-types: + +Supported identifier types +========================== + +Maigret can search against not only ordinary usernames, but also through certain common identifiers. There is a list of all currently supported identifiers. + +- **gaia_id** - Google inner numeric user identifier, in former times was placed in a Google Plus account URL. +- **steam_id** - Steam inner numeric user identifier. +- **wikimapia_uid** - Wikimapia.org inner numeric user identifier. +- **uidme_uguid** - uID.me inner numeric user identifier. +- **yandex_public_id** - Yandex sites inner letter user identifier. See also: `YaSeeker <https://github.com/HowToFind-bot/YaSeeker>`_. +- **vk_id** - VK.com inner numeric user identifier. +- **ok_id** - OK.ru inner numeric user identifier. +- **yelp_userid** - Yelp inner user identifier. diff --git a/docs/source/tags.rst b/docs/source/tags.rst new file mode 100644 index 0000000..00543d5 --- /dev/null +++ b/docs/source/tags.rst @@ -0,0 +1,46 @@ +.. _tags: + +Tags +==== + +The use of tags allows you to select a subset of the sites from big Maigret DB for search. + +.. warning:: + Tags markup is still not stable. + +There are several types of tags: + +1. **Country codes**: ``us``, ``jp``, ``br``... (`ISO 3166-1 alpha-2 <https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2>`_). A country tag means that having an account on the site implies a connection to that country — either origin or residence. The goal is attribution, not perfect accuracy. + + - **Global sites** (GitHub, YouTube, Reddit, Medium, etc.) get **no country tag** — an account there says nothing about where a person is from. + - **Regional/local sites** where an account implies a specific country **must** have a country tag: ``VK`` → ``ru``, ``Naver`` → ``kr``, ``Zhihu`` → ``cn``. + - Multiple country tags are allowed when a service is used predominantly in a few countries (e.g. ``Xing`` → ``de``, ``eu``). + - Do **not** assign country tags based on traffic statistics alone — a site popular in India by traffic is not "Indian" if it is used globally. + +2. **Site engines**. Most of them are forum engines now: ``uCoz``, ``vBulletin``, ``XenForo`` et al. Full list of engines stored in the Maigret database. + +3. **Sites' subject/type and interests of its users**. Full list of "standard" tags is `present in the source code <https://github.com/soxoj/maigret/blob/main/maigret/sites.py#L13>`_ only for a moment. + +Usage +----- +``--tags us,jp`` -- search on US and Japanese sites (actually marked as such in the Maigret database) + +``--tags coding`` -- search on sites related to software development. + +``--tags ucoz`` -- search on uCoz sites only (mostly CIS countries) + +Blacklisting (excluding) tags +------------------------------ +You can exclude sites with certain tags from the search using ``--exclude-tags``: + +``--exclude-tags porn,dating`` -- skip all sites tagged with ``porn`` or ``dating``. + +``--exclude-tags ru`` -- skip all Russian sites. + +You can combine ``--tags`` and ``--exclude-tags`` to fine-tune your search: + +``--tags forum --exclude-tags ru`` -- search on forum sites, but skip Russian ones. + +In the web interface, the tag cloud supports three states per tag: +click once to **include** (green), click again to **exclude** (dark/strikethrough), +and click once more to return to **neutral** (red). diff --git a/docs/source/tor-and-proxies.rst b/docs/source/tor-and-proxies.rst new file mode 100644 index 0000000..5ca9e37 --- /dev/null +++ b/docs/source/tor-and-proxies.rst @@ -0,0 +1,122 @@ +.. _tor-and-proxies: + +Tor, I2P, and proxies +===================== + +Maigret can route checks through an HTTP/SOCKS proxy, the Tor network, or I2P. Three CLI flags cover three distinct goals — knowing which one you need is the most common stumbling block. + +``--proxy`` vs ``--tor-proxy`` (and ``--i2p-proxy``) +---------------------------------------------------- + +The most-asked question (see `issue #544 <https://github.com/soxoj/maigret/issues/544>`_): + +- **You want every check to go through Tor** (e.g. you're on Tails OS, or behind a country-level block, or your IP is rate-limited). → Use ``--proxy``, pointing at your Tor SOCKS port: + + .. code-block:: console + + maigret <username> --proxy socks5://127.0.0.1:9050 + +- **You want to reach ``.onion`` sites in the Maigret database**, while the rest of the run still uses your normal connection. → Use ``--tor-proxy``: + + .. code-block:: console + + maigret <username> --tor-proxy socks5://127.0.0.1:9050 + + ``--tor-proxy`` is **only** consulted for sites whose ``url`` is a ``.onion`` host. For every other site Maigret uses your direct connection (or ``--proxy`` if set). Without ``--tor-proxy``, ``.onion`` sites are silently skipped. + +The same split applies to ``--i2p-proxy``: it is consulted only for ``.i2p`` hosts, never for clearweb sites. + +Defaults: ``--tor-proxy`` defaults to ``socks5://127.0.0.1:9050`` and ``--i2p-proxy`` to ``http://127.0.0.1:4444``. ``--proxy`` has no default. Maigret does **not** launch ``tor`` or an I2P router for you — start the daemon first. + +Tor Browser vs system ``tor``: port numbers +------------------------------------------- + +The SOCKS port differs by Tor installation: + +- **System ``tor`` daemon** (``apt install tor``, ``brew install tor``, Tails) listens on ``9050``. +- **Tor Browser bundle** ships its own ``tor`` listening on ``9150``. + +If a connection refuses, try the other port: + +.. code-block:: console + + # system tor + maigret <username> --proxy socks5://127.0.0.1:9050 + + # Tor Browser running in the background + maigret <username> --proxy socks5://127.0.0.1:9150 + +A note on results over Tor +-------------------------- + +Most public WAFs (Cloudflare, DDoS-Guard, AWS WAF, Akamai) block Tor exit nodes by default — usually more aggressively than they block datacenter IPs. A Tor run typically produces **more UNKNOWNs and fewer CLAIMEDs** than the same run from a residential connection. This is not a bug in Maigret; it is the cost of anonymity. + +Recommended flags for a Tor run: + +.. code-block:: console + + maigret <username> --proxy socks5://127.0.0.1:9050 --timeout 60 --retries 2 + +- ``--timeout 60`` — Tor circuits add 1–3 seconds per request; the default 30 s causes spurious timeouts. +- ``--retries 2`` — retries cover transient circuit failures, which are common on Tor. +- Optional ``-n 20`` — lowering concurrency (default 100) reduces the chance of exits rate-limiting you. + +If you mainly need to bypass WAFs (rather than to remain anonymous), a residential proxy will usually outperform Tor by a wide margin. See the **"Lots of sites fail / timeout / return 403"** section in `TROUBLESHOOTING.md <https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md>`_. + +Running on Tails OS +------------------- + +Tails forces every outbound connection through Tor at the network layer. Maigret needs no special configuration to comply — pointing ``--proxy`` at the Tails Tor daemon is enough: + +.. code-block:: console + + maigret <username> --proxy socks5://127.0.0.1:9050 --timeout 60 + +Things that are **not** needed: + +- ``torsocks maigret …`` and ``torify maigret …`` — these wrap libc socket calls, but Maigret's HTTP client (``aiohttp`` / ``curl_cffi``) bypasses libc for network I/O, so the wrapper has no effect. Use ``--proxy`` instead. +- ``--tor-proxy`` — on Tails, *everything* must go via Tor (the OS enforces this), so the niche "only .onion via Tor" mode that ``--tor-proxy`` provides does not apply. + +Installation over Tor on Tails +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``pip`` itself does not know about Tor; on Tails you need ``torsocks`` to wrap it: + +.. code-block:: console + + torsocks pip install --user maigret + +After install, the binary lands in ``~/.local/bin/maigret``. If ``maigret: command not found``, either add ``~/.local/bin`` to ``PATH`` or invoke it as ``python3 -m maigret <username>``. + +Persisting Maigret across Tails sessions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tails wipes ``~/.local/`` on reboot unless you configure the Persistent Storage to keep it. This is Tails configuration, not Maigret configuration — see the official Tails docs: + +- `Persistent Storage on Tails <https://tails.boum.org/doc/persistent_storage/>`_ +- `Configuring Persistent Storage features <https://tails.boum.org/doc/persistent_storage/configure/>`_ + +A step-by-step recipe contributed by a user (persisting ``~/.local/lib/python3.9`` and ``~/.local/bin`` and patching ``.bashrc``) is in `issue #544 <https://github.com/soxoj/maigret/issues/544#issuecomment-1356469171>`__. Treat it as a starting point: the Python version and Tails internals change between Tails releases. + +Reports on Tails — where to save them +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The default ``reports/`` directory lives next to the working directory and is wiped with the amnesiac session. To save reports somewhere persistent, either pass ``-fo``: + +.. code-block:: console + + maigret <username> --html -fo "/home/amnesia/Persistent/maigret-reports" + +or set ``"reports_path"`` in your ``settings.json`` to a persistent path. See :doc:`settings`. + +Programmatic equivalents (Python library) +----------------------------------------- + +The same options are available through the Python API. See :doc:`library-usage` — the relevant keyword arguments are ``proxy=``, ``tor_proxy=`` and ``i2p_proxy=``, accepting the same URL formats as the CLI flags. + +See also +-------- + +- :doc:`command-line-options` — full reference for the three flags. +- `TROUBLESHOOTING.md <https://github.com/soxoj/maigret/blob/main/TROUBLESHOOTING.md>`_ — quick recipes for ``.onion`` / I2P sites and for WAF-induced 403s. +- :doc:`library-usage` — proxy options for embedded use. diff --git a/docs/source/usage-examples.rst b/docs/source/usage-examples.rst new file mode 100644 index 0000000..d56c291 --- /dev/null +++ b/docs/source/usage-examples.rst @@ -0,0 +1,80 @@ +.. _usage-examples: + +Usage examples +============== + +You can use Maigret as: + +- a command line tool: initial and a default mode +- a `web interface <#web-interface>`_: view the graph with results and download all report formats on a single page +- a library: integrate Maigret into your own project + +Use Cases +--------- + + +1. Search for accounts with username ``machine42`` on top 500 sites (by default, according to Majestic Million rank) from the Maigret DB. + +.. code-block:: console + + maigret machine42 + +2. Search for accounts with username ``machine42`` on **all sites** from the Maigret DB. + +.. code-block:: console + + maigret machine42 -a + +.. note:: + Maigret will search for accounts on a huge number of sites, + and some of them may return false positive results. At the moment, we are working on autorepair mode to deliver + the most accurate results. + + If you experience many false positives, you can do the following: + + - Install the last development version of Maigret from GitHub + - Run Maigret with ``--self-check --auto-disable`` flag and agree on disabling of problematic sites + +3. Search for accounts with username ``machine42`` and generate HTML and PDF reports. + +.. code-block:: console + + maigret machine42 -HP + +or + +.. code-block:: console + + maigret machine42 -a --html --pdf + + +4. Search for accounts with username ``machine42`` on Facebook only. + +.. code-block:: console + + maigret machine42 --site Facebook + +5. Extract information from the Steam page by URL and start a search for accounts with found username ``machine42``. + +.. code-block:: console + + maigret --parse https://steamcommunity.com/profiles/76561199113454789 + +6. Search for accounts with username ``machine42`` only on US and Japanese sites. + +.. code-block:: console + + maigret machine42 --tags us,jp + +7. Search for accounts with username ``machine42`` only on sites related to software development. + +.. code-block:: console + + maigret machine42 --tags coding + +8. Search for accounts with username ``machine42`` on uCoz sites only (mostly CIS countries). + +.. code-block:: console + + maigret machine42 --tags ucoz + diff --git a/docs/source/use-cases/crypto.rst b/docs/source/use-cases/crypto.rst new file mode 100644 index 0000000..b48e15c --- /dev/null +++ b/docs/source/use-cases/crypto.rst @@ -0,0 +1,147 @@ +.. _use-case-crypto: + +Cryptocurrency & Web3 Investigations +===================================== + +Blockchain transactions are public, but the people behind wallets are not. Maigret helps bridge this gap by finding Web3 accounts tied to a username, revealing the person behind a pseudonymous crypto persona. + +Why it matters +-------------- + +Crypto investigations often start with a wallet address or an ENS name but hit a wall — the blockchain tells you *what* happened, not *who* did it. A username, however, is reused across platforms. If someone trades on OpenSea as ``zachxbt`` and posts on Warpcast as ``zachxbt``, Maigret connects the dots and builds a full profile. + +Common scenarios: + +- **Scam attribution.** A rug-pull promoter uses the same alias on Fragment (Telegram username marketplace), OpenSea, and a personal blog. +- **Sanctions compliance.** Verifying whether a counterparty's online footprint matches known sanctioned individuals. +- **Due diligence.** Before an OTC deal or DAO vote, checking whether the other party has a consistent online presence or is a freshly created sockpuppet. +- **Stolen funds tracing.** A stolen NFT appears on OpenSea under a new account — but the username matches a Warpcast profile with real-world links. + +Supported sites +--------------- + +Maigret currently checks the following crypto and Web3 platforms: + +.. list-table:: + :header-rows: 1 + :widths: 20 40 40 + + * - Site + - What it reveals + - Notes + * - **OpenSea** + - NFT collections, trading history, profile bio, linked website + - + * - **Rarible** + - NFT marketplace profile, collections, listing history + - Complements OpenSea for NFT attribution across marketplaces + * - **Zora** + - Zora Network profile, minted NFTs, creator activity + - Ethereum L2 creator platform; useful for on-chain art attribution + * - **Polymarket** + - Prediction-market profile, positions, public portfolio P&L + - Useful for political/financial prediction attribution + * - **Warpcast** (Farcaster) + - Decentralized social profile, posts, follower graph, Farcaster ID + - Every Farcaster ID maps to an Ethereum address via the on-chain ID registry + * - **Fragment** + - Telegram username ownership, TON wallet address, purchase date and price + - Valuable for linking Telegram identities to TON wallets + * - **Paragraph** + - Web3 blog/newsletter, ETH wallet address, linked Twitter handle + - Richest cross-platform data among crypto sites + * - **Tonometerbot** + - TON wallet balance, subscriber count, NFT collection, rankings + - TON blockchain analytics + * - **Spatial** + - Metaverse profile, linked social accounts (Discord, Twitter, Instagram, LinkedIn, TikTok) + - Rich cross-platform links + * - **Revolut.me** + - Payment handle: first/last name, country code, base currency, supported payment methods + - Not strictly Web3, but widely used by crypto OTC traders for fiat off-ramps; the public API returns structured KYC-adjacent data + +Real-world example: zachxbt +--------------------------- + +`ZachXBT <https://twitter.com/zachxbt>`_ is a well-known on-chain investigator. Let's see what Maigret can find from just the username ``zachxbt``: + +.. code-block:: console + + maigret zachxbt --tags crypto + +Maigret finds 5 accounts and automatically extracts structured data from each: + +**Fragment** — confirms the Telegram username ``@zachxbt`` is claimed, reveals the TON wallet address (``EQBisZrk...``), purchase price (10 TON), and date (January 2023). + +**Paragraph** — the richest result. Returns the real name used on the platform (``ZachXBT``), bio (``Scam survivor turned 2D investigator``), an Ethereum wallet address (``0x23dBf066...``), and a linked Twitter handle (``zachxbt``). The ``wallet_address`` field is especially valuable — it directly links the pseudonym to an on-chain identity. + +**Warpcast** — Farcaster profile with a Farcaster ID (``fid: 20931``), profile image, and social graph (33K followers). Every Farcaster ID is tied to an Ethereum address via the on-chain ID registry, so this is another on-chain anchor. + +**OpenSea** — NFT marketplace profile with bio (``On-chain sleuth | 10x rug pull survivor``), avatar (hosted on ``seadn.io`` with an Ethereum address in the URL path), and a link to an external investigations page. + +**Hive Blog** — blockchain-based blog account created in March 2025. Low activity (1 post), but confirms the username is claimed across blockchain ecosystems. + +From a single username, Maigret produces: + +- **2 wallet addresses** — one TON (from Fragment), one Ethereum (from Paragraph) +- **1 confirmed Twitter handle** — ``zachxbt`` (from Paragraph) +- **1 Telegram username** — ``@zachxbt`` (from Fragment) +- **1 external link** — ``investigations.notion.site`` (from OpenSea) +- **Social graph data** — 33K Farcaster followers, blog activity timestamps + +This is enough to pivot into blockchain analysis tools (Etherscan, Arkham, Nansen) using the wallet addresses, or into social media analysis using the Twitter handle. + +Workflow: from username to wallet +--------------------------------- + +**Step 1: Search crypto platforms** + +.. code-block:: console + + maigret <username> --tags crypto -v + +Review the results. Pay attention to: + +- **Fragment** — if the username is claimed, you get a TON wallet address directly. +- **Paragraph** — blog profiles often contain an ETH address and a Twitter handle. +- **Warpcast** — Farcaster IDs map to Ethereum addresses via the on-chain registry. +- **OpenSea** — avatar URLs sometimes contain wallet addresses in the path. + +**Step 2: Expand with extracted identifiers** + +Maigret automatically extracts additional identifiers from found profiles (real names, linked accounts, profile URLs) and recursively searches for them. This is enabled by default. If Maigret finds a linked Twitter handle on a Paragraph profile, it will automatically search for that handle across all sites. + +**Step 3: Cross-reference with non-crypto platforms** + +The real power is connecting crypto personas to mainstream accounts. Drop the tag filter: + +.. code-block:: console + + maigret <username> -a + +This checks all 3000+ sites. A match on GitHub, Reddit, or a forum can reveal the person behind the wallet. + +Workflow: from wallet to identity +--------------------------------- + +If you start with a wallet address rather than a username, you can use complementary tools to get a username first: + +1. **ENS / Unstoppable Domains** — resolve the wallet address to a human-readable name (``vitalik.eth``). Then search that name in Maigret. +2. **Etherscan labels** — check if the address has a public label (exchange, known entity). +3. **Fragment** — search the TON wallet address to find which Telegram usernames it purchased. +4. **Arkham Intelligence / Nansen** — blockchain attribution platforms that may tag the address with a known identity. + +Once you have a username candidate, feed it to Maigret. + +Tips +---- + +- **Username reuse is the #1 signal.** Crypto-native users often reuse their ENS name (``alice.eth``) or a variation (``alice_eth``, ``aliceeth``) across platforms. Try all variations. +- **Fragment is uniquely valuable** because it directly links Telegram usernames to TON wallet addresses — a rare on-chain / off-chain bridge. +- **Warpcast profiles are Ethereum-native.** Every Farcaster account is tied to an Ethereum address via the ID registry contract. If you find a Warpcast profile, you implicitly have a wallet address. +- **Paragraph often has the richest data** — wallet address, Twitter handle, bio, and activity timestamps in a single API response. +- **Use** ``--exclude-tags`` **to skip irrelevant sites** when you're focused on crypto: + + .. code-block:: console + + maigret alice_eth --exclude-tags porn,dating,forum diff --git a/docs/source/use-cases/scientists.rst b/docs/source/use-cases/scientists.rst new file mode 100644 index 0000000..cd85677 --- /dev/null +++ b/docs/source/use-cases/scientists.rst @@ -0,0 +1,97 @@ +.. _use-case-scientists: + +Academic & Research Investigations +================================== + +Academic identity has a unique anchor that social-media identity does not: the **ORCID** (Open Researcher and Contributor ID). Every ORCID is verified, globally unique, and tied to a confirmed email — a single confirmed ORCID match between two platforms means the **same human**, with effectively zero false-positive rate. + +Maigret uses ORCID as a first-class identifier: extract it once from a username-keyed profile (iNaturalist, GitHub bio, lab homepage), then pivot into the academic graph (ORCID, OpenAlex, arXiv, DBLP, Scholia) — a chain of HTTP calls that turns an anonymous handle into a CV with employer, education, publication list, citation count, co-author graph, and topical area. + +Why it matters +-------------- + +Most OSINT work on academic targets stalls at the same bottleneck: people use one alias on a citizen-science site, a different alias on Twitter, a third in a forum signature, and only their real name on PubMed. Connecting the personas by hand means trawling Google Scholar, ResearchGate, university web pages, and old conference programmes. ORCID short-circuits this entirely — one verified identifier resolves all of them. + +Common scenarios: + +- **Researcher background check.** Before a collaboration, a preprint review, or a grant decision — verifying that a claimed h-index, employment history, and publication count actually match the public ORCID record. +- **Co-author graph reconstruction.** From a single ORCID, OpenAlex returns every co-author, their institutions, and topical clusters — useful for spotting undisclosed conflicts of interest. +- **Paper mill / fraud investigation.** When a suspicious paper's authors share an ORCID-claimed identity, the cross-platform footprint (or absence of one) is itself evidence. +- **Pseudonym deanonymisation.** A wildlife photographer posts naturalist observations under the handle ``kueda``. iNaturalist's public API returns their ORCID, and one further request reveals their real name, employer (California Academy of Sciences), education (UC Berkeley), and 700+ citable observations. +- **Award / appointment due diligence.** Confirming a Turing-Award claim, a tenure status, or a society fellowship via the DBLP and ORCID activity timelines rather than a CV PDF. + +Supported sites +--------------- + +Maigret currently checks the following ORCID-keyed platforms (use ``--id-type orcid`` when starting from a bare ORCID, or rely on the recursive chain when starting from a username): + +.. list-table:: + :header-rows: 1 + :widths: 18 42 40 + + * - Site + - What it reveals + - Notes + * - **ORCID** + - Full name, biography, employment, education, researcher URLs (homepages and social), keywords, country, linked external IDs (Scopus, ResearcherID, Loop), publication summary, email-verified status + - All disciplines — ORCID is a field-agnostic identifier issued to any researcher. + * - **OpenAlex** + - Display name and name alternatives, works count, total citations, h-index, i10-index, last-known institutions (with country), topical areas, raw author-name variants from publications + - All disciplines — indexes works across the entire scholarly literature, from humanities to medicine. + * - **arXiv** + - Author preprint listing — paper titles, IDs, dates + - Strongly biased toward physics, math, CS (and quantitative biology, statistics, EE, quantitative finance, economics). + * - **DBLP** + - Full name, DBLP person ID, paper count, affiliation, awards (e.g. Turing Award), homepage URLs, links to Google Scholar / ResearchGate / Scopus + - Computer science only — a biologist or pure economist will not be in the index. + * - **Scholia** + - Wikidata QID for the author, linked publications, co-author graph, employer/affiliation timeline, topical clusters + - All disciplines, but only if the author has been curated in Wikidata — coverage is broadest for prominent figures (award winners, senior faculty, deceased researchers). + +Workflow: from username to ORCID +-------------------------------- + +**Step 1: Find a profile that publishes ORCID** + +The most reliable bridges from a username to an ORCID are platforms whose users *want* their academic identity discoverable. In practice: + +- **iNaturalist** — biologists, naturalists, citizen scientists. Public API ``api.inaturalist.org/v1/users/{username}`` returns the ORCID directly in the ``orcid`` field. Maigret extracts it automatically. +- **GitHub** — scientists often paste their ORCID URL into the **bio** or **blog** field on their GitHub profile, or under a *generic* entry in ``/users/{u}/social_accounts``. A pattern like ``orcid\.org/(\d{4}-\d{4}-\d{4}-\d{3}[\dX])`` matches both ``http://orcid.org/...`` and ``orcid.org/...`` variants. +- **Lab homepage / institutional bio.** Use ``--parse <URL>`` to scrape an arbitrary page for known identifiers — useful when the target's footprint lives at ``faculty.example.edu/~jdoe``. + +**Step 2: Let the recursive search run** + +.. code-block:: console + + maigret <username> --tags science -v + +Recursive search is enabled by default. As soon as Maigret extracts an ``orcid`` field from any found profile, it queues an ``--id-type orcid`` second wave automatically. No manual chaining needed. + +**Step 3: Start from a bare ORCID** + +If you already have the ORCID (e.g. from a paper's author footer, a grant database, or a Wikidata entry): + +.. code-block:: console + + maigret 0000-0002-9322-3515 --id-type orcid -a + +This bypasses the username-bridge step entirely. + +Workflow: from ORCID to mainstream identity +------------------------------------------- + +The ORCID record itself contains the link back to ordinary social platforms: + +1. **ORCID ``researcher-urls``** — a list of self-declared external links. Typical entries: lab homepage, Twitter/Bluesky/Mastodon profile, personal blog. These are entered by the researcher and therefore confirmed. +2. **ORCID ``external-identifiers``** — IDs from sibling academic systems (Scopus Author ID, ResearcherID/Publons, Loop profile). Each unlocks another extraction pipeline. +3. **OpenAlex ``last_known_institutions``** — current employer with country, ROR ID, and OpenAlex institution ID; useful for pivoting into the institution's directory. +4. **DBLP** ``<url>`` **tags** — DBLP records often embed direct links to Google Scholar, ResearchGate, and personal pages. +5. **Scholia ``wikidata_qid``** — once you have a Wikidata QID, the SPARQL endpoint unlocks the broadest external ID set in any single OSINT system: VIAF, LCCN, GND, Twitter handle, Mastodon handle, IMDb, GitHub, ORCID, and ~200 others. + +Tips +---- + +- **Email comes from ORCID** — within the academic chain (ORCID, OpenAlex, arXiv, DBLP, Scholia) it is the only source that returns an email address, and only when the researcher has marked their primary email public. The same response also carries ``history.verified-primary-email``, an ORCID-confirmed flag that means the address was email-validated at registration. Use this as a strong pivot into email-keyed lookups (Holehe, HIBP, Gravatar, etc.). +- **Outside the academic chain, GitLab is the dev platform most likely to leak an email** via its public ``public_email`` field — relevant for scientists who self-host code on a CERN/research-institute GitLab. GitHub's REST API does not expose email by default. +- **Compare OpenAlex** ``raw_author_names`` **against the ORCID** ``other-names``. Discrepancies often expose pre-marriage names, transliterations from non-Latin scripts, or co-author misattributions worth flagging. +- **Anything fed into** ``--id-type orcid`` **must match** ``^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$``. The trailing character may legitimately be ``X`` (ISO checksum); strip ``https://orcid.org/`` prefixes before passing the bare ID. diff --git a/maigret/__init__.py b/maigret/__init__.py new file mode 100644 index 0000000..8f8024c --- /dev/null +++ b/maigret/__init__.py @@ -0,0 +1,24 @@ +"""Maigret""" + +__title__ = 'Maigret' +__package__ = 'maigret' +__author__ = 'Soxoj' +__author_email__ = 'soxoj@protonmail.com' + + +from .__version__ import __version__ +try: + from .checking import maigret as search +except ImportError as e: + raise ImportError( + "Missing required dependency while starting Maigret.\n\n" + "If installed from PyPI:\n" + " pip install -U maigret\n\n" + "If running from a cloned repository:\n" + " pip install -e .\n\n" + "Then run Maigret as:\n" + " python -m maigret <username>" + ) from e +from .maigret import main as cli +from .sites import MaigretEngine, MaigretSite, MaigretDatabase +from .notify import QueryNotifyPrint as Notifier diff --git a/maigret/__main__.py b/maigret/__main__.py new file mode 100644 index 0000000..f8f995a --- /dev/null +++ b/maigret/__main__.py @@ -0,0 +1,22 @@ +#! /usr/bin/env python3 + +""" +Maigret entrypoint +""" + +import asyncio +import sys + +from .maigret import main + +if __name__ == "__main__": + # First Ctrl+C is caught inside main() (search loop → falls through to + # report generation with partial results). A *second* Ctrl+C during + # report generation, or any uncaught Ctrl+C before the search loop runs, + # reaches asyncio.run as KeyboardInterrupt — exit with the conventional + # SIGINT code (130) instead of dumping a traceback. + try: + asyncio.run(main()) + except KeyboardInterrupt: + print('\nMaigret interrupted.', file=sys.stderr) + sys.exit(130) diff --git a/maigret/__version__.py b/maigret/__version__.py new file mode 100644 index 0000000..ba6ee3e --- /dev/null +++ b/maigret/__version__.py @@ -0,0 +1,3 @@ +"""Maigret version file""" + +__version__ = '0.6.2' diff --git a/maigret/activation.py b/maigret/activation.py new file mode 100644 index 0000000..bb0c6fb --- /dev/null +++ b/maigret/activation.py @@ -0,0 +1,172 @@ +import json +import re +from http.cookiejar import MozillaCookieJar +from http.cookies import Morsel + +from aiohttp import ClientSession, CookieJar + + +class ParsingActivator: + @staticmethod + async def twitter(site, logger, cookies={}, **kwargs): + headers = dict(site.headers) + headers.pop("x-guest-token", None) + + async with ClientSession(trust_env=True) as session: + async with session.post( + site.activation["url"], + headers=headers, + timeout=kwargs.get("timeout"), + ) as response: + logger.info(response) + j = await response.json(content_type=None) + guest_token = j[site.activation["src"]] + site.headers[site.activation.get("dst", "x-guest-token")] = guest_token + + @staticmethod + async def vimeo(site, logger, cookies={}, **kwargs): + headers = dict(site.headers) + headers.pop("Authorization", None) + + async with ClientSession(trust_env=True) as session: + async with session.get( + site.activation["url"], + headers=headers, + timeout=kwargs.get("timeout"), + ) as response: + payload = await response.json(content_type=None) + logger.debug(f"Vimeo viewer activation: {json.dumps(payload, indent=4)}") + jwt_token = payload["jwt"] + site.headers["Authorization"] = "jwt " + jwt_token + + @staticmethod + async def wikimapia(site, logger, html="", **kwargs): + # Wikimapia gates content behind a per-IP JS cookie challenge: the first + # response is a stub that sets `ngxsession=<token>` via document.cookie and + # refreshes. The token is deterministic per source IP, so we read it straight + # from the challenge body the checker already fetched and merge it into the + # request cookie before the retry (re-fetching would race a fresh challenge). + match = re.search(r'ngxsession=([0-9a-f]+)', html or "") + if not match: + logger.warning( + f"Wikimapia activation: ngxsession token not found for {site.name}" + ) + return + token = match.group(1) + + existing = site.headers.get("Cookie", "") + parts = [ + p.strip() + for p in existing.split(";") + if p.strip() and not p.strip().startswith("ngxsession=") + ] + parts.append(f"ngxsession={token}") + site.headers["Cookie"] = "; ".join(parts) + + @staticmethod + async def onlyfans(site, logger, url=None, **kwargs): + # Signing rules (static_param / checksum_indexes / checksum_constant / format / app_token) + # live in data.json under OnlyFans.activation and rotate upstream every ~1–3 weeks. + # If "Please refresh the page" keeps firing after activation, refresh them from: + # https://raw.githubusercontent.com/DATAHOARDERS/dynamic-rules/main/onlyfans.json + import hashlib + import secrets + import time as _time + from urllib.parse import urlparse + + act = site.activation + static_param = act["static_param"] + indexes = act["checksum_indexes"] + constant = act["checksum_constant"] + fmt = act["format"] + init_url = act["url"] + + user_id = site.headers.get("user-id", "0") or "0" + + def _sign(path): + t = str(int(_time.time() * 1000)) + msg = "\n".join([static_param, t, path, user_id]).encode() + sha = hashlib.sha1(msg).hexdigest() + cs = sum(ord(sha[i]) for i in indexes) + constant + return t, fmt.format(sha, abs(cs)) + + if site.headers.get("x-bc", "").strip("0") == "": + site.headers["x-bc"] = secrets.token_hex(20) + + if not site.headers.get("cookie"): + init_path = urlparse(init_url).path + t, sg = _sign(init_path) + hdrs = dict(site.headers) + hdrs["time"] = t + hdrs["sign"] = sg + hdrs.pop("cookie", None) + async with ClientSession(trust_env=True) as session: + async with session.get( + init_url, + headers=hdrs, + timeout=kwargs.get("timeout", 15), + ) as response: + jar = "; ".join( + f"{k}={getattr(v, 'value', v)}" + for k, v in response.cookies.items() + ) + if jar: + site.headers["cookie"] = jar + logger.debug( + f"OnlyFans init: got cookies {list(response.cookies.keys())}" + ) + + target_path = urlparse(url).path if url else urlparse(init_url).path + t, sg = _sign(target_path) + site.headers["time"] = t + site.headers["sign"] = sg + logger.debug(f"OnlyFans signed {target_path} time={t}") + + @staticmethod + async def weibo(site, logger, **kwargs): + # Weibo gates its ajax profile API behind an anonymous "Sina Visitor + # System" cookie. genvisitor2 mints a fresh visitor SUB/SUBP pair and + # returns it in the JSONP body. The previous version stored the + # passport-domain Set-Cookie header (SVB) instead of that SUB/SUBP, so + # the cookie never unlocked weibo.com and every check 403'd. + headers = dict(site.headers) + headers.pop("Cookie", None) + timeout = kwargs.get("timeout") + + async with ClientSession(trust_env=True) as session: + async with session.post( + site.activation["url"], + headers=headers, + data={'cb': 'visitor_gray_callback', 'tid': '', 'from': 'weibo'}, + timeout=timeout, + ) as response: + body = await response.text() + + match = re.search(r"\{.*\}", body) + data = json.loads(match.group(0)).get("data", {}) if match else {} + sub, subp = data.get("sub"), data.get("subp") + if sub and subp: + site.headers["Cookie"] = f"SUB={sub}; SUBP={subp}" + logger.debug("Weibo activation: visitor SUB/SUBP acquired") + else: + logger.warning(f"Weibo activation failed: no SUB/SUBP in {body[:120]!r}") + + +def import_aiohttp_cookies(cookiestxt_filename): + cookies_obj = MozillaCookieJar(cookiestxt_filename) + cookies_obj.load(ignore_discard=True, ignore_expires=True) + + cookies = CookieJar() + + cookies_list = [] + for domain in cookies_obj._cookies.values(): # type: ignore[attr-defined] + for key, cookie in list(domain.values())[0].items(): + c: Morsel = Morsel() + c.set(key, cookie.value, cookie.value) + c["domain"] = cookie.domain + c["path"] = cookie.path + cookies_list.append((key, c)) + + cookies.update_cookies(cookies_list) + + return cookies diff --git a/maigret/ai.py b/maigret/ai.py new file mode 100644 index 0000000..cc48562 --- /dev/null +++ b/maigret/ai.py @@ -0,0 +1,162 @@ +"""Maigret AI Analysis Module + +Provides AI-powered analysis of search results using OpenAI-compatible APIs. +""" + +import asyncio +import json +import os +import sys +import threading + +import aiohttp + + +def load_ai_prompt() -> str: + """Load the AI system prompt from the resources directory.""" + maigret_path = os.path.dirname(os.path.realpath(__file__)) + prompt_path = os.path.join(maigret_path, "resources", "ai_prompt.txt") + with open(prompt_path, "r", encoding="utf-8") as f: + return f.read() + + +def resolve_api_key(settings) -> str | None: + """Resolve OpenAI API key from settings or environment variable. + + Priority: settings.openai_api_key > OPENAI_API_KEY env var. + """ + key = getattr(settings, "openai_api_key", None) + if key: + return key + return os.environ.get("OPENAI_API_KEY") + + +class _Spinner: + """Simple animated spinner for terminal output.""" + + FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] + + def __init__(self, text=""): + self.text = text + self._stop = threading.Event() + self._thread = None + + def start(self): + self._thread = threading.Thread(target=self._spin, daemon=True) + self._thread.start() + + def _spin(self): + i = 0 + while not self._stop.is_set(): + frame = self.FRAMES[i % len(self.FRAMES)] + sys.stderr.write(f"\r{frame} {self.text}") + sys.stderr.flush() + i += 1 + self._stop.wait(0.08) + + def stop(self): + self._stop.set() + if self._thread: + self._thread.join() + sys.stderr.write("\r\033[2K") + sys.stderr.flush() + + +async def print_streaming(text: str, delay: float = 0.04): + """Print text word by word with a delay, simulating streaming LLM output.""" + words = text.split(" ") + for i, word in enumerate(words): + if i > 0: + sys.stdout.write(" ") + sys.stdout.write(word) + sys.stdout.flush() + await asyncio.sleep(delay) + sys.stdout.write("\n") + sys.stdout.flush() + + +async def _check_response(resp): + """Raise descriptive errors for non-success HTTP responses.""" + if resp.status == 401: + raise RuntimeError("Invalid OpenAI API key (HTTP 401)") + if resp.status == 429: + raise RuntimeError("OpenAI API rate limit exceeded (HTTP 429)") + if resp.status != 200: + body = await resp.text() + raise RuntimeError(f"OpenAI API error (HTTP {resp.status}): {body[:500]}") + + +async def _stream_response(resp, spinner, first_token): + """Stream tokens from resp, display them, and return (first_token, full_analysis).""" + full_response = [] + async for line in resp.content: + decoded = line.decode("utf-8").strip() + if not decoded or not decoded.startswith("data: "): + continue + data_str = decoded[len("data: "):] + if data_str == "[DONE]": + break + try: + chunk = json.loads(data_str) + except json.JSONDecodeError: + continue + delta = chunk.get("choices", [{}])[0].get("delta", {}) + content = delta.get("content", "") + if not content: + continue + if first_token: + spinner.stop() + print() + first_token = False + sys.stdout.write(content) + sys.stdout.flush() + full_response.append(content) + return first_token, "".join(full_response) + + +async def get_ai_analysis( + api_key: str, + markdown_report: str, + model: str = "gpt-4o", + api_base_url: str = "https://api.openai.com/v1", +) -> str: + """Send the markdown report to an OpenAI-compatible API and return the analysis. + + Uses streaming to display tokens as they arrive. + Raises on HTTP errors with descriptive messages. + """ + system_prompt = load_ai_prompt() + + url = f"{api_base_url.rstrip('/')}/chat/completions" + headers = { + "Authorization": f"Bearer {api_key}", + "Content-Type": "application/json", + } + payload = { + "model": model, + "stream": True, + "messages": [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": markdown_report}, + ], + } + + spinner = _Spinner("Analysing the data with AI...") + spinner.start() + first_token = True + + try: + async with aiohttp.ClientSession() as session: + async with session.post(url, json=payload, headers=headers) as resp: + await _check_response(resp) + first_token, analysis = await _stream_response(resp, spinner, first_token) + except Exception: + spinner.stop() + raise + + if first_token: + # No tokens received — stop spinner anyway + spinner.stop() + + print() + return analysis diff --git a/maigret/checking.py b/maigret/checking.py new file mode 100644 index 0000000..b1024c7 --- /dev/null +++ b/maigret/checking.py @@ -0,0 +1,1600 @@ +# Standard library imports +import ast +import asyncio +import logging +import os +import random +import re +import ssl +import sys +from typing import Any, Dict, List, Optional, Tuple +from urllib.parse import quote +from maigret.error_detection import detect_error_page + +# Third party imports +import aiodns +from alive_progress import alive_bar +from aiohttp import ClientSession, TCPConnector, http_exceptions +from aiohttp.resolver import ThreadedResolver +from aiohttp.client_exceptions import ( + ClientConnectorDNSError, + ClientConnectorError, + ServerDisconnectedError, +) + + +_DNS_ERROR_MARKERS = ( + "could not contact dns servers", # aiohttp + aiodns wording + "name or service not known", # glibc getaddrinfo + "nodename nor servname", # macOS getaddrinfo + "temporary failure in name resolution", # glibc EAI_AGAIN + "getaddrinfo failed", # generic socket error +) + + +def _is_dns_error(exc: Exception) -> bool: + """Classify a ClientConnectorError as DNS-class or not. + + Prefers the typed aiohttp subclass; falls back to substring matching on + the exception text for resolver/getaddrinfo errors that don't surface as + ClientConnectorDNSError. The substrings are the OS/aiodns wordings + observed in the wild. + """ + if isinstance(exc, ClientConnectorDNSError): + return True + text = str(exc).lower() + return any(m in text for m in _DNS_ERROR_MARKERS) +from python_socks import _errors as proxy_errors +from socid_extractor import extract # type: ignore[import-not-found] + +from unittest.mock import Mock + +# Local imports +from . import errors +from .activation import ParsingActivator, import_aiohttp_cookies +from .errors import CheckError +from .executors import AsyncioQueueGeneratorExecutor +from .result import MaigretCheckResult, MaigretCheckStatus, KeywordMatchStatus, SiteResult +from .sites import MaigretDatabase, MaigretSite +from .utils import ascii_data_display, get_random_user_agent, is_plausible_username + + +SUPPORTED_IDS = ( + "username", + "yandex_public_id", + "gaia_id", + "vk_id", + "ok_id", + "wikimapia_uid", + "steam_id", + "uidme_uguid", + "yelp_userid", + "orcid", +) + +BAD_CHARS = "#" + + +def build_cloudflare_bypass_config( + settings_obj: Optional[Any], force_enable: bool = False +) -> Optional[Dict[str, Any]]: + """Resolve Cloudflare webgate config from settings + CLI flag. + + Returns ``None`` when bypass is inactive or no usable module is configured. + Otherwise returns a dict consumed by ``CloudflareWebgateChecker``: + + - ``trigger_protection``: list of ``site.protection`` values that + activate the bypass (e.g. ``["cf_js_challenge", "cf_firewall", "webgate"]``) + - ``modules``: ordered list of backend modules to try; each entry has + ``name``, ``method`` (``json_api`` for FlareSolverr, ``url_rewrite`` + for CloudflareBypassForScraping), and a method-specific ``url`` plus + optional ``max_timeout_ms``. + - ``session_prefix``: prefix for FlareSolverr session reuse. + """ + raw = {} + if settings_obj is not None: + raw = getattr(settings_obj, "cloudflare_bypass", {}) or {} + enabled = bool(force_enable) or bool(raw.get("enabled", False)) + if not enabled: + return None + + modules_raw = raw.get("modules") or [] + valid_modules: List[Dict[str, Any]] = [] + for module in modules_raw: + method = module.get("method") + url = module.get("url") + if method == "json_api" and url: + valid_modules.append(dict(module)) + elif method == "url_rewrite" and url and "{url}" in url: + valid_modules.append(dict(module)) + if not valid_modules: + return None + + trigger = raw.get("trigger_protection") or [ + "cf_js_challenge", + "cf_firewall", + "webgate", + ] + return { + "trigger_protection": list(trigger), + "modules": valid_modules, + "session_prefix": raw.get("session_prefix", "maigret"), + } + + +class CheckerBase: + def __init__(self, *args, **kwargs): + self.logger = kwargs.get('logger', Mock()) + # Defaults for the request fields populated by .prepare(). Set here + # so subclasses with a partial prepare() (e.g. AiodnsDomainResolver + # only assigns url) still have predictable attribute access. + self.url = None + self.headers = None + self.allow_redirects = True + self.timeout = 0 + self.method = 'get' + self.payload = None + + +class SimpleAiohttpChecker(CheckerBase): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.proxy = kwargs.get('proxy') + self.cookie_jar = kwargs.get('cookie_jar') + # 'async' (default) uses aiohttp's DefaultResolver, which is AsyncResolver + # (powered by aiodns / c-ares) when aiodns is installed. 'threaded' uses + # ThreadedResolver, which wraps the OS getaddrinfo via a threadpool — + # slower for high concurrency, but respects the system DNS config + # (resolv.conf, Windows network adapter settings) instead of having + # aiodns rediscover it. See issue #2688: aiodns can fail to find any + # DNS server on Windows / VPN / corporate networks, producing + # "Could not contact DNS servers" for every site. + self.dns_resolver = kwargs.get('dns_resolver', 'async') + + def prepare(self, url, headers=None, allow_redirects=True, timeout=0, method='get', payload=None): + self.url = url + self.headers = headers + self.allow_redirects = allow_redirects + self.timeout = timeout + self.method = method + self.payload = payload + return None + + async def close(self): + pass + + async def _make_request( + self, session, url, headers, allow_redirects, timeout, method, logger, payload=None + ) -> Tuple[Optional[str], int, Optional[CheckError]]: + try: + if method.lower() == 'get': + request_method = session.get + elif method.lower() == 'post': + request_method = session.post + elif method.lower() == 'head': + request_method = session.head + else: + request_method = session.get + + kwargs = { + 'url': url, + 'headers': headers, + 'allow_redirects': allow_redirects, + 'timeout': timeout, + } + if payload and method.lower() == 'post': + if headers and headers.get('Content-Type') == 'application/x-www-form-urlencoded': + kwargs['data'] = payload + else: + kwargs['json'] = payload + + async with request_method(**kwargs) as response: + status_code = response.status + response_content = await response.content.read() + charset = response.charset or "utf-8" + decoded_content = response_content.decode(charset, "ignore") + + error = CheckError("Connection lost") if status_code == 0 else None + logger.debug(decoded_content) + + return decoded_content, status_code, error + + except asyncio.TimeoutError as e: + return None, 0, CheckError("Request timeout", str(e)) + except ClientConnectorError as e: + err_type = "Connecting failure (DNS)" if _is_dns_error(e) else "Connecting failure" + return None, 0, CheckError(err_type, str(e)) + except ServerDisconnectedError as e: + return None, 0, CheckError("Server disconnected", str(e)) + except http_exceptions.BadHttpMessage as e: + return None, 0, CheckError("HTTP", str(e)) + except proxy_errors.ProxyError as e: + return None, 0, CheckError("Proxy", str(e)) + except KeyboardInterrupt: + return None, 0, CheckError("Interrupted") + except Exception as e: + if sys.version_info.minor > 6 and ( + isinstance(e, ssl.SSLCertVerificationError) + or isinstance(e, ssl.SSLError) + ): + return None, 0, CheckError("SSL", str(e)) + else: + logger.debug(e, exc_info=True) + return None, 0, CheckError("Unexpected", str(e)) + + async def check(self) -> Tuple[Optional[str], int, Optional[CheckError]]: + from aiohttp_socks import ProxyConnector + + # Use a real SSL context instead of ssl=False to avoid TLS fingerprinting + # blocks by Cloudflare and similar WAFs. Certificate verification is + # disabled to handle sites with invalid/expired certs. + ssl_context = ssl.create_default_context() + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_NONE + + # Build the TCPConnector with an explicit resolver when 'threaded' is + # requested. ProxyConnector takes its own resolver kwarg too, so apply + # the same setting on both code paths. + resolver = ThreadedResolver() if self.dns_resolver == 'threaded' else None + if self.proxy: + connector = ProxyConnector.from_url(self.proxy, resolver=resolver) if resolver else ProxyConnector.from_url(self.proxy) + else: + connector = TCPConnector(ssl=ssl_context, resolver=resolver) if resolver else TCPConnector(ssl=ssl_context) + + async with ClientSession( + connector=connector, + trust_env=True, + cookie_jar=self.cookie_jar if self.cookie_jar else None, + ) as session: + html_text, status_code, error = await self._make_request( + session, + self.url, + self.headers, + self.allow_redirects, + self.timeout, + self.method, + self.logger, + self.payload, + ) + + if error and str(error) == "Invalid proxy response": + self.logger.debug(error, exc_info=True) + + return str(html_text) if html_text else '', status_code, error + + +class ProxiedAiohttpChecker(SimpleAiohttpChecker): + pass + + +class AiodnsDomainResolver(CheckerBase): + if sys.platform == 'win32': # Temporary workaround for Windows + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + loop = asyncio.get_event_loop() + self.resolver = aiodns.DNSResolver(loop=loop) + + def prepare(self, url, headers=None, allow_redirects=True, timeout=0, method='get', payload=None): + self.url = url + return None + + async def check(self) -> Tuple[Optional[str], int, Optional[CheckError]]: + status = 404 + error = None + text = '' + + try: + res = await self.resolver.query(self.url, 'A') + text = str(res[0].host) + status = 200 + except aiodns.error.DNSError: + pass + except Exception as e: + self.logger.error(e, exc_info=True) + error = CheckError('DNS resolve error', str(e)) + + return text, status, error + + +from curl_cffi.requests import AsyncSession as CurlCffiAsyncSession + + +class CurlCffiChecker(CheckerBase): + """Checker using curl_cffi to emulate browser TLS fingerprint and bypass WAF.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.browser_emulate = kwargs.get('browser_emulate', 'chrome') + self.proxy = kwargs.get('proxy') + + def prepare(self, url, headers=None, allow_redirects=True, timeout=0, method='get', payload=None): + self.url = url + self.headers = headers + self.allow_redirects = allow_redirects + self.timeout = timeout + self.method = method + self.payload = payload + return None + + async def close(self): + pass + + async def check(self) -> Tuple[Optional[str], int, Optional[CheckError]]: + try: + session_kwargs = {} + if self.proxy: + session_kwargs['proxies'] = {'http': self.proxy, 'https': self.proxy} + async with CurlCffiAsyncSession(**session_kwargs) as session: + # Strip the User-Agent so curl_cffi can use the impersonated browser's + # matching UA. Mixing a random UA with a Chrome TLS fingerprint trips + # composite bot scoring (e.g. Cloudflare returns a JS challenge for + # "Chrome 91 UA + Chrome 131 TLS"). Keep any site-specific custom headers. + headers = {k: v for k, v in (self.headers or {}).items() + if k.lower() not in ('user-agent', 'connection')} + kwargs = { + 'url': self.url, + 'headers': headers or None, + 'allow_redirects': self.allow_redirects, + 'timeout': self.timeout if self.timeout else 10, + 'impersonate': self.browser_emulate, + } + if self.payload and self.method.lower() == 'post': + kwargs['json'] = self.payload + + if self.method.lower() == 'post': + response = await session.post(**kwargs) + elif self.method.lower() == 'head': + response = await session.head(**kwargs) + else: + response = await session.get(**kwargs) + + status_code = response.status_code + decoded_content = response.text + + self.logger.debug(decoded_content) + + error = CheckError("Connection lost") if status_code == 0 else None + return decoded_content, status_code, error + + except asyncio.TimeoutError as e: + return None, 0, CheckError("Request timeout", str(e)) + except KeyboardInterrupt: + return None, 0, CheckError("Interrupted") + except Exception as e: + self.logger.debug(e, exc_info=True) + return None, 0, CheckError("Unexpected", str(e)) + + +class CloudflareWebgateChecker(CheckerBase): + """Sends checks through a Cloudflare-bypass proxy. + + Supports two backends, selected by ``modules[0].method`` in settings: + + - ``json_api`` (FlareSolverr): POST to ``/v1`` with ``cmd: request.get``. + Preserves real upstream status_code, headers and final URL — drop-in + replacement for SimpleAiohttpChecker. + - ``url_rewrite`` (CloudflareBypassForScraping ``/html`` endpoint): + legacy mode. Returns rendered HTML only. Real upstream status is + lost (proxy answers 200 on success). status_code / response_url + check types degrade to "200 if HTML returned, AVAILABLE otherwise". + """ + + SESSION_PREFIX_DEFAULT = "maigret" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + config = kwargs.get('config') or {} + self._modules: List[Dict[str, Any]] = [] + for raw in config.get('modules') or []: + module = dict(raw) + module.setdefault('method', 'json_api') + module.setdefault('name', module.get('method')) + self._modules.append(module) + if not self._modules: + raise ValueError("CloudflareWebgateChecker requires at least one module") + # Session ID is computed per-request from the target host. Sharing a + # single session across hosts caused FlareSolverr to break in + # practice (TLS state / cookies leaking between domains), so each + # host gets its own Chrome instance. + self._session_prefix = ( + f"{config.get('session_prefix', self.SESSION_PREFIX_DEFAULT)}-{os.getpid()}" + ) + self.url = None + self.headers = None + self.allow_redirects = True + self.timeout = 0 + self.method = 'get' + self.payload = None + + @property + def session_id(self) -> str: + """FlareSolverr session ID, scoped per target host.""" + from urllib.parse import urlparse + + host = urlparse(self.url or "").hostname or "default" + host_safe = re.sub(r"[^a-zA-Z0-9.-]", "_", host) + return f"{self._session_prefix}-{host_safe}" + + def prepare(self, url, headers=None, allow_redirects=True, timeout=0, method='get', payload=None): + self.url = url + self.headers = headers or {} + self.allow_redirects = allow_redirects + self.timeout = timeout + self.method = method + self.payload = payload + return None + + async def close(self): + pass + + async def check(self) -> Tuple[Optional[str], int, Optional[CheckError]]: + attempts: List[str] = [] + last_error: Optional[CheckError] = None + for module in self._modules: + method = module.get('method') + module_name = module.get('name', method or '?') + if method == 'json_api': + result = await self._check_flaresolverr(module) + elif method == 'url_rewrite': + result = await self._check_url_rewrite(module) + else: + self.logger.warning( + f"Webgate module '{module_name}' has unknown method " + f"'{method}', skipping" + ) + attempts.append(f"{module_name}:unknown-method") + continue + body, status, err = result + if err is None: + return result + last_error = err + attempts.append(f"{module_name}:{err.type}") + self.logger.info( + f"Webgate module '{module_name}' failed for {self.url}: " + f"{err.type}: {err.desc}. Trying next module if any." + ) + # All modules failed. The most common case is "user opted into + # cloudflare_bypass but the solver isn't running" — every per-module + # attempt ends with "Webgate unreachable" (TCP refused / DNS fail at + # the configured URL). Detect that case and emit a clear, actionable + # message; fall back to a generic summary otherwise. + primary = self._modules[0] + primary_url = primary.get('url', '?') + primary_method = primary.get('method', '?') + start_hint = ( + "docker run -d -p 8191:8191 ghcr.io/flaresolverr/flaresolverr:latest" + if primary_method == 'json_api' + else "start the local proxy container" + ) + all_unreachable = bool(attempts) and all( + a.endswith(":Webgate unreachable") for a in attempts + ) + if all_unreachable: + desc = ( + "cloudflare_bypass is enabled (settings.json or " + f"--cloudflare-bypass), but the configured solver at " + f"{primary_url} is not reachable [{', '.join(attempts)}]. " + f"Either start the solver ({start_hint}) or disable " + "cloudflare_bypass in settings.json" + ) + else: + last_desc = last_error.desc if last_error else "unknown" + desc = ( + f"all {len(self._modules)} module(s) failed " + f"[{', '.join(attempts)}]. Last error: {last_desc}. " + f"Is the solver running at {primary_url}? (hint: {start_hint})" + ) + return None, 0, CheckError("Webgate unavailable", desc) + + async def _check_flaresolverr( + self, module: Dict[str, Any] + ) -> Tuple[Optional[str], int, Optional[CheckError]]: + endpoint = module.get('url') or 'http://localhost:8191/v1' + max_timeout_ms = int(module.get('max_timeout_ms', 60000)) + post_method = self.method.lower() == 'post' + cmd = "request.post" if post_method else "request.get" + + body: Dict[str, Any] = { + "cmd": cmd, + "url": self.url, + "maxTimeout": max_timeout_ms, + "session": self.session_id, + } + + proxy = module.get('proxy') + if isinstance(proxy, str) and proxy: + body["proxy"] = {"url": proxy} + elif isinstance(proxy, dict) and proxy.get("url"): + body["proxy"] = {k: v for k, v in proxy.items() if k in ("url", "username", "password")} + + if post_method and self.payload is not None: + # FlareSolverr expects postData as urlencoded string for form data, + # but if site.request_payload is JSON we still send it. + body["postData"] = ( + "&".join(f"{k}={quote(str(v))}" for k, v in self.payload.items()) + ) + + timeout = max(int(self.timeout) if self.timeout else 30, max_timeout_ms / 1000 + 5) + + try: + async with ClientSession() as session: + async with session.post( + endpoint, json=body, timeout=timeout + ) as resp: + if resp.status >= 500: + return None, 0, CheckError( + "Webgate", f"FlareSolverr {resp.status}" + ) + data = await resp.json() + except (ClientConnectorError, ServerDisconnectedError) as e: + return None, 0, CheckError("Webgate unreachable", str(e)) + except asyncio.TimeoutError: + return None, 0, CheckError("Webgate timeout", endpoint) + except Exception as e: + self.logger.debug(e, exc_info=True) + return None, 0, CheckError("Webgate", str(e)) + + if data.get("status") != "ok": + return None, 0, CheckError("Webgate", data.get("message", "unknown")) + + solution = data.get("solution") or {} + upstream_status = int(solution.get("status") or 0) + response_text = solution.get("response") or "" + + # Diagnostic: warn if FlareSolverr returned the CF challenge page + # itself (challenge not fully solved) rather than the real content. + # When this happens with sites that have weak presenseStrs/absenceStrs, + # maigret's default-true presence rule produces false CLAIMED. + cf_markers = ("Just a moment", "_cf_chl_opt", "cf-mitigated", "challenges.cloudflare.com") + if response_text and any(m in response_text for m in cf_markers): + self.logger.warning( + f"Webgate response from {self.url} still contains CF challenge " + f"markers (status={upstream_status}, body={len(response_text)}b). " + f"FlareSolverr likely did not solve the challenge — site checks " + f"with weak markers may produce false CLAIMED." + ) + + self.logger.info( + f"Webgate response: url={self.url} status={upstream_status} " + f"body_len={len(response_text)}" + ) + return response_text, upstream_status, None + + async def _check_url_rewrite( + self, module: Dict[str, Any] + ) -> Tuple[Optional[str], int, Optional[CheckError]]: + url_template = module.get('url') or '' + if "{url}" not in url_template: + return None, 0, CheckError( + "Webgate", f"module '{module.get('name')}' url has no {{url}} placeholder" + ) + from urllib.parse import quote_plus + + proxy_url = url_template.format(url=quote_plus(self.url)) + timeout = self.timeout if self.timeout else 30 + try: + async with ClientSession() as session: + async with session.get(proxy_url, timeout=timeout) as resp: + if resp.status >= 500: + return None, 0, CheckError( + "Webgate", f"url_rewrite proxy {resp.status}" + ) + body = await resp.text() + except (ClientConnectorError, ServerDisconnectedError) as e: + return None, 0, CheckError("Webgate unreachable", str(e)) + except asyncio.TimeoutError: + return None, 0, CheckError("Webgate timeout", proxy_url) + except Exception as e: + self.logger.debug(e, exc_info=True) + return None, 0, CheckError("Webgate", str(e)) + + # url_rewrite mode CANNOT recover the upstream HTTP status. + # We assume 200 when HTML is returned; status_code/response_url + # check types will misfire (see docs). + return body, 200, None + + +class CheckerMock: + def __init__(self, *args, **kwargs): + pass + + def prepare(self, url, headers=None, allow_redirects=True, timeout=0, method='get', payload=None): + return None + + async def check(self) -> Tuple[Optional[str], int, Optional[CheckError]]: + await asyncio.sleep(0) + return '', 0, None + + async def close(self): + return + + +def make_protocol_checker(options: Dict[str, Any], protocol: str): + checker_factory = options["checkers"][protocol] + if callable(checker_factory): + return checker_factory() + return checker_factory + + +def debug_response_logging(url, html_text, status_code, check_error): + with open("debug.log", "a") as f: + status = status_code or "No response" + f.write(f"url: {url}\nerror: {check_error}\nr: {status}\n") + if html_text: + f.write(f"code: {status}\nresponse: {str(html_text)}\n") + + +def process_site_result( + response, query_notify, logger, results_info: SiteResult, site: MaigretSite +): + if not response: + return results_info + + fulltags = site.tags + + # Retrieve other site information again + username = results_info["username"] + is_parsing_enabled = results_info["parsing_enabled"] + url = results_info.get("url_user") + url_probe = results_info.get("url_probe") or url + if url_probe != url: + logger.info(f"{url_probe} (display: {url})") + else: + logger.info(url) + + status = results_info.get("status") + if status is not None: + # We have already determined the user doesn't exist here + return results_info + + # Get the expected check type + check_type = site.check_type + + html_text, status_code, check_error = response + + response_time = None + + if logger.level == logging.DEBUG: + debug_response_logging(url, html_text, status_code, check_error) + + # additional check for errors + if status_code and not check_error: + check_error = detect_error_page( + html_text, + status_code, + site.errors_dict, + site.ignore403, + ) + + site_name = site.pretty_name + # presence flags + # True by default + presense_flags = site.presense_strs + is_presense_detected = False + + if html_text: + if not presense_flags: + if check_type == "message" and logger.isEnabledFor(logging.DEBUG): + logger.debug( + "Site %s uses checkType message with empty presenseStrs; " + "presence is treated as true for any page.", + site.name, + ) + is_presense_detected = True + site.stats["presense_flag"] = None + else: + for presense_flag in presense_flags: + if presense_flag in html_text: + is_presense_detected = True + site.stats["presense_flag"] = presense_flag + logger.debug(presense_flag) + break + + + # Keyword detection logic + keywords = results_info.get("keywords", []) + keyword_match_status = None + + if keywords and html_text: + keywords_found = [] + for keyword in keywords: + if keyword.lower() in html_text.lower(): + keywords_found.append(keyword) + + if keywords_found: + keyword_match_status = KeywordMatchStatus.KEYWORD_FOUND + logger.debug(f"Keywords found in {site.name}: {keywords_found}") + else: + keyword_match_status = KeywordMatchStatus.KEYWORDS_NOT_FOUND + logger.debug(f"No keywords found in {site.name}") + else: + keyword_match_status = KeywordMatchStatus.NO_KEYWORDS + + def build_result(status, **kwargs): + return MaigretCheckResult( + username, + site_name, + url, + status, + query_time=response_time, + tags=fulltags, + keywords=keywords, + keyword_match_status=keyword_match_status, + **kwargs, + ) + + if check_error: + logger.warning(check_error) + result = build_result( + MaigretCheckStatus.UNKNOWN, + error=check_error, + context=str(check_error), + ) + elif check_type == "message": + # Checks if the error message is in the HTML + is_absence_detected = any( + [(absence_flag in html_text) for absence_flag in site.absence_strs] + ) + if not is_absence_detected and is_presense_detected: + result = build_result(MaigretCheckStatus.CLAIMED) + else: + result = build_result(MaigretCheckStatus.AVAILABLE) + elif check_type == "status_code": + # Checks if the status code of the response is 2XX + if 200 <= status_code < 300: + result = build_result(MaigretCheckStatus.CLAIMED) + else: + result = build_result(MaigretCheckStatus.AVAILABLE) + elif check_type == "response_url": + # For this detection method, we have turned off the redirect. + # So, there is no need to check the response URL: it will always + # match the request. Instead, we will ensure that the response + # code indicates that the request was successful (i.e. no 404, or + # forward to some odd redirect). + if 200 <= status_code < 300 and is_presense_detected: + result = build_result(MaigretCheckStatus.CLAIMED) + else: + result = build_result(MaigretCheckStatus.AVAILABLE) + else: + # It should be impossible to ever get here... + raise ValueError( + f"Unknown check type '{check_type}' for " f"site '{site.name}'" + ) + + extracted_ids_data = {} + + if is_parsing_enabled and result.status == MaigretCheckStatus.CLAIMED: + extracted_ids_data = extract_ids_data(html_text, logger, site) + if extracted_ids_data: + new_usernames = parse_usernames(extracted_ids_data, logger) + results_info = update_results_info( + results_info, extracted_ids_data, new_usernames + ) + result.ids_data = extracted_ids_data + + # Save status of request + results_info["status"] = result + + # Save results from request + results_info["http_status"] = status_code + results_info["is_similar"] = site.similar_search + # results_site['response_text'] = html_text + results_info["rank"] = site.alexa_rank + return results_info + + +def make_site_result( + site: MaigretSite, username: str, options: Dict[str, Any], logger, *args, **kwargs +) -> SiteResult: + results_site: SiteResult = {} + + # Record URL of main site and username + results_site["site"] = site + results_site["username"] = username + results_site["keywords"] = kwargs.get('keywords', []) + results_site["parsing_enabled"] = options["parsing"] + results_site["url_main"] = site.url_main + results_site["cookies"] = ( + options.get("cookie_jar") + and options["cookie_jar"].filter_cookies(site.url_main) + or None + ) + + headers = { + "User-Agent": get_random_user_agent(), + # tell server that we want to close connection after request + "Connection": "close", + } + + headers.update(site.headers) + + if "url" not in site.__dict__: + logger.error("No URL for site %s", site.name) + + if kwargs.get('retry') and hasattr(site, "mirrors"): + site.url_main = random.choice(site.mirrors) + logger.info(f"Use {site.url_main} as a main url of site {site}") + + # URL of user on site (if it exists) + url = site.url.format( + urlMain=site.url_main, urlSubpath=site.url_subpath, username=quote(username) + ) + + # workaround to prevent slash errors + url = re.sub("(?<!:)/+", "/", url) + + # Select checker. Order of precedence: + # 1. Cloudflare webgate (FlareSolverr / CloudflareBypassForScraping) when + # bypass is active and site.protection requests it. + # 2. curl_cffi for sites requiring TLS impersonation. + # 3. Default protocol-specific checker (aiohttp). + cf_bypass = options.get("cloudflare_bypass") + needs_webgate = bool(cf_bypass) and any( + p in cf_bypass["trigger_protection"] for p in site.protection + ) + needs_impersonation = 'tls_fingerprint' in site.protection + + if needs_webgate: + checker = CloudflareWebgateChecker(logger=logger, config=cf_bypass) + logger.info( + f"Using Cloudflare webgate for {site.name} " + f"(protection: {list(site.protection)})" + ) + elif needs_impersonation: + checker = CurlCffiChecker( + logger=logger, + browser_emulate='chrome', + proxy=options.get('proxy'), + ) + else: + checker = make_protocol_checker(options, site.protocol) + + # site check is disabled + if site.disabled and not options['forced']: + logger.debug(f"Site {site.name} is disabled, skipping...") + results_site["status"] = MaigretCheckResult( + username, + site.name, + url, + MaigretCheckStatus.ILLEGAL, + error=CheckError("Check is disabled"), + ) + # current username type could not be applied + elif site.type != options["id_type"]: + results_site["status"] = MaigretCheckResult( + username, + site.name, + url, + MaigretCheckStatus.ILLEGAL, + error=CheckError('Unsupported identifier type', f'Want "{site.type}"'), + ) + # username is not allowed. + elif site.regex_check and re.search(site.regex_check, username) is None: + results_site["status"] = MaigretCheckResult( + username, + site.name, + url, + MaigretCheckStatus.ILLEGAL, + error=CheckError( + 'Unsupported username format', f'Want "{site.regex_check}"' + ), + ) + results_site["url_user"] = "" + results_site["http_status"] = "" + results_site["response_text"] = "" + # query_notify.update(results_site["status"]) + else: + # URL of user on site (if it exists) + results_site["url_user"] = url + url_probe = site.url_probe + if url_probe is None: + # Probe URL is normal one seen by people out on the web. + url_probe = url + else: + # There is a special URL for probing existence separate + # from where the user profile normally can be found. + url_probe = url_probe.format( + urlMain=site.url_main, + urlSubpath=site.url_subpath, + username=username, + ) + + for k, v in site.get_params.items(): + url_probe += f"&{k}={v}" + + results_site["url_probe"] = url_probe + + if site.request_method: + request_method = site.request_method.lower() + elif site.check_type == "status_code" and site.request_head_only: + # In most cases when we are detecting by status code, + # it is not necessary to get the entire body: we can + # detect fine with just the HEAD response. + request_method = 'head' + else: + # Either this detect method needs the content associated + # with the GET response, or this specific website will + # not respond properly unless we request the whole page. + request_method = 'get' + + payload = None + if site.request_payload: + payload = {} + for k, v in site.request_payload.items(): + if isinstance(v, str): + payload[k] = v.format(username=username) + else: + payload[k] = v + + if site.check_type == "response_url": + # Site forwards request to a different URL if username not + # found. Disallow the redirect so we can capture the + # http status from the original URL request. + allow_redirects = False + else: + # Allow whatever redirect that the site wants to do. + # The final result of the request will be what is available. + allow_redirects = True + + future = checker.prepare( + method=request_method, + url=url_probe, + headers=headers, + allow_redirects=allow_redirects, + timeout=options['timeout'], + payload=payload, + ) + + # Store future request object in the results object + results_site["future"] = future + + results_site["checker"] = checker + + return results_site + + +async def check_site_for_username( + site, username, options: Dict[str, Any], logger, query_notify, *args, **kwargs +) -> Tuple[str, SiteResult]: + keywords = kwargs.get('keywords') + default_result = make_site_result( + site, username, options, logger, retry=kwargs.get('retry'), keywords=keywords + ) + # future = default_result.get("future") + # if not future: + # return site.name, default_result + + checker = default_result.get("checker") + if not checker: + print(f"error, no checker for {site.name}") + return site.name, default_result + + response = await checker.check() + html_text = response[0] if response and response[0] else "" + + # Retry once after token-style activation (e.g. Twitter guest token refresh). + act = site.activation + if act and html_text: + marks = act.get("marks") or [] + if marks and any(m in html_text for m in marks): + method = act["method"] + try: + activate_fun = getattr(ParsingActivator(), method) + await activate_fun( + site, + logger, + url=checker.url, + timeout=options['timeout'], + html=html_text, + ) + except AttributeError: + logger.warning( + f"Activation method {method} for site {site.name} not found!", + exc_info=True, + ) + except Exception as e: + logger.warning( + f"Failed activation {method} for site {site.name}: {str(e)}", + exc_info=True, + ) + else: + merged = dict(checker.headers or {}) + merged.update(site.headers) + checker.prepare( + url=checker.url, + headers=merged, + allow_redirects=checker.allow_redirects, + timeout=checker.timeout, + method=checker.method, + payload=getattr(checker, 'payload', None), + ) + response = await checker.check() + + response_result = process_site_result( + response, query_notify, logger, default_result, site + ) + + query_notify.update(response_result['status'], site.similar_search) + + return site.name, response_result + + +async def debug_ip_request(checker, logger): + checker.prepare(url="https://icanhazip.com") + ip, status, check_error = await checker.check() + if ip: + logger.debug(f"My IP is: {ip.strip()}") + else: + logger.debug(f"IP requesting {check_error.type}: {check_error.desc}") + + +def get_failed_sites(results: Dict[str, SiteResult]) -> List[str]: + sites = [] + for sitename, r in results.items(): + status = r.get('status') + if status and status.error: + if errors.is_permanent(status.error.type): + continue + sites.append(sitename) + return sites + + +async def maigret( + username: str, + site_dict: Dict[str, MaigretSite], + logger, + query_notify=None, + proxy=None, + tor_proxy=None, + i2p_proxy=None, + timeout=3, + is_parsing_enabled=False, + id_type="username", + debug=False, + forced=False, + max_connections=100, + no_progressbar=False, + cookies=None, + retries=0, + check_domains=False, + cloudflare_bypass: Optional[Dict[str, Any]] = None, + keywords=None, + dns_resolver: str = 'async', + output_container: Optional[Dict[str, SiteResult]] = None, + *args, + **kwargs, +) -> Dict[str, SiteResult]: + """Main search func + + Checks for existence of username on certain sites. + + Keyword Arguments: + username -- Username string will be used for search. + site_dict -- Dictionary containing sites data in MaigretSite objects. + query_notify -- Notifier object (e.g. QueryNotifyPrint) used to + report query progress and results. + logger -- Standard Python logger object. + timeout -- Time in seconds to wait before timing out request. + Default is 3 seconds. + is_parsing_enabled -- Extract additional info from account pages. + id_type -- Type of username to search. + Default is 'username', see all supported here: + https://maigret.readthedocs.io/en/latest/supported-identifier-types.html + max_connections -- Maximum number of concurrent connections allowed. + Default is 100. + no_progressbar -- Displaying of ASCII progressbar during scanner. + cookies -- Filename of a cookie jar file to use for each request. + keywords -- List of keywords to search for in HTML content. + Default is None. + *args, **kwargs -- Additional arguments. + + Return Value: + Dictionary containing results from report. Key of dictionary is the name + of the social network site, and the value is another dictionary with + the following keys: + url_main: URL of main site. + url_user: URL of user on site (if account exists). + status: QueryResult() object indicating results of test for + account existence. + http_status: HTTP status code of query which checked for existence on + site. + response_text: Text that came back from request. May be None if + there was an HTTP error when checking for existence. + """ + + # notify caller that we are starting the query. + if not query_notify: + query_notify = Mock() + + query_notify.start(username, id_type) + + cookie_jar = None + if cookies: + logger.debug(f"Using cookies jar file {cookies}") + cookie_jar = import_aiohttp_cookies(cookies) + + def clearweb_checker(): + return SimpleAiohttpChecker( + proxy=proxy, cookie_jar=cookie_jar, logger=logger, dns_resolver=dns_resolver + ) + + def tor_checker(): + if not tor_proxy: + return CheckerMock() + return ProxiedAiohttpChecker( # type: ignore + proxy=tor_proxy, cookie_jar=cookie_jar, logger=logger, dns_resolver=dns_resolver + ) + + def i2p_checker(): + if not i2p_proxy: + return CheckerMock() + return ProxiedAiohttpChecker( # type: ignore + proxy=i2p_proxy, cookie_jar=cookie_jar, logger=logger, dns_resolver=dns_resolver + ) + + def dns_checker(): + if not check_domains: + return CheckerMock() + return AiodnsDomainResolver(logger=logger) # type: ignore + + if logger.level == logging.DEBUG: + await debug_ip_request(clearweb_checker(), logger) + + # setup parallel executor + executor = AsyncioQueueGeneratorExecutor( + logger=logger, + in_parallel=max_connections, + timeout=timeout + 0.5, + *args, + **kwargs, + ) + + # make options objects for all the requests + options: Dict[str, Any] = {} + options["cookies"] = cookie_jar + options["checkers"] = { + '': clearweb_checker, + 'tor': tor_checker, + 'dns': dns_checker, + 'i2p': i2p_checker, + } + options["parsing"] = is_parsing_enabled + options["timeout"] = timeout + options["id_type"] = id_type + options["forced"] = forced + options["cloudflare_bypass"] = cloudflare_bypass + options["proxy"] = proxy + + # results from analysis of all sites + # When the caller wants to read partial results after a Ctrl+C + # cancellation, they pass a dict; we mutate it in place so the partial + # state remains visible after this coroutine raises CancelledError. + all_results: Dict[str, SiteResult] = ( + output_container if output_container is not None else {} + ) + + sites = list(site_dict.keys()) + + attempts = retries + 1 + while attempts: + tasks_dict = {} + + for sitename, site in site_dict.items(): + if sitename not in sites: + continue + default_result: SiteResult = { + 'site': site, + 'status': MaigretCheckResult( + username, + sitename, + '', + MaigretCheckStatus.UNKNOWN, + error=CheckError('Request failed'), + ), + } + tasks_dict[sitename] = ( + check_site_for_username, + [site, username, options, logger, query_notify], + { + 'default': (sitename, default_result), + 'retry': retries - attempts + 1, + 'keywords': keywords, + }, + ) + + cur_results = [] + # ctrl_c=False is critical: alive_progress's default Ctrl+C handler + # silently absorbs the first SIGINT (it draws a "⚠" mark on the bar + # and keeps going), so the user has to press it twice. With + # ctrl_c=False the signal propagates immediately to asyncio, which + # cancels the main task — caught in maigret.maigret.main() as + # CancelledError so the search loop falls through to report + # generation. See issue: "ctrl+c needs two presses + traceback". + try: + with alive_bar( + len(tasks_dict), title="Searching", force_tty=True, + disable=no_progressbar, ctrl_c=False, + ) as progress: + async for result in executor.run(list(tasks_dict.values())): # type: ignore[arg-type] + cur_results.append(result) + # `all_results` may be an output container supplied by + # the caller — flush each completed site check into it + # immediately, so partial progress survives a Ctrl+C + # cancellation (issue #2688 follow-up). dict.update + # accepts an iterable of (k, v) 2-tuples, which is what + # the executor yields, so this is equivalent to the + # post-loop update but visible to the caller mid-flight. + all_results.update([result]) + progress() + except asyncio.CancelledError: + # Re-raise so the caller's `except CancelledError` runs. The + # partial `all_results` is already visible to the caller via the + # output_container kwarg. + query_notify.finish() + raise + + all_results.update(cur_results) + + # rerun for failed sites + sites = get_failed_sites(dict(cur_results)) + attempts -= 1 + + if not sites: + break + + if attempts: + query_notify.warning( + f'Restarting checks for {len(sites)} sites... ({attempts} attempts left)' + ) + + # notify caller that all queries are finished + query_notify.finish() + + return all_results + + +def timeout_check(value): + """Check Timeout Argument. + + Checks timeout for validity. + + Keyword Arguments: + value -- Time in seconds to wait before timing out request. + + Return Value: + Floating point number representing the time (in seconds) that should be + used for the timeout. + + NOTE: Will raise an exception if the timeout in invalid. + """ + from argparse import ArgumentTypeError + + try: + timeout = float(value) + except ValueError: + raise ArgumentTypeError(f"Timeout '{value}' must be a number.") + if timeout <= 0: + raise ArgumentTypeError(f"Timeout '{value}' must be greater than 0.0s.") + return timeout + + +async def site_self_check( + site: MaigretSite, + logger: logging.Logger, + semaphore, + db: MaigretDatabase, + silent=False, + proxy=None, + tor_proxy=None, + i2p_proxy=None, + skip_errors=False, + cookies=None, + auto_disable=False, + diagnose=False, + cloudflare_bypass: Optional[Dict[str, Any]] = None, +): + """ + Self-check a site configuration. + + Args: + auto_disable: If True, automatically disable sites that fail checks. + If False (default), only report issues without disabling. + diagnose: If True, print detailed diagnosis information. + """ + changes: Dict[str, Any] = { + "disabled": False, + "issues": [], + "recommendations": [], + } + + try: + check_data = [ + (site.username_claimed, MaigretCheckStatus.CLAIMED), + (site.username_unclaimed, MaigretCheckStatus.AVAILABLE), + ] + + logger.info(f"Checking {site.name}...") + + results_cache = {} + + for username, status in check_data: + async with semaphore: + results_dict = await maigret( + username=username, + site_dict={site.name: site}, + logger=logger, + timeout=30, + id_type=site.type, + forced=True, + no_progressbar=True, + retries=1, + proxy=proxy, + tor_proxy=tor_proxy, + i2p_proxy=i2p_proxy, + cookies=cookies, + cloudflare_bypass=cloudflare_bypass, + ) + + # don't disable entries with other ids types + if site.name not in results_dict: + logger.info(results_dict) + changes["issues"].append(f"Site {site.name} not in results (wrong id_type?)") + if auto_disable: + changes["disabled"] = True + continue + + logger.debug(results_dict) + + result = results_dict[site.name]["status"] + results_cache[username] = results_dict[site.name] + + if result.error and 'Cannot connect to host' in result.error.desc: + changes["issues"].append("Cannot connect to host") + if auto_disable: + changes["disabled"] = True + + site_status = result.status + + if site_status != status: + if site_status == MaigretCheckStatus.UNKNOWN: + msgs = site.absence_strs + etype = site.check_type + error_msg = f"Error checking {username}: {result.context}" + changes["issues"].append(error_msg) + logger.warning( + f"Error while searching {username} in {site.name}: {result.context}, {msgs}, type {etype}" + ) + # don't disable sites after the error + # meaning that the site could be available, but returned error for the check + # e.g. many sites protected by cloudflare and available in general + if skip_errors: + pass + # don't disable in case of available username + elif status == MaigretCheckStatus.CLAIMED and auto_disable: + changes["disabled"] = True + elif status == MaigretCheckStatus.CLAIMED: + changes["issues"].append(f"Claimed user '{username}' not detected as claimed") + logger.warning( + f"Not found `{username}` in {site.name}, must be claimed" + ) + logger.info(results_dict[site.name]) + if auto_disable: + changes["disabled"] = True + else: + changes["issues"].append(f"Unclaimed user '{username}' detected as claimed") + logger.warning(f"Found `{username}` in {site.name}, must be available") + logger.info(results_dict[site.name]) + if auto_disable: + changes["disabled"] = True + + logger.info(f"Site {site.name} checking is finished") + + # Generate recommendations based on issues + if changes["issues"] and len(results_cache) == 2: + claimed_result = results_cache.get(site.username_claimed, {}) + unclaimed_result = results_cache.get(site.username_unclaimed, {}) + + claimed_http = claimed_result.get("http_status") + unclaimed_http = unclaimed_result.get("http_status") + + if claimed_http and unclaimed_http: + if claimed_http != unclaimed_http and site.check_type != "status_code": + changes["recommendations"].append( + f"Consider checkType: status_code (HTTP {claimed_http} vs {unclaimed_http})" + ) + + # Print diagnosis if requested + if diagnose and changes["issues"]: + print(f"\n--- {site.name} DIAGNOSIS ---") + print(f" Check type: {site.check_type}") + print(" Issues:") + for issue in changes["issues"]: + print(f" - {issue}") + if changes["recommendations"]: + print(" Recommendations:") + for rec in changes["recommendations"]: + print(f" -> {rec}") + + # Only modify site if auto_disable is enabled + if auto_disable and changes["disabled"] != site.disabled: + site.disabled = changes["disabled"] + logger.info(f"Switching property 'disabled' for {site.name} to {site.disabled}") + db.update_site(site) + if not silent: + action = "Disabled" if site.disabled else "Enabled" + print(f"{action} site {site.name}...") + elif changes["issues"] and not silent and not diagnose: + # Report issues without disabling + print(f"Issues found in {site.name}: {len(changes['issues'])} (not auto-disabled)") + + # remove service tag "unchecked" + if "unchecked" in site.tags: + site.tags.remove("unchecked") + db.update_site(site) + + except Exception as e: + logger.warning( + f"Self-check of {site.name} failed with unexpected error: {e}", + exc_info=True, + ) + changes["issues"].append(f"Unexpected error: {e}") + if auto_disable and not site.disabled: + changes["disabled"] = True + site.disabled = True + db.update_site(site) + if not silent: + print(f"Disabled site {site.name} (unexpected error)...") + + return changes + + +async def self_check( + db: MaigretDatabase, + site_data: dict, + logger: logging.Logger, + silent=False, + max_connections=10, + proxy=None, + tor_proxy=None, + i2p_proxy=None, + auto_disable=False, + diagnose=False, + no_progressbar=False, + cloudflare_bypass: Optional[Dict[str, Any]] = None, +) -> dict: + """ + Run self-check on sites. + + Args: + auto_disable: If True, automatically disable sites that fail checks. + If False (default), only report issues without disabling. + diagnose: If True, print detailed diagnosis for each failing site. + + Returns: + dict with 'needs_update' bool and 'results' list of check results + """ + sem = asyncio.Semaphore(max_connections) + tasks = [] + all_sites = site_data + all_results = [] + + def disabled_count(lst): + return len(list(filter(lambda x: x.disabled, lst))) + + unchecked_old_count = len( + [site for site in all_sites.values() if "unchecked" in site.tags] + ) + disabled_old_count = disabled_count(all_sites.values()) + + for _, site in all_sites.items(): + check_coro = site_self_check( + site, logger, sem, db, silent, proxy, tor_proxy, i2p_proxy, + skip_errors=True, auto_disable=auto_disable, diagnose=diagnose, + cloudflare_bypass=cloudflare_bypass, + ) + future = asyncio.ensure_future(check_coro) + tasks.append((site.name, future)) + + if tasks: + with alive_bar(len(tasks), title='Self-checking', force_tty=True, + disable=no_progressbar, ctrl_c=False) as progress: + for site_name, f in tasks: + try: + result = await f + except Exception as e: + logger.warning( + f"Self-check task for {site_name} raised unexpected error: {e}", + exc_info=True, + ) + result = { + "disabled": False, + "issues": [f"Unexpected error: {e}"], + "recommendations": [], + } + result['site_name'] = site_name + all_results.append(result) + progress() # Update the progress bar + + unchecked_new_count = len( + [site for site in all_sites.values() if "unchecked" in site.tags] + ) + disabled_new_count = disabled_count(all_sites.values()) + total_disabled = disabled_new_count - disabled_old_count + + # Count issues + total_issues = sum(1 for r in all_results if r.get('issues')) + + if auto_disable and total_disabled: + if total_disabled >= 0: + message = "Disabled" + else: + message = "Enabled" + total_disabled *= -1 + + if not silent: + print( + f"{message} {total_disabled} ({disabled_old_count} => {disabled_new_count}) checked sites. " + "Run with `--info` flag to get more information" + ) + elif total_issues and not silent: + print(f"\nFound issues in {total_issues} sites (auto-disable is OFF)") + print("Use --auto-disable to automatically disable failing sites") + print("Use --diagnose to see detailed diagnosis for each site") + + if unchecked_new_count != unchecked_old_count: + print(f"Unchecked sites verified: {unchecked_old_count - unchecked_new_count}") + + needs_update = total_disabled != 0 or unchecked_new_count != unchecked_old_count + + return { + 'needs_update': needs_update, + 'results': all_results, + 'total_issues': total_issues, + } + + +def extract_ids_data(html_text, logger, site) -> Dict: + try: + return extract(html_text) + except Exception as e: + logger.warning(f"Error while parsing {site.name}: {e}", exc_info=True) + return {} + + +def parse_usernames(extracted_ids_data, logger) -> Dict: + new_usernames = {} + for k, v in extracted_ids_data.items(): + if "username" in k and not "usernames" in k: + if is_plausible_username(v): + new_usernames[v] = "username" + else: + logger.debug( + f"Rejected non-username value extracted under key {k!r}: {v!r}" + ) + elif "usernames" in k: + try: + tree = ast.literal_eval(v) + if isinstance(tree, list): + for n in tree: + if is_plausible_username(n): + new_usernames[n] = "username" + else: + logger.debug( + f"Rejected non-username item from list under key {k!r}: {n!r}" + ) + except Exception as e: + logger.warning(e) + if k in SUPPORTED_IDS: + new_usernames[v] = k + return new_usernames + + +def update_results_info(results_info, extracted_ids_data, new_usernames): + results_info["ids_usernames"] = new_usernames + links = ascii_data_display(extracted_ids_data.get("links", "[]")) + if "website" in extracted_ids_data: + links.append(extracted_ids_data["website"]) + results_info["ids_links"] = links + return results_info diff --git a/maigret/db_updater.py b/maigret/db_updater.py new file mode 100644 index 0000000..cf73d92 --- /dev/null +++ b/maigret/db_updater.py @@ -0,0 +1,335 @@ +""" +Database auto-update logic for maigret. + +Checks a lightweight meta file to determine if a newer site database is available, +downloads it if compatible, and caches it locally in ~/.maigret/. +""" + +import hashlib +import json +import logging +import os +import os.path as path +import tempfile +from datetime import datetime, timezone +from typing import Optional + +import requests +from colorama import Fore, Style + +from .__version__ import __version__ + +logger = logging.getLogger("maigret") + +_use_color = True + + +def _print(prefix: str, color: str, msg: str) -> None: + text = f"[{prefix}] {msg}" + print(Style.BRIGHT + color + text + Style.RESET_ALL if _use_color else text) + + +def _print_info(msg: str) -> None: + _print("*", Fore.GREEN, msg) + + +def _print_success(msg: str) -> None: + _print("+", Fore.GREEN, msg) + + +def _print_warning(msg: str) -> None: + _print("!", Fore.YELLOW, msg) + + +DEFAULT_META_URL = ( + "https://raw.githubusercontent.com/soxoj/maigret/main/maigret/resources/db_meta.json" +) +DEFAULT_CHECK_INTERVAL_HOURS = 24 +MAIGRET_HOME = path.expanduser("~/.maigret") +CACHED_DB_PATH = path.join(MAIGRET_HOME, "data.json") +STATE_PATH = path.join(MAIGRET_HOME, "autoupdate_state.json") +BUNDLED_DB_PATH = path.join(path.dirname(path.realpath(__file__)), "resources", "data.json") + + +def _parse_version(version_str: str) -> tuple: + """Parse a version string like '0.5.0' into a comparable tuple (0, 5, 0).""" + try: + return tuple(int(x) for x in version_str.strip().split(".")) + except (ValueError, AttributeError): + return (0, 0, 0) + + +def _ensure_maigret_home() -> None: + os.makedirs(MAIGRET_HOME, exist_ok=True) + + +def _load_state() -> dict: + try: + with open(STATE_PATH, "r", encoding="utf-8") as f: + return json.load(f) + except (FileNotFoundError, json.JSONDecodeError, OSError): + return {} + + +def _save_state(state: dict) -> None: + _ensure_maigret_home() + tmp_path = STATE_PATH + ".tmp" + try: + with open(tmp_path, "w", encoding="utf-8") as f: + json.dump(state, f, indent=2, ensure_ascii=False) + os.replace(tmp_path, STATE_PATH) + except OSError: + try: + os.unlink(tmp_path) + except OSError: + pass + + +def _needs_check(state: dict, interval_hours: int) -> bool: + last_check = state.get("last_check_at") + if not last_check: + return True + try: + last_dt = datetime.fromisoformat(last_check.replace("Z", "+00:00")) + elapsed = (datetime.now(timezone.utc) - last_dt).total_seconds() / 3600 + return elapsed >= interval_hours + except (ValueError, TypeError): + return True + + +def _fetch_meta(meta_url: str, timeout: int = 10) -> Optional[dict]: + try: + response = requests.get(meta_url, timeout=timeout) + if response.status_code == 200: + return response.json() + except Exception: + pass + return None + + +def _is_version_compatible(meta: dict) -> bool: + min_ver = meta.get("min_maigret_version", "0.0.0") + return _parse_version(__version__) >= _parse_version(min_ver) + + +def _is_update_available(meta: dict, state: dict) -> bool: + if not path.isfile(CACHED_DB_PATH): + return True + remote_date = meta.get("updated_at", "") + cached_date = state.get("last_meta", {}).get("updated_at", "") + return remote_date > cached_date + + +def _download_and_verify(data_url: str, expected_sha256: str, timeout: int = 60) -> Optional[str]: + _ensure_maigret_home() + tmp_fd, tmp_path = tempfile.mkstemp(dir=MAIGRET_HOME, suffix=".json") + try: + response = requests.get(data_url, timeout=timeout) + if response.status_code != 200: + return None + + content = response.content + actual_sha256 = hashlib.sha256(content).hexdigest() + if actual_sha256 != expected_sha256: + _print_warning("DB auto-update: SHA-256 mismatch, download rejected") + return None + + # Validate JSON structure + data = json.loads(content) + if not all(k in data for k in ("sites", "engines", "tags")): + _print_warning("DB auto-update: invalid database structure") + return None + + os.write(tmp_fd, content) + os.close(tmp_fd) + tmp_fd = None + os.replace(tmp_path, CACHED_DB_PATH) + return CACHED_DB_PATH + except Exception: + return None + finally: + if tmp_fd is not None: + os.close(tmp_fd) + try: + os.unlink(tmp_path) + except OSError: + pass + + +def _best_local() -> str: + """Return cached DB if it exists and is valid, otherwise bundled.""" + if path.isfile(CACHED_DB_PATH): + try: + with open(CACHED_DB_PATH, "r", encoding="utf-8") as f: + data = json.load(f) + if "sites" in data: + return CACHED_DB_PATH + except (json.JSONDecodeError, OSError): + pass + return BUNDLED_DB_PATH + + +def _now_iso() -> str: + return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def resolve_db_path( + db_file_arg: str, + no_autoupdate: bool = False, + meta_url: str = DEFAULT_META_URL, + check_interval_hours: int = DEFAULT_CHECK_INTERVAL_HOURS, + color: bool = True, +) -> str: + """ + Determine which database file to use, potentially downloading an update. + + Returns the path to the database file that should be loaded. + """ + global _use_color + _use_color = color + + default_db_name = "resources/data.json" + + # User specified a custom DB — skip auto-update + is_url = db_file_arg.startswith("http://") or db_file_arg.startswith("https://") + is_default = db_file_arg == default_db_name + if is_url: + return db_file_arg + if not is_default: + # Try the path as-is (absolute or relative to cwd) first. + if path.isfile(db_file_arg): + return path.abspath(db_file_arg) + # Fall back to legacy behavior: resolve relative to the maigret module dir. + module_relative = path.join(path.dirname(path.realpath(__file__)), db_file_arg) + if module_relative != db_file_arg and path.isfile(module_relative): + return module_relative + if module_relative != db_file_arg: + raise FileNotFoundError( + f"Custom database file not found: {db_file_arg!r} " + f"(also tried {module_relative!r})" + ) + raise FileNotFoundError(f"Custom database file not found: {db_file_arg!r}") + + # Auto-update disabled + if no_autoupdate: + return _best_local() + + # Check interval + _ensure_maigret_home() + state = _load_state() + if not _needs_check(state, check_interval_hours): + return _best_local() + + # Time to check + _print_info("DB auto-update: checking for updates...") + meta = _fetch_meta(meta_url) + if meta is None: + _print_warning("DB auto-update: could not reach update server, using local database") + state["last_check_at"] = _now_iso() + _save_state(state) + return _best_local() + + # Version compatibility + if not _is_version_compatible(meta): + min_ver = meta.get("min_maigret_version", "?") + _print_warning( + f"DB auto-update: latest database requires maigret >= {min_ver}, " + f"you have {__version__}. Please upgrade with: pip install -U maigret" + ) + state["last_check_at"] = _now_iso() + _save_state(state) + return _best_local() + + # Check if update available + if not _is_update_available(meta, state): + sites_count = meta.get("sites_count", "?") + _print_info(f"DB auto-update: database is up to date ({sites_count} sites)") + state["last_check_at"] = _now_iso() + state["last_meta"] = meta + _save_state(state) + return _best_local() + + # Download update + new_count = meta.get("sites_count", "?") + old_count = state.get("last_meta", {}).get("sites_count") + if old_count: + _print_info(f"DB auto-update: downloading updated database ({new_count} sites, was {old_count})...") + else: + _print_info(f"DB auto-update: downloading database ({new_count} sites)...") + + data_url = meta.get("data_url", "") + expected_sha = meta.get("data_sha256", "") + result = _download_and_verify(data_url, expected_sha) + + if result is None: + _print_warning("DB auto-update: download failed, using local database") + state["last_check_at"] = _now_iso() + _save_state(state) + return _best_local() + + _print_success(f"DB auto-update: database updated successfully ({new_count} sites)") + state["last_check_at"] = _now_iso() + state["last_meta"] = meta + state["cached_db_sha256"] = expected_sha + _save_state(state) + return CACHED_DB_PATH + + +def force_update( + meta_url: str = DEFAULT_META_URL, + color: bool = True, +) -> bool: + """ + Force check for database updates and download if available. + + Returns True if database was updated, False otherwise. + """ + global _use_color + _use_color = color + + _ensure_maigret_home() + + _print_info("DB update: checking for updates...") + meta = _fetch_meta(meta_url) + if meta is None: + _print_warning("DB update: could not reach update server") + return False + + if not _is_version_compatible(meta): + min_ver = meta.get("min_maigret_version", "?") + _print_warning( + f"DB update: latest database requires maigret >= {min_ver}, " + f"you have {__version__}. Please upgrade with: pip install -U maigret" + ) + return False + + state = _load_state() + new_count = meta.get("sites_count", "?") + old_count = state.get("last_meta", {}).get("sites_count") + + if not _is_update_available(meta, state): + _print_info(f"DB update: database is already up to date ({new_count} sites)") + state["last_check_at"] = _now_iso() + state["last_meta"] = meta + _save_state(state) + return False + + if old_count: + _print_info(f"DB update: downloading updated database ({new_count} sites, was {old_count})...") + else: + _print_info(f"DB update: downloading database ({new_count} sites)...") + + data_url = meta.get("data_url", "") + expected_sha = meta.get("data_sha256", "") + result = _download_and_verify(data_url, expected_sha) + + if result is None: + _print_warning("DB update: download failed") + return False + + _print_success(f"DB update: database updated successfully ({new_count} sites)") + state["last_check_at"] = _now_iso() + state["last_meta"] = meta + state["cached_db_sha256"] = expected_sha + _save_state(state) + return True diff --git a/maigret/error_detection.py b/maigret/error_detection.py new file mode 100644 index 0000000..ad9c226 --- /dev/null +++ b/maigret/error_detection.py @@ -0,0 +1,36 @@ +from typing import Dict, Optional + +from maigret import errors +from maigret.errors import CheckError + + +def detect_error_page( + html_text: str, + status_code: int, + fail_flags: Optional[Dict[str, str]] = None, + ignore_403: bool = False, +) -> Optional[CheckError]: + """Classify a response as an error condition. + + Three signals, checked in order: + 1. Site-specific failure markers (``fail_flags`` substring match). + 2. Generic provider / bot-protection wording (``errors.detect``). + 3. HTTP status — 403 (unless suppressed), >=500 server. HTTP 999 + (LinkedIn anti-bot) is a valid "not-found", not an error. + """ + if fail_flags and html_text: + for flag, msg in fail_flags.items(): + if flag in html_text: + return CheckError("Site-specific", msg) + + err = errors.detect(html_text) + if err: + return err + + if status_code == 403 and not ignore_403: + return CheckError("Access denied", f"403 status code, {errors.PROXY_RECOMMENDATION}") + if status_code == 999: + return None + if status_code >= 500: + return CheckError("Server", f"{status_code} status code") + return None diff --git a/maigret/errors.py b/maigret/errors.py new file mode 100644 index 0000000..09050b0 --- /dev/null +++ b/maigret/errors.py @@ -0,0 +1,237 @@ +from typing import Dict, List, Any, Tuple + +from .result import MaigretCheckResult, SiteResult + + +# error got as a result of completed search query +class CheckError: + _type = 'Unknown' + _desc = '' + + def __init__(self, typename, desc=''): + self._type = typename + self._desc = desc + + def __str__(self): + if not self._desc: + return f'{self._type} error' + + return f'{self._type} error: {self._desc}' + + @property + def type(self): + return self._type + + @property + def desc(self): + return self._desc + + +COMMON_ERRORS = { + '<title>Attention Required! | Cloudflare': CheckError( + 'Captcha', 'Cloudflare' + ), + # Prefix (no closing tag) so it matches both 'Just a moment' + # and Cloudflare's real title 'Just a moment...' (with the + # trailing ellipsis). The exact-match form missed the ellipsis variant, so + # lightweight CF pages without the /cdn-cgi/challenge-platform script went + # undetected and produced false CLAIMED on message-check sites (e.g. RealMeye). + 'Just a moment': CheckError( + 'Bot protection', 'Cloudflare challenge page' + ), + 'Please stand by, while we are checking your browser': CheckError( + 'Bot protection', 'Cloudflare' + ), + '<span data-translate="checking_browser">Checking your browser before accessing</span>': CheckError( + 'Bot protection', 'Cloudflare' + ), + 'This website is using a security service to protect itself from online attacks.': CheckError( + 'Access denied', 'Cloudflare' + ), + '<title>Доступ ограничен': CheckError('Censorship', 'Rostelecom'), + 'document.getElementById(\'validate_form_submit\').disabled=true': CheckError( + 'Captcha', 'Mail.ru' + ), + 'Verifying your browser, please wait...
DDoS Protection by Blazingfast.io': CheckError( + 'Bot protection', 'Blazingfast' + ), + '404

Мы не нашли страницу': CheckError( + 'Resolving', 'MegaFon 404 page' + ), + 'Доступ к информационному ресурсу ограничен на основании Федерального закона': CheckError( + 'Censorship', 'MGTS' + ), + 'Incapsula incident ID': CheckError('Bot protection', 'Incapsula'), + 'Client Challenge': CheckError('Bot protection', 'Anti-bot challenge'), + 'DDoS-Guard': CheckError('Bot protection', 'DDoS-Guard'), + 'Сайт заблокирован хостинг-провайдером': CheckError( + 'Site-specific', 'Site is disabled (Beget)' + ), + 'Generated by cloudfront (CloudFront)': CheckError('Request blocked', 'Cloudflare'), + '/cdn-cgi/challenge-platform/h/b/orchestrate/chl_page': CheckError( + 'Just a moment: bot redirect challenge', 'Cloudflare' + ), +} + +PROXY_RECOMMENDATION = ( + "it's recommended to use --cloudflare-bypass or proxy, " + "e.g. https://vaultproxies.net/maigret" +) + +ERRORS_TYPES = { + 'Captcha': 'Try to switch to another IP address or to use service cookies', + 'Bot protection': 'Try to switch to another IP address', + 'Access denied': PROXY_RECOMMENDATION, + 'Censorship': 'Switch to another internet service provider', + 'Request timeout': 'Try to increase timeout or to switch to another internet service provider', + 'Connecting failure': 'Check your internet connection; if only a subset of sites fails, try `-n 10` to lower parallelism', + 'Connecting failure (DNS)': ( + 'DNS resolution failed for most sites — Maigret\'s async DNS resolver (aiodns) could not contact a server. ' + 'First, try `--dns-resolver threaded` to fall back to the system DNS resolver (often fixes this on Windows / VPN / corporate networks). ' + 'If that does not help, check your internet connection, VPN, or firewall, and consider a public resolver (1.1.1.1 or 8.8.8.8)' + ), + 'Webgate unavailable': ( + 'cloudflare_bypass is enabled but every configured solver is unreachable. ' + 'Verify the URLs under `cloudflare_bypass.modules` in settings.json, and start at least one solver — ' + 'most commonly FlareSolverr (`docker run -d -p 8191:8191 ghcr.io/flaresolverr/flaresolverr:latest`). ' + 'Or set `cloudflare_bypass.enabled` to false in settings.json (and drop `--cloudflare-bypass`) to skip CF-protected sites' + ), +} + +ERRORS_REASONS = { + 'Login required': 'Add authorization cookies through `--cookies-jar-file` (see cookies.txt)', +} + +TEMPORARY_ERRORS_TYPES = [ + 'Request timeout', + 'Unknown', + 'Request failed', + 'Connecting failure', + 'Connecting failure (DNS)', + 'Webgate unavailable', + 'HTTP', + 'Proxy', + 'Interrupted', + 'Connection lost', +] + +THRESHOLD = 3 # percent — default threshold above which an error type is "important" + +# Per-error-type threshold overrides. The default 3% catches systemic issues +# (Captcha, Bot protection) quickly, but for some classes a low percentage is +# expected noise that does NOT mean the user has a fixable problem: +# +# - "Connecting failure (DNS)": a few sites in the database have stale or +# dead DNS records (sites that shut down). Firing the alarm at 3% means +# 3 dead domains in a 100-site batch produce a Windows/VPN troubleshooting +# suggestion that is wrong for nearly every user. Wait for ≥10% before +# nagging — at that rate it's clearly the user's resolver, not data rot. +ERROR_THRESHOLDS: Dict[str, float] = { + 'Connecting failure (DNS)': 10, +} + + +def threshold_for(err_type: str) -> float: + return ERROR_THRESHOLDS.get(err_type, THRESHOLD) + + +def is_important(err_data): + return err_data['perc'] >= threshold_for(err_data['err']) + + +def is_permanent(err_type): + return err_type not in TEMPORARY_ERRORS_TYPES + + +def detect(text): + for flag, err in COMMON_ERRORS.items(): + if flag in text: + return err + return None + + +def solution_of(err_type) -> str: + return ERRORS_TYPES.get(err_type, '') + + +def extract_and_group(search_res: Dict[str, SiteResult]) -> List[Dict[str, Any]]: + errors_counts: Dict[str, int] = {} + for r in search_res.values(): + if r and isinstance(r, dict) and r.get('status'): + if not isinstance(r['status'], MaigretCheckResult): + continue + + err = r['status'].error + if not err: + continue + errors_counts[err.type] = errors_counts.get(err.type, 0) + 1 + + counts = [] + for err, count in sorted(errors_counts.items(), key=lambda x: x[1], reverse=True): + counts.append( + { + 'err': err, + 'count': count, + # Keep the RAW percentage. is_important() compares this value + # against the threshold, so rounding it here can push a + # sub-threshold rate up to the cutoff: e.g. 8/267 = 2.996%, + # but round(2.996, 2) == 3.0, which would trip the 3% + # "important" threshold for a rate that is below it. Rounding + # is display-only (see notify_about_errors). + 'perc': count / len(search_res) * 100, + } + ) + + return counts + + +def notify_about_errors( + search_results: Dict[str, SiteResult], query_notify, show_statistics=False +) -> List[Tuple]: + """ + Prepare error notifications in search results, to be displayed by the + notify object. Each notification is a tuple: + + - ``(text, symbol)`` — plain message rendered fully bold/bright + - ``(text, symbol, advice)`` — header (``text``) is bold, ``advice`` is + appended in normal weight so the actionable explanation does not + visually overwhelm the count line. Consumer (``notify.warning``) + uses ``*tuple`` unpacking; the extra arg is optional there. + + Example:: + + [ + ("Too many errors of type \"Connecting failure (DNS)\" (94.0%)", + "!", "DNS resolution failed for ..."), + ("Verbose error statistics:", "-"), + ] + """ + results = [] + + errs = extract_and_group(search_results) + was_errs_displayed = False + for e in errs: + if not is_important(e): + continue + text = f'Too many errors of type "{e["err"]}" ({round(e["perc"],2)}%)' + solution = solution_of(e['err']) + if solution: + # Pass advice separately so notify.warning can render it in + # normal weight while keeping the count line bold. + results.append((text, '!', solution.capitalize())) + else: + results.append((text, '!')) + was_errs_displayed = True + + if show_statistics: + results.append(('Verbose error statistics:', '-')) + for e in errs: + text = f'{e["err"]}: {round(e["perc"],2)}%' + results.append((text, '!')) + + if was_errs_displayed: + results.append( + ('You can see detailed site check errors with a flag `--print-errors`', '-') + ) + + return results diff --git a/maigret/executors.py b/maigret/executors.py new file mode 100644 index 0000000..1e46b07 --- /dev/null +++ b/maigret/executors.py @@ -0,0 +1,75 @@ +import asyncio +import time +from typing import Any, Iterable, Callable + + +class AsyncioQueueGeneratorExecutor: + def __init__(self, *args, **kwargs): + self.workers_count = kwargs.get('in_parallel', 10) + self.queue: asyncio.Queue = asyncio.Queue() + self.timeout = kwargs.get('timeout') + self.logger = kwargs['logger'] + self._results: asyncio.Queue = asyncio.Queue() + self._stop_signal = object() + + async def worker(self): + """Process tasks from the queue and put results into the results queue.""" + while True: + task = await self.queue.get() + if task is self._stop_signal: + self.queue.task_done() + break + + try: + f, args, kwargs = task + query_future = f(*args, **kwargs) + query_task = asyncio.create_task(query_future) + + try: + result = await asyncio.wait_for(query_task, timeout=self.timeout) + except asyncio.TimeoutError: + result = kwargs.get('default') + await self._results.put(result) + except Exception as e: + self.logger.error(f"Error in worker: {e}", exc_info=True) + finally: + self.queue.task_done() + + async def run(self, queries: Iterable[Callable[..., Any]]): + """Run workers to process queries in parallel.""" + start_time = time.time() + + # Add tasks to the queue + for t in queries: + await self.queue.put(t) + + # Create workers + workers = [ + asyncio.create_task(self.worker()) for _ in range(self.workers_count) + ] + + # Add stop signals + for _ in range(self.workers_count): + await self.queue.put(self._stop_signal) + + try: + while any(w.done() is False for w in workers) or not self._results.empty(): + try: + result = await asyncio.wait_for(self._results.get(), timeout=1) + yield result + except asyncio.TimeoutError: + pass + finally: + # If the consumer cancelled us (Ctrl+C → search_task.cancel()), + # the workers are independent asyncio.Tasks that keep draining + # the queue and blocking the finally — for ~timeout per item, + # which is forever from the user's perspective. Cancel them + # explicitly so this finally returns promptly. Swallow their + # CancelledError via return_exceptions=True so it doesn't + # re-raise here and mask the original cancellation. + for w in workers: + if not w.done(): + w.cancel() + await asyncio.gather(*workers, return_exceptions=True) + self.execution_time = time.time() - start_time + self.logger.debug(f"Spent time: {self.execution_time}") diff --git a/maigret/maigret.py b/maigret/maigret.py new file mode 100755 index 0000000..7ba51b4 --- /dev/null +++ b/maigret/maigret.py @@ -0,0 +1,1112 @@ +""" +Maigret main module +""" + +import asyncio +import logging +import os +import sys +import platform +import re +from argparse import ArgumentParser, RawDescriptionHelpFormatter +from typing import Any, Dict, List, Tuple +import os.path as path +from maigret.utils import extract_usernames + +try: + from socid_extractor import extract, parse +except ImportError as e: + raise ImportError( + "Missing dependency: socid_extractor\n\n" + "If installed from PyPI:\n" + " pip install -U maigret\n\n" + "If running from a cloned repository:\n" + " pip install -e .\n\n" + "Then run Maigret as:\n" + " python -m maigret " + ) from e + + +from .__version__ import __version__ +from .checking import ( + timeout_check, + SUPPORTED_IDS, + self_check, + BAD_CHARS, + maigret, + build_cloudflare_bypass_config, +) +from . import errors +from .notify import QueryNotifyPrint, print_donate_banner, print_intro_banner +from .report import ( + save_csv_report, + save_xmind_report, + save_html_report, + save_pdf_report, + generate_report_context, + save_txt_report, + SUPPORTED_JSON_REPORT_FORMATS, + save_json_report, + get_plaintext_report, + sort_report_by_data_points, + save_graph_report, + save_neo4j_report, + save_markdown_report, +) +from .result import SiteResult +from .sites import MaigretDatabase +from .submit import Submitter +from .utils import get_dict_ascii_tree, is_plausible_username +from .settings import Settings +from .permutator import Permute + + +def extract_ids_from_page(url, logger, timeout=5) -> dict: + results = {} + # url, headers + reqs: List[Tuple[str, set]] = [(url, set())] + try: + # temporary workaround for URL mutations MVP + from socid_extractor import mutate_url + + reqs += list(mutate_url(url)) + except Exception as e: + logger.warning(e) + + for req in reqs: + url, headers = req + print(f'Scanning webpage by URL {url}...') + page, _ = parse(url, cookies_str='', headers=headers, timeout=timeout) + logger.debug(page) + info = extract(page) + if not info: + print('Nothing extracted') + else: + print(get_dict_ascii_tree(info.items(), new_line=False), ' ') + for k, v in info.items(): + + if k in SUPPORTED_IDS: + results[v] = k + + for username in extract_usernames(info, logger): + results[username] = 'username' + + return results + + +def extract_ids_from_results(results: Dict[str, SiteResult], db: MaigretDatabase) -> dict: + ids_results = {} + for website_name in results: + dictionary = results[website_name] + new_usernames = dictionary.get('ids_usernames') + if new_usernames: + for u, utype in new_usernames.items(): + ids_results[u] = utype + + for url in dictionary.get('ids_links', []): + ids_results.update(db.extract_ids_from_url(url)) + + return ids_results + + +def setup_arguments_parser(settings: Settings): + from aiohttp import __version__ as aiohttp_version + from requests import __version__ as requests_version + from socid_extractor import __version__ as socid_version + + version_string = '\n'.join( + [ + f'%(prog)s {__version__}', + f'Socid-extractor: {socid_version}', + f'Aiohttp: {aiohttp_version}', + f'Requests: {requests_version}', + f'Python: {platform.python_version()}', + ] + ) + + parser = ArgumentParser( + formatter_class=RawDescriptionHelpFormatter, + description=f"Maigret v{__version__}\n" + "Documentation: https://maigret.readthedocs.io/\n" + "All settings are also configurable through files, see docs.", + ) + parser.add_argument( + "username", + nargs='*', + metavar="USERNAMES", + help="One or more usernames to search by.", + ) + parser.add_argument( + "--version", + action="version", + version=version_string, + help="Display version information and dependencies.", + ) + parser.add_argument( + "--timeout", + action="store", + metavar='TIMEOUT', + dest="timeout", + type=timeout_check, + default=settings.timeout, + help="Time in seconds to wait for response to requests " + f"(default {settings.timeout}s). " + "A longer timeout will be more likely to get results from slow sites. " + "On the other hand, this may cause a long delay to gather all results. ", + ) + parser.add_argument( + "--retries", + action="store", + type=int, + metavar='RETRIES', + default=settings.retries_count, + help="Attempts to restart temporarily failed requests.", + ) + parser.add_argument( + "-n", + "--max-connections", + action="store", + type=int, + dest="connections", + default=settings.max_connections, + help=f"Allowed number of concurrent connections (default {settings.max_connections}).", + ) + parser.add_argument( + "--dns-resolver", + dest="dns_resolver", + default="async", + choices=("async", "threaded"), + help=( + "DNS resolver to use. 'async' (default) uses aiohttp's AsyncResolver " + "(via aiodns/c-ares) — fastest under high concurrency. 'threaded' uses " + "the OS getaddrinfo via a threadpool — slower, but respects the system " + "DNS configuration. Switch to 'threaded' if you see " + "'Could not contact DNS servers' for every site (issue #2688)." + ), + ) + parser.add_argument( + "--no-recursion", + action="store_true", + dest="disable_recursive_search", + default=(not settings.recursive_search), + help="Disable recursive search by additional data extracted from pages.", + ) + parser.add_argument( + "--no-extracting", + action="store_true", + dest="disable_extracting", + default=(not settings.info_extracting), + help="Disable parsing pages for additional data and other usernames.", + ) + parser.add_argument( + "--id-type", + dest="id_type", + default='username', + choices=SUPPORTED_IDS, + help="Specify identifier(s) type (default: username).", + ) + parser.add_argument( + "--permute", + action="store_true", + default=False, + help="Permute at least 2 usernames to generate more possible usernames.", + ) + parser.add_argument( + "--db", + metavar="DB_FILE", + dest="db_file", + default=settings.sites_db_path, + help="Load Maigret database from a JSON file or HTTP web resource.", + ) + parser.add_argument( + "--no-autoupdate", + action="store_true", + dest="no_autoupdate", + default=settings.no_autoupdate, + help="Disable automatic database updates on startup.", + ) + parser.add_argument( + "--force-update", + action="store_true", + dest="force_update", + default=False, + help="Force check for database updates and download if available.", + ) + parser.add_argument( + "--cookies-jar-file", + metavar="COOKIE_FILE", + dest="cookie_file", + default=settings.cookie_jar_file, + help="File with cookies.", + ) + parser.add_argument( + "--ignore-ids", + action="append", + metavar='IGNORED_IDS', + dest="ignore_ids_list", + default=settings.ignore_ids_list, + help="Do not make search by the specified username or other ids.", + ) + # reports options + parser.add_argument( + "--folderoutput", + "-fo", + dest="folderoutput", + default=settings.reports_path, + metavar="PATH", + help="If using multiple usernames, the output of the results will be saved to this folder.", + ) + parser.add_argument( + "--proxy", + "-p", + metavar='PROXY_URL', + action="store", + dest="proxy", + default=settings.proxy_url, + help="Make requests over a proxy. e.g. socks5://127.0.0.1:1080", + ) + parser.add_argument( + "--tor-proxy", + metavar='TOR_PROXY_URL', + action="store", + default=settings.tor_proxy_url, + help="Specify URL of your Tor gateway. Default is socks5://127.0.0.1:9050", + ) + parser.add_argument( + "--i2p-proxy", + metavar='I2P_PROXY_URL', + action="store", + default=settings.i2p_proxy_url, + help="Specify URL of your I2P gateway. Default is http://127.0.0.1:4444", + ) + parser.add_argument( + "--with-domains", + action="store_true", + default=settings.domain_search, + help="Enable (experimental) feature of checking domains on usernames.", + ) + parser.add_argument( + "--cloudflare-bypass", + action="store_true", + default=False, + help="Enable Cloudflare webgate bypass for sites with protection cf_js_challenge / cf_firewall / webgate. " + "Requires a local CloudflareBypassForScraping instance (see settings.json -> cloudflare_bypass.modules[0].url).", + ) + + filter_group = parser.add_argument_group( + 'Site filtering', 'Options to set site search scope' + ) + filter_group.add_argument( + "-a", + "--all-sites", + action="store_true", + dest="all_sites", + default=settings.scan_all_sites, + help="Use all sites for scan.", + ) + filter_group.add_argument( + "--top-sites", + action="store", + default=settings.top_sites_count, + metavar="N", + type=int, + help="Count of sites for scan ranked by Alexa Top (default: 500).", + ) + filter_group.add_argument( + "--tags", dest="tags", default='', help="Specify tags of sites (see `--stats`)." + ) + filter_group.add_argument( + "--exclude-tags", + dest="exclude_tags", + default='', + help="Specify tags to exclude from search (blacklist).", + ) + filter_group.add_argument( + "--keywords", + nargs='+', + metavar='KEYWORD', + dest="keywords", + default=[], + help="Specify keywords to search for in HTML content. Sites containing both username AND any keyword get special highlighting. e.g. --keywords tech python", + ) + filter_group.add_argument( + "--site", + action="append", + metavar='SITE_NAME', + dest="site_list", + default=settings.scan_sites_list, + help="Limit analysis to just the specified sites (multiple option).", + ) + filter_group.add_argument( + "--use-disabled-sites", + action="store_true", + default=settings.scan_disabled_sites, + help="Use disabled sites to search (may cause many false positives).", + ) + + modes_group = parser.add_argument_group( + 'Operating modes', + 'Various functions except the default search by a username. ' + 'Modes are executed sequentially in the order of declaration.', + ) + modes_group.add_argument( + "--parse", + dest="parse_url", + default='', + metavar='URL', + help="Parse page by URL and extract username and IDs to use for search.", + ) + modes_group.add_argument( + "--submit", + metavar='URL', + type=str, + dest="new_site_to_submit", + default=False, + help="URL of existing profile in new site to submit.", + ) + modes_group.add_argument( + "--self-check", + action="store_true", + default=settings.self_check_enabled, + help="Do self check for sites and database. Use --auto-disable to disable failing sites.", + ) + modes_group.add_argument( + "--auto-disable", + action="store_true", + default=False, + help="With --self-check: automatically disable sites that fail checks.", + ) + modes_group.add_argument( + "--diagnose", + action="store_true", + default=False, + help="With --self-check: print detailed diagnosis for each failing site.", + ) + modes_group.add_argument( + "--stats", + action="store_true", + default=False, + help="Show database statistics (most frequent sites engines and tags).", + ) + modes_group.add_argument( + "--web", + metavar='PORT', + type=int, + nargs='?', # Optional PORT value + const=5000, # Default PORT if `--web` is provided without a value + default=None, # Explicitly set default to None + help="Launch the web interface on the specified port (default: 5000 if no PORT is provided).", + ) + output_group = parser.add_argument_group( + 'Output options', 'Options to change verbosity and view of the console output' + ) + output_group.add_argument( + "--print-not-found", + action="store_true", + dest="print_not_found", + default=settings.print_not_found, + help="Print sites where the username was not found.", + ) + output_group.add_argument( + "--print-errors", + action="store_true", + dest="print_check_errors", + default=settings.print_check_errors, + help="Print errors messages: connection, captcha, site country ban, etc.", + ) + output_group.add_argument( + "--verbose", + "-v", + action="store_true", + dest="verbose", + default=False, + help="Display extra information and metrics.", + ) + output_group.add_argument( + "--info", + "-vv", + action="store_true", + dest="info", + default=False, + help="Display extra/service information and metrics.", + ) + output_group.add_argument( + "--debug", + "-vvv", + "-d", + action="store_true", + dest="debug", + default=False, + help="Display extra/service/debug information and metrics, save responses in debug.log.", + ) + output_group.add_argument( + "--no-color", + action="store_true", + dest="no_color", + default=(not settings.colored_print), + help="Don't color terminal output", + ) + output_group.add_argument( + "--no-progressbar", + action="store_true", + dest="no_progressbar", + default=(not settings.show_progressbar), + help="Don't show progressbar.", + ) + + report_group = parser.add_argument_group( + 'Report formats', 'Supported formats of report files' + ) + report_group.add_argument( + "-T", + "--txt", + action="store_true", + dest="txt", + default=settings.txt_report, + help="Create a TXT report (one report per username).", + ) + report_group.add_argument( + "-C", + "--csv", + action="store_true", + dest="csv", + default=settings.csv_report, + help="Create a CSV report (one report per username).", + ) + report_group.add_argument( + "-H", + "--html", + action="store_true", + dest="html", + default=settings.html_report, + help="Create an HTML report file (general report on all usernames).", + ) + report_group.add_argument( + "-X", + "--xmind", + action="store_true", + dest="xmind", + default=settings.xmind_report, + help="Generate an XMind 8 mindmap report (one report per username).", + ) + report_group.add_argument( + "-P", + "--pdf", + action="store_true", + dest="pdf", + default=settings.pdf_report, + help="Generate a PDF report (general report on all usernames).", + ) + report_group.add_argument( + "-M", + "--md", + action="store_true", + dest="md", + default=settings.md_report, + help="Generate a Markdown report (general report on all usernames).", + ) + report_group.add_argument( + "-G", + "--graph", + action="store_true", + dest="graph", + default=settings.graph_report, + help="Generate a graph report (general report on all usernames).", + ) + report_group.add_argument( + "--neo4j", + action="store_true", + dest="neo4j", + default=settings.neo4j_report, + help="Generate a Neo4j Cypher report (general report on all usernames).", + ) + report_group.add_argument( + "-J", + "--json", + action="store", + metavar='TYPE', + dest="json", + default=settings.json_report_type, + choices=SUPPORTED_JSON_REPORT_FORMATS, + help=f"Generate a JSON report of specific type: {', '.join(SUPPORTED_JSON_REPORT_FORMATS)}" + " (one report per username).", + ) + + report_group.add_argument( + "--ai", + action="store_true", + dest="ai", + default=False, + help="Generate an AI-powered analysis of the search results using OpenAI API. " + "Requires OPENAI_API_KEY env var or openai_api_key in settings.", + ) + report_group.add_argument( + "--ai-model", + dest="ai_model", + default=settings.openai_model, + help="OpenAI model to use for AI analysis (default: gpt-4o).", + ) + + parser.add_argument( + "--reports-sorting", + default=settings.report_sorting, + choices=('default', 'data'), + help="Method of results sorting in reports (default: in order of getting the result)", + ) + return parser + + +async def main(): + # Logging + log_level = logging.ERROR + logging.basicConfig( + format='[%(filename)s:%(lineno)d] %(levelname)-3s %(asctime)s %(message)s', + datefmt='%H:%M:%S', + level=log_level, + ) + logger = logging.getLogger('maigret') + logger.setLevel(log_level) + + # Load settings + settings = Settings() + settings_loaded, err = settings.load() + + if not settings_loaded: + logger.error(err) + sys.exit(3) + + arg_parser = setup_arguments_parser(settings) + args = arg_parser.parse_args() + + # Resolve Cloudflare webgate config (CLI flag OR settings.cloudflare_bypass.enabled) + cf_bypass_config = build_cloudflare_bypass_config( + settings, force_enable=args.cloudflare_bypass + ) + if cf_bypass_config: + modules_summary = ", ".join( + f"{m.get('name', m.get('method'))}({m.get('url')})" + for m in cf_bypass_config["modules"] + ) + logger.info( + f"Cloudflare webgate active: triggers={cf_bypass_config['trigger_protection']}, " + f"modules=[{modules_summary}]" + ) + + # Re-set logging level based on args + if args.debug: + log_level = logging.DEBUG + elif args.info: + log_level = logging.INFO + elif args.verbose: + log_level = logging.WARNING + logger.setLevel(log_level) + + # Usernames initial list + usernames = { + u: args.id_type + for u in args.username + if u and u not in ['-'] and u not in args.ignore_ids_list + } + original_usernames = "" + if args.permute and len(usernames) > 1 and args.id_type == 'username': + original_usernames = " ".join(usernames.keys()) + usernames = Permute(usernames).gather(method='strict') + + parsing_enabled = not args.disable_extracting + recursive_search_enabled = not args.disable_recursive_search + + # Make prompts + if args.proxy is not None: + print("Using the proxy: " + args.proxy) + + if args.parse_url: + extracted_ids = extract_ids_from_page( + args.parse_url, logger, timeout=args.timeout + ) + usernames.update(extracted_ids) + + if args.tags: + args.tags = list(set(str(args.tags).split(','))) + + if args.exclude_tags: + args.exclude_tags = list(set(str(args.exclude_tags).split(','))) + else: + args.exclude_tags = [] + + from .db_updater import resolve_db_path, force_update, BUNDLED_DB_PATH + + if args.force_update: + force_update( + meta_url=settings.db_update_meta_url, + color=not args.no_color, + ) + + try: + db_file = resolve_db_path( + db_file_arg=args.db_file, + no_autoupdate=args.no_autoupdate or args.force_update, + meta_url=settings.db_update_meta_url, + check_interval_hours=settings.autoupdate_check_interval_hours, + color=not args.no_color, + ) + except FileNotFoundError as e: + logger.error(str(e)) + sys.exit(2) + + if args.top_sites == 0 or args.all_sites: + args.top_sites = sys.maxsize + + # Create notify object for query results. + query_notify = QueryNotifyPrint( + result=None, + verbose=args.verbose, + print_found_only=not args.print_not_found, + skip_check_errors=not args.print_check_errors, + color=not args.no_color, + silent=args.ai, + ) + + print_intro_banner(no_color=args.no_color, silent=args.ai) + print_donate_banner(no_color=args.no_color, silent=args.ai) + + # Create object with all information about sites we are aware of. + try: + db = MaigretDatabase().load_from_path(db_file) + query_notify.success(f'Using sites database: {db_file} ({len(db.sites)} sites)') + except Exception as e: + logger.warning(f"Failed to load database from {db_file}: {e}") + if db_file != BUNDLED_DB_PATH: + query_notify.warning( + f'Falling back to bundled database: {BUNDLED_DB_PATH}' + ) + db = MaigretDatabase().load_from_path(BUNDLED_DB_PATH) + query_notify.success( + f'Using sites database: {BUNDLED_DB_PATH} ({len(db.sites)} sites)' + ) + else: + raise + get_top_sites_for_id = lambda x: db.ranked_sites_dict( + top=args.top_sites, + tags=args.tags, + excluded_tags=args.exclude_tags, + names=args.site_list, + disabled=args.use_disabled_sites, + id_type=x, + ) + + site_data = get_top_sites_for_id(args.id_type) + + if args.new_site_to_submit: + submitter = Submitter(db=db, logger=logger, settings=settings, args=args) + is_submitted = await submitter.dialog(args.new_site_to_submit, args.cookie_file) + if is_submitted: + db.save_to_file(db_file) + await submitter.close() + + # Database self-checking + if args.self_check: + if len(site_data) == 0: + query_notify.warning( + 'No sites to self-check with the current filters! Exiting...' + ) + return + + query_notify.success( + f'Maigret sites database self-check started for {len(site_data)} sites...' + ) + check_result = await self_check( + db, + site_data, + logger, + proxy=args.proxy, + max_connections=args.connections, + tor_proxy=args.tor_proxy, + i2p_proxy=args.i2p_proxy, + auto_disable=args.auto_disable, + diagnose=args.diagnose, + no_progressbar=args.no_progressbar, + cloudflare_bypass=cf_bypass_config, + ) + + is_need_update = check_result.get('needs_update', False) + + if is_need_update: + if input('Do you want to save changes permanently? [Yn]\n').lower() in ( + 'y', + '', + ): + db.save_to_file(db_file) + print('Database was successfully updated.') + else: + print('Updates will be applied only for current search session.') + + if args.verbose or args.debug: + query_notify.info( + 'Scan sessions flags stats: ' + str(db.get_scan_stats(site_data)) + ) + + # Database statistics + if args.stats: + print(db.get_db_stats()) + + report_dir = path.join(os.getcwd(), args.folderoutput) + + # Make reports folder is not exists + os.makedirs(report_dir, exist_ok=True) + + # Define one report filename template + report_filepath_tpl = path.join(report_dir, 'report_{username}{postfix}') + + # Web interface + if args.web is not None: + from maigret.web.app import app + + app.config["MAIGRET_DB_FILE"] = db_file + + port = ( + args.web if args.web else 5000 + ) # args.web is either the specified port or 5000 by default + + # Host configuration: secure by default, but allow override via environment + host = os.getenv('FLASK_HOST', '127.0.0.1') + app.run(host=host, port=port) + return + + if usernames == {}: + # magic params to exit after init + query_notify.warning('No usernames to check, exiting.') + sys.exit(0) + + if len(usernames) > 1 and args.permute and args.id_type == 'username': + query_notify.warning( + f"{len(usernames)} permutations from {original_usernames} to check..." + + get_dict_ascii_tree(usernames, prepend="\t") + ) + + if args.ai: + from .ai import resolve_api_key + + if not resolve_api_key(settings): + query_notify.warning( + 'AI analysis requires an OpenAI API key. ' + 'Set OPENAI_API_KEY environment variable or add ' + 'openai_api_key to settings.json.' + ) + sys.exit(1) + + if not site_data: + query_notify.warning('No sites to check, exiting!') + sys.exit(2) + + if args.ai: + query_notify.warning( + f'Starting AI-assisted search on top {len(site_data)} sites from the Maigret database...' + ) + else: + query_notify.warning( + f'Starting a search on top {len(site_data)} sites from the Maigret database...' + ) + if not args.all_sites: + query_notify.warning( + 'You can run search by full list of sites with flag `-a`', '!' + ) + + already_checked = set() + general_results = [] + interrupted = False + + # Install our own SIGINT handler. asyncio.run installs a default one + # that cancels the main task on first Ctrl+C and raises KeyboardInterrupt + # on the second — but the cancellation gets buried inside the executor's + # gather/queue cleanup and doesn't bubble up to our `except CancelledError` + # below until a SECOND press. Owning the signal directly lets us: + # 1) cancel the in-flight search task on the FIRST press, + # 2) fall through to report generation, + # 3) exit hard on a second press if the user changes their mind. + import signal as _signal + _interrupt_count = [0] + _current_search_task: List[Any] = [None] + _orig_sigint = _signal.getsignal(_signal.SIGINT) + + def _on_sigint(signum, frame): + _interrupt_count[0] += 1 + task = _current_search_task[0] + if _interrupt_count[0] == 1 and task is not None and not task.done(): + # First press: cancel the running search. The cancel propagates + # as CancelledError to `await maigret(...)` below. + task.cancel() + return + # Second press (or no task running): hard exit. Restore the previous + # handler and re-raise so __main__.py prints "Maigret interrupted." + # with exit code 130. + _signal.signal(_signal.SIGINT, _orig_sigint) + raise KeyboardInterrupt() + + _signal.signal(_signal.SIGINT, _on_sigint) + + while usernames: + username, id_type = list(usernames.items())[0] + del usernames[username] + + # First Ctrl+C is caught below and sets `interrupted`. Stop pulling + # new targets from the queue so we fall through to report generation + # with whatever has already been collected. + if interrupted: + break + + if username.lower() in already_checked: + continue + + already_checked.add(username.lower()) + + if username in args.ignore_ids_list: + query_notify.warning( + f'Skip a search by username {username} cause it\'s marked as ignored.' + ) + continue + + # check for characters do not supported by sites generally + found_unsupported_chars = set(BAD_CHARS).intersection(set(username)) + if found_unsupported_chars: + pretty_chars_str = ','.join( + map(lambda s: f'"{s}"', found_unsupported_chars) + ) + query_notify.warning( + f'Found unsupported URL characters: {pretty_chars_str}, skip search by username "{username}"' + ) + continue + + sites_to_check = get_top_sites_for_id(id_type) + + # Wrap the per-target search in an asyncio.Task so our SIGINT handler + # can cancel exactly THIS coroutine on first Ctrl+C — not the parent + # main task, which would also tear down report generation. + # `partial_results` is the output container that maigret() mutates as + # site checks complete; on Ctrl+C cancellation it still holds the + # checks that finished before the cancel, so partial state survives. + partial_results: Dict[str, SiteResult] = {} + search_task = asyncio.ensure_future(maigret( + username=username, + site_dict=dict(sites_to_check), + query_notify=query_notify, + proxy=args.proxy, + tor_proxy=args.tor_proxy, + i2p_proxy=args.i2p_proxy, + timeout=args.timeout, + is_parsing_enabled=parsing_enabled, + id_type=id_type, + debug=args.verbose, + logger=logger, + cookies=args.cookie_file, + forced=args.use_disabled_sites, + max_connections=args.connections, + no_progressbar=args.no_progressbar, + retries=args.retries, + check_domains=args.with_domains, + cloudflare_bypass=cf_bypass_config, + keywords=getattr(args, 'keywords', []), + dns_resolver=args.dns_resolver, + output_container=partial_results, + )) + _current_search_task[0] = search_task + try: + results = await search_task + except (asyncio.CancelledError, KeyboardInterrupt): + # First Ctrl+C cancelled `search_task` via our SIGINT handler. + # Keep whatever partial site checks completed before cancellation + # so the user gets a meaningful report rather than "0 results". + interrupted = True + _current_search_task[0] = None + results = partial_results + partial_count = len(partial_results) + remaining = len(usernames) + 1 + general_results.append((username, id_type, results)) + total_so_far = sum(len(d) for _, _, d in general_results) + query_notify.warning( + f'Search interrupted by user (Ctrl+C). Kept {partial_count} ' + f'partial site result(s) for "{username}"; skipping {remaining} ' + f'remaining target(s); generating report from ' + f'{total_so_far} total site result(s) across ' + f'{len(general_results)} username(s). ' + f'Press Ctrl+C again to exit without a report.', + symbol='!', + ) + break + finally: + _current_search_task[0] = None + + if not args.ai: + errs = errors.notify_about_errors( + results, query_notify, show_statistics=args.verbose + ) + for e in errs: + query_notify.warning(*e) + + if args.reports_sorting == "data": + results = sort_report_by_data_points(results) + + general_results.append((username, id_type, results)) + + if recursive_search_enabled: + extracted_ids = extract_ids_from_results(results, db) + query_notify.warning(f'Extracted IDs: {extracted_ids}') + usernames.update(extracted_ids) + + # reporting for a one username + if args.xmind: + username = username.replace('/', '_') + filename = report_filepath_tpl.format(username=username, postfix='.xmind') + save_xmind_report(filename, username, results) + query_notify.warning(f'XMind report for {username} saved in {filename}') + + if args.csv: + username = username.replace('/', '_') + filename = report_filepath_tpl.format(username=username, postfix='.csv') + save_csv_report(filename, username, results) + query_notify.warning(f'CSV report for {username} saved in {filename}') + + if args.txt: + username = username.replace('/', '_') + filename = report_filepath_tpl.format(username=username, postfix='.txt') + save_txt_report(filename, username, results) + query_notify.warning(f'TXT report for {username} saved in {filename}') + + if args.json: + username = username.replace('/', '_') + filename = report_filepath_tpl.format( + username=username, postfix=f'_{args.json}.json' + ) + save_json_report(filename, username, results, report_type=args.json) + query_notify.warning( + f'JSON {args.json} report for {username} saved in {filename}' + ) + + # Restore the original SIGINT handler before report generation. From + # here on, a Ctrl+C should NOT cancel-and-continue — it should exit. + _signal.signal(_signal.SIGINT, _orig_sigint) + + # reporting for all the result + if general_results: + if interrupted: + # "Partial results from N username(s)" — disambiguates from the + # per-site count, which would read confusingly as "N partial + # results" when N is the username count. + query_notify.info( + f'Generating partial results from {len(general_results)} ' + f'username(s) after Ctrl+C...' + ) + if args.html or args.pdf or args.md: + query_notify.warning('Generating report info...') + report_context = generate_report_context(general_results) + # determine main username + username = report_context['username'] + + if args.html: + username = username.replace('/', '_') + filename = report_filepath_tpl.format( + username=username, postfix='_plain.html' + ) + save_html_report(filename, report_context) + query_notify.warning(f'HTML report on all usernames saved in {filename}') + + if args.pdf: + username = username.replace('/', '_') + filename = report_filepath_tpl.format(username=username, postfix='.pdf') + try: + save_pdf_report(filename, report_context) + except RuntimeError as e: + query_notify.warning(str(e)) + else: + query_notify.warning( + f'PDF report on all usernames saved in {filename}' + ) + + if args.md: + username = username.replace('/', '_') + filename = report_filepath_tpl.format(username=username, postfix='.md') + run_flags = [] + if args.tags: + run_flags.append(f"--tags {args.tags}") + if args.site_list: + run_flags.append(f"--site {','.join(args.site_list)}") + if args.all_sites: + run_flags.append("--all-sites") + run_info = { + "sites_count": sum(len(d) for _, _, d in general_results), + "flags": " ".join(run_flags) if run_flags else None, + } + save_markdown_report(filename, report_context, run_info=run_info) + query_notify.warning(f'Markdown report on all usernames saved in {filename}') + + if args.graph: + username = username.replace('/', '_') + filename = report_filepath_tpl.format( + username=username, postfix='_graph.html' + ) + save_graph_report(filename, general_results, db) + query_notify.warning(f'Graph report on all usernames saved in {filename}') + + if args.neo4j: + username = username.replace('/', '_') + filename = report_filepath_tpl.format( + username=username, postfix='_neo4j.cypher' + ) + save_neo4j_report(filename, general_results, db) + query_notify.warning(f'Neo4j report on all usernames saved in {filename}') + + if not args.ai: + text_report = get_plaintext_report(report_context) + if text_report: + query_notify.info('Short text report:') + print(text_report) + + if args.ai: + from .ai import get_ai_analysis, resolve_api_key + from .report import generate_markdown_report + + api_key = resolve_api_key(settings) + + run_flags = [] + if args.tags: + run_flags.append(f"--tags {args.tags}") + if args.site_list: + run_flags.append(f"--site {','.join(args.site_list)}") + if args.all_sites: + run_flags.append("--all-sites") + run_info = { + "sites_count": sum(len(d) for _, _, d in general_results), + "flags": " ".join(run_flags) if run_flags else None, + } + + md_report = generate_markdown_report(report_context, run_info=run_info) + + try: + await get_ai_analysis( + api_key=api_key, + markdown_report=md_report, + model=args.ai_model, + api_base_url=getattr( + settings, 'openai_api_base_url', 'https://api.openai.com/v1' + ), + ) + except Exception as e: + query_notify.warning(f'AI analysis failed: {e}') + + # update database + db.save_to_file(db_file) + + +def run(): + try: + if sys.version_info.minor >= 10: + asyncio.run(main()) + else: + loop = asyncio.get_event_loop() + loop.run_until_complete(main()) + except KeyboardInterrupt: + print('Maigret is interrupted.') + sys.exit(1) + + +if __name__ == "__main__": + run() diff --git a/maigret/notify.py b/maigret/notify.py new file mode 100644 index 0000000..db3f8ab --- /dev/null +++ b/maigret/notify.py @@ -0,0 +1,294 @@ +"""Console and query notification helpers. + +This module defines objects for notifying the caller about the results of queries. +""" + +import sys + +from colorama import Fore, Style, init + +from .result import MaigretCheckStatus, KeywordMatchStatus +from .utils import get_dict_ascii_tree + + +class QueryNotifyPrint: + """Query Notify Print Object. + + Query notify class that prints results. + """ + + def __init__( + self, + result=None, + verbose=False, + print_found_only=False, + skip_check_errors=False, + color=True, + silent=False, + ): + """Create Query Notify Print Object. + + Contains information about a specific method of notifying the results + of a query. + + Keyword Arguments: + self -- This object. + result -- Object of type QueryResult() containing + results for this query. + verbose -- Boolean indicating whether to give verbose output. + print_found_only -- Boolean indicating whether to only print found sites. + color -- Boolean indicating whether to color terminal output + + Return Value: + Nothing. + """ + + # Colorama module's initialization. + init(autoreset=True) + + self.result = result + self.verbose = verbose + self.print_found_only = print_found_only + self.skip_check_errors = skip_check_errors + self.color = color + self.silent = silent + + return + + def make_colored_terminal_notify( + self, status, text, status_color, text_color, appendix + ): + text = [ + f"{Style.BRIGHT}{Fore.WHITE}[{status_color}{status}{Fore.WHITE}]" + + f"{text_color} {text}: {Style.RESET_ALL}" + + f"{appendix}" + ] + return "".join(text) + + def make_simple_terminal_notify( + self, status, text, status_color, text_color, appendix + ): + return f"[{status}] {text}: {appendix}" + + def make_terminal_notify(self, *args): + if self.color: + return self.make_colored_terminal_notify(*args) + else: + return self.make_simple_terminal_notify(*args) + + def start(self, message=None, id_type="username"): + """Notify Start. + + Will print the title to the standard output. + + Keyword Arguments: + self -- This object. + message -- String containing username that the series + of queries are about. + + Return Value: + Nothing. + """ + + if self.silent: + return + + title = f"Checking {id_type}" + if self.color: + print( + Style.BRIGHT + + Fore.GREEN + + "[" + + Fore.YELLOW + + "*" + + Fore.GREEN + + f"] {title}" + + Fore.WHITE + + f" {message}" + + Fore.GREEN + + " on:" + ) + else: + print(f"[*] {title} {message} on:") + + def finish(self, message=None): + # Hook called at the end of a run. Currently a no-op; kept on the + # surface because the search loop calls it (checking.py:finish()). + return + + def _colored_print(self, fore_color, msg): + if self.color: + print(Style.BRIGHT + fore_color + msg) + else: + print(msg) + + def success(self, message, symbol="+"): + msg = f"[{symbol}] {message}" + self._colored_print(Fore.GREEN, msg) + + def warning(self, message, symbol="-", advice=None): + """Print a warning. When ``advice`` is supplied it is appended after + the headline in *normal* weight (same colour), so the actionable + text reads as guidance rather than as part of the alarm itself.""" + msg = f"[{symbol}] {message}" + if advice and self.color: + # Bold + yellow for the count line; turn off bold for the advice + # but keep the yellow until the line is reset at the end. + print( + Style.BRIGHT + Fore.YELLOW + msg + + Style.NORMAL + ". " + advice + + Style.RESET_ALL + ) + elif advice: + # No-colour mode: dot separator is enough to distinguish the + # parts, no ANSI codes leak into the output. + print(f"{msg}. {advice}") + else: + self._colored_print(Fore.YELLOW, msg) + + def info(self, message, symbol="*"): + msg = f"[{symbol}] {message}" + self._colored_print(Fore.BLUE, msg) + + def update(self, result, is_similar=False): + """Notify Update. + + Will print the query result to the standard output. + + Keyword Arguments: + self -- This object. + result -- Object of type QueryResult() containing + results for this query. + + Return Value: + Nothing. + """ + if self.silent: + return + + notify = None + self.result = result + + ids_data_text = "" + if self.result.ids_data: + ids_data_text = get_dict_ascii_tree(self.result.ids_data.items(), " ") + + # Output to the terminal is desired. + if result.status == MaigretCheckStatus.CLAIMED: + # Check if this is a keyword match + if (result.keyword_match_status == KeywordMatchStatus.KEYWORD_FOUND and + result.keywords): + # Keyword-context match: site contains username + at least one keyword + color = Fore.LIGHTGREEN_EX + status = "++" + notify = self.make_terminal_notify( + status, + result.site_name, + color, + color, + result.site_url_user + ids_data_text, + ) + else: + # Normal claimed site + color = Fore.BLUE if is_similar else Fore.GREEN + status = "?" if is_similar else "+" + notify = self.make_terminal_notify( + status, + result.site_name, + color, + color, + result.site_url_user + ids_data_text, + ) + elif result.status == MaigretCheckStatus.AVAILABLE: + if not self.print_found_only: + notify = self.make_terminal_notify( + "-", + result.site_name, + Fore.RED, + Fore.YELLOW, + "Not found!" + ids_data_text, + ) + elif result.status == MaigretCheckStatus.UNKNOWN: + if not self.skip_check_errors: + notify = self.make_terminal_notify( + "?", + result.site_name, + Fore.RED, + Fore.RED, + str(self.result.error) + ids_data_text, + ) + elif result.status == MaigretCheckStatus.ILLEGAL: + if not self.print_found_only: + text = "Illegal Username Format For This Site!" + notify = self.make_terminal_notify( + "-", + result.site_name, + Fore.RED, + Fore.YELLOW, + text + ids_data_text, + ) + else: + # It should be impossible to ever get here... + raise ValueError( + f"Unknown Query Status '{str(result.status)}' for " + f"site '{self.result.site_name}'" + ) + + if notify: + sys.stdout.write("\x1b[1K\r") + print(notify) + + return notify + + def __str__(self): + """Convert Object To String. + + Keyword Arguments: + self -- This object. + + Return Value: + Nicely formatted string to get information about this object. + """ + result = str(self.result) + + return result + + +PATREON_URL = "https://www.patreon.com/soxoj" +INTRO_TEXT = "MAIGRET - collect a dossier by username from 3000+ sites" + + +def _format_intro(use_color: bool) -> str: + if not use_color: + return f"[+] {INTRO_TEXT}" + tag = f"{Style.BRIGHT}{Fore.WHITE}[{Fore.GREEN}+{Fore.WHITE}]{Style.RESET_ALL}" + text = f"{Style.BRIGHT}{Fore.GREEN}{INTRO_TEXT}{Style.RESET_ALL}" + return f"{tag} {text}" + + +def print_intro_banner(no_color: bool = False, silent: bool = False) -> None: + """Print the Maigret intro tagline. Skipped only in silent (--ai) mode.""" + if silent: + return + print(_format_intro(use_color=not no_color)) + + +def _format_donate_banner(use_color: bool) -> str: + title = "Support Maigret — sites database & development" + link_label = "Donate on Patreon:" + + if not use_color: + return f"[♥] {title}\n[♥] {link_label} {PATREON_URL}" + + tag = f"{Style.BRIGHT}{Fore.WHITE}[{Fore.RED}♥{Fore.WHITE}]{Style.RESET_ALL}" + title_c = f"{Style.BRIGHT}{Fore.WHITE}{title}{Style.RESET_ALL}" + label_c = f"{Style.BRIGHT}{Fore.WHITE}{link_label}{Style.RESET_ALL}" + url_c = f"{Style.BRIGHT}{Fore.RED}{PATREON_URL}{Style.RESET_ALL}" + return f"{tag} {title_c}\n{tag} {label_c} {url_c}" + + +def print_donate_banner(no_color: bool = False, silent: bool = False) -> None: + """Print a colored donation banner. Skipped only in silent (--ai) mode.""" + if silent: + return + print(_format_donate_banner(use_color=not no_color)) diff --git a/maigret/permutator.py b/maigret/permutator.py new file mode 100644 index 0000000..49b1cc2 --- /dev/null +++ b/maigret/permutator.py @@ -0,0 +1,26 @@ +# License MIT. by balestek https://github.com/balestek +from itertools import permutations + + +class Permute: + def __init__(self, elements: dict): + self.separators = ["", "_", "-", "."] + self.elements = elements + + def gather(self, method: str = "strict" or "all") -> dict: + permutations_dict = {} + for i in range(1, len(self.elements) + 1): + for subset in permutations(self.elements, i): + if i == 1: + if method == "all": + permutations_dict[subset[0]] = self.elements[subset[0]] + permutations_dict["_" + subset[0]] = self.elements[subset[0]] + permutations_dict[subset[0] + "_"] = self.elements[subset[0]] + else: + for separator in self.separators: + perm = separator.join(subset) + permutations_dict[perm] = self.elements[subset[0]] + if separator == "": + permutations_dict["_" + perm] = self.elements[subset[0]] + permutations_dict[perm + "_"] = self.elements[subset[0]] + return permutations_dict diff --git a/maigret/report.py b/maigret/report.py new file mode 100644 index 0000000..2429ecf --- /dev/null +++ b/maigret/report.py @@ -0,0 +1,817 @@ +import ast +import csv +import io +import json +import logging +import os +from datetime import datetime +from typing import Dict, Any + +import xmind # type: ignore[import-untyped] +from dateutil.tz import gettz +from dateutil.parser import parse as parse_datetime_str +from jinja2 import Template + +from .checking import SUPPORTED_IDS +from .result import MaigretCheckStatus +from .sites import MaigretDatabase +from .utils import is_country_tag, CaseConverter, enrich_link_str + + +ADDITIONAL_TZINFO = {"CDT": gettz("America/Chicago")} +SUPPORTED_JSON_REPORT_FORMATS = [ + "simple", + "ndjson", +] + +""" +UTILS +""" + + +def filter_supposed_data(data): + allowed_fields = ["fullname", "gender", "location", "age"] + + def _first(v): + if isinstance(v, (list, tuple)): + return v[0] if v else "" + return v + + return { + CaseConverter.snake_to_title(k): _first(v) + for k, v in data.items() + if k in allowed_fields + } + + +def sort_report_by_data_points(results): + return dict( + sorted( + results.items(), + key=lambda x: len( + (x[1].get('status') and x[1]['status'].ids_data or {}).keys() + ), + reverse=True, + ) + ) + + +""" +REPORTS SAVING +""" + + +def save_csv_report(filename: str, username: str, results: dict): + with open(filename, "w", newline="", encoding="utf-8") as f: + generate_csv_report(username, results, f) + + +def save_txt_report(filename: str, username: str, results: dict): + with open(filename, "w", encoding="utf-8") as f: + generate_txt_report(username, results, f) + + +def save_html_report(filename: str, context: dict): + template, _ = generate_report_template(is_pdf=False) + filled_template = template.render(**context) + with open(filename, "w", encoding="utf-8") as f: + f.write(filled_template) + + +PDF_EXTRA_HINT = ( + "PDF reports require the optional 'pdf' extra. " + "Install it with: pip install 'maigret[pdf]'" +) + + +def save_pdf_report(filename: str, context: dict): + # Imported lazily so that users without the optional 'pdf' extra + # can still import maigret.report and use other report formats. + try: + from xhtml2pdf import pisa # type: ignore[import-untyped] + except ImportError as e: + raise RuntimeError(PDF_EXTRA_HINT) from e + + template, css = generate_report_template(is_pdf=True) + filled_template = template.render(**context) + + with open(filename, "w+b") as f: + pisa.pisaDocument(io.StringIO(filled_template), dest=f, default_css=css) + + +def save_json_report(filename: str, username: str, results: dict, report_type: str): + with open(filename, "w", encoding="utf-8") as f: + generate_json_report(username, results, f, report_type=report_type) + + +class MaigretGraph: + other_params: dict = {'size': 10, 'group': 3} + site_params: dict = {'size': 15, 'group': 2} + username_params: dict = {'size': 20, 'group': 1} + + def __init__(self, graph): + self.G = graph + + def add_node(self, key, value, color=None): + node_name = f'{key}: {value}' + + params = dict(self.other_params) + if key in SUPPORTED_IDS: + params = dict(self.username_params) + elif value.startswith('http'): + params = dict(self.site_params) + + params['title'] = node_name + if color: + params['color'] = color + + self.G.add_node(node_name, **params) + return node_name + + def link(self, node1_name, node2_name): + self.G.add_edge(node1_name, node2_name, weight=2) + + +def _build_maigret_graph(username_results: list, db: MaigretDatabase): + import networkx as nx + + G: Any = nx.Graph() + graph = MaigretGraph(G) + + base_site_nodes = {} + site_account_nodes = {} + processed_values: Dict[str, Any] = {} # Track processed values to avoid duplicates + + for username, id_type, results in username_results: + # Add username node, using normalized version directly if different + norm_username = username.lower() + username_node_name = graph.add_node(id_type, norm_username) + + for website_name, dictionary in results.items(): + if dictionary.get("is_similar"): + continue + + status = dictionary.get("status") + if not status or status.status != MaigretCheckStatus.CLAIMED: + continue + + # base site node + site_base_url = website_name + if site_base_url not in base_site_nodes: + base_site_nodes[site_base_url] = graph.add_node( + 'site', site_base_url, color='#28a745' + ) # Green color + + site_base_node_name = base_site_nodes[site_base_url] + + # account node + account_url = dictionary.get('url_user', f'{site_base_url}/{norm_username}') + account_node_id = f"{site_base_url}: {account_url}" + if account_node_id not in site_account_nodes: + site_account_nodes[account_node_id] = graph.add_node( + 'account', account_url + ) + + account_node_name = site_account_nodes[account_node_id] + + # link username → account → site + graph.link(username_node_name, account_node_name) + graph.link(account_node_name, site_base_node_name) + + def process_ids(parent_node, ids): + for k, v in ids.items(): + if ( + k.endswith('_count') + or k.startswith('is_') + or k.endswith('_at') + or k in 'image' + ): + continue + + # Normalize value if string + norm_v = v.lower() if isinstance(v, str) else v + value_key = f"{k}:{norm_v}" + + if value_key in processed_values: + ids_data_name = processed_values[value_key] + else: + v_data = v + if isinstance(v, str) and v.startswith('['): + try: + v_data = ast.literal_eval(v) + except Exception as e: + logging.error(e) + continue + + if isinstance(v_data, list): + list_node_name = graph.add_node(k, site_base_url) + processed_values[value_key] = list_node_name + for vv in v_data: + data_node_name = graph.add_node(vv, site_base_url) + graph.link(list_node_name, data_node_name) + + add_ids = { + a: b for b, a in db.extract_ids_from_url(vv).items() + } + if add_ids: + process_ids(data_node_name, add_ids) + ids_data_name = list_node_name + else: + ids_data_name = graph.add_node(k, norm_v) + processed_values[value_key] = ids_data_name + + if 'username' in k or k in SUPPORTED_IDS: + new_username_key = f"username:{norm_v}" + if new_username_key not in processed_values: + new_username_node_name = graph.add_node( + 'username', norm_v + ) + processed_values[new_username_key] = ( + new_username_node_name + ) + graph.link(ids_data_name, new_username_node_name) + + add_ids = { + k: v for v, k in db.extract_ids_from_url(v).items() + } + if add_ids: + process_ids(ids_data_name, add_ids) + + graph.link(parent_node, ids_data_name) + + if status.ids_data: + process_ids(account_node_name, status.ids_data) + + # Remove overly long nodes + nodes_to_remove = [node for node in G.nodes if len(str(node)) > 100] + G.remove_nodes_from(nodes_to_remove) + + # Remove site nodes with only one connection + single_degree_sites = [ + n for n, deg in G.degree() if n.startswith("site:") and deg <= 1 + ] + G.remove_nodes_from(single_degree_sites) + + return G + + +def save_graph_report(filename: str, username_results: list, db: MaigretDatabase): + G = _build_maigret_graph(username_results, db) + + # Generate interactive visualization + from pyvis.network import Network # type: ignore[import-untyped] + + nt = Network(notebook=True, height="100vh", width="100%") + nt.from_nx(G) + nt.show(filename) + + +def _graph_to_cypher(G) -> str: + """Serialize a maigret networkx graph as an idempotent Cypher script. + + Nodes are MERGEd on their unique ``name`` so re-importing the same report + does not create duplicate nodes; edges become ``[:LINKED_TO]`` relationships. + """ + + def cstr(value) -> str: + # Cypher single-quoted string literal, with escaping. + s = ( + str(value) + .replace('\\', '\\\\') + .replace("'", "\\'") + .replace('\n', '\\n') + .replace('\r', '\\r') + .replace('\t', '\\t') + ) + return "'" + s + "'" + + lines = [ + "// maigret Neo4j export. Import: cypher-shell -u neo4j -p < .cypher", + "CREATE CONSTRAINT maigret_node_name IF NOT EXISTS", + "FOR (n:MaigretNode) REQUIRE n.name IS UNIQUE;", + "", + ] + for node in G.nodes(): + node_type, _, label = str(node).partition(':') + lines.append( + "MERGE (n:MaigretNode {name: %s}) SET n.type = %s, n.label = %s;" + % (cstr(node), cstr(node_type.strip()), cstr(label.strip())) + ) + lines.append("") + for node1, node2 in G.edges(): + lines.append( + "MATCH (a:MaigretNode {name: %s}), (b:MaigretNode {name: %s}) " + "MERGE (a)-[:LINKED_TO]->(b);" % (cstr(node1), cstr(node2)) + ) + lines.append("") + return "\n".join(lines) + + +def save_neo4j_report(filename: str, username_results: list, db: MaigretDatabase): + """Save a Neo4j Cypher report of the maigret graph (see ``_graph_to_cypher``). + + Load the resulting file with ``cypher-shell -u neo4j -p < file`` + or paste it into the Neo4j Browser. + """ + G = _build_maigret_graph(username_results, db) + with open(filename, 'w', encoding='utf-8') as f: + f.write(_graph_to_cypher(G)) + + +def get_plaintext_report(context: dict) -> str: + output = (context['brief'] + " ").replace('. ', '.\n') + interests = list(map(lambda x: x[0], context.get('interests_tuple_list', []))) + countries = list(map(lambda x: x[0], context.get('countries_tuple_list', []))) + if countries: + output += f'Countries: {", ".join(countries)}\n' + if interests: + output += f'Interests (tags): {", ".join(interests)}\n' + return output.strip() + + +def _md_format_value(value) -> str: + """Format a value for Markdown output, detecting links.""" + if isinstance(value, list): + return ", ".join(str(v) for v in value) + s = str(value) + if s.startswith("http://") or s.startswith("https://"): + return f"[{s}]({s})" + return s + + +def generate_markdown_report(context: dict, run_info: dict = None) -> str: + username = context.get("username", "unknown") + generated_at = context.get("generated_at", "") + brief = context.get("brief", "") + countries = context.get("countries_tuple_list", []) + interests = context.get("interests_tuple_list", []) + first_seen = context.get("first_seen") + results = context.get("results", []) + + # Collect ALL values for key fields across all accounts + all_fields: Dict[str, list] = {} + last_seen = None + for _, _, data in results: + for _, v in data.items(): + if not v.get("found") or v.get("is_similar"): + continue + ids_data = v.get("ids_data", {}) + # Map multiple source fields to unified output fields + field_sources = { + "fullname": ("fullname", "name"), + "location": ("location", "country", "city", "country_code", "locale", "region"), + "gender": ("gender",), + "bio": ("bio", "about", "description"), + } + for out_field, source_keys in field_sources.items(): + for src in source_keys: + val = ids_data.get(src) + if val: + all_fields.setdefault(out_field, []) + val_str = str(val) + if val_str not in all_fields[out_field]: + all_fields[out_field].append(val_str) + # Track last_seen + for ts_field in ("last_online", "latest_activity_at", "updated_at"): + ts = ids_data.get(ts_field) + if ts and (last_seen is None or str(ts) > str(last_seen)): + last_seen = ts + + lines = [] + lines.append(f"# Report by searching on username \"{username}\"\n") + + # Generated line with run info + gen_line = f"Generated at {generated_at} by [Maigret](https://github.com/soxoj/maigret)" + if run_info: + parts = [] + if run_info.get("sites_count"): + parts.append(f"{run_info['sites_count']} sites checked") + if run_info.get("flags"): + parts.append(f"flags: `{run_info['flags']}`") + if parts: + gen_line += f" ({', '.join(parts)})" + lines.append(f"{gen_line}\n") + + # Summary + lines.append("## Summary\n") + lines.append(f"{brief}\n") + + if all_fields: + lines.append("**Information extracted from accounts:**\n") + for field, values in all_fields.items(): + title = CaseConverter.snake_to_title(field) + lines.append(f"- {title}: {'; '.join(values)}") + lines.append("") + + if countries: + geo = ", ".join(f"{code} (x{count})" for code, count in countries) + lines.append(f"**Country tags:** {geo}\n") + + if interests: + tags = ", ".join(f"{tag} (x{count})" for tag, count in interests) + lines.append(f"**Website tags:** {tags}\n") + + if first_seen: + lines.append(f"**First seen:** {first_seen}") + if last_seen: + lines.append(f"**Last seen:** {last_seen}") + if first_seen or last_seen: + lines.append("") + + # Accounts found + lines.append("## Accounts found\n") + + for u, id_type, data in results: + for site_name, v in data.items(): + if not v.get("found") or v.get("is_similar"): + continue + + lines.append(f"### {site_name}\n") + lines.append(f"- **URL:** [{v.get('url_user', '')}]({v.get('url_user', '')})") + + tags = v.get("status") and v["status"].tags or [] + if tags: + lines.append(f"- **Tags:** {', '.join(tags)}") + lines.append("") + + ids_data = v.get("ids_data", {}) + if ids_data: + for field, value in ids_data.items(): + if field == "image": + continue + title = CaseConverter.snake_to_title(field) + lines.append(f"- {title}: {_md_format_value(value)}") + + lines.append("") + + # Possible false positives + lines.append("## Possible false positives\n") + lines.append( + f"This report was generated by searching for accounts matching the username `{username}`. " + f"Accounts listed above may belong to different people who happen to use the same " + f"or similar username. Results without extracted personal information could contain " + f"some false positive findings. Always verify findings before drawing conclusions.\n" + ) + + # Ethical use + lines.append("## Ethical use\n") + lines.append( + "This report is a result of a technical collection of publicly available information " + "from online accounts and does not constitute personal data processing. If you intend " + "to use this data for personal data processing or collection purposes, ensure your use " + "complies with applicable laws and regulations in your jurisdiction (such as GDPR, " + "CCPA, and similar).\n" + ) + + return "\n".join(lines) + + +def save_markdown_report(filename: str, context: dict, run_info: dict = None): + content = generate_markdown_report(context, run_info) + with open(filename, "w", encoding="utf-8") as f: + f.write(content) + + +""" +REPORTS GENERATING +""" + + +def generate_report_template(is_pdf: bool): + """ + HTML/PDF template generation + """ + + def get_resource_content(filename): + return open(os.path.join(maigret_path, "resources", filename)).read() + + maigret_path = os.path.dirname(os.path.realpath(__file__)) + + if is_pdf: + template_content = get_resource_content("simple_report_pdf.tpl") + css_content = get_resource_content("simple_report_pdf.css") + else: + template_content = get_resource_content("simple_report.tpl") + css_content = None + + # autoescape: report data comes from scanned profiles and must be escaped + # to avoid XSS in the generated report. + template = Template(template_content, autoescape=True) + template.globals["title"] = CaseConverter.snake_to_title # type: ignore + template.globals["detect_link"] = enrich_link_str # type: ignore + return template, css_content + + +def generate_report_context(username_results: list): + brief_text = [] + usernames = {} + extended_info_count = 0 + tags: Dict[str, int] = {} + supposed_data: Dict[str, Any] = {} + + first_seen = None + + # moved here to speed up the launch of Maigret + import pycountry + + for username, id_type, results in username_results: + found_accounts = 0 + new_ids = [] + usernames[username] = {"type": id_type} + + for website_name in results: + dictionary = results[website_name] + if dictionary.get("is_similar"): + continue + + status = dictionary.get("status") + if not status: # FIXME: currently in case of timeout + continue + + if status.ids_data: + dictionary["ids_data"] = status.ids_data + extended_info_count += 1 + + # detect first seen + created_at = status.ids_data.get("created_at") + if created_at: + if first_seen is None: + first_seen = created_at + else: + try: + known_time = parse_datetime_str( + first_seen, tzinfos=ADDITIONAL_TZINFO + ) + new_time = parse_datetime_str( + created_at, tzinfos=ADDITIONAL_TZINFO + ) + if new_time < known_time: + first_seen = created_at + except Exception as e: + logging.debug( + "Problems with converting datetime %s/%s: %s", + first_seen, + created_at, + str(e), + exc_info=True, + ) + + for k, v in status.ids_data.items(): + # suppose target data + field = "fullname" if k == "name" else k + if field not in supposed_data: + supposed_data[field] = [] + supposed_data[field].append(v) + # suppose country + if k in ["country", "locale"]: + try: + if is_country_tag(v): + country = pycountry.countries.get(alpha_2=v) + tag = country.alpha_2.lower() # type: ignore[union-attr] + else: + tag = pycountry.countries.search_fuzzy(v)[ + 0 + ].alpha_2.lower() # type: ignore[attr-defined] + tags[tag] = tags.get(tag, 0) + 1 + except Exception as e: + logging.debug( + "Pycountry exception: %s", str(e), exc_info=True + ) + + new_usernames = dictionary.get("ids_usernames") + if new_usernames: + for u, utype in new_usernames.items(): + if u not in usernames: + new_ids.append((u, utype)) + usernames[u] = {"type": utype} + + if status.status == MaigretCheckStatus.CLAIMED: + found_accounts += 1 + dictionary["found"] = True + else: + continue + + # ignore non-exact search results + if status.tags: + for t in status.tags: + tags[t] = tags.get(t, 0) + 1 + + brief_text.append( + f"Search by {id_type} {username} returned {found_accounts} accounts." + ) + + if new_ids: + ids_list = [] + for u, t in new_ids: + ids_list.append(f"{u} ({t})" if t != "username" else u) + brief_text.append("Found target's other IDs: " + ", ".join(ids_list) + ".") + + brief_text.append(f"Extended info extracted from {extended_info_count} accounts.") + + brief = " ".join(brief_text).strip() + tuple_sort = lambda d: sorted(d, key=lambda x: x[1], reverse=True) + + if "global" in tags: + # remove tag 'global' useless for country detection + del tags["global"] + + first_username = username_results[0][0] + countries_lists = list(filter(lambda x: is_country_tag(x[0]), tags.items())) + interests_list = list(filter(lambda x: not is_country_tag(x[0]), tags.items())) + + filtered_supposed_data = filter_supposed_data(supposed_data) + + return { + "username": first_username, + "brief": brief, + "results": username_results, + "first_seen": first_seen, + "interests_tuple_list": tuple_sort(interests_list), + "countries_tuple_list": tuple_sort(countries_lists), + "supposed_data": filtered_supposed_data, + "generated_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + } + + +def generate_csv_report(username: str, results: dict, csvfile): + writer = csv.writer(csvfile) + writer.writerow( + [ + "username", + "name", + "url_main", + "url_user", + "exists", + "http_status", + "error_reason", + ] + ) + for site in results: + status = 'Unknown' + result_status = results[site].get("status") + error_reason = _get_result_error_reason(result_status) + if result_status: + status = str(result_status.status) + writer.writerow( + [ + username, + site, + results[site].get("url_main", ""), + results[site].get("url_user", ""), + status, + results[site].get("http_status", 0), + error_reason, + ] + ) + + +def _get_result_error_reason(result_status): + if not result_status: + return 'Unknown' + + if result_status.error: + context = getattr(result_status.error, 'context', None) + if context: + return str(context) + return str(result_status.error) + + if result_status.context: + return str(result_status.context) + + if result_status.status == MaigretCheckStatus.UNKNOWN: + return 'Unknown' + + return '' + + +def generate_txt_report(username: str, results: dict, file): + exists_counter = 0 + for website_name in results: + dictionary = results[website_name] + if ( + dictionary.get("status") + and dictionary["status"].status == MaigretCheckStatus.CLAIMED + ): + exists_counter += 1 + file.write(dictionary["url_user"] + "\n") + file.write(f"Total Websites Username Detected On : {exists_counter}") + + +def generate_json_report(username: str, results: dict, file, report_type): + is_report_per_line = report_type.startswith("ndjson") + all_json = {} + + for sitename in results: + site_result = results[sitename] + if not site_result.get("status"): + continue + + if site_result["status"].status != MaigretCheckStatus.CLAIMED: + continue + + data = dict(site_result) + data["status"] = data["status"].json() + data["site"] = data["site"].json + for field in ["future", "checker"]: + if field in data: + del data[field] + + if is_report_per_line: + data["sitename"] = sitename + file.write(json.dumps(data) + "\n") + else: + all_json[sitename] = data + + if not is_report_per_line: + file.write(json.dumps(all_json)) + + +""" +XMIND 8 Functions +""" + + +def save_xmind_report(filename, username, results): + if os.path.exists(filename): + os.remove(filename) + workbook = xmind.load(filename) + sheet = workbook.getPrimarySheet() + design_xmind_sheet(sheet, username, results) + xmind.save(workbook, path=filename) + + +def add_xmind_subtopic(userlink, k, v, supposed_data): + currentsublabel = userlink.addSubTopic() + field = "fullname" if k == "name" else k + if field not in supposed_data: + supposed_data[field] = [] + supposed_data[field].append(v) + currentsublabel.setTitle("%s: %s" % (k, v)) + + +def design_xmind_sheet(sheet, username, results): + alltags: Dict[str, Any] = {} + supposed_data: Dict[str, Any] = {} + + sheet.setTitle("%s Analysis" % (username)) + root_topic1 = sheet.getRootTopic() + root_topic1.setTitle("%s" % (username)) + + undefinedsection = root_topic1.addSubTopic() + undefinedsection.setTitle("Undefined") + alltags["undefined"] = undefinedsection + error_section = None + + for website_name in results: + dictionary = results[website_name] + result_status = dictionary.get("status") + if not result_status or result_status.status != MaigretCheckStatus.CLAIMED: + error_reason = _get_result_error_reason(result_status) + if not error_reason: + continue + + if error_section is None: + error_section = root_topic1.addSubTopic() + error_section.setTitle("Errors") + + userlink = error_section.addSubTopic() + userlink.setTitle(f"{website_name}: {error_reason}") + if dictionary.get("url_user"): + userlink.addLabel(dictionary["url_user"]) + continue + + stripped_tags = list(map(lambda x: x.strip(), result_status.tags)) + normalized_tags = list( + filter(lambda x: x and not is_country_tag(x), stripped_tags) + ) + + category = None + for tag in normalized_tags: + if tag in alltags.keys(): + continue + tagsection = root_topic1.addSubTopic() + tagsection.setTitle(tag) + alltags[tag] = tagsection + category = tag + + section = alltags[category] if category else undefinedsection + userlink = section.addSubTopic() + userlink.addLabel(result_status.site_url_user) + + ids_data = result_status.ids_data or {} + for k, v in ids_data.items(): + # suppose target data + if isinstance(v, list): + for currentval in v: + add_xmind_subtopic(userlink, k, currentval, supposed_data) + else: + add_xmind_subtopic(userlink, k, v, supposed_data) + + # add supposed data + filtered_supposed_data = filter_supposed_data(supposed_data) + if len(filtered_supposed_data) > 0: + undefinedsection = root_topic1.addSubTopic() + undefinedsection.setTitle("SUPPOSED DATA") + for k, v in filtered_supposed_data.items(): + currentsublabel = undefinedsection.addSubTopic() + currentsublabel.setTitle("%s: %s" % (k, v)) diff --git a/maigret/resources/data.json b/maigret/resources/data.json new file mode 100644 index 0000000..ffd482d --- /dev/null +++ b/maigret/resources/data.json @@ -0,0 +1,36758 @@ +{ + "sites": { + "Facebook": { + "regexCheck": "^[a-zA-Z0-9_\\.]{3,49}(?Page Not Found", + "error-page", + "sumo-page-intro", + "search-results-visible page-not-found", + "search-empty" + ], + "urlMain": "https://support.mozilla.org", + "url": "https://support.mozilla.org/en-US/user/{username}/", + "usernameClaimed": "derekmarable", + "usernameUnclaimed": "tasgcxxxcz", + "presenseStrs": [ + "user-nav", + "", + "sidebar-nav", + "noindex", + "sidebar-nav--item" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36" + } + }, + "discourse.mozilla.org": { + "urlMain": "https://discourse.mozilla.org", + "engine": "Discourse", + "usernameClaimed": "adamlui", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Google Plus (archived)": { + "checkType": "message", + "type": "gaia_id", + "alexaRank": 41, + "presenseStrs": [ + "original" + ], + "absenceStrs": [ + "[]" + ], + "urlMain": "https://plus.google.com", + "urlProbe": "https://web.archive.org/web/timemap/?url=http%3A%2F%2Fplus.google.com%2F{username}&matchType=prefix&collapse=urlkey&output=json&fl=original%2Cmimetype%2Ctimestamp%2Cendtimestamp%2Cgroupcount%2Cuniqcount&filter=!statuscode%3A%5B45%5D..&limit=100000&_=1624789582128", + "url": "https://web.archive.org/web/*/plus.google.com/{username}*", + "usernameClaimed": "117522081019092547227", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "social" + ] + }, + "Telegram": { + "tags": [ + "messaging" + ], + "regexCheck": "^[a-zA-Z][a-zA-Z0-9_]{4,}$", + "checkType": "message", + "absenceStrs": [ + "", + "public profile | Identity | The Guardian" + ], + "alexaRank": 80, + "urlMain": "https://theguardian.com", + "url": "https://profile.theguardian.com/user/{username}", + "usernameClaimed": "frogprincess", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Oracle Community": { + "checkType": "status_code", + "urlMain": "https://community.oracle.com", + "url": "https://community.oracle.com/people/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "forums.opera.com": { + "tags": [ + "forum" + ], + "checkType": "status_code", + "urlMain": "https://forums.opera.com/", + "url": "https://forums.opera.com/user/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VK": { + "tags": [ + "ru", + "social" + ], + "checkType": "status_code", + "regexCheck": "^(?!id\\d)[a-zA-Z0-9_]*$", + "alexaRank": 91, + "urlMain": "https://vk.com/", + "url": "https://vk.com/{username}", + "usernameClaimed": "smith", + "usernameUnclaimed": "blah62831" + }, + "VK (by id)": { + "tags": [ + "ru", + "social" + ], + "type": "vk_id", + "checkType": "response_url", + "alexaRank": 91, + "urlMain": "https://vk.com/", + "regexCheck": "^\\d+$", + "url": "https://vk.com/id{username}", + "source": "VK", + "usernameClaimed": "270433952", + "usernameUnclaimed": "2131232" + }, + "Launchpad": { + "tags": [ + "tech" + ], + "checkType": "status_code", + "alexaRank": 93, + "urlMain": "https://launchpad.net/", + "url": "https://launchpad.net/~{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CloudflareCommunity": { + "disabled": true, + "tags": [ + "forum", + "tech" + ], + "engine": "Discourse", + "urlMain": "https://community.cloudflare.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis", + "protection": [ + "cf_js_challenge" + ] + }, + "ResearchGate": { + "disabled": true, + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "in", + "research", + "social", + "us" + ], + "regexCheck": "\\w+_\\w+", + "checkType": "response_url", + "alexaRank": 100, + "urlMain": "https://www.researchgate.net/", + "url": "https://www.researchgate.net/profile/{username}", + "errorUrl": "https://www.researchgate.net/directory/profiles", + "usernameClaimed": "John_Smith", + "usernameUnclaimed": "noonewould_everusethis7" + }, + "Scratch": { + "tags": [ + "coding" + ], + "checkType": "status_code", + "urlMain": "https://scratch.mit.edu/", + "url": "https://scratch.mit.edu/users/{username}", + "urlProbe": "https://api.scratch.mit.edu/users/{username}", + "usernameClaimed": "griffpatch", + "usernameUnclaimed": "noonewould" + }, + "cyber.harvard.edu": { + "checkType": "status_code", + "urlMain": "https://cyber.harvard.edu", + "url": "https://cyber.harvard.edu/people/{username}", + "usernameClaimed": "dboyd", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Harvard Scholar": { + "disabled": true, + "checkType": "response_url", + "url": "https://scholar.harvard.edu/{username}", + "urlMain": "https://scholar.harvard.edu/", + "usernameClaimed": "ousmanekane", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "custom_bot_protection" + ] + }, + "Issuu": { + "checkType": "message", + "headers": { + "RSC": "1" + }, + "presenseStrs": [ + "\"displayName\":\"" + ], + "absenceStrs": [ + "NEXT_HTTP_ERROR_FALLBACK;404" + ], + "alexaRank": 110, + "urlMain": "https://issuu.com/", + "url": "https://issuu.com/{username}", + "usernameClaimed": "jenny", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "business" + ] + }, + "Weibo": { + "absenceStrs": [ + "该昵称当前没有人使用" + ], + "presenseStrs": [ + "{\"ok\":1,\"data\":{\"user\":" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0", + "Referer": "https://weibo.com/", + "Cookie": "SUB=_2AkMdFa01f8NxqwJRmvwUz2LjaYp1ww7EieKrSVzuJRMxHRl-yT9yqlUStRB6NpWD2jyzKNEl0uw_vEsS3DHafDm4ESQm; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9Wh7pke.1CZOWMKGvI63-vT2" + }, + "activation": { + "method": "weibo", + "marks": [ + "微博</title", + "<title>Sina Visitor System" + ], + "url": "https://passport.weibo.com/visitor/genvisitor2" + }, + "urlProbe": "https://weibo.com/ajax/profile/info?screen_name={username}", + "url": "https://weibo.com/n/{username}", + "urlMain": "https://weibo.com", + "usernameClaimed": "clairekuo", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "cn", + "social" + ], + "alexaRank": 115, + "protection": [ + "custom_bot_protection" + ] + }, + "Weebly": { + "regexCheck": "^[a-zA-Z0-9]+$", + "absenceStrs": [ + "Error - Page Not Found" + ], + "presenseStrs": [ + "" + ], + "url": "http://{username}.weebly.com/", + "urlMain": "http://weebly.com", + "usernameClaimed": "designguild", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "business" + ], + "alexaRank": 118 + }, + "linktr.ee": { + "tags": [ + "links" + ], + "checkType": "status_code", + "urlMain": "https://linktr.ee", + "url": "https://linktr.ee/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "Blisscartoos", + "alexaRank": 120 + }, + "Discord": { + "url": "https://discord.com", + "urlMain": "https://discord.com/", + "urlProbe": "https://discord.com/api/v9/unique-username/username-attempt-unauthed", + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]{2,32}$", + "checkType": "message", + "absenceStrs": [ + "{\"taken\":false}" + ], + "headers": { + "Content-Type": "application/json" + }, + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 133, + "requestMethod": "POST", + "requestPayload": { + "username": "{username}" + }, + "errors": { + "The resource is being rate limited": "Rate limited", + "You are being rate limited": "Rate limited", + "rate_limited": "Rate limited", + "BASE_TYPE_BAD_LENGTH": "Invalid username length", + "Must be between 2 and 32 in length": "Invalid username length" + }, + "tags": [ + "gaming", + "messaging" + ] + }, + "Unsplash": { + "disabled": true, + "tags": [ + "art", + "photo" + ], + "checkType": "status_code", + "alexaRank": 142, + "urlMain": "https://unsplash.com/", + "url": "https://unsplash.com/@{username}", + "usernameClaimed": "jenny", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Calendly": { + "tags": [ + "business", + "us" + ], + "checkType": "status_code", + "presenseStrs": [ + "profile", + " User" + ], + "absenceStrs": [ + "The page you are looking for could not be found" + ], + "urlMain": "https://calendly.com", + "url": "https://calendly.com/{username}", + "urlProbe": "https://calendly.com/api/booking/profiles/{username}", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 145 + }, + "Etsy": { + "disabled": true, + "tags": [ + "shopping" + ], + "errors": { + "Sanctions Policy": "Site censorship", + "Политика санкций": "Site censorship" + }, + "checkType": "status_code", + "alexaRank": 146, + "urlMain": "https://www.etsy.com/", + "url": "https://www.etsy.com/shop/{username}", + "usernameClaimed": "JennyKrafts", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "GitLab": { + "tags": [ + "coding" + ], + "urlProbe": "https://gitlab.com/api/v4/users?username={username}", + "checkType": "message", + "absenceStrs": [ + "[]" + ], + "alexaRank": 155, + "urlMain": "https://gitlab.com/", + "url": "https://gitlab.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Twitch": { + "tags": [ + "streaming" + ], + "urlProbe": "https://twitchtracker.com/{username}", + "checkType": "status_code", + "alexaRank": 163, + "urlMain": "https://www.twitch.tv/", + "url": "https://twitchtracker.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ebay": { + "tags": [ + "shopping" + ], + "errors": { + "Security Measure": "Captcha detected" + }, + "checkType": "message", + "presenseStrs": [ + "Positive feedback" + ], + "absenceStrs": [ + "Threads • Log in" + ], + "headers": { + "Sec-Fetch-Mode": "navigate" + }, + "usernameClaimed": "zuck", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 409, + "tags": [ + "social" + ], + "protection": [ + "tls_fingerprint" + ] + }, + "Slack": { + "tags": [ + "messaging" + ], + "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", + "checkType": "status_code", + "alexaRank": 422, + "urlMain": "https://slack.com", + "url": "https://{username}.slack.com", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Weld": { + "tags": [ + "ru", + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "urlMain": "https://weld.in.ua", + "url": "https://weld.in.ua/forum/member.php/?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "BuzzFeed": { + "tags": [ + "news" + ], + "checkType": "status_code", + "alexaRank": 465, + "urlMain": "https://buzzfeed.com/", + "url": "https://buzzfeed.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "xgtrq" + }, + "W3Schools": { + "tags": [ + "education" + ], + "checkType": "status_code", + "urlMain": "https://www.w3schools.com/", + "url": "https://pathfinder-api.kai.w3spaces.com/public-profile-api/{username}", + "usernameClaimed": "rly0nheart", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 466 + }, + "Naver": { + "tags": [ + "kr" + ], + "checkType": "status_code", + "alexaRank": 475, + "urlMain": "https://naver.com", + "url": "https://blog.naver.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewould" + }, + "Disqus": { + "tags": [ + "discussion", + "social" + ], + "errors": { + "Invalid API key": "New API key needed" + }, + "regexCheck": "^[^/]+$", + "urlProbe": "https://disqus.com/api/3.0/users/details?user=username%3A{username}&attach=userFlaggedUser&api_key=E8Uh5l5fHZ6gD8U3KycjAIAk46f68Zw7C6eW8WSjZvCLXebZ7p0r1yrYDrLilk2F", + "checkType": "status_code", + "presenseStrs": [ + "https://disqus.com/api/users/" + ], + "absenceStrs": [ + "User matching query does not exist" + ], + "alexaRank": 485, + "urlMain": "https://disqus.com/", + "url": "https://disqus.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ask Fedora": { + "tags": [ + "forum" + ], + "absenceStrs": [ + "Sorry, we couldn't find that page." + ], + "engine": "Discourse", + "urlMain": "https://ask.fedoraproject.org/", + "usernameClaimed": "grsm", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "OK": { + "tags": [ + "ru", + "social" + ], + "regexCheck": "^[a-zA-Z][a-zA-Z0-9_.-]*$", + "checkType": "status_code", + "alexaRank": 537, + "urlMain": "https://ok.ru/", + "url": "https://ok.ru/{username}", + "usernameClaimed": "ok", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Snapchat": { + "url": "https://www.snapchat.com/add/{username}", + "urlMain": "https://www.snapchat.com", + "checkType": "status_code", + "regexCheck": "^[a-z][a-z-_.]{3,15}", + "usernameClaimed": "teamsnapchat", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 525, + "requestMethod": "GET", + "tags": [ + "social" + ] + }, + "Trello": { + "tags": [ + "tasks" + ], + "urlProbe": "https://trello.com/1/Members/{username}", + "checkType": "message", + "absenceStrs": [ + "model not found" + ], + "alexaRank": 535, + "urlMain": "https://trello.com/", + "url": "https://trello.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Photobucket": { + "disabled": true, + "tags": [ + "photo" + ], + "regexCheck": "\\w{4,32}", + "checkType": "message", + "requestHeadOnly": true, + "absenceStrs": [ + "Found. Redirecting" + ], + "alexaRank": 549, + "urlMain": "https://photobucket.com/", + "url": "https://app.photobucket.com/u/{username}", + "usernameClaimed": "onlinecomicbookstore", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Udemy": { + "disabled": true, + "tags": [ + "education" + ], + "checkType": "response_url", + "alexaRank": 553, + "urlMain": "https://www.udemy.com", + "url": "https://www.udemy.com/user/{username}/", + "usernameClaimed": "adammortimer", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Shutterstock": { + "disabled": true, + "protection": [ + "custom_bot_protection" + ], + "tags": [ + "music", + "photo", + "stock" + ], + "checkType": "message", + "absenceStrs": [ + "This surprising...", + "Unfortunately, we can't find what you're looking for.", + "Not Found | Shutterstock" + ], + "presenseStrs": [ + "{username}", + "Information" + ], + "alexaRank": 564, + "urlMain": "https://www.shutterstock.com", + "url": "https://www.shutterstock.com/g/{username}/about", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "profile.hatena.ne.jp": { + "tags": [ + "jp" + ], + "checkType": "message", + "presenseStrs": [ + "profile" + ], + "absenceStrs": [ + "404 Not Found" + ], + "urlMain": "https://profile.hatena.ne.jp", + "url": "https://profile.hatena.ne.jp/{username}/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "MixCloud": { + "tags": [ + "music" + ], + "urlProbe": "https://api.mixcloud.com/{username}/", + "checkType": "status_code", + "alexaRank": 584, + "urlMain": "https://www.mixcloud.com/", + "url": "https://www.mixcloud.com/{username}/", + "usernameClaimed": "jenny", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Good-music": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "http://good-music.kiev.ua", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "freedom.kiev.ua": { + "engine": "uCoz", + "urlMain": "http://freedom.kiev.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "Slashdot": { + "tags": [ + "news" + ], + "errors": { + "503 - Service Offline": "Site error" + }, + "checkType": "message", + "absenceStrs": [ + "user you requested does not exist" + ], + "alexaRank": 616, + "urlMain": "https://slashdot.org", + "url": "https://slashdot.org/~{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "NPM": { + "tags": [ + "coding" + ], + "checkType": "message", + "presenseStrs": [ + "\"objects\":[{" + ], + "absenceStrs": [ + "\"total\":0" + ], + "alexaRank": 590, + "urlMain": "https://www.npmjs.com/", + "url": "https://www.npmjs.com/~{username}", + "urlProbe": "https://registry.npmjs.org/-/v1/search?text=maintainer:{username}&size=1", + "usernameClaimed": "sindresorhus", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "NPM-Package": { + "tags": [ + "coding" + ], + "checkType": "status_code", + "alexaRank": 590, + "urlMain": "https://www.npmjs.com/", + "url": "https://www.npmjs.com/package/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "Allods": { + "urlSubpath": "/forums", + "tags": [ + "forum", + "gaming", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://allods.mail.ru", + "usernameClaimed": "wizard", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "ArcheAge": { + "urlSubpath": "/forums", + "disabled": true, + "tags": [ + "forum", + "gaming", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://aa.mail.ru", + "usernameClaimed": "wizard", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Crossfire": { + "disabled": true, + "tags": [ + "gaming", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра" + ], + "urlMain": "https://cfire.mail.ru", + "url": "https://cfire.mail.ru/forums/member.php?username={username}", + "usernameClaimed": "wizard", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lostark": { + "urlSubpath": "/forums", + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://la.mail.ru", + "usernameClaimed": "wizard", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Love.Mail.ru": { + "tags": [ + "ru" + ], + "regexCheck": "^\\d+$", + "checkType": "message", + "absenceStrs": [ + "Знакомства@Mail.Ru" + ], + "urlMain": "https://love.mail.ru", + "url": "https://love.mail.ru/profile/{username}", + "usernameClaimed": "1838153357", + "usernameUnclaimed": "9999999999999999" + }, + "My.Mail.ru@OK": { + "tags": [ + "ru" + ], + "type": "ok_id", + "checkType": "message", + "presenceStrs": [ + "profile__content_header_user" + ], + "absenceStrs": [ + "mm-profile_not-found_content", + "Мой Мир@Mail.Ru" + ], + "urlMain": "https://my.mail.ru/", + "url": "https://my.mail.ru/ok/{username}", + "usernameClaimed": "524140807468", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "My.Mail.ru@VK": { + "tags": [ + "ru" + ], + "type": "vk_id", + "checkType": "message", + "presenceStrs": [ + "profile__content_header_user" + ], + "absenceStrs": [ + "mm-profile_not-found_content", + "Мой Мир@Mail.Ru" + ], + "urlMain": "https://my.mail.ru/", + "url": "https://my.mail.ru/vk/{username}", + "usernameClaimed": "337779600", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "My.Mail.ru@bk.ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenceStrs": [ + "profile__content_header_user" + ], + "absenceStrs": [ + "mm-profile_not-found_content", + "Мой Мир@Mail.Ru" + ], + "urlMain": "https://my.mail.ru/", + "url": "https://my.mail.ru/bk/{username}/", + "usernameClaimed": "tanyagorohova", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "My.Mail.ru@gmail.com": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenceStrs": [ + "profile__content_header_user" + ], + "absenceStrs": [ + "mm-profile_not-found_content", + "Мой Мир@Mail.Ru" + ], + "urlMain": "https://my.mail.ru/", + "url": "https://my.mail.ru/gmail.com/{username}/", + "usernameClaimed": "chelsea121232", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "My.Mail.ru@list.ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenceStrs": [ + "profile__content_header_user" + ], + "absenceStrs": [ + "mm-profile_not-found_content", + "Мой Мир@Mail.Ru" + ], + "urlMain": "https://my.mail.ru/", + "url": "https://my.mail.ru/list/{username}/", + "usernameClaimed": "nickname", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "My.Mail.ru@mail.ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenceStrs": [ + "profile__content_header_user" + ], + "absenceStrs": [ + "mm-profile_not-found_content", + "Мой Мир@Mail.Ru" + ], + "urlMain": "https://my.mail.ru/", + "url": "https://my.mail.ru/mail/{username}/", + "usernameClaimed": "nickname", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "My.Mail.ru@ya.ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenceStrs": [ + "profile__content_header_user" + ], + "absenceStrs": [ + "mm-profile_not-found_content", + "Мой Мир@Mail.Ru" + ], + "urlMain": "https://my.mail.ru/", + "url": "https://my.mail.ru/ya.ru/{username}/", + "usernameClaimed": "hovsepovich", + "usernameUnclaimed": "MAlKOVyd" + }, + "My.Mail.ru@yandex.ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenceStrs": [ + "profile__content_header_user" + ], + "absenceStrs": [ + "mm-profile_not-found_content", + "Мой Мир@Mail.Ru" + ], + "urlMain": "https://my.mail.ru/", + "url": "https://my.mail.ru/yandex.ru/{username}/", + "usernameClaimed": "proftek2015", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "PerfectWorld": { + "tags": [ + "gaming", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Perfect World" + ], + "urlMain": "https://pw.mail.ru", + "url": "https://pw.mail.ru/member.php?username={username}", + "usernameClaimed": "Wedm", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "PerfectWorldForum": { + "urlSubpath": "/forums", + "tags": [ + "forum", + "gaming", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://pw.mail.ru/", + "usernameClaimed": "wizard", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Revelation": { + "urlSubpath": "/forums", + "disabled": true, + "tags": [ + "forum", + "gaming", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://rev.mail.ru", + "usernameClaimed": "wizard", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tanks": { + "urlSubpath": "/forum", + "disabled": true, + "tags": [ + "forum", + "gaming", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://tanks.mail.ru", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Warface": { + "urlSubpath": "/forums", + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://wf.mail.ru", + "usernameClaimed": "wizard", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Steam": { + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "The specified profile could not be found" + ], + "alexaRank": 650, + "urlMain": "https://steamcommunity.com/", + "url": "https://steamcommunity.com/id/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Steam (by id)": { + "tags": [ + "gaming" + ], + "type": "steam_id", + "checkType": "message", + "absenceStrs": [ + "The specified profile could not be found" + ], + "alexaRank": 650, + "urlMain": "https://steamcommunity.com/", + "url": "https://steamcommunity.com/profiles/{username}", + "source": "Steam", + "usernameClaimed": "76561197960287930", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Steam (Group)": { + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "No group could be retrieved for the given URL" + ], + "alexaRank": 650, + "urlMain": "https://steamcommunity.com/", + "url": "https://steamcommunity.com/groups/{username}", + "source": "Steam", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DigitalOcean": { + "tags": [ + "forum", + "tech" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "alexaRank": 659, + "urlMain": "https://www.digitalocean.com/", + "url": "https://www.digitalocean.com/community/users/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "About.me": { + "tags": [ + "blog" + ], + "checkType": "status_code", + "alexaRank": 685, + "urlMain": "https://about.me/", + "url": "https://about.me/{username}", + "usernameClaimed": "jeff", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Instructables": { + "tags": [ + "hobby" + ], + "checkType": "message", + "absenceStrs": [ + "404: We're sorry, things break sometimes" + ], + "alexaRank": 700, + "urlMain": "https://www.instructables.com/", + "url": "https://www.instructables.com/member/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "PeopleIgn": { + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "title>IGN Error 404 - Not Found" + ], + "urlMain": "https://people.ign.com/", + "url": "https://people.ign.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Envato": { + "tags": [ + "au", + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forums.envato.com", + "usernameClaimed": "zigro", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ameblo": { + "absenceStrs": [ + "THROW_NOT_FOUND_EXCEPTION" + ], + "presenseStrs": [ + "profile" + ], + "url": "https://ameblo.jp/{username}", + "urlMain": "https://ameblo.jp", + "usernameClaimed": "senpai", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 701, + "tags": [ + "blog", + "jp" + ] + }, + "Diveforum": { + "tags": [ + "forum", + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "Извините" + ], + "urlMain": "https://diveforum.spb.ru/", + "url": "https://diveforum.spb.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "poteryashka.spb.ru": { + "engine": "uCoz", + "urlMain": "http://poteryashka.spb.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "Fiverr": { + "tags": [ + "shopping" + ], + "checkType": "response_url", + "alexaRank": 760, + "urlMain": "https://www.fiverr.com/", + "url": "https://www.fiverr.com/{username}", + "errorUrl": "https://www.fiverr.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis", + "protection": [ + "tls_fingerprint", + "cf_firewall" + ] + }, + "HuggingFace": { + "checkType": "status_code", + "url": "https://huggingface.co/{username}", + "urlMain": "https://huggingface.co/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 706, + "tags": [ + "coding", + "llm", + "tech" + ] + }, + "Laracast": { + "url": "https://laracasts.com/@{username}", + "urlMain": "https://laracasts.com/", + "checkType": "status_code", + "regexCheck": "^[a-zA-Z0-9_-]{3,}$", + "usernameClaimed": "user1", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 738, + "tags": [ + "coding", + "education" + ] + }, + "Paypal": { + "tags": [ + "finance", + "fintech" + ], + "checkType": "message", + "absenceStrs": [ + "PayPal.MeFigma" + ], + "url": "https://www.figma.com/@{username}", + "urlMain": "https://www.figma.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 917, + "tags": [ + "design" + ], + "protection": [ + "tls_fingerprint", + "ip_reputation" + ] + }, + "forum.pkp.sfu.ca": { + "urlMain": "https://forum.pkp.sfu.ca", + "engine": "Discourse", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "ca", + "forum" + ], + "protection": [ + "custom_bot_protection" + ] + }, + "Houzz": { + "disabled": true, + "protection": [ + "ip_reputation" + ], + "tags": [ + "design" + ], + "checkType": "message", + "absenceStrs": [ + "The page you requested was not found." + ], + "alexaRank": 963, + "urlMain": "https://houzz.com/", + "url": "https://houzz.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Foursquare": { + "tags": [ + "geosocial", + "in", + "social" + ], + "disabled": true, + "checkType": "message", + "presenseStrs": [ + "Foursquare " + ], + "alexaRank": 1000, + "urlMain": "https://foursquare.com/", + "url": "https://foursquare.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "HackerOne": { + "tags": [ + "coding", + "hacking" + ], + "checkType": "status_code", + "urlMain": "https://hackerone.com/", + "url": "https://hackerone.com/{username}", + "usernameClaimed": "nahamsec", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 3645 + }, + "HackerNews": { + "tags": [ + "news" + ], + "checkType": "message", + "presenseStrs": [ + "\"created\"" + ], + "urlMain": "https://news.ycombinator.com/", + "url": "https://news.ycombinator.com/user?id={username}", + "urlProbe": "https://hacker-news.firebaseio.com/v0/user/{username}.json", + "usernameClaimed": "pg", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TradingView": { + "tags": [ + "trading" + ], + "checkType": "status_code", + "alexaRank": 999, + "urlMain": "https://www.tradingview.com/", + "url": "https://www.tradingview.com/u/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Discogs": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "music" + ], + "checkType": "status_code", + "alexaRank": 1020, + "urlMain": "https://www.discogs.com/", + "url": "https://www.discogs.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Jimdo": { + "tags": [ + "de" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "alexaRank": 1037, + "urlMain": "https://jimdosite.com/", + "url": "https://{username}.jimdosite.com", + "usernameClaimed": "jenny", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "YandexZenChannel": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + ".zen-ui-page-404" + ], + "presenseStrs": [ + "zen_object_id" + ], + "alexaRank": 1118, + "urlMain": "https://dzen.ru", + "url": "https://dzen.ru/channel/{username}", + "headers": { + "Cookie": "Session_id=noauth:1; yandex_login=; ys=c_chck.1; mda2_beacon=1; sso_status=sso.passport.yandex.ru:synchronized; _yasc=1; _ym_uid=1; _ym_d=1; _ym_isad=2; yandexuid=1" + }, + "source": "Yandex", + "usernameClaimed": "tema", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "Codepen": { + "tags": [ + "coding" + ], + "errors": { + "Checking your browser before accessing": "Autoredirect detected" + }, + "checkType": "message", + "absenceStrs": [ + "I'm afraid you've found a page that doesn't exist on CodePen" + ], + "alexaRank": 1087, + "urlMain": "https://codepen.io/", + "url": "https://codepen.io/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "Rottentomatoes": { + "tags": [ + "movies" + ], + "checkType": "status_code", + "alexaRank": 1101, + "urlMain": "https://www.rottentomatoes.com", + "url": "https://www.rottentomatoes.com/critic/{username}/movies", + "usernameClaimed": "ben-allen", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TomsHardware": { + "tags": [ + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found.", + "The requested page could not be found." + ], + "urlMain": "https://forums.tomshardware.com/", + "url": "https://forums.tomshardware.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "custom_bot_protection" + ], + "disabled": true + }, + "Smugmug": { + "tags": [ + "photo" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "protection": [ + "tls_fingerprint" + ], + "alexaRank": 1114, + "urlMain": "https://smugmug.com/", + "url": "https://{username}.smugmug.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.ghost.org": { + "engine": "DiscourseJson", + "urlMain": "https://forum.ghost.org", + "protection": [ + "tls_fingerprint" + ], + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Duolingo": { + "tags": [ + "education" + ], + "urlProbe": "https://www.duolingo.com/2017-06-30/users?username={username}", + "checkType": "message", + "absenceStrs": [ + "{\"users\":[]}" + ], + "alexaRank": 1126, + "urlMain": "https://duolingo.com/", + "url": "https://www.duolingo.com/profile/{username}", + "usernameClaimed": "duolingo", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "kofi": { + "tags": [ + "freelance" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "Make income from your art!", + "https://storage.ko-fi.com/cdn/og.png" + ], + "alexaRank": 1096, + "urlMain": "https://ko-fi.com", + "url": "https://ko-fi.com/{username}", + "usernameClaimed": "yeahkenny", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "IBM Video": { + "tags": [ + "streaming", + "video" + ], + "checkType": "status_code", + "alexaRank": 1143, + "urlMain": "https://video.ibm.com/", + "url": "https://video.ibm.com/{username}", + "usernameClaimed": "nasahdtv", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "djskt.lnk.to": { + "checkType": "message", + "presenseStrs": [ + "artistName", + " legalName" + ], + "absenceStrs": [ + "No page with this URL exists" + ], + "urlMain": "https://djskt.lnk.to", + "url": "https://djskt.lnk.to/{username}", + "usernameClaimed": "LoveDontFadeTW", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Arduino Forum": { + "url": "https://forum.arduino.cc/u/{username}/summary", + "urlMain": "https://forum.arduino.cc/", + "checkType": "status_code", + "usernameClaimed": "system", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Strava": { + "tags": [ + "sport" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "Strava | " + ], + "presenseStrs": [ + "Strava" + ], + "alexaRank": 1145, + "urlMain": "https://www.strava.com/", + "url": "https://www.strava.com/athletes/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "forum.openoffice.org": { + "urlMain": "https://forum.openoffice.org/en/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Wikidot": { + "tags": [ + "wiki" + ], + "checkType": "message", + "absenceStrs": [ + "User does not exist." + ], + "presenseStrs": [ + "Wikidot user since" + ], + "alexaRank": 1183, + "urlMain": "http://www.wikidot.com/", + "url": "http://www.wikidot.com/user:info/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DEV Community": { + "tags": [ + "coding" + ], + "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", + "checkType": "status_code", + "alexaRank": 1119, + "urlMain": "https://dev.to/", + "url": "https://dev.to/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ReverbNation": { + "tags": [ + "music" + ], + "errors": { + "But your computer or network appears to be generating a lot of automated requests": "Too many requests" + }, + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "Sorry, we couldn't find that page" + ], + "alexaRank": 1205, + "urlMain": "https://www.reverbnation.com/", + "url": "https://www.reverbnation.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gitee": { + "tags": [ + "cn" + ], + "checkType": "status_code", + "alexaRank": 1236, + "urlMain": "https://gitee.com/", + "url": "https://gitee.com/{username}", + "usernameClaimed": "wizzer", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "GitCode": { + "tags": [ + "cn", + "coding" + ], + "checkType": "message", + "urlMain": "https://gitcode.com/", + "url": "https://gitcode.com/{username}", + "usernameClaimed": "chatgpt", + "usernameUnclaimed": "noonewouldeverusethis7", + "presenseStrs": [ + "AtomGit | GitCode" + ] + }, + "Yuque": { + "tags": [ + "cn", + "coding" + ], + "checkType": "status_code", + "urlMain": "https://www.yuque.com/", + "url": "https://www.yuque.com/{username}", + "usernameClaimed": "yuque", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "LeetCode CN": { + "tags": [ + "cn", + "coding" + ], + "checkType": "message", + "urlMain": "https://leetcode.cn/", + "url": "https://leetcode.cn/u/{username}/", + "usernameClaimed": "leetcode", + "usernameUnclaimed": "noonewouldeverusethis7", + "presenseStrs": [ + "\"userAvatar\"" + ] + }, + "Bangumi": { + "tags": [ + "cn" + ], + "checkType": "message", + "urlMain": "https://bgm.tv/", + "url": "https://bgm.tv/user/{username}", + "usernameClaimed": "sai", + "usernameUnclaimed": "noonewouldeverusethis7", + "presenseStrs": [ + "的时光机" + ] + }, + "NGA": { + "tags": [ + "cn", + "forum" + ], + "checkType": "message", + "urlMain": "https://bbs.nga.cn/", + "url": "https://bbs.nga.cn/nuke.php?func=ucp&username={username}", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "presenseStrs": [ + "__UCPUSER" + ] + }, + "Moegirl": { + "tags": [ + "cn" + ], + "checkType": "status_code", + "urlMain": "https://zh.moegirl.org.cn/", + "url": "https://zh.moegirl.org.cn/User:{username}", + "usernameClaimed": "零", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "ImageShack": { + "tags": [ + "photo", + "sharing" + ], + "checkType": "response_url", + "alexaRank": 1263, + "urlMain": "https://imageshack.com/", + "url": "https://imageshack.com/user/{username}", + "errorUrl": "https://imageshack.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "accounts.eclipse.org": { + "tags": [ + "coding" + ], + "engine": "engine404", + "urlMain": "https://accounts.eclipse.org", + "url": "https://accounts.eclipse.org/users/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "VirusTotal": { + "disabled": true, + "tags": [ + "tech" + ], + "headers": { + "accept-language": "en-US,en;q=0.9,es;q=0.8", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36", + "x-tool": "vt-ui-main", + "x-vt-anti-abuse-header": "MTM0NTMxNTA3MTItWkc5dWRDQmlaU0JsZG1scy0xNjA3NDMzMzM3LjI3MQ==" + }, + "errors": { + "RecaptchaRequiredError": "Captcha detected" + }, + "checkType": "message", + "absenceStrs": [ + "not found" + ], + "alexaRank": 1229, + "urlMain": "https://www.virustotal.com/", + "url": "https://www.virustotal.com/ui/users/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "LiveInternet": { + "tags": [ + "ru" + ], + "errors": { + "При выполнении запроса этой страницы произошла ошибка.": "Site error" + }, + "checkType": "message", + "presenseStrs": [ + "/foaf/" + ], + "alexaRank": 1323, + "urlMain": "https://www.liveinternet.ru", + "url": "https://www.liveinternet.ru/users/{username}/profile", + "usernameClaimed": "marrietta", + "usernameUnclaimed": "noonewouldevereverusethis7" + }, + "ProductHunt": { + "tags": [ + "tech" + ], + "checkType": "message", + "presenseStrs": [ + ":{\"data\":{\"profile\":{\"__typename\"" + ], + "absenceStrs": [ + "We seem to have lost this page" + ], + "alexaRank": 1268, + "urlMain": "https://www.producthunt.com/", + "url": "https://www.producthunt.com/@{username}", + "usernameClaimed": "rajiv_ayyangar", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "HubPages": { + "tags": [ + "blog" + ], + "checkType": "status_code", + "urlMain": "https://hubpages.com/", + "url": "https://hubpages.com/@{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis", + "alexaRank": 1363, + "protection": [ + "tls_fingerprint" + ] + }, + "Genius": { + "tags": [ + "music" + ], + "checkType": "status_code", + "alexaRank": 1343, + "urlMain": "https://genius.com/", + "url": "https://genius.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "note": { + "tags": [ + "jp" + ], + "checkType": "status_code", + "alexaRank": 1295, + "urlMain": "https://note.com/", + "url": "https://note.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Flipboard": { + "tags": [ + "tech" + ], + "regexCheck": "^([a-zA-Z0-9_]){1,15}$", + "checkType": "status_code", + "alexaRank": 1376, + "urlMain": "https://flipboard.com/", + "url": "https://flipboard.com/@{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewould" + }, + "amp.flipboard.com": { + "tags": [ + "news" + ], + "engine": "engine404", + "urlMain": "https://amp.flipboard.com", + "url": "https://amp.flipboard.com/@{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "Artstation": { + "tags": [ + "art", + "stock" + ], + "checkType": "message", + "presenseStrs": [ + "" + ], + "alexaRank": 1372, + "urlMain": "https://www.artstation.com", + "url": "https://www.artstation.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "BuyMeACoffee": { + "tags": [ + "freelance" + ], + "urlProbe": "https://www.buymeacoffee.com/{username}", + "checkType": "status_code", + "alexaRank": 1329, + "urlMain": "https://www.buymeacoffee.com/", + "url": "https://buymeacoff.ee/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Techrepublic": { + "tags": [ + "news", + "tech" + ], + "disabled": true, + "checkType": "status_code", + "alexaRank": 1355, + "urlMain": "https://www.techrepublic.com", + "url": "https://www.techrepublic.com/members/profile/{username}/", + "usernameClaimed": "Kentertainments75", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pbase": { + "tags": [ + "photo" + ], + "checkType": "message", + "absenceStrs": [ + "Unknown Artist" + ], + "alexaRank": 1388, + "urlMain": "https://pbase.com/", + "url": "https://pbase.com/{username}/profile", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Packagist": { + "tags": [ + "coding" + ], + "checkType": "response_url", + "alexaRank": 1392, + "urlMain": "https://packagist.org/", + "url": "https://packagist.org/packages/{username}/", + "errorUrl": "https://packagist.org/search/?q={username}&reason=vendor_not_found", + "usernameClaimed": "psr", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gitea": { + "url": "https://gitea.com/{username}", + "urlMain": "https://gitea.com/", + "checkType": "status_code", + "usernameClaimed": "xorm", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding" + ], + "alexaRank": 1342 + }, + "Geeksfor Geeks": { + "url": "https://www.geeksforgeeks.org/profile/{username}", + "urlMain": "https://www.geeksforgeeks.org/", + "checkType": "message", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 1426, + "presenseStrs": [ + "institute_name" + ], + "absenceStrs": [ + "undefined | GeeksforGeeks Profile" + ], + "tags": [ + "coding", + "education" + ] + }, + "AllTrails": { + "disabled": true, + "tags": [ + "sport", + "travel" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "presenseStrs": [ + "Profile" + ], + "absenceStrs": [ + "You are being" + ], + "alexaRank": 1456, + "urlMain": "https://www.alltrails.com/", + "url": "https://www.alltrails.com/members/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Diigo": { + "tags": [ + "bookmarks" + ], + "checkType": "message", + "absenceStrs": [ + "{}" + ], + "alexaRank": 1510, + "urlMain": "https://www.diigo.com/", + "url": "https://www.diigo.com/interact_api/load_profile_info?name={username}", + "usernameClaimed": "markmark", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "AllRecipes": { + "tags": [ + "hobby" + ], + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "Page Not Found.", + "You may have mistyped the address, or the page may have moved." + ], + "presenseStrs": [ + "Saved Items & Collections", + "{username}" + ], + "alexaRank": 1488, + "urlMain": "https://www.allrecipes.com/", + "url": "https://www.allrecipes.com/cook/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "HabrCareer": { + "tags": [ + "career", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "<h1>Ошибка 404</h1>" + ], + "urlMain": "https://career.habr.com/", + "url": "https://career.habr.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Freelance.habr": { + "tags": [ + "freelance", + "ru" + ], + "checkType": "response_url", + "urlMain": "https://freelance.habr.com/", + "url": "https://freelance.habr.com/freelancers/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Toster": { + "tags": [ + "coding", + "ru" + ], + "checkType": "status_code", + "urlMain": "https://qna.habr.com/", + "url": "https://qna.habr.com/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Habr": { + "tags": [ + "blog", + "discussion", + "ru" + ], + "checkType": "status_code", + "alexaRank": 1475, + "urlMain": "https://habr.com/", + "url": "https://habr.com/ru/users/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "bbs.boingboing.net": { + "urlMain": "https://bbs.boingboing.net", + "engine": "Discourse", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "protection": [ + "custom_bot_protection" + ] + }, + "Gorod.dp.ua": { + "disabled": true, + "tags": [ + "de", + "forum", + "ua" + ], + "engine": "vBulletin", + "urlMain": "https://forum.gorod.dp.ua/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "promalp.dp.ua": { + "engine": "uCoz", + "urlMain": "http://promalp.dp.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "disabled": true + }, + "Redbubble": { + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "shopping" + ], + "checkType": "status_code", + "alexaRank": 1508, + "urlMain": "https://www.redbubble.com/", + "url": "https://www.redbubble.com/people/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "codeberg.org": { + "tags": [ + "coding" + ], + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "urlMain": "https://codeberg.org", + "url": "https://codeberg.org/{username}", + "usernameClaimed": "pcastela", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 1430 + }, + "Codecanyon": { + "tags": [ + "coding", + "shopping" + ], + "checkType": "status_code", + "alexaRank": 1602, + "urlMain": "https://codecanyon.net", + "url": "https://codecanyon.net/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Windy": { + "tags": [ + "maps" + ], + "checkType": "status_code", + "alexaRank": 1582, + "urlMain": "https://windy.com/", + "url": "https://community.windy.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "community.brave.com": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://community.brave.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "XDA": { + "disabled": true, + "tags": [ + "apps", + "forum" + ], + "errors": { + "<title>Attention Required! | Cloudflare": "Cloudflare security protection detected" + }, + "engine": "vBulletin", + "urlMain": "https://xdaforums.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ], + "alexaRank": 9768 + }, + "Tom's guide": { + "tags": [ + "forum", + "tech" + ], + "engine": "XenForo", + "urlMain": "http://forums.tomsguide.com", + "usernameClaimed": "matthewvel", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Sbnation": { + "tags": [ + "us" + ], + "disabled": true, + "checkType": "response_url", + "alexaRank": 1688, + "urlMain": "https://www.sbnation.com", + "url": "https://www.sbnation.com/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Minecraft": { + "url": "https://api.mojang.com/users/profiles/minecraft/{username}", + "urlMain": "https://minecraft.net/", + "checkType": "message", + "absenceStrs": [ + "Couldn't find any profile with name" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]{1,25}$", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 1635, + "tags": [ + "gaming" + ] + }, + "{username}.tilda.ws": { + "tags": [ + "ru" + ], + "engine": "engine404", + "urlMain": "https://tilda.ws", + "url": "https://{username}.tilda.ws", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 1648 + }, + "Discuss.Elastic.co": { + "tags": [ + "forum", + "tech" + ], + "engine": "Discourse", + "urlMain": "https://discuss.elastic.co/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Codecademy": { + "tags": [ + "coding", + "education" + ], + "checkType": "message", + "absenceStrs": [ + "This profile could not be found" + ], + "presenseStrs": [ + "Codecademy profile page for" + ], + "alexaRank": 1642, + "urlMain": "https://www.codecademy.com/", + "url": "https://www.codecademy.com/profiles/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "discuss.codecademy.com": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://discuss.codecademy.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red" + }, + "Polygon": { + "tags": [ + "gaming", + "news" + ], + "disabled": true, + "checkType": "status_code", + "alexaRank": 1668, + "urlMain": "https://www.polygon.com/", + "url": "https://www.polygon.com/users/{username}", + "usernameClaimed": "swiftstickler", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "apelmon.od.ua": { + "engine": "uCoz", + "urlMain": "http://apelmon.od.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "Wolframalpha Forum": { + "url": "https://community.wolfram.com/web/{username}/home", + "urlMain": "https://community.wolfram.com/", + "checkType": "status_code", + "usernameClaimed": "unico", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "HackerNoon": { + "tags": [ + "news" + ], + "checkType": "status_code", + "urlProbe": "https://us-central1-hackernoon-app.cloudfunctions.net/profilesApi/?handle={username}", + "urlMain": "https://hackernoon.com", + "url": "https://hackernoon.com/u/{username}", + "usernameUnclaimed": "noonewouldeverusethis71", + "usernameClaimed": "god", + "alexaRank": 1690 + }, + "Kaggle": { + "tags": [ + "tech" + ], + "checkType": "message", + "headers": { + "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" + }, + "errors": { + "Checking your browser before accessing": "Bot protection (reCAPTCHA)" + }, + "presenseStrs": [ + " | Kaggle" + ], + "absenceStrs": [ + "Kaggle: Your Home for Data Science" + ], + "alexaRank": 1705, + "urlMain": "https://www.kaggle.com/", + "url": "https://www.kaggle.com/{username}", + "usernameClaimed": "dansbecker", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "PCGamer": { + "tags": [ + "gaming", + "news" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found. Please enter a member's entire name." + ], + "errors": { + "Checking your browser": "Anti-bot challenge" + }, + "alexaRank": 1727, + "urlMain": "https://pcgamer.com", + "url": "https://forums.pcgamer.com/members/?username={username}", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "Ubisoft": { + "disabled": true, + "tags": [ + "forum", + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "urlMain": "https://forums-ru.ubisoft.com/", + "url": "https://forums-ru.ubisoft.com/member.php/?username={username}", + "usernameClaimed": "MrNardred", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dreamstime": { + "protection": [ + "ip_reputation", + "custom_bot_protection" + ], + "tags": [ + "art", + "photo", + "stock" + ], + "checkType": "status_code", + "alexaRank": 1833, + "urlMain": "https://www.dreamstime.com", + "url": "https://www.dreamstime.com/{username}_info", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Instapaper": { + "url": "https://www.instapaper.com/p/{username}", + "urlMain": "https://www.instapaper.com/", + "checkType": "status_code", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 1830, + "requestMethod": "GET", + "tags": [ + "reading" + ] + }, + "RamblerDating": { + "tags": [ + "dating", + "ru" + ], + "checkType": "response_url", + "urlMain": "https://dating.rambler.ru/", + "url": "https://dating.rambler.ru/page/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "active.lviv.ua": { + "urlMain": "http://www.active.lviv.ua", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ua" + ], + "disabled": true + }, + "volkswagen.lviv.ua": { + "urlMain": "http://volkswagen.lviv.ua", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "auto", + "forum", + "ua" + ] + }, + "tuning.lviv.ua": { + "urlMain": "http://tuning.lviv.ua/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ua" + ] + }, + "Wattpad": { + "tags": [ + "reading", + "writing" + ], + "checkType": "message", + "absenceStrs": [ + "userError-404" + ], + "alexaRank": 1920, + "urlMain": "https://www.wattpad.com/", + "url": "https://www.wattpad.com/user/{username}", + "usernameClaimed": "Dogstho7951", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "OpenSea": { + "tags": [ + "crypto", + "nft" + ], + "checkType": "status_code", + "protection": [ + "tls_fingerprint" + ], + "alexaRank": 1875, + "urlMain": "https://opensea.io", + "url": "https://opensea.io/{username}", + "usernameClaimed": "opensea", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Speakerdeck": { + "tags": [ + "sharing" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "User Not Found" + ], + "alexaRank": 1889, + "urlMain": "https://speakerdeck.com", + "url": "https://speakerdeck.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "WikimapiaProfile": { + "tags": [ + "maps", + "ru" + ], + "type": "wikimapia_uid", + "checkType": "message", + "absenceStrs": [ + "January 01, 1970" + ], + "alexaRank": 1911, + "urlMain": "http://wikimapia.org", + "url": "http://wikimapia.org/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "WikimapiaSearch": { + "tags": [ + "maps", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "" + ], + "headers": { + "Cookie": "verified=1" + }, + "activation": { + "method": "wikimapia", + "marks": [ + "document.cookie=\"ngxsession=" + ] + }, + "alexaRank": 1911, + "urlMain": "http://wikimapia.org", + "url": "http://wikimapia.org/user/tools/users_rating/?username={username}", + "caseSentitive": true, + "usernameClaimed": "Voronoff", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "VC.ru": { + "similarSearch": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Мы все внимательно посмотрели, но ничего не нашли :(" + ], + "alexaRank": 1842, + "urlMain": "https://vc.ru", + "url": "https://vc.ru/search/v2/subsite/relevant?query={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "74507.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://74507.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ucoz": { + "tags": [ + "forum", + "ru" + ], + "engine": "uCoz", + "urlMain": "https://forum.ucoz.ru", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "afsoc.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://afsoc.ucoz.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "alpanf.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://alpanf.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "antalya.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://antalya.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "antizombie.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://antizombie.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "movies", + "ru" + ] + }, + "army-rus.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://army-rus.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "armyboots.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://armyboots.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "aviabaza-meria.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://aviabaza-meria.ucoz.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "easyjob.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://easyjob.ucoz.ru", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "ru" + ] + }, + "fablero.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://fablero.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum-ssc.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://forum-ssc.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "gebirgs.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://gebirgs.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "hobby", + "ru" + ] + }, + "kursk46.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://kursk46.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "losinopetrovsk.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://losinopetrovsk.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "morshansk.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://morshansk.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "oopkmoskva.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://oopkmoskva.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ovo.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://ovo.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "pro-cssteam.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://pro-cssteam.ucoz.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "punx.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://punx.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "pv-afghan.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://pv-afghan.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "rus-mmm.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://rus-mmm.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "salekhardnews.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://salekhardnews.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "shadow-belgorod.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://shadow-belgorod.ucoz.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "tarjaturunen.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://tarjaturunen.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "virtual-auto.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://virtual-auto.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "weaponsas.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://weaponsas.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "xakerminus.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://xakerminus.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "zabselo.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://zabselo.ucoz.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "gomel-dogs.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://gomel-dogs.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "rottweiler.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://rottweiler.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "lai.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://lai.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "zennenhund.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://zennenhund.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "nada25.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://nada25.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "forum", + "ru" + ] + }, + "day-lapku.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://day-lapku.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "legendarus-veo.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://legendarus-veo.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "pushok.ucoz.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://pushok.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "pskovfaunaclub.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://pskovfaunaclub.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "valleykrosava.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://valleykrosava.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "vadimbondar.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://vadimbondar.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "vadya.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://vadya.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "stroyneemvmeste.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://stroyneemvmeste.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "eyorkie.ucoz.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://eyorkie.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "sfinx-cats.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://sfinx-cats.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ugri.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://ugri.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "milnerelena.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://milnerelena.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "zebest.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://zebest.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "hmkids.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://hmkids.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "shanson.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://shanson.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "protection": [ + "ip_reputation" + ] + }, + "klas-crew.ucoz.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://klas-crew.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "allmus.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://allmus.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "rotarusofi.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://rotarusofi.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "videomuzon.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://videomuzon.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "webmedia.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://webmedia.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "p1rat.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://p1rat.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "protection": [ + "ip_reputation" + ] + }, + "satisfacktion.ucoz.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://satisfacktion.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "music", + "ru" + ] + }, + "djfint.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://djfint.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "god" + }, + "aviaforum.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://aviaforum.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "forum" + ] + }, + "avia-forum.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://avia-forum.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "forum", + "ru" + ] + }, + "terralight.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://terralight.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "tachograph.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://tachograph.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "moto-master.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://moto-master.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "protection": [ + "ip_reputation" + ] + }, + "scb.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://scb.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "remzona-ekb.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://remzona-ekb.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "protection": [ + "custom_bot_protection" + ] + }, + "serwis.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://serwis.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "protection": [ + "ip_reputation" + ] + }, + "ankord.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://ankord.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "deutsch-auto68.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://deutsch-auto68.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "krum.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://krum.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "wallpost.ucoz.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://wallpost.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "playlist-iptv.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://playlist-iptv.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "mamki-papki.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://mamki-papki.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "magic-square.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://magic-square.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "free-proxy.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://free-proxy.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "oskolfishing.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://oskolfishing.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "my-tucson.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://my-tucson.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "potystorony.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://potystorony.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "nokia6233.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://nokia6233.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "goddamn.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://goddamn.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "poshtovik.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://poshtovik.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "ic.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://ic.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "babymama.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://babymama.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "autocb.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://autocb.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "so4ineniya.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://so4ineniya.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "toneto.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://toneto.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "fat.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://fat.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "tags": [ + "forum", + "ru" + ] + }, + "holodilshchik.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://holodilshchik.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "sladkiydesert.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://sladkiydesert.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "nicholassparks.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://nicholassparks.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "catinboots.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://catinboots.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red" + }, + "nicefriendcats.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://nicefriendcats.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "dcsoft.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://dcsoft.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "dok17.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://dok17.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "cadaverzian.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://cadaverzian.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "rurip.ucoz.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://rurip.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "yras.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://yras.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "doccarb.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://doccarb.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "chelentano.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://chelentano.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "aviahistory.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://aviahistory.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "nuzar.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://nuzar.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "faillyuboi.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://faillyuboi.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "pio-bets.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://pio-bets.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "clan-sg.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://clan-sg.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "mytechbook.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://mytechbook.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "diablocool.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://diablocool.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "chastysc.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://chastysc.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "torrents-igra.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://torrents-igra.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "schonin.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://schonin.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "kfir-zahav.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://kfir-zahav.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "lakshmi-fm.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://lakshmi-fm.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "death-note.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://death-note.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "pirohimic.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://pirohimic.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "warez-pirati.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://warez-pirati.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "gifts.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://gifts.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "sat-electronics.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://sat-electronics.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "pro-svet.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://pro-svet.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "memory57.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://memory57.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "baggi.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://baggi.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "gorbuha.ucoz.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://gorbuha.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "big-game.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://big-game.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "soft-deniz.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://soft-deniz.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "lifeway.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://lifeway.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "pochikimyk.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://pochikimyk.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "moments.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://moments.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "inetjob.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://inetjob.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "pogz5615.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://pogz5615.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "cosmotarolog.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://cosmotarolog.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "buyforex.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://buyforex.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "stay.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://stay.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "dhelp.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://dhelp.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "famouspeople.ucoz.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://famouspeople.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "foxrecord.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://foxrecord.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "konibodom.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://konibodom.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ural-sloboda.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://ural-sloboda.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "bbclub.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://bbclub.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "smartplay.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://smartplay.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "azovmore.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://azovmore.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "str-upravlenie.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://str-upravlenie.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "nk-cs.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://nk-cs.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "kuzini.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://kuzini.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "5i8.ucoz.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://5i8.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "bashteplovent.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://bashteplovent.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "svoimirykami.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://svoimirykami.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "hackapp.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://hackapp.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "collegy.ucoz.ru": { + "tags": [ + "kz" + ], + "engine": "uCoz", + "urlMain": "http://collegy.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "anschula.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://anschula.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "garmin.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://garmin.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "655iap.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://655iap.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "protection": [ + "ip_reputation" + ] + }, + "el-pizza.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://el-pizza.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "berea.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://berea.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "zdorov10.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://zdorov10.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "lname.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://lname.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "sibcoins.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://sibcoins.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "vgorah.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://vgorah.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "school-23elista.ucoz.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://school-23elista.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "baykovoshkola.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://baykovoshkola.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "coffeeworld.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://coffeeworld.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "trainz-vl.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://trainz-vl.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "hulyaganka.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://hulyaganka.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "mix-best.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://mix-best.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "cosmoforum.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://cosmoforum.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "tags": [ + "forum" + ], + "protection": [ + "ip_reputation" + ] + }, + "mychildren.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://mychildren.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "icook.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://icook.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "dzhida2000.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://dzhida2000.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "snegovaya-pad.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://snegovaya-pad.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "rielt55.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://rielt55.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "csi.ucoz.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://csi.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "taxi-belgorod.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://taxi-belgorod.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "doytrunt.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://doytrunt.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "naruto-rolegame.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://naruto-rolegame.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "kraskiprazdnika.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://kraskiprazdnika.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "101vzvod.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://101vzvod.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "actikom.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://actikom.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "marym.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://marym.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "aikido-mariupol.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://aikido-mariupol.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "protection": [ + "ip_reputation" + ] + }, + "icq-telefon.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://icq-telefon.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "admin-soft.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://admin-soft.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "kinohouse.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://kinohouse.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "photoaura.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://photoaura.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "mozga-net.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://mozga-net.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "css-nn-52-rus.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://css-nn-52-rus.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "protection": [ + "ip_reputation" + ] + }, + "sebastopol.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://sebastopol.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "remont56.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://remont56.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "compline.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://compline.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "fs-mods-rus.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://fs-mods-rus.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "zvukinadezdy.ucoz.ru": { + "engine": "uCoz", + "urlMain": "https://zvukinadezdy.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ps-cs.ucoz.ru": { + "disabled": true, + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://ps-cs.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "gta-fan-zone.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://gta-fan-zone.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "scooter-helper.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://scooter-helper.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "opinion.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://opinion.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "sufficit.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://sufficit.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "urmai-urmaevo.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://urmai-urmaevo.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "pik100.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://pik100.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "drawings-base.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://drawings-base.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "minnac.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://minnac.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "top10allservers.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://top10allservers.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "usersoft.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://usersoft.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ships.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://ships.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "cpu.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://cpu.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "popugi.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://popugi.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "death-legion.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://death-legion.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "beatl.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://beatl.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "homeofsky.ucoz.ru": { + "engine": "uCoz", + "urlMain": "http://homeofsky.ucoz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "hikvision.msk.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://hikvision.msk.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "radio_echo_msk": { + "tags": [ + "ru" + ], + "disabled": true, + "checkType": "status_code", + "urlMain": "https://echo.msk.ru/", + "url": "https://echo.msk.ru/users/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "spartak.msk.ru": { + "urlMain": "http://spartak.msk.ru/guest", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "SoftwareInformer": { + "checkType": "response_url", + "urlMain": "https://users.software.informer.com", + "url": "https://users.software.informer.com/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Freecodecamp": { + "tags": [ + "coding", + "education", + "forum" + ], + "engine": "Discourse", + "alexaRank": 1927, + "urlMain": "https://www.freecodecamp.org/forum/", + "usernameClaimed": "JeremyLT", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Letterboxd": { + "tags": [ + "movies" + ], + "checkType": "message", + "absenceStrs": [ + "Sorry, we can’t find the page you’ve requested." + ], + "alexaRank": 2026, + "urlMain": "https://letterboxd.com/", + "url": "https://letterboxd.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "MyAnimeList": { + "tags": [ + "anime" + ], + "checkType": "status_code", + "alexaRank": 2064, + "urlMain": "https://myanimelist.net/", + "url": "https://myanimelist.net/profile/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nextcloud Forum": { + "disabled": true, + "url": "https://help.nextcloud.com/u/{username}/summary", + "urlMain": "https://nextcloud.com/", + "checkType": "status_code", + "regexCheck": "^(?![.-])[a-zA-Z0-9_.-]{3,20}$", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 2011 + }, + "Roblox": { + "tags": [ + "gaming" + ], + "checkType": "message", + "presenseStrs": [ + "class=\"profile-container\"" + ], + "absenceStrs": [ + "request-error" + ], + "alexaRank": 2067, + "urlMain": "https://www.roblox.com/", + "url": "https://www.roblox.com/user.aspx?username={username}", + "usernameClaimed": "bluewolfekiller", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Flightradar24": { + "tags": [ + "maps" + ], + "regexCheck": "^[a-zA-Z0-9_]{3,20}$", + "checkType": "status_code", + "alexaRank": 2164, + "urlMain": "https://www.flightradar24.com/", + "url": "https://my.flightradar24.com/{username}", + "usernameClaimed": "jebbrooks", + "usernameUnclaimed": "xgtrq" + }, + "forums.sketchup.com": { + "urlMain": "https://forums.sketchup.com", + "engine": "Discourse", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "discuss.hashicorp.com": { + "urlMain": "https://discuss.hashicorp.com", + "engine": "Discourse", + "usernameClaimed": "jfinnigan", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "tech" + ] + }, + "Metacritic": { + "disabled": true, + "tags": [ + "review" + ], + "regexCheck": "^(?![-_])[A-Za-z0-9-_]{3,15}$", + "checkType": "message", + "absenceStrs": [ + "This user hasn’t rated anything yet" + ], + "presenseStrs": [ + "Avg. User score" + ], + "alexaRank": 2339, + "urlMain": "https://www.metacritic.com/", + "url": "https://www.metacritic.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewould" + }, + "TVTropes": { + "tags": [ + "wiki" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "alexaRank": 2347, + "urlMain": "https://tvtropes.org", + "url": "https://tvtropes.org/pmwiki/pmwiki.php/Tropers/{username}", + "usernameClaimed": "Chabal2", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.wordreference.com": { + "urlMain": "https://forum.wordreference.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "T-MobileSupport": { + "checkType": "status_code", + "urlMain": "https://support.t-mobile.com", + "url": "https://support.t-mobile.com/people/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Rajce.net": { + "tags": [ + "cz" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "presenseStrs": [ + "\"user\":{\"username\":\"" + ], + "absenceStrs": [ + "Uživatel neexistuje" + ], + "urlMain": "https://www.rajce.idnes.cz/", + "url": "https://{username}.rajce.idnes.cz/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ICQ": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 2445, + "urlMain": "https://icq.com", + "url": "https://icq.im/{username}", + "usernameClaimed": "sokrat", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Eurogamer": { + "disabled": true, + "tags": [ + "gb" + ], + "checkType": "status_code", + "alexaRank": 2448, + "urlMain": "https://www.eurogamer.net", + "url": "https://www.eurogamer.net/profiles/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "BoardGameGeek": { + "disabled": true, + "checkType": "message", + "tags": [ + "gaming" + ], + "absenceStrs": [ + "\t\tUser not found", + "messagebox error", + ">\t

Profile | BoardGameGeek", + "\t
" + ], + "alexaRank": 2426, + "urlMain": "https://boardgamegeek.com", + "url": "https://boardgamegeek.com/user/{username}", + "usernameClaimed": "ZakuBG", + "usernameUnclaimed": "uzytnhstvj", + "presenseStrs": [ + "username", + " style=", + "mail", + " \tstyle=", + " data-username=" + ] + }, + "Tistory": { + "url": "https://{username}.tistory.com/", + "urlMain": "https://www.tistory.com/", + "checkType": "status_code", + "usernameClaimed": "notice", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 2431, + "tags": [ + "blog", + "kr" + ] + }, + "JSFiddle": { + "tags": [ + "coding", + "sharing" + ], + "engine": "engine404", + "urlMain": "https://jsfiddle.net", + "url": "https://jsfiddle.net/u/{username}/", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john", + "alexaRank": 2472 + }, + "OnlyFans": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "porn" + ], + "headers": { + "accept": "application/json, text/plain, */*", + "app-token": "33d57ade8c02dbc5a333db99ff9ae26a", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", + "user-id": "0", + "x-bc": "0a106d301866494c873ae3a05bc3c97cee59a749", + "time": "1780241333068", + "sign": "57203:ce125bf3c0f597a7fe536ccfdadd7422b1177aa9:7bc:69cfa6d8", + "referer": "https://onlyfans.com/", + "cookie": "__cf_bm=YovfzPN0T_wg6F60L5eZKPOQvlGESws3UDGgEkmPb9A-1776790253-1.0.1.1-KRZgptNe5P9epBZSdITa12VfTEDlDdLckPY3I2FDAacvCPxOj0PqeK86J5mcC7UQ_TM8_O24bAh21ElYINovqk2386EoJYyLmknHJ5UsFts" + }, + "activation": { + "method": "onlyfans", + "marks": [ + "Please refresh the page", + "Something went wrong" + ], + "url": "https://onlyfans.com/api2/v2/init", + "static_param": "jLM8LXHU1CGcuCzPMNwWX9osCScVuP4D", + "format": "57203:{}:{:x}:69cfa6d8", + "checksum_indexes": [ + 28, + 3, + 16, + 32, + 25, + 24, + 23, + 0, + 26, + 33, + 24, + 29, + 32, + 30, + 29, + 18, + 31, + 10, + 1, + 19, + 3, + 13, + 16, + 6, + 10, + 36, + 15, + 33, + 27, + 15, + 20, + 27 + ], + "checksum_constant": -460, + "app_token": "33d57ade8c02dbc5a333db99ff9ae26a" + }, + "errors": { + "Please refresh the page": "OnlyFans signing rules expired — update from DATAHOARDERS/dynamic-rules", + "Something went wrong": "OnlyFans API error" + }, + "regexCheck": "^[a-zA-Z0-9._-]{3,50}$", + "checkType": "status_code", + "urlMain": "https://onlyfans.com/", + "url": "https://onlyfans.com/{username}", + "urlProbe": "https://onlyfans.com/api2/v2/users/{username}", + "usernameClaimed": "onlyfans", + "usernameUnclaimed": "noonewouldeverusethis7xyz", + "alexaRank": 2998 + }, + "Pornhub": { + "tags": [ + "porn" + ], + "disabled": true, + "checkType": "message", + "presenseStrs": [ + "profileInformation" + ], + "absenceStrs": [ + "Error Page Not Found", + "cannot be found" + ], + "alexaRank": 2508, + "urlMain": "https://pornhub.com/", + "url": "https://pornhub.com/users/{username}", + "usernameClaimed": "verified", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "123rf": { + "tags": [ + "photo", + "ru" + ], + "checkType": "response_url", + "urlMain": "https://ru.123rf.com", + "url": "https://ru.123rf.com/profile_{username}", + "usernameClaimed": "rawpixel", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "linuxfoundation": { + "tags": [ + "forum" + ], + "checkType": "status_code", + "urlMain": "https://forum.linuxfoundation.org", + "url": "https://forum.linuxfoundation.org/profile/{username}", + "usernameClaimed": "chap92", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TechSpot": { + "tags": [ + "forum" + ], + "errors": { + "You must be logged-in to do that.": "Login required" + }, + "engine": "XenForo", + "alexaRank": 2509, + "urlMain": "http://www.techspot.com/community/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "GamesRadar": { + "tags": [ + "gaming", + "news" + ], + "checkType": "status_code", + "url": "https://www.gamesradar.com/uk/author/{username}/", + "urlMain": "https://www.gamesradar.com", + "usernameClaimed": "jordan-gerblick", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 2489 + }, + "Gog": { + "tags": [ + "gaming" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "alexaRank": 2557, + "urlMain": "https://www.gog.com/", + "url": "https://www.gog.com/u/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Geocaching": { + "tags": [ + "hobby" + ], + "checkType": "status_code", + "alexaRank": 2512, + "urlMain": "https://www.geocaching.com/", + "url": "https://www.geocaching.com/p/?u={username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Coub": { + "tags": [ + "video" + ], + "checkType": "status_code", + "alexaRank": 2621, + "urlMain": "https://coub.com/", + "url": "https://coub.com/{username}", + "usernameClaimed": "bestcoubs", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Metacafe": { + "disabled": true, + "tags": [ + "video" + ], + "checkType": "message", + "absenceStrs": [ + "Channel is temporarily not available" + ], + "alexaRank": 2611, + "urlMain": "https://www.metacafe.com/", + "url": "https://www.metacafe.com/channels/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.audacityteam.org": { + "engine": "DiscourseJson", + "urlMain": "https://forum.audacityteam.org", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "{username}.ddns.net": { + "protocol": "dns", + "url": "{username}.ddns.net", + "urlMain": "{username}.ddns.net", + "usernameClaimed": "repack", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "status_code" + }, + "Rust-lang": { + "tags": [ + "coding", + "forum" + ], + "engine": "Discourse", + "urlMain": "https://users.rust-lang.org", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Keybase": { + "tags": [ + "business" + ], + "urlProbe": "https://keybase.io/_/api/1.0/user/lookup.json?usernames={username}", + "checkType": "message", + "absenceStrs": [ + "them\":[null]", + "bad list value" + ], + "alexaRank": 2645, + "urlMain": "https://keybase.io/", + "url": "https://keybase.io/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "LiveLeak": { + "disabled": true, + "tags": [ + "news", + "video" + ], + "checkType": "message", + "absenceStrs": [ + "channel not found" + ], + "alexaRank": 2657, + "urlMain": "https://www.liveleak.com/", + "url": "https://www.liveleak.com/c/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Artsy": { + "tags": [ + "art" + ], + "checkType": "status_code", + "alexaRank": 2698, + "urlMain": "https://www.artsy.net", + "url": "https://www.artsy.net/artist/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "IFTTT": { + "tags": [ + "tech" + ], + "regexCheck": "^[A-Za-z0-9]{3,35}$", + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "alexaRank": 2740, + "urlMain": "https://www.ifttt.com/", + "url": "https://www.ifttt.com/p/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "beacons.ai": { + "tags": [ + "links" + ], + "checkType": "message", + "presenseStrs": [ + "https://cdn.beacons.ai/profile_pictures" + ], + "absenceStrs": [ + "https://beacons.ai/bw_logo_full.png" + ], + "urlMain": "https://beacons.ai", + "url": "https://beacons.ai/{username}", + "usernameClaimed": "pasteljellies", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 2680, + "protection": [ + "cf_js_challenge" + ] + }, + "Taplink": { + "url": "https://taplink.cc/{username}", + "urlMain": "https://taplink.cc/", + "checkType": "message", + "presenseStrs": [ + "at Taplink" + ], + "usernameClaimed": "adidas", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "links" + ], + "protection": [ + "tls_fingerprint" + ], + "alexaRank": 2850 + }, + "MetaDiscourse": { + "engine": "DiscourseJson", + "tags": [ + "forum" + ], + "urlMain": "https://meta.discourse.org/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Muckrack": { + "disabled": true, + "protection": [ + "cf_js_challenge" + ], + "absenceStrs": [ + "(404) Page Not Found" + ], + "presenseStrs": [ + "profile-details-item" + ], + "url": "https://muckrack.com/{username}", + "urlMain": "https://muckrack.com", + "usernameClaimed": "adam-flomenbaum", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 2756, + "tags": [ + "news" + ] + }, + "Odysee": { + "url": "https://odysee.com/@{username}", + "urlMain": "https://odysee.com/", + "checkType": "message", + "presenseStrs": [ + "" + ], + "absenceStrs": [ + "404 Not Found - HackMD" + ], + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding" + ], + "alexaRank": 2877 + }, + "Crunchyroll": { + "disabled": true, + "tags": [ + "forum", + "movies" + ], + "headers": { + "'User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0" + }, + "checkType": "status_code", + "alexaRank": 2821, + "urlMain": "https://www.crunchyroll.com/", + "url": "https://www.crunchyroll.com/user/{username}", + "usernameClaimed": "adan", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TemplateMonster": { + "disabled": true, + "protection": [ + "cf_js_challenge" + ], + "absenceStrs": [ + "ErrorPage__title" + ], + "presenseStrs": [ + "profile", + "header_profile", + "mailer", + "name", + "@graph" + ], + "url": "https://www.templatemonster.com/authors/{username}/", + "urlMain": "https://www.templatemonster.com", + "usernameClaimed": "zemez", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 2906, + "tags": [ + "coding" + ] + }, + "Donorbox": { + "url": "https://donorbox.org/{username}", + "urlMain": "https://donorbox.org", + "usernameClaimed": "theabbie", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "status_code", + "alexaRank": 2873, + "tags": [ + "finance" + ] + }, + "Freelancer.com": { + "tags": [ + "freelance" + ], + "protection": [ + "tls_fingerprint" + ], + "checkType": "message", + "absenceStrs": [ + "\"users\":{}" + ], + "alexaRank": 2862, + "urlMain": "https://www.freelancer.com/", + "url": "https://www.freelancer.com/api/users/0.1/users?usernames%5B%5D={username}&compact=true", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Giantbomb": { + "tags": [ + "gaming" + ], + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "alexaRank": 3189, + "urlMain": "https://www.giantbomb.com", + "url": "https://www.giantbomb.com/profile/{username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Replit": { + "disabled": true, + "url": "https://replit.com/@{username}", + "urlMain": "https://replit.com/", + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 2843, + "tags": [ + "coding" + ] + }, + "Steemit": { + "absenceStrs": [ + "NotFound__menu" + ], + "presenseStrs": [ + "profile", + " username" + ], + "url": "https://steemit.com/@{username}", + "urlMain": "https://steemit.com", + "usernameClaimed": "apiprincz", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "news" + ], + "alexaRank": 3000 + }, + "gentoo": { + "tags": [ + "coding", + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "Error 404 (Not Found)" + ], + "urlMain": "https://forums.gentoo.org", + "url": "https://forums.gentoo.org/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Venmo": { + "tags": [ + "finance", + "fintech", + "us" + ], + "checkType": "status_code", + "alexaRank": 2947, + "urlMain": "https://venmo.com/", + "url": "https://venmo.com/{username}", + "usernameClaimed": "jenny", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.inaturalist.org": { + "urlMain": "https://forum.inaturalist.org", + "engine": "Discourse", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "iNaturalist": { + "checkType": "status_code", + "url": "https://www.inaturalist.org/people/{username}", + "urlProbe": "https://api.inaturalist.org/v1/users/{username}", + "urlMain": "https://www.inaturalist.org", + "usernameClaimed": "kueda", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 2885, + "tags": [ + "hobby", + "science" + ] + }, + "Pluralsight": { + "checkType": "message", + "errors": { + "Unfortunately, Pluralsight's products are not available in your area at this time": "Site censorship" + }, + "absenceStrs": [ + "Not available | Profile", + "renderErrorPage(404)" + ], + "urlMain": "https://app.pluralsight.com", + "url": "https://app.pluralsight.com/profile/author/{username}", + "usernameClaimed": "adam-crahen", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gfycat": { + "tags": [ + "photo", + "sharing" + ], + "checkType": "status_code", + "alexaRank": 3070, + "urlMain": "https://gfycat.com/", + "url": "https://gfycat.com/@{username}", + "usernameClaimed": "Test", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "LeetCode": { + "url": "https://leetcode.com/u/{username}/", + "urlProbe": "https://leetcode.com/graphql/", + "urlMain": "https://leetcode.com/", + "checkType": "message", + "requestMethod": "POST", + "requestPayload": { + "query": "{{ matchedUser(username: \"{username}\") {{ username profile {{ realName aboutMe userAvatar countryName company school ranking }} }} }}" + }, + "headers": { + "Content-Type": "application/json" + }, + "presenseStrs": [ + "\"username\":" + ], + "absenceStrs": [ + "\"matchedUser\":null" + ], + "usernameClaimed": "soxoj", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding" + ], + "alexaRank": 3060 + }, + "Teletype": { + "tags": [ + "ru", + "writing" + ], + "checkType": "status_code", + "alexaRank": 2989, + "urlMain": "https://teletype.in", + "url": "https://teletype.in/@{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "F-droid": { + "engine": "DiscourseJson", + "tags": [ + "forum" + ], + "urlMain": "https://forum.f-droid.org", + "usernameClaimed": "system", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DailyKos": { + "tags": [ + "us" + ], + "checkType": "message", + "presenseStrs": [ + "bp-personal-tab" + ], + "absenceStrs": [ + "bp-nouveau error404" + ], + "alexaRank": 3110, + "urlMain": "https://www.dailykos.com", + "url": "https://www.dailykos.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CTAN": { + "url": "https://ctan.org/author/{username}", + "urlMain": "https://ctan.org/", + "checkType": "status_code", + "usernameClaimed": "briggs", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 3081, + "tags": [ + "coding" + ] + }, + "Mix": { + "tags": [ + "links", + "sharing" + ], + "checkType": "response_url", + "alexaRank": 3181, + "urlMain": "https://mix.com", + "url": "https://mix.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chess": { + "tags": [ + "gaming", + "hobby" + ], + "checkType": "message", + "absenceStrs": [ + "error image", + "

404 Page not found

", + "_404-header", + "_404-inner-container", + " no-nav ", + "not found." + ], + "presenseStrs": [ + "\"player_id\":", + "\"@id\":\"https://api.chess.com/pub/player/" + ], + "alexaRank": 3078, + "urlMain": "https://www.chess.com", + "url": "https://www.chess.com/member/{username}", + "urlProbe": "https://api.chess.com/pub/player/{username}", + "usernameClaimed": "sexytwerker69", + "usernameUnclaimed": "aublurbrxm", + "headers": { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36" + } + }, + "OpenCollective": { + "tags": [ + "coding", + "finance" + ], + "checkType": "status_code", + "alexaRank": 3098, + "urlMain": "https://opencollective.com/", + "url": "https://opencollective.com/{username}", + "usernameClaimed": "sindresorhus", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.vn.ua": { + "disabled": true, + "urlMain": "http://forum.vn.ua", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ameba": { + "tags": [ + "jp" + ], + "checkType": "status_code", + "urlMain": "https://profile.ameba.jp", + "url": "https://profile.ameba.jp/ameba/{username}/", + "usernameClaimed": "haruharuko3", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ChaturBate": { + "protection": [ + "ip_reputation", + "tls_fingerprint" + ], + "tags": [ + "porn", + "webcam" + ], + "checkType": "status_code", + "alexaRank": 3611, + "urlMain": "https://chaturbate.com", + "url": "https://chaturbate.com/{username}/", + "usernameClaimed": "cute18cute", + "usernameUnclaimed": "noonewouldeverusethis77777", + "errors": { + "Just a moment": "Cloudflare challenge", + "challenges.cloudflare.com": "Cloudflare challenge" + } + }, + "Techdirt": { + "disabled": true, + "tags": [ + "news", + "tech" + ], + "checkType": "status_code", + "alexaRank": 3162, + "urlMain": "https://www.techdirt.com/", + "url": "https://www.techdirt.com/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.blackmagicdesign.com": { + "urlMain": "https://forum.blackmagicdesign.com", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "jAlbum.net": { + "regexCheck": "^[^\\.]+$", + "protection": [ + "tls_fingerprint" + ], + "url": "https://{username}.jalbum.net/", + "urlMain": "https://jalbum.net", + "usernameClaimed": "laza", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "status_code", + "tags": [ + "photo" + ], + "alexaRank": 3315 + }, + "Weblate": { + "url": "https://hosted.weblate.org/user/{username}/", + "urlMain": "https://hosted.weblate.org/", + "checkType": "status_code", + "regexCheck": "^[a-zA-Z0-9@._-]{1,150}$", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "headers": { + "User-Agent": "python-requests/2.25.1" + } + }, + "Ultimate-Guitar": { + "tags": [ + "music" + ], + "checkType": "status_code", + "alexaRank": 3428, + "urlMain": "https://ultimate-guitar.com/", + "url": "https://ultimate-guitar.com/u/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "SublimeForum": { + "tags": [ + "coding", + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forum.sublimetext.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "MuffinGroup": { + "tags": [ + "forum", + "gaming" + ], + "checkType": "status_code", + "urlMain": "https://forum.muffingroup.com", + "url": "https://forum.muffingroup.com/betheme/profile/{username}", + "usernameClaimed": "charlie27", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Slides": { + "tags": [ + "sharing" + ], + "checkType": "status_code", + "alexaRank": 3412, + "urlMain": "https://slides.com/", + "url": "https://slides.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "takr-kiev.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://takr-kiev.ucoz.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "topcheats.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://topcheats.ucoz.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "vdv-belarus.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://vdv-belarus.ucoz.com", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "by", + "forum", + "military" + ] + }, + "vse1.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://vse1.ucoz.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "prenatal-club.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://prenatal-club.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "real-sp.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://real-sp.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "obkon.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://obkon.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "xorazm-viloyati.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://xorazm-viloyati.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "tatyana-art.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://tatyana-art.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "kakvkontakte.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://kakvkontakte.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "podsnezhniksad.ucoz.com": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://podsnezhniksad.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "igra-online.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://igra-online.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "icu.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://icu.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "firasmartincome.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://firasmartincome.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "topreklama.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://topreklama.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "wakeup.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://wakeup.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "sharing-sat.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://sharing-sat.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "duz.ucoz.com": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://duz.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "lesbeyanka.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://lesbeyanka.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "tags": [ + "ru" + ] + }, + "moedelo.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://moedelo.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "halol.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://halol.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "game-mobi.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://game-mobi.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "sense.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://sense.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "stroy-s-nami.ucoz.com": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://stroy-s-nami.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "god" + }, + "osta.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://osta.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "wm.ucoz.com": { + "engine": "uCoz", + "urlMain": "http://wm.ucoz.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "Newgrounds": { + "absenceStrs": [ + "icon-steam" + ], + "presenseStrs": [ + "user-header-name" + ], + "url": "https://{username}.newgrounds.com", + "urlMain": "https://newgrounds.com", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 3371, + "tags": [ + "art", + "forum", + "gaming" + ], + "protection": [ + "custom_bot_protection" + ] + }, + "forums.linuxmint.com": { + "urlMain": "https://forums.linuxmint.com", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Plurk": { + "tags": [ + "cn", + "tw" + ], + "checkType": "message", + "urlMain": "https://www.plurk.com/", + "url": "https://www.plurk.com/{username}", + "usernameClaimed": "kigi", + "usernameUnclaimed": "noonewouldeverusethis7", + "absenceStrs": [ + "User Not Found!" + ] + }, + "MyFitnessPal": { + "disabled": true, + "protection": [ + "cf_firewall" + ], + "tags": [ + "sport" + ], + "checkType": "message", + "absenceStrs": [ + "meta name=\"robots\" content=\"index,follow\"/>", + "Folkd | Home" + ], + "alexaRank": 4400, + "urlMain": "http://www.folkd.com/profile/", + "url": "http://www.folkd.com/profile/{username}", + "usernameClaimed": "staffingservice", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "9GAG": { + "disabled": true, + "tags": [ + "sharing", + "social" + ], + "checkType": "status_code", + "alexaRank": 4194, + "urlMain": "https://www.9gag.com/", + "url": "https://www.9gag.com/u/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cbr": { + "tags": [ + "forum" + ], + "engine": "vBulletin", + "urlMain": "https://community.cbr.com", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true, + "protection": [ + "tls_fingerprint" + ] + }, + "Ladies": { + "tags": [ + "forum", + "ua" + ], + "engine": "phpBB", + "urlMain": "http://ladies.zp.ua", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Imgflip": { + "checkType": "message", + "absenceStrs": [ + "\t\t

404 Page Not Found

\r", + "404 Page Not Found\r", + "info-page ibox", + "\t\t

Or maybe the Were you looking for the ItemFix - Channel: " + ], + "presenseStrs": [ + "user_token" + ], + "url": "https://www.itemfix.com/c/{username}", + "urlMain": "https://www.itemfix.com", + "usernameClaimed": "William_Pickton", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "video" + ], + "alexaRank": 5611 + }, + "Designs99": { + "absenceStrs": [ + "mobile-only" + ], + "presenseStrs": [ + "profileUrl" + ], + "url": "https://99designs.com/profiles/{username}", + "urlMain": "https://99designs.com", + "usernameClaimed": "t6s", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "design", + "photo" + ], + "alexaRank": 4509 + }, + "4x4.tomsk.ru": { + "urlMain": "http://4x4.tomsk.ru", + "usernameClaimed": "ale", + "usernameUnclaimed": "noonewouldeverusethis7", + "engine": "phpBB/Search", + "tags": [ + "auto", + "forum", + "ru" + ] + }, + "mama.tomsk.ru": { + "urlMain": "https://mama.tomsk.ru/forums", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "LibraryThing": { + "protection": [ + "cf_js_challenge", + "tls_fingerprint" + ], + "tags": [ + "books" + ], + "checkType": "message", + "absenceStrs": [ + "

Error: This user doesn't exist

" + ], + "alexaRank": 4462, + "urlMain": "https://www.librarything.com/", + "url": "https://www.librarything.com/profile/{username}", + "usernameClaimed": "Joeylynn_M_Arkels", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "iXBT": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Простите, но участник" + ], + "urlMain": "https://forum.ixbt.com", + "url": "https://forum.ixbt.com/users.cgi?id=info:{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "discourse.haskell.org": { + "engine": "DiscourseJson", + "tags": [ + "coding", + "forum", + "za" + ], + "protection": [ + "tls_fingerprint" + ], + "urlMain": "https://discourse.haskell.org", + "usernameClaimed": "philipgaudreau", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kongregate": { + "tags": [ + "gaming" + ], + "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", + "checkType": "message", + "absenceStrs": [ + "Sorry, no account with that name was found." + ], + "alexaRank": 4591, + "urlMain": "https://www.kongregate.com/", + "url": "https://www.kongregate.com/accounts/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Freesound": { + "tags": [ + "music" + ], + "checkType": "status_code", + "alexaRank": 4559, + "urlMain": "https://freesound.org/", + "url": "https://freesound.org/people/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "forums.sandisk.com": { + "urlMain": "https://forums.sandisk.com", + "engine": "Discourse", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "AlternativeTo": { + "tags": [ + "tech" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "protection": [ + "tls_fingerprint" + ], + "alexaRank": 4645, + "urlMain": "https://alternativeto.net/", + "url": "https://alternativeto.net/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Periscope": { + "checkType": "message", + "absenceStrs": [ + "error-fill" + ], + "presenseStrs": [ + "profile", + "ProfileAuthor", + "ProfileUsername" + ], + "url": "https://www.pscp.tv/{username}", + "urlMain": "https://www.pscp.tv", + "usernameClaimed": "moonlitraven", + "usernameUnclaimed": "higfjqmiez", + "alexaRank": 4547, + "tags": [ + "streaming", + "video" + ] + }, + "discourse.jupyter.org": { + "engine": "DiscourseJson", + "urlMain": "https://discourse.jupyter.org", + "protection": [ + "tls_fingerprint" + ], + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "jp" + ] + }, + "Pikabu": { + "tags": [ + "ru", + "sharing", + "social" + ], + "checkType": "status_code", + "alexaRank": 4911, + "urlMain": "https://pikabu.ru/", + "url": "https://pikabu.ru/@{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CORSAIR": { + "urlSubpath": "/v3", + "disabled": true, + "tags": [ + "forum" + ], + "presenseStrs": [ + "reputation_alexaRank" + ], + "engine": "vBulletin", + "urlMain": "https://forum.corsair.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lichess": { + "checkType": "message", + "absenceStrs": [ + "page-small box box-pad page", + ">

No such player

This username doesn", + "})()", + "IR0Cf7qpkpcOhvI9r03a0QbI" + ], + "alexaRank": 4926, + "urlMain": "https://lichess.org", + "url": "https://lichess.org/@/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "efxvyhnwrh", + "tags": [ + "gaming", + "hobby" + ], + "presenseStrs": [ + "us_profile", + "og:title", + "profile-side", + " data-username=", + "og:site_name" + ] + }, + "Speedrun.com": { + "protection": [ + "cf_js_challenge", + "tls_fingerprint" + ], + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "Not found - Speedrun" + ], + "presenseStrs": [ + "\"user\":{\"id\":\"" + ], + "alexaRank": 4985, + "urlMain": "https://speedrun.com/", + "url": "https://speedrun.com/users/{username}", + "usernameClaimed": "3Tau", + "usernameUnclaimed": "noonewould" + }, + "F6S": { + "tags": [ + "business" + ], + "disabled": true, + "protection": [ + "custom_bot_protection" + ], + "errors": { + "custom-page-main-frontpage-captcha": "Captcha detected", + "Checking your browser": "Anti-bot challenge" + }, + "checkType": "message", + "absenceStrs": [ + "Nothing to see here - 404" + ], + "presenseStrs": [ + "profile-heading" + ], + "headers": { + "Accept-Language": "en-US,en;q=0.5", + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0" + }, + "alexaRank": 4989, + "urlMain": "https://f6s.com/", + "url": "https://www.f6s.com/{username}", + "usernameClaimed": "vidheeshnacode", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "club.cnews.ru": { + "disabled": true, + "tags": [ + "blog", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не найден", + "Страница не найдена" + ], + "urlMain": "https://club.cnews.ru/", + "url": "https://club.cnews.ru/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Boosty": { + "url": "https://boosty.to/{username}", + "urlProbe": "https://api.boosty.to/v1/blog/{username}", + "urlMain": "https://boosty.to", + "checkType": "message", + "presenseStrs": [ + "\"id\":" + ], + "absenceStrs": [ + "blog_not_found" + ], + "usernameClaimed": "soxoj", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "ru" + ], + "alexaRank": 5124 + }, + "Soup": { + "tags": [ + "blog" + ], + "checkType": "response_url", + "alexaRank": 5210, + "urlMain": "https://soup.io", + "url": "https://www.soup.io/author/{username}", + "usernameClaimed": "cristina", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "adblockplus.org": { + "tags": [ + "tech" + ], + "checkType": "message", + "presenseStrs": [ + "searchresults", + " postprofile" + ], + "absenceStrs": [ + "No suitable matches were found." + ], + "url": "https://adblockplus.org/forum/search.php?keywords=&terms=all&author={username}", + "urlMain": "https://adblockplus.org", + "usernameClaimed": "totojitu", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 5215 + }, + "LiverpoolFC": { + "tags": [ + "forum", + "za" + ], + "checkType": "message", + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "urlMain": "https://forums.liverpoolfc.com", + "url": "https://forums.liverpoolfc.com/members/?username={username}", + "usernameClaimed": "jannno", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "doctissimo": { + "tags": [ + "fr" + ], + "checkType": "status_code", + "urlMain": "https://club.doctissimo.fr", + "url": "https://club.doctissimo.fr/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hackster": { + "tags": [ + "tech" + ], + "checkType": "status_code", + "alexaRank": 5250, + "urlMain": "https://www.hackster.io", + "url": "https://www.hackster.io/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dreamwidth": { + "disabled": true, + "protection": [ + "aws_waf_js_challenge" + ], + "tags": [ + "blog" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "isn't currently registered" + ], + "alexaRank": 5354, + "urlMain": "https://dreamwidth.org/profile", + "url": "https://{username}.dreamwidth.org/profile", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Xvideos": { + "tags": [ + "porn" + ], + "checkType": "status_code", + "alexaRank": 5368, + "urlMain": "https://xvideos.com/", + "url": "https://xvideos.com/profiles/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nintendo Life": { + "url": "https://www.nintendolife.com/users/{username}", + "urlMain": "https://www.nintendolife.com/", + "checkType": "status_code", + "usernameClaimed": "goku", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "gaming" + ], + "alexaRank": 5670, + "protection": [ + "cf_firewall" + ] + }, + "Fur Affinity": { + "checkType": "message", + "absenceStrs": [ + ">The username ", + " could not be found.

", + "standardpage", + "redirect-message", + "section-body alignleft" + ], + "presenseStrs": [ + "og:title", + "display:flex", + "user-title", + " />" + ], + "alexaRank": 5887, + "urlMain": "https://segmentfault.com/", + "url": "https://segmentfault.com/u/{username}", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Untappd": { + "tags": [ + "geosocial", + "networking" + ], + "checkType": "status_code", + "alexaRank": 5879, + "urlMain": "https://untappd.com", + "url": "https://untappd.com/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "eBaumsWorld": { + "tags": [ + "news" + ], + "checkType": "status_code", + "alexaRank": 6037, + "urlMain": "https://www.ebaumsworld.com/", + "url": "https://www.ebaumsworld.com/user/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Alabay": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Зарегистрирован:" + ], + "urlMain": "https://alabay.forum24.ru", + "url": "https://alabay.forum24.ru/?32-{username}", + "usernameClaimed": "asian", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Jer.forum24.ru": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Зарегистрирован:" + ], + "urlMain": "http://jer.forum24.ru", + "url": "http://jer.forum24.ru/?32-{username}", + "usernameClaimed": "aga", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "KubanForum24": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Зарегистрирован:" + ], + "urlMain": "https://kuban.forum24.ru/", + "url": "https://kuban.forum24.ru/?32-{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Uaksu": { + "tags": [ + "forum", + "ru", + "ua" + ], + "checkType": "message", + "presenseStrs": [ + "Зарегистрирован:" + ], + "urlMain": "https://uaksu.forum24.ru/", + "url": "https://uaksu.forum24.ru/?32-{username}", + "usernameClaimed": "nikita", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Volkodavcaoko": { + "tags": [ + "forum", + "kz", + "ru", + "ua" + ], + "checkType": "message", + "presenseStrs": [ + "Зарегистрирован:" + ], + "urlMain": "https://volkodavcaoko.forum24.ru", + "url": "https://volkodavcaoko.forum24.ru/?32-{username}", + "usernameClaimed": "itaka", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "microcap.forum24.ru": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Зарегистрирован:" + ], + "urlMain": "https://microcap.forum24.ru", + "url": "https://microcap.forum24.ru/?32-{username}", + "usernameClaimed": "asuus", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Velog": { + "url": "https://velog.io/@{username}/posts", + "urlMain": "https://velog.io/", + "checkType": "status_code", + "usernameClaimed": "qlgks1", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 6440, + "tags": [ + "blog", + "coding", + "kr" + ] + }, + "Tinkoff Invest": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "canonical\" href=\"https://www.tbank.ru/invest/social/profile/" + ], + "urlMain": "https://www.tbank.ru/invest/", + "url": "https://www.tbank.ru/invest/social/profile/{username}/", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "adam", + "alexaRank": 6065 + }, + "Anobii": { + "disabled": true, + "absenceStrs": [ + ">{}" + ], + "presenseStrs": [ + "og:site_name" + ], + "url": "https://www.anobii.com/{username}/profile/activity", + "urlMain": "https://www.anobii.com", + "usernameClaimed": "jjordan", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "books" + ], + "alexaRank": 6360 + }, + "N8n Community": { + "url": "https://community.n8n.io/u/{username}/summary", + "urlMain": "https://community.n8n.io/", + "checkType": "status_code", + "usernameClaimed": "n8n", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "RapidAPI": { + "urlSubpath": "/blog", + "disabled": true, + "tags": [ + "coding" + ], + "engine": "Wordpress/Author", + "urlMain": "https://rapidapi.com", + "usernameClaimed": "patrickr", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 6043 + }, + "Fanpop": { + "disabled": true, + "tags": [ + "discussion" + ], + "checkType": "response_url", + "alexaRank": 6298, + "urlMain": "https://www.fanpop.com/", + "url": "https://www.fanpop.com/fans/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ccmixter": { + "disabled": true, + "tags": [ + "music" + ], + "checkType": "message", + "absenceStrs": [ + "ERROR(2)", + "Sorry, we don't know who that is..." + ], + "presenseStrs": [ + "Member since" + ], + "alexaRank": 6201, + "urlMain": "http://ccmixter.org/", + "url": "http://ccmixter.org/people/{username}/profile", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Minds": { + "tags": [ + "in", + "social" + ], + "checkType": "message", + "urlProbe": "https://www.minds.com/api/v1/channel/{username}", + "presenseStrs": [ + "\"status\":\"success\"" + ], + "absenceStrs": [ + "ChannelNotFoundException" + ], + "urlMain": "https://www.minds.com", + "url": "https://www.minds.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 6295 + }, + "MercadoLivre": { + "tags": [ + "br" + ], + "checkType": "message", + "protection": [ + "tls_fingerprint" + ], + "absenceStrs": [ + "Parece que esta página não existe", + "Este usuário foi temporariamente desativado ou excluído" + ], + "alexaRank": 6320, + "urlMain": "https://www.mercadolivre.com.br", + "url": "https://www.mercadolivre.com.br/perfil/{username}", + "usernameClaimed": "KABUM", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "Morguefile": { + "disabled": true, + "protection": [ + "cf_js_challenge" + ], + "absenceStrs": [ + "free photographs for commercial use" + ], + "presenseStrs": [ + "sortName", + " profile-data" + ], + "url": "https://morguefile.com/creative/{username}", + "urlMain": "https://morguefile.com", + "usernameClaimed": "thesuccess", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "photo" + ], + "alexaRank": 6409 + }, + "Tinder": { + "tags": [ + "dating" + ], + "checkType": "message", + "absenceStrs": [ + "twitter:title\" content=\"Tinder |", + "Tinder |", + "<title data-react-helmet=\"true\">" + ], + "alexaRank": 6359, + "urlMain": "https://tinder.com/", + "url": "https://www.tinder.com/@{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kali community": { + "tags": [ + "forum" + ], + "errors": { + "You are not logged in or you do not have permission to access this page.": "Auth required" + }, + "engine": "vBulletin", + "urlMain": "https://forums.kali.org/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "DTF": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Страница не найдена " + ], + "alexaRank": 6272, + "urlMain": "https://dtf.ru", + "url": "https://dtf.ru/search/v2/subsite/relevant?query={username}&strict=1", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "steamdb.info": { + "tags": [ + "gaming" + ], + "type": "steam_id", + "checkType": "message", + "presenseStrs": [ + "profileForm", + " player-name", + " progress", + " data-not-game=" + ], + "absenceStrs": [ + "error-page", + " Error 404" + ], + "urlMain": "https://steamdb.info", + "url": "https://steamdb.info/calculator/{username}", + "source": "Steam", + "usernameClaimed": "76561197978866368", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 6674 + }, + "volga-gaz.nnov.ru": { + "urlMain": "http://volga-gaz.nnov.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "247sports": { + "disabled": true, + "tags": [ + "news", + "sport" + ], + "checkType": "status_code", + "alexaRank": 6845, + "urlMain": "https://247sports.com", + "url": "https://247sports.com/user/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "domestika.org": { + "tags": [ + "education" + ], + "checkType": "status_code", + "usernameClaimed": "zenzuke", + "usernameUnclaimed": "noonewouldeverusethis7", + "urlMain": "https://www.domestika.org", + "url": "https://www.domestika.org/{username}", + "alexaRank": 6479 + }, + "Setlist": { + "tags": [ + "music" + ], + "checkType": "message", + "presenseStrs": [ + "s setlist.fm | setlist.fm" + ], + "absenceStrs": [ + "Sorry, the page you requested doesn't exist" + ], + "alexaRank": 6613, + "urlMain": "https://www.setlist.fm", + "url": "https://www.setlist.fm/user/{username}", + "usernameClaimed": "bendobrin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "boards.straightdope.com": { + "urlMain": "https://boards.straightdope.com", + "engine": "Discourse", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "protection": [ + "custom_bot_protection" + ] + }, + "Tweakers": { + "url": "https://tweakers.net/gallery/{username}", + "urlMain": "https://tweakers.net", + "checkType": "status_code", + "usernameClaimed": "femme", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 6836, + "tags": [ + "nl", + "tech" + ] + }, + "Destructoid": { + "disabled": true, + "tags": [ + "gaming", + "news" + ], + "checkType": "message", + "absenceStrs": [ + "Error in query" + ], + "alexaRank": 6841, + "urlMain": "https://www.destructoid.com", + "url": "https://www.destructoid.com/?name={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forums.destructoid.com": { + "urlMain": "https://forums.destructoid.com", + "engine": "XenForo", + "usernameClaimed": "olibriss", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Star Citizen": { + "tags": [ + "gaming" + ], + "checkType": "status_code", + "alexaRank": 6720, + "urlMain": "https://robertsspaceindustries.com/", + "url": "https://robertsspaceindustries.com/citizens/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Star Citizens Community": { + "tags": [ + "gaming" + ], + "checkType": "status_code", + "urlMain": "https://robertsspaceindustries.com/", + "url": "https://robertsspaceindustries.com/community-hub/user/{username}", + "usernameClaimed": "SentinelTheFirst", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 6720 + }, + "Start.me": { + "checkType": "message", + "presenseStrs": [ + "data-vmid=\"og:title\"" + ], + "absenceStrs": [ + "Page not found" + ], + "urlMain": "https://start.me", + "url": "https://start.me/u/{username}", + "usernameClaimed": "technisette", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Kick": { + "protection": [ + "tls_fingerprint" + ], + "url": "https://kick.com/{username}", + "urlMain": "https://kick.com/", + "urlProbe": "https://kick.com/api/v2/channels/{username}", + "checkType": "status_code", + "usernameClaimed": "xqc", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 6474, + "tags": [ + "streaming" + ] + }, + "antihack.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://antihack.ucoz.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mirmuzyki.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://mirmuzyki.ucoz.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mistral.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://mistral.ucoz.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "medkniga.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://medkniga.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "pankreatitu.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://pankreatitu.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ikorovka.ucoz.net": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://ikorovka.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "rabotenka.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://rabotenka.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "abc-accounting.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://abc-accounting.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "rapbeat.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://rapbeat.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "litgeroy.ucoz.net": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://litgeroy.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "mediatv.ucoz.net": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://mediatv.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "vega.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://vega.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "iptv-free.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://iptv-free.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "vip-icq.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://vip-icq.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "xitlar.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://xitlar.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "trays.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://trays.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "tags": [ + "forum", + "ru" + ] + }, + "naruto-fan.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://naruto-fan.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "shporgalki.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://shporgalki.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "5level.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://5level.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "azhack.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://azhack.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "hevc-club.ucoz.net": { + "engine": "uCoz", + "urlMain": "http://hevc-club.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "forum4.ucoz.net": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://forum4.ucoz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "tags": [ + "forum" + ] + }, + "Noblogs": { + "tags": [ + "blog" + ], + "checkType": "response_url", + "alexaRank": 6603, + "urlMain": "https://noblogs.org/", + "url": "https://{username}.noblogs.org/", + "usernameClaimed": "cavallette", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Namuwiki": { + "url": "https://namu.wiki/w/%EC%82%AC%EC%9A%A9%EC%9E%90:{username}", + "urlMain": "https://namu.wiki/", + "checkType": "status_code", + "usernameClaimed": "namu", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 7047, + "tags": [ + "kr", + "wiki" + ] + }, + "Cheezburger": { + "checkType": "response_url", + "urlMain": "https://profile.cheezburger.com", + "url": "https://profile.cheezburger.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forums.majorgeeks.com": { + "urlMain": "https://forums.majorgeeks.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "GaiaOnline": { + "tags": [ + "gaming", + "ro", + "social", + "us" + ], + "checkType": "message", + "absenceStrs": [ + "No user ID specified or user does not exist!" + ], + "alexaRank": 7132, + "urlMain": "https://www.gaiaonline.com/", + "url": "https://www.gaiaonline.com/profiles/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "0k.clan.su": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://0k.clan.su", + "usernameClaimed": "eruzz", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Club-comedy.clan.su": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "https://club-comedy.clan.su", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "fire-team.clan.su": { + "engine": "uCoz", + "urlMain": "http://fire-team.clan.su", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "l2-best.clan.su": { + "engine": "uCoz", + "urlMain": "http://l2-best.clan.su", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "warcraft3ft.clan.su": { + "engine": "uCoz", + "urlMain": "http://warcraft3ft.clan.su", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "wowpaksi.clan.su": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://wowpaksi.clan.su", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ilan.clan.su": { + "engine": "uCoz", + "urlMain": "http://ilan.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "shkolnikov.clan.su": { + "engine": "uCoz", + "urlMain": "http://shkolnikov.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "manuals.clan.su": { + "engine": "uCoz", + "urlMain": "http://manuals.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "app.clan.su": { + "engine": "uCoz", + "urlMain": "http://app.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "grigorovo.clan.su": { + "engine": "uCoz", + "urlMain": "http://grigorovo.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "mariupol4x4.clan.su": { + "engine": "uCoz", + "urlMain": "http://mariupol4x4.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ua" + ] + }, + "necromancers.clan.su": { + "engine": "uCoz", + "urlMain": "http://necromancers.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "komarovo.clan.su": { + "engine": "uCoz", + "urlMain": "http://komarovo.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "kino-hit.clan.su": { + "engine": "uCoz", + "urlMain": "http://kino-hit.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "gsm-standart.clan.su": { + "engine": "uCoz", + "urlMain": "http://gsm-standart.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "fareast.clan.su": { + "engine": "uCoz", + "urlMain": "http://fareast.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "cybers.clan.su": { + "engine": "uCoz", + "urlMain": "http://cybers.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "nod32-forever.clan.su": { + "engine": "uCoz", + "urlMain": "http://nod32-forever.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "obmanunet.clan.su": { + "engine": "uCoz", + "urlMain": "http://obmanunet.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "spygaming.clan.su": { + "engine": "uCoz", + "urlMain": "http://spygaming.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "japara.clan.su": { + "engine": "uCoz", + "urlMain": "http://japara.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "symbian9.clan.su": { + "engine": "uCoz", + "urlMain": "http://symbian9.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "love-magic.clan.su": { + "engine": "uCoz", + "urlMain": "http://love-magic.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "vip-cccp.clan.su": { + "engine": "uCoz", + "urlMain": "http://vip-cccp.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "tvigra.clan.su": { + "engine": "uCoz", + "urlMain": "http://tvigra.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "music2dj.clan.su": { + "engine": "uCoz", + "urlMain": "http://music2dj.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "margaritas.clan.su": { + "engine": "uCoz", + "urlMain": "http://margaritas.clan.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "Jigsawplanet": { + "tags": [ + "gaming" + ], + "checkType": "status_code", + "alexaRank": 6928, + "urlMain": "https://www.jigsawplanet.com", + "url": "https://www.jigsawplanet.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Muse Score": { + "url": "https://musescore.com/{username}", + "urlMain": "https://musescore.com/", + "protection": [ + "cf_js_challenge" + ], + "checkType": "status_code", + "usernameClaimed": "arrangeme", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 7435, + "requestMethod": "GET", + "tags": [ + "music" + ] + }, + "community.getpostman.com": { + "engine": "DiscourseJson", + "tags": [ + "forum", + "tech" + ], + "urlMain": "https://community.getpostman.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "system" + }, + "AskFM": { + "disabled": true, + "tags": [ + "eg", + "in", + "ru", + "social" + ], + "regexCheck": "^[a-zA-Z0-9_]{3,40}$", + "checkType": "message", + "absenceStrs": [ + "Well, apparently not anymore." + ], + "alexaRank": 7220, + "urlMain": "https://ask.fm/", + "url": "https://ask.fm/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "PlanetMinecraft": { + "protection": [ + "cf_js_challenge", + "tls_fingerprint" + ], + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "Hmm, it seems that you've come across an invalid username", + "404 Not Found", + "Member Not Found" + ], + "presenseStrs": [ + "profile on Planet Minecraft to see their public Minecraft community activity" + ], + "alexaRank": 7412, + "urlMain": "https://www.planetminecraft.com", + "url": "https://www.planetminecraft.com/member/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "lnk.bio": { + "absenceStrs": [ + "Not Found - Lnk.Bio" + ], + "presenseStrs": [ + "data-username" + ], + "url": "https://lnk.bio/{username}", + "urlMain": "https://lnk.bio", + "usernameClaimed": "tamirawill", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "links" + ], + "alexaRank": 7152 + }, + "Rutracker": { + "tags": [ + "ru", + "torrent" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не найден" + ], + "presenseStrs": [ + "Профиль пользователя" + ], + "alexaRank": 7306, + "urlMain": "https://rutracker.org/", + "mirrors": [ + "https://rutracker.org/", + "http://37.1.216.121/" + ], + "url": "{urlMain}forum/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "rt20.getbb.ru": { + "urlMain": "http://www.rt20.getbb.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "rt21.getbb.ru": { + "urlMain": "http://www.rt21.getbb.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "mssg.me": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 7736, + "urlMain": "https://mssg.me", + "url": "https://mssg.me/{username}", + "usernameClaimed": "siamparagon", + "usernameUnclaimed": "asadasdsd" + }, + "Kwork": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 6852, + "urlMain": "https://www.kwork.ru/", + "url": "https://kwork.ru/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nairaland Forum": { + "tags": [ + "ng" + ], + "checkType": "message", + "presenseStrs": [ + "Time registered" + ], + "absenceStrs": [ + "404: Page Not Found." + ], + "alexaRank": 7846, + "urlMain": "https://www.nairaland.com/", + "url": "https://www.nairaland.com/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Memrise": { + "tags": [ + "education" + ], + "checkType": "status_code", + "alexaRank": 7331, + "urlMain": "https://www.memrise.com/", + "url": "https://www.memrise.com/user/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "We Heart It": { + "tags": [ + "blog", + "photo" + ], + "checkType": "message", + "absenceStrs": [ + "Oops! You've landed on a moving target!" + ], + "alexaRank": 7615, + "urlMain": "https://weheartit.com/", + "url": "https://weheartit.com/{username}", + "usernameClaimed": "ventivogue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Americanthinker": { + "checkType": "message", + "absenceStrs": [ + "American Thinker" + ], + "presenseStrs": [ + "Articles:" + ], + "urlMain": "https://www.americanthinker.com/", + "url": "https://www.americanthinker.com/author/{username}/", + "usernameClaimed": "monicashowalter", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 7519, + "tags": [ + "news", + "us" + ] + }, + "Yummly": { + "tags": [ + "us" + ], + "checkType": "message", + "presenseStrs": [ + "profileName" + ], + "alexaRank": 7503, + "urlMain": "https://www.yummly.com", + "url": "https://mapi.yummly.com/mapi/v19/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kaskus": { + "disabled": true, + "tags": [ + "id" + ], + "checkType": "status_code", + "alexaRank": 7713, + "urlMain": "https://www.kaskus.co.id", + "url": "https://www.kaskus.co.id/@{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ArchiveOfOurOwn": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "writing" + ], + "regexCheck": "^[a-zA-Z0-9_]{3,40}$", + "checkType": "response_url", + "alexaRank": 7405, + "urlMain": "https://archiveofourown.org", + "url": "https://archiveofourown.org/users/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forums.steinberg.net": { + "engine": "DiscourseJson", + "urlMain": "https://forums.steinberg.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "RubyGems": { + "tags": [ + "coding" + ], + "checkType": "status_code", + "alexaRank": 7555, + "urlMain": "https://rubygems.org/", + "url": "https://rubygems.org/profiles/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "av.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://av.3dn.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ekzoticsad.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://ekzoticsad.3dn.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "jog.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://jog.3dn.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "salavat.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://salavat.3dn.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "socforum.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://socforum.3dn.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "soft-wm.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://soft-wm.3dn.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "warframe.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://warframe.3dn.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "websecurity.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://websecurity.3dn.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "1klas.3dn.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://1klas.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "mytrans.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://mytrans.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "vracing.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://vracing.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john", + "tags": [ + "ru" + ] + }, + "team-pros.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://team-pros.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "sherwood.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://sherwood.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "christian-video.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://christian-video.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "movies", + "ru" + ] + }, + "haogan.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://haogan.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "muzika.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://muzika.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "golasa-vk-free.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://golasa-vk-free.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "440101.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://440101.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "online-movies.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://online-movies.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "lock.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://lock.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "vch3469.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://vch3469.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "tmk.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://tmk.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "gt-garazh.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://gt-garazh.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "partner.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://partner.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "sony127.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://sony127.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "metroman.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://metroman.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "karkulis.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://karkulis.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ibmt.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://ibmt.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "baltnethub.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://baltnethub.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "9interi.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://9interi.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "webdom.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://webdom.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "softgame.3dn.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://softgame.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "sayty.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://sayty.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "binhot.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://binhot.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "nicemusic.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://nicemusic.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "dvk-style.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://dvk-style.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "razborka-japan.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://razborka-japan.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "jump.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://jump.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "prosmart.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://prosmart.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "patent.3dn.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://patent.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "tgi.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://tgi.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ourfunnypets.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://ourfunnypets.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "focus-pocus.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://focus-pocus.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "resource-mta.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://resource-mta.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "softal.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://softal.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "shkola3.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://shkola3.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "grodnofish.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://grodnofish.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "viupetra.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://viupetra.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "portal-cs-1-6.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://portal-cs-1-6.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "wmmail-wmmail.3dn.ru": { + "engine": "uCoz", + "urlMain": "http://wmmail-wmmail.3dn.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "TheOdysseyOnline": { + "tags": [ + "blog" + ], + "checkType": "status_code", + "alexaRank": 7674, + "urlMain": "https://www.theodysseyonline.com", + "url": "https://www.theodysseyonline.com/user/@{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "WebNode": { + "tags": [ + "cz" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "alexaRank": 7590, + "urlMain": "https://www.webnode.cz/", + "url": "https://{username}.webnode.cz/", + "usernameClaimed": "radkabalcarova", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ColourLovers": { + "disabled": true, + "tags": [ + "design" + ], + "engine": "engine404", + "urlMain": "http://colourlovers.com", + "url": "http://colourlovers.com/lover/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 7913 + }, + "Wowhead": { + "tags": [ + "gaming" + ], + "checkType": "status_code", + "urlMain": "https://www.wowhead.com", + "url": "https://www.wowhead.com/user={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 8090, + "protection": [ + "custom_bot_protection" + ] + }, + "Aptoide": { + "tags": [ + "apps" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "presenseStrs": [ + "BreadcrumbList" + ], + "urlMain": "https://en.aptoide.com/", + "url": "https://{username}.en.aptoide.com/", + "usernameClaimed": "kodi", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "PeriscopeMain": { + "tags": [ + "streaming", + "video" + ], + "disabled": true, + "checkType": "status_code", + "alexaRank": 7729, + "urlMain": "https://www.periscope.tv/", + "url": "https://www.periscope.tv/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sports.ru": { + "tags": [ + "ru", + "sport" + ], + "checkType": "status_code", + "alexaRank": 7886, + "urlMain": "https://www.sports.ru/", + "url": "https://www.sports.ru/profile/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rodgersforum": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Зарегистрирован:" + ], + "urlMain": "https://rodgersforum.borda.ru", + "url": "https://rodgersforum.borda.ru/?32-{username}", + "usernameClaimed": "hata1979", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Starsonice": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "профиль забанен или удален" + ], + "urlMain": "https://starsonice.borda.ru", + "url": "https://starsonice.borda.ru/?32-{username}", + "usernameClaimed": "kara", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Terminatorium": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "профиль забанен или удален" + ], + "urlMain": "https://terminatorium.borda.ru/", + "url": "https://terminatorium.borda.ru/?32-{username}", + "usernameClaimed": "tengu", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "banki.ru": { + "disabled": true, + "tags": [ + "finance", + "ru" + ], + "engine": "engine404", + "urlMain": "https://banki.ru", + "url": "https://banki.ru/blog/{username}/", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 7904 + }, + "SkyscraperCity": { + "disabled": true, + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 8061, + "urlMain": "https://www.skyscrapercity.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Drive2": { + "tags": [ + "ru" + ], + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "urlMain": "https://www.drive2.ru/", + "url": "https://www.drive2.ru/users/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 8084 + }, + "Empowher": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "medicine" + ], + "checkType": "status_code", + "alexaRank": 8124, + "urlMain": "https://www.empowher.com", + "url": "https://www.empowher.com/users/{username}", + "usernameClaimed": "susanc", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "liza.my1.ru": { + "engine": "uCoz", + "urlMain": "http://liza.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "movi.my1.ru": { + "engine": "uCoz", + "urlMain": "http://movi.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "morozovka.my1.ru": { + "engine": "uCoz", + "urlMain": "http://morozovka.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "letitbit-film.my1.ru": { + "engine": "uCoz", + "urlMain": "http://letitbit-film.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "electroprom.my1.ru": { + "engine": "uCoz", + "urlMain": "http://electroprom.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "zareshetkoi.my1.ru": { + "engine": "uCoz", + "urlMain": "http://zareshetkoi.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "liderdzr.my1.ru": { + "engine": "uCoz", + "urlMain": "http://liderdzr.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "kotik.my1.ru": { + "engine": "uCoz", + "urlMain": "http://kotik.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "crossfaernet.my1.ru": { + "engine": "uCoz", + "urlMain": "http://crossfaernet.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "videhelp-comp.my1.ru": { + "engine": "uCoz", + "urlMain": "http://videhelp-comp.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "novomoskovsk.my1.ru": { + "engine": "uCoz", + "urlMain": "http://novomoskovsk.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "music-one.my1.ru": { + "engine": "uCoz", + "urlMain": "http://music-one.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "coins.my1.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://coins.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "tsibulskiy.my1.ru": { + "engine": "uCoz", + "urlMain": "http://tsibulskiy.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "theatre.my1.ru": { + "engine": "uCoz", + "urlMain": "http://theatre.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "wwork.my1.ru": { + "engine": "uCoz", + "urlMain": "http://wwork.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "fly.my1.ru": { + "engine": "uCoz", + "urlMain": "http://fly.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "animelend.my1.ru": { + "engine": "uCoz", + "urlMain": "http://animelend.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "art-nata.my1.ru": { + "tags": [ + "kz" + ], + "engine": "uCoz", + "urlMain": "http://art-nata.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "vsemobile.my1.ru": { + "engine": "uCoz", + "urlMain": "http://vsemobile.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "art-color.my1.ru": { + "engine": "uCoz", + "urlMain": "http://art-color.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "histroom.my1.ru": { + "engine": "uCoz", + "urlMain": "http://histroom.my1.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "Fotki": { + "absenceStrs": [ + "'404 - Member Not Found'" + ], + "presenseStrs": [ + "profile-cities", + "profile-friends", + "profile-aboutme", + "profile-country", + "user_profile_info" + ], + "url": "https://members.fotki.com/{username}/about/", + "urlMain": "https://fotki.com", + "usernameClaimed": "normargab", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "photo" + ], + "alexaRank": 8247 + }, + "Armorgames": { + "tags": [ + "gaming" + ], + "checkType": "response_url", + "alexaRank": 8163, + "urlMain": "https://armorgames.com", + "url": "https://armorgames.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Code Sandbox": { + "disabled": true, + "url": "https://codesandbox.io/u/{username}", + "urlMain": "https://codesandbox.io", + "urlProbe": "https://codesandbox.io/api/v1/users/{username}", + "checkType": "message", + "absenceStrs": [ + "Could not find user with username" + ], + "regexCheck": "^[a-zA-Z0-9_-]{3,30}$", + "usernameClaimed": "icyjoseph", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding" + ], + "alexaRank": 8050, + "protection": [ + "cf_js_challenge" + ] + }, + "Kinja": { + "tags": [ + "blog" + ], + "disabled": true, + "checkType": "status_code", + "alexaRank": 8265, + "urlMain": "https://kinja.com", + "url": "https://kinja.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Picsart": { + "tags": [ + "photo" + ], + "checkType": "message", + "presenseStrs": [ + "\"status\":\"success\"" + ], + "absenceStrs": [ + "user_not_found" + ], + "alexaRank": 8046, + "urlMain": "https://picsart.com/", + "url": "https://picsart.com/u/{username}", + "urlProbe": "https://api.picsart.com/users/show/{username}.json", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DSLReports": { + "disabled": true, + "tags": [ + "us" + ], + "checkType": "message", + "presenseStrs": [ + "Kudos Received" + ], + "absenceStrs": [ + "alert:" + ], + "alexaRank": 8234, + "urlMain": "https://www.dslreports.com", + "url": "https://www.dslreports.com/profile/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Paltalk": { + "tags": [ + "messaging" + ], + "checkType": "message", + "absenceStrs": [ + "

Sorry, the profile you were looking for was not found

" + ], + "presenseStrs": [ + ">Member since " + ], + "alexaRank": 8414, + "urlMain": "https://www.paltalk.com", + "url": "https://www.paltalk.com/people/users/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ccm": { + "tags": [ + "fr" + ], + "checkType": "status_code", + "alexaRank": 8568, + "urlMain": "https://ccm.net", + "url": "https://ccm.net/profile/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "NICommunityForum": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://www.native-instruments.com/forum/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis", + "alexaRank": 8514 + }, + "Rate Your Music": { + "disabled": true, + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "music" + ], + "checkType": "status_code", + "alexaRank": 8580, + "urlMain": "https://rateyourmusic.com/", + "url": "https://rateyourmusic.com/~{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "authorSTREAM": { + "disabled": true, + "tags": [ + "documents", + "in", + "sharing" + ], + "checkType": "status_code", + "alexaRank": 8740, + "urlMain": "http://www.authorstream.com/", + "url": "http://www.authorstream.com/author/{username}/", + "usernameClaimed": "roxanne", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Airliners": { + "disabled": true, + "protection": [ + "ip_reputation" + ], + "tags": [ + "hobby", + "photo" + ], + "checkType": "status_code", + "alexaRank": 8777, + "urlMain": "https://www.airliners.net/", + "url": "https://www.airliners.net/user/{username}/profile/photos", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VideoHive": { + "absenceStrs": [ + "Page Not Found | VideoHive" + ], + "presenseStrs": [ + "user-info", + "user-info__badges" + ], + "url": "https://videohive.net/user/{username}", + "urlMain": "https://videohive.net", + "usernameClaimed": "theabbie", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 8681, + "tags": [ + "video" + ] + }, + "forum.snapcraft.io": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forum.snapcraft.io", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "xHamster": { + "tags": [ + "porn" + ], + "checkType": "message", + "presenseStrs": [ + "user-info-section" + ], + "absenceStrs": [ + "User not found" + ], + "alexaRank": 9152, + "urlMain": "https://xhamster.com", + "url": "https://xhamster.com/users/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "xenforo.com": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://xenforo.com/community/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 8976 + }, + "asecurity.do.am": { + "engine": "uCoz", + "urlMain": "http://asecurity.do.am", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "dremel.do.am": { + "engine": "uCoz", + "urlMain": "http://dremel.do.am", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forex-trader.do.am": { + "engine": "uCoz", + "urlMain": "http://forex-trader.do.am", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ooo.do.am": { + "engine": "uCoz", + "urlMain": "http://ooo.do.am", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "puru.do.am": { + "engine": "uCoz", + "urlMain": "http://puru.do.am", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "78-3.do.am": { + "engine": "uCoz", + "urlMain": "http://78-3.do.am", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "yerkramas.do.am": { + "engine": "uCoz", + "urlMain": "http://yerkramas.do.am", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "russemya.do.am": { + "engine": "uCoz", + "urlMain": "http://russemya.do.am", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "kapusta.do.am": { + "engine": "uCoz", + "urlMain": "http://kapusta.do.am", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "marchenkov.do.am": { + "engine": "uCoz", + "urlMain": "http://marchenkov.do.am", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "fst-kolos.do.am": { + "engine": "uCoz", + "urlMain": "http://fst-kolos.do.am", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "tom.do.am": { + "engine": "uCoz", + "urlMain": "http://tom.do.am", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "Proza.ru": { + "tags": [ + "ru", + "writing" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "Автор не найден" + ], + "alexaRank": 8957, + "urlMain": "https://www.proza.ru/", + "url": "https://www.proza.ru/avtor/{username}", + "usernameClaimed": "gpola", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Clubhouse": { + "url": "https://www.clubhouse.com/@{username}", + "urlMain": "https://www.clubhouse.com", + "checkType": "status_code", + "usernameClaimed": "waniathar", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 8956, + "tags": [ + "social" + ] + }, + "blogs.klerk.ru": { + "presenseStrs": [ + "profile-links" + ], + "url": "https://blogs.klerk.ru/users/{username}/", + "urlMain": "https://blogs.klerk.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message" + }, + "AminoApp": { + "tags": [ + "br", + "social", + "us" + ], + "checkType": "status_code", + "alexaRank": 10073, + "urlMain": "https://aminoapps.com/", + "url": "https://aminoapps.com/u/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis77777", + "disabled": true + }, + "mycomputer.ks.ua": { + "engine": "uCoz", + "urlMain": "http://mycomputer.ks.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "disabled": true + }, + "andrei.moy.su": { + "engine": "uCoz", + "urlMain": "http://andrei.moy.su", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "antivirus.moy.su": { + "engine": "uCoz", + "urlMain": "http://antivirus.moy.su", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "atm-club.moy.su": { + "engine": "uCoz", + "urlMain": "http://atm-club.moy.su", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "infopps.moy.su": { + "engine": "uCoz", + "urlMain": "http://infopps.moy.su", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "moskovia.moy.su": { + "engine": "uCoz", + "urlMain": "http://moskovia.moy.su", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "zid.moy.su": { + "engine": "uCoz", + "urlMain": "http://zid.moy.su", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "prodigy.moy.su": { + "engine": "uCoz", + "urlMain": "http://prodigy.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "icq-bot.moy.su": { + "engine": "uCoz", + "urlMain": "http://icq-bot.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "96.moy.su": { + "engine": "uCoz", + "urlMain": "http://96.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "semenova-klass.moy.su": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://semenova-klass.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "gadjet.moy.su": { + "engine": "uCoz", + "urlMain": "http://gadjet.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "dushschool.moy.su": { + "engine": "uCoz", + "urlMain": "http://dushschool.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "school1065.moy.su": { + "engine": "uCoz", + "urlMain": "http://school1065.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "anime-grand.moy.su": { + "engine": "uCoz", + "urlMain": "http://anime-grand.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "school9korolev.moy.su": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://school9korolev.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "futajist-studio.moy.su": { + "engine": "uCoz", + "urlMain": "http://futajist-studio.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "schoolteacher.moy.su": { + "engine": "uCoz", + "urlMain": "http://schoolteacher.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "xyuivet-mailcpy.moy.su": { + "engine": "uCoz", + "urlMain": "http://xyuivet-mailcpy.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "dubrovo.moy.su": { + "engine": "uCoz", + "urlMain": "http://dubrovo.moy.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "Namepros": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 9234, + "urlMain": "https://www.namepros.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fark": { + "disabled": true, + "protection": [ + "cf_firewall" + ], + "tags": [ + "forum", + "news" + ], + "checkType": "message", + "absenceStrs": [ + "Tastes like chicken." + ], + "alexaRank": 9345, + "urlMain": "https://www.fark.com/", + "url": "https://www.fark.com/users/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Niftygateway": { + "urlProbe": "https://api.niftygateway.com/user/profile-and-offchain-nifties-by-url/?profile_url={username}", + "checkType": "message", + "presenseStrs": [ + "profile_url", + "name", + "profile_pic_url", + "verified", + "bio" + ], + "absenceStrs": [ + "not_found", + " User profile not located in our system." + ], + "urlMain": "https://api.niftygateway.com", + "url": "https://niftygateway.com/profile/{username}", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Globalvoices": { + "tags": [ + "news" + ], + "checkType": "message", + "absenceStrs": [ + "404 ERROR: PAGE NOT FOUND" + ], + "alexaRank": 8985, + "urlMain": "https://globalvoices.org", + "url": "https://globalvoices.org/author/{username}/", + "usernameClaimed": "7iber", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Championat": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 9602, + "urlMain": "https://www.championat.com/", + "url": "https://www.championat.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forums.bulbagarden.net": { + "disabled": true, + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "http://forums.bulbagarden.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Wykop": { + "tags": [ + "pl", + "social" + ], + "checkType": "status_code", + "alexaRank": 9735, + "urlMain": "https://www.wykop.pl", + "url": "https://www.wykop.pl/ludzie/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Warrior Forum": { + "tags": [ + "forum" + ], + "checkType": "status_code", + "alexaRank": 9592, + "urlMain": "https://www.warriorforum.com/", + "url": "https://www.warriorforum.com/members/{username}.html", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "FIFA FORUMS": { + "tags": [ + "forum", + "gb" + ], + "checkType": "status_code", + "urlMain": "https://fifaforums.easports.com/", + "url": "https://fifaforums.easports.com/en/profile/discussions/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "write.as": { + "tags": [ + "blog", + "writing" + ], + "checkType": "status_code", + "url": "https://write.as/{username}", + "urlMain": "https://write.as", + "usernameClaimed": "pylapp", + "usernameUnclaimed": "noonewouldeverusethis42", + "alexaRank": 9304 + }, + "Mstdn.social": { + "url": "https://mstdn.social/@{username}", + "urlMain": "https://mstdn.social/", + "checkType": "status_code", + "usernameClaimed": "MagicLike", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 9690, + "tags": [ + "social" + ] + }, + "Taringa": { + "disabled": true, + "tags": [ + "ar", + "social" + ], + "checkType": "message", + "presenseStrs": [ + "User", + " user-username", + " UserFeed" + ], + "absenceStrs": [ + "problema" + ], + "urlMain": "https://www.taringa.net", + "url": "https://www.taringa.net/{username}", + "usernameClaimed": "UniversoGIA", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 9751 + }, + "ResidentAdvisor": { + "tags": [ + "music" + ], + "checkType": "message", + "presenseStrs": [ + "You need to be logged in to view the profile" + ], + "absenceStrs": [ + "Forgot your password?" + ], + "alexaRank": 9903, + "urlMain": "https://www.residentadvisor.net", + "url": "https://www.residentadvisor.net/profile/{username}", + "usernameClaimed": "uncle_ohm", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Waveapps": { + "disabled": true, + "tags": [ + "ca" + ], + "checkType": "status_code", + "urlMain": "https://community.waveapps.com", + "url": "https://community.waveapps.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "JeuxVideo": { + "protection": [ + "cf_js_challenge", + "tls_fingerprint" + ], + "tags": [ + "fr", + "gaming" + ], + "checkType": "message", + "presenseStrs": [ + "Messages Forums" + ], + "absenceStrs": [ + "Vous êtes" + ], + "alexaRank": 10055, + "urlMain": "http://www.jeuxvideo.com", + "url": "http://www.jeuxvideo.com/profil/{username}?mode=infos", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Sporcle": { + "tags": [ + "gaming" + ], + "checkType": "status_code", + "alexaRank": 9943, + "urlMain": "https://www.sporcle.com/", + "url": "https://www.sporcle.com/user/{username}/people", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Coroflot": { + "tags": [ + "design" + ], + "checkType": "status_code", + "alexaRank": 10051, + "urlMain": "https://coroflot.com/", + "url": "https://www.coroflot.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Booth": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "jp", + "shopping" + ], + "checkType": "response_url", + "alexaRank": 9733, + "urlMain": "https://booth.pm/", + "url": "https://{username}.booth.pm/", + "errorUrl": "https://booth.pm/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Treehouse": { + "tags": [ + "coding", + "education" + ], + "disabled": true, + "checkType": "message", + "presenseStrs": [ + "Member Since" + ], + "absenceStrs": [ + "Bummer! You must be logged in to access this page." + ], + "urlMain": "https://teamtreehouse.com", + "url": "https://teamtreehouse.com/profiles/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "god", + "alexaRank": 9967 + }, + "are.na": { + "tags": [ + "art", + "sharing" + ], + "checkType": "status_code", + "urlMain": "https://www.are.na", + "url": "https://www.are.na/{username}", + "usernameClaimed": "nate-cassel", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 9659 + }, + "Anime-planet": { + "protection": [ + "tls_fingerprint", + "ip_reputation" + ], + "tags": [ + "anime" + ], + "checkType": "message", + "presenseStrs": [ + "Profile | Anime-Planet" + ], + "alexaRank": 10248, + "urlMain": "https://www.anime-planet.com", + "url": "https://www.anime-planet.com/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Depop": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "fashion", + "shopping" + ], + "checkType": "message", + "presenseStrs": [ + "first_name" + ], + "absenceStrs": [ + "invalidUrlError__message" + ], + "urlMain": "https://www.depop.com", + "url": "https://www.depop.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 11484 + }, + "Exposure": { + "url": "https://{username}.exposure.co/", + "urlMain": "https://exposure.co/", + "checkType": "status_code", + "regexCheck": "^[a-zA-Z0-9-]{1,63}$", + "usernameClaimed": "jonasjacobsson", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ], + "alexaRank": 10525, + "tags": [ + "photo" + ] + }, + "Blu-ray": { + "tags": [ + "forum" + ], + "engine": "vBulletin", + "urlMain": "https://forum.blu-ray.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "LyricsTranslate": { + "absenceStrs": [ + "Page not found | Lyrics Translate" + ], + "presenseStrs": [ + "profileid" + ], + "url": "https://lyricstranslate.com/sco/translator/{username}", + "urlMain": "https://lyricstranslate.com", + "usernameClaimed": "charming43", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 10731, + "tags": [ + "music" + ] + }, + "VSCO": { + "tags": [ + "photo" + ], + "checkType": "status_code", + "alexaRank": 10122, + "urlMain": "https://vsco.co/", + "url": "https://vsco.co/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "Stihi.ru": { + "tags": [ + "ru", + "writing" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "Автор не найден" + ], + "alexaRank": 10303, + "urlMain": "https://www.stihi.ru/", + "url": "https://www.stihi.ru/avtor/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "hunting.karelia.ru": { + "urlMain": "http://hunting.karelia.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "Rarible": { + "url": "https://rarible.com/{username}", + "urlMain": "https://rarible.com/", + "checkType": "message", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 10915, + "presenseStrs": [ + "\"type\":\"USER\"" + ], + "absenceStrs": [ + "Page Not Found" + ], + "urlProbe": "https://rarible.com/marketplace/api/v4/urls/{username}", + "tags": [ + "crypto", + "nft" + ] + }, + "Computerbase": { + "disabled": true, + "tags": [ + "de" + ], + "checkType": "message", + "absenceStrs": [ + "Das gewünschte Mitglied kann nicht gefunden werden" + ], + "alexaRank": 10601, + "urlMain": "https://www.computerbase.de", + "url": "https://www.computerbase.de/forum/members/?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DiscoursePi-hole": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://discourse.pi-hole.net", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CGTrader": { + "url": "https://www.cgtrader.com/{username}", + "urlMain": "https://www.cgtrader.com", + "checkType": "status_code", + "regexCheck": "^[^.]*?$", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 11293, + "tags": [ + "3d", + "shopping" + ] + }, + "Guru": { + "tags": [ + "freelance" + ], + "checkType": "message", + "presenseStrs": [ + "id=\"profileApp\"" + ], + "absenceStrs": [ + "Guru.com - Page Not Found", + "Guru.com - Content Deleted" + ], + "alexaRank": 10895, + "urlMain": "https://www.guru.com", + "url": "https://www.guru.com/freelancers/{username}", + "usernameClaimed": "longhui-zhao", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "YouPorn": { + "tags": [ + "porn" + ], + "checkType": "message", + "presenseStrs": [ + "youporn.com/user/" + ], + "alexaRank": 11278, + "urlMain": "https://youporn.com", + "url": "https://youporn.com/uservids/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "Bookcrossing": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "books" + ], + "checkType": "status_code", + "alexaRank": 11022, + "urlMain": "https://www.bookcrossing.com/", + "url": "https://www.bookcrossing.com/mybookshelf/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "dimitrov.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://dimitrov.ucoz.ua", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "2el5.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://2el5.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "zp-mama.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://zp-mama.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "killer.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://killer.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "myfootball-1.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://myfootball-1.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "velozone.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://velozone.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "goroskop.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://goroskop.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "elektron.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://elektron.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "mistoodesa.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://mistoodesa.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "smart-phone.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://smart-phone.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "staroverovka.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://staroverovka.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "simf-mama.ucoz.ua": { + "engine": "uCoz", + "urlMain": "http://simf-mama.ucoz.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "Gutefrage": { + "url": "https://www.gutefrage.net/nutzer/{username}", + "urlMain": "https://www.gutefrage.net/", + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "usernameClaimed": "gutefrage", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 11366, + "tags": [ + "de", + "forum" + ] + }, + "Badoo": { + "disabled": true, + "tags": [ + "dating" + ], + "checkType": "status_code", + "alexaRank": 11248, + "urlMain": "https://badoo.com/", + "url": "https://badoo.com/profile/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gribnikikybani": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "По вашему запросу ничего не найдено." + ], + "urlMain": "http://gribnikikybani.mybb.ru", + "url": "http://gribnikikybani.mybb.ru/search.php?action=search&keywords=&author={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Waytothelight": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "По вашему запросу ничего не найдено." + ], + "urlMain": "https://waytothelight.mybb.ru/", + "url": "https://waytothelight.mybb.ru/search.php?action=search&keywords=&author={username}", + "usernameClaimed": "lana", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "AllKPop": { + "tags": [ + "kr" + ], + "checkType": "response_url", + "alexaRank": 11280, + "urlMain": "https://www.allkpop.com/", + "url": "https://www.allkpop.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Diary.ru": { + "disabled": true, + "tags": [ + "blog", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + " — @дневники: асоциальная сеть" + ], + "alexaRank": 11557, + "urlMain": "https://diary.ru", + "url": "https://{username}.diary.ru/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "hi5": { + "disabled": true, + "absenceStrs": [ + "birthDay" + ], + "presenseStrs": [ + "provider", + "loggedInUserName", + "profile_banner", + "main", + "groupName" + ], + "url": "http://www.hi5.com/{username}", + "urlMain": "http://www.hi5.com", + "usernameClaimed": "johnnflorence", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "social" + ], + "alexaRank": 11529 + }, + "Scala-lang": { + "tags": [ + "coding", + "forum" + ], + "engine": "Discourse", + "urlMain": "https://users.scala-lang.org", + "usernameClaimed": "sjrd", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.shotcut.org": { + "engine": "DiscourseJson", + "urlMain": "https://forum.shotcut.org", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "AdvancedCustomFields": { + "tags": [ + "au" + ], + "checkType": "message", + "absenceStrs": [ + "Sorry, page not found" + ], + "urlMain": "https://support.advancedcustomfields.com/", + "url": "https://support.advancedcustomfields.com/forums/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "community.asterisk.org": { + "tags": [ + "forum", + "ir", + "jp" + ], + "engine": "Discourse", + "urlMain": "https://community.asterisk.org", + "usernameClaimed": "bford", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Aufeminin": { + "tags": [ + "fr" + ], + "checkType": "response_url", + "alexaRank": 11718, + "urlMain": "https://www.aufeminin.com", + "url": "https://www.aufeminin.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Screwfix": { + "tags": [ + "forum", + "gb" + ], + "engine": "XenForo", + "urlMain": "https://community.screwfix.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "LiveLib": { + "tags": [ + "books", + "reading", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "на livelib.ru" + ], + "absenceStrs": [ + "не найден" + ], + "alexaRank": 11407, + "urlMain": "https://www.livelib.ru/", + "url": "https://www.livelib.ru/reader/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "headers": { + "User-Agent": "" + } + }, + "PCPartPicker": { + "disabled": true, + "tags": [ + "shopping", + "tech" + ], + "checkType": "status_code", + "alexaRank": 12065, + "urlMain": "https://pcpartpicker.com", + "url": "https://pcpartpicker.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "PushSquare": { + "tags": [ + "gaming", + "news", + "us" + ], + "checkType": "status_code", + "alexaRank": 12534, + "urlMain": "http://www.pushsquare.com", + "url": "http://www.pushsquare.com/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_firewall" + ] + }, + "NetworkInformatica": { + "tags": [ + "tech" + ], + "errors": { + "The site is undergoing planned maintenance activity and is unavailable temporarily.": "Maintenance" + }, + "checkType": "status_code", + "urlMain": "https://network.informatica.com", + "url": "https://network.informatica.com/people/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "MirTesen": { + "disabled": true, + "similarSearch": true, + "tags": [ + "news", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "По Вашему запросу ничего не найдено" + ], + "presenseStrs": [ + "Люди" + ], + "alexaRank": 11618, + "urlMain": "https://mirtesen.ru", + "url": "https://mirtesen.ru/people/{username}/profile", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "BikeRadar": { + "tags": [ + "forum", + "gb" + ], + "checkType": "status_code", + "urlMain": "https://forum.bikeradar.com", + "url": "https://forum.bikeradar.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "PRCY": { + "tags": [ + "ru" + ], + "disabled": true, + "checkType": "status_code", + "urlMain": "https://id.pr-cy.ru", + "url": "https://id.pr-cy.ru/user/profile/{username}/#/profile", + "usernameClaimed": "Elena", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "catholic": { + "disabled": true, + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forums.catholic.com", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Coderwall": { + "tags": [ + "coding" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "404! Our feels when that url is used" + ], + "alexaRank": 12011, + "urlMain": "https://coderwall.com/", + "url": "https://coderwall.com/{username}", + "usernameClaimed": "jenny", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Otzovik": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 12127, + "urlMain": "https://otzovik.com/", + "url": "https://otzovik.com/profile/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TheStudentRoom": { + "disabled": true, + "tags": [ + "forum", + "gb" + ], + "engine": "vBulletin", + "alexaRank": 12719, + "urlMain": "https://www.thestudentroom.co.uk", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "InfosecInstitute": { + "disabled": true, + "checkType": "status_code", + "urlMain": "https://community.infosecinstitute.com", + "url": "https://community.infosecinstitute.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lomography": { + "protection": [ + "cf_js_challenge" + ], + "absenceStrs": [ + "404 · Lomography" + ], + "presenseStrs": [ + "interactions__photos", + "taxonomy--cloud--inline" + ], + "url": "https://www.lomography.com/homes/{username}", + "urlMain": "https://www.lomography.com", + "usernameClaimed": "hetkimies", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "photo" + ], + "alexaRank": 12978 + }, + "Observable": { + "absenceStrs": [ + "Observable" + ], + "presenseStrs": [ + "profile_email" + ], + "url": "https://observablehq.com/@{username}", + "urlMain": "https://observablehq.com", + "usernameClaimed": "theabbie", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 12310, + "tags": [ + "sharing" + ] + }, + "Codementor": { + "tags": [ + "coding" + ], + "checkType": "message", + "presenseStrs": [ + "
" + ], + "absenceStrs": [ + "Adapted from" + ], + "alexaRank": 12757, + "urlMain": "https://www.codementor.io/", + "url": "https://www.codementor.io/@{username}", + "usernameClaimed": "arjunmenon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Weedmaps": { + "tags": [ + "us" + ], + "checkType": "message", + "presenseStrs": [ + "Explore Cannabis Brands" + ], + "absenceStrs": [ + "Find Marijuana Dispensaries, Brands, Delivery, Deals" + ], + "alexaRank": 13320, + "urlMain": "https://weedmaps.com", + "url": "https://weedmaps.com/brands/{username}", + "usernameClaimed": "adams", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Neoseeker": { + "tags": [ + "forum", + "gaming" + ], + "checkType": "status_code", + "alexaRank": 13598, + "urlMain": "https://www.neoseeker.com", + "url": "https://www.neoseeker.com/members/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Guns.ru": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Информация участника" + ], + "absenceStrs": [ + "не существует" + ], + "urlMain": "https://forum.guns.ru/", + "url": "https://forum.guns.ru/forummisc/show_profile/00098415?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "cs-ru.ucoz.org": { + "engine": "uCoz", + "urlMain": "http://cs-ru.ucoz.org", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "w2l-g.ucoz.org": { + "engine": "uCoz", + "urlMain": "http://w2l-g.ucoz.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ruslangxp.ucoz.org": { + "engine": "uCoz", + "urlMain": "http://ruslangxp.ucoz.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "soundfactory.ucoz.org": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://soundfactory.ucoz.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "pmpkbirsk.ucoz.org": { + "engine": "uCoz", + "urlMain": "http://pmpkbirsk.ucoz.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "Redtube": { + "tags": [ + "porn" + ], + "checkType": "message", + "presenseStrs": [ + "Newest Porn Videos | Redtube" + ], + "absenceStrs": [ + "Page Not Found" + ], + "alexaRank": 13414, + "urlMain": "https://www.redtube.com/", + "url": "https://www.redtube.com/amateur/{username}", + "usernameClaimed": "dollyjeey", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "N4g": { + "tags": [ + "gaming", + "news" + ], + "checkType": "status_code", + "alexaRank": 12848, + "urlMain": "https://n4g.com/", + "url": "https://n4g.com/user/home/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Listal": { + "tags": [ + "movies", + "music" + ], + "checkType": "response_url", + "urlMain": "https://listal.com/", + "url": "https://{username}.listal.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 13865 + }, + "pixelfed.social": { + "tags": [ + "art", + "photo" + ], + "checkType": "status_code", + "usernameClaimed": "pylapp", + "usernameUnclaimed": "noonewouldeverusethis42", + "urlMain": "https://pixelfed.social/", + "url": "https://pixelfed.social/{username}/", + "alexaRank": 12996 + }, + "FilmWeb": { + "tags": [ + "movies", + "pl" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "top.location.href = '/404';" + ], + "alexaRank": 13801, + "urlMain": "https://www.filmweb.pl/user/adam", + "url": "https://www.filmweb.pl/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hackerearth": { + "disabled": true, + "protection": [ + "custom_bot_protection" + ], + "tags": [ + "freelance" + ], + "checkType": "message", + "alexaRank": 13274, + "absenceStrs": [ + "404. URL not found." + ], + "presenseStrs": [ + "Points" + ], + "urlMain": "https://www.hackerearth.com", + "url": "https://www.hackerearth.com/@{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bukkit": { + "disabled": true, + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 14024, + "urlMain": "https://bukkit.org/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "notabug.org": { + "tags": [ + "coding" + ], + "urlProbe": "https://notabug.org/{username}/followers", + "checkType": "status_code", + "alexaRank": 14393, + "urlMain": "https://notabug.org/", + "url": "https://notabug.org/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "NN.RU": { + "tags": [ + "ru" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "alexaRank": 14174, + "urlMain": "https://www.nn.ru/", + "url": "https://{username}.www.nn.ru/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Liberapay": { + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "finance" + ], + "checkType": "message", + "presenseStrs": [ + "profile-header-bar", + "profile-statement" + ], + "absenceStrs": [ + "The requested page could not be found" + ], + "alexaRank": 13698, + "urlMain": "https://liberapay.com", + "url": "https://liberapay.com/{username}", + "usernameClaimed": "geekyretronerds", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Livemaster": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 14506, + "urlMain": "https://www.livemaster.ru", + "url": "https://www.livemaster.ru/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Huntingnet": { + "protection": [ + "cf_firewall" + ], + "tags": [ + "us" + ], + "checkType": "message", + "presenseStrs": [ + "profilefield_category", + "profilefield_list" + ], + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "alexaRank": 14210, + "urlMain": "https://www.huntingnet.com", + "url": "https://www.huntingnet.com/forum/members/{username}.html", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "telescope.ac": { + "disabled": true, + "absenceStrs": [ + ">Not found</h1>" + ], + "presenseStrs": [ + "og:site_name", + "alternate", + "article", + "project", + "og:title" + ], + "url": "https://telescope.ac/{username}", + "urlMain": "https://telescope.ac", + "usernameClaimed": "theabbie", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 14280, + "tags": [ + "blog" + ] + }, + "forums.visual-paradigm.com": { + "urlMain": "https://forums.visual-paradigm.com", + "engine": "Discourse", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "forums.battlefield.com": { + "disabled": true, + "tags": [ + "forum", + "gaming", + "gb" + ], + "checkType": "status_code", + "urlMain": "https://forums.battlefield.com", + "url": "https://forums.battlefield.com/en-us/profile/{username}", + "usernameClaimed": "NLBartmaN", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SparkPeople": { + "disabled": true, + "tags": [ + "us" + ], + "checkType": "message", + "absenceStrs": [ + "We couldn't find that user", + "Page Not Found" + ], + "alexaRank": 14147, + "urlMain": "https://www.sparkpeople.com", + "url": "https://www.sparkpeople.com/mypage.asp?id={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Sythe": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 13703, + "urlMain": "https://www.sythe.org", + "usernameClaimed": "rskingp", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Trinixy": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "news", + "ru" + ], + "checkType": "status_code", + "alexaRank": 14712, + "urlMain": "https://trinixy.ru", + "url": "https://trinixy.ru/user/{username}/", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mydramalist": { + "url": "https://www.mydramalist.com/profile/{username}", + "urlMain": "https://mydramalist.com", + "checkType": "message", + "absenceStrs": [ + "The requested page was not found" + ], + "usernameClaimed": "elhadidy12398", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 14965, + "tags": [ + "kr", + "movies" + ] + }, + "MeetMe": { + "tags": [ + "in", + "social", + "us" + ], + "errors": { + "fa fa-spinner fa-pulse loading-icon-lg": "Registration page" + }, + "checkType": "response_url", + "alexaRank": 15356, + "urlMain": "https://www.meetme.com/", + "url": "https://www.meetme.com/{username}", + "errorUrl": "https://www.meetme.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Joomlart": { + "disabled": true, + "tags": [ + "coding" + ], + "checkType": "message", + "absenceStrs": [ + "user-scalable=no" + ], + "alexaRank": 14668, + "urlMain": "https://www.joomlart.com", + "url": "https://www.joomlart.com/user/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "chaos.social": { + "disabled": true, + "checkType": "status_code", + "alexaRank": 14296, + "regexCheck": "^[a-zA-Z0-9_]+$", + "urlMain": "https://chaos.social/", + "url": "https://chaos.social/@{username}", + "usernameClaimed": "rixx", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "social" + ] + }, + "mastodon.social": { + "checkType": "status_code", + "alexaRank": 14296, + "regexCheck": "^[a-zA-Z0-9_]+$", + "urlMain": "https://chaos.social/", + "url": "https://mastodon.social/@{username}", + "usernameClaimed": "Gargron", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "social" + ] + }, + "iRecommend.RU": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 15419, + "urlMain": "https://irecommend.ru/", + "url": "https://irecommend.ru/users/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pinkbike": { + "tags": [ + "hobby" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "alexaRank": 15019, + "urlMain": "https://www.pinkbike.com/", + "url": "https://www.pinkbike.com/u/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "GBAtemp.net": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "forum", + "gaming" + ], + "engine": "XenForo", + "alexaRank": 15893, + "urlMain": "https://gbatemp.net/", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Thechive": { + "tags": [ + "sharing" + ], + "checkType": "message", + "presenseStrs": [ + "Posts By" + ], + "absenceStrs": [ + "Find something else." + ], + "alexaRank": 15153, + "urlMain": "https://thechive.com/", + "url": "https://thechive.com/author/{username}", + "usernameClaimed": "bhgilliland", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TripIt": { + "disabled": true, + "tags": [ + "travel" + ], + "engine": "engineRedirect", + "urlMain": "https://tripit.com", + "url": "https://tripit.com/people/{username}#/profile/basic-info", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 14797 + }, + "Vivino": { + "tags": [ + "review" + ], + "checkType": "status_code", + "alexaRank": 14969, + "urlMain": "https://www.vivino.com/", + "url": "https://www.vivino.com/users/{username}", + "urlProbe": "https://api.vivino.com/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Flyertalk": { + "protection": [ + "tls_fingerprint", + "ip_reputation", + "cf_js_challenge" + ], + "tags": [ + "travel" + ], + "checkType": "message", + "presenseStrs": [ + "- View Profile:" + ], + "alexaRank": 15574, + "urlMain": "https://www.flyertalk.com", + "url": "https://www.flyertalk.com/forum/members/{username}.html", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Goldderby": { + "tags": [ + "movies" + ], + "checkType": "status_code", + "alexaRank": 15228, + "urlMain": "https://www.goldderby.com", + "url": "https://www.goldderby.com/members/{username}/", + "usernameClaimed": "dakardii", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Librusec": { + "tags": [ + "br", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "/a/300686", + "/a/280282" + ], + "urlMain": "https://lib.rus.ec", + "url": "https://lib.rus.ec/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Acomics": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 15274, + "urlMain": "https://acomics.ru", + "url": "https://acomics.ru/-{username}", + "usernameClaimed": "Garage", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "social.tchncs.de": { + "tags": [ + "de" + ], + "checkType": "status_code", + "regexCheck": "^[a-zA-Z0-9_]+$", + "urlMain": "https://social.tchncs.de/", + "url": "https://social.tchncs.de/@{username}", + "usernameClaimed": "Milan", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "alliedmods": { + "disabled": true, + "tags": [ + "forum", + "gb", + "jp", + "tr", + "uz" + ], + "engine": "vBulletin", + "urlMain": "https://forums.alliedmods.net/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "4pda": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "К сожалению, Ваш поиск не дал никаких результатов." + ], + "alexaRank": 16836, + "urlMain": "https://4pda.ru/", + "url": "https://4pda.ru/forum/index.php?act=search&source=pst&noform=1&username={username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "GameRevolution": { + "tags": [ + "forum", + "gaming" + ], + "engine": "XenForo", + "urlMain": "https://forums.gamerevolution.com", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pathofexile": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "profile-details" + ], + "absenceStrs": [ + "<title>Path of Exile" + ], + "urlMain": "https://ru.pathofexile.com", + "url": "https://ru.pathofexile.com/account/view-profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ], + "disabled": true + }, + "Avforums": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "forum", + "gb" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found." + ], + "alexaRank": 17710, + "urlMain": "https://www.avforums.com", + "url": "https://www.avforums.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Brusheezy": { + "presenseStrs": [ + "canonical\" href=\"https://www.brusheezy.com/members/" + ], + "url": "https://www.brusheezy.com/members/{username}", + "urlMain": "https://www.brusheezy.com", + "usernameClaimed": "artistmef", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "photo", + "stock" + ], + "alexaRank": 17263 + }, + "boards.theforce.net": { + "urlMain": "https://boards.theforce.net", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true, + "errors": { + "Log in | Jedi Council": "Login required" + }, + "protection": [ + "login" + ] + }, + "Akniga": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 17041, + "urlMain": "https://akniga.org/", + "url": "https://akniga.org/profile/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "TrueAchievements": { + "tags": [ + "gaming" + ], + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "alexaRank": 18371, + "urlMain": "https://www.trueachievements.com", + "url": "https://www.trueachievements.com/gamer/{username}", + "usernameClaimed": "metallicafan459", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Garden": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "us" + ], + "checkType": "message", + "presenseStrs": [ + "'s profile - Garden.org" + ], + "absenceStrs": [ + "Member List - Garden.org" + ], + "errors": { + "Just a moment": "Cloudflare challenge", + "challenges.cloudflare.com": "Cloudflare challenge" + }, + "alexaRank": 17338, + "urlMain": "https://garden.org", + "url": "https://garden.org/users/profile/{username}/", + "usernameClaimed": "Maynehockeym", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mobypicture": { + "tags": [ + "photo" + ], + "checkType": "message", + "absenceStrs": [ + "User not found" + ], + "presenseStrs": [ + "Last mentioned in:" + ], + "alexaRank": 17792, + "urlMain": "http://www.mobypicture.com", + "url": "http://www.mobypicture.com/user/{username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cont": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 17333, + "urlMain": "https://cont.ws", + "url": "https://cont.ws/@{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pinboard": { + "tags": [ + "bookmarks" + ], + "checkType": "status_code", + "alexaRank": 17195, + "urlMain": "http://pinboard.in", + "url": "http://pinboard.in/u:{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "TheVillage.ru": { + "disabled": true, + "tags": [ + "ru" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "The Village: ошибка 404, страница не найдена" + ], + "alexaRank": 17220, + "urlMain": "https://www.the-village.ru/", + "url": "https://www.the-village.ru/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Justlanded": { + "checkType": "status_code", + "urlMain": "https://community.justlanded.com", + "url": "https://community.justlanded.com/en/profile/{username}", + "usernameClaimed": "rahul-vaidya", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DLive": { + "absenceStrs": [ + "Channel not found" + ], + "presenseStrs": [ + "username", + "profile-part", + "profile-about" + ], + "url": "https://dlive.tv/{username}", + "urlMain": "https://dlive.tv", + "usernameClaimed": "TomTourettes", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 17965, + "tags": [ + "streaming" + ] + }, + "Nkj": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 17883, + "urlMain": "https://www.nkj.ru/", + "url": "https://www.nkj.ru/forum/user/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "igromania": { + "disabled": true, + "protection": [ + "custom_bot_protection" + ], + "tags": [ + "forum", + "gaming", + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "engine": "vBulletin", + "urlMain": "http://forum.igromania.ru/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Codechef": { + "tags": [ + "in" + ], + "checkType": "response_url", + "alexaRank": 18520, + "urlMain": "https://www.codechef.com/", + "url": "https://www.codechef.com/users/{username}", + "errorUrl": "https://www.codechef.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "iFunny": { + "tags": [ + "sharing" + ], + "checkType": "message", + "presenseStrs": [ + "subscribers" + ], + "urlMain": "https://www.ifunny.co", + "url": "https://www.ifunny.co/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 19237 + }, + "Advego": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 17816, + "urlMain": "https://advego.com/", + "url": "https://advego.com/profile/{username}/author/", + "usernameClaimed": "Competitor", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Trakt": { + "tags": [ + "movies" + ], + "checkType": "status_code", + "alexaRank": 18039, + "urlMain": "https://www.trakt.tv/", + "url": "https://www.trakt.tv/users/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Physicsforums": { + "tags": [ + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "alexaRank": 18532, + "urlMain": "https://www.physicsforums.com", + "url": "https://www.physicsforums.com/members/?username={username}", + "usernameClaimed": "zap", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hot UKdeals": { + "url": "https://www.hotukdeals.com/profile/{username}", + "urlMain": "https://www.hotukdeals.com/", + "checkType": "status_code", + "usernameClaimed": "Blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 19895, + "requestMethod": "GET", + "tags": [ + "gb", + "shopping" + ] + }, + "TJournal": { + "disabled": true, + "similarSearch": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Мы все внимательно посмотрели, но ничего не нашли :(" + ], + "alexaRank": 18329, + "urlMain": "https://tjournal.ru", + "url": "https://tjournal.ru/search/v2/subsite/relevant?query={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Overclockers": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 18730, + "urlMain": "https://overclockers.ru", + "url": "https://overclockers.ru/cpubase/user/{username}", + "usernameClaimed": "Rasamaha", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "AdultFriendFinder": { + "tags": [ + "dating" + ], + "checkType": "message", + "absenceStrs": [ + "404" + ], + "alexaRank": 45069, + "urlMain": "https://smart-lab.ru/", + "url": "https://smart-lab.ru/profile/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "thoughts.com": { + "tags": [ + "blog" + ], + "checkType": "message", + "absenceStrs": [ + "Page not found" + ], + "presenseStrs": [ + "user-activity" + ], + "urlMain": "http://thoughts.com", + "url": "http://thoughts.com/members/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "jules60", + "alexaRank": 48335 + }, + "profi.ru": { + "absenceStrs": [ + "page-404__paragraph" + ], + "presenseStrs": [ + "PROFILE", + "profiles", + "profileOIO", + "fullProfile", + "profileUGC2" + ], + "url": "https://profi.ru/profile/{username}/", + "urlMain": "https://profi.ru", + "usernameClaimed": "EgorovRV", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 45782, + "tags": [ + "freelance" + ] + }, + "EasyEDA": { + "tags": [ + "de", + "mx" + ], + "checkType": "status_code", + "alexaRank": 46912, + "urlMain": "https://easyeda.com", + "url": "https://easyeda.com/{username}/topics", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "InterPals": { + "tags": [ + "dating" + ], + "checkType": "message", + "presenseStrs": [ + "data-component=\"PageContentBox\"" + ], + "absenceStrs": [ + "User not found" + ], + "alexaRank": 48486, + "urlMain": "https://www.interpals.net/", + "url": "https://www.interpals.net/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noneownsthisusername" + }, + "Ecoustics": { + "disabled": true, + "tags": [ + "hk" + ], + "checkType": "message", + "absenceStrs": [ + "The profile that you have requested no longer exists." + ], + "alexaRank": 48086, + "urlMain": "https://www.ecoustics.com/", + "url": "https://www.ecoustics.com/cgi-bin/bbs/board-profile.pl?action=view_profile&profile={username}-users", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "valinor.com.br": { + "engine": "XenForo", + "alexaRank": 63474, + "urlMain": "http://www.valinor.com.br/forum/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Framapiaf": { + "tags": [ + "mastodon" + ], + "checkType": "status_code", + "urlMain": "https://framapiaf.org", + "url": "https://framapiaf.org/@{username}", + "usernameClaimed": "pylapp", + "usernameUnclaimed": "noonewouldeverusethis42", + "alexaRank": 46767 + }, + "Myinstants": { + "absenceStrs": [ + "<h2>Page not found</h2>" + ], + "presenseStrs": [ + "user-profile-title" + ], + "url": "https://www.myinstants.com/profile/{username}/", + "urlMain": "https://www.myinstants.com", + "usernameClaimed": "john122", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "music" + ], + "alexaRank": 48831 + }, + "Gapyear": { + "tags": [ + "gb", + "travel" + ], + "checkType": "status_code", + "alexaRank": 48679, + "urlMain": "https://www.gapyear.com", + "url": "https://www.gapyear.com/members/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "funcom": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forums.funcom.com", + "usernameClaimed": "everqu", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "custom_bot_protection" + ] + }, + "GipsysTeam": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://site.gipsyteam.ru/", + "url": "https://site.gipsyteam.ru/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "PacketStormSecurity": { + "tags": [ + "tr" + ], + "checkType": "message", + "absenceStrs": [ + "<title>Files: All Authors ≈ Packet Storm", + "No Results Found" + ], + "alexaRank": 47112, + "urlMain": "https://packetstormsecurity.com", + "url": "https://packetstormsecurity.com/files/authors/{username}/", + "usernameClaimed": "3nitro", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Sugoidesu": { + "engine": "XenForo", + "alexaRank": 45578, + "urlMain": "https://sugoidesu.net", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Mapillary Forum": { + "engine": "DiscourseJson", + "tags": [ + "forum" + ], + "urlMain": "https://forum.mapillary.com", + "usernameClaimed": "slashme", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DonationsAlerts": { + "tags": [ + "finance", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "/img/404.svg" + ], + "alexaRank": 47808, + "urlMain": "https://www.donationalerts.com/", + "url": "https://www.donationalerts.com/r/{username}", + "usernameClaimed": "r3dhunt", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mybuilder": { + "tags": [ + "gb", + "hk" + ], + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "alexaRank": 49143, + "urlMain": "https://www.mybuilder.com", + "url": "https://www.mybuilder.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TNAFlix": { + "checkType": "message", + "absenceStrs": [ + "Not Found" + ], + "presenseStrs": [ + "profile-header", + "onerror=" + ], + "url": "https://www.tnaflix.com/profile/{username}", + "urlMain": "https://www.tnaflix.com", + "usernameClaimed": "luna92", + "usernameUnclaimed": "krjmekrmlp", + "disabled": true, + "alexaRank": 50960, + "tags": [ + "porn" + ] + }, + "reality-check.ca": { + "disabled": true, + "engine": "XenForo", + "alexaRank": 46184, + "urlMain": "https://www.reality-check.ca", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "ca", + "forum", + "medicine" + ] + }, + "Oper": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Нет такого пользователя" + ], + "alexaRank": 49842, + "urlMain": "https://www.oper.ru/", + "url": "https://www.oper.ru/visitors/info.php?t={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mastodon.technology": { + "tags": [ + "th" + ], + "checkType": "status_code", + "alexaRank": 50057, + "regexCheck": "^[a-zA-Z0-9_]+$", + "urlMain": "https://mastodon.xyz/", + "url": "https://mastodon.technology/@{username}", + "usernameClaimed": "ashfurrow", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "mastodon.xyz": { + "tags": [ + "th" + ], + "checkType": "status_code", + "alexaRank": 50057, + "regexCheck": "^[a-zA-Z0-9_]+$", + "urlMain": "https://mastodon.xyz/", + "url": "https://mastodon.xyz/@{username}", + "usernameClaimed": "TheKinrar", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Reibert": { + "tags": [ + "forum", + "ru", + "ua" + ], + "engine": "XenForo", + "alexaRank": 53555, + "urlMain": "https://reibert.info/", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Vero": { + "tags": [ + "in", + "social", + "us" + ], + "checkType": "message", + "absenceStrs": [ + "Error Page - VERO™ – True Social" + ], + "alexaRank": 52993, + "urlMain": "https://vero.co", + "url": "https://vero.co/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "gcup.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "alexaRank": 54324, + "urlMain": "http://gcup.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Psychologies.ru": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 50524, + "urlMain": "http://www.psychologies.ru", + "url": "http://www.psychologies.ru/personal/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mywed": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "schema.org/Person" + ], + "absenceStrs": [ + "Страница не найдена" + ], + "alexaRank": 54377, + "urlMain": "https://mywed.com/ru", + "url": "https://mywed.com/ru/photographer/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Krstarica": { + "tags": [ + "at", + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "Traženi član nije pronađen. Molimo unesite puno ime člana i pokušajte ponovo." + ], + "urlMain": "https://forum.krstarica.com", + "url": "https://forum.krstarica.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Freelancehunt": { + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "freelance", + "ru", + "ua" + ], + "checkType": "status_code", + "alexaRank": 55324, + "urlMain": "https://freelancehunt.com", + "url": "https://freelancehunt.com/freelancer/{username}.html", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Golbis": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 54451, + "urlMain": "https://golbis.com", + "url": "https://golbis.com/user/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chitalnya": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "ru" + ], + "checkType": "response_url", + "alexaRank": 51984, + "urlMain": "https://www.chitalnya.ru", + "url": "https://www.chitalnya.ru/users/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "awd.ru": { + "tags": [ + "forum", + "ru", + "travel" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "presenseStrs": [ + "Результатов поиска:" + ], + "urlMain": "https://forum.awd.ru", + "url": "https://forum.awd.ru/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Whonix Forum": { + "tags": [ + "forum", + "ir", + "tech" + ], + "engine": "Discourse", + "urlMain": "https://forums.whonix.org/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "custom_bot_protection" + ] + }, + "Ani World": { + "url": "https://aniworld.to/user/profil/{username}", + "urlMain": "https://aniworld.to/", + "checkType": "message", + "absenceStrs": [ + "Dieses Profil ist nicht verfügbar" + ], + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 49310, + "tags": [ + "anime", + "de" + ] + }, + "smokingmeatforums.com": { + "urlMain": "https://smokingmeatforums.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 52187 + }, + "forums.indiegala.com": { + "urlMain": "https://forums.indiegala.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Icobench": { + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "kr", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "author-bio-content", + "author-bio-img" + ], + "absenceStrs": [ + "Page not found - icobench.com" + ], + "alexaRank": 56324, + "urlMain": "https://icobench.com", + "url": "https://icobench.com/u/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "board.phpbuilder.com": { + "urlMain": "https://board.phpbuilder.com", + "engine": "Flarum", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ProfilesTigweb": { + "tags": [ + "ca", + "pk" + ], + "checkType": "status_code", + "urlMain": "https://profiles.tigweb.org", + "url": "https://profiles.tigweb.org/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_firewall" + ] + }, + "ShiftDelete": { + "disabled": true, + "tags": [ + "forum", + "tr" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36" + }, + "engine": "XenForo", + "urlMain": "https://forum.shiftdelete.net", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Infura": { + "tags": [ + "forum", + "kr" + ], + "engine": "Discourse", + "urlMain": "https://community.infura.io", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "author.today": { + "tags": [ + "reading", + "ru" + ], + "checkType": "status_code", + "alexaRank": 54072, + "urlMain": "https://author.today", + "url": "https://author.today/u/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "talk.sleepapnea.org": { + "urlMain": "https://talk.sleepapnea.org", + "engine": "Discourse", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "AfreecaTV": { + "absenceStrs": [ + "Blog does not exist." + ], + "presenseStrs": [ + "profile_text", + "profile_image", + "name", + "station_name", + "user_nick" + ], + "url": "http://bjapi.afreecatv.com/api/{username}/station", + "urlMain": "http://bjapi.afreecatv.com", + "usernameClaimed": "showsaovivo", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "streaming" + ] + }, + "Jetpunk": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "404 File Not Found" + ], + "alexaRank": 56300, + "urlMain": "https://www.jetpunk.com", + "url": "https://www.jetpunk.com/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "club.passion.ru": { + "urlMain": "http://club.passion.ru", + "engine": "phpBB/Search", + "usernameClaimed": "mo47", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "Livejasmin": { + "tags": [ + "us", + "webcam" + ], + "urlProbe": "https://www.livejasmin.com/en/flash/get-performer-details/{username}", + "checkType": "message", + "absenceStrs": [ + ":[]" + ], + "alexaRank": 55918, + "urlMain": "https://www.livejasmin.com/", + "url": "https://www.livejasmin.com/en/girls/#!chat/{username}", + "usernameClaimed": "Dolce", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Afterellen": { + "disabled": true, + "tags": [ + "forum", + "pk" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://forums.afterellen.com", + "url": "https://forums.afterellen.com/members/?username={username}", + "usernameClaimed": "buffaloed", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "forum.mxlinux.org": { + "urlMain": "https://forum.mxlinux.org", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "protection": [ + "cf_js_challenge" + ] + }, + "podolsk": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://forum.podolsk.ru", + "url": "https://forum.podolsk.ru/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "irina", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Motherless": { + "protection": [ + "tls_fingerprint" + ], + "url": "https://motherless.com/m/{username}", + "urlMain": "https://motherless.com/", + "checkType": "message", + "presenseStrs": [ + "class=\"profile" + ], + "absenceStrs": [ + "Oh damn!", + "no longer a member" + ], + "usernameClaimed": "hacker", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 56093, + "tags": [ + "porn" + ] + }, + "Atcoder": { + "url": "https://atcoder.jp/users/{username}", + "urlMain": "https://atcoder.jp/", + "checkType": "status_code", + "usernameClaimed": "ksun48", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding", + "jp" + ], + "alexaRank": 55871 + }, + "Fanlore": { + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "us" + ], + "checkType": "status_code", + "alexaRank": 56234, + "urlMain": "http://fanlore.org", + "url": "http://fanlore.org/wiki/User:{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rappad": { + "tags": [ + "music" + ], + "checkType": "status_code", + "alexaRank": 56463, + "urlMain": "https://www.rappad.co", + "url": "https://www.rappad.co/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "community.sweatco.in": { + "urlMain": "https://community.sweatco.in", + "engine": "Discourse", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Rasa": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forum.rasa.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Max": { + "tags": [ + "messaging", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "channel:{title:\"" + ], + "absenceStrs": [ + "Не нашли чат по этой ссылке" + ], + "urlMain": "https://max.ru", + "url": "https://max.ru/{username}", + "usernameClaimed": "ivolk", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 2208 + }, + "Maxpark": { + "disabled": true, + "tags": [ + "news", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "ОШИБКА 50x", + "ОШИБКА 404" + ], + "alexaRank": 56642, + "urlMain": "https://maxpark.com", + "url": "https://maxpark.com/user/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Wanelo": { + "disabled": true, + "tags": [ + "shopping" + ], + "checkType": "status_code", + "alexaRank": 56059, + "urlMain": "https://wanelo.com/", + "url": "https://wanelo.co/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "tfw2005.com": { + "tags": [ + "forum", + "us" + ], + "engine": "XenForo", + "alexaRank": 61430, + "urlMain": "http://www.tfw2005.com/boards/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forums.wrestlezone.com": { + "engine": "XenForo", + "urlMain": "http://forums.wrestlezone.com/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "protection": [ + "cf_js_challenge" + ] + }, + "NationStates Nation": { + "tags": [ + "forum", + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "Was this your nation? It may have ceased to exist due to inactivity, but can rise again!" + ], + "alexaRank": 58441, + "urlMain": "https://nationstates.net", + "url": "https://nationstates.net/nation={username}", + "usernameClaimed": "the_holy_principality_of_saint_mark", + "usernameUnclaimed": "noonewould", + "protection": [ + "cf_firewall" + ] + }, + "NationStates Region": { + "tags": [ + "us" + ], + "checkType": "message", + "absenceStrs": [ + "does not exist." + ], + "alexaRank": 58441, + "urlMain": "https://nationstates.net", + "url": "https://nationstates.net/region={username}", + "usernameClaimed": "the_west_pacific", + "usernameUnclaimed": "noonewould", + "protection": [ + "cf_firewall" + ] + }, + "Zoomir.ir": { + "absenceStrs": [ + "txtSearch" + ], + "presenseStrs": [ + "Email" + ], + "url": "https://www.zoomit.ir/user/{username}", + "urlMain": "https://www.zoomit.ir", + "usernameClaimed": "kossher", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "forum", + "ir", + "news" + ], + "alexaRank": 62383 + }, + "forum.web.ru": { + "urlMain": "https://forum.web.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "Myjane": { + "tags": [ + "bg", + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Информация" + ], + "urlMain": "http://forum.myjane.ru/", + "url": "http://forum.myjane.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ethresear": { + "tags": [ + "ch", + "cr", + "forum" + ], + "engine": "Discourse", + "alexaRank": 59767, + "urlMain": "https://ethresear.ch", + "usernameClaimed": "weijiekoh", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "savingadvice.com": { + "disabled": true, + "urlMain": "https://savingadvice.com", + "engine": "Wordpress/Author", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "finance" + ], + "alexaRank": 57426 + }, + "Vjudge": { + "url": "https://VJudge.net/user/{username}", + "urlMain": "https://VJudge.net/", + "checkType": "status_code", + "usernameClaimed": "tokitsukaze", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 62696, + "tags": [ + "coding" + ] + }, + "homebrewtalk.com": { + "urlMain": "https://www.homebrewtalk.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 61361, + "tags": [ + "forum", + "hobby" + ] + }, + "forum.scssoft.com": { + "urlMain": "https://forum.scssoft.com", + "engine": "phpBB/Search", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "de", + "forum" + ] + }, + "GunsAndAmmo": { + "disabled": true, + "tags": [ + "us" + ], + "checkType": "status_code", + "alexaRank": 63499, + "urlMain": "https://gunsandammo.com/", + "url": "https://forums.gunsandammo.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lemmy World": { + "url": "https://lemmy.world/u/{username}", + "urlProbe": "https://lemmy.world/api/v3/user?username={username}", + "urlMain": "https://lemmy.world", + "checkType": "status_code", + "usernameClaimed": "Ruud", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 61746, + "tags": [ + "discussion", + "lemmy" + ] + }, + "Railfan": { + "tags": [ + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "The user whose profile you are trying to view does not exist!" + ], + "urlMain": "http://forums.railfan.net", + "url": "http://forums.railfan.net/forums.cgi?action=viewprofile;username={username}", + "usernameClaimed": "gpicyk", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "TheSimsResource": { + "tags": [ + "gaming" + ], + "checkType": "message", + "presenseStrs": [ + "class=\"profile-avatar\"" + ], + "errors": { + "Just a moment": "Cloudflare challenge", + "challenges.cloudflare.com": "Cloudflare challenge" + }, + "alexaRank": 65342, + "urlMain": "https://www.thesimsresource.com/", + "url": "https://www.thesimsresource.com/members/{username}/", + "usernameClaimed": "DanSimsFantasy", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Trainsim": { + "urlSubpath": "/vbts", + "disabled": true, + "tags": [ + "forum" + ], + "engine": "vBulletin", + "alexaRank": 63356, + "urlMain": "https://www.trainsim.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "login" + ] + }, + "phpbbguru.net": { + "urlMain": "https://www.phpbbguru.net/community", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 62841 + }, + "forum.ubuntu-it.org": { + "tags": [ + "ch", + "forum", + "it" + ], + "engine": "phpBB", + "urlMain": "https://forum.ubuntu-it.org", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.endeavouros.com": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forum.endeavouros.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.newlcn.com": { + "urlMain": "http://forum.newlcn.com", + "engine": "phpBB2/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "discussion.squadhelp.com": { + "urlMain": "https://discussion.squadhelp.com", + "engine": "Discourse", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "protection": [ + "cf_js_challenge" + ], + "disabled": true + }, + "Vgtimes/Games": { + "tags": [ + "forum", + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "alexaRank": 66194, + "urlMain": "https://vgtimes.ru", + "url": "https://vgtimes.ru/games/{username}/forum/", + "usernameClaimed": "rfactor", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Vgtimes": { + "absenceStrs": [ + "Пользователь с таким именем не найден" + ], + "presenseStrs": [ + "user_profile" + ], + "url": "https://vgtimes.ru/user/{username}", + "urlMain": "https://vgtimes.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 66194, + "tags": [ + "gaming", + "news", + "ru" + ] + }, + "Wigle": { + "urlSubpath": "/phpbb", + "urlMain": "https://wigle.net", + "engine": "phpBB/Search", + "usernameClaimed": "arkasha", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 63157 + }, + "Ariva": { + "tags": [ + "de" + ], + "checkType": "status_code", + "alexaRank": 64677, + "urlMain": "https://www.ariva.de/", + "url": "https://www.ariva.de/profil/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "discuss.flarum.org": { + "urlMain": "https://discuss.flarum.org", + "engine": "Flarum", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Root-me": { + "tags": [ + "hacking", + "ir", + "pk" + ], + "errors": { + "429 Too Many Requests": "Too many requests" + }, + "checkType": "status_code", + "presenseStrs": [ + "Mes informations" + ], + "alexaRank": 65640, + "urlMain": "https://www.root-me.org", + "url": "https://www.root-me.org/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "PlaystationTrophies": { + "tags": [ + "forum", + "gaming" + ], + "checkType": "status_code", + "alexaRank": 69087, + "urlMain": "https://www.playstationtrophies.org", + "url": "https://www.playstationtrophies.org/forum/members/{username}.html", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "mirf": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://forum.mirf.ru/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "kpyto.pp.net.ua": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "http://kpyto.pp.net.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "samsungmobile.pp.net.ua": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "http://samsungmobile.pp.net.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "Weburg": { + "similarSearch": true, + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "search-item_type_persons" + ], + "alexaRank": 68588, + "urlMain": "https://weburg.net", + "url": "https://weburg.net/search?where=10&search=1&q={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tripster": { + "tags": [ + "de", + "ru" + ], + "checkType": "status_code", + "alexaRank": 66129, + "urlMain": "https://tripster.ru", + "url": "https://tripster.ru/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chessclub": { + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "Internet Chess Club Forum | Forum Home", + "The member profile you requested is currently not available", + "There are no records on this user." + ], + "alexaRank": 66850, + "urlMain": "https://www.chessclub.com", + "url": "https://www.chessclub.com/forums/member/{username}", + "usernameClaimed": "Lyon", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Typeracer": { + "tags": [ + "hobby" + ], + "checkType": "message", + "absenceStrs": [ + "Profile Not Found" + ], + "alexaRank": 68703, + "urlMain": "https://typeracer.com", + "url": "https://data.typeracer.com/pit/profile?user={username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Libraries": { + "disabled": true, + "tags": [ + "coding" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "alexaRank": 67586, + "urlMain": "https://libraries.io", + "url": "https://libraries.io/github/{username}/", + "source": "GitHub", + "usernameClaimed": "snooppr", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "AWS Skills Profile": { + "url": "https://skillsprofile.skillbuilder.aws/user/{username}/", + "urlMain": "https://skillsprofile.skillbuilder.aws", + "checkType": "message", + "absenceStrs": [ + "shareProfileAccepted\":false" + ], + "usernameClaimed": "mayank04pant", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "devRant": { + "tags": [ + "coding" + ], + "checkType": "response_url", + "alexaRank": 71769, + "urlMain": "https://devrant.com/", + "url": "https://devrant.com/users/{username}", + "errorUrl": "https://devrant.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "openframeworks": { + "engine": "DiscourseJson", + "tags": [ + "forum" + ], + "urlMain": "https://forum.openframeworks.cc", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "FUTBIN": { + "disabled": true, + "tags": [ + "de", + "forum", + "gaming", + "gb" + ], + "checkType": "status_code", + "urlMain": "https://forums.futbin.com", + "url": "https://forums.futbin.com/profile/{username}", + "usernameClaimed": "YuvalDu", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Topmate": { + "url": "https://topmate.io/{username}", + "urlMain": "https://topmate.io/", + "checkType": "status_code", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 68096, + "tags": [ + "freelance" + ] + }, + "Image Fap": { + "protection": [ + "tls_fingerprint" + ], + "url": "https://www.imagefap.com/profile/{username}", + "urlMain": "https://www.imagefap.com/", + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 71537, + "tags": [ + "porn" + ] + }, + "Windowsforum": { + "tags": [ + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "alexaRank": 67074, + "urlMain": "https://windowsforum.com", + "url": "https://windowsforum.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hometheaterforum": { + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "forum", + "us" + ], + "checkType": "message", + "presenseStrs": [ + "memberHeader-avatar", + "memberHeader-blurb" + ], + "absenceStrs": [ + "The specified member cannot be found" + ], + "alexaRank": 73164, + "urlMain": "https://www.hometheaterforum.com", + "url": "https://www.hometheaterforum.com/community/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "funny-games.biz": { + "disabled": true, + "tags": [ + "forum", + "lt" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://forums.funny-games.biz", + "url": "https://forums.funny-games.biz/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "support.ilovegrowingmarijuana.com": { + "engine": "DiscourseJson", + "urlMain": "https://support.ilovegrowingmarijuana.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Erome": { + "url": "https://www.erome.com/{username}", + "urlMain": "https://www.erome.com/", + "checkType": "status_code", + "usernameClaimed": "bob", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 71337, + "tags": [ + "porn" + ] + }, + "tks": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://forum.tks.ru/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VLR": { + "url": "https://www.vlr.gg/user/{username}", + "urlMain": "https://www.vlr.gg", + "checkType": "status_code", + "usernameClaimed": "optms", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 74549, + "tags": [ + "gaming" + ] + }, + "collectors.com": { + "tags": [ + "forum" + ], + "checkType": "status_code", + "urlMain": "https://forums.collectors.com", + "url": "https://forums.collectors.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cent": { + "tags": [ + "art", + "writing" + ], + "urlProbe": "https://beta.cent.co/data/user/profile?userHandles={username}", + "checkType": "message", + "presenseStrs": [ + "display_name" + ], + "absenceStrs": [ + "\"results\":[]" + ], + "alexaRank": 62477, + "urlMain": "https://cent.co/", + "url": "https://beta.cent.co/@{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Politforums": { + "tags": [ + "forum", + "ru" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "presenseStrs": [ + "Профиль." + ], + "absenceStrs": [ + "пожалуйста свяжитесь с администратором" + ], + "alexaRank": 89792, + "urlMain": "https://www.politforums.net/", + "url": "https://www.politforums.net/free/profile.php?showuser={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "custom_bot_protection" + ] + }, + "archive.transformativeworks.org": { + "checkType": "message", + "absenceStrs": [ + ">Error 404</h2>", + "system errors error-404 region", + " Error", + ">The page you were looking for doesn", + " 404" + ], + "presenseStrs": [ + ">Profile</a></li>", + "dashboard", + "heading landmark", + "region ", + "gift work index group" + ], + "url": "https://archive.transformativeworks.org/users/{username}/gifts", + "urlMain": "https://archive.transformativeworks.org", + "usernameClaimed": "sunny2000", + "usernameUnclaimed": "eoiyduyhed" + }, + "SexforumIXBB": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "По вашему запросу ничего не найдено." + ], + "urlMain": "http://sexforum.ixbb.ru", + "url": "http://sexforum.ixbb.ru/search.php?action=search&keywords=&author={username}", + "usernameClaimed": "lcf", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Astralinux": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://forum.astralinux.ru", + "usernameClaimed": "dem", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pokemon Showdown": { + "tags": [ + "gaming" + ], + "checkType": "status_code", + "alexaRank": 77040, + "urlMain": "https://pokemonshowdown.com", + "url": "https://pokemonshowdown.com/users/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Scorcher": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "alexaRank": 70621, + "urlMain": "https://www.glavbukh.ru", + "url": "https://www.glavbukh.ru/forum/member.php/?username={username}", + "usernameClaimed": "poli888", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Medikforum": { + "disabled": true, + "tags": [ + "de", + "forum", + "nl", + "ru", + "ua" + ], + "errors": { + "Вы не можете произвести поиск сразу после предыдущего": "Rate limit" + }, + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "alexaRank": 79867, + "urlMain": "https://www.medikforum.ru", + "url": "https://www.medikforum.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Partyflock": { + "tags": [ + "nl" + ], + "checkType": "status_code", + "alexaRank": 76887, + "urlMain": "https://partyflock.nl", + "url": "https://partyflock.nl/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Knowem": { + "disabled": true, + "tags": [ + "business" + ], + "checkType": "status_code", + "alexaRank": 77439, + "urlMain": "https://knowem.com/", + "url": "https://knowem.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "KanoWorld": { + "checkType": "status_code", + "urlMain": "https://world.kano.me/", + "url": "https://api.kano.me/progress/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "MoiKrug": { + "tags": [ + "career" + ], + "checkType": "status_code", + "alexaRank": 78123, + "urlMain": "https://moikrug.ru/", + "url": "https://moikrug.ru/{username}", + "usernameClaimed": "marina", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "HackingWithSwift": { + "tags": [ + "coding" + ], + "regexCheck": "^[^\\.\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "<title>Users - Hacking with Swift" + ], + "alexaRank": 76169, + "urlMain": "https://www.hackingwithswift.com", + "url": "https://www.hackingwithswift.com/users/{username}", + "usernameClaimed": "davextreme", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Trashbox.ru": { + "tags": [ + "az", + "ru" + ], + "regexCheck": "^[A-Za-z0-9_-]{3,16}$", + "checkType": "message", + "absenceStrs": [ + "404 — Not found" + ], + "urlMain": "https://trashbox.ru/", + "url": "https://trashbox.ru/users/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "never-never-ever", + "alexaRank": 72890 + }, + "RPGGeek": { + "ignore403": true, + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "User does not exist" + ], + "alexaRank": 81858, + "urlMain": "https://rpggeek.com", + "url": "https://rpggeek.com/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Ddo": { + "urlSubpath": "/forums", + "disabled": true, + "tags": [ + "forum" + ], + "engine": "vBulletin", + "alexaRank": 73008, + "urlMain": "https://www.ddo.com", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Omg.lol": { + "url": "https://{username}.omg.lol", + "urlMain": "https://home.omg.lol", + "urlProbe": "https://api.omg.lol/address/{username}/availability", + "checkType": "message", + "absenceStrs": [ + "\"available\": true" + ], + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Trisquel": { + "tags": [ + "eu" + ], + "checkType": "status_code", + "alexaRank": 76961, + "urlMain": "https://trisquel.info", + "url": "https://trisquel.info/it/users/{username}", + "usernameClaimed": "redfox", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Suomi24": { + "tags": [ + "fi", + "jp" + ], + "checkType": "status_code", + "alexaRank": 81975, + "urlMain": "https://www.suomi24.fi", + "url": "https://www.suomi24.fi/profiili/{username}", + "usernameClaimed": "Kilgore", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rmmedia": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "alexaRank": 72016, + "urlMain": "https://rmmedia.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Radioscanner": { + "tags": [ + "ru" + ], + "errors": { + "вы можете искать не чаще, чем раз в 10 секунд": "Too many requests" + }, + "checkType": "message", + "absenceStrs": [ + "Ничего не найдено!" + ], + "alexaRank": 84814, + "urlMain": "http://www.radioscanner.ru", + "url": "http://www.radioscanner.ru/forum/index.php?posterName={username}&action=search&searchGo=1", + "usernameClaimed": "bob", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.cxem.net": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "errors": { + "К сожалению, возникла проблема": "Too many reqeusts" + }, + "checkType": "message", + "absenceStrs": [ + "Найдено 0 результатов" + ], + "urlMain": "https://forum.cxem.net/", + "url": "https://forum.cxem.net/index.php?/search/&q={username}&quick=1&type=core_members", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hoobly": { + "disabled": true, + "tags": [ + "classified", + "in" + ], + "checkType": "status_code", + "alexaRank": 82838, + "urlMain": "https://www.hoobly.com", + "url": "https://www.hoobly.com/u/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VKruguDruzei": { + "tags": [ + "by", + "ru" + ], + "checkType": "response_url", + "alexaRank": 97988, + "urlMain": "http://vkrugudruzei.ru", + "url": "http://{username}.vkrugudruzei.ru/x/blog/all/", + "usernameClaimed": "irina", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "mynickname.com": { + "checkType": "message", + "absenceStrs": [ + "

Error 404: Page not found

", + "Nickname , certificate for username ", + "btn green", + "mailto:info@mynickname.com", + ">Register nickname

" + ], + "presenseStrs": [ + " title=", + "bold", + "title-line", + "codehtml", + "User offline" + ], + "url": "https://mynickname.com/{username}", + "urlMain": "https://mynickname.com", + "usernameClaimed": "godbrithil", + "usernameUnclaimed": "fqiakbtdhu", + "alexaRank": 80559, + "tags": [ + "social" + ] + }, + "forum.rzn.info": { + "urlMain": "https://forum.rzn.info", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "appleinsider.ru": { + "tags": [ + "news", + "ru", + "tech" + ], + "engine": "engine404", + "urlMain": "https://appleinsider.ru", + "url": "https://appleinsider.ru/author/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "alexaRank": 81464 + }, + "Ethereum-magicians": { + "tags": [ + "cr", + "forum" + ], + "engine": "Discourse", + "alexaRank": 82176, + "urlMain": "https://ethereum-magicians.org", + "usernameClaimed": "amxx", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cqham": { + "tags": [ + "ru", + "tech" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "alexaRank": 87032, + "urlMain": "http://www.cqham.ru", + "url": "http://www.cqham.ru/forum/member.php?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Polywork": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + ">404", + "ml-1", + "twitter:site", + "/users/sign_in", + " data-toggle=" + ], + "presenseStrs": [ + "", + "profile-name", + "profile_display_name", + "profile-username", + "active" + ], + "url": "https://www.polywork.com/{username}", + "urlMain": "https://www.polywork.com", + "usernameClaimed": "zoey123", + "usernameUnclaimed": "timhhdgent", + "alexaRank": 94644, + "tags": [ + "career" + ] + }, + "EuroFootball": { + "tags": [ + "ru" + ], + "checkType": "response_url", + "alexaRank": 90436, + "urlMain": "https://www.euro-football.ru", + "url": "https://www.euro-football.ru/user/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Govloop": { + "tags": [ + "education" + ], + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "alexaRank": 85027, + "urlMain": "https://www.govloop.com", + "url": "https://www.govloop.com/members/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ImgInn": { + "absenceStrs": [ + "Page Not Found - imginn.com" + ], + "presenseStrs": [ + "user-hd", + "userinfo" + ], + "url": "https://imginn.com/{username}/", + "urlMain": "https://imginn.com", + "usernameClaimed": "morgen_shtern", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 81635, + "source": "Instagram", + "tags": [ + "photo" + ], + "protection": [ + "cf_js_challenge" + ] + }, + "forum.spyderco.com": { + "urlMain": "https://forum.spyderco.com", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Wakatime": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "ng", + "ve" + ], + "checkType": "status_code", + "alexaRank": 85656, + "urlMain": "https://wakatime.com", + "url": "https://wakatime.com/@{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Trovo": { + "url": "https://trovo.live/s/{username}/", + "urlMain": "https://trovo.live", + "checkType": "message", + "absenceStrs": [ + "Uh Ohhh..." + ], + "usernameClaimed": "Aimilios", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 98820, + "disabled": true, + "tags": [ + "streaming" + ] + }, + "Icheckmovies": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "movies" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "alexaRank": 92240, + "urlMain": "https://www.icheckmovies.com/", + "url": "https://www.icheckmovies.com/profiles/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tl": { + "tags": [ + "de", + "dk" + ], + "checkType": "status_code", + "alexaRank": 100313, + "urlMain": "https://tl.net", + "url": "https://tl.net/forum/profile.php?user={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "custom_bot_protection" + ] + }, + "Designspiration": { + "protection": [ + "cf_js_challenge", + "tls_fingerprint" + ], + "checkType": "status_code", + "urlMain": "https://designspiration.com/", + "url": "https://designspiration.com/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 89022, + "tags": [ + "design" + ] + }, + "forum.garudalinux.org": { + "engine": "DiscourseJson", + "tags": [ + "forum" + ], + "urlMain": "https://forum.garudalinux.org", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "AnimeSuperHero": { + "disabled": true, + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 96111, + "urlMain": "https://animesuperhero.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "Truelancer": { + "tags": [ + "in" + ], + "protection": [ + "tls_fingerprint" + ], + "checkType": "message", + "presenseStrs": [ + "Hire Me" + ], + "absenceStrs": [ + "could not be found" + ], + "alexaRank": 90807, + "urlMain": "https://www.truelancer.com", + "url": "https://www.truelancer.com/freelancer/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "NameMC": { + "tags": [ + "gaming" + ], + "regexCheck": "^.{3,16}$", + "protection": [ + "tls_fingerprint" + ], + "checkType": "message", + "presenseStrs": [ + "Name History" + ], + "alexaRank": 89994, + "urlMain": "https://namemc.com/", + "url": "https://namemc.com/profile/{username}", + "usernameClaimed": "Notch", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "beyond3d": { + "tags": [ + "forum", + "pk", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://forum.beyond3d.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SportsTracker": { + "tags": [ + "pt", + "ru" + ], + "urlProbe": "https://api.sports-tracker.com/apiserver/v1/user/name/{username}", + "checkType": "message", + "absenceStrs": [ + "\"code\":\"404\"" + ], + "alexaRank": 97009, + "urlMain": "https://www.sports-tracker.com/", + "url": "https://www.sports-tracker.com/view_profile/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Baby.ru": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "error-page__title" + ], + "presenseStrs": [ + "user-name" + ], + "alexaRank": 90468, + "urlMain": "https://www.baby.ru/", + "url": "https://www.baby.ru/u/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "bigfooty.com": { + "tags": [ + "au", + "forum" + ], + "engine": "XenForo", + "alexaRank": 99620, + "urlMain": "https://www.bigfooty.com/forum/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ForumHouse": { + "disabled": true, + "protection": [ + "ddos_guard_challenge" + ], + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "alexaRank": 95719, + "urlMain": "https://www.forumhouse.ru/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rollitup": { + "tags": [ + "forum", + "us" + ], + "engine": "XenForo", + "alexaRank": 103275, + "urlMain": "https://www.rollitup.org", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "fotostrana.ru": { + "tags": [ + "ru" + ], + "engine": "engine404", + "urlMain": "https://fotostrana.ru", + "url": "https://fotostrana.ru/{username}/", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 99113 + }, + "forums.zooclub.ru": { + "disabled": true, + "urlMain": "https://forums.zooclub.ru", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lushstories": { + "tags": [ + "us" + ], + "checkType": "status_code", + "alexaRank": 83361, + "urlMain": "https://www.lushstories.com", + "url": "https://www.lushstories.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.pressball.by": { + "urlMain": "https://forum.pressball.by", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "by", + "forum" + ], + "disabled": true + }, + "Likee": { + "tags": [ + "video" + ], + "checkType": "message", + "absenceStrs": [ + "https://likee.video/@/" + ], + "presenseStrs": [ + "user_name" + ], + "alexaRank": 92663, + "url": "https://likee.video/@{username}", + "urlMain": "https://likee.video", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sa-mp.ucoz.de": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "http://sa-mp.ucoz.de", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "Movieforums": { + "disabled": true, + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "forum", + "la" + ], + "checkType": "message", + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "alexaRank": 100717, + "urlMain": "https://www.movieforums.com", + "url": "https://www.movieforums.com/community/member.php?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Crevado": { + "tags": [ + "design" + ], + "checkType": "status_code", + "alexaRank": 101238, + "urlMain": "https://crevado.com/", + "url": "https://{username}.crevado.com", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Movescount": { + "tags": [ + "maps" + ], + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "error=4&" + ], + "alexaRank": 108422, + "urlMain": "http://www.movescount.com", + "url": "http://www.movescount.com/en/members/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VKMOnline": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://forums.vkmonline.com", + "usernameClaimed": "irina", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "lightstalking.com": { + "urlMain": "https://www.lightstalking.com", + "checkType": "status_code", + "requestHeadOnly": true, + "url": "https://www.lightstalking.com/author/{username}/", + "usernameClaimed": "jasonrow", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "blog", + "photo" + ], + "alexaRank": 109244 + }, + "IRC-Galleria": { + "tags": [ + "fi" + ], + "checkType": "message", + "absenceStrs": [ + "Ei hakutuloksia" + ], + "alexaRank": 109436, + "urlMain": "https://irc-galleria.net", + "url": "https://irc-galleria.net/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "AreKamrbb": { + "tags": [ + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "К сожалению, мы ничего не нашли для вас.." + ], + "urlMain": "https://are.kamrbb.ru", + "url": "https://are.kamrbb.ru/?x=find&f={username}#top", + "usernameClaimed": "%D0%B0%D0%BB%D0%B8%D1%81%D0%B0", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hyundaitruckclub": { + "tags": [ + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "К сожалению, мы ничего не нашли для вас" + ], + "urlMain": "https://hyundaitruckclub.kamrbb.ru", + "url": "https://hyundaitruckclub.kamrbb.ru/?x=find&f={username}&type=topics&nick=on#top", + "usernameClaimed": "sokol", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mylot": { + "tags": [ + "pl" + ], + "checkType": "status_code", + "alexaRank": 101976, + "urlMain": "https://www.mylot.com/", + "url": "https://www.mylot.com/{username}", + "usernameClaimed": "just4him", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "GuruShots": { + "tags": [ + "photo" + ], + "checkType": "message", + "presenseStrs": [ + "GS POINTS" + ], + "alexaRank": 115314, + "urlMain": "https://gurushots.com/", + "url": "https://gurushots.com/{username}/photos", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SeoClerks": { + "tags": [ + "jp" + ], + "checkType": "response_url", + "alexaRank": 106199, + "urlMain": "https://www.seoclerks.com", + "url": "https://www.seoclerks.com/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "E621": { + "tags": [ + "art" + ], + "checkType": "message", + "absenceStrs": [ + " Not Found" + ], + "presenseStrs": [ + "<title> User" + ], + "alexaRank": 102772, + "urlMain": "https://e621.net", + "url": "https://e621.net/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Monkeytype": { + "url": "https://monkeytype.com/profile/{username}", + "urlMain": "https://monkeytype.com/", + "urlProbe": "https://api.monkeytype.com/users/{username}/profile", + "checkType": "status_code", + "usernameClaimed": "Lost_Arrow", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 101897, + "tags": [ + "gaming" + ] + }, + "Gingerbread": { + "tags": [ + "gb" + ], + "checkType": "status_code", + "presenseStrs": [ + "My Profile" + ], + "alexaRank": 104557, + "urlMain": "https://www.gingerbread.org.uk", + "url": "https://www.gingerbread.org.uk/members/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "rive.app": { + "tags": [ + "design" + ], + "engine": "engine404", + "urlMain": "https://rive.app", + "url": "https://rive.app/a/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 103685 + }, + "hochu": { + "tags": [ + "forum", + "ru", + "ua" + ], + "engine": "phpBB", + "urlMain": "http://forum.hochu.ua", + "usernameClaimed": "irina", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "CashMe": { + "errors": { + "Cash isn't available in your country yet.": "Access denied in your country, use proxy/vpn" + }, + "checkType": "status_code", + "urlMain": "https://cash.me/", + "url": "https://cash.me/${username}", + "usernameClaimed": "Jenny", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 106225, + "tags": [ + "finance", + "fintech" + ] + }, + "forum.kineshemec.ru": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://forum.kineshemec.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "community.p2pu.org": { + "engine": "DiscourseJson", + "urlMain": "https://community.p2pu.org", + "usernameClaimed": "system", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "mstdn.io": { + "checkType": "status_code", + "alexaRank": 107012, + "urlMain": "https://mstdn.io/", + "url": "https://mstdn.io/@{username}", + "usernameClaimed": "angristan", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "mastodon", + "social" + ] + }, + "HackTheBox": { + "tags": [ + "hacking" + ], + "checkType": "message", + "urlMain": "https://www.hackthebox.com/", + "url": "https://www.hackthebox.com/", + "urlProbe": "https://www.hackthebox.com/api/v4/register/check", + "requestMethod": "POST", + "requestPayload": { + "username": "{username}" + }, + "headers": { + "Content-Type": "application/json" + }, + "presenseStrs": [ + "already been taken" + ], + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 17918 + }, + "7dach": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 113301, + "urlMain": "https://7dach.ru/", + "url": "https://7dach.ru/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VitalFootball": { + "tags": [ + "forum", + "gb", + "pk" + ], + "engine": "XenForo", + "urlMain": "https://forums.vitalfootball.co.uk", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dota2": { + "disabled": true, + "tags": [ + "gaming", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Результаты отсутствуют", + "Поиск временно отключен", + "<h2>Поиск временно отключен</h2>" + ], + "alexaRank": 133528, + "urlMain": "https://dota2.ru/", + "url": "https://dota2.ru/forum/search?type=user&keywords={username}&sort_by=username", + "usernameClaimed": "farts", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Quibblo": { + "disabled": true, + "tags": [ + "discussion" + ], + "checkType": "response_url", + "alexaRank": 120091, + "urlMain": "https://www.quibblo.com/", + "url": "https://www.quibblo.com/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Etxt": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 110136, + "urlMain": "https://www.etxt.ru", + "url": "https://www.etxt.ru/{username}.html", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "d3": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 119764, + "urlMain": "https://d3.ru/", + "url": "https://d3.ru/user/{username}/posts", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hotcopper": { + "tags": [ + "finance" + ], + "checkType": "message", + "absenceStrs": [ + "error-page", + "error-page home container", + "card-footer-item", + "><main id=", + "card-content" + ], + "alexaRank": 115306, + "urlMain": "https://hotcopper.com.au", + "url": "https://hotcopper.com.au/search/search?type=post&users={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "ggyeplcpod", + "presenseStrs": [ + "title-td", + "title is-1", + "pagination ", + "toggle", + "active " + ] + }, + "Shazoo": { + "tags": [ + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "alexaRank": 108316, + "urlMain": "https://shazoo.ru", + "url": "https://shazoo.ru/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "doublecmd.h1n.ru": { + "urlMain": "https://doublecmd.h1n.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "YouNow": { + "tags": [ + "be" + ], + "urlProbe": "https://api.younow.com/php/api/broadcast/info/user={username}/", + "checkType": "message", + "absenceStrs": [ + "No users found" + ], + "alexaRank": 121444, + "urlMain": "https://www.younow.com/", + "url": "https://www.younow.com/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CapFriendly": { + "disabled": true, + "tags": [ + "ca" + ], + "regexCheck": "^[a-zA-z][a-zA-Z0-9_]{2,79}$", + "checkType": "message", + "absenceStrs": [ + "<div class=\"err show p5\">No results found</div>" + ], + "alexaRank": 123050, + "urlMain": "https://www.capfriendly.com/", + "url": "https://www.capfriendly.com/users/{username}", + "usernameClaimed": "thisactuallyexists", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Intigriti": { + "tags": [ + "eu", + "hacking" + ], + "checkType": "message", + "presenseStrs": [ + "avatar-container" + ], + "absenceStrs": [ + "We didn't find what you're looking for" + ], + "urlMain": "https://intigriti.com", + "url": "https://app.intigriti.com/profile/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 110156 + }, + "survivalistboards.com": { + "disabled": true, + "urlMain": "https://survivalistboards.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 120486 + }, + "Quartertothree": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forum.quartertothree.com", + "usernameClaimed": "rei", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Weasyl": { + "tags": [ + "art" + ], + "checkType": "status_code", + "alexaRank": 118991, + "urlMain": "https://www.weasyl.com", + "url": "https://www.weasyl.com/~{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "app.samsungfood.com": { + "checkType": "message", + "absenceStrs": [ + ">User not found</h1></div>" + ], + "presenseStrs": [ + "alternateName", + "totalTime" + ], + "url": "https://app.samsungfood.com/u/{username}", + "urlMain": "https://app.samsungfood.com", + "usernameClaimed": "moonlitraven", + "usernameUnclaimed": "onpigjbowo" + }, + "Touristlink": { + "tags": [ + "travel" + ], + "checkType": "message", + "absenceStrs": [ + "Members across the World" + ], + "alexaRank": 122352, + "urlMain": "https://www.touristlink.com", + "url": "https://www.touristlink.com/user/{username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nick-name.ru": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 123974, + "urlMain": "https://nick-name.ru/", + "url": "https://nick-name.ru/nickname/{username}/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tproger": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "<meta property=\"og:url\" content=\"https://tproger.ru/author/" + ], + "absenceStrs": [ + "<title>404" + ], + "alexaRank": 112016, + "urlMain": "https://tproger.ru", + "url": "https://tproger.ru/author/{username}/", + "usernameClaimed": "NickPrice", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Gamblejoe": { + "disabled": true, + "tags": [ + "de", + "mk", + "ua" + ], + "checkType": "status_code", + "presenseStrs": [ + "profile-page" + ], + "alexaRank": 143687, + "urlMain": "https://www.gamblejoe.com", + "url": "https://www.gamblejoe.com/profil/{username}/", + "usernameClaimed": "matthias", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "massagerepublic.com": { + "checkType": "status_code", + "url": "https://massagerepublic.com/u/{username}", + "urlMain": "https://massagerepublic.com", + "usernameClaimed": "lily88", + "usernameUnclaimed": "xzhsxfyfzi", + "alexaRank": 131993, + "tags": [ + "erotic" + ] + }, + "AllTheLyrics": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "music" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "engine": "vBulletin", + "alexaRank": 134061, + "urlMain": "https://www.allthelyrics.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mama": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "presenseStrs": [ + "b-user-fullname" + ], + "alexaRank": 131626, + "urlMain": "https://mama.ru", + "url": "https://mama.ru/members/{username}", + "usernameClaimed": "irina", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "W7forums": { + "engine": "XenForo", + "alexaRank": 123118, + "urlMain": "https://www.w7forums.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Gvectors": { + "tags": [ + "forum" + ], + "checkType": "status_code", + "alexaRank": 103170, + "urlMain": "https://gvectors.com", + "url": "https://gvectors.com/forum/profile/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Droidforums": { + "disabled": true, + "tags": [ + "forum" + ], + "errors": { + "You must be logged-in to do that.": "Login required" + }, + "engine": "XenForo", + "alexaRank": 126462, + "urlMain": "http://www.droidforums.net/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Vsemayki": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "404 Not Found" + ], + "alexaRank": 147557, + "urlMain": "https://www.vsemayki.ru/", + "url": "https://www.vsemayki.ru/designer/{username}", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "Clozemaster": { + "tags": [ + "education" + ], + "checkType": "message", + "absenceStrs": [ + "Oh no! Player not found" + ], + "alexaRank": 140746, + "urlMain": "https://www.clozemaster.com", + "url": "https://www.clozemaster.com/players/{username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "artinvestment": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://forum.artinvestment.ru/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nothing Community": { + "url": "https://nothing.community/u/{username}", + "urlMain": "https://nothing.community/", + "checkType": "status_code", + "usernameClaimed": "Carl", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 140149 + }, + "Old-games": { + "tags": [ + "pt", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "alexaRank": 133612, + "urlMain": "https://www.old-games.ru", + "url": "https://www.old-games.ru/forum/members/?username={username}", + "usernameClaimed": "viktort", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "GetMyUni": { + "tags": [ + "in" + ], + "checkType": "message", + "absenceStrs": [ + "Error 404" + ], + "alexaRank": 133011, + "urlMain": "https://getmyuni.com/", + "url": "https://www.getmyuni.com/user/{username}", + "usernameClaimed": "Subeesh.S30b0", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Mpgh": { + "urlSubpath": "/forum", + "disabled": true, + "tags": [ + "forum", + "jp" + ], + "engine": "vBulletin", + "alexaRank": 145664, + "urlMain": "https://www.mpgh.net/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ForumTauck": { + "tags": [ + "forum" + ], + "checkType": "message", + "presenseStrs": [ + "— Tauck Community" + ], + "urlMain": "https://forums.tauck.com", + "url": "https://forums.tauck.com/profile/{username}", + "usernameClaimed": "tashager", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Au": { + "tags": [ + "freelance", + "ru", + "shopping" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "<title>Пользователь не найден</title" + ], + "alexaRank": 171294, + "urlMain": "https://au.ru", + "url": "https://au.ru/user/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "bitpapa.com": { + "absenceStrs": [ + "/static/page-crash.svg" + ], + "presenseStrs": [ + "lbcUsername" + ], + "url": "https://bitpapa.com/ru/user/{username}", + "urlMain": "https://bitpapa.com", + "usernameClaimed": "Larisa70", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ], + "alexaRank": 116710 + }, + "Movie-list": { + "urlSubpath": "/forum", + "disabled": true, + "tags": [ + "ca", + "forum", + "pk" + ], + "engine": "vBulletin", + "alexaRank": 147678, + "urlMain": "https://www.movie-list.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Football": { + "tags": [ + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "presenseStrs": [ + "class=\"userprofile\"" + ], + "alexaRank": 160156, + "urlMain": "https://www.rusfootball.info/", + "url": "https://www.rusfootball.info/user/{username}/", + "usernameClaimed": "solo87", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Picarto": { + "absenceStrs": [ + "We are the world\\u2019s leading live streaming platform for creative minds. Come join us" + ], + "presenseStrs": [ + "\"success\":true" + ], + "url": "https://ptvintern.picarto.tv/metadescription/{username}", + "urlMain": "https://ptvintern.picarto.tv", + "usernameClaimed": "tamarinfrog", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "art", + "streaming" + ] + }, + "FreelanceJob": { + "disabled": true, + "protection": [ + "custom_bot_protection" + ], + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Кол-во просмотров аккаунта пользователя" + ], + "absenceStrs": [ + "<h1>Ошибка 404</h1>" + ], + "urlMain": "https://www.freelancejob.ru", + "url": "https://www.freelancejob.ru/users/{username}/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 155824 + }, + "popjustice": { + "disabled": true, + "tags": [ + "co", + "forum", + "sg" + ], + "engine": "XenForo", + "urlMain": "https://forum.popjustice.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "1001tracklists": { + "tags": [ + "music" + ], + "checkType": "message", + "presenseStrs": [ + "Info Page" + ], + "absenceStrs": [ + "Sorry, the requested user is not valid!" + ], + "alexaRank": 166736, + "urlMain": "https://www.1001tracklists.com", + "url": "https://www.1001tracklists.com/user/{username}/index.html", + "usernameClaimed": "JacoWilles", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Amperka": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "http://forum.amperka.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "FortniteTracker": { + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "gaming" + ], + "checkType": "status_code", + "alexaRank": 163060, + "urlMain": "https://fortnitetracker.com/challenges", + "url": "https://fortnitetracker.com/profile/all/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Hackthissite": { + "tags": [ + "hacking" + ], + "regexCheck": "^[^\\.\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "Cannot Retrieve Information For The Specified Username" + ], + "alexaRank": 153495, + "urlMain": "https://www.hackthissite.org", + "url": "https://www.hackthissite.org/user/view/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Arrse": { + "urlSubpath": "/community", + "protection": [ + "ip_reputation", + "tls_fingerprint" + ], + "tags": [ + "ca", + "forum", + "gb", + "pk" + ], + "engine": "XenForo", + "alexaRank": 153020, + "urlMain": "https://www.arrse.co.uk/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Forest": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 167973, + "urlMain": "https://forest.ru/", + "url": "https://forest.ru/forum/user/{username}/", + "usernameClaimed": "veter", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Heavy R": { + "protection": [ + "tls_fingerprint" + ], + "url": "https://www.heavy-r.com/user/{username}", + "urlMain": "https://www.heavy-r.com/", + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "Channel not found" + ], + "usernameClaimed": "kilroy222", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 163457, + "tags": [ + "porn" + ] + }, + "999.md": { + "url": "https://999.md/ru/profile/{username}", + "urlMain": "https://999.md", + "usernameClaimed": "ivanov25", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "status_code", + "alexaRank": 151485, + "tags": [ + "freelance", + "md", + "shopping" + ] + }, + "Beerintheevening": { + "tags": [ + "gb" + ], + "checkType": "message", + "absenceStrs": [ + "User does not exist." + ], + "alexaRank": 162283, + "urlMain": "http://www.beerintheevening.com", + "url": "http://www.beerintheevening.com/user_profile.shtml?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Livios": { + "disabled": true, + "checkType": "status_code", + "url": "https://www.livios.be/nl/forum/leden/{username}", + "urlMain": "https://www.livios.be", + "usernameClaimed": "lily88", + "usernameUnclaimed": "ldbdpisozv", + "alexaRank": 167899, + "tags": [ + "be", + "forum" + ], + "headers": { + "User-Agent": "python-requests/2.25.1" + } + }, + "Kwejk": { + "tags": [ + "pl" + ], + "checkType": "status_code", + "alexaRank": 167082, + "urlMain": "https://kwejk.pl", + "url": "https://kwejk.pl/uzytkownik/{username}#/tablica/", + "usernameClaimed": "ralia", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "eGPU": { + "tags": [ + "forum", + "jp", + "tech", + "tw" + ], + "checkType": "status_code", + "alexaRank": 188322, + "urlMain": "https://egpu.io/", + "url": "https://egpu.io/forums/profile/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis", + "protection": [ + "custom_bot_protection" + ] + }, + "millerovo161.ru": { + "engine": "uCoz", + "alexaRank": 183554, + "urlMain": "http://millerovo161.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "Pepper NL": { + "url": "https://nl.pepper.com/profile/{username}", + "urlMain": "https://nl.pepper.com/", + "checkType": "status_code", + "usernameClaimed": "Dynaw", + "usernameUnclaimed": "noonewouldeverusethis7", + "requestMethod": "GET" + }, + "Avizo": { + "tags": [ + "cz" + ], + "checkType": "response_url", + "alexaRank": 186290, + "urlMain": "https://www.avizo.cz/", + "url": "https://www.avizo.cz/{username}/", + "errorUrl": "https://www.avizo.cz/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Pronouns.page": { + "url": "https://pronouns.page/@{username}", + "urlMain": "https://pronouns.page/", + "checkType": "status_code", + "usernameClaimed": "andrea", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 168784, + "tags": [ + "social" + ] + }, + "programming.dev": { + "tags": [ + "lemmy" + ], + "checkType": "status_code", + "url": "https://programming.dev/u/{username}", + "urlProbe": "https://programming.dev/api/v3/user?username={username}", + "urlMain": "https://programming.dev", + "usernameClaimed": "snowe", + "usernameUnclaimed": "noonewouldeverusethis42", + "alexaRank": 172404 + }, + "dpils-scooter.ucoz.lv": { + "tags": [ + "ru", + "ua" + ], + "engine": "uCoz", + "urlMain": "http://dpils-scooter.ucoz.lv", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sokal.ucoz.lv": { + "tags": [ + "ru", + "ua" + ], + "engine": "uCoz", + "urlMain": "http://sokal.ucoz.lv", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "imgsrc.ru": { + "tags": [ + "be", + "de", + "es", + "pt", + "ru" + ], + "checkType": "response_url", + "alexaRank": 173382, + "urlMain": "https://imgsrc.ru/", + "url": "https://imgsrc.ru/main/user.php?user={username}", + "errorUrl": "https://imgsrc.ru/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.rmnt.ru": { + "urlMain": "https://forum.rmnt.ru", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "mt5": { + "disabled": true, + "tags": [ + "forum", + "pk" + ], + "engine": "vBulletin", + "urlMain": "https://forum.mt5.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "The AnswerBank": { + "disabled": true, + "tags": [ + "gb", + "q&a" + ], + "checkType": "message", + "absenceStrs": [ + "Welcome to the AnswerBank" + ], + "alexaRank": 181886, + "urlMain": "https://www.theanswerbank.co.uk", + "url": "https://www.theanswerbank.co.uk/members/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Radiokot": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "alexaRank": 169941, + "urlMain": "https://www.radiokot.ru", + "url": "https://www.radiokot.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Modx_pro": { + "tags": [ + "ru", + "uz" + ], + "checkType": "status_code", + "alexaRank": 153894, + "urlMain": "https://modx.pro", + "url": "https://modx.pro/users/{username}", + "usernameClaimed": "vgrish", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Coolminiornot": { + "urlSubpath": "/forums", + "disabled": true, + "tags": [ + "forum", + "sg" + ], + "engine": "vBulletin", + "alexaRank": 164398, + "urlMain": "http://www.coolminiornot.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gramho": { + "tags": [ + "photo" + ], + "checkType": "message", + "presenseStrs": [ + "Instagram Posts" + ], + "alexaRank": 191099, + "urlMain": "https://gramho.com/", + "url": "https://gramho.com/explore-hashtag/{username}", + "source": "Instagram", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Dasauge": { + "tags": [ + "de", + "pk" + ], + "checkType": "status_code", + "urlMain": "https://dasauge.co.uk", + "url": "https://dasauge.co.uk/-{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "footballindex": { + "tags": [ + "forum", + "gb", + "sg" + ], + "checkType": "status_code", + "urlMain": "https://forums.footballindex.co.uk", + "url": "https://forums.footballindex.co.uk/user/{username}", + "usernameClaimed": "misto", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "thewholesaleforums.co.uk": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "http://www.thewholesaleforums.co.uk/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sibmama": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Извините" + ], + "urlMain": "https://forum.sibmama.ru/", + "url": "https://forum.sibmama.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Stratege": { + "urlSubpath": "/forums", + "disabled": true, + "tags": [ + "forum", + "gaming", + "news", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 190964, + "urlMain": "https://www.stratege.ru", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mfd": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не найден." + ], + "urlMain": "http://forum.mfd.ru", + "url": "http://forum.mfd.ru/forum/search/?query=&method=And&userQuery={username}", + "usernameClaimed": "rublevka", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Thebigboss": { + "tags": [ + "tr" + ], + "checkType": "status_code", + "alexaRank": 180210, + "urlMain": "http://thebigboss.org", + "url": "http://thebigboss.org/author/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mylespaul": { + "disabled": true, + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 185027, + "urlMain": "https://www.mylespaul.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bdoutdoors": { + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "us" + ], + "checkType": "message", + "presenseStrs": [ + "memberHeader-avatar", + "memberHeader-blurb" + ], + "absenceStrs": [ + "The specified member cannot be found" + ], + "alexaRank": 182912, + "urlMain": "https://www.bdoutdoors.com", + "url": "https://www.bdoutdoors.com/forums/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ContactInBio (domain)": { + "absenceStrs": [ + "img/coffee.png" + ], + "presenseStrs": [ + "user-area" + ], + "url": "http://{username}.contactin.bio/", + "urlMain": "http://username.contactin.bio", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "links" + ] + }, + "Listography": { + "tags": [ + "sharing" + ], + "errors": { + "An error has occurred.": "Site error" + }, + "regexCheck": "^[^\\.\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "No such user." + ], + "alexaRank": 181842, + "urlMain": "https://listography.com/adam", + "url": "https://listography.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Professionali": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 181602, + "urlMain": "https://professionali.ru", + "url": "https://professionali.ru/~{username}", + "usernameClaimed": "mark", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Liinks": { + "disabled": true, + "tags": [ + "links" + ], + "checkType": "message", + "presenseStrs": [ + "user", + " thumbnail" + ], + "absenceStrs": [ + "_fs_namespace", + " CUSTOM_HOSTNAME" + ], + "url": "https://www.liinks.co/{username}", + "urlMain": "https://www.liinks.co", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 185056 + }, + "Rlocman": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://www.rlocman.ru", + "usernameClaimed": "elnat", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 186191 + }, + "Kosmetista": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "profile-content" + ], + "absenceStrs": [ + "Упс! Вот это поворот!" + ], + "alexaRank": 197894, + "urlMain": "https://kosmetista.ru", + "url": "https://kosmetista.ru/profile/{username}/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Riftgame": { + "tags": [ + "cr", + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "urlMain": "http://forums.riftgame.com", + "url": "http://forums.riftgame.com/members/{username}.html", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fluther": { + "protection": [ + "tls_fingerprint" + ], + "tags": [ + "q&a" + ], + "checkType": "status_code", + "alexaRank": 192055, + "urlMain": "https://www.fluther.com/", + "url": "https://www.fluther.com/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "KharkovForum": { + "disabled": true, + "tags": [ + "forum", + "ua" + ], + "engine": "vBulletin", + "alexaRank": 185020, + "urlMain": "https://www.kharkovforum.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "juce": { + "tags": [ + "ca", + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forum.juce.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Musiker-board": { + "disabled": true, + "tags": [ + "de", + "forum" + ], + "engine": "XenForo", + "alexaRank": 186008, + "urlMain": "https://www.musiker-board.de", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Jigidi": { + "tags": [ + "hobby" + ], + "checkType": "status_code", + "errors": { + "

Welcome to Jigidi

": "reCAPTCHA challenge" + }, + "alexaRank": 199456, + "urlMain": "https://www.jigidi.com/", + "url": "https://www.jigidi.com/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ForumOdUa": { + "disabled": true, + "tags": [ + "forum", + "ro", + "ua" + ], + "engine": "vBulletin", + "alexaRank": 152919, + "urlMain": "https://forumodua.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Aminus3": { + "protection": [ + "ip_reputation", + "cf_js_challenge" + ], + "absenceStrs": [ + "Expires", + " no-cache" + ], + "presenseStrs": [ + "image/ico", + " title=" + ], + "url": "https://{username}.aminus3.com/", + "urlMain": "https://aminus3.com", + "usernameClaimed": "beautifulworld", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "photo" + ], + "alexaRank": 187361 + }, + "Shikimori": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 183771, + "urlMain": "https://shikimori.one", + "url": "https://shikimori.one/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.arjlover.net": { + "urlMain": "http://forum.arjlover.net", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "disabled": true + }, + "Antichat": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://forum.antichat.ru/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "australianfrequentflyer.com.au": { + "tags": [ + "au", + "forum" + ], + "engine": "XenForo", + "alexaRank": 220507, + "urlMain": "https://www.australianfrequentflyer.com.au/community/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Cloob": { + "tags": [ + "ir" + ], + "checkType": "status_code", + "alexaRank": 208587, + "urlMain": "https://www.cloob.com/", + "url": "https://www.cloob.com/name/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Dev.by": { + "absenceStrs": [ + "error-page" + ], + "presenseStrs": [ + "profile__info" + ], + "url": "https://id.dev.by/users/{username}", + "urlMain": "https://id.dev.by", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "by", + "news", + "tech" + ], + "disabled": true + }, + "Pbnation": { + "ignore403": true, + "disabled": true, + "tags": [ + "ca" + ], + "checkType": "message", + "absenceStrs": [ + "This user has not registered" + ], + "alexaRank": 198609, + "urlMain": "https://www.pbnation.com/", + "url": "https://www.pbnation.com/member.php?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chemport": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "alexaRank": 206291, + "urlMain": "https://www.chemport.ru", + "usernameClaimed": "serge", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chollometro": { + "url": "https://www.chollometro.com/profile/{username}", + "urlMain": "https://www.chollometro.com/", + "checkType": "status_code", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 228859, + "requestMethod": "GET", + "tags": [ + "es", + "shopping" + ] + }, + "forum.hr": { + "tags": [ + "forum", + "hr" + ], + "engine": "vBulletin", + "alexaRank": 196840, + "urlMain": "https://www.forum.hr", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ], + "presenseStrs": [ + "profilefield_list" + ] + }, + "Sbazar.cz": { + "tags": [ + "cz", + "shopping" + ], + "checkType": "status_code", + "alexaRank": 194304, + "urlMain": "https://www.sbazar.cz/", + "url": "https://www.sbazar.cz/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "vintage-mustang.com": { + "protection": [ + "ip_reputation" + ], + "urlMain": "https://vintage-mustang.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 195116 + }, + "Postila": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 205148, + "urlMain": "https://postila.ru/", + "url": "https://postila.ru/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Runitonce": { + "tags": [ + "ca" + ], + "checkType": "response_url", + "alexaRank": 203000, + "urlMain": "https://www.runitonce.com/", + "url": "https://www.runitonce.com/users/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Allhockey": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 200403, + "urlMain": "https://allhockey.ru/", + "url": "https://allhockey.ru/blog/{username}", + "usernameClaimed": "Dmitri%20Nikulin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "the-mainboard.com": { + "disabled": true, + "tags": [ + "forum", + "us" + ], + "engine": "XenForo", + "alexaRank": 220198, + "urlMain": "http://the-mainboard.com/index.php", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.gong.bg": { + "urlMain": "https://forum.gong.bg", + "engine": "phpBB", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "bg", + "forum" + ] + }, + "Elixirforum": { + "tags": [ + "coding", + "forum" + ], + "engine": "Discourse", + "alexaRank": 188233, + "urlMain": "https://elixirforum.com", + "usernameClaimed": "clmay", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Redcafe": { + "tags": [ + "forum", + "gb", + "sg" + ], + "engine": "XenForo", + "alexaRank": 210969, + "urlMain": "https://www.redcafe.net", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pregame": { + "tags": [ + "us" + ], + "checkType": "response_url", + "alexaRank": 213813, + "urlMain": "https://pregame.com", + "url": "https://pregame.com/members/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Velomania": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://forum.velomania.ru/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Vapenews": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Ошибка 404" + ], + "presenseStrs": [ + "Личное" + ], + "alexaRank": 208187, + "urlMain": "https://vapenews.ru/", + "url": "https://vapenews.ru/profile/{username}", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "bbs.evony.com": { + "tags": [ + "forum", + "pk", + "tr" + ], + "engine": "vBulletin", + "urlMain": "http://bbs.evony.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "oshwlab.com": { + "checkType": "message", + "absenceStrs": [ + "", + "error-wrap", + "error-part", + "btn-blue", + " error" + ], + "presenseStrs": [ + "profile", + " style=", + " title=", + "Twitter", + "profile-header" + ], + "url": "https://oshwlab.com/{username}", + "urlMain": "https://oshwlab.com", + "usernameClaimed": "zoey123", + "usernameUnclaimed": "uckupswapv", + "alexaRank": 209009, + "tags": [ + "tech" + ] + }, + "forum.vectric.com": { + "urlMain": "https://forum.vectric.com", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "protection": [ + "cf_js_challenge" + ], + "disabled": true + }, + "sevenstring.org": { + "disabled": true, + "protection": [ + "ip_reputation" + ], + "urlMain": "https://sevenstring.org", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 218320 + }, + "Snbforums": { + "tags": [ + "forum", + "us" + ], + "checkType": "message", + "presenseStrs": [ + "Reaction score" + ], + "alexaRank": 208676, + "urlMain": "https://www.snbforums.com", + "url": "https://www.snbforums.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis777", + "protection": [ + "tls_fingerprint" + ] + }, + "WiredNewYork": { + "urlSubpath": "/forum", + "disabled": true, + "tags": [ + "forum", + "pk", + "us" + ], + "errors": { + "Wired New York forum maintenance": "Site maintenance" + }, + "engine": "vBulletin", + "alexaRank": 208358, + "urlMain": "http://wirednewyork.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pr0gramm": { + "tags": [ + "de" + ], + "checkType": "status_code", + "urlMain": "https://pr0gramm.com/", + "url": "https://pr0gramm.com/api/profile/info?name={username}", + "usernameClaimed": "cha0s", + "usernameUnclaimed": "noonewouldeverusethis123123123123123123", + "alexaRank": 215077 + }, + "Bratsk Forum": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "urlMain": "http://forum.bratsk.org", + "url": "http://forum.bratsk.org/member.php?username={username}", + "usernameClaimed": "nekto", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Stereo": { + "tags": [ + "nl", + "ru" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "status_code", + "alexaRank": 213854, + "urlMain": "https://stereo.ru/", + "url": "https://stereo.ru/users/@{username}", + "usernameClaimed": "Yamiha", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Showme": { + "tags": [ + "education" + ], + "checkType": "status_code", + "alexaRank": 212359, + "urlMain": "https://www.showme.com", + "url": "https://www.showme.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Onlyfinder": { + "disabled": true, + "absenceStrs": [ + "\"rows\":[]" + ], + "presenseStrs": [ + "Username" + ], + "url": "https://onlyfinder.com/json/search?q={username}&start=0", + "urlMain": "https://onlyfinder.com", + "usernameClaimed": "wilaribeiro", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "headers": { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36", + "accept": "application/json, text/javascript, */*; q=0.01", + "x-requested-with": "XMLHttpRequest", + "cookie": "t=93712308; __cflb=02DiuFyCGPVyrmPMNwK31DjBY5udTKcbYh9HYtAX6rR1n" + }, + "alexaRank": 203390, + "tags": [ + "webcam" + ] + }, + "Runnersworld": { + "tags": [ + "forum", + "sport" + ], + "checkType": "status_code", + "urlMain": "https://forums.runnersworld.co.uk/", + "url": "https://forums.runnersworld.co.uk/profile/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Lori": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 213812, + "urlMain": "https://lori.ru", + "url": "https://lori.ru/{username}", + "usernameClaimed": "Mishkova", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "4stor": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 223005, + "urlMain": "https://4stor.ru", + "url": "https://4stor.ru/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mamuli": { + "tags": [ + "ru", + "ua" + ], + "checkType": "status_code", + "alexaRank": 224558, + "urlMain": "https://mamuli.club/", + "url": "https://mamuli.club/profile/{username}", + "usernameClaimed": "Milypa", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Qwas": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://forum.qwas.ru", + "url": "http://forum.qwas.ru/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "disman3", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DefensiveCarry": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "us" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "errors": { + "POW_CHALLENGE_DATA": "Anti-bot challenge" + }, + "alexaRank": 227766, + "urlMain": "https://www.defensivecarry.com", + "url": "https://www.defensivecarry.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "Office-forums": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 215095, + "urlMain": "https://www.office-forums.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fotothing": { + "disabled": true, + "tags": [ + "photo" + ], + "checkType": "message", + "absenceStrs": [ + "File Not Found" + ], + "alexaRank": 216255, + "urlMain": "http://www.fotothing.com", + "url": "http://www.fotothing.com/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Addons.wago": { + "url": "https://addons.wago.io/user/{username}", + "urlMain": "https://addons.wago.io/", + "checkType": "status_code", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Snooth": { + "tags": [ + "news" + ], + "checkType": "message", + "absenceStrs": [ + "Page not found" + ], + "presenseStrs": [ + "content=\"https://www.snooth.com/author/" + ], + "alexaRank": 225759, + "urlMain": "https://www.snooth.com/", + "url": "https://www.snooth.com/author/{username}/", + "usernameClaimed": "joshua", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "21buttons": { + "absenceStrs": [ + "not-found__main" + ], + "presenseStrs": [ + "profile-info" + ], + "url": "https://www.21buttons.com/buttoner/{username}", + "urlMain": "https://www.21buttons.com", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "fashion", + "networking" + ], + "alexaRank": 379171 + }, + "Loveplanet": { + "disabled": true, + "tags": [ + "dating", + "ru" + ], + "checkType": "message", + "errors": { + "has been temporarily blocked": "IP ban" + }, + "absenceStrs": [ + "Запрошенная вами страница не найдена.", + "Данные о выбранном пользователе не существуют", + "Information on selected user does not exist" + ], + "alexaRank": 217930, + "urlMain": "https://loveplanet.ru", + "url": "https://loveplanet.ru/page/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bikepost": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 219746, + "urlMain": "https://bikepost.ru", + "url": "https://bikepost.ru/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forums.eagle.ru": { + "disabled": true, + "tags": [ + "ca", + "forum", + "gaming", + "gb" + ], + "engine": "vBulletin", + "urlMain": "https://forums.eagle.ru", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "community.clearlinux.org": { + "urlMain": "https://community.clearlinux.org", + "engine": "Discourse", + "usernameClaimed": "elo", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "tech" + ] + }, + "subaruforester.org": { + "protection": [ + "ip_reputation" + ], + "urlMain": "https://subaruforester.org", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 231634 + }, + "subaruoutback.org": { + "protection": [ + "ip_reputation" + ], + "urlMain": "https://subaruoutback.org", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 223081 + }, + "Bobrdobr": { + "tags": [ + "az", + "ru", + "tr", + "ua" + ], + "checkType": "message", + "presenseStrs": [ + "Закладки пользователя" + ], + "absenceStrs": [ + "Страница не найдена." + ], + "alexaRank": 234669, + "urlMain": "https://bobrdobr.ru", + "url": "https://bobrdobr.ru/people/{username}/", + "usernameClaimed": "igrozona", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Motorka": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://forum.motorka.org", + "usernameClaimed": "zavitay", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "svtperformance.com": { + "urlMain": "https://svtperformance.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 225765 + }, + "ww2aircraft.net": { + "engine": "XenForo", + "urlMain": "https://ww2aircraft.net/forum/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 241845, + "tags": [ + "forum" + ] + }, + "railforums.co.uk": { + "tags": [ + "forum", + "jp" + ], + "engine": "XenForo", + "alexaRank": 231549, + "urlMain": "https://www.railforums.co.uk", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ramta": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "По вашему запросу ничего не найдено." + ], + "urlMain": "http://ramta.0pk.ru", + "url": "http://ramta.0pk.ru/search.php?action=search&keywords=&author={username}", + "usernameClaimed": "zulus", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "GotovimDoma": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "<title> Информация", + "Подходящих тем или сообщений не найдено." + ], + "alexaRank": 228717, + "urlMain": "https://gotovim-doma.ru", + "url": "https://gotovim-doma.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "Maxxi", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Blipfoto": { + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "absenceStrs": [ + "Your photo journal | Blipfoto" + ], + "presenseStrs": [ + "biography", + "biography-full", + "profile-sidebar", + "profile-content", + "state" + ], + "url": "https://www.blipfoto.com/{username}", + "urlMain": "https://www.blipfoto.com", + "usernameClaimed": "Wildstar", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "photo" + ], + "alexaRank": 235440 + }, + "Animeforum": { + "disabled": true, + "tags": [ + "forum", + "pk", + "vn" + ], + "engine": "vBulletin", + "alexaRank": 232710, + "urlMain": "https://www.animeforum.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Forums-bluemoon-mcfc": { + "tags": [ + "forum", + "gb" + ], + "engine": "XenForo", + "urlMain": "https://forums.bluemoon-mcfc.co.uk", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hpc": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "alexaRank": 229603, + "urlMain": "https://hpc.ru", + "url": "https://hpc.ru/board/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pentester Lab": { + "url": "https://pentesterlab.com/profile/{username}", + "urlMain": "https://pentesterlab.com/", + "checkType": "status_code", + "regexCheck": "^[\\w]{4,30}$", + "usernameClaimed": "0day", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 224948, + "tags": [ + "hacking" + ] + }, + "Gribnyemesta": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "профиль забанен или удален" + ], + "urlMain": "https://gribnyemesta.unoforum.pro", + "url": "https://gribnyemesta.unoforum.pro/?32-{username}", + "usernameClaimed": "raevsku", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Ruby-forum": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "alexaRank": 232048, + "urlMain": "https://www.ruby-forum.com", + "usernameClaimed": "tomconnolly", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "EduGeek": { + "disabled": true, + "tags": [ + "education" + ], + "engine": "vBulletin", + "urlMain": "https://www.edugeek.net", + "usernameClaimed": "witch", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 239950 + }, + "justmj.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://justmj.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 239198, + "tags": [ + "blog", + "ru" + ] + }, + "forums.immigration.com": { + "urlMain": "https://forums.immigration.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Empflix": { + "tags": [ + "de", + "fr", + "porn" + ], + "checkType": "response_url", + "alexaRank": 244947, + "urlMain": "https://www.empflix.com", + "url": "https://www.empflix.com/profile/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hackenproof": { + "disabled": true, + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "ua" + ], + "checkType": "message", + "presenseStrs": [ + "Stats" + ], + "absenceStrs": [ + "Top hackers of" + ], + "alexaRank": 243108, + "urlMain": "https://hackenproof.com/arbin", + "url": "https://hackenproof.com/{username}", + "usernameClaimed": "arbin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nitro Type": { + "url": "https://www.nitrotype.com/racer/{username}", + "urlMain": "https://www.nitrotype.com/", + "checkType": "message", + "absenceStrs": [ + "Nitro Type | Competitive Typing Game | Race Your Friends" + ], + "usernameClaimed": "jianclash", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "gaming" + ], + "alexaRank": 249464 + }, + "chsnik-kz.ucoz.kz": { + "tags": [ + "kz" + ], + "engine": "uCoz", + "urlMain": "http://chsnik-kz.ucoz.kz", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "muz-fresh.ucoz.kz": { + "tags": [ + "kz" + ], + "engine": "uCoz", + "urlMain": "http://muz-fresh.ucoz.kz", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "RomanticCollection": { + "tags": [ + "ru" + ], + "errors": { + "Вы не можете произвести поиск сразу после предыдущего": "Too many requests" + }, + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "alexaRank": 239165, + "urlMain": "https://www.romanticcollection.ru", + "url": "https://www.romanticcollection.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "Prim@", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "HSX": { + "checkType": "message", + "presenseStrs": [ + "profile-info" + ], + "absenceStrs": [ + "reg-container" + ], + "url": "https://www.hsx.com/profile/{username}", + "urlMain": "https://www.hsx.com", + "usernameClaimed": "petepetit", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "finance" + ], + "alexaRank": 233798 + }, + "SocialLibremOne": { + "checkType": "status_code", + "urlMain": "https://social.librem.one", + "url": "https://social.librem.one/@{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "tech" + ] + }, + "Blast": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "alexaRank": 255291, + "urlMain": "https://www.blast.hk", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tellonym.me": { + "tags": [ + "de", + "sa" + ], + "checkType": "status_code", + "alexaRank": 243708, + "urlMain": "https://tellonym.me/", + "url": "https://tellonym.me/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Anibox": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "alexaRank": 263121, + "urlMain": "https://www.anibox.org", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "tv.ucoz.club": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://tv.ucoz.club", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "Chipmaker": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Результатов поиска нет. Расширьте критерии поиска." + ], + "alexaRank": 258076, + "urlMain": "https://www.chipmaker.ru", + "url": "https://www.chipmaker.ru/search/?q={username}&quick=1&type=core_members", + "usernameClaimed": "hiro", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Niketalk": { + "ignore403": true, + "tags": [ + "fashion", + "forum", + "sport", + "us" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "alexaRank": 276599, + "urlMain": "https://niketalk.com", + "url": "https://niketalk.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CS-Lords": { + "tags": [ + "gaming", + "ru" + ], + "engine": "uCoz", + "alexaRank": 273250, + "urlMain": "http://cs-lords.ru", + "usernameClaimed": "Lexx", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SoylentNews": { + "tags": [ + "us" + ], + "checkType": "message", + "presenseStrs": [ + "class=\"data_head\"" + ], + "absenceStrs": [ + "The user you requested does not exist, no matter how much you wish this might be the case." + ], + "alexaRank": 261701, + "urlMain": "https://soylentnews.org", + "url": "https://soylentnews.org/~{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Signal": { + "tags": [ + "forum", + "tech" + ], + "engine": "Discourse", + "urlMain": "https://community.signalusers.org", + "usernameClaimed": "jlund", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TruckersMP.com": { + "tags": [ + "de", + "forum", + "tr" + ], + "checkType": "message", + "absenceStrs": [ + "There were no results for your search.", + "Forums currently down for maintenance. No ETA on return." + ], + "urlMain": "https://forum.truckersmp.com", + "url": "https://forum.truckersmp.com/index.php?/search/&q={username}&type=core_members", + "usernameClaimed": "ireacher", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hunttalk": { + "disabled": true, + "protection": [ + "cf_firewall" + ], + "tags": [ + "forum", + "us" + ], + "engine": "XenForo", + "urlMain": "https://www.hunttalk.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 297539 + }, + "michigan-sportsman.com": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "forum", + "us" + ], + "engine": "XenForo", + "alexaRank": 257577, + "urlMain": "http://www.michigan-sportsman.com/forum/", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Shophelp": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 282939, + "urlMain": "https://shophelp.ru/", + "url": "https://shophelp.ru/profile/{username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Promodescuentos": { + "url": "https://www.promodescuentos.com/profile/{username}", + "urlMain": "https://www.promodescuentos.com/", + "checkType": "status_code", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 310229, + "requestMethod": "GET", + "tags": [ + "mx", + "shopping" + ] + }, + "mir-stalkera.ru": { + "engine": "uCoz", + "urlMain": "http://mir-stalkera.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john", + "alexaRank": 287731, + "tags": [ + "gaming", + "ru" + ] + }, + "sorento.kia-club.ru": { + "urlMain": "http://sorento.kia-club.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "vishivalochka.ru": { + "engine": "uCoz", + "alexaRank": 269935, + "urlMain": "http://vishivalochka.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "hobby", + "ru" + ] + }, + "Proshkolu": { + "tags": [ + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "Пользователь не найден" + ], + "alexaRank": 269333, + "urlMain": "https://proshkolu.ru", + "url": "https://proshkolu.ru/user/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "strat-talk.com": { + "disabled": true, + "protection": [ + "ip_reputation" + ], + "urlMain": "https://strat-talk.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 271655 + }, + "Gunboards": { + "tags": [ + "forum" + ], + "presenseStrs": [ + "latest-activity" + ], + "engine": "XenForo", + "urlMain": "https://forums.gunboards.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.nvworld.ru": { + "urlMain": "https://forum.nvworld.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru", + "ua" + ] + }, + "Pepper PL": { + "url": "https://www.pepper.pl/profile/{username}", + "urlMain": "https://www.pepper.pl/", + "checkType": "status_code", + "usernameClaimed": "FireChicken", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "pl" + ], + "alexaRank": 284906, + "requestMethod": "GET" + }, + "Biketrials": { + "tags": [ + "pk", + "ru", + "vn" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "alexaRank": 276182, + "urlMain": "http://www.biketrials.ru", + "url": "http://www.biketrials.ru/live/member.php?username={username}", + "usernameClaimed": "temka", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "boards.insidethestar.com": { + "urlMain": "https://boards.insidethestar.com", + "engine": "Discourse", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Hctorpedo": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 280327, + "urlMain": "http://hctorpedo.ru", + "url": "http://hctorpedo.ru/user/{username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Geodesist": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "alexaRank": 310577, + "urlMain": "https://geodesist.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "lada-vesta.net": { + "urlMain": "http://www.lada-vesta.net", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "auto", + "forum", + "ru" + ], + "alexaRank": 301284 + }, + "Thefirearmsforum": { + "protection": [ + "ip_reputation" + ], + "tags": [ + "forum", + "us" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found. Please enter a member's entire name." + ], + "errors": { + "POW_CHALLENGE_DATA": "Anti-bot challenge" + }, + "urlMain": "https://www.thefirearmsforum.com", + "url": "https://www.thefirearmsforum.com/members/?username={username}", + "usernameClaimed": "willieb", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 281720 + }, + "Math10": { + "urlSubpath": "/forum", + "disabled": true, + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "alexaRank": 284273, + "urlMain": "https://www.math10.com/", + "usernameClaimed": "phw", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Flashflashrevolution": { + "tags": [ + "gaming" + ], + "checkType": "response_url", + "alexaRank": 293120, + "urlMain": "http://www.flashflashrevolution.com", + "url": "http://www.flashflashrevolution.com/profile/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.zone-game.info": { + "engine": "vBulletin", + "urlMain": "https://forum.zone-game.info", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "disabled": true + }, + "sigtalk.com": { + "protection": [ + "ip_reputation" + ], + "urlMain": "https://sigtalk.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 285784 + }, + "33bru": { + "tags": [ + "ru", + "ua" + ], + "regexCheck": "^[a-zA-Z0-9-]{3,}$", + "checkType": "message", + "presenseStrs": [ + "Профиль пользователя" + ], + "absenceStrs": [ + "Извините, такого пользователя не существует" + ], + "alexaRank": 291714, + "urlMain": "http://33bru.com/", + "url": "http://{username}.33bru.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Avtomarket": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Такой пользователь не найден" + ], + "alexaRank": 280487, + "urlMain": "https://avtomarket.ru", + "url": "https://avtomarket.ru/u/{username}/", + "usernameClaimed": "expert20144", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VideogameGeek": { + "ignore403": true, + "tags": [ + "gaming", + "news" + ], + "checkType": "message", + "absenceStrs": [ + "User does not exist" + ], + "alexaRank": 290793, + "urlMain": "https://videogamegeek.com", + "url": "https://videogamegeek.com/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "101xp.com": { + "tags": [ + "forum", + "gaming", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://forum-ru.101xp.com", + "usernameClaimed": "aida", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Diskusjon.no": { + "url": "https://www.diskusjon.no", + "urlMain": "https://www.diskusjon.no", + "urlProbe": "https://www.diskusjon.no/?app=core&module=system&controller=ajax&do=usernameExists&input={username}", + "checkType": "message", + "absenceStrs": [ + "{\"result\":\"ok\"}" + ], + "regexCheck": "^[a-zA-Z0-9_.-]{3,40}$", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 293242, + "tags": [ + "forum", + "no" + ] + }, + "TheFastlaneForum": { + "disabled": true, + "tags": [ + "forum", + "us" + ], + "engine": "XenForo", + "alexaRank": 300653, + "urlMain": "https://www.thefastlaneforum.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "BeerMoneyForum": { + "disabled": true, + "ignore403": true, + "tags": [ + "finance", + "forum", + "gambling" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found." + ], + "alexaRank": 283673, + "urlMain": "https://www.beermoneyforum.com", + "url": "https://www.beermoneyforum.com/members/?username={username}", + "usernameClaimed": "Yugocean", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mac-help": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 290689, + "urlMain": "https://www.mac-help.com", + "usernameClaimed": "newsbot", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "dfpd-forum.siemens.ru": { + "urlMain": "https://dfpd-forum.siemens.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "disabled": true + }, + "dwg": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://forum.dwg.ru/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Go365": { + "disabled": true, + "checkType": "status_code", + "urlMain": "https://community.go365.com", + "url": "https://community.go365.com/people/{username}", + "usernameClaimed": "go365admin3", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "FacultyOfMedicine": { + "tags": [ + "eg", + "forum" + ], + "engine": "XenForo", + "urlMain": "https://forum.facmedicine.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "AnimeUKNews": { + "tags": [ + "forum", + "pk" + ], + "engine": "XenForo", + "urlMain": "https://forums.animeuknews.net/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mcfc-fan.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://mcfc-fan.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 302583, + "tags": [ + "ru", + "sport" + ] + }, + "Pedsovet": { + "disabled": true, + "tags": [ + "ru" + ], + "engine": "uCoz", + "alexaRank": 290241, + "urlMain": "https://pedsovet.su/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Affiliatefix": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 282446, + "urlMain": "https://www.affiliatefix.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hipforums": { + "tags": [ + "forum", + "ru" + ], + "disabled": true, + "engine": "XenForo", + "alexaRank": 304503, + "urlMain": "https://www.hipforums.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "4gameforum": { + "tags": [ + "forum", + "kr", + "ru" + ], + "engine": "XenForo", + "alexaRank": 307726, + "urlMain": "https://4gameforum.com", + "usernameClaimed": "persty", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DMOJ": { + "protection": [ + "cf_js_challenge" + ], + "url": "https://dmoj.ca/user/{username}", + "urlMain": "https://dmoj.ca/", + "checkType": "message", + "presenseStrs": [ + "user-info-page", + "user-sidebar" + ], + "absenceStrs": [ + "No such user" + ], + "usernameClaimed": "junferno", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 298460, + "tags": [ + "ca", + "coding" + ] + }, + "2d-3d": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 324339, + "urlMain": "https://www.2d-3d.ru", + "url": "https://www.2d-3d.ru/user/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Sysadmins": { + "tags": [ + "forum", + "ru", + "tech" + ], + "checkType": "message", + "absenceStrs": [ + "Could not obtain user posts information" + ], + "alexaRank": 301563, + "urlMain": "https://sysadmins.ru", + "url": "https://sysadmins.ru/member{username}.html", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "custom_bot_protection" + ] + }, + "nightbot": { + "tags": [ + "jp" + ], + "urlProbe": "https://api.nightbot.tv/1/channels/t/{username}", + "checkType": "status_code", + "alexaRank": 297361, + "urlMain": "https://nightbot.tv/", + "url": "https://nightbot.tv/t/{username}/commands", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Truesteamachievements": { + "tags": [ + "az", + "gb" + ], + "checkType": "status_code", + "alexaRank": 300191, + "urlMain": "https://truesteamachievements.com", + "url": "https://truesteamachievements.com/gamer/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Proglib": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 294869, + "urlMain": "https://proglib.io", + "url": "https://proglib.io/u/{username}/posts", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "QuestionableQuesting": { + "tags": [ + "forum", + "gb", + "jp" + ], + "engine": "XenForo", + "urlMain": "https://forum.questionablequesting.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "Plug.DJ": { + "disabled": true, + "tags": [ + "music" + ], + "checkType": "status_code", + "alexaRank": 302508, + "urlMain": "https://plug.dj/", + "url": "https://plug.dj/@/{username}", + "usernameClaimed": "plug-dj-rock", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "motorhomefun.co.uk": { + "disabled": true, + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 310274, + "urlMain": "http://www.motorhomefun.co.uk/forum/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Piccsy": { + "absenceStrs": [ + "my-modal", + "Looks like you're a little lost." + ], + "presenseStrs": [ + "Username" + ], + "regexCheck": "^[^\\.]+$", + "url": "http://{username}.piccsy.com/", + "urlMain": "http://piccsy.com", + "usernameClaimed": "orientcement", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "photo" + ], + "alexaRank": 318651 + }, + "Hudson Rock": { + "url": "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/search-by-username?username={username}", + "urlMain": "https://hudsonrock.com", + "checkType": "message", + "absenceStrs": [ + "This username is not associated" + ], + "usernameClaimed": "testadmin", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 327352, + "tags": [ + "hacking" + ] + }, + "ifish.net": { + "protection": [ + "ip_reputation" + ], + "urlMain": "https://ifish.net", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 330095 + }, + "hozpitality": { + "presenseStrs": [ + "USERNAME" + ], + "url": "https://www.hozpitality.com/{username}/profile", + "urlMain": "https://www.hozpitality.com", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "response_url", + "alexaRank": 309981, + "tags": [ + "career" + ] + }, + "drupal.ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Страница не найдена - 404" + ], + "presenseStrs": [ + "
    " + ], + "urlMain": "https://drupal.ru", + "url": "https://drupal.ru/username/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 316892 + }, + "Spells8": { + "url": "https://forum.spells8.com/u/{username}", + "urlMain": "https://spells8.com", + "checkType": "status_code", + "usernameClaimed": "susurrus", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 308796, + "tags": [ + "hobby" + ] + }, + "Rusfishing": { + "ignore403": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "alexaRank": 305149, + "urlMain": "https://www.rusfishing.ru", + "url": "https://www.rusfishing.ru/forum/members/?username={username}", + "usernameClaimed": "ale8443", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mywishboard.com": { + "tags": [ + "shopping" + ], + "checkType": "message", + "presenseStrs": [ + "profile-header", + " profile-header__col" + ], + "absenceStrs": [ + "This page could not be found" + ], + "urlMain": "https://mywishboard.com", + "url": "https://mywishboard.com/@{username}", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 335081 + }, + "khabmama.ru": { + "urlMain": "https://khabmama.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 354432 + }, + "CSSBattle": { + "url": "https://cssbattle.dev/player/{username}", + "urlMain": "https://cssbattle.dev", + "checkType": "message", + "usernameClaimed": "beo", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding", + "de" + ], + "alexaRank": 335190, + "presenseStrs": [ + "\"player\":{\"id\"" + ], + "absenceStrs": [ + "\"player\":null" + ] + }, + "jeepgarage.org": { + "protection": [ + "ip_reputation" + ], + "urlMain": "https://jeepgarage.org", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 307035 + }, + "forums.sailboatowners.com": { + "disabled": true, + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "http://forums.sailboatowners.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ngl.link": { + "absenceStrs": [ + "Could not find user" + ], + "presenseStrs": [ + "1" + ], + "url": "https://ngl.link/{username}", + "urlMain": "https://ngl.link", + "usernameClaimed": "youbutdumberr", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "q&a" + ], + "alexaRank": 326425 + }, + "Crypto Hack": { + "url": "https://cryptohack.org/user/{username}/", + "urlMain": "https://cryptohack.org/", + "checkType": "response_url", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding" + ], + "alexaRank": 314976 + }, + "not606.com": { + "engine": "XenForo", + "alexaRank": 345901, + "urlMain": "http://www.not606.com/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "sport" + ] + }, + "Windows10forums": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 324090, + "urlMain": "https://www.windows10forums.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "jeepspb.ru": { + "urlMain": "http://jeepspb.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 327671 + }, + "Rusforum": { + "tags": [ + "forum", + "pk", + "ru", + "ua" + ], + "disabled": true, + "engine": "vBulletin", + "alexaRank": 321108, + "urlMain": "https://www.rusforum.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Preisjaeger": { + "url": "https://www.preisjaeger.at/profile/{username}", + "urlMain": "https://www.preisjaeger.at/", + "checkType": "status_code", + "usernameClaimed": "Stefan", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 328835, + "requestMethod": "GET", + "tags": [ + "at", + "shopping" + ] + }, + "Rpgwatch": { + "urlSubpath": "/forums", + "disabled": true, + "tags": [ + "ca", + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 335756, + "urlMain": "https://www.rpgwatch.com", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "101010.pl": { + "checkType": "status_code", + "urlMain": "https://101010.pl/", + "url": "https://101010.pl/@{username}", + "alexaRank": 313959, + "usernameClaimed": "ueh_kon", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "mastodon", + "pl", + "social" + ] + }, + "House-Mixes.com": { + "tags": [ + "ir" + ], + "regexCheck": "^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$", + "checkType": "status_code", + "alexaRank": 325111, + "urlMain": "https://www.house-mixes.com/", + "url": "https://www.house-mixes.com/profile/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pepper": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "title>Ошибка!" + ], + "urlMain": "https://m.smutty.com", + "url": "https://m.smutty.com/user/{username}/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Southklad": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "errors": { + "validate_bot": "Anti-bot challenge" + }, + "alexaRank": 364147, + "urlMain": "https://southklad.ru", + "url": "https://southklad.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "community.endlessos.com": { + "engine": "DiscourseJson", + "tags": [ + "forum" + ], + "urlMain": "https://community.endlessos.com", + "usernameClaimed": "system", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Golangbridge": { + "engine": "DiscourseJson", + "tags": [ + "forum", + "sa", + "ua", + "vn" + ], + "urlMain": "https://forum.golangbridge.org/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "popgun.ru": { + "urlMain": "https://popgun.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 340458, + "disabled": true + }, + "ReligiousForums": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 342453, + "urlMain": "https://www.religiousforums.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DonatePay": { + "tags": [ + "finance", + "ru" + ], + "checkType": "response_url", + "alexaRank": 328522, + "urlMain": "https://donatepay.ru/", + "url": "https://donatepay.ru/don/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Voicesevas": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 349728, + "urlMain": "http://voicesevas.ru", + "url": "http://voicesevas.ru/user/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Macosx": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 340378, + "urlMain": "https://macosx.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Codeby.net": { + "tags": [ + "forum", + "hacking", + "ru" + ], + "engine": "XenForo", + "alexaRank": 344494, + "urlMain": "https://codeby.net", + "usernameClaimed": "pragmalion", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "freelance.codeby.net": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Страница не найдена!" + ], + "urlMain": "https://freelance.codeby.net", + "url": "https://freelance.codeby.net/user/{username}/portfolio/", + "usernameClaimed": "agnerfist", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ghisler.ch": { + "urlMain": "https://ghisler.ch/board", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 344835 + }, + "mau": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Извините, такого пользователя не существует" + ], + "urlMain": "https://forum.mau.ru", + "url": "https://forum.mau.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "curl", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Magix": { + "checkType": "message", + "absenceStrs": [ + "(404 - Page not found.)" + ], + "alexaRank": 351125, + "urlMain": "https://www.magix.info", + "url": "https://www.magix.info/us/users/profile/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true, + "tags": [ + "tech" + ] + }, + "Gpodder": { + "checkType": "status_code", + "alexaRank": 353586, + "urlMain": "https://gpodder.net/", + "url": "https://gpodder.net/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "music" + ] + }, + "Kvinneguiden": { + "url": "https://forum.kvinneguiden.no", + "urlMain": "https://forum.kvinneguiden.no", + "urlProbe": "https://forum.kvinneguiden.no/?app=core&module=system&controller=ajax&do=usernameExists&input={username}", + "checkType": "message", + "absenceStrs": [ + "{\"result\":\"ok\"}" + ], + "regexCheck": "^[a-zA-Z0-9_.-]{3,18}$", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Firearmstalk": { + "tags": [ + "us" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "alexaRank": 376431, + "urlMain": "https://www.firearmstalk.com", + "url": "https://www.firearmstalk.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Dissenter": { + "tags": [ + "us" + ], + "checkType": "status_code", + "alexaRank": 371059, + "urlMain": "https://dissenter.com/", + "url": "https://dissenter.com/user/{username}", + "usernameClaimed": "meatballs", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Autolada": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + " :: AUTOLADA.RU" + ], + "presenseStrs": [ + "postdetails" + ], + "alexaRank": 368758, + "urlMain": "https://www.autolada.ru/", + "url": "https://www.autolada.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ITVDN Forum": { + "engine": "DiscourseJson", + "tags": [ + "forum", + "ru", + "ua" + ], + "urlMain": "https://forum.itvdn.com", + "usernameClaimed": "pizzaro", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "russpuss.ru": { + "engine": "engine404", + "urlMain": "https://www.russpuss.ru", + "url": "https://www.russpuss.ru/profile/{username}/", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "erotic", + "forum", + "ru" + ], + "alexaRank": 399334 + }, + "Countable": { + "disabled": true, + "tags": [ + "us" + ], + "checkType": "status_code", + "alexaRank": 392424, + "urlMain": "https://www.countable.us/", + "url": "https://www.countable.us/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Planetaexcel": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "headers": { + "User-Agent": "python-requests/2.25.1" + }, + "alexaRank": 362881, + "urlMain": "https://www.planetaexcel.ru", + "url": "https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=profile_view&UID={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "fanficslandia.com": { + "engine": "XenForo", + "alexaRank": 405598, + "urlMain": "https://fanficslandia.com/index.php", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Clapper": { + "url": "https://clapperapp.com/{username}", + "urlMain": "https://clapperapp.com/", + "checkType": "status_code", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 359517, + "tags": [ + "social", + "video" + ] + }, + "Queer": { + "tags": [ + "pl" + ], + "checkType": "status_code", + "alexaRank": 335561, + "urlMain": "https://queer.pl", + "url": "https://queer.pl/user/{username}", + "usernameClaimed": "dhoyosm", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "GolfMonthly": { + "tags": [ + "forum", + "gb" + ], + "engine": "XenForo", + "urlMain": "https://forums.golf-monthly.co.uk/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "forum.ss-iptv.com": { + "urlMain": "https://forum.ss-iptv.com", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "tr" + ] + }, + "shipmodeling.ru": { + "urlMain": "https://www.shipmodeling.ru/phpbb", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 396400 + }, + "yka.kz": { + "tags": [ + "kz" + ], + "engine": "uCoz", + "alexaRank": 361394, + "urlMain": "http://yka.kz", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "izobil.ru": { + "engine": "uCoz", + "urlMain": "http://izobil.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 478518, + "tags": [ + "forum", + "ru" + ] + }, + "Gps-data-team": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "<title>" + ], + "alexaRank": 382740, + "urlMain": "https://www.gps-data-team.com", + "url": "https://www.gps-data-team.com/pda-gps-navigation/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "maps" + ] + }, + "Elakiri": { + "protection": [ + "cf_js_challenge" + ], + "tags": [ + "lk" + ], + "checkType": "message", + "presenseStrs": [ + "memberHeader-avatar", + "memberHeader-blurb" + ], + "absenceStrs": [ + "The specified member cannot be found" + ], + "alexaRank": 392155, + "urlMain": "https://elakiri.com", + "url": "https://elakiri.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "md": { + "tags": [ + "forum", + "md", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "404 - Not Found" + ], + "alexaRank": 370621, + "urlMain": "https://forum.md/ru/", + "url": "https://forum.md/ru/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "school2dobrinka.ru": { + "engine": "uCoz", + "urlMain": "http://school2dobrinka.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 197750, + "tags": [ + "education", + "ru" + ] + }, + "Italia": { + "tags": [ + "it", + "ru", + "ua" + ], + "checkType": "status_code", + "alexaRank": 380694, + "urlMain": "http://italia-ru.com/", + "url": "http://italia-ru.com/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.kaosx.us": { + "urlMain": "https://forum.kaosx.us", + "engine": "Flarum", + "usernameClaimed": "demm", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "TamTam": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "data-tsid=\"avatar\"" + ], + "absenceStrs": [ + "Pv3WuoqzAb05NxqHCgZ29Z2jmQ" + ], + "alexaRank": 349883, + "urlMain": "https://tamtam.chat/", + "url": "https://tamtam.chat/{username}", + "errorUrl": "https://tamtam.chat/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "officiating": { + "tags": [ + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "Произошла ошибка" + ], + "urlMain": "http://capitalcity.combats.com", + "url": "http://capitalcity.combats.com/inf.pl?{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Demonscity": { + "tags": [ + "ru" + ], + "checkType": "message", + "errors": { + "http://img.combats.com/errs/503.png": "Maintenance" + }, + "absenceStrs": [ + "не найден" + ], + "urlMain": "http://demonscity.combats.com", + "url": "http://demonscity.combats.com/inf.pl?{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sniperforums.com": { + "protection": [ + "ip_reputation" + ], + "urlMain": "https://sniperforums.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 478376 + }, + "Wolpy": { + "tags": [ + "travel" + ], + "checkType": "status_code", + "alexaRank": 446689, + "urlMain": "http://wolpy.com", + "url": "http://wolpy.com/{username}/profile", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pyha": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 445197, + "urlMain": "https://pyha.ru/", + "url": "https://pyha.ru/users/{username}", + "usernameClaimed": "Sinkler", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rcforum": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 425465, + "urlMain": "http://www.rcforum.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Forumophilia": { + "tags": [ + "forum", + "porn" + ], + "checkType": "message", + "absenceStrs": [ + "Sorry, but that user does not exist." + ], + "alexaRank": 410717, + "urlMain": "https://www.forumophilia.com", + "url": "https://www.forumophilia.com/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lkforum": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 427168, + "urlMain": "http://www.lkforum.ru/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Galya": { + "disabled": true, + "similarSearch": true, + "tags": [ + "ru" + ], + "regexCheck": "^[^_]{3,}$", + "checkType": "message", + "absenceStrs": [ + "div class=error_message" + ], + "urlMain": "https://m.galya.ru", + "url": "https://m.galya.ru/search_result.php?searchstring={username}", + "usernameClaimed": "annledi", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lolchess": { + "disabled": true, + "tags": [ + "kr" + ], + "headers": { + "accept-language": "en-US,en;q=0.9,es;q=0.8" + }, + "checkType": "message", + "absenceStrs": [ + "No search results" + ], + "presenseStrs": [ + "results were displayed out of" + ], + "alexaRank": 414532, + "urlMain": "https://lolchess.gg/", + "url": "https://lolchess.gg/profile/na/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "oakleyforum.com": { + "engine": "XenForo", + "alexaRank": 485026, + "urlMain": "https://www.oakleyforum.com", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "forum.shopsmith.com": { + "urlMain": "https://forum.shopsmith.com", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "pk" + ] + }, + "ForumKinopoisk": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "url": "https://forumkinopoisk.ru/search/?q={username}&type=core_members", + "urlMain": "https://forumkinopoisk.ru", + "presenseStrs": [ + "data-ips-hook=\"userPhotoWithUrl\"" + ], + "alexaRank": 441982, + "usernameClaimed": "slanselap", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kuharka": { + "tags": [ + "ru" + ], + "regexCheck": "^[^\\.\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "alexaRank": 409402, + "urlMain": "https://www.kuharka.ru/", + "url": "https://www.kuharka.ru/members/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nixp": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 411509, + "urlMain": "https://www.nixp.ru/", + "url": "https://www.nixp.ru/user/{username}", + "usernameClaimed": "fly4life", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VegaLab": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://forum.vegalab.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "followus.com": { + "tags": [ + "links" + ], + "engine": "engine404", + "urlMain": "https://followus.com", + "url": "https://followus.com/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 421735 + }, + "Autokadabra": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 433984, + "urlMain": "http://autokadabra.ru/", + "url": "http://autokadabra.ru/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Glav": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователи не найдены." + ], + "alexaRank": 420561, + "urlMain": "https://glav.su", + "url": "https://glav.su/members/?searchName={username}", + "usernameClaimed": "gvf", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "KnigiOnline": { + "tags": [ + "by", + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://forum.online-knigi.com", + "usernameClaimed": "brazilla", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.bestflowers.ru": { + "urlMain": "https://forum.bestflowers.ru", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.sureai.net": { + "urlMain": "https://forum.sureai.net", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "clubsnap.com": { + "tags": [ + "forum", + "sg" + ], + "engine": "XenForo", + "alexaRank": 435287, + "urlMain": "https://www.clubsnap.com/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.rosalinux.ru": { + "urlMain": "https://forum.rosalinux.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "babyboom.pl": { + "engine": "XenForo", + "alexaRank": 446254, + "urlMain": "http://www.babyboom.pl/forum/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "pl" + ] + }, + "Chan4chan": { + "tags": [ + "hu" + ], + "regexCheck": "^[^\\.\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "Log in - Chan4Chan" + ], + "alexaRank": 459294, + "urlMain": "http://chan4chan.com/", + "url": "http://chan4chan.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gardrops": { + "protection": [ + "cf_js_challenge" + ], + "presenseStrs": [ + "og:url", + "Gardrops'u İkinci" + ], + "url": "https://www.gardrops.com/{username}", + "urlMain": "https://www.gardrops.com", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 475232, + "tags": [ + "shopping", + "tr" + ] + }, + "Kerch Forum": { + "tags": [ + "forum", + "ru", + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "По вашему запросу ничего не найдено. Попробуйте расширить критерии поиска." + ], + "urlMain": "http://forum.kerch.com.ru", + "url": "http://forum.kerch.com.ru/search/?q={username}", + "usernameClaimed": "Milla", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Qbn": { + "tags": [ + "design" + ], + "checkType": "status_code", + "alexaRank": 418939, + "urlMain": "https://www.qbn.com/", + "url": "https://www.qbn.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "dolap": { + "absenceStrs": [ + " role=" + ], + "presenseStrs": [ + "setEmail" + ], + "url": "https://dolap.com/profil/{username}", + "urlMain": "https://dolap.com", + "usernameClaimed": "burcakmeric", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 508193, + "tags": [ + "shopping", + "tr" + ], + "protection": [ + "cf_js_challenge" + ] + }, + "Footballforums": { + "tags": [ + "forum", + "gb" + ], + "engine": "XenForo", + "alexaRank": 480200, + "urlMain": "http://www.footballforums.net", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "rezzoclub.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://rezzoclub.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 496046, + "tags": [ + "forum", + "ru" + ] + }, + "rybnoe.net": { + "disabled": true, + "tags": [ + "ru", + "ua" + ], + "engine": "uCoz", + "alexaRank": 468763, + "urlMain": "http://rybnoe.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pogovorim": { + "tags": [ + "by", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "alexaRank": 476715, + "urlMain": "https://pogovorim.by", + "url": "https://pogovorim.by/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "nikola", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Goldroyal": { + "tags": [ + "bd", + "by", + "forum", + "ru", + "ua", + "ve" + ], + "engine": "vBulletin", + "alexaRank": 482962, + "urlMain": "http://goldroyal.net", + "usernameClaimed": "anton33", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Warframe Market": { + "url": "https://warframe.market/profile/{username}", + "urlMain": "https://warframe.market/", + "urlProbe": "https://api.warframe.market/v2/user/{username}", + "checkType": "status_code", + "usernameClaimed": "kaiallalone", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "gaming" + ], + "alexaRank": 451232, + "requestMethod": "GET" + }, + "bbs.huami.com": { + "disabled": true, + "tags": [ + "cn", + "ir", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "提示信息 - huami论坛 - Powered by Discuz!" + ], + "urlMain": "https://bbs.huami.com", + "url": "https://bbs.huami.com/home.php?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Thelion": { + "tags": [ + "blog" + ], + "checkType": "message", + "absenceStrs": [ + "We are sorry but the following error has occurred." + ], + "alexaRank": 504802, + "urlMain": "http://www.thelion.com", + "url": "http://www.thelion.com/bin/profile.cgi?c=s&ru_name={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "FCRubin": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 484513, + "urlMain": "https://www.fcrubin.ru", + "usernameClaimed": "flet", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tv-games": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 468472, + "urlMain": "http://tv-games.ru/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "cubecraft.net": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://www.cubecraft.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 462006 + }, + "Tabun": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://tabun.everypony.ru", + "url": "https://tabun.everypony.ru/profile/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "homsk.com": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "profile-stat", + "profile-wrap", + "profile-main", + "profile-image", + "profile-splash" + ], + "absenceStrs": [ + "404 - Not Found" + ], + "url": "https://homsk.com/profile/{username}", + "urlMain": "https://homsk.com", + "usernameClaimed": "martin", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 451989 + }, + "kursknet": { + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "https://forum.kursknet.ru", + "usernameClaimed": "Naffy", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "MaidenFans": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://forum.maidenfans.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mikrob.ru": { + "urlMain": "https://mikrob.ru", + "engine": "phpBB/Search", + "tags": [ + "forum", + "ru" + ], + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 474555 + }, + "XShaker": { + "checkType": "message", + "absenceStrs": [ + "/tube/txxxtv.html" + ], + "presenseStrs": [ + "og:title", + "serve", + "og:type", + "/>404
" + ], + "url": "https://stripchat.global/{username}", + "urlMain": "https://stripchat.global", + "usernameClaimed": "lunagirl13", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 517784, + "tags": [ + "webcam" + ] + }, + "tigerfan.com": { + "engine": "XenForo", + "alexaRank": 581719, + "urlMain": "http://www.tigerfan.com/", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "sport" + ] + }, + "Newreporter": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 526873, + "urlMain": "https://newreporter.org", + "url": "https://newreporter.org/author/{username}/", + "usernameClaimed": "lilya", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "www.marykay.ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "email" + ], + "absenceStrs": [ + "errorPage" + ], + "urlMain": "https://www.marykay.ru", + "url": "https://www.marykay.ru/{username}", + "usernameClaimed": "anna", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 511736, + "disabled": true + }, + "Cyber Defenders": { + "url": "https://cyberdefenders.org/p/{username}", + "urlMain": "https://cyberdefenders.org/", + "checkType": "status_code", + "regexCheck": "^[^\\/:*?\"<>|@]{3,50}$", + "usernameClaimed": "mlohn", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 492743, + "requestMethod": "GET" + }, + "ForexDengi": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 593484, + "urlMain": "https://forexdengi.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.postupim.ru": { + "tags": [ + "education", + "forum", + "ru" + ], + "engine": "uCoz", + "urlMain": "http://forum.postupim.ru", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Volgograd Forum": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "alexaRank": 561852, + "urlMain": "https://www.forum-volgograd.ru", + "usernameClaimed": "kajuga", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ForumJizni": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 612390, + "urlMain": "http://www.forumjizni.ru", + "usernameClaimed": "luhoy2", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nekto": { + "tags": [ + "pt", + "ru" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "response_url", + "alexaRank": 501199, + "urlMain": "https://nekto.me", + "url": "https://nekto.me/{username}/", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Play.md": { + "tags": [ + "md" + ], + "checkType": "response_url", + "alexaRank": 585619, + "urlMain": "https://play.md", + "url": "https://play.md/profile/{username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pinme": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 598711, + "urlMain": "https://www.pinme.ru", + "url": "https://www.pinme.ru/u/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "igrarena": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден. Пожалуйста, введите другое имя." + ], + "urlMain": "https://forum.igrarena.ru", + "url": "https://forum.igrarena.ru/members/?username={username}", + "usernameClaimed": "forester", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Xbox Gamertag": { + "errors": { + "Something went wrong": "Site error", + "Why do I have to complete a CAPTCHA": "Captcha detected" + }, + "checkType": "status_code", + "alexaRank": 583362, + "urlMain": "https://xboxgamertag.com/", + "url": "https://xboxgamertag.com/search/{username}", + "usernameClaimed": "smrnov", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dating.Ru": { + "tags": [ + "dating", + "ru" + ], + "checkType": "status_code", + "alexaRank": 549644, + "urlMain": "http://dating.ru", + "url": "http://dating.ru/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sanatorii": { + "tags": [ + "by", + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://forum.sanatorii.by", + "url": "http://forum.sanatorii.by/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "pavlovich", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "twentysix.ru": { + "tags": [ + "ru" + ], + "engine": "engine404", + "urlMain": "https://twentysix.ru", + "url": "https://twentysix.ru/profile/{username}/", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 621058 + }, + "soc-life.com": { + "presenseStrs": [ + "sc-tabs\">
Логин:" + ], + "engine": "uCoz", + "alexaRank": 575783, + "urlMain": "http://soc-life.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cad": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Форум" + ], + "alexaRank": 554254, + "urlMain": "https://cad.ru", + "url": "https://cad.ru/ru/forum/index.php?PAGE_NAME=profile_view&UID={username}", + "usernameClaimed": "SergeT", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "masterkosta.com": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://masterkosta.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 666076 + }, + "WOW Circle": { + "tags": [ + "forum", + "it", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://forum.wowcircle.net", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pychess": { + "url": "https://www.pychess.org/@/{username}", + "urlMain": "https://www.pychess.org", + "checkType": "message", + "absenceStrs": [ + "404" + ], + "usernameClaimed": "gbtami", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 597958 + }, + "Gam1ng": { + "disabled": true, + "tags": [ + "br", + "webcam" + ], + "errors": { + "Attention Required! | Cloudflare": "Cloudflare security protection detected" + }, + "checkType": "status_code", + "urlMain": "https://gam1ng.com.br", + "url": "https://gam1ng.com.br/user/{username}", + "usernameClaimed": "PinKgirl", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "All Things Worn": { + "disabled": true, + "url": "https://www.allthingsworn.com/profile/{username}", + "urlMain": "https://www.allthingsworn.com", + "checkType": "message", + "absenceStrs": [ + "Sell Used Panties" + ], + "usernameClaimed": "pink", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 607726, + "protection": [ + "cf_js_challenge" + ] + }, + "Gigbucks": { + "tags": [ + "dz", + "eg" + ], + "checkType": "response_url", + "alexaRank": 592567, + "urlMain": "https://gigbucks.com/", + "url": "https://gigbucks.com/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kashalot": { + "tags": [ + "ua" + ], + "checkType": "status_code", + "alexaRank": 582237, + "urlMain": "https://kashalot.com", + "url": "https://kashalot.com/users/{username}/", + "usernameClaimed": "incognito", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "hiveos.farm": { + "engine": "DiscourseJson", + "tags": [ + "at", + "cz", + "forum", + "ru" + ], + "urlMain": "https://forum.hiveos.farm", + "usernameClaimed": "system", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Angara": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 587194, + "urlMain": "https://angara.net", + "url": "https://angara.net/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "APClips": { + "url": "https://apclips.com/{username}", + "urlMain": "https://apclips.com/", + "checkType": "message", + "absenceStrs": [ + "Amateur Porn Content Creators" + ], + "usernameClaimed": "onlybbyraq", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "porn", + "video" + ], + "alexaRank": 615620, + "protection": [ + "tls_fingerprint", + "ip_reputation" + ] + }, + "Politikforum": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "presenseStrs": [ + "Просмотр профиля:" + ], + "alexaRank": 648430, + "urlMain": "http://www.politikforum.ru/", + "usernameClaimed": "kostya", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mactalk": { + "tags": [ + "au", + "pk" + ], + "checkType": "message", + "absenceStrs": [ + "MacTalk" + ], + "alexaRank": 604158, + "urlMain": "http://www.mactalk.com.au/", + "url": "http://www.mactalk.com.au/member.php?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "yamaya.ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Skype:" + ], + "absenceStrs": [ + "

" + ], + "urlMain": "https://yamaya.ru", + "url": "https://yamaya.ru/profile/?{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "maya", + "alexaRank": 604400 + }, + "Hubski": { + "tags": [ + "blog" + ], + "checkType": "message", + "absenceStrs": [ + "No such user" + ], + "alexaRank": 648518, + "urlMain": "https://hubski.com/", + "url": "https://hubski.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Soundgym": { + "tags": [ + "il" + ], + "checkType": "response_url", + "urlMain": "https://www.soundgym.co", + "url": "https://www.soundgym.co/member/profile?m={username}", + "usernameClaimed": "raydrcougso", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 637049 + }, + "Playlists": { + "disabled": true, + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "Sorry we can't find that page" + ], + "alexaRank": 634151, + "urlMain": "https://playlists.net", + "url": "https://playlists.net/members/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "donate.stream": { + "tags": [ + "finance", + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "alexaRank": 607210, + "urlMain": "https://donate.stream/", + "url": "https://donate.stream/{username}", + "usernameClaimed": "moses91", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "megapolis.org": { + "urlMain": "http://www.megapolis.org/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 669780 + }, + "xgm.guru": { + "presenseStrs": [ + "Активность:" + ], + "absenceStrs": [ + "Авторизация" + ], + "url": "https://xgm.guru/user/{username}", + "urlMain": "https://xgm.guru", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 616228, + "tags": [ + "forum", + "gaming" + ] + }, + "forum.languagelearningwithnetflix.com": { + "engine": "DiscourseJson", + "urlMain": "https://forum.languagelearningwithnetflix.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "jp" + ] + }, + "ridemonkey.com": { + "engine": "XenForo", + "urlMain": "http://www.ridemonkey.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 684613 + }, + "Texasguntalk": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 620470, + "urlMain": "https://www.texasguntalk.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "subforums.net": { + "disabled": true, + "urlMain": "https://subforums.net", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 706855 + }, + "RUDTP": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://forum.rudtp.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Prokoni": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "alexaRank": 605755, + "urlMain": "https://www.prokoni.ru/", + "url": "https://www.prokoni.ru/forum/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.rollerclub.ru": { + "urlMain": "http://forum.rollerclub.ru", + "engine": "phpBB/Search", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "protection": [ + "custom_bot_protection" + ] + }, + "impalaforums.com": { + "urlMain": "https://impalaforums.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "auto", + "forum" + ], + "alexaRank": 601665, + "protection": [ + "tls_fingerprint", + "ip_reputation" + ] + }, + "rec.poker": { + "urlMain": "https://rec.poker", + "engine": "Wordpress/Author", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 669422 + }, + "figarohair.ru": { + "urlMain": "http://www.figarohair.ru/conf", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 712418 + }, + "Truthbook": { + "urlSubpath": "/forum", + "tags": [ + "forum" + ], + "engine": "phpBB", + "alexaRank": 660915, + "urlMain": "https://truthbook.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Avto-forum.name": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "alexaRank": 691978, + "urlMain": "https://avto-forum.name", + "usernameClaimed": "mariya", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mixupload": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Последняя активность" + ], + "alexaRank": 671122, + "urlMain": "https://mixupload.com/", + "url": "https://mixupload.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Discussfastpitch": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 691901, + "urlMain": "https://www.discussfastpitch.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Volgogradru": { + "tags": [ + "ru" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "Пользователь" + ], + "alexaRank": 679167, + "urlMain": "http://www.volgogradru.com", + "url": "http://www.volgogradru.com/users/{username}/", + "usernameClaimed": "rezook", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "intoclassics.net": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://intoclassics.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 648290 + }, + "Serveradmin": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Not Found" + ], + "alexaRank": 597216, + "urlMain": "https://serveradmin.ru/", + "url": "https://serveradmin.ru/author/{username}", + "usernameClaimed": "fedor", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Uvelir": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 489640, + "urlMain": "https://uvelir.net/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Freelanced": { + "tags": [ + "freelance" + ], + "checkType": "status_code", + "alexaRank": 664601, + "urlMain": "https://www.freelanced.com", + "url": "https://www.freelanced.com/{username}", + "usernameClaimed": "mattphilleo", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "samesound.ru": { + "tags": [ + "ru" + ], + "engine": "Wordpress/Author", + "urlMain": "https://samesound.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 660039 + }, + "Antique-bottles": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 684297, + "urlMain": "https://www.antique-bottles.net", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nesiditsa": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 665745, + "urlMain": "https://nesiditsa.ru", + "url": "https://nesiditsa.ru/members/{username}/", + "usernameClaimed": "lara", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "webos-forums.ru": { + "urlMain": "http://webos-forums.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 654522 + }, + "Mbclub": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "" + ], + "alexaRank": 653134, + "urlMain": "https://www.mbclub.ru/", + "url": "https://mbclub.ru/members/{username}", + "usernameClaimed": "qruiser.308", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "MinecraftOnly": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "gaming", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 689298, + "urlMain": "https://minecraftonly.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "forum.c-o-k.com.ua": { + "urlMain": "https://forum.c-o-k.com.ua", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ua" + ] + }, + "Smashcast": { + "disabled": true, + "tags": [ + "gr" + ], + "checkType": "status_code", + "alexaRank": 676103, + "urlMain": "https://www.smashcast.tv/", + "url": "https://www.smashcast.tv/api/media/live/{username}", + "usernameClaimed": "hello", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "xtratime.org": { + "urlMain": "https://www.xtratime.org", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 732770, + "protection": [ + "tls_fingerprint", + "ip_reputation" + ] + }, + "DefenceForumIndia": { + "tags": [ + "forum", + "military" + ], + "engine": "XenForo", + "alexaRank": 671170, + "urlMain": "https://defenceforumindia.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "unixforum.org": { + "urlMain": "https://unixforum.org", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 662074 + }, + "VegasCreativeSoftware": { + "checkType": "message", + "absenceStrs": [ + "VEGAS Community" + ], + "urlMain": "https://www.vegascreativesoftware.info", + "url": "https://www.vegascreativesoftware.info/us/users/profile/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 672874, + "disabled": true + }, + "PeopleAndCountries": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанного пользователя не существует" + ], + "alexaRank": 702327, + "urlMain": "http://peopleandcountries.com", + "url": "http://peopleandcountries.com/space-username-{username}.html", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Psyera": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 688891, + "urlMain": "https://psyera.ru", + "url": "https://psyera.ru/user/{username}", + "usernameClaimed": "eskariot", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "phorum.armavir.ru": { + "urlMain": "http://phorum.armavir.ru", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "scaleforum.ru": { + "disabled": true, + "urlMain": "http://www.scaleforum.ru", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 740172 + }, + "Antiwomen": { + "tags": [ + "forum", + "ru" + ], + "errors": { + "Вы не можете произвести поиск сразу после предыдущего": "Too many searhes per IP", + "Доступ к конференции закрыт для вашего IP-адреса.": "IP ban" + }, + "engine": "phpBB/Search", + "alexaRank": 670662, + "urlMain": "https://antiwomen.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "cowboyszone.com": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://cowboyszone.com", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 740190 + }, + "Indog": { + "urlSubpath": "/forum", + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 798125, + "urlMain": "http://www.indog.ru/", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "nokia-love.ru": { + "engine": "uCoz", + "urlMain": "http://nokia-love.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ], + "alexaRank": 745986 + }, + "UMHOOPS": { + "tags": [ + "forum", + "sport" + ], + "engine": "Discourse", + "urlMain": "https://forum.umhoops.com", + "usernameClaimed": "umhoops", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Totseans": { + "checkType": "status_code", + "alexaRank": 734125, + "urlMain": "http://www.totseans.com/bbs/profile/Vizier", + "url": "http://www.totseans.com/bbs/profile/{username}", + "usernameClaimed": "Vizier", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "disabled": true + }, + "W3challs": { + "tags": [ + "tn" + ], + "checkType": "message", + "absenceStrs": [ + "<title>404 Page not found – W3Challs Hacking Challenges" + ], + "alexaRank": 743006, + "urlMain": "https://w3challs.com/", + "url": "https://w3challs.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "pornsavant.com": { + "disabled": true, + "urlMain": "https://pornsavant.com", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 711101 + }, + "browncafe.com": { + "disabled": true, + "tags": [ + "forum" + ], + "engine": "XenForo", + "alexaRank": 736822, + "urlMain": "https://www.browncafe.com/community/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Spaces": { + "tags": [ + "blog", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Сделать подарок" + ], + "absenceStrs": [ + "Пользователь не найден" + ], + "alexaRank": 696064, + "urlMain": "https://spaces.im", + "url": "https://spaces.im/mysite/index/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "qna.center": { + "tags": [ + "ru" + ], + "checkType": "response_url", + "alexaRank": 693923, + "urlMain": "https://qna.center", + "url": "https://qna.center/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Damochka": { + "disabled": true, + "tags": [ + "kz", + "ru" + ], + "checkType": "status_code", + "alexaRank": 746387, + "urlMain": "https://www.damochka.ru", + "url": "https://www.damochka.ru/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Raidforums": { + "disabled": true, + "checkType": "status_code", + "alexaRank": 723798, + "urlMain": "https://raidforums.com/", + "url": "https://raidforums.com/User-{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "cybercriminal", + "forum" + ] + }, + "ForumProSport": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 765281, + "urlMain": "https://forumprosport.ru/", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "crafta.ua": { + "tags": [ + "ua" + ], + "checkType": "message", + "presenseStrs": [ + "cft-profile-about" + ], + "absenceStrs": [ + "Page not found" + ], + "urlMain": "https://crafta.ua", + "url": "https://{username}.crafta.ua/", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 739715 + }, + "Pixwox": { + "absenceStrs": [ + "Page not found
" + ], + "presenseStrs": [ + "username", + "profile", + " data-name=", + "fullname", + "alternate" + ], + "url": "https://www.pixwox.com/profile/{username}/", + "urlMain": "https://www.pixwox.com", + "usernameClaimed": "mami_ishioka", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "alexaRank": 727882, + "source": "Instagram", + "tags": [ + "photo" + ], + "protection": [ + "ip_reputation", + "cf_firewall" + ] + }, + "crown6.org": { + "engine": "uCoz", + "alexaRank": 780554, + "urlMain": "http://crown6.org", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dumpor": { + "absenceStrs": [ + "Profile doesn't exist" + ], + "presenseStrs": [ + "user__title" + ], + "url": "https://dumpor.com/v/{username}", + "urlMain": "https://dumpor.com", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "source": "Instagram", + "tags": [ + "photo" + ], + "alexaRank": 762702 + }, + "prog.hu": { + "tags": [ + "hu" + ], + "checkType": "response_url", + "alexaRank": 723245, + "urlMain": "https://prog.hu", + "url": "https://prog.hu/azonosito/info/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "rest.feo.ru": { + "urlMain": "https://rest.feo.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "Sprashivai": { + "tags": [ + "ru" + ], + "checkType": "response_url", + "alexaRank": 762355, + "urlMain": "http://sprashivai.ru", + "url": "http://sprashivai.ru/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "24open": { + "disabled": true, + "tags": [ + "dating", + "ru" + ], + "checkType": "status_code", + "alexaRank": 730651, + "urlMain": "https://24open.ru", + "url": "https://24open.ru/user/{username}/", + "usernameClaimed": "niko3193", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.vilo4nik.net": { + "disabled": true, + "urlMain": "https://forum.vilo4nik.net", + "engine": "XenForo", + "usernameClaimed": "HiHater", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ua" + ] + }, + "Gentlemint": { + "checkType": "status_code", + "alexaRank": 746262, + "urlMain": "https://gentlemint.com", + "url": "https://gentlemint.com/users/{username}/", + "usernameClaimed": "zamoose", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lenov": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 719336, + "urlMain": "https://lenov.ru", + "url": "https://lenov.ru/user/{username}/", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "kloomba.com": { + "tags": [ + "ua" + ], + "checkType": "message", + "presenseStrs": [ + "останній візит" + ], + "absenceStrs": [ + "Такої сторінки не існує" + ], + "urlMain": "https://kloomba.com", + "url": "https://kloomba.com/users/{username}", + "usernameClaimed": "dima", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 778126 + }, + "Thebuddyforum": { + "tags": [ + "forum", + "gaming" + ], + "engine": "XenForo", + "alexaRank": 741819, + "urlMain": "https://www.thebuddyforum.com", + "usernameClaimed": "tony", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.uti-puti.com.ua": { + "urlMain": "https://forum.uti-puti.com.ua", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "vauxhallownersnetwork.co.uk": { + "tags": [ + "forum", + "tr" + ], + "engine": "XenForo", + "alexaRank": 752687, + "urlMain": "http://www.vauxhallownersnetwork.co.uk", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "allgaz": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://forum.allgaz.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sasgis.org": { + "urlMain": "http://www.sasgis.org/forum", + "engine": "phpBB/Search", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 725276 + }, + "wowjp.net": { + "disabled": true, + "tags": [ + "ru", + "ua" + ], + "engine": "uCoz", + "alexaRank": 789183, + "urlMain": "http://wowjp.net", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Carmasters": { + "tags": [ + "fi", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Результатов поиска нет. Расширьте критерии поиска." + ], + "alexaRank": 799224, + "urlMain": "https://carmasters.org", + "url": "https://carmasters.org/search/?q={username}&quick=1&type=core_members", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Writercenter": { + "tags": [ + "ru", + "ua" + ], + "checkType": "status_code", + "urlMain": "https://writercenter.ru", + "url": "https://writercenter.ru/profile/{username}/", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 811897 + }, + "Status Cafe": { + "url": "https://status.cafe/users/{username}", + "urlMain": "https://status.cafe/", + "checkType": "message", + "absenceStrs": [ + "Page Not Found" + ], + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 805151 + }, + "holodforum.ru": { + "disabled": true, + "urlMain": "https://holodforum.ru", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 775744 + }, + "sputnikkey.ru": { + "engine": "uCoz", + "urlMain": "http://sputnikkey.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "Erogen.club": { + "tags": [ + "forum", + "ru", + "ua" + ], + "engine": "XenForo", + "alexaRank": 754118, + "urlMain": "https://erogen.club", + "usernameClaimed": "yanok", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sanatatur.ru": { + "urlMain": "http://sanatatur.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 779794 + }, + "Mathhelpplanet": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "alexaRank": 783751, + "urlMain": "http://mathhelpplanet.com", + "url": "http://mathhelpplanet.com/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Matrix": { + "tags": [ + "messaging" + ], + "checkType": "status_code", + "urlMain": "https://matrix.org/", + "url": "https://matrix.to/#/@{username}:matrix.org", + "urlProbe": "https://matrix-client.matrix.org/_matrix/client/v3/profile/@{username}:matrix.org", + "usernameClaimed": "soxoj", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "wasm.in": { + "urlMain": "https://wasm.in", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ua" + ], + "alexaRank": 877884 + }, + "Fishingsib": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "alexaRank": 755832, + "urlMain": "https://www.fishingsib.ru/", + "url": "https://www.fishingsib.ru/forum/members/?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forums.drom.ru": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Просмотр профиля:" + ], + "alexaRank": 675810, + "urlMain": "https://www.forumsdrom.ru/", + "url": "https://www.forumsdrom.ru/member.php?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mineplex.com": { + "disabled": true, + "urlMain": "https://www.mineplex.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 772393 + }, + "southbayriders.com": { + "engine": "XenForo", + "alexaRank": 797850, + "urlMain": "http://www.southbayriders.com/forums/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "RussianFI": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 725461, + "urlMain": "http://www.russian.fi/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.oneclickchicks.com": { + "urlMain": "https://forum.oneclickchicks.com", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "commons.ishtar-collective.net": { + "urlMain": "https://commons.ishtar-collective.net", + "engine": "Discourse", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "gaming" + ] + }, + "nikoncafe.com": { + "engine": "XenForo", + "alexaRank": 739300, + "urlMain": "https://www.nikoncafe.com/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "photo" + ] + }, + "trworkshop.net": { + "urlMain": "http://www.trworkshop.net/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "alexaRank": 743300 + }, + "ImgUp.cz": { + "errors": { + "Composer detected issues in your platform": "Site error" + }, + "checkType": "status_code", + "alexaRank": 761350, + "urlMain": "https://imgup.cz/", + "url": "https://imgup.cz/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Maccentre": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Извините, такого пользователя не существует" + ], + "alexaRank": 772555, + "urlMain": "https://maccentre.ru", + "url": "https://maccentre.ru/board/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Coders Rank": { + "url": "https://profile.codersrank.io/user/{username}/", + "urlMain": "https://codersrank.io/", + "checkType": "message", + "absenceStrs": [ + "not a registered member" + ], + "regexCheck": "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$", + "usernameClaimed": "rootkit7628", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding" + ], + "alexaRank": 796930 + }, + "Rocket Tube": { + "url": "https://www.rockettube.com/{username}", + "urlMain": "https://www.rockettube.com/", + "checkType": "message", + "absenceStrs": [ + "OOPS! Houston, we have a problem" + ], + "usernameClaimed": "Tatteddick5600", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "video" + ], + "alexaRank": 832896, + "disabled": true + }, + "Caduser": { + "tags": [ + "ru", + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "По вашему запросу ничего не найдено." + ], + "alexaRank": 842986, + "urlMain": "https://www.caduser.ru/", + "url": "https://www.caduser.ru/forum/userlist.php?username={username}", + "usernameClaimed": "adamas", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "NuviGarmin": { + "disabled": true, + "tags": [ + "forum", + "ru", + "shopping" + ], + "checkType": "message", + "alexaRank": 856603, + "urlMain": "https://nuvi.ru/", + "url": "https://nuvi.ru/forum/user/{username}/", + "usernameClaimed": "VitaliyK", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "myce.wiki": { + "checkType": "message", + "presenseStrs": [ + "", + "" + ], + "usernameClaimed": "vroom", + "usernameUnclaimed": "noonewouldeverusethis7", + "urlMain": "https://myce.wiki", + "url": "https://myce.wiki/author/{username}" + }, + "motoforum.ru": { + "urlMain": "https://www.motoforum.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 814179 + }, + "Nhl": { + "tags": [ + "by", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Извините, такого пользователя не существует" + ], + "alexaRank": 804727, + "urlMain": "https://nhl.ru", + "url": "https://nhl.ru/talks/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "uforum.uz": { + "urlMain": "https://uforum.uz", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 821228, + "disabled": true + }, + "forum.rarib.ag": { + "urlMain": "https://forum.rarib.ag", + "engine": "phpBB", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "UnstoppableDomains": { + "presenseStrs": [ + "reservedForUserId", + "\"registered\"", + "DomainProduct" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/114.0", + "Accept": "*/*", + "Accept-Language": "en-US,en;q=0.5", + "Accept-Encoding": "gzip, deflate, br", + "Referer": "https://unstoppabledomains.com/", + "Connection": "keep-alive", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "Pragma": "no-cache", + "Cache-Control": "no-cache", + "TE": "trailers" + }, + "urlProbe": "https://unstoppabledomains.com/api/domain/search?q={username}", + "url": "https://ud.me/{username}", + "urlMain": "https://ud.me", + "usernameClaimed": "mlfed", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ], + "alexaRank": 855619, + "protection": [ + "custom_bot_protection" + ] + }, + "Ccdi": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 890453, + "urlMain": "http://www.ccdi.ru/", + "url": "http://www.ccdi.ru/users/{username}", + "usernameClaimed": "Nikita55", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.setcombg.com": { + "urlMain": "https://forum.setcombg.com", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "caravelgames": { + "checkType": "message", + "absenceStrs": [ + "Guest" + ], + "urlMain": "http://forum.caravelgames.com", + "url": "http://forum.caravelgames.com/member.php?Action=viewprofile&username={username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "disabled": true + }, + "Painters-online": { + "tags": [ + "gb" + ], + "checkType": "status_code", + "alexaRank": 829732, + "urlMain": "https://www.painters-online.co.uk", + "url": "https://www.painters-online.co.uk/artists/{username}/", + "usernameClaimed": "alanbickley", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Sevportal": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "alexaRank": 876931, + "urlMain": "https://www.sevportal.info", + "url": "https://www.sevportal.info/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "DarkWillow", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "4cheat": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "alexaRank": 886445, + "urlMain": "https://4cheat.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "S-forum": { + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found. Please enter a member's entire name" + ], + "alexaRank": 845054, + "urlMain": "https://s-forum.biz", + "url": "https://s-forum.biz/members/?username={username}", + "usernameClaimed": "ducat", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Worldofplayers": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "alexaRank": 825442, + "urlMain": "https://worldofplayers.ru", + "usernameClaimed": "zern", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hellboundhackers": { + "checkType": "response_url", + "alexaRank": 835300, + "urlMain": "https://www.hellboundhackers.org", + "url": "https://www.hellboundhackers.org/user/{username}.html", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Caves": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "alexaRank": 843914, + "urlMain": "https://caves.ru", + "usernameClaimed": "junk", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.modding.ru": { + "urlMain": "http://forum.modding.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "mnogodetok.ru": { + "urlMain": "https://mnogodetok.ru", + "engine": "phpBB/Search", + "tags": [ + "forum", + "ru" + ], + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 842471 + }, + "Votetags": { + "checkType": "message", + "absenceStrs": [ + " looking for. Perhaps searching can help.", + "", + "Page not found" + ], + "alexaRank": 741662, + "urlMain": "https://www.votetags.info/", + "url": "https://www.votetags.info/author/{username}/", + "usernameClaimed": "danphillip", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Alushta24": { + "tags": [ + "ru", + "ua" + ], + "checkType": "response_url", + "alexaRank": 856074, + "urlMain": "https://alushta24.org", + "url": "https://alushta24.org/user/{username}/", + "usernameClaimed": "Igor11324", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "pobedish.ru": { + "urlMain": "https://pobedish.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 834313 + }, + "Free-lancers": { + "tags": [ + "freelance", + "ru" + ], + "checkType": "status_code", + "alexaRank": 903625, + "urlMain": "http://www.free-lancers.net", + "url": "http://www.free-lancers.net/users/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Munzee": { + "disabled": true, + "tags": [ + "gb" + ], + "checkType": "status_code", + "urlMain": "https://www.munzee.com/", + "url": "https://www.munzee.com/m/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 816048 + }, + "Expono": { + "absenceStrs": [ + "404 - Page not found<" + ], + "presenseStrs": [ + "page-user-badge" + ], + "url": "http://www.expono.com/{username}", + "urlMain": "http://www.expono.com", + "usernameClaimed": "snila", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "photo" + ], + "alexaRank": 876764 + }, + "LiveTrack24": { + "checkType": "message", + "presenseStrs": [ + "profileinfodiv" + ], + "absenceStrs": [ + "not found" + ], + "alexaRank": 889586, + "urlMain": "https://www.livetrack24.com", + "url": "https://www.livetrack24.com/user/{username}", + "usernameClaimed": "anna", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Infrance": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 817776, + "urlMain": "https://www.infrance.su/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Admire Me": { + "url": "https://admireme.vip/{username}", + "urlMain": "https://admireme.vip/", + "checkType": "message", + "absenceStrs": [ + "Page Not Found" + ], + "usernameClaimed": "DemiDevil", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 853238 + }, + "Bayoushooter": { + "tags": [ + "forum", + "pk" + ], + "engine": "XenForo", + "alexaRank": 946319, + "urlMain": "https://www.bayoushooter.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fifasoccer": { + "urlSubpath": "/forum", + "disabled": true, + "tags": [ + "forum", + "ru", + "ua" + ], + "engine": "vBulletin", + "alexaRank": 876579, + "urlMain": "http://fifasoccer.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Roboforum": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "alexaRank": 933552, + "urlMain": "http://roboforum.ru", + "url": "http://roboforum.ru/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "sned", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ingvarr": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "alexaRank": 835310, + "urlMain": "http://ingvarr.net.ru/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "hondaswap.com": { + "engine": "XenForo", + "alexaRank": 894860, + "urlMain": "http://hondaswap.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "nsk66.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://nsk66.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 863665 + }, + "diorama.ru": { + "urlMain": "https://diorama.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 912957 + }, + "Empretienda AR": { + "url": "https://{username}.empretienda.com.ar", + "urlMain": "https://empretienda.com", + "checkType": "status_code", + "usernameClaimed": "camalote", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 820928 + }, + "Connosr": { + "tags": [ + "gb" + ], + "checkType": "status_code", + "alexaRank": 888424, + "urlMain": "https://www.connosr.com/", + "url": "https://www.connosr.com/@{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Minecraft-statistic": { + "tags": [ + "ru", + "ua" + ], + "checkType": "status_code", + "alexaRank": 870531, + "urlMain": "https://minecraft-statistic.net", + "url": "https://minecraft-statistic.net/ru/player/{username}.html", + "usernameClaimed": "Right", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "freelance.ua": { + "tags": [ + "ua" + ], + "errors": { + "https://freelance.ua/war/": "Site censorship" + }, + "engine": "engine404", + "urlMain": "https://freelance.ua", + "url": "https://freelance.ua/en/user/{username}/portfolio/", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "alexaRank": 825404 + }, + "BitCoinForum": { + "disabled": true, + "tags": [ + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "The user whose profile you are trying to view does not exist." + ], + "alexaRank": 977565, + "urlMain": "https://bitcoinforum.com", + "url": "https://bitcoinforum.com/profile/{username}", + "usernameClaimed": "bitcoinforum.com", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dogster": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "alexaRank": 999034, + "urlMain": "http://dogster.ru/", + "url": "http://dogster.ru/users/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pgpru": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "чтобы перейти к общему списку." + ], + "alexaRank": 899991, + "urlMain": "http://www.pgpru.com/", + "url": "http://www.pgpru.com/proekt/poljzovateli?profile={username}", + "usernameClaimed": "Onix", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.freeton.org": { + "urlMain": "https://forum.freeton.org", + "engine": "Discourse", + "usernameClaimed": "maximmuzychenka", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "finance", + "forum" + ], + "disabled": true + }, + "uazpatriot.ru": { + "urlMain": "https://uazpatriot.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "alexaRank": 902853 + }, + "Kik": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "The page you requested was not found" + ], + "alexaRank": 892776, + "urlMain": "http://kik.me/", + "url": "https://ws2.kik.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Prizyvnik": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Запрашиваемая страница не существует" + ], + "alexaRank": 898966, + "urlMain": "https://www.prizyvnik.info", + "url": "https://www.prizyvnik.info/members/?username={username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.ua-vet.com": { + "urlMain": "http://forum.ua-vet.com", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "sst.hiberworld.com": { + "checkType": "message", + "absenceStrs": [ + "User not found" + ], + "presenceStrs": [ + "email", + "birthdate", + "role", + "Profile Image", + "User" + ], + "url": "https://sst.hiberworld.com/user/{username}", + "urlMain": "https://sst.hiberworld.com/user/{username}", + "usernameClaimed": "pixelpwnz", + "usernameUnclaimed": "foxefwvigz" + }, + "forum-mil.ru": { + "engine": "uCoz", + "alexaRank": 923052, + "urlMain": "http://forum-mil.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Vezha": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован" + ], + "alexaRank": 919610, + "urlMain": "https://vezha.com/", + "url": "https://vezha.com/members/?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Otzyvy": { + "disabled": true, + "tags": [ + "ru" + ], + "errors": { + "https://otzyvy.pro/captchacheck.php": "Site captcha" + }, + "checkType": "status_code", + "alexaRank": 923220, + "urlMain": "https://otzyvy.pro", + "url": "https://otzyvy.pro/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.trade-print.ru": { + "disabled": true, + "urlMain": "http://forum.trade-print.ru", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "red-forum.com": { + "urlMain": "https://red-forum.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "cheat-master.ru": { + "tags": [ + "ru", + "ua" + ], + "engine": "uCoz", + "alexaRank": 975667, + "urlMain": "http://cheat-master.ru", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Studwork": { + "disabled": true, + "similarSearch": true, + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "Имя пользователя" + ], + "absenceStrs": [ + "herdun" + ], + "alexaRank": 922047, + "urlMain": "https://studwork.org/", + "url": "https://studwork.org/info/{username}", + "usernameClaimed": "tmm22", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "Liveexpert": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://www.liveexpert.ru", + "url": "https://www.liveexpert.ru/e/{username}", + "usernameClaimed": "velegor1984", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "PulmonaryHypertensionNews": { + "checkType": "status_code", + "presenseStrs": [ + "activity-personal-li" + ], + "alexaRank": 903462, + "urlMain": "https://pulmonaryhypertensionnews.com", + "url": "https://pulmonaryhypertensionnews.com/forums/members/{username}/", + "usernameClaimed": "gwendolyn", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "amateurvoyeurforum.com": { + "urlMain": "https://www.amateurvoyeurforum.com", + "engine": "vBulletin", + "disabled": true, + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "us" + ], + "alexaRank": 969837 + }, + "Interfaith": { + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "alexaRank": 916825, + "urlMain": "https://www.interfaith.org", + "url": "https://www.interfaith.org/community/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Amirite": { + "disabled": true, + "tags": [ + "gb" + ], + "checkType": "status_code", + "urlMain": "https://www.amirite.com", + "url": "https://www.amirite.com/user/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pesiq": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "alexaRank": 892631, + "urlMain": "http://pesiq.ru/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "YaPishu.net": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "headers": { + "Cookie": "hc=1" + }, + "alexaRank": 945331, + "urlMain": "https://yapishu.net", + "url": "https://yapishu.net/user/{username}", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Parkrocker": { + "tags": [ + "de", + "forum" + ], + "engine": "XenForo", + "urlMain": "https://www.parkrocker.net", + "usernameClaimed": "diablo0106", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 997288 + }, + "Seatracker": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Извините, такого пользователя не существует" + ], + "alexaRank": 980858, + "urlMain": "https://seatracker.ru/", + "url": "https://seatracker.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Nygunforum": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://nygunforum.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pocket Stars": { + "url": "https://pocketstars.com/{username}", + "urlMain": "https://pocketstars.com/", + "checkType": "message", + "absenceStrs": [ + "Join Your Favorite Adult Stars" + ], + "usernameClaimed": "hacker", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 986214, + "disabled": true + }, + "0-3.RU": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "http://0-3.ru", + "usernameClaimed": "donna", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "discussions.ubisoft.com": { + "tags": [ + "forum", + "gaming" + ], + "checkType": "message", + "presenseStrs": [ + "Block User" + ], + "absenceStrs": [ + "You seem to have stumbled upon a page that does not exist. Return to the" + ], + "url": "https://discussions.ubisoft.com/user/{username}?lang=en-US", + "usernameClaimed": "ubi-pingu", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "11x2": { + "checkType": "status_code", + "urlMain": "https://11x2.com", + "url": "https://11x2.com/user/home/{username}", + "usernameClaimed": "hazelamy", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "1xforum": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://1xforum.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "2Dimensions": { + "checkType": "status_code", + "urlMain": "https://2Dimensions.com/", + "url": "https://2Dimensions.com/a/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "2fast4u": { + "disabled": true, + "tags": [ + "nl" + ], + "checkType": "message", + "absenceStrs": [ + "Deze gebruiker is niet geregistreerd, zodat je zijn of haar profiel niet kunt bekijken." + ], + "urlMain": "https://www.2fast4u.be", + "url": "https://www.2fast4u.be/members/?username={username}", + "usernameClaimed": "Schussboelie", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "3DMir.ru": { + "checkType": "message", + "presenseStrs": [ + "<div class=\"user_name\">" + ], + "absenceStrs": [ + "<title>3DMir.ru - " + ], + "urlMain": "http://www.3dmir.ru/", + "url": "http://www.3dmir.ru/{username}", + "usernameClaimed": "imlegr", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "3dcadforums": { + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://www.3dcadforums.com/", + "url": "https://www.3dcadforums.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "protection": [ + "tls_fingerprint" + ] + }, + "50cc.com.ua": { + "engine": "uCoz", + "urlMain": "http://50cc.com.ua", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "63148.com.ua": { + "engine": "uCoz", + "urlMain": "http://63148.com.ua", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "AMUR": { + "disabled": true, + "tags": [ + "dating", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + " не найдено!" + ], + "urlMain": "https://apteka.ee", + "url": "https://apteka.ee/user/id/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Aback": { + "tags": [ + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь с таким именем не найден." + ], + "urlMain": "https://aback.com.ua", + "url": "https://aback.com.ua/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Aboutcar": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "urlMain": "http://aboutcar.ru", + "url": "http://aboutcar.ru/members/{username}.html", + "usernameClaimed": "krolenya", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Airbit": { + "checkType": "status_code", + "url": "https://airbit.com/{username}", + "usernameClaimed": "airbit", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "All-mods": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://all-mods.ru", + "url": "https://all-mods.ru/author/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "AllTheSoft": { + "disabled": true, + "checkType": "status_code", + "urlMain": "http://www.allthesoft.com", + "url": "http://www.allthesoft.com/member/{username}.html", + "usernameClaimed": "marmon4270", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Amspb": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "https://amspb.info", + "usernameClaimed": "SSV", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Anapakurort": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "такого участника форума не существует" + ], + "urlMain": "http://www.anapakurort.info", + "url": "http://www.anapakurort.info/forum/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Anarcho-punk": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://www.anarcho-punk.net/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Angelgothics": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://angelgothics.ru", + "usernameClaimed": "Angel", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Anime.web.tr": { + "tags": [ + "tr" + ], + "checkType": "message", + "absenceStrs": [ + "Üzgünüz, böyle bir kullanıcı bulunmuyor" + ], + "urlMain": "http://www.anime.web.tr/", + "url": "http://www.anime.web.tr/yazar/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Animebase": { + "engine": "XenForo", + "urlMain": "https://animebase.me", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "pk" + ] + }, + "Anonup": { + "checkType": "message", + "absenceStrs": [ + "Page not found!" + ], + "presenseStrs": [ + "Following</span>" + ], + "url": "https://anonup.com/@{username}", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Antipunk": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://antipunk.com/", + "url": "https://antipunk.com/users/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ApexLegends": { + "checkType": "message", + "absenceStrs": [ + "PLAYER NOT FOUND" + ], + "presenseStrs": [ + "trn-profile-highlighted-content" + ], + "url": "https://apex.tracker.gg/apex/profile/origin/{username}/overview", + "usernameClaimed": "RollsRoyce_Dawn", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Division2": { + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "PLAYER NOT FOUND" + ], + "presenseStrs": [ + "trn-profile-highlighted-content" + ], + "url": "https://tracker.gg/division-2/profile/ubi/{username}/overview", + "usernameClaimed": "SOXOJ", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Appearoo": { + "checkType": "response_url", + "urlMain": "http://appearoo.com", + "url": "http://appearoo.com/{username}", + "usernameClaimed": "appearoo", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Appian": { + "url": "https://community.appian.com/members/{username}", + "checkType": "message", + "absenceStrs": [ + "<head><title>Working...
" + ], + "absenceStrs": [ + "\">Arduino Project Hub" + ], + "url": "https://projecthub.arduino.cc/{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Arhrock": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "urlMain": "https://arhrock.info/", + "url": "https://arhrock.info/forum/members/?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Artistsnclients": { + "checkType": "status_code", + "url": "https://artistsnclients.com/people/{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Artpersona": { + "tags": [ + "ru" + ], + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "Этот профиль либо больше не существует, либо больше не доступен." + ], + "urlMain": "http://artpersona.org/", + "url": "http://artpersona.org/cb/userprofile/{username}", + "usernameClaimed": "Sofidark", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Askvoprosy": { + "disabled": true, + "tags": [ + "coding" + ], + "checkType": "message", + "absenceStrs": [ + "" + ], + "urlMain": "https://askvoprosy.com/", + "url": "https://askvoprosy.com/polzovateli/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Astra-club": { + "tags": [ + "ru", + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://www.astra-club.ru", + "url": "http://www.astra-club.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Astro-talks": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://www.astro-talks.ru", + "url": "http://www.astro-talks.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Autofrage": { + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "url": "https://www.autofrage.net/nutzer/{username}", + "usernameClaimed": "autofrage", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Autolenta": { + "tags": [ + "auto", + "forum", + "ru" + ], + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "Пользователь не найден" + ], + "urlMain": "https://community.autolenta.ru", + "url": "https://community.autolenta.ru/profile/{username}", + "usernameClaimed": "serzhhh", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Automania": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Go to the homepage" + ], + "presenseStrs": [ + "Посты от " + ], + "urlMain": "https://automania.ru", + "url": "https://automania.ru/author/{username}/", + "usernameClaimed": "autozak23", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "AvidCommunity": { + "checkType": "message", + "absenceStrs": [ + "User Not Found" + ], + "presenseStrs": [ + "My Announcements" + ], + "url": "https://community.avid.com/members/{username}/default.aspx", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Avtoforum": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://avtoforum.org", + "usernameClaimed": "tim", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Avtolyubiteli": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://forum.avtolyubiteli.com", + "url": "https://forum.avtolyubiteli.com/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "BackdoorSdslabs": { + "disabled": true, + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "No such user exists" + ], + "urlMain": "https://backdoor.sdslabs.co", + "url": "https://backdoor.sdslabs.co/users/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bandlab": { + "checkType": "message", + "absenceStrs": [ + "find any matching element, it might be deleted" + ], + "presenseStrs": [ + "genres" + ], + "url": "https://www.bandlab.com/api/v1.3/users/{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Barnacl": { + "checkType": "status_code", + "urlMain": "https://barnacl.es/u/alexsam", + "url": "https://barnacl.es/u/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "es", + "news", + "sharing" + ] + }, + "XSS.is": { + "tags": [ + "forum", + "hacking", + "ru" + ], + "errors": { + "Вы должны быть авторизованы, чтобы выполнить это действие или просмотреть эту страницу.": "Login required" + }, + "engine": "XenForo", + "urlMain": "https://xss.is", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bazar.cz": { + "tags": [ + "cz" + ], + "checkType": "response_url", + "urlMain": "https://www.bazar.cz/", + "url": "https://www.bazar.cz/{username}/", + "errorUrl": "https://www.bazar.cz/error404.aspx", + "usernameClaimed": "pianina", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Bbshave": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователя не существует." + ], + "urlMain": "https://bbshave.ru", + "url": "https://bbshave.ru/profile/{username}", + "usernameClaimed": "Yury", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Belmos": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://www.belmos.ru", + "url": "https://www.belmos.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "starik13", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bentbox": { + "checkType": "message", + "absenceStrs": [ + "User not found" + ], + "presenseStrs": [ + "og:title" + ], + "url": "https://bentbox.co/{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "BeReal": { + "checkType": "message", + "presenseStrs": [ + "bere.al/og-image?url=" + ], + "urlMain": "https://bereal.com", + "url": "https://bere.al/{username}", + "usernameClaimed": "romain", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bestfantasybooks": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "http://bestfantasybooks.com", + "url": "http://bestfantasybooks.com/forums/members/?username={username}", + "usernameClaimed": "tofulovefrog", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bestweapon": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "
" + ], + "url": "https://www.biggerpockets.com/users/{username}", + "usernameClaimed": "uheara", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bigmmc": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "http://bigmmc.com", + "usernameClaimed": "monhyip", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Bikemap": { + "checkType": "status_code", + "url": "https://www.bikemap.net/en/u/{username}/routes/created/", + "usernameClaimed": "bikemap", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Billkiene": { + "urlSubpath": "/forums", + "engine": "vBulletin", + "urlMain": "https://www.billkiene.com", + "usernameClaimed": "Odonata", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "hobby" + ], + "disabled": true + }, + "BinarySearch": { + "regexCheck": "^[a-zA-Z0-9-_]{1,15}$", + "urlProbe": "https://binarysearch.com/api/users/{username}/profile", + "checkType": "message", + "absenceStrs": [ + "{}" + ], + "urlMain": "https://binarysearch.com/", + "url": "https://binarysearch.com/@/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Bitwarden": { + "checkType": "message", + "absenceStrs": [ + "Oops!" + ], + "presenseStrs": [ + " Profile" + ], + "url": "https://community.bitwarden.com/u/{username}/summary", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Blogi.pl": { + "checkType": "message", + "absenceStrs": [ + "Niepoprawny adres." + ], + "presenseStrs": [ + "Informacje ogólne" + ], + "url": "https://www.blogi.pl/osoba,{username}.html", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "BongaCams": { + "tags": [ + "cz", + "webcam" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": "https://pt.bongacams.com/", + "Upgrade-Insecure-Requests": "1", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Site": "same-origin", + "Sec-Fetch-User": "?1" + }, + "absenceStrs": [ + "- BongaCams" + ], + "presenseStrs": [ + "Informação e página" + ], + "checkType": "message", + "urlMain": "https://sbongacams.com", + "url": "https://bongacams.com/profile/{username}", + "urlProbe": "https://pt.bongacams.com/profile/{username}", + "usernameClaimed": "Icehotangel", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "Bookandreader": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://www.bookandreader.com", + "usernameClaimed": "Wabbit", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "BoomInfo": { + "disabled": true, + "ignore403": true, + "tags": [ + "ru", + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден. Пожалуйста, введите другое имя." + ], + "urlMain": "https://boominfo.ru", + "url": "https://boominfo.ru/members/?username={username}", + "usernameClaimed": "boominfo", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Borsch.gallery": { + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "urlMain": "https://borsch.gallery", + "url": "https://borsch.gallery/hudozhniki/{username}", + "usernameClaimed": "yana-chursina", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "art", + "shopping" + ] + }, + "Boxing": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "urlMain": "http://boxing.ru/", + "url": "http://boxing.ru/forum/member.php?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Brute": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "urlMain": "https://brute.su", + "url": "https://brute.su/members/?username={username}", + "usernameClaimed": "Neon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Bugcrowd": { + "checkType": "status_code", + "url": "https://bugcrowd.com/{username}", + "usernameClaimed": "mert", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Buzznet": { + "checkType": "message", + "absenceStrs": [ + "<title>Author: - Buzznet" + ], + "url": "https://www.buzznet.com/author/{username}", + "usernameClaimed": "karynbailey", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Caringbridge": { + "checkType": "status_code", + "url": "https://www.caringbridge.org/visit/{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Carrd.co": { + "checkType": "message", + "absenceStrs": [ + "Sorry, the requested page could not be found." + ], + "presenseStrs": [ + "( Made with Carrd )" + ], + "url": "https://{username}.carrd.co", + "usernameClaimed": "peter", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cash.app": { + "checkType": "message", + "absenceStrs": [ + "The page you are looking for can't be found" + ], + "presenseStrs": [ + "on Cash App" + ], + "url": "https://cash.app/${username}", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "finance", + "fintech", + "us" + ] + }, + "Castingcallclub": { + "checkType": "message", + "absenceStrs": [ + "404: This is not the page you were looking for. In the future, our AI robot overlords will be able to better predict exactly what you were looking for." + ], + "presenseStrs": [ + "| Casting Call Club" + ], + "url": "https://www.castingcall.club/{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CD-Action": { + "checkType": "message", + "absenceStrs": [ + "Coś się popsuło..." + ], + "presenseStrs": [ + "Lista gier:" + ], + "url": "https://cdaction.pl/uzytkownicy/{username}", + "usernameClaimed": "jfchaaber", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cda.pl": { + "checkType": "message", + "absenceStrs": [ + "Strona na którą chcesz wejść nie istnieje" + ], + "presenseStrs": [ + "Foldery" + ], + "url": "https://www.cda.pl/{username}", + "usernameClaimed": "test2", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chamsko.pl": { + "checkType": "message", + "absenceStrs": [ + "Strona nie istnieje." + ], + "presenseStrs": [ + "W serwisie od" + ], + "url": "https://www.chamsko.pl/profil/{username}", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chomikuj.pl": { + "checkType": "message", + "absenceStrs": [ + "homik o takiej nazwie nie istnieje" + ], + "presenseStrs": [ + "Foldery" + ], + "url": "https://chomikuj.pl/{username}/", + "usernameClaimed": "uheara_konen", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CPlusPlus": { + "checkType": "message", + "absenceStrs": [ + "404 Page Not Found" + ], + "urlMain": "https://3examplesite.ru", + "url": "http://www.cplusplus.com/user/{username}/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "ru" + ] + }, + "Crowdin": { + "checkType": "message", + "absenceStrs": [ + "Page Not Found - Crowdin" + ], + "presenseStrs": [ + ") – Crowdin" + ], + "url": "https://crowdin.com/profile/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CardingForum": { + "disabled": true, + "tags": [ + "forum", + "ma" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://cardingforum.co", + "url": "https://cardingforum.co/members/?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "Cardingsite": { + "disabled": true, + "tags": [ + "pk" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://cardingsite.cc", + "url": "https://cardingsite.cc/members/?username={username}", + "usernameClaimed": "zombe", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Casial": { + "tags": [ + "de" + ], + "checkType": "message", + "absenceStrs": [ + "Online Casino Forum" + ], + "urlMain": "http://www.casial.net", + "url": "http://www.casial.net/forum/members/{username}.html", + "usernameClaimed": "irgent", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Casino-affiliate-forum": { + "tags": [ + "de", + "forum" + ], + "engine": "Discourse", + "urlMain": "https://www.casino-affiliate-forum.com", + "usernameClaimed": "torstenw", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Cfire": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://cfire.ru", + "url": "https://cfire.ru/forums/member.php?username={username}", + "usernameClaimed": "laid1998", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chemistlab": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://chemistlab.ru", + "usernameClaimed": "FilIgor", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chess-russia": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Извините, такого пользователя не существует" + ], + "urlMain": "http://www.chess-russia.ru", + "url": "http://www.chess-russia.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "Sova0102", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chevrolet-cruze-club": { + "tags": [ + "ru" + ], + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "urlMain": "http://www.chevrolet-cruze-club.ru", + "url": "http://www.chevrolet-cruze-club.ru/forum/member.php?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Chpoking": { + "tags": [ + "ru" + ], + "checkType": "response_url", + "urlMain": "http://chpoking.ru", + "url": "http://chpoking.ru/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Citizen4": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleziono" + ], + "presenseStrs": [ + "@soc.citizen4.eu" + ], + "url": "https://soc.citizen4.eu/profile/{username}/profile", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cmet4uk": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "https://cmet4uk.ru", + "usernameClaimed": "vladnik", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "CryptomatorForum": { + "checkType": "status_code", + "url": "https://community.cryptomator.org/u/{username}", + "usernameClaimed": "michael", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cssomsk": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://www.cssomsk.ru", + "usernameClaimed": "spacebody", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cults3d": { + "checkType": "message", + "absenceStrs": [ + "Oh dear, this page is not working!" + ], + "presenseStrs": [ + "All the 3D models of" + ], + "url": "https://cults3d.com/en/users/{username}/creations", + "usernameClaimed": "uheara_konen", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cyberclock": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "urlMain": "https://cyberclock.cc", + "url": "https://cyberclock.cc/forum/member.php?username={username}", + "usernameClaimed": "Lich", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Cydak": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Извините, такого пользователя не существует" + ], + "urlMain": "http://www.cydak.ru", + "url": "http://www.cydak.ru/forum/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "Henders", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Cytoid.io": { + "checkType": "message", + "absenceStrs": [ + "Profile not found" + ], + "presenseStrs": [ + "Joined" + ], + "url": "https://cytoid.io/profile/{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "d3.ru": { + "checkType": "message", + "absenceStrs": [ + "d3.ru — Ничего не найдено!" + ], + "presenseStrs": [ + "/user/" + ], + "url": "https://d3.ru/user/{username}/posts", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dangerousthings.com": { + "checkType": "status_code", + "url": "https://forum.dangerousthings.com/u/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Demotywatory": { + "checkType": "message", + "absenceStrs": [ + "Użytkownik o podanym pseudonimie nie istnieje." + ], + "presenseStrs": [ + "Z nami od:" + ], + "url": "https://demotywatory.pl/user/{username}", + "usernameClaimed": "uheara_konen", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dojoverse": { + "checkType": "status_code", + "url": "https://dojoverse.com/members/{username}/", + "urlMain": "https://dojoverse.com", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dalnoboi": { + "tags": [ + "ru" + ], + "errors": { + "Пожалуйста, попробуйте чуть позже.": "Rate limit" + }, + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://www.dalnoboi.ru", + "url": "https://www.dalnoboi.ru/phpBB3/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "stommof", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 999544 + }, + "Darkside": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://darkside.black", + "usernameClaimed": "soldier", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Dcpg": { + "tags": [ + "ru", + "ua" + ], + "checkType": "response_url", + "urlMain": "https://dcpg.ru/", + "url": "https://dcpg.ru/users/{username}/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Derevnyaonline": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Запрашиваемая страница не найдена." + ], + "urlMain": "https://derevnyaonline.ru", + "url": "https://derevnyaonline.ru/user/{username}", + "usernameClaimed": "coolkrictina", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Desu": { + "tags": [ + "by", + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://desu.me", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Detstrana": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://detstrana.ru", + "url": "https://detstrana.ru/user/{username}/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Devtribe": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://devtribe.ru", + "url": "https://devtribe.ru/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dinsk": { + "tags": [ + "ru" + ], + "disabled": true, + "checkType": "status_code", + "urlMain": "https://dinsk.su", + "url": "https://dinsk.su/user/{username}", + "usernameClaimed": "dinsk", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Djangoproject.co": { + "tags": [ + "coding", + "forum" + ], + "engine": "Discourse", + "urlMain": "https://forum.djangoproject.co", + "usernameClaimed": "mikhail349", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dmyt": { + "tags": [ + "ru", + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://dmyt.ru", + "url": "https://dmyt.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "tim308", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Dobroeslovo": { + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "http://www.dobroeslovo.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Droners": { + "checkType": "response_url", + "urlMain": "https://droners.io", + "url": "https://droners.io/accounts/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Dublikat": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден." + ], + "urlMain": "https://www.dublikat.shop", + "url": "https://my.dublikat.pro/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "Dumpz": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://dumpz.ws", + "usernameClaimed": "emailx45", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Duno": { + "disabled": true, + "tags": [ + "pk" + ], + "checkType": "message", + "absenceStrs": [ + "this user does not exist" + ], + "urlMain": "https://www.duno.com/", + "url": "https://www.duno.com/profile.php?pl={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Eightbit": { + "disabled": true, + "regexCheck": "^[^\\.]+$", + "checkType": "message", + "absenceStrs": [ + "EightBit: 404 Error" + ], + "urlMain": "http://eightbit.me/", + "url": "http://eightbit.me/{username}", + "usernameClaimed": "Jerrymej", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Elftown": { + "checkType": "message", + "absenceStrs": [ + "is an unknown" + ], + "presenseStrs": [ + "created:" + ], + "url": "http://elftown.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Elwo": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "https://elwo.ru", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Engadget": { + "checkType": "status_code", + "url": "https://www.engadget.com/author/{username}/", + "urlMain": "https://www.engadget.com/", + "usernameClaimed": "kris-holt", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Enot-poloskun": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован" + ], + "urlMain": "https://enot-poloskun.ru/", + "url": "https://enot-poloskun.ru/member.php?username={username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Eporner": { + "tags": [ + "es" + ], + "checkType": "message", + "absenceStrs": [ + "Profile not found." + ], + "presenseStrs": [ + "Dashboard" + ], + "url": "https://www.eporner.com/profile/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Erboh": { + "urlSubpath": "/forum", + "disabled": true, + "tags": [ + "forum", + "pk" + ], + "engine": "vBulletin", + "urlMain": "https://erboh.com/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Esate": { + "tags": [ + "ru" + ], + "checkType": "message", + "urlMain": "http://esate.ru", + "presenseStrs": [ + "
" + ], + "absenceStrs": [ + "Блог не найден" + ], + "url": "http://esate.ru/blogs/{username}/", + "usernameClaimed": "Flashhell", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "EzoterikaConversion": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://ezoterikaconversion.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "8tracks.com": { + "checkType": "message", + "presenseStrs": [ + "Following" + ], + "absenceStrs": [ + "This page has vanished, or perhaps it never even existed..." + ], + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://8tracks.com/{username}" + }, + "www.adultism.com": { + "checkType": "message", + "presenseStrs": [ + "Member since" + ], + "absenceStrs": [ + "Not Found" + ], + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://www.adultism.com/profile/{username}" + }, + "architizer.com": { + "checkType": "message", + "presenseStrs": [ + "Projects" + ], + "absenceStrs": [ + "We can't seem to find the page you're looking for." + ], + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://architizer.com/users/{username}" + }, + "artfol.me": { + "checkType": "message", + "presenseStrs": [ + "About" + ], + "absenceStrs": [ + "This user does not exist" + ], + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://artfol.me/{username}" + }, + "asquero.com": { + "checkType": "message", + "presenseStrs": [ + "Tutorials" + ], + "absenceStrs": [ + "Find The Best Learning Resources" + ], + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://asquero.com/user/dashboard/{username}" + }, + "Byond": { + "absenceStrs": [ + "Announcements about BYOND's software and website." + ], + "presenseStrs": [ + "Shoutbox" + ], + "checkType": "message", + "url": "https://www.byond.com/members/{username}" + }, + "F3.cool": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://f3.cool/", + "url": "https://f3.cool/{username}/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fabswingers": { + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "absenceStrs": [ + "The user you tried to view doesn't seem to be on the site any more" + ], + "presenseStrs": [ + "View Profile" + ], + "url": "https://www.fabswingers.com/profile/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Faktopedia": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleziono użytkownika o podanym loginie." + ], + "presenseStrs": [ + "Zamieszcza fakty od:" + ], + "url": "https://faktopedia.pl/user/{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fancentro": { + "checkType": "status_code", + "errors": { + "https://fancentro.com/nowar": "Site censorship" + }, + "url": "https://fancentro.com/{username}/", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fansly": { + "checkType": "message", + "presenseStrs": [ + "username" + ], + "absenceStrs": [ + "response: []" + ], + "url": "https://apiv2.fansly.com/api/v1/account?usernames={username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fedi.lewactwo.pl": { + "checkType": "message", + "presenseStrs": [ + "@lewactwo.pl" + ], + "absenceStrs": [ + "The page you are looking for isn't here." + ], + "url": "https://fedi.lewactwo.pl/@{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Forumprawne.org": { + "checkType": "status_code", + "url": "https://forumprawne.org/members/{username}.html", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Fosstodon": { + "checkType": "message", + "presenseStrs": [ + "@fosstodon.org" + ], + "absenceStrs": [ + "The page you are looking for isn't here." + ], + "url": "https://fosstodon.org/@{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fotka": { + "checkType": "message", + "presenseStrs": [ + "profil" + ], + "absenceStrs": [ + "ERROR" + ], + "url": "https://api.fotka.com/v2/user/dataStatic?login={username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Friendfinder": { + "checkType": "message", + "presenseStrs": [ + "friendfinder.com/profile/" + ], + "absenceStrs": [ + "friendfinder.com/p/register.cgi" + ], + "url": "https://friendfinder.com/profile/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Friendfinder-x": { + "checkType": "message", + "presenseStrs": [ + "s Dating Profile on FriendFinder-x" + ], + "absenceStrs": [ + "friendfinder-x.com/p/register.cgi" + ], + "url": "https://www.friendfinder-x.com/profile/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Furaffinity": { + "checkType": "message", + "presenseStrs": [ + "Userpage of" + ], + "absenceStrs": [ + "user cannot be found" + ], + "url": "https://www.furaffinity.net/user/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis9" + }, + "Fameswap": { + "checkType": "message", + "url": "https://fameswap.com/user/{username}", + "usernameClaimed": "fameswap", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_firewall" + ], + "absenceStrs": [ + "Be right back." + ] + }, + "Faqusha": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://faqusha.ru", + "url": "https://faqusha.ru/profile/{username}/", + "usernameClaimed": "typhoon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Favera": { + "tags": [ + "ru" + ], + "disabled": true, + "checkType": "status_code", + "urlMain": "https://favera.ru", + "url": "https://favera.ru/{username}", + "usernameClaimed": "mayhem", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fcdin": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "http://fcdin.com", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fclmnews": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://fclmnews.ru", + "url": "https://fclmnews.ru/user/{username}", + "usernameClaimed": "stoker82", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fegatch": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "http://www.fegatch.com/", + "url": "http://www.fegatch.com/users/{username}/artworks/", + "usernameClaimed": "margaret-veret", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ficwriter": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Этот профиль либо больше не существует или не доступен." + ], + "urlMain": "https://ficwriter.info", + "url": "https://ficwriter.info/polzovateli/userprofile/{username}.html", + "usernameClaimed": "Zinaida", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Filmogs": { + "disabled": true, + "tags": [ + "movies" + ], + "checkType": "status_code", + "urlMain": "https://www.filmo.gs/", + "url": "https://www.filmo.gs/users/{username}", + "usernameClaimed": "cupparober", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Filmwatch": { + "tags": [ + "ca", + "pk" + ], + "checkType": "status_code", + "urlMain": "https://filmwatch.com", + "url": "https://filmwatch.com/user/home/{username}", + "usernameClaimed": "hazelamy", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Finanzfrage": { + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "url": "https://www.finanzfrage.net/nutzer/{username}", + "usernameClaimed": "finanzfrage", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Finforum": { + "tags": [ + "forum", + "ru", + "vn" + ], + "engine": "XenForo", + "urlMain": "https://finforum.net", + "usernameClaimed": "tropical", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fireworktv": { + "tags": [ + "jp" + ], + "checkType": "message", + "absenceStrs": [ + "<title>Firework" + ], + "urlMain": "https://fireworktv.com", + "url": "https://fireworktv.com/ch/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Flbord": { + "disabled": true, + "tags": [ + "ru", + "ua" + ], + "checkType": "status_code", + "urlMain": "https://flbord.com", + "url": "https://flbord.com/user/{username}/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fm-forum": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Информация" + ], + "urlMain": "https://fm-forum.ru", + "url": "https://fm-forum.ru/search.php?action=search&keywords=&author={username}", + "usernameClaimed": "nikita", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Forum.glow-dm.ru": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "http://forum.glow-dm.ru", + "usernameClaimed": "jkey", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ], + "disabled": true + }, + "Forum.jambox.ru": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://forum.jambox.ru", + "usernameClaimed": "ComManDX", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Forum.quake2.com.ru": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "," + ], + "urlMain": "http://forum.quake2.com.ru/", + "url": "http://forum.quake2.com.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "Khidalov", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Forum29": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://forum29.net", + "usernameClaimed": "KISS", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ForumEvaveda": { + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "http://forum.evaveda.com/", + "usernameClaimed": "leisan", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ForumSmotri": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "urlMain": "https://forumsmotri.club", + "url": "https://forumsmotri.club/user/{username}/", + "presenseStrs": [ + "Был тут" + ], + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ForumYuristov": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "urlMain": "https://forumyuristov.ru/", + "url": "https://forumyuristov.ru/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Forumreligions": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "По вашему запросу ничего не найдено." + ], + "urlMain": "https://forumreligions.ru", + "url": "https://forumreligions.ru/search.php?action=search&keywords=&author={username}", + "usernameClaimed": "ingvar", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Forumsi": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://www.forumsi.org", + "usernameClaimed": "Ahimas", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Forumteam": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://forumteam.best/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Fozo": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://fozo.info/", + "url": "https://fozo.info/user/{username}/", + "usernameClaimed": "%D0%A8%D0%98%D0%9A", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Free-lance.ua": { + "tags": [ + "freelance", + "ua" + ], + "checkType": "status_code", + "urlMain": "https://free-lance.ua/", + "url": "https://free-lance.ua/users/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Freelancebay": { + "tags": [ + "freelance", + "th" + ], + "checkType": "message", + "presenseStrs": [ + "สมัครสมาชิกเมื่อ" + ], + "urlMain": "https://www.freelancebay.com", + "url": "https://www.freelancebay.com/freelancer/{username}", + "usernameClaimed": "maysuphak", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Freepo": { + "checkType": "response_url", + "urlMain": "https://freepo.st", + "url": "https://freepo.st/freepost.cgi/user/public/{username}", + "usernameClaimed": "robocop", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "news" + ] + }, + "Fullhub": { + "tags": [ + "ru", + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "title>Выдающиеся пользователи | FullHub: Форум о мобильных" + ], + "urlMain": "https://fullhub.ru/", + "url": "https://fullhub.ru/forum/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "FurryFandom": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Попробуйте использовать поиск по пользователям" + ], + "urlMain": "https://furry-fandom.ru/", + "url": "https://furry-fandom.ru/user?who={username}", + "usernameClaimed": "Finya", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "G2g.com": { + "checkType": "message", + "presenseStrs": [ + "s Profile - G2G Games Marketplace" + ], + "absenceStrs": [ + "G2G: World Leading Digital Marketplace Platform" + ], + "url": "https://www.g2g.com/{username}", + "usernameClaimed": "user", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "G-news": { + "tags": [ + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователя не существует." + ], + "urlMain": "https://g-news.com.ua", + "url": "https://g-news.com.ua/forum_smf/profile/{username}/", + "usernameClaimed": "Glukodrom", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "GDProfiles": { + "disabled": true, + "checkType": "status_code", + "urlMain": "https://gdprofiles.com/", + "url": "https://gdprofiles.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "GGIZI": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://gg-izi.ru/", + "url": "https://gg-izi.ru/user/{username}", + "usernameClaimed": "nimses", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "GPS-Forum": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://www.gps-forum.ru", + "url": "http://www.gps-forum.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "sater", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Twitter Shadowban": { + "tags": [ + "jp", + "sa" + ], + "urlProbe": "https://shadowban.eu/.api/{username}", + "checkType": "message", + "presenseStrs": [ + "exists\": true" + ], + "absenceStrs": [ + "exists\": false" + ], + "urlMain": "https://shadowban.eu", + "url": "https://shadowban.eu/{username}", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Gamesfrm": { + "tags": [ + "forum", + "tr" + ], + "engine": "XenForo", + "urlMain": "https://www.gamesfrm.com", + "usernameClaimed": "zampara", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gamesubject": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://gamesubject.com", + "url": "https://gamesubject.com/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "GaragePunk": { + "checkType": "status_code", + "urlMain": "https://www.garagepunk.com", + "url": "https://www.garagepunk.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gardening-forums": { + "tags": [ + "forum", + "ph" + ], + "engine": "XenForo", + "urlMain": "https://www.gardening-forums.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Geekdoing": { + "tags": [ + "gr", + "ir" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://geekdoing.com", + "url": "https://geekdoing.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "GeniusArtists": { + "checkType": "status_code", + "url": "https://genius.com/artists/{username}", + "usernameClaimed": "genius", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "German242": { + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "https://board.german242.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gesundheitsfrage": { + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "url": "https://www.gesundheitsfrage.net/nutzer/{username}", + "usernameClaimed": "gutefrage", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gitbook": { + "checkType": "status_code", + "url": "https://{username}.gitbook.io/", + "usernameClaimed": "gitbook", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Glbyh": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://glbyh.ru/", + "usernameClaimed": "ufo", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gliger": { + "disabled": true, + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://www.gliger.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gnome-vcs": { + "checkType": "message", + "presenseStrs": [ + "Member since" + ], + "absenceStrs": [ + "You need to sign in or sign up" + ], + "url": "https://gitlab.gnome.org/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gorodanapa": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "такого участника форума не существует" + ], + "urlMain": "http://gorodanapa.ru/", + "url": "http://gorodanapa.ru/forum/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gothic": { + "urlSubpath": "/forum", + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://gothic.su", + "usernameClaimed": "Lestat", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gps-forumCOM": { + "engine": "XenForo", + "urlMain": "https://www.gps-forums.com", + "usernameClaimed": "johnash", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "tech" + ] + }, + "Gradle": { + "checkType": "message", + "presenseStrs": [ + "Joined on" + ], + "absenceStrs": [ + "User not found" + ], + "url": "https://plugins.gradle.org/u/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Grailed": { + "checkType": "status_code", + "url": "https://www.grailed.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gulfcoastgunforum": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://gulfcoastgunforum.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Gunandgame": { + "disabled": true, + "ignore403": true, + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found. Please enter a member's entire name." + ], + "urlMain": "https://www.gunandgame.co", + "url": "https://www.gunandgame.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "HackeralexaRank": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "Something went wrong" + ], + "urlMain": "https://hackeralexaRank.com/", + "url": "https://hackeralexaRank.com/{username}", + "usernameClaimed": "satznova", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hackerrank": { + "tags": [ + "coding" + ], + "checkType": "status_code", + "regexCheck": "^[^\\.]+$", + "urlMain": "https://www.hackerrank.com/", + "url": "https://www.hackerrank.com/profile/{username}", + "urlProbe": "https://www.hackerrank.com/rest/contests/master/hackers/{username}/profile", + "usernameClaimed": "uheara_konen", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 6003 + }, + "Hairmaniac": { + "tags": [ + "medicine", + "ru" + ], + "checkType": "status_code", + "urlMain": "https://www.hairmaniac.ru/", + "url": "https://www.hairmaniac.ru/profile/{username}/", + "usernameClaimed": "irina", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Handgunforum": { + "disabled": true, + "tags": [ + "ca", + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found. Please enter a member's entire name." + ], + "urlMain": "https://www.handgunforum.net", + "url": "https://www.handgunforum.net/xf/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hexrpg": { + "checkType": "message", + "presenseStrs": [ + "Real Name" + ], + "absenceStrs": [ + "Error : User " + ], + "url": "https://www.hexrpg.com/userinfo/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Hockeyforum": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://www.hockeyforum.com", + "url": "https://www.hockeyforum.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis777", + "tags": [ + "forum", + "sport" + ] + }, + "Holiday.ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Анкета удалена, заблокирована" + ], + "urlMain": "https://www.holiday.ru", + "url": "https://www.holiday.ru/ru/{username}", + "usernameClaimed": "marina", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Honda": { + "tags": [ + "ru", + "ua" + ], + "checkType": "status_code", + "urlMain": "https://honda.org.ua", + "url": "https://honda.org.ua/forum/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Houserepairtalk": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://www.houserepairtalk.com", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Iconfinder": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "Page not found" + ], + "presenseStrs": [ + "iconsets" + ], + "url": "https://www.iconfinder.com/{username}", + "usernameClaimed": "iconfinder", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Inkbunny": { + "checkType": "message", + "presenseStrs": [ + "Profile | Inkbunny, the Furry Art Community" + ], + "absenceStrs": [ + "Members | Inkbunny, the Furry Art Community" + ], + "url": "https://inkbunny.net/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ipolska.pl": { + "checkType": "message", + "presenseStrs": [ + "@ipolska.pl" + ], + "absenceStrs": [ + "The page you are looking for isn't here." + ], + "url": "https://ipolska.pl/@{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ieoc": { + "checkType": "status_code", + "urlMain": "https://ieoc.com/", + "url": "https://ieoc.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Iknifecollector": { + "checkType": "response_url", + "urlMain": "https://iknifecollector.com", + "url": "https://iknifecollector.com/profiles/profile/show?id={username}", + "usernameClaimed": "BryanW", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ingunowners": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://www.ingunowners.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Invalidnost": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "https://www.invalidnost.com", + "usernameClaimed": "astra71", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "IonicFramework": { + "checkType": "status_code", + "url": "https://forum.ionicframework.com/u/{username}", + "usernameClaimed": "theblue222", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ispdn": { + "disabled": true, + "tags": [ + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "errors": { + "The script encountered an error and will be aborted": "Site error" + }, + "urlMain": "http://ispdn.ru", + "url": "http://ispdn.ru/forum/user/{username}/", + "usernameClaimed": "AlexG", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Itforums": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://itforums.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ], + "disabled": true + }, + "Itfy": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "urlMain": "https://itfy.org", + "url": "https://itfy.org/members/?username={username}", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Jbzd": { + "checkType": "message", + "presenseStrs": [ + "Dzidy użytkownika" + ], + "absenceStrs": [ + "Błąd 404" + ], + "url": "https://jbzd.com.pl/uzytkownik/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Jeja.pl": { + "checkType": "message", + "presenseStrs": [ + "Profil użytkownika" + ], + "absenceStrs": [ + "Niepoprawny login" + ], + "url": "https://www.jeja.pl/user,{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Jellyfin Weblate": { + "checkType": "message", + "presenseStrs": [ + "user-page text-center" + ], + "absenceStrs": [ + "Page not found" + ], + "url": "https://translate.jellyfin.org/user/{username}/", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Joby": { + "tags": [ + "freelance", + "ru" + ], + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "Страница не найдена" + ], + "urlMain": "https://joby.su", + "url": "https://joby.su/{username}/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Joemonster": { + "checkType": "message", + "presenseStrs": [ + "Aktywność bojownicza" + ], + "absenceStrs": [ + "Nie wiem jak ci to powiedzieć" + ], + "url": "https://joemonster.org/bojownik/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "JoplinApp": { + "checkType": "status_code", + "url": "https://discourse.joplinapp.org/u/{username}", + "usernameClaimed": "laurent", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Justforfans": { + "checkType": "message", + "presenseStrs": [ + "@ JustFor.Fans" + ], + "absenceStrs": [ + "Show Me:" + ], + "url": "https://justfor.fans/{username}", + "usernameClaimed": "devinfrancoxxx", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Juventuz": { + "tags": [ + "forum", + "sg" + ], + "engine": "XenForo", + "urlMain": "https://www.juventuz.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Karab.in": { + "checkType": "message", + "presenseStrs": [ + "Dołączył:" + ], + "absenceStrs": [ + "Błąd 404" + ], + "url": "https://karab.in/u/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Keakr": { + "disabled": true, + "checkType": "status_code", + "url": "https://www.keakr.com/en/profile/{username}", + "usernameClaimed": "beats", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "BeatStars": { + "checkType": "message", + "url": "https://www.beatstars.com/{username}", + "presenseStrs": [ + "Stats" + ], + "absenceStrs": [ + "Page not found" + ], + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kino-tv": { + "tags": [ + "forum", + "ru" + ], + "engine": "uCoz", + "urlMain": "http://www.kino-tv-forum.ru", + "usernameClaimed": "emal", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kinogo": { + "tags": [ + "by", + "movies" + ], + "checkType": "status_code", + "urlMain": "https://kinogo.by", + "url": "https://kinogo.by/user/{username}", + "usernameClaimed": "ridder2", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Kinooh": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://kinooh.ru", + "url": "https://kinooh.ru/user/{username}/", + "usernameClaimed": "zoll", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kladoiskatel": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://forum.kladoiskatel.ru", + "url": "http://forum.kladoiskatel.ru/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "Aleksey54", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kontrolkalemi": { + "tags": [ + "tr" + ], + "checkType": "message", + "absenceStrs": [ + "Belirtilen üye bulunamadı. Lütfen bir üyenin tam adını giriniz." + ], + "urlMain": "https://www.kontrolkalemi.com", + "url": "https://www.kontrolkalemi.com/forum/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kotburger": { + "checkType": "message", + "presenseStrs": [ + "Zamieszcza kotburgery od:" + ], + "absenceStrs": [ + "Nie znaleziono użytkownika o podanym loginie." + ], + "url": "https://kotburger.pl/user/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Kriptom": { + "tags": [ + "tr" + ], + "checkType": "message", + "presenseStrs": [ + "Kayıt tarihi" + ], + "absenceStrs": [ + "Kullanıcı Detayı - Kriptom" + ], + "urlMain": "https://www.kriptom.com", + "url": "https://www.kriptom.com/user/{username}/", + "usernameClaimed": "firatimo", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "KristallovNet": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://forum.kristallov.net", + "usernameClaimed": "golodny", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lesswrong": { + "checkType": "message", + "presenseStrs": [ + "displayName" + ], + "url": "https://www.lesswrong.com/users/@{username}", + "urlMain": "https://www.lesswrong.com", + "urlProbe": "https://www.lesswrong.com/graphql?query=%7B%20user(input%3A%20%7Bselector%3A%20%7Bslug%3A%20%22{username}%22%7D%7D)%20%7B%20result%20%7B%20displayName%20%7D%20%7D%20%7D", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 8300 + }, + "Letsbeef": { + "disabled": true, + "tags": [ + "vi" + ], + "checkType": "message", + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "urlMain": "https://www.letsbeef.com", + "url": "https://www.letsbeef.com/forums/member.php?&username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Letschatlove": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "The user whose profile you are trying to view does not exist." + ], + "urlMain": "https://letschatlove.com", + "url": "https://letschatlove.com/profile/{username}/", + "usernameClaimed": "Fusion", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "LibReviews": { + "checkType": "status_code", + "urlMain": "https://lib.reviews", + "url": "https://lib.reviews/user/{username}", + "usernameClaimed": "pat", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Liebe69": { + "tags": [ + "de" + ], + "checkType": "response_url", + "urlMain": "https://www.liebe69.de", + "url": "https://www.liebe69.de/profile-preview.php?username={username}", + "usernameClaimed": "klaus", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Life-dom2": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "" + ], + "absenceStrs": [ + "Пользователь с таким именем не найден." + ], + "urlMain": "https://life-dom2.su", + "url": "https://life-dom2.su/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lightstalking": { + "tags": [ + "forum", + "photo" + ], + "checkType": "status_code", + "urlMain": "https://lightstalking.us/", + "url": "https://lightstalking.us/members/{username}", + "usernameClaimed": "kent", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "line.me": { + "checkType": "status_code", + "url": "https://line.me/R/ti/p/@{username}?from=page", + "usernameClaimed": "yoasobi", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "LinuxMint": { + "tags": [ + "forum", + "ru" + ], + "urlMain": "https://www.linuxmint.com.ru", + "engine": "phpBB", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Listed.to": { + "checkType": "message", + "presenseStrs": [ + "

L

" + ], + "absenceStrs": [ + "

Featured authors

" + ], + "url": "https://listed.to/@{username}", + "usernameClaimed": "listed", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "LostFilmHD": { + "disabled": true, + "tags": [ + "es", + "movies", + "pl", + "ru" + ], + "engine": "uCoz", + "urlMain": "http://www.lostfilmhd.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lottiefiles": { + "checkType": "status_code", + "url": "https://lottiefiles.com/{username}", + "usernameClaimed": "lottiefiles", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "Lovemakeup": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://lovemakeup.ru", + "url": "https://lovemakeup.ru/profile/{username}", + "usernameClaimed": "Tompob", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Lowcygier.pl": { + "checkType": "message", + "presenseStrs": [ + "Zarejestrowany" + ], + "absenceStrs": [ + "Błąd 404 - Podana strona nie istnieje" + ], + "url": "https://bazar.lowcygier.pl/user/{username}", + "usernameClaimed": "janek", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "MacPlanete": { + "tags": [ + "forum", + "fr", + "ma" + ], + "engine": "XenForo", + "urlMain": "https://forum.macplanete.com", + "usernameClaimed": "pascal971", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Macqa": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://macqa.ru", + "url": "https://macqa.ru/member/{username}/", + "usernameClaimed": "vika", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Maga-Chat": { + "checkType": "message", + "absenceStrs": [ + "Page Not Be Found" + ], + "presenseStrs": [ + "Recent Updates" + ], + "url": "https://maga-chat.com/{username}", + "usernameClaimed": "jfc_haaber_89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mag-portal": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://mag-portal.ru", + "url": "https://mag-portal.ru/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "solp", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Magabook": { + "checkType": "message", + "absenceStrs": [ + "Page Not Be Found" + ], + "presenseStrs": [ + "Recent Updates" + ], + "url": "https://magabook.com/{username}", + "usernameClaimed": "eric", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Magiimir": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://magiimir.com", + "url": "https://magiimir.com/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "olya", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mamochki": { + "tags": [ + "by", + "ru" + ], + "checkType": "status_code", + "urlMain": "https://mamochki.by/", + "url": "https://mamochki.by/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Manutd": { + "tags": [ + "forum", + "sport" + ], + "checkType": "status_code", + "urlMain": "https://manutd.one", + "url": "https://manutd.one/user/{username}", + "usernameClaimed": "Becks", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mapify.travel": { + "checkType": "message", + "presenseStrs": [ + "class=\"control-center\"" + ], + "absenceStrs": [ + "Nothing found - Mapify" + ], + "url": "https://mapify.travel/{username}", + "usernameClaimed": "mapify", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "MapMyTracks": { + "checkType": "message", + "absenceStrs": [ + "Sorry, there is nothing to see here" + ], + "presenseStrs": [ + "Daily distance this week" + ], + "url": "https://www.mapmytracks.com/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Marshmallow": { + "checkType": "message", + "absenceStrs": [ + "ご指定のページは見つかりませんでした" + ], + "presenseStrs": [ + "Throw a marshmallow to" + ], + "url": "https://marshmallow-qa.com/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Martech": { + "checkType": "message", + "absenceStrs": [ + "Page not found" + ], + "presenseStrs": [ + "twitter:site" + ], + "url": "https://martech.org/author/{username}/", + "usernameClaimed": "james-green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "MassageAnywhere": { + "checkType": "message", + "absenceStrs": [ + "MassageAnywhere.com: Search Results" + ], + "presenseStrs": [ + "MassageAnywhere.com Profile for " + ], + "url": "https://www.massageanywhere.com/profile/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mastera-forum": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "https://www.mastera-forum.ru", + "usernameClaimed": "grunja", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Masterkrasok": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://masterkrasok.ru", + "url": "https://masterkrasok.ru/{username}", + "usernameClaimed": "husnullin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mastersofcrypto": { + "tags": [ + "forum" + ], + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://mastersofcrypto.com", + "url": "https://mastersofcrypto.com/forum/members/?username={username}", + "usernameClaimed": "kintum", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mcbans": { + "checkType": "response_url", + "presenseStrs": [ + "Issued Bans" + ], + "urlMain": "https://www.mcbans.com", + "url": "https://www.mcbans.com/player/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mcuuid": { + "checkType": "message", + "absenceStrs": [ + "minecraft.api_failure" + ], + "presenseStrs": [ + "Successfully found player by given ID." + ], + "url": "https://playerdb.co/api/player/minecraft/{username}", + "usernameClaimed": "bob", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mdregion": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "https://www.mdregion.ru/", + "usernameClaimed": "Nadka", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 951372 + }, + "Medyczka.pl": { + "checkType": "message", + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "presenseStrs": [ + "Lista uzytkownikow" + ], + "url": "http://medyczka.pl/user/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Meendo": { + "tags": [ + "bg", + "kg", + "ru", + "ua" + ], + "checkType": "status_code", + "urlMain": "https://www.meendo.net", + "url": "https://www.meendo.net/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Megamodels.pl": { + "checkType": "message", + "absenceStrs": [ + "OSTATNIO AKTYWNE PROFILE" + ], + "presenseStrs": [ + "Portfolio" + ], + "url": "http://megamodels.pl/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Megane2": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден. Пожалуйста, введите другое имя." + ], + "urlMain": "http://megane2.ru/", + "url": "http://megane2.ru/forum/members/?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ProtonMail": { + "checkType": "message", + "presenseStrs": [ + "Username already used" + ], + "absenceStrs": [ + "\"Code\": 1000" + ], + "headers": { + "X-Pm-Appversion": "web-account@4.28.2" + }, + "url": "https://account.protonmail.com/api/users/available?Name={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Microchip": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://www.microchip.su", + "usernameClaimed": "nightavenger", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Minecraftlist": { + "checkType": "message", + "absenceStrs": [ + "0 Minecraft servers recently" + ], + "presenseStrs": [ + "was seen on" + ], + "url": "https://minecraftlist.com/players/{username}", + "usernameClaimed": "dream", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Miped": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://miped.ru", + "url": "https://miped.ru/user/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mistrzowie": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleziono użytkownika o podanym loginie." + ], + "presenseStrs": [ + "Profil użytkownika" + ], + "url": "https://mistrzowie.org/user/{username}", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mixlr": { + "tags": [ + "gb" + ], + "checkType": "status_code", + "urlMain": "http:/mixlr.com/", + "url": "http://api.mixlr.com/users/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mobile-files": { + "urlSubpath": "/forum", + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://www.mobile-files.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mobrep": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "<div class=\"users\">\n <ul>\n </ul>" + ], + "urlMain": "https://www.mobrep.ru", + "url": "https://www.mobrep.ru/users?criteria={username}", + "usernameClaimed": "alextsaryev99", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Money-talk": { + "tags": [ + "ua" + ], + "errors": { + "Could not connect to the database": "Site error", + "You have been banned from this forum.": "IP ban" + }, + "checkType": "message", + "absenceStrs": [ + ">Contact </span></td>" + ], + "urlMain": "http://www.money-talk.org", + "url": "http://www.money-talk.org/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "Gaia1956", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Monkingme": { + "disabled": true, + "tags": [ + "es", + "ir" + ], + "checkType": "message", + "absenceStrs": [ + "<h1>Not Found</h1>" + ], + "urlMain": "https://www.monkingme.com/", + "url": "https://www.monkingme.com/artist/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Motokiller": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleziono użytkownika o podanym loginie." + ], + "presenseStrs": [ + "Zamieszcza materiały od:" + ], + "url": "https://mklr.pl/user/{username}", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Motorradfrage": { + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "url": "https://www.motorradfrage.net/nutzer/{username}", + "usernameClaimed": "gutefrage", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Movie-forum": { + "tags": [ + "forum", + "pk" + ], + "engine": "vBulletin", + "urlMain": "https://movie-forum.co", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "MurmanskLife": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "<span class=\"userName\"></span>", + "error404-404" + ], + "urlMain": "http://murmansk-life.ru", + "url": "http://murmansk-life.ru/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Music-rock": { + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://music-rock.ru/", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "My-question": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://my-question.ru", + "url": "https://my-question.ru/user/{username}", + "usernameClaimed": "nunny_zn", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mym.fans": { + "checkType": "message", + "absenceStrs": [ + "• MYM •" + ], + "presenseStrs": [ + "• MYM" + ], + "url": "https://mym.fans/{username}", + "usernameClaimed": "Djelizamay", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Mydarling": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "http://mydarling.ru/", + "url": "http://mydarling.ru/page/{username}/frl-4", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Mylove": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://lovetalk.ru", + "url": "https://lovetalk.ru/{username}/#window_close", + "usernameClaimed": "lisa", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Naturalnews": { + "checkType": "message", + "absenceStrs": [ + "The page you are looking for cannot be found or is no longer available." + ], + "presenseStrs": [ + "All posts by" + ], + "url": "https://naturalnews.com/author/{username}/", + "usernameClaimed": "healthranger", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ninjakiwi": { + "checkType": "message", + "absenceStrs": [ + "Ninja Kiwi - Free Online Games, Mobile Games & Tower Defense Games" + ], + "presenseStrs": [ + "Ninja Kiwi" + ], + "url": "https://ninjakiwi.com/profile/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "NationalgunForum": { + "disabled": true, + "tags": [ + "ca", + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://www.nationalgunforum.com", + "url": "https://www.nationalgunforum.com/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "Naturalworld": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://naturalworld.guru", + "url": "https://naturalworld.guru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "mrseo", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Needrom": { + "disabled": true, + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "url": "https://www.needrom.com/author/{username}/", + "usernameClaimed": "needrom", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "No-jus": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://no-jus.com", + "url": "https://no-jus.com/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "dronaz", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Numizmat": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://numizmat-forum.ru", + "url": "https://numizmat-forum.ru/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "solo", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Nyaa.si": { + "checkType": "message", + "absenceStrs": [ + "404 Not Found" + ], + "presenseStrs": [ + "'s torrents" + ], + "url": "https://nyaa.si/user/{username}", + "usernameClaimed": "kouhy76", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Offline.by": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "https://offline.by", + "usernameClaimed": "violetta", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Oglaszamy24h": { + "checkType": "message", + "absenceStrs": [ + "Nieprawidłowy link, w bazie danych nie istnieje użytkownik o podanym loginie" + ], + "presenseStrs": [ + "Profil użytkownika:" + ], + "url": "https://oglaszamy24h.pl/profil,{username}", + "usernameClaimed": "janek", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Oilcareer": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://www.oilcareer.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Olx.pl": { + "checkType": "message", + "absenceStrs": [ + "Przepraszamy, ale nie możemy znaleźć takiej strony...", + "Nie znaleziono" + ], + "presenseStrs": [ + "Obserwuj wyszukiwanie" + ], + "url": "https://www.olx.pl/oferty/uzytkownik/{username}/", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "OnanistovNet": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://onanistov.net", + "url": "https://onanistov.net/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Oncoforum": { + "tags": [ + "forum", + "ru" + ], + "checkType": "response_url", + "urlMain": "https://www.oncoforum.ru", + "url": "https://www.oncoforum.ru/blog/blogs/{username}/", + "usernameClaimed": "admin13", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Opelclub": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://www.opelclub.ru", + "url": "http://www.opelclub.ru/forum/search.html?keywords=&terms=all&author={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Otechie": { + "tags": [ + "finance" + ], + "checkType": "message", + "presenseStrs": [ + "Start Conversation" + ], + "absenceStrs": [ + "Page not found!" + ], + "urlMain": "https://otechie.com", + "url": "https://otechie.com/{username}", + "usernameClaimed": "neurobin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "OurDJTalk": { + "engine": "XenForo", + "urlMain": "https://ourdjtalk.com/", + "usernameClaimed": "steve", + "usernameUnclaimed": "noonewouldeverusethis", + "tags": [ + "forum", + "music" + ] + }, + "Ourfreedombook": { + "checkType": "message", + "absenceStrs": [ + "Sorry, page not found" + ], + "presenseStrs": [ + "meta property=\"og:" + ], + "url": "https://www.ourfreedombook.com/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Outgress": { + "checkType": "message", + "absenceStrs": [ + "Outgress - Error" + ], + "url": "https://outgress.com/agents/{username}", + "urlMain": "https://outgress.com/", + "usernameClaimed": "pylapp", + "usernameUnclaimed": "noonewouldeverusethis42", + "protection": [ + "cf_firewall" + ] + }, + "Ow.ly": { + "checkType": "message", + "absenceStrs": [ + "Oops, an error occurred" + ], + "presenseStrs": [ + "Images" + ], + "url": "http://ow.ly/user/{username}", + "usernameClaimed": "StopAdMedia", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "P38forum": { + "urlSubpath": "/forums", + "engine": "vBulletin", + "urlMain": "http://p38forum.com", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Partyvibe": { + "tags": [ + "pk" + ], + "checkType": "status_code", + "urlMain": "https://www.partyvibe.org", + "url": "https://www.partyvibe.org/members/{username}/", + "usernameClaimed": "p0ly", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Patronite": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleźliśmy strony której szukasz." + ], + "presenseStrs": [ + "Zostań Patronem" + ], + "url": "https://patronite.pl/{username}", + "usernameClaimed": "radio357", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pewex.pl": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleziono użytkownika o podanym loginie." + ], + "presenseStrs": [ + "Zamieszcza eksponaty od:" + ], + "url": "https://retro.pewex.pl/user/{username}", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Piekielni": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleziono użytkownika o podanym loginie." + ], + "presenseStrs": [ + "Zamieszcza historie od:" + ], + "url": "https://piekielni.pl/user/{username}", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pilguy": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://pilguy.com", + "usernameClaimed": "zaw", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Piratebuhta": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://piratebuhta.club", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "PokerStrategy": { + "disabled": true, + "tags": [ + "ru" + ], + "errors": { + "PokerStrategy.org not available in": "Country restrictions" + }, + "checkType": "message", + "absenceStrs": [ + "Sorry, the requested page couldn't be found!" + ], + "urlMain": "http://www.pokerstrategy.net", + "url": "http://www.pokerstrategy.net/user/{username}/profile/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Pol.social": { + "checkType": "message", + "absenceStrs": [ + "The page you are looking for isn't here." + ], + "presenseStrs": [ + "@pol.social" + ], + "url": "https://pol.social/@{username}", + "usernameClaimed": "ducensor", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Polczat.pl": { + "checkType": "message", + "absenceStrs": [ + "Wybrany użytkownik nie istnieje." + ], + "presenseStrs": [ + "Historia wpisów" + ], + "url": "https://polczat.pl/forum/profile/{username}/", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Policja2009": { + "checkType": "message", + "absenceStrs": [ + "Informacja" + ], + "presenseStrs": [ + "class=\"postbody\"" + ], + "url": "http://www.policja2009.fora.pl/search.php?search_author={username}", + "usernameClaimed": "janek", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "Polleverywhere": { + "checkType": "message", + "absenceStrs": [ + "ResourceNotFound" + ], + "presenseStrs": [ + "name" + ], + "url": "https://pollev.com/proxy/api/users/{username}", + "usernameClaimed": "josh", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Polymart": { + "checkType": "message", + "presenseStrs": [ + "Resources" + ], + "absenceStrs": [ + "Looks like we couldn't find this user. Sorry!" + ], + "url": "https://polymart.org/user/{username}", + "usernameClaimed": "craciu25yt", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ], + "disabled": true + }, + "PornhubPornstars": { + "checkType": "message", + "absenceStrs": [ + "Error Page Not Found" + ], + "presenseStrs": [ + "Pornstar Rank" + ], + "url": "https://www.pornhub.com/pornstar/{username}", + "usernameClaimed": "riley-reid", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Poshmark": { + "checkType": "message", + "absenceStrs": [ + "Page not found - Poshmark" + ], + "presenseStrs": [ + " is using Poshmark to sell items from their closet." + ], + "url": "https://poshmark.com/closet/{username}", + "usernameClaimed": "alice", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "custom_bot_protection" + ] + }, + "Pro-cats": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://pro-cats.ru", + "usernameClaimed": "parrots", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Prosvetlenie": { + "ignore403": true, + "tags": [ + "kg", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "urlMain": "http://www.prosvetlenie.org", + "url": "http://www.prosvetlenie.org/forum/members/?username={username}", + "usernameClaimed": "odin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Prv.pl": { + "checkType": "message", + "absenceStrs": [ + "Użytkownik nie istnieje." + ], + "presenseStrs": [ + "LOGIN" + ], + "url": "https://www.prv.pl/osoba/{username}", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Quake-champions": { + "disabled": true, + "tags": [ + "ru" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "urlMain": "https://quake-champions.pro", + "url": "https://quake-champions.pro/community/profile/{username}/", + "usernameClaimed": "bruner", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Quitter.pl": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleziono" + ], + "presenseStrs": [ + "@quitter.pl" + ], + "url": "https://quitter.pl/profile/{username}", + "usernameClaimed": "divmod", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Quizlet": { + "checkType": "status_code", + "url": "https://quizlet.com/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "RC-MIR": { + "tags": [ + "ru" + ], + "regexCheck": "^[a-zA-Z0-9-]+$", + "checkType": "message", + "presenseStrs": [ + "Профиль пользователя" + ], + "absenceStrs": [ + "Извините" + ], + "urlMain": "http://rcmir.com/", + "url": "http://{username}.rcmir.com/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "RRForums": { + "tags": [ + "au", + "forum" + ], + "checkType": "message", + "absenceStrs": [ + "Profile Does Not Exist" + ], + "urlMain": "http://au.rrforums.net/", + "url": "http://au.rrforums.net/cgi-bin/forum/board-profile.pl?action=view_profile&profile={username}-users", + "usernameClaimed": "guyslp", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Radio-uchebnik": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://radio-uchebnik.ru", + "url": "http://radio-uchebnik.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "sasha", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Radiomed": { + "tags": [ + "ru" + ], + "checkType": "response_url", + "urlMain": "https://radiomed.ru", + "url": "https://radiomed.ru/users/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rammclan": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://www.rammclan.ru", + "usernameClaimed": "mathiassk", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rapforce": { + "tags": [ + "fr", + "ru" + ], + "engine": "uCoz", + "urlMain": "http://www.rapforce.net", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rasslabyxa": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://www.rasslabyxa.ru", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "RcloneForum": { + "checkType": "status_code", + "url": "https://forum.rclone.org/u/{username}", + "usernameClaimed": "ncw", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Redorchestra": { + "urlSubpath": "/forums", + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://www.redorchestra.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Reincarnationforum": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "http://reincarnationforum.com", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Reisefrage": { + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "url": "https://www.reisefrage.net/nutzer/{username}", + "usernameClaimed": "reisefrage", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "RenaultFanClub": { + "disabled": true, + "tags": [ + "forum", + "tr" + ], + "engine": "vBulletin", + "urlMain": "http://www.renaultfanclub.com", + "usernameClaimed": "mashar", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rigcz.club": { + "checkType": "message", + "absenceStrs": [ + "The page you are looking for isn't here." + ], + "presenseStrs": [ + "@rigcz.club" + ], + "url": "https://rigcz.club/@{username}", + "usernameClaimed": "blazej", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rngf": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Извините, такого пользователя не существует" + ], + "urlMain": "http://www.rngf.ru/", + "url": "http://www.rngf.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ro-ru": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://ro-ru.ru", + "url": "https://ro-ru.ru/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "set", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rovlpj": { + "tags": [ + "forum", + "gaming", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://rovlpj.com", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "RoyalCams": { + "tags": [ + "gr", + "ng", + "ru", + "webcam" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5", + "Referer": "https://pt.royalcams.com/", + "Upgrade-Insecure-Requests": "1", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Site": "same-origin", + "Sec-Fetch-User": "?1" + }, + "checkType": "message", + "presenseStrs": [ + "Informação e página" + ], + "absenceStrs": [ + "- RoyalCams" + ], + "urlMain": "https://royalcams.com", + "url": "https://royalcams.com/profile/{username}", + "urlProbe": "https://pt.royalcams.com/profile/{username}", + "usernameClaimed": "asuna-black", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "Ru-sfera": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "urlMain": "https://ru-sfera.org", + "url": "https://ru-sfera.org/members/?username={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Ruby.dating": { + "checkType": "message", + "absenceStrs": [ + "We can’t find that user" + ], + "presenseStrs": [ + "Looks for:" + ], + "url": "https://ruby.dating/en/users/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Rugby-forum": { + "tags": [ + "forum", + "ru" + ], + "checkType": "status_code", + "urlMain": "http://rugby-forum.ru", + "url": "http://rugby-forum.ru/polzovateli/{username}/", + "usernameClaimed": "bold", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Rumblechannel": { + "checkType": "message", + "presenseStrs": [ + "href=https://rumble.com/c/" + ], + "absenceStrs": [ + "404 - Not found" + ], + "url": "https://rumble.com/c/{username}", + "usernameClaimed": "HodgeTwins", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "Rumbleuser": { + "checkType": "message", + "presenseStrs": [ + "href=https://rumble.com/user/" + ], + "absenceStrs": [ + "404 - Not found" + ], + "url": "https://rumble.com/user/{username}", + "usernameClaimed": "SimonParkes", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "tls_fingerprint" + ] + }, + "Runescape": { + "checkType": "message", + "presenseStrs": [ + "loggedIn" + ], + "absenceStrs": [ + "{\"error\":\"NO_PROFILE\",\"loggedIn\":\"false\"}" + ], + "url": "https://apps.runescape.com/runemetrics/profile/profile?user={username}", + "usernameClaimed": "Zezima", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SakhalinName": { + "tags": [ + "ru" + ], + "checkType": "message", + "presenseStrs": [ + "reputation_graf", + "заблокирован" + ], + "absenceStrs": [ + "afisha_list" + ], + "urlMain": "https://sakhalin.name/", + "url": "https://sakhalin.name/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "custom_bot_protection" + ] + }, + "Salon24.pl": { + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "message", + "presenseStrs": [ + "- salon24.pl" + ], + "url": "https://www.salon24.pl/u/{username}/", + "urlMain": "https://www.salon24.pl", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "alexaRank": 64119 + }, + "Saracartershow": { + "checkType": "message", + "absenceStrs": [ + "Home |" + ], + "presenseStrs": [ + "Stories By" + ], + "url": "https://saraacarter.com/author/{username}/", + "usernameClaimed": "annaliese", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SatsisInfo": { + "tags": [ + "ru", + "ua" + ], + "checkType": "status_code", + "urlMain": "https://satsis.info/", + "url": "https://satsis.info/user/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_firewall" + ] + }, + "Schlock": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://schlock.ru/", + "url": "https://schlock.ru/author/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "School-school": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://school-school.ru", + "url": "https://school-school.ru/user/{username}", + "usernameClaimed": "nunny_zn", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Scoutwiki": { + "checkType": "message", + "absenceStrs": [ + "is not registered" + ], + "presenseStrs": [ + "NewPP limit report" + ], + "url": "https://en.scoutwiki.org/User:{username}", + "usernameClaimed": "Benjism89", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Seneporno": { + "checkType": "message", + "absenceStrs": [ + "Unexpected error! Please contact us and tell us more how you got to this page!" + ], + "presenseStrs": [ + "Dernier Login" + ], + "url": "https://seneporno.com/user/{username}", + "usernameClaimed": "Boymariste", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SevSocium": { + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "http://forum.sevsocium.com", + "usernameClaimed": "vitaline", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Sexforum.ws": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "http://sexforum.ws", + "usernameClaimed": "katrin1988", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Sexwin": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://sexforum.win", + "url": "https://sexforum.win/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "foks67", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Sfd.pl": { + "checkType": "message", + "absenceStrs": [ + "Brak aktywnego profilu na forum" + ], + "presenseStrs": [ + "Tematy użytkownika" + ], + "url": "https://www.sfd.pl/profile/{username}", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "ShaniiWrites": { + "checkType": "message", + "absenceStrs": [ + "The requested URL or resource could not be found." + ], + "presenseStrs": [ + "topics" + ], + "url": "https://forum.shanniiwrites.com/u/{username}/summary.json", + "usernameClaimed": "chococarmela", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ShitpostBot5000": { + "checkType": "status_code", + "urlMain": "https://www.shitpostbot.com/", + "url": "https://www.shitpostbot.com/user/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Shoe": { + "checkType": "message", + "presenseStrs": [ + "can only be viewed by SHOE members" + ], + "absenceStrs": [ + "This nickpage is temporary not available or no longer exists." + ], + "urlMain": "http://shoe.org", + "url": "http://{username}.shoe.org/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Shoppingzone": { + "tags": [ + "ru" + ], + "errors": { + "Вы не можете произвести поиск сразу после предыдущего": "Too many searhes per IP" + }, + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://shoppingzone.ru", + "url": "http://shoppingzone.ru/forum/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "eleonor", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Shotbow": { + "disabled": true, + "tags": [ + "ca", + "forum" + ], + "engine": "XenForo", + "urlMain": "https://shotbow.net", + "usernameClaimed": "velb", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "Silver-collector": { + "engine": "DiscourseJson", + "tags": [ + "forum" + ], + "urlMain": "https://www.silver-collector.com", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Skeb.jp": { + "checkType": "message", + "absenceStrs": [ + "Skeb - Request Box" + ], + "presenseStrs": [ + ") | Skeb" + ], + "url": "https://skeb.jp/@{username}", + "usernameClaimed": "eipuru_", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SkodaForum": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://www.skodaforum.ru", + "usernameClaimed": "rivera", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Skyrimforums": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://skyrimforums.org", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Slant.co": { + "checkType": "message", + "protection": [ + "tls_fingerprint" + ], + "absenceStrs": [ + "404 - Page Not Found - Slant" + ], + "presenseStrs": [ + "s Profile - Slant" + ], + "url": "https://www.slant.co/users/{username}", + "usernameClaimed": "bob", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Smashrun": { + "tags": [ + "br", + "jp" + ], + "checkType": "status_code", + "urlMain": "https://smashrun.com/", + "url": "https://smashrun.com/{username}/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Solaris-club": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://solaris-club.net", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Solikick": { + "checkType": "message", + "absenceStrs": [ + "This item has been removed or is no longer available" + ], + "presenseStrs": [ + "page_guest_users-view" + ], + "url": "https://solikick.com/-{username}", + "usernameClaimed": "Edmundus", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Soloby": { + "disabled": true, + "tags": [ + "by", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Страница не найдена" + ], + "urlMain": "http://www.soloby.ru", + "url": "http://www.soloby.ru/user/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Soobshestva": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "http://www.soobshestva.ru/", + "url": "http://www.soobshestva.ru/forum/user/{username}/", + "usernameClaimed": "lisa", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Spankpay": { + "checkType": "message", + "absenceStrs": [ + "SpankPay.Me" + ], + "presenseStrs": [ + " - SpankPay.Me" + ], + "url": "https://spankpay.me/{username}", + "usernameClaimed": "uehkon89", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "SpiceWorks": { + "checkType": "status_code", + "urlMain": "https://community.spiceworks.co", + "url": "https://community.spiceworks.com/people/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "tech" + ] + }, + "Splice": { + "checkType": "status_code", + "url": "https://splice.com/{username}", + "usernameClaimed": "splice", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Splits.io": { + "checkType": "status_code", + "urlMain": "https://splits.io", + "url": "https://splits.io/users/{username}", + "usernameClaimed": "cambosteve", + "usernameUnclaimed": "noonewould" + }, + "Sportlerfrage": { + "protection": [ + "tls_fingerprint" + ], + "checkType": "status_code", + "url": "https://www.sportlerfrage.net/nutzer/{username}", + "usernameClaimed": "sportlerfrage", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Stalker-zone": { + "tags": [ + "ru" + ], + "presenseStrs": [ + " Имя: " + ], + "engine": "uCoz", + "urlMain": "http://stalker-zone.info", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Starvault": { + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://starvault.se", + "url": "https://starvault.se/mortalforums/members/?username={username}", + "usernameClaimed": "xunila", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "gaming" + ], + "disabled": true + }, + "Statistika": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://statistika.ru", + "usernameClaimed": "hamam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Steamid": { + "tags": [ + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "
Profile not found
" + ], + "urlMain": "https://steamid.uk/", + "url": "https://steamid.uk/profile/{username}", + "source": "Steam", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Steamid (by id)": { + "tags": [ + "gaming" + ], + "type": "steam_id", + "checkType": "message", + "absenceStrs": [ + "
Profile not found
" + ], + "urlMain": "https://steamid.uk/", + "url": "https://steamid.uk/profile/{username}", + "source": "Steam", + "usernameClaimed": "76561197982198022", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Stoimost": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "https://stoimost.com.ua", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Stunited": { + "disabled": true, + "checkType": "status_code", + "urlMain": "http://stunited.org", + "url": "http://stunited.org/profile/{username}", + "usernameClaimed": "mani-vel", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "education" + ] + }, + "Subeta": { + "checkType": "message", + "absenceStrs": [ + "Invalid user" + ], + "urlMain": "https://subeta.net/", + "url": "https://subeta.net/users/{username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Suzuri.jp": { + "checkType": "message", + "absenceStrs": [ + "404 | SUZURI" + ], + "presenseStrs": [ + "∞ SUZURI(スズリ)" + ], + "url": "https://suzuri.jp/{username}", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Swapd": { + "checkType": "status_code", + "url": "https://swapd.co/u/{username}", + "usernameClaimed": "swapd", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SwimmingForum": { + "tags": [ + "forum", + "ru" + ], + "engine": "uCoz", + "urlMain": "http://forumswimming.ru", + "usernameClaimed": "irina", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Syktforum": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Такого пользователя не существует." + ], + "urlMain": "http://syktforum.ru", + "url": "http://syktforum.ru/profile/{username}", + "usernameClaimed": "TonyT", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SyktyvkarOnline": { + "tags": [ + "ru" + ], + "errors": { + "Страница будет доступна через несколько секунд": "Verification redirect page" + }, + "checkType": "message", + "absenceStrs": [ + "", + "error404-404" + ], + "urlMain": "http://syktyvkar-online.ru", + "url": "http://syktyvkar-online.ru/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Szerokikadr.pl": { + "checkType": "message", + "absenceStrs": [ + "Nie masz jeszcze konta?" + ], + "presenseStrs": [ + "Profil użytkownika" + ], + "url": "https://www.szerokikadr.pl/profil,{username}", + "usernameClaimed": "janek", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Szmer.info": { + "checkType": "message", + "absenceStrs": [ + "Code: Couldn't find that username or email." + ], + "presenseStrs": [ + "Joined" + ], + "url": "https://szmer.info/u/{username}", + "usernameClaimed": "Xavier", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tanuki.pl": { + "checkType": "message", + "absenceStrs": [ + "Nie ma takiego użytkownika" + ], + "presenseStrs": [ + "Dołączył" + ], + "url": "https://tanuki.pl/profil/{username}", + "usernameClaimed": "ania", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Taskrabbit": { + "checkType": "message", + "absenceStrs": [ + "TaskRabbit: Same Day Handyman, Moving & Delivery Services" + ], + "presenseStrs": [ + "’s Profile" + ], + "url": "https://www.taskrabbit.com/profile/{username}/about", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TEENUS": { + "checkType": "message", + "presenseStrs": [ + "user-profile" + ], + "absenceStrs": [ + "Viimati lisatud" + ], + "urlMain": "http://www.teenus.info", + "url": "http://www.teenus.info/kasutaja/{username}", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "business", + "ee" + ], + "disabled": true + }, + "Teknik": { + "checkType": "message", + "absenceStrs": [ + "The user does not exist" + ], + "presenseStrs": [ + "Public Key" + ], + "url": "https://user.teknik.io/{username}", + "usernameClaimed": "bob", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tenor.com": { + "checkType": "message", + "regexCheck": "^[A-Za-z0-9_]{2,32}$", + "absenceStrs": [ + "404 Error" + ], + "presenseStrs": [ + "s GIFs on Tenor" + ], + "url": "https://tenor.com/users/{username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tetr.io": { + "checkType": "message", + "absenceStrs": [ + "No such user!" + ], + "presenseStrs": [ + "success\":true" + ], + "url": "https://ch.tetr.io/api/users/{username}", + "usernameClaimed": "osk", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tf2Items": { + "checkType": "message", + "absenceStrs": [ + "TF2 Backpack Examiner" + ], + "presenseStrs": [ + "TF2 Backpack -" + ], + "url": "http://www.tf2items.com/id/{username}/", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tfl.net.pl": { + "checkType": "message", + "absenceStrs": [ + "The page you are looking for isn't here." + ], + "presenseStrs": [ + "@tfl.net.pl" + ], + "url": "https://tfl.net.pl/@{username}", + "usernameClaimed": "manies", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Thegatewaypundit": { + "checkType": "message", + "absenceStrs": [ + "Oops! That page can’t be found." + ], + "presenseStrs": [ + "avatar avatar-50 photo" + ], + "url": "https://www.thegatewaypundit.com/author/{username}/", + "usernameClaimed": "patti", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Thetattooforum": { + "checkType": "message", + "absenceStrs": [ + "We’re sorry" + ], + "presenseStrs": [ + "Insert This Gallery" + ], + "url": "https://www.thetattooforum.com/members/{username}/", + "usernameClaimed": "mixdop", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tldrlegal.com": { + "checkType": "message", + "regexCheck": "^[a-zA-Z0-9]{3,20}$", + "absenceStrs": [ + "Page Not Found - TLDRLegal" + ], + "presenseStrs": [ + "s Profile - TLDRLegal" + ], + "url": "https://tldrlegal.com/users/{username}/", + "usernameClaimed": "kevin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Talks.by": { + "disabled": true, + "tags": [ + "by", + "forum" + ], + "engine": "vBulletin", + "urlMain": "https://talks.by", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Terminator": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://terminator-scc.net.ru", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Thedaftclub": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "urlMain": "https://www.thedaftclub.com", + "url": "https://www.thedaftclub.com/forum/member.php/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Thephysicsforum": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "This user has not registered and therefore does not have a profile to view." + ], + "urlMain": "https://www.thephysicsforum.com", + "url": "https://www.thephysicsforum.com/members/{username}.html", + "usernameClaimed": "andrewc", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "TikTok Online Viewer": { + "disabled": true, + "errors": { + "Website unavailable": "Site error", + "is currently offline": "Site error" + }, + "checkType": "message", + "presenseStrs": [ + "tt-avatar\" src=\"https" + ], + "absenceStrs": [ + "tt-avatar\" src=\"\"" + ], + "source": "TikTok", + "urlMain": "https://ttonlineviewer.com", + "url": "https://ttonlineviewer.com/user/{username}", + "usernameClaimed": "rednec", + "usernameUnclaimed": "noonewouldeverusethis77777" + }, + "Tkgr": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "http://tkgr.ru/", + "url": "http://tkgr.ru/forum/member/{username}", + "usernameClaimed": "siber", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Torrent-soft": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://torrent-soft.net", + "url": "https://torrent-soft.net/user/{username}/", + "usernameClaimed": "Baguvix", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TotalStavki": { + "disabled": true, + "ignore403": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "urlMain": "https://totalstavki.ru", + "url": "https://totalstavki.ru/forum/members/?username={username}", + "usernameClaimed": "turbo", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Anilist": { + "disabled": true, + "checkType": "message", + "absenceStrs": [ + "/img/404/" + ], + "presenseStrs": [ + "/user/uehkon/animelist" + ], + "url": "https://anilist.co/user/{username}", + "usernameClaimed": "uehkon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TrackmaniaLadder": { + "disabled": true, + "tags": [ + "au" + ], + "checkType": "message", + "absenceStrs": [ + "player unknown or invalid" + ], + "urlMain": "http://en.tm-ladder.com/index.php", + "url": "http://en.tm-ladder.com/{username}_rech.php", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis" + }, + "Traktrain": { + "checkType": "status_code", + "url": "https://traktrain.com/{username}", + "usernameClaimed": "traktrain", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Travis": { + "tags": [ + "forum" + ], + "engine": "Discourse", + "urlMain": "https://travis-ci.community", + "usernameClaimed": "montana", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "TruckersMP.ru": { + "tags": [ + "gaming", + "ru" + ], + "checkType": "status_code", + "urlMain": "https://truckersmp.ru", + "url": "https://truckersmp.ru/{username}", + "usernameClaimed": "RamanBY", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Tunefind": { + "checkType": "message", + "absenceStrs": [ + "Page not found" + ], + "presenseStrs": [ + "Achievements" + ], + "url": "https://www.tunefind.com/user/profile/{username}", + "usernameClaimed": "baywolfmusic", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Twitcasting": { + "checkType": "message", + "absenceStrs": [ + "Not Found" + ], + "presenseStrs": [ + "Live History" + ], + "url": "https://twitcasting.tv/{username}", + "usernameClaimed": "2_t0_", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Twpro.jp": { + "checkType": "message", + "absenceStrs": [ + "をご確認ください。" + ], + "presenseStrs": [ + "おとなりさん" + ], + "url": "https://twpro.jp/{username}", + "usernameClaimed": "wsise47", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ultrasdiary.pl": { + "checkType": "message", + "absenceStrs": [ + "<title>UltrasDiary – Pamiętnik Kibica" + ], + "presenseStrs": [ + "Mecze wyjazdowe:" + ], + "url": "https://ultrasdiary.pl/u/{username}/", + "usernameClaimed": "janek", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ulub.pl": { + "checkType": "message", + "absenceStrs": [ + "Strona nie istnieje." + ], + "presenseStrs": [ + "Muzyka (" + ], + "url": "http://ulub.pl/profil/{username}", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Usa.life": { + "checkType": "message", + "absenceStrs": [ + "Sorry, page not found" + ], + "presenseStrs": [ + "Please log in to like, share and comment" + ], + "url": "https://usa.life/{username}", + "usernameClaimed": "not1face", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Uwr1": { + "tags": [ + "de" + ], + "checkType": "status_code", + "urlMain": "http://uwr1.de", + "url": "http://uwr1.de/forum/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Viddler": { + "checkType": "message", + "absenceStrs": [ + "User not found" + ], + "presenseStrs": [ + "profile-details" + ], + "url": "https://www.viddler.com/channel/{username}/", + "usernameClaimed": "planphilly", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Vine": { + "checkType": "message", + "absenceStrs": [ + "That record does not exist" + ], + "presenseStrs": [ + "userId" + ], + "url": "https://vine.co/api/users/profiles/vanity/{username}", + "usernameClaimed": "Seks", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Vizjer.pl": { + "checkType": "message", + "absenceStrs": [ + "Ostatnie komentarze" + ], + "presenseStrs": [ + "Profil użytkownika" + ], + "url": "https://vizjer.pl/uzytkownik/{username}", + "usernameClaimed": "janek", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VKFaces": { + "tags": [ + "ru" + ], + "disabled": true, + "checkType": "status_code", + "urlMain": "https://vkfaces.com", + "url": "https://vkfaces.com/vk/user/{username}", + "source": "VK", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis777" + }, + "Voice123": { + "checkType": "message", + "absenceStrs": [ + ">[]" + ], + "presenseStrs": [ + "user_id" + ], + "url": "https://voice123.com/api/providers/search/{username}", + "usernameClaimed": "maheshsaha1992", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Vamber": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://vamber.ru", + "url": "https://vamber.ru/author/{username}/", + "usernameClaimed": "irina", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "VirtualIreland": { + "tags": [ + "forum", + "ie", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://www.virtualireland.ru", + "usernameClaimed": "Lee", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Vlmi": { + "tags": [ + "forum", + "ru", + "ua" + ], + "engine": "XenForo", + "urlMain": "https://vlmi.biz", + "usernameClaimed": "mixa", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Warhammergames": { + "disabled": true, + "tags": [ + "ru", + "ua" + ], + "engine": "uCoz", + "urlMain": "https://warhammergames.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Watchmemore.com": { + "checkType": "message", + "absenceStrs": [ + "notExists" + ], + "presenseStrs": [ + "displayName" + ], + "url": "https://api.watchmemore.com/api3/profile/{username}/", + "usernameClaimed": "medroxy", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Wego.social": { + "checkType": "message", + "absenceStrs": [ + "Sorry, page not found!" + ], + "presenseStrs": [ + "Following" + ], + "url": "https://wego.social/{username}", + "usernameClaimed": "Lisa_M_S", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Whyislam": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "https://www.whyislam.to", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "WicgForum": { + "checkType": "message", + "regexCheck": "^(?![.-])[a-zA-Z0-9_.-]{3,20}$", + "absenceStrs": [ + "WICG" + ], + "presenseStrs": [ + " Profile -" + ], + "url": "https://discourse.wicg.io/u/{username}/summary", + "usernameClaimed": "stefano", + "usernameUnclaimed": "noonewouldusethis7" + }, + "Wiki.vg": { + "checkType": "status_code", + "url": "https://wiki.vg/User:{username}", + "usernameClaimed": "Auri", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "WimkinPublicProfile": { + "checkType": "message", + "absenceStrs": [ + " The page you are looking for cannot be found." + ], + "presenseStrs": [ + "is on WIMKIN" + ], + "url": "https://wimkin.com/{username}", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldusethis7" + }, + "Wittyprofiles": { + "checkType": "message", + "absenceStrs": [ + "404 - Something is missing!" + ], + "urlMain": "http://www.wittyprofiles.com/", + "url": "http://www.wittyprofiles.com/author/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "protection": [ + "cf_js_challenge" + ] + }, + "WolniSlowianie": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleziono strony, której szukasz." + ], + "presenseStrs": [ + "Oś czasu" + ], + "url": "https://wolnislowianie.pl/{username}", + "usernameClaimed": "janek", + "usernameUnclaimed": "noonewouldusethis7" + }, + "Wordnik": { + "checkType": "message", + "absenceStrs": [ + "Wordnik: Page Not Found" + ], + "presenseStrs": [ + "Welcome," + ], + "url": "https://www.wordnik.com/users/{username}", + "usernameClaimed": "elle", + "usernameUnclaimed": "noonewouldusethis7" + }, + "WordpressSupport": { + "checkType": "message", + "absenceStrs": [ + "User not found" + ], + "presenseStrs": [ + "s Profile | WordPress.org" + ], + "url": "https://wordpress.org/support/users/{username}/", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldusethis7" + }, + "WorlfOfTanksForum": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован" + ], + "urlMain": "https://forum.wotanks.com", + "url": "https://forum.wotanks.com/member.php/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Wot-game": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://wot-game.com", + "url": "https://wot-game.com/user/{username}/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Wuz": { + "disabled": true, + "ignore403": true, + "tags": [ + "by", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Указанный пользователь не найден" + ], + "urlMain": "http://wuz.by", + "url": "http://wuz.by/forum/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Xanga": { + "checkType": "message", + "absenceStrs": [ + "Xanga 2.0 is Here!" + ], + "presenseStrs": [ + "s Xanga Site | Just" + ], + "url": "https://{username}.xanga.com/", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldusethis7" + }, + "XvideosModels": { + "checkType": "message", + "absenceStrs": [ + "THIS PROFILE DOESN'T EXIST" + ], + "presenseStrs": [ + "Total video views" + ], + "url": "https://www.xvideos.com/models/{username}", + "usernameClaimed": "tiffany-tyler", + "usernameUnclaimed": "noonewouldusethis7" + }, + "Ya-uchitel": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "https://ya-uchitel.ru/", + "usernameClaimed": "Vesna", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Yalta-info": { + "disabled": true, + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://www.yalta-info.net", + "url": "http://www.yalta-info.net/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "%D0%96%D1%83%D0%BA%D0%BE%D0%B2", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Yapisal": { + "tags": [ + "forum", + "tr" + ], + "checkType": "message", + "absenceStrs": [ + "\"error_type\":\"not_found\"" + ], + "presenseStrs": [ + "\"user\":{\"id\":" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0" + }, + "urlProbe": "{urlMain}/u/{username}.json", + "urlMain": "https://forum.yapisal.net", + "url": "{urlMain}/u/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "Yazbel": { + "tags": [ + "forum" + ], + "checkType": "status_code", + "url": "https://forum.yazbel.com/u/{username}/summary", + "usernameClaimed": "abdullah189", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Zapravdu": { + "tags": [ + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "http://zapravdu.ru/", + "url": "http://zapravdu.ru/forum/search.php?author={username}", + "usernameClaimed": "ccsr", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Zatrybi.pl": { + "checkType": "message", + "absenceStrs": [ + "Nie znaleziono strony" + ], + "presenseStrs": [ + "Zarejestrowany od:" + ], + "url": "https://zatrybi.pl/user/{username}", + "usernameClaimed": "fenrek", + "usernameUnclaimed": "noonewouldusethis7" + }, + "Zbiornik.com": { + "checkType": "message", + "absenceStrs": [ + "Szukaj" + ], + "presenseStrs": [ + "INFO" + ], + "url": "https://mini.zbiornik.com/{username}", + "usernameClaimed": "Soif", + "usernameUnclaimed": "noonewouldusethis7" + }, + "Zenitbol": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://zenitbol.ru", + "usernameClaimed": "vera", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Zhyk": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://zhyk.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "Zmarsa.com": { + "checkType": "message", + "absenceStrs": [ + "Błąd na stronie" + ], + "presenseStrs": [ + "Galeria użytkownika" + ], + "url": "https://zmarsa.com/uzytkownik/{username}/glowna/", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldusethis7" + }, + "Zmey": { + "tags": [ + "forum", + "sport" + ], + "checkType": "response_url", + "urlMain": "https://zmey.ru", + "url": "https://zmey.ru/user/@{username}", + "usernameClaimed": "alec", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "aliensoup.com": { + "engine": "XenForo", + "urlMain": "https://aliensoup.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "amax-sb.ru": { + "engine": "uCoz", + "urlMain": "http://amax-sb.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "analitika-forex.ru": { + "engine": "uCoz", + "urlMain": "http://analitika-forex.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "autotob.ru": { + "engine": "uCoz", + "urlMain": "http://autotob.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "barnaul-forum.ru": { + "engine": "uCoz", + "urlMain": "http://barnaul-forum.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "biohack": { + "checkType": "status_code", + "urlMain": "https://forum.biohack.me", + "url": "https://forum.biohack.me/index.php?p=/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "bluesystem": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "images/avatars/default_avatars/22.gif" + ], + "urlMain": "http://forum.bluesystem.online", + "url": "http://forum.bluesystem.online/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "Tiffani", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "cigarpass.com": { + "tags": [ + "forum", + "ir" + ], + "engine": "XenForo", + "urlMain": "http://www.cigarpass.com/forum", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "club-fiat.org.ua": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "http://club-fiat.org.ua", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "cs-strikez.org": { + "tags": [ + "by", + "ru", + "ua" + ], + "engine": "uCoz", + "urlMain": "http://cs-strikez.org", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "devushka": { + "urlSubpath": "/forum", + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "https://devushka.ru/", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "diecastcrazy.com": { + "engine": "XenForo", + "urlMain": "http://diecastcrazy.com/", + "usernameClaimed": "texas3", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "auto", + "forum" + ] + }, + "dieselmastera.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://dieselmastera.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "diz-cs.ru": { + "engine": "uCoz", + "urlMain": "http://diz-cs.ru", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "dnbforum.com": { + "engine": "XenForo", + "urlMain": "http://dnbforum.com/", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "protection": [ + "cf_js_challenge" + ] + }, + "drawmixpaint": { + "checkType": "status_code", + "urlMain": "https://forum.drawmixpaint.com", + "url": "https://forum.drawmixpaint.com/profile/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "disabled": true + }, + "dvocu.ru": { + "engine": "uCoz", + "urlMain": "http://dvocu.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "easyen": { + "tags": [ + "ru" + ], + "presenseStrs": [ + "prof_12w_pr" + ], + "engine": "uCoz", + "urlMain": "https://easyen.ru", + "usernameClaimed": "wd", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "egida.by": { + "tags": [ + "by" + ], + "engine": "uCoz", + "urlMain": "http://egida.by", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "elektrik-avto.ru": { + "engine": "uCoz", + "urlMain": "http://elektrik-avto.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "empires.su": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://empires.su", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "espero-club.ru": { + "engine": "uCoz", + "urlMain": "http://espero-club.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "excelworld.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://excelworld.ru", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "firesofheaven.org": { + "engine": "XenForo", + "urlMain": "https://www.firesofheaven.org", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "forum-b.ru": { + "disabled": true, + "tags": [ + "forum", + "freelance", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "По вашему запросу ничего не найдено." + ], + "urlMain": "https://forum-b.ru", + "url": "https://forum-b.ru/search.php?action=search&keywords=&author={username}", + "usernameClaimed": "pirat4761", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "foumds.universaldashboard.io": { + "engine": "Discourse", + "urlMain": "https://forums.universaldashboard.io/", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "tech" + ] + }, + "free-pass.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://free-pass.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "garminych": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Извините, такого пользователя не существует" + ], + "urlMain": "http://forum.garminych.ru/", + "url": "http://forum.garminych.ru/profile.php?mode=viewprofile&u={username}", + "usernameClaimed": "Corado", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "gitarizm": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "https://forum.gitarizm.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "hackings.ru": { + "engine": "uCoz", + "urlMain": "http://hackings.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "hogwarts.nz": { + "disabled": true, + "engine": "XenForo", + "urlMain": "https://hogwarts.nz/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "iPhoneForums.net": { + "checkType": "message", + "absenceStrs": [ + "The specified member cannot be found" + ], + "urlMain": "https://www.iphoneforums.net", + "url": "https://www.iphoneforums.net/members/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "tech" + ] + }, + "induste.com": { + "tags": [ + "forum", + "ma", + "re" + ], + "engine": "XenForo", + "urlMain": "https://induste.com/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "izmailonline.com": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "http://izmailonline.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "kali.org.ru": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://kali.org.ru", + "url": "https://kali.org.ru/profile/{username}", + "usernameClaimed": "Drozd", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "kiabongo.info": { + "engine": "uCoz", + "urlMain": "http://kiabongo.info", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "labpentestit": { + "tags": [ + "hacking", + "ru" + ], + "checkType": "response_url", + "urlMain": "https://lab.pentestit.ru/", + "url": "https://lab.pentestit.ru/profile/{username}", + "errorUrl": "https://lab.pentestit.ru/{username}", + "usernameClaimed": "CSV", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "linuxmint.info": { + "tags": [ + "ru" + ], + "disabled": true, + "checkType": "status_code", + "urlMain": "http://linuxmint.info", + "url": "http://linuxmint.info/users/{username}", + "usernameClaimed": "freesoid", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "lithotherapy": { + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Подходящих тем или сообщений не найдено." + ], + "urlMain": "https://forum.lithotherapy.ru", + "url": "https://forum.lithotherapy.ru/search.php?keywords=&terms=all&author={username}", + "usernameClaimed": "solomon", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "markweinguitarlessons.com": { + "engine": "XenForo", + "urlMain": "http://markweinguitarlessons.com/forums/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "hobby" + ] + }, + "medteh.info": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://medteh.info", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "milliarderr.com": { + "engine": "uCoz", + "urlMain": "http://milliarderr.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mkr-rodniki.ru": { + "engine": "uCoz", + "urlMain": "http://mkr-rodniki.ru", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "modnaya": { + "tags": [ + "forum", + "ru", + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "urlMain": "https://forum.modnaya.org/", + "url": "https://forum.modnaya.org/members/{username}.html", + "usernameClaimed": "werta", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "moscherb.ru": { + "engine": "uCoz", + "urlMain": "http://moscherb.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "moto-travels.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://moto-travels.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "motoomsk.ru": { + "engine": "uCoz", + "urlMain": "http://motoomsk.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "naruto-base.tv": { + "engine": "uCoz", + "urlMain": "http://naruto-base.tv", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "narutoclan.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://narutoclan.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "medicine" + ] + }, + "news.toretsk.online": { + "engine": "uCoz", + "urlMain": "http://news.toretsk.online", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "ru" + ] + }, + "nf-club.ru": { + "engine": "uCoz", + "urlMain": "http://nf-club.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "odonvv.ru": { + "engine": "uCoz", + "urlMain": "http://odonvv.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "old.rubezhnoe.com": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "http://old.rubezhnoe.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ozcardtrader.com.au": { + "engine": "XenForo", + "urlMain": "http://www.ozcardtrader.com.au/community/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "au", + "forum", + "sport" + ] + }, + "p8ntballer-forums.com": { + "engine": "XenForo", + "urlMain": "http://p8ntballer-forums.com/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "panzer35.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://panzer35.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "playtime": { + "tags": [ + "de", + "forum", + "gaming" + ], + "checkType": "message", + "absenceStrs": [ + "<title>Euer Online Casino Forum Deutschland - PlaytimeNetwork" + ], + "urlMain": "https://forum.playtime-forum.info", + "url": "https://forum.playtime-forum.info/members/?username={username}", + "usernameClaimed": "Glumbi", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "privateinvestor2000.com": { + "engine": "uCoz", + "urlMain": "http://privateinvestor2000.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "prizyvnikmoy.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://prizyvnikmoy.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "pvpru": { + "disabled": true, + "tags": [ + "gaming", + "ru" + ], + "errors": { + "Access denied": "Cloudflare security protection detected" + }, + "checkType": "status_code", + "urlMain": "https://pvpru.com/", + "url": "https://pvpru.com/board/member.php?username={username}&tab=aboutme#aboutme", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "python.su": { + "tags": [ + "ru" + ], + "checkType": "status_code", + "urlMain": "https://python.su/", + "url": "https://python.su/forum/user/{username}", + "usernameClaimed": "AlexaPan", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "qiwi.me": { + "disabled": true, + "tags": [ + "finance", + "fintech", + "ru" + ], + "urlProbe": "https://api.qiwi.me/piggybox/{username}", + "checkType": "message", + "absenceStrs": [ + "no piggybox found", + "invalid alias" + ], + "urlMain": "https://qiwi.me", + "url": "https://qiwi.me/{username}", + "usernameClaimed": "videokursy", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "quik": { + "tags": [ + "forum", + "ru" + ], + "checkType": "status_code", + "urlMain": "https://forum.quik.ru", + "url": "https://forum.quik.ru/user/{username}/", + "usernameClaimed": "swerg", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "realitygaming.fr": { + "engine": "XenForo", + "urlMain": "http://realitygaming.fr/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "fr" + ] + }, + "relasko.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://relasko.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "reverse4you": { + "tags": [ + "forum", + "lk", + "ru", + "ua" + ], + "engine": "Discourse", + "urlMain": "https://forum.reverse4you.org", + "usernameClaimed": "darwin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ruboard": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь не зарегистрирован и не имеет профиля для просмотра." + ], + "urlMain": "https://forum.ruboard.ru", + "url": "https://forum.ruboard.ru/member.php/?username={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "russiinitalia.com": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://russiinitalia.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "samp-rus.com": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "http://samp-rus.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "samp-sektor.ru": { + "engine": "uCoz", + "urlMain": "http://samp-sektor.ru", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sciax2.it": { + "tags": [ + "forum", + "tr" + ], + "engine": "XenForo", + "urlMain": "https://www.sciax2.it/forum/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "scuba": { + "tags": [ + "forum", + "ru" + ], + "engine": "phpBB", + "urlMain": "http://forum.scuba-divers.ru/", + "usernameClaimed": "bubonic", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "secret.kompas3d.su": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://secret.kompas3d.su", + "usernameClaimed": "irina", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "soldati-russian.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://soldati-russian.ru", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "somersoft.com": { + "engine": "XenForo", + "urlMain": "https://www.somersoft.com/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "soslujivzi.ru": { + "engine": "uCoz", + "urlMain": "http://soslujivzi.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sourceruns": { + "engine": "DiscourseJson", + "tags": [ + "forum" + ], + "urlMain": "https://forums.sourceruns.org/", + "usernameClaimed": "cubedude", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sovgavan.ru": { + "engine": "uCoz", + "urlMain": "http://sovgavan.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "ru" + ] + }, + "Orbys": { + "checkType": "message", + "presenseStrs": [ + "profile_user_image" + ], + "absenceStrs": [ + "The page you are looking for cannot be found." + ], + "urlMain": "https://orbys.net", + "url": "https://orbys.net/{username}", + "usernameClaimed": "txmustang302", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sportsjournalists.com": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "http://sportsjournalists.com/forum/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "studentur.com.ua": { + "tags": [ + "ua" + ], + "engine": "uCoz", + "urlMain": "http://studentur.com.ua", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "svidbook": { + "disabled": true, + "checkType": "status_code", + "urlMain": "https://www.svidbook.ru/", + "url": "https://www.svidbook.ru/user/{username}", + "usernameClaimed": "green", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "swiftbook": { + "tags": [ + "forum", + "ru" + ], + "engine": "Discourse", + "urlMain": "https://forum.swiftbook.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "thaicat.ru": { + "engine": "uCoz", + "urlMain": "http://thaicat.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "theburningprocess.com": { + "engine": "XenForo", + "urlMain": "http://www.theburningprocess.com/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "disabled": true + }, + "theprodigy": { + "tags": [ + "forum", + "ru", + "ua" + ], + "checkType": "message", + "absenceStrs": [ + "Пользователь, чей профиль вы пытаетесь посмотреть, не существует." + ], + "urlMain": "https://forum.theprodigy.ru/", + "url": "https://forum.theprodigy.ru/index.php?board=13&action=viewprofile&user={username}", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "theturboforums.com": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://www.theturboforums.com/forums/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "tracr.co": { + "disabled": true, + "tags": [ + "gaming" + ], + "errors": { + "502 - Bad Gateway": "Site error", + "g-recaptcha": "Captcha detected" + }, + "regexCheck": "^[A-Za-z0-9]{2,32}$", + "checkType": "message", + "absenceStrs": [ + "No search results" + ], + "urlMain": "https://tracr.co/", + "url": "https://tracr.co/users/1/{username}", + "source": "Discord", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "transit-club.com": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://transit-club.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "uaodessa.com": { + "engine": "uCoz", + "urlMain": "http://uaodessa.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "ucozon.ru": { + "engine": "uCoz", + "urlMain": "http://ucozon.ru", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "usman48.ru": { + "disabled": true, + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://usman48.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "vento-club.com": { + "engine": "uCoz", + "urlMain": "http://vento-club.com", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "vilinburg.net": { + "engine": "uCoz", + "urlMain": "http://vilinburg.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "watcheshop": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "vBulletin", + "urlMain": "http://forum.watcheshop.ru", + "usernameClaimed": "211", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "x-h2o.com": { + "engine": "XenForo", + "urlMain": "http://www.x-h2o.com/", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "z28.com": { + "engine": "XenForo", + "urlMain": "https://www.z28.com/", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "Znanylekarz.pl": { + "checkType": "status_code", + "url": "https://www.znanylekarz.pl/{username}", + "usernameClaimed": "janusz-nowak", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "horek-samara.ru": { + "engine": "uCoz", + "urlMain": "http://horek-samara.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "animal-hope.ru": { + "engine": "uCoz", + "urlMain": "http://animal-hope.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "staffbull.info": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://staffbull.info", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "alisaclub.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://alisaclub.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "endoctor.ru": { + "engine": "uCoz", + "urlMain": "http://endoctor.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "n-ataeva.ru": { + "engine": "uCoz", + "urlMain": "http://n-ataeva.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "uroportal.com.ua": { + "engine": "uCoz", + "urlMain": "http://uroportal.com.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "forum.u-hiv.ru": { + "engine": "uCoz", + "urlMain": "http://forum.u-hiv.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "forum", + "medicine", + "ru" + ] + }, + "dr-denisov.ru": { + "engine": "uCoz", + "urlMain": "http://dr-denisov.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "electronic-cigarette.ru": { + "engine": "uCoz", + "urlMain": "http://electronic-cigarette.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "help-baby.org": { + "engine": "uCoz", + "urlMain": "http://help-baby.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "psy-dv.org": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://psy-dv.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "psy-music.ru": { + "tags": [ + "fi", + "ru" + ], + "engine": "uCoz", + "urlMain": "http://psy-music.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "ford-mondeoff.ru": { + "engine": "uCoz", + "urlMain": "http://ford-mondeoff.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "auto63.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://auto63.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "wedding-image.ru": { + "engine": "uCoz", + "urlMain": "http://wedding-image.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "cod.by": { + "engine": "uCoz", + "urlMain": "http://cod.by", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "klub-skidok.ru": { + "engine": "uCoz", + "urlMain": "http://klub-skidok.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "pubert.company": { + "engine": "uCoz", + "urlMain": "http://pubert.company", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "avon-registry.com.ua": { + "engine": "uCoz", + "urlMain": "http://avon-registry.com.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "disabled": true + }, + "doska.hashmalay.co.il": { + "engine": "uCoz", + "urlMain": "http://doska.hashmalay.co.il", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john", + "disabled": true + }, + "hitechnic.org": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://hitechnic.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "gallasy.com": { + "engine": "uCoz", + "urlMain": "http://gallasy.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "satwarez.ru": { + "engine": "uCoz", + "urlMain": "http://satwarez.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "aquamen.ru": { + "engine": "uCoz", + "urlMain": "http://aquamen.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "kam-mamochka.ru": { + "engine": "uCoz", + "urlMain": "http://kam-mamochka.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "fordating.ru": { + "engine": "uCoz", + "urlMain": "http://fordating.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "forum", + "ru" + ] + }, + "goba6372.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://goba6372.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "student-telecom.ru": { + "engine": "uCoz", + "urlMain": "http://student-telecom.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "kliki-doma.ru": { + "engine": "uCoz", + "urlMain": "http://kliki-doma.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "god" + }, + "magictarot.ru": { + "engine": "uCoz", + "urlMain": "http://magictarot.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "avtoexamen.com": { + "engine": "uCoz", + "urlMain": "http://avtoexamen.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "sms.portalsms.ru": { + "engine": "uCoz", + "urlMain": "http://sms.portalsms.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "kiev-live.com": { + "engine": "uCoz", + "urlMain": "http://kiev-live.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "svadba-orel.com": { + "engine": "uCoz", + "urlMain": "http://svadba-orel.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "nojay-urt.ru": { + "engine": "uCoz", + "urlMain": "http://nojay-urt.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "virtualrift.ru": { + "engine": "uCoz", + "urlMain": "http://virtualrift.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "vfarte.ru": { + "engine": "uCoz", + "urlMain": "http://vfarte.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "uralstanko.ru": { + "engine": "uCoz", + "urlMain": "http://uralstanko.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "kotel-torg.ru": { + "engine": "uCoz", + "urlMain": "http://kotel-torg.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "4948.ru": { + "engine": "uCoz", + "urlMain": "http://4948.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red" + }, + "xn--90anbhklk.xn--p1ai": { + "engine": "uCoz", + "urlMain": "http://xn--90anbhklk.xn--p1ai", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "disabled": true + }, + "risefilm.ru": { + "tags": [ + "movies", + "ru" + ], + "engine": "uCoz", + "urlMain": "http://risefilm.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "disabled": true + }, + "tavr-obrazovanie.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://tavr-obrazovanie.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "timich.ru": { + "engine": "uCoz", + "urlMain": "http://timich.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "englishinfo.ru": { + "engine": "uCoz", + "urlMain": "http://englishinfo.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "vl-dimir.ru": { + "engine": "uCoz", + "urlMain": "http://vl-dimir.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "aleks2.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://aleks2.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "upbyte.net": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://upbyte.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "mamasuper.ru": { + "engine": "uCoz", + "urlMain": "http://mamasuper.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "tags": [ + "ru" + ] + }, + "artmilitaire.ru": { + "engine": "uCoz", + "urlMain": "http://artmilitaire.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "pticevodov.ru": { + "engine": "uCoz", + "urlMain": "http://pticevodov.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "disabled": true + }, + "toys22.ru": { + "engine": "uCoz", + "urlMain": "http://toys22.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red" + }, + "sharzh-portret.ru": { + "engine": "uCoz", + "urlMain": "http://sharzh-portret.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "specchiasol.ru": { + "engine": "uCoz", + "urlMain": "http://specchiasol.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "led-vector.ru": { + "engine": "uCoz", + "urlMain": "http://led-vector.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "shansonportal.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://shansonportal.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "medvestnic.ru": { + "engine": "uCoz", + "urlMain": "http://medvestnic.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "3glaz.org": { + "engine": "uCoz", + "urlMain": "http://3glaz.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "forum", + "ru" + ] + }, + "kadroviku.ru": { + "engine": "uCoz", + "urlMain": "http://kadroviku.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "iberia-pw.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://iberia-pw.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "moneysfirst.ru": { + "engine": "uCoz", + "urlMain": "http://moneysfirst.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "kinomir.org": { + "engine": "uCoz", + "urlMain": "http://kinomir.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "disabled": true + }, + "spishu.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://spishu.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "psychotype.info": { + "engine": "uCoz", + "urlMain": "http://psychotype.info", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "teplohorosho.ru": { + "engine": "uCoz", + "urlMain": "http://teplohorosho.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "memory.lol": { + "tags": [ + "messaging" + ], + "regexCheck": "^[a-zA-Z0-9_]{1,15}$", + "checkType": "message", + "absenceStrs": [ + "{\"accounts\":[]}" + ], + "presenseStrs": [ + "{\"accounts\":[{" + ], + "source": "Twitter", + "urlMain": "https://memory.lol", + "url": "https://api.memory.lol/v1/tw/{username}", + "usernameClaimed": "libsoftiktok", + "usernameUnclaimed": "noonewould123" + }, + "xn--90aybfeg.xn--p1ai": { + "engine": "uCoz", + "urlMain": "http://xn--90aybfeg.xn--p1ai", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "kazamuza.net": { + "tags": [ + "kz" + ], + "engine": "uCoz", + "urlMain": "http://kazamuza.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "rodobozhie.ru": { + "engine": "uCoz", + "urlMain": "http://rodobozhie.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "mox.vo.uz": { + "engine": "uCoz", + "urlMain": "http://mox.vo.uz", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "rasskazovskie.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://rasskazovskie.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "162nord.org": { + "engine": "uCoz", + "urlMain": "http://162nord.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "counter-art.ru": { + "engine": "uCoz", + "urlMain": "http://counter-art.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "bce-tyt.ru": { + "engine": "uCoz", + "urlMain": "http://bce-tyt.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "shipsondesk.info": { + "engine": "uCoz", + "urlMain": "http://shipsondesk.info", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "vrn-sms.ru": { + "engine": "uCoz", + "urlMain": "http://vrn-sms.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "metod-psv.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://metod-psv.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "sefirut.ru": { + "engine": "uCoz", + "urlMain": "http://sefirut.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "vseotkritki.ru": { + "engine": "uCoz", + "urlMain": "http://vseotkritki.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "disabled": true + }, + "ercevo.ru": { + "engine": "uCoz", + "urlMain": "http://ercevo.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "abho.ru": { + "engine": "uCoz", + "urlMain": "http://abho.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "l2bz.ru": { + "engine": "uCoz", + "urlMain": "http://l2bz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "sstalkers.ru": { + "engine": "uCoz", + "urlMain": "http://sstalkers.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "lavkachudec.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://lavkachudec.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "krasnovodsk.net": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://krasnovodsk.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "provincialynews.ru": { + "engine": "uCoz", + "urlMain": "http://provincialynews.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "gym5.net": { + "engine": "uCoz", + "urlMain": "http://gym5.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "xn----7sbb0bfjrbhdi.xn--p1ai": { + "engine": "uCoz", + "urlMain": "http://xn----7sbb0bfjrbhdi.xn--p1ai", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "jek-auto.ru": { + "engine": "uCoz", + "urlMain": "http://jek-auto.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "1001facts.ru": { + "engine": "uCoz", + "urlMain": "http://1001facts.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "xn----7sbfejdvocrv7adem.xn--p1ai": { + "engine": "uCoz", + "urlMain": "http://xn----7sbfejdvocrv7adem.xn--p1ai", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "disabled": true + }, + "religionlaw.ru": { + "engine": "uCoz", + "urlMain": "http://religionlaw.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "chelny-diplom.ru": { + "engine": "uCoz", + "urlMain": "http://chelny-diplom.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "likerr.ru": { + "engine": "uCoz", + "urlMain": "http://likerr.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "disabled": true + }, + "pozdrawlandiya.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://pozdrawlandiya.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "aktualno.lv": { + "engine": "uCoz", + "urlMain": "http://aktualno.lv", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red" + }, + "megabravo.tk": { + "engine": "uCoz", + "urlMain": "http://megabravo.tk", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "disabled": true + }, + "once-upon-a-time-tv.ru": { + "engine": "uCoz", + "urlMain": "http://once-upon-a-time-tv.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "dreddmc.ru": { + "engine": "uCoz", + "urlMain": "http://dreddmc.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "okm.org.ru": { + "engine": "uCoz", + "urlMain": "http://okm.org.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "demon-art.ru": { + "engine": "uCoz", + "urlMain": "http://demon-art.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "all-gta.info": { + "engine": "uCoz", + "urlMain": "http://all-gta.info", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "bestclips.ws": { + "engine": "uCoz", + "urlMain": "http://bestclips.ws", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "lemfo-russia.ru": { + "engine": "uCoz", + "urlMain": "http://lemfo-russia.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "laserwar48.ru": { + "engine": "uCoz", + "urlMain": "http://laserwar48.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "japanesedolls.ru": { + "engine": "uCoz", + "urlMain": "http://japanesedolls.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "israelrent.info": { + "engine": "uCoz", + "urlMain": "http://israelrent.info", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "grand-magic.ru": { + "engine": "uCoz", + "urlMain": "http://grand-magic.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "darkart3d.ru": { + "engine": "uCoz", + "urlMain": "http://darkart3d.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "wm-maximum.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://wm-maximum.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ukrelektrik.com": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://ukrelektrik.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "mark.szenprogs.ru": { + "engine": "uCoz", + "urlMain": "http://mark.szenprogs.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "parusa-magellana.ru": { + "engine": "uCoz", + "urlMain": "http://parusa-magellana.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red" + }, + "zerkalastekla.ru": { + "engine": "uCoz", + "urlMain": "http://zerkalastekla.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "skorozamuj.com": { + "engine": "uCoz", + "urlMain": "http://skorozamuj.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "kino-horror.ru": { + "tags": [ + "ru", + "ua" + ], + "engine": "uCoz", + "urlMain": "http://kino-horror.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "disabled": true + }, + "centr-spektr.ru": { + "engine": "uCoz", + "urlMain": "http://centr-spektr.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "ofc65.ru": { + "engine": "uCoz", + "urlMain": "http://ofc65.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "v3de.ru": { + "engine": "uCoz", + "urlMain": "http://v3de.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "xn--80aqkf5cb.xn--p1ai": { + "engine": "uCoz", + "urlMain": "http://xn--80aqkf5cb.xn--p1ai", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "oldones.org": { + "engine": "uCoz", + "urlMain": "http://oldones.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "kashanya.com": { + "engine": "uCoz", + "urlMain": "http://kashanya.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "southparkz.net": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://southparkz.net", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "vivasan.mobi": { + "engine": "uCoz", + "urlMain": "http://vivasan.mobi", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "budo52.ru": { + "engine": "uCoz", + "urlMain": "http://budo52.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru", + "sport" + ] + }, + "iceberg-116.ru": { + "engine": "uCoz", + "urlMain": "http://iceberg-116.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "android-gameworld.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://android-gameworld.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "mastersoap.ru": { + "engine": "uCoz", + "urlMain": "http://mastersoap.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "club-gas.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://club-gas.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "podolog.su": { + "engine": "uCoz", + "urlMain": "http://podolog.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "dreamteam43.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://dreamteam43.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "liozno.info": { + "engine": "uCoz", + "urlMain": "http://liozno.info", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "razvilnoe.ru": { + "engine": "uCoz", + "urlMain": "http://razvilnoe.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "rcprim.ru": { + "engine": "uCoz", + "urlMain": "http://rcprim.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "domfrunze.kg": { + "engine": "uCoz", + "urlMain": "http://domfrunze.kg", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "santeh-sinfo.ru": { + "engine": "uCoz", + "urlMain": "http://santeh-sinfo.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "xristos.vo.uz": { + "engine": "uCoz", + "urlMain": "http://xristos.vo.uz", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "si-sv.com": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://si-sv.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "ohypnose.ru": { + "engine": "uCoz", + "urlMain": "http://ohypnose.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "disabled": true + }, + "musicbunker.ru": { + "engine": "uCoz", + "urlMain": "http://musicbunker.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "edumonch.ru": { + "engine": "uCoz", + "urlMain": "http://edumonch.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ksmsp.ru": { + "engine": "uCoz", + "urlMain": "http://ksmsp.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "tags": [ + "ru" + ] + }, + "worldofdragonage.ru": { + "engine": "uCoz", + "urlMain": "http://worldofdragonage.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red" + }, + "zapravkaavto.ru": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://zapravkaavto.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "talimger.org": { + "tags": [ + "kz" + ], + "engine": "uCoz", + "urlMain": "http://talimger.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "fanacmilan.com": { + "engine": "uCoz", + "urlMain": "http://fanacmilan.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red", + "disabled": true + }, + "allmobile.vo.uz": { + "engine": "uCoz", + "urlMain": "http://allmobile.vo.uz", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "gorposmos.ru": { + "engine": "uCoz", + "urlMain": "http://gorposmos.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "css-play4fun.ru": { + "engine": "uCoz", + "urlMain": "http://css-play4fun.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "kaiserslautern.su": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://kaiserslautern.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "7x.net.ua": { + "engine": "uCoz", + "urlMain": "http://7x.net.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "salutm.ru": { + "engine": "uCoz", + "urlMain": "http://salutm.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "spectrum-z.ru": { + "engine": "uCoz", + "urlMain": "http://spectrum-z.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "disabled": true + }, + "zdesvsyo.com": { + "engine": "uCoz", + "urlMain": "http://zdesvsyo.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "tags": [ + "ru" + ] + }, + "ladpremiya.ru": { + "engine": "uCoz", + "urlMain": "http://ladpremiya.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "kaz.ionyk.ru": { + "engine": "uCoz", + "urlMain": "http://kaz.ionyk.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "electronic-component.org": { + "engine": "uCoz", + "urlMain": "http://electronic-component.org", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "xn--80aepdb4ag.xn--p1ai": { + "engine": "uCoz", + "urlMain": "http://xn--80aepdb4ag.xn--p1ai", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "personagra-ta.ru": { + "engine": "uCoz", + "urlMain": "http://personagra-ta.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "thelike.ru": { + "engine": "uCoz", + "urlMain": "http://thelike.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "show.co.ua": { + "engine": "uCoz", + "urlMain": "http://show.co.ua", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin", + "disabled": true + }, + "irteam.ru": { + "engine": "uCoz", + "urlMain": "http://irteam.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "spaceserials.ru": { + "engine": "uCoz", + "urlMain": "http://spaceserials.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "profsouz-au.ru": { + "engine": "uCoz", + "urlMain": "http://profsouz-au.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "vkusnyashkino.ru": { + "engine": "uCoz", + "urlMain": "http://vkusnyashkino.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "metrologika.ru": { + "engine": "uCoz", + "urlMain": "http://metrologika.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "bookz.su": { + "engine": "uCoz", + "urlMain": "http://bookz.su", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ahera.ru": { + "engine": "uCoz", + "urlMain": "http://ahera.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "xn----7sbcctevcqafop1aviko5l.xn--p1ai": { + "engine": "uCoz", + "urlMain": "http://xn----7sbcctevcqafop1aviko5l.xn--p1ai", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "zornet.ru": { + "disabled": true, + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://zornet.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red" + }, + "na-sochi.ru": { + "engine": "uCoz", + "urlMain": "http://na-sochi.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "disabled": true + }, + "kredituemall.ru": { + "engine": "uCoz", + "urlMain": "http://kredituemall.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "mircasov.ru": { + "engine": "uCoz", + "urlMain": "http://mircasov.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "xn--24-6kcaal6ajt1cpibnu7d5dtc.xn--p1ai": { + "engine": "uCoz", + "urlMain": "http://xn--24-6kcaal6ajt1cpibnu7d5dtc.xn--p1ai", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "red", + "tags": [ + "medicine", + "ru" + ] + }, + "zapgame.ru": { + "engine": "uCoz", + "urlMain": "http://zapgame.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "yagubov.site": { + "engine": "uCoz", + "urlMain": "http://yagubov.site", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "disabled": true + }, + "masseffect-universe.com": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://masseffect-universe.com", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "ufive.ru": { + "engine": "uCoz", + "urlMain": "http://ufive.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "mir2007.ru": { + "engine": "uCoz", + "urlMain": "http://mir2007.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "hokage.tv": { + "engine": "uCoz", + "urlMain": "http://hokage.tv", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "dzintarsmos09.ru": { + "engine": "uCoz", + "urlMain": "http://dzintarsmos09.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "aribut.ru": { + "engine": "uCoz", + "urlMain": "http://aribut.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "tlgrm.pro": { + "disabled": true, + "engine": "uCoz", + "urlMain": "http://tlgrm.pro", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex", + "tags": [ + "ru" + ] + }, + "ucozzz.ru": { + "engine": "uCoz", + "urlMain": "http://ucozzz.ru", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "john" + }, + "freelancehunt.ru": { + "tags": [ + "ru", + "uz" + ], + "engine": "engine404", + "urlMain": "https://freelancehunt.ru", + "url": "https://freelancehunt.ru/freelancer/{username}.html", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "selly.gg": { + "engine": "engine404", + "urlMain": "https://selly.gg", + "url": "https://selly.gg/@{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "hosting.kitchen": { + "tags": [ + "ru" + ], + "engine": "engineRedirect", + "urlMain": "https://hosting.kitchen", + "url": "https://hosting.kitchen/profile/{username}/", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "admin" + }, + "freelansim.ru": { + "engine": "engine404get", + "urlMain": "https://freelansim.ru", + "url": "https://freelansim.ru/freelancers/{username}", + "usernameUnclaimed": "noonewouldeverusethis7", + "usernameClaimed": "alex" + }, + "Protovary.style": { + "checkType": "response_url", + "urlMain": "https://protovary.style", + "url": "https://protovary.style/user/{username}/", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.nemodniy.ru": { + "disabled": true, + "engine": "vBulletin", + "urlMain": "http://forum.nemodniy.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.uinsell.net": { + "engine": "vBulletin", + "urlMain": "http://forum.uinsell.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true, + "tags": [ + "forum" + ] + }, + "brute.pw": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://brute.pw", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "dapf.ru": { + "engine": "XenForo", + "urlMain": "https://dapf.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "onanizm.club": { + "engine": "XenForo", + "urlMain": "http://onanizm.club", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "mednolit.ru": { + "tags": [ + "ru" + ], + "engine": "uCoz", + "urlMain": "http://mednolit.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mikele-loconte.ru": { + "engine": "uCoz", + "urlMain": "http://mikele-loconte.ru", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mkuniverse.ru": { + "engine": "uCoz", + "urlMain": "http://mkuniverse.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "LocalCryptos": { + "urlProbe": "https://localcryptosapi.com/v1/accounts/profile/{username}", + "checkType": "message", + "presenseStrs": [ + "username", + "email_verified", + "Email verified", + "phone_verified", + "Phone verified" + ], + "absenceStrs": [ + "error" + ], + "urlMain": "https://localcryptosapi.com", + "url": "http://localcryptos.com/en/profile/{username}", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "codeseller.ru": { + "tags": [ + "kz", + "ru" + ], + "engine": "Wordpress/Author", + "urlMain": "https://codeseller.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "linuxpip.org": { + "engine": "Wordpress/Author", + "urlMain": "https://linuxpip.org", + "usernameClaimed": "diehard", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "webonrails.ru": { + "checkType": "message", + "presenseStrs": [ + "post_feed_title" + ], + "absenceStrs": [ + "

Ошибка

" + ], + "urlMain": "https://webonrails.ru", + "url": "https://webonrails.ru/user/{username}/", + "usernameClaimed": "spawn", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding", + "forum" + ], + "disabled": true + }, + "support.blue-systems.com": { + "engine": "Discourse", + "urlMain": "https://support.blue-systems.com", + "usernameClaimed": "santosmosley", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "universemc.us": { + "tags": [ + "forum" + ], + "engine": "XenForo", + "urlMain": "https://universemc.us", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "slivsklad.ru": { + "disabled": true, + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://slivsklad.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "slivap.ru": { + "tags": [ + "forum", + "ru" + ], + "engine": "XenForo", + "urlMain": "https://slivap.ru", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "skynetzone.net": { + "engine": "XenForo", + "urlMain": "https://skynetzone.net", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "TAP'D": { + "urlProbe": "https://tapd.co/api/user/getPublicProfile/{username}", + "checkType": "message", + "presenseStrs": [ + "\"_id\":" + ], + "absenceStrs": [ + "User does not exist" + ], + "urlMain": "https://tapd.co", + "url": "https://tapd.co/{username}", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "networking" + ] + }, + "wblitz.net": { + "disabled": true, + "checkType": "message", + "presenseStrs": [ + "profileBlock", + "tournaments", + "serverna", + " role=", + " name=" + ], + "absenceStrs": [ + "404 Страница не найдена

404 Страница не найдена

" + ], + "urlMain": "https://wblitz.net", + "url": "https://wblitz.net/stat/ru/{username}", + "usernameClaimed": "lucklev12", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "gaming" + ] + }, + "unc.ua": { + "tags": [ + "ua" + ], + "checkType": "message", + "presenseStrs": [ + "page-user_profile" + ], + "absenceStrs": [ + "Error Site" + ], + "urlMain": "https://unc.ua", + "url": "https://unc.ua/{username}", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "nevrotic.net": { + "checkType": "message", + "presenseStrs": [ + "profile-tabs", + " profile-rating" + ], + "absenceStrs": [ + "table-404" + ], + "urlMain": "http://nevrotic.net", + "url": "http://nevrotic.net/user/{username}", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "ru" + ] + }, + "pikabu.monster": { + "tags": [ + "ru", + "sharing" + ], + "checkType": "message", + "presenseStrs": [ + "usertotalcomments", + " usertotalposts" + ], + "absenceStrs": [ + "Ошибка" + ], + "urlMain": "https://pikabu.monster", + "url": "https://pikabu.monster/user/{username}-summary", + "source": "Pikabu", + "usernameClaimed": "Avezenit", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "SmiHub": { + "disabled": true, + "tags": [ + "photo" + ], + "checkType": "message", + "presenseStrs": [ + "profile", + "user-page", + "user", + " data-name=", + "user__img" + ], + "absenceStrs": [ + "text-lg mb-3" + ], + "urlMain": "https://smihub.com", + "url": "https://smihub.com/v/{username}", + "source": "Instagram", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "do100verno.info": { + "checkType": "message", + "presenseStrs": [ + "white-space: nowrap;" + ], + "absenceStrs": [ + "l-main", + " l-mainDcL", + " l-usrMenu" + ], + "urlMain": "https://do100verno.info", + "url": "https://do100verno.info/card/{username}", + "usernameClaimed": "ekostyle", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "blog" + ], + "disabled": true + }, + "www.kinokopilka.pro": { + "tags": [ + "il" + ], + "checkType": "message", + "presenseStrs": [ + "profile", + "user", + "people", + "users", + "/people" + ], + "urlMain": "https://www.kinokopilka.pro", + "url": "https://www.kinokopilka.pro/users/{username}", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "git.tcp.direct": { + "checkType": "message", + "presenseStrs": [ + "profile", + " user profile", + " name" + ], + "absenceStrs": [ + "og:site_name" + ], + "url": "https://git.tcp.direct/{username}", + "urlMain": "https://git.tcp.direct", + "usernameClaimed": "decoded", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "coding" + ] + }, + "hyprr.com": { + "checkType": "message", + "presenseStrs": [ + "birthday", + "name", + " role=", + "og:site_name", + "nickname" + ], + "absenceStrs": [ + "notFound" + ], + "url": "https://hyprr.com/profile/{username}", + "urlMain": "https://hyprr.com", + "usernameClaimed": "ivanhazell", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "photo", + "sharing" + ] + }, + "akforum.ru": { + "urlMain": "https://akforum.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "antiscam.space": { + "urlMain": "https://antiscam.space", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "cybercriminal", + "education", + "forum", + "ru" + ] + }, + "arcolinuxforum.com": { + "urlMain": "https://arcolinuxforum.com", + "engine": "phpBB/Search", + "usernameClaimed": "erikdubois", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "niflheim.top": { + "urlMain": "https://niflheim.top", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "eg", + "forum" + ] + }, + "indiatv-forum.ru": { + "urlMain": "https://indiatv-forum.ru", + "engine": "phpBB", + "usernameClaimed": "VeraPros", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.pavlovskyposad.ru": { + "urlMain": "http://forum.pavlovskyposad.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "lampoviedushi.hammarlund.ru": { + "urlMain": "http://lampoviedushi.hammarlund.ru", + "engine": "phpBB", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "forum.betsportslive.ru": { + "urlMain": "https://forum.betsportslive.ru", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru", + "sport" + ] + }, + "forum.heroesleague.ru": { + "urlMain": "http://forum.heroesleague.ru", + "engine": "phpBB/Search", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "egoforum.ru": { + "urlMain": "https://www.egoforum.ru", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "disabled": true + }, + "deeptor.ws": { + "urlMain": "https://deeptor.ws", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "tr" + ] + }, + "boominfo.org": { + "urlMain": "https://boominfo.org", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "egiki.ru": { + "urlMain": "http://egiki.ru", + "engine": "phpBB/Search", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.1796web.com": { + "urlMain": "https://forum.1796web.com", + "engine": "phpBB/Search", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.danetka.ru": { + "urlMain": "http://forum.danetka.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "forum.evendim.ru": { + "urlMain": "http://forum.evendim.ru", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "tottenhamhotspur.ru": { + "urlMain": "http://tottenhamhotspur.ru", + "engine": "phpBB/Search", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "syberpussy.com": { + "urlMain": "https://syberpussy.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "frauflora.ru": { + "urlMain": "http://frauflora.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "disabled": true + }, + "forum.balletfriends.ru": { + "urlMain": "http://forum.balletfriends.ru", + "engine": "phpBB2/Search", + "usernameClaimed": "atv", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "minesuperior.com": { + "urlMain": "https://minesuperior.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "pk" + ] + }, + "safesurvival.net": { + "urlMain": "https://www.safesurvival.net", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "forum.rusbani.ru": { + "urlMain": "http://forum.rusbani.ru", + "engine": "phpBB2/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "disabled": true + }, + "stop-narko.info": { + "urlMain": "http://stop-narko.info", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.foe-rechner.de": { + "urlMain": "https://forum.foe-rechner.de", + "engine": "Flarum", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "forum.paradox.network": { + "urlMain": "https://forum.paradox.network", + "engine": "Flarum", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "de", + "forum" + ] + }, + "discuss.foodomaa.com": { + "urlMain": "https://discuss.foodomaa.com", + "engine": "Flarum", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forumbebas.com": { + "urlMain": "https://forumbebas.com", + "engine": "Flarum", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "id" + ] + }, + "flutterforum.org": { + "urlMain": "https://flutterforum.org", + "engine": "Flarum", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "tr" + ] + }, + "community.gozenhost.com": { + "urlMain": "https://community.gozenhost.com", + "engine": "Flarum", + "usernameClaimed": "gozen", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "gr" + ] + }, + "yesilpara.com": { + "urlMain": "https://yesilpara.com", + "engine": "Flarum", + "usernameClaimed": "Administrator", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "tr" + ] + }, + "forum.prihoz.ru": { + "urlMain": "https://forum.prihoz.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "soborno.ru": { + "urlMain": "https://soborno.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.wladimir.su": { + "urlMain": "http://forum.wladimir.su", + "engine": "phpBB/Search", + "usernameClaimed": "yar08", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "snowblowerforum.com": { + "urlMain": "https://snowblowerforum.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "videoforums.ru": { + "urlMain": "http://videoforums.ru", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "lubuntu.ru": { + "urlMain": "https://lubuntu.ru", + "engine": "phpBB/Search", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "forum.dusterclub.ru": { + "disabled": true, + "urlMain": "http://forum.dusterclub.ru", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "openssource.info": { + "urlMain": "https://openssource.info", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "rub.altai.su": { + "disabled": true, + "urlMain": "http://rub.altai.su", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "mailpass.site": { + "urlMain": "https://mailpass.site", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.rastrnet.ru": { + "urlMain": "http://forum.rastrnet.ru", + "errors": { + "Извините, проводятся технические работы.": "Site error" + }, + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forumbusiness.net": { + "disabled": true, + "urlMain": "http://forumbusiness.net", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "se.guru": { + "urlMain": "https://se.guru", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "protection": [ + "cf_js_challenge", + "tls_fingerprint" + ], + "presenseStrs": [ + "profilefield_list" + ] + }, + "ovnl.in": { + "urlMain": "https://ovnl.in", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ], + "disabled": true + }, + "porschec.ru": { + "disabled": true, + "urlMain": "http://porschec.ru", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "mindmachine.ru": { + "urlSubpath": "/forum", + "urlMain": "https://mindmachine.ru/", + "engine": "phpBB/Search", + "usernameClaimed": "Александр_", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "nelubit.ru": { + "urlMain": "https://nelubit.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "actual-porn.org": { + "disabled": true, + "urlMain": "http://actual-porn.org", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "wls.social": { + "urlSubpath": "/wls", + "urlMain": "https://wls.social", + "engine": "Wordpress/Author", + "usernameClaimed": "nathaliemariel", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "blog" + ], + "disabled": true + }, + "Linkkle": { + "absenceStrs": [ + "anonymous" + ], + "presenseStrs": [ + "profile-top", + " profile-head", + " profile-info" + ], + "url": "https://linkkle.com/{username}", + "urlMain": "https://linkkle.com", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "links" + ] + }, + "ContactInBio (URL)": { + "absenceStrs": [ + "Page not found." + ], + "presenseStrs": [ + "user-area" + ], + "url": "http://allmy.link/{username}", + "urlMain": "http://allmy.link", + "usernameClaimed": "blue", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "links" + ] + }, + "Skypli": { + "absenceStrs": [ + "Nothing found" + ], + "presenseStrs": [ + "profile-box__info" + ], + "url": "https://www.skypli.com/profile/{username}", + "urlMain": "https://www.skypli.com", + "usernameClaimed": "roxana19739", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "messaging" + ], + "disabled": true + }, + "Purephoto": { + "absenceStrs": [ + "Not found Home | Makerlog" + ], + "presenseStrs": [ + "profile", + "first_name", + "username\\" + ], + "url": "https://getmakerlog.com/@{username}", + "urlMain": "https://getmakerlog.com", + "usernameClaimed": "theabbie", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "business" + ] + }, + "aussiehomebrewer.com": { + "urlMain": "https://aussiehomebrewer.com", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum-ukraina.net": { + "urlMain": "https://forum-ukraina.net", + "engine": "XenForo", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum-history.ru": { + "disabled": true, + "urlMain": "http://forum-history.ru", + "engine": "vBulletin", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.alconar.ru": { + "urlMain": "https://forum.alconar.ru", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "forum.lancerx.ru": { + "urlMain": "https://forum.lancerx.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "mfarmer.ru": { + "urlMain": "http://www.mfarmer.ru", + "engine": "vBulletin", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "disabled": true + }, + "forum.league17.ru": { + "urlMain": "https://forum.league17.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "krskforum.com": { + "urlMain": "https://krskforum.com", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "vw-bus.ru": { + "urlMain": "https://vw-bus.ru", + "engine": "phpBB", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "navimba.com": { + "urlMain": "https://navimba.com", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "niva-club.net": { + "urlMain": "https://www.niva-club.net", + "engine": "phpBB/Search", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "sign-forum.ru": { + "urlMain": "https://sign-forum.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "DarkNet Trust": { + "absenceStrs": [ + "notify notify-red mx-auto text-center" + ], + "presenseStrs": [ + "profiles" + ], + "protocol": "tor", + "url": "http://dntrustmucd4mwec.onion/u/{username}", + "urlMain": "http://dntrustmucd4mwec.onion", + "usernameClaimed": "cheshirecat82", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "headers": { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Language": "en-US,en;q=0.5" + }, + "tags": [ + "tor" + ] + }, + "i2pforum": { + "protocol": "i2p", + "urlMain": "http://i2pforum.i2p", + "usernameClaimed": "zzz", + "usernameUnclaimed": "noonewouldeverusethis7", + "engine": "phpBB/Search", + "tags": [ + "i2p" + ] + }, + "Worldis.me": { + "absenceStrs": [ + "user_password", + "send_email" + ], + "presenseStrs": [ + "my_profile", + "profile_upi", + "UserInfo" + ], + "url": "http://en.worldis.me/{username}", + "urlMain": "http://en.worldis.me", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "ru" + ] + }, + "photoshop-kopona.com": { + "absenceStrs": [ + "
" + ], + "presenseStrs": [ + "uspusertitle" + ], + "url": "https://photoshop-kopona.com/ru/user/{username}/", + "urlMain": "https://photoshop-kopona.com", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "ru" + ] + }, + "rblx.trade": { + "disabled": true, + "absenceStrs": [ + "isRblxTradeException" + ], + "presenseStrs": [ + "userId" + ], + "url": "https://rblx.trade/p/{username}", + "urlMain": "https://rblx.trade", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "source": "Roblox", + "tags": [ + "gaming" + ] + }, + "monitoringminecraft.ru": { + "absenceStrs": [ + "shadowi" + ], + "presenseStrs": [ + "small" + ], + "url": "https://monitoringminecraft.ru/player/{username}", + "urlMain": "https://monitoringminecraft.ru", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "gaming" + ] + }, + "giters.com": { + "disabled": true, + "absenceStrs": [ + "This page could not be found" + ], + "presenseStrs": [ + "nofollow" + ], + "url": "https://giters.com/{username}", + "urlMain": "https://giters.com", + "usernameClaimed": "soxoj", + "source": "GitHub", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "coding" + ] + }, + "tg.rip": { + "disabled": true, + "absenceStrs": [ + "btn_label" + ], + "presenseStrs": [ + "Телеграм пользователь" + ], + "url": "https://tg.rip/{username}", + "urlMain": "https://tg.rip", + "usernameClaimed": "soxoj", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "source": "Telegram", + "tags": [ + "messaging" + ] + }, + "tikbuddy.com": { + "presenseStrs": [ + "nickName" + ], + "url": "https://tikbuddy.com/en/tiktok/{username}", + "urlMain": "https://tikbuddy.com", + "usernameClaimed": "sergey.ivanov29", + "usernameUnclaimed": "noonewouldeverusethis9", + "checkType": "message", + "source": "TikTok", + "tags": [ + "hobby", + "video" + ] + }, + "Djagi": { + "absenceStrs": [ + "noindex" + ], + "presenseStrs": [ + "profile-menu" + ], + "url": "https://www.djagi.com/cards/{username}", + "urlMain": "https://www.djagi.com", + "usernameClaimed": "ivan.ivanov28", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "bg" + ] + }, + "kazanlashkigalab.com": { + "urlMain": "https://kazanlashkigalab.com", + "engine": "Wordpress/Author", + "usernameClaimed": "boncho-bonev", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "kz" + ] + }, + "airlinepilot.life": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://airlinepilot.life/u/{username}", + "disabled": true + }, + "algowiki-project.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://algowiki-project.org/en/User:{username}" + }, + "alimero.ru": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://alimero.ru/profile/{username}" + }, + "baseball-reference.com": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://baseball-reference.com/bullpen/User:{username}" + }, + "bbpress.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://bbpress.org/forums/profile/{username}/" + }, + "betawiki.net": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://betawiki.net/wiki/User:{username}" + }, + "bitcoin.it": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://bitcoin.it/wiki/User:{username}" + }, + "bookafly.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://bookafly.com/users/{username}" + }, + "brainscale.net": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://brainscale.net/users/{username}" + }, + "bulbapedia.bulbagarden.net": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://bulbapedia.bulbagarden.net/wiki/User:{username}" + }, + "bulbapp.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://bulbapp.com/{username}" + }, + "caddy.community": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://caddy.community/u/{username}" + }, + "chiefdelphi.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://chiefdelphi.com/u/{username}" + }, + "choice.community": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://choice.community/u/{username}" + }, + "cloudromance.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://cloudromance.com/{username}" + }, + "club.myce.com": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://club.myce.com/u/{username}" + }, + "cnblogs.com": { + "tags": [ + "cn" + ], + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://cnblogs.com/{username}" + }, + "commons.commondreams.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://commons.commondreams.org/u/{username}" + }, + "community.cartalk.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.cartalk.com/u/{username}" + }, + "community.gamedev.tv": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.gamedev.tv/u/{username}" + }, + "community.gemsofwar.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.gemsofwar.com/u/{username}" + }, + "community.glowforge.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.glowforge.com/u/{username}" + }, + "community.home-assistant.io": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.home-assistant.io/u/{username}" + }, + "community.infiniteflight.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.infiniteflight.com/u/{username}" + }, + "community.kodular.io": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.kodular.io/u/{username}" + }, + "community.letsencrypt.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.letsencrypt.org/u/{username}" + }, + "community.mycroft.ai": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.mycroft.ai/u/{username}" + }, + "community.mydevices.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.mydevices.com/u/{username}" + }, + "community.quickfile.co.uk": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.quickfile.co.uk/u/{username}" + }, + "community.roonlabs.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.roonlabs.com/u/{username}" + }, + "community.rstudio.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.rstudio.com/u/{username}" + }, + "community.unbounce.com": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://community.unbounce.com/u/{username}" + }, + "creationwiki.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://creationwiki.org/User:{username}" + }, + "credly.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://credly.com/users/{username}" + }, + "cruiserswiki.org": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://cruiserswiki.org/wiki/User:{username}" + }, + "dandwiki.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://dandwiki.com/wiki/User:{username}" + }, + "dariawiki.org": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://dariawiki.org/wiki/User:{username}" + }, + "detectiveconanworld.com": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://detectiveconanworld.com/wiki/User:{username}" + }, + "develop.consumerium.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://develop.consumerium.org/wiki/User:{username}" + }, + "devforum.zoom.us": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://devforum.zoom.us/u/{username}" + }, + "discourse.huel.com": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discourse.huel.com/u/{username}" + }, + "discourse.julialang.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discourse.julialang.org/u/{username}" + }, + "discourse.mc-stan.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discourse.mc-stan.org/u/{username}" + }, + "discourse.nodered.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discourse.nodered.org/u/{username}" + }, + "discourse.snowplowanalytics.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discourse.snowplowanalytics.com/u/{username}" + }, + "discoursedb.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discoursedb.org/wiki/User:{username}" + }, + "discuss.circleci.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.circleci.com/u/{username}" + }, + "discuss.elastic.co": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.elastic.co/u/{username}" + }, + "discuss.huel.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.huel.com/u/{username}" + }, + "discuss.ipfs.io": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.ipfs.io/u/{username}" + }, + "discuss.kotlinlang.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.kotlinlang.org/u/{username}" + }, + "discuss.kubernetes.io": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.kubernetes.io/u/{username}" + }, + "discuss.newrelic.com": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.newrelic.com/u/{username}" + }, + "discuss.pixls.us": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.pixls.us/u/{username}" + }, + "discuss.prosemirror.net": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.prosemirror.net/u/{username}" + }, + "discuss.pytorch.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://discuss.pytorch.org/u/{username}" + }, + "dnd-wiki.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://dnd-wiki.org/wiki/User:{username}" + }, + "dogcraft.net": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://dogcraft.net/wiki/User:{username}" + }, + "elixirforum.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://elixirforum.com/u/{username}" + }, + "en.brickimedia.org": { + "url": "https://en.brickimedia.org/wiki/User:{username}", + "urlProbe": "https://en.brickimedia.org/w/api.php?action=query&list=users&ususers={username}&format=json", + "urlMain": "https://en.brickimedia.org", + "checkType": "message", + "presenseStrs": [ + "\"userid\"" + ], + "absenceStrs": [ + "\"missing\"" + ], + "usernameClaimed": "Lcawte", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "wiki" + ] + }, + "en.illogicopedia.org": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://en.illogicopedia.org/wiki/User:{username}" + }, + "en.uncyclopedia.co": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://en.uncyclopedia.co/wiki/User:{username}" + }, + "en.wikifur.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://en.wikifur.com/wiki/User:{username}" + }, + "encyc.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://encyc.org/wiki/User:{username}" + }, + "Pixilart": { + "tags": [ + "art" + ], + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://pixilart.com/{username}" + }, + "eve.community": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://eve.community/u/{username}" + }, + "exploretalent.com": { + "checkType": "message", + "presenseStrs": [ + "userNode\":{\"id\"" + ], + "absenceStrs": [ + "userNode\":{}" + ], + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://exploretalent.com/{username}" + }, + "fandalism.com": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://fandalism.com/{username}" + }, + "fanfiktion.de": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://fanfiktion.de/u/{username}" + }, + "ffm.bio": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://ffm.bio/{username}" + }, + "finmessage.com": { + "regexCheck": "^[^\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af\\uf900-\\ufaff]+$", + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://finmessage.com/{username}" + }, + "flipsnack.com": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://flipsnack.com/{username}" + }, + "flirtic.ee": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://flirtic.ee/{username}", + "regexCheck": "^[^\\.]+$" + }, + "forum.banana-pi.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.banana-pi.org/u/{username}" + }, + "forum.bonsaimirai.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.bonsaimirai.com/u/{username}" + }, + "forum.cfx.re": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.cfx.re/u/{username}" + }, + "forum.cockroachlabs.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.cockroachlabs.com/u/{username}" + }, + "forum.core-electronics.com.au": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.core-electronics.com.au/u/{username}" + }, + "forum.freecodecamp.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.freecodecamp.org/u/{username}" + }, + "forum.gitlab.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.gitlab.com/u/{username}" + }, + "forum.golangbridge.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.golangbridge.org/u/{username}" + }, + "forum.juce.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.juce.com/u/{username}" + }, + "forum.leasehackr.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.leasehackr.com/u/{username}/summary" + }, + "forum.mattermost.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.mattermost.org/u/{username}" + }, + "forum.obsidian.md": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.obsidian.md/u/{username}" + }, + "forum.seeedstudio.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.seeedstudio.com/u/{username}" + }, + "forum.sublimetext.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.sublimetext.com/u/{username}" + }, + "forum.tudiabetes.org": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.tudiabetes.org/u/{username}" + }, + "forum.uipath.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.uipath.com/u/{username}" + }, + "forum.vuejs.org": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forum.vuejs.org/u/{username}" + }, + "forums.balena.io": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.balena.io/u/{username}" + }, + "forums.cgsociety.org": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.cgsociety.org/u/{username}" + }, + "forums.developer.nvidia.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.developer.nvidia.com/u/{username}", + "disabled": true + }, + "forums.episodeinteractive.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.episodeinteractive.com/u/{username}", + "disabled": true + }, + "forums.gearboxsoftware.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.gearboxsoftware.com/u/{username}", + "disabled": true + }, + "forums.lawrencesystems.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.lawrencesystems.com/u/{username}" + }, + "forums.mmorpg.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.mmorpg.com/profile/{username}" + }, + "forums.penny-arcade.com": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.penny-arcade.com/profile/discussions/{username}" + }, + "forums.pimoroni.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.pimoroni.com/u/{username}" + }, + "forums.t-nation.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.t-nation.com/u/{username}" + }, + "forums.theanimenetwork.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.theanimenetwork.com/u/{username}" + }, + "forums.wyzecam.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://forums.wyzecam.com/u/{username}" + }, + "gamedev.net": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://gamedev.net/{username}/" + }, + "gearheadwiki.com": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://gearheadwiki.com/wiki/User:{username}" + }, + "globulation2.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://globulation2.org/wiki/User:{username}" + }, + "hiveblocks.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://hiveblocks.com/@{username}" + }, + "inaturalist.nz": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://inaturalist.nz/people/{username}" + }, + "inaturalist.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://inaturalist.org/people/{username}" + }, + "irl.com": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://irl.com/{username}" + }, + "is.theorizeit.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://is.theorizeit.org/wiki/User:{username}" + }, + "ising.pl": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://ising.pl/{username}", + "protection": [ + "custom_bot_protection" + ] + }, + "kidicaruswiki.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://kidicaruswiki.org/wiki/User:{username}" + }, + "love2d.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://love2d.org/wiki/User:{username}" + }, + "mansonwiki.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://mansonwiki.com/wiki/User:{username}" + }, + "meta.discourse.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://meta.discourse.org/u/{username}" + }, + "metroidwiki.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://metroidwiki.org/wiki/User:{username}" + }, + "micro.blog": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://micro.blog/{username}" + }, + "micronations.wiki": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://micronations.wiki/User:{username}" + }, + "minnit.chat": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://minnit.chat/{username}" + }, + "mintme.com": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://mintme.com/token/{username}" + }, + "modelhub.com": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://modelhub.com/{username}/videos" + }, + "uviu.com": { + "tags": [ + "porn" + ], + "checkType": "message", + "absenceStrs": [ + "Oops! Page Not Found", + "We're sorry, but the requested page cannot be found" + ], + "presenseStrs": [ + "<div class=\"profilePhotoSection\">", + "<v-avatar username=\"{username}\" wrapper-class=\"largeAvatar profilePhoto\"" + ], + "usernameClaimed": "destinationkat", + "usernameUnclaimed": "noonewouldeverusethis7", + "urlMain": "https://www.uviu.com", + "url": "https://www.uviu.com/model/{username}" + }, + "monoskop.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://monoskop.org/User:{username}" + }, + "mql5.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://mql5.com/es/users/{username}" + }, + "musicinafrica.net": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://musicinafrica.net/fr/users/{username}" + }, + "nitrc.org": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://nitrc.org/users/{username}/" + }, + "nookipedia.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://nookipedia.com/wiki/User:{username}" + }, + "oldschool.runescape.wiki": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://oldschool.runescape.wiki/wiki/User:{username}" + }, + "openhub.net": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://openhub.net/accounts/{username}" + }, + "openriskmanual.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://openriskmanual.org/wiki/User:{username}", + "disabled": true, + "tags": [ + "finance", + "wiki" + ] + }, + "openwetware.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://openwetware.org/wiki/User:{username}" + }, + "oyoy.com": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://oyoy.com/{username}" + }, + "padlet.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://padlet.com/{username}" + }, + "padrim.com.br": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://padrim.com.br/{username}" + }, + "patch.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://patch.com/users/{username}" + }, + "pcgamingwiki.com": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://pcgamingwiki.com/wiki/User:{username}" + }, + "pidgi.net": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://pidgi.net/wiki/User:{username}" + }, + "pinataisland.info": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://pinataisland.info/viva/User:{username}" + }, + "postcrossing.com": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://postcrossing.com/user/{username}" + }, + "premium.chat": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://premium.chat/{username}" + }, + "pttweb.cc": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://pttweb.cc/user/{username}" + }, + "qiita.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://qiita.com/{username}" + }, + "rationalwiki.org": { + "checkType": "status_code", + "headers": { + "Cookie": "Yogsototh_opened_the_gate=1" + }, + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://rationalwiki.org/wiki/User:{username}" + }, + "raymanpc.com": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://raymanpc.com/wiki/en/User:{username}" + }, + "reactos.org": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://reactos.org/wiki/User:{username}", + "disabled": true, + "tags": [ + "coding", + "wiki" + ] + }, + "realcty.org": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://realcty.org/wiki/User:{username}" + }, + "renderosity.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://renderosity.com/users/{username}" + }, + "run-log.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://run-log.com/live/{username}" + }, + "runescape.wiki": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://runescape.wiki/wiki/User:{username}" + }, + "sketchfab.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://sketchfab.com/{username}" + }, + "snipplr.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://snipplr.com/users/{username}" + }, + "society6.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://society6.com/{username}/all" + }, + "splatoonwiki.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://splatoonwiki.org/wiki/User:{username}" + }, + "spreadshirt.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://spreadshirt.com/shop/user/{username}/" + }, + "ssbwiki.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://ssbwiki.com/User:{username}" + }, + "stackshare.io": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://stackshare.io/{username}", + "disabled": true + }, + "starfywiki.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://starfywiki.org/wiki/User:{username}" + }, + "steller.co": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://steller.co/{username}" + }, + "strategywiki.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://strategywiki.org/wiki/User:{username}" + }, + "talk.macpowerusers.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://talk.macpowerusers.com/u/{username}" + }, + "teflpedia.com": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://teflpedia.com/User:{username}" + }, + "testwiki.wiki": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://testwiki.wiki/wiki/User:{username}" + }, + "thinkwiki.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://thinkwiki.org/wiki/User:{username}" + }, + "tokyvideo.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://tokyvideo.com/user/{username}" + }, + "trailville.com": { + "checkType": "message", + "presenseStrs": [ + "wgRelevantUserName" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" + }, + "usernameClaimed": "Admin", + "usernameUnclaimed": "noonewouldevereverusethis7", + "url": "https://www.trailville.com/wiki/User:{username}" + }, + "trepup.com": { + "checkType": "message", + "absenceStrs": [ + "<title>" + ], + "usernameClaimed": "partybusservice", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://trepup.com/{username}" + }, + "ubuntu-mate.community": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://ubuntu-mate.community/u/{username}" + }, + "users.rust-lang.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://users.rust-lang.org/u/{username}" + }, + "v2ex.com": { + "tags": [ + "cn" + ], + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://v2ex.com/member/{username}" + }, + "vidamora.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://www.vidamora.com/profile/{username}" + }, + "vingle.net": { + "disabled": true, + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://vingle.net/{username}" + }, + "webflow.com": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://webflow.com/{username}" + }, + "wiki.creativecommons.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wiki.creativecommons.org/wiki/User:{username}" + }, + "wiki.linuxquestions.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wiki.linuxquestions.org/wiki/User:{username}" + }, + "wiki.mozilla.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wiki.mozilla.org/wiki/User:{username}", + "disabled": true + }, + "wiki.mtasa.com": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wiki.mtasa.com/User:{username}" + }, + "wiki.teamfortress.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wiki.teamfortress.com/wiki/User:{username}", + "headers": { + "User-Agent": "python-requests/2.25.1" + } + }, + "wiki.tfes.org": { + "checkType": "message", + "presenseStrs": [ + "History" + ], + "absenceStrs": [ + "is not registered." + ], + "usernameClaimed": "Tom_Bishop", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wiki.tfes.org/User:{username}" + }, + "wiki.themanaworld.org": { + "checkType": "status_code", + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wiki.themanaworld.org/wiki/User:{username}" + }, + "wiki.wesnoth.org": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wiki.wesnoth.org/wiki/User:{username}" + }, + "wiki.xkcd.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wiki.xkcd.com/geohashing/User:{username}" + }, + "wikialpha.org": { + "checkType": "status_code", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wikialpha.org/wiki/User:{username}", + "disabled": true + }, + "wikiapiary.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wikiapiary.com/wiki/User:{username}" + }, + "wikiislam.net": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wikiislam.net/wiki/User:{username}" + }, + "wikizilla.org": { + "checkType": "message", + "absenceStrs": [ + "is not registered." + ], + "presenseStrs": [ + "class=\"mw-socialprofile-avatar\" alt=\"avatar\"/><" + ], + "usernameClaimed": "test", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://wikizilla.org/wiki/User:{username}" + }, + "zeldadungeon.net": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://zeldadungeon.net/wiki/User:{username}" + }, + "zoig.com": { + "checkType": "status_code", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + "url": "https://zoig.com/profile/{username}" + }, + "free-otvet.ru": { + "absenceStrs": [ + "qam-sidepanel-mobile" + ], + "presenseStrs": [ + "userfield-2" + ], + "url": "https://free-otvet.ru/user/{username}_zn", + "urlMain": "https://free-otvet.ru", + "usernameClaimed": "Triolana", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "q&a" + ] + }, + "27r.ru": { + "urlMain": "https://27r.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "chelfishing.ru": { + "urlMain": "http://www.chelfishing.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "coffeeforum.ru": { + "urlMain": "http://coffeeforum.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "caravanliga.ru": { + "urlMain": "http://caravanliga.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "disabled": true + }, + "fkclub.ru": { + "urlMain": "https://fkclub.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "e36club.com.ua": { + "urlMain": "http://e36club.com.ua/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ua" + ] + }, + "audi-belarus.by": { + "urlMain": "https://audi-belarus.by/forum", + "engine": "phpBB/Search", + "usernameClaimed": "red", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "by", + "forum" + ] + }, + "cedia-club.ru": { + "urlMain": "https://cedia-club.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "308-club.ru": { + "urlMain": "https://www.308-club.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "as8.ru": { + "urlMain": "http://as8.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "chevrolet-daewoo.ru": { + "urlMain": "http://chevrolet-daewoo.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum-dollplanet.ru": { + "urlMain": "http://forum-dollplanet.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "bashohota.ru": { + "urlMain": "http://www.bashohota.ru", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "fforum.ru": { + "urlMain": "http://www.fforum.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "hairforum.ru": { + "urlMain": "https://hairforum.ru", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "hcv.ru": { + "urlMain": "http://www.hcv.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.injectorservice.com.ua": { + "urlMain": "https://forum.injectorservice.com.ua", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ua" + ] + }, + "memoriam.ru": { + "urlMain": "https://memoriam.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "moto-arena.ru": { + "urlMain": "https://moto-arena.ru", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.pskovchess.ru": { + "urlMain": "http://forum.pskovchess.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "siava.ru": { + "urlMain": "https://siava.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.virtualsoccer.ru": { + "urlMain": "https://forum.virtualsoccer.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.tathunter.ru": { + "urlMain": "http://forum.tathunter.ru", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "forum.volnistye.ru": { + "urlMain": "https://forum.volnistye.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "frauflora.com": { + "urlMain": "http://frauflora.com", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "guitar.by": { + "urlMain": "https://www.guitar.by/forum", + "engine": "phpBB/Search", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "by", + "forum" + ] + }, + "kidshockey.ru": { + "urlMain": "https://kidshockey.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "lifeintravel.ru": { + "urlMain": "https://lifeintravel.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ], + "disabled": true + }, + "make-ups.ru": { + "urlMain": "http://make-ups.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "admin", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "mitsubishi-asx.net": { + "urlMain": "https://www.mitsubishi-asx.net/forum", + "engine": "phpBB/Search", + "usernameClaimed": "god", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum" + ] + }, + "moto26.ru": { + "urlMain": "http://moto26.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "lviv4x4.club": { + "urlMain": "http://lviv4x4.club/forum", + "engine": "phpBB/Search", + "usernameClaimed": "john", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "politsrach.ru": { + "disabled": true, + "urlMain": "https://politsrach.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "spb-projects.ru": { + "urlMain": "http://spb-projects.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "ttsport.ru": { + "urlMain": "https://www.ttsport.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "yiiframework.ru": { + "urlMain": "https://yiiframework.ru/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7", + "tags": [ + "forum", + "ru" + ] + }, + "vcfm.ru": { + "urlMain": "https://vcfm.ru/forum", + "engine": "phpBB/Search", + "tags": [ + "forum", + "ru" + ], + "usernameClaimed": "alex", + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "gaz-24.com": { + "urlMain": "http://gaz-24.com/forum", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "tags": [ + "forum", + "ru" + ], + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "promalp.ru": { + "urlMain": "http://promalp.ru", + "engine": "phpBB/Search", + "usernameClaimed": "alex", + "tags": [ + "forum", + "ru" + ], + "usernameUnclaimed": "noonewouldeverusethis7" + }, + "breakers.tv": { + "absenceStrs": [ + "Channel you are looking for doesn't exist", + "Stream Not Found - Breakers.TV" + ], + "presenseStrs": [ + " followers", + "{username}", + "{username} on Breakers.TV" + ], + "url": "https://breakers.tv/{username}", + "urlMain": "https://breakers.tv", + "usernameClaimed": "friendlyboxbreaks", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "streaming" + ] + }, + "instaprofi.ru": { + "absenceStrs": [ + "/static/img/pages/profile/nobody.jpg" + ], + "presenseStrs": [ + "profile__nextProfile flex-ajc" + ], + "url": "https://instaprofi.ru/profile/{username}", + "urlMain": "https://instaprofi.ru", + "usernameClaimed": "morgen_shtern", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "source": "Instagram", + "tags": [ + "photo" + ] + }, + "lyricsTraining": { + "tags": [ + "music" + ], + "checkType": "message", + "presenseStrs": [ + "Lyrics by" + ], + "absenceStrs": [ + "Sorry, there are no results for your search." + ], + "url": "https://lyricstraining.com/search?user={username}", + "usernameClaimed": "Purrito", + "usernameUnclaimed": "noonewouldeverusethis12" + }, + "expoForum": { + "tags": [ + "coding", + "forum" + ], + "checkType": "status_code", + "url": "https://forums.expo.dev/u/{username}", + "usernameClaimed": "wodin", + "usernameUnclaimed": "noonewouldeverusethis12", + "disabled": true + }, + "rawg.io": { + "tags": [ + "gaming" + ], + "checkType": "status_code", + "url": "https://rawg.io/@{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis12" + }, + "SchemeColor": { + "tags": [ + "art", + "design" + ], + "checkType": "status_code", + "url": "https://www.schemecolor.com/author/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis12" + }, + "aetherhub": { + "tags": [ + "gaming" + ], + "checkType": "status_code", + "url": "https://aetherhub.com/User/{username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis12" + }, + "bugbounty": { + "disabled": true, + "tags": [ + "hacking" + ], + "checkType": "status_code", + "url": "https://bugbounty.gg/members/{username}", + "usernameClaimed": "marco", + "usernameUnclaimed": "noonewouldeverusethis12" + }, + "universocraft": { + "tags": [ + "gaming" + ], + "checkType": "message", + "presenseStrs": [ + "Última conexión" + ], + "absenceStrs": [ + "No se ha encontrado ningún usuario con ese nombre" + ], + "url": "https://stats.universocraft.com/stats.php?player={username}", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis12" + }, + "edns.domains/meta": { + "absenceStrs": [ + "\"available\":true" + ], + "presenseStrs": [ + "PURCHASED_BY_OTHER" + ], + "url": "https://api.edns.domains/domain/lookup/{username}.meta", + "urlMain": "https://api.edns.domains", + "usernameClaimed": "everlast88", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ], + "disabled": true + }, + "edns.domains/music": { + "absenceStrs": [ + "\"available\":true" + ], + "presenseStrs": [ + "PURCHASED_BY_OTHER" + ], + "url": "https://api.edns.domains/domain/lookup/{username}.music", + "urlMain": "https://api.edns.domains", + "usernameClaimed": "everlast88", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ], + "disabled": true + }, + "edns.domains/ass": { + "absenceStrs": [ + "\"available\":true" + ], + "presenseStrs": [ + "PURCHASED_BY_OTHER" + ], + "url": "https://api.edns.domains/domain/lookup/{username}.ass", + "urlMain": "https://api.edns.domains", + "usernameClaimed": "everlast88", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ], + "disabled": true + }, + "edns.domains/404": { + "absenceStrs": [ + "\"available\":true" + ], + "presenseStrs": [ + "PURCHASED_BY_OTHER" + ], + "url": "https://api.edns.domains/domain/lookup/{username}.404", + "urlMain": "https://api.edns.domains", + "usernameClaimed": "everlast88", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ], + "disabled": true + }, + "edns.domains/sandbox": { + "absenceStrs": [ + "\"available\":true" + ], + "presenseStrs": [ + "PURCHASED_BY_OTHER" + ], + "url": "https://api.edns.domains/domain/lookup/{username}.sandbox", + "urlMain": "https://api.edns.domains", + "usernameClaimed": "everlast88", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ], + "disabled": true + }, + "edns.domains/web3": { + "absenceStrs": [ + "\"available\":true" + ], + "presenseStrs": [ + "PURCHASED_BY_OTHER" + ], + "url": "https://api.edns.domains/domain/lookup/{username}.web3", + "urlMain": "https://api.edns.domains", + "usernameClaimed": "everlast88", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ], + "disabled": true + }, + "edns.domains/gamefi": { + "absenceStrs": [ + "\"available\":true" + ], + "presenseStrs": [ + "PURCHASED_BY_OTHER" + ], + "url": "https://api.edns.domains/domain/lookup/{username}.gamefi", + "urlMain": "https://api.edns.domains", + "usernameClaimed": "everlast88", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ], + "disabled": true + }, + "edns.domains/iotex": { + "absenceStrs": [ + "\"available\":true" + ], + "presenseStrs": [ + "PURCHASED_BY_OTHER" + ], + "url": "https://api.edns.domains/domain/lookup/{username}.iotex", + "urlMain": "https://api.edns.domains", + "usernameClaimed": "everlast88", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ] + }, + "peername.com/bit": { + "presenseStrs": [ + "" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0", + "Origin": "https://peername.com", + "Referer": "https://peername.com" + }, + "url": "https://peername.net/api/?name={username}&namespace=bit", + "urlMain": "https://peername.com/", + "usernameClaimed": "everlast", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ] + }, + "peername.com/coin": { + "presenseStrs": [ + "" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0", + "Origin": "https://peername.com", + "Referer": "https://peername.com" + }, + "url": "https://peername.net/api/?name={username}&namespace=coin", + "urlMain": "https://peername.com/", + "usernameClaimed": "everlast", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ] + }, + "peername.com/onion": { + "presenseStrs": [ + "" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0", + "Origin": "https://peername.com", + "Referer": "https://peername.com" + }, + "url": "https://peername.net/api/?name={username}&namespace=onion", + "urlMain": "https://peername.com/", + "usernameClaimed": "everlast", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ] + }, + "peername.com/bazar": { + "presenseStrs": [ + "" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0", + "Origin": "https://peername.com", + "Referer": "https://peername.com" + }, + "url": "https://peername.net/api/?name={username}&namespace=bazar", + "urlMain": "https://peername.com/", + "usernameClaimed": "everlast", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ] + }, + "peername.com/lib": { + "presenseStrs": [ + "" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0", + "Origin": "https://peername.com", + "Referer": "https://peername.com" + }, + "url": "https://peername.net/api/?name={username}&namespace=lib", + "urlMain": "https://peername.com/", + "usernameClaimed": "everlast", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ] + }, + "peername.com/emc": { + "presenseStrs": [ + "" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0", + "Origin": "https://peername.com", + "Referer": "https://peername.com" + }, + "url": "https://peername.net/api/?name={username}&namespace=emv", + "urlMain": "https://peername.com/", + "usernameClaimed": "everlast", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ] + }, + "peername.com/tor": { + "presenseStrs": [ + "" + ], + "headers": { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0", + "Origin": "https://peername.com", + "Referer": "https://peername.com" + }, + "url": "https://peername.net/api/?name={username}&namespace=tor", + "urlMain": "https://peername.com/", + "usernameClaimed": "everlast", + "usernameUnclaimed": "noonewouldeverusethis7", + "checkType": "message", + "tags": [ + "crypto" + ] + }, + "fanscout.com": { + "checkType": "message", + "absenceStrs": [ + "This page is under construction" + ], + "presenseStrs": [ + "birthday cake" + ], + "url": "https://fanscout.com/{username}", + "urlMain": "https://fanscout.com", + "usernameClaimed": "moonlitraven", + "usernameUnclaimed": "sicuoozvul" + }, + "DimensionalMe": { + "checkType": "message", + "absenceStrs": [ + "error_main_" + ], + "presenseStrs": [ + "userName", + "publicProfile" + ], + "url": "https://www.dimensional.me/{username}", + "urlMain": "https://www.dimensional.me", + "usernameClaimed": "sparkles99", + "usernameUnclaimed": "hbtybxpuon" + }, + "www.portal-pisarski.pl": { + "checkType": "message", + "absenceStrs": [ + "obrazki/404.png" + ], + "presenseStrs": [ + "profil/" + ], + "url": "https://www.portal-pisarski.pl/profil/{username}", + "urlMain": "https://www.portal-pisarski.pl", + "usernameClaimed": "sparkles99", + "usernameUnclaimed": "hlwifvxnqw" + }, + "www.dateamillionaire.com": { + "checkType": "message", + "absenceStrs": [ + "input[name=" + ], + "presenseStrs": [ + "patch_fill profile_box" + ], + "url": "https://www.dateamillionaire.com/members/{username}", + "urlMain": "https://www.dateamillionaire.com", + "usernameClaimed": "pixie23", + "usernameUnclaimed": "vmvasupgog" + }, + "www.stopstalk.com": { + "checkType": "message", + "absenceStrs": [ + "pupil", + "my-owlie", + "/user/custom_friend", + "owl", + "beak" + ], + "presenseStrs": [ + "", + " ", + ">
", + "uva-profile-url", + " + +
+
+
+

+ +

+ Generated by Maigret at {{ generated_at }} +
+
+
+
+
+
+
Supposed personal data
+ {% for k, v in supposed_data.items() %} + + {{ k }}: {{ v }} + + {% endfor %} + {% if countries_tuple_list %} + + Geo: {% for k, v in countries_tuple_list %}{{ k }} ({{ v }}){{ ", " if not loop.last }}{% endfor %} + + {% endif %}{% if interests_tuple_list %} + + Interests: {% for k, v in interests_tuple_list %}{{ k }} ({{ v }}){{ ", " if not loop.last }}{% endfor %} + + {% endif %}{% if first_seen %} + + First seen: {{ first_seen }} + + {% endif %} +
+
+
+
+
+
+
+
+
Brief
+ + {{ brief }} + +
+
+
+
+ {% for u, t, data in results %} + {% for k, v in data.items() %} + {% if v.found and not v.is_similar %} +
+
+
+ Photo +
+

+ {{ k }} +

+ {% if v.status.tags %} +
Tags: {{ v.status.tags | join(', ') }}
+ {% endif %} +

+ {{ v.url_user }} + (web.archive.org, archive.is) +

+ {% if v.ids_data %} +
+ + {% for k1, v1 in v.ids_data.items() %} + {% if k1 != 'image' %} + + + + + {% endif %} + {% endfor %} + +
{{ title(k1) }}{% if v1 is iterable and (v1 is not string and v1 is not mapping) %}{{ v1 | join(', ') }}{% else %}{{ detect_link(v1) }}{% endif %} +
+ {% endif %} +

+
+
+ + + {% endif %} + {% endfor %} + {% endfor %} + + + + + \ No newline at end of file diff --git a/maigret/resources/simple_report_pdf.css b/maigret/resources/simple_report_pdf.css new file mode 100644 index 0000000..e2282d7 --- /dev/null +++ b/maigret/resources/simple_report_pdf.css @@ -0,0 +1,45 @@ +h2 { + font-size: 30px; + width: 100%; + display:block; +} +h3 { + font-size: 25px; + width: 100%; + display:block; +} +h4 { + font-size: 20px; + width: 100%; + display:block; +} +p { + margin: 0 0 5px; + display: block; +} + + +table { + margin-bottom: 10px; + width:100%; +} +th { + font-weight: bold; +} +th,td,caption { + padding: 4px 10px 4px 5px; +} +table tr:nth-child(even) td, +table tr.even td { + background-color: #e5ecf9; +} + +div { + border-bottom-color: #3e3e3e; + border-bottom-width: 1px; + border-bottom-style: solid; +} +.invalid-button { + position: absolute; + left: 10px; +} \ No newline at end of file diff --git a/maigret/resources/simple_report_pdf.tpl b/maigret/resources/simple_report_pdf.tpl new file mode 100644 index 0000000..6f30103 --- /dev/null +++ b/maigret/resources/simple_report_pdf.tpl @@ -0,0 +1,116 @@ + + + + + +{{ username }} -- Maigret username search report + +
+
+
+

+ Username search report for {{ username }} +

+ Generated by Maigret at {{ generated_at }} +
+
+

+
+
+
+
+

Supposed personal data

+ {% for k, v in supposed_data.items() %} +

+ {{ k }}: {{ v }} +

+ {% endfor %} + {% if countries_tuple_list %} +

+ Geo: {% for k, v in countries_tuple_list %}{{ k }} ({{ v }}){{ ", " if not loop.last }}{% endfor %} +

+ {% endif %}{% if interests_tuple_list %} +

+ Interests: {% for k, v in interests_tuple_list %}{{ k }} ({{ v }}){{ ", " if not loop.last }}{% endfor %} +

+ {% endif %}{% if first_seen %} +

+ First seen: {{ first_seen }} +

+ {% endif %} +
+
+
+
+
+
+
+
+
+

Brief

+

+ {{ brief }} +

+
+
+
+
+ {% for u, t, data in results %} + {% for k, v in data.items() %} + {% if v.found and not v.is_similar %} + +
+
+
+
+
+ + + + + +
+
+

+ {{ k }} +

+ {% if v.status.tags %} +
Tags: {{ v.status.tags | join(', ') }}
+ {% endif %} +

+ {{ v.url_user }} + (web.archive.org, archive.is) +

+
+ {% if v.ids_data %} +
+
+
+

Details

+ + + {% for k1, v1 in v.ids_data.items() %} + {% if k1 != 'image' %} + + + + + {% endif %} + + {% endfor %} + +
{{ title(k1) }}{% if v1 is iterable and (v1 is not string and v1 is not mapping) %}{{ v1 | join(', ') }}{% else %}{{ detect_link(v1) }}{% endif %}
+
+ {% endif %} +
+ Photo +
+
+
+
+ {% endif %} + {% endfor %} + {% endfor %} +
+ + \ No newline at end of file diff --git a/maigret/result.py b/maigret/result.py new file mode 100644 index 0000000..107bb7f --- /dev/null +++ b/maigret/result.py @@ -0,0 +1,190 @@ +"""Maigret Result Module + +This module defines various objects for recording the results of queries. +""" + +import asyncio +from enum import Enum +from typing import TYPE_CHECKING, Any, Dict, List, Optional, TypedDict + +if TYPE_CHECKING: + from aiohttp import CookieJar + from .sites import MaigretSite + +class KeywordMatchStatus(Enum): + """Keyword Match Status Enumeration. + + Describes the status of keyword matching for a given site. + """ + + NO_KEYWORDS = "No Keywords" + KEYWORD_FOUND = "Keyword Found" + KEYWORDS_NOT_FOUND = "Keywords Not Found" + + def __str__(self): + """Convert Object To String. + + Keyword Arguments: + self -- This object. + + Return Value: + Nicely formatted string to get information about this object. + """ + return self.value + +class MaigretCheckStatus(Enum): + """Query Status Enumeration. + + Describes status of query about a given username. + """ + + CLAIMED = "Claimed" # Username Detected + AVAILABLE = "Available" # Username Not Detected + UNKNOWN = "Unknown" # Error Occurred While Trying To Detect Username + ILLEGAL = "Illegal" # Username Not Allowable For This Site + + def __str__(self): + """Convert Object To String. + + Keyword Arguments: + self -- This object. + + Return Value: + Nicely formatted string to get information about this object. + """ + return self.value + + +class MaigretCheckResult: + """ + Describes result of checking a given username on a given site + """ + + def __init__( + self, + username, + site_name, + site_url_user, + status, + ids_data=None, + query_time=None, + context=None, + error=None, + tags=[], + keywords=None, + keyword_match_status=None + ): + """ + Keyword Arguments: + self -- This object. + username -- String indicating username that query result + was about. + site_name -- String which identifies site. + site_url_user -- String containing URL for username on site. + NOTE: The site may or may not exist: this + just indicates what the name would + be, if it existed. + status -- Enumeration of type QueryStatus() indicating + the status of the query. + query_time -- Time (in seconds) required to perform query. + Default of None. + context -- String indicating any additional context + about the query. For example, if there was + an error, this might indicate the type of + error that occurred. + Default of None. + ids_data -- Extracted from website page info about other + usernames and inner ids. + keywords -- List of keywords to search for in page content. + Default of None. + keyword_match_status -- Enumeration of type KeywordMatchStatus() + indicating keyword matching status. + Default of None. + + Return Value: + Nothing. + """ + + self.username = username + self.site_name = site_name + self.site_url_user = site_url_user + self.status = status + self.query_time = query_time + self.context = context + self.ids_data = ids_data + self.tags = tags + self.error = error + self.keywords = keywords or [] + self.keyword_match_status = keyword_match_status or KeywordMatchStatus.NO_KEYWORDS + + def json(self): + return { + "username": self.username, + "site_name": self.site_name, + "url": self.site_url_user, + "status": str(self.status), + "ids": self.ids_data or {}, + "tags": self.tags, + "keywords": self.keywords, + "keyword_match_status": str(self.keyword_match_status) + } + + def is_found(self): + return self.status == MaigretCheckStatus.CLAIMED + + def __repr__(self): + return f"<{self.__str__()}>" + + def __str__(self): + """Convert Object To String. + + Keyword Arguments: + self -- This object. + + Return Value: + Nicely formatted string to get information about this object. + """ + status = str(self.status) + if self.context is not None: + # There is extra context information available about the results. + # Append it to the normal response text. + status += f" ({self.context})" + + return status + + +class SiteResult(TypedDict, total=False): + """Per-site result dict, keyed by site name in the top-level results dict. + + Populated across three phases — make_site_result, process_site_result, + then report generation — so every field is optional from the type + system's point of view. + """ + + # make_site_result + site: "MaigretSite" + username: str + keywords: List[str] + parsing_enabled: bool + url_main: str + cookies: Optional["CookieJar"] + url_user: str + url_probe: str + future: asyncio.Future + checker: Any # CheckerBase lives in checking.py; importing back here is circular + + # process_site_result + status: MaigretCheckResult + http_status: Any # int on success, "" on error branches — mixed by design + is_similar: bool + rank: Optional[int] + response_text: str + + # extract_ids_data + ids_usernames: Dict[str, str] + ids_links: List[str] + + # added during report generation + found: bool + ids_data: Dict[str, Any] + sitename: str # only set for per-line JSON export diff --git a/maigret/settings.py b/maigret/settings.py new file mode 100644 index 0000000..e8eedf4 --- /dev/null +++ b/maigret/settings.py @@ -0,0 +1,92 @@ +import os +import os.path as path +import json +from typing import List + +SETTINGS_FILES_PATHS = [ + path.join(path.dirname(path.realpath(__file__)), "resources/settings.json"), + path.expanduser('~/.maigret/settings.json'), + path.join(os.getcwd(), 'settings.json'), +] + + +class Settings: + # main maigret setting + retries_count: int + sites_db_path: str + timeout: int + max_connections: int + recursive_search: bool + info_extracting: bool + cookie_jar_file: str + ignore_ids_list: List + reports_path: str + proxy_url: str + tor_proxy_url: str + i2p_proxy_url: str + domain_search: bool + scan_all_sites: bool + top_sites_count: int + scan_disabled_sites: bool + scan_sites_list: List + self_check_enabled: bool + print_not_found: bool + print_check_errors: bool + colored_print: bool + show_progressbar: bool + report_sorting: str + json_report_type: str + txt_report: bool + csv_report: bool + xmind_report: bool + pdf_report: bool + html_report: bool + graph_report: bool + neo4j_report: bool + md_report: bool + web_interface_port: int + no_autoupdate: bool + db_update_meta_url: str + autoupdate_check_interval_hours: int + cloudflare_bypass: dict + + # submit mode settings + presence_strings: list + supposed_usernames: list + + def __init__(self): + pass + + def load(self, paths=None): + was_inited = False + + if not paths: + paths = SETTINGS_FILES_PATHS + + for filename in paths: + data = {} + + try: + with open(filename, "r", encoding="utf-8") as file: + data = json.load(file) + except FileNotFoundError: + # treast as a normal situation + pass + except Exception as error: + return False, ValueError( + f"Problem with parsing json contents of " + f"settings file '{filename}': {str(error)}." + ) + + self.__dict__.update(data) + if data: + was_inited = True + + return ( + was_inited, + f'None of the default settings files found: {", ".join(paths)}', + ) + + @property + def json(self): + return self.__dict__ diff --git a/maigret/sites.py b/maigret/sites.py new file mode 100644 index 0000000..1f007e1 --- /dev/null +++ b/maigret/sites.py @@ -0,0 +1,730 @@ +# ****************************** -*- +"""Maigret Sites Information""" + +import copy +import json +import logging +import sys +from typing import Optional, List, Dict, Any, Tuple + +from .utils import CaseConverter, URLMatcher, is_country_tag + +logger = logging.getLogger(__name__) + + +class MaigretEngine: + site: Dict[str, Any] = {} + + def __init__(self, name, data): + self.name = name + self.__dict__.update(data) + + @property + def json(self): + return self.__dict__ + + +class MaigretSite: + # Fields that should not be serialized when converting site to JSON + NOT_SERIALIZABLE_FIELDS = [ + "name", + "engineData", + "requestFuture", + "detectedEngine", + "engineObj", + "stats", + "urlRegexp", + ] + + # Username known to exist on the site + username_claimed = "" + # Username known to not exist on the site + username_unclaimed = "" + # Additional URL path component, e.g. /forum in https://example.com/forum/users/{username} + url_subpath = "" + # Main site URL (the main page) + url_main = "" + # Full URL pattern for username page, e.g. https://example.com/forum/users/{username} + url = "" + # Whether site is disabled. Not used by Maigret without --use-disabled argument + disabled = False + # Whether a positive result indicates accounts with similar usernames rather than exact matches + similar_search = False + # Whether to ignore 403 status codes + ignore403 = False + # Site category tags + tags: List[str] = [] + + # Type of identifier (username, gaia_id etc); see SUPPORTED_IDS in checking.py + type = "username" + # Custom HTTP headers + headers: Dict[str, str] = {} + # Error message substrings + errors: Dict[str, str] = {} + # Site activation requirements + activation: Dict[str, Any] = {} + # Regular expression for username validation + regex_check = None + # URL to probe site status + url_probe = None + # Type of check to perform + check_type = "" + # HTTP request method (GET, POST, HEAD, etc.) + request_method = "" + # HTTP request payload (for POST, PUT, etc.) + request_payload: Dict[str, Any] = {} + # Whether to only send HEAD requests (GET by default) + request_head_only = "" + # GET parameters to include in requests + get_params: Dict[str, Any] = {} + + # Substrings in HTML response that indicate profile exists + presense_strs: List[str] = [] + # Substrings in HTML response that indicate profile doesn't exist + absence_strs: List[str] = [] + # Site statistics + stats: Dict[str, Any] = {} + + # Site engine name + engine = None + # Engine-specific configuration + engine_data: Dict[str, Any] = {} + # Engine instance + engine_obj: Optional["MaigretEngine"] = None + # Future for async requests + request_future = None + # Alexa traffic rank + alexa_rank = None + # Source (in case a site is a mirror of another site) + source: Optional[str] = None + + # URL protocol (http/https) + protocol = '' + # Protection types detected on this site (e.g. ["tls_fingerprint", "ddos_guard"]) + protection: List[str] = [] + + def __init__(self, name, information): + self.name = name + self.url_subpath = "" + + for k, v in information.items(): + self.__dict__[CaseConverter.camel_to_snake(k)] = v + + if (self.alexa_rank is None) or (self.alexa_rank == 0): + # We do not know the popularity, so make site go to bottom of list. + self.alexa_rank = sys.maxsize + + self.update_detectors() + + def __str__(self): + return f"{self.name} ({self.url_main})" + + def __is_equal_by_url_or_name(self, url_or_name_str: str): + lower_url_or_name_str = url_or_name_str.lower() + lower_url = self.url.lower() + lower_name = self.name.lower() + lower_url_main = self.url_main.lower() + + return ( + lower_name == lower_url_or_name_str + or (lower_url_main and lower_url_main == lower_url_or_name_str) + or (lower_url_main and lower_url_main in lower_url_or_name_str) + or (lower_url_main and lower_url_or_name_str in lower_url_main) + or (lower_url and lower_url_or_name_str in lower_url) + ) + + def __eq__(self, other): + if isinstance(other, MaigretSite): + # Compare only relevant attributes, not internal state like request_future + attrs_to_compare = [ + 'name', + 'url_main', + 'url_subpath', + 'type', + 'headers', + 'errors', + 'activation', + 'regex_check', + 'url_probe', + 'check_type', + 'request_method', + 'request_payload', + 'request_head_only', + 'get_params', + 'presense_strs', + 'absence_strs', + 'stats', + 'engine', + 'engine_data', + 'alexa_rank', + 'source', + 'protocol', + ] + + return all( + getattr(self, attr) == getattr(other, attr) for attr in attrs_to_compare + ) + elif isinstance(other, str): + # Compare only by name (exactly) or url_main (partial similarity) + return self.__is_equal_by_url_or_name(other) + return False + + def update_detectors(self): + if "url" in self.__dict__: + url = self.url + for group in ["urlMain", "urlSubpath"]: + if group in url: + url = url.replace( + "{" + group + "}", + self.__dict__[CaseConverter.camel_to_snake(group)], + ) + + self.url_regexp = URLMatcher.make_profile_url_regexp( + url, self.regex_check or "" + ) + + def detect_username(self, url: str) -> Optional[str]: + if self.url_regexp: + match_groups = self.url_regexp.match(url) + if match_groups: + username = next( + ( + group.rstrip("/") + for group in reversed(match_groups.groups()) + if isinstance(group, str) and group + ), + None, + ) + return username + + return None + + def extract_id_from_url(self, url: str) -> Optional[Tuple[str, str]]: + """ + Extracts username from url. + It's outdated, detects only a format of https://example.com/{username} + """ + if not self.url_regexp: + return None + + match_groups = self.url_regexp.match(url) + if not match_groups: + return None + _id = next( + ( + group.rstrip("/") + for group in reversed(match_groups.groups()) + if isinstance(group, str) and group + ), + None, + ) + if _id is None: + return None + _type = self.type + + return _id, _type + + @property + def pretty_name(self): + if self.source: + return f"{self.name} [{self.source}]" + return self.name + + @property + def json(self): + result = {} + for k, v in self.__dict__.items(): + # convert to camelCase + field = CaseConverter.snake_to_camel(k) + # strip empty elements + if v in (False, "", [], {}, None, sys.maxsize, "username"): + continue + if field in self.NOT_SERIALIZABLE_FIELDS: + continue + result[field] = v + + return result + + @property + def errors_dict(self) -> dict: + errors: Dict[str, str] = {} + if self.engine_obj: + errors.update(self.engine_obj.site.get('errors', {})) + errors.update(self.errors) + return errors + + def get_url_template(self) -> str: + url = URLMatcher.extract_main_part(self.url) + if url.startswith("{username}"): + url = "SUBDOMAIN" + elif url == "": + url = f"{self.url} ({self.engine or 'no engine'})" + else: + parts = url.split("/") + url = "/" + "/".join(parts[1:]) + return url + + def update(self, updates: "dict") -> "MaigretSite": + self.__dict__.update(updates) + self.update_detectors() + + return self + + def update_from_engine(self, engine: MaigretEngine) -> "MaigretSite": + engine_data = engine.site + for k, v in engine_data.items(): + field = CaseConverter.camel_to_snake(k) + if isinstance(v, dict): + # update dicts like errors + target = self.__dict__.get(field, {}) + for item_key, item_value in v.items(): + if item_key in target and target[item_key] != item_value: + logger.warning( + "Engine %s overrides %s.%s for site %s", + engine.name, + field, + item_key, + self.name, + ) + target.update(v) + elif isinstance(v, list): + self.__dict__[field] = self.__dict__.get(field, []) + v + else: + self.__dict__[field] = v + + self.engine_obj = engine + self.update_detectors() + + return self + + def strip_engine_data(self) -> "MaigretSite": + if not self.engine_obj: + return self + + self.request_future = None + self.url_regexp = None + + self_copy = copy.deepcopy(self) + engine_data = self_copy.engine_obj and self_copy.engine_obj.site or {} + site_data_keys = list(self_copy.__dict__.keys()) + + for k in engine_data.keys(): + field = CaseConverter.camel_to_snake(k) + is_exists = field in site_data_keys + # remove dict keys + if isinstance(engine_data[k], dict) and is_exists: + for f in engine_data[k].keys(): + if f in self_copy.__dict__[field]: + del self_copy.__dict__[field][f] + continue + # remove list items + if isinstance(engine_data[k], list) and is_exists: + for f in engine_data[k]: + if f in self_copy.__dict__[field]: + self_copy.__dict__[field].remove(f) + continue + if is_exists: + del self_copy.__dict__[field] + + return self_copy + + +class MaigretDatabase: + def __init__(self): + self._tags: list = [] + self._sites: list = [] + self._engines: list = [] + + @property + def sites(self): + return self._sites + + @property + def sites_dict(self): + return {site.name: site for site in self._sites} + + def has_site(self, site: MaigretSite): + for s in self._sites: + if site == s: + return True + return False + + def __contains__(self, site): + return self.has_site(site) + + def ranked_sites_dict( + self, + reverse=False, + top=sys.maxsize, + tags=[], + excluded_tags=[], + names=[], + disabled=True, + id_type="username", + ): + """ + Ranking and filtering of the sites list + + When ``top`` is limited (not "all sites"), **mirrors** may be appended after + the Alexa-ranked slice. A mirror is any filtered site with a non-empty + ``source`` field equal to the name of a site that appears in the first + ``top`` positions of a **parent ranking** that includes disabled sites. + Thus mirrors such as third-party viewers (e.g. for Twitter or Instagram) + are still scanned when their parent platform ranks highly, even if the + official site is disabled and omitted from the main list. + + Args: + reverse (bool, optional): Reverse the sorting order. Defaults to False. + top (int, optional): Maximum number of sites to return. Defaults to sys.maxsize. + tags (list, optional): List of tags to filter sites by (whitelist). Defaults to empty list. + excluded_tags (list, optional): List of tags to exclude sites by (blacklist). Defaults to empty list. + names (list, optional): List of site names (or urls, see MaigretSite.__eq__) to filter by. Defaults to empty list. + disabled (bool, optional): Whether to include disabled sites. Defaults to True. + id_type (str, optional): Type of identifier to filter by. Defaults to "username". + + Returns: + dict: Dictionary of filtered and ranked sites (base top slice plus mirrors), + with site names as keys and MaigretSite objects as values + """ + normalized_names = list(map(str.lower, names)) + normalized_tags = list(map(str.lower, tags)) + normalized_excluded_tags = list(map(str.lower, excluded_tags)) + + is_name_ok = lambda x: x.name.lower() in normalized_names + is_source_ok = lambda x: x.source and x.source.lower() in normalized_names + is_engine_ok = ( + lambda x: isinstance(x.engine, str) and x.engine.lower() in normalized_tags + ) + is_tags_ok = lambda x: set(map(str.lower, x.tags)).intersection( + set(normalized_tags) + ) + is_protocol_in_tags = lambda x: x.protocol and x.protocol in normalized_tags + is_disabled_needed = lambda x: not x.disabled or ( + "disabled" in tags or disabled + ) + is_id_type_ok = lambda x: x.type == id_type + + is_excluded_by_tag = lambda x: set(map(str.lower, x.tags)).intersection( + set(normalized_excluded_tags) + ) + is_excluded_by_engine = lambda x: ( + isinstance(x.engine, str) and x.engine.lower() in normalized_excluded_tags + ) + is_excluded_by_protocol = lambda x: ( + x.protocol and x.protocol in normalized_excluded_tags + ) + is_not_excluded = lambda x: not excluded_tags or not ( + is_excluded_by_tag(x) + or is_excluded_by_engine(x) + or is_excluded_by_protocol(x) + ) + + filter_tags_engines_fun = ( + lambda x: not tags + or is_engine_ok(x) + or is_tags_ok(x) + or is_protocol_in_tags(x) + ) + filter_names_fun = lambda x: not names or is_name_ok(x) or is_source_ok(x) + + filter_fun = ( + lambda x: filter_tags_engines_fun(x) + and is_not_excluded(x) + and filter_names_fun(x) + and is_disabled_needed(x) + and is_id_type_ok(x) + ) + + filtered_list = [s for s in self.sites if filter_fun(s)] + + sorted_list = sorted( + filtered_list, key=lambda x: x.alexa_rank, reverse=reverse + )[:top] + + # Mirrors: sites whose `source` matches a parent platform that ranks in the + # top `top` by Alexa when disabled entries are included in the ranking pool + # (so e.g. Instagram can be a parent for Picuki even if Instagram is disabled). + if top < sys.maxsize and sorted_list: + filter_fun_ranking_parents = ( + lambda x: filter_tags_engines_fun(x) + and is_not_excluded(x) + and filter_names_fun(x) + and is_id_type_ok(x) + ) + ranking_pool = [s for s in self.sites if filter_fun_ranking_parents(s)] + sorted_parents = sorted( + ranking_pool, key=lambda x: x.alexa_rank, reverse=reverse + )[:top] + parent_names_lower = {s.name.lower() for s in sorted_parents} + base_names = {s.name for s in sorted_list} + + def is_mirror(s) -> bool: + if not s.source or s.name in base_names: + return False + return s.source.lower() in parent_names_lower + + mirrors = [s for s in filtered_list if is_mirror(s)] + mirrors.sort(key=lambda x: (x.alexa_rank, x.name)) + sorted_list = list(sorted_list) + mirrors + + return {site.name: site for site in sorted_list} + + @property + def engines(self): + return self._engines + + @property + def engines_dict(self): + return {engine.name: engine for engine in self._engines} + + def update_site(self, site: MaigretSite) -> "MaigretDatabase": + for i, s in enumerate(self._sites): + if s.name == site.name: + self._sites[i] = site + return self + + self._sites.append(site) + return self + + def save_to_file(self, filename: str) -> "MaigretDatabase": + if '://' in filename: + return self + + db_data = { + "sites": {site.name: site.strip_engine_data().json for site in self._sites}, + "engines": {engine.name: engine.json for engine in self._engines}, + "tags": self._tags, + } + + json_data = json.dumps(db_data, indent=4, ensure_ascii=False) + + with open(filename, "w", encoding="utf-8") as f: + f.write(json_data) + + return self + + def load_from_json(self, json_data: dict) -> "MaigretDatabase": + # Add all of site information from the json file to internal site list. + site_data = json_data.get("sites", {}) + engines_data = json_data.get("engines", {}) + tags = json_data.get("tags", []) + + self._tags += tags + + for engine_name in engines_data: + self._engines.append(MaigretEngine(engine_name, engines_data[engine_name])) + + for site_name in site_data: + try: + maigret_site = MaigretSite(site_name, site_data[site_name]) + + engine = site_data[site_name].get("engine") + if engine: + maigret_site.update_from_engine(self.engines_dict[engine]) + + self._sites.append(maigret_site) + except KeyError as error: + raise ValueError( + f"Problem parsing json content for site {site_name}: " + f"Missing attribute {str(error)}." + ) + + return self + + def load_from_str(self, db_str: "str") -> "MaigretDatabase": + try: + data = json.loads(db_str) + except Exception as error: + raise ValueError( + f"Problem parsing json contents from str" + f"'{db_str[:50]}'...: {str(error)}." + ) + + return self.load_from_json(data) + + def load_from_path(self, path: str) -> "MaigretDatabase": + if '://' in path: + return self.load_from_http(path) + else: + return self.load_from_file(path) + + def load_from_http(self, url: str) -> "MaigretDatabase": + is_url_valid = url.startswith("http://") or url.startswith("https://") + + if not is_url_valid: + raise FileNotFoundError(f"Invalid data file URL '{url}'.") + + import requests + + try: + response = requests.get(url=url) + except Exception as error: + raise FileNotFoundError( + f"Problem while attempting to access " + f"data file URL '{url}': " + f"{str(error)}" + ) + + if response.status_code == 200: + try: + data = response.json() + except Exception as error: + raise ValueError( + f"Problem parsing json contents at " f"'{url}': {str(error)}." + ) + else: + raise FileNotFoundError( + f"Bad response while accessing " f"data file URL '{url}'." + ) + + return self.load_from_json(data) + + def load_from_file(self, filename: "str") -> "MaigretDatabase": + try: + with open(filename, "r", encoding="utf-8") as file: + try: + data = json.load(file) + except Exception as error: + raise ValueError( + f"Problem parsing json contents from " + f"file '{filename}': {str(error)}." + ) + except FileNotFoundError as error: + raise FileNotFoundError( + f"Problem while attempting to access " f"data file '{filename}'." + ) from error + + return self.load_from_json(data) + + def get_scan_stats(self, sites_dict): + sites = sites_dict or self.sites_dict + found_flags: Dict[str, int] = {} + for _, s in sites.items(): + if "presense_flag" in s.stats: + flag = s.stats["presense_flag"] + found_flags[flag] = found_flags.get(flag, 0) + 1 + + return found_flags + + def extract_ids_from_url(self, url: str) -> dict: + results = {} + for s in self._sites: + result = s.extract_id_from_url(url) + if not result: + continue + _id, _type = result + results[_id] = _type + return results + + def get_db_stats(self, is_markdown=False): + # Initialize counters + sites_dict = self.sites_dict + urls: Dict[str, int] = {} + tags: Dict[str, int] = {} + engine_total: Dict[str, int] = {} + engine_enabled: Dict[str, int] = {} + disabled_count = 0 + message_checks_one_factor = 0 + status_checks = 0 + + # Collect statistics + for site in sites_dict.values(): + # Count disabled sites + if site.disabled: + disabled_count += 1 + + # Count URL types + url_type = site.get_url_template() + urls[url_type] = urls.get(url_type, 0) + 1 + + # Count check types for enabled sites + if not site.disabled: + if site.check_type == 'message': + if not (site.absence_strs and site.presense_strs): + message_checks_one_factor += 1 + elif site.check_type == 'status_code': + status_checks += 1 + + # Count engines + if site.engine: + engine_total[site.engine] = engine_total.get(site.engine, 0) + 1 + if not site.disabled: + engine_enabled[site.engine] = engine_enabled.get(site.engine, 0) + 1 + + # Count tags + if not site.tags: + tags["NO_TAGS"] = tags.get("NO_TAGS", 0) + 1 + for tag in filter(lambda x: not is_country_tag(x), site.tags): + tags[tag] = tags.get(tag, 0) + 1 + + # Calculate percentages + total_count = len(sites_dict) + enabled_count = total_count - disabled_count + enabled_perc = round(100 * enabled_count / total_count, 2) + checks_perc = round(100 * message_checks_one_factor / enabled_count, 2) + status_checks_perc = round(100 * status_checks / enabled_count, 2) + + # Sites with probing and activation (kinda special cases, let's watch them) + site_with_probing = [] + site_with_activation = [] + for site in sites_dict.values(): + + def get_site_label(site): + return f"{site.name}{' (disabled)' if site.disabled else ''}" + + if site.url_probe: + site_with_probing.append(get_site_label(site)) + if site.activation: + site_with_activation.append(get_site_label(site)) + + # Format output + separator = "\n\n" + output = [ + f"Enabled/total sites: {enabled_count}/{total_count} = {enabled_perc}%", + f"Incomplete message checks: {message_checks_one_factor}/{enabled_count} = {checks_perc}% (false positive risks)", + f"Status code checks: {status_checks}/{enabled_count} = {status_checks_perc}% (false positive risks)", + f"False positive risk (total): {checks_perc + status_checks_perc:.2f}%", + f"Sites with probing: {', '.join(sorted(site_with_probing))}", + f"Sites with activation: {', '.join(sorted(site_with_activation))}", + self._format_top_items("profile URLs", urls, 20, is_markdown), + self._format_engine_stats(engine_total, engine_enabled, is_markdown), + self._format_top_items("tags", tags, 20, is_markdown, self._tags), + ] + + return separator.join(output) + + def _format_engine_stats(self, engine_total, engine_enabled, is_markdown): + """Format per-engine enabled/total counts, sorted by total descending.""" + output = "Sites by engine:\n" + for engine, total in sorted( + engine_total.items(), key=lambda x: x[1], reverse=True + ): + enabled = engine_enabled.get(engine, 0) + perc = round(100 * enabled / total, 1) if total else 0.0 + if is_markdown: + output += f"- `{engine}`: {enabled}/{total} ({perc}%)\n" + else: + output += f"{enabled}/{total} ({perc}%)\t{engine}\n" + return output + + def _format_top_items( + self, title, items_dict, limit, is_markdown, valid_items=None + ): + """Helper method to format top items lists""" + output = f"Top {limit} {title}:\n" + for item, count in sorted(items_dict.items(), key=lambda x: x[1], reverse=True)[ + :limit + ]: + if count == 1: + break + mark = ( + " (non-standard)" + if valid_items is not None and item not in valid_items + else "" + ) + output += ( + f"- ({count})\t`{item}`{mark}\n" + if is_markdown + else f"{count}\t{item}{mark}\n" + ) + return output diff --git a/maigret/submit.py b/maigret/submit.py new file mode 100644 index 0000000..2893c47 --- /dev/null +++ b/maigret/submit.py @@ -0,0 +1,624 @@ +import asyncio +import json +import re +import os +import logging +from typing import Any, Dict, List, Optional, Tuple +from urllib.parse import urlparse + +from aiohttp import ClientSession, TCPConnector +from colorama import Fore, Style + +from .activation import import_aiohttp_cookies +from .result import MaigretCheckResult +from .settings import Settings +from .sites import MaigretDatabase, MaigretEngine, MaigretSite +from .utils import get_random_user_agent +from .checking import site_self_check +from .utils import get_match_ratio, generate_random_username + + +class Submitter: + HEADERS = { + "User-Agent": get_random_user_agent(), + } + + SEPARATORS = "\"'\n" + + RATIO = 0.6 + TOP_FEATURES = 5 + URL_RE = re.compile(r"https?://(www\.)?") + + def __init__(self, db: MaigretDatabase, settings: Settings, logger, args): + self.settings = settings + self.args = args + self.db = db + self.logger = logger + + from aiohttp_socks import ProxyConnector + + proxy = self.args.proxy + cookie_jar = None + if args.cookie_file: + if not os.path.exists(args.cookie_file): + logger.error(f"Cookie file {args.cookie_file} does not exist!") + else: + cookie_jar = import_aiohttp_cookies(args.cookie_file) + + ssl_context = __import__('ssl').create_default_context() + ssl_context.check_hostname = False + ssl_context.verify_mode = __import__('ssl').CERT_NONE + connector = ProxyConnector.from_url(proxy) if proxy else TCPConnector(ssl=ssl_context) + self.session = ClientSession( + connector=connector, trust_env=True, cookie_jar=cookie_jar + ) + + async def close(self): + await self.session.close() + + async def site_self_check(self, site, semaphore, silent=False): + # Call the general function from the checking.py + changes = await site_self_check( + site=site, + logger=self.logger, + semaphore=semaphore, + db=self.db, + silent=silent, + proxy=self.args.proxy, + cookies=self.args.cookie_file, + # Don't skip errors in submit mode - we need check both false positives/true negatives + skip_errors=False, + cloudflare_bypass=getattr(self, 'cloudflare_bypass', None), + ) + return changes + + def generate_additional_fields_dialog(self, engine: MaigretEngine, dialog): + fields = {} + if 'urlSubpath' in engine.site.get('url', ''): + msg = ( + 'Detected engine suppose additional URL subpath using (/forum/, /blog/, etc). ' + 'Enter in manually if it exists: ' + ) + subpath = input(msg).strip('/') + if subpath: + fields['urlSubpath'] = f'/{subpath}' + return fields + + async def detect_known_engine( + self, url_exists, url_mainpage, session, follow_redirects, headers + ) -> Tuple[List[MaigretSite], str]: + + session = session or self.session + resp_text, _ = await self.get_html_response_to_compare( + url_exists, session, follow_redirects, headers + ) + + for engine in self.db.engines: + strs_to_check = engine.__dict__.get("presenseStrs") + if strs_to_check and resp_text: + all_strs_in_response = True + for s in strs_to_check: + if s not in resp_text: + all_strs_in_response = False + sites = [] + if all_strs_in_response: + engine_name = engine.__dict__.get("name") + + print(f"Detected engine {engine_name} for site {url_mainpage}") + + usernames_to_check = self.settings.supposed_usernames + supposed_username = self.extract_username_dialog(url_exists) + if supposed_username: + usernames_to_check = [supposed_username] + usernames_to_check + + add_fields = self.generate_additional_fields_dialog( + engine, url_exists + ) + + for u in usernames_to_check: + site_data = { + "urlMain": url_mainpage, + "name": url_mainpage.split("//")[1].split("/")[0], + "engine": engine_name, + "usernameClaimed": u, + "usernameUnclaimed": "noonewouldeverusethis7", + **add_fields, + } + self.logger.info(site_data) + + maigret_site = MaigretSite( + url_mainpage.split("/")[-1], site_data + ) + maigret_site.update_from_engine( + self.db.engines_dict[engine_name] + ) + sites.append(maigret_site) + + return sites, resp_text + + return [], resp_text + + @staticmethod + def extract_username_dialog(url): + url_parts = url.rstrip("/").split("/") + supposed_username = url_parts[-1].strip('@') + entered_username = input( + f"{Fore.GREEN}[?] Is \"{supposed_username}\" a valid username? If not, write it manually: {Style.RESET_ALL}" + ) + return entered_username if entered_username else supposed_username + + # TODO: replace with checking.py/SimpleAiohttpChecker call + @staticmethod + async def get_html_response_to_compare( + url: str, session: Optional[ClientSession] = None, redirects=False, headers: Optional[Dict] = None + ): + assert session is not None, "session must not be None" + async with session.get( + url, allow_redirects=redirects, headers=headers + ) as response: + # Try different encodings or fallback to 'ignore' errors + try: + html_response = await response.text(encoding='utf-8') + except UnicodeDecodeError: + try: + html_response = await response.text(encoding='latin1') + except UnicodeDecodeError: + html_response = await response.text(errors='ignore') + return html_response, response.status + + async def check_features_manually( + self, + username: str, + url_exists: str, + cookie_filename="", # TODO: use cookies + session: Optional[ClientSession] = None, + follow_redirects=False, + headers: Optional[dict] = None, + ) -> Tuple[Optional[List[str]], Optional[List[str]], str, str]: + + random_username = generate_random_username() + url_of_non_existing_account = url_exists.lower().replace( + username.lower(), random_username + ) + + try: + session = session or self.session + first_html_response, first_status = await self.get_html_response_to_compare( + url_exists, session, follow_redirects, headers + ) + second_html_response, second_status = ( + await self.get_html_response_to_compare( + url_of_non_existing_account, session, follow_redirects, headers + ) + ) + await session.close() + except Exception as e: + self.logger.error( + f"Error while getting HTTP response for username {username}: {e}", + exc_info=True, + ) + return None, None, str(e), random_username + + self.logger.info(f"URL with existing account: {url_exists}") + self.logger.info( + f"HTTP response status for URL with existing account: {first_status}" + ) + self.logger.info( + f"HTTP response length URL with existing account: {len(first_html_response)}" + ) + self.logger.debug(first_html_response) + + self.logger.info(f"URL with existing account: {url_of_non_existing_account}") + self.logger.info( + f"HTTP response status for URL with non-existing account: {second_status}" + ) + self.logger.info( + f"HTTP response length URL with non-existing account: {len(second_html_response)}" + ) + self.logger.debug(second_html_response) + + # TODO: filter by errors, move to dialog function + if ( + "/cdn-cgi/challenge-platform" in first_html_response + or "\t\t\t\tnow: " in first_html_response + or "Sorry, you have been blocked" in first_html_response + ): + self.logger.info("Cloudflare detected, skipping") + return None, None, "Cloudflare detected, skipping", random_username + + tokens_a = set(re.split(f'[{self.SEPARATORS}]', first_html_response)) + tokens_b = set(re.split(f'[{self.SEPARATORS}]', second_html_response)) + + a_minus_b: List[str] = [x.strip('\\') for x in tokens_a.difference(tokens_b)] + b_minus_a: List[str] = [x.strip('\\') for x in tokens_b.difference(tokens_a)] + + # Filter out strings containing usernames + a_minus_b = [s for s in a_minus_b if username.lower() not in s.lower()] + b_minus_a = [s for s in b_minus_a if random_username.lower() not in s.lower()] + + def filter_tokens(token: str, html_response: str) -> bool: + is_in_html = token in html_response + is_long_str = len(token) >= 50 + is_number = re.match(r'^\d\.?\d+$', token) or re.match(r':^\d+$', token) + is_whitelisted_number = token in ['200', '404', '403'] + + return not ( + is_in_html or is_long_str or (is_number and not is_whitelisted_number) + ) + + a_minus_b = list( + filter(lambda t: filter_tokens(t, second_html_response), a_minus_b) + ) + b_minus_a = list( + filter(lambda t: filter_tokens(t, first_html_response), b_minus_a) + ) + + if len(a_minus_b) == len(b_minus_a) == 0: + return ( + None, + None, + "HTTP responses for pages with existing and non-existing accounts are the same", + random_username, + ) + + match_fun = get_match_ratio(self.settings.presence_strings) + + presence_list = sorted(a_minus_b, key=match_fun, reverse=True)[ + : self.TOP_FEATURES + ] + absence_list = sorted(b_minus_a, key=match_fun, reverse=True)[ + : self.TOP_FEATURES + ] + + self.logger.info(f"Detected presence features: {presence_list}") + self.logger.info(f"Detected absence features: {absence_list}") + + return presence_list, absence_list, "Found", random_username + + async def add_site(self, site): + sem = asyncio.Semaphore(1) + print( + f"{Fore.BLUE}{Style.BRIGHT}[*] Adding site {site.name}, let's check it...{Style.RESET_ALL}" + ) + + result = await self.site_self_check(site, sem) + if result["disabled"]: + print(f"Checks failed for {site.name}, please, verify them manually.") + return { + "valid": False, + "reason": "checks_failed", + } + + while True: + print("\nAvailable fields to edit:") + editable_fields = { + '1': 'name', + '2': 'tags', + '3': 'url', + '4': 'url_main', + '5': 'username_claimed', + '6': 'username_unclaimed', + '7': 'presense_strs', + '8': 'absence_strs', + } + + for num, field in editable_fields.items(): + current_value = getattr(site, field) + print(f"{num}. {field} (current: {current_value})") + + print("0. finish editing") + print("10. reject and block domain") + print("11. invalid params, remove") + + choice = input("\nSelect field number to edit (0-8): ").strip() + + if choice == '0': + break + + if choice == '10': + return { + "valid": False, + "reason": "manual block", + } + + if choice == '11': + return { + "valid": False, + "reason": "remove", + } + + if choice in editable_fields: + field = editable_fields[choice] + current_value = getattr(site, field) + new_value = input( + f"Enter new value for {field} (current: {current_value}): " + ).strip() + + if field in ['tags', 'presense_strs', 'absence_strs']: + new_value = list(map(str.strip, new_value.split(','))) # type: ignore[assignment] + + if new_value: + setattr(site, field, new_value) + print(f"Updated {field} to: {new_value}") + + self.logger.info(site.json) + self.db.update_site(site) + return { + "valid": True, + } + + async def dialog(self, url_exists, cookie_file): + """ + An implementation of the submit mode: + - User provides a URL of a existing social media account + - Maigret tries to detect the site engine and understand how to check + for account presence with HTTP responses analysis + - If detection succeeds, Maigret generates a new site entry/replace old one in the database + """ + old_site = None + additional_options_enabled = self.logger.level in ( + logging.DEBUG, + logging.WARNING, + ) + + domain_raw = self.URL_RE.sub("", url_exists).strip().strip("/") + domain_raw = domain_raw.split("/")[0] + self.logger.info('Domain is %s', domain_raw) + + # check for existence + domain_re = re.compile( + r'://(www\.)?' + re.escape(domain_raw) + r'(/|$)' + ) + matched_sites = list( + filter( + lambda x: domain_re.search(x.url_main + x.url), self.db.sites + ) + ) + + if matched_sites: + # TODO: update the existing site + print( + f"{Fore.YELLOW}[!] Sites with domain \"{domain_raw}\" already exists in the Maigret database!{Style.RESET_ALL}" + ) + + site_status = lambda s: "(disabled)" if s.disabled else "" + url_block = lambda s: f"\n\t{s.url_main}\n\t{s.url}" + print( + "\n".join( + [ + f"{site.name} {site_status(site)}{url_block(site)}" + for site in matched_sites + ] + ) + ) + + if ( + input( + f"{Fore.GREEN}[?] Do you want to continue? [yN] {Style.RESET_ALL}" + ).lower() + in "n" + ): + return False + + site_names = [site.name for site in matched_sites] + site_name = ( + input( + f"{Fore.GREEN}[?] Which site do you want to update in case of success? 1st by default. [{', '.join(site_names)}] {Style.RESET_ALL}" + ) + or matched_sites[0].name + ) + old_site = next( + (site for site in matched_sites if site.name == site_name), None + ) + if old_site is None: + print( + f'{Fore.RED}[!] Site "{site_name}" not found in the matched list. Proceeding without updating an existing site.{Style.RESET_ALL}' + ) + else: + print( + f'{Fore.GREEN}[+] We will update site "{old_site.name}" in case of success.{Style.RESET_ALL}' + ) + + # Check if the site check is ordinary or not + if old_site and (old_site.url_probe or old_site.activation): + skip = input( + f"{Fore.RED}[!] The site check depends on activation / probing mechanism! Consider to update it manually. Continue? [yN]{Style.RESET_ALL}" + ) + if skip.lower() in ['n', '']: + return False + + # TODO: urlProbe support + # TODO: activation support + + parsed = urlparse(url_exists) + url_mainpage = f"{parsed.scheme}://{parsed.netloc}" + + # headers update + custom_headers = dict(self.HEADERS) + while additional_options_enabled: + header_key = input( + f'{Fore.GREEN}[?] Specify custom header if you need or just press Enter to skip. Header name: {Style.RESET_ALL}' + ) + if not header_key: + break + header_value = input(f'{Fore.GREEN}[?] Header value: {Style.RESET_ALL}') + custom_headers[header_key.strip()] = header_value.strip() + + # redirects settings update + redirects = False + if additional_options_enabled: + redirects = ( + 'y' + in input( + f'{Fore.GREEN}[?] Should we do redirects automatically? [yN] {Style.RESET_ALL}' + ).lower() + ) + + print('Detecting site engine, please wait...') + sites: List[MaigretSite] = [] + text = None + try: + sites, text = await self.detect_known_engine( + url_exists, + url_exists, + session=None, + follow_redirects=redirects, + headers=custom_headers, + ) + except KeyboardInterrupt: + print('Engine detect process is interrupted.') + + if not sites: + print("Unable to detect site engine, lets generate checking features") + + supposed_username = self.extract_username_dialog(url_exists) + self.logger.info(f"Supposed username: {supposed_username}") + + # TODO: pass status_codes + # check it here and suggest to enable / auto-enable redirects + presence_list, absence_list, status, non_exist_username = ( + await self.check_features_manually( + username=supposed_username, + url_exists=url_exists, + cookie_filename=cookie_file, + follow_redirects=redirects, + headers=custom_headers, + ) + ) + + if status == "Found": + site_data = { + "absenceStrs": absence_list, + "presenseStrs": presence_list, + "url": url_exists.replace(supposed_username, '{username}'), + "urlMain": url_mainpage, + "usernameClaimed": supposed_username, + "usernameUnclaimed": non_exist_username, + "headers": custom_headers, + "checkType": "message", + } + self.logger.info(json.dumps(site_data, indent=4)) + + if custom_headers != self.HEADERS: + site_data['headers'] = custom_headers + + site = MaigretSite(url_mainpage.split("/")[-1], site_data) + sites.append(site) + + else: + print( + f"{Fore.RED}[!] The check for site failed! Reason: {status}{Style.RESET_ALL}" + ) + return False + + self.logger.debug(sites[0].__dict__) + + sem = asyncio.Semaphore(1) + + print(f"{Fore.GREEN}[*] Checking, please wait...{Style.RESET_ALL}") + found = False + chosen_site = None + for s in sites: + chosen_site = s + result = await self.site_self_check(s, sem) + if not result["disabled"]: + found = True + break + + assert chosen_site is not None, "No sites to check" + + if not found: + print( + f"{Fore.RED}[!] The check for site '{chosen_site.name}' failed!{Style.RESET_ALL}" + ) + print( + "Try to run this mode again and increase features count or choose others." + ) + self.logger.debug(json.dumps(chosen_site.json)) + return False + else: + if ( + input( + f"{Fore.GREEN}[?] Site {chosen_site.name} successfully checked. Do you want to save it in the Maigret DB? [Yn] {Style.RESET_ALL}" + ) + .lower() + .strip("y") + ): + return False + + if self.args.verbose: + self.logger.info( + "Verbose mode is enabled, additional settings are available" + ) + source = input( + f"{Fore.GREEN}[?] Name the source site if it is mirror: {Style.RESET_ALL}" + ) + if source: + chosen_site.source = source + + default_site_name = old_site.name if old_site else chosen_site.name + new_name = ( + input( + f"{Fore.GREEN}[?] Change site name if you want [{default_site_name}]: {Style.RESET_ALL}" + ) + or default_site_name + ) + if new_name != default_site_name: + self.logger.info(f"New site name is {new_name}") + chosen_site.name = new_name + + default_tags_str = "" + if old_site: + default_tags_str = f' [{", ".join(old_site.tags)}]' + + new_tags = input( + f"{Fore.GREEN}[?] Site tags{default_tags_str}: {Style.RESET_ALL}" + ) + if new_tags: + chosen_site.tags = list(map(str.strip, new_tags.split(','))) + else: + chosen_site.tags = [] + self.logger.info(f"Site tags are: {', '.join(chosen_site.tags)}") + + self.logger.info(chosen_site.json) + stripped_site = chosen_site.strip_engine_data() + self.logger.info(stripped_site.json) + + if old_site: + # Update old site with new values and log changes + fields_to_check = { + 'url': 'URL', + 'url_main': 'Main URL', + 'username_claimed': 'Username claimed', + 'username_unclaimed': 'Username unclaimed', + 'check_type': 'Check type', + 'presense_strs': 'Presence strings', + 'absence_strs': 'Absence strings', + 'tags': 'Tags', + 'source': 'Source', + 'headers': 'Headers', + } + + for field, display_name in fields_to_check.items(): + old_value = getattr(old_site, field) + new_value = getattr(stripped_site, field) + if field == 'tags' and not new_tags: + continue + if str(old_value) != str(new_value): + print( + f"{Fore.YELLOW}[*] '{display_name}' updated: {Fore.RED}{old_value} {Fore.YELLOW}to {Fore.GREEN}{new_value}{Style.RESET_ALL}" + ) + old_site.__dict__[field] = new_value + + # update the site + final_site = old_site if old_site else stripped_site + self.db.update_site(final_site) + + # save the db in file + if self.args.db_file != self.settings.sites_db_path: + print( + f"{Fore.GREEN}[+] Maigret DB is saved to {self.args.db}.{Style.RESET_ALL}" + ) + self.db.save_to_file(self.args.db) + + return True diff --git a/maigret/utils.py b/maigret/utils.py new file mode 100644 index 0000000..7b215ee --- /dev/null +++ b/maigret/utils.py @@ -0,0 +1,196 @@ +# coding: utf8 +import ast +import difflib +import re +import random +import string +from typing import Any + +from markupsafe import Markup, escape + + +DEFAULT_USER_AGENTS = [ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36", +] + + +class CaseConverter: + @staticmethod + def camel_to_snake(camelcased_string: str) -> str: + return re.sub(r"(? str: + formatted = "".join(word.title() for word in snakecased_string.split("_")) + result = formatted[0].lower() + formatted[1:] + return result + + @staticmethod + def snake_to_title(snakecased_string: str) -> str: + words = snakecased_string.split("_") + words[0] = words[0].title() + return " ".join(words) + + +def is_country_tag(tag: str) -> bool: + """detect if tag represent a country""" + return bool(re.match("^([a-zA-Z]){2}$", tag)) or tag == "global" + + +def enrich_link_str(link: str) -> str: + link = link.strip() + if link.startswith("www.") or (link.startswith("http") and "//" in link): + # escape the link to avoid XSS; Markup keeps the tag itself intact + # under the template's autoescaping. + safe = escape(link) + return Markup(f'{safe}') + return link + + +class URLMatcher: + _HTTP_URL_RE_STR = r"^https?://(www\.|m\.)?(.+)$" + HTTP_URL_RE = re.compile(_HTTP_URL_RE_STR) + UNSAFE_SYMBOLS = ".?" + + @classmethod + def extract_main_part(self, url: str) -> str: + match = self.HTTP_URL_RE.search(url) + if match and match.group(2): + return match.group(2).rstrip("/") + + return "" + + @classmethod + def make_profile_url_regexp(self, url: str, username_regexp: str = ""): + url_main_part = self.extract_main_part(url) + for c in self.UNSAFE_SYMBOLS: + url_main_part = url_main_part.replace(c, f"\\{c}") + prepared_username_regexp = (username_regexp or ".+?").lstrip('^').rstrip('$') + + url_regexp = url_main_part.replace( + "{username}", f"({prepared_username_regexp})" + ) + regexp_str = self._HTTP_URL_RE_STR.replace("(.+)", url_regexp) + + return re.compile(regexp_str, re.IGNORECASE) + + +def ascii_data_display(data: str) -> Any: + try: + return ast.literal_eval(data) + except (ValueError, SyntaxError): + return data + + +def get_dict_ascii_tree(items, prepend="", new_line=True): + new_result = b'\xe2\x94\x9c'.decode() + h_line = b'\xe2\x94\x80'.decode() + last_result = b'\xe2\x94\x94'.decode() + skip_result = b'\xe2\x94\x82'.decode() + + text = "" + for num, item in enumerate(items): + box_symbol = ( + new_result + h_line if num != len(items) - 1 else last_result + h_line + ) + + if isinstance(item, tuple): + field_name, field_value = item + if field_value.startswith("['"): + is_last_item = num == len(items) - 1 + prepend_symbols = " " * 3 if is_last_item else f" {skip_result} " + data = ascii_data_display(field_value) + field_value = get_dict_ascii_tree(data, prepend_symbols) + text += f"\n{prepend}{box_symbol}{field_name}: {field_value}" + else: + text += f"\n{prepend}{box_symbol} {item}" + + if not new_line: + text = text[1:] + + return text + + +def get_random_user_agent(): + return random.choice(DEFAULT_USER_AGENTS) + + +def get_match_ratio(base_strs: list): + def get_match_inner(s: str): + return round( + max( + [ + difflib.SequenceMatcher(a=s.lower(), b=s2.lower()).ratio() + for s2 in base_strs + ] + ), + 2, + ) + + return get_match_inner + + +def generate_random_username(): + return ''.join(random.choices(string.ascii_lowercase, k=10)) + + +def is_plausible_username(value: Any) -> bool: + """Reject obviously non-username strings extracted from sites' identity data. + + Extractor schemes occasionally populate fields named like ``*_username`` + with URLs (e.g. ``instagram_username`` -> ``https://instagram.com/X``) or + emails (e.g. ``your_username`` -> ``user@example.com``). Feeding such a + value back into a site URL template produces broken requests on every + subsequent site, which manifests as a cascade of false errors and the + "wrong username" symptom in #1403. + """ + if not isinstance(value, str): + return False + s = value.strip() + if not s: + return False + if "://" in s or s.startswith(("http://", "https://", "www.", "//")): + return False + if "/" in s: + return False + if any(c.isspace() for c in s): + return False + if "@" in s and "." in s: + return False + return True + + +def extract_usernames(info, logger): + """Extract plausible usernames from socid_extractor results. + + Supports single username fields (e.g. ``profile_username``) and + serialized username lists (e.g. ``other_usernames``). Invalid values + such as URLs or emails are rejected via ``is_plausible_username``. + """ + results = [] + + for key, value in info.items(): + if "username" in key and "usernames" not in key: + if is_plausible_username(value): + results.append(value) + else: + logger.debug( + f"Rejected non-username value extracted " + f"under key {key!r}: {value!r}" + ) + elif "usernames" in key: + try: + parsed = ast.literal_eval(value) + if isinstance(parsed, list): + for item in parsed: + if is_plausible_username(item): + results.append(item) + else: + logger.debug( + f"Rejected non-username item " + f"from list under key {key!r}: {item!r}" + ) + except Exception as e: + logger.warning(e) + + return results diff --git a/maigret/web/app.py b/maigret/web/app.py new file mode 100644 index 0000000..73d00fd --- /dev/null +++ b/maigret/web/app.py @@ -0,0 +1,378 @@ +from flask import ( + Flask, + render_template, + request, + send_from_directory, + Response, + flash, + redirect, + url_for, +) +from werkzeug.exceptions import NotFound +import logging +import os +import asyncio +from datetime import datetime +from threading import Thread +from typing import Any, Dict +import maigret +import maigret.settings +from maigret.checking import build_cloudflare_bypass_config +from maigret.sites import MaigretDatabase +from maigret.report import generate_report_context + +app = Flask(__name__) +# Use environment variable for secret key, generate random one if not set +app.secret_key = os.getenv('FLASK_SECRET_KEY', os.urandom(24).hex()) + +# add background job tracking +background_jobs: Dict[str, Any] = {} +job_results = {} + +# Configuration +app.config["MAIGRET_DB_FILE"] = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'resources', 'data.json') +app.config["COOKIES_FILE"] = "cookies.txt" +app.config["UPLOAD_FOLDER"] = 'uploads' +app.config["REPORTS_FOLDER"] = os.path.abspath('/tmp/maigret_reports') + + +def setup_logger(log_level, name): + logger = logging.getLogger(name) + logger.setLevel(log_level) + return logger + + +async def maigret_search(username, options): + logger = setup_logger(logging.WARNING, 'maigret') + try: + settings = maigret.settings.Settings() + settings.load() + cf_bypass_config = build_cloudflare_bypass_config(settings) + if cf_bypass_config: + modules_summary = ", ".join( + f"{m.get('name', m.get('method'))}({m.get('url')})" + for m in cf_bypass_config["modules"] + ) + logger.info( + f"Cloudflare webgate active: triggers={cf_bypass_config['trigger_protection']}, " + f"modules=[{modules_summary}]" + ) + + db = MaigretDatabase().load_from_path(app.config["MAIGRET_DB_FILE"]) + + top_sites = int(options.get('top_sites') or 500) + if options.get('all_sites'): + top_sites = 999999999 # effectively all + + tags = options.get('tags', []) + excluded_tags = options.get('excluded_tags', []) + site_list = options.get('site_list', []) + logger.info(f"Filtering sites by tags: {tags}, excluded: {excluded_tags}") + + sites = db.ranked_sites_dict( + top=top_sites, + tags=tags, + excluded_tags=excluded_tags, + names=site_list, + disabled=False, + id_type='username', + ) + + logger.info(f"Found {len(sites)} sites matching the tag criteria") + + results = await maigret.search( + username=username, + site_dict=sites, + timeout=int(options.get('timeout', 30)), + logger=logger, + id_type='username', + cookies=app.config["COOKIES_FILE"] if options.get('use_cookies') else None, + is_parsing_enabled=(not options.get('disable_extracting', False)), + recursive_search_enabled=( + not options.get('disable_recursive_search', False) + ), + check_domains=options.get('with_domains', False), + proxy=options.get('proxy', None), + tor_proxy=options.get('tor_proxy', None), + i2p_proxy=options.get('i2p_proxy', None), + cloudflare_bypass=cf_bypass_config, + ) + return results + except Exception as e: + logger.error(f"Error during search: {str(e)}") + raise + + +async def search_multiple_usernames(usernames, options): + results = [] + for username in usernames: + try: + search_results = await maigret_search(username.strip(), options) + results.append((username.strip(), 'username', search_results)) + except Exception as e: + logging.error(f"Error searching username {username}: {str(e)}") + return results + + +def sanitize_username_for_path(username: str) -> str: + """Remove path separators and dangerous components from username for safe file path usage.""" + # Replace path separators and null bytes + sanitized = username.replace('/', '_').replace('\\', '_').replace('\0', '_') + # Remove . and .. components + sanitized = sanitized.strip('.') + # If empty after sanitization, use a fallback + return sanitized or '_' + + +def process_search_task(usernames, options, timestamp): + try: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + general_results = loop.run_until_complete( + search_multiple_usernames(usernames, options) + ) + + os.makedirs(app.config["REPORTS_FOLDER"], exist_ok=True) + session_folder = os.path.join( + app.config["REPORTS_FOLDER"], f"search_{timestamp}" + ) + os.makedirs(session_folder, exist_ok=True) + + graph_path = os.path.join(session_folder, "combined_graph.html") + maigret.report.save_graph_report( + graph_path, + general_results, + MaigretDatabase().load_from_path(app.config["MAIGRET_DB_FILE"]), + ) + + individual_reports = [] + for username, id_type, results in general_results: + safe_username = sanitize_username_for_path(username) + report_base = os.path.join(session_folder, f"report_{safe_username}") + + csv_path = f"{report_base}.csv" + json_path = f"{report_base}.json" + pdf_path = f"{report_base}.pdf" + html_path = f"{report_base}.html" + + context = generate_report_context(general_results) + + maigret.report.save_csv_report(csv_path, username, results) + maigret.report.save_json_report( + json_path, username, results, report_type='ndjson' + ) + maigret.report.save_pdf_report(pdf_path, context) + maigret.report.save_html_report(html_path, context) + + claimed_profiles = [] + for site_name, site_data in results.items(): + if ( + site_data.get('status') + and site_data['status'].status + == maigret.result.MaigretCheckStatus.CLAIMED + ): + claimed_profiles.append( + { + 'site_name': site_name, + 'url': site_data.get('url_user', ''), + 'tags': ( + site_data.get('status').tags + if site_data.get('status') + else [] + ), + } + ) + + individual_reports.append( + { + 'username': username, + 'csv_file': os.path.join( + f"search_{timestamp}", f"report_{safe_username}.csv" + ), + 'json_file': os.path.join( + f"search_{timestamp}", f"report_{safe_username}.json" + ), + 'pdf_file': os.path.join( + f"search_{timestamp}", f"report_{safe_username}.pdf" + ), + 'html_file': os.path.join( + f"search_{timestamp}", f"report_{safe_username}.html" + ), + 'claimed_profiles': claimed_profiles, + } + ) + + # save results and mark job as complete using timestamp as key + job_results[timestamp] = { + 'status': 'completed', + 'session_folder': f"search_{timestamp}", + 'graph_file': os.path.join(f"search_{timestamp}", "combined_graph.html"), + 'usernames': usernames, + 'individual_reports': individual_reports, + } + + except Exception as e: + logging.error(f"Error in search task for timestamp {timestamp}: {str(e)}") + job_results[timestamp] = {'status': 'failed', 'error': str(e)} + finally: + background_jobs[timestamp]['completed'] = True + + +@app.route('/') +def index(): + # load site data for autocomplete + db = MaigretDatabase().load_from_path(app.config["MAIGRET_DB_FILE"]) + site_options = [] + + for site in db.sites: + # add main site name + site_options.append(site.name) + # add URL if different from name + if site.url_main and site.url_main not in site_options: + site_options.append(site.url_main) + + # sort and deduplicate + site_options = sorted(set(site_options)) + + return render_template('index.html', site_options=site_options) + + +# Modified search route +@app.route('/search', methods=['POST']) +def search(): + usernames_input = request.form.get('usernames', '').strip() + if not usernames_input: + flash('At least one username is required', 'danger') + return redirect(url_for('index')) + + usernames = [ + u.strip() for u in usernames_input.replace(',', ' ').split() if u.strip() + ] + + # Create timestamp for this search session + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + # Get selected tags - ensure it's a list + selected_tags = request.form.getlist('tags') + excluded_tags = request.form.getlist('excluded_tags') + logging.info(f"Selected tags: {selected_tags}, Excluded tags: {excluded_tags}") + + options = { + 'top_sites': request.form.get('top_sites') or '500', + 'timeout': request.form.get('timeout') or '30', + 'use_cookies': 'use_cookies' in request.form, + 'all_sites': 'all_sites' in request.form, + 'disable_recursive_search': 'disable_recursive_search' in request.form, + 'disable_extracting': 'disable_extracting' in request.form, + 'with_domains': 'with_domains' in request.form, + 'proxy': request.form.get('proxy', None) or None, + 'tor_proxy': request.form.get('tor_proxy', None) or None, + 'i2p_proxy': request.form.get('i2p_proxy', None) or None, + 'permute': 'permute' in request.form, + 'tags': selected_tags, # Pass selected tags as a list + 'excluded_tags': excluded_tags, # Pass excluded tags as a list + 'site_list': [ + s.strip() for s in request.form.get('site', '').split(',') if s.strip() + ], + } + + logging.info( + f"Starting search for usernames: {usernames} with tags: {selected_tags}, excluded: {excluded_tags}" + ) + + # Start background job + background_jobs[timestamp] = { + 'completed': False, + 'thread': Thread( + target=process_search_task, args=(usernames, options, timestamp) + ), + } + background_jobs[timestamp]['thread'].start() # type: ignore[union-attr] + + return redirect(url_for('status', timestamp=timestamp)) + + +@app.route('/status/') +def status(timestamp): + logging.info(f"Status check for timestamp: {timestamp}") + + # Validate timestamp + if timestamp not in background_jobs: + flash('Invalid search session.', 'danger') + logging.error(f"Invalid search session: {timestamp}") + return redirect(url_for('index')) + + # Check if job is completed + if background_jobs[timestamp]['completed']: + result = job_results.get(timestamp) + if not result: + flash('No results found for this search session.', 'warning') + logging.error(f"No results found for completed session: {timestamp}") + return redirect(url_for('index')) + + if result['status'] == 'completed': + # Note: use the session_folder from the results to redirect + return redirect(url_for('results', session_id=result['session_folder'])) + else: + error_msg = result.get('error', 'Unknown error occurred.') + flash(f'Search failed: {error_msg}', 'danger') + logging.error(f"Search failed for session {timestamp}: {error_msg}") + return redirect(url_for('index')) + + # If job is still running, show a status page + return render_template('status.html', timestamp=timestamp) + + +@app.route('/results/') +def results(session_id): + # Find completed results that match this session_folder + result_data = next( + ( + r + for r in job_results.values() + if r.get('status') == 'completed' and r['session_folder'] == session_id + ), + None, + ) + + if not result_data: + flash('No results found for this session ID.', 'danger') + logging.error(f"Results for session {session_id} not found in job_results.") + return redirect(url_for('index')) + + return render_template( + 'results.html', + usernames=result_data['usernames'], + graph_file=result_data['graph_file'], + individual_reports=result_data['individual_reports'], + timestamp=session_id.replace('search_', ''), + ) + + +@app.route('/reports/') +def download_report(filename): + reports_root = app.config["REPORTS_FOLDER"] + os.makedirs(reports_root, exist_ok=True) + try: + return send_from_directory(reports_root, filename) + except NotFound: + return "File not found", 404 + except Exception as e: + logging.error(f"Error serving file {filename}: {str(e)}") + return "File not found", 404 + + +if __name__ == '__main__': + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + ) + debug_mode = os.getenv('FLASK_DEBUG', 'False').lower() in ['true', '1', 't'] + + # Host configuration: secure by default + # Use 127.0.0.1 for local development, 0.0.0.0 only if explicitly set + host = os.getenv('FLASK_HOST', '127.0.0.1') + port = int(os.getenv('FLASK_PORT', '5000')) + + app.run(host=host, port=port, debug=debug_mode) diff --git a/maigret/web/static/maigret.png b/maigret/web/static/maigret.png new file mode 100644 index 0000000..257ebe8 Binary files /dev/null and b/maigret/web/static/maigret.png differ diff --git a/maigret/web/templates/base.html b/maigret/web/templates/base.html new file mode 100644 index 0000000..221ca15 --- /dev/null +++ b/maigret/web/templates/base.html @@ -0,0 +1,118 @@ + + + + + + + Maigret Web Interface + + + + + +
+
+
+
+ +

Maigret Web Interface

+
+ +
+
+
+ +
+
+ {% block content %}{% endblock %} +
+
+ + + + + + + + \ No newline at end of file diff --git a/maigret/web/templates/index.html b/maigret/web/templates/index.html new file mode 100644 index 0000000..cd2d28e --- /dev/null +++ b/maigret/web/templates/index.html @@ -0,0 +1,520 @@ +{% extends "base.html" %} + +{% block content %} + + +
+ {% if error %} +
{{ error }}
+ {% endif %} + + + +
+
+ + +
+ +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+ + +
+
+
Filters
+ +
+
+
+ + + + + {% for site in site_options %} + +
+
+ +
+ +
+ + Included (whitelist) +    + Excluded (blacklist) +    + Neutral + +
+
+ + +
+
+
+ + +
+
+
Advanced Options
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + + +
+ + +{% endblock %} \ No newline at end of file diff --git a/maigret/web/templates/results.html b/maigret/web/templates/results.html new file mode 100644 index 0000000..da0f053 --- /dev/null +++ b/maigret/web/templates/results.html @@ -0,0 +1,156 @@ +{% extends "base.html" %} +{% block content %} + + +
+

Search Results

+ + {% with messages = get_flashed_messages() %} + {% if messages %} + {% for message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} + {% endwith %} + +

The search has completed. Back to start.

+ + {% if graph_file %} +

Combined Graph

+ + {% endif %} + +
+ + {% if individual_reports %} +

Individual Reports

+
+ {% for report in individual_reports %} +
+
+
+ {{ report.username }} + +
+
+
+

+ CSV Report | + JSON Report | + PDF Report | + HTML Report +

+ {% if report.claimed_profiles %} + Claimed Profiles: +
    + {% for profile in report.claimed_profiles %} +
  • + + {% if profile.tags %} +
    + {% for tag in profile.tags %} + {{ tag }} + {% endfor %} +
    + {% endif %} +
  • + {% endfor %} +
+ {% else %} +

No claimed profiles found.

+ {% endif %} +
+
+ {% endfor %} +
+ {% else %} +

No individual reports available.

+ {% endif %} +
+ + +{% endblock %} \ No newline at end of file diff --git a/maigret/web/templates/status.html b/maigret/web/templates/status.html new file mode 100644 index 0000000..3fca125 --- /dev/null +++ b/maigret/web/templates/status.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} +{% block content %} +
+

Search in progress...

+

Your request is being processed in the background. This page will automatically redirect once the results are ready.

+
+ Loading... +
+ +
+{% endblock %} diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..d10b125 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3568 @@ +# This file is automatically @generated by Poetry 2.4.1 and should not be changed by hand. + +[[package]] +name = "about-time" +version = "4.2.1" +description = "Easily measure timing and throughput of code blocks, with beautiful human friendly representations." +optional = false +python-versions = ">=3.7, <4" +groups = ["main"] +files = [ + {file = "about-time-4.2.1.tar.gz", hash = "sha256:6a538862d33ce67d997429d14998310e1dbfda6cb7d9bbfbf799c4709847fece"}, + {file = "about_time-4.2.1-py3-none-any.whl", hash = "sha256:8bbf4c75fe13cbd3d72f49a03b02c5c7dca32169b6d49117c257e7eb3eaee341"}, +] + +[[package]] +name = "aiodns" +version = "4.0.4" +description = "Simple DNS resolver for asyncio" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "aiodns-4.0.4-py3-none-any.whl", hash = "sha256:c24dd605bac70a1676ce503f967a98483ff163507198557d8e9db16267e6cfd2"}, + {file = "aiodns-4.0.4.tar.gz", hash = "sha256:cb10e0c0d2591636716ad2fe402e977c16d71bdaf76bb8cb49e8a6633596f736"}, +] + +[package.dependencies] +pycares = ">=5.0.0,<6" + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, + {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, +] + +[[package]] +name = "aiohttp" +version = "3.14.1" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "aiohttp-3.14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f6bb621e5863cfe8fe5ff5468002d200ec31f30f1280b259dc505b02595099e"}, + {file = "aiohttp-3.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f7215cb3933784f79ed20e5f050e15984f390424339b22375d5a53c933a0491"}, + {file = "aiohttp-3.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9d4e294455b23a68c9b8f042d0e8e377a265bcb15332753695f6e5b6819e0ce"}, + {file = "aiohttp-3.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b238af795833d5731d049d82bc84b768ae6f8f97f0495963b3ed9935c5901cc3"}, + {file = "aiohttp-3.14.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4e5e0ae56914ecdbf446493addefc0159053dd53962cef37d7839f37f73d505"}, + {file = "aiohttp-3.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:092e4ce3619a7c6dee52a6bdabda973d9b34b66781f840ce93c7e0cec30cf521"}, + {file = "aiohttp-3.14.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb33777ea21e8b7ecde0e6fc84f598be0a1192eab1a63bc746d75aa75d38e7bd"}, + {file = "aiohttp-3.14.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23119f8fd4f5d16902ed459b63b100bcd269628075162bddac56cc7b5273b3fb"}, + {file = "aiohttp-3.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:57fc6745a4b7d0f5a9eb4f40a69718be6c0bc1b8368cc9fe89e90118719f4f42"}, + {file = "aiohttp-3.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6fd35beba67c4183b09375c5fff9accb47524191a244a99f95fd4472f5402c2b"}, + {file = "aiohttp-3.14.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:672b9d65f42eb877f5c3f234a4547e4e1a226ca8c2eed879bb34670a0ce51192"}, + {file = "aiohttp-3.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:24ba13339fed9251d9b1a1bec8c7ab84c0d1675d79d33501e11f94f8b9a84e05"}, + {file = "aiohttp-3.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:94da27378da0610e341c4d30de29a191672683cc82b8f9556e8f7c7212a020fe"}, + {file = "aiohttp-3.14.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:52cdac9432d8b4a719f35094a818d95adcae0f0b4fe9b9b921909e0c87de9e7d"}, + {file = "aiohttp-3.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:672ac254412a24d0d0cf00a9e6c238877e4be5e5fa2d188832c1244f45f31966"}, + {file = "aiohttp-3.14.1-cp310-cp310-win32.whl", hash = "sha256:2fe3607e71acc6ebb0ec8e492a247bf7a291226192dc0084236dfc12478916f6"}, + {file = "aiohttp-3.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:30099eda75a53c32efb0920e9c33c195314d2cc1c680fbfd30894932ac5f27df"}, + {file = "aiohttp-3.14.1-cp310-cp310-win_arm64.whl", hash = "sha256:5a837f49d901f9e368651b676912bff1104ed8c1a83b280bcd7b29adccef5c9c"}, + {file = "aiohttp-3.14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa00140699487bd435fde4342d85c94cb256b7cd3a5b9c3396c67f19922afda2"}, + {file = "aiohttp-3.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c1af67559445498b502030c35c59db59966f47041ca9de5b4e707f86bd10b5f"}, + {file = "aiohttp-3.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d44ec478e713ee7f29b439f7eb8dc2b9d4079e11ae114d2c2ac3d5daf30516c8"}, + {file = "aiohttp-3.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3b1a184a9a8f548a6b73f1e26b96b052193e4b3175ed7342aaf1151a1f00a04"}, + {file = "aiohttp-3.14.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5f2504bc0322437c9a1ff6d3333ca56c7477b727c995f036b976ae17b98372c8"}, + {file = "aiohttp-3.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73f05ea02013e02512c3bf42714f1208c57168c779cc6fe23516e4543089d0a6"}, + {file = "aiohttp-3.14.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:797457503c2d426bee06eef808d07b31ede30b65e054444e7de64cad0061b7af"}, + {file = "aiohttp-3.14.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b821a1f7dedf7e37450654e620038ac3b2e81e8fa6ea269337e97101978ec730"}, + {file = "aiohttp-3.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4cd96b5ba05d67ed0cf00b5b405c8cd99586d8e3481e8ee0a831057591af7621"}, + {file = "aiohttp-3.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d459b98a932296c6f0e94f87511a0b1b90a8a02c30a50e60a297619cd5a58ee"}, + {file = "aiohttp-3.14.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:764457a7be60825fb770a644852ff717bcbb5042f189f2bd16df61a81b3f6573"}, + {file = "aiohttp-3.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f7a16ef45b081454ef844502d87a848876c490c4cb5c650c230f6ec79ed2c1e7"}, + {file = "aiohttp-3.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2fbc3ed048b3475b9f0cbcb9978e9d2d3511acd91ead203af26ed9f0056004cf"}, + {file = "aiohttp-3.14.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bedb0cd073cc2dc035e30aeb99444389d3cd2113afe4ef9fcd23d439f5bade85"}, + {file = "aiohttp-3.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b6feea921016eb3d4e04d65fc4e9ca402d1a3801f562aef94989f54694917af3"}, + {file = "aiohttp-3.14.1-cp311-cp311-win32.whl", hash = "sha256:313701e488100074ce99850404ee36e741abf6330179fec908a1944ecf570126"}, + {file = "aiohttp-3.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:03ab4530fdcb3a543a122ba4b65ac9919da9fe9f78a03d328a6e38ff962f7aa5"}, + {file = "aiohttp-3.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:486f7d16ed54c39c2cbd7ca71fd8ba2b8bb7860df65bd7b6ed640bab96a38a8b"}, + {file = "aiohttp-3.14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d35143e27778b4bb0fb189562d7f275bff79c62ab8e98459717c0ea617ff2480"}, + {file = "aiohttp-3.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bcfb80a2cc36fba2534e5e5b5264dc7ae6fcd9bf15256da3e53d2f499e6fa29d"}, + {file = "aiohttp-3.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27fd7c91e51729b4f7e1577865fa6d34c9adccbc39aabe9000285b48af9f0ec2"}, + {file = "aiohttp-3.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c567bf9eaf664280116a8688f63016e6b32db2505908e2bdaca1b6438142f2"}, + {file = "aiohttp-3.14.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f5e6ff2bdbb8f4cd3fbe41f99e25bbcd58e3bf9f13d3dd31a11e7917251cc77a"}, + {file = "aiohttp-3.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f73e01dc37122325caf079982621262f96d74823c179038a82fddfc50359264"}, + {file = "aiohttp-3.14.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb2c0c80d431c0d03f2c7dbf125150fedd4f0de17366a7ca33f7ccb822391842"}, + {file = "aiohttp-3.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e6fc1a85fa7194a1a7d19f44e8609180f4a8eb5fa4c7ed8b4355f080fad235c"}, + {file = "aiohttp-3.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:686b6c0d3911ec387b444ddf5dc62fb7f7c0a7d5186a7861626496a5ab4aff95"}, + {file = "aiohttp-3.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c6fa4dc7ad6f8109c70bb1499e589f76b0b792baf39f9b017eb92c8a81d0a199"}, + {file = "aiohttp-3.14.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:87a5eea1b2a5e21e1ebdbb33ad4165359189327e63fc4e4894693e7f821ac817"}, + {file = "aiohttp-3.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c1421eb01d4fd608d88cc8290211d177a58532b55ad94076fb349c5bf467f0a"}, + {file = "aiohttp-3.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:34b257ec41345c1e8f2df68fa908a7952f5de932723871eb633ecbbff396c9a4"}, + {file = "aiohttp-3.14.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:de538791a80e5d862addbc183f70f0158ac9b9bb872bb147f1fd2a683691e087"}, + {file = "aiohttp-3.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f71173be42d3241d428f760122febb748de0623f44308a6f120d0dd9ec572e3"}, + {file = "aiohttp-3.14.1-cp312-cp312-win32.whl", hash = "sha256:ec8dc383ee57ea3e883477dcca3f11b65d58199f1080acaf4cd6ad9a99698be4"}, + {file = "aiohttp-3.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2aa92c87868cd13674989f9ee83e5f9f7ea4237589b728048e1f0c8f6caa3271"}, + {file = "aiohttp-3.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:2c840c90759922cb5e6dda94596e079a30fb5a5ba548e7e0dc00574703940847"}, + {file = "aiohttp-3.14.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:b3a03285a7f9c7b016324574a6d92a1c895da6b978cb8f1deee3ac72bc6da178"}, + {file = "aiohttp-3.14.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:2a73f487ab8ef5abbb24b7aa9b73e98eaba9e9e031804ff2416f02eca315ccaf"}, + {file = "aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:915fbb7b41b115192259f8c9ae58f3ddc444d2b5579917270211858e606a4afd"}, + {file = "aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:7fb4bdf95b0561a79f259f9d28fbc109728c5ee7f27aff6391f0ca703a329abe"}, + {file = "aiohttp-3.14.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1b9748363260121d2927704f5d4fc498150669ca3ae93625986ee89c8f80dcd4"}, + {file = "aiohttp-3.14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:86a6dab78b0e43e2897a3bbe15745aa60dc5423ca437b7b0b164c069bf91b876"}, + {file = "aiohttp-3.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dfd6e47d3c44c2279907607f73a4240b88c69eb8b90da7e2441a8045dfd21da"}, + {file = "aiohttp-3.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:317acd9f8602858dc7d59679812c376c7f0b97bcbbf16e0d6237f54141d8a8a6"}, + {file = "aiohttp-3.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd869c427324e5cb15195793de951295710db28be7d818247f3097b4ab5d4b96"}, + {file = "aiohttp-3.14.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93b032b5ec3255473c143627d21a69ac74ae12f7f33974cb587c564d11b1066f"}, + {file = "aiohttp-3.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f234b4deb12f3ad59127e037bc57c40c21e45b45282df7d3a55a0f409f595296"}, + {file = "aiohttp-3.14.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9af6779bfb46abf124068327abcdf9ce95c9ef8287a3e8da76ccf2d0f16c28fa"}, + {file = "aiohttp-3.14.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:faccab372e66bc76d5731525e7f1143c922271725b9d38c9f97edcc66266b451"}, + {file = "aiohttp-3.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f380468b09d2a81633ee863b0ec5648d364bd17bb8ecfb8c2f387f7ac1faf42c"}, + {file = "aiohttp-3.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:97e704dcd26271f5bda3fa07c3ce0fb76d6d3f8659f4baa1a24442cc9ba177ca"}, + {file = "aiohttp-3.14.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:269b76ac5394092b95bc4a098f4fc6c191c083c3bd12775d1e30e663132f6a09"}, + {file = "aiohttp-3.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0b3e614340c889d575451696374c9d17affd54cd607ca0babed8f8c37b9397"}, + {file = "aiohttp-3.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5663ee9257cfa1add7253a7da3035a02f31b6600ec48261585e1800a81533080"}, + {file = "aiohttp-3.14.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:603a2c834142172ffddc054067f5ec0ca65d57a0aa98a71bc81952573208e345"}, + {file = "aiohttp-3.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cb21957bb8aca671c1765e32f58164cf0c50e6bf41c0bbbd16da20732ecaf588"}, + {file = "aiohttp-3.14.1-cp313-cp313-win32.whl", hash = "sha256:e509a55f681e6158c20f70f102f9cf61fb20fbc382272bc6d94b7343f2582780"}, + {file = "aiohttp-3.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:1ac8531b638959718e18c2207fbfe297819875da46a740b29dfa29beba64355a"}, + {file = "aiohttp-3.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:250d14af67f6b6a1a4a811049b1afa69d61d617fca6bf33149b3ab1a6dbcf7b8"}, + {file = "aiohttp-3.14.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:7c106c26852ca1c2047c6b80384f17100b4e439af276f21ef3d4e2f450ae7e15"}, + {file = "aiohttp-3.14.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:20205f7f5ade7aaec9f4b500549bbc071b046453aed72f9c06dcab87896a83e8"}, + {file = "aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:62a759436b29e677181a9e76bab8b8f689a29cb9c535f45f7c48c9c830d3f8c3"}, + {file = "aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:2964cbf553df4d7a57348da44d961d871895fc1ee4e8c322b2a95612c7b17fba"}, + {file = "aiohttp-3.14.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:237651caadc3a59badd39319c54642b5299e9cc98a3a194310e55d5bb9f5e397"}, + {file = "aiohttp-3.14.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:896e12dfdbbab9d8f7e16d2b28c6769a60126fa92095d1ebf9473d02593a2448"}, + {file = "aiohttp-3.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d03f281ed22579314ba00821ce20115a7c0ac430660b4cc05704a3f818b3e004"}, + {file = "aiohttp-3.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07eabb979d236335fed927e137a928c9adfb7df3b9ec7aa31726f133a62be983"}, + {file = "aiohttp-3.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4fe1f1087cbadb280b5e1bb054a4f00d1423c74d6626c5e48400d871d34ecefe"}, + {file = "aiohttp-3.14.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:367a9314fdc79dab0fac96e216cb41dd73c85bdca85306ce8999118ba7e0f333"}, + {file = "aiohttp-3.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a24f677ebe83749039e7bdf862ff0bbb16818ae4193d4ef96505e269375bcce0"}, + {file = "aiohttp-3.14.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c83afe0ba876be7e943d2e0ba645809ad441575d2840c895c21ee5de93b9377a"}, + {file = "aiohttp-3.14.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:634e385930fb6d2d479cf3aa66515955863b77a5e3c2b5894ca259a25b308602"}, + {file = "aiohttp-3.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeea07c4397bbc57719c4eed8f9c284874d4f175f9b6d57f7a1546b976d455ca"}, + {file = "aiohttp-3.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:335c0cc3e3545ce98dcb9cfcb836f40c3411f43fa03dab757597d80c89af8a35"}, + {file = "aiohttp-3.14.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:ae6be797afdef264e8a84864a85b196ca06045586481b3df8a967322fd2fa844"}, + {file = "aiohttp-3.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:8560b4d712474335d08907db7973f71912d3a9a8f1dee992ec06b5d2fe359496"}, + {file = "aiohttp-3.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7edd08e0a5deb1e8564a2fcd8f4561014a3f05252334671bbf55ddd47db0e5"}, + {file = "aiohttp-3.14.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:b6ff7fcee63287ae57b5df3e4f5957ce032122802509246dec1a5bcc55904c95"}, + {file = "aiohttp-3.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6ffbb2f4ec1ceaff7e07d43922954da26b223d188bf30658e561b98e23089444"}, + {file = "aiohttp-3.14.1-cp314-cp314-win32.whl", hash = "sha256:a9875b46d910cff3ea2f5962f9d266b465459fe634e22556ab9bd6fc1192eea0"}, + {file = "aiohttp-3.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:af8b4b81a960eeaf1234971ac3cd0ba5901f3cd42eae42a46b4d089a8b492719"}, + {file = "aiohttp-3.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:cf4491381b1b57425c315a56a439251b1bdac07b2275f19a8c44bc57744532ec"}, + {file = "aiohttp-3.14.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:819c054312f1af92947e6a55883d1b66feefab11531a7fc45e0fb9b63880b5c2"}, + {file = "aiohttp-3.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10ee9c1753a8f706345b22496c79fbddb5be0599e0823f3738b1534058e25340"}, + {file = "aiohttp-3.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1601cc37baf5750ccacae618ec2daf020769581695550e3b654a911f859c563d"}, + {file = "aiohttp-3.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d6e0ac9da31c9c04c84e1c0182ad8d6df35965a85cae29cd71d089621b3ae94"}, + {file = "aiohttp-3.14.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e8f2d660c350b3d0e259c7a7e3d9b7fc8b41210cbcc3d4a7076ff0a5e5c2fdc"}, + {file = "aiohttp-3.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4691802dda97be727f79d86818acaad7eb8e9252626a1d6b519fedbb92d5e251"}, + {file = "aiohttp-3.14.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c389c482a7e9b9dc3ee2701ac46c4125297a3818875b9c305ddb603c04828fd1"}, + {file = "aiohttp-3.14.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc0cacab7ba4e56f0f81c82a98c09bed2f39c940107b03a34b168bdf7597edd3"}, + {file = "aiohttp-3.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:979ed4717f59b8bb12e3963378fa285d93d367e15bcd66c721311826d3c44a6c"}, + {file = "aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:38e1e7daaea81df51c952e18483f323d878499a1e2bfe564790e0f9701d6f203"}, + {file = "aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:4132e72c608fe9fecb8f409113567605915b83e9bdd3ea56538d2f9cd35002f1"}, + {file = "aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:eefd9cc9b6d4a2db5f00a26bc3e4f9acf71926a6ec557cd56c9c6f27c290b665"}, + {file = "aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:b165790117eea512d7f3fb22f1f6dad3d55a7189571993eb015591c1401276d1"}, + {file = "aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ed09c7eb1c391271c2ed0314a51903e72a3acb653d5ccfc264cdf3ef11f8269d"}, + {file = "aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:99abd37084b82f5830c635fddd0b4993b9742a66eb746dacf433c8590e8f9e3c"}, + {file = "aiohttp-3.14.1-cp314-cp314t-win32.whl", hash = "sha256:47ddf841cdecc810749921d25606dee45857d12d2ad5ddb7b5bd7eab12e4b365"}, + {file = "aiohttp-3.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e78b522b7a6e27e0b25d19b247b75039ac4c94f99823e3c9e53ae1603a9f7e9"}, + {file = "aiohttp-3.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:90d53f1609c29ccc2193945ef732428382a28f78d0456ae4d3daf0d48b74f0f6"}, + {file = "aiohttp-3.14.1.tar.gz", hash = "sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.5.0" +aiosignal = ">=1.4.0" +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +propcache = ">=0.2.0" +typing_extensions = {version = ">=4.4", markers = "python_version < \"3.13\""} +yarl = ">=1.17.0,<2.0" + +[package.extras] +speedups = ["Brotli (>=1.2) ; platform_python_implementation == \"CPython\" and sys_platform != \"android\" and sys_platform != \"ios\"", "aiodns (>=3.3.0) ; sys_platform != \"android\" and sys_platform != \"ios\"", "backports.zstd ; platform_python_implementation == \"CPython\" and python_version < \"3.14\" and sys_platform != \"android\" and sys_platform != \"ios\"", "brotlicffi (>=1.2) ; platform_python_implementation != \"CPython\""] + +[[package]] +name = "aiohttp-socks" +version = "0.11.0" +description = "Proxy connector for aiohttp" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "aiohttp_socks-0.11.0-py3-none-any.whl", hash = "sha256:9aacce57c931b8fbf8f6d333cf3cafe4c35b971b35430309e167a35a8aab9ec1"}, + {file = "aiohttp_socks-0.11.0.tar.gz", hash = "sha256:0afe51638527c79077e4bd6e57052c87c4824233d6e20bb061c53766421b10f0"}, +] + +[package.dependencies] +aiohttp = ">=3.10.0" +python-socks = {version = ">=2.4.3,<3.0.0", extras = ["asyncio"]} + +[[package]] +name = "aiosignal" +version = "1.4.0" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"}, + {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" +typing-extensions = {version = ">=4.2", markers = "python_version < \"3.13\""} + +[[package]] +name = "alive-progress" +version = "3.3.0" +description = "A new kind of Progress Bar, with real-time throughput, ETA, and very cool animations!" +optional = false +python-versions = "<4,>=3.9" +groups = ["main"] +files = [ + {file = "alive-progress-3.3.0.tar.gz", hash = "sha256:457dd2428b48dacd49854022a46448d236a48f1b7277874071c39395307e830c"}, + {file = "alive_progress-3.3.0-py3-none-any.whl", hash = "sha256:63dd33bb94cde15ad9e5b666dbba8fedf71b72a4935d6fb9a92931e69402c9ff"}, +] + +[package.dependencies] +about-time = "4.2.1" +graphemeu = "0.7.2" + +[[package]] +name = "arabic-reshaper" +version = "3.0.1" +description = "Reconstruct Arabic sentences to be used in applications that do not support Arabic" +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "arabic_reshaper-3.0.1-py3-none-any.whl", hash = "sha256:41c5adc2420f85758eada7e880251c4b6a2adbd83377bd27e5d4eba71f648bc7"}, + {file = "arabic_reshaper-3.0.1.tar.gz", hash = "sha256:a0d9b2a9fa29b5f2c1d705f407adf6ca4242405b9cac0e5cc09e6c4f3f8fb68c"}, +] +markers = {main = "extra == \"pdf\""} + +[package.extras] +with-fonttools = ["fonttools (>=4.0)"] + +[[package]] +name = "asgiref" +version = "3.11.1" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "asgiref-3.11.1-py3-none-any.whl", hash = "sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133"}, + {file = "asgiref-3.11.1.tar.gz", hash = "sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce"}, +] + +[package.dependencies] +typing_extensions = {version = ">=4", markers = "python_version < \"3.11\""} + +[package.extras] +tests = ["mypy (>=1.14.0)", "pytest", "pytest-asyncio"] + +[[package]] +name = "asn1crypto" +version = "1.5.1" +description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" +optional = false +python-versions = "*" +groups = ["main", "dev"] +files = [ + {file = "asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67"}, + {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, +] +markers = {main = "extra == \"pdf\""} + +[[package]] +name = "ast-serialize" +version = "0.6.0" +description = "Python bindings for mypy AST serialization" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "ast_serialize-0.6.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:a7520b672827885bafeae7501f684d14d47d17e5f45256f9df547686cca52264"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a14191beec7e0c078d2fc1f6edc0aee88bcd4db9f18e1bc9f8052b559c22dddc"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32ef62ec34cf6be20ad77d4799556638fbdf187f3ae10698dfb20ef9f2c89516"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13b7769970a39983b0adf2f38917b1cd3b8946f76df045756c3d741bc689f089"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f7a408601bb3edaefb3bc67a4c01f5235e3253653b6a5729a2ee2382b35341c"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8670bfa51208a2c0c8d138928e40e998fab158f9200d53bb80c088b5b8eda7b8"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4826809eb8597a8cd59fd924b6d7c285b8969a1e0007e2cb652cab62376270f"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:577a6c189068686869f5f1ddc38363f3ae1808a4753b577266f9202071a7bb66"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085de7f62dc9cc247eb01e965a362707d1d90b1d89a82c5bf78301a60a3c417b"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9f8a8b78b13173de6a9ec22111d9be674874cd5bdccda04f14ae5ebc2bef403a"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f2ff3baffc3a29c1f15bc9098aa0c09763410262d5e6cef42116f7356c184554"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0067b25fce104eaae5b88383de9ab803faeb671831e14ca698b771b356e2600f"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c617417f9cbb0cb144f6283c3cbe0d2e0f01beaf9f608f662b21191058a626ec"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-win32.whl", hash = "sha256:5337cb256dcea3df9288205213d1601581536526b8f4da44b6974f1180f3252a"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2d947e45cafc4b09bd7528917fa84c517654a43de173c79785574b7b3068ac24"}, + {file = "ast_serialize-0.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:6e15ec740436e1a0d62de848641abe5f3a2f89a7f94907d534795ac91bbacf14"}, + {file = "ast_serialize-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:093cb8bb91b720d8523580498d031791bb1bbaa048599c3d21085d380e11a596"}, + {file = "ast_serialize-0.6.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e61580a69faf47e3689795367ed211f2a10fd741478cc0f36a0f128793360aad"}, + {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305802f2ce2a7c4e87835078ea85c58b586ddda8095b92fe2ead9364ae19c80a"}, + {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7b8b8f0c42f752ea00b2b7d7c090b3f80d9c1c5c75cadf16423790a0cc74081"}, + {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd5b91b9e6f2356ace3a556963b0cd783b395fbbb0bb17b4defc283415466e77"}, + {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d6ef91590258ada18909b9caea344dac4de2013906b035473cd674a43f4b790"}, + {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcbed41e9386059fc0261d602445ede0976c2ecec2939688bcbcb9ed0b6f28b7"}, + {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:cdc4e6f930b9090c2f92c9036ad12ffb8e6e44d4a5ba06f1458a05d60f203f7b"}, + {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:897ac47b5637be41c0c07061c8a912fafa967ef1dc73fa115e4bfa70882a093b"}, + {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c4af9a1386166e40ed01464991806f89038a2d89782576c7774876fa77034e32"}, + {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c901adbd750029b9ac4ad3d6aa56853e0ad4875119fbf52b7b8298afc223828b"}, + {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae22a366b752ab4496191525b78b097b5b72d531752e3c1dd7e383a8f2c8a1a"}, + {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4ed29121da8b3fdc291002801a1de0f76248fa07dce89157a5f277842cf6126e"}, + {file = "ast_serialize-0.6.0-cp39-abi3-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b1dac4e09d341c1300ba69cdcbe62867b32a8c75d90db9bf4d083bec3b039f0b"}, + {file = "ast_serialize-0.6.0-cp39-abi3-win32.whl", hash = "sha256:82c312a7844d2fdeb4d5c48bd3d215bf940dafd4704e1a9bcf252a99010a99b1"}, + {file = "ast_serialize-0.6.0-cp39-abi3-win_amd64.whl", hash = "sha256:113b58346f9ceb664352032770caca817d4a3c86f611c6088e6ef65ddaa70f0e"}, + {file = "ast_serialize-0.6.0-cp39-abi3-win_arm64.whl", hash = "sha256:ccd132fe8db56f61fe743b1f644d01b8d65b83248a8da506f3132bda86d6ed5e"}, + {file = "ast_serialize-0.6.0.tar.gz", hash = "sha256:aadd3ffcf4858c9726bf3515f7b199c7eadbe504f96028e4a87172c0da65a8fe"}, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, +] + +[package.extras] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "async-timeout" +version = "5.0.1" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "python_version == \"3.10\"" +files = [ + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, +] + +[[package]] +name = "attrs" +version = "26.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309"}, + {file = "attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32"}, +] + +[[package]] +name = "backports-asyncio-runner" +version = "1.2.0" +description = "Backport of asyncio.Runner, a context manager that controls event loop life cycle." +optional = false +python-versions = "<3.11,>=3.8" +groups = ["dev"] +markers = "python_version == \"3.10\"" +files = [ + {file = "backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5"}, + {file = "backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.7.0" +groups = ["main"] +files = [ + {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, + {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, +] + +[package.dependencies] +soupsieve = ">=1.6.1" +typing-extensions = ">=4.0.0" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "black" +version = "26.5.1" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "black-26.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9942db8888e06943c5dde66ca0037dcff82a2a4ec1ad0ada9e0d2ee9d9823893"}, + {file = "black-26.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:89c93167a74d3a75dfaa38a5c7cca015537d5820dd7f17d63267d674a61cae90"}, + {file = "black-26.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f2cd76d069cc54c71f10360744ba8983fbb616903b4304a85b734915c8e1b4"}, + {file = "black-26.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:87ed5c6f450580a2f6790bc7cbfb016dfc73bc750249762268a3695361315eef"}, + {file = "black-26.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:58b4bd92cf88aacf83d88479c8f9caee044b1ec55f2451a337354a7ea2590a22"}, + {file = "black-26.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96ae2c733b2aabdd9986e2c5df628ff3473676cd1c5faded1ff496cf6d74083c"}, + {file = "black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7"}, + {file = "black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59"}, + {file = "black-26.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:30d3c14661f2792e9142cce3eeeb1cbc175b3eb5f733be0c8eeb99651e52b0c3"}, + {file = "black-26.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:1ef92b76f7733f282fd096ea406200b5a286c42947412b0eaff3a74e3616cefe"}, + {file = "black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8"}, + {file = "black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217"}, + {file = "black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d"}, + {file = "black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264"}, + {file = "black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418"}, + {file = "black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3"}, + {file = "black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0"}, + {file = "black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294"}, + {file = "black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a"}, + {file = "black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52"}, + {file = "black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168"}, + {file = "black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3"}, + {file = "black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18"}, + {file = "black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50"}, + {file = "black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae"}, + {file = "black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2"}, + {file = "black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=1.0.0" +platformdirs = ">=2" +pytokens = ">=0.4.0,<0.5.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.10)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2) ; sys_platform != \"win32\"", "winloop (>=0.5.0) ; sys_platform == \"win32\""] + +[[package]] +name = "blinker" +version = "1.9.0" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, + {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, +] + +[[package]] +name = "certifi" +version = "2026.6.17" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db"}, + {file = "certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432"}, +] + +[[package]] +name = "cffi" +version = "2.0.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, + {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, + {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, + {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, + {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, + {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, + {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, + {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, + {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, + {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, + {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, + {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, +] +markers = {dev = "platform_python_implementation != \"PyPy\""} + +[package.dependencies] +pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +groups = ["main", "dev"] +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +markers = {dev = "platform_system == \"Windows\" or sys_platform == \"win32\""} + +[[package]] +name = "coverage" +version = "7.15.0" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "coverage-7.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50913d4bf5ddafa6ca3693da5e4dd833dd1b772e0283c99ca7f7d287db67331a"}, + {file = "coverage-7.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:359e141ccd33893ce3f1ad5525f8b96083003677c82182e5907d62d4ea5799fc"}, + {file = "coverage-7.15.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3200b6204935f928c64b2ca1f923ab8c1acb7c9de45ec61569711b34d25cccaf"}, + {file = "coverage-7.15.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:be616bf61346883b2cfdc5178669647e03531d81ab761a7e378558b7e8bcb628"}, + {file = "coverage-7.15.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc7bafc3fe1059463a8fdd97ca79972d6e2bf819d775c7d54991b5b1971201d6"}, + {file = "coverage-7.15.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b713aa7fcf325a01d4184d848acb46fd84f78fdb0978470c636b23a06a753d91"}, + {file = "coverage-7.15.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e38e6fba2d56652fdfaf0231f8f78aeb805234a912de25dc291ee5cce5b8faa4"}, + {file = "coverage-7.15.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:884499f42e382675be80770391983b90e0c0c774d87dbeeebf5f991cf6612b20"}, + {file = "coverage-7.15.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:840481b12e083dbcbafab14794a8781a958edf327c8d3d70b4eee42f9b8253aa"}, + {file = "coverage-7.15.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:276646e9481703d09f854f3b2f018f24e19fd7049ae670a92570043eb97203b1"}, + {file = "coverage-7.15.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4de4b4d3f5545aa6c60dc4efd9c63b5b5dcc3bf00fe83146b2bdfffb8f6613bd"}, + {file = "coverage-7.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5c504097b2a89b1e85bc6070d920df77daec701337e3aeef2c17775a5dd0ca90"}, + {file = "coverage-7.15.0-cp310-cp310-win32.whl", hash = "sha256:f6e80ed91f98316e86b9c137206b04b2bcfbffccbdff49bd2eb09dddb1cf14e0"}, + {file = "coverage-7.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:b3b3e22030f3f6f5e01a5ce69936552a5c0f6992b7698777377b99041961031f"}, + {file = "coverage-7.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:003fff99412ea848c0aaebcc78ed2b6ce7d8a1227ed17e68470672770b78a02a"}, + {file = "coverage-7.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5cbd804bf2784ce7b45114516050f346ecd50f960c4bb630a7ee9e1d78fa2118"}, + {file = "coverage-7.15.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8773e15c23305b58882a4611fb9b2755977eae0dc2e515366a1b6c98866cc4c2"}, + {file = "coverage-7.15.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f50e40081494c1dc4239ebb202014cbcc3306ea96fb6302a34c8cc0967fc5ae8"}, + {file = "coverage-7.15.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daf96f37f5fc3a7b6c6da862eb4aee61c426bd63da236ed4a73ef0e503b4bca5"}, + {file = "coverage-7.15.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:51aa20f6ae2788fd197747766edf4cd8234fd9423309b934257fa6b21a592723"}, + {file = "coverage-7.15.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03d1f922757662eb7af586e77834792274cff776bc7b1d1a0b66a49ea9d84735"}, + {file = "coverage-7.15.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a6d6acc9a7666245e6133dd15144ca038a85a9cd5026bb06d6bbae9e77440dc9"}, + {file = "coverage-7.15.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1ac2c4c27c7df851dc9a017c2d7de00b69147e84ba3d96f37a530b0b6fb51035"}, + {file = "coverage-7.15.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b761a1d504fd4bd1f20f418753964dca9f5862a511fc854dac58296b3b223671"}, + {file = "coverage-7.15.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:e43b045e11c16e897895758ae90e4a90cf99e93d58549e2f90c0e2272e155695"}, + {file = "coverage-7.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:589b54513e901739f4b4582c705ce96b80c96f57641b1464607e2367a270e540"}, + {file = "coverage-7.15.0-cp311-cp311-win32.whl", hash = "sha256:106781b8482749162d0b47056937ba0933508e5d9447f65a5e7d5c422f0d6bb4"}, + {file = "coverage-7.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:821e92b3631d762a339695824cadbbc73020354eba2a23a551a99ad34938fbe6"}, + {file = "coverage-7.15.0-cp311-cp311-win_arm64.whl", hash = "sha256:309990eb5fb8014b9f67cb211f7fd41876ec8a88a88d3ae76de0ed1d611e3640"}, + {file = "coverage-7.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b75ee5e8cb7575636ac598719b4307ac529ec8fcd79608a35c3cd4d4dada812d"}, + {file = "coverage-7.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffb31267816b93b075302248cc1737506081b4f163df4401e9df1a6424aafabe"}, + {file = "coverage-7.15.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e4d0bb73455bf97ab243a8f12c37c686ccf1c13bb614b7b85f1d062f06f42b2c"}, + {file = "coverage-7.15.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:20d9ccc4ebd0edc434d86dfd2a1dd2a8efa6b6b3073d0485a394fee86459ebb4"}, + {file = "coverage-7.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20c8a976c365c8cb12f0cbd099508772ea41fb5fa80657a8506df0e11bd278c5"}, + {file = "coverage-7.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f948fd5ba1b9cbca91f0ae08b4c1ce2b139509149a435e2585d056d57d70bf01"}, + {file = "coverage-7.15.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f58185f06edf6ad68ec9fb155d63ef650c82f3fbd7e1770e2867751fb13158f4"}, + {file = "coverage-7.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02adc79a920c73c647c5d117f55747df7f2de94571884758ce8bc58e04f0a796"}, + {file = "coverage-7.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6eb7c300fbed667fd6e3588eba71c1904cdb06110ca6fdf908c26bdd88b8e382"}, + {file = "coverage-7.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b5fb23fa2de9dce1f5c36c09066d8fcda16cd96e8e26686caa2d7cb9b567d65c"}, + {file = "coverage-7.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cec79341dbe6281484024979976d0c7f22beae08b4a254655decd25d42cbe766"}, + {file = "coverage-7.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c664c5444b1d970b1b2a450e21fb19ee5c9cfdf151ded2dda37260031cca0da"}, + {file = "coverage-7.15.0-cp312-cp312-win32.whl", hash = "sha256:5f764a3fa339bde6b3aa97657f5a6a3a9451e4a5b4ea98a2892c773a43525f77"}, + {file = "coverage-7.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:52f9a4d2c4c56c8848bc2f524916698354b0211488b38c49ad9ae54f6cafbff6"}, + {file = "coverage-7.15.0-cp312-cp312-win_arm64.whl", hash = "sha256:31e5c3e70c85307ea35a12964e2e40f56ca2ee4b1c8c721ccf4609d17071080b"}, + {file = "coverage-7.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5be4caf3b28836f078abe700f8944dac4a65d78f16d6c600c89cb624e5535782"}, + {file = "coverage-7.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dd58ad1404704303ca8d4f4b8a1095e7cbc7040ef17a66df1e6619aa10176430"}, + {file = "coverage-7.15.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bbcbb317c2e5ded5b21104af81c29f391be2af98d065693ffbe8d23949b948e5"}, + {file = "coverage-7.15.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:27f31ecb458da3f859aab3f15ada871eb7a7768807d88df4a9f186bb17737970"}, + {file = "coverage-7.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fb759be317fdc62e0f56bffdf61cfcb45c7761ad6b71e3e583e71a67ae753c"}, + {file = "coverage-7.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5cf007add5ab4bb8fa9f4c77e3732127c9e6cad501d7db43355fbfafca0be84"}, + {file = "coverage-7.15.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc78d9843bd576fbe2118248258d485e968dc535f95ed504a7b0867ba9b51389"}, + {file = "coverage-7.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a263060f1de0b4b74b4e089c2a70b8003b3781c733329a9c8fd54995328f9950"}, + {file = "coverage-7.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c48decf16e0dfd5b049c7d5e82200c23c08126719142998d4f172444e3d0529e"}, + {file = "coverage-7.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:08fb028000ed0aaa0a4cbdfbb98be7cb42f370db973fbbb469733505ab20e13e"}, + {file = "coverage-7.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb7dc0c3b7d8a1077abea0b8546ebc5e26d6ef6ecefc2f0f5ad2b8a53bdad837"}, + {file = "coverage-7.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cb3602054ccbe9f0d8c2dc04bbeba90d5719236e2cd06e042ddd6d3fc7b6e37"}, + {file = "coverage-7.15.0-cp313-cp313-win32.whl", hash = "sha256:0bf781da64326b677be344df505171435b6f58716108606621d5d27d964fff8b"}, + {file = "coverage-7.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:2c57a275078ee3fa185f83e400f765bc764a549de66d99b47881645cbd4ea629"}, + {file = "coverage-7.15.0-cp313-cp313-win_arm64.whl", hash = "sha256:3812c61afc6685c7999b39320779ab8f43b7a3081fdb0def39976e56fbdb9a21"}, + {file = "coverage-7.15.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:41cb79af843222e11da87127ad0ecbfa878abadd0f770a4a99391a27d3887324"}, + {file = "coverage-7.15.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7d2008989ef8fe54188d3f3bfa2e3099b025af11e90a6a1b9e7dc433d04263d8"}, + {file = "coverage-7.15.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:769e8ece11a596315ebf5aa7ec383aeeed016c091d2bf6363ffb996d41529092"}, + {file = "coverage-7.15.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:65a6b6164ee5c39e2f3803f314292d6c61a607ba7fee253d1e03c42dc3903502"}, + {file = "coverage-7.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75128817f95a5c45bb01d65fd2d8b9cb54bbe03d81608fb70e3e14b437ad56c2"}, + {file = "coverage-7.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9887bb428fe2d4cd4bee89bac1a6c9932f484afd5b36fbd4ff6ea5f825bb1f5e"}, + {file = "coverage-7.15.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0bfc0be1f702042207a93a00523b1065ee1fe951e96edf311581c0bbc2e34888"}, + {file = "coverage-7.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f64627d55def5a43282d70e08396672692f77e4da610a5bb8bb4060b432b6859"}, + {file = "coverage-7.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2c6f0fa473003905c6d5bac328ee4eba9fbea654f15bc24b8a3274b23363fa99"}, + {file = "coverage-7.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2bcf9afaf064172c6ec3c58a325a9957ad1178c05dd934e25f253321776e0676"}, + {file = "coverage-7.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:baf06bc987115d6fb938d403f7eab684a057766c490367999a2b71a6883110c6"}, + {file = "coverage-7.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f0405f2ff97b1c4c0e782cb32e02f32369bcf2e6b618b591d67e1ea754575dfe"}, + {file = "coverage-7.15.0-cp314-cp314-win32.whl", hash = "sha256:ab282853ed5fbd64bbb162f19cb8fcb7087187508a6374b4f9c34ec1577c4e8f"}, + {file = "coverage-7.15.0-cp314-cp314-win_amd64.whl", hash = "sha256:3bb3040e9f4bbe26fcb0cd7cc85ac63e630d3f3a9c74f027abf4caa27e706663"}, + {file = "coverage-7.15.0-cp314-cp314-win_arm64.whl", hash = "sha256:346771144d34f7fa84ec28386f78e0f31653f33cf35e19d253d5b35f9e8201da"}, + {file = "coverage-7.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d34a010905fb6401324ba016b5da03d574967f7b21ce48ea41e66f0f1f95f641"}, + {file = "coverage-7.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bb25d825d885ca8036795dacfc3924d33091fc76d71ebc99420c6b79e77d96fa"}, + {file = "coverage-7.15.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:94c9686bfe8a9a6810297aecbd99beaa3445f9e8dc2f80b1382cca0d86b64461"}, + {file = "coverage-7.15.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9bd671c25f9d85f09d7ec481d0e43d5139f486c06a37139847a7ce569788af72"}, + {file = "coverage-7.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:110cbdf8d2e216577312cf06ccf85539c0e5a5420ef747e4a4719b5e483c88cd"}, + {file = "coverage-7.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c5d4619214f1d9993e7b00a8600d14614b7e9d84e89507460b126aa5e6559e5"}, + {file = "coverage-7.15.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:781a704516e2d8346fbbd5be6c6f3412dd824785146528b3a01816f26c081007"}, + {file = "coverage-7.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd4a1b44bcb65ee29e947ac92bbee04956df3a6bfc6143641bb6cae7ede00fc9"}, + {file = "coverage-7.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0e4950c9d6d3e39c64c991814ff315e2d0b9cb8152363594212c9e55208c0a8f"}, + {file = "coverage-7.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:fe9c87ff42e5472d80d21704972e1f96e104a0a599d77c5e35db5a3c562e2571"}, + {file = "coverage-7.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f00d5ae1dd2fe13fb8186e3e7d37bcbd8b25c0d764ff7d1b32cef9be058510a8"}, + {file = "coverage-7.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:363ab38cc78b615f11c9cac3cf1d7eef950c18b9fdedfb9066f59461dcf84d68"}, + {file = "coverage-7.15.0-cp314-cp314t-win32.whl", hash = "sha256:54fd9c53a5fafff509195f1b6a3f9be615d8e8362a3629ff1de23d270c03c86b"}, + {file = "coverage-7.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:87b47553097ba185ed964866078e7e63adea9f5f51b5f39691c34f30afd21080"}, + {file = "coverage-7.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aeefb2dd178fe7eee79f0ad25d75855cb35ee9ed472db2c5ea06f5b4fd00cec5"}, + {file = "coverage-7.15.0-py3-none-any.whl", hash = "sha256:56da6a4cbe8f7e9e80bd072ca9cefe67d7106a440a7ec06519ec6507ac94ad19"}, + {file = "coverage-7.15.0.tar.gz", hash = "sha256:9ac3fe7a1435986463eaa8ee253ae2f2a268709ba4ae5c7dd1f52a05391ad78f"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "cryptography" +version = "48.0.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = "!=3.9.0,!=3.9.1,>=3.9" +groups = ["main", "dev"] +files = [ + {file = "cryptography-48.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3e4a1a3232eef2e6c732827d5722db29a0cc8b27af2a4d865b094cf954be9ca1"}, + {file = "cryptography-48.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:32143b24adb918f078134e1e230f1eb8cc04886b92c28b5f0041aaf3e5699225"}, + {file = "cryptography-48.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0d27a5696721ef7a672b8c810f6aded391058e0b9486e63e6d93baf765da691"}, + {file = "cryptography-48.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eb86ce1af36fe65041b6db9a8bb064ee621a7e5fded0f80d475ec243477cd242"}, + {file = "cryptography-48.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b024e784ad6c077ee0147b35ea9cbfc1e34e1fd4c1dcca214c2794d73a12df08"}, + {file = "cryptography-48.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3752f2dbc8f07a30aad2932c986cea495b03bb554887828225da104f732852b6"}, + {file = "cryptography-48.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:bd81490cd5801d755cf97bb68ac191f14b708470b1c7cf4580f669b9c9264cd8"}, + {file = "cryptography-48.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:66fd0771e7b9c6dcd44cf1120690d2338d16d72795cf40cae2786a39eba65429"}, + {file = "cryptography-48.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:3fd2ca57062b241c856670b073487d2e86c4637937ca5601e48f97bf8e11fc8f"}, + {file = "cryptography-48.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:0ee6ea481db1ab889cba043ec1eda17bb9c1ea79db6722f779c3667f9f70322f"}, + {file = "cryptography-48.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f2ceef93cb096aa3c4cc4b5c94ca6131f9196d28c64d6111533402a9b2054d41"}, + {file = "cryptography-48.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bd3f92d76217892b15df84ca256c2c113d386fdda7a7d8691aeeced976507c6"}, + {file = "cryptography-48.0.1-cp311-abi3-win32.whl", hash = "sha256:b9a32b876490d66c8bcc9963ef220199569748434ab01a9d6aaeabf88e7f5158"}, + {file = "cryptography-48.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:39489bfca54c7a1f6b297efcd8bc608ab92d16c4ca631b0cad4da46724588b24"}, + {file = "cryptography-48.0.1-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:f817adc181390bd54f2f700107a7419040fb7c1bdf2fc26f36551a06a68c3345"}, + {file = "cryptography-48.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d5d30989c6917b478b5817902e85fddaea2261efa8648383d965381ccb9e1ac4"}, + {file = "cryptography-48.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:df637c05205ea7c1d7fbcbe54bbfea648a52951155f997af13d895d0ecc96991"}, + {file = "cryptography-48.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:869c3b8a53bfe27147832df48b32adadf558249d50e76cb3769d40e986b13265"}, + {file = "cryptography-48.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:e361afba8918070d376df76f408a4f67fec0ee9cff81a99e48fe9a233ef59e17"}, + {file = "cryptography-48.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:d069066deead00ac7f090be101be875a06855908f7ec004c27b8fefb4acfb411"}, + {file = "cryptography-48.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:09f73a725d582cef64b91281a322cd798d14a33b2b6f2b7ad9531dc336d84c02"}, + {file = "cryptography-48.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:15254441469dd6bf027039453288e2072124f8b6603563f5d759e1c9b69273fa"}, + {file = "cryptography-48.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:8ace4507d1e6533c125f4fac754f8bb8b6a74c08e92179dabd7e16571a3efbf3"}, + {file = "cryptography-48.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:b4e391975f038e66432328639620a4aff2d307513b004f1ca06d6225bced815c"}, + {file = "cryptography-48.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42fcd8e26fe555d9b3577a135f5091fefa0aa4e99129c23fb56787a1bd4ada72"}, + {file = "cryptography-48.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1400da5e32a43253392277eac7490a60e497d810a63dd5608d71bbd7af507c9"}, + {file = "cryptography-48.0.1-cp314-cp314t-win32.whl", hash = "sha256:0df56b056bc17c1b7d6821dfa65216e62bd232d8ab05eb3db44e71d235651471"}, + {file = "cryptography-48.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:9de21387aa95e2a895823d0745b430bed4f33503ba9ab5e0b5311f33e37d66d2"}, + {file = "cryptography-48.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:4fdc69f8e4316bcf0c8c8ec1f26f285d12e8142d88d96c876a59a03be3f6ae67"}, + {file = "cryptography-48.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48fe40804d4caa2288f24e70ca8c64c42dd826da0ad7e4f1b41b2128d679e6c8"}, + {file = "cryptography-48.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:86be3b1b0b6bf09482fb50a979c508d2950ed95f5621ec77f4e385962006b83a"}, + {file = "cryptography-48.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4ab0a343c807bbcd90c971cd1ecf072937cd01847a9e002bef88fb47ac6be577"}, + {file = "cryptography-48.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9621de99d2da096006b629979efd8ae7eb2d8b822488d0c89ee4000c306c59b1"}, + {file = "cryptography-48.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:88c852a0ae366e262e5a1744b685e6a433dc8788dd2a277e418bf4904203609d"}, + {file = "cryptography-48.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:43c5835e2cb98c8733d86f57d6fc879b613f5c3478607281c3e36daffc6dd8a6"}, + {file = "cryptography-48.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:fe0180af5bf9236518a087e35bf2d9a347d5f5f51e63c579d683ddff424e3d46"}, + {file = "cryptography-48.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:b7a2d1a937a738a881737cec135a38bb61470589b17515b9f73f571d0ae10401"}, + {file = "cryptography-48.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b74ca3b8e5ecdd833bf6a002ca41b4793bb27fb8f1c06ffaf2643c9e9140e31b"}, + {file = "cryptography-48.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2c37f2461406063b417837f5f3daab668652acd82423efcd7f0a9f04be972de1"}, + {file = "cryptography-48.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:86fe77abb1bd87afb251d4d02ada7ecf53a32cee9b67d976abb2e45a13297475"}, + {file = "cryptography-48.0.1-cp39-abi3-win32.whl", hash = "sha256:6b2c0c3e6ccf3ade7750f836ef3ee36eea250cc467d45c256895573ac08cc6f1"}, + {file = "cryptography-48.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:9a49ca6c81417f6a5edb50375a60cccdd70fa0a91a5211829dbea74eba94d2ac"}, + {file = "cryptography-48.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:08a597acce1ff37f347400087776599e2348a3a8bc53b44120e463cd274efe4a"}, + {file = "cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:735824ec41b7f74a7c45fb1591349333e4c696cb6c044e5f46356e560143e4cd"}, + {file = "cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:92a46e1d638daa264ba2971c0b0489c9409787943efae4d60ffda3d091ef832c"}, + {file = "cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:7e234ac052af99f2700826a5c29ea99d9c1b1f80341cde62d11c8154dc8e0bd9"}, + {file = "cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:33842cf0888951cef5bc7ac724ab844a42044c1727b967b7f8997289a0464f92"}, + {file = "cryptography-48.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6184ca7b174f28d7c703f1290d4b297217c45355f77a98f67e9b7f14549ac54a"}, + {file = "cryptography-48.0.1.tar.gz", hash = "sha256:266f4ee051abb2f725b74ef8072b521ce1feacf685a3364fa6a6b45548db791a"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +cffi = {version = ">=2.0.0", markers = "platform_python_implementation != \"PyPy\""} +typing-extensions = {version = ">=4.13.2", markers = "python_full_version < \"3.11.0\""} + +[package.extras] +ssh = ["bcrypt (>=3.1.5)"] + +[[package]] +name = "cssselect2" +version = "0.7.0" +description = "CSS selectors for Python ElementTree" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "cssselect2-0.7.0-py3-none-any.whl", hash = "sha256:fd23a65bfd444595913f02fc71f6b286c29261e354c41d722ca7a261a49b5969"}, + {file = "cssselect2-0.7.0.tar.gz", hash = "sha256:1ccd984dab89fc68955043aca4e1b03e0cf29cad9880f6e28e3ba7a74b14aa5a"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +tinycss2 = "*" +webencodings = "*" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "curl-cffi" +version = "0.15.0" +description = "libcurl ffi bindings for Python, with impersonation support." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "curl_cffi-0.15.0-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:bda66404010e9ed743b1b83c20c86f24fe21a9a6873e17479d6e67e29d8ded28"}, + {file = "curl_cffi-0.15.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:a25620d9bf989c9c029a7d1642999c4c265abb0bad811deb2f77b0b5b2b12e5b"}, + {file = "curl_cffi-0.15.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:582e570aa2586b96ed47cf4a17586b9a3c462cbe43f780487c3dc245c6ef1527"}, + {file = "curl_cffi-0.15.0-cp310-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:838e48212447d9c81364b04707a5c861daf08f8320f9ecb3406a8919d1d5c3b3"}, + {file = "curl_cffi-0.15.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b6c847d86283b07ae69bb72c82eb8a59242277142aa35b89850f89e792a02fc"}, + {file = "curl_cffi-0.15.0-cp310-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e5e69eee735f659287e2c84444319d68a1fa68dd37abf228943a4074864283a"}, + {file = "curl_cffi-0.15.0-cp310-abi3-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa1323950224db24f4c510d010b3affa02196ca853fb424191fa917a513d3f4b"}, + {file = "curl_cffi-0.15.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:41f80170ba844009273b2660da1964ec31e99e5719d16b3422ada87177e32e13"}, + {file = "curl_cffi-0.15.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1977e1e12cfb5c11352cbb74acef1bed24eb7d226dab61ca57c168c21acd4d61"}, + {file = "curl_cffi-0.15.0-cp310-abi3-win_amd64.whl", hash = "sha256:5a0c1896a0d5a5ac1eb89cd24b008d2b718dd1df6fd2f75451b59ca66e49e572"}, + {file = "curl_cffi-0.15.0-cp310-abi3-win_arm64.whl", hash = "sha256:a6d57f8389273a3a1f94370473c74897467bcc36af0a17336989780c507fa43d"}, + {file = "curl_cffi-0.15.0-cp313-abi3-android_24_arm64_v8a.whl", hash = "sha256:4682dc38d4336e0eb0b185374db90a760efde63cbea994b4e63f3521d44c4c92"}, + {file = "curl_cffi-0.15.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:967ad7355bd8e9586f8c2d02eaa99953747549e7ea4a9b25cd53353e6b67fe6d"}, + {file = "curl_cffi-0.15.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7e63539d0d839d0a8c5eacf86229bc68c57803547f35e0db7ee0986328b478c3"}, + {file = "curl_cffi-0.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08c799b89740b9bc49c09fbc3d5907f13ac1f845ca52620507ef9466d4639dd5"}, + {file = "curl_cffi-0.15.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b7a92767a888ee90147e18964b396d8435ff42737030d6fb00824ffd6094805"}, + {file = "curl_cffi-0.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:829cc357061ecb99cc2d406301f609a039e05665322f5c025ec67c38b0dc49ce"}, + {file = "curl_cffi-0.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:408d6f14e346841cd889c2e0962832bb235ba3b6749ebf609f347f747da5e60f"}, + {file = "curl_cffi-0.15.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b624c7ce087bfda967a013ed0a64702a525444e5b6e97d23534d567ccc6525aa"}, + {file = "curl_cffi-0.15.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0b6c0543b993996670e9e4b78e305a2d60809d5681903ffb5568e21a387434d3"}, + {file = "curl_cffi-0.15.0.tar.gz", hash = "sha256:ea0c67652bf6893d34ee0f82c944f37e488f6147e9421bef1771cc6545b02ded"}, +] + +[package.dependencies] +certifi = ">=2024.2.2" +cffi = ">=2.0.0" +rich = "*" + +[package.extras] +build = ["cibuildwheel", "wheel"] +dev = ["charset_normalizer (>=3.3.2,<4.0)", "coverage (>=6.4.1,<7.0)", "cryptography (>=46.0.4,<47.0)", "httpx (==0.23.1)", "mypy (>=1.9.0,<2.0)", "pytest (>=8.1.1,<9.0)", "pytest-asyncio (>=0.23.6,<1.0)", "pytest-trio (>=0.8.0,<1.0)", "ruff (>=0.3.5,<1.0)", "trio (>=0.25.0,<1.0)", "trustme (>=1.1.0,<2.0)", "typing_extensions", "uvicorn (>=0.29.0,<1.0)", "websockets (>=14.0)"] +extra = ["lxml_html_clean", "markdownify (>=1.1.0)", "readability-lxml (>=0.8.1)"] +test = ["charset_normalizer (>=3.3.2,<4.0)", "cryptography (>=46.0.4,<47.0)", "httpx (==0.23.1)", "litestar (>=2.19.0,<3.0)", "proxy.py (>=2.4.3,<3.0)", "pytest (>=8.1.1,<9.0)", "pytest-asyncio (>=0.23.6,<1.0)", "pytest-trio (>=0.8.0,<1.0)", "python-multipart (>=0.0.9,<1.0)", "trio (>=0.25.0,<1.0)", "trustme (>=1.1.0,<2.0)", "typing_extensions", "uvicorn (>=0.29.0,<1.0)", "websockets (>=14.0)"] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +groups = ["main"] +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +markers = "python_version == \"3.10\"" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.1.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] + +[[package]] +name = "flake8" +version = "7.3.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e"}, + {file = "flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.14.0,<2.15.0" +pyflakes = ">=3.4.0,<3.5.0" + +[[package]] +name = "flask" +version = "3.1.3" +description = "A simple framework for building complex web applications." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c"}, + {file = "flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb"}, +] + +[package.dependencies] +asgiref = {version = ">=3.2", optional = true, markers = "extra == \"async\""} +blinker = ">=1.9.0" +click = ">=8.1.3" +itsdangerous = ">=2.2.0" +jinja2 = ">=3.1.2" +markupsafe = ">=2.1.1" +werkzeug = ">=3.1.0" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "frozenlist" +version = "1.5.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"}, + {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"}, + {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"}, + {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"}, + {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"}, + {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"}, + {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"}, + {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"}, + {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"}, + {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"}, + {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"}, + {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"}, + {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"}, + {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"}, + {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"}, + {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"}, + {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"}, + {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"}, + {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"}, + {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"}, + {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"}, + {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"}, + {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"}, + {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"}, + {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"}, + {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"}, + {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"}, + {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"}, + {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"}, + {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"}, + {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"}, + {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, +] + +[[package]] +name = "graphemeu" +version = "0.7.2" +description = "Unicode grapheme helpers" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "graphemeu-0.7.2-py3-none-any.whl", hash = "sha256:1444520f6899fd30114fc2a39f297d86d10fa0f23bf7579f772f8bc7efaa2542"}, + {file = "graphemeu-0.7.2.tar.gz", hash = "sha256:42bbe373d7c146160f286cd5f76b1a8ad29172d7333ce10705c5cc282462a4f8"}, +] + +[package.extras] +dev = ["pytest"] +docs = ["sphinx", "sphinx-autobuild"] + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main", "dev"] +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["chardet (>=2.2)", "genshi", "lxml ; platform_python_implementation == \"CPython\""] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml ; platform_python_implementation == \"CPython\""] + +[[package]] +name = "idna" +version = "3.18" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2"}, + {file = "idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848"}, +] + +[package.extras] +all = ["mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipython" +version = "8.30.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321"}, + {file = "ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack_data = "*" +traitlets = ">=5.13.0" +typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing_extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, + {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, +] + +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[package.dependencies] +parso = ">=0.8.4,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jsonpickle" +version = "4.0.0" +description = "jsonpickle encodes/decodes any Python object to/from JSON" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jsonpickle-4.0.0-py3-none-any.whl", hash = "sha256:53730b9e094bc41f540bfdd25eaf6e6cf43811590e9e1477abcec44b866ddcd9"}, + {file = "jsonpickle-4.0.0.tar.gz", hash = "sha256:fc670852b204d77601b08f8f9333149ac37ab6d3fe4e6ed3b578427291f63736"}, +] + +[package.extras] +cov = ["pytest-cov"] +dev = ["black", "pyupgrade"] +docs = ["furo", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +packaging = ["build", "setuptools (>=61.2)", "setuptools-scm[toml] (>=6.0)", "twine"] +testing = ["PyYAML", "atheris (>=2.3.0,<2.4.0) ; python_version < \"3.12\"", "bson", "ecdsa", "feedparser", "gmpy2", "numpy", "pandas", "pymongo", "pytest (>=6.0,!=8.1.*)", "pytest-benchmark", "pytest-benchmark[histogram]", "pytest-checkdocs (>=1.2.3)", "pytest-enabler (>=1.0.1)", "pytest-ruff (>=0.2.1)", "scikit-learn", "scipy (>=1.9.3) ; python_version > \"3.10\"", "scipy ; python_version <= \"3.10\"", "simplejson", "sqlalchemy", "ujson"] + +[[package]] +name = "librt" +version = "0.12.0" +description = "Mypyc runtime library" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "platform_python_implementation != \"PyPy\"" +files = [ + {file = "librt-0.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fe3547407bbce45c09885591f90168325c5a31a6795b9a13f6b9ff3d25093d93"}, + {file = "librt-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5925eca673207204a3adca040a91bdd3738fc7ba48da647ccd55732692a35736"}, + {file = "librt-0.12.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f9ef097a7711465a204454c69658bbb6b2a6be9bdef0eeeba9a042016d00688"}, + {file = "librt-0.12.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:57abc8b65edf1a8e80e5472c81c108a7527202e5febfda9e00a684dbaeae534e"}, + {file = "librt-0.12.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e6f53732a8ae5012a3b6ae092da2933be74ec4169d16038f4af87a0019afea"}, + {file = "librt-0.12.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:edb5f06cdb38d6ef9fd7ae06d62962d65c881b5f965d5e8a6c53e59c15ae4338"}, + {file = "librt-0.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1473ef42263dfee7553a5c460f11730a4409acf0d52629b284eb1e6b13eb460a"}, + {file = "librt-0.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1d6f69a06295fb6ad8dcf92b4b2d15d211842005e86eedce64d88e0633592f58"}, + {file = "librt-0.12.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3275d0270cd07ca9c2e140ae4da34e24a0350e98c6e3815dce96ead67cf0487d"}, + {file = "librt-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a4834462ec68613024d063c7efe9b188e350d40fda9ba937372039883d2a8051"}, + {file = "librt-0.12.0-cp310-cp310-win32.whl", hash = "sha256:bcf9b55ac089e8cf201d2146833e1097812c15dcea61911e84d6a2904cf78893"}, + {file = "librt-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0a122002f7e0d5c93e84465c4b3fe86621402b7b92f1e2bc0784ebe67793112"}, + {file = "librt-0.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f13c1e8563102c2b17581cf37fcb2c6dae7ad485ccea93ae46258998c25f9a1"}, + {file = "librt-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1ddff067610a122387024c4df527493b909d41e54a6e5b2d0e6c1041d6dfa09"}, + {file = "librt-0.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8dc7ebb5f3eec062398e9d0ef1938acd21b589e74286c4a8906d0183318d91b"}, + {file = "librt-0.12.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:198de569ea9d5f6f33808f1c00cc3db9de62bf4d6deafa3b052bd08255083038"}, + {file = "librt-0.12.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e958678a8bca56016aedc891b391c0e0813ea382a874b54a2c1b313c1d232720"}, + {file = "librt-0.12.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575a6eca68c8437ed4a8e0f534e31d74b562ba1049a0ee4b5f09e114bcc21be1"}, + {file = "librt-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:86f241c50dc9e9a3f0db6dbb37a607c8205aa87b920802dabbd50b70d40f6939"}, + {file = "librt-0.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:113417b934fbf38220a9c7fe94578cefbe7dbb047adcb75aa197905af2b13724"}, + {file = "librt-0.12.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:762f17c0eb6b5d74e269126996cea8a89e35ab6464c5151619163abcd8623ae2"}, + {file = "librt-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa93b3bd7f7588c628f6e9bf66485d3467fd9a1ccdb8975b770178f39f35697"}, + {file = "librt-0.12.0-cp311-cp311-win32.whl", hash = "sha256:aaa04b44d4fe86d824616b1f9c13e34c7c01ec0c96dd2abc4f59423696f788e2"}, + {file = "librt-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:9aaeeddb8e7e4ae3bb9f944e0e618418cb91c0071d5ddbfcc3584b3cf59d39f0"}, + {file = "librt-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:18a2402fa3123ab76ecca670e6fb33038fde7c1e91181b885226ec4d30af2c2c"}, + {file = "librt-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9bce19aa7c05f91c989f9da7b567f81d21d57a2e6501e2b811aa0f3f79614c1a"}, + {file = "librt-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0ace09f5bf4d982fe726015f102fb856658b41580597104e301e630ed1d8d86"}, + {file = "librt-0.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d007efe9243ede81ce75990ad7aa172da1e2024144b3eff17ba46a5fff1fff3c"}, + {file = "librt-0.12.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:ad324a5e4858388a4864915b90a42efc8b374376393f14b9940f2454e791912b"}, + {file = "librt-0.12.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10a40cf74cdd97b6f8f905056db73f5d459783de2ca04c6ebd1bf47652818e7e"}, + {file = "librt-0.12.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:92e61c09de95217ae02a9d17f4f66cf073253cdc51bcfdc0f15c62c9a70baa85"}, + {file = "librt-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0461344061d6fc3718940f5855d95647831cef6d03a6c7506897f98222784ad4"}, + {file = "librt-0.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e6dfe89074732c9287b3c0f5a6af575c9ede380a788013876cc7b14fe0da0361"}, + {file = "librt-0.12.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9efed79d51ad1383bba0855f613cca7aa91c943e709af2413ac7f4bb9936ce08"}, + {file = "librt-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1eac6cc0e23e448fb3c1446ed85ff796afb616eed5897c978d35dbec030b7c7c"}, + {file = "librt-0.12.0-cp312-cp312-win32.whl", hash = "sha256:0ab8ee0210047ae86ca023ccfbfe3df82077fd1c9bc021aebbf37d993ef64af0"}, + {file = "librt-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:51c8bfa12632c81b94401c101bcedd0c56c3a1f8fa3273ca3472b28cd2f54003"}, + {file = "librt-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:5eebd451f5def089369ba6d8ff0291303d035e8154f9f26f7633835c5b029ade"}, + {file = "librt-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8d9a55760a34ae5ce70434aabb6a6c61c6c44a0ec58ca1cfd9cd86e4745d417d"}, + {file = "librt-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ff0b197e338b4cf432873e0d6ef025213fdea85311ec4d87d2ea88c28adf2409"}, + {file = "librt-0.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e69f120a20b69e2539d603bbd4d62db38399b10f8bf73a1cf445038a621e8af"}, + {file = "librt-0.12.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:fde3cde595e947fc8e755b0a21f919a1622483d07c662d00496e040773d22591"}, + {file = "librt-0.12.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d977447315fa09ea4e8c7ae9b4e22f7659b5128161c1fd55ff786b5349f73503"}, + {file = "librt-0.12.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7ffac8a67e4143cea9a549d4822b93bc0bbaad73fc25aa0ab0ba5ec27d178677"}, + {file = "librt-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:94af1ed773ff104ef08ef3d669a0ba9d3a5916c609eb698cffe5d5476d66ff9b"}, + {file = "librt-0.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:548199d21d22fb26398dfbbe0ba953a52465c66f3a49f38e6fddce1b127faf53"}, + {file = "librt-0.12.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c8f1f413b966a9dd3ecf80cd337b0ad7bb3de2474a4ff448ed3ebabfc3f803fc"}, + {file = "librt-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55f13f95b629be5b6ab38918e439bf14169d6f9a8deaae55e0c14e12fb0c74b9"}, + {file = "librt-0.12.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:8b2dc079dfe29e77a47a19073d2040fa4879aa3656501f1650f8402ddce0313c"}, + {file = "librt-0.12.0-cp313-cp313-win32.whl", hash = "sha256:da58944be8270f2bfee628a9a2a60c1cf6a12c8bea8e2c9b6edf3e5414ca7793"}, + {file = "librt-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:1db4be3037e4ce065a071fa7deee93e78ebc25f448340a02a6c1c0b82c37e383"}, + {file = "librt-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:05fd2542892ad770b5dd45003fd080477cf220b611d3ee59b0792097eb0873a9"}, + {file = "librt-0.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:b37ee42e09722284a6d9288fe44a191f7276060a3195939bb77c6502058dbb34"}, + {file = "librt-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ade11988728b3e4768dadc5696e82c60e9b35fc95335a9b4d1f5d69e753ccec7"}, + {file = "librt-0.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f351ed425380e39bd86df382578aa5b8c5b98e2e265112de7379e7d030258150"}, + {file = "librt-0.12.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:857d2163e088c868967717ace8e980017fd868a735f3de010412af02bdc30319"}, + {file = "librt-0.12.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2befc80aa5f2f5b93f28abaaf11feff6677931dd548320e44c52deaa9399744"}, + {file = "librt-0.12.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:be3694dcfa97c6715dd19ac73d3e1b21a805514a5785663e57fecacd3ff64e5a"}, + {file = "librt-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2d5f67e86f45638843d025b0828f2e9e55fc45ff9180d2618ccdeaf72a796050"}, + {file = "librt-0.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:64572c85e4ab7d572c9b72cd76b5f90b21181b1459fa6b1aac6f8958c4fcff31"}, + {file = "librt-0.12.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:8b961912b0e688c1eb4658a46bdb0606b31918d65597fbe7356ca83aa653ffcc"}, + {file = "librt-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:722375903e3f079436a7a33da51ce73931536dd041f9feb01536f05d8e010c96"}, + {file = "librt-0.12.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:a5a96a8f536b65ef1bf910c09e7e71647edde5111f6e1b51f413c6fba5bfe71b"}, + {file = "librt-0.12.0-cp314-cp314-win32.whl", hash = "sha256:8ffc99c356f1777c506e1b69dc303879153ae2640ba15b8f3d4448bc87139149"}, + {file = "librt-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:1e68fb20798f455cda41d20a306a23c901218883f17a4bab1ed6e1331b265fb7"}, + {file = "librt-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:2df534f97916cf38ec9b1ddafeb68ae1a4cd4a54775ff26a797026774c0517cf"}, + {file = "librt-0.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c09e581b1c2b8a62b809d4f4bd101ca3de93791e5b0ed1a14085d911be3dee3f"}, + {file = "librt-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:976888d0d831402086e641018bcc3208e0a38f0835789da91f72894b2cb4161f"}, + {file = "librt-0.12.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:563c37cdb41d08fe1e3f08b201abac0e317ca18e88b91285466ee0a585797520"}, + {file = "librt-0.12.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b97eb1a3140e279cc76f85b0fb92b7eb3dfbe0471260ee878bc9dc4bf9a0d649"}, + {file = "librt-0.12.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06e0623351ab9904cf628245f99c714586f4dd23dc740b88c8bc670d8401a847"}, + {file = "librt-0.12.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da12f017b2e404554be14d466cd992459feaa44f252b0f18d909a85266ce1237"}, + {file = "librt-0.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d97f31003a5c86b9e78155a829572c3a26484064fb7ac1d9695fe628bd93d029"}, + {file = "librt-0.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:bd43a6c69876aef4f04eaae3d3b99b0be64755fda274002fa445b92480bf664e"}, + {file = "librt-0.12.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c01755c72fca1dc6b8d5c2ed228b8e7b2ffe184675c22f0f05ebd8fe188b9250"}, + {file = "librt-0.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:625ae561d5fa36400856dcc27464400d047bc2d5e3446be88f437b03fefd72e4"}, + {file = "librt-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8d73191883553ee0739741544bf3b00aba2a1224e45d9580b30cbc29e21dc03b"}, + {file = "librt-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e1cbb037324e759f0afa270229731ff0047772667f3cb38ef5df2cabf0175ede"}, + {file = "librt-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bca1472acbd473eff61059b4409f802c5a1bcb4cd0344d06f939df9c4c125d40"}, + {file = "librt-0.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcdd59453508a53e7433c3a8bcb188e8a911d140eec9d545f3b5b78a78f4018c"}, + {file = "librt-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2079da12bec9553a32f053be3bb51fd72850b9377cb9101bb52d2af55861d2fe"}, + {file = "librt-0.12.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:685fc30997465ac8c27dd6765dd1cb7951f3e6d2b00c36d3aa0740ac8e40c415"}, + {file = "librt-0.12.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b2d7ea43f153e6f0fedb856a6e0fd797b1eee61864171fbdb98ae1040ee3e8c0"}, + {file = "librt-0.12.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d80fd1ace06eb10335e0b44ea10f0d04b8436432612c9c62a29c65d386c90438"}, + {file = "librt-0.12.0-cp39-cp39-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c799f0ecdfee69ac6ae49ee86542fdf418b73f303691ec0f848d2eb17d57d258"}, + {file = "librt-0.12.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9fdef3e1dad8f4c89697e54c65f135be6ea8c1dd2b3204228915410bd8a1aefa"}, + {file = "librt-0.12.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:01dc12202915ce24fb1af54f48770200787f0eda76b63e89f3a08ba9b15acae1"}, + {file = "librt-0.12.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:34a5599ee6c62b454b88d061be4cde70904812335c18df08b7900c59cec40593"}, + {file = "librt-0.12.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:10c6bb57f13f836f1da62b3e59b134005a469f9b2bcb9253d80e4ffa210367b4"}, + {file = "librt-0.12.0-cp39-cp39-win32.whl", hash = "sha256:713b3d670a10045f72be03887afab5e3edca3e0fdaaeb680914bdbec407eecf1"}, + {file = "librt-0.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:e749611fbec555265f6119f644f7f2ae042b27978242bbe7a8df846f7d8dcf91"}, + {file = "librt-0.12.0.tar.gz", hash = "sha256:cb26faedbd09c6130e9c1b64d8000efec5076ffd18d606c6cd1cf02730e6d8b0"}, +] + +[[package]] +name = "lxml" +version = "6.1.1" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "lxml-6.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:09dd5b7075dc2f7709654a46543ba1ea3c2e217b2ed8fbd413a8a945a0f40f60"}, + {file = "lxml-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f6ac4ef4d82dff54670227a69c67782ae0b811b5cf6b17954f1e8f7502fc0d1d"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:556e94a63c9b04716f8e4de2abb65775061f846e89331b6c5be79183a24f98ea"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6bf403fbb3b3e348a561a5f4f0b9961835657981c802a1df03653eef8a9074"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dde6131244bba38a17c745836ba190bc753fd73c9291666287fd0a3fa3dcf30"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98fc784c2c1440667aeedf8465bdfe10208acf0ead656a2c68627299f546b315"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:add8cf6ddf9a65116119a28ece0f7886e30af27ba724a7594305f1d1b58a92a1"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cf9d57306d848218f3601fee7601fab1a327c942d56e2e97610583cb4dd74206"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88136950da4d13c318bde414ce10219931937851327f44328f2df4d2c4614067"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cecdd5dfdc87b1fd87dbf81d4b037a544f47f4c744200a67013771682d67686a"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cd312b9692e831d2ffcad61eab31d91d4b4655a962e61de8fb410472cbcd37aa"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5b7328b46d49fc9477d91ae8f6d55340347d827b7734ba3ea33faae0efef1383"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37a58976370f36d9329d118ad0b953c5aeb9119ac9c6a4e258942a225d0573a1"}, + {file = "lxml-6.1.1-cp310-cp310-win32.whl", hash = "sha256:cea3f4c1af79af13cdb2da0c028111d8f8522d4f22a000c82385535f24e5cf3a"}, + {file = "lxml-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3abf332af33a74288675d936fe861fd4344da0dd6622193fbc4f2bfbb35536b5"}, + {file = "lxml-6.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8dadbe5b217ff35b6a8d16610dd710219b59b76d13f0e3f0d9f36786206e4485"}, + {file = "lxml-6.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2"}, + {file = "lxml-6.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3f333630ab480244a1bff72043e511a91eb22e7595dead8653ee5612dd8f3d"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:752d3bbfe874715ccd0aec7f88d7fc623c0f1fd7aa7b3238a084e017bad2a009"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08"}, + {file = "lxml-6.1.1-cp311-cp311-win32.whl", hash = "sha256:30a89d3ac8faec007453fb541f3f46807eeec88edd5826f6e3fe001752a2c621"}, + {file = "lxml-6.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:abbefa31eee84842140f67acef1c828e28bba8bbf0c3bc6e5492a9af88152c28"}, + {file = "lxml-6.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:dcb292aa7fe485ceff7af4f92e46c5af397daec5dff64871a528f0fc47a3cc5b"}, + {file = "lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7"}, + {file = "lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a"}, + {file = "lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a"}, + {file = "lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77"}, + {file = "lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f"}, + {file = "lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736"}, + {file = "lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947"}, + {file = "lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca"}, + {file = "lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660"}, + {file = "lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc"}, + {file = "lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0"}, + {file = "lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb"}, + {file = "lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603"}, + {file = "lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137"}, + {file = "lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf"}, + {file = "lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee"}, + {file = "lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e"}, + {file = "lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1"}, + {file = "lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e"}, + {file = "lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c"}, + {file = "lxml-6.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6689e828a94eee4f139408c337bb198e014724bb8a8c26d3cfac49d119ed69a6"}, + {file = "lxml-6.1.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdebcc8a75d38c7598dfb2c9ed852d7a9eb4a10d6e2d0764b919b802bf32ac88"}, + {file = "lxml-6.1.1-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8be8ad51249698103d24b0571df35a10990fbe93dd043b6c024172189485f5e3"}, + {file = "lxml-6.1.1-cp38-cp38-manylinux_2_28_i686.whl", hash = "sha256:76447f65250ed2501ead1a1552f5ce8edff159a86f308348e6a9c4acb5e1f1b4"}, + {file = "lxml-6.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ffecec8eb889b58ba9be5b95fb1cc78e22ea8eedea38e8736a1568fe1979250e"}, + {file = "lxml-6.1.1-cp38-cp38-win32.whl", hash = "sha256:c674693f055fa2495de12292cb45e9944199d8eaef5a2dec45175c7c61cb73e3"}, + {file = "lxml-6.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:55b03549819867ea141c0202242c4816c82e52ec36e7e648db9d8da5a3dc3ed6"}, + {file = "lxml-6.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9f79d5325907f13e1be0b3e4dacc1049d1dffc4aeee3c995284bea5fe0fab7d"}, + {file = "lxml-6.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:83b6b30eb131da7a75b601f28c5d6971e6ed3e887919bf6b6a1ad3c2df289080"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:441dd227fa0690eb9fc81edabc63cdcefc212bba99b906dcf6e32cc1a9d3e533"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e07c65f443c887bbcf31cc1771d932ecc192a5273943589b3c7572b749f1ffb2"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5bec7d03d78d853597d6107854c2310ce3f761fd218fe9fe91d5101fcf6c2efe"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f76acfb5f68ba982635a53fd985a8044be98a35b43232c2a1ee235ffab3e1dd"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:8d43ca737b20e106e4aebc42b2f3ae19f00ba63d7eb731698ee083d72d15646f"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:32ab449a5486f6c758e849bb86710d0e45edc24a04e250c01555f8f5653958f8"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53c909b62a0532183542fed00c5a7218258c56292d409bc789886fe1cb04c438"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:640f97d43d867bcb9c75b3af013b64850756b746cb6bce8ace83b70da3abba9d"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:469e3618338bd7ab5beb412d2439825479fcf0dab99e394ca563dbc4eaf6c834"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:aae97dfdb60715c164419ac2532a76d013c3918a665eb6cb7288098b5f349aaf"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c9a4b821dc7055bf9e05ff5719e18ec501f75c0f0bbfabd573b277559780833d"}, + {file = "lxml-6.1.1-cp39-cp39-win32.whl", hash = "sha256:639f6c857d91d9be29bd7502348d6736dab168b54b5158cd899abf11684dc186"}, + {file = "lxml-6.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:34c2d737beabfe35baada43941ed519251e9a12e779031496bcd5d539fcfd730"}, + {file = "lxml-6.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:07a4a68e286ee7a1ed7dfb8af83e615757c0ccfe9f18c6b4ea6771388d9ba8c9"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:31033dc34636ea6b7d5cc11b1ddbda78a14de858ba9d3e1ed4b69a3085bc521e"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:ed21202aec73cda4d55d1ce57b389aadb90ffb044e6cd1080b8347efe1b1ec84"}, + {file = "lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml_html_clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"}, + {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "markdown-it-pyrs", "mistletoe (>=1.0,<2.0)", "mistune (>=3.0,<4.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins (>=0.5.0)"] +profiling = ["gprof2dot"] +rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"] + +[[package]] +name = "markupsafe" +version = "3.0.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, + {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, + {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, + {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, + {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, + {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, + {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, + {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "multidict" +version = "6.7.1" +description = "multidict implementation" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5"}, + {file = "multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8"}, + {file = "multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190"}, + {file = "multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962"}, + {file = "multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505"}, + {file = "multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122"}, + {file = "multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df"}, + {file = "multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db"}, + {file = "multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d"}, + {file = "multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e"}, + {file = "multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0"}, + {file = "multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0"}, + {file = "multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa"}, + {file = "multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a"}, + {file = "multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b"}, + {file = "multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6"}, + {file = "multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172"}, + {file = "multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd"}, + {file = "multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a"}, + {file = "multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a"}, + {file = "multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba"}, + {file = "multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511"}, + {file = "multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19"}, + {file = "multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf"}, + {file = "multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23"}, + {file = "multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2"}, + {file = "multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed"}, + {file = "multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d"}, + {file = "multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33"}, + {file = "multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3"}, + {file = "multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5"}, + {file = "multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df"}, + {file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1"}, + {file = "multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963"}, + {file = "multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd"}, + {file = "multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52"}, + {file = "multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108"}, + {file = "multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32"}, + {file = "multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8"}, + {file = "multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118"}, + {file = "multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee"}, + {file = "multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2"}, + {file = "multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37"}, + {file = "multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1"}, + {file = "multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b"}, + {file = "multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d"}, + {file = "multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f"}, + {file = "multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5"}, + {file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581"}, + {file = "multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a"}, + {file = "multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d"}, + {file = "multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9"}, + {file = "multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2"}, + {file = "multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7"}, + {file = "multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5"}, + {file = "multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2"}, + {file = "multidict-6.7.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:65573858d27cdeaca41893185677dc82395159aa28875a8867af66532d413a8f"}, + {file = "multidict-6.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c524c6fb8fc342793708ab111c4dbc90ff9abd568de220432500e47e990c0358"}, + {file = "multidict-6.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aa23b001d968faef416ff70dc0f1ab045517b9b42a90edd3e9bcdb06479e31d5"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6704fa2b7453b2fb121740555fa1ee20cd98c4d011120caf4d2b8d4e7c76eec0"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:121a34e5bfa410cdf2c8c49716de160de3b1dbcd86b49656f5681e4543bcd1a8"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:026d264228bcd637d4e060844e39cdc60f86c479e463d49075dedc21b18fbbe0"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0e697826df7eb63418ee190fd06ce9f1803593bb4b9517d08c60d9b9a7f69d8f"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb08271280173720e9fea9ede98e5231defcbad90f1624bea26f32ec8a956e2f"}, + {file = "multidict-6.7.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6b3228e1d80af737b72925ce5fb4daf5a335e49cd7ab77ed7b9fdfbf58c526e"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3943debf0fbb57bdde5901695c11094a9a36723e5c03875f87718ee15ca2f4d2"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:98c5787b0a0d9a41d9311eae44c3b76e6753def8d8870ab501320efe75a6a5f8"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:08ccb2a6dc72009093ebe7f3f073e5ec5964cba9a706fa94b1a1484039b87941"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb351f72c26dc9abe338ca7294661aa22969ad8ffe7ef7d5541d19f368dc854a"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ac1c665bad8b5d762f5f85ebe4d94130c26965f11de70c708c75671297c776de"}, + {file = "multidict-6.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fa6609d0364f4f6f58351b4659a1f3e0e898ba2a8c5cac04cb2c7bc556b0bc5"}, + {file = "multidict-6.7.1-cp39-cp39-win32.whl", hash = "sha256:6f77ce314a29263e67adadc7e7c1bc699fcb3a305059ab973d038f87caa42ed0"}, + {file = "multidict-6.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:f537b55778cd3cbee430abe3131255d3a78202e0f9ea7ffc6ada893a4bcaeea4"}, + {file = "multidict-6.7.1-cp39-cp39-win_arm64.whl", hash = "sha256:749aa54f578f2e5f439538706a475aa844bfa8ef75854b1401e6e528e4937cf9"}, + {file = "multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56"}, + {file = "multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "mypy" +version = "2.2.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "mypy-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97d21f3a1582ef30d0b77f9ca3ad88b4263f3c5aea9e7380cb5d7175160aec7e"}, + {file = "mypy-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2529017942b951cc43db2e2712b71cc3aa7e9d90567630c03ed63d430aeec61a"}, + {file = "mypy-2.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0823d7f273f3b4a49df7573eac271ddbf77a0e5f53e24d294a4f0f77ad22e1d7"}, + {file = "mypy-2.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d78a0fc90704894bc9948d78affad14b882b08183a7c30412d185748aaa9418b"}, + {file = "mypy-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6efab25fa3568569fda06928743382900860c48be9200c1758ef5ce94b532714"}, + {file = "mypy-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:daeaf5287091d68f674c91416cabab0f80f36e347ed17fded38d7ebde682e9d1"}, + {file = "mypy-2.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:f8d97940a0259e09c219903579720b2df12170c0c3a3b3799837c1fb63deb44e"}, + {file = "mypy-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea6fe1a30f3e7dc574d641497ffead2428046b0f8bc5804d13b4e4392fdc317b"}, + {file = "mypy-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6965829a6d847a0925f51149472bbeb7a39332fb4801972fdfd9cedd9f8d43a4"}, + {file = "mypy-2.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a906bfc9c4c5de3ece6dc4726f8076d56ce9be1720baf0c6f84e926c10262a4"}, + {file = "mypy-2.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91df92625cb3452758f27f4965b000fb05ad89b00c282cc3430a7bd6b0e5389e"}, + {file = "mypy-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d42893d15894fd34f395090e2d78315ba7c637d5ee221683e02893f578c2f548"}, + {file = "mypy-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3abaeec02cdc72e30a147d99eb81852b6b745a2c8d19607e25241d79b1abbce"}, + {file = "mypy-2.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c39bdb7ceab252d15011e26d3a254b4aaa3bbf121b551febfa301df9b0c69abe"}, + {file = "mypy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:484a2be712b245ac6e89847141f1f50c612b0a924aa25917e63e6cfcf4da07cd"}, + {file = "mypy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb0a020dc68480d40e484675558ed637140df1ccbf896a81ba68bca85f2b50a0"}, + {file = "mypy-2.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc361340732ce7108fa0308812caf02bb6868f16112f1efd35bcad88badf3327"}, + {file = "mypy-2.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b0179a3a0b833f724a65f22613607cf7ea941ab17ec34fa283f8d6dfe21d9fa9"}, + {file = "mypy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e0899b13da1e4ba44b880550f247402ce90ffecc71c54b220bcbe7ecb34f394"}, + {file = "mypy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:511320b17467402e2906130e185abffffa3d7648aff1444fc2abb61f4c8a087d"}, + {file = "mypy-2.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:7589f370b33dcdd95708f5340f13a67c2c49140957f934b42ef63064d343cca0"}, + {file = "mypy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6968f27347ef539c443ddfd6897e79db525ddb8c856aa8fbf14c34f310ca5193"}, + {file = "mypy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3df226d2a0ae2c3b03845af217800a68e2965d4b14914c99b78d3a2c8ae23299"}, + {file = "mypy-2.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc53553996aca2094216ad9306a6f06c5265d206c1bcb54dd367560bd3557825"}, + {file = "mypy-2.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:996abf2f0bebf572556c60720e8dc0cf5292b64060fa68d7f2bc9caa48e01b6f"}, + {file = "mypy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ec287c2381898c652bf8ff79448627fe1a9ee76d22005181fac7315a485c7108"}, + {file = "mypy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2c967a7685fa93fcf1a778b3ebe76e756b28ba14655f539d7b61ff3da69352a"}, + {file = "mypy-2.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:d59a4b80351ec92e5f7415fcdd008bd77fcbefc7adf9cbc7ffe4eb9f71617734"}, + {file = "mypy-2.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1f6c3d76853071409ac58fc0aadfb276a22af5f190fdaa02152a858088a39ebd"}, + {file = "mypy-2.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bdaa177e80cc3292824d4ef3670b5b58771ee8d57c290e0c9c89e7968212332c"}, + {file = "mypy-2.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80923e6d6e7878291f537ee11052f974954c20cb569798429a5dc265eb780b47"}, + {file = "mypy-2.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f24bd465a09077c8d64be8f19a6646db467a55490fd315fe7871afe6bb9645"}, + {file = "mypy-2.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:db34595464869f474708e769413d1d739fc33a69850f253757b9a4cc20bc1fec"}, + {file = "mypy-2.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b48092132c7b0ef4322773fecae62fc5b0bc339be348badeec8af502122a4a51"}, + {file = "mypy-2.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:6fc0e98b95e31755ca06d89f75fafa7820fbb3ea2caace6d83cba17625cd0acb"}, + {file = "mypy-2.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:bc73a5b4d40e8a3e6b12ef82eb0c90430964e34016a36c2aff4e3bfe37ba41f0"}, + {file = "mypy-2.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6257bd4b4c0ae2148548b869a1ff3758e38645b92c8fe65eca401866c3c551c1"}, + {file = "mypy-2.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dfa22b3ae862ac1ce76f5976ddd402651b5f090bcfd49c6d0484b8983a29eaf8"}, + {file = "mypy-2.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30a430bf26fe8cf372f3933fbd83e633d6561868803645a20e4e6d4523f52a3b"}, + {file = "mypy-2.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d58655a60e823b1a4c9ebcda072897fb0193c2f3e6f8e7c433e152aa4cb00233"}, + {file = "mypy-2.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d4452c955caf14e28bb046cbd0c3671272e6381630a8b81b0da9713558148890"}, + {file = "mypy-2.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:68f5b7f7f755200f68c7181e3dfb28be9858162257690e539759c9f57721e388"}, + {file = "mypy-2.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:78d201accfafce3801d978f2b8dbbd473a9ce364cc0a0dfd9192fe47d977e129"}, + {file = "mypy-2.2.0-py3-none-any.whl", hash = "sha256:ecc138da861e932d1344214da4bae866b21900a9c2778824b51fe2fb47f5180e"}, + {file = "mypy-2.2.0.tar.gz", hash = "sha256:2cdd99d48590dce6f6b7f1961eda75386364398fcdaad86923bc0f0231bf9baf"}, +] + +[package.dependencies] +ast-serialize = ">=0.6.0,<1.0.0" +librt = {version = ">=0.12.0", markers = "platform_python_implementation != \"PyPy\""} +mypy_extensions = ">=1.0.0" +pathspec = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing_extensions = [ + {version = ">=4.6.0", markers = "python_version < \"3.15\""}, + {version = ">=4.14.0", markers = "python_version >= \"3.15\""}, +] + +[package.extras] +dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +groups = ["dev"] +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "networkx" +version = "2.8.8" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "networkx-2.8.8-py3-none-any.whl", hash = "sha256:e435dfa75b1d7195c7b8378c3859f0445cd88c6b0375c181ed66823a9ceb7524"}, + {file = "networkx-2.8.8.tar.gz", hash = "sha256:230d388117af870fce5647a3c52401fcf753e94720e6ea6b4197a5355648885e"}, +] + +[package.extras] +default = ["matplotlib (>=3.4)", "numpy (>=1.19)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=0.982)", "pre-commit (>=2.20)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.2)", "pydata-sphinx-theme (>=0.11)", "sphinx (>=5.2)", "sphinx-gallery (>=0.11)", "texext (>=0.6.6)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.9)", "sympy (>=1.10)"] +test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "oscrypto" +version = "1.3.0" +description = "TLS (SSL) sockets, key generation, encryption, decryption, signing, verification and KDFs using the OS crypto libraries. Does not require a compiler, and relies on the OS for patching. Works on Windows, OS X and Linux/BSD." +optional = false +python-versions = "*" +groups = ["main", "dev"] +files = [ + {file = "oscrypto-1.3.0-py2.py3-none-any.whl", hash = "sha256:2b2f1d2d42ec152ca90ccb5682f3e051fb55986e1b170ebde472b133713e7085"}, + {file = "oscrypto-1.3.0.tar.gz", hash = "sha256:6f5fef59cb5b3708321db7cca56aed8ad7e662853351e7991fcf60ec606d47a4"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +asn1crypto = ">=1.5.1" + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pathspec" +version = "1.0.4" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, + {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, +] + +[package.extras] +hyperscan = ["hyperscan (>=0.7)"] +optional = ["typing-extensions (>=4)"] +re2 = ["google-re2 (>=1.1)"] +tests = ["pytest (>=9)", "typing-extensions (>=4.15)"] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +groups = ["main"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "12.2.0" +description = "Python Imaging Library (fork)" +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f"}, + {file = "pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c"}, + {file = "pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3"}, + {file = "pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa"}, + {file = "pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032"}, + {file = "pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5"}, + {file = "pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024"}, + {file = "pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab"}, + {file = "pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176"}, + {file = "pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b"}, + {file = "pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909"}, + {file = "pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808"}, + {file = "pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60"}, + {file = "pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe"}, + {file = "pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5"}, + {file = "pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780"}, + {file = "pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5"}, + {file = "pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5"}, + {file = "pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940"}, + {file = "pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5"}, + {file = "pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c"}, + {file = "pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795"}, + {file = "pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3"}, + {file = "pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9"}, + {file = "pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795"}, + {file = "pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e"}, + {file = "pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b"}, + {file = "pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06"}, + {file = "pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b"}, + {file = "pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4"}, + {file = "pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4"}, + {file = "pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea"}, + {file = "pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24"}, + {file = "pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98"}, + {file = "pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295"}, + {file = "pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed"}, + {file = "pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286"}, + {file = "pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50"}, + {file = "pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104"}, + {file = "pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7"}, + {file = "pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150"}, + {file = "pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1"}, + {file = "pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463"}, + {file = "pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e"}, + {file = "pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06"}, + {file = "pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43"}, + {file = "pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354"}, + {file = "pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1"}, + {file = "pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e"}, + {file = "pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.10.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a"}, + {file = "platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7"}, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +groups = ["main"] +files = [ + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "propcache" +version = "0.2.1" +description = "Accelerated property cache" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, + {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, + {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, + {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, + {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, + {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, + {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, + {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, + {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, + {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, + {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, + {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, + {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, + {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, + {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, + {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, + {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, + {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, + {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, + {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, + {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, + {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, + {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, + {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, + {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, + {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, + {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, + {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +groups = ["main"] +markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pycares" +version = "5.0.1" +description = "Python interface for c-ares" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pycares-5.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:adc592534a10fe24fd1a801173c46769f75b97c440c9162f5d402ee1ba3eaf51"}, + {file = "pycares-5.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8848bbea6b5c2a0f7c9d0231ee455c3ce976c5c85904e014b2e9aa636a34140e"}, + {file = "pycares-5.0.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5003cbbae0a943f49089cc149996c3d078cef482971d834535032d53558f4d48"}, + {file = "pycares-5.0.1-cp310-cp310-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc0cdeadb2892e7f0ab30b6a288a357441c21dcff2ce16e91fccbc9fae9d1e2a"}, + {file = "pycares-5.0.1-cp310-cp310-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:faa093af3bea365947325ec23ed24efe81dcb0efc1be7e19a36ba37108945237"}, + {file = "pycares-5.0.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dedd6d41bd09dbed7eeea84a30b4b6fd1cacf9523a3047e088b5e692cff13d84"}, + {file = "pycares-5.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d3eb5e6ba290efd8b543a2cb77ad938c3494250e6e0302ee2aa55c06bbe153cd"}, + {file = "pycares-5.0.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:58634f83992c81f438987b572d371825dae187d3a09d6e213edbe71fbb4ba18c"}, + {file = "pycares-5.0.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fe9ce4361809903261c4b055284ba91d94adedfd2202e0257920b9085d505e37"}, + {file = "pycares-5.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:965ec648814829788233155ef3f6d4d7e7d6183460d10f9c71859c504f8f488b"}, + {file = "pycares-5.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:171182baa32951fffd1568ba9b934a76f36ed86c6248855ec6f82bbb3954d604"}, + {file = "pycares-5.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:48ac858124728b8bac0591aa8361c683064fefe35794c29b3a954818c59f1e9b"}, + {file = "pycares-5.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c29ca77ff9712e20787201ca8e76ad89384771c0e058a0a4f3dc05afbc4b32de"}, + {file = "pycares-5.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f11424bf5cf6226d0b136ed47daa58434e377c61b62d0100d1de7793f8e34a72"}, + {file = "pycares-5.0.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d765afb52d579879f5c4f005763827d3b1eb86b23139e9614e6089c9f98db017"}, + {file = "pycares-5.0.1-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ea0d57ba5add4bfbcc40cbdfa92bbb8a5ef0c4c21881e26c7229d9bdc92a4533"}, + {file = "pycares-5.0.1-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae9ec2aa3553d33e6220aeb1a05f4853fb83fce4cec3e0dea2dc970338ea47dc"}, + {file = "pycares-5.0.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c63fb2498b05e9f5670a1bf3b900c5d09343b3b6d5001a9714d593f9eb54de1"}, + {file = "pycares-5.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:71316f7a87c15a8d32127ff01374dc2c969c37410693cc0cf6532590b7f18e7a"}, + {file = "pycares-5.0.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a2117dffbb78615bfdb41ad77b17038689e4e01c66f153649e80d268c6228b4f"}, + {file = "pycares-5.0.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7d7c4f5d8b88b586ef2288142b806250020e6490b9f2bd8fd5f634a78fd20fcf"}, + {file = "pycares-5.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:433b9a4b5a7e10ef8aef0b957e6cd0bfc1bb5bc730d2729f04e93c91c25979c0"}, + {file = "pycares-5.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:cf2699883b88713670d3f9c0a1e44ac24c70aeace9f8c6aa7f0b9f222d5b08a5"}, + {file = "pycares-5.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:9528dc11749e5e098c996475b60f879e1db5a6cb3dd0cdc747530620bb1a8941"}, + {file = "pycares-5.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ee551be4f3f3ac814ac8547586c464c9035e914f5122a534d25de147fa745e1"}, + {file = "pycares-5.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:252d4e5a52a68f825eaa90e16b595f9baee22c760f51e286ab612c6829b96de3"}, + {file = "pycares-5.0.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c1aa549b8c2f2e224215c793d660270778dcba9abc3b85abbc7c41eabe4f1e5"}, + {file = "pycares-5.0.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:db7c9c9f16e8311998667a7488e817f8cbeedec2447bac827c71804663f1437e"}, + {file = "pycares-5.0.1-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b9c4c8bb69bab863f677fa166653bb872bfa5d5a742f1f30bebc2d53b6e71db"}, + {file = "pycares-5.0.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09ef90da8da3026fcba4ed223bd71e8057608d5b3fec4f5990b52ae1e8c855cc"}, + {file = "pycares-5.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ce193ebd54f4c74538b751ebb0923a9208c234ff180589d4d3cec134c001840e"}, + {file = "pycares-5.0.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:36b9ff18ef231277f99a846feade50b417187a96f742689a9d08b9594e386de4"}, + {file = "pycares-5.0.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5e40ea4a0ef0c01a02ef7f7390a58c62d237d5ad48d36bc3245e9c2ac181cc22"}, + {file = "pycares-5.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3f323b0ddfd2c7896af6fba4f8851d34d3d13387566aa573d93330fb01cb1038"}, + {file = "pycares-5.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bdc6bcafb72a97b3cdd529fc87210e59e67feb647a7e138110656023599b84da"}, + {file = "pycares-5.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:f8ef4c70c1edaf022875a8f9ff6c0c064f82831225acc91aa1b4f4d389e2e03a"}, + {file = "pycares-5.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d1b2c6b152c65f14d0e12d741fabb78a487f0f0d22773eede8d8cfc97af612b"}, + {file = "pycares-5.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8c8ffcc9a48cfc296fe1aefc07d2c8e29a7f97e4bb366ce17effea6a38825f70"}, + {file = "pycares-5.0.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8efc38c2703e3530b823a4165a7b28d7ce0fdcf41960fb7a4ca834a0f8cfe79"}, + {file = "pycares-5.0.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e380bf6eff42c260f829a0a14547e13375e949053a966c23ca204a13647ef265"}, + {file = "pycares-5.0.1-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:35dd5858ee1246bd092a212b5e85a8ef70853f7cfaf16b99569bf4af3ae4695d"}, + {file = "pycares-5.0.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c257c6e7bf310cdb5823aa9d9a28f1e370fed8c653a968d38a954a8f8e0375ce"}, + {file = "pycares-5.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:07711acb0ef75758f081fb7436acaccc91e8afd5ae34fd35d4edc44297e81f27"}, + {file = "pycares-5.0.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:30e5db1ae85cffb031dd8bc1b37903cd74c6d37eb737643bbca3ff2cd4bc6ae2"}, + {file = "pycares-5.0.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:efbe7f89425a14edbc94787042309be77cb3674415eb6079b356e1f9552ba747"}, + {file = "pycares-5.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5de9e7ce52d638d78723c24704eb032e60b96fbb6fe90c6b3110882987251377"}, + {file = "pycares-5.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:0e99af0a1ce015ab6cc6bd85ce158d95ed89fb3b654515f1d0989d1afcf11026"}, + {file = "pycares-5.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:2a511c9f3b11b7ce9f159c956ea1b8f2de7f419d7ca9fa24528d582cb015dbf9"}, + {file = "pycares-5.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e330e3561be259ad7a1b7b0ce282c872938625f76587fae7ac8d6bc5af1d0c3d"}, + {file = "pycares-5.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82bd37fec2a3fa62add30d4a3854720f7b051386e2f18e6e8f4ee94b89b5a7b0"}, + {file = "pycares-5.0.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:258c38aaa82ad1d565b4591cdb93d2c191be8e0a2c70926999c8e0b717a01f2a"}, + {file = "pycares-5.0.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ccc1b2df8a09ca20eefbe20b9f7a484d376525c0fb173cfadd692320013c6bc5"}, + {file = "pycares-5.0.1-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3c4dfc80cc8b43dc79e02a15486c58eead5cae0a40906d6be64e2522285b5b39"}, + {file = "pycares-5.0.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f498a6606247bfe896c2a4d837db711eb7b0ba23e409e16e4b23def4bada4b9d"}, + {file = "pycares-5.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a7d197835cdb4b202a3b12562b32799e27bb132262d4aa1ac3ee9d440e8ec22c"}, + {file = "pycares-5.0.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f78ab823732b050d658eb735d553726663c9bccdeeee0653247533a23eb2e255"}, + {file = "pycares-5.0.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f444ab7f318e9b2c209b45496fb07bff5e7ada606e15d5253a162964aa078527"}, + {file = "pycares-5.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9de80997de7538619b7dd28ec4371e5172e3f9480e4fc648726d3d5ba661ca05"}, + {file = "pycares-5.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:206ce9f3cb9d51f5065c81b23c22996230fbc2cf58ae22834c623631b2b473aa"}, + {file = "pycares-5.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:45fb3b07231120e8cb5b75be7f15f16115003e9251991dc37a3e5c63733d63b5"}, + {file = "pycares-5.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:602f3eac4b880a2527d21f52b2319cb10fde9225d103d338c4d0b2b07f136849"}, + {file = "pycares-5.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1c3736deef003f0c57bc4e7f94d54270d0824350a8f5ceaba3a20b2ce8fb427"}, + {file = "pycares-5.0.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e63328df86d37150ce697fb5d9313d1d468dd4dddee1d09342cb2ed241ce6ad9"}, + {file = "pycares-5.0.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57f6fd696213329d9a69b9664a68b1ff2a71ccbdc1fc928a42c9a92858c1ec5d"}, + {file = "pycares-5.0.1-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d0878edabfbecb48a29e8769284003d8dbc05936122fe361849cd5fa52722e0"}, + {file = "pycares-5.0.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50e21f27a91be122e066ddd78c2d0d2769e547561481d8342a9d652a345b89f7"}, + {file = "pycares-5.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:97ceda969f5a5d5c6b15558b658c29e4301b3a2c4615523797b5f9d4ac74772e"}, + {file = "pycares-5.0.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4d1713e602ab09882c3e65499b2cc763bff0371117327cad704cf524268c2604"}, + {file = "pycares-5.0.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:954a379055d6c66b2e878b52235b382168d1a3230793ff44454019394aecac5e"}, + {file = "pycares-5.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:145d8a20f7fd1d58a2e49b7ef4309ec9bdcab479ac65c2e49480e20d3f890c23"}, + {file = "pycares-5.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:ebc9daba03c7ff3f62616c84c6cb37517445d15df00e1754852d6006039eb4a4"}, + {file = "pycares-5.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:e0a86eff6bf9e91d5dd8876b1b82ee45704f46b1104c24291d3dea2c1fc8ebcb"}, + {file = "pycares-5.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:89fbb801bd7328d38025ab3576eee697cf9eca1f45774a0353b6a68a867e5516"}, + {file = "pycares-5.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f760ed82ad8b7311ada58f9f68673e135ece3b1beb06d3ec8723a4f3d5dd824e"}, + {file = "pycares-5.0.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94cb140b78bde232f6eb64c95cdac08dac9ae1829bfee1c436932eea10aabd39"}, + {file = "pycares-5.0.1-cp39-cp39-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:83da4b2e30bb80a424337376af0bce1216d787821b71c74d2f2bf3d40ea0bcf9"}, + {file = "pycares-5.0.1-cp39-cp39-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:07260c6c0eff8aa809d6cd64010303098c7d0fe79176aba207d747c9ffc7a95a"}, + {file = "pycares-5.0.1-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e1630844c695fc41e760d653d775d03c61bf8c5ac259e90784f7f270e8c440c"}, + {file = "pycares-5.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8dc84c0bce595c572971c1a9c7a3b417465572382968faac9bfddebd60e946b4"}, + {file = "pycares-5.0.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:83115177cc0f1c8e6fbeb4e483d676f91d0ce90aad2933d5f0c87feccdc05688"}, + {file = "pycares-5.0.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:eb93ea76094c46fd4a1294eb49affcf849d36d9b939322009d2bee7d507fcb20"}, + {file = "pycares-5.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:534dd25083e7ba4c65fedbc94126bada53fe8de4466d9ca29b7aa2ab4eec36b4"}, + {file = "pycares-5.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:52901b7a15a3b99631021a90fa3d1451d42b47b977208928012bf8238f70ba13"}, + {file = "pycares-5.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:153239d8c51f9e051d37867287ee1b283a201076e4cd9f4624ead30c86dfd5c9"}, + {file = "pycares-5.0.1.tar.gz", hash = "sha256:5a3c249c830432631439815f9a818463416f2a8cbdb1e988e78757de9ae75081"}, +] + +[package.dependencies] +cffi = [ + {version = ">=1.5.0", markers = "python_version < \"3.14\""}, + {version = ">=2.0.0b1", markers = "python_version >= \"3.14\""}, +] + +[package.extras] +idna = ["idna (>=2.1)"] + +[[package]] +name = "pycodestyle" +version = "2.14.0" +description = "Python style guide checker" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"}, + {file = "pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783"}, +] + +[[package]] +name = "pycountry" +version = "26.2.16" +description = "ISO country, subdivision, language, currency and script definitions and their translations" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "pycountry-26.2.16-py3-none-any.whl", hash = "sha256:115c4baf7cceaa30f59a4694d79483c9167dbce7a9de4d3d571c5f3ea77c305a"}, + {file = "pycountry-26.2.16.tar.gz", hash = "sha256:5b6027d453fcd6060112b951dd010f01f168b51b4bf8a1f1fc8c95c8d94a0801"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] +markers = {main = "implementation_name != \"PyPy\"", dev = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\""} + +[[package]] +name = "pyflakes" +version = "3.4.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"}, + {file = "pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58"}, +] + +[[package]] +name = "pygments" +version = "2.20.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, + {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyhanko" +version = "0.25.3" +description = "Tools for stamping and signing PDF files" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "pyHanko-0.25.3-py3-none-any.whl", hash = "sha256:d66ec499f057191df100f322c2fd22949057a9b0d981f4e75bc077c1a817497f"}, + {file = "pyhanko-0.25.3.tar.gz", hash = "sha256:e879fd44e20f4b7726e75c62e8c7b0c41ea41f8fa5bda626bc7d206ae3d30dec"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +asn1crypto = ">=1.5.1" +click = ">=8.1.3" +cryptography = ">=43.0.3" +pyhanko-certvalidator = ">=0.26.5,<0.27" +pyyaml = ">=6.0" +qrcode = ">=7.3.1" +requests = ">=2.31.0" +tzlocal = ">=4.3" + +[package.extras] +async-http = ["aiohttp (>=3.9,<3.12)"] +docs = ["sphinx", "sphinx-rtd-theme"] +etsi = ["xsdata (>=24.4,<25.0)"] +extra-pubkey-algs = ["oscrypto (>=1.2.1)"] +image-support = ["Pillow (>=7.2.0)", "python-barcode (==0.15.1)"] +live-test = ["certomancer-csc-dummy (==0.3.0)", "certomancer[web-api] (>=0.12.3,<0.13)", "pyHanko[async-http,extra-pubkey-algs,testing-basic,xmp]", "pytest-aiohttp (>=1.0.4,<1.1.0)", "pytest-cov (>=4.0,<6.1)"] +mypy = ["pyHanko[async-http,etsi,extra-pubkey-algs,image-support,opentype,pkcs11,xmp]", "types-PyYAML", "types-python-dateutil", "types-requests", "types-tzlocal"] +opentype = ["fonttools (>=4.33.3)", "uharfbuzz (>=0.25.0,<0.43.0)"] +pkcs11 = ["python-pkcs11 (>=0.7.0,<0.8.0)"] +testing = ["certomancer-csc-dummy (==0.3.0)", "pyHanko[async-http,extra-pubkey-algs,image-support,opentype,pkcs11,testing-basic,xmp]", "pyHanko[etsi]", "pytest-aiohttp (>=1.0.4,<1.1.0)"] +testing-basic = ["backports.zoneinfo[tzdata] ; python_version < \"3.9\"", "certomancer (>=0.12.3,<0.13)", "freezegun (>=1.1.0)", "pytest (>=6.1.1)", "pytest-asyncio (==0.24.0)", "pytest-cov (>=4.0,<6.1)", "requests-mock (>=1.8.0)"] +xmp = ["defusedxml (>=0.7.1,<0.8.0)"] + +[[package]] +name = "pyhanko-certvalidator" +version = "0.26.5" +description = "Validates X.509 certificates and paths; forked from wbond/certvalidator" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "pyhanko_certvalidator-0.26.5-py3-none-any.whl", hash = "sha256:86a56df420bfb273ba881826b76245a53b2bd039fea7a7826231dbe76d761a8a"}, + {file = "pyhanko_certvalidator-0.26.5.tar.gz", hash = "sha256:800f5a7744d23870a5203cb38007689902c79c44e7374dab0c9b02e1b1a89bd4"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +asn1crypto = ">=1.5.1" +cryptography = ">=41.0.5" +oscrypto = ">=1.1.0" +requests = ">=2.31.0" +uritools = ">=3.0.1" + +[package.extras] +async-http = ["aiohttp (>=3.8,<3.11)"] +mypy = ["pyhanko-certvalidator[testing]", "types-requests"] +testing = ["aiohttp (>=3.8,<3.11)", "freezegun (>=1.1.0)", "pyhanko-certvalidator[async-http]", "pytest (>=6.1.1)", "pytest-aiohttp (>=1.0.4,<1.1.0)", "pytest-cov (>=4.0,<6.1)"] + +[[package]] +name = "pypdf" +version = "6.13.3" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "pypdf-6.13.3-py3-none-any.whl", hash = "sha256:c6e3f86afb625791510b02ad5480e94b63970bb957df75d44657c282ecc52224"}, + {file = "pypdf-6.13.3.tar.gz", hash = "sha256:f3cb822769725f1bac658c406cfc9460399043f3750c2d3e4650e0a85eacabd7"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +typing_extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +crypto = ["cryptography (>3.0)"] +cryptodome = ["PyCryptodome"] +dev = ["flit", "pip-tools", "pre-commit", "pytest-cov", "pytest-socket", "pytest-timeout", "pytest-xdist", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +fonts = ["fonttools"] +full = ["Pillow (>=8.0.0)", "cryptography (>3.0)", "fonttools"] +image = ["Pillow (>=8.0.0)"] + +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + +[[package]] +name = "pytest" +version = "9.1.1" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c"}, + {file = "pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313"}, +] + +[package.dependencies] +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=1.0.1" +packaging = ">=22" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "1.4.0" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1"}, + {file = "pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42"}, +] + +[package.dependencies] +backports-asyncio-runner = {version = ">=1.1,<2", markers = "python_version < \"3.11\""} +pytest = ">=8.4,<10" +typing-extensions = {version = ">=4.12", markers = "python_version < \"3.13\""} + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)", "sphinx-tabs (>=3.5)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678"}, + {file = "pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2"}, +] + +[package.dependencies] +coverage = {version = ">=7.10.6", extras = ["toml"]} +pluggy = ">=1.2" +pytest = ">=7" + +[package.extras] +testing = ["process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "pytest-httpserver" +version = "1.1.5" +description = "pytest-httpserver is a httpserver for pytest" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "pytest_httpserver-1.1.5-py3-none-any.whl", hash = "sha256:ee83feb587ab652c0c6729598db2820e9048233bac8df756818b7845a1621d0a"}, + {file = "pytest_httpserver-1.1.5.tar.gz", hash = "sha256:dc3d82e1fe00e491829d8939c549bf4bd9b39a260f87113c619b9d517c2f8ff1"}, +] + +[package.dependencies] +Werkzeug = ">=2.0.0" + +[[package]] +name = "pytest-rerunfailures" +version = "16.4" +description = "pytest plugin to re-run tests to eliminate flaky failures" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "pytest_rerunfailures-16.4-py3-none-any.whl", hash = "sha256:f69b5beb39622c90d1e44bd945d826eff6db545dcf0b68f52b7e4ad15eaf6d6c"}, + {file = "pytest_rerunfailures-16.4.tar.gz", hash = "sha256:8222d17c37eb7b9e4d6fc96a3c724ff4e1a5c97a5cc7cbb2c19e9282cfd21a11"}, +] + +[package.dependencies] +packaging = ">=17.1" +pytest = ">=8.2,<8.2.2 || >8.2.2" + +[[package]] +name = "python-bidi" +version = "0.6.11" +description = "Python Bidi layout wrapping the Rust crate unicode-bidi" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "python_bidi-0.6.11-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a9aa2890661b238730e680ccd6eb06f4da625b2dbc1730052dae6f2d88957192"}, + {file = "python_bidi-0.6.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41c7d1914c1f33954aa2ab0e2c309be5d1d4afc75ce524762eaab4dd825c5ab8"}, + {file = "python_bidi-0.6.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57aa56b1eca5f63ebdd25fe8fad02eab7797fc45ad1efc5eed2a830e2bd2038d"}, + {file = "python_bidi-0.6.11-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d5695d87969fed5b3799b8a98848cb04fe2873fded46efe9f3f2f341efd1b829"}, + {file = "python_bidi-0.6.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da51a3a2940478219f19249fcf7cd45e8ddc197982be22efa43c4763e9d2eb57"}, + {file = "python_bidi-0.6.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:56807e0dde88d5ab96880c9d668bda7bca1df83cd30d20cbff5d6b6e6c1e9276"}, + {file = "python_bidi-0.6.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1115f3f02eb836b39e0c986a6b9e92c4377a1e5a680409650b02ec6b1a795e6"}, + {file = "python_bidi-0.6.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ad5f712a32be30d28eb96e119e85818747a43cea253de6c3160b464b62a5619"}, + {file = "python_bidi-0.6.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8013c1e6267a929be98d10c3a617171709c8226bd33c6180ec65e560c35b6df8"}, + {file = "python_bidi-0.6.11-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:ff675d036823bff05a2e0f8cdb13f5414274ff517d13b0d57c15527015eb6acb"}, + {file = "python_bidi-0.6.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fa2848c3116d619870d114471fcd4a9f1aa43587a002111d7af1e6582f1b57e9"}, + {file = "python_bidi-0.6.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:493655043ebea6fec0edb76053bdad46f1f7352a759ca4deb733f13b3c09839c"}, + {file = "python_bidi-0.6.11-cp310-cp310-win32.whl", hash = "sha256:62a6b700f3d7a2c4d52a5dccca765711a2414e734360b00365e155698a26e461"}, + {file = "python_bidi-0.6.11-cp310-cp310-win_amd64.whl", hash = "sha256:fccd1808bb427d6a6d34168461bef551faa93ce3dda489fcef9073bcd9b34a5e"}, + {file = "python_bidi-0.6.11-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:56f27c1edfd15c12c9c348378ccd79166930d720cf316b1181a0a0ade2146253"}, + {file = "python_bidi-0.6.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a52f7ad9ef9091e81869e5d255e796755ccf542ade14dda17647cb7d7ffe1b9c"}, + {file = "python_bidi-0.6.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4ebc24ac38e50676f65daf7ba6c568789660cb60d6dcf2606d4310dba826721"}, + {file = "python_bidi-0.6.11-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:969ee7db3e169fcc0b2d2d094826e03cc5798dfd6b3571a340ea883672396cb1"}, + {file = "python_bidi-0.6.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d496f9fc21b7457e12395e54088ab99776966c663b4cd4a74770c7a6418ab59"}, + {file = "python_bidi-0.6.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad5d9b8e8a6c330208eba413db506de58f21dbf88a1f1d5d75ef5f9e0e714adf"}, + {file = "python_bidi-0.6.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acccb6d90e694684db2d314db2e2b0d3b8949bf1cfaec6d9808a8889f548add7"}, + {file = "python_bidi-0.6.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1b5ee069001bf7f4fff109598a9396caa96bb35e1b906b2c6d1bab9f9b2c4bd"}, + {file = "python_bidi-0.6.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:619ee3fe03daec8d3ce12239f0c22455676a063b2bcde361caecd788fae5b8d5"}, + {file = "python_bidi-0.6.11-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:af7711cc6eeeadcb1aae877e0736a68e111c73a29562da6106c5e2fbb4dd83b2"}, + {file = "python_bidi-0.6.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b2c759e13ebb81edaac3041697328bb1ca8433b55281723879f6b54e74881240"}, + {file = "python_bidi-0.6.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b433840a924c8788f0abbda15d22c71dc636e2078d7d3ba39369cebe4bef74b8"}, + {file = "python_bidi-0.6.11-cp311-cp311-win32.whl", hash = "sha256:8b6b7fce8f47578be9aebf5a0b6b2d6c157b4e97af7586ecf13bfca5d128deea"}, + {file = "python_bidi-0.6.11-cp311-cp311-win_amd64.whl", hash = "sha256:555cdf9303c40bae1ab512ca427f1f0316a574bc0a48db22eec76ec0fd1213cf"}, + {file = "python_bidi-0.6.11-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:83ee87feb5eafc0442e1db0014dad20d52a2a7a140b6cddc8f7bc65918f0a7b4"}, + {file = "python_bidi-0.6.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d6970b09f5a3102c0aa192f5258c585742ab4ebd94f637a635ad3448ccba567"}, + {file = "python_bidi-0.6.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:495a76c881d78ab87b57c5270679c9bc3c1de36d8c6596d5e3a5a1b5f9c57471"}, + {file = "python_bidi-0.6.11-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9af2b5c26a3eb960699dff040535a86dc2c0f708087b2d63bcfd6452fe9d0664"}, + {file = "python_bidi-0.6.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f99162d6c6c9522c46eb213f1bc932829c2602131676c92f081cb865b8ef6784"}, + {file = "python_bidi-0.6.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:caee7ee3662eab1411b44fef8571b87273cb5235061d7463ebd10e412ac07986"}, + {file = "python_bidi-0.6.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611d13b53d4c899c4f2a7cd8eb897064e8b5546c3c5d1037dd6209c82858a27"}, + {file = "python_bidi-0.6.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ca92a4e460f7e25e434a6d7982d94a4765ca242f527995da70abb5a32003b8a"}, + {file = "python_bidi-0.6.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:539d99efe02f4981171ed57bbc085094ef780405ca14663550a56c6c3e265c34"}, + {file = "python_bidi-0.6.11-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9435acc52438c3c8f5142b9a17a622927618e80a32eed707343bc375cb51cebe"}, + {file = "python_bidi-0.6.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:239a00b2adb5f897d11d7b7a491d759fb9883e71a71cfd90c4147a733b4df4d3"}, + {file = "python_bidi-0.6.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:51915502898c45e9cb36636e974aca068fc5cdb9f06b794f49abea5b12f02016"}, + {file = "python_bidi-0.6.11-cp312-cp312-win32.whl", hash = "sha256:6c92d1cad16f9ec2f2a3ae439a0bc3a8e4189ec227987bed03d5b4056d5eb9c5"}, + {file = "python_bidi-0.6.11-cp312-cp312-win_amd64.whl", hash = "sha256:0608bddcc1c53dfa5293499de13ca9935b31aa46d1c722c404a88c703d1a4e47"}, + {file = "python_bidi-0.6.11-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1b41cc6bc9ad78a12da5f987da15e931c771f18ceca58f2fe8ed50f253490a97"}, + {file = "python_bidi-0.6.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4d00757ef7bbbf14d8628f9bdb6b0e168d5e7b03fec20da3226624f11bffce89"}, + {file = "python_bidi-0.6.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:302f4ca7dabfe447e707d40e98520551181036c15750bdd1e73292ad8b3d8e75"}, + {file = "python_bidi-0.6.11-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:721697187f4da67dafc26f63488f463fa35ff2de8668d959fda773cccdbef0eb"}, + {file = "python_bidi-0.6.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da9e536546f7c62c0da595c8f71a096e0b9a80e94cfd0f329b7b200ef81e7d5"}, + {file = "python_bidi-0.6.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d52ec8ccdc2fd5c61749d876a9d1eb0ea6543c1676722e1e3fb9d7800852131c"}, + {file = "python_bidi-0.6.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74457b43db34f984252e915828b5d1a4042a771f44e853a5643506d01562eccb"}, + {file = "python_bidi-0.6.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:397f7f289eba6ce25d99dbea99f873d699bf9aa030074e7fb746d8f93c2fb6f9"}, + {file = "python_bidi-0.6.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:946b7dbec4e64017680f1a66b3a8534659d889018ac83bd2abf958278e6f62b0"}, + {file = "python_bidi-0.6.11-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:380b70d615647646dbe06f7d95dc30b8fdc9b596dbfa1cd3814feb9805c0c8f2"}, + {file = "python_bidi-0.6.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ffd728f1f7866ff7399906bbc17ef5cf010b90ce56a1e94937b28a1a4cf5a7d"}, + {file = "python_bidi-0.6.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:36f23f12d9b1c56ed8d82e11f56c6cba7bc3f614ee73374bc7772bb2270e0966"}, + {file = "python_bidi-0.6.11-cp313-cp313-win32.whl", hash = "sha256:79df1099a08e53edb678236d4d76d8de4e3901bafc84ce1788b71f9b96547325"}, + {file = "python_bidi-0.6.11-cp313-cp313-win_amd64.whl", hash = "sha256:f563d20481f7d316adf605bb94d5b7182acecdbc4d431d60473e9b1d526d0210"}, + {file = "python_bidi-0.6.11-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5f3e1743b2d43377c4da5d687a03430a27f5769e158a9f75a50b05e7e82f4d21"}, + {file = "python_bidi-0.6.11-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6d9ef69c108b31f38e1f281a55fdedad7774bc1e952a45c8c14a18e891eee397"}, + {file = "python_bidi-0.6.11-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30d543b5baf9fca5ef5ec95647aa07c5e38fc7fa0f18be0c61d1d6c0a1032c6c"}, + {file = "python_bidi-0.6.11-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d14f2d400c75e07d1154299463a3d4d14aa5565b05088b2d9b314ccd9fd6dc3a"}, + {file = "python_bidi-0.6.11-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4f4a0cd24c09df748bfdc207b089c00e7af19f3151063f4cd74ac658290186b"}, + {file = "python_bidi-0.6.11-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ff75d1befc335cbe85f834e81554a024f94d9b5d1dd75a5bd99af81a1cb783c"}, + {file = "python_bidi-0.6.11-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:959335cd3814cb767fb832c5c71cbc838ccd9231a812ef2cb43092a216a91d5b"}, + {file = "python_bidi-0.6.11-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:20ab47a4098577fc9a82816c330c89ff597c31ba69c98bc6a1b6a5737b03de05"}, + {file = "python_bidi-0.6.11-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:60d9bf6c60c022657637f64897e63dc3f5b1c07cb7f0e1ead6150aff5150c5ab"}, + {file = "python_bidi-0.6.11-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:cd564b8c583eba2d230d02d0467fd840045f08856b6524555cfff7f32af63c72"}, + {file = "python_bidi-0.6.11-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fc3b0a6e2460f68de9ab98f71e3098bb21bb984563417ad104dec7ab08ebcadc"}, + {file = "python_bidi-0.6.11-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3bdb64ee0a74951465cd4a761e1029e73806ff43b2fe5be98643e52da5cabb66"}, + {file = "python_bidi-0.6.11-cp314-cp314-win32.whl", hash = "sha256:f237ebb570fd8bbe479b6967374d82b7f0b26f9452c276bdd5f793d83e7062bd"}, + {file = "python_bidi-0.6.11-cp314-cp314-win_amd64.whl", hash = "sha256:8fbb6d222b50324fb9d49b6ff0f8566fa97b907a68c00e6622fcf34463104f4a"}, + {file = "python_bidi-0.6.11-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:43f3e81bdd36f49171b7de6cf471086df503c29555f6f7f035ebe8f8ec1da779"}, + {file = "python_bidi-0.6.11-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d7291e13496cb74fc1b71f7f1e3628586afefa531102bb4fa7af9c2d543efc3c"}, + {file = "python_bidi-0.6.11-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ccf1fe9ecb3b02a1a11b103cd2557e2653d82c141b6e2dccec8177e6af5c4bb"}, + {file = "python_bidi-0.6.11-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f400a30573774a1e90c0d50d43c35d9c004afcf53de801bbfd259f84ea80f31c"}, + {file = "python_bidi-0.6.11-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:788c11c84b520ea973992cc95751d56b783ff5857df504c1347d99cacd2fcfe7"}, + {file = "python_bidi-0.6.11-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:879c3fba3e7511c7d01020449d970ca7d6a593f20cfc47c014d3d229a38930b2"}, + {file = "python_bidi-0.6.11-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dc112e2239f69913273cbb0c050ca816b145b32037d4266c430159c5ddcdab2"}, + {file = "python_bidi-0.6.11-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19bae96ff1ee76b3a7dc962598b69426538e3021460cf85a4017437548ab6947"}, + {file = "python_bidi-0.6.11-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:565d819fddb2bbc58c42ca5c97d73da7567f181115011e8f04c76b9d08378dcd"}, + {file = "python_bidi-0.6.11-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:e6c474618a7b6a50c10007f8a9edb50def6d98d297a07a34dc2fb82c344f2b8b"}, + {file = "python_bidi-0.6.11-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:73c38c604bfc01647c69ce38e5cf8b4206e2ede91ca3eb8e5d79b7409f17e0b3"}, + {file = "python_bidi-0.6.11-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c26cd9d81f820159026b1c99905ca12bf13892e3f6a9303359fef42fe6f39e50"}, + {file = "python_bidi-0.6.11-cp314-cp314t-win32.whl", hash = "sha256:dfbb9ba8343a60daf4ced67c11d551dafe9a3c94892c326e4c216fa2e6eca802"}, + {file = "python_bidi-0.6.11-cp314-cp314t-win_amd64.whl", hash = "sha256:6623683fe39b9fbf508e3069f17e8e9cab26143f9d9f89c8a8f45424c052df4f"}, + {file = "python_bidi-0.6.11-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:2b208fc26ab2c7adfd2c4d84753a5045f664e0bec19ca462af2406132e62f92e"}, + {file = "python_bidi-0.6.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:19d13c70b1f7bb5dc69866a11624f3b78123807b4ede18f4f99f656ed86babec"}, + {file = "python_bidi-0.6.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6aca20472d7040bc1f0aadb510cb20d40b3d6caa4c8bf82d075ba2650a41652"}, + {file = "python_bidi-0.6.11-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a873e6f8ab28b5a56201d5cdb98f4c7d2ff88e636a58659c5ac271e287001658"}, + {file = "python_bidi-0.6.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60150bffbe43bfc1e356c0c2900ba643a02ce09c37bc0c553c4d83e5c3de63ad"}, + {file = "python_bidi-0.6.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab8af1cc29c3f400a0f781d50f8ab52a8c63adf2fcef16f14641cd97e06a80e0"}, + {file = "python_bidi-0.6.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dd49c11ae87ee6ced68594faa78b34a89a1a3c43647fa6157765f9726f9daf3"}, + {file = "python_bidi-0.6.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7c4dc0d1328321aeb08054be654e1d39f171d5aae8dca931c9332860f18f57d7"}, + {file = "python_bidi-0.6.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9d18916c97855d68515ca2b3581948b6d864c304cd386210ab5aff5e0fb9be2c"}, + {file = "python_bidi-0.6.11-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:56dfa3c1c13cb89da39a4e8f2f9442e4291de01877511a13f830125d36e9ce5b"}, + {file = "python_bidi-0.6.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ce2ef68dce82ae4067cf28910224d77b45eb2c2b3904db6eb670d1cddb8d0eb2"}, + {file = "python_bidi-0.6.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:68c3e570f2908ac39db0b269f5648e257fab5204344b9bf6dae80852ae4cbe1c"}, + {file = "python_bidi-0.6.11-cp38-cp38-win32.whl", hash = "sha256:1a639a2c62f825e72eb42901fd1c69296d09c192ae003195e6cf773f92d6bb42"}, + {file = "python_bidi-0.6.11-cp38-cp38-win_amd64.whl", hash = "sha256:7cb34dd8d22ca1847653c0e1cbba8fd96de09c24b8c83b7805eab270c81e863a"}, + {file = "python_bidi-0.6.11-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c17393753ddb77377f754ba2a88cacfe3056040a8a5dff8d43f9d5e51bbe1edc"}, + {file = "python_bidi-0.6.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e142820537e08d567c2c017e26df05f88856a03f0f3948209cfcdc39617df363"}, + {file = "python_bidi-0.6.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:777fb44a6f1e91d6adde36e815024c210b0208f35d00762880257b8fb04dc849"}, + {file = "python_bidi-0.6.11-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519eb90bedb04b5cbba0bfc8062984a5ba054a019d81ada34053dc67397d61cb"}, + {file = "python_bidi-0.6.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55fa5b22cc8c220a6daf077570a8e29d3b607bd978bd3dbc04b445d01a17de57"}, + {file = "python_bidi-0.6.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f9ed312d445a691c0afec995ca4f726abe357d8da500e389f77fb874fa7ef76"}, + {file = "python_bidi-0.6.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f27bd2cdeca96f46448a741d393575fbedfc70e38e09dbb030ed98dba8cf2a"}, + {file = "python_bidi-0.6.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8655ac559dcfce7179b150ebcc207982d4d60e67b3089b2032eed3a0a78c07a"}, + {file = "python_bidi-0.6.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f0ee4e80dd3b2a46868dcc73e00aa59f99c0e1de54a2ba783faf0fddba2ccce2"}, + {file = "python_bidi-0.6.11-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:0d339c4ebf3c2501d7569971a22e762fb45d8af7e19a0573afe260d69b35fb0d"}, + {file = "python_bidi-0.6.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dc69d594682fbedec7d0cc81cd4d5f14fb40b6b365587238fafb91509cfea020"}, + {file = "python_bidi-0.6.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:337ec315f8b286399e411f5bfc339fc2124db07757409b0595ceb46de087c4cd"}, + {file = "python_bidi-0.6.11-cp39-cp39-win32.whl", hash = "sha256:94f7f66bd7680d3f2085adaeea91c01b3281a79bb5041db1a51cbe8af36a9d88"}, + {file = "python_bidi-0.6.11-cp39-cp39-win_amd64.whl", hash = "sha256:490118f4af5a3535923c76be07e937ef1cb4cf84c489b37471aa95455fe923b3"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:8eb09af209cd660fa9689f6ce9e61e73c8afa4829ae61801deea7f6e32263800"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7a8429d0d65232e314b4f494825c1205abcc3039f42bf7da80424a15b731709"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6b3c853f99172ef22e5a16c8114cf243e351c8e70f72a894164088c2c99d9cb"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:69d1f4ee17644e8aeac93a7238ee2f28d79b0180815441eb511b77e6585aa971"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80cfe97e2d65981be877ae5bd2338c6919a7cc1171fc308c8b8c7c306ba6ffd8"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:83c780f7e4c3dd3f020db75dc425567981e65c6d5571b3c0372203d0df92c834"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac819cac1abb15486c48af3399a5c726e89f0977a3aff205ac162533186e756"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63d9dcc714d549a5118ebc93b7a7c903a0c1feec8e57f5fcacf98d984b76325b"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d73a821873c52635321196cfb8d3a231d7917ca284cf2bcd9422f6deb19db7ca"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:bde89739a979d9eb3ac48c4882c8a42dd528a7708b0faa99b90b551588bd5f8d"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:7738cfc7ee9fcdff3fef76b40007982ce7704010a51df307c4a51d378f5ff1ba"}, + {file = "python_bidi-0.6.11-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:cf4e88a6fec81b7155a487cbbea7753a3d9a76dc4d391b4f8958b37227ef2c12"}, + {file = "python_bidi-0.6.11.tar.gz", hash = "sha256:034090c597af250d699299d7e7f1e83eb016f9e47b3b707bd89ab2bdec77bce0"}, +] +markers = {main = "extra == \"pdf\""} + +[package.extras] +dev = ["nox", "pytest"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-socks" +version = "2.5.3" +description = "Core proxy (SOCKS4, SOCKS5, HTTP tunneling) functionality for Python" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "python_socks-2.5.3-py3-none-any.whl", hash = "sha256:6bc428d0e19f8043e7b8fbc8af33417e690238bd8c9c1e9215871ac18c6136ad"}, + {file = "python_socks-2.5.3.tar.gz", hash = "sha256:4414b2a24777e439758a5f4644f81509ee634e6893115fe7fd1ec482b4b5c979"}, +] + +[package.dependencies] +async-timeout = {version = ">=3.0.1", optional = true, markers = "python_version < \"3.11\" and extra == \"asyncio\""} + +[package.extras] +anyio = ["anyio (>=3.3.4,<5.0.0)"] +asyncio = ["async-timeout (>=3.0.1) ; python_version < \"3.11\""] +curio = ["curio (>=1.4)"] +trio = ["trio (>=0.16.0)"] + +[[package]] +name = "pytokens" +version = "0.4.1" +description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5"}, + {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe"}, + {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c"}, + {file = "pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7"}, + {file = "pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2"}, + {file = "pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440"}, + {file = "pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc"}, + {file = "pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d"}, + {file = "pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16"}, + {file = "pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6"}, + {file = "pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083"}, + {file = "pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1"}, + {file = "pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1"}, + {file = "pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9"}, + {file = "pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68"}, + {file = "pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b"}, + {file = "pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f"}, + {file = "pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1"}, + {file = "pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4"}, + {file = "pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78"}, + {file = "pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321"}, + {file = "pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa"}, + {file = "pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d"}, + {file = "pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324"}, + {file = "pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9"}, + {file = "pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb"}, + {file = "pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3"}, + {file = "pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975"}, + {file = "pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a"}, + {file = "pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918"}, + {file = "pytokens-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc"}, + {file = "pytokens-0.4.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009"}, + {file = "pytokens-0.4.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1"}, + {file = "pytokens-0.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6"}, + {file = "pytokens-0.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037"}, + {file = "pytokens-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3"}, + {file = "pytokens-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1"}, + {file = "pytokens-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db"}, + {file = "pytokens-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1"}, + {file = "pytokens-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a"}, + {file = "pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de"}, + {file = "pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a"}, +] + +[package.extras] +dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"] + +[[package]] +name = "pyvis" +version = "0.3.2" +description = "A Python network graph visualization library" +optional = false +python-versions = ">3.6" +groups = ["main"] +files = [ + {file = "pyvis-0.3.2-py3-none-any.whl", hash = "sha256:5720c4ca8161dc5d9ab352015723abb7a8bb8fb443edeb07f7a322db34a97555"}, +] + +[package.dependencies] +ipython = ">=5.3.0" +jinja2 = ">=2.9.6" +jsonpickle = ">=1.4.1" +networkx = ">=1.11" + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] +markers = {main = "extra == \"pdf\""} + +[[package]] +name = "qrcode" +version = "8.0" +description = "QR Code image generator" +optional = false +python-versions = "<4.0,>=3.9" +groups = ["main", "dev"] +files = [ + {file = "qrcode-8.0-py3-none-any.whl", hash = "sha256:9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1"}, + {file = "qrcode-8.0.tar.gz", hash = "sha256:025ce2b150f7fe4296d116ee9bad455a6643ab4f6e7dce541613a4758cbce347"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +all = ["pillow (>=9.1.0)", "pypng"] +pil = ["pillow (>=9.1.0)"] +png = ["pypng"] + +[[package]] +name = "reportlab" +version = "4.5.1" +description = "The Reportlab Toolkit" +optional = false +python-versions = "<4,>=3.9" +groups = ["main", "dev"] +files = [ + {file = "reportlab-4.5.1-py3-none-any.whl", hash = "sha256:06fce8cb56c83307cfa4909cdf4e6a2ddbb44e5d6ef4d2edca896d7e9769f091"}, + {file = "reportlab-4.5.1.tar.gz", hash = "sha256:9fdf68f4de9171ec66acb4a5feed8f8ca2af43479e707a6fbb0daa75d88e5494"}, +] + +[package.dependencies] +charset-normalizer = "*" +pillow = ">=9.0.0" + +[package.extras] +accel = ["rl_accel (>=0.9.0,<1.1)"] +bidi = ["rlbidi"] +pycairo = ["freetype-py (>=2.3.0,<2.4)", "rlPyCairo (>=0.2.0,<1)"] +renderpm = ["rl_renderPM (>=4.0.3,<4.1)"] +shaping = ["uharfbuzz"] + +[[package]] +name = "requests" +version = "2.34.2" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0"}, + {file = "requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed"}, +] + +[package.dependencies] +certifi = ">=2023.5.7" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.26,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] + +[[package]] +name = "rich" +version = "14.3.3" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d"}, + {file = "rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "socid-extractor" +version = "0.1.0" +description = "Extract accounts' identifiers and metadata from personal pages on various platforms." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "socid_extractor-0.1.0-py3-none-any.whl", hash = "sha256:d19303436f97d394a937ccab576e60fa107aeb2b2cb56a158dcdf62cd8953b05"}, + {file = "socid_extractor-0.1.0.tar.gz", hash = "sha256:94e5e35be06fc3b281900122e12e8feb1a895b189417e311e07f219522d0789e"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.14.3,<5.0" +python-dateutil = ">=2.8.1,<3.0" +requests = ">=2.32.4,<3.0" + +[package.extras] +dev = ["black (>=25.1,<27.0)", "flake8 (>=7.1,<8.0)", "mypy (>=1.14,<3.0)", "pytest (>=9.0,<10.0)", "pytest-rerunfailures (>=16.2,<17.0)", "pytest-xdist (>=3.8,<4.0)"] +test = ["pytest (>=9.0,<10.0)", "pytest-rerunfailures (>=16.2,<17.0)", "pytest-xdist (>=3.8,<4.0)"] + +[[package]] +name = "soupsieve" +version = "2.8.4" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65"}, + {file = "soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "svglib" +version = "2.0.2" +description = "A pure-Python library for reading and converting SVG" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "svglib-2.0.2-py3-none-any.whl", hash = "sha256:0fd04f1eb593802060427d6a59ab5127d65db6b8f5750d572f7df25097e36503"}, + {file = "svglib-2.0.2.tar.gz", hash = "sha256:455e473dbe7066eea55c39de8194a6a3b646b6c37a255700257fd32115ddb218"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +cssselect2 = ">=0.2.0" +lxml = ">=6.0.0" +pillow = ">=9.0.0" +reportlab = ">=4.4.3" +tinycss2 = ">=0.6.0" + +[package.extras] +bitmaps = ["rlpycairo (>=0.4.0)"] + +[[package]] +name = "tinycss2" +version = "1.4.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +markers = "python_full_version <= \"3.11.0a6\"" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "tuna" +version = "0.5.15" +description = "Visualize Python performance profiles" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "tuna-0.5.15-py3-none-any.whl", hash = "sha256:889a62552067133e86851cebb1042bfc28242141ea80d4ae9c64142d86e060a3"}, + {file = "tuna-0.5.15.tar.gz", hash = "sha256:0109ab102374ecf5d47f950267b516b6009c3cf48e8caba3b2c859ed3f6fb996"}, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +description = "Backported and Experimental Type Hints for Python 3.9+" +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8"}, + {file = "typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5"}, +] + +[[package]] +name = "tzdata" +version = "2024.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["main", "dev"] +files = [ + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, +] +markers = {main = "extra == \"pdf\" and platform_system == \"Windows\"", dev = "platform_system == \"Windows\""} + +[[package]] +name = "tzlocal" +version = "5.2" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, + {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + +[[package]] +name = "uritools" +version = "4.0.3" +description = "URI parsing, classification and composition" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] +files = [ + {file = "uritools-4.0.3-py3-none-any.whl", hash = "sha256:bae297d090e69a0451130ffba6f2f1c9477244aa0a5543d66aed2d9f77d0dd9c"}, + {file = "uritools-4.0.3.tar.gz", hash = "sha256:ee06a182a9c849464ce9d5fa917539aacc8edd2a4924d1b7aabeeecabcae3bc2"}, +] +markers = {main = "extra == \"pdf\""} + +[[package]] +name = "urllib3" +version = "2.7.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.10" +groups = ["main", "dev"] +files = [ + {file = "urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897"}, + {file = "urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c"}, +] + +[package.extras] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +groups = ["main", "dev"] +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "werkzeug" +version = "3.1.6" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.9" +groups = ["main", "dev"] +files = [ + {file = "werkzeug-3.1.6-py3-none-any.whl", hash = "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131"}, + {file = "werkzeug-3.1.6.tar.gz", hash = "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25"}, +] + +[package.dependencies] +markupsafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "xhtml2pdf" +version = "0.2.17" +description = "PDF generator using HTML and CSS" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "xhtml2pdf-0.2.17-py3-none-any.whl", hash = "sha256:61a7ecac829fed518f7dbcb916e9d56bea6e521e02e54644b3d0ca33f0658315"}, + {file = "xhtml2pdf-0.2.17.tar.gz", hash = "sha256:09ddbc31aa0e38a16f2f3cb73be89af5f7c968c17a564afdd685d280e39c526d"}, +] +markers = {main = "extra == \"pdf\""} + +[package.dependencies] +arabic-reshaper = ">=3.0.0" +html5lib = ">=1.1" +Pillow = ">=8.1.1" +pyHanko = ">=0.12.1" +pyhanko-certvalidator = ">=0.19.5" +pypdf = ">=3.1.0" +python-bidi = ">=0.5.0" +reportlab = ">=4.0.4,<5" +svglib = ">=1.2.1" + +[package.extras] +docs = ["sphinx (>=6)", "sphinx-rtd-theme (>=0.5.0)", "sphinx_reredirects (>=0.1.3)"] +pycairo = ["reportlab[pycairo] (>=4.0.4,<5)"] +release = ["build", "twine"] +renderpm = ["reportlab[renderpm] (>=4.0.4,<5)"] +test = ["coverage (>=5.3)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "tox"] + +[[package]] +name = "xmind" +version = "1.2.0" +description = "XMind是基于Python实现,提供了对XMind思维导图进行创建、解析、更新的一站式解决方案!" +optional = false +python-versions = ">=3.0, <4" +groups = ["main"] +files = [ + {file = "XMind-1.2.0-py2.py3-none-any.whl", hash = "sha256:3dddc2db2cc404adf4e8d8e83f4d92e5eda5d94c468cecb047dcc99afc3a4f3d"}, + {file = "XMind-1.2.0.tar.gz", hash = "sha256:7641a4adf1c0a33fe0d5f515d86deba28ef3b3bcfaff2cffb2d5f6520ffa976e"}, +] + +[[package]] +name = "yarl" +version = "1.24.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "yarl-1.24.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5249a113065c2b7a958bc699759e359cd61cfc81e3069662208f48f191b7ed12"}, + {file = "yarl-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4425fa244fbf530b006d0c5f79ce920114cfff5b4f5f6056e669f8e160fdc0"}, + {file = "yarl-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15c0b5e49d3c44e2a0b93e6a49476c5edad0a7686b92c395765a7ea775572a75"}, + {file = "yarl-1.24.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:246d32a53a947c8f0189f5d699cbd4c7036de45d9359e13ba238d1239678c727"}, + {file = "yarl-1.24.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:64480fb3e4d4ed9ed71c48a91a477384fc342a50ca30071d2f8a88d51d9c9413"}, + {file = "yarl-1.24.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:349de4701dc3760b6e876628423a8f147ef4f5599d10aba1e10702075d424ed9"}, + {file = "yarl-1.24.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d162677af8d5d3d6ebab8394b021f4d041ac107a4b705873148a77a49dc9e1b2"}, + {file = "yarl-1.24.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5f5c6ec23a9043f2d139cc072f53dd23168d202a334b9b2fda8de4c3e890d90"}, + {file = "yarl-1.24.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:60de6742447fbbf697f16f070b8a443f1b5fe6ca3826fbef9fe70ecd5328e643"}, + {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acf93187c3710e422368eb768aee98db551ec7c85adc250207a95c16548ab7ac"}, + {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f4b0352fd41fd34b6651934606268816afd6914d09626f9bcbbf018edb0afb3f"}, + {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6b208bb939099b4b297438da4e9b25357f0b1c791888669b963e45b203ea9f36"}, + {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4b85b8825e631295ff4bc8943f7471d54c533a9360bbe15ebb38e018b555bb8a"}, + {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e26acf20c26cb4fefc631fdb75aca2a6b8fa8b7b5d7f204fb6a8f1e63c706f53"}, + {file = "yarl-1.24.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:819ca24f8eafcfb683c1bd5f44f2f488cea1274eb8944731ffd2e1f10f619342"}, + {file = "yarl-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:5cb0f995a901c36be096ccbf4c673591c2faabbe96279598ffaec8c030f85bf4"}, + {file = "yarl-1.24.2-cp310-cp310-win_arm64.whl", hash = "sha256:f408eace7e22a68b467a0562e0d27d322f91fe3eaaa6f466b962c6cfaea9fa39"}, + {file = "yarl-1.24.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:36348bebb147b83818b9d7e673ea4debc75970afc6ffdc7e3975ad05ce5a58c1"}, + {file = "yarl-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a97e42c8a2233f2f279ecadd9e4a037bcb5d813b78435e8eedd4db5a9e9708c"}, + {file = "yarl-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d027d56f1035e339d1001ac33eceab5b2ec8e42e449787bb75e289fb9a5cd1d"}, + {file = "yarl-1.24.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a6377060e7927187a42b7eb202090cbe2b34933a4eeaf90e3bd9e33432e5cae"}, + {file = "yarl-1.24.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:17076578bce0049a5ce57d14ad1bded391b68a3b213e9b81b0097b090244999a"}, + {file = "yarl-1.24.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50713f1d4d6be6375bb178bb43d140ee1acb8abe589cd723320b7925a275be1e"}, + {file = "yarl-1.24.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:34263e2fa8fb5bb63a0d97706cda38edbad62fddb58c7f12d6acbc092812aa50"}, + {file = "yarl-1.24.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49016d82f032b1bd1e10b01078a7d29ae71bf468eeae0ea22df8bab691e60003"}, + {file = "yarl-1.24.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f6d2c216318f8f32038ca3f72501ba08536f0fd18a36e858836b121b2deed9f"}, + {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:08d3a33218e0c64393e7610284e770409a9c31c429b078bcb24096ed0a783b8f"}, + {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5d699376c4ca3cba49bbfae3a05b5b70ded572937171ce1e0b8d87118e2ba294"}, + {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a1cab588b4fa14bea2e55ebea27478adfb05372f47573738e1acc4a36c0b05d2"}, + {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ec87ccc31bd21db7ad009d8572c127c1000f268517618a4cc09adba3c2a7f21c"}, + {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d1dd47a22843b212baa8d74f37796815d43bd046b42a0f41e9da433386c3136b"}, + {file = "yarl-1.24.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7b54b9c67c2b06bd7b9a77253d242124b9c95d2c02def5a1144001ee547dd9d5"}, + {file = "yarl-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:f8fdbcff8b2c7c9284e60c196f693588598ddcee31e11c18e14949ce44519d45"}, + {file = "yarl-1.24.2-cp311-cp311-win_arm64.whl", hash = "sha256:b32c37a7a337e90822c45797bf3d79d60875cfcccd3ecc80e9f453d87026c122"}, + {file = "yarl-1.24.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8"}, + {file = "yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3b075301a2836a0e297b1b658cb6d6135df535d62efefdd60366bd589c2c82f2"}, + {file = "yarl-1.24.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d"}, + {file = "yarl-1.24.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035"}, + {file = "yarl-1.24.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576"}, + {file = "yarl-1.24.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8"}, + {file = "yarl-1.24.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7"}, + {file = "yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c"}, + {file = "yarl-1.24.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d"}, + {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db"}, + {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712"}, + {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996"}, + {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b"}, + {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c"}, + {file = "yarl-1.24.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1"}, + {file = "yarl-1.24.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dafe10c12ddd4d120d528c4b5599c953bd7b12845347d507b95451195bb6cad"}, + {file = "yarl-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:044a09d8401fcf8681977faef6d286b8ade1e2d2e9dceda175d1cfa5ca496f30"}, + {file = "yarl-1.24.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:491ac9141decf49ee8030199e1ee251cdff0e131f25678817ff6aa5f837a3536"}, + {file = "yarl-1.24.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e89418f65eda18f99030386305bd44d7d504e328a7945db1ead514fbe03a0607"}, + {file = "yarl-1.24.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cdfcce633b4a4bb8281913c57fcafd4b5933fbc19111a5e3930bbd299d6102f1"}, + {file = "yarl-1.24.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:863297ddede92ee49024e9a9b11ecb59f310ca85b60d8537f56bed9bbb5b1986"}, + {file = "yarl-1.24.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:374423f70754a2c96942ede36a29d37dc6b0cb8f92f8d009ddf3ed78d3da5488"}, + {file = "yarl-1.24.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33a29b5d00ccbf3219bb3e351d7875739c19481e030779f48cc46a7a71681a9b"}, + {file = "yarl-1.24.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a9532c57211730c515341af11fef6e9b61d157487272a096d0c04da445642592"}, + {file = "yarl-1.24.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91e72cf093fd833483a97ee648e0c053c7c629f51ff4a0e7edd84f806b0c5617"}, + {file = "yarl-1.24.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b3177bc0a768ef3bacceb4f272632990b7bea352f1b2f1eee9d6d6ff16516f92"}, + {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e196952aacaf3b232e265ff02980b64d483dc0972bd49bcb061171ff22ac203a"}, + {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:204e7a61ce99919c0de1bf904ab5d7aa188a129ea8f690a8f76cfb6e2844dc44"}, + {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b156914620f0b9d78dc1adb3751141daee561cfec796088abb89ed49d220f1a"}, + {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:8372a2b976cf70654b2be6619ab6068acabb35f724c0fda7b277fbf53d66a5cf"}, + {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f9a1e9b622ca284143aab5d885848686dcd85453bb1ca9abcdb7503e64dc0056"}, + {file = "yarl-1.24.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:810e19b685c8c3c5862f6a38160a1f4e4c0916c9390024ec347b6157a45a0992"}, + {file = "yarl-1.24.2-cp313-cp313-win_amd64.whl", hash = "sha256:7d37fb7c38f2b6edab0f845c4f85148d4c44204f52bc127021bd2bc9fdbf1656"}, + {file = "yarl-1.24.2-cp313-cp313-win_arm64.whl", hash = "sha256:1e831894be7c2954240e49791fa4b50c05a0dc881de2552cfe3ffd8631c7f461"}, + {file = "yarl-1.24.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f9312b3c02d9b3d23840f67952913c9c8721d7f1b7db305289faefa878f364c2"}, + {file = "yarl-1.24.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a4f4d6cd615823bfc7fb7e9b5987c3f41666371d870d51058f77e2680fbe9630"}, + {file = "yarl-1.24.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0c3063e5c0a8e8e62fae6c2596fa01da1561e4cd1da6fec5789f5cf99a8aefd8"}, + {file = "yarl-1.24.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fecd17873a096036c1c87ab3486f1aef7f269ada7f23f7f856f93b1cc7744f14"}, + {file = "yarl-1.24.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a46d1ab4ba4d32e6dc80daf8a28ce0bd83d08df52fbc32f3e288663427734535"}, + {file = "yarl-1.24.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73e68edf6dfd5f73f9ca127d84e2a6f9213c65bdffb736bda19524c0564fcd14"}, + {file = "yarl-1.24.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a296ca617f2d25fbceafb962b88750d627e5984e75732c712154d058ae8d79a3"}, + {file = "yarl-1.24.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51b2cf5ec89a8b8470177641ed62a3ba22d74e1e898e06ad53aa77972487208"}, + {file = "yarl-1.24.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:310fc687f7b2044ec54e372c8cbe923bb88f5c37bded0d3079e5791c2fc3cf50"}, + {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:297a2fe352ecf858b30a98f87948746ec16f001d279f84aebdbd3bd965e2f1bd"}, + {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2a263e76b97bc42bdcd7c5f4953dec1f7cd62a1112fa7f869e57255229390d67"}, + {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:822519b64cf0b474f1a0aaef1dc621438ea46bb77c94df97a5b4d213a7d8a8b1"}, + {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b6067060d9dc594899ba83e6db6c48c68d1e494a6dab158156ed86977ca7bcb1"}, + {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0063adad533e57171b79db3943b229d40dfafeeee579767f96541f106bac5f1b"}, + {file = "yarl-1.24.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ee8e3fb34513e8dc082b586ef4910c98335d43a6fab688cd44d4851bacfce3e8"}, + {file = "yarl-1.24.2-cp314-cp314-win_amd64.whl", hash = "sha256:afb00d7fd8e0f285ca29a44cc50df2d622ff2f7a6d933fa641577b5f9d5f3db0"}, + {file = "yarl-1.24.2-cp314-cp314-win_arm64.whl", hash = "sha256:68cf6eacd6028ef1142bc4b48376b81566385ca6f9e7dde3b0fa91be08ffcb57"}, + {file = "yarl-1.24.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:221ce1dd921ac4f603957f17d7c18c5cc0797fbb52f156941f92e04605d1d67b"}, + {file = "yarl-1.24.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5f3224db28173a00d7afacdee07045cc4673dfab2b15492c7ae10deddbece761"}, + {file = "yarl-1.24.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c557165320d6244ebe3a02431b2a201a20080e02f41f0cfa0ccc47a183765da8"}, + {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:904065e6e85b1fa54d0d87438bd58c14c0bad97aad654ad1077fd9d87e8478ed"}, + {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8cec2a38d70edc10e0e856ceda886af5327a017ccbde8e1de1bd44d300357543"}, + {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e7484b9361ed222ee1ca5b4337aa4cbdcc4618ce5aff57d9ef1582fd95893fc0"}, + {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:84f9670b89f34db07f81e53aee83e0b938a3412329d51c8f922488be7fcc4024"}, + {file = "yarl-1.24.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:abb2759733d63a28b4956500a5dd57140f26486c92b2caedfb964ab7d9b79dbf"}, + {file = "yarl-1.24.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:081c2bf54efe03774d0311172bc04fedf9ca01e644d4cd8c805688e527209bdc"}, + {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:86746bef442aa479107fe28132e1277237f9c24c2f00b0b0cf22b3ee0904f2bb"}, + {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:2d07d21d0bc4b17558e8de0b02fbfdf1e347d3bb3699edd00bb92e7c57925420"}, + {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4fb1ac3fc5fecd8ae7453ea237e4d22b49befa70266dfe1629924245c21a0c7f"}, + {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4da31a5512ed1729ca8d8aacde3f7faeb8843cde3165d6bcf7f88f74f17bb8aa"}, + {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:533ded4dceb5f1f3da7906244f4e82cf46cfd40d84c69a1faf5ac506aa65ecbe"}, + {file = "yarl-1.24.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7b3a85525f6e7eeabcfdd372862b21ee1915db1b498a04e8bf0e389b607ff0bd"}, + {file = "yarl-1.24.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a7624b1ca46ca5d7b864ef0d2f8efe3091454085ee1855b4e992314529972215"}, + {file = "yarl-1.24.2-cp314-cp314t-win_arm64.whl", hash = "sha256:e434a45ce2e7a947f951fc5a8944c8cc080b7e59f9c50ae80fd39107cf88126d"}, + {file = "yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9"}, + {file = "yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +propcache = ">=0.2.1" + +[extras] +pdf = ["arabic-reshaper", "python-bidi", "xhtml2pdf"] + +[metadata] +lock-version = "2.1" +python-versions = "^3.10" +content-hash = "72686fde760cc08ed4a1b8f6743af726d2c004b41529830142b19745d696569a" diff --git a/pyinstaller/maigret_standalone.py b/pyinstaller/maigret_standalone.py new file mode 100755 index 0000000..3470d33 --- /dev/null +++ b/pyinstaller/maigret_standalone.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +import asyncio +import platform +import sys + +import maigret + + +DOUBLE_CLICK_INTRO = """\ +Maigret runs from the command line. You can: + + - call it from cmd/PowerShell: maigret_standalone.exe USERNAME [options] + - or enter a username below for a default search. + +Full options: maigret_standalone.exe --help +Documentation: https://maigret.readthedocs.io/ +""" + + +def _launched_by_double_click() -> bool: + # On Windows, Explorer spawns a fresh console just for our process, so + # GetConsoleProcessList returns 1. When launched from an existing cmd / + # PowerShell session the count is >= 2 (the shell is attached too). + if platform.system() != "Windows": + return False + if len(sys.argv) > 1: + return False + try: + import ctypes + + buf = (ctypes.c_uint * 4)() + count = ctypes.windll.kernel32.GetConsoleProcessList(buf, 4) + return count <= 1 + except Exception: + return False + + +def _pause() -> None: + try: + input("\nPress Enter to exit...") + except EOFError: + pass + + +def _prompt_for_username() -> str: + try: + return input("Username to search: ").strip() + except (EOFError, KeyboardInterrupt): + return "" + + +def main() -> None: + if not _launched_by_double_click(): + asyncio.run(maigret.cli()) + return + + print(DOUBLE_CLICK_INTRO) + username = _prompt_for_username() + + if not username: + print( + "\nNo username entered. Re-run with one, e.g.\n" + " maigret_standalone.exe alice" + ) + _pause() + return + + # Inject the username so maigret's argparse sees it like a normal CLI run. + sys.argv = [sys.argv[0], username] + try: + asyncio.run(maigret.cli()) + finally: + _pause() + + +if __name__ == "__main__": + main() diff --git a/pyinstaller/maigret_standalone.spec b/pyinstaller/maigret_standalone.spec new file mode 100644 index 0000000..3152748 --- /dev/null +++ b/pyinstaller/maigret_standalone.spec @@ -0,0 +1,55 @@ +# -*- mode: python ; coding: utf-8 -*- +from PyInstaller.utils.hooks import collect_all + +datas = [] +binaries = [] +hiddenimports = [] + +full_import_modules = ['maigret', 'socid_extractor', 'arabic_reshaper', 'pyvis', 'reportlab.graphics.barcode'] + +for module in full_import_modules: + tmp_ret = collect_all(module) + datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2] + +hiddenimports += ['PySocks', 'beautifulsoup4', 'python-dateutil', + 'future-annotations', 'six', 'python-bidi', + 'typing-extensions', 'attrs', 'torrequest'] + +block_cipher = None + + +a = Analysis(['maigret_standalone.py'], + pathex=[], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) + +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) + +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='maigret_standalone', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None ) diff --git a/pyinstaller/requirements.txt b/pyinstaller/requirements.txt new file mode 100644 index 0000000..5275bea --- /dev/null +++ b/pyinstaller/requirements.txt @@ -0,0 +1,5 @@ +maigret @ https://github.com/soxoj/maigret/archive/refs/heads/main.zip +pefile==2023.2.7 # do not bump while pyinstaller is 6.11.1, there is a conflict +psutil==7.2.2 +pyinstaller==6.21.0 +pywin32-ctypes==0.2.3 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..864f699 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,102 @@ +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry] +name = "maigret" +version = "0.6.2" +description = "🕵️‍♂️ Collect a dossier on a person by username from thousands of sites." +authors = ["Soxoj "] +readme = "README.md" +license = "MIT License" +homepage = "https://pypi.org/project/maigret" +documentation = "https://maigret.readthedocs.io" +repository = "https://github.com/soxoj/maigret" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Intended Audience :: Information Technology", + "Operating System :: OS Independent", + "License :: OSI Approved :: MIT License", + "Natural Language :: English" +] + +[tool.poetry.urls] +"Bug Tracker" = "https://github.com/soxoj/maigret/issues" +"Funding" = "https://www.patreon.com/soxoj" + +[tool.poetry.dependencies] +# poetry install +# Install only production dependencies: +# poetry install --without dev +# Install with dev dependencies: +# poetry install --with dev +python = "^3.10" +aiodns = ">=3,<5" +aiohttp = "^3.12.14" +aiohttp-socks = ">=0.10.1,<0.12.0" +arabic-reshaper = {version = "^3.0.0", optional = true} +certifi = ">=2025.6.15,<2027.0.0" +colorama = "^0.4.6" +html5lib = "^1.1" +Jinja2 = "^3.1.6" +lxml = ">=6.0.2,<7.0" +MarkupSafe = "^3.0.2" +pycountry = ">=24.6.1,<27.0.0" +PySocks = "^1.7.1" +python-bidi = {version = "^0.6.3", optional = true} +requests = "^2.32.4" +socid-extractor = ">=0.0.27,<0.1.1" +soupsieve = "^2.6" +alive_progress = "^3.2.0" +typing-extensions = "^4.14.1" +xhtml2pdf = {version = "^0.2.11", optional = true} +XMind = "^1.2.0" +yarl = "^1.20.1" +networkx = "^2.6.3" +pyvis = "^0.3.2" +reportlab = "^4.4.3" +flask = {extras = ["async"], version = "^3.1.1"} +asgiref = "^3.9.1" +platformdirs = "^4.3.8" +curl-cffi = ">=0.14,<1.0" + + +[tool.poetry.extras] +# Install PDF support with: pip install 'maigret[pdf]' +# Skipped by default because the underlying `pycairo` has no Linux/macOS +# wheels on PyPI and requires system libcairo + pkg-config to build. +# arabic-reshaper and python-bidi are pulled in too — they're only used +# by xhtml2pdf (RTL text shaping in PDFs), nothing in maigret core touches +# them, and python-bidi v0.5+ is a Rust binding that can need cargo on +# niche platforms. +pdf = ["xhtml2pdf", "arabic-reshaper", "python-bidi"] + + +[tool.poetry.group.dev.dependencies] +# How to add a new dev dependency: poetry add black --group dev +# Install dev dependencies with: poetry install --with dev +flake8 = "^7.1.1" +pytest = ">=8.3.4,<10.0.0" +pytest-asyncio = "^1.0.0" +pytest-cov = ">=6,<8" +pytest-httpserver = "^1.0.0" +pytest-rerunfailures = ">=15.1,<17.0" +reportlab = "^4.4.3" +xhtml2pdf = "^0.2.11" +arabic-reshaper = "^3.0.0" +python-bidi = "^0.6.3" +mypy = ">=1.14.1,<3.0.0" +tuna = "^0.5.11" +coverage = "^7.9.2" +black = ">=25.1,<27.0" + +[tool.poetry.scripts] +# Run with: poetry run maigret +maigret = "maigret.maigret:run" +update_sitesmd = "utils.update_site_data:main" diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..5014b80 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,7 @@ +# pytest.ini +[pytest] +filterwarnings = + error + ignore::UserWarning + ignore:codecs.open\(\) is deprecated:DeprecationWarning:xmind.core.saver +asyncio_mode=auto \ No newline at end of file diff --git a/sites.md b/sites.md new file mode 100644 index 0000000..eb0020b --- /dev/null +++ b/sites.md @@ -0,0 +1,3269 @@ + +## List of supported sites (search methods): total 3187 + +Rank data fetched from Majestic Million by domains. + +1. ![](https://www.google.com/s2/favicons?domain=https://www.facebook.com/) [Facebook (https://www.facebook.com/)](https://www.facebook.com/)*: top 2, social* +1. ![](https://www.google.com/s2/favicons?domain=https://www.youtube.com/) [YouTube (https://www.youtube.com/)](https://www.youtube.com/)*: top 3, video* +1. ![](https://www.google.com/s2/favicons?domain=https://www.instagram.com/) [Instagram (https://www.instagram.com/)](https://www.instagram.com/)*: top 4, photo, social* +1. ![](https://www.google.com/s2/favicons?domain=https://www.twitter.com/) [Twitter (https://www.twitter.com/)](https://www.twitter.com/)*: top 5, messaging, social* +1. ![](https://www.google.com/s2/favicons?domain=https://linkedin.com) [LinkedIn (https://linkedin.com)](https://linkedin.com)*: top 6, professional, social* +1. ![](https://www.google.com/s2/favicons?domain=https://www.github.com/) [GitHub (https://www.github.com/)](https://www.github.com/)*: top 10, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://wordpress.org/) [WordPressOrg (https://wordpress.org/)](https://wordpress.org/)*: top 50, blog, coding, in* +1. ![](https://www.google.com/s2/favicons?domain=https://play.google.com/store) [GooglePlayStore (https://play.google.com/store)](https://play.google.com/store)*: top 50, apps* +1. ![](https://www.google.com/s2/favicons?domain=https://en.wikipedia.org/) [Wikipedia (https://en.wikipedia.org/)](https://en.wikipedia.org/)*: top 50, wiki* +1. ![](https://www.google.com/s2/favicons?domain=https://maps.google.com/) [Google Maps (https://maps.google.com/)](https://maps.google.com/)*: top 50, maps* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pinterest.com/) [Pinterest (https://www.pinterest.com/)](https://www.pinterest.com/)*: top 50, art, photo, sharing, social* +1. ![](https://www.google.com/s2/favicons?domain=https://vimeo.com) [Vimeo (https://vimeo.com)](https://vimeo.com)*: top 50, video* +1. ![](https://www.google.com/s2/favicons?domain=https://www.tiktok.com/) [TikTok (https://www.tiktok.com/)](https://www.tiktok.com/)*: top 50, social, video* +1. ![](https://www.google.com/s2/favicons?domain=https://amazon.com) [Amazon (https://amazon.com)](https://amazon.com)*: top 50, shopping, us* +1. ![](https://www.google.com/s2/favicons?domain=https://bit.ly) [Bit.ly (https://bit.ly)](https://bit.ly)*: top 50, links* +1. ![](https://www.google.com/s2/favicons?domain=https://wordpress.com) [WordPress (https://wordpress.com)](https://wordpress.com)*: top 50, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://plus.google.com) [Google Plus (archived) (https://plus.google.com)](https://plus.google.com)*: top 50, social* +1. ![](https://www.google.com/s2/favicons?domain=https://t.me/) [Telegram (https://t.me/)](https://t.me/)*: top 50, messaging* +1. ![](https://www.google.com/s2/favicons?domain=https://www.reddit.com/) [Reddit (https://www.reddit.com/)](https://www.reddit.com/)*: top 50, discussion, news, social* +1. ![](https://www.google.com/s2/favicons?domain=https://www.tumblr.com) [Tumblr (https://www.tumblr.com)](https://www.tumblr.com)*: top 100, blog, social* +1. ![](https://www.google.com/s2/favicons?domain=https://open.spotify.com/) [Spotify (https://open.spotify.com/)](https://open.spotify.com/)*: top 100, music* +1. ![](https://www.google.com/s2/favicons?domain=https://archive.org) [Archive.org (https://archive.org)](https://archive.org)*: top 100, archive*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.flickr.com/) [Flickr (https://www.flickr.com/)](https://www.flickr.com/)*: top 100, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.flickr.com) [Flickr Groups (https://www.flickr.com)](https://www.flickr.com)*: top 100, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://medium.com/) [Medium (https://medium.com/)](https://medium.com/)*: top 100, blog, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://soundcloud.com/) [SoundCloud (https://soundcloud.com/)](https://soundcloud.com/)*: top 100, music* +1. ![](https://www.google.com/s2/favicons?domain=https://sourceforge.net/) [SourceForge (https://sourceforge.net/)](https://sourceforge.net/)*: top 100, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://theguardian.com) [TheGuardian (https://theguardian.com)](https://theguardian.com)*: top 100, gb, news*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://vk.com/) [VK (https://vk.com/)](https://vk.com/)*: top 100, ru, social* +1. ![](https://www.google.com/s2/favicons?domain=https://vk.com/) [VK (by id) (https://vk.com/)](https://vk.com/)*: top 100, ru, social* +1. ![](https://www.google.com/s2/favicons?domain=https://launchpad.net/) [Launchpad (https://launchpad.net/)](https://launchpad.net/)*: top 100, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://www.researchgate.net/) [ResearchGate (https://www.researchgate.net/)](https://www.researchgate.net/)*: top 100, in, research, social, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://issuu.com/) [Issuu (https://issuu.com/)](https://issuu.com/)*: top 500, business* +1. ![](https://www.google.com/s2/favicons?domain=https://weibo.com) [Weibo (https://weibo.com)](https://weibo.com)*: top 500, cn, social* +1. ![](https://www.google.com/s2/favicons?domain=http://weebly.com) [Weebly (http://weebly.com)](http://weebly.com)*: top 500, business* +1. ![](https://www.google.com/s2/favicons?domain=https://linktr.ee) [linktr.ee (https://linktr.ee)](https://linktr.ee)*: top 500, links* +1. ![](https://www.google.com/s2/favicons?domain=https://discord.com/) [Discord (https://discord.com/)](https://discord.com/)*: top 500, gaming, messaging* +1. ![](https://www.google.com/s2/favicons?domain=https://unsplash.com/) [Unsplash (https://unsplash.com/)](https://unsplash.com/)*: top 500, art, photo*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://calendly.com) [Calendly (https://calendly.com)](https://calendly.com)*: top 500, business, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.etsy.com/) [Etsy (https://www.etsy.com/)](https://www.etsy.com/)*: top 500, shopping*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://gitlab.com/) [GitLab (https://gitlab.com/)](https://gitlab.com/)*: top 500, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.twitch.tv/) [Twitch (https://www.twitch.tv/)](https://www.twitch.tv/)*: top 500, streaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.ebay.com/) [Ebay (https://www.ebay.com/)](https://www.ebay.com/)*: top 500, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://www.slideshare.net) [SlideShare (https://www.slideshare.net)](https://www.slideshare.net)*: top 500, documents, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://www.behance.net/) [Behance (https://www.behance.net/)](https://www.behance.net/)*: top 500, business* +1. ![](https://www.google.com/s2/favicons?domain=https://stackoverflow.com) [StackOverflow (https://stackoverflow.com)](https://stackoverflow.com)*: top 500, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://bsky.app) [Bluesky (https://bsky.app)](https://bsky.app)*: top 500, messaging, social* +1. ![](https://www.google.com/s2/favicons?domain=https://substack.com) [Substack (https://substack.com)](https://substack.com)*: top 500, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://www.blogger.com/) [Blogger (https://www.blogger.com/)](https://www.blogger.com/)*: top 500, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://www.blogger.com) [Blogger (by GAIA id) (https://www.blogger.com)](https://www.blogger.com)*: top 500, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://www.cnet.com) [CNET (https://www.cnet.com)](https://www.cnet.com)*: top 500, news, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://tripadvisor.com/) [TripAdvisor (https://tripadvisor.com/)](https://tripadvisor.com/)*: top 500, travel* +1. ![](https://www.google.com/s2/favicons?domain=https://wix.com/) [Wix (https://wix.com/)](https://wix.com/)*: top 500, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dailymotion.com) [DailyMotion (https://www.dailymotion.com)](https://www.dailymotion.com)*: top 500, video* +1. ![](https://www.google.com/s2/favicons?domain=https://www.bandcamp.com/) [Bandcamp (https://www.bandcamp.com/)](https://www.bandcamp.com/)*: top 500, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.theverge.com) [TheVerge (https://www.theverge.com)](https://www.theverge.com)*: top 500, news, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://scholar.google.com/) [Google Scholar (https://scholar.google.com/)](https://scholar.google.com/)*: top 500, education, research* +1. ![](https://www.google.com/s2/favicons?domain=https://imgur.com) [Imgur (https://imgur.com)](https://imgur.com)*: top 500, photo* +1. ![](https://www.google.com/s2/favicons?domain=http://www.yelp.com) [Yelp (http://www.yelp.com)](http://www.yelp.com)*: top 500, review*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.yelp.com) [Yelp (by id) (https://www.yelp.com)](https://www.yelp.com)*: top 500, review* +1. ![](https://www.google.com/s2/favicons?domain=https://myspace.com/) [Myspace (https://myspace.com/)](https://myspace.com/)*: top 500, music, social* +1. ![](https://www.google.com/s2/favicons?domain=https://themeforest.net) [ThemeForest (https://themeforest.net)](https://themeforest.net)*: top 500, coding, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://yandex.ru/) [YandexReviews (https://yandex.ru/)](https://yandex.ru/)*: top 500, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://yandex.ru/bugbounty/) [YandexBugbounty (https://yandex.ru/bugbounty/)](https://yandex.ru/bugbounty/)*: top 500, hacking, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://yandex.ru/collections/) [YandexCollections API (https://yandex.ru/collections/)](https://yandex.ru/collections/)*: top 500, ru, sharing*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://yandex.ru/collections/) [YandexCollections API (by yandex_public_id) (https://yandex.ru/collections/)](https://yandex.ru/collections/)*: top 500, ru, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://yandex.ru/q/) [YandexZnatoki (https://yandex.ru/q/)](https://yandex.ru/q/)*: top 500, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.goodreads.com/) [GoodReads (https://www.goodreads.com/)](https://www.goodreads.com/)*: top 500, books* +1. ![](https://www.google.com/s2/favicons?domain=https://www.weforum.org) [Weforum (https://www.weforum.org)](https://www.weforum.org)*: top 500, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.scribd.com/) [Scribd (https://www.scribd.com/)](https://www.scribd.com/)*: top 500, reading*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.freepik.com) [Freepik (https://www.freepik.com)](https://www.freepik.com)*: top 500, art, photo, stock* +1. ![](https://www.google.com/s2/favicons?domain=https://www.academia.edu/) [Academia.edu (https://www.academia.edu/)](https://www.academia.edu/)*: top 500, education, research* +1. ![](https://www.google.com/s2/favicons?domain=https://www.openstreetmap.org/) [OpenStreetMap (https://www.openstreetmap.org/)](https://www.openstreetmap.org/)*: top 500, maps* +1. ![](https://www.google.com/s2/favicons?domain=https://www.livejournal.com/) [LiveJournal (https://www.livejournal.com/)](https://www.livejournal.com/)*: top 500, blog, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.quora.com/) [Quora (https://www.quora.com/)](https://www.quora.com/)*: top 500, education* +1. ![](https://www.google.com/s2/favicons?domain=https://dribbble.com/) [Dribbble (https://dribbble.com/)](https://dribbble.com/)*: top 500, business* +1. ![](https://www.google.com/s2/favicons?domain=https://www.kickstarter.com) [Kickstarter (https://www.kickstarter.com)](https://www.kickstarter.com)*: top 500, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://www.change.org) [Change.org (https://www.change.org)](https://www.change.org)*: top 500, social*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.fandom.com/) [Fandom (https://www.fandom.com/)](https://www.fandom.com/)*: top 500, wiki* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Brazil (https://www.op.gg/)](https://www.op.gg/)*: top 500, br, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL North America (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Middle East (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Europe Nordic & East (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Europe West (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Oceania (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Korea (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming, kr* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Japan (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL LAS (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL LAN (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Russia (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Turkey (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Singapore (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming, sg* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Phillippines (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming, ph* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Taiwan (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming, tw* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Vietnam (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming, vn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.op.gg/) [OP.GG LoL Thailand (https://www.op.gg/)](https://www.op.gg/)*: top 500, gaming, th* +1. ![](https://www.google.com/s2/favicons?domain=https://www.xing.com/) [Xing (https://www.xing.com/)](https://www.xing.com/)*: top 500, de, eu* +1. ![](https://www.google.com/s2/favicons?domain=https://www.patreon.com/) [Patreon (https://www.patreon.com/)](https://www.patreon.com/)*: top 500, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://deviantart.com) [DeviantART (https://deviantart.com)](https://deviantart.com)*: top 500, art, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gofundme.com) [Gofundme (https://www.gofundme.com)](https://www.gofundme.com)*: top 500, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://www.zhihu.com/) [Zhihu (https://www.zhihu.com/)](https://www.zhihu.com/)*: top 500, cn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.threads.net/) [Threads (https://www.threads.net/)](https://www.threads.net/)*: top 500, social* +1. ![](https://www.google.com/s2/favicons?domain=https://giphy.com) [Giphy (https://giphy.com)](https://giphy.com)*: top 500, video* +1. ![](https://www.google.com/s2/favicons?domain=https://slack.com) [Slack (https://slack.com)](https://slack.com)*: top 500, messaging* +1. ![](https://www.google.com/s2/favicons?domain=https://buzzfeed.com/) [BuzzFeed (https://buzzfeed.com/)](https://buzzfeed.com/)*: top 500, news* +1. ![](https://www.google.com/s2/favicons?domain=https://www.w3schools.com/) [W3Schools (https://www.w3schools.com/)](https://www.w3schools.com/)*: top 500, education* +1. ![](https://www.google.com/s2/favicons?domain=https://naver.com) [Naver (https://naver.com)](https://naver.com)*: top 500, kr* +1. ![](https://www.google.com/s2/favicons?domain=https://disqus.com/) [Disqus (https://disqus.com/)](https://disqus.com/)*: top 500, discussion, social* +1. ![](https://www.google.com/s2/favicons?domain=https://www.snapchat.com) [Snapchat (https://www.snapchat.com)](https://www.snapchat.com)*: top 1K, social* +1. ![](https://www.google.com/s2/favicons?domain=https://trello.com/) [Trello (https://trello.com/)](https://trello.com/)*: top 1K, tasks* +1. ![](https://www.google.com/s2/favicons?domain=https://ok.ru/) [OK (https://ok.ru/)](https://ok.ru/)*: top 1K, ru, social* +1. ![](https://www.google.com/s2/favicons?domain=https://photobucket.com/) [Photobucket (https://photobucket.com/)](https://photobucket.com/)*: top 1K, photo*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.udemy.com) [Udemy (https://www.udemy.com)](https://www.udemy.com)*: top 1K, education*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.shutterstock.com) [Shutterstock (https://www.shutterstock.com)](https://www.shutterstock.com)*: top 1K, music, photo, stock*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mixcloud.com/) [MixCloud (https://www.mixcloud.com/)](https://www.mixcloud.com/)*: top 1K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.npmjs.com/) [NPM (https://www.npmjs.com/)](https://www.npmjs.com/)*: top 1K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.npmjs.com/) [NPM-Package (https://www.npmjs.com/)](https://www.npmjs.com/)*: top 1K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://slashdot.org) [Slashdot (https://slashdot.org)](https://slashdot.org)*: top 1K, news* +1. ![](https://www.google.com/s2/favicons?domain=https://steamcommunity.com/) [Steam (https://steamcommunity.com/)](https://steamcommunity.com/)*: top 1K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://steamcommunity.com/) [Steam (by id) (https://steamcommunity.com/)](https://steamcommunity.com/)*: top 1K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://steamcommunity.com/) [Steam (Group) (https://steamcommunity.com/)](https://steamcommunity.com/)*: top 1K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.digitalocean.com/) [DigitalOcean (https://www.digitalocean.com/)](https://www.digitalocean.com/)*: top 1K, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://about.me/) [About.me (https://about.me/)](https://about.me/)*: top 1K, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://www.instructables.com/) [Instructables (https://www.instructables.com/)](https://www.instructables.com/)*: top 1K, hobby* +1. ![](https://www.google.com/s2/favicons?domain=https://ameblo.jp) [Ameblo (https://ameblo.jp)](https://ameblo.jp)*: top 1K, blog, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://huggingface.co/) [HuggingFace (https://huggingface.co/)](https://huggingface.co/)*: top 1K, coding, llm, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://laracasts.com/) [Laracast (https://laracasts.com/)](https://laracasts.com/)*: top 1K, coding, education* +1. ![](https://www.google.com/s2/favicons?domain=https://www.fiverr.com/) [Fiverr (https://www.fiverr.com/)](https://www.fiverr.com/)*: top 1K, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://www.paypal.me) [Paypal (https://www.paypal.me)](https://www.paypal.me)*: top 1K, finance, fintech* +1. ![](https://www.google.com/s2/favicons?domain=https://itch.io/) [Itch.io (https://itch.io/)](https://itch.io/)*: top 1K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://bitbucket.org/) [BitBucket (https://bitbucket.org/)](https://bitbucket.org/)*: top 1K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://last.fm/) [last.fm (https://last.fm/)](https://last.fm/)*: top 1K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gumroad.com/) [Gumroad (https://www.gumroad.com/)](https://www.gumroad.com/)*: top 1K, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://upwork.com) [Upwork (https://upwork.com)](https://upwork.com)*: top 1K, freelance* +1. ![](https://www.google.com/s2/favicons?domain=https://www.yumpu.com) [Yumpu (https://www.yumpu.com)](https://www.yumpu.com)*: top 1K, stock*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://pypi.org/) [PyPi (https://pypi.org/)](https://pypi.org/)*: top 1K, coding*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.douban.com) [Douban (https://www.douban.com)](https://www.douban.com)*: top 1K, cn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.lonelyplanet.com) [LonelyPlanet (https://www.lonelyplanet.com)](https://www.lonelyplanet.com)*: top 1K, travel*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.figma.com/) [Figma (https://www.figma.com/)](https://www.figma.com/)*: top 1K, design* +1. ![](https://www.google.com/s2/favicons?domain=https://www.istockphoto.com) [iStock (https://www.istockphoto.com)](https://www.istockphoto.com)*: top 1K, photo, stock* +1. ![](https://www.google.com/s2/favicons?domain=https://pastebin.com/) [Pastebin (https://pastebin.com/)](https://pastebin.com/)*: top 1K, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://500px.com/) [500px (https://500px.com/)](https://500px.com/)*: top 1K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gamespot.com/) [Gamespot (https://www.gamespot.com/)](https://www.gamespot.com/)*: top 1K, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://houzz.com/) [Houzz (https://houzz.com/)](https://houzz.com/)*: top 1K, design*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.tradingview.com/) [TradingView (https://www.tradingview.com/)](https://www.tradingview.com/)*: top 1K, trading* +1. ![](https://www.google.com/s2/favicons?domain=https://foursquare.com/) [Foursquare (https://foursquare.com/)](https://foursquare.com/)*: top 1K, geosocial, in, social*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.discogs.com/) [Discogs (https://www.discogs.com/)](https://www.discogs.com/)*: top 5K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://jimdosite.com/) [Jimdo (https://jimdosite.com/)](https://jimdosite.com/)*: top 5K, de* +1. ![](https://www.google.com/s2/favicons?domain=https://codepen.io/) [Codepen (https://codepen.io/)](https://codepen.io/)*: top 5K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://ko-fi.com) [kofi (https://ko-fi.com)](https://ko-fi.com)*: top 5K, freelance* +1. ![](https://www.google.com/s2/favicons?domain=https://www.rottentomatoes.com) [Rottentomatoes (https://www.rottentomatoes.com)](https://www.rottentomatoes.com)*: top 5K, movies* +1. ![](https://www.google.com/s2/favicons?domain=https://smugmug.com/) [Smugmug (https://smugmug.com/)](https://smugmug.com/)*: top 5K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://dzen.ru) [YandexZenChannel (https://dzen.ru)](https://dzen.ru)*: top 5K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://dev.to/) [DEV Community (https://dev.to/)](https://dev.to/)*: top 5K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://duolingo.com/) [Duolingo (https://duolingo.com/)](https://duolingo.com/)*: top 5K, education* +1. ![](https://www.google.com/s2/favicons?domain=https://video.ibm.com/) [IBM Video (https://video.ibm.com/)](https://video.ibm.com/)*: top 5K, streaming, video* +1. ![](https://www.google.com/s2/favicons?domain=https://www.strava.com/) [Strava (https://www.strava.com/)](https://www.strava.com/)*: top 5K, sport*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.wikidot.com/) [Wikidot (http://www.wikidot.com/)](http://www.wikidot.com/)*: top 5K, wiki* +1. ![](https://www.google.com/s2/favicons?domain=https://www.reverbnation.com/) [ReverbNation (https://www.reverbnation.com/)](https://www.reverbnation.com/)*: top 5K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.virustotal.com/) [VirusTotal (https://www.virustotal.com/)](https://www.virustotal.com/)*: top 5K, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://gitee.com/) [Gitee (https://gitee.com/)](https://gitee.com/)*: top 5K, cn* +1. ![](https://www.google.com/s2/favicons?domain=https://imageshack.com/) [ImageShack (https://imageshack.com/)](https://imageshack.com/)*: top 5K, photo, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://www.producthunt.com/) [ProductHunt (https://www.producthunt.com/)](https://www.producthunt.com/)*: top 5K, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://note.com/) [note (https://note.com/)](https://note.com/)*: top 5K, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://www.liveinternet.ru) [LiveInternet (https://www.liveinternet.ru)](https://www.liveinternet.ru)*: top 5K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.buymeacoffee.com/) [BuyMeACoffee (https://www.buymeacoffee.com/)](https://www.buymeacoffee.com/)*: top 5K, freelance* +1. ![](https://www.google.com/s2/favicons?domain=https://gitea.com/) [Gitea (https://gitea.com/)](https://gitea.com/)*: top 5K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://genius.com/) [Genius (https://genius.com/)](https://genius.com/)*: top 5K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.techrepublic.com) [Techrepublic (https://www.techrepublic.com)](https://www.techrepublic.com)*: top 5K, news, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://hubpages.com/) [HubPages (https://hubpages.com/)](https://hubpages.com/)*: top 5K, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://www.artstation.com) [Artstation (https://www.artstation.com)](https://www.artstation.com)*: top 5K, art, stock* +1. ![](https://www.google.com/s2/favicons?domain=https://flipboard.com/) [Flipboard (https://flipboard.com/)](https://flipboard.com/)*: top 5K, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://pbase.com/) [Pbase (https://pbase.com/)](https://pbase.com/)*: top 5K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://packagist.org/) [Packagist (https://packagist.org/)](https://packagist.org/)*: top 5K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.geeksforgeeks.org/) [Geeksfor Geeks (https://www.geeksforgeeks.org/)](https://www.geeksforgeeks.org/)*: top 5K, coding, education* +1. ![](https://www.google.com/s2/favicons?domain=https://codeberg.org) [codeberg.org (https://codeberg.org)](https://codeberg.org)*: top 5K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.alltrails.com/) [AllTrails (https://www.alltrails.com/)](https://www.alltrails.com/)*: top 5K, sport, travel*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://habr.com/) [Habr (https://habr.com/)](https://habr.com/)*: top 5K, blog, discussion, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.allrecipes.com/) [AllRecipes (https://www.allrecipes.com/)](https://www.allrecipes.com/)*: top 5K, hobby*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.redbubble.com/) [Redbubble (https://www.redbubble.com/)](https://www.redbubble.com/)*: top 5K, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://www.diigo.com/) [Diigo (https://www.diigo.com/)](https://www.diigo.com/)*: top 5K, bookmarks* +1. ![](https://www.google.com/s2/favicons?domain=https://windy.com/) [Windy (https://windy.com/)](https://windy.com/)*: top 5K, maps* +1. ![](https://www.google.com/s2/favicons?domain=https://codecanyon.net) [Codecanyon (https://codecanyon.net)](https://codecanyon.net)*: top 5K, coding, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://minecraft.net/) [Minecraft (https://minecraft.net/)](https://minecraft.net/)*: top 5K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.codecademy.com/) [Codecademy (https://www.codecademy.com/)](https://www.codecademy.com/)*: top 5K, coding, education* +1. ![](https://www.google.com/s2/favicons?domain=https://tilda.ws) [{username}.tilda.ws (https://tilda.ws)](https://tilda.ws)*: top 5K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.polygon.com/) [Polygon (https://www.polygon.com/)](https://www.polygon.com/)*: top 5K, gaming, news*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.sbnation.com) [Sbnation (https://www.sbnation.com)](https://www.sbnation.com)*: top 5K, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://hackernoon.com) [HackerNoon (https://hackernoon.com)](https://hackernoon.com)*: top 5K, news* +1. ![](https://www.google.com/s2/favicons?domain=https://www.kaggle.com/) [Kaggle (https://www.kaggle.com/)](https://www.kaggle.com/)*: top 5K, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://pcgamer.com) [PCGamer (https://pcgamer.com)](https://pcgamer.com)*: top 5K, gaming, news* +1. ![](https://www.google.com/s2/favicons?domain=https://www.instapaper.com/) [Instapaper (https://www.instapaper.com/)](https://www.instapaper.com/)*: top 5K, reading* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dreamstime.com) [Dreamstime (https://www.dreamstime.com)](https://www.dreamstime.com)*: top 5K, art, photo, stock* +1. ![](https://www.google.com/s2/favicons?domain=https://vc.ru) [VC.ru (https://vc.ru)](https://vc.ru)*: top 5K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://opensea.io) [OpenSea (https://opensea.io)](https://opensea.io)*: top 5K, crypto, nft* +1. ![](https://www.google.com/s2/favicons?domain=https://speakerdeck.com) [Speakerdeck (https://speakerdeck.com)](https://speakerdeck.com)*: top 5K, sharing* +1. ![](https://www.google.com/s2/favicons?domain=http://wikimapia.org) [WikimapiaProfile (http://wikimapia.org)](http://wikimapia.org)*: top 5K, maps, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://wikimapia.org) [WikimapiaSearch (http://wikimapia.org)](http://wikimapia.org)*: top 5K, maps, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.wattpad.com/) [Wattpad (https://www.wattpad.com/)](https://www.wattpad.com/)*: top 5K, reading, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://www.freecodecamp.org/forum/) [Freecodecamp (https://www.freecodecamp.org/forum/)](https://www.freecodecamp.org/forum/)*: top 5K, coding, education, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://nextcloud.com/) [Nextcloud Forum (https://nextcloud.com/)](https://nextcloud.com/)*: top 5K, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://letterboxd.com/) [Letterboxd (https://letterboxd.com/)](https://letterboxd.com/)*: top 5K, movies* +1. ![](https://www.google.com/s2/favicons?domain=https://myanimelist.net/) [MyAnimeList (https://myanimelist.net/)](https://myanimelist.net/)*: top 5K, anime* +1. ![](https://www.google.com/s2/favicons?domain=https://www.roblox.com/) [Roblox (https://www.roblox.com/)](https://www.roblox.com/)*: top 5K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.flightradar24.com/) [Flightradar24 (https://www.flightradar24.com/)](https://www.flightradar24.com/)*: top 5K, maps* +1. ![](https://www.google.com/s2/favicons?domain=https://max.ru) [Max (https://max.ru)](https://max.ru)*: top 5K, messaging, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.metacritic.com/) [Metacritic (https://www.metacritic.com/)](https://www.metacritic.com/)*: top 5K, review*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://tvtropes.org) [TVTropes (https://tvtropes.org)](https://tvtropes.org)*: top 5K, wiki* +1. ![](https://www.google.com/s2/favicons?domain=https://boardgamegeek.com) [BoardGameGeek (https://boardgamegeek.com)](https://boardgamegeek.com)*: top 5K, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.tistory.com/) [Tistory (https://www.tistory.com/)](https://www.tistory.com/)*: top 5K, blog, kr* +1. ![](https://www.google.com/s2/favicons?domain=https://icq.com) [ICQ (https://icq.com)](https://icq.com)*: top 5K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.eurogamer.net) [Eurogamer (https://www.eurogamer.net)](https://www.eurogamer.net)*: top 5K, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://jsfiddle.net) [JSFiddle (https://jsfiddle.net)](https://jsfiddle.net)*: top 5K, coding, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gamesradar.com) [GamesRadar (https://www.gamesradar.com)](https://www.gamesradar.com)*: top 5K, gaming, news* +1. ![](https://www.google.com/s2/favicons?domain=https://pornhub.com/) [Pornhub (https://pornhub.com/)](https://pornhub.com/)*: top 5K, porn*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.techspot.com/community/) [TechSpot (http://www.techspot.com/community/)](http://www.techspot.com/community/)*: top 5K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.geocaching.com/) [Geocaching (https://www.geocaching.com/)](https://www.geocaching.com/)*: top 5K, hobby* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gog.com/) [Gog (https://www.gog.com/)](https://www.gog.com/)*: top 5K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.metacafe.com/) [Metacafe (https://www.metacafe.com/)](https://www.metacafe.com/)*: top 5K, video*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://coub.com/) [Coub (https://coub.com/)](https://coub.com/)*: top 5K, video* +1. ![](https://www.google.com/s2/favicons?domain=https://keybase.io/) [Keybase (https://keybase.io/)](https://keybase.io/)*: top 5K, business* +1. ![](https://www.google.com/s2/favicons?domain=https://www.liveleak.com/) [LiveLeak (https://www.liveleak.com/)](https://www.liveleak.com/)*: top 5K, news, video*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://beacons.ai) [beacons.ai (https://beacons.ai)](https://beacons.ai)*: top 5K, links* +1. ![](https://www.google.com/s2/favicons?domain=https://www.artsy.net) [Artsy (https://www.artsy.net)](https://www.artsy.net)*: top 5K, art*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.ifttt.com/) [IFTTT (https://www.ifttt.com/)](https://www.ifttt.com/)*: top 5K, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://muckrack.com) [Muckrack (https://muckrack.com)](https://muckrack.com)*: top 5K, news*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.crunchyroll.com/) [Crunchyroll (https://www.crunchyroll.com/)](https://www.crunchyroll.com/)*: top 5K, forum, movies*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://odysee.com/) [Odysee (https://odysee.com/)](https://odysee.com/)*: top 5K, video* +1. ![](https://www.google.com/s2/favicons?domain=https://replit.com/) [Replit (https://replit.com/)](https://replit.com/)*: top 5K, coding*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://taplink.cc/) [Taplink (https://taplink.cc/)](https://taplink.cc/)*: top 5K, links* +1. ![](https://www.google.com/s2/favicons?domain=https://www.freelancer.com/) [Freelancer.com (https://www.freelancer.com/)](https://www.freelancer.com/)*: top 5K, freelance* +1. ![](https://www.google.com/s2/favicons?domain=https://donorbox.org) [Donorbox (https://donorbox.org)](https://donorbox.org)*: top 5K, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://hackmd.io/) [Hack MD (https://hackmd.io/)](https://hackmd.io/)*: top 5K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.inaturalist.org) [iNaturalist (https://www.inaturalist.org)](https://www.inaturalist.org)*: top 5K, hobby, science* +1. ![](https://www.google.com/s2/favicons?domain=https://www.templatemonster.com) [TemplateMonster (https://www.templatemonster.com)](https://www.templatemonster.com)*: top 5K, coding*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://venmo.com/) [Venmo (https://venmo.com/)](https://venmo.com/)*: top 5K, finance, fintech, us* +1. ![](https://www.google.com/s2/favicons?domain=https://teletype.in) [Teletype (https://teletype.in)](https://teletype.in)*: top 5K, ru, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://onlyfans.com/) [OnlyFans (https://onlyfans.com/)](https://onlyfans.com/)*: top 5K, porn* +1. ![](https://www.google.com/s2/favicons?domain=https://steemit.com) [Steemit (https://steemit.com)](https://steemit.com)*: top 5K, news* +1. ![](https://www.google.com/s2/favicons?domain=https://leetcode.com/) [LeetCode (https://leetcode.com/)](https://leetcode.com/)*: top 5K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://gfycat.com/) [Gfycat (https://gfycat.com/)](https://gfycat.com/)*: top 5K, photo, sharing*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.chess.com) [Chess (https://www.chess.com)](https://www.chess.com)*: top 5K, gaming, hobby* +1. ![](https://www.google.com/s2/favicons?domain=https://ctan.org/) [CTAN (https://ctan.org/)](https://ctan.org/)*: top 5K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://opencollective.com/) [OpenCollective (https://opencollective.com/)](https://opencollective.com/)*: top 5K, coding, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dailykos.com) [DailyKos (https://www.dailykos.com)](https://www.dailykos.com)*: top 5K, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.techdirt.com/) [Techdirt (https://www.techdirt.com/)](https://www.techdirt.com/)*: top 5K, news, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mix.com) [Mix (https://mix.com)](https://mix.com)*: top 5K, links, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://www.giantbomb.com) [Giantbomb (https://www.giantbomb.com)](https://www.giantbomb.com)*: top 5K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://jalbum.net) [jAlbum.net (https://jalbum.net)](https://jalbum.net)*: top 5K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://newgrounds.com) [Newgrounds (https://newgrounds.com)](https://newgrounds.com)*: top 5K, art, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://slides.com/) [Slides (https://slides.com/)](https://slides.com/)*: top 5K, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://ultimate-guitar.com/) [Ultimate-Guitar (https://ultimate-guitar.com/)](https://ultimate-guitar.com/)*: top 5K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://chaturbate.com) [ChaturBate (https://chaturbate.com)](https://chaturbate.com)*: top 5K, porn, webcam* +1. ![](https://www.google.com/s2/favicons?domain=https://hackerone.com/) [HackerOne (https://hackerone.com/)](https://hackerone.com/)*: top 5K, coding, hacking* +1. ![](https://www.google.com/s2/favicons?domain=https://www.myfitnesspal.com/) [MyFitnessPal (https://www.myfitnesspal.com/)](https://www.myfitnesspal.com/)*: top 5K, sport*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://contently.com/) [Contently (https://contently.com/)](https://contently.com/)*: top 5K, freelance* +1. ![](https://www.google.com/s2/favicons?domain=https://www.myminifactory.com/) [MyMiniFactory (https://www.myminifactory.com/)](https://www.myminifactory.com/)*: top 5K, 3d, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://www.9gag.com/) [9GAG (https://www.9gag.com/)](https://www.9gag.com/)*: top 5K, sharing, social*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://creativemarket.com/) [CreativeMarket (https://creativemarket.com/)](https://creativemarket.com/)*: top 5K, art, stock* +1. ![](https://www.google.com/s2/favicons?domain=https://opensource.com/) [OpenSource (https://opensource.com/)](https://opensource.com/)*: top 5K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.couchsurfing.com/) [Couchsurfing (https://www.couchsurfing.com/)](https://www.couchsurfing.com/)*: top 5K, travel* +1. ![](https://www.google.com/s2/favicons?domain=http://www.folkd.com/profile/) [Folkd (http://www.folkd.com/profile/)](http://www.folkd.com/profile/)*: top 5K, bookmarks*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://imgflip.com) [Imgflip (https://imgflip.com)](https://imgflip.com)*: top 5K, photo, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://hackaday.io/) [Hackaday (https://hackaday.io/)](https://hackaday.io/)*: top 5K, hobby, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://www.animenewsnetwork.com) [AnimeNewsNetwork (https://www.animenewsnetwork.com)](https://www.animenewsnetwork.com)*: top 5K, anime, news* +1. ![](https://www.google.com/s2/favicons?domain=https://www.librarything.com/) [LibraryThing (https://www.librarything.com/)](https://www.librarything.com/)*: top 5K, books* +1. ![](https://www.google.com/s2/favicons?domain=https://www.fodors.com) [Fodors (https://www.fodors.com)](https://www.fodors.com)*: top 5K, travel* +1. ![](https://www.google.com/s2/favicons?domain=https://99designs.com) [Designs99 (https://99designs.com)](https://99designs.com)*: top 5K, design, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pscp.tv) [Periscope (https://www.pscp.tv)](https://www.pscp.tv)*: top 5K, streaming, video* +1. ![](https://www.google.com/s2/favicons?domain=https://freesound.org/) [Freesound (https://freesound.org/)](https://freesound.org/)*: top 5K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.metal-archives.com) [Metal-archives (https://www.metal-archives.com)](https://www.metal-archives.com)*: top 5K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.kongregate.com/) [Kongregate (https://www.kongregate.com/)](https://www.kongregate.com/)*: top 5K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://alternativeto.net/) [AlternativeTo (https://alternativeto.net/)](https://alternativeto.net/)*: top 5K, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://pikabu.ru/) [Pikabu (https://pikabu.ru/)](https://pikabu.ru/)*: top 5K, ru, sharing, social* +1. ![](https://www.google.com/s2/favicons?domain=https://lichess.org) [Lichess (https://lichess.org)](https://lichess.org)*: top 5K, gaming, hobby* +1. ![](https://www.google.com/s2/favicons?domain=https://speedrun.com/) [Speedrun.com (https://speedrun.com/)](https://speedrun.com/)*: top 5K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://f6s.com/) [F6S (https://f6s.com/)](https://f6s.com/)*: top 5K, business*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://boosty.to) [Boosty (https://boosty.to)](https://boosty.to)*: top 10K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://soup.io) [Soup (https://soup.io)](https://soup.io)*: top 10K, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://adblockplus.org) [adblockplus.org (https://adblockplus.org)](https://adblockplus.org)*: top 10K, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hackster.io) [Hackster (https://www.hackster.io)](https://www.hackster.io)*: top 10K, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://dreamwidth.org/profile) [Dreamwidth (https://dreamwidth.org/profile)](https://dreamwidth.org/profile)*: top 10K, blog*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://xvideos.com/) [Xvideos (https://xvideos.com/)](https://xvideos.com/)*: top 10K, porn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.furaffinity.net) [Fur Affinity (https://www.furaffinity.net)](https://www.furaffinity.net)*: top 10K, art* +1. ![](https://www.google.com/s2/favicons?domain=https://www.funnyordie.com) [Funnyordie (https://www.funnyordie.com)](https://www.funnyordie.com)*: top 10K, video*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://hashnode.com) [Hashnode (https://hashnode.com)](https://hashnode.com)*: top 10K, blog, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.itemfix.com) [ItemFix (https://www.itemfix.com)](https://www.itemfix.com)*: top 10K, video* +1. ![](https://www.google.com/s2/favicons?domain=https://allmylinks.com/) [AllMyLinks (https://allmylinks.com/)](https://allmylinks.com/)*: top 10K, links* +1. ![](https://www.google.com/s2/favicons?domain=https://www.nintendolife.com/) [Nintendo Life (https://www.nintendolife.com/)](https://www.nintendolife.com/)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://carbonmade.com/) [Carbonmade (https://carbonmade.com/)](https://carbonmade.com/)*: top 10K, design* +1. ![](https://www.google.com/s2/favicons?domain=https://www.moddb.com/) [ModDB (https://www.moddb.com/)](https://www.moddb.com/)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://untappd.com) [Untappd (https://untappd.com)](https://untappd.com)*: top 10K, geosocial, networking* +1. ![](https://www.google.com/s2/favicons?domain=https://segmentfault.com/) [SegmentFault (https://segmentfault.com/)](https://segmentfault.com/)*: top 10K, cn*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://audiojungle.net/) [Audiojungle (https://audiojungle.net/)](https://audiojungle.net/)*: top 10K, music, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hackerrank.com/) [Hackerrank (https://www.hackerrank.com/)](https://www.hackerrank.com/)*: top 10K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.ebaumsworld.com/) [eBaumsWorld (https://www.ebaumsworld.com/)](https://www.ebaumsworld.com/)*: top 10K, news* +1. ![](https://www.google.com/s2/favicons?domain=https://rapidapi.com) [RapidAPI (https://rapidapi.com)](https://rapidapi.com)*: top 10K, coding*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.tbank.ru/invest/) [Tinkoff Invest (https://www.tbank.ru/invest/)](https://www.tbank.ru/invest/)*: top 10K, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://ccmixter.org/) [Ccmixter (http://ccmixter.org/)](http://ccmixter.org/)*: top 10K, music*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://dtf.ru) [DTF (https://dtf.ru)](https://dtf.ru)*: top 10K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.minds.com) [Minds (https://www.minds.com)](https://www.minds.com)*: top 10K, in, social* +1. ![](https://www.google.com/s2/favicons?domain=https://www.fanpop.com/) [Fanpop (https://www.fanpop.com/)](https://www.fanpop.com/)*: top 10K, discussion*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mercadolivre.com.br) [MercadoLivre (https://www.mercadolivre.com.br)](https://www.mercadolivre.com.br)*: top 10K, br* +1. ![](https://www.google.com/s2/favicons?domain=https://tinder.com/) [Tinder (https://tinder.com/)](https://tinder.com/)*: top 10K, dating* +1. ![](https://www.google.com/s2/favicons?domain=https://www.anobii.com) [Anobii (https://www.anobii.com)](https://www.anobii.com)*: top 10K, books*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://morguefile.com) [Morguefile (https://morguefile.com)](https://morguefile.com)*: top 10K, photo*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://velog.io/) [Velog (https://velog.io/)](https://velog.io/)*: top 10K, blog, coding, kr* +1. ![](https://www.google.com/s2/favicons?domain=https://kick.com/) [Kick (https://kick.com/)](https://kick.com/)*: top 10K, streaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.domestika.org) [domestika.org (https://www.domestika.org)](https://www.domestika.org)*: top 10K, education* +1. ![](https://www.google.com/s2/favicons?domain=https://noblogs.org/) [Noblogs (https://noblogs.org/)](https://noblogs.org/)*: top 10K, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://www.setlist.fm) [Setlist (https://www.setlist.fm)](https://www.setlist.fm)*: top 10K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://steamdb.info) [steamdb.info (https://steamdb.info)](https://steamdb.info)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://robertsspaceindustries.com/) [Star Citizen (https://robertsspaceindustries.com/)](https://robertsspaceindustries.com/)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://robertsspaceindustries.com/) [Star Citizens Community (https://robertsspaceindustries.com/)](https://robertsspaceindustries.com/)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://tweakers.net) [Tweakers (https://tweakers.net)](https://tweakers.net)*: top 10K, nl, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://www.destructoid.com) [Destructoid (https://www.destructoid.com)](https://www.destructoid.com)*: top 10K, gaming, news*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://247sports.com) [247sports (https://247sports.com)](https://247sports.com)*: top 10K, news, sport*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.kwork.ru/) [Kwork (https://www.kwork.ru/)](https://www.kwork.ru/)*: top 10K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.jigsawplanet.com) [Jigsawplanet (https://www.jigsawplanet.com)](https://www.jigsawplanet.com)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://namu.wiki/) [Namuwiki (https://namu.wiki/)](https://namu.wiki/)*: top 10K, kr, wiki* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gaiaonline.com/) [GaiaOnline (https://www.gaiaonline.com/)](https://www.gaiaonline.com/)*: top 10K, gaming, ro, social, us* +1. ![](https://www.google.com/s2/favicons?domain=https://lnk.bio) [lnk.bio (https://lnk.bio)](https://lnk.bio)*: top 10K, links* +1. ![](https://www.google.com/s2/favicons?domain=https://ask.fm/) [AskFM (https://ask.fm/)](https://ask.fm/)*: top 10K, eg, in, ru, social*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://rutracker.org/) [Rutracker (https://rutracker.org/)](https://rutracker.org/)*: top 10K, ru, torrent* +1. ![](https://www.google.com/s2/favicons?domain=https://www.memrise.com/) [Memrise (https://www.memrise.com/)](https://www.memrise.com/)*: top 10K, education* +1. ![](https://www.google.com/s2/favicons?domain=https://archiveofourown.org) [ArchiveOfOurOwn (https://archiveofourown.org)](https://archiveofourown.org)*: top 10K, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://www.planetminecraft.com) [PlanetMinecraft (https://www.planetminecraft.com)](https://www.planetminecraft.com)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://musescore.com/) [Muse Score (https://musescore.com/)](https://musescore.com/)*: top 10K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.yummly.com) [Yummly (https://www.yummly.com)](https://www.yummly.com)*: top 10K, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.americanthinker.com/) [Americanthinker (https://www.americanthinker.com/)](https://www.americanthinker.com/)*: top 10K, news, us* +1. ![](https://www.google.com/s2/favicons?domain=https://rubygems.org/) [RubyGems (https://rubygems.org/)](https://rubygems.org/)*: top 10K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.webnode.cz/) [WebNode (https://www.webnode.cz/)](https://www.webnode.cz/)*: top 10K, cz* +1. ![](https://www.google.com/s2/favicons?domain=https://weheartit.com/) [We Heart It (https://weheartit.com/)](https://weheartit.com/)*: top 10K, blog, photo*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.theodysseyonline.com) [TheOdysseyOnline (https://www.theodysseyonline.com)](https://www.theodysseyonline.com)*: top 10K, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://www.kaskus.co.id) [Kaskus (https://www.kaskus.co.id)](https://www.kaskus.co.id)*: top 10K, id*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.periscope.tv/) [PeriscopeMain (https://www.periscope.tv/)](https://www.periscope.tv/)*: top 10K, streaming, video*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mssg.me) [mssg.me (https://mssg.me)](https://mssg.me)*: top 10K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.nairaland.com/) [Nairaland Forum (https://www.nairaland.com/)](https://www.nairaland.com/)*: top 10K, ng* +1. ![](https://www.google.com/s2/favicons?domain=https://www.sports.ru/) [sports.ru (https://www.sports.ru/)](https://www.sports.ru/)*: top 10K, ru, sport* +1. ![](https://www.google.com/s2/favicons?domain=https://banki.ru) [banki.ru (https://banki.ru)](https://banki.ru)*: top 10K, finance, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://colourlovers.com) [ColourLovers (http://colourlovers.com)](http://colourlovers.com)*: top 10K, design*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://picsart.com/) [Picsart (https://picsart.com/)](https://picsart.com/)*: top 10K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://codesandbox.io) [Code Sandbox (https://codesandbox.io)](https://codesandbox.io)*: top 10K, coding*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.skyscrapercity.com) [SkyscraperCity (https://www.skyscrapercity.com)](https://www.skyscrapercity.com)*: top 10K, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.drive2.ru/) [Drive2 (https://www.drive2.ru/)](https://www.drive2.ru/)*: top 10K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.wowhead.com) [Wowhead (https://www.wowhead.com)](https://www.wowhead.com)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.empowher.com) [Empowher (https://www.empowher.com)](https://www.empowher.com)*: top 10K, medicine* +1. ![](https://www.google.com/s2/favicons?domain=https://armorgames.com) [Armorgames (https://armorgames.com)](https://armorgames.com)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dslreports.com) [DSLReports (https://www.dslreports.com)](https://www.dslreports.com)*: top 10K, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://fotki.com) [Fotki (https://fotki.com)](https://fotki.com)*: top 10K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://kinja.com) [Kinja (https://kinja.com)](https://kinja.com)*: top 10K, blog*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.lesswrong.com) [Lesswrong (https://www.lesswrong.com)](https://www.lesswrong.com)*: top 10K* +1. ![](https://www.google.com/s2/favicons?domain=https://www.paltalk.com) [Paltalk (https://www.paltalk.com)](https://www.paltalk.com)*: top 10K, messaging* +1. ![](https://www.google.com/s2/favicons?domain=https://www.native-instruments.com/forum/) [NICommunityForum (https://www.native-instruments.com/forum/)](https://www.native-instruments.com/forum/)*: top 10K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://ccm.net) [Ccm (https://ccm.net)](https://ccm.net)*: top 10K, fr* +1. ![](https://www.google.com/s2/favicons?domain=https://rateyourmusic.com/) [Rate Your Music (https://rateyourmusic.com/)](https://rateyourmusic.com/)*: top 10K, music*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://videohive.net) [VideoHive (https://videohive.net)](https://videohive.net)*: top 10K, video* +1. ![](https://www.google.com/s2/favicons?domain=http://www.authorstream.com/) [authorSTREAM (http://www.authorstream.com/)](http://www.authorstream.com/)*: top 10K, documents, in, sharing*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.airliners.net/) [Airliners (https://www.airliners.net/)](https://www.airliners.net/)*: top 10K, hobby, photo*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.clubhouse.com) [Clubhouse (https://www.clubhouse.com)](https://www.clubhouse.com)*: top 10K, social* +1. ![](https://www.google.com/s2/favicons?domain=https://www.proza.ru/) [Proza.ru (https://www.proza.ru/)](https://www.proza.ru/)*: top 10K, ru, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://xenforo.com/community/) [xenforo.com (https://xenforo.com/community/)](https://xenforo.com/community/)*: top 10K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://globalvoices.org) [Globalvoices (https://globalvoices.org)](https://globalvoices.org)*: top 10K, news* +1. ![](https://www.google.com/s2/favicons?domain=https://xhamster.com) [xHamster (https://xhamster.com)](https://xhamster.com)*: top 10K, porn* +1. ![](https://www.google.com/s2/favicons?domain=https://polymarket.com) [Polymarket (https://polymarket.com)](https://polymarket.com)*: top 10K, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://www.namepros.com/) [Namepros (https://www.namepros.com/)](https://www.namepros.com/)*: top 10K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://write.as) [write.as (https://write.as)](https://write.as)*: top 10K, blog, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://www.fark.com/) [Fark (https://www.fark.com/)](https://www.fark.com/)*: top 10K, forum, news*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.warriorforum.com/) [Warrior Forum (https://www.warriorforum.com/)](https://www.warriorforum.com/)*: top 10K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.championat.com/) [Championat (https://www.championat.com/)](https://www.championat.com/)*: top 10K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.are.na) [are.na (https://www.are.na)](https://www.are.na)*: top 10K, art, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://mstdn.social/) [Mstdn.social (https://mstdn.social/)](https://mstdn.social/)*: top 10K, social* +1. ![](https://www.google.com/s2/favicons?domain=https://booth.pm/) [Booth (https://booth.pm/)](https://booth.pm/)*: top 10K, jp, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://www.wykop.pl) [Wykop (https://www.wykop.pl)](https://www.wykop.pl)*: top 10K, pl, social* +1. ![](https://www.google.com/s2/favicons?domain=https://www.taringa.net) [Taringa (https://www.taringa.net)](https://www.taringa.net)*: top 10K, ar, social*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://xdaforums.com) [XDA (https://xdaforums.com)](https://xdaforums.com)*: top 10K, apps, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.residentadvisor.net) [ResidentAdvisor (https://www.residentadvisor.net)](https://www.residentadvisor.net)*: top 10K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.sporcle.com/) [Sporcle (https://www.sporcle.com/)](https://www.sporcle.com/)*: top 10K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://teamtreehouse.com) [Treehouse (https://teamtreehouse.com)](https://teamtreehouse.com)*: top 10K, coding, education*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://adultfriendfinder.com) [AdultFriendFinder (https://adultfriendfinder.com)](https://adultfriendfinder.com)*: top 10K, dating*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://coroflot.com/) [Coroflot (https://coroflot.com/)](https://coroflot.com/)*: top 100K, design* +1. ![](https://www.google.com/s2/favicons?domain=http://www.jeuxvideo.com) [JeuxVideo (http://www.jeuxvideo.com)](http://www.jeuxvideo.com)*: top 100K, fr, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://aminoapps.com/) [AminoApp (https://aminoapps.com/)](https://aminoapps.com/)*: top 100K, br, social, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://vsco.co/) [VSCO (https://vsco.co/)](https://vsco.co/)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.anime-planet.com) [Anime-planet (https://www.anime-planet.com)](https://www.anime-planet.com)*: top 100K, anime* +1. ![](https://www.google.com/s2/favicons?domain=https://www.stihi.ru/) [Stihi.ru (https://www.stihi.ru/)](https://www.stihi.ru/)*: top 100K, ru, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://exposure.co/) [Exposure (https://exposure.co/)](https://exposure.co/)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.computerbase.de) [Computerbase (https://www.computerbase.de)](https://www.computerbase.de)*: top 100K, de*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://lyricstranslate.com) [LyricsTranslate (https://lyricstranslate.com)](https://lyricstranslate.com)*: top 100K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.guru.com) [Guru (https://www.guru.com)](https://www.guru.com)*: top 100K, freelance* +1. ![](https://www.google.com/s2/favicons?domain=https://rarible.com/) [Rarible (https://rarible.com/)](https://rarible.com/)*: top 100K, crypto, nft* +1. ![](https://www.google.com/s2/favicons?domain=https://www.bookcrossing.com/) [Bookcrossing (https://www.bookcrossing.com/)](https://www.bookcrossing.com/)*: top 100K, books* +1. ![](https://www.google.com/s2/favicons?domain=https://badoo.com/) [Badoo (https://badoo.com/)](https://badoo.com/)*: top 100K, dating*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://youporn.com) [YouPorn (https://youporn.com)](https://youporn.com)*: top 100K, porn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.allkpop.com/) [AllKPop (https://www.allkpop.com/)](https://www.allkpop.com/)*: top 100K, kr* +1. ![](https://www.google.com/s2/favicons?domain=https://www.cgtrader.com) [CGTrader (https://www.cgtrader.com)](https://www.cgtrader.com)*: top 100K, 3d, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gutefrage.net/) [Gutefrage (https://www.gutefrage.net/)](https://www.gutefrage.net/)*: top 100K, de, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.livelib.ru/) [LiveLib (https://www.livelib.ru/)](https://www.livelib.ru/)*: top 100K, books, reading, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.depop.com) [Depop (https://www.depop.com)](https://www.depop.com)*: top 100K, fashion, shopping* +1. ![](https://www.google.com/s2/favicons?domain=http://www.hi5.com) [hi5 (http://www.hi5.com)](http://www.hi5.com)*: top 100K, social*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://diary.ru) [Diary.ru (https://diary.ru)](https://diary.ru)*: top 100K, blog, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mirtesen.ru) [MirTesen (https://mirtesen.ru)](https://mirtesen.ru)*: top 100K, news, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.aufeminin.com) [Aufeminin (https://www.aufeminin.com)](https://www.aufeminin.com)*: top 100K, fr* +1. ![](https://www.google.com/s2/favicons?domain=https://coderwall.com/) [Coderwall (https://coderwall.com/)](https://coderwall.com/)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://pcpartpicker.com) [PCPartPicker (https://pcpartpicker.com)](https://pcpartpicker.com)*: top 100K, shopping, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://otzovik.com/) [Otzovik (https://otzovik.com/)](https://otzovik.com/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://observablehq.com) [Observable (https://observablehq.com)](https://observablehq.com)*: top 100K, sharing* +1. ![](https://www.google.com/s2/favicons?domain=http://www.pushsquare.com) [PushSquare (http://www.pushsquare.com)](http://www.pushsquare.com)*: top 100K, gaming, news, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.thestudentroom.co.uk) [TheStudentRoom (https://www.thestudentroom.co.uk)](https://www.thestudentroom.co.uk)*: top 100K, forum, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.codementor.io/) [Codementor (https://www.codementor.io/)](https://www.codementor.io/)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://n4g.com/) [N4g (https://n4g.com/)](https://n4g.com/)*: top 100K, gaming, news* +1. ![](https://www.google.com/s2/favicons?domain=https://www.lomography.com) [Lomography (https://www.lomography.com)](https://www.lomography.com)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://pixelfed.social/) [pixelfed.social (https://pixelfed.social/)](https://pixelfed.social/)*: top 100K, art, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hackerearth.com) [Hackerearth (https://www.hackerearth.com)](https://www.hackerearth.com)*: top 100K, freelance*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://weedmaps.com) [Weedmaps (https://weedmaps.com)](https://weedmaps.com)*: top 100K, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.redtube.com/) [Redtube (https://www.redtube.com/)](https://www.redtube.com/)*: top 100K, porn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.neoseeker.com) [Neoseeker (https://www.neoseeker.com)](https://www.neoseeker.com)*: top 100K, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://liberapay.com) [Liberapay (https://liberapay.com)](https://liberapay.com)*: top 100K, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://www.sythe.org) [Sythe (https://www.sythe.org)](https://www.sythe.org)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.filmweb.pl/user/adam) [FilmWeb (https://www.filmweb.pl/user/adam)](https://www.filmweb.pl/user/adam)*: top 100K, movies, pl* +1. ![](https://www.google.com/s2/favicons?domain=https://listal.com/) [Listal (https://listal.com/)](https://listal.com/)*: top 100K, movies, music* +1. ![](https://www.google.com/s2/favicons?domain=https://bukkit.org/) [Bukkit (https://bukkit.org/)](https://bukkit.org/)*: top 100K, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.sparkpeople.com) [SparkPeople (https://www.sparkpeople.com)](https://www.sparkpeople.com)*: top 100K, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.spatial.io) [Spatial (https://www.spatial.io)](https://www.spatial.io)*: top 100K, crypto, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.nn.ru/) [NN.RU (https://www.nn.ru/)](https://www.nn.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://paragraph.com) [Paragraph (https://paragraph.com)](https://paragraph.com)*: top 100K, blog, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://www.huntingnet.com) [Huntingnet (https://www.huntingnet.com)](https://www.huntingnet.com)*: top 100K, us* +1. ![](https://www.google.com/s2/favicons?domain=https://telescope.ac) [telescope.ac (https://telescope.ac)](https://telescope.ac)*: top 100K, blog*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://chaos.social/) [chaos.social (https://chaos.social/)](https://chaos.social/)*: top 100K, social*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://chaos.social/) [mastodon.social (https://chaos.social/)](https://chaos.social/)*: top 100K, social* +1. ![](https://www.google.com/s2/favicons?domain=https://notabug.org/) [notabug.org (https://notabug.org/)](https://notabug.org/)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.livemaster.ru) [Livemaster (https://www.livemaster.ru)](https://www.livemaster.ru)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.joomlart.com) [Joomlart (https://www.joomlart.com)](https://www.joomlart.com)*: top 100K, coding*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://trinixy.ru) [Trinixy (https://trinixy.ru)](https://trinixy.ru)*: top 100K, news, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://tripit.com) [TripIt (https://tripit.com)](https://tripit.com)*: top 100K, travel*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mydramalist.com) [Mydramalist (https://mydramalist.com)](https://mydramalist.com)*: top 100K, kr, movies* +1. ![](https://www.google.com/s2/favicons?domain=https://www.vivino.com/) [Vivino (https://www.vivino.com/)](https://www.vivino.com/)*: top 100K, review* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pinkbike.com/) [Pinkbike (https://www.pinkbike.com/)](https://www.pinkbike.com/)*: top 100K, hobby* +1. ![](https://www.google.com/s2/favicons?domain=https://thechive.com/) [Thechive (https://thechive.com/)](https://thechive.com/)*: top 100K, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://www.goldderby.com) [Goldderby (https://www.goldderby.com)](https://www.goldderby.com)*: top 100K, movies* +1. ![](https://www.google.com/s2/favicons?domain=https://acomics.ru) [Acomics (https://acomics.ru)](https://acomics.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.meetme.com/) [MeetMe (https://www.meetme.com/)](https://www.meetme.com/)*: top 100K, in, social, us* +1. ![](https://www.google.com/s2/favicons?domain=https://irecommend.ru/) [iRecommend.RU (https://irecommend.ru/)](https://irecommend.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.flyertalk.com) [Flyertalk (https://www.flyertalk.com)](https://www.flyertalk.com)*: top 100K, travel* +1. ![](https://www.google.com/s2/favicons?domain=https://gbatemp.net/) [GBAtemp.net (https://gbatemp.net/)](https://gbatemp.net/)*: top 100K, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://4pda.ru/) [4pda (https://4pda.ru/)](https://4pda.ru/)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://akniga.org/) [Akniga (https://akniga.org/)](https://akniga.org/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://pinboard.in) [Pinboard (http://pinboard.in)](http://pinboard.in)*: top 100K, bookmarks*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.the-village.ru/) [TheVillage.ru (https://www.the-village.ru/)](https://www.the-village.ru/)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.brusheezy.com) [Brusheezy (https://www.brusheezy.com)](https://www.brusheezy.com)*: top 100K, photo, stock* +1. ![](https://www.google.com/s2/favicons?domain=https://cont.ws) [Cont (https://cont.ws)](https://cont.ws)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://garden.org) [Garden (https://garden.org)](https://garden.org)*: top 100K, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.avforums.com) [Avforums (https://www.avforums.com)](https://www.avforums.com)*: top 100K, forum, gb* +1. ![](https://www.google.com/s2/favicons?domain=http://www.mobypicture.com) [Mobypicture (http://www.mobypicture.com)](http://www.mobypicture.com)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://advego.com/) [Advego (https://advego.com/)](https://advego.com/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.nkj.ru/) [Nkj (https://www.nkj.ru/)](https://www.nkj.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hackthebox.com/) [HackTheBox (https://www.hackthebox.com/)](https://www.hackthebox.com/)*: top 100K, hacking* +1. ![](https://www.google.com/s2/favicons?domain=https://dlive.tv) [DLive (https://dlive.tv)](https://dlive.tv)*: top 100K, streaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.trakt.tv/) [Trakt (https://www.trakt.tv/)](https://www.trakt.tv/)*: top 100K, movies* +1. ![](https://www.google.com/s2/favicons?domain=https://tjournal.ru) [TJournal (https://tjournal.ru)](https://tjournal.ru)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.trueachievements.com) [TrueAchievements (https://www.trueachievements.com)](https://www.trueachievements.com)*: top 100K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=http://codeforces.com) [codeforces.com (http://codeforces.com)](http://codeforces.com)*: top 100K, coding, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.codechef.com/) [Codechef (https://www.codechef.com/)](https://www.codechef.com/)*: top 100K, in* +1. ![](https://www.google.com/s2/favicons?domain=https://www.physicsforums.com) [Physicsforums (https://www.physicsforums.com)](https://www.physicsforums.com)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://overclockers.ru) [Overclockers (https://overclockers.ru)](https://overclockers.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://opengameart.org) [Open Game Art (https://opengameart.org)](https://opengameart.org)*: top 100K, gaming, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://lobste.rs/) [Lobsters (https://lobste.rs/)](https://lobste.rs/)*: top 100K, coding, news* +1. ![](https://www.google.com/s2/favicons?domain=https://tryhackme.com/) [TryHackMe (https://tryhackme.com/)](https://tryhackme.com/)*: top 100K, hacking* +1. ![](https://www.google.com/s2/favicons?domain=https://www.ifunny.co) [iFunny (https://www.ifunny.co)](https://www.ifunny.co)*: top 100K, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://topcoder.com/) [Topcoder (https://topcoder.com/)](https://topcoder.com/)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.sevenforums.com) [SevenForums (https://www.sevenforums.com)](https://www.sevenforums.com)*: top 100K, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://picturepush.com) [picturepush.com (https://picturepush.com)](https://picturepush.com)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hotukdeals.com/) [Hot UKdeals (https://www.hotukdeals.com/)](https://www.hotukdeals.com/)*: top 100K, gb, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://eksisozluk.com) [Eksisozluk (https://eksisozluk.com)](https://eksisozluk.com)*: top 100K, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://www.voices.com/) [Voices (https://www.voices.com/)](https://www.voices.com/)*: top 100K, freelance*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.nhattao.com) [nhattao.com (https://www.nhattao.com)](https://www.nhattao.com)*: top 100K, forum, shopping, vn* +1. ![](https://www.google.com/s2/favicons?domain=https://repl.it/) [Repl.it (https://repl.it/)](https://repl.it/)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.codewars.com) [Codewars (https://www.codewars.com)](https://www.codewars.com)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://davesgarden.com) [Davesgarden (https://davesgarden.com)](https://davesgarden.com)*: top 100K, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.tiendanube.com/) [Tiendanube (https://www.tiendanube.com/)](https://www.tiendanube.com/)*: top 100K, ar, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://portfoliobox.net) [{username}.portfoliobox.net (https://portfoliobox.net)](https://portfoliobox.net)*: top 100K, design* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dcinside.com/) [Dcinside (https://www.dcinside.com/)](https://www.dcinside.com/)*: top 100K, forum, kr* +1. ![](https://www.google.com/s2/favicons?domain=https://www.digitalpoint.com) [DigitalPoint (https://www.digitalpoint.com)](https://www.digitalpoint.com)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.smule.com/) [Smule (https://www.smule.com/)](https://www.smule.com/)*: top 100K, music* +1. ![](https://www.google.com/s2/favicons?domain=http://promodj.com/) [PromoDJ (http://promodj.com/)](http://promodj.com/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://shor.by) [shor.by (https://shor.by)](https://shor.by)*: top 100K, links* +1. ![](https://www.google.com/s2/favicons?domain=https://nitter.net/) [Nitter (https://nitter.net/)](https://nitter.net/)*: top 100K, messaging, social*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://asciinema.org) [Asciinema (https://asciinema.org)](https://asciinema.org)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.opennet.ru/) [OpenNet (https://www.opennet.ru/)](https://www.opennet.ru/)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://linuxfr.org/) [Linuxfr (https://linuxfr.org/)](https://linuxfr.org/)*: top 100K, fr, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://www.cfd-online.com) [cfd-online (https://www.cfd-online.com)](https://www.cfd-online.com)*: top 100K, forum, science* +1. ![](https://www.google.com/s2/favicons?domain=https://funnyjunk.com/) [Funnyjunk (https://funnyjunk.com/)](https://funnyjunk.com/)*: top 100K, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://3dtoday.ru/) [3dtoday (https://3dtoday.ru/)](https://3dtoday.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.bibsonomy.org) [Bibsonomy (https://www.bibsonomy.org)](https://www.bibsonomy.org)*: top 100K, research*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.fixya.com) [fixya (https://www.fixya.com)](https://www.fixya.com)*: top 100K, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://spark.ru) [Spark (https://spark.ru)](https://spark.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://lurkmore.to) [Lurkmore (http://lurkmore.to)](http://lurkmore.to)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://psnprofiles.com/) [PSNProfiles.com (https://psnprofiles.com/)](https://psnprofiles.com/)*: top 100K, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://gloria.tv) [gloria.tv (https://gloria.tv)](https://gloria.tv)*: top 100K, video* +1. ![](https://www.google.com/s2/favicons?domain=https://ficwad.com/) [Ficwad (https://ficwad.com/)](https://ficwad.com/)*: top 100K, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://xakep.ru) [xakep.ru (https://xakep.ru)](https://xakep.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hr.com) [Hr (https://www.hr.com)](https://www.hr.com)*: top 100K, career*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.tripline.net) [Tripline (https://www.tripline.net)](https://www.tripline.net)*: top 100K, travel* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dealabs.com/) [Dealabs (https://www.dealabs.com/)](https://www.dealabs.com/)*: top 100K, fr* +1. ![](https://www.google.com/s2/favicons?domain=https://dou.ua/) [Dou (https://dou.ua/)](https://dou.ua/)*: top 100K, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://phrack.org) [Phrack (http://phrack.org)](http://phrack.org)*: top 100K, hacking*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://freelance.ru) [freelance.ru (https://freelance.ru)](https://freelance.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.wishlistr.com) [Wishlistr (https://www.wishlistr.com)](https://www.wishlistr.com)*: top 100K, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://www.travelblog.org) [Travelblog (https://www.travelblog.org)](https://www.travelblog.org)*: top 100K, blog, travel*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.fatsecret.com) [Fatsecret (https://www.fatsecret.com)](https://www.fatsecret.com)*: top 100K, au* +1. ![](https://www.google.com/s2/favicons?domain=https://uid.me/) [uID.me (by username) (https://uid.me/)](https://uid.me/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://uid.me/) [uID.me (by uguid) (https://uid.me/)](https://uid.me/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mel.fm) [mel.fm (https://mel.fm)](https://mel.fm)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.influenster.com/) [Influenster (https://www.influenster.com/)](https://www.influenster.com/)*: top 100K, review*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://deepdreamgenerator.com) [DeepDreamGenerator (https://deepdreamgenerator.com)](https://deepdreamgenerator.com)*: top 100K, art* +1. ![](https://www.google.com/s2/favicons?domain=https://mastodon.cloud/) [mastodon.cloud (https://mastodon.cloud/)](https://mastodon.cloud/)*: top 100K, pk* +1. ![](https://www.google.com/s2/favicons?domain=https://1x.com) [1x (https://1x.com)](https://1x.com)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.patientslikeme.com) [PatientsLikeMe (https://www.patientslikeme.com)](https://www.patientslikeme.com)*: top 100K, medicine, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.tikvib.com/) [Picuki (https://www.tikvib.com/)](https://www.tikvib.com/)*: top 100K, video* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pokecommunity.com) [Pokecommunity (https://www.pokecommunity.com)](https://www.pokecommunity.com)*: top 100K, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://eintracht.de) [Eintracht (https://eintracht.de)](https://eintracht.de)*: top 100K, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://www.datpiff.com) [Datpiff (https://www.datpiff.com)](https://www.datpiff.com)*: top 100K, us* +1. ![](https://www.google.com/s2/favicons?domain=http://samlib.ru/) [Samlib (http://samlib.ru/)](http://samlib.ru/)*: top 100K, gb, ru, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://goodgame.ru) [goodgame.ru (https://goodgame.ru)](https://goodgame.ru)*: top 100K, ru, streaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pling.com/) [Pling (https://www.pling.com/)](https://www.pling.com/)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://many.link) [many.link (https://many.link)](https://many.link)*: top 100K, links* +1. ![](https://www.google.com/s2/favicons?domain=https://hardforum.com) [Hardforum (https://hardforum.com)](https://hardforum.com)*: top 100K, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=http://www.23hq.com) [23hq (http://www.23hq.com)](http://www.23hq.com)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://sessionize.com) [sessionize.com (https://sessionize.com)](https://sessionize.com)*: top 100K, business* +1. ![](https://www.google.com/s2/favicons?domain=https://androidforums.com) [Androidforums (https://androidforums.com)](https://androidforums.com)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://studfile.net) [Studfile (https://studfile.net)](https://studfile.net)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://osu.ppy.sh/) [osu! (https://osu.ppy.sh/)](https://osu.ppy.sh/)*: top 100K* +1. ![](https://www.google.com/s2/favicons?domain=https://www.mydealz.de/) [Mydealz (https://www.mydealz.de/)](https://www.mydealz.de/)*: top 100K, de* +1. ![](https://www.google.com/s2/favicons?domain=https://www.b17.ru/) [B17 (https://www.b17.ru/)](https://www.b17.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.comedy.co.uk) [Comedy (https://www.comedy.co.uk)](https://www.comedy.co.uk)*: top 100K, gb, movies* +1. ![](https://www.google.com/s2/favicons?domain=https://www.fl.ru/) [FL.ru (https://www.fl.ru/)](https://www.fl.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://youpic.com/) [YouPic (https://youpic.com/)](https://youpic.com/)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://filmow.com/) [Filmow (https://filmow.com/)](https://filmow.com/)*: top 100K, br, pt* +1. ![](https://www.google.com/s2/favicons?domain=https://polarsteps.com/) [Polarsteps (https://polarsteps.com/)](https://polarsteps.com/)*: top 100K, travel* +1. ![](https://www.google.com/s2/favicons?domain=https://www.blackhatprotools.info) [BlackHatProTools (https://www.blackhatprotools.info)](https://www.blackhatprotools.info)*: top 100K, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://infourok.ru) [Infourok (https://infourok.ru)](https://infourok.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://platzi.com/) [Platzi (https://platzi.com/)](https://platzi.com/)*: top 100K, education, es* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gardenstew.com) [Gardenstew (https://www.gardenstew.com)](https://www.gardenstew.com)*: top 100K, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.tagged.com) [Tagged (http://www.tagged.com)](http://www.tagged.com)*: top 100K, networking* +1. ![](https://www.google.com/s2/favicons?domain=https://dumskaya.net) [dumskaya.net (https://dumskaya.net)](https://dumskaya.net)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://partnerkin.com) [partnerkin.com (https://partnerkin.com)](https://partnerkin.com)*: top 100K, finance* +1. ![](https://www.google.com/s2/favicons?domain=http://www.writingforums.org/) [writingforums.org (http://www.writingforums.org/)](http://www.writingforums.org/)*: top 100K, ca, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://chatujme.cz/) [Chatujme.cz (https://chatujme.cz/)](https://chatujme.cz/)*: top 100K, cz, dating* +1. ![](https://www.google.com/s2/favicons?domain=https://www.vxzone.com) [Vxzone (https://www.vxzone.com)](https://www.vxzone.com)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mediarepost.ru) [Mediarepost (https://mediarepost.ru)](https://mediarepost.ru)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://basecamphq.com) [Basecamphq (https://basecamphq.com)](https://basecamphq.com)*: top 100K, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.antiquers.com) [Antiquers (https://www.antiquers.com)](https://www.antiquers.com)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://manifold.markets/) [ManifoldMarkets (https://manifold.markets/)](https://manifold.markets/)*: top 100K, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://mamot.fr) [Mamot (https://mamot.fr)](https://mamot.fr)*: top 100K, fr, mastodon* +1. ![](https://www.google.com/s2/favicons?domain=https://stopgame.ru) [stopgame.ru (https://stopgame.ru)](https://stopgame.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.bigsoccer.com) [Bigsoccer (https://www.bigsoccer.com)](https://www.bigsoccer.com)*: top 100K, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://steamidfinder.com) [Steamidfinder (https://steamidfinder.com)](https://steamidfinder.com)*: top 100K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://steamidfinder.com) [Steamidfinder (by id) (https://steamidfinder.com)](https://steamidfinder.com)*: top 100K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://skyblock.net) [Skyblock (https://skyblock.net)](https://skyblock.net)*: top 100K, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.iphones.ru) [Iphones.ru (https://www.iphones.ru)](https://www.iphones.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://hive.blog/) [Hive Blog (https://hive.blog/)](https://hive.blog/)*: top 100K, blog, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://illustrators.ru) [Illustrators (https://illustrators.ru)](https://illustrators.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://fancy.com) [fancy.com (https://fancy.com)](https://fancy.com)*: top 100K, shopping*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://promptbase.com) [PromptBase (https://promptbase.com)](https://promptbase.com)*: top 100K, llm, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://spletnik.ru/) [Spletnik (https://spletnik.ru/)](https://spletnik.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://virgool.io/) [Virgool (https://virgool.io/)](https://virgool.io/)*: top 100K, blog, ir*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.fredmiranda.com) [Fredmiranda (https://www.fredmiranda.com)](https://www.fredmiranda.com)*: top 100K, de* +1. ![](https://www.google.com/s2/favicons?domain=https://hi-news.ru) [hi-news.ru (https://hi-news.ru)](https://hi-news.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://joyreactor.cc) [joyreactor.cc (https://joyreactor.cc)](https://joyreactor.cc)*: top 100K, art, nl, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.babyblog.ru/) [BabyBlog.ru (https://www.babyblog.ru/)](https://www.babyblog.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.7cups.com/) [7Cups (https://www.7cups.com/)](https://www.7cups.com/)*: top 100K, medicine*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://ctftime.org/) [CTFtime (https://ctftime.org/)](https://ctftime.org/)*: top 100K, hacking*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.smogon.com) [Smogon (https://www.smogon.com)](https://www.smogon.com)*: top 100K, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://linux.org.ru/) [LOR (https://linux.org.ru/)](https://linux.org.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.mouthshut.com/) [Mouthshut (https://www.mouthshut.com/)](https://www.mouthshut.com/)*: top 100K, in* +1. ![](https://www.google.com/s2/favicons?domain=https://eva.ru/) [Eva (https://eva.ru/)](https://eva.ru/)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.travellerspoint.com) [TravellersPoint (https://www.travellerspoint.com)](https://www.travellerspoint.com)*: top 100K, travel*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.viewbug.com) [ViewBug (https://www.viewbug.com)](https://www.viewbug.com)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.exophase.com/) [Exophase (https://www.exophase.com/)](https://www.exophase.com/)*: top 100K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://1337x.to) [1337x (https://1337x.to)](https://1337x.to)*: top 100K, torrent* +1. ![](https://www.google.com/s2/favicons?domain=https://videosift.com) [Videosift (https://videosift.com)](https://videosift.com)*: top 100K, video*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://webdeveloper.com) [webdeveloper.com (https://webdeveloper.com)](https://webdeveloper.com)*: top 100K, coding, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://fediverse.party) [fediverse.party (https://fediverse.party)](https://fediverse.party)*: top 100K, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://clarity.fm) [clarity.fm (https://clarity.fm)](https://clarity.fm)*: top 100K, business* +1. ![](https://www.google.com/s2/favicons?domain=https://smart-lab.ru/) [smart-lab.ru (https://smart-lab.ru/)](https://smart-lab.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.weblancer.net) [Weblancer (https://www.weblancer.net)](https://www.weblancer.net)*: top 100K, freelance, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://sugoidesu.net) [Sugoidesu (https://sugoidesu.net)](https://sugoidesu.net)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://3ddd.ru) [3ddd (https://3ddd.ru)](https://3ddd.ru)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://profi.ru) [profi.ru (https://profi.ru)](https://profi.ru)*: top 100K, freelance* +1. ![](https://www.google.com/s2/favicons?domain=https://php.ru/forum/) [php.ru (https://php.ru/forum/)](https://php.ru/forum/)*: top 100K, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://pandia.ru) [Pandia (https://pandia.ru)](https://pandia.ru)*: top 100K, news, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.reality-check.ca) [reality-check.ca (https://www.reality-check.ca)](https://www.reality-check.ca)*: top 100K, ca, forum, medicine*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://publiclab.org) [Publiclab (https://publiclab.org)](https://publiclab.org)*: top 100K, science* +1. ![](https://www.google.com/s2/favicons?domain=https://framapiaf.org) [Framapiaf (https://framapiaf.org)](https://framapiaf.org)*: top 100K, mastodon* +1. ![](https://www.google.com/s2/favicons?domain=https://easyeda.com) [EasyEDA (https://easyeda.com)](https://easyeda.com)*: top 100K, de, mx* +1. ![](https://www.google.com/s2/favicons?domain=https://packetstormsecurity.com) [PacketStormSecurity (https://packetstormsecurity.com)](https://packetstormsecurity.com)*: top 100K, tr*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://zora.co) [Zora (https://zora.co)](https://zora.co)*: top 100K, crypto, nft* +1. ![](https://www.google.com/s2/favicons?domain=https://www.donationalerts.com/) [DonationsAlerts (https://www.donationalerts.com/)](https://www.donationalerts.com/)*: top 100K, finance, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.ecoustics.com/) [Ecoustics (https://www.ecoustics.com/)](https://www.ecoustics.com/)*: top 100K, hk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://thoughts.com) [thoughts.com (http://thoughts.com)](http://thoughts.com)*: top 100K, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://www.interpals.net/) [InterPals (https://www.interpals.net/)](https://www.interpals.net/)*: top 100K, dating* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gapyear.com) [Gapyear (https://www.gapyear.com)](https://www.gapyear.com)*: top 100K, gb, travel* +1. ![](https://www.google.com/s2/favicons?domain=https://www.myinstants.com) [Myinstants (https://www.myinstants.com)](https://www.myinstants.com)*: top 100K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://www.mybuilder.com) [Mybuilder (https://www.mybuilder.com)](https://www.mybuilder.com)*: top 100K, gb, hk* +1. ![](https://www.google.com/s2/favicons?domain=https://aniworld.to/) [Ani World (https://aniworld.to/)](https://aniworld.to/)*: top 100K, anime, de* +1. ![](https://www.google.com/s2/favicons?domain=https://www.oper.ru/) [Oper (https://www.oper.ru/)](https://www.oper.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mastodon.xyz/) [mastodon.technology (https://mastodon.xyz/)](https://mastodon.xyz/)*: top 100K, th*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mastodon.xyz/) [mastodon.xyz (https://mastodon.xyz/)](https://mastodon.xyz/)*: top 100K, th* +1. ![](https://www.google.com/s2/favicons?domain=http://www.psychologies.ru) [Psychologies.ru (http://www.psychologies.ru)](http://www.psychologies.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.tnaflix.com) [TNAFlix (https://www.tnaflix.com)](https://www.tnaflix.com)*: top 100K, porn*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.chitalnya.ru) [Chitalnya (https://www.chitalnya.ru)](https://www.chitalnya.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://smokingmeatforums.com) [smokingmeatforums.com (https://smokingmeatforums.com)](https://smokingmeatforums.com)*: top 100K, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://vero.co) [Vero (https://vero.co)](https://vero.co)*: top 100K, in, social, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://reibert.info/) [Reibert (https://reibert.info/)](https://reibert.info/)*: top 100K, forum, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://author.today) [author.today (https://author.today)](https://author.today)*: top 100K, reading, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://gcup.ru) [gcup.ru (http://gcup.ru)](http://gcup.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mywed.com/ru) [Mywed (https://mywed.com/ru)](https://mywed.com/ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://golbis.com) [Golbis (https://golbis.com)](https://golbis.com)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.sooplive.co.kr/) [Soop (https://www.sooplive.co.kr/)](https://www.sooplive.co.kr/)*: top 100K, kr* +1. ![](https://www.google.com/s2/favicons?domain=https://freelancehunt.com) [Freelancehunt (https://freelancehunt.com)](https://freelancehunt.com)*: top 100K, freelance, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://atcoder.jp/) [Atcoder (https://atcoder.jp/)](https://atcoder.jp/)*: top 100K, coding, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://www.livejasmin.com/) [Livejasmin (https://www.livejasmin.com/)](https://www.livejasmin.com/)*: top 100K, us, webcam* +1. ![](https://www.google.com/s2/favicons?domain=https://wanelo.com/) [Wanelo (https://wanelo.com/)](https://wanelo.com/)*: top 100K, shopping*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://motherless.com/) [Motherless (https://motherless.com/)](https://motherless.com/)*: top 100K, porn* +1. ![](https://www.google.com/s2/favicons?domain=http://fanlore.org) [Fanlore (http://fanlore.org)](http://fanlore.org)*: top 100K, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.jetpunk.com) [Jetpunk (https://www.jetpunk.com)](https://www.jetpunk.com)*: top 100K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://icobench.com) [Icobench (https://icobench.com)](https://icobench.com)*: top 100K, kr, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.rappad.co) [Rappad (https://www.rappad.co)](https://www.rappad.co)*: top 100K, music* +1. ![](https://www.google.com/s2/favicons?domain=https://maxpark.com) [Maxpark (https://maxpark.com)](https://maxpark.com)*: top 100K, news, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://savingadvice.com) [savingadvice.com (https://savingadvice.com)](https://savingadvice.com)*: top 100K, finance*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://nationstates.net) [NationStates Nation (https://nationstates.net)](https://nationstates.net)*: top 100K, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://nationstates.net) [NationStates Region (https://nationstates.net)](https://nationstates.net)*: top 100K, us* +1. ![](https://www.google.com/s2/favicons?domain=https://revolut.me) [Revolut.me (https://revolut.me)](https://revolut.me)*: top 100K, finance, fintech* +1. ![](https://www.google.com/s2/favicons?domain=https://ethresear.ch) [Ethresear (https://ethresear.ch)](https://ethresear.ch)*: top 100K, ch, cr, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.homebrewtalk.com) [homebrewtalk.com (https://www.homebrewtalk.com)](https://www.homebrewtalk.com)*: top 100K, forum, hobby* +1. ![](https://www.google.com/s2/favicons?domain=http://www.tfw2005.com/boards/) [tfw2005.com (http://www.tfw2005.com/boards/)](http://www.tfw2005.com/boards/)*: top 100K, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://lemmy.world) [Lemmy World (https://lemmy.world)](https://lemmy.world)*: top 100K, discussion, lemmy* +1. ![](https://www.google.com/s2/favicons?domain=https://www.zoomit.ir) [Zoomir.ir (https://www.zoomit.ir)](https://www.zoomit.ir)*: top 100K, forum, ir, news* +1. ![](https://www.google.com/s2/favicons?domain=https://cent.co/) [Cent (https://cent.co/)](https://cent.co/)*: top 100K, art, writing* +1. ![](https://www.google.com/s2/favicons?domain=https://VJudge.net/) [Vjudge (https://VJudge.net/)](https://VJudge.net/)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.phpbbguru.net/community) [phpbbguru.net (https://www.phpbbguru.net/community)](https://www.phpbbguru.net/community)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://wigle.net) [Wigle (https://wigle.net)](https://wigle.net)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.trainsim.com/) [Trainsim (https://www.trainsim.com/)](https://www.trainsim.com/)*: top 100K, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.valinor.com.br/forum/) [valinor.com.br (http://www.valinor.com.br/forum/)](http://www.valinor.com.br/forum/)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://gunsandammo.com/) [GunsAndAmmo (https://gunsandammo.com/)](https://gunsandammo.com/)*: top 100K, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.salon24.pl) [Salon24.pl (https://www.salon24.pl)](https://www.salon24.pl)*: top 100K* +1. ![](https://www.google.com/s2/favicons?domain=https://www.ariva.de/) [Ariva (https://www.ariva.de/)](https://www.ariva.de/)*: top 100K, de* +1. ![](https://www.google.com/s2/favicons?domain=https://www.thesimsresource.com/) [TheSimsResource (https://www.thesimsresource.com/)](https://www.thesimsresource.com/)*: top 100K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.root-me.org) [Root-me (https://www.root-me.org)](https://www.root-me.org)*: top 100K, hacking, ir, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://tripster.ru) [Tripster (https://tripster.ru)](https://tripster.ru)*: top 100K, de, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://vgtimes.ru) [Vgtimes/Games (https://vgtimes.ru)](https://vgtimes.ru)*: top 100K, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://vgtimes.ru) [Vgtimes (https://vgtimes.ru)](https://vgtimes.ru)*: top 100K, gaming, news, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.chessclub.com) [Chessclub (https://www.chessclub.com)](https://www.chessclub.com)*: top 100K, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://windowsforum.com) [Windowsforum (https://windowsforum.com)](https://windowsforum.com)*: top 100K, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://warpcast.com) [Warpcast (https://warpcast.com)](https://warpcast.com)*: top 100K, crypto, social* +1. ![](https://www.google.com/s2/favicons?domain=https://libraries.io) [Libraries (https://libraries.io)](https://libraries.io)*: top 100K, coding*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://topmate.io/) [Topmate (https://topmate.io/)](https://topmate.io/)*: top 100K, freelance* +1. ![](https://www.google.com/s2/favicons?domain=https://weburg.net) [Weburg (https://weburg.net)](https://weburg.net)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://typeracer.com) [Typeracer (https://typeracer.com)](https://typeracer.com)*: top 100K, hobby* +1. ![](https://www.google.com/s2/favicons?domain=https://www.playstationtrophies.org) [PlaystationTrophies (https://www.playstationtrophies.org)](https://www.playstationtrophies.org)*: top 100K, forum, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.glavbukh.ru) [Scorcher (https://www.glavbukh.ru)](https://www.glavbukh.ru)*: top 100K, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.erome.com/) [Erome (https://www.erome.com/)](https://www.erome.com/)*: top 100K, porn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.imagefap.com/) [Image Fap (https://www.imagefap.com/)](https://www.imagefap.com/)*: top 100K, porn* +1. ![](https://www.google.com/s2/favicons?domain=https://devrant.com/) [devRant (https://devrant.com/)](https://devrant.com/)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://rmmedia.ru) [Rmmedia (https://rmmedia.ru)](https://rmmedia.ru)*: top 100K, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://trashbox.ru/) [Trashbox.ru (https://trashbox.ru/)](https://trashbox.ru/)*: top 100K, az, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.ddo.com) [Ddo (https://www.ddo.com)](https://www.ddo.com)*: top 100K, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.hometheaterforum.com) [Hometheaterforum (https://www.hometheaterforum.com)](https://www.hometheaterforum.com)*: top 100K, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.vlr.gg) [VLR (https://www.vlr.gg)](https://www.vlr.gg)*: top 100K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hackingwithswift.com) [HackingWithSwift (https://www.hackingwithswift.com)](https://www.hackingwithswift.com)*: top 100K, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://partyflock.nl) [Partyflock (https://partyflock.nl)](https://partyflock.nl)*: top 100K, nl* +1. ![](https://www.google.com/s2/favicons?domain=https://trisquel.info) [Trisquel (https://trisquel.info)](https://trisquel.info)*: top 100K, eu* +1. ![](https://www.google.com/s2/favicons?domain=https://pokemonshowdown.com) [Pokemon Showdown (https://pokemonshowdown.com)](https://pokemonshowdown.com)*: top 100K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://knowem.com/) [Knowem (https://knowem.com/)](https://knowem.com/)*: top 100K, business*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://moikrug.ru/) [MoiKrug (https://moikrug.ru/)](https://moikrug.ru/)*: top 100K, career* +1. ![](https://www.google.com/s2/favicons?domain=https://www.medikforum.ru) [Medikforum (https://www.medikforum.ru)](https://www.medikforum.ru)*: top 100K, de, forum, nl, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mynickname.com) [mynickname.com (https://mynickname.com)](https://mynickname.com)*: top 100K, social* +1. ![](https://www.google.com/s2/favicons?domain=https://appleinsider.ru) [appleinsider.ru (https://appleinsider.ru)](https://appleinsider.ru)*: top 100K, news, ru, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://imginn.com) [ImgInn (https://imginn.com)](https://imginn.com)*: top 100K, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://rpggeek.com) [RPGGeek (https://rpggeek.com)](https://rpggeek.com)*: top 100K, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.suomi24.fi) [Suomi24 (https://www.suomi24.fi)](https://www.suomi24.fi)*: top 100K, fi, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://ethereum-magicians.org) [Ethereum-magicians (https://ethereum-magicians.org)](https://ethereum-magicians.org)*: top 100K, cr, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hoobly.com) [Hoobly (https://www.hoobly.com)](https://www.hoobly.com)*: top 100K, classified, in*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.lushstories.com) [Lushstories (https://www.lushstories.com)](https://www.lushstories.com)*: top 100K, us* +1. ![](https://www.google.com/s2/favicons?domain=http://www.radioscanner.ru) [Radioscanner (http://www.radioscanner.ru)](http://www.radioscanner.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.govloop.com) [Govloop (https://www.govloop.com)](https://www.govloop.com)*: top 100K, education* +1. ![](https://www.google.com/s2/favicons?domain=https://wakatime.com) [Wakatime (https://wakatime.com)](https://wakatime.com)*: top 100K, ng, ve* +1. ![](https://www.google.com/s2/favicons?domain=http://www.cqham.ru) [Cqham (http://www.cqham.ru)](http://www.cqham.ru)*: top 100K, ru, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://designspiration.com/) [Designspiration (https://designspiration.com/)](https://designspiration.com/)*: top 100K, design* +1. ![](https://www.google.com/s2/favicons?domain=https://www.politforums.net/) [Politforums (https://www.politforums.net/)](https://www.politforums.net/)*: top 100K, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://namemc.com/) [NameMC (https://namemc.com/)](https://namemc.com/)*: top 100K, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.euro-football.ru) [EuroFootball (https://www.euro-football.ru)](https://www.euro-football.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.baby.ru/) [Baby.ru (https://www.baby.ru/)](https://www.baby.ru/)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.truelancer.com) [Truelancer (https://www.truelancer.com)](https://www.truelancer.com)*: top 100K, in* +1. ![](https://www.google.com/s2/favicons?domain=https://www.icheckmovies.com/) [Icheckmovies (https://www.icheckmovies.com/)](https://www.icheckmovies.com/)*: top 100K, movies* +1. ![](https://www.google.com/s2/favicons?domain=https://likee.video) [Likee (https://likee.video)](https://likee.video)*: top 100K, video* +1. ![](https://www.google.com/s2/favicons?domain=https://www.polywork.com) [Polywork (https://www.polywork.com)](https://www.polywork.com)*: top 100K, career*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.forumhouse.ru/) [ForumHouse (https://www.forumhouse.ru/)](https://www.forumhouse.ru/)*: top 100K, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://animesuperhero.com) [AnimeSuperHero (https://animesuperhero.com)](https://animesuperhero.com)*: top 100K, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.sports-tracker.com/) [SportsTracker (https://www.sports-tracker.com/)](https://www.sports-tracker.com/)*: top 100K, pt, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://vkrugudruzei.ru) [VKruguDruzei (http://vkrugudruzei.ru)](http://vkrugudruzei.ru)*: top 100K, by, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://trovo.live) [Trovo (https://trovo.live)](https://trovo.live)*: top 100K, streaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://fotostrana.ru) [fotostrana.ru (https://fotostrana.ru)](https://fotostrana.ru)*: top 100K, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.bigfooty.com/forum/) [bigfooty.com (https://www.bigfooty.com/forum/)](https://www.bigfooty.com/forum/)*: top 100K, au, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://tl.net) [Tl (https://tl.net)](https://tl.net)*: top 10M, de, dk* +1. ![](https://www.google.com/s2/favicons?domain=https://www.movieforums.com) [Movieforums (https://www.movieforums.com)](https://www.movieforums.com)*: top 10M, forum, la*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://crevado.com/) [Crevado (https://crevado.com/)](https://crevado.com/)*: top 10M, design* +1. ![](https://www.google.com/s2/favicons?domain=https://monkeytype.com/) [Monkeytype (https://monkeytype.com/)](https://monkeytype.com/)*: top 10M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.mylot.com/) [Mylot (https://www.mylot.com/)](https://www.mylot.com/)*: top 10M, pl* +1. ![](https://www.google.com/s2/favicons?domain=https://e621.net) [E621 (https://e621.net)](https://e621.net)*: top 10M, art* +1. ![](https://www.google.com/s2/favicons?domain=https://gvectors.com) [Gvectors (https://gvectors.com)](https://gvectors.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.rollitup.org) [Rollitup (https://www.rollitup.org)](https://www.rollitup.org)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://rive.app) [rive.app (https://rive.app)](https://rive.app)*: top 10M, design* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gingerbread.org.uk) [Gingerbread (https://www.gingerbread.org.uk)](https://www.gingerbread.org.uk)*: top 10M, gb* +1. ![](https://www.google.com/s2/favicons?domain=https://www.seoclerks.com) [SeoClerks (https://www.seoclerks.com)](https://www.seoclerks.com)*: top 10M, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://cash.me/) [CashMe (https://cash.me/)](https://cash.me/)*: top 10M, finance, fintech* +1. ![](https://www.google.com/s2/favicons?domain=https://mstdn.io/) [mstdn.io (https://mstdn.io/)](https://mstdn.io/)*: top 10M, mastodon, social* +1. ![](https://www.google.com/s2/favicons?domain=https://shazoo.ru) [Shazoo (https://shazoo.ru)](https://shazoo.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.movescount.com) [Movescount (http://www.movescount.com)](http://www.movescount.com)*: top 10M, maps*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.lightstalking.com) [lightstalking.com (https://www.lightstalking.com)](https://www.lightstalking.com)*: top 10M, blog, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://irc-galleria.net) [IRC-Galleria (https://irc-galleria.net)](https://irc-galleria.net)*: top 10M, fi*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.etxt.ru) [Etxt (https://www.etxt.ru)](https://www.etxt.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://intigriti.com) [Intigriti (https://intigriti.com)](https://intigriti.com)*: top 10M, eu, hacking* +1. ![](https://www.google.com/s2/favicons?domain=https://tproger.ru) [Tproger (https://tproger.ru)](https://tproger.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://7dach.ru/) [7dach (https://7dach.ru/)](https://7dach.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://hotcopper.com.au) [Hotcopper (https://hotcopper.com.au)](https://hotcopper.com.au)*: top 10M, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://gurushots.com/) [GuruShots (https://gurushots.com/)](https://gurushots.com/)*: top 10M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://bitpapa.com) [bitpapa.com (https://bitpapa.com)](https://bitpapa.com)*: top 10M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://www.weasyl.com) [Weasyl (https://www.weasyl.com)](https://www.weasyl.com)*: top 10M, art* +1. ![](https://www.google.com/s2/favicons?domain=https://d3.ru/) [d3 (https://d3.ru/)](https://d3.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.quibblo.com/) [Quibblo (https://www.quibblo.com/)](https://www.quibblo.com/)*: top 10M, discussion*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://survivalistboards.com) [survivalistboards.com (https://survivalistboards.com)](https://survivalistboards.com)*: top 10M, forum, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.younow.com/) [YouNow (https://www.younow.com/)](https://www.younow.com/)*: top 10M, be* +1. ![](https://www.google.com/s2/favicons?domain=https://www.touristlink.com) [Touristlink (https://www.touristlink.com)](https://www.touristlink.com)*: top 10M, travel* +1. ![](https://www.google.com/s2/favicons?domain=https://www.capfriendly.com/) [CapFriendly (https://www.capfriendly.com/)](https://www.capfriendly.com/)*: top 10M, ca*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.w7forums.com) [W7forums (https://www.w7forums.com)](https://www.w7forums.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://nick-name.ru/) [Nick-name.ru (https://nick-name.ru/)](https://nick-name.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://fragment.com) [Fragment (https://fragment.com)](https://fragment.com)*: top 10M, crypto, messaging* +1. ![](https://www.google.com/s2/favicons?domain=http://www.droidforums.net/) [Droidforums (http://www.droidforums.net/)](http://www.droidforums.net/)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mama.ru) [Mama (https://mama.ru)](https://mama.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://massagerepublic.com) [massagerepublic.com (https://massagerepublic.com)](https://massagerepublic.com)*: top 10M, erotic* +1. ![](https://www.google.com/s2/favicons?domain=https://getmyuni.com/) [GetMyUni (https://getmyuni.com/)](https://getmyuni.com/)*: top 10M, in*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://dota2.ru/) [Dota2 (https://dota2.ru/)](https://dota2.ru/)*: top 10M, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.old-games.ru) [Old-games (https://www.old-games.ru)](https://www.old-games.ru)*: top 10M, pt, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.allthelyrics.com) [AllTheLyrics (https://www.allthelyrics.com)](https://www.allthelyrics.com)*: top 10M, forum, music* +1. ![](https://www.google.com/s2/favicons?domain=https://nothing.community/) [Nothing Community (https://nothing.community/)](https://nothing.community/)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.clozemaster.com) [Clozemaster (https://www.clozemaster.com)](https://www.clozemaster.com)*: top 10M, education* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gamblejoe.com) [Gamblejoe (https://www.gamblejoe.com)](https://www.gamblejoe.com)*: top 10M, de, mk, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mpgh.net/) [Mpgh (https://www.mpgh.net/)](https://www.mpgh.net/)*: top 10M, forum, jp*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.vsemayki.ru/) [Vsemayki (https://www.vsemayki.ru/)](https://www.vsemayki.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.movie-list.com) [Movie-list (https://www.movie-list.com)](https://www.movie-list.com)*: top 10M, ca, forum, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://999.md) [999.md (https://999.md)](https://999.md)*: top 10M, freelance, md, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://forumodua.com) [ForumOdUa (https://forumodua.com)](https://forumodua.com)*: top 10M, forum, ro, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.arrse.co.uk/) [Arrse (https://www.arrse.co.uk/)](https://www.arrse.co.uk/)*: top 10M, ca, forum, gb, pk* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hackthissite.org) [Hackthissite (https://www.hackthissite.org)](https://www.hackthissite.org)*: top 10M, hacking* +1. ![](https://www.google.com/s2/favicons?domain=https://modx.pro) [Modx_pro (https://modx.pro)](https://modx.pro)*: top 10M, ru, uz* +1. ![](https://www.google.com/s2/favicons?domain=https://www.freelancejob.ru) [FreelanceJob (https://www.freelancejob.ru)](https://www.freelancejob.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.rusfootball.info/) [Football (https://www.rusfootball.info/)](https://www.rusfootball.info/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.beerintheevening.com) [Beerintheevening (http://www.beerintheevening.com)](http://www.beerintheevening.com)*: top 10M, gb* +1. ![](https://www.google.com/s2/favicons?domain=https://fortnitetracker.com/challenges) [FortniteTracker (https://fortnitetracker.com/challenges)](https://fortnitetracker.com/challenges)*: top 10M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.heavy-r.com/) [Heavy R (https://www.heavy-r.com/)](https://www.heavy-r.com/)*: top 10M, porn* +1. ![](https://www.google.com/s2/favicons?domain=http://www.coolminiornot.com) [Coolminiornot (http://www.coolminiornot.com)](http://www.coolminiornot.com)*: top 10M, forum, sg*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.1001tracklists.com) [1001tracklists (https://www.1001tracklists.com)](https://www.1001tracklists.com)*: top 10M, music* +1. ![](https://www.google.com/s2/favicons?domain=https://kwejk.pl) [Kwejk (https://kwejk.pl)](https://kwejk.pl)*: top 10M, pl* +1. ![](https://www.google.com/s2/favicons?domain=https://www.livios.be) [Livios (https://www.livios.be)](https://www.livios.be)*: top 10M, be, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forest.ru/) [Forest (https://forest.ru/)](https://forest.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pronouns.page/) [Pronouns.page (https://pronouns.page/)](https://pronouns.page/)*: top 10M, social* +1. ![](https://www.google.com/s2/favicons?domain=https://www.radiokot.ru) [Radiokot (https://www.radiokot.ru)](https://www.radiokot.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://au.ru) [Au (https://au.ru)](https://au.ru)*: top 10M, freelance, ru, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://programming.dev) [programming.dev (https://programming.dev)](https://programming.dev)*: top 10M, lemmy* +1. ![](https://www.google.com/s2/favicons?domain=https://imgsrc.ru/) [imgsrc.ru (https://imgsrc.ru/)](https://imgsrc.ru/)*: top 10M, be, de, es, pt, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://thebigboss.org) [Thebigboss (http://thebigboss.org)](http://thebigboss.org)*: top 10M, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://professionali.ru) [Professionali (https://professionali.ru)](https://professionali.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://listography.com/adam) [Listography (https://listography.com/adam)](https://listography.com/adam)*: top 10M, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://www.theanswerbank.co.uk) [The AnswerBank (https://www.theanswerbank.co.uk)](https://www.theanswerbank.co.uk)*: top 10M, gb, q&a*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.bdoutdoors.com) [Bdoutdoors (https://www.bdoutdoors.com)](https://www.bdoutdoors.com)*: top 10M, us* +1. ![](https://www.google.com/s2/favicons?domain=http://millerovo161.ru) [millerovo161.ru (http://millerovo161.ru)](http://millerovo161.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://shikimori.one) [Shikimori (https://shikimori.one)](https://shikimori.one)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.kharkovforum.com/) [KharkovForum (https://www.kharkovforum.com/)](https://www.kharkovforum.com/)*: top 10M, forum, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mylespaul.com) [Mylespaul (https://www.mylespaul.com)](https://www.mylespaul.com)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.liinks.co) [Liinks (https://www.liinks.co)](https://www.liinks.co)*: top 10M, links*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.musiker-board.de) [Musiker-board (https://www.musiker-board.de)](https://www.musiker-board.de)*: top 10M, de, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.rlocman.ru) [Rlocman (https://www.rlocman.ru)](https://www.rlocman.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.avizo.cz/) [Avizo (https://www.avizo.cz/)](https://www.avizo.cz/)*: top 10M, cz* +1. ![](https://www.google.com/s2/favicons?domain=https://aminus3.com) [Aminus3 (https://aminus3.com)](https://aminus3.com)*: top 10M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://elixirforum.com) [Elixirforum (https://elixirforum.com)](https://elixirforum.com)*: top 10M, coding, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://egpu.io/) [eGPU (https://egpu.io/)](https://egpu.io/)*: top 10M, forum, jp, tech, tw* +1. ![](https://www.google.com/s2/favicons?domain=https://www.stratege.ru) [Stratege (https://www.stratege.ru)](https://www.stratege.ru)*: top 10M, forum, gaming, news, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://gramho.com/) [Gramho (https://gramho.com/)](https://gramho.com/)*: top 10M, photo*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.fluther.com/) [Fluther (https://www.fluther.com/)](https://www.fluther.com/)*: top 10M, q&a* +1. ![](https://www.google.com/s2/favicons?domain=https://www.sbazar.cz/) [Sbazar.cz (https://www.sbazar.cz/)](https://www.sbazar.cz/)*: top 10M, cz, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://vintage-mustang.com) [vintage-mustang.com (https://vintage-mustang.com)](https://vintage-mustang.com)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.forum.hr) [forum.hr (https://www.forum.hr)](https://www.forum.hr)*: top 10M, forum, hr* +1. ![](https://www.google.com/s2/favicons?domain=http://school2dobrinka.ru) [school2dobrinka.ru (http://school2dobrinka.ru)](http://school2dobrinka.ru)*: top 10M, education, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://kosmetista.ru) [Kosmetista (https://kosmetista.ru)](https://kosmetista.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pbnation.com/) [Pbnation (https://www.pbnation.com/)](https://www.pbnation.com/)*: top 10M, ca*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.jigidi.com/) [Jigidi (https://www.jigidi.com/)](https://www.jigidi.com/)*: top 10M, hobby* +1. ![](https://www.google.com/s2/favicons?domain=https://allhockey.ru/) [Allhockey (https://allhockey.ru/)](https://allhockey.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.runitonce.com/) [Runitonce (https://www.runitonce.com/)](https://www.runitonce.com/)*: top 10M, ca* +1. ![](https://www.google.com/s2/favicons?domain=https://onlyfinder.com) [Onlyfinder (https://onlyfinder.com)](https://onlyfinder.com)*: top 10M, webcam*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://postila.ru/) [Postila (https://postila.ru/)](https://postila.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.chemport.ru) [Chemport (https://www.chemport.ru)](https://www.chemport.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://vapenews.ru/) [Vapenews (https://vapenews.ru/)](https://vapenews.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://wirednewyork.com/) [WiredNewYork (http://wirednewyork.com/)](http://wirednewyork.com/)*: top 10M, forum, pk, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.cloob.com/) [Cloob (https://www.cloob.com/)](https://www.cloob.com/)*: top 10M, ir*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.snbforums.com) [Snbforums (https://www.snbforums.com)](https://www.snbforums.com)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://oshwlab.com) [oshwlab.com (https://oshwlab.com)](https://oshwlab.com)*: top 10M, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://www.redcafe.net) [Redcafe (https://www.redcafe.net)](https://www.redcafe.net)*: top 10M, forum, gb, sg* +1. ![](https://www.google.com/s2/favicons?domain=https://www.showme.com) [Showme (https://www.showme.com)](https://www.showme.com)*: top 10M, education* +1. ![](https://www.google.com/s2/favicons?domain=https://lori.ru) [Lori (https://lori.ru)](https://lori.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pregame.com) [Pregame (https://pregame.com)](https://pregame.com)*: top 10M, us* +1. ![](https://www.google.com/s2/favicons?domain=https://stereo.ru/) [Stereo (https://stereo.ru/)](https://stereo.ru/)*: top 10M, nl, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pr0gramm.com/) [Pr0gramm (https://pr0gramm.com/)](https://pr0gramm.com/)*: top 10M, de* +1. ![](https://www.google.com/s2/favicons?domain=https://www.office-forums.com) [Office-forums (https://www.office-forums.com)](https://www.office-forums.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://www.fotothing.com) [Fotothing (http://www.fotothing.com)](http://www.fotothing.com)*: top 10M, photo*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://loveplanet.ru) [Loveplanet (https://loveplanet.ru)](https://loveplanet.ru)*: top 10M, dating, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://sevenstring.org) [sevenstring.org (https://sevenstring.org)](https://sevenstring.org)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://bikepost.ru) [Bikepost (https://bikepost.ru)](https://bikepost.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://the-mainboard.com/index.php) [the-mainboard.com (http://the-mainboard.com/index.php)](http://the-mainboard.com/index.php)*: top 10M, forum, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.australianfrequentflyer.com.au/community/) [australianfrequentflyer.com.au (https://www.australianfrequentflyer.com.au/community/)](https://www.australianfrequentflyer.com.au/community/)*: top 10M, au, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://4stor.ru) [4stor (https://4stor.ru)](https://4stor.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://subaruoutback.org) [subaruoutback.org (https://subaruoutback.org)](https://subaruoutback.org)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://mamuli.club/) [Mamuli (https://mamuli.club/)](https://mamuli.club/)*: top 10M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://pentesterlab.com/) [Pentester Lab (https://pentesterlab.com/)](https://pentesterlab.com/)*: top 10M, hacking* +1. ![](https://www.google.com/s2/favicons?domain=https://pentesterlab.com/) [PentesterLab (https://pentesterlab.com/)](https://pentesterlab.com/)*: top 10M, hacking* +1. ![](https://www.google.com/s2/favicons?domain=https://www.snooth.com/) [Snooth (https://www.snooth.com/)](https://www.snooth.com/)*: top 10M, news* +1. ![](https://www.google.com/s2/favicons?domain=https://svtperformance.com) [svtperformance.com (https://svtperformance.com)](https://svtperformance.com)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.defensivecarry.com) [DefensiveCarry (https://www.defensivecarry.com)](https://www.defensivecarry.com)*: top 10M, us* +1. ![](https://www.google.com/s2/favicons?domain=https://gotovim-doma.ru) [GotovimDoma (https://gotovim-doma.ru)](https://gotovim-doma.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.chollometro.com/) [Chollometro (https://www.chollometro.com/)](https://www.chollometro.com/)*: top 10M, es, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://hpc.ru) [Hpc (https://hpc.ru)](https://hpc.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.railforums.co.uk) [railforums.co.uk (https://www.railforums.co.uk)](https://www.railforums.co.uk)*: top 10M, forum, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://subaruforester.org) [subaruforester.org (https://subaruforester.org)](https://subaruforester.org)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.ruby-forum.com) [Ruby-forum (https://www.ruby-forum.com)](https://www.ruby-forum.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.animeforum.com) [Animeforum (https://www.animeforum.com)](https://www.animeforum.com)*: top 10M, forum, pk, vn*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.hsx.com) [HSX (https://www.hsx.com)](https://www.hsx.com)*: top 10M, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://bobrdobr.ru) [Bobrdobr (https://bobrdobr.ru)](https://bobrdobr.ru)*: top 10M, az, ru, tr, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://www.blipfoto.com) [Blipfoto (https://www.blipfoto.com)](https://www.blipfoto.com)*: top 10M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.romanticcollection.ru) [RomanticCollection (https://www.romanticcollection.ru)](https://www.romanticcollection.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://justmj.ru) [justmj.ru (http://justmj.ru)](http://justmj.ru)*: top 10M, blog, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.edugeek.net) [EduGeek (https://www.edugeek.net)](https://www.edugeek.net)*: top 10M, education*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://ww2aircraft.net/forum/) [ww2aircraft.net (https://ww2aircraft.net/forum/)](https://ww2aircraft.net/forum/)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://hackenproof.com/arbin) [Hackenproof (https://hackenproof.com/arbin)](https://hackenproof.com/arbin)*: top 10M, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://tellonym.me/) [Tellonym.me (https://tellonym.me/)](https://tellonym.me/)*: top 10M, de, sa* +1. ![](https://www.google.com/s2/favicons?domain=https://www.empflix.com) [Empflix (https://www.empflix.com)](https://www.empflix.com)*: top 10M, de, fr, porn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.nitrotype.com/) [Nitro Type (https://www.nitrotype.com/)](https://www.nitrotype.com/)*: top 10M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.blast.hk) [Blast (https://www.blast.hk)](https://www.blast.hk)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.michigan-sportsman.com/forum/) [michigan-sportsman.com (http://www.michigan-sportsman.com/forum/)](http://www.michigan-sportsman.com/forum/)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.chipmaker.ru) [Chipmaker (https://www.chipmaker.ru)](https://www.chipmaker.ru)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://soylentnews.org) [SoylentNews (https://soylentnews.org)](https://soylentnews.org)*: top 10M, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.anibox.org) [Anibox (https://www.anibox.org)](https://www.anibox.org)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://proshkolu.ru) [Proshkolu (https://proshkolu.ru)](https://proshkolu.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://vishivalochka.ru) [vishivalochka.ru (http://vishivalochka.ru)](http://vishivalochka.ru)*: top 10M, hobby, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://strat-talk.com) [strat-talk.com (https://strat-talk.com)](https://strat-talk.com)*: top 10M, forum, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://cs-lords.ru) [CS-Lords (http://cs-lords.ru)](http://cs-lords.ru)*: top 10M, gaming, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.biketrials.ru) [Biketrials (http://www.biketrials.ru)](http://www.biketrials.ru)*: top 10M, pk, ru, vn*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://niketalk.com) [Niketalk (https://niketalk.com)](https://niketalk.com)*: top 10M, fashion, forum, sport, us* +1. ![](https://www.google.com/s2/favicons?domain=http://hctorpedo.ru) [Hctorpedo (http://hctorpedo.ru)](http://hctorpedo.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://avtomarket.ru) [Avtomarket (https://avtomarket.ru)](https://avtomarket.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.thefirearmsforum.com) [Thefirearmsforum (https://www.thefirearmsforum.com)](https://www.thefirearmsforum.com)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.affiliatefix.com) [Affiliatefix (https://www.affiliatefix.com)](https://www.affiliatefix.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://shophelp.ru/) [Shophelp (https://shophelp.ru/)](https://shophelp.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.beermoneyforum.com) [BeerMoneyForum (https://www.beermoneyforum.com)](https://www.beermoneyforum.com)*: top 10M, finance, forum, gambling*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.math10.com/) [Math10 (https://www.math10.com/)](https://www.math10.com/)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.pepper.pl/) [Pepper PL (https://www.pepper.pl/)](https://www.pepper.pl/)*: top 10M, pl* +1. ![](https://www.google.com/s2/favicons?domain=https://sigtalk.com) [sigtalk.com (https://sigtalk.com)](https://sigtalk.com)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=http://mir-stalkera.ru) [mir-stalkera.ru (http://mir-stalkera.ru)](http://mir-stalkera.ru)*: top 10M, gaming, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pedsovet.su/) [Pedsovet (https://pedsovet.su/)](https://pedsovet.su/)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mac-help.com) [Mac-help (https://www.mac-help.com)](https://www.mac-help.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://videogamegeek.com) [VideogameGeek (https://videogamegeek.com)](https://videogamegeek.com)*: top 10M, gaming, news*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://33bru.com/) [33bru (http://33bru.com/)](http://33bru.com/)*: top 10M, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.flashflashrevolution.com) [Flashflashrevolution (http://www.flashflashrevolution.com)](http://www.flashflashrevolution.com)*: top 10M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.diskusjon.no) [Diskusjon.no (https://www.diskusjon.no)](https://www.diskusjon.no)*: top 10M, forum, no* +1. ![](https://www.google.com/s2/favicons?domain=https://proglib.io) [Proglib (https://proglib.io)](https://proglib.io)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://nightbot.tv/) [nightbot (https://nightbot.tv/)](https://nightbot.tv/)*: top 10M, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hunttalk.com) [Hunttalk (https://www.hunttalk.com)](https://www.hunttalk.com)*: top 10M, forum, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://dmoj.ca/) [DMOJ (https://dmoj.ca/)](https://dmoj.ca/)*: top 10M, ca, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://truesteamachievements.com) [Truesteamachievements (https://truesteamachievements.com)](https://truesteamachievements.com)*: top 10M, az, gb* +1. ![](https://www.google.com/s2/favicons?domain=https://www.thefastlaneforum.com) [TheFastlaneForum (https://www.thefastlaneforum.com)](https://www.thefastlaneforum.com)*: top 10M, forum, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.lada-vesta.net) [lada-vesta.net (http://www.lada-vesta.net)](http://www.lada-vesta.net)*: top 10M, auto, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://sysadmins.ru) [Sysadmins (https://sysadmins.ru)](https://sysadmins.ru)*: top 10M, forum, ru, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://plug.dj/) [Plug.DJ (https://plug.dj/)](https://plug.dj/)*: top 10M, music*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://mcfc-fan.ru) [mcfc-fan.ru (http://mcfc-fan.ru)](http://mcfc-fan.ru)*: top 10M, ru, sport*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.hipforums.com/) [Hipforums (https://www.hipforums.com/)](https://www.hipforums.com/)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.rusfishing.ru) [Rusfishing (https://www.rusfishing.ru)](https://www.rusfishing.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://jeepgarage.org) [jeepgarage.org (https://jeepgarage.org)](https://jeepgarage.org)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=https://4gameforum.com) [4gameforum (https://4gameforum.com)](https://4gameforum.com)*: top 10M, forum, kr, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://spells8.com) [Spells8 (https://spells8.com)](https://spells8.com)*: top 10M, hobby* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hozpitality.com) [hozpitality (https://www.hozpitality.com)](https://www.hozpitality.com)*: top 10M, career* +1. ![](https://www.google.com/s2/favicons?domain=https://www.promodescuentos.com/) [Promodescuentos (https://www.promodescuentos.com/)](https://www.promodescuentos.com/)*: top 10M, mx, shopping* +1. ![](https://www.google.com/s2/favicons?domain=http://www.motorhomefun.co.uk/forum/) [motorhomefun.co.uk (http://www.motorhomefun.co.uk/forum/)](http://www.motorhomefun.co.uk/forum/)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://geodesist.ru) [Geodesist (https://geodesist.ru)](https://geodesist.ru)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://101010.pl/) [101010.pl (https://101010.pl/)](https://101010.pl/)*: top 10M, mastodon, pl, social* +1. ![](https://www.google.com/s2/favicons?domain=https://cryptohack.org/) [Crypto Hack (https://cryptohack.org/)](https://cryptohack.org/)*: top 10M, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://drupal.ru) [drupal.ru (https://drupal.ru)](https://drupal.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://piccsy.com) [Piccsy (http://piccsy.com)](http://piccsy.com)*: top 10M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pepper.ru/) [Pepper (https://www.pepper.ru/)](https://www.pepper.ru/)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.rusforum.com/) [Rusforum (https://www.rusforum.com/)](https://www.rusforum.com/)*: top 10M, forum, pk, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.windows10forums.com/) [Windows10forums (https://www.windows10forums.com/)](https://www.windows10forums.com/)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.2d-3d.ru) [2d-3d (https://www.2d-3d.ru)](https://www.2d-3d.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.house-mixes.com/) [House-Mixes.com (https://www.house-mixes.com/)](https://www.house-mixes.com/)*: top 10M, ir* +1. ![](https://www.google.com/s2/favicons?domain=https://ngl.link) [ngl.link (https://ngl.link)](https://ngl.link)*: top 10M, q&a* +1. ![](https://www.google.com/s2/favicons?domain=https://hudsonrock.com) [Hudson Rock (https://hudsonrock.com)](https://hudsonrock.com)*: top 10M, hacking* +1. ![](https://www.google.com/s2/favicons?domain=http://jeepspb.ru/forum) [jeepspb.ru (http://jeepspb.ru/forum)](http://jeepspb.ru/forum)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://donatepay.ru/) [DonatePay (https://donatepay.ru/)](https://donatepay.ru/)*: top 10M, finance, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.preisjaeger.at/) [Preisjaeger (https://www.preisjaeger.at/)](https://www.preisjaeger.at/)*: top 10M, at, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://ifish.net) [ifish.net (https://ifish.net)](https://ifish.net)*: top 10M, forum, us* +1. ![](https://www.google.com/s2/favicons?domain=http://swedroid.se/forum) [swedroid.se (http://swedroid.se/forum)](http://swedroid.se/forum)*: top 10M, forum, se* +1. ![](https://www.google.com/s2/favicons?domain=https://mywishboard.com) [mywishboard.com (https://mywishboard.com)](https://mywishboard.com)*: top 10M, shopping* +1. ![](https://www.google.com/s2/favicons?domain=https://cssbattle.dev) [CSSBattle (https://cssbattle.dev)](https://cssbattle.dev)*: top 10M, coding, de* +1. ![](https://www.google.com/s2/favicons?domain=https://queer.pl) [Queer (https://queer.pl)](https://queer.pl)*: top 10M, pl* +1. ![](https://www.google.com/s2/favicons?domain=https://www.rpgwatch.com) [Rpgwatch (https://www.rpgwatch.com)](https://www.rpgwatch.com)*: top 10M, ca, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://macosx.com) [Macosx (https://macosx.com)](https://macosx.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://popgun.ru) [popgun.ru (https://popgun.ru)](https://popgun.ru)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://wow-game.ru) [wow-game.ru (http://wow-game.ru)](http://wow-game.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.religiousforums.com) [ReligiousForums (https://www.religiousforums.com)](https://www.religiousforums.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://poembook.ru) [Poembook (https://poembook.ru)](https://poembook.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://codeby.net) [Codeby.net (https://codeby.net)](https://codeby.net)*: top 10M, forum, hacking, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://ghisler.ch/board) [ghisler.ch (https://ghisler.ch/board)](https://ghisler.ch/board)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://www.not606.com/) [not606.com (http://www.not606.com/)](http://www.not606.com/)*: top 10M, forum, sport* +1. ![](https://www.google.com/s2/favicons?domain=https://www.wireclub.com) [Wireclub (https://www.wireclub.com)](https://www.wireclub.com)*: top 10M, tr* +1. ![](https://www.google.com/s2/favicons?domain=http://voicesevas.ru) [Voicesevas (http://voicesevas.ru)](http://voicesevas.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://tamtam.chat/) [TamTam (https://tamtam.chat/)](https://tamtam.chat/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.magix.info) [Magix (https://www.magix.info)](https://www.magix.info)*: top 10M, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://gpodder.net/) [Gpodder (https://gpodder.net/)](https://gpodder.net/)*: top 10M, music* +1. ![](https://www.google.com/s2/favicons?domain=https://khabmama.ru/forum) [khabmama.ru (https://khabmama.ru/forum)](https://khabmama.ru/forum)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://clapperapp.com/) [Clapper (https://clapperapp.com/)](https://clapperapp.com/)*: top 10M, social, video* +1. ![](https://www.google.com/s2/favicons?domain=http://yka.kz) [yka.kz (http://yka.kz)](http://yka.kz)*: top 10M, kz* +1. ![](https://www.google.com/s2/favicons?domain=https://www.planetaexcel.ru) [Planetaexcel (https://www.planetaexcel.ru)](https://www.planetaexcel.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://southklad.ru) [Southklad (https://southklad.ru)](https://southklad.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.autolada.ru/) [Autolada (https://www.autolada.ru/)](https://www.autolada.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.md/ru/) [md (https://forum.md/ru/)](https://forum.md/ru/)*: top 10M, forum, md, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://dissenter.com/) [Dissenter (https://dissenter.com/)](https://dissenter.com/)*: top 10M, us* +1. ![](https://www.google.com/s2/favicons?domain=https://www.uchportal.ru) [Uchportal (https://www.uchportal.ru)](https://www.uchportal.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.firearmstalk.com) [Firearmstalk (https://www.firearmstalk.com)](https://www.firearmstalk.com)*: top 10M, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.21buttons.com) [21buttons (https://www.21buttons.com)](https://www.21buttons.com)*: top 10M, fashion, networking* +1. ![](https://www.google.com/s2/favicons?domain=http://italia-ru.com/) [Italia (http://italia-ru.com/)](http://italia-ru.com/)*: top 10M, it, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gps-data-team.com) [Gps-data-team (https://www.gps-data-team.com)](https://www.gps-data-team.com)*: top 10M, maps*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://yasobe.ru) [Soberu (https://yasobe.ru)](https://yasobe.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.imood.com/) [Imood (https://www.imood.com/)](https://www.imood.com/)*: top 10M, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://elakiri.com) [Elakiri (https://elakiri.com)](https://elakiri.com)*: top 10M, lk* +1. ![](https://www.google.com/s2/favicons?domain=https://www.countable.us/) [Countable (https://www.countable.us/)](https://www.countable.us/)*: top 10M, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.shipmodeling.ru/phpbb) [shipmodeling.ru (https://www.shipmodeling.ru/phpbb)](https://www.shipmodeling.ru/phpbb)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://armtorg.ru/) [Armtorg (https://armtorg.ru/)](https://armtorg.ru/)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.russpuss.ru) [russpuss.ru (https://www.russpuss.ru)](https://www.russpuss.ru)*: top 10M, erotic, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://v-twinforum.com) [v-twinforum.com (https://v-twinforum.com)](https://v-twinforum.com)*: top 10M, auto, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://fanficslandia.com/index.php) [fanficslandia.com (https://fanficslandia.com/index.php)](https://fanficslandia.com/index.php)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://nwo-team.ru) [nwo-team.ru (http://nwo-team.ru)](http://nwo-team.ru)*: top 10M, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.kuharka.ru/) [Kuharka (https://www.kuharka.ru/)](https://www.kuharka.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.forumophilia.com) [Forumophilia (https://www.forumophilia.com)](https://www.forumophilia.com)*: top 10M, forum, porn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.nixp.ru/) [Nixp (https://www.nixp.ru/)](https://www.nixp.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://lolchess.gg/) [Lolchess (https://lolchess.gg/)](https://lolchess.gg/)*: top 10M, kr*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.qbn.com/) [Qbn (https://www.qbn.com/)](https://www.qbn.com/)*: top 10M, design* +1. ![](https://www.google.com/s2/favicons?domain=https://glav.su) [Glav (https://glav.su)](https://glav.su)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://followus.com) [followus.com (https://followus.com)](https://followus.com)*: top 10M, links* +1. ![](https://www.google.com/s2/favicons?domain=http://www.rcforum.ru) [Rcforum (http://www.rcforum.ru)](http://www.rcforum.ru)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://arsenal-mania.com) [Arsenal-mania (https://arsenal-mania.com)](https://arsenal-mania.com)*: top 10M, gb, hk, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.lkforum.ru/) [Lkforum (http://www.lkforum.ru/)](http://www.lkforum.ru/)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://autokadabra.ru/) [Autokadabra (http://autokadabra.ru/)](http://autokadabra.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.clubsnap.com/) [clubsnap.com (https://www.clubsnap.com/)](https://www.clubsnap.com/)*: top 10M, forum, sg* +1. ![](https://www.google.com/s2/favicons?domain=https://forumkinopoisk.ru) [ForumKinopoisk (https://forumkinopoisk.ru)](https://forumkinopoisk.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pyha.ru/) [Pyha (https://pyha.ru/)](https://pyha.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.babyboom.pl/forum/) [babyboom.pl (http://www.babyboom.pl/forum/)](http://www.babyboom.pl/forum/)*: top 10M, forum, pl* +1. ![](https://www.google.com/s2/favicons?domain=http://wolpy.com) [Wolpy (http://wolpy.com)](http://wolpy.com)*: top 10M, travel* +1. ![](https://www.google.com/s2/favicons?domain=https://warframe.market/) [Warframe Market (https://warframe.market/)](https://warframe.market/)*: top 10M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://homsk.com) [homsk.com (https://homsk.com)](https://homsk.com)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://facenama.com/) [Facenama (https://facenama.com/)](https://facenama.com/)*: top 10M, ir*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://chan4chan.com/) [Chan4chan (http://chan4chan.com/)](http://chan4chan.com/)*: top 10M, hu* +1. ![](https://www.google.com/s2/favicons?domain=https://www.cubecraft.net) [cubecraft.net (https://www.cubecraft.net)](https://www.cubecraft.net)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.car72.ru/forum) [car72.ru (https://www.car72.ru/forum)](https://www.car72.ru/forum)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://tv-games.ru/) [Tv-games (http://tv-games.ru/)](http://tv-games.ru/)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://rybnoe.net) [rybnoe.net (http://rybnoe.net)](http://rybnoe.net)*: top 10M, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mdshooters.com) [Mdshooters (https://www.mdshooters.com)](https://www.mdshooters.com)*: top 10M, forum, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://prodaman.ru) [Prodaman (https://prodaman.ru)](https://prodaman.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mikrob.ru) [mikrob.ru (https://mikrob.ru)](https://mikrob.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gardrops.com) [Gardrops (https://www.gardrops.com)](https://www.gardrops.com)*: top 10M, shopping, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://zagony.ru) [Zagony (https://zagony.ru)](https://zagony.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://pogovorim.by) [Pogovorim (https://pogovorim.by)](https://pogovorim.by)*: top 10M, by, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://sniperforums.com) [sniperforums.com (https://sniperforums.com)](https://sniperforums.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://izobil.ru) [izobil.ru (http://izobil.ru)](http://izobil.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.footballforums.net) [Footballforums (http://www.footballforums.net)](http://www.footballforums.net)*: top 10M, forum, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://goldroyal.net) [Goldroyal (http://goldroyal.net)](http://goldroyal.net)*: top 10M, bd, by, forum, ru, ua, ve* +1. ![](https://www.google.com/s2/favicons?domain=https://www.fcrubin.ru) [FCRubin (https://www.fcrubin.ru)](https://www.fcrubin.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.oakleyforum.com) [oakleyforum.com (https://www.oakleyforum.com)](https://www.oakleyforum.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hunting.ru/forum/) [hunting (https://www.hunting.ru/forum/)](https://www.hunting.ru/forum/)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://rpgrussia.com) [RPGRussia (https://rpgrussia.com)](https://rpgrussia.com)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://uvelir.net/) [Uvelir (https://uvelir.net/)](https://uvelir.net/)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://cyberdefenders.org/) [Cyber Defenders (https://cyberdefenders.org/)](https://cyberdefenders.org/)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=http://rezzoclub.ru) [rezzoclub.ru (http://rezzoclub.ru)](http://rezzoclub.ru)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.turpravda.com) [TurPravda (https://www.turpravda.com)](https://www.turpravda.com)*: top 10M, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://nekto.me) [Nekto (https://nekto.me)](https://nekto.me)*: top 10M, pt, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.pajero4x4.ru/bbs/phpBB2) [pajero4x4.ru (http://www.pajero4x4.ru/bbs/phpBB2)](http://www.pajero4x4.ru/bbs/phpBB2)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.thelion.com) [Thelion (http://www.thelion.com)](http://www.thelion.com)*: top 10M, blog* +1. ![](https://www.google.com/s2/favicons?domain=https://radioskot.ru) [radioskot (https://radioskot.ru)](https://radioskot.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://dolap.com) [dolap (https://dolap.com)](https://dolap.com)*: top 10M, shopping, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://www.marykay.ru) [www.marykay.ru (https://www.marykay.ru)](https://www.marykay.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://omoimot.ru/) [Omoimot (https://omoimot.ru/)](https://omoimot.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.xshaker.net) [XShaker (https://www.xshaker.net)](https://www.xshaker.net)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://stripchat.global) [stripchat.global (https://stripchat.global)](https://stripchat.global)*: top 10M, webcam*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://ruanekdot.ru) [ruanekdot.ru (http://ruanekdot.ru)](http://ruanekdot.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://astrogalaxy.ru) [Astrogalaxy (https://astrogalaxy.ru)](https://astrogalaxy.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.nucastle.co.uk/) [nucastle.co.uk (http://www.nucastle.co.uk/)](http://www.nucastle.co.uk/)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://newreporter.org) [Newreporter (https://newreporter.org)](https://newreporter.org)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.aqa.ru/) [Aqa (https://www.aqa.ru/)](https://www.aqa.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.msofficeforums.com) [Msofficeforums (https://www.msofficeforums.com)](https://www.msofficeforums.com)*: top 10M, forum, ir*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.realmeye.com/) [Realmeye (https://www.realmeye.com/)](https://www.realmeye.com/)*: top 10M, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.realmeye.com) [Realmeye-graveyard (https://www.realmeye.com)](https://www.realmeye.com)*: top 10M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=http://www.forumvancouver.com) [ForumVancouver (http://www.forumvancouver.com)](http://www.forumvancouver.com)*: top 10M, ca, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.gays.com) [Gays (https://www.gays.com)](https://www.gays.com)*: top 10M, dating*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.hitmanforum.com) [Hitmanforum (https://www.hitmanforum.com)](https://www.hitmanforum.com)*: top 10M, forum, rs* +1. ![](https://www.google.com/s2/favicons?domain=http://www.rusarmy.com) [Rusarmy (http://www.rusarmy.com)](http://www.rusarmy.com)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://dating.ru) [Dating.Ru (http://dating.ru)](http://dating.ru)*: top 10M, dating, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://issuehunt.io) [IssueHunt (https://issuehunt.io)](https://issuehunt.io)*: top 10M, dz, finance, ir, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://www.socioforum.su) [socioforum.su (https://www.socioforum.su)](https://www.socioforum.su)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://cad.ru) [Cad (https://cad.ru)](https://cad.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.forum-volgograd.ru) [Volgograd Forum (https://www.forum-volgograd.ru)](https://www.forum-volgograd.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://soc-life.com) [soc-life.com (http://soc-life.com)](http://soc-life.com)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=https://amazfitwatchfaces.com) [AmazfitWatchFaces (https://amazfitwatchfaces.com)](https://amazfitwatchfaces.com)*: top 10M, ae, es, forum, gr, id, ir, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.tigerfan.com/) [tigerfan.com (http://www.tigerfan.com/)](http://www.tigerfan.com/)*: top 10M, forum, sport* +1. ![](https://www.google.com/s2/favicons?domain=https://kashalot.com) [Kashalot (https://kashalot.com)](https://kashalot.com)*: top 10M, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://xboxgamertag.com/) [Xbox Gamertag (https://xboxgamertag.com/)](https://xboxgamertag.com/)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=https://play.md) [Play.md (https://play.md)](https://play.md)*: top 10M, md* +1. ![](https://www.google.com/s2/favicons?domain=https://angara.net) [Angara (https://angara.net)](https://angara.net)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://gigbucks.com/) [Gigbucks (https://gigbucks.com/)](https://gigbucks.com/)*: top 10M, dz, eg* +1. ![](https://www.google.com/s2/favicons?domain=https://forexdengi.com/) [ForexDengi (https://forexdengi.com/)](https://forexdengi.com/)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://serveradmin.ru/) [Serveradmin (https://serveradmin.ru/)](https://serveradmin.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pychess.org) [Pychess (https://www.pychess.org)](https://www.pychess.org)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pinme.ru) [Pinme (https://www.pinme.ru)](https://www.pinme.ru)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://impalaforums.com) [impalaforums.com (https://impalaforums.com)](https://impalaforums.com)*: top 10M, auto, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://www.mactalk.com.au/) [Mactalk (http://www.mactalk.com.au/)](http://www.mactalk.com.au/)*: top 10M, au, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://yamaya.ru) [yamaya.ru (https://yamaya.ru)](https://yamaya.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.prokoni.ru/) [Prokoni (https://www.prokoni.ru/)](https://www.prokoni.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://donate.stream/) [donate.stream (https://donate.stream/)](https://donate.stream/)*: top 10M, finance, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://directx10.org) [directx10.org (http://directx10.org)](http://directx10.org)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.allthingsworn.com) [All Things Worn (https://www.allthingsworn.com)](https://www.allthingsworn.com)*: top 10M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.forumjizni.ru) [ForumJizni (http://www.forumjizni.ru)](http://www.forumjizni.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://apclips.com/) [APClips (https://apclips.com/)](https://apclips.com/)*: top 10M, porn, video* +1. ![](https://www.google.com/s2/favicons?domain=https://xgm.guru) [xgm.guru (https://xgm.guru)](https://xgm.guru)*: top 10M, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.texasguntalk.com) [Texasguntalk (https://www.texasguntalk.com)](https://www.texasguntalk.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://twentysix.ru) [twentysix.ru (https://twentysix.ru)](https://twentysix.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://playlists.net) [Playlists (https://playlists.net)](https://playlists.net)*: top 10M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.soundgym.co) [Soundgym (https://www.soundgym.co)](https://www.soundgym.co)*: top 10M, il* +1. ![](https://www.google.com/s2/favicons?domain=http://intoclassics.net) [intoclassics.net (http://intoclassics.net)](http://intoclassics.net)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.politikforum.ru/) [Politikforum (http://www.politikforum.ru/)](http://www.politikforum.ru/)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://hubski.com/) [Hubski (https://hubski.com/)](https://hubski.com/)*: top 10M, blog*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mbclub.ru/) [Mbclub (https://www.mbclub.ru/)](https://www.mbclub.ru/)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://webos-forums.ru) [webos-forums.ru (http://webos-forums.ru)](http://webos-forums.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://samesound.ru) [samesound.ru (https://samesound.ru)](https://samesound.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://truthbook.com) [Truthbook (https://truthbook.com)](https://truthbook.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://unixforum.org) [unixforum.org (https://unixforum.org)](https://unixforum.org)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.freelanced.com) [Freelanced (https://www.freelanced.com)](https://www.freelanced.com)*: top 10M, freelance*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://nesiditsa.ru) [Nesiditsa (https://nesiditsa.ru)](https://nesiditsa.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://masterkosta.com) [masterkosta.com (http://masterkosta.com)](http://masterkosta.com)*: top 10M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://rec.poker) [rec.poker (https://rec.poker)](https://rec.poker)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.megapolis.org/forum) [megapolis.org (http://www.megapolis.org/forum)](http://www.megapolis.org/forum)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://antiwomen.ru) [Antiwomen (https://antiwomen.ru)](https://antiwomen.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mixupload.com/) [Mixupload (https://mixupload.com/)](https://mixupload.com/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://defenceforumindia.com/) [DefenceForumIndia (https://defenceforumindia.com/)](https://defenceforumindia.com/)*: top 10M, forum, military* +1. ![](https://www.google.com/s2/favicons?domain=https://www.vegascreativesoftware.info) [VegasCreativeSoftware (https://www.vegascreativesoftware.info)](https://www.vegascreativesoftware.info)*: top 10M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.forumsdrom.ru/) [forums.drom.ru (https://www.forumsdrom.ru/)](https://www.forumsdrom.ru/)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.smashcast.tv/) [Smashcast (https://www.smashcast.tv/)](https://www.smashcast.tv/)*: top 10M, gr*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.volgogradru.com) [Volgogradru (http://www.volgogradru.com)](http://www.volgogradru.com)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.antique-bottles.net) [Antique-bottles (https://www.antique-bottles.net)](https://www.antique-bottles.net)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://www.ridemonkey.com) [ridemonkey.com (http://www.ridemonkey.com)](http://www.ridemonkey.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://psyera.ru) [Psyera (https://psyera.ru)](https://psyera.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://minecraftonly.ru) [MinecraftOnly (https://minecraftonly.ru)](https://minecraftonly.ru)*: top 10M, forum, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.discussfastpitch.com) [Discussfastpitch (https://www.discussfastpitch.com)](https://www.discussfastpitch.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://avto-forum.name) [Avto-forum.name (https://avto-forum.name)](https://avto-forum.name)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://qna.center) [qna.center (https://qna.center)](https://qna.center)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://spaces.im) [Spaces (https://spaces.im)](https://spaces.im)*: top 10M, blog, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://peopleandcountries.com) [PeopleAndCountries (http://peopleandcountries.com)](http://peopleandcountries.com)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://subforums.net) [subforums.net (https://subforums.net)](https://subforums.net)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://pornsavant.com) [pornsavant.com (https://pornsavant.com)](https://pornsavant.com)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.figarohair.ru/conf) [figarohair.ru (http://www.figarohair.ru/conf)](http://www.figarohair.ru/conf)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://lenov.ru) [Lenov (https://lenov.ru)](https://lenov.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://prog.hu) [prog.hu (https://prog.hu)](https://prog.hu)*: top 10M, hu* +1. ![](https://www.google.com/s2/favicons?domain=https://raidforums.com/) [Raidforums (https://raidforums.com/)](https://raidforums.com/)*: top 10M, cybercriminal, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.sasgis.org/forum) [sasgis.org (http://www.sasgis.org/forum)](http://www.sasgis.org/forum)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://www.russian.fi/) [RussianFI (http://www.russian.fi/)](http://www.russian.fi/)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pixwox.com) [Pixwox (https://www.pixwox.com)](https://www.pixwox.com)*: top 10M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://24open.ru) [24open (https://24open.ru)](https://24open.ru)*: top 10M, dating, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.xtratime.org) [xtratime.org (https://www.xtratime.org)](https://www.xtratime.org)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://www.totseans.com/bbs/profile/Vizier) [Totseans (http://www.totseans.com/bbs/profile/Vizier)](http://www.totseans.com/bbs/profile/Vizier)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.browncafe.com/community/) [browncafe.com (https://www.browncafe.com/community/)](https://www.browncafe.com/community/)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.nikoncafe.com/) [nikoncafe.com (https://www.nikoncafe.com/)](https://www.nikoncafe.com/)*: top 10M, forum, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://crafta.ua) [crafta.ua (https://crafta.ua)](https://crafta.ua)*: top 10M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://www.scaleforum.ru) [scaleforum.ru (http://www.scaleforum.ru)](http://www.scaleforum.ru)*: top 10M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://cowboyszone.com) [cowboyszone.com (https://cowboyszone.com)](https://cowboyszone.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.votetags.info/) [Votetags (https://www.votetags.info/)](https://www.votetags.info/)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.thebuddyforum.com) [Thebuddyforum (https://www.thebuddyforum.com)](https://www.thebuddyforum.com)*: top 10M, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://w3challs.com/) [W3challs (https://w3challs.com/)](https://w3challs.com/)*: top 10M, tn* +1. ![](https://www.google.com/s2/favicons?domain=http://www.trworkshop.net/forum) [trworkshop.net (http://www.trworkshop.net/forum)](http://www.trworkshop.net/forum)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://nokia-love.ru) [nokia-love.ru (http://nokia-love.ru)](http://nokia-love.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://gentlemint.com) [Gentlemint (https://gentlemint.com)](https://gentlemint.com)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.damochka.ru) [Damochka (https://www.damochka.ru)](https://www.damochka.ru)*: top 10M, kz, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.vauxhallownersnetwork.co.uk) [vauxhallownersnetwork.co.uk (http://www.vauxhallownersnetwork.co.uk)](http://www.vauxhallownersnetwork.co.uk)*: top 10M, forum, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://erogen.club) [Erogen.club (https://erogen.club)](https://erogen.club)*: top 10M, forum, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://www.fishingsib.ru/) [Fishingsib (https://www.fishingsib.ru/)](https://www.fishingsib.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://imgup.cz/) [ImgUp.cz (https://imgup.cz/)](https://imgup.cz/)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=http://sprashivai.ru) [Sprashivai (http://sprashivai.ru)](http://sprashivai.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://dumpor.com) [Dumpor (https://dumpor.com)](https://dumpor.com)*: top 10M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://forumprosport.ru/) [ForumProSport (https://forumprosport.ru/)](https://forumprosport.ru/)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mineplex.com) [mineplex.com (https://www.mineplex.com)](https://www.mineplex.com)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://maccentre.ru) [Maccentre (https://maccentre.ru)](https://maccentre.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://holodforum.ru) [holodforum.ru (https://holodforum.ru)](https://holodforum.ru)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://kloomba.com) [kloomba.com (https://kloomba.com)](https://kloomba.com)*: top 10M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://sanatatur.ru/forum) [sanatatur.ru (http://sanatatur.ru/forum)](http://sanatatur.ru/forum)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://crown6.org) [crown6.org (http://crown6.org)](http://crown6.org)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=http://mathhelpplanet.com) [Mathhelpplanet (http://mathhelpplanet.com)](http://mathhelpplanet.com)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://wowjp.net) [wowjp.net (http://wowjp.net)](http://wowjp.net)*: top 10M, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://codersrank.io/) [Coders Rank (https://codersrank.io/)](https://codersrank.io/)*: top 10M, coding* +1. ![](https://www.google.com/s2/favicons?domain=http://www.southbayriders.com/forums/) [southbayriders.com (http://www.southbayriders.com/forums/)](http://www.southbayriders.com/forums/)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://www.indog.ru/) [Indog (http://www.indog.ru/)](http://www.indog.ru/)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://carmasters.org) [Carmasters (https://carmasters.org)](https://carmasters.org)*: top 10M, fi, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://nhl.ru) [Nhl (https://nhl.ru)](https://nhl.ru)*: top 10M, by, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://status.cafe/) [Status Cafe (https://status.cafe/)](https://status.cafe/)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=https://writercenter.ru) [Writercenter (https://writercenter.ru)](https://writercenter.ru)*: top 10M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://www.motoforum.ru/forum) [motoforum.ru (https://www.motoforum.ru/forum)](https://www.motoforum.ru/forum)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.munzee.com/) [Munzee (https://www.munzee.com/)](https://www.munzee.com/)*: top 10M, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.infrance.su/) [Infrance (https://www.infrance.su/)](https://www.infrance.su/)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://empretienda.com) [Empretienda AR (https://empretienda.com)](https://empretienda.com)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=https://uforum.uz) [uforum.uz (https://uforum.uz)](https://uforum.uz)*: top 10M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://freelance.ua) [freelance.ua (https://freelance.ua)](https://freelance.ua)*: top 10M, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://worldofplayers.ru) [Worldofplayers (https://worldofplayers.ru)](https://worldofplayers.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.painters-online.co.uk) [Painters-online (https://www.painters-online.co.uk)](https://www.painters-online.co.uk)*: top 10M, gb* +1. ![](https://www.google.com/s2/favicons?domain=https://www.rockettube.com/) [Rocket Tube (https://www.rockettube.com/)](https://www.rockettube.com/)*: top 10M, video*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://pobedish.ru/forum) [pobedish.ru (https://pobedish.ru/forum)](https://pobedish.ru/forum)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hellboundhackers.org) [Hellboundhackers (https://www.hellboundhackers.org)](https://www.hellboundhackers.org)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=http://ingvarr.net.ru/) [Ingvarr (http://ingvarr.net.ru/)](http://ingvarr.net.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mnogodetok.ru) [mnogodetok.ru (https://mnogodetok.ru)](https://mnogodetok.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.caduser.ru/) [Caduser (https://www.caduser.ru/)](https://www.caduser.ru/)*: top 10M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://caves.ru) [Caves (https://caves.ru)](https://caves.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://s-forum.biz) [S-forum (https://s-forum.biz)](https://s-forum.biz)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://admireme.vip/) [Admire Me (https://admireme.vip/)](https://admireme.vip/)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=https://ud.me) [UnstoppableDomains (https://ud.me)](https://ud.me)*: top 10M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://alushta24.org) [Alushta24 (https://alushta24.org)](https://alushta24.org)*: top 10M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://nuvi.ru/) [NuviGarmin (https://nuvi.ru/)](https://nuvi.ru/)*: top 10M, forum, ru, shopping*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://nsk66.ru) [nsk66.ru (http://nsk66.ru)](http://nsk66.ru)*: top 10M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://minecraft-statistic.net) [Minecraft-statistic (https://minecraft-statistic.net)](https://minecraft-statistic.net)*: top 10M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://fifasoccer.ru) [Fifasoccer (http://fifasoccer.ru)](http://fifasoccer.ru)*: top 10M, forum, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.expono.com) [Expono (http://www.expono.com)](http://www.expono.com)*: top 10M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://www.sevportal.info) [Sevportal (https://www.sevportal.info)](https://www.sevportal.info)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://wasm.in) [wasm.in (https://wasm.in)](https://wasm.in)*: top 10M, forum, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://4cheat.ru) [4cheat (https://4cheat.ru)](https://4cheat.ru)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.connosr.com/) [Connosr (https://www.connosr.com/)](https://www.connosr.com/)*: top 10M, gb* +1. ![](https://www.google.com/s2/favicons?domain=https://www.livetrack24.com) [LiveTrack24 (https://www.livetrack24.com)](https://www.livetrack24.com)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.ccdi.ru/) [Ccdi (http://www.ccdi.ru/)](http://www.ccdi.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://pesiq.ru/) [Pesiq (http://pesiq.ru/)](http://pesiq.ru/)*: top 10M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://kik.me/) [Kik (http://kik.me/)](http://kik.me/)*: top 10M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://hondaswap.com) [hondaswap.com (http://hondaswap.com)](http://hondaswap.com)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.prizyvnik.info) [Prizyvnik (https://www.prizyvnik.info)](https://www.prizyvnik.info)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.pgpru.com/) [Pgpru (http://www.pgpru.com/)](http://www.pgpru.com/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://uazpatriot.ru/forum) [uazpatriot.ru (https://uazpatriot.ru/forum)](https://uazpatriot.ru/forum)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pulmonaryhypertensionnews.com) [PulmonaryHypertensionNews (https://pulmonaryhypertensionnews.com)](https://pulmonaryhypertensionnews.com)*: top 10M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.free-lancers.net) [Free-lancers (http://www.free-lancers.net)](http://www.free-lancers.net)*: top 10M, freelance, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://diorama.ru/forum) [diorama.ru (https://diorama.ru/forum)](https://diorama.ru/forum)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.interfaith.org) [Interfaith (https://www.interfaith.org)](https://www.interfaith.org)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://vezha.com/) [Vezha (https://vezha.com/)](https://vezha.com/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://studwork.org/) [Studwork (https://studwork.org/)](https://studwork.org/)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum-mil.ru) [forum-mil.ru (http://forum-mil.ru)](http://forum-mil.ru)*: top 10M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://otzyvy.pro) [Otzyvy (https://otzyvy.pro)](https://otzyvy.pro)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://roboforum.ru) [Roboforum (http://roboforum.ru)](http://roboforum.ru)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://yapishu.net) [YaPishu.net (https://yapishu.net)](https://yapishu.net)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.bayoushooter.com) [Bayoushooter (https://www.bayoushooter.com)](https://www.bayoushooter.com)*: top 10M, forum, pk* +1. ![](https://www.google.com/s2/favicons?domain=https://www.mdregion.ru/) [Mdregion (https://www.mdregion.ru/)](https://www.mdregion.ru/)*: top 10M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.amateurvoyeurforum.com) [amateurvoyeurforum.com (https://www.amateurvoyeurforum.com)](https://www.amateurvoyeurforum.com)*: top 10M, forum, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://cheat-master.ru) [cheat-master.ru (http://cheat-master.ru)](http://cheat-master.ru)*: top 10M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://bitcoinforum.com) [BitCoinForum (https://bitcoinforum.com)](https://bitcoinforum.com)*: top 10M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://seatracker.ru/) [Seatracker (https://seatracker.ru/)](https://seatracker.ru/)*: top 10M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://pocketstars.com/) [Pocket Stars (https://pocketstars.com/)](https://pocketstars.com/)*: top 10M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.parkrocker.net) [Parkrocker (https://www.parkrocker.net)](https://www.parkrocker.net)*: top 10M, de, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://dogster.ru/) [Dogster (http://dogster.ru/)](http://dogster.ru/)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dalnoboi.ru) [Dalnoboi (https://www.dalnoboi.ru)](https://www.dalnoboi.ru)*: top 10M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://social.technet.microsoft.com) [MicrosoftTechNet (https://social.technet.microsoft.com)](https://social.technet.microsoft.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://learn.microsoft.com) [MicrosoftLearn (https://learn.microsoft.com)](https://learn.microsoft.com)*: top 100M, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://social.msdn.microsoft.com) [social.msdn.microsoft.com (https://social.msdn.microsoft.com)](https://social.msdn.microsoft.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://developer.apple.com/forums) [AppleDeveloper (https://developer.apple.com/forums)](https://developer.apple.com/forums)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://discussions.apple.com/) [AppleDiscussions (https://discussions.apple.com/)](https://discussions.apple.com/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://gist.github.com) [GitHubGist (https://gist.github.com)](https://gist.github.com)*: top 100M, coding, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://community.adobe.com) [community.adobe.com (https://community.adobe.com)](https://community.adobe.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://support.mozilla.org) [Mozilla Support (https://support.mozilla.org)](https://support.mozilla.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://discourse.mozilla.org) [discourse.mozilla.org (https://discourse.mozilla.org)](https://discourse.mozilla.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://camas.github.io/reddit-search/) [Reddit Search (Pushshift) (https://camas.github.io/reddit-search/)](https://camas.github.io/reddit-search/)*: top 100M, discussion, news*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://en.gravatar.com/) [Gravatar (http://en.gravatar.com/)](http://en.gravatar.com/)*: top 100M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://tuchong.com/) [Tuchong (https://tuchong.com/)](https://tuchong.com/)*: top 100M, cn, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://tieba.baidu.com) [Baidu (https://tieba.baidu.com)](https://tieba.baidu.com)*: top 100M, cn* +1. ![](https://www.google.com/s2/favicons?domain=https://community.oracle.com) [Oracle Community (https://community.oracle.com)](https://community.oracle.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.opera.com/) [forums.opera.com (https://forums.opera.com/)](https://forums.opera.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://community.cloudflare.com/) [CloudflareCommunity (https://community.cloudflare.com/)](https://community.cloudflare.com/)*: top 100M, forum, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://scratch.mit.edu/) [Scratch (https://scratch.mit.edu/)](https://scratch.mit.edu/)*: top 100M, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://cyber.harvard.edu) [cyber.harvard.edu (https://cyber.harvard.edu)](https://cyber.harvard.edu)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://scholar.harvard.edu/) [Harvard Scholar (https://scholar.harvard.edu/)](https://scholar.harvard.edu/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://market.yandex.ru/) [YandexMarket (https://market.yandex.ru/)](https://market.yandex.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://music.yandex.ru/) [YandexMusic (https://music.yandex.ru/)](https://music.yandex.ru/)*: top 100M, music, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://zen.yandex.ru) [YandexZenUser (https://zen.yandex.ru)](https://zen.yandex.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://hub.docker.com/) [Docker Hub (https://hub.docker.com/)](https://hub.docker.com/)*: top 100M, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.docker.com) [forums.docker.com (https://forums.docker.com)](https://forums.docker.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.python.org/) [DiscussPython (https://discuss.python.org/)](https://discuss.python.org/)*: top 100M, coding, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://armchairgm.fandom.com/) [Armchairgm (https://armchairgm.fandom.com/)](https://armchairgm.fandom.com/)*: top 100M, wiki* +1. ![](https://www.google.com/s2/favicons?domain=https://battleraprus.fandom.com/ru) [Battleraprus (https://battleraprus.fandom.com/ru)](https://battleraprus.fandom.com/ru)*: top 100M, ru, wiki*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://bleach.fandom.com/ru) [BleachFandom (https://bleach.fandom.com/ru)](https://bleach.fandom.com/ru)*: top 100M, ru, wiki* +1. ![](https://www.google.com/s2/favicons?domain=https://community.fandom.com) [FandomCommunityCentral (https://community.fandom.com)](https://community.fandom.com)*: top 100M, wiki* +1. ![](https://www.google.com/s2/favicons?domain=https://codesnippets.fandom.com) [Code Snippet Wiki (https://codesnippets.fandom.com)](https://codesnippets.fandom.com)*: top 100M, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.waypoint.vice.com) [Waypoint (https://forum.waypoint.vice.com)](https://forum.waypoint.vice.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://weld.in.ua) [Weld (https://weld.in.ua)](https://weld.in.ua)*: top 100M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://ask.fedoraproject.org/) [Ask Fedora (https://ask.fedoraproject.org/)](https://ask.fedoraproject.org/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://profile.hatena.ne.jp) [profile.hatena.ne.jp (https://profile.hatena.ne.jp)](https://profile.hatena.ne.jp)*: top 100M, jp* +1. ![](https://www.google.com/s2/favicons?domain=http://good-music.kiev.ua) [Good-music (http://good-music.kiev.ua)](http://good-music.kiev.ua)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://freedom.kiev.ua) [freedom.kiev.ua (http://freedom.kiev.ua)](http://freedom.kiev.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://allods.mail.ru) [Allods (https://allods.mail.ru)](https://allods.mail.ru)*: top 100M, forum, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://aa.mail.ru) [ArcheAge (https://aa.mail.ru)](https://aa.mail.ru)*: top 100M, forum, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://cfire.mail.ru) [Crossfire (https://cfire.mail.ru)](https://cfire.mail.ru)*: top 100M, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://la.mail.ru) [Lostark (https://la.mail.ru)](https://la.mail.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://love.mail.ru) [Love.Mail.ru (https://love.mail.ru)](https://love.mail.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://my.mail.ru/) [My.Mail.ru@OK (https://my.mail.ru/)](https://my.mail.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://my.mail.ru/) [My.Mail.ru@VK (https://my.mail.ru/)](https://my.mail.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://my.mail.ru/) [My.Mail.ru@bk.ru (https://my.mail.ru/)](https://my.mail.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://my.mail.ru/) [My.Mail.ru@gmail.com (https://my.mail.ru/)](https://my.mail.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://my.mail.ru/) [My.Mail.ru@list.ru (https://my.mail.ru/)](https://my.mail.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://my.mail.ru/) [My.Mail.ru@mail.ru (https://my.mail.ru/)](https://my.mail.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://my.mail.ru/) [My.Mail.ru@ya.ru (https://my.mail.ru/)](https://my.mail.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://my.mail.ru/) [My.Mail.ru@yandex.ru (https://my.mail.ru/)](https://my.mail.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pw.mail.ru) [PerfectWorld (https://pw.mail.ru)](https://pw.mail.ru)*: top 100M, gaming, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pw.mail.ru/) [PerfectWorldForum (https://pw.mail.ru/)](https://pw.mail.ru/)*: top 100M, forum, gaming, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://rev.mail.ru) [Revelation (https://rev.mail.ru)](https://rev.mail.ru)*: top 100M, forum, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://tanks.mail.ru) [Tanks (https://tanks.mail.ru)](https://tanks.mail.ru)*: top 100M, forum, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://wf.mail.ru) [Warface (https://wf.mail.ru)](https://wf.mail.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://people.ign.com/) [PeopleIgn (https://people.ign.com/)](https://people.ign.com/)*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.envato.com) [Envato (https://forums.envato.com)](https://forums.envato.com)*: top 100M, au, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://diveforum.spb.ru/) [Diveforum (https://diveforum.spb.ru/)](https://diveforum.spb.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://poteryashka.spb.ru) [poteryashka.spb.ru (http://poteryashka.spb.ru)](http://poteryashka.spb.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.ea.com) [forums.ea.com (https://forums.ea.com)](https://forums.ea.com)*: top 100M, forum, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://comicvine.gamespot.com/) [ComicvineGamespot (https://comicvine.gamespot.com/)](https://comicvine.gamespot.com/)*: top 100M, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://gamefaqs.gamespot.com) [Gamefaqs (https://gamefaqs.gamespot.com)](https://gamefaqs.gamespot.com)*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.sketchfab.com) [forum.sketchfab.com (https://forum.sketchfab.com)](https://forum.sketchfab.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.pkp.sfu.ca) [forum.pkp.sfu.ca (https://forum.pkp.sfu.ca)](https://forum.pkp.sfu.ca)*: top 100M, ca, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://news.ycombinator.com/) [HackerNews (https://news.ycombinator.com/)](https://news.ycombinator.com/)*: top 100M, news* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.tomshardware.com/) [TomsHardware (https://forums.tomshardware.com/)](https://forums.tomshardware.com/)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.ghost.org) [forum.ghost.org (https://forum.ghost.org)](https://forum.ghost.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://djskt.lnk.to) [djskt.lnk.to (https://djskt.lnk.to)](https://djskt.lnk.to)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.arduino.cc/) [Arduino Forum (https://forum.arduino.cc/)](https://forum.arduino.cc/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.openoffice.org/en/forum) [forum.openoffice.org (https://forum.openoffice.org/en/forum)](https://forum.openoffice.org/en/forum)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://gitcode.com/) [GitCode (https://gitcode.com/)](https://gitcode.com/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://www.yuque.com/) [Yuque (https://www.yuque.com/)](https://www.yuque.com/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://leetcode.cn/) [LeetCode CN (https://leetcode.cn/)](https://leetcode.cn/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://bgm.tv/) [Bangumi (https://bgm.tv/)](https://bgm.tv/)*: top 100M, cn* +1. ![](https://www.google.com/s2/favicons?domain=https://bbs.nga.cn/) [NGA (https://bbs.nga.cn/)](https://bbs.nga.cn/)*: top 100M, cn, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://zh.moegirl.org.cn/) [Moegirl (https://zh.moegirl.org.cn/)](https://zh.moegirl.org.cn/)*: top 100M, cn* +1. ![](https://www.google.com/s2/favicons?domain=https://accounts.eclipse.org) [accounts.eclipse.org (https://accounts.eclipse.org)](https://accounts.eclipse.org)*: top 100M, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://amp.flipboard.com) [amp.flipboard.com (https://amp.flipboard.com)](https://amp.flipboard.com)*: top 100M, news* +1. ![](https://www.google.com/s2/favicons?domain=https://career.habr.com/) [HabrCareer (https://career.habr.com/)](https://career.habr.com/)*: top 100M, career, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://freelance.habr.com/) [Freelance.habr (https://freelance.habr.com/)](https://freelance.habr.com/)*: top 100M, freelance, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://qna.habr.com/) [Toster (https://qna.habr.com/)](https://qna.habr.com/)*: top 100M, coding, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://bbs.boingboing.net) [bbs.boingboing.net (https://bbs.boingboing.net)](https://bbs.boingboing.net)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.gorod.dp.ua/) [Gorod.dp.ua (https://forum.gorod.dp.ua/)](https://forum.gorod.dp.ua/)*: top 100M, de, forum, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://promalp.dp.ua) [promalp.dp.ua (http://promalp.dp.ua)](http://promalp.dp.ua)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.brave.com) [community.brave.com (https://community.brave.com)](https://community.brave.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forums.tomsguide.com) [Tom's guide (http://forums.tomsguide.com)](http://forums.tomsguide.com)*: top 100M, forum, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.elastic.co/) [Discuss.Elastic.co (https://discuss.elastic.co/)](https://discuss.elastic.co/)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.codecademy.com) [discuss.codecademy.com (https://discuss.codecademy.com)](https://discuss.codecademy.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://apelmon.od.ua) [apelmon.od.ua (http://apelmon.od.ua)](http://apelmon.od.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://community.wolfram.com/) [Wolframalpha Forum (https://community.wolfram.com/)](https://community.wolfram.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums-ru.ubisoft.com/) [Ubisoft (https://forums-ru.ubisoft.com/)](https://forums-ru.ubisoft.com/)*: top 100M, forum, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://dating.rambler.ru/) [RamblerDating (https://dating.rambler.ru/)](https://dating.rambler.ru/)*: top 100M, dating, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.active.lviv.ua) [active.lviv.ua (http://www.active.lviv.ua)](http://www.active.lviv.ua)*: top 100M, forum, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://volkswagen.lviv.ua) [volkswagen.lviv.ua (http://volkswagen.lviv.ua)](http://volkswagen.lviv.ua)*: top 100M, auto, forum, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://tuning.lviv.ua/forum) [tuning.lviv.ua (http://tuning.lviv.ua/forum)](http://tuning.lviv.ua/forum)*: top 100M, forum, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://74507.ucoz.ru) [74507.ucoz.ru (https://74507.ucoz.ru)](https://74507.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.ucoz.ru) [Ucoz (https://forum.ucoz.ru)](https://forum.ucoz.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://afsoc.ucoz.ru) [afsoc.ucoz.ru (http://afsoc.ucoz.ru)](http://afsoc.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://alpanf.ucoz.ru) [alpanf.ucoz.ru (http://alpanf.ucoz.ru)](http://alpanf.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://antalya.ucoz.ru) [antalya.ucoz.ru (http://antalya.ucoz.ru)](http://antalya.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://antizombie.ucoz.ru) [antizombie.ucoz.ru (http://antizombie.ucoz.ru)](http://antizombie.ucoz.ru)*: top 100M, movies, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://army-rus.ucoz.ru) [army-rus.ucoz.ru (http://army-rus.ucoz.ru)](http://army-rus.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://armyboots.ucoz.ru) [armyboots.ucoz.ru (http://armyboots.ucoz.ru)](http://armyboots.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://aviabaza-meria.ucoz.ru) [aviabaza-meria.ucoz.ru (http://aviabaza-meria.ucoz.ru)](http://aviabaza-meria.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://easyjob.ucoz.ru) [easyjob.ucoz.ru (http://easyjob.ucoz.ru)](http://easyjob.ucoz.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://fablero.ucoz.ru) [fablero.ucoz.ru (http://fablero.ucoz.ru)](http://fablero.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forum-ssc.ucoz.ru) [forum-ssc.ucoz.ru (http://forum-ssc.ucoz.ru)](http://forum-ssc.ucoz.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://gebirgs.ucoz.ru) [gebirgs.ucoz.ru (http://gebirgs.ucoz.ru)](http://gebirgs.ucoz.ru)*: top 100M, forum, hobby, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://kursk46.ucoz.ru) [kursk46.ucoz.ru (http://kursk46.ucoz.ru)](http://kursk46.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://losinopetrovsk.ucoz.ru) [losinopetrovsk.ucoz.ru (http://losinopetrovsk.ucoz.ru)](http://losinopetrovsk.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://morshansk.ucoz.ru) [morshansk.ucoz.ru (http://morshansk.ucoz.ru)](http://morshansk.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://oopkmoskva.ucoz.ru) [oopkmoskva.ucoz.ru (http://oopkmoskva.ucoz.ru)](http://oopkmoskva.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ovo.ucoz.ru) [ovo.ucoz.ru (http://ovo.ucoz.ru)](http://ovo.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pro-cssteam.ucoz.ru) [pro-cssteam.ucoz.ru (http://pro-cssteam.ucoz.ru)](http://pro-cssteam.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://punx.ucoz.ru) [punx.ucoz.ru (http://punx.ucoz.ru)](http://punx.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pv-afghan.ucoz.ru) [pv-afghan.ucoz.ru (http://pv-afghan.ucoz.ru)](http://pv-afghan.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://rus-mmm.ucoz.ru) [rus-mmm.ucoz.ru (http://rus-mmm.ucoz.ru)](http://rus-mmm.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://salekhardnews.ucoz.ru) [salekhardnews.ucoz.ru (http://salekhardnews.ucoz.ru)](http://salekhardnews.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://shadow-belgorod.ucoz.ru) [shadow-belgorod.ucoz.ru (http://shadow-belgorod.ucoz.ru)](http://shadow-belgorod.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://tarjaturunen.ucoz.ru) [tarjaturunen.ucoz.ru (http://tarjaturunen.ucoz.ru)](http://tarjaturunen.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://virtual-auto.ucoz.ru) [virtual-auto.ucoz.ru (http://virtual-auto.ucoz.ru)](http://virtual-auto.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://weaponsas.ucoz.ru) [weaponsas.ucoz.ru (http://weaponsas.ucoz.ru)](http://weaponsas.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xakerminus.ucoz.ru) [xakerminus.ucoz.ru (http://xakerminus.ucoz.ru)](http://xakerminus.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zabselo.ucoz.ru) [zabselo.ucoz.ru (http://zabselo.ucoz.ru)](http://zabselo.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://gomel-dogs.ucoz.ru) [gomel-dogs.ucoz.ru (http://gomel-dogs.ucoz.ru)](http://gomel-dogs.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://rottweiler.ucoz.ru) [rottweiler.ucoz.ru (http://rottweiler.ucoz.ru)](http://rottweiler.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://lai.ucoz.ru) [lai.ucoz.ru (http://lai.ucoz.ru)](http://lai.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zennenhund.ucoz.ru) [zennenhund.ucoz.ru (http://zennenhund.ucoz.ru)](http://zennenhund.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://nada25.ucoz.ru) [nada25.ucoz.ru (http://nada25.ucoz.ru)](http://nada25.ucoz.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://day-lapku.ucoz.ru) [day-lapku.ucoz.ru (http://day-lapku.ucoz.ru)](http://day-lapku.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://legendarus-veo.ucoz.ru) [legendarus-veo.ucoz.ru (http://legendarus-veo.ucoz.ru)](http://legendarus-veo.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pushok.ucoz.ru) [pushok.ucoz.ru (http://pushok.ucoz.ru)](http://pushok.ucoz.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://pskovfaunaclub.ucoz.ru) [pskovfaunaclub.ucoz.ru (http://pskovfaunaclub.ucoz.ru)](http://pskovfaunaclub.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://valleykrosava.ucoz.ru) [valleykrosava.ucoz.ru (http://valleykrosava.ucoz.ru)](http://valleykrosava.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vadimbondar.ucoz.ru) [vadimbondar.ucoz.ru (http://vadimbondar.ucoz.ru)](http://vadimbondar.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vadya.ucoz.ru) [vadya.ucoz.ru (http://vadya.ucoz.ru)](http://vadya.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://stroyneemvmeste.ucoz.ru) [stroyneemvmeste.ucoz.ru (http://stroyneemvmeste.ucoz.ru)](http://stroyneemvmeste.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://eyorkie.ucoz.ru) [eyorkie.ucoz.ru (http://eyorkie.ucoz.ru)](http://eyorkie.ucoz.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://sfinx-cats.ucoz.ru) [sfinx-cats.ucoz.ru (http://sfinx-cats.ucoz.ru)](http://sfinx-cats.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ugri.ucoz.ru) [ugri.ucoz.ru (http://ugri.ucoz.ru)](http://ugri.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://milnerelena.ucoz.ru) [milnerelena.ucoz.ru (http://milnerelena.ucoz.ru)](http://milnerelena.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zebest.ucoz.ru) [zebest.ucoz.ru (http://zebest.ucoz.ru)](http://zebest.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://hmkids.ucoz.ru) [hmkids.ucoz.ru (http://hmkids.ucoz.ru)](http://hmkids.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://shanson.ucoz.ru) [shanson.ucoz.ru (https://shanson.ucoz.ru)](https://shanson.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://klas-crew.ucoz.ru) [klas-crew.ucoz.ru (http://klas-crew.ucoz.ru)](http://klas-crew.ucoz.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://allmus.ucoz.ru) [allmus.ucoz.ru (http://allmus.ucoz.ru)](http://allmus.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://rotarusofi.ucoz.ru) [rotarusofi.ucoz.ru (http://rotarusofi.ucoz.ru)](http://rotarusofi.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://videomuzon.ucoz.ru) [videomuzon.ucoz.ru (http://videomuzon.ucoz.ru)](http://videomuzon.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://webmedia.ucoz.ru) [webmedia.ucoz.ru (http://webmedia.ucoz.ru)](http://webmedia.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://p1rat.ucoz.ru) [p1rat.ucoz.ru (https://p1rat.ucoz.ru)](https://p1rat.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://satisfacktion.ucoz.ru) [satisfacktion.ucoz.ru (http://satisfacktion.ucoz.ru)](http://satisfacktion.ucoz.ru)*: top 100M, music, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://djfint.ucoz.ru) [djfint.ucoz.ru (http://djfint.ucoz.ru)](http://djfint.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://aviaforum.ucoz.ru) [aviaforum.ucoz.ru (http://aviaforum.ucoz.ru)](http://aviaforum.ucoz.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://avia-forum.ucoz.ru) [avia-forum.ucoz.ru (http://avia-forum.ucoz.ru)](http://avia-forum.ucoz.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://terralight.ucoz.ru) [terralight.ucoz.ru (http://terralight.ucoz.ru)](http://terralight.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://tachograph.ucoz.ru) [tachograph.ucoz.ru (http://tachograph.ucoz.ru)](http://tachograph.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://moto-master.ucoz.ru) [moto-master.ucoz.ru (https://moto-master.ucoz.ru)](https://moto-master.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://scb.ucoz.ru) [scb.ucoz.ru (http://scb.ucoz.ru)](http://scb.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://remzona-ekb.ucoz.ru) [remzona-ekb.ucoz.ru (http://remzona-ekb.ucoz.ru)](http://remzona-ekb.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://serwis.ucoz.ru) [serwis.ucoz.ru (https://serwis.ucoz.ru)](https://serwis.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ankord.ucoz.ru) [ankord.ucoz.ru (http://ankord.ucoz.ru)](http://ankord.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://deutsch-auto68.ucoz.ru) [deutsch-auto68.ucoz.ru (http://deutsch-auto68.ucoz.ru)](http://deutsch-auto68.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://krum.ucoz.ru) [krum.ucoz.ru (http://krum.ucoz.ru)](http://krum.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://wallpost.ucoz.ru) [wallpost.ucoz.ru (http://wallpost.ucoz.ru)](http://wallpost.ucoz.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://playlist-iptv.ucoz.ru) [playlist-iptv.ucoz.ru (http://playlist-iptv.ucoz.ru)](http://playlist-iptv.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mamki-papki.ucoz.ru) [mamki-papki.ucoz.ru (http://mamki-papki.ucoz.ru)](http://mamki-papki.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://magic-square.ucoz.ru) [magic-square.ucoz.ru (http://magic-square.ucoz.ru)](http://magic-square.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://free-proxy.ucoz.ru) [free-proxy.ucoz.ru (http://free-proxy.ucoz.ru)](http://free-proxy.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://oskolfishing.ucoz.ru) [oskolfishing.ucoz.ru (http://oskolfishing.ucoz.ru)](http://oskolfishing.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://my-tucson.ucoz.ru) [my-tucson.ucoz.ru (http://my-tucson.ucoz.ru)](http://my-tucson.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://potystorony.ucoz.ru) [potystorony.ucoz.ru (http://potystorony.ucoz.ru)](http://potystorony.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://nokia6233.ucoz.ru) [nokia6233.ucoz.ru (http://nokia6233.ucoz.ru)](http://nokia6233.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://goddamn.ucoz.ru) [goddamn.ucoz.ru (http://goddamn.ucoz.ru)](http://goddamn.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://poshtovik.ucoz.ru) [poshtovik.ucoz.ru (http://poshtovik.ucoz.ru)](http://poshtovik.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ic.ucoz.ru) [ic.ucoz.ru (http://ic.ucoz.ru)](http://ic.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://babymama.ucoz.ru) [babymama.ucoz.ru (http://babymama.ucoz.ru)](http://babymama.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://autocb.ucoz.ru) [autocb.ucoz.ru (http://autocb.ucoz.ru)](http://autocb.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://so4ineniya.ucoz.ru) [so4ineniya.ucoz.ru (http://so4ineniya.ucoz.ru)](http://so4ineniya.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://toneto.ucoz.ru) [toneto.ucoz.ru (http://toneto.ucoz.ru)](http://toneto.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://fat.ucoz.ru) [fat.ucoz.ru (http://fat.ucoz.ru)](http://fat.ucoz.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://holodilshchik.ucoz.ru) [holodilshchik.ucoz.ru (http://holodilshchik.ucoz.ru)](http://holodilshchik.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sladkiydesert.ucoz.ru) [sladkiydesert.ucoz.ru (http://sladkiydesert.ucoz.ru)](http://sladkiydesert.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://nicholassparks.ucoz.ru) [nicholassparks.ucoz.ru (http://nicholassparks.ucoz.ru)](http://nicholassparks.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://catinboots.ucoz.ru) [catinboots.ucoz.ru (http://catinboots.ucoz.ru)](http://catinboots.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://nicefriendcats.ucoz.ru) [nicefriendcats.ucoz.ru (http://nicefriendcats.ucoz.ru)](http://nicefriendcats.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dcsoft.ucoz.ru) [dcsoft.ucoz.ru (http://dcsoft.ucoz.ru)](http://dcsoft.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dok17.ucoz.ru) [dok17.ucoz.ru (http://dok17.ucoz.ru)](http://dok17.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://cadaverzian.ucoz.ru) [cadaverzian.ucoz.ru (http://cadaverzian.ucoz.ru)](http://cadaverzian.ucoz.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://rurip.ucoz.ru) [rurip.ucoz.ru (http://rurip.ucoz.ru)](http://rurip.ucoz.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://yras.ucoz.ru) [yras.ucoz.ru (http://yras.ucoz.ru)](http://yras.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://doccarb.ucoz.ru) [doccarb.ucoz.ru (http://doccarb.ucoz.ru)](http://doccarb.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://chelentano.ucoz.ru) [chelentano.ucoz.ru (http://chelentano.ucoz.ru)](http://chelentano.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://aviahistory.ucoz.ru) [aviahistory.ucoz.ru (http://aviahistory.ucoz.ru)](http://aviahistory.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://nuzar.ucoz.ru) [nuzar.ucoz.ru (http://nuzar.ucoz.ru)](http://nuzar.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://faillyuboi.ucoz.ru) [faillyuboi.ucoz.ru (http://faillyuboi.ucoz.ru)](http://faillyuboi.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pio-bets.ucoz.ru) [pio-bets.ucoz.ru (http://pio-bets.ucoz.ru)](http://pio-bets.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://clan-sg.ucoz.ru) [clan-sg.ucoz.ru (http://clan-sg.ucoz.ru)](http://clan-sg.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mytechbook.ucoz.ru) [mytechbook.ucoz.ru (http://mytechbook.ucoz.ru)](http://mytechbook.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://diablocool.ucoz.ru) [diablocool.ucoz.ru (http://diablocool.ucoz.ru)](http://diablocool.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://chastysc.ucoz.ru) [chastysc.ucoz.ru (http://chastysc.ucoz.ru)](http://chastysc.ucoz.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://torrents-igra.ucoz.ru) [torrents-igra.ucoz.ru (http://torrents-igra.ucoz.ru)](http://torrents-igra.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://schonin.ucoz.ru) [schonin.ucoz.ru (http://schonin.ucoz.ru)](http://schonin.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kfir-zahav.ucoz.ru) [kfir-zahav.ucoz.ru (http://kfir-zahav.ucoz.ru)](http://kfir-zahav.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://lakshmi-fm.ucoz.ru) [lakshmi-fm.ucoz.ru (http://lakshmi-fm.ucoz.ru)](http://lakshmi-fm.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://death-note.ucoz.ru) [death-note.ucoz.ru (http://death-note.ucoz.ru)](http://death-note.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pirohimic.ucoz.ru) [pirohimic.ucoz.ru (http://pirohimic.ucoz.ru)](http://pirohimic.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://warez-pirati.ucoz.ru) [warez-pirati.ucoz.ru (http://warez-pirati.ucoz.ru)](http://warez-pirati.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://gifts.ucoz.ru) [gifts.ucoz.ru (http://gifts.ucoz.ru)](http://gifts.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sat-electronics.ucoz.ru) [sat-electronics.ucoz.ru (http://sat-electronics.ucoz.ru)](http://sat-electronics.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pro-svet.ucoz.ru) [pro-svet.ucoz.ru (http://pro-svet.ucoz.ru)](http://pro-svet.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://memory57.ucoz.ru) [memory57.ucoz.ru (https://memory57.ucoz.ru)](https://memory57.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://baggi.ucoz.ru) [baggi.ucoz.ru (http://baggi.ucoz.ru)](http://baggi.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://gorbuha.ucoz.ru) [gorbuha.ucoz.ru (http://gorbuha.ucoz.ru)](http://gorbuha.ucoz.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://big-game.ucoz.ru) [big-game.ucoz.ru (http://big-game.ucoz.ru)](http://big-game.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://soft-deniz.ucoz.ru) [soft-deniz.ucoz.ru (http://soft-deniz.ucoz.ru)](http://soft-deniz.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://lifeway.ucoz.ru) [lifeway.ucoz.ru (http://lifeway.ucoz.ru)](http://lifeway.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pochikimyk.ucoz.ru) [pochikimyk.ucoz.ru (http://pochikimyk.ucoz.ru)](http://pochikimyk.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://moments.ucoz.ru) [moments.ucoz.ru (http://moments.ucoz.ru)](http://moments.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://inetjob.ucoz.ru) [inetjob.ucoz.ru (http://inetjob.ucoz.ru)](http://inetjob.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pogz5615.ucoz.ru) [pogz5615.ucoz.ru (http://pogz5615.ucoz.ru)](http://pogz5615.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://cosmotarolog.ucoz.ru) [cosmotarolog.ucoz.ru (http://cosmotarolog.ucoz.ru)](http://cosmotarolog.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://buyforex.ucoz.ru) [buyforex.ucoz.ru (http://buyforex.ucoz.ru)](http://buyforex.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://stay.ucoz.ru) [stay.ucoz.ru (http://stay.ucoz.ru)](http://stay.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dhelp.ucoz.ru) [dhelp.ucoz.ru (http://dhelp.ucoz.ru)](http://dhelp.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://famouspeople.ucoz.ru) [famouspeople.ucoz.ru (http://famouspeople.ucoz.ru)](http://famouspeople.ucoz.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://foxrecord.ucoz.ru) [foxrecord.ucoz.ru (http://foxrecord.ucoz.ru)](http://foxrecord.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://konibodom.ucoz.ru) [konibodom.ucoz.ru (http://konibodom.ucoz.ru)](http://konibodom.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ural-sloboda.ucoz.ru) [ural-sloboda.ucoz.ru (http://ural-sloboda.ucoz.ru)](http://ural-sloboda.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://bbclub.ucoz.ru) [bbclub.ucoz.ru (http://bbclub.ucoz.ru)](http://bbclub.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://smartplay.ucoz.ru) [smartplay.ucoz.ru (http://smartplay.ucoz.ru)](http://smartplay.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://azovmore.ucoz.ru) [azovmore.ucoz.ru (http://azovmore.ucoz.ru)](http://azovmore.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://str-upravlenie.ucoz.ru) [str-upravlenie.ucoz.ru (http://str-upravlenie.ucoz.ru)](http://str-upravlenie.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://nk-cs.ucoz.ru) [nk-cs.ucoz.ru (http://nk-cs.ucoz.ru)](http://nk-cs.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kuzini.ucoz.ru) [kuzini.ucoz.ru (http://kuzini.ucoz.ru)](http://kuzini.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://5i8.ucoz.ru) [5i8.ucoz.ru (http://5i8.ucoz.ru)](http://5i8.ucoz.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://bashteplovent.ucoz.ru) [bashteplovent.ucoz.ru (http://bashteplovent.ucoz.ru)](http://bashteplovent.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://svoimirykami.ucoz.ru) [svoimirykami.ucoz.ru (http://svoimirykami.ucoz.ru)](http://svoimirykami.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://hackapp.ucoz.ru) [hackapp.ucoz.ru (http://hackapp.ucoz.ru)](http://hackapp.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://collegy.ucoz.ru) [collegy.ucoz.ru (http://collegy.ucoz.ru)](http://collegy.ucoz.ru)*: top 100M, kz* +1. ![](https://www.google.com/s2/favicons?domain=http://anschula.ucoz.ru) [anschula.ucoz.ru (http://anschula.ucoz.ru)](http://anschula.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://garmin.ucoz.ru) [garmin.ucoz.ru (http://garmin.ucoz.ru)](http://garmin.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://655iap.ucoz.ru) [655iap.ucoz.ru (https://655iap.ucoz.ru)](https://655iap.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://el-pizza.ucoz.ru) [el-pizza.ucoz.ru (http://el-pizza.ucoz.ru)](http://el-pizza.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://berea.ucoz.ru) [berea.ucoz.ru (http://berea.ucoz.ru)](http://berea.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zdorov10.ucoz.ru) [zdorov10.ucoz.ru (http://zdorov10.ucoz.ru)](http://zdorov10.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://lname.ucoz.ru) [lname.ucoz.ru (http://lname.ucoz.ru)](http://lname.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sibcoins.ucoz.ru) [sibcoins.ucoz.ru (http://sibcoins.ucoz.ru)](http://sibcoins.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vgorah.ucoz.ru) [vgorah.ucoz.ru (http://vgorah.ucoz.ru)](http://vgorah.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://school-23elista.ucoz.ru) [school-23elista.ucoz.ru (http://school-23elista.ucoz.ru)](http://school-23elista.ucoz.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://baykovoshkola.ucoz.ru) [baykovoshkola.ucoz.ru (http://baykovoshkola.ucoz.ru)](http://baykovoshkola.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://coffeeworld.ucoz.ru) [coffeeworld.ucoz.ru (http://coffeeworld.ucoz.ru)](http://coffeeworld.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://trainz-vl.ucoz.ru) [trainz-vl.ucoz.ru (http://trainz-vl.ucoz.ru)](http://trainz-vl.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://hulyaganka.ucoz.ru) [hulyaganka.ucoz.ru (http://hulyaganka.ucoz.ru)](http://hulyaganka.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mix-best.ucoz.ru) [mix-best.ucoz.ru (http://mix-best.ucoz.ru)](http://mix-best.ucoz.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://cosmoforum.ucoz.ru) [cosmoforum.ucoz.ru (https://cosmoforum.ucoz.ru)](https://cosmoforum.ucoz.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://mychildren.ucoz.ru) [mychildren.ucoz.ru (http://mychildren.ucoz.ru)](http://mychildren.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://icook.ucoz.ru) [icook.ucoz.ru (http://icook.ucoz.ru)](http://icook.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dzhida2000.ucoz.ru) [dzhida2000.ucoz.ru (http://dzhida2000.ucoz.ru)](http://dzhida2000.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://snegovaya-pad.ucoz.ru) [snegovaya-pad.ucoz.ru (http://snegovaya-pad.ucoz.ru)](http://snegovaya-pad.ucoz.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://rielt55.ucoz.ru) [rielt55.ucoz.ru (http://rielt55.ucoz.ru)](http://rielt55.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://csi.ucoz.ru) [csi.ucoz.ru (http://csi.ucoz.ru)](http://csi.ucoz.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://taxi-belgorod.ucoz.ru) [taxi-belgorod.ucoz.ru (http://taxi-belgorod.ucoz.ru)](http://taxi-belgorod.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://doytrunt.ucoz.ru) [doytrunt.ucoz.ru (http://doytrunt.ucoz.ru)](http://doytrunt.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://naruto-rolegame.ucoz.ru) [naruto-rolegame.ucoz.ru (http://naruto-rolegame.ucoz.ru)](http://naruto-rolegame.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kraskiprazdnika.ucoz.ru) [kraskiprazdnika.ucoz.ru (http://kraskiprazdnika.ucoz.ru)](http://kraskiprazdnika.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://101vzvod.ucoz.ru) [101vzvod.ucoz.ru (http://101vzvod.ucoz.ru)](http://101vzvod.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://actikom.ucoz.ru) [actikom.ucoz.ru (http://actikom.ucoz.ru)](http://actikom.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://marym.ucoz.ru) [marym.ucoz.ru (http://marym.ucoz.ru)](http://marym.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://aikido-mariupol.ucoz.ru) [aikido-mariupol.ucoz.ru (https://aikido-mariupol.ucoz.ru)](https://aikido-mariupol.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://icq-telefon.ucoz.ru) [icq-telefon.ucoz.ru (http://icq-telefon.ucoz.ru)](http://icq-telefon.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://admin-soft.ucoz.ru) [admin-soft.ucoz.ru (http://admin-soft.ucoz.ru)](http://admin-soft.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kinohouse.ucoz.ru) [kinohouse.ucoz.ru (http://kinohouse.ucoz.ru)](http://kinohouse.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://photoaura.ucoz.ru) [photoaura.ucoz.ru (http://photoaura.ucoz.ru)](http://photoaura.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mozga-net.ucoz.ru) [mozga-net.ucoz.ru (http://mozga-net.ucoz.ru)](http://mozga-net.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://css-nn-52-rus.ucoz.ru) [css-nn-52-rus.ucoz.ru (https://css-nn-52-rus.ucoz.ru)](https://css-nn-52-rus.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sebastopol.ucoz.ru) [sebastopol.ucoz.ru (http://sebastopol.ucoz.ru)](http://sebastopol.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://remont56.ucoz.ru) [remont56.ucoz.ru (http://remont56.ucoz.ru)](http://remont56.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://compline.ucoz.ru) [compline.ucoz.ru (http://compline.ucoz.ru)](http://compline.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://fs-mods-rus.ucoz.ru) [fs-mods-rus.ucoz.ru (http://fs-mods-rus.ucoz.ru)](http://fs-mods-rus.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://zvukinadezdy.ucoz.ru) [zvukinadezdy.ucoz.ru (https://zvukinadezdy.ucoz.ru)](https://zvukinadezdy.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ps-cs.ucoz.ru) [ps-cs.ucoz.ru (http://ps-cs.ucoz.ru)](http://ps-cs.ucoz.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://gta-fan-zone.ucoz.ru) [gta-fan-zone.ucoz.ru (http://gta-fan-zone.ucoz.ru)](http://gta-fan-zone.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://scooter-helper.ucoz.ru) [scooter-helper.ucoz.ru (http://scooter-helper.ucoz.ru)](http://scooter-helper.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://opinion.ucoz.ru) [opinion.ucoz.ru (http://opinion.ucoz.ru)](http://opinion.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sufficit.ucoz.ru) [sufficit.ucoz.ru (http://sufficit.ucoz.ru)](http://sufficit.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://urmai-urmaevo.ucoz.ru) [urmai-urmaevo.ucoz.ru (http://urmai-urmaevo.ucoz.ru)](http://urmai-urmaevo.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pik100.ucoz.ru) [pik100.ucoz.ru (http://pik100.ucoz.ru)](http://pik100.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://drawings-base.ucoz.ru) [drawings-base.ucoz.ru (http://drawings-base.ucoz.ru)](http://drawings-base.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://minnac.ucoz.ru) [minnac.ucoz.ru (http://minnac.ucoz.ru)](http://minnac.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://top10allservers.ucoz.ru) [top10allservers.ucoz.ru (http://top10allservers.ucoz.ru)](http://top10allservers.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://usersoft.ucoz.ru) [usersoft.ucoz.ru (http://usersoft.ucoz.ru)](http://usersoft.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ships.ucoz.ru) [ships.ucoz.ru (http://ships.ucoz.ru)](http://ships.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://cpu.ucoz.ru) [cpu.ucoz.ru (http://cpu.ucoz.ru)](http://cpu.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://popugi.ucoz.ru) [popugi.ucoz.ru (http://popugi.ucoz.ru)](http://popugi.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://death-legion.ucoz.ru) [death-legion.ucoz.ru (http://death-legion.ucoz.ru)](http://death-legion.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://beatl.ucoz.ru) [beatl.ucoz.ru (http://beatl.ucoz.ru)](http://beatl.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://homeofsky.ucoz.ru) [homeofsky.ucoz.ru (http://homeofsky.ucoz.ru)](http://homeofsky.ucoz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://hikvision.msk.ru) [hikvision.msk.ru (http://hikvision.msk.ru)](http://hikvision.msk.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://echo.msk.ru/) [radio_echo_msk (https://echo.msk.ru/)](https://echo.msk.ru/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://spartak.msk.ru/guest) [spartak.msk.ru (http://spartak.msk.ru/guest)](http://spartak.msk.ru/guest)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://users.software.informer.com) [SoftwareInformer (https://users.software.informer.com)](https://users.software.informer.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.sketchup.com) [forums.sketchup.com (https://forums.sketchup.com)](https://forums.sketchup.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.hashicorp.com) [discuss.hashicorp.com (https://discuss.hashicorp.com)](https://discuss.hashicorp.com)*: top 100M, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.wordreference.com) [forum.wordreference.com (https://forum.wordreference.com)](https://forum.wordreference.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://support.t-mobile.com) [T-MobileSupport (https://support.t-mobile.com)](https://support.t-mobile.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.rajce.idnes.cz/) [Rajce.net (https://www.rajce.idnes.cz/)](https://www.rajce.idnes.cz/)*: top 100M, cz* +1. ![](https://www.google.com/s2/favicons?domain=https://ru.123rf.com) [123rf (https://ru.123rf.com)](https://ru.123rf.com)*: top 100M, photo, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.linuxfoundation.org) [linuxfoundation (https://forum.linuxfoundation.org)](https://forum.linuxfoundation.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.audacityteam.org) [forum.audacityteam.org (https://forum.audacityteam.org)](https://forum.audacityteam.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain={username}.ddns.net) [{username}.ddns.net ({username}.ddns.net)]({username}.ddns.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://users.rust-lang.org) [Rust-lang (https://users.rust-lang.org)](https://users.rust-lang.org)*: top 100M, coding, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://meta.discourse.org/) [MetaDiscourse (https://meta.discourse.org/)](https://meta.discourse.org/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://community.icons8.com) [community.icons8.com (https://community.icons8.com)](https://community.icons8.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.gentoo.org) [gentoo (https://forums.gentoo.org)](https://forums.gentoo.org)*: top 100M, coding, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.inaturalist.org) [forum.inaturalist.org (https://forum.inaturalist.org)](https://forum.inaturalist.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://app.pluralsight.com) [Pluralsight (https://app.pluralsight.com)](https://app.pluralsight.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.f-droid.org) [F-droid (https://forum.f-droid.org)](https://forum.f-droid.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.vn.ua) [forum.vn.ua (http://forum.vn.ua)](http://forum.vn.ua)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://profile.ameba.jp) [Ameba (https://profile.ameba.jp)](https://profile.ameba.jp)*: top 100M, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.blackmagicdesign.com) [forum.blackmagicdesign.com (https://forum.blackmagicdesign.com)](https://forum.blackmagicdesign.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://hosted.weblate.org/) [Weblate (https://hosted.weblate.org/)](https://hosted.weblate.org/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.sublimetext.com/) [SublimeForum (https://forum.sublimetext.com/)](https://forum.sublimetext.com/)*: top 100M, coding, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.muffingroup.com) [MuffinGroup (https://forum.muffingroup.com)](https://forum.muffingroup.com)*: top 100M, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=http://takr-kiev.ucoz.com) [takr-kiev.ucoz.com (http://takr-kiev.ucoz.com)](http://takr-kiev.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://topcheats.ucoz.com) [topcheats.ucoz.com (http://topcheats.ucoz.com)](http://topcheats.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vdv-belarus.ucoz.com) [vdv-belarus.ucoz.com (http://vdv-belarus.ucoz.com)](http://vdv-belarus.ucoz.com)*: top 100M, by, forum, military* +1. ![](https://www.google.com/s2/favicons?domain=http://vse1.ucoz.com) [vse1.ucoz.com (http://vse1.ucoz.com)](http://vse1.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://prenatal-club.ucoz.com) [prenatal-club.ucoz.com (http://prenatal-club.ucoz.com)](http://prenatal-club.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://real-sp.ucoz.com) [real-sp.ucoz.com (http://real-sp.ucoz.com)](http://real-sp.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://obkon.ucoz.com) [obkon.ucoz.com (http://obkon.ucoz.com)](http://obkon.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xorazm-viloyati.ucoz.com) [xorazm-viloyati.ucoz.com (http://xorazm-viloyati.ucoz.com)](http://xorazm-viloyati.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://tatyana-art.ucoz.com) [tatyana-art.ucoz.com (http://tatyana-art.ucoz.com)](http://tatyana-art.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kakvkontakte.ucoz.com) [kakvkontakte.ucoz.com (http://kakvkontakte.ucoz.com)](http://kakvkontakte.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://podsnezhniksad.ucoz.com) [podsnezhniksad.ucoz.com (http://podsnezhniksad.ucoz.com)](http://podsnezhniksad.ucoz.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://igra-online.ucoz.com) [igra-online.ucoz.com (http://igra-online.ucoz.com)](http://igra-online.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://icu.ucoz.com) [icu.ucoz.com (http://icu.ucoz.com)](http://icu.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://firasmartincome.ucoz.com) [firasmartincome.ucoz.com (http://firasmartincome.ucoz.com)](http://firasmartincome.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://topreklama.ucoz.com) [topreklama.ucoz.com (http://topreklama.ucoz.com)](http://topreklama.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://wakeup.ucoz.com) [wakeup.ucoz.com (http://wakeup.ucoz.com)](http://wakeup.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sharing-sat.ucoz.com) [sharing-sat.ucoz.com (http://sharing-sat.ucoz.com)](http://sharing-sat.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://duz.ucoz.com) [duz.ucoz.com (http://duz.ucoz.com)](http://duz.ucoz.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://lesbeyanka.ucoz.com) [lesbeyanka.ucoz.com (http://lesbeyanka.ucoz.com)](http://lesbeyanka.ucoz.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://moedelo.ucoz.com) [moedelo.ucoz.com (http://moedelo.ucoz.com)](http://moedelo.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://halol.ucoz.com) [halol.ucoz.com (http://halol.ucoz.com)](http://halol.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://game-mobi.ucoz.com) [game-mobi.ucoz.com (http://game-mobi.ucoz.com)](http://game-mobi.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sense.ucoz.com) [sense.ucoz.com (http://sense.ucoz.com)](http://sense.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://stroy-s-nami.ucoz.com) [stroy-s-nami.ucoz.com (http://stroy-s-nami.ucoz.com)](http://stroy-s-nami.ucoz.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://osta.ucoz.com) [osta.ucoz.com (http://osta.ucoz.com)](http://osta.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://wm.ucoz.com) [wm.ucoz.com (http://wm.ucoz.com)](http://wm.ucoz.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.linuxmint.com) [forums.linuxmint.com (https://forums.linuxmint.com)](https://forums.linuxmint.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.plurk.com/) [Plurk (https://www.plurk.com/)](https://www.plurk.com/)*: top 100M, cn, tw* +1. ![](https://www.google.com/s2/favicons?domain=https://bodyspace.bodybuilding.com/) [BodyBuilding (https://bodyspace.bodybuilding.com/)](https://bodyspace.bodybuilding.com/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://community.simplilearn.com) [community.simplilearn.com (https://community.simplilearn.com)](https://community.simplilearn.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://community.cbr.com) [Cbr (https://community.cbr.com)](https://community.cbr.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://ladies.zp.ua) [Ladies (http://ladies.zp.ua)](http://ladies.zp.ua)*: top 100M, forum, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://azovmore.dn.ua) [azovmore.dn.ua (http://azovmore.dn.ua)](http://azovmore.dn.ua)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://4x4.tomsk.ru) [4x4.tomsk.ru (http://4x4.tomsk.ru)](http://4x4.tomsk.ru)*: top 100M, auto, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mama.tomsk.ru/forums) [mama.tomsk.ru (https://mama.tomsk.ru/forums)](https://mama.tomsk.ru/forums)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.ixbt.com) [iXBT (https://forum.ixbt.com)](https://forum.ixbt.com)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://discourse.haskell.org) [discourse.haskell.org (https://discourse.haskell.org)](https://discourse.haskell.org)*: top 100M, coding, forum, za* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.sandisk.com) [forums.sandisk.com (https://forums.sandisk.com)](https://forums.sandisk.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://discourse.jupyter.org) [discourse.jupyter.org (https://discourse.jupyter.org)](https://discourse.jupyter.org)*: top 100M, forum, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.corsair.com) [CORSAIR (https://forum.corsair.com)](https://forum.corsair.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://club.cnews.ru/) [club.cnews.ru (https://club.cnews.ru/)](https://club.cnews.ru/)*: top 100M, blog, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.liverpoolfc.com) [LiverpoolFC (https://forums.liverpoolfc.com)](https://forums.liverpoolfc.com)*: top 100M, forum, za* +1. ![](https://www.google.com/s2/favicons?domain=https://club.doctissimo.fr) [doctissimo (https://club.doctissimo.fr)](https://club.doctissimo.fr)*: top 100M, fr* +1. ![](https://www.google.com/s2/favicons?domain=https://alabay.forum24.ru) [Alabay (https://alabay.forum24.ru)](https://alabay.forum24.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://jer.forum24.ru) [Jer.forum24.ru (http://jer.forum24.ru)](http://jer.forum24.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://kuban.forum24.ru/) [KubanForum24 (https://kuban.forum24.ru/)](https://kuban.forum24.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://uaksu.forum24.ru/) [Uaksu (https://uaksu.forum24.ru/)](https://uaksu.forum24.ru/)*: top 100M, forum, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://volkodavcaoko.forum24.ru) [Volkodavcaoko (https://volkodavcaoko.forum24.ru)](https://volkodavcaoko.forum24.ru)*: top 100M, forum, kz, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://microcap.forum24.ru) [microcap.forum24.ru (https://microcap.forum24.ru)](https://microcap.forum24.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://community.n8n.io/) [N8n Community (https://community.n8n.io/)](https://community.n8n.io/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.kali.org/) [Kali community (https://forums.kali.org/)](https://forums.kali.org/)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://volga-gaz.nnov.ru/forum) [volga-gaz.nnov.ru (http://volga-gaz.nnov.ru/forum)](http://volga-gaz.nnov.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://boards.straightdope.com) [boards.straightdope.com (https://boards.straightdope.com)](https://boards.straightdope.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.destructoid.com) [forums.destructoid.com (https://forums.destructoid.com)](https://forums.destructoid.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://start.me) [Start.me (https://start.me)](https://start.me)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://antihack.ucoz.net) [antihack.ucoz.net (http://antihack.ucoz.net)](http://antihack.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mirmuzyki.ucoz.net) [mirmuzyki.ucoz.net (http://mirmuzyki.ucoz.net)](http://mirmuzyki.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mistral.ucoz.net) [mistral.ucoz.net (http://mistral.ucoz.net)](http://mistral.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://medkniga.ucoz.net) [medkniga.ucoz.net (http://medkniga.ucoz.net)](http://medkniga.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pankreatitu.ucoz.net) [pankreatitu.ucoz.net (http://pankreatitu.ucoz.net)](http://pankreatitu.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ikorovka.ucoz.net) [ikorovka.ucoz.net (http://ikorovka.ucoz.net)](http://ikorovka.ucoz.net)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://rabotenka.ucoz.net) [rabotenka.ucoz.net (http://rabotenka.ucoz.net)](http://rabotenka.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://abc-accounting.ucoz.net) [abc-accounting.ucoz.net (http://abc-accounting.ucoz.net)](http://abc-accounting.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://rapbeat.ucoz.net) [rapbeat.ucoz.net (http://rapbeat.ucoz.net)](http://rapbeat.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://litgeroy.ucoz.net) [litgeroy.ucoz.net (http://litgeroy.ucoz.net)](http://litgeroy.ucoz.net)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://mediatv.ucoz.net) [mediatv.ucoz.net (http://mediatv.ucoz.net)](http://mediatv.ucoz.net)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://vega.ucoz.net) [vega.ucoz.net (http://vega.ucoz.net)](http://vega.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://iptv-free.ucoz.net) [iptv-free.ucoz.net (http://iptv-free.ucoz.net)](http://iptv-free.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vip-icq.ucoz.net) [vip-icq.ucoz.net (http://vip-icq.ucoz.net)](http://vip-icq.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xitlar.ucoz.net) [xitlar.ucoz.net (http://xitlar.ucoz.net)](http://xitlar.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://trays.ucoz.net) [trays.ucoz.net (http://trays.ucoz.net)](http://trays.ucoz.net)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://naruto-fan.ucoz.net) [naruto-fan.ucoz.net (http://naruto-fan.ucoz.net)](http://naruto-fan.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://shporgalki.ucoz.net) [shporgalki.ucoz.net (http://shporgalki.ucoz.net)](http://shporgalki.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://5level.ucoz.net) [5level.ucoz.net (http://5level.ucoz.net)](http://5level.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://azhack.ucoz.net) [azhack.ucoz.net (http://azhack.ucoz.net)](http://azhack.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://hevc-club.ucoz.net) [hevc-club.ucoz.net (http://hevc-club.ucoz.net)](http://hevc-club.ucoz.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forum4.ucoz.net) [forum4.ucoz.net (http://forum4.ucoz.net)](http://forum4.ucoz.net)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://profile.cheezburger.com) [Cheezburger (https://profile.cheezburger.com)](https://profile.cheezburger.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.majorgeeks.com) [forums.majorgeeks.com (https://forums.majorgeeks.com)](https://forums.majorgeeks.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://0k.clan.su) [0k.clan.su (http://0k.clan.su)](http://0k.clan.su)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://club-comedy.clan.su) [Club-comedy.clan.su (https://club-comedy.clan.su)](https://club-comedy.clan.su)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://fire-team.clan.su) [fire-team.clan.su (http://fire-team.clan.su)](http://fire-team.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://l2-best.clan.su) [l2-best.clan.su (http://l2-best.clan.su)](http://l2-best.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://warcraft3ft.clan.su) [warcraft3ft.clan.su (http://warcraft3ft.clan.su)](http://warcraft3ft.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://wowpaksi.clan.su) [wowpaksi.clan.su (http://wowpaksi.clan.su)](http://wowpaksi.clan.su)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://ilan.clan.su) [ilan.clan.su (http://ilan.clan.su)](http://ilan.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://shkolnikov.clan.su) [shkolnikov.clan.su (http://shkolnikov.clan.su)](http://shkolnikov.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://manuals.clan.su) [manuals.clan.su (http://manuals.clan.su)](http://manuals.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://app.clan.su) [app.clan.su (http://app.clan.su)](http://app.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://grigorovo.clan.su) [grigorovo.clan.su (http://grigorovo.clan.su)](http://grigorovo.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mariupol4x4.clan.su) [mariupol4x4.clan.su (http://mariupol4x4.clan.su)](http://mariupol4x4.clan.su)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://necromancers.clan.su) [necromancers.clan.su (http://necromancers.clan.su)](http://necromancers.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://komarovo.clan.su) [komarovo.clan.su (http://komarovo.clan.su)](http://komarovo.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kino-hit.clan.su) [kino-hit.clan.su (http://kino-hit.clan.su)](http://kino-hit.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://gsm-standart.clan.su) [gsm-standart.clan.su (http://gsm-standart.clan.su)](http://gsm-standart.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://fareast.clan.su) [fareast.clan.su (http://fareast.clan.su)](http://fareast.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://cybers.clan.su) [cybers.clan.su (http://cybers.clan.su)](http://cybers.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://nod32-forever.clan.su) [nod32-forever.clan.su (http://nod32-forever.clan.su)](http://nod32-forever.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://obmanunet.clan.su) [obmanunet.clan.su (http://obmanunet.clan.su)](http://obmanunet.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://spygaming.clan.su) [spygaming.clan.su (http://spygaming.clan.su)](http://spygaming.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://japara.clan.su) [japara.clan.su (http://japara.clan.su)](http://japara.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://symbian9.clan.su) [symbian9.clan.su (http://symbian9.clan.su)](http://symbian9.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://love-magic.clan.su) [love-magic.clan.su (http://love-magic.clan.su)](http://love-magic.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vip-cccp.clan.su) [vip-cccp.clan.su (http://vip-cccp.clan.su)](http://vip-cccp.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://tvigra.clan.su) [tvigra.clan.su (http://tvigra.clan.su)](http://tvigra.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://music2dj.clan.su) [music2dj.clan.su (http://music2dj.clan.su)](http://music2dj.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://margaritas.clan.su) [margaritas.clan.su (http://margaritas.clan.su)](http://margaritas.clan.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://community.getpostman.com) [community.getpostman.com (https://community.getpostman.com)](https://community.getpostman.com)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=http://www.rt20.getbb.ru) [rt20.getbb.ru (http://www.rt20.getbb.ru)](http://www.rt20.getbb.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.rt21.getbb.ru) [rt21.getbb.ru (http://www.rt21.getbb.ru)](http://www.rt21.getbb.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.steinberg.net) [forums.steinberg.net (https://forums.steinberg.net)](https://forums.steinberg.net)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://av.3dn.ru) [av.3dn.ru (http://av.3dn.ru)](http://av.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ekzoticsad.3dn.ru) [ekzoticsad.3dn.ru (http://ekzoticsad.3dn.ru)](http://ekzoticsad.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://jog.3dn.ru) [jog.3dn.ru (http://jog.3dn.ru)](http://jog.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://salavat.3dn.ru) [salavat.3dn.ru (http://salavat.3dn.ru)](http://salavat.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://socforum.3dn.ru) [socforum.3dn.ru (http://socforum.3dn.ru)](http://socforum.3dn.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://soft-wm.3dn.ru) [soft-wm.3dn.ru (http://soft-wm.3dn.ru)](http://soft-wm.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://warframe.3dn.ru) [warframe.3dn.ru (http://warframe.3dn.ru)](http://warframe.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://websecurity.3dn.ru) [websecurity.3dn.ru (http://websecurity.3dn.ru)](http://websecurity.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://1klas.3dn.ru) [1klas.3dn.ru (http://1klas.3dn.ru)](http://1klas.3dn.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://mytrans.3dn.ru) [mytrans.3dn.ru (http://mytrans.3dn.ru)](http://mytrans.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vracing.3dn.ru) [vracing.3dn.ru (http://vracing.3dn.ru)](http://vracing.3dn.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://team-pros.3dn.ru) [team-pros.3dn.ru (http://team-pros.3dn.ru)](http://team-pros.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sherwood.3dn.ru) [sherwood.3dn.ru (http://sherwood.3dn.ru)](http://sherwood.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://christian-video.3dn.ru) [christian-video.3dn.ru (http://christian-video.3dn.ru)](http://christian-video.3dn.ru)*: top 100M, movies, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://haogan.3dn.ru) [haogan.3dn.ru (http://haogan.3dn.ru)](http://haogan.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://muzika.3dn.ru) [muzika.3dn.ru (http://muzika.3dn.ru)](http://muzika.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://golasa-vk-free.3dn.ru) [golasa-vk-free.3dn.ru (http://golasa-vk-free.3dn.ru)](http://golasa-vk-free.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://440101.3dn.ru) [440101.3dn.ru (http://440101.3dn.ru)](http://440101.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://online-movies.3dn.ru) [online-movies.3dn.ru (http://online-movies.3dn.ru)](http://online-movies.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://lock.3dn.ru) [lock.3dn.ru (http://lock.3dn.ru)](http://lock.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vch3469.3dn.ru) [vch3469.3dn.ru (http://vch3469.3dn.ru)](http://vch3469.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://tmk.3dn.ru) [tmk.3dn.ru (http://tmk.3dn.ru)](http://tmk.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://gt-garazh.3dn.ru) [gt-garazh.3dn.ru (http://gt-garazh.3dn.ru)](http://gt-garazh.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://partner.3dn.ru) [partner.3dn.ru (http://partner.3dn.ru)](http://partner.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sony127.3dn.ru) [sony127.3dn.ru (http://sony127.3dn.ru)](http://sony127.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://metroman.3dn.ru) [metroman.3dn.ru (http://metroman.3dn.ru)](http://metroman.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://karkulis.3dn.ru) [karkulis.3dn.ru (http://karkulis.3dn.ru)](http://karkulis.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ibmt.3dn.ru) [ibmt.3dn.ru (http://ibmt.3dn.ru)](http://ibmt.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://baltnethub.3dn.ru) [baltnethub.3dn.ru (http://baltnethub.3dn.ru)](http://baltnethub.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://9interi.3dn.ru) [9interi.3dn.ru (http://9interi.3dn.ru)](http://9interi.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://webdom.3dn.ru) [webdom.3dn.ru (http://webdom.3dn.ru)](http://webdom.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://softgame.3dn.ru) [softgame.3dn.ru (http://softgame.3dn.ru)](http://softgame.3dn.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://sayty.3dn.ru) [sayty.3dn.ru (http://sayty.3dn.ru)](http://sayty.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://binhot.3dn.ru) [binhot.3dn.ru (http://binhot.3dn.ru)](http://binhot.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://nicemusic.3dn.ru) [nicemusic.3dn.ru (http://nicemusic.3dn.ru)](http://nicemusic.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dvk-style.3dn.ru) [dvk-style.3dn.ru (http://dvk-style.3dn.ru)](http://dvk-style.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://razborka-japan.3dn.ru) [razborka-japan.3dn.ru (http://razborka-japan.3dn.ru)](http://razborka-japan.3dn.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://jump.3dn.ru) [jump.3dn.ru (http://jump.3dn.ru)](http://jump.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://prosmart.3dn.ru) [prosmart.3dn.ru (http://prosmart.3dn.ru)](http://prosmart.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://patent.3dn.ru) [patent.3dn.ru (http://patent.3dn.ru)](http://patent.3dn.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://tgi.3dn.ru) [tgi.3dn.ru (http://tgi.3dn.ru)](http://tgi.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ourfunnypets.3dn.ru) [ourfunnypets.3dn.ru (http://ourfunnypets.3dn.ru)](http://ourfunnypets.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://focus-pocus.3dn.ru) [focus-pocus.3dn.ru (http://focus-pocus.3dn.ru)](http://focus-pocus.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://resource-mta.3dn.ru) [resource-mta.3dn.ru (http://resource-mta.3dn.ru)](http://resource-mta.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://softal.3dn.ru) [softal.3dn.ru (http://softal.3dn.ru)](http://softal.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://shkola3.3dn.ru) [shkola3.3dn.ru (http://shkola3.3dn.ru)](http://shkola3.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://grodnofish.3dn.ru) [grodnofish.3dn.ru (http://grodnofish.3dn.ru)](http://grodnofish.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://viupetra.3dn.ru) [viupetra.3dn.ru (http://viupetra.3dn.ru)](http://viupetra.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://portal-cs-1-6.3dn.ru) [portal-cs-1-6.3dn.ru (http://portal-cs-1-6.3dn.ru)](http://portal-cs-1-6.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://wmmail-wmmail.3dn.ru) [wmmail-wmmail.3dn.ru (http://wmmail-wmmail.3dn.ru)](http://wmmail-wmmail.3dn.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://en.aptoide.com/) [Aptoide (https://en.aptoide.com/)](https://en.aptoide.com/)*: top 100M, apps* +1. ![](https://www.google.com/s2/favicons?domain=https://rodgersforum.borda.ru) [Rodgersforum (https://rodgersforum.borda.ru)](https://rodgersforum.borda.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://starsonice.borda.ru) [Starsonice (https://starsonice.borda.ru)](https://starsonice.borda.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://terminatorium.borda.ru/) [Terminatorium (https://terminatorium.borda.ru/)](https://terminatorium.borda.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://liza.my1.ru) [liza.my1.ru (http://liza.my1.ru)](http://liza.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://movi.my1.ru) [movi.my1.ru (http://movi.my1.ru)](http://movi.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://morozovka.my1.ru) [morozovka.my1.ru (http://morozovka.my1.ru)](http://morozovka.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://letitbit-film.my1.ru) [letitbit-film.my1.ru (http://letitbit-film.my1.ru)](http://letitbit-film.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://electroprom.my1.ru) [electroprom.my1.ru (http://electroprom.my1.ru)](http://electroprom.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zareshetkoi.my1.ru) [zareshetkoi.my1.ru (http://zareshetkoi.my1.ru)](http://zareshetkoi.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://liderdzr.my1.ru) [liderdzr.my1.ru (http://liderdzr.my1.ru)](http://liderdzr.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kotik.my1.ru) [kotik.my1.ru (http://kotik.my1.ru)](http://kotik.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://crossfaernet.my1.ru) [crossfaernet.my1.ru (http://crossfaernet.my1.ru)](http://crossfaernet.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://videhelp-comp.my1.ru) [videhelp-comp.my1.ru (http://videhelp-comp.my1.ru)](http://videhelp-comp.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://novomoskovsk.my1.ru) [novomoskovsk.my1.ru (http://novomoskovsk.my1.ru)](http://novomoskovsk.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://music-one.my1.ru) [music-one.my1.ru (http://music-one.my1.ru)](http://music-one.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://coins.my1.ru) [coins.my1.ru (http://coins.my1.ru)](http://coins.my1.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://tsibulskiy.my1.ru) [tsibulskiy.my1.ru (http://tsibulskiy.my1.ru)](http://tsibulskiy.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://theatre.my1.ru) [theatre.my1.ru (http://theatre.my1.ru)](http://theatre.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://wwork.my1.ru) [wwork.my1.ru (http://wwork.my1.ru)](http://wwork.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://fly.my1.ru) [fly.my1.ru (http://fly.my1.ru)](http://fly.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://animelend.my1.ru) [animelend.my1.ru (http://animelend.my1.ru)](http://animelend.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://art-nata.my1.ru) [art-nata.my1.ru (http://art-nata.my1.ru)](http://art-nata.my1.ru)*: top 100M, kz* +1. ![](https://www.google.com/s2/favicons?domain=http://vsemobile.my1.ru) [vsemobile.my1.ru (http://vsemobile.my1.ru)](http://vsemobile.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://art-color.my1.ru) [art-color.my1.ru (http://art-color.my1.ru)](http://art-color.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://histroom.my1.ru) [histroom.my1.ru (http://histroom.my1.ru)](http://histroom.my1.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.snapcraft.io) [forum.snapcraft.io (https://forum.snapcraft.io)](https://forum.snapcraft.io)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://asecurity.do.am) [asecurity.do.am (http://asecurity.do.am)](http://asecurity.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dremel.do.am) [dremel.do.am (http://dremel.do.am)](http://dremel.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forex-trader.do.am) [forex-trader.do.am (http://forex-trader.do.am)](http://forex-trader.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ooo.do.am) [ooo.do.am (http://ooo.do.am)](http://ooo.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://puru.do.am) [puru.do.am (http://puru.do.am)](http://puru.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://78-3.do.am) [78-3.do.am (http://78-3.do.am)](http://78-3.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://yerkramas.do.am) [yerkramas.do.am (http://yerkramas.do.am)](http://yerkramas.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://russemya.do.am) [russemya.do.am (http://russemya.do.am)](http://russemya.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kapusta.do.am) [kapusta.do.am (http://kapusta.do.am)](http://kapusta.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://marchenkov.do.am) [marchenkov.do.am (http://marchenkov.do.am)](http://marchenkov.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://fst-kolos.do.am) [fst-kolos.do.am (http://fst-kolos.do.am)](http://fst-kolos.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://tom.do.am) [tom.do.am (http://tom.do.am)](http://tom.do.am)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://blogs.klerk.ru) [blogs.klerk.ru (https://blogs.klerk.ru)](https://blogs.klerk.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mycomputer.ks.ua) [mycomputer.ks.ua (http://mycomputer.ks.ua)](http://mycomputer.ks.ua)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://andrei.moy.su) [andrei.moy.su (http://andrei.moy.su)](http://andrei.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://antivirus.moy.su) [antivirus.moy.su (http://antivirus.moy.su)](http://antivirus.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://atm-club.moy.su) [atm-club.moy.su (http://atm-club.moy.su)](http://atm-club.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://infopps.moy.su) [infopps.moy.su (http://infopps.moy.su)](http://infopps.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://moskovia.moy.su) [moskovia.moy.su (http://moskovia.moy.su)](http://moskovia.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zid.moy.su) [zid.moy.su (http://zid.moy.su)](http://zid.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://prodigy.moy.su) [prodigy.moy.su (http://prodigy.moy.su)](http://prodigy.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://icq-bot.moy.su) [icq-bot.moy.su (http://icq-bot.moy.su)](http://icq-bot.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://96.moy.su) [96.moy.su (http://96.moy.su)](http://96.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://semenova-klass.moy.su) [semenova-klass.moy.su (http://semenova-klass.moy.su)](http://semenova-klass.moy.su)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://gadjet.moy.su) [gadjet.moy.su (http://gadjet.moy.su)](http://gadjet.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dushschool.moy.su) [dushschool.moy.su (http://dushschool.moy.su)](http://dushschool.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://school1065.moy.su) [school1065.moy.su (http://school1065.moy.su)](http://school1065.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://anime-grand.moy.su) [anime-grand.moy.su (http://anime-grand.moy.su)](http://anime-grand.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://school9korolev.moy.su) [school9korolev.moy.su (http://school9korolev.moy.su)](http://school9korolev.moy.su)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://futajist-studio.moy.su) [futajist-studio.moy.su (http://futajist-studio.moy.su)](http://futajist-studio.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://schoolteacher.moy.su) [schoolteacher.moy.su (http://schoolteacher.moy.su)](http://schoolteacher.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xyuivet-mailcpy.moy.su) [xyuivet-mailcpy.moy.su (http://xyuivet-mailcpy.moy.su)](http://xyuivet-mailcpy.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dubrovo.moy.su) [dubrovo.moy.su (http://dubrovo.moy.su)](http://dubrovo.moy.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://api.niftygateway.com) [Niftygateway (https://api.niftygateway.com)](https://api.niftygateway.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forums.bulbagarden.net) [forums.bulbagarden.net (http://forums.bulbagarden.net)](http://forums.bulbagarden.net)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://fifaforums.easports.com/) [FIFA FORUMS (https://fifaforums.easports.com/)](https://fifaforums.easports.com/)*: top 100M, forum, gb* +1. ![](https://www.google.com/s2/favicons?domain=https://community.waveapps.com) [Waveapps (https://community.waveapps.com)](https://community.waveapps.com)*: top 100M, ca*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.blu-ray.com/) [Blu-ray (https://forum.blu-ray.com/)](https://forum.blu-ray.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://hunting.karelia.ru) [hunting.karelia.ru (http://hunting.karelia.ru)](http://hunting.karelia.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://discourse.pi-hole.net) [DiscoursePi-hole (https://discourse.pi-hole.net)](https://discourse.pi-hole.net)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://dimitrov.ucoz.ua) [dimitrov.ucoz.ua (http://dimitrov.ucoz.ua)](http://dimitrov.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://2el5.ucoz.ua) [2el5.ucoz.ua (http://2el5.ucoz.ua)](http://2el5.ucoz.ua)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://zp-mama.ucoz.ua) [zp-mama.ucoz.ua (http://zp-mama.ucoz.ua)](http://zp-mama.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://killer.ucoz.ua) [killer.ucoz.ua (http://killer.ucoz.ua)](http://killer.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://myfootball-1.ucoz.ua) [myfootball-1.ucoz.ua (http://myfootball-1.ucoz.ua)](http://myfootball-1.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://velozone.ucoz.ua) [velozone.ucoz.ua (http://velozone.ucoz.ua)](http://velozone.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://goroskop.ucoz.ua) [goroskop.ucoz.ua (http://goroskop.ucoz.ua)](http://goroskop.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://elektron.ucoz.ua) [elektron.ucoz.ua (http://elektron.ucoz.ua)](http://elektron.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mistoodesa.ucoz.ua) [mistoodesa.ucoz.ua (http://mistoodesa.ucoz.ua)](http://mistoodesa.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://smart-phone.ucoz.ua) [smart-phone.ucoz.ua (http://smart-phone.ucoz.ua)](http://smart-phone.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://staroverovka.ucoz.ua) [staroverovka.ucoz.ua (http://staroverovka.ucoz.ua)](http://staroverovka.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://simf-mama.ucoz.ua) [simf-mama.ucoz.ua (http://simf-mama.ucoz.ua)](http://simf-mama.ucoz.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://gribnikikybani.mybb.ru) [Gribnikikybani (http://gribnikikybani.mybb.ru)](http://gribnikikybani.mybb.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://waytothelight.mybb.ru/) [Waytothelight (https://waytothelight.mybb.ru/)](https://waytothelight.mybb.ru/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://users.scala-lang.org) [Scala-lang (https://users.scala-lang.org)](https://users.scala-lang.org)*: top 100M, coding, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.shotcut.org) [forum.shotcut.org (https://forum.shotcut.org)](https://forum.shotcut.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://support.advancedcustomfields.com/) [AdvancedCustomFields (https://support.advancedcustomfields.com/)](https://support.advancedcustomfields.com/)*: top 100M, au* +1. ![](https://www.google.com/s2/favicons?domain=https://community.asterisk.org) [community.asterisk.org (https://community.asterisk.org)](https://community.asterisk.org)*: top 100M, forum, ir, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://community.screwfix.com) [Screwfix (https://community.screwfix.com)](https://community.screwfix.com)*: top 100M, forum, gb* +1. ![](https://www.google.com/s2/favicons?domain=https://network.informatica.com) [NetworkInformatica (https://network.informatica.com)](https://network.informatica.com)*: top 100M, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.bikeradar.com) [BikeRadar (https://forum.bikeradar.com)](https://forum.bikeradar.com)*: top 100M, forum, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://id.pr-cy.ru) [PRCY (https://id.pr-cy.ru)](https://id.pr-cy.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.catholic.com) [catholic (https://forums.catholic.com)](https://forums.catholic.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.infosecinstitute.com) [InfosecInstitute (https://community.infosecinstitute.com)](https://community.infosecinstitute.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.guns.ru/) [Guns.ru (https://forum.guns.ru/)](https://forum.guns.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://cs-ru.ucoz.org) [cs-ru.ucoz.org (http://cs-ru.ucoz.org)](http://cs-ru.ucoz.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://w2l-g.ucoz.org) [w2l-g.ucoz.org (http://w2l-g.ucoz.org)](http://w2l-g.ucoz.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ruslangxp.ucoz.org) [ruslangxp.ucoz.org (http://ruslangxp.ucoz.org)](http://ruslangxp.ucoz.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://soundfactory.ucoz.org) [soundfactory.ucoz.org (http://soundfactory.ucoz.org)](http://soundfactory.ucoz.org)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://pmpkbirsk.ucoz.org) [pmpkbirsk.ucoz.org (http://pmpkbirsk.ucoz.org)](http://pmpkbirsk.ucoz.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.visual-paradigm.com) [forums.visual-paradigm.com (https://forums.visual-paradigm.com)](https://forums.visual-paradigm.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.battlefield.com) [forums.battlefield.com (https://forums.battlefield.com)](https://forums.battlefield.com)*: top 100M, forum, gaming, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://lib.rus.ec) [Librusec (https://lib.rus.ec)](https://lib.rus.ec)*: top 100M, br, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://social.tchncs.de/) [social.tchncs.de (https://social.tchncs.de/)](https://social.tchncs.de/)*: top 100M, de* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.alliedmods.net/) [alliedmods (https://forums.alliedmods.net/)](https://forums.alliedmods.net/)*: top 100M, forum, gb, jp, tr, uz*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.gamerevolution.com) [GameRevolution (https://forums.gamerevolution.com)](https://forums.gamerevolution.com)*: top 100M, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://ru.pathofexile.com) [Pathofexile (https://ru.pathofexile.com)](https://ru.pathofexile.com)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://boards.theforce.net) [boards.theforce.net (https://boards.theforce.net)](https://boards.theforce.net)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.justlanded.com) [Justlanded (https://community.justlanded.com)](https://community.justlanded.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.igromania.ru/) [igromania (http://forum.igromania.ru/)](http://forum.igromania.ru/)*: top 100M, forum, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.lingvolive.com) [Lingvolive (http://forum.lingvolive.com)](http://forum.lingvolive.com)*: top 100M, de, forum, it, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.overclockers.co.uk) [forums.overclockers.co.uk (https://forums.overclockers.co.uk)](https://forums.overclockers.co.uk)*: top 100M, forum, gb, uk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.sphero.com) [community.sphero.com (https://community.sphero.com)](https://community.sphero.com)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.eksmo.ru) [forum.eksmo.ru (http://forum.eksmo.ru)](http://forum.eksmo.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.digitalpoint.com/) [forums.digitalpoint.com (https://forums.digitalpoint.com/)](https://forums.digitalpoint.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://tuna.voicemod.net/) [Tuna (https://tuna.voicemod.net/)](https://tuna.voicemod.net/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://discourse.saylor.org) [discourse.saylor.org (https://discourse.saylor.org)](https://discourse.saylor.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://archive.storycorps.org) [Storycorps (https://archive.storycorps.org)](https://archive.storycorps.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.serebii.net) [forums.serebii.net (https://forums.serebii.net)](https://forums.serebii.net)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.zorin.com) [forum.zorin.com (https://forum.zorin.com)](https://forum.zorin.com)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.heroesworld.ru) [forum.heroesworld.ru (https://forum.heroesworld.ru)](https://forum.heroesworld.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.terraria.org/index.php) [Terraria Forums (https://forums.terraria.org/index.php)](https://forums.terraria.org/index.php)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://community.smartthings.com) [community.smartthings.com (https://community.smartthings.com)](https://community.smartthings.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.golfmonthly.com) [forums.golfmonthly.com (https://forums.golfmonthly.com)](https://forums.golfmonthly.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.palemoon.org) [forum.palemoon.org (https://forum.palemoon.org)](https://forum.palemoon.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.notebookreview.com) [NotebookReview (http://forum.notebookreview.com)](http://forum.notebookreview.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://pubg.op.gg) [OP.GG [PUBG] (https://pubg.op.gg)](https://pubg.op.gg)*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://valorant.op.gg) [OP.GG [Valorant] (https://valorant.op.gg)](https://valorant.op.gg)*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.inventables.com) [discuss.inventables.com (https://discuss.inventables.com)](https://discuss.inventables.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.sonicretro.org) [forums.sonicretro.org (https://forums.sonicretro.org)](https://forums.sonicretro.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.scummvm.org) [forums.scummvm.org (https://forums.scummvm.org)](https://forums.scummvm.org)*: top 100M, au, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://povarenok.nov.ru) [povarenok.nov.ru (http://povarenok.nov.ru)](http://povarenok.nov.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.prosportsdaily.com) [prosportsdaily (https://forums.prosportsdaily.com)](https://forums.prosportsdaily.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://moscow.flamp.ru/) [MoscowFlamp (https://moscow.flamp.ru/)](https://moscow.flamp.ru/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.nameberry.com) [forum.nameberry.com (https://forum.nameberry.com)](https://forum.nameberry.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.finance.ua) [forum.finance.ua (https://forum.finance.ua)](https://forum.finance.ua)*: top 100M, forum, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.ykt.ru) [forum.ykt.ru (https://forum.ykt.ru)](https://forum.ykt.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://community.nxp.com) [Nxp (https://community.nxp.com)](https://community.nxp.com)*: top 100M, be* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.ignitioncasino.eu) [forum.ignitioncasino.eu (https://forum.ignitioncasino.eu)](https://forum.ignitioncasino.eu)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://community.alexgyver.ru) [Alexgyver (https://community.alexgyver.ru)](https://community.alexgyver.ru)*: top 100M, de, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.esetnod32.ru) [ESET (https://forum.esetnod32.ru)](https://forum.esetnod32.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://blog.7ya.ru) [7ya (https://blog.7ya.ru)](https://blog.7ya.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://club.7ya.ru) [club.7ya.ru (https://club.7ya.ru)](https://club.7ya.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.stevehoffman.tv) [forums.stevehoffman.tv (https://forums.stevehoffman.tv)](https://forums.stevehoffman.tv)*: top 100M, forum, us*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://talk.drugabuse.com) [TalkDrugabuse (https://talk.drugabuse.com)](https://talk.drugabuse.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.goha.ru) [goha (https://forums.goha.ru)](https://forums.goha.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=insanejournal.com) [Insanejournal (insanejournal.com)](insanejournal.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://ru.bookmate.com) [Bookmate (https://ru.bookmate.com)](https://ru.bookmate.com)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.startupnation.com) [community.startupnation.com (https://community.startupnation.com)](https://community.startupnation.com)*: top 100M, business* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.operationsports.com) [operationsports (https://forums.operationsports.com)](https://forums.operationsports.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.mageia.org/en) [forums.mageia.org (https://forums.mageia.org/en)](https://forums.mageia.org/en)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.funcom.com) [funcom (https://forums.funcom.com)](https://forums.funcom.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://site.gipsyteam.ru/) [GipsysTeam (https://site.gipsyteam.ru/)](https://site.gipsyteam.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.mapillary.com) [Mapillary Forum (https://forum.mapillary.com)](https://forum.mapillary.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.krstarica.com) [Krstarica (https://forum.krstarica.com)](https://forum.krstarica.com)*: top 100M, at, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.awd.ru) [awd.ru (https://forum.awd.ru)](https://forum.awd.ru)*: top 100M, forum, ru, travel* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.whonix.org/) [Whonix Forum (https://forums.whonix.org/)](https://forums.whonix.org/)*: top 100M, forum, ir, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.indiegala.com) [forums.indiegala.com (https://forums.indiegala.com)](https://forums.indiegala.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://board.phpbuilder.com) [board.phpbuilder.com (https://board.phpbuilder.com)](https://board.phpbuilder.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://profiles.tigweb.org) [ProfilesTigweb (https://profiles.tigweb.org)](https://profiles.tigweb.org)*: top 100M, ca, pk* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.shiftdelete.net) [ShiftDelete (https://forum.shiftdelete.net)](https://forum.shiftdelete.net)*: top 100M, forum, tr*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.infura.io) [Infura (https://community.infura.io)](https://community.infura.io)*: top 100M, forum, kr*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://talk.sleepapnea.org) [talk.sleepapnea.org (https://talk.sleepapnea.org)](https://talk.sleepapnea.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://bjapi.afreecatv.com) [AfreecaTV (http://bjapi.afreecatv.com)](http://bjapi.afreecatv.com)*: top 100M, streaming* +1. ![](https://www.google.com/s2/favicons?domain=http://club.passion.ru) [club.passion.ru (http://club.passion.ru)](http://club.passion.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.afterellen.com) [Afterellen (https://forums.afterellen.com)](https://forums.afterellen.com)*: top 100M, forum, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.mxlinux.org) [forum.mxlinux.org (https://forum.mxlinux.org)](https://forum.mxlinux.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.podolsk.ru) [podolsk (https://forum.podolsk.ru)](https://forum.podolsk.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://community.sweatco.in) [community.sweatco.in (https://community.sweatco.in)](https://community.sweatco.in)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.rasa.com) [Rasa (https://forum.rasa.com)](https://forum.rasa.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forums.wrestlezone.com/) [forums.wrestlezone.com (http://forums.wrestlezone.com/)](http://forums.wrestlezone.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.web.ru) [forum.web.ru (https://forum.web.ru)](https://forum.web.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.myjane.ru/) [Myjane (http://forum.myjane.ru/)](http://forum.myjane.ru/)*: top 100M, bg, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.scssoft.com) [forum.scssoft.com (https://forum.scssoft.com)](https://forum.scssoft.com)*: top 100M, de, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forums.railfan.net) [Railfan (http://forums.railfan.net)](http://forums.railfan.net)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.ubuntu-it.org) [forum.ubuntu-it.org (https://forum.ubuntu-it.org)](https://forum.ubuntu-it.org)*: top 100M, ch, forum, it* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.endeavouros.com) [forum.endeavouros.com (https://forum.endeavouros.com)](https://forum.endeavouros.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.newlcn.com) [forum.newlcn.com (http://forum.newlcn.com)](http://forum.newlcn.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://discussion.squadhelp.com) [discussion.squadhelp.com (https://discussion.squadhelp.com)](https://discussion.squadhelp.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.flarum.org) [discuss.flarum.org (https://discuss.flarum.org)](https://discuss.flarum.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.mirf.ru/) [mirf (https://forum.mirf.ru/)](https://forum.mirf.ru/)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://kpyto.pp.net.ua) [kpyto.pp.net.ua (http://kpyto.pp.net.ua)](http://kpyto.pp.net.ua)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://samsungmobile.pp.net.ua) [samsungmobile.pp.net.ua (http://samsungmobile.pp.net.ua)](http://samsungmobile.pp.net.ua)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://skillsprofile.skillbuilder.aws) [AWS Skills Profile (https://skillsprofile.skillbuilder.aws)](https://skillsprofile.skillbuilder.aws)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.openframeworks.cc) [openframeworks (https://forum.openframeworks.cc)](https://forum.openframeworks.cc)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.futbin.com) [FUTBIN (https://forums.futbin.com)](https://forums.futbin.com)*: top 100M, de, forum, gaming, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.funny-games.biz) [funny-games.biz (https://forums.funny-games.biz)](https://forums.funny-games.biz)*: top 100M, forum, lt*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://support.ilovegrowingmarijuana.com) [support.ilovegrowingmarijuana.com (https://support.ilovegrowingmarijuana.com)](https://support.ilovegrowingmarijuana.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.tks.ru/) [tks (https://forum.tks.ru/)](https://forum.tks.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.collectors.com) [collectors.com (https://forums.collectors.com)](https://forums.collectors.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://archive.transformativeworks.org) [archive.transformativeworks.org (https://archive.transformativeworks.org)](https://archive.transformativeworks.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sexforum.ixbb.ru) [SexforumIXBB (http://sexforum.ixbb.ru)](http://sexforum.ixbb.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.astralinux.ru) [Astralinux (https://forum.astralinux.ru)](https://forum.astralinux.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://world.kano.me/) [KanoWorld (https://world.kano.me/)](https://world.kano.me/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://home.omg.lol) [Omg.lol (https://home.omg.lol)](https://home.omg.lol)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.cxem.net/) [forum.cxem.net (https://forum.cxem.net/)](https://forum.cxem.net/)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.rzn.info) [forum.rzn.info (https://forum.rzn.info)](https://forum.rzn.info)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.spyderco.com) [forum.spyderco.com (https://forum.spyderco.com)](https://forum.spyderco.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.garudalinux.org) [forum.garudalinux.org (https://forum.garudalinux.org)](https://forum.garudalinux.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.beyond3d.com) [beyond3d (https://forum.beyond3d.com)](https://forum.beyond3d.com)*: top 100M, forum, pk, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.zooclub.ru) [forums.zooclub.ru (https://forums.zooclub.ru)](https://forums.zooclub.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.pressball.by) [forum.pressball.by (https://forum.pressball.by)](https://forum.pressball.by)*: top 100M, by, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://sa-mp.ucoz.de) [sa-mp.ucoz.de (http://sa-mp.ucoz.de)](http://sa-mp.ucoz.de)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://forums.vkmonline.com) [VKMOnline (http://forums.vkmonline.com)](http://forums.vkmonline.com)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://are.kamrbb.ru) [AreKamrbb (https://are.kamrbb.ru)](https://are.kamrbb.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://hyundaitruckclub.kamrbb.ru) [Hyundaitruckclub (https://hyundaitruckclub.kamrbb.ru)](https://hyundaitruckclub.kamrbb.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.hochu.ua) [hochu (http://forum.hochu.ua)](http://forum.hochu.ua)*: top 100M, forum, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.kineshemec.ru) [forum.kineshemec.ru (http://forum.kineshemec.ru)](http://forum.kineshemec.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.p2pu.org) [community.p2pu.org (https://community.p2pu.org)](https://community.p2pu.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.vitalfootball.co.uk) [VitalFootball (https://forums.vitalfootball.co.uk)](https://forums.vitalfootball.co.uk)*: top 100M, forum, gb, pk* +1. ![](https://www.google.com/s2/favicons?domain=https://doublecmd.h1n.ru) [doublecmd.h1n.ru (https://doublecmd.h1n.ru)](https://doublecmd.h1n.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.quartertothree.com) [Quartertothree (https://forum.quartertothree.com)](https://forum.quartertothree.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://app.samsungfood.com) [app.samsungfood.com (https://app.samsungfood.com)](https://app.samsungfood.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.artinvestment.ru/) [artinvestment (https://forum.artinvestment.ru/)](https://forum.artinvestment.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.tauck.com) [ForumTauck (https://forums.tauck.com)](https://forums.tauck.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://ptvintern.picarto.tv) [Picarto (https://ptvintern.picarto.tv)](https://ptvintern.picarto.tv)*: top 100M, art, streaming* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.popjustice.com) [popjustice (https://forum.popjustice.com)](https://forum.popjustice.com)*: top 100M, co, forum, sg*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.amperka.ru) [Amperka (http://forum.amperka.ru)](http://forum.amperka.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://nl.pepper.com/) [Pepper NL (https://nl.pepper.com/)](https://nl.pepper.com/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dpils-scooter.ucoz.lv) [dpils-scooter.ucoz.lv (http://dpils-scooter.ucoz.lv)](http://dpils-scooter.ucoz.lv)*: top 100M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://sokal.ucoz.lv) [sokal.ucoz.lv (http://sokal.ucoz.lv)](http://sokal.ucoz.lv)*: top 100M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.rmnt.ru) [forum.rmnt.ru (https://forum.rmnt.ru)](https://forum.rmnt.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.mt5.com) [mt5 (https://forum.mt5.com)](https://forum.mt5.com)*: top 100M, forum, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://dasauge.co.uk) [Dasauge (https://dasauge.co.uk)](https://dasauge.co.uk)*: top 100M, de, pk* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.footballindex.co.uk) [footballindex (https://forums.footballindex.co.uk)](https://forums.footballindex.co.uk)*: top 100M, forum, gb, sg*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.thewholesaleforums.co.uk/) [thewholesaleforums.co.uk (http://www.thewholesaleforums.co.uk/)](http://www.thewholesaleforums.co.uk/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.sibmama.ru/) [sibmama (https://forum.sibmama.ru/)](https://forum.sibmama.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.mfd.ru) [mfd (http://forum.mfd.ru)](http://forum.mfd.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://username.contactin.bio) [ContactInBio (domain) (http://username.contactin.bio)](http://username.contactin.bio)*: top 100M, links* +1. ![](https://www.google.com/s2/favicons?domain=http://forums.riftgame.com) [Riftgame (http://forums.riftgame.com)](http://forums.riftgame.com)*: top 100M, cr, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.juce.com) [juce (https://forum.juce.com)](https://forum.juce.com)*: top 100M, ca, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.arjlover.net) [forum.arjlover.net (http://forum.arjlover.net)](http://forum.arjlover.net)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.antichat.ru/) [Antichat (https://forum.antichat.ru/)](https://forum.antichat.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://id.dev.by) [Dev.by (https://id.dev.by)](https://id.dev.by)*: top 100M, by, news, tech*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.gong.bg) [forum.gong.bg (https://forum.gong.bg)](https://forum.gong.bg)*: top 100M, bg, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.velomania.ru/) [Velomania (https://forum.velomania.ru/)](https://forum.velomania.ru/)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://bbs.evony.com) [bbs.evony.com (http://bbs.evony.com)](http://bbs.evony.com)*: top 100M, forum, pk, tr*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.vectric.com) [forum.vectric.com (https://forum.vectric.com)](https://forum.vectric.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.bratsk.org) [Bratsk Forum (http://forum.bratsk.org)](http://forum.bratsk.org)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.runnersworld.co.uk/) [Runnersworld (https://forums.runnersworld.co.uk/)](https://forums.runnersworld.co.uk/)*: top 100M, forum, sport*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.qwas.ru) [Qwas (http://forum.qwas.ru)](http://forum.qwas.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://addons.wago.io/) [Addons.wago (https://addons.wago.io/)](https://addons.wago.io/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.eagle.ru) [forums.eagle.ru (https://forums.eagle.ru)](https://forums.eagle.ru)*: top 100M, ca, forum, gaming, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.clearlinux.org) [community.clearlinux.org (https://community.clearlinux.org)](https://community.clearlinux.org)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.motorka.org) [Motorka (https://forum.motorka.org)](https://forum.motorka.org)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://ramta.0pk.ru) [Ramta (http://ramta.0pk.ru)](http://ramta.0pk.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.bluemoon-mcfc.co.uk) [Forums-bluemoon-mcfc (https://forums.bluemoon-mcfc.co.uk)](https://forums.bluemoon-mcfc.co.uk)*: top 100M, forum, gb* +1. ![](https://www.google.com/s2/favicons?domain=https://gribnyemesta.unoforum.pro) [Gribnyemesta (https://gribnyemesta.unoforum.pro)](https://gribnyemesta.unoforum.pro)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.immigration.com) [forums.immigration.com (https://forums.immigration.com)](https://forums.immigration.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://chsnik-kz.ucoz.kz) [chsnik-kz.ucoz.kz (http://chsnik-kz.ucoz.kz)](http://chsnik-kz.ucoz.kz)*: top 100M, kz* +1. ![](https://www.google.com/s2/favicons?domain=http://muz-fresh.ucoz.kz) [muz-fresh.ucoz.kz (http://muz-fresh.ucoz.kz)](http://muz-fresh.ucoz.kz)*: top 100M, kz* +1. ![](https://www.google.com/s2/favicons?domain=https://social.librem.one) [SocialLibremOne (https://social.librem.one)](https://social.librem.one)*: top 100M, tech* +1. ![](https://www.google.com/s2/favicons?domain=http://tv.ucoz.club) [tv.ucoz.club (http://tv.ucoz.club)](http://tv.ucoz.club)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://community.signalusers.org) [Signal (https://community.signalusers.org)](https://community.signalusers.org)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.truckersmp.com) [TruckersMP.com (https://forum.truckersmp.com)](https://forum.truckersmp.com)*: top 100M, de, forum, tr* +1. ![](https://www.google.com/s2/favicons?domain=http://sorento.kia-club.ru/forum) [sorento.kia-club.ru (http://sorento.kia-club.ru/forum)](http://sorento.kia-club.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.gunboards.com) [Gunboards (https://forums.gunboards.com)](https://forums.gunboards.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.nvworld.ru) [forum.nvworld.ru (https://forum.nvworld.ru)](https://forum.nvworld.ru)*: top 100M, forum, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://boards.insidethestar.com) [boards.insidethestar.com (https://boards.insidethestar.com)](https://boards.insidethestar.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.zone-game.info) [forum.zone-game.info (https://forum.zone-game.info)](https://forum.zone-game.info)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum-ru.101xp.com) [101xp.com (https://forum-ru.101xp.com)](https://forum-ru.101xp.com)*: top 100M, forum, gaming, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://dfpd-forum.siemens.ru) [dfpd-forum.siemens.ru (https://dfpd-forum.siemens.ru)](https://dfpd-forum.siemens.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.dwg.ru/) [dwg (https://forum.dwg.ru/)](https://forum.dwg.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://community.go365.com) [Go365 (https://community.go365.com)](https://community.go365.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.facmedicine.com) [FacultyOfMedicine (https://forum.facmedicine.com)](https://forum.facmedicine.com)*: top 100M, eg, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.animeuknews.net/) [AnimeUKNews (https://forums.animeuknews.net/)](https://forums.animeuknews.net/)*: top 100M, forum, pk* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.questionablequesting.com) [QuestionableQuesting (https://forum.questionablequesting.com)](https://forum.questionablequesting.com)*: top 100M, forum, gb, jp* +1. ![](https://www.google.com/s2/favicons?domain=http://forums.sailboatowners.com) [forums.sailboatowners.com (http://forums.sailboatowners.com)](http://forums.sailboatowners.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.fanat1k.ru) [fanat1k (https://forum.fanat1k.ru)](https://forum.fanat1k.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.exkavator.ru) [forum.exkavator.ru (https://forum.exkavator.ru)](https://forum.exkavator.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://m.smutty.com) [m.smutty.com (https://m.smutty.com)](https://m.smutty.com)*: top 100M, erotic*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.endlessos.com) [community.endlessos.com (https://community.endlessos.com)](https://community.endlessos.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.golangbridge.org/) [Golangbridge (https://forum.golangbridge.org/)](https://forum.golangbridge.org/)*: top 100M, forum, sa, ua, vn* +1. ![](https://www.google.com/s2/favicons?domain=https://freelance.codeby.net) [freelance.codeby.net (https://freelance.codeby.net)](https://freelance.codeby.net)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.mau.ru) [mau (https://forum.mau.ru)](https://forum.mau.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.kvinneguiden.no) [Kvinneguiden (https://forum.kvinneguiden.no)](https://forum.kvinneguiden.no)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.itvdn.com) [ITVDN Forum (https://forum.itvdn.com)](https://forum.itvdn.com)*: top 100M, forum, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.golf-monthly.co.uk/) [GolfMonthly (https://forums.golf-monthly.co.uk/)](https://forums.golf-monthly.co.uk/)*: top 100M, forum, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.ss-iptv.com) [forum.ss-iptv.com (https://forum.ss-iptv.com)](https://forum.ss-iptv.com)*: top 100M, forum, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.kaosx.us) [forum.kaosx.us (https://forum.kaosx.us)](https://forum.kaosx.us)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.officiating.com) [officiating (https://forum.officiating.com)](https://forum.officiating.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.leasehackr.com/) [leasehackr (https://forum.leasehackr.com/)](https://forum.leasehackr.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://capitalcity.combats.com) [CapitalcityCombats (http://capitalcity.combats.com)](http://capitalcity.combats.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://demonscity.combats.com) [Demonscity (http://demonscity.combats.com)](http://demonscity.combats.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://m.galya.ru) [Galya (https://m.galya.ru)](https://m.galya.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.shopsmith.com) [forum.shopsmith.com (https://forum.shopsmith.com)](https://forum.shopsmith.com)*: top 100M, forum, pk* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.vegalab.ru) [VegaLab (http://forum.vegalab.ru)](http://forum.vegalab.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.online-knigi.com) [KnigiOnline (https://forum.online-knigi.com)](https://forum.online-knigi.com)*: top 100M, by, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.bestflowers.ru) [forum.bestflowers.ru (https://forum.bestflowers.ru)](https://forum.bestflowers.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.sureai.net) [forum.sureai.net (https://forum.sureai.net)](https://forum.sureai.net)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.rosalinux.ru) [forum.rosalinux.ru (https://forum.rosalinux.ru)](https://forum.rosalinux.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.kerch.com.ru) [Kerch Forum (http://forum.kerch.com.ru)](http://forum.kerch.com.ru)*: top 100M, forum, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://bbs.huami.com) [bbs.huami.com (https://bbs.huami.com)](https://bbs.huami.com)*: top 100M, cn, ir, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://tabun.everypony.ru) [Tabun (https://tabun.everypony.ru)](https://tabun.everypony.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.kursknet.ru) [kursknet (https://forum.kursknet.ru)](https://forum.kursknet.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.maidenfans.com) [MaidenFans (https://forum.maidenfans.com)](https://forum.maidenfans.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.studiofow.com) [discuss.studiofow.com (https://discuss.studiofow.com)](https://discuss.studiofow.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://avto.dzerghinsk.org) [avto.dzerghinsk.org (http://avto.dzerghinsk.org)](http://avto.dzerghinsk.org)*: top 100M, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.byte.co) [Byte (https://community.byte.co)](https://community.byte.co)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://app.airnfts.com) [app.airnfts.com (https://app.airnfts.com)](https://app.airnfts.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://profile.hatena.com) [Hatena (http://profile.hatena.com)](http://profile.hatena.com)*: top 100M, bookmarks, jp* +1. ![](https://www.google.com/s2/favicons?domain=http://new.sexopedia.ru) [Sexopedia (http://new.sexopedia.ru)](http://new.sexopedia.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.postupim.ru) [forum.postupim.ru (http://forum.postupim.ru)](http://forum.postupim.ru)*: top 100M, education, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.igrarena.ru) [igrarena (https://forum.igrarena.ru)](https://forum.igrarena.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.sanatorii.by) [sanatorii (http://forum.sanatorii.by)](http://forum.sanatorii.by)*: top 100M, by, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.wowcircle.net) [WOW Circle (https://forum.wowcircle.net)](https://forum.wowcircle.net)*: top 100M, forum, it, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://gam1ng.com.br) [Gam1ng (https://gam1ng.com.br)](https://gam1ng.com.br)*: top 100M, br, webcam*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.hiveos.farm) [hiveos.farm (https://forum.hiveos.farm)](https://forum.hiveos.farm)*: top 100M, at, cz, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.languagelearningwithnetflix.com) [forum.languagelearningwithnetflix.com (https://forum.languagelearningwithnetflix.com)](https://forum.languagelearningwithnetflix.com)*: top 100M, forum, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.rudtp.ru) [RUDTP (https://forum.rudtp.ru)](https://forum.rudtp.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.rollerclub.ru) [forum.rollerclub.ru (http://forum.rollerclub.ru)](http://forum.rollerclub.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.c-o-k.com.ua) [forum.c-o-k.com.ua (https://forum.c-o-k.com.ua)](https://forum.c-o-k.com.ua)*: top 100M, forum, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://phorum.armavir.ru) [phorum.armavir.ru (http://phorum.armavir.ru)](http://phorum.armavir.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.umhoops.com) [UMHOOPS (https://forum.umhoops.com)](https://forum.umhoops.com)*: top 100M, forum, sport* +1. ![](https://www.google.com/s2/favicons?domain=https://rest.feo.ru/forum) [rest.feo.ru (https://rest.feo.ru/forum)](https://rest.feo.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.vilo4nik.net) [forum.vilo4nik.net (https://forum.vilo4nik.net)](https://forum.vilo4nik.net)*: top 100M, forum, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.uti-puti.com.ua) [forum.uti-puti.com.ua (https://forum.uti-puti.com.ua)](https://forum.uti-puti.com.ua)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.allgaz.ru) [allgaz (https://forum.allgaz.ru)](https://forum.allgaz.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://sputnikkey.ru) [sputnikkey.ru (http://sputnikkey.ru)](http://sputnikkey.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://matrix.org/) [Matrix (https://matrix.org/)](https://matrix.org/)*: top 100M, messaging* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.oneclickchicks.com) [forum.oneclickchicks.com (https://forum.oneclickchicks.com)](https://forum.oneclickchicks.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://commons.ishtar-collective.net) [commons.ishtar-collective.net (https://commons.ishtar-collective.net)](https://commons.ishtar-collective.net)*: top 100M, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://myce.wiki) [myce.wiki (https://myce.wiki)](https://myce.wiki)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.rarib.ag) [forum.rarib.ag (https://forum.rarib.ag)](https://forum.rarib.ag)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.setcombg.com) [forum.setcombg.com (https://forum.setcombg.com)](https://forum.setcombg.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.caravelgames.com) [caravelgames (http://forum.caravelgames.com)](http://forum.caravelgames.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.modding.ru) [forum.modding.ru (http://forum.modding.ru)](http://forum.modding.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.freeton.org) [forum.freeton.org (https://forum.freeton.org)](https://forum.freeton.org)*: top 100M, finance, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.ua-vet.com) [forum.ua-vet.com (http://forum.ua-vet.com)](http://forum.ua-vet.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://sst.hiberworld.com/user/{username}) [sst.hiberworld.com (https://sst.hiberworld.com/user/{username})](https://sst.hiberworld.com/user/{username})*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.trade-print.ru) [forum.trade-print.ru (http://forum.trade-print.ru)](http://forum.trade-print.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://red-forum.com) [red-forum.com (https://red-forum.com)](https://red-forum.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.liveexpert.ru) [Liveexpert (https://www.liveexpert.ru)](https://www.liveexpert.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.amirite.com) [Amirite (https://www.amirite.com)](https://www.amirite.com)*: top 100M, gb*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://nygunforum.com) [Nygunforum (https://nygunforum.com)](https://nygunforum.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://0-3.ru) [0-3.RU (http://0-3.ru)](http://0-3.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [discussions.ubisoft.com ()]()*: top 100M, forum, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://11x2.com) [11x2 (https://11x2.com)](https://11x2.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://1xforum.com) [1xforum (https://1xforum.com)](https://1xforum.com)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://2Dimensions.com/) [2Dimensions (https://2Dimensions.com/)](https://2Dimensions.com/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.2fast4u.be) [2fast4u (https://www.2fast4u.be)](https://www.2fast4u.be)*: top 100M, nl*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.3dmir.ru/) [3DMir.ru (http://www.3dmir.ru/)](http://www.3dmir.ru/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.3dcadforums.com/) [3dcadforums (https://www.3dcadforums.com/)](https://www.3dcadforums.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://50cc.com.ua) [50cc.com.ua (http://50cc.com.ua)](http://50cc.com.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://63148.com.ua) [63148.com.ua (http://63148.com.ua)](http://63148.com.ua)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://apteka.ee) [AMUR (https://apteka.ee)](https://apteka.ee)*: top 100M, dating, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://aback.com.ua) [Aback (https://aback.com.ua)](https://aback.com.ua)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://aboutcar.ru) [Aboutcar (http://aboutcar.ru)](http://aboutcar.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Airbit ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://all-mods.ru) [All-mods (https://all-mods.ru)](https://all-mods.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.allthesoft.com) [AllTheSoft (http://www.allthesoft.com)](http://www.allthesoft.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://amspb.info) [Amspb (https://amspb.info)](https://amspb.info)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.anapakurort.info) [Anapakurort (http://www.anapakurort.info)](http://www.anapakurort.info)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.anarcho-punk.net/) [Anarcho-punk (https://www.anarcho-punk.net/)](https://www.anarcho-punk.net/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://angelgothics.ru) [Angelgothics (http://angelgothics.ru)](http://angelgothics.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.anime.web.tr/) [Anime.web.tr (http://www.anime.web.tr/)](http://www.anime.web.tr/)*: top 100M, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://animebase.me) [Animebase (https://animebase.me)](https://animebase.me)*: top 100M, forum, pk* +1. ![](https://www.google.com/s2/favicons?domain=) [Anonup ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://antipunk.com/) [Antipunk (https://antipunk.com/)](https://antipunk.com/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [ApexLegends ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Division2 ()]()*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=http://appearoo.com) [Appearoo (http://appearoo.com)](http://appearoo.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Appian ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Archive.orgParlerProfiles ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Archive.orgParlerPosts ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Archive.orgTwitterProfiles ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Archive.orgTwitterTweets ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://archlinux.org.ru) [Archlinux (https://archlinux.org.ru)](https://archlinux.org.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Arduino ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://arhrock.info/) [Arhrock (https://arhrock.info/)](https://arhrock.info/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Artistsnclients ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://artpersona.org/) [Artpersona (http://artpersona.org/)](http://artpersona.org/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://askvoprosy.com/) [Askvoprosy (https://askvoprosy.com/)](https://askvoprosy.com/)*: top 100M, coding*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.astra-club.ru) [Astra-club (http://www.astra-club.ru)](http://www.astra-club.ru)*: top 100M, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.astro-talks.ru) [Astro-talks (http://www.astro-talks.ru)](http://www.astro-talks.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Autofrage ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://community.autolenta.ru) [Autolenta (https://community.autolenta.ru)](https://community.autolenta.ru)*: top 100M, auto, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://automania.ru) [Automania (https://automania.ru)](https://automania.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [AvidCommunity ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://avtoforum.org) [Avtoforum (https://avtoforum.org)](https://avtoforum.org)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.avtolyubiteli.com) [Avtolyubiteli (https://forum.avtolyubiteli.com)](https://forum.avtolyubiteli.com)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://backdoor.sdslabs.co) [BackdoorSdslabs (https://backdoor.sdslabs.co)](https://backdoor.sdslabs.co)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Bandlab ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://barnacl.es/u/alexsam) [Barnacl (https://barnacl.es/u/alexsam)](https://barnacl.es/u/alexsam)*: top 100M, es, news, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://xss.is) [XSS.is (https://xss.is)](https://xss.is)*: top 100M, forum, hacking, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.bazar.cz/) [Bazar.cz (https://www.bazar.cz/)](https://www.bazar.cz/)*: top 100M, cz* +1. ![](https://www.google.com/s2/favicons?domain=https://bbshave.ru) [Bbshave (https://bbshave.ru)](https://bbshave.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.belmos.ru) [Belmos (https://www.belmos.ru)](https://www.belmos.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Bentbox ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://bereal.com) [BeReal (https://bereal.com)](https://bereal.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://bestfantasybooks.com) [Bestfantasybooks (http://bestfantasybooks.com)](http://bestfantasybooks.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://bestweapon.ru) [Bestweapon (https://bestweapon.ru)](https://bestweapon.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://bethepro.com) [Bethepro (https://bethepro.com)](https://bethepro.com)*: top 100M, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Bezuzyteczna ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://bgforum.ru) [Bgforum (https://bgforum.ru)](https://bgforum.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Biggerpockets ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://bigmmc.com) [Bigmmc (http://bigmmc.com)](http://bigmmc.com)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Bikemap ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.billkiene.com) [Billkiene (https://www.billkiene.com)](https://www.billkiene.com)*: top 100M, forum, hobby*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://binarysearch.com/) [BinarySearch (https://binarysearch.com/)](https://binarysearch.com/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Bitwarden ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Blogi.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://sbongacams.com) [BongaCams (https://sbongacams.com)](https://sbongacams.com)*: top 100M, cz, webcam* +1. ![](https://www.google.com/s2/favicons?domain=https://www.bookandreader.com) [Bookandreader (https://www.bookandreader.com)](https://www.bookandreader.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://boominfo.ru) [BoomInfo (https://boominfo.ru)](https://boominfo.ru)*: top 100M, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://borsch.gallery) [Borsch.gallery (https://borsch.gallery)](https://borsch.gallery)*: top 100M, art, shopping* +1. ![](https://www.google.com/s2/favicons?domain=http://boxing.ru/) [Boxing (http://boxing.ru/)](http://boxing.ru/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://brute.su) [Brute (https://brute.su)](https://brute.su)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Bugcrowd ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Buzznet ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Caringbridge ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Carrd.co ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Cash.app ()]()*: top 100M, finance, fintech, us* +1. ![](https://www.google.com/s2/favicons?domain=) [Castingcallclub ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [CD-Action ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Cda.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Chamsko.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Chomikuj.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://3examplesite.ru) [CPlusPlus (https://3examplesite.ru)](https://3examplesite.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Crowdin ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://cardingforum.co) [CardingForum (https://cardingforum.co)](https://cardingforum.co)*: top 100M, forum, ma*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://cardingsite.cc) [Cardingsite (https://cardingsite.cc)](https://cardingsite.cc)*: top 100M, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.casial.net) [Casial (http://www.casial.net)](http://www.casial.net)*: top 100M, de* +1. ![](https://www.google.com/s2/favicons?domain=https://www.casino-affiliate-forum.com) [Casino-affiliate-forum (https://www.casino-affiliate-forum.com)](https://www.casino-affiliate-forum.com)*: top 100M, de, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://cfire.ru) [Cfire (https://cfire.ru)](https://cfire.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://chemistlab.ru) [Chemistlab (http://chemistlab.ru)](http://chemistlab.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.chess-russia.ru) [Chess-russia (http://www.chess-russia.ru)](http://www.chess-russia.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.chevrolet-cruze-club.ru) [Chevrolet-cruze-club (http://www.chevrolet-cruze-club.ru)](http://www.chevrolet-cruze-club.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://chpoking.ru) [Chpoking (http://chpoking.ru)](http://chpoking.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Citizen4 ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://cmet4uk.ru) [Cmet4uk (https://cmet4uk.ru)](https://cmet4uk.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [CryptomatorForum ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.cssomsk.ru) [Cssomsk (http://www.cssomsk.ru)](http://www.cssomsk.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Cults3d ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://cyberclock.cc) [Cyberclock (https://cyberclock.cc)](https://cyberclock.cc)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.cydak.ru) [Cydak (http://www.cydak.ru)](http://www.cydak.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Cytoid.io ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [d3.ru ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Dangerousthings.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Demotywatory ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://dojoverse.com) [Dojoverse (https://dojoverse.com)](https://dojoverse.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://darkside.black) [Darkside (https://darkside.black)](https://darkside.black)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://dcpg.ru/) [Dcpg (https://dcpg.ru/)](https://dcpg.ru/)*: top 100M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://derevnyaonline.ru) [Derevnyaonline (https://derevnyaonline.ru)](https://derevnyaonline.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://desu.me) [Desu (https://desu.me)](https://desu.me)*: top 100M, by, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://detstrana.ru) [Detstrana (https://detstrana.ru)](https://detstrana.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://devtribe.ru) [Devtribe (https://devtribe.ru)](https://devtribe.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://dinsk.su) [Dinsk (https://dinsk.su)](https://dinsk.su)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.djangoproject.co) [Djangoproject.co (https://forum.djangoproject.co)](https://forum.djangoproject.co)*: top 100M, coding, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://dmyt.ru) [Dmyt (https://dmyt.ru)](https://dmyt.ru)*: top 100M, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.dobroeslovo.ru) [Dobroeslovo (http://www.dobroeslovo.ru)](http://www.dobroeslovo.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://droners.io) [Droners (https://droners.io)](https://droners.io)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dublikat.shop) [Dublikat (https://www.dublikat.shop)](https://www.dublikat.shop)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://dumpz.ws) [Dumpz (https://dumpz.ws)](https://dumpz.ws)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.duno.com/) [Duno (https://www.duno.com/)](https://www.duno.com/)*: top 100M, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://eightbit.me/) [Eightbit (http://eightbit.me/)](http://eightbit.me/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Elftown ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://elwo.ru) [Elwo (https://elwo.ru)](https://elwo.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.engadget.com/) [Engadget (https://www.engadget.com/)](https://www.engadget.com/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://enot-poloskun.ru/) [Enot-poloskun (https://enot-poloskun.ru/)](https://enot-poloskun.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Eporner ()]()*: top 100M, es* +1. ![](https://www.google.com/s2/favicons?domain=https://erboh.com/) [Erboh (https://erboh.com/)](https://erboh.com/)*: top 100M, forum, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://esate.ru) [Esate (http://esate.ru)](http://esate.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://ezoterikaconversion.ru) [EzoterikaConversion (http://ezoterikaconversion.ru)](http://ezoterikaconversion.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [8tracks.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [www.adultism.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [architizer.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [artfol.me ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [asquero.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Byond ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://f3.cool/) [F3.cool (https://f3.cool/)](https://f3.cool/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Fabswingers ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Faktopedia ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Fancentro ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Fansly ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Fedi.lewactwo.pl ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Forumprawne.org ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Fosstodon ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Fotka ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Friendfinder ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Friendfinder-x ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Furaffinity ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Fameswap ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://faqusha.ru) [Faqusha (https://faqusha.ru)](https://faqusha.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://favera.ru) [Favera (https://favera.ru)](https://favera.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://fcdin.com) [Fcdin (http://fcdin.com)](http://fcdin.com)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://fclmnews.ru) [Fclmnews (https://fclmnews.ru)](https://fclmnews.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.fegatch.com/) [Fegatch (http://www.fegatch.com/)](http://www.fegatch.com/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://ficwriter.info) [Ficwriter (https://ficwriter.info)](https://ficwriter.info)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.filmo.gs/) [Filmogs (https://www.filmo.gs/)](https://www.filmo.gs/)*: top 100M, movies*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://filmwatch.com) [Filmwatch (https://filmwatch.com)](https://filmwatch.com)*: top 100M, ca, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Finanzfrage ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://finforum.net) [Finforum (https://finforum.net)](https://finforum.net)*: top 100M, forum, ru, vn* +1. ![](https://www.google.com/s2/favicons?domain=https://fireworktv.com) [Fireworktv (https://fireworktv.com)](https://fireworktv.com)*: top 100M, jp*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://flbord.com) [Flbord (https://flbord.com)](https://flbord.com)*: top 100M, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://fm-forum.ru) [Fm-forum (https://fm-forum.ru)](https://fm-forum.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.glow-dm.ru) [Forum.glow-dm.ru (http://forum.glow-dm.ru)](http://forum.glow-dm.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.jambox.ru) [Forum.jambox.ru (https://forum.jambox.ru)](https://forum.jambox.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.quake2.com.ru/) [Forum.quake2.com.ru (http://forum.quake2.com.ru/)](http://forum.quake2.com.ru/)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum29.net) [Forum29 (http://forum29.net)](http://forum29.net)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.evaveda.com/) [ForumEvaveda (http://forum.evaveda.com/)](http://forum.evaveda.com/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forumsmotri.club) [ForumSmotri (https://forumsmotri.club)](https://forumsmotri.club)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forumyuristov.ru/) [ForumYuristov (https://forumyuristov.ru/)](https://forumyuristov.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forumreligions.ru) [Forumreligions (https://forumreligions.ru)](https://forumreligions.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.forumsi.org) [Forumsi (http://www.forumsi.org)](http://www.forumsi.org)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forumteam.best/) [Forumteam (https://forumteam.best/)](https://forumteam.best/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://fozo.info/) [Fozo (https://fozo.info/)](https://fozo.info/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://free-lance.ua/) [Free-lance.ua (https://free-lance.ua/)](https://free-lance.ua/)*: top 100M, freelance, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://www.freelancebay.com) [Freelancebay (https://www.freelancebay.com)](https://www.freelancebay.com)*: top 100M, freelance, th* +1. ![](https://www.google.com/s2/favicons?domain=https://freepo.st) [Freepo (https://freepo.st)](https://freepo.st)*: top 100M, news* +1. ![](https://www.google.com/s2/favicons?domain=https://fullhub.ru/) [Fullhub (https://fullhub.ru/)](https://fullhub.ru/)*: top 100M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://furry-fandom.ru/) [FurryFandom (https://furry-fandom.ru/)](https://furry-fandom.ru/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [G2g.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://g-news.com.ua) [G-news (https://g-news.com.ua)](https://g-news.com.ua)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://gdprofiles.com/) [GDProfiles (https://gdprofiles.com/)](https://gdprofiles.com/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://gg-izi.ru/) [GGIZI (https://gg-izi.ru/)](https://gg-izi.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.gps-forum.ru) [GPS-Forum (http://www.gps-forum.ru)](http://www.gps-forum.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://shadowban.eu) [Twitter Shadowban (https://shadowban.eu)](https://shadowban.eu)*: top 100M, jp, sa*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.gamesfrm.com) [Gamesfrm (https://www.gamesfrm.com)](https://www.gamesfrm.com)*: top 100M, forum, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://gamesubject.com) [Gamesubject (https://gamesubject.com)](https://gamesubject.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.garagepunk.com) [GaragePunk (https://www.garagepunk.com)](https://www.garagepunk.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gardening-forums.com) [Gardening-forums (https://www.gardening-forums.com)](https://www.gardening-forums.com)*: top 100M, forum, ph* +1. ![](https://www.google.com/s2/favicons?domain=https://geekdoing.com) [Geekdoing (https://geekdoing.com)](https://geekdoing.com)*: top 100M, gr, ir* +1. ![](https://www.google.com/s2/favicons?domain=) [GeniusArtists ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://board.german242.com) [German242 (https://board.german242.com)](https://board.german242.com)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Gesundheitsfrage ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Gitbook ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://glbyh.ru/) [Glbyh (https://glbyh.ru/)](https://glbyh.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.gliger.ru) [Gliger (http://www.gliger.ru)](http://www.gliger.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Gnome-vcs ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://gorodanapa.ru/) [Gorodanapa (http://gorodanapa.ru/)](http://gorodanapa.ru/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://gothic.su) [Gothic (http://gothic.su)](http://gothic.su)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.gps-forums.com) [Gps-forumCOM (https://www.gps-forums.com)](https://www.gps-forums.com)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=) [Gradle ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Grailed ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://gulfcoastgunforum.com) [Gulfcoastgunforum (https://gulfcoastgunforum.com)](https://gulfcoastgunforum.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gunandgame.co) [Gunandgame (https://www.gunandgame.co)](https://www.gunandgame.co)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://hackeralexaRank.com/) [HackeralexaRank (https://hackeralexaRank.com/)](https://hackeralexaRank.com/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.hairmaniac.ru/) [Hairmaniac (https://www.hairmaniac.ru/)](https://www.hairmaniac.ru/)*: top 100M, medicine, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.handgunforum.net) [Handgunforum (https://www.handgunforum.net)](https://www.handgunforum.net)*: top 100M, ca, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Hexrpg ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hockeyforum.com) [Hockeyforum (https://www.hockeyforum.com)](https://www.hockeyforum.com)*: top 100M, forum, sport*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.holiday.ru) [Holiday.ru (https://www.holiday.ru)](https://www.holiday.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://honda.org.ua) [Honda (https://honda.org.ua)](https://honda.org.ua)*: top 100M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://www.houserepairtalk.com) [Houserepairtalk (https://www.houserepairtalk.com)](https://www.houserepairtalk.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=) [Iconfinder ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Inkbunny ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Ipolska.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://ieoc.com/) [Ieoc (https://ieoc.com/)](https://ieoc.com/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://iknifecollector.com) [Iknifecollector (https://iknifecollector.com)](https://iknifecollector.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.ingunowners.com) [Ingunowners (https://www.ingunowners.com)](https://www.ingunowners.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.invalidnost.com) [Invalidnost (https://www.invalidnost.com)](https://www.invalidnost.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [IonicFramework ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ispdn.ru) [Ispdn (http://ispdn.ru)](http://ispdn.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://itforums.ru) [Itforums (https://itforums.ru)](https://itforums.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://itfy.org) [Itfy (https://itfy.org)](https://itfy.org)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Jbzd ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Jeja.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Jellyfin Weblate ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://joby.su) [Joby (https://joby.su)](https://joby.su)*: top 100M, freelance, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Joemonster ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [JoplinApp ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Justforfans ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.juventuz.com) [Juventuz (https://www.juventuz.com)](https://www.juventuz.com)*: top 100M, forum, sg* +1. ![](https://www.google.com/s2/favicons?domain=) [Karab.in ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Keakr ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [BeatStars ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.kino-tv-forum.ru) [Kino-tv (http://www.kino-tv-forum.ru)](http://www.kino-tv-forum.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://kinogo.by) [Kinogo (https://kinogo.by)](https://kinogo.by)*: top 100M, by, movies*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://kinooh.ru) [Kinooh (https://kinooh.ru)](https://kinooh.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.kladoiskatel.ru) [Kladoiskatel (http://forum.kladoiskatel.ru)](http://forum.kladoiskatel.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.kontrolkalemi.com) [Kontrolkalemi (https://www.kontrolkalemi.com)](https://www.kontrolkalemi.com)*: top 100M, tr* +1. ![](https://www.google.com/s2/favicons?domain=) [Kotburger ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.kriptom.com) [Kriptom (https://www.kriptom.com)](https://www.kriptom.com)*: top 100M, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.kristallov.net) [KristallovNet (https://forum.kristallov.net)](https://forum.kristallov.net)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.letsbeef.com) [Letsbeef (https://www.letsbeef.com)](https://www.letsbeef.com)*: top 100M, vi*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://letschatlove.com) [Letschatlove (https://letschatlove.com)](https://letschatlove.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://lib.reviews) [LibReviews (https://lib.reviews)](https://lib.reviews)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.liebe69.de) [Liebe69 (https://www.liebe69.de)](https://www.liebe69.de)*: top 100M, de*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://life-dom2.su) [Life-dom2 (https://life-dom2.su)](https://life-dom2.su)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://lightstalking.us/) [Lightstalking (https://lightstalking.us/)](https://lightstalking.us/)*: top 100M, forum, photo* +1. ![](https://www.google.com/s2/favicons?domain=) [line.me ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.linuxmint.com.ru) [LinuxMint (https://www.linuxmint.com.ru)](https://www.linuxmint.com.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Listed.to ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.lostfilmhd.ru) [LostFilmHD (http://www.lostfilmhd.ru)](http://www.lostfilmhd.ru)*: top 100M, es, movies, pl, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Lottiefiles ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://lovemakeup.ru) [Lovemakeup (https://lovemakeup.ru)](https://lovemakeup.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Lowcygier.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.macplanete.com) [MacPlanete (https://forum.macplanete.com)](https://forum.macplanete.com)*: top 100M, forum, fr, ma* +1. ![](https://www.google.com/s2/favicons?domain=https://macqa.ru) [Macqa (https://macqa.ru)](https://macqa.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Maga-Chat ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://mag-portal.ru) [Mag-portal (https://mag-portal.ru)](https://mag-portal.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Magabook ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://magiimir.com) [Magiimir (https://magiimir.com)](https://magiimir.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mamochki.by/) [Mamochki (https://mamochki.by/)](https://mamochki.by/)*: top 100M, by, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://manutd.one) [Manutd (https://manutd.one)](https://manutd.one)*: top 100M, forum, sport* +1. ![](https://www.google.com/s2/favicons?domain=) [Mapify.travel ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [MapMyTracks ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Marshmallow ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Martech ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [MassageAnywhere ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.mastera-forum.ru) [Mastera-forum (https://www.mastera-forum.ru)](https://www.mastera-forum.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://masterkrasok.ru) [Masterkrasok (https://masterkrasok.ru)](https://masterkrasok.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mastersofcrypto.com) [Mastersofcrypto (https://mastersofcrypto.com)](https://mastersofcrypto.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mcbans.com) [Mcbans (https://www.mcbans.com)](https://www.mcbans.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Mcuuid ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Medyczka.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.meendo.net) [Meendo (https://www.meendo.net)](https://www.meendo.net)*: top 100M, bg, kg, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=) [Megamodels.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://megane2.ru/) [Megane2 (http://megane2.ru/)](http://megane2.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [ProtonMail ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.microchip.su) [Microchip (http://www.microchip.su)](http://www.microchip.su)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Minecraftlist ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://miped.ru) [Miped (https://miped.ru)](https://miped.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Mistrzowie ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http:/mixlr.com/) [Mixlr (http:/mixlr.com/)](http:/mixlr.com/)*: top 100M, gb* +1. ![](https://www.google.com/s2/favicons?domain=https://www.mobile-files.com/) [Mobile-files (https://www.mobile-files.com/)](https://www.mobile-files.com/)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.mobrep.ru) [Mobrep (https://www.mobrep.ru)](https://www.mobrep.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.money-talk.org) [Money-talk (http://www.money-talk.org)](http://www.money-talk.org)*: top 100M, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.monkingme.com/) [Monkingme (https://www.monkingme.com/)](https://www.monkingme.com/)*: top 100M, es, ir*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Motokiller ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Motorradfrage ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://movie-forum.co) [Movie-forum (https://movie-forum.co)](https://movie-forum.co)*: top 100M, forum, pk*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://murmansk-life.ru) [MurmanskLife (http://murmansk-life.ru)](http://murmansk-life.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://music-rock.ru/) [Music-rock (http://music-rock.ru/)](http://music-rock.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://my-question.ru) [My-question (https://my-question.ru)](https://my-question.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Mym.fans ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mydarling.ru/) [Mydarling (http://mydarling.ru/)](http://mydarling.ru/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://lovetalk.ru) [Mylove (https://lovetalk.ru)](https://lovetalk.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Naturalnews ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Ninjakiwi ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.nationalgunforum.com) [NationalgunForum (https://www.nationalgunforum.com)](https://www.nationalgunforum.com)*: top 100M, ca, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://naturalworld.guru) [Naturalworld (https://naturalworld.guru)](https://naturalworld.guru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Needrom ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://no-jus.com) [No-jus (https://no-jus.com)](https://no-jus.com)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://numizmat-forum.ru) [Numizmat (https://numizmat-forum.ru)](https://numizmat-forum.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Nyaa.si ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://offline.by) [Offline.by (https://offline.by)](https://offline.by)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Oglaszamy24h ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.oilcareer.ru) [Oilcareer (http://www.oilcareer.ru)](http://www.oilcareer.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Olx.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://onanistov.net) [OnanistovNet (https://onanistov.net)](https://onanistov.net)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.oncoforum.ru) [Oncoforum (https://www.oncoforum.ru)](https://www.oncoforum.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.opelclub.ru) [Opelclub (http://www.opelclub.ru)](http://www.opelclub.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://otechie.com) [Otechie (https://otechie.com)](https://otechie.com)*: top 100M, finance* +1. ![](https://www.google.com/s2/favicons?domain=https://ourdjtalk.com/) [OurDJTalk (https://ourdjtalk.com/)](https://ourdjtalk.com/)*: top 100M, forum, music* +1. ![](https://www.google.com/s2/favicons?domain=) [Ourfreedombook ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://outgress.com/) [Outgress (https://outgress.com/)](https://outgress.com/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Ow.ly ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://p38forum.com) [P38forum (http://p38forum.com)](http://p38forum.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.partyvibe.org) [Partyvibe (https://www.partyvibe.org)](https://www.partyvibe.org)*: top 100M, pk* +1. ![](https://www.google.com/s2/favicons?domain=) [Patronite ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Pewex.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Piekielni ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://pilguy.com) [Pilguy (https://pilguy.com)](https://pilguy.com)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://piratebuhta.club) [Piratebuhta (https://piratebuhta.club)](https://piratebuhta.club)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.pokerstrategy.net) [PokerStrategy (http://www.pokerstrategy.net)](http://www.pokerstrategy.net)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Pol.social ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Polczat.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Policja2009 ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Polleverywhere ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Polymart ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [PornhubPornstars ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Poshmark ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pro-cats.ru) [Pro-cats (http://pro-cats.ru)](http://pro-cats.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.prosvetlenie.org) [Prosvetlenie (http://www.prosvetlenie.org)](http://www.prosvetlenie.org)*: top 100M, kg, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Prv.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://quake-champions.pro) [Quake-champions (https://quake-champions.pro)](https://quake-champions.pro)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Quitter.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Quizlet ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://rcmir.com/) [RC-MIR (http://rcmir.com/)](http://rcmir.com/)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://au.rrforums.net/) [RRForums (http://au.rrforums.net/)](http://au.rrforums.net/)*: top 100M, au, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://radio-uchebnik.ru) [Radio-uchebnik (http://radio-uchebnik.ru)](http://radio-uchebnik.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://radiomed.ru) [Radiomed (https://radiomed.ru)](https://radiomed.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.rammclan.ru) [Rammclan (http://www.rammclan.ru)](http://www.rammclan.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.rapforce.net) [Rapforce (http://www.rapforce.net)](http://www.rapforce.net)*: top 100M, fr, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.rasslabyxa.ru) [Rasslabyxa (http://www.rasslabyxa.ru)](http://www.rasslabyxa.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [RcloneForum ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.redorchestra.ru) [Redorchestra (http://www.redorchestra.ru)](http://www.redorchestra.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://reincarnationforum.com) [Reincarnationforum (http://reincarnationforum.com)](http://reincarnationforum.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=) [Reisefrage ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.renaultfanclub.com) [RenaultFanClub (http://www.renaultfanclub.com)](http://www.renaultfanclub.com)*: top 100M, forum, tr*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Rigcz.club ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.rngf.ru/) [Rngf (http://www.rngf.ru/)](http://www.rngf.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://ro-ru.ru) [Ro-ru (https://ro-ru.ru)](https://ro-ru.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://rovlpj.com) [Rovlpj (https://rovlpj.com)](https://rovlpj.com)*: top 100M, forum, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://royalcams.com) [RoyalCams (https://royalcams.com)](https://royalcams.com)*: top 100M, gr, ng, ru, webcam* +1. ![](https://www.google.com/s2/favicons?domain=https://ru-sfera.org) [Ru-sfera (https://ru-sfera.org)](https://ru-sfera.org)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Ruby.dating ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://rugby-forum.ru) [Rugby-forum (http://rugby-forum.ru)](http://rugby-forum.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Rumblechannel ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Rumbleuser ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Runescape ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://sakhalin.name/) [SakhalinName (https://sakhalin.name/)](https://sakhalin.name/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Saracartershow ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://satsis.info/) [SatsisInfo (https://satsis.info/)](https://satsis.info/)*: top 100M, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://schlock.ru/) [Schlock (https://schlock.ru/)](https://schlock.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://school-school.ru) [School-school (https://school-school.ru)](https://school-school.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Scoutwiki ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Seneporno ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.sevsocium.com) [SevSocium (http://forum.sevsocium.com)](http://forum.sevsocium.com)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://sexforum.ws) [Sexforum.ws (http://sexforum.ws)](http://sexforum.ws)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://sexforum.win) [Sexwin (https://sexforum.win)](https://sexforum.win)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Sfd.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [ShaniiWrites ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.shitpostbot.com/) [ShitpostBot5000 (https://www.shitpostbot.com/)](https://www.shitpostbot.com/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://shoe.org) [Shoe (http://shoe.org)](http://shoe.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://shoppingzone.ru) [Shoppingzone (http://shoppingzone.ru)](http://shoppingzone.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://shotbow.net) [Shotbow (https://shotbow.net)](https://shotbow.net)*: top 100M, ca, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.silver-collector.com) [Silver-collector (https://www.silver-collector.com)](https://www.silver-collector.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=) [Skeb.jp ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.skodaforum.ru) [SkodaForum (http://www.skodaforum.ru)](http://www.skodaforum.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://skyrimforums.org) [Skyrimforums (https://skyrimforums.org)](https://skyrimforums.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=) [Slant.co ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://smashrun.com/) [Smashrun (https://smashrun.com/)](https://smashrun.com/)*: top 100M, br, jp* +1. ![](https://www.google.com/s2/favicons?domain=https://solaris-club.net) [Solaris-club (https://solaris-club.net)](https://solaris-club.net)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Solikick ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.soloby.ru) [Soloby (http://www.soloby.ru)](http://www.soloby.ru)*: top 100M, by, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.soobshestva.ru/) [Soobshestva (http://www.soobshestva.ru/)](http://www.soobshestva.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Spankpay ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://community.spiceworks.co) [SpiceWorks (https://community.spiceworks.co)](https://community.spiceworks.co)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=) [Splice ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://splits.io) [Splits.io (https://splits.io)](https://splits.io)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Sportlerfrage ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://stalker-zone.info) [Stalker-zone (http://stalker-zone.info)](http://stalker-zone.info)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://starvault.se) [Starvault (https://starvault.se)](https://starvault.se)*: top 100M, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://statistika.ru) [Statistika (http://statistika.ru)](http://statistika.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://steamid.uk/) [Steamid (https://steamid.uk/)](https://steamid.uk/)*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://steamid.uk/) [Steamid (by id) (https://steamid.uk/)](https://steamid.uk/)*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://stoimost.com.ua) [Stoimost (https://stoimost.com.ua)](https://stoimost.com.ua)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://stunited.org) [Stunited (http://stunited.org)](http://stunited.org)*: top 100M, education*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://subeta.net/) [Subeta (https://subeta.net/)](https://subeta.net/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Suzuri.jp ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Swapd ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forumswimming.ru) [SwimmingForum (http://forumswimming.ru)](http://forumswimming.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://syktforum.ru) [Syktforum (http://syktforum.ru)](http://syktforum.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://syktyvkar-online.ru) [SyktyvkarOnline (http://syktyvkar-online.ru)](http://syktyvkar-online.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Szerokikadr.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Szmer.info ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Tanuki.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Taskrabbit ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.teenus.info) [TEENUS (http://www.teenus.info)](http://www.teenus.info)*: top 100M, business, ee*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Teknik ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Tenor.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Tetr.io ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Tf2Items ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Tfl.net.pl ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Thegatewaypundit ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Thetattooforum ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Tldrlegal.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://talks.by) [Talks.by (https://talks.by)](https://talks.by)*: top 100M, by, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://terminator-scc.net.ru) [Terminator (http://terminator-scc.net.ru)](http://terminator-scc.net.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.thedaftclub.com) [Thedaftclub (https://www.thedaftclub.com)](https://www.thedaftclub.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.thephysicsforum.com) [Thephysicsforum (https://www.thephysicsforum.com)](https://www.thephysicsforum.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://ttonlineviewer.com) [TikTok Online Viewer (https://ttonlineviewer.com)](https://ttonlineviewer.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://tkgr.ru/) [Tkgr (http://tkgr.ru/)](http://tkgr.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://torrent-soft.net) [Torrent-soft (https://torrent-soft.net)](https://torrent-soft.net)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://totalstavki.ru) [TotalStavki (https://totalstavki.ru)](https://totalstavki.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Anilist ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://en.tm-ladder.com/index.php) [TrackmaniaLadder (http://en.tm-ladder.com/index.php)](http://en.tm-ladder.com/index.php)*: top 100M, au*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Traktrain ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://travis-ci.community) [Travis (https://travis-ci.community)](https://travis-ci.community)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://truckersmp.ru) [TruckersMP.ru (https://truckersmp.ru)](https://truckersmp.ru)*: top 100M, gaming, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Tunefind ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Twitcasting ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Twpro.jp ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [ultrasdiary.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [ulub.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Usa.life ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://uwr1.de) [Uwr1 (http://uwr1.de)](http://uwr1.de)*: top 100M, de* +1. ![](https://www.google.com/s2/favicons?domain=) [Viddler ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Vine ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Vizjer.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://vkfaces.com) [VKFaces (https://vkfaces.com)](https://vkfaces.com)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Voice123 ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://vamber.ru) [Vamber (https://vamber.ru)](https://vamber.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.virtualireland.ru) [VirtualIreland (https://www.virtualireland.ru)](https://www.virtualireland.ru)*: top 100M, forum, ie, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://vlmi.biz) [Vlmi (https://vlmi.biz)](https://vlmi.biz)*: top 100M, forum, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://warhammergames.ru) [Warhammergames (https://warhammergames.ru)](https://warhammergames.ru)*: top 100M, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Watchmemore.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Wego.social ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.whyislam.to) [Whyislam (https://www.whyislam.to)](https://www.whyislam.to)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [WicgForum ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Wiki.vg ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [WimkinPublicProfile ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.wittyprofiles.com/) [Wittyprofiles (http://www.wittyprofiles.com/)](http://www.wittyprofiles.com/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [WolniSlowianie ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Wordnik ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [WordpressSupport ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.wotanks.com) [WorlfOfTanksForum (https://forum.wotanks.com)](https://forum.wotanks.com)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://wot-game.com) [Wot-game (https://wot-game.com)](https://wot-game.com)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://wuz.by) [Wuz (http://wuz.by)](http://wuz.by)*: top 100M, by, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Xanga ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [XvideosModels ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://ya-uchitel.ru/) [Ya-uchitel (https://ya-uchitel.ru/)](https://ya-uchitel.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.yalta-info.net) [Yalta-info (http://www.yalta-info.net)](http://www.yalta-info.net)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.yapisal.net) [Yapisal (https://forum.yapisal.net)](https://forum.yapisal.net)*: top 100M, forum, tr*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Yazbel ()]()*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://zapravdu.ru/) [Zapravdu (http://zapravdu.ru/)](http://zapravdu.ru/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=) [Zatrybi.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Zbiornik.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zenitbol.ru) [Zenitbol (http://zenitbol.ru)](http://zenitbol.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://zhyk.ru) [Zhyk (https://zhyk.ru)](https://zhyk.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [Zmarsa.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://zmey.ru) [Zmey (https://zmey.ru)](https://zmey.ru)*: top 100M, forum, sport* +1. ![](https://www.google.com/s2/favicons?domain=https://aliensoup.com) [aliensoup.com (https://aliensoup.com)](https://aliensoup.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://amax-sb.ru) [amax-sb.ru (http://amax-sb.ru)](http://amax-sb.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://analitika-forex.ru) [analitika-forex.ru (http://analitika-forex.ru)](http://analitika-forex.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://autotob.ru) [autotob.ru (http://autotob.ru)](http://autotob.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://barnaul-forum.ru) [barnaul-forum.ru (http://barnaul-forum.ru)](http://barnaul-forum.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.biohack.me) [biohack (https://forum.biohack.me)](https://forum.biohack.me)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.bluesystem.online) [bluesystem (http://forum.bluesystem.online)](http://forum.bluesystem.online)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.cigarpass.com/forum) [cigarpass.com (http://www.cigarpass.com/forum)](http://www.cigarpass.com/forum)*: top 100M, forum, ir* +1. ![](https://www.google.com/s2/favicons?domain=http://club-fiat.org.ua) [club-fiat.org.ua (http://club-fiat.org.ua)](http://club-fiat.org.ua)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://cs-strikez.org) [cs-strikez.org (http://cs-strikez.org)](http://cs-strikez.org)*: top 100M, by, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://devushka.ru/) [devushka (https://devushka.ru/)](https://devushka.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://diecastcrazy.com/) [diecastcrazy.com (http://diecastcrazy.com/)](http://diecastcrazy.com/)*: top 100M, auto, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://dieselmastera.ru) [dieselmastera.ru (http://dieselmastera.ru)](http://dieselmastera.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://diz-cs.ru) [diz-cs.ru (http://diz-cs.ru)](http://diz-cs.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dnbforum.com/) [dnbforum.com (http://dnbforum.com/)](http://dnbforum.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.drawmixpaint.com) [drawmixpaint (https://forum.drawmixpaint.com)](https://forum.drawmixpaint.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://dvocu.ru) [dvocu.ru (http://dvocu.ru)](http://dvocu.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://easyen.ru) [easyen (https://easyen.ru)](https://easyen.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://egida.by) [egida.by (http://egida.by)](http://egida.by)*: top 100M, by* +1. ![](https://www.google.com/s2/favicons?domain=http://elektrik-avto.ru) [elektrik-avto.ru (http://elektrik-avto.ru)](http://elektrik-avto.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://empires.su) [empires.su (http://empires.su)](http://empires.su)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://espero-club.ru) [espero-club.ru (http://espero-club.ru)](http://espero-club.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://excelworld.ru) [excelworld.ru (http://excelworld.ru)](http://excelworld.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.firesofheaven.org) [firesofheaven.org (https://www.firesofheaven.org)](https://www.firesofheaven.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum-b.ru) [forum-b.ru (https://forum-b.ru)](https://forum-b.ru)*: top 100M, forum, freelance, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forums.universaldashboard.io/) [foumds.universaldashboard.io (https://forums.universaldashboard.io/)](https://forums.universaldashboard.io/)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=http://free-pass.ru) [free-pass.ru (http://free-pass.ru)](http://free-pass.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.garminych.ru/) [garminych (http://forum.garminych.ru/)](http://forum.garminych.ru/)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.gitarizm.ru) [gitarizm (https://forum.gitarizm.ru)](https://forum.gitarizm.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://hackings.ru) [hackings.ru (http://hackings.ru)](http://hackings.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://hogwarts.nz/) [hogwarts.nz (https://hogwarts.nz/)](https://hogwarts.nz/)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.iphoneforums.net) [iPhoneForums.net (https://www.iphoneforums.net)](https://www.iphoneforums.net)*: top 100M, forum, tech* +1. ![](https://www.google.com/s2/favicons?domain=https://induste.com/) [induste.com (https://induste.com/)](https://induste.com/)*: top 100M, forum, ma, re* +1. ![](https://www.google.com/s2/favicons?domain=http://izmailonline.com) [izmailonline.com (http://izmailonline.com)](http://izmailonline.com)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://kali.org.ru) [kali.org.ru (https://kali.org.ru)](https://kali.org.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://kiabongo.info) [kiabongo.info (http://kiabongo.info)](http://kiabongo.info)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://lab.pentestit.ru/) [labpentestit (https://lab.pentestit.ru/)](https://lab.pentestit.ru/)*: top 100M, hacking, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://linuxmint.info) [linuxmint.info (http://linuxmint.info)](http://linuxmint.info)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.lithotherapy.ru) [lithotherapy (https://forum.lithotherapy.ru)](https://forum.lithotherapy.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://markweinguitarlessons.com/forums/) [markweinguitarlessons.com (http://markweinguitarlessons.com/forums/)](http://markweinguitarlessons.com/forums/)*: top 100M, forum, hobby* +1. ![](https://www.google.com/s2/favicons?domain=http://medteh.info) [medteh.info (http://medteh.info)](http://medteh.info)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://milliarderr.com) [milliarderr.com (http://milliarderr.com)](http://milliarderr.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mkr-rodniki.ru) [mkr-rodniki.ru (http://mkr-rodniki.ru)](http://mkr-rodniki.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.modnaya.org/) [modnaya (https://forum.modnaya.org/)](https://forum.modnaya.org/)*: top 100M, forum, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://moscherb.ru) [moscherb.ru (http://moscherb.ru)](http://moscherb.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://moto-travels.ru) [moto-travels.ru (http://moto-travels.ru)](http://moto-travels.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://motoomsk.ru) [motoomsk.ru (http://motoomsk.ru)](http://motoomsk.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://naruto-base.tv) [naruto-base.tv (http://naruto-base.tv)](http://naruto-base.tv)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://narutoclan.ru) [narutoclan.ru (http://narutoclan.ru)](http://narutoclan.ru)*: top 100M, medicine*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://news.toretsk.online) [news.toretsk.online (http://news.toretsk.online)](http://news.toretsk.online)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://nf-club.ru) [nf-club.ru (http://nf-club.ru)](http://nf-club.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://odonvv.ru) [odonvv.ru (http://odonvv.ru)](http://odonvv.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://old.rubezhnoe.com) [old.rubezhnoe.com (http://old.rubezhnoe.com)](http://old.rubezhnoe.com)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://www.ozcardtrader.com.au/community/) [ozcardtrader.com.au (http://www.ozcardtrader.com.au/community/)](http://www.ozcardtrader.com.au/community/)*: top 100M, au, forum, sport* +1. ![](https://www.google.com/s2/favicons?domain=http://p8ntballer-forums.com/) [p8ntballer-forums.com (http://p8ntballer-forums.com/)](http://p8ntballer-forums.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://panzer35.ru) [panzer35.ru (http://panzer35.ru)](http://panzer35.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.playtime-forum.info) [playtime (https://forum.playtime-forum.info)](https://forum.playtime-forum.info)*: top 100M, de, forum, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://privateinvestor2000.com) [privateinvestor2000.com (http://privateinvestor2000.com)](http://privateinvestor2000.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://prizyvnikmoy.ru) [prizyvnikmoy.ru (http://prizyvnikmoy.ru)](http://prizyvnikmoy.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pvpru.com/) [pvpru (https://pvpru.com/)](https://pvpru.com/)*: top 100M, gaming, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://python.su/) [python.su (https://python.su/)](https://python.su/)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://qiwi.me) [qiwi.me (https://qiwi.me)](https://qiwi.me)*: top 100M, finance, fintech, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.quik.ru) [quik (https://forum.quik.ru)](https://forum.quik.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://realitygaming.fr/) [realitygaming.fr (http://realitygaming.fr/)](http://realitygaming.fr/)*: top 100M, forum, fr* +1. ![](https://www.google.com/s2/favicons?domain=http://relasko.ru) [relasko.ru (http://relasko.ru)](http://relasko.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.reverse4you.org) [reverse4you (https://forum.reverse4you.org)](https://forum.reverse4you.org)*: top 100M, forum, lk, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.ruboard.ru) [ruboard (https://forum.ruboard.ru)](https://forum.ruboard.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://russiinitalia.com) [russiinitalia.com (http://russiinitalia.com)](http://russiinitalia.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://samp-rus.com) [samp-rus.com (http://samp-rus.com)](http://samp-rus.com)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://samp-sektor.ru) [samp-sektor.ru (http://samp-sektor.ru)](http://samp-sektor.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.sciax2.it/forum/) [sciax2.it (https://www.sciax2.it/forum/)](https://www.sciax2.it/forum/)*: top 100M, forum, tr* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.scuba-divers.ru/) [scuba (http://forum.scuba-divers.ru/)](http://forum.scuba-divers.ru/)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://secret.kompas3d.su) [secret.kompas3d.su (http://secret.kompas3d.su)](http://secret.kompas3d.su)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://soldati-russian.ru) [soldati-russian.ru (http://soldati-russian.ru)](http://soldati-russian.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.somersoft.com/) [somersoft.com (https://www.somersoft.com/)](https://www.somersoft.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://soslujivzi.ru) [soslujivzi.ru (http://soslujivzi.ru)](http://soslujivzi.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.sourceruns.org/) [sourceruns (https://forums.sourceruns.org/)](https://forums.sourceruns.org/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://sovgavan.ru) [sovgavan.ru (http://sovgavan.ru)](http://sovgavan.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://orbys.net) [Orbys (https://orbys.net)](https://orbys.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sportsjournalists.com/forum/) [sportsjournalists.com (http://sportsjournalists.com/forum/)](http://sportsjournalists.com/forum/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://studentur.com.ua) [studentur.com.ua (http://studentur.com.ua)](http://studentur.com.ua)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://www.svidbook.ru/) [svidbook (https://www.svidbook.ru/)](https://www.svidbook.ru/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.swiftbook.ru) [swiftbook (https://forum.swiftbook.ru)](https://forum.swiftbook.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://thaicat.ru) [thaicat.ru (http://thaicat.ru)](http://thaicat.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.theburningprocess.com/) [theburningprocess.com (http://www.theburningprocess.com/)](http://www.theburningprocess.com/)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.theprodigy.ru/) [theprodigy (https://forum.theprodigy.ru/)](https://forum.theprodigy.ru/)*: top 100M, forum, ru, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://www.theturboforums.com/forums/) [theturboforums.com (https://www.theturboforums.com/forums/)](https://www.theturboforums.com/forums/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://tracr.co/) [tracr.co (https://tracr.co/)](https://tracr.co/)*: top 100M, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://transit-club.com) [transit-club.com (http://transit-club.com)](http://transit-club.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://uaodessa.com) [uaodessa.com (http://uaodessa.com)](http://uaodessa.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ucozon.ru) [ucozon.ru (http://ucozon.ru)](http://ucozon.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://usman48.ru) [usman48.ru (http://usman48.ru)](http://usman48.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://vento-club.com) [vento-club.com (http://vento-club.com)](http://vento-club.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vilinburg.net) [vilinburg.net (http://vilinburg.net)](http://vilinburg.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.watcheshop.ru) [watcheshop (http://forum.watcheshop.ru)](http://forum.watcheshop.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://www.x-h2o.com/) [x-h2o.com (http://www.x-h2o.com/)](http://www.x-h2o.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.z28.com/) [z28.com (https://www.z28.com/)](https://www.z28.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=) [Znanylekarz.pl ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://horek-samara.ru) [horek-samara.ru (http://horek-samara.ru)](http://horek-samara.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://animal-hope.ru) [animal-hope.ru (http://animal-hope.ru)](http://animal-hope.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://staffbull.info) [staffbull.info (http://staffbull.info)](http://staffbull.info)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://alisaclub.ru) [alisaclub.ru (http://alisaclub.ru)](http://alisaclub.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://endoctor.ru) [endoctor.ru (http://endoctor.ru)](http://endoctor.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://n-ataeva.ru) [n-ataeva.ru (http://n-ataeva.ru)](http://n-ataeva.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://uroportal.com.ua) [uroportal.com.ua (http://uroportal.com.ua)](http://uroportal.com.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.u-hiv.ru) [forum.u-hiv.ru (http://forum.u-hiv.ru)](http://forum.u-hiv.ru)*: top 100M, forum, medicine, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://dr-denisov.ru) [dr-denisov.ru (http://dr-denisov.ru)](http://dr-denisov.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://electronic-cigarette.ru) [electronic-cigarette.ru (http://electronic-cigarette.ru)](http://electronic-cigarette.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://help-baby.org) [help-baby.org (http://help-baby.org)](http://help-baby.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://psy-dv.org) [psy-dv.org (http://psy-dv.org)](http://psy-dv.org)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://psy-music.ru) [psy-music.ru (http://psy-music.ru)](http://psy-music.ru)*: top 100M, fi, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://ford-mondeoff.ru) [ford-mondeoff.ru (http://ford-mondeoff.ru)](http://ford-mondeoff.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://auto63.ru) [auto63.ru (http://auto63.ru)](http://auto63.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://wedding-image.ru) [wedding-image.ru (http://wedding-image.ru)](http://wedding-image.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://cod.by) [cod.by (http://cod.by)](http://cod.by)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://klub-skidok.ru) [klub-skidok.ru (http://klub-skidok.ru)](http://klub-skidok.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pubert.company) [pubert.company (http://pubert.company)](http://pubert.company)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://avon-registry.com.ua) [avon-registry.com.ua (http://avon-registry.com.ua)](http://avon-registry.com.ua)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://doska.hashmalay.co.il) [doska.hashmalay.co.il (http://doska.hashmalay.co.il)](http://doska.hashmalay.co.il)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://hitechnic.org) [hitechnic.org (http://hitechnic.org)](http://hitechnic.org)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://gallasy.com) [gallasy.com (http://gallasy.com)](http://gallasy.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://satwarez.ru) [satwarez.ru (http://satwarez.ru)](http://satwarez.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://aquamen.ru) [aquamen.ru (http://aquamen.ru)](http://aquamen.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kam-mamochka.ru) [kam-mamochka.ru (http://kam-mamochka.ru)](http://kam-mamochka.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://fordating.ru) [fordating.ru (http://fordating.ru)](http://fordating.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://goba6372.ru) [goba6372.ru (http://goba6372.ru)](http://goba6372.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://student-telecom.ru) [student-telecom.ru (http://student-telecom.ru)](http://student-telecom.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kliki-doma.ru) [kliki-doma.ru (http://kliki-doma.ru)](http://kliki-doma.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://magictarot.ru) [magictarot.ru (http://magictarot.ru)](http://magictarot.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://avtoexamen.com) [avtoexamen.com (http://avtoexamen.com)](http://avtoexamen.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sms.portalsms.ru) [sms.portalsms.ru (http://sms.portalsms.ru)](http://sms.portalsms.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kiev-live.com) [kiev-live.com (http://kiev-live.com)](http://kiev-live.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://svadba-orel.com) [svadba-orel.com (http://svadba-orel.com)](http://svadba-orel.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://nojay-urt.ru) [nojay-urt.ru (http://nojay-urt.ru)](http://nojay-urt.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://virtualrift.ru) [virtualrift.ru (http://virtualrift.ru)](http://virtualrift.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vfarte.ru) [vfarte.ru (http://vfarte.ru)](http://vfarte.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://uralstanko.ru) [uralstanko.ru (http://uralstanko.ru)](http://uralstanko.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://kotel-torg.ru) [kotel-torg.ru (http://kotel-torg.ru)](http://kotel-torg.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://4948.ru) [4948.ru (http://4948.ru)](http://4948.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xn--90anbhklk.xn--p1ai) [xn--90anbhklk.xn--p1ai (http://xn--90anbhklk.xn--p1ai)](http://xn--90anbhklk.xn--p1ai)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://risefilm.ru) [risefilm.ru (http://risefilm.ru)](http://risefilm.ru)*: top 100M, movies, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://tavr-obrazovanie.ru) [tavr-obrazovanie.ru (http://tavr-obrazovanie.ru)](http://tavr-obrazovanie.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://timich.ru) [timich.ru (http://timich.ru)](http://timich.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://englishinfo.ru) [englishinfo.ru (http://englishinfo.ru)](http://englishinfo.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vl-dimir.ru) [vl-dimir.ru (http://vl-dimir.ru)](http://vl-dimir.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://aleks2.ru) [aleks2.ru (http://aleks2.ru)](http://aleks2.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://upbyte.net) [upbyte.net (http://upbyte.net)](http://upbyte.net)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://mamasuper.ru) [mamasuper.ru (http://mamasuper.ru)](http://mamasuper.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://artmilitaire.ru) [artmilitaire.ru (http://artmilitaire.ru)](http://artmilitaire.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://pticevodov.ru) [pticevodov.ru (http://pticevodov.ru)](http://pticevodov.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://toys22.ru) [toys22.ru (http://toys22.ru)](http://toys22.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sharzh-portret.ru) [sharzh-portret.ru (http://sharzh-portret.ru)](http://sharzh-portret.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://specchiasol.ru) [specchiasol.ru (http://specchiasol.ru)](http://specchiasol.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://led-vector.ru) [led-vector.ru (http://led-vector.ru)](http://led-vector.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://shansonportal.ru) [shansonportal.ru (http://shansonportal.ru)](http://shansonportal.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://medvestnic.ru) [medvestnic.ru (http://medvestnic.ru)](http://medvestnic.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://3glaz.org) [3glaz.org (http://3glaz.org)](http://3glaz.org)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://kadroviku.ru) [kadroviku.ru (http://kadroviku.ru)](http://kadroviku.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://iberia-pw.ru) [iberia-pw.ru (http://iberia-pw.ru)](http://iberia-pw.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://moneysfirst.ru) [moneysfirst.ru (http://moneysfirst.ru)](http://moneysfirst.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kinomir.org) [kinomir.org (http://kinomir.org)](http://kinomir.org)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://spishu.ru) [spishu.ru (http://spishu.ru)](http://spishu.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://psychotype.info) [psychotype.info (http://psychotype.info)](http://psychotype.info)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://teplohorosho.ru) [teplohorosho.ru (http://teplohorosho.ru)](http://teplohorosho.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://memory.lol) [memory.lol (https://memory.lol)](https://memory.lol)*: top 100M, messaging* +1. ![](https://www.google.com/s2/favicons?domain=http://xn--90aybfeg.xn--p1ai) [xn--90aybfeg.xn--p1ai (http://xn--90aybfeg.xn--p1ai)](http://xn--90aybfeg.xn--p1ai)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kazamuza.net) [kazamuza.net (http://kazamuza.net)](http://kazamuza.net)*: top 100M, kz* +1. ![](https://www.google.com/s2/favicons?domain=http://rodobozhie.ru) [rodobozhie.ru (http://rodobozhie.ru)](http://rodobozhie.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://mox.vo.uz) [mox.vo.uz (http://mox.vo.uz)](http://mox.vo.uz)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://rasskazovskie.ru) [rasskazovskie.ru (http://rasskazovskie.ru)](http://rasskazovskie.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://162nord.org) [162nord.org (http://162nord.org)](http://162nord.org)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://counter-art.ru) [counter-art.ru (http://counter-art.ru)](http://counter-art.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://bce-tyt.ru) [bce-tyt.ru (http://bce-tyt.ru)](http://bce-tyt.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://shipsondesk.info) [shipsondesk.info (http://shipsondesk.info)](http://shipsondesk.info)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vrn-sms.ru) [vrn-sms.ru (http://vrn-sms.ru)](http://vrn-sms.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://metod-psv.ru) [metod-psv.ru (http://metod-psv.ru)](http://metod-psv.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://sefirut.ru) [sefirut.ru (http://sefirut.ru)](http://sefirut.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vseotkritki.ru) [vseotkritki.ru (http://vseotkritki.ru)](http://vseotkritki.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://ercevo.ru) [ercevo.ru (http://ercevo.ru)](http://ercevo.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://abho.ru) [abho.ru (http://abho.ru)](http://abho.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://l2bz.ru) [l2bz.ru (http://l2bz.ru)](http://l2bz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://sstalkers.ru) [sstalkers.ru (http://sstalkers.ru)](http://sstalkers.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://lavkachudec.ru) [lavkachudec.ru (http://lavkachudec.ru)](http://lavkachudec.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://krasnovodsk.net) [krasnovodsk.net (http://krasnovodsk.net)](http://krasnovodsk.net)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://provincialynews.ru) [provincialynews.ru (http://provincialynews.ru)](http://provincialynews.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://gym5.net) [gym5.net (http://gym5.net)](http://gym5.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xn----7sbb0bfjrbhdi.xn--p1ai) [xn----7sbb0bfjrbhdi.xn--p1ai (http://xn----7sbb0bfjrbhdi.xn--p1ai)](http://xn----7sbb0bfjrbhdi.xn--p1ai)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://jek-auto.ru) [jek-auto.ru (http://jek-auto.ru)](http://jek-auto.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://1001facts.ru) [1001facts.ru (http://1001facts.ru)](http://1001facts.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xn----7sbfejdvocrv7adem.xn--p1ai) [xn----7sbfejdvocrv7adem.xn--p1ai (http://xn----7sbfejdvocrv7adem.xn--p1ai)](http://xn----7sbfejdvocrv7adem.xn--p1ai)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://religionlaw.ru) [religionlaw.ru (http://religionlaw.ru)](http://religionlaw.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://chelny-diplom.ru) [chelny-diplom.ru (http://chelny-diplom.ru)](http://chelny-diplom.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://likerr.ru) [likerr.ru (http://likerr.ru)](http://likerr.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://pozdrawlandiya.ru) [pozdrawlandiya.ru (http://pozdrawlandiya.ru)](http://pozdrawlandiya.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://aktualno.lv) [aktualno.lv (http://aktualno.lv)](http://aktualno.lv)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://megabravo.tk) [megabravo.tk (http://megabravo.tk)](http://megabravo.tk)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://once-upon-a-time-tv.ru) [once-upon-a-time-tv.ru (http://once-upon-a-time-tv.ru)](http://once-upon-a-time-tv.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dreddmc.ru) [dreddmc.ru (http://dreddmc.ru)](http://dreddmc.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://okm.org.ru) [okm.org.ru (http://okm.org.ru)](http://okm.org.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://demon-art.ru) [demon-art.ru (http://demon-art.ru)](http://demon-art.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://all-gta.info) [all-gta.info (http://all-gta.info)](http://all-gta.info)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://bestclips.ws) [bestclips.ws (http://bestclips.ws)](http://bestclips.ws)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://lemfo-russia.ru) [lemfo-russia.ru (http://lemfo-russia.ru)](http://lemfo-russia.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://laserwar48.ru) [laserwar48.ru (http://laserwar48.ru)](http://laserwar48.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://japanesedolls.ru) [japanesedolls.ru (http://japanesedolls.ru)](http://japanesedolls.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://israelrent.info) [israelrent.info (http://israelrent.info)](http://israelrent.info)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://grand-magic.ru) [grand-magic.ru (http://grand-magic.ru)](http://grand-magic.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://darkart3d.ru) [darkart3d.ru (http://darkart3d.ru)](http://darkart3d.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://wm-maximum.ru) [wm-maximum.ru (http://wm-maximum.ru)](http://wm-maximum.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://ukrelektrik.com) [ukrelektrik.com (http://ukrelektrik.com)](http://ukrelektrik.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://mark.szenprogs.ru) [mark.szenprogs.ru (http://mark.szenprogs.ru)](http://mark.szenprogs.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://parusa-magellana.ru) [parusa-magellana.ru (http://parusa-magellana.ru)](http://parusa-magellana.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zerkalastekla.ru) [zerkalastekla.ru (http://zerkalastekla.ru)](http://zerkalastekla.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://skorozamuj.com) [skorozamuj.com (http://skorozamuj.com)](http://skorozamuj.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kino-horror.ru) [kino-horror.ru (http://kino-horror.ru)](http://kino-horror.ru)*: top 100M, ru, ua*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://centr-spektr.ru) [centr-spektr.ru (http://centr-spektr.ru)](http://centr-spektr.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ofc65.ru) [ofc65.ru (http://ofc65.ru)](http://ofc65.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://v3de.ru) [v3de.ru (http://v3de.ru)](http://v3de.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://xn--80aqkf5cb.xn--p1ai) [xn--80aqkf5cb.xn--p1ai (http://xn--80aqkf5cb.xn--p1ai)](http://xn--80aqkf5cb.xn--p1ai)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://oldones.org) [oldones.org (http://oldones.org)](http://oldones.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kashanya.com) [kashanya.com (http://kashanya.com)](http://kashanya.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://southparkz.net) [southparkz.net (http://southparkz.net)](http://southparkz.net)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://vivasan.mobi) [vivasan.mobi (http://vivasan.mobi)](http://vivasan.mobi)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://budo52.ru) [budo52.ru (http://budo52.ru)](http://budo52.ru)*: top 100M, ru, sport* +1. ![](https://www.google.com/s2/favicons?domain=http://iceberg-116.ru) [iceberg-116.ru (http://iceberg-116.ru)](http://iceberg-116.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://android-gameworld.ru) [android-gameworld.ru (http://android-gameworld.ru)](http://android-gameworld.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://mastersoap.ru) [mastersoap.ru (http://mastersoap.ru)](http://mastersoap.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://club-gas.ru) [club-gas.ru (http://club-gas.ru)](http://club-gas.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://podolog.su) [podolog.su (http://podolog.su)](http://podolog.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dreamteam43.ru) [dreamteam43.ru (http://dreamteam43.ru)](http://dreamteam43.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://liozno.info) [liozno.info (http://liozno.info)](http://liozno.info)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://razvilnoe.ru) [razvilnoe.ru (http://razvilnoe.ru)](http://razvilnoe.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://rcprim.ru) [rcprim.ru (http://rcprim.ru)](http://rcprim.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://domfrunze.kg) [domfrunze.kg (http://domfrunze.kg)](http://domfrunze.kg)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://santeh-sinfo.ru) [santeh-sinfo.ru (http://santeh-sinfo.ru)](http://santeh-sinfo.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xristos.vo.uz) [xristos.vo.uz (http://xristos.vo.uz)](http://xristos.vo.uz)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://si-sv.com) [si-sv.com (http://si-sv.com)](http://si-sv.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://ohypnose.ru) [ohypnose.ru (http://ohypnose.ru)](http://ohypnose.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://musicbunker.ru) [musicbunker.ru (http://musicbunker.ru)](http://musicbunker.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://edumonch.ru) [edumonch.ru (http://edumonch.ru)](http://edumonch.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ksmsp.ru) [ksmsp.ru (http://ksmsp.ru)](http://ksmsp.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://worldofdragonage.ru) [worldofdragonage.ru (http://worldofdragonage.ru)](http://worldofdragonage.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zapravkaavto.ru) [zapravkaavto.ru (http://zapravkaavto.ru)](http://zapravkaavto.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://talimger.org) [talimger.org (http://talimger.org)](http://talimger.org)*: top 100M, kz* +1. ![](https://www.google.com/s2/favicons?domain=http://fanacmilan.com) [fanacmilan.com (http://fanacmilan.com)](http://fanacmilan.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://allmobile.vo.uz) [allmobile.vo.uz (http://allmobile.vo.uz)](http://allmobile.vo.uz)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://gorposmos.ru) [gorposmos.ru (http://gorposmos.ru)](http://gorposmos.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://css-play4fun.ru) [css-play4fun.ru (http://css-play4fun.ru)](http://css-play4fun.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kaiserslautern.su) [kaiserslautern.su (http://kaiserslautern.su)](http://kaiserslautern.su)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://7x.net.ua) [7x.net.ua (http://7x.net.ua)](http://7x.net.ua)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://salutm.ru) [salutm.ru (http://salutm.ru)](http://salutm.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://spectrum-z.ru) [spectrum-z.ru (http://spectrum-z.ru)](http://spectrum-z.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://zdesvsyo.com) [zdesvsyo.com (http://zdesvsyo.com)](http://zdesvsyo.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://ladpremiya.ru) [ladpremiya.ru (http://ladpremiya.ru)](http://ladpremiya.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://kaz.ionyk.ru) [kaz.ionyk.ru (http://kaz.ionyk.ru)](http://kaz.ionyk.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://electronic-component.org) [electronic-component.org (http://electronic-component.org)](http://electronic-component.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xn--80aepdb4ag.xn--p1ai) [xn--80aepdb4ag.xn--p1ai (http://xn--80aepdb4ag.xn--p1ai)](http://xn--80aepdb4ag.xn--p1ai)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://personagra-ta.ru) [personagra-ta.ru (http://personagra-ta.ru)](http://personagra-ta.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://thelike.ru) [thelike.ru (http://thelike.ru)](http://thelike.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://show.co.ua) [show.co.ua (http://show.co.ua)](http://show.co.ua)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://irteam.ru) [irteam.ru (http://irteam.ru)](http://irteam.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://spaceserials.ru) [spaceserials.ru (http://spaceserials.ru)](http://spaceserials.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://profsouz-au.ru) [profsouz-au.ru (http://profsouz-au.ru)](http://profsouz-au.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://vkusnyashkino.ru) [vkusnyashkino.ru (http://vkusnyashkino.ru)](http://vkusnyashkino.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://metrologika.ru) [metrologika.ru (http://metrologika.ru)](http://metrologika.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://bookz.su) [bookz.su (http://bookz.su)](http://bookz.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ahera.ru) [ahera.ru (http://ahera.ru)](http://ahera.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xn----7sbcctevcqafop1aviko5l.xn--p1ai) [xn----7sbcctevcqafop1aviko5l.xn--p1ai (http://xn----7sbcctevcqafop1aviko5l.xn--p1ai)](http://xn----7sbcctevcqafop1aviko5l.xn--p1ai)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://zornet.ru) [zornet.ru (http://zornet.ru)](http://zornet.ru)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://na-sochi.ru) [na-sochi.ru (http://na-sochi.ru)](http://na-sochi.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://kredituemall.ru) [kredituemall.ru (http://kredituemall.ru)](http://kredituemall.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mircasov.ru) [mircasov.ru (http://mircasov.ru)](http://mircasov.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://xn--24-6kcaal6ajt1cpibnu7d5dtc.xn--p1ai) [xn--24-6kcaal6ajt1cpibnu7d5dtc.xn--p1ai (http://xn--24-6kcaal6ajt1cpibnu7d5dtc.xn--p1ai)](http://xn--24-6kcaal6ajt1cpibnu7d5dtc.xn--p1ai)*: top 100M, medicine, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://zapgame.ru) [zapgame.ru (http://zapgame.ru)](http://zapgame.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://yagubov.site) [yagubov.site (http://yagubov.site)](http://yagubov.site)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://masseffect-universe.com) [masseffect-universe.com (http://masseffect-universe.com)](http://masseffect-universe.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://ufive.ru) [ufive.ru (http://ufive.ru)](http://ufive.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mir2007.ru) [mir2007.ru (http://mir2007.ru)](http://mir2007.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://hokage.tv) [hokage.tv (http://hokage.tv)](http://hokage.tv)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dzintarsmos09.ru) [dzintarsmos09.ru (http://dzintarsmos09.ru)](http://dzintarsmos09.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://aribut.ru) [aribut.ru (http://aribut.ru)](http://aribut.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://tlgrm.pro) [tlgrm.pro (http://tlgrm.pro)](http://tlgrm.pro)*: top 100M, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://ucozzz.ru) [ucozzz.ru (http://ucozzz.ru)](http://ucozzz.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://freelancehunt.ru) [freelancehunt.ru (https://freelancehunt.ru)](https://freelancehunt.ru)*: top 100M, ru, uz* +1. ![](https://www.google.com/s2/favicons?domain=https://selly.gg) [selly.gg (https://selly.gg)](https://selly.gg)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://hosting.kitchen) [hosting.kitchen (https://hosting.kitchen)](https://hosting.kitchen)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://freelansim.ru) [freelansim.ru (https://freelansim.ru)](https://freelansim.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://protovary.style) [Protovary.style (https://protovary.style)](https://protovary.style)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.nemodniy.ru) [forum.nemodniy.ru (http://forum.nemodniy.ru)](http://forum.nemodniy.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.uinsell.net) [forum.uinsell.net (http://forum.uinsell.net)](http://forum.uinsell.net)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://brute.pw) [brute.pw (https://brute.pw)](https://brute.pw)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://dapf.ru) [dapf.ru (https://dapf.ru)](https://dapf.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://onanizm.club) [onanizm.club (http://onanizm.club)](http://onanizm.club)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://mednolit.ru) [mednolit.ru (http://mednolit.ru)](http://mednolit.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://mikele-loconte.ru) [mikele-loconte.ru (http://mikele-loconte.ru)](http://mikele-loconte.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://mkuniverse.ru) [mkuniverse.ru (http://mkuniverse.ru)](http://mkuniverse.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://localcryptosapi.com) [LocalCryptos (https://localcryptosapi.com)](https://localcryptosapi.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://codeseller.ru) [codeseller.ru (https://codeseller.ru)](https://codeseller.ru)*: top 100M, kz, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://linuxpip.org) [linuxpip.org (https://linuxpip.org)](https://linuxpip.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://webonrails.ru) [webonrails.ru (https://webonrails.ru)](https://webonrails.ru)*: top 100M, coding, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://support.blue-systems.com) [support.blue-systems.com (https://support.blue-systems.com)](https://support.blue-systems.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://universemc.us) [universemc.us (https://universemc.us)](https://universemc.us)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://slivsklad.ru) [slivsklad.ru (https://slivsklad.ru)](https://slivsklad.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://slivap.ru) [slivap.ru (https://slivap.ru)](https://slivap.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://skynetzone.net) [skynetzone.net (https://skynetzone.net)](https://skynetzone.net)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://tapd.co) [TAP'D (https://tapd.co)](https://tapd.co)*: top 100M, networking* +1. ![](https://www.google.com/s2/favicons?domain=https://wblitz.net) [wblitz.net (https://wblitz.net)](https://wblitz.net)*: top 100M, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://unc.ua) [unc.ua (https://unc.ua)](https://unc.ua)*: top 100M, ua* +1. ![](https://www.google.com/s2/favicons?domain=http://nevrotic.net) [nevrotic.net (http://nevrotic.net)](http://nevrotic.net)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://pikabu.monster) [pikabu.monster (https://pikabu.monster)](https://pikabu.monster)*: top 100M, ru, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://smihub.com) [SmiHub (https://smihub.com)](https://smihub.com)*: top 100M, photo*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://do100verno.info) [do100verno.info (https://do100verno.info)](https://do100verno.info)*: top 100M, blog*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.kinokopilka.pro) [www.kinokopilka.pro (https://www.kinokopilka.pro)](https://www.kinokopilka.pro)*: top 100M, il* +1. ![](https://www.google.com/s2/favicons?domain=https://git.tcp.direct) [git.tcp.direct (https://git.tcp.direct)](https://git.tcp.direct)*: top 100M, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://hyprr.com) [hyprr.com (https://hyprr.com)](https://hyprr.com)*: top 100M, photo, sharing* +1. ![](https://www.google.com/s2/favicons?domain=https://akforum.ru) [akforum.ru (https://akforum.ru)](https://akforum.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://antiscam.space) [antiscam.space (https://antiscam.space)](https://antiscam.space)*: top 100M, cybercriminal, education, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://arcolinuxforum.com) [arcolinuxforum.com (https://arcolinuxforum.com)](https://arcolinuxforum.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://niflheim.top) [niflheim.top (https://niflheim.top)](https://niflheim.top)*: top 100M, eg, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://indiatv-forum.ru) [indiatv-forum.ru (https://indiatv-forum.ru)](https://indiatv-forum.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.pavlovskyposad.ru) [forum.pavlovskyposad.ru (http://forum.pavlovskyposad.ru)](http://forum.pavlovskyposad.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://lampoviedushi.hammarlund.ru) [lampoviedushi.hammarlund.ru (http://lampoviedushi.hammarlund.ru)](http://lampoviedushi.hammarlund.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.betsportslive.ru) [forum.betsportslive.ru (https://forum.betsportslive.ru)](https://forum.betsportslive.ru)*: top 100M, forum, ru, sport* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.heroesleague.ru) [forum.heroesleague.ru (http://forum.heroesleague.ru)](http://forum.heroesleague.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.egoforum.ru) [egoforum.ru (https://www.egoforum.ru)](https://www.egoforum.ru)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://deeptor.ws) [deeptor.ws (https://deeptor.ws)](https://deeptor.ws)*: top 100M, forum, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://boominfo.org) [boominfo.org (https://boominfo.org)](https://boominfo.org)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://egiki.ru) [egiki.ru (http://egiki.ru)](http://egiki.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.1796web.com) [forum.1796web.com (https://forum.1796web.com)](https://forum.1796web.com)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.danetka.ru) [forum.danetka.ru (http://forum.danetka.ru)](http://forum.danetka.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.evendim.ru) [forum.evendim.ru (http://forum.evendim.ru)](http://forum.evendim.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://tottenhamhotspur.ru) [tottenhamhotspur.ru (http://tottenhamhotspur.ru)](http://tottenhamhotspur.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://syberpussy.com) [syberpussy.com (https://syberpussy.com)](https://syberpussy.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://frauflora.ru) [frauflora.ru (http://frauflora.ru)](http://frauflora.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://forum.balletfriends.ru) [forum.balletfriends.ru (http://forum.balletfriends.ru)](http://forum.balletfriends.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://minesuperior.com) [minesuperior.com (https://minesuperior.com)](https://minesuperior.com)*: top 100M, forum, pk* +1. ![](https://www.google.com/s2/favicons?domain=https://www.safesurvival.net) [safesurvival.net (https://www.safesurvival.net)](https://www.safesurvival.net)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.rusbani.ru) [forum.rusbani.ru (http://forum.rusbani.ru)](http://forum.rusbani.ru)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://stop-narko.info) [stop-narko.info (http://stop-narko.info)](http://stop-narko.info)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.foe-rechner.de) [forum.foe-rechner.de (https://forum.foe-rechner.de)](https://forum.foe-rechner.de)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.paradox.network) [forum.paradox.network (https://forum.paradox.network)](https://forum.paradox.network)*: top 100M, de, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.foodomaa.com) [discuss.foodomaa.com (https://discuss.foodomaa.com)](https://discuss.foodomaa.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forumbebas.com) [forumbebas.com (https://forumbebas.com)](https://forumbebas.com)*: top 100M, forum, id* +1. ![](https://www.google.com/s2/favicons?domain=https://flutterforum.org) [flutterforum.org (https://flutterforum.org)](https://flutterforum.org)*: top 100M, forum, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://community.gozenhost.com) [community.gozenhost.com (https://community.gozenhost.com)](https://community.gozenhost.com)*: top 100M, gr* +1. ![](https://www.google.com/s2/favicons?domain=https://yesilpara.com) [yesilpara.com (https://yesilpara.com)](https://yesilpara.com)*: top 100M, tr* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.prihoz.ru) [forum.prihoz.ru (https://forum.prihoz.ru)](https://forum.prihoz.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://soborno.ru) [soborno.ru (https://soborno.ru)](https://soborno.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.wladimir.su) [forum.wladimir.su (http://forum.wladimir.su)](http://forum.wladimir.su)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://snowblowerforum.com) [snowblowerforum.com (https://snowblowerforum.com)](https://snowblowerforum.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://videoforums.ru) [videoforums.ru (http://videoforums.ru)](http://videoforums.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://lubuntu.ru) [lubuntu.ru (https://lubuntu.ru)](https://lubuntu.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.dusterclub.ru) [forum.dusterclub.ru (http://forum.dusterclub.ru)](http://forum.dusterclub.ru)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://openssource.info) [openssource.info (https://openssource.info)](https://openssource.info)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://rub.altai.su) [rub.altai.su (http://rub.altai.su)](http://rub.altai.su)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mailpass.site) [mailpass.site (https://mailpass.site)](https://mailpass.site)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.rastrnet.ru) [forum.rastrnet.ru (http://forum.rastrnet.ru)](http://forum.rastrnet.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forumbusiness.net) [forumbusiness.net (http://forumbusiness.net)](http://forumbusiness.net)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://se.guru) [se.guru (https://se.guru)](https://se.guru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://ovnl.in) [ovnl.in (https://ovnl.in)](https://ovnl.in)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://porschec.ru) [porschec.ru (http://porschec.ru)](http://porschec.ru)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://mindmachine.ru/) [mindmachine.ru (https://mindmachine.ru/)](https://mindmachine.ru/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://nelubit.ru) [nelubit.ru (https://nelubit.ru)](https://nelubit.ru)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://actual-porn.org) [actual-porn.org (http://actual-porn.org)](http://actual-porn.org)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://wls.social) [wls.social (https://wls.social)](https://wls.social)*: top 100M, blog*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://linkkle.com) [Linkkle (https://linkkle.com)](https://linkkle.com)*: top 100M, links* +1. ![](https://www.google.com/s2/favicons?domain=http://allmy.link) [ContactInBio (URL) (http://allmy.link)](http://allmy.link)*: top 100M, links* +1. ![](https://www.google.com/s2/favicons?domain=https://www.skypli.com) [Skypli (https://www.skypli.com)](https://www.skypli.com)*: top 100M, messaging*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.purephoto.com) [Purephoto (https://www.purephoto.com)](https://www.purephoto.com)*: top 100M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://elibrary.tips) [elibrary.tips (https://elibrary.tips)](https://elibrary.tips)*: top 100M, education, pl* +1. ![](https://www.google.com/s2/favicons?domain=https://ozvolvo.org) [ozvolvo.org (https://ozvolvo.org)](https://ozvolvo.org)*: top 100M, auto* +1. ![](https://www.google.com/s2/favicons?domain=https://mymfb.com) [mymfb.com (https://mymfb.com)](https://mymfb.com)*: top 100M, networking* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.leerlingen.com) [forum.leerlingen.com (http://forum.leerlingen.com)](http://forum.leerlingen.com)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://porevo.site) [Porevo (https://porevo.site)](https://porevo.site)*: top 100M, porn* +1. ![](https://www.google.com/s2/favicons?domain=http://answerszuvs3gg2l64e6hmnryudl5zgrmwm3vh65hzszdghblddvfiqd.onion) [HiddenAnswers (http://answerszuvs3gg2l64e6hmnryudl5zgrmwm3vh65hzszdghblddvfiqd.onion)](http://answerszuvs3gg2l64e6hmnryudl5zgrmwm3vh65hzszdghblddvfiqd.onion)*: top 100M, q&a, tor* +1. ![](https://www.google.com/s2/favicons?domain=http://forums.dds6qkxpwdeubwucdiaord2xgbbeyds25rbsgr73tbfpqpt4a6vjwsyd.onion) [Whonix Forum Tor (http://forums.dds6qkxpwdeubwucdiaord2xgbbeyds25rbsgr73tbfpqpt4a6vjwsyd.onion)](http://forums.dds6qkxpwdeubwucdiaord2xgbbeyds25rbsgr73tbfpqpt4a6vjwsyd.onion)*: top 100M, forum, tech, tor* +1. ![](https://www.google.com/s2/favicons?domain=http://snsnsnya6h3ot563f3p566wuhfoklkg5f62hokdlaqzcaub3gf4xlxyd.onion) [Stacker News Tor (http://snsnsnya6h3ot563f3p566wuhfoklkg5f62hokdlaqzcaub3gf4xlxyd.onion)](http://snsnsnya6h3ot563f3p566wuhfoklkg5f62hokdlaqzcaub3gf4xlxyd.onion)*: top 100M, news, social, tor* +1. ![](https://www.google.com/s2/favicons?domain={username}.com) [{username}.com ({username}.com)]({username}.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain={username}.pro) [{username}.pro ({username}.pro)]({username}.pro)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain={username}.me) [{username}.me ({username}.me)]({username}.me)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain={username}.biz) [{username}.biz ({username}.biz)]({username}.biz)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain={username}.email) [{username}.email ({username}.email)]({username}.email)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain={username}.guru) [{username}.guru ({username}.guru)]({username}.guru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://galactictalk.org) [galactictalk.org (https://galactictalk.org)](https://galactictalk.org)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.bootstrapped.fm) [discuss.bootstrapped.fm (https://discuss.bootstrapped.fm)](https://discuss.bootstrapped.fm)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://ipinit.in) [ipinit.in (http://ipinit.in)](http://ipinit.in)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://getmakerlog.com) [getmakerlog.com (https://getmakerlog.com)](https://getmakerlog.com)*: top 100M, business* +1. ![](https://www.google.com/s2/favicons?domain=https://aussiehomebrewer.com) [aussiehomebrewer.com (https://aussiehomebrewer.com)](https://aussiehomebrewer.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum-ukraina.net) [forum-ukraina.net (https://forum-ukraina.net)](https://forum-ukraina.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://forum-history.ru) [forum-history.ru (http://forum-history.ru)](http://forum-history.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.alconar.ru) [forum.alconar.ru (https://forum.alconar.ru)](https://forum.alconar.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.lancerx.ru) [forum.lancerx.ru (https://forum.lancerx.ru)](https://forum.lancerx.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://www.mfarmer.ru) [mfarmer.ru (http://www.mfarmer.ru)](http://www.mfarmer.ru)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://forum.league17.ru) [forum.league17.ru (https://forum.league17.ru)](https://forum.league17.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://krskforum.com) [krskforum.com (https://krskforum.com)](https://krskforum.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://vw-bus.ru) [vw-bus.ru (https://vw-bus.ru)](https://vw-bus.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://navimba.com) [navimba.com (https://navimba.com)](https://navimba.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.niva-club.net) [niva-club.net (https://www.niva-club.net)](https://www.niva-club.net)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://sign-forum.ru) [sign-forum.ru (https://sign-forum.ru)](https://sign-forum.ru)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=http://dntrustmucd4mwec.onion) [DarkNet Trust (http://dntrustmucd4mwec.onion)](http://dntrustmucd4mwec.onion)*: top 100M, tor* +1. ![](https://www.google.com/s2/favicons?domain=http://i2pforum.i2p) [i2pforum (http://i2pforum.i2p)](http://i2pforum.i2p)*: top 100M, i2p* +1. ![](https://www.google.com/s2/favicons?domain=http://en.worldis.me) [Worldis.me (http://en.worldis.me)](http://en.worldis.me)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://photoshop-kopona.com) [photoshop-kopona.com (https://photoshop-kopona.com)](https://photoshop-kopona.com)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://rblx.trade) [rblx.trade (https://rblx.trade)](https://rblx.trade)*: top 100M, gaming*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://monitoringminecraft.ru) [monitoringminecraft.ru (https://monitoringminecraft.ru)](https://monitoringminecraft.ru)*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://giters.com) [giters.com (https://giters.com)](https://giters.com)*: top 100M, coding*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://tg.rip) [tg.rip (https://tg.rip)](https://tg.rip)*: top 100M, messaging*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://tikbuddy.com) [tikbuddy.com (https://tikbuddy.com)](https://tikbuddy.com)*: top 100M, hobby, video* +1. ![](https://www.google.com/s2/favicons?domain=https://www.djagi.com) [Djagi (https://www.djagi.com)](https://www.djagi.com)*: top 100M, bg* +1. ![](https://www.google.com/s2/favicons?domain=https://kazanlashkigalab.com) [kazanlashkigalab.com (https://kazanlashkigalab.com)](https://kazanlashkigalab.com)*: top 100M, kz* +1. ![](https://www.google.com/s2/favicons?domain=) [airlinepilot.life ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [algowiki-project.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [alimero.ru ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [baseball-reference.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [bbpress.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [betawiki.net ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [bitcoin.it ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [bookafly.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [brainscale.net ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [bulbapedia.bulbagarden.net ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [bulbapp.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [caddy.community ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [chiefdelphi.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [choice.community ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [cloudromance.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [club.myce.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [cnblogs.com ()]()*: top 100M, cn* +1. ![](https://www.google.com/s2/favicons?domain=) [commons.commondreams.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.cartalk.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.gamedev.tv ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.gemsofwar.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.glowforge.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.home-assistant.io ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.infiniteflight.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.kodular.io ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.letsencrypt.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.mycroft.ai ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.mydevices.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.quickfile.co.uk ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.roonlabs.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.rstudio.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [community.unbounce.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [creationwiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [credly.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [cruiserswiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [dandwiki.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [dariawiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [detectiveconanworld.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [develop.consumerium.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [devforum.zoom.us ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [discourse.huel.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discourse.julialang.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discourse.mc-stan.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discourse.nodered.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discourse.snowplowanalytics.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discoursedb.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.circleci.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.elastic.co ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.huel.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.ipfs.io ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.kotlinlang.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.kubernetes.io ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.newrelic.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.pixls.us ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.prosemirror.net ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [discuss.pytorch.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [dnd-wiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [dogcraft.net ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [elixirforum.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://en.brickimedia.org) [en.brickimedia.org (https://en.brickimedia.org)](https://en.brickimedia.org)*: top 100M, wiki* +1. ![](https://www.google.com/s2/favicons?domain=) [en.illogicopedia.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [en.uncyclopedia.co ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [en.wikifur.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [encyc.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [Pixilart ()]()*: top 100M, art* +1. ![](https://www.google.com/s2/favicons?domain=) [eve.community ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [exploretalent.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [fandalism.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [fanfiktion.de ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [ffm.bio ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [finmessage.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [flipsnack.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [flirtic.ee ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.banana-pi.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.bonsaimirai.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.cfx.re ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.cockroachlabs.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.core-electronics.com.au ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.freecodecamp.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.gitlab.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.golangbridge.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.juce.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.leasehackr.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.mattermost.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.obsidian.md ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.seeedstudio.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.sublimetext.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.tudiabetes.org ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [forum.uipath.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forum.vuejs.org ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [forums.balena.io ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forums.cgsociety.org ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [forums.developer.nvidia.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [forums.episodeinteractive.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [forums.gearboxsoftware.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [forums.lawrencesystems.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forums.mmorpg.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forums.penny-arcade.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [forums.pimoroni.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forums.t-nation.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forums.theanimenetwork.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [forums.wyzecam.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [gamedev.net ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [gearheadwiki.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [globulation2.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [hiveblocks.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [inaturalist.nz ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [inaturalist.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [irl.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [is.theorizeit.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [ising.pl ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [kidicaruswiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [love2d.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [mansonwiki.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [meta.discourse.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [metroidwiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [micro.blog ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [micronations.wiki ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [minnit.chat ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [mintme.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [modelhub.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://www.uviu.com) [uviu.com (https://www.uviu.com)](https://www.uviu.com)*: top 100M, porn* +1. ![](https://www.google.com/s2/favicons?domain=) [monoskop.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [mql5.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [musicinafrica.net ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [nitrc.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [nookipedia.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [oldschool.runescape.wiki ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [openhub.net ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [openriskmanual.org ()]()*: top 100M, finance, wiki*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [openwetware.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [oyoy.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [padlet.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [padrim.com.br ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [patch.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [pcgamingwiki.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [pidgi.net ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [pinataisland.info ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [postcrossing.com ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [premium.chat ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [pttweb.cc ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [qiita.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [rationalwiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [raymanpc.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [reactos.org ()]()*: top 100M, coding, wiki*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [realcty.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [renderosity.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [run-log.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [runescape.wiki ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [sketchfab.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [snipplr.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [society6.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [splatoonwiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [spreadshirt.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [ssbwiki.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [stackshare.io ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [starfywiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [steller.co ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [strategywiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [talk.macpowerusers.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [teflpedia.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [testwiki.wiki ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [thinkwiki.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [tokyvideo.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [trailville.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [trepup.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [ubuntu-mate.community ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [users.rust-lang.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [v2ex.com ()]()*: top 100M, cn* +1. ![](https://www.google.com/s2/favicons?domain=) [vidamora.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [vingle.net ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [webflow.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wiki.creativecommons.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wiki.linuxquestions.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wiki.mozilla.org ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [wiki.mtasa.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wiki.teamfortress.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wiki.tfes.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wiki.themanaworld.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wiki.wesnoth.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wiki.xkcd.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wikialpha.org ()]()*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [wikiapiary.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wikiislam.net ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [wikizilla.org ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [zeldadungeon.net ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=) [zoig.com ()]()*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://free-otvet.ru) [free-otvet.ru (https://free-otvet.ru)](https://free-otvet.ru)*: top 100M, q&a* +1. ![](https://www.google.com/s2/favicons?domain=https://27r.ru/forum) [27r.ru (https://27r.ru/forum)](https://27r.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.chelfishing.ru/forum) [chelfishing.ru (http://www.chelfishing.ru/forum)](http://www.chelfishing.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://coffeeforum.ru) [coffeeforum.ru (http://coffeeforum.ru)](http://coffeeforum.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://caravanliga.ru/forum) [caravanliga.ru (http://caravanliga.ru/forum)](http://caravanliga.ru/forum)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://fkclub.ru/forum) [fkclub.ru (https://fkclub.ru/forum)](https://fkclub.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://e36club.com.ua/forum) [e36club.com.ua (http://e36club.com.ua/forum)](http://e36club.com.ua/forum)*: top 100M, forum, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://audi-belarus.by/forum) [audi-belarus.by (https://audi-belarus.by/forum)](https://audi-belarus.by/forum)*: top 100M, by, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://cedia-club.ru/forum) [cedia-club.ru (https://cedia-club.ru/forum)](https://cedia-club.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.308-club.ru/forum) [308-club.ru (https://www.308-club.ru/forum)](https://www.308-club.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://as8.ru/forum) [as8.ru (http://as8.ru/forum)](http://as8.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://chevrolet-daewoo.ru/forum) [chevrolet-daewoo.ru (http://chevrolet-daewoo.ru/forum)](http://chevrolet-daewoo.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum-dollplanet.ru) [forum-dollplanet.ru (http://forum-dollplanet.ru)](http://forum-dollplanet.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.bashohota.ru) [bashohota.ru (http://www.bashohota.ru)](http://www.bashohota.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.fforum.ru) [fforum.ru (http://www.fforum.ru)](http://www.fforum.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://hairforum.ru) [hairforum.ru (https://hairforum.ru)](https://hairforum.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://www.hcv.ru/forum) [hcv.ru (http://www.hcv.ru/forum)](http://www.hcv.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.injectorservice.com.ua) [forum.injectorservice.com.ua (https://forum.injectorservice.com.ua)](https://forum.injectorservice.com.ua)*: top 100M, forum, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://memoriam.ru/forum) [memoriam.ru (https://memoriam.ru/forum)](https://memoriam.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://moto-arena.ru) [moto-arena.ru (https://moto-arena.ru)](https://moto-arena.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.pskovchess.ru) [forum.pskovchess.ru (http://forum.pskovchess.ru)](http://forum.pskovchess.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://siava.ru/forum) [siava.ru (https://siava.ru/forum)](https://siava.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.virtualsoccer.ru) [forum.virtualsoccer.ru (https://forum.virtualsoccer.ru)](https://forum.virtualsoccer.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://forum.tathunter.ru) [forum.tathunter.ru (http://forum.tathunter.ru)](http://forum.tathunter.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.volnistye.ru) [forum.volnistye.ru (https://forum.volnistye.ru)](https://forum.volnistye.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://frauflora.com) [frauflora.com (http://frauflora.com)](http://frauflora.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.guitar.by/forum) [guitar.by (https://www.guitar.by/forum)](https://www.guitar.by/forum)*: top 100M, by, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://kidshockey.ru) [kidshockey.ru (https://kidshockey.ru)](https://kidshockey.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://lifeintravel.ru/forum) [lifeintravel.ru (https://lifeintravel.ru/forum)](https://lifeintravel.ru/forum)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://make-ups.ru/forum) [make-ups.ru (http://make-ups.ru/forum)](http://make-ups.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.mitsubishi-asx.net/forum) [mitsubishi-asx.net (https://www.mitsubishi-asx.net/forum)](https://www.mitsubishi-asx.net/forum)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=http://moto26.ru/forum) [moto26.ru (http://moto26.ru/forum)](http://moto26.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://lviv4x4.club/forum) [lviv4x4.club (http://lviv4x4.club/forum)](http://lviv4x4.club/forum)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://politsrach.ru) [politsrach.ru (https://politsrach.ru)](https://politsrach.ru)*: top 100M, forum, ru*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=http://spb-projects.ru/forum) [spb-projects.ru (http://spb-projects.ru/forum)](http://spb-projects.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://www.ttsport.ru/forum) [ttsport.ru (https://www.ttsport.ru/forum)](https://www.ttsport.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://yiiframework.ru/forum) [yiiframework.ru (https://yiiframework.ru/forum)](https://yiiframework.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://vcfm.ru/forum) [vcfm.ru (https://vcfm.ru/forum)](https://vcfm.ru/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://gaz-24.com/forum) [gaz-24.com (http://gaz-24.com/forum)](http://gaz-24.com/forum)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=http://promalp.ru) [promalp.ru (http://promalp.ru)](http://promalp.ru)*: top 100M, forum, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://breakers.tv) [breakers.tv (https://breakers.tv)](https://breakers.tv)*: top 100M, streaming* +1. ![](https://www.google.com/s2/favicons?domain=https://instaprofi.ru) [instaprofi.ru (https://instaprofi.ru)](https://instaprofi.ru)*: top 100M, photo* +1. ![](https://www.google.com/s2/favicons?domain=) [lyricsTraining ()]()*: top 100M, music* +1. ![](https://www.google.com/s2/favicons?domain=) [expoForum ()]()*: top 100M, coding, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [rawg.io ()]()*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=) [SchemeColor ()]()*: top 100M, art, design* +1. ![](https://www.google.com/s2/favicons?domain=) [aetherhub ()]()*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=) [bugbounty ()]()*: top 100M, hacking*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=) [universocraft ()]()*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://api.edns.domains) [edns.domains/meta (https://api.edns.domains)](https://api.edns.domains)*: top 100M, crypto*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://api.edns.domains) [edns.domains/music (https://api.edns.domains)](https://api.edns.domains)*: top 100M, crypto*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://api.edns.domains) [edns.domains/ass (https://api.edns.domains)](https://api.edns.domains)*: top 100M, crypto*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://api.edns.domains) [edns.domains/404 (https://api.edns.domains)](https://api.edns.domains)*: top 100M, crypto*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://api.edns.domains) [edns.domains/sandbox (https://api.edns.domains)](https://api.edns.domains)*: top 100M, crypto*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://api.edns.domains) [edns.domains/web3 (https://api.edns.domains)](https://api.edns.domains)*: top 100M, crypto*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://api.edns.domains) [edns.domains/gamefi (https://api.edns.domains)](https://api.edns.domains)*: top 100M, crypto*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://api.edns.domains) [edns.domains/iotex (https://api.edns.domains)](https://api.edns.domains)*: top 100M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://peername.com/) [peername.com/bit (https://peername.com/)](https://peername.com/)*: top 100M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://peername.com/) [peername.com/coin (https://peername.com/)](https://peername.com/)*: top 100M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://peername.com/) [peername.com/onion (https://peername.com/)](https://peername.com/)*: top 100M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://peername.com/) [peername.com/bazar (https://peername.com/)](https://peername.com/)*: top 100M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://peername.com/) [peername.com/lib (https://peername.com/)](https://peername.com/)*: top 100M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://peername.com/) [peername.com/emc (https://peername.com/)](https://peername.com/)*: top 100M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://peername.com/) [peername.com/tor (https://peername.com/)](https://peername.com/)*: top 100M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://fanscout.com) [fanscout.com (https://fanscout.com)](https://fanscout.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dimensional.me) [DimensionalMe (https://www.dimensional.me)](https://www.dimensional.me)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.portal-pisarski.pl) [www.portal-pisarski.pl (https://www.portal-pisarski.pl)](https://www.portal-pisarski.pl)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.dateamillionaire.com) [www.dateamillionaire.com (https://www.dateamillionaire.com)](https://www.dateamillionaire.com)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.stopstalk.com) [www.stopstalk.com (https://www.stopstalk.com)](https://www.stopstalk.com)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://chaturbator.su) [chaturbator.su (https://chaturbator.su)](https://chaturbator.su)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.gta-multiplayer.cz) [www.gta-multiplayer.cz (https://www.gta-multiplayer.cz)](https://www.gta-multiplayer.cz)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://blitztactics.com/) [Blitz Tactics (https://blitztactics.com/)](https://blitztactics.com/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://breachsta.rs/) [Breach Sta.rs Forum (https://breachsta.rs/)](https://breachsta.rs/)*: top 100M, forum*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://codolio.com/) [Codolio (https://codolio.com/)](https://codolio.com/)*: top 100M*, search is disabled +1. ![](https://www.google.com/s2/favicons?domain=https://coinvote.cc/) [Coinvote (https://coinvote.cc/)](https://coinvote.cc/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://cracked.sh/) [Cracked Forum (https://cracked.sh/)](https://cracked.sh/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://discord.bio/) [Discord.bio (https://discord.bio/)](https://discord.bio/)*: top 100M, gaming, social* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.hackersploit.org/) [Hacker Sploit (https://forum.hackersploit.org/)](https://forum.hackersploit.org/)*: top 100M, coding, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://holopin.io) [Holopin (https://holopin.io)](https://holopin.io)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://patched.sh/) [Patched (https://patched.sh/)](https://patched.sh/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pepperdeals.se/) [Pepperdeals (https://www.pepperdeals.se/)](https://www.pepperdeals.se/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pepperdeals.com/) [Peppereals US (https://www.pepperdeals.com/)](https://www.pepperdeals.com/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://playstrategy.org) [Playstrategy (https://playstrategy.org)](https://playstrategy.org)*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://www.seoforum.com/) [SEOForum (https://www.seoforum.com/)](https://www.seoforum.com/)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.shelf.im/) [Shelf (https://www.shelf.im/)](https://www.shelf.im/)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://traewelling.de/) [Trawelling (https://traewelling.de/)](https://traewelling.de/)*: top 100M, de* +1. ![](https://www.google.com/s2/favicons?domain=https://valorantforums.com) [Valorant Forums (https://valorantforums.com)](https://valorantforums.com)*: top 100M, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://www.curseforge.com.) [Curse Forge (https://www.curseforge.com.)](https://www.curseforge.com.)*: top 100M* +1. ![](https://www.google.com/s2/favicons?domain=https://tonometerbot.com) [Tonometerbot (https://tonometerbot.com)](https://tonometerbot.com)*: top 100M, crypto* +1. ![](https://www.google.com/s2/favicons?domain=https://community.spotify.com) [SpotifyCommunity (https://community.spotify.com)](https://community.spotify.com)*: top 100M, forum, music* +1. ![](https://www.google.com/s2/favicons?domain=https://discuss.flarum.org.cn) [discuss.flarum.org.cn (https://discuss.flarum.org.cn)](https://discuss.flarum.org.cn)*: top 100M, cn, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://flarum.es) [flarum.es (https://flarum.es)](https://flarum.es)*: top 100M, es, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.fibra.click) [forum.fibra.click (https://forum.fibra.click)](https://forum.fibra.click)*: top 100M, forum, it* +1. ![](https://www.google.com/s2/favicons?domain=https://hiveon.com/forum) [hiveon.com forum (https://hiveon.com/forum)](https://hiveon.com/forum)*: top 100M, coding, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.manticoresearch.com) [forum.manticoresearch.com (https://forum.manticoresearch.com)](https://forum.manticoresearch.com)*: top 100M, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.jscourse.com) [forum.jscourse.com (https://forum.jscourse.com)](https://forum.jscourse.com)*: top 100M, coding, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forums.grandstream.com) [forums.grandstream.com (https://forums.grandstream.com)](https://forums.grandstream.com)*: top 100M, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://support.wirenboard.com) [support.wirenboard.com (https://support.wirenboard.com)](https://support.wirenboard.com)*: top 100M, coding, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.cs-cart.ru) [forum.cs-cart.ru (https://forum.cs-cart.ru)](https://forum.cs-cart.ru)*: top 100M, coding, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://instantcms.ru) [instantcms.ru (https://instantcms.ru)](https://instantcms.ru)*: top 100M, coding, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://wewin.ru) [wewin.ru (https://wewin.ru)](https://wewin.ru)*: top 100M, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://myslo.ru) [myslo.ru (https://myslo.ru)](https://myslo.ru)*: top 100M, news, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://add-groups.com) [add-groups.com (https://add-groups.com)](https://add-groups.com)*: top 100M, messaging, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://profi.ru) [Profi.ru (https://profi.ru)](https://profi.ru)*: top 100M, freelance, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://mover.uz) [mover.uz (https://mover.uz)](https://mover.uz)*: top 100M, video* +1. ![](https://www.google.com/s2/favicons?domain=https://bitpapa.com) [BitPapa (https://bitpapa.com)](https://bitpapa.com)*: top 100M, crypto, ru* +1. ![](https://www.google.com/s2/favicons?domain=https://minfin.com.ua) [minfin.com.ua (https://minfin.com.ua)](https://minfin.com.ua)*: top 100M, finance, ua* +1. ![](https://www.google.com/s2/favicons?domain=https://www.pexels.com) [Pexels (https://www.pexels.com)](https://www.pexels.com)*: top 100M, photo* +1. ![](https://www.google.com/s2/favicons?domain=https://bestgore.fun) [BestGore (https://bestgore.fun)](https://bestgore.fun)*: top 100M, video* +1. ![](https://www.google.com/s2/favicons?domain=https://app.airnfts.com) [AirNFTs (https://app.airnfts.com)](https://app.airnfts.com)*: top 100M, crypto, nft* +1. ![](https://www.google.com/s2/favicons?domain=https://greasyfork.org) [GreasyFork (https://greasyfork.org)](https://greasyfork.org)*: top 100M, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://faceit.com/) [Faceit (https://faceit.com/)](https://faceit.com/)*: top 100M, gaming* +1. ![](https://www.google.com/s2/favicons?domain=https://hey.xyz/) [Hey (https://hey.xyz/)](https://hey.xyz/)*: top 100M, nft, social* +1. ![](https://www.google.com/s2/favicons?domain=https://orcid.org) [ORCID (https://orcid.org)](https://orcid.org)*: top 100M, global, science* +1. ![](https://www.google.com/s2/favicons?domain=https://openalex.org) [OpenAlex (https://openalex.org)](https://openalex.org)*: top 100M, global, science* +1. ![](https://www.google.com/s2/favicons?domain=https://arxiv.org) [arXiv (https://arxiv.org)](https://arxiv.org)*: top 100M, global, science* +1. ![](https://www.google.com/s2/favicons?domain=https://dblp.org) [DBLP (https://dblp.org)](https://dblp.org)*: top 100M, coding, global, science* +1. ![](https://www.google.com/s2/favicons?domain=https://scholia.toolforge.org) [Scholia (https://scholia.toolforge.org)](https://scholia.toolforge.org)*: top 100M, global, science* +1. ![](https://www.google.com/s2/favicons?domain=https://ruby-china.org/) [Ruby China (https://ruby-china.org/)](https://ruby-china.org/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://cnodejs.org/) [CNode.js (https://cnodejs.org/)](https://cnodejs.org/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://studygolang.com/) [StudyGolang (https://studygolang.com/)](https://studygolang.com/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://openi.pcl.ac.cn/) [OpenI (https://openi.pcl.ac.cn/)](https://openi.pcl.ac.cn/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://bbs.openkylin.top/) [openKylin (https://bbs.openkylin.top/)](https://bbs.openkylin.top/)*: top 100M, cn, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://ask.kubesphere.com.cn/) [KubeSphere Community (https://ask.kubesphere.com.cn/)](https://ask.kubesphere.com.cn/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://meta.appinn.net/) [Appinn (https://meta.appinn.net/)](https://meta.appinn.net/)*: top 100M, cn, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://club.honor.com/cn/) [Honor Club (https://club.honor.com/cn/)](https://club.honor.com/cn/)*: top 100M, cn, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://asktug.com/) [AskTUG (https://asktug.com/)](https://asktug.com/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://forum.cocos.org/) [Cocos Community (https://forum.cocos.org/)](https://forum.cocos.org/)*: top 100M, cn, coding* +1. ![](https://www.google.com/s2/favicons?domain=https://blog.sina.com.cn/) [Sina Blog (https://blog.sina.com.cn/)](https://blog.sina.com.cn/)*: top 100M, blog, cn* +1. ![](https://www.google.com/s2/favicons?domain=https://www.chiphell.com/) [Chiphell (https://www.chiphell.com/)](https://www.chiphell.com/)*: top 100M, cn, forum* +1. ![](https://www.google.com/s2/favicons?domain=https://home.gamer.com.tw/) [Bahamut (https://home.gamer.com.tw/)](https://home.gamer.com.tw/)*: top 100M, cn, gaming, tw* +1. ![](https://www.google.com/s2/favicons?domain=https://www.hkitalk.net/) [hkitalk (https://www.hkitalk.net/)](https://www.hkitalk.net/)*: top 100M, cn, forum, hk* + +The list was updated at (2026-07-11) +## Statistics + +Enabled/total sites: 2516/3187 = 78.95% + +Incomplete message checks: 315/2516 = 12.52% (false positive risks) + +Status code checks: 685/2516 = 27.23% (false positive risks) + +False positive risk (total): 39.75% + +Sites with probing: 500px, Armchairgm, BinarySearch (disabled), BitBucket, BleachFandom, Bluesky, BongaCams, Boosty, BuyMeACoffee, Calendly, Cent, Chess, Code Sandbox (disabled), Code Snippet Wiki, DailyMotion, Discord, Diskusjon.no, Disqus, Docker Hub, Duolingo, F-droid, Faceit, FandomCommunityCentral, GitHub, GitLab, Golangbridge, Google Plus (archived), Gravatar, HackTheBox, HackerNews, HackerNoon, Hackerrank, Hashnode, Hey, Holopin, ITVDN Forum, Imgur, Instagram, Keybase, Kick, Kvinneguiden, LeetCode, Lemmy World, Lesswrong, Livejasmin, LocalCryptos (disabled), Mapillary Forum, Matrix, Medium, MetaDiscourse, MicrosoftLearn, Minds, MixCloud, Monkeytype, NPM, Niftygateway, ORCID, Omg.lol, OnlyFans, Paragraph, Picsart, Polarsteps, Rarible, Reddit, Reddit Search (Pushshift) (disabled), Revolut.me, RoyalCams, Scratch, Silver-collector, Soop, SportsTracker, Spotify, StackOverflow, Substack, TAP'D, Topcoder, Trello, Twitch, Twitter, Twitter Shadowban (disabled), UnstoppableDomains, Vimeo, Vivino, Warframe Market, Warpcast, Weibo, Wikipedia, Yapisal (disabled), YouNow, community.endlessos.com, community.getpostman.com, community.icons8.com, community.p2pu.org, discourse.haskell.org, discourse.jupyter.org, discuss.inventables.com, en.brickimedia.org, forum.audacityteam.org, forum.garudalinux.org, forum.ghost.org, forum.languagelearningwithnetflix.com, forum.shotcut.org, forum.zorin.com, forums.docker.com, forums.grandstream.com, forums.steinberg.net, hiveos.farm, iNaturalist, nightbot, notabug.org, openframeworks, programming.dev, qiwi.me (disabled), sourceruns, support.ilovegrowingmarijuana.com + +Sites with activation: OnlyFans, Twitter, Vimeo, Weibo, WikimapiaSearch + +Top 20 profile URLs: +- (709) `{urlMain}/index/8-0-{username} (uCoz)` +- (319) `/{username}` +- (223) `{urlMain}{urlSubpath}/members/?username={username} (XenForo)` +- (173) `/user/{username}` +- (139) `/profile/{username}` +- (126) `{urlMain}{urlSubpath}/search.php?author={username} (phpBB/Search)` +- (124) `/u/{username}` +- (120) `{urlMain}{urlSubpath}/member.php?username={username} (vBulletin)` +- (95) `/users/{username}` +- (69) `/@{username}` +- (69) `{urlMain}/u/{username}/summary (Discourse)` +- (55) `/wiki/User:{username}` +- (47) `SUBDOMAIN` +- (38) `/members/?username={username}` +- (32) `/author/{username}` +- (29) `/members/{username}` +- (27) `{urlMain}{urlSubpath}/memberlist.php?username={username} (phpBB)` +- (25) `{urlMain}/u/{username} (DiscourseJson)` +- (18) `/forum/search.php?keywords=&terms=all&author={username}` +- (16) `/people/{username}` + + +Sites by engine: +- `uCoz`: 633/709 (89.3%) +- `XenForo`: 174/223 (78.0%) +- `phpBB/Search`: 117/126 (92.9%) +- `vBulletin`: 28/120 (23.3%) +- `Discourse`: 61/69 (88.4%) +- `phpBB`: 21/27 (77.8%) +- `DiscourseJson`: 25/25 (100.0%) +- `engine404`: 18/23 (78.3%) +- `op.gg`: 17/17 (100.0%) +- `Flarum`: 15/15 (100.0%) +- `Wordpress/Author`: 5/9 (55.6%) +- `engineRedirect`: 3/4 (75.0%) +- `phpBB2/Search`: 2/3 (66.7%) +- `engine404get`: 2/2 (100.0%) + + +Top 20 tags: +- (1057) `NO_TAGS` (non-standard) +- (756) `forum` +- (131) `gaming` +- (98) `coding` +- (58) `photo` +- (47) `tech` +- (46) `social` +- (43) `news` +- (40) `blog` +- (33) `music` +- (31) `shopping` +- (29) `crypto` +- (27) `finance` +- (25) `video` +- (25) `sharing` +- (23) `education` +- (22) `freelance` +- (21) `art` +- (18) `hobby` +- (17) `sport` diff --git a/snapcraft.yaml b/snapcraft.yaml new file mode 100644 index 0000000..52756d0 --- /dev/null +++ b/snapcraft.yaml @@ -0,0 +1,32 @@ +title: Maigret +icon: static/maigret.png +name: maigret +summary: 🕵️‍♂️ Collect a dossier on a person by username from thousands of sites. +description: | + **Maigret** collects a dossier on a person **by username only**, checking for accounts on a huge number of sites and gathering all the available information from web pages. No API keys required. + + Currently supported more than 3000 sites, search is launched against 500 popular sites in descending order of popularity by default. Also supported checking of Tor sites, I2P sites, and domains (via DNS resolving). + +version: 0.6.2 +license: MIT +base: core22 +confinement: strict + +source-code: https://github.com/soxoj/maigret +issues: + - https://github.com/soxoj/maigret/issues +donation: + - https://patreon.com/soxoj +contact: + - mailto:soxoj@protonmail.com + +parts: + maigret: + plugin: python + source: . + +type: app +apps: + maigret: + command: bin/maigret + plugs: [ network, network-bind, home ] diff --git a/static/chat_gitter.svg b/static/chat_gitter.svg new file mode 100644 index 0000000..5ad1bff --- /dev/null +++ b/static/chat_gitter.svg @@ -0,0 +1 @@ +chaton gitter \ No newline at end of file diff --git a/static/maigret.png b/static/maigret.png new file mode 100644 index 0000000..257ebe8 Binary files /dev/null and b/static/maigret.png differ diff --git a/static/recursive_search.md b/static/recursive_search.md new file mode 100644 index 0000000..d0ad41f --- /dev/null +++ b/static/recursive_search.md @@ -0,0 +1,126 @@ +## Demo with page parsing and recursive username search + +```bash +$ maigret.py alexaimephotographycars +Sites in database, enabled/total: 492/500 +[*] Checking username alexaimephotographycars on: +[+] 500px: https://500px.com/p/alexaimephotographycars + ┣╸uid: dXJpOm5vZGU6VXNlcjoyNjQwMzQxNQ== + ┣╸legacy_id: 26403415 + ┣╸username: alexaimephotographycars + ┣╸name: Alex Aimé + ┣╸created_at: 2018-05-04T10:17:01.000+0000 + ┣╸image: https://drscdn.500px.org/user_avatar/26403415/q%3D85_w%3D300_h%3D300/v2?webp=true&v=2&sig=0235678a4f7b65e007e864033ebfaf5ef6d87fad34f80a8639d985320c20fe3b + ┣╸image_bg: https://drscdn.500px.org/user_cover/26403415/q%3D65_m%3D2048/v2?webp=true&v=1&sig=bea411fb158391a4fdad498874ff17088f91257e59dfb376ff67e3a44c3a4201 + ┣╸website: www.flickr.com/photos/alexaimephotography/ + ┣╸facebook_link: www.instagram.com/street.reality.photography/ + ┣╸instagram_username: alexaimephotography + ┗╸twitter_username: Alexaimephotogr +[*] Checking username alexaimephotography on: +[+] Vimeo: https://vimeo.com/alexaimephotography + ┣╸uid: 75857717 + ┣╸gender: m + ┣╸image: https://i.vimeocdn.com/portrait/22443952_360x360 + ┣╸bio: Hello +Passionate about photography for several years. I set the video recently. +I use my Nikon d7200 and Nikkor 50mm 1.8d . Premiere Pro software. +Follow me on : +https://www.instagram.com/alexaimephotography/ +https://500px.com/alexaimephotography + + +Bonjour +Passionné par la photographie depuis quelques années . Je me suis mis à la video depuis peu. +J'utilise mon Nikon d7200 et l'objectif Nikkor 50mm 1.8d .Comme logiciel Premiere pro cc. +Suivez moi sur : +https://www.instagram.com/alexaimephotography/ +https://500px.com/alexaimephotography + ┣╸location: France + ┣╸username: AlexAimePhotography + ┣╸is_verified: True + ┣╸created_at: 2017-12-06T11:49:28+00:00 + ┣╸videos: 14 + ┣╸is_looking_for_job: False + ┗╸is_working_remotely: False +[+] Pinterest: https://www.pinterest.com/alexaimephotography/ + ┣╸pinterest_username: alexaimephotography + ┣╸fullname: alexaimephotography + ┣╸image: https://s.pinimg.com/images/user/default_280.png + ┣╸board_count: 3 + ┣╸pin_count: 4 + ┣╸country: FR + ┣╸follower_count: 0 + ┣╸following_count: 1 + ┣╸is_website_verified: False + ┣╸is_indexed: True + ┣╸is_verified_merchant: False + ┗╸locale: fr +[+] VK: https://vk.com/alexaimephotography +[+] Facebook: https://www.facebook.com/alexaimephotography +[+] Tumblr: https://alexaimephotography.tumblr.com/ + ┣╸fullname: Alex Aimé Photography + ┣╸title: My name is Alex Aimé, and i am a freelance photographer. Originally from Burgundy in France .I am a man of 29 years. Follow me on : www.facebook.com/AlexAimePhotography/ + ┗╸links: + ┣╸ https://www.facebook.com/AlexAimePhotography/ + ┣╸ https://500px.com/alexaimephotography + ┣╸ https://www.instagram.com/alexaimephotography/ + ┗╸ https://www.flickr.com/photos/photoambiance/ +[+] Picuki: https://www.picuki.com/profile/alexaimephotography +[+] Instagram: https://www.instagram.com/alexaimephotography + ┣╸instagram_username: alexaimephotography + ┣╸fullname: Alexaimephotography + ┣╸id: 6828488620 + ┣╸image: https://instagram.fhel6-1.fna.fbcdn.net/v/t51.2885-19/s320x320/95420076_1169632876707608_8741505804647006208_n.jpg?_nc_ht=instagram.fhel6-1.fna.fbcdn.net&_nc_ohc=PuXb4vhtU1EAX-ln7aE&tp=1&oh=434faf2ef40e30e8416e63d10e1a5dbf&oe=6041F6EF + ┣╸bio: Photographer +Child of fine street arts + ┗╸external_url: https://www.flickr.com/photos/alexaimephotography2020/ +[+] We Heart It: https://weheartit.com/alexaimephotography +[+] Reddit: https://www.reddit.com/user/alexaimephotography + ┣╸reddit_id: t5_1nytpy + ┣╸reddit_username: alexaimephotography + ┣╸fullname: alexaimephotography + ┣╸image: https://styles.redditmedia.com/t5_1nytpy/styles/profileIcon_7vmhdwzd3g931.jpg?width=256&height=256&crop=256:256,smart&frame=1&s=4f355f16b4920844a3f4eacd4237a7bf76b2e97e + ┣╸is_employee: False + ┣╸is_nsfw: False + ┣╸is_mod: True + ┣╸is_following: True + ┣╸has_user_profile: True + ┣╸hide_from_robots: False + ┣╸created_at: 2019-07-10 12:20:03 + ┣╸total_karma: 54958 + ┗╸post_karma: 53698 +[+] DeviantART: https://alexaimephotography.deviantart.com + ┣╸country: France + ┣╸created_at: 2018-12-09 16:02:10 + ┣╸gender: male + ┣╸username: Alexaimephotography + ┣╸twitter_username: alexaimephotogr + ┣╸website: www.instagram.com/alexaimephotography/ + ┗╸links: + ┗╸ https://www.instagram.com/alexaimephotography/ +[+] EyeEm: https://www.eyeem.com/u/alexaimephotography + ┣╸eyeem_id: 21974802 + ┣╸eyeem_username: alexaimephotography + ┣╸fullname: Alex + ┣╸follower_count: 10 + ┣╸friends: 2 + ┣╸liked_photos: 37 + ┣╸photos: 10 + ┗╸facebook_uid: 1534915183474093 +[*] Checking username Alexaimephotogr on: +[+] Twitter: https://twitter.com/Alexaimephotogr + ┣╸uid: VXNlcjo5NDYzODMzNTA3ODAxMDQ3MDQ= + ┣╸fullname: AlexAimephotography + ┣╸bio: Photographe amateur +New gear : +Sony A7 ii +Sony FE 85mm 1.8 + ┣╸created_at: 2017-12-28 14:12:28+00:00 + ┣╸image: https://pbs.twimg.com/profile_images/1089860309895049218/5DucgDw1.jpg + ┣╸image_bg: https://pbs.twimg.com/profile_banners/946383350780104704/1548759346 + ┣╸is_protected: False + ┣╸follower_count: 303 + ┣╸following_count: 76 + ┣╸location: France + ┗╸favourites_count: 6705 +``` diff --git a/static/recursive_search.svg b/static/recursive_search.svg new file mode 100644 index 0000000..122a09e --- /dev/null +++ b/static/recursive_search.svg @@ -0,0 +1 @@ +maigretmaigretgit:(main)maigretgit:(main)maigretmaigretgit:(main)maigretsoxojmaigretgit:(main)maigretsoxoj--htmlmaigretgit:(main)maigretsoxoj--html--timeoutmaigretgit:(main)maigretsoxoj--html--timeout5[-]Startingasearchontop500sitesfromtheMaigretdatabase...[!]Youcanrunsearchbyfulllistofsiteswithflag`-a`[*]Checkingusernamesoxojon:Searching||▁▃▅Searching||▁▃▅0/500[0%]in0s(~0s,0.0/s)Searching||▂▄▆0/500[0%]in0s(~0s,0.0/s)Searching||▃▅▇0/500[0%]in0s(~0s,0.0/s)Searching||▄▆█0/500[0%]in0s(~0s,0.0/s)Searching||▅▇▇0/500[0%]in0s(~0s,0.0/s)[+]Telegram:https://t.me/soxoj├─fullname:Soxoj├─image:https://cdn4.cdn-telegram.org/file/JtPY01pKiMYT7E3J4hkuugFl4Y4el5H8RfFUjTrTM40Ifh1mgsDwrqDJVDOFS4KiFsBEB3fvml8_WXtxJCURi2ifgKIgglAh-XoNimq9ecq93HKgB0DZzOcO1FOktiuCCZGJ9auNwOFtwfxpWTvIpVLSkvZtW8rr2zhJuO_WGH5RagpPhNnuRHvSigzrcvd7cgjWZ5N3ctv96npSDYMrP6lm5ivHWEivHj89k3w6rRnYS32T4_ex7Hj57s-rAuO87mGknFv2JGj_F-fTl9hw-xeVm8bTS2E3DvdaB6SBQAwGcEwnoRm17ODYd8bH7dG01EYVRZbPrpouh4HxBOS9Zw.jpg└─bio:OSINT👉🏻soxoj.com,@soxoj_insides.IncaseIdon'trespond,plsremindmeorresendthemsgSearching|▌|Searching|▌|▇▇▅[+]Disqus:https://disqus.com/soxoj├─id:296653102├─disqus_username:soxoj├─reputation:1.235563├─reputation_label:Average├─following_count:1├─follower_count:1├─is_power_contributor:False├─is_anonymous:False├─created_at:2018-08-30T00:08:14├─upvotes_count:0├─forums_count:0├─image:https://disqus.com/api/users/avatars/soxoj.jpg├─forums_following_count:0├─is_private:False└─comments_count:0[?]StackOverflow:https://stackoverflow.com/users/filter?search=soxojSearching|█▊|▇▅▃22/500[4%]in1s(~33s,19.5/s)[+]GitHub:https://github.com/soxoj├─uid:31013580├─image:https://avatars.githubusercontent.com/u/31013580?v=4├─created_at:2017-08-14T17:03:07Z├─location:Amsterdam,Netherlands├─follower_count:1304├─following_count:54├─fullname:Soxoj├─public_gists_count:3├─public_repos_count:88├─twitter_username:sox0j├─bio:HeadofOSINTCenterofExcellencein@SocialLinks-IO├─is_company:SocialLinks└─blog_url:soxoj.comSearchingSearching|██|▆▄▂25/500[5%]in1s(~26s,25.7/s)[+]TikTok:https://www.tiktok.com/@soxoj[+]Xvideos:https://xvideos.com/profiles/soxojSearching|███▉|▂▂▄48/500[10%]in1s(~11s,50.6/s)[+]GitHubGist[GitHub]:https://gist.github.com/soxojSearching|██████▍|▄▆█80/500[16%]in1s(~7s,69.8/s)[+]VK:https://vk.com/soxoj└─fullname:AleksejSokol|VK[+]Roblox:https://www.roblox.com/user.aspx?username=soxoj[+]DockerHub:https://hub.docker.com/u/soxoj/├─uid:69f632f969804deca104e41e09cf2496├─username:soxoj├─type:User├─gravatar_url:https://gravatar.com/└─gravatar_username:soxojSearching|████████▌|█▆▄106/500[21%]in1s(~5s,84.3/s)Searching|█████████▎|▇▅▃116/500[23%]in1s(~5s,87.6/s)[+]OpenStreetMap:https://www.openstreetmap.org/user/soxojSearching|██████████▎|▄▂▂128/500[26%]in1s(~4s,93.6/s)[+]Tumblr:https://soxoj.tumblr.com/[+]Twitch:https://twitchtracker.com/soxojSearching|███████████▉|▁▃▅148/500[30%]in1s(~4s,98.3/s)Searching|████████████▌|▂▄▆156/500[31%]in2s(~4s,99.9/s)[+]Picuki[Instagram]:https://www.picuki.com/profile/soxojSearching|█████████████|▃▅▇162/500[32%]in2s(~3s,101.2/s)[+]kofi:https://ko-fi.com/soxojSearching|█████████████|▄▆█163/500[33%]in2s(~3s,101.9/s)Searching|██████████████▊|▆█▆184/500[37%]in2s(~3s,105.1/s)[+]Newgrounds:https://soxoj.newgrounds.comSearching|███████████████▍|█▆▄192/500[38%]in2s(~3s,108.2/s)[+]Pixwox[Instagram]:https://www.pixwox.com/profile/soxoj/[+]PyPi:https://pypi.org/user/soxojSearching|██████████████████▌|▃▁▃232/500[46%]in2s(~2s,115.7/s)Searching|███████████████████▉|▁▃▅248/500[50%]in2s(~2s,118.5/s)Searching|████████████████████▏|▂▄▆252/500[50%]in2s(~2s,119.1/s)Searching|████████████████████▊|▃▅▇259/500[52%]in2s(~2s,119.7/s)[+]Codewars:https://www.codewars.com/users/soxojSearching|██████████████████████▏|Searching|██████████████████████▏|▅▇▇277/500[55%]in2s(~2s,122.4/s)Searching|██████████████████████▊|▆█▆284/500[57%]in2s(~2s,123.4/s)Searching|█████████████████████████▎|▆▄▂316/500[63%]in2s(~2s,126.8/s)Searching|█████████████████████████▊|▅▃▁322/500[64%]in2s(~1s,127.5/s)Searching|███████████████████████████▏|▃▁▃339/500[68%]in3s(~1s,129.0/s)Searching|████████████████████████████▊|▂▄▆359/500[72%]in3s(~1s,130.7/s)Searching|█████████████████████████████▍|▃▅▇367/500[73%]in3s(~1s,131.2/s)Searching|██████████████████████████████▊|▆█▆385/500[77%]in3s(~1s,131.7/s)Searching|████████████████████████████████▏|█▆▄401/500[80%]in3s(~1s,132.3/s)Searching|████████████████████████████████▊|▇▅▃409/500[82%]in3s(~1s,132.7/s)[+]Keybase:https://keybase.io/soxoj├─uid:6c9c60f2454dcd53b5807db204ce5219└─username:soxojSearching|██████████████████████████████████▍|▄▂▂430/500[86%]in3s(~1s,134.5/s)[+]xakep.ru:https://xakep.ru/author/soxoj/├─fullname:soxoj├─image:https://secure.gravatar.com/avatar/897d2de96329133a1e9da8b0557a3fd2?s=150&d=retro&r=g├─bio:Киберразведчик-любитель.OSINT,нетсталкинг,антифрод.├─links:[]└─joined_year:2019Searching|███████████████████████████████████▎|▂▂▄Searching|███████████████████████████████████▎|▂▂▄440/500[88%]in3s(~0s,135.2/s)Searching|████████████████████████████████████▎|▂▄▆453/500[91%]in3s(~0s,135.4/s)[+]Libraries[GitHub]:https://libraries.io/github/soxoj/[+]Antichat:https://forum.antichat.ru/members/?username=soxojSearching|████████████████████████████████████▋|▅▇▇458/500[92%]in3s(~0s,134.0/s)Searching|█████████████████████████████████████▎|▇▇▅465/500[93%]in4s(~0s,132.8/s)Searching|█████████████████████████████████████▉|▇▅▃474/500[95%]in4s(~0s,131.7/s)Searching|██████████████████████████████████████|▅▃▁475/500[95%]in4s(~0s,129.9/s)Searching|██████████████████████████████████████|▄▂▂475/500[95%]in4s(~0s,128.6/s)Searching|██████████████████████████████████████▏|▃▁▃477/500[95%]in4s(~0s,127.4/s)Searching|██████████████████████████████████████▍|▂▂▄479/500[96%]in4s(~0s,126.3/s)Searching|██████████████████████████████████████▍|▁▃▅480/500[96%]in4s(~0s,125.1/s)Searching|██████████████████████████████████████▌|▂▄▆481/500[96%]in4s(~0s,123.9/s)Searching|██████████████████████████████████████▌|▃▅▇481/500[96%]in4s(~0s,122.6/s)Searching|██████████████████████████████████████▌|▄▆█481/500[96%]in4s(~0s,121.3/s)Searching|██████████████████████████████████████▌|▅▇▇481/500[96%]in4s(~0s,119.9/s)Searching|██████████████████████████████████████▌|▆█▆482/500[96%]in4s(~0s,118.7/s)Searching|██████████████████████████████████████▋|▇▇▅483/500[97%]in4s(~0s,117.4/s)Searching|██████████████████████████████████████▊|▇▅▃485/500[97%]in4s(~0s,115.0/s)Searching|██████████████████████████████████████▉|▆▄▂486/500[97%]in4s(~0s,113.9/s)Searching|███████████████████████████████████████|▅▃▁487/500[97%]in4s(~0s,112.8/s)Searching|███████████████████████████████████████|▄▂▂488/500[98%]in4s(~0s,111.8/s)Searching|███████████████████████████████████████▏|▃▁▃489/500[98%]in5s(~0s,110.8/s)Searching|███████████████████████████████████████▏|▂▂▄489/500[98%]in5s(~0s,109.8/s)Searching|███████████████████████████████████████▏|▁▃▅489/500[98%]in5s(~0s,108.7/s)Searching|███████████████████████████████████████▏|▂▄▆489/500[98%]in5s(~0s,107.6/s)Searching|███████████████████████████████████████▎|▃▅▇491/500[98%]in5s(~0s,106.7/s)[?]Poembook:https://poembook.ru/any?query=soxojSearching|███████████████████████████████████████▎|▅▇▇491/500[98%]in5s(~0s,104.8/s)Searching|███████████████████████████████████████▍|▆█▆492/500[98%]in5s(~0s,103.9/s)Searching|███████████████████████████████████████▍|▇▇▅492/500[98%]in5s(~0s,103.0/s)Searching|███████████████████████████████████████▍|█▆▄492/500[98%]in5s(~0s,102.0/s)Searching|███████████████████████████████████████▍|▇▅▃492/500[98%]in5s(~0s,101.1/s)Searching|███████████████████████████████████████▍|▆▄▂492/500[98%]in5s(~0s,100.1/s)Searching|███████████████████████████████████████▍|▅▃▁492/500[98%]in5s(~0s,99.1/s)Searching|███████████████████████████████████████▍|▄▂▂492/500[98%]in5s(~0s,98.2/s)Searching|███████████████████████████████████████▍|▃▁▃492/500[98%]in5s(~0s,97.2/s)Searching|███████████████████████████████████████▍|▂▂▄492/500[98%]in5s(~0s,96.3/s)Searching|███████████████████████████████████████▍|▁▃▅492/500[98%]in5s(~0s,95.4/s)Searching|███████████████████████████████████████▍|▂▄▆492/500[98%]in5s(~0s,94.5/s)Searching|███████████████████████████████████████▍|▃▅▇492/500[98%]in5s(~0s,93.6/s)Searching|███████████████████████████████████████▌|▄▆█493/500[99%]in5s(~0s,92.7/s)Searching|███████████████████████████████████████▌|▅▇▇493/500[99%]in5s(~0s,91.9/s)Searching|███████████████████████████████████████▌|▆█▆493/500[99%]in6s(~0s,91.1/s)Searching|███████████████████████████████████████▌|▇▇▅493/500[99%]in6s(~0s,90.2/s)Searching|███████████████████████████████████████▌|█▆▄493/500[99%]in6s(~0s,89.4/s)Searching|███████████████████████████████████████▌|▇▅▃493/500[99%]in6s(~0s,88.6/s)Searching|███████████████████████████████████████▌|▆▄▂493/500[99%]in6s(~0s,87.8/s)Searching|███████████████████████████████████████▌|▅▃▁493/500[99%]in6s(~0s,87.0/s)Searching|███████████████████████████████████████▌|▄▂▂493/500[99%]in6s(~0s,86.2/s)Searching|███████████████████████████████████████▌|▃▁▃493/500[99%]in6s(~0s,85.5/s)Searching|███████████████████████████████████████▌|▂▂▄494/500[99%]in6s(~0s,84.8/s)Searching|███████████████████████████████████████▌|▁▃▅494/500[99%]in6s(~0s,84.1/s)Searching|███████████████████████████████████████▌|▂▄▆494/500[99%]in6s(~0s,83.4/s)Searching|███████████████████████████████████████▌|▃▅▇494/500[99%]in6s(~0s,82.7/s)Searching|███████████████████████████████████████▌|▄▆█494/500[99%]in6s(~0s,82.0/s)Searching|███████████████████████████████████████▌|▅▇▇494/500[99%]in6s(~0s,81.3/s)Searching|███████████████████████████████████████▌|▆█▆494/500[99%]in6s(~0s,80.6/s)Searching|███████████████████████████████████████▌|▇▇▅494/500[99%]in6s(~0s,79.9/s)Searching|███████████████████████████████████████▌|█▆▄494/500[99%]in6s(~0s,79.2/s)Searching|███████████████████████████████████████▌|▇▅▃494/500[99%]in6s(~0s,78.6/s)Searching|███████████████████████████████████████▌|▆▄▂494/500[99%]in6s(~0s,77.9/s)Searching|███████████████████████████████████████▌|▅▃▁494/500[99%]in7s(~0s,77.3/s)Searching|███████████████████████████████████████▋|▄▂▂496/500[99%]in7s(~0s,76.8/s)Searching|███████████████████████████████████████▋|▃▁▃496/500[99%]in7s(~0s,76.2/s)Searching|███████████████████████████████████████▋|▂▂▄496/500[99%]in7s(~0s,75.6/s)Searching|███████████████████████████████████████▋|▁▃▅496/500[99%]in7s(~0s,75.1/s)Searching|███████████████████████████████████████▋|▂▄▆496/500[99%]in7s(~0s,74.5/s)Searching|███████████████████████████████████████▋|▃▅▇496/500[99%]in7s(~0s,73.9/s)Searching|███████████████████████████████████████▋|▄▆█496/500[99%]in7s(~0s,73.3/s)Searching|███████████████████████████████████████▋|▅▇▇496/500[99%]in7s(~0s,72.8/s)Searching|███████████████████████████████████████▋|▆█▆496/500[99%]in7s(~0s,72.2/s)Searching|███████████████████████████████████████▋|▇▇▅496/500[99%]in7s(~0s,71.7/s)Searching|███████████████████████████████████████▋|█▆▄496/500[99%]in7s(~0s,71.1/s)Searching|███████████████████████████████████████▋|▇▅▃496/500[99%]in7s(~0s,70.6/s)Searching|███████████████████████████████████████▋|▆▄▂496/500[99%]in7s(~0s,70.1/s)Searching|███████████████████████████████████████▊|▅▃▁497/500[99%]in7s(~0s,69.6/s)Searching|███████████████████████████████████████▊|▄▂▂497/500[99%]in7s(~0s,69.1/s)Searching|███████████████████████████████████████▊|▃▁▃497/500[99%]in7s(~0s,68.6/s)Searching|███████████████████████████████████████▊|▂▂▄497/500[99%]in7s(~0s,68.2/s)Searching|███████████████████████████████████████▊|▁▃▅497/500[99%]in7s(~0s,67.7/s)Searching|███████████████████████████████████████▊|▂▄▆497/500[99%]in8s(~0s,67.2/s)Searching|███████████████████████████████████████▉|▃▅▇499/500[100%]in8s(~0s,66.8/s)Searching|███████████████████████████████████████▉|▄▆█499/500[100%]in8s(~0s,66.4/s)Searching|███████████████████████████████████████▉|▅▇▇499/500[100%]in8s(~0s,65.9/s)Searching|███████████████████████████████████████▉|▆█▆499/500[100%]in8s(~0s,65.5/s)Searching|███████████████████████████████████████▉|▇▇▅499/500[100%]in8s(~0s,65.1/s)Searching|███████████████████████████████████████▉|█▆▄499/500[100%]in8s(~0s,64.6/s)Searching|███████████████████████████████████████▉|▇▅▃499/500[100%]in8s(~0s,64.2/s)Searching|███████████████████████████████████████▉|▆▄▂499/500[100%]in8s(~0s,63.7/s)Searching|███████████████████████████████████████▉|▅▃▁499/500[100%]in8s(~0s,63.3/s)Searching|███████████████████████████████████████▉|▄▂▂499/500[100%]in8s(~0s,62.9/s)Searching|███████████████████████████████████████▉|▃▁▃499/500[100%]in8s(~0s,62.5/s)Searching|███████████████████████████████████████▉|▂▂▄499/500[100%]in8s(~0s,62.0/s)Searching|████████████████████████████████████████|500/500[100%]in8.2s(61.65/s)[*]Checkingusernamesox0jon:[+]Telegram:https://t.me/sox0j├─fullname:@Sox0j└─image:https://cdn4.cdn-telegram.org/file/sQ0ILapBiCPbkj8opEIFj-UTIwW_wLTgt5x361vPCCeH6V-xhmN_5qft0oDV8aAe68OBHKGdJM5KENmR8R-zq60pkU8GAkqjxHQbiPWFAX0YKc_pwkrTEYtGYVY-yyZpIfnlZiAQmGsLsu0rP8qvwlRE7dtXZ_O0DEtD2IuB0u8U2UUMa3c4Aeb2cSMkwhYDW3fjQgGpHNMiHQVrLjN_Fp-1EAtp4E3BbIu7vNV2eHo78TrjVFTZlYmGEqxGO4_7-45sf1a7Mt0yWEWjWny0OTZyNMB3nW-ysmp_o6U7UYbuvHD5FSTBV_x965l5Zw7e-DjXmnSGAJuR9S3wFDbqTg.jpgSearching|▏|▆█▆1/500[0%]in0s(~3:30,2.3/s)Searching|█▉|▇▇▅23/500[5%]in1s(~2:00,13.5/s)Searching|████▏|▇▅▃51/500[10%]in1s(~41s,40.5/s)Searching|███████▉|▂▂▄98/500[20%]in1s(~6s,84.8/s)Searching|█████████▋|▃▅▇121/500[24%]in1s(~4s,97.6/s)[+]Bit.ly:https://bit.ly/sox0jSearching|████████████▊|▇▅▃159/500[32%]in1s(~3s,108.3/s)Searching|█████████████▎|▆▄▂166/500[33%]in1s(~3s,109.3/s)Searching|███████████████▌|▃▁▃194/500[39%]in2s(~3s,114.1/s)Searching|████████████████▎|▂▂▄203/500[41%]in2s(~3s,116.2/s)Searching|█████████████████|▁▃▅212/500[42%]in2s(~3s,118.1/s)Searching|█████████████████▎|▂▄▆216/500[43%]in2s(~2s,119.2/s)Searching|██████████████████▊|▄▆█235/500[47%]in2s(~2s,122.1/s)Searching|███████████████████▍|▅▇▇242/500[48%]in2s(~2s,123.3/s)Searching|█████████████████████|█▆▄262/500[52%]in2s(~2s,125.4/s)Searching|████████████████████████|▂▂▄300/500[60%]in2s(~2s,128.0/s)Searching|█████████████████████████▍|▂▄▆317/500[63%]in2s(~1s,129.3/s)Searching|█████████████████████████▉|▃▅▇323/500[65%]in2s(~1s,129.7/s)Searching|████████████████████████████|▆█▆350/500[70%]in3s(~1s,132.0/s)Searching|██████████████████████████████▊|▅▃▁384/500[77%]in3s(~1s,134.6/s)Searching|███████████████████████████████▋|▄▂▂395/500[79%]in3s(~1s,135.3/s)Searching|████████████████████████████████|▃▁▃400/500[80%]in3s(~1s,135.6/s)Searching|█████████████████████████████████▋|▁▃▅420/500[84%]in3s(~1s,137.0/s)Searching|███████████████████████████████████▉|▆█▆449/500[90%]in3s(~0s,137.9/s)Searching|████████████████████████████████████▍|▇▇▅455/500[91%]in3s(~0s,137.9/s)Searching|████████████████████████████████████▊|█▆▄459/500[92%]in3s(~0s,137.7/s)Searching|█████████████████████████████████████▎|▆▄▂466/500[93%]in3s(~0s,136.6/s)Searching|█████████████████████████████████████▌|▅▃▁468/500[94%]in3s(~0s,135.9/s)Searching|█████████████████████████████████████▋|▄▂▂470/500[94%]in4s(~0s,135.1/s)Searching|██████████████████████████████████████|▃▁▃475/500[95%]in4s(~0s,134.3/s)Searching|██████████████████████████████████████▏|▂▂▄477/500[95%]in4s(~0s,133.5/s)Searching|██████████████████████████████████████▏|▁▃▅477/500[95%]in4s(~0s,132.4/s)Searching|██████████████████████████████████████▏|▂▄▆477/500[95%]in4s(~0s,131.1/s)Searching|██████████████████████████████████████▎|▃▅▇478/500[96%]in4s(~0s,129.8/s)Searching|██████████████████████████████████████▌|▄▆█481/500[96%]in4s(~0s,128.6/s)Searching|██████████████████████████████████████▌|▅▇▇481/500[96%]in4s(~0s,127.4/s)Searching|██████████████████████████████████████▌|▆█▆481/500[96%]in4s(~0s,126.1/s)Searching|██████████████████████████████████████▌|▇▇▅482/500[96%]in4s(~0s,124.8/s)Searching|██████████████████████████████████████▋|█▆▄483/500[97%]in4s(~0s,123.5/s)Searching|██████████████████████████████████████▋|▇▅▃483/500[97%]in4s(~0s,122.2/s)Searching|██████████████████████████████████████▊|▆▄▂484/500[97%]in4s(~0s,121.0/s)Searching|██████████████████████████████████████▉|▅▃▁486/500[97%]in4s(~0s,119.8/s)Searching|██████████████████████████████████████▉|▄▂▂486/500[97%]in4s(~0s,118.5/s)Searching|██████████████████████████████████████▉|▂▂▄486/500[97%]in4s(~0s,116.0/s)Searching|██████████████████████████████████████▉|▁▃▅486/500[97%]in4s(~0s,114.7/s)Searching|███████████████████████████████████████|▂▄▆487/500[97%]in4s(~0s,113.5/s)Searching|███████████████████████████████████████|▃▅▇487/500[97%]in4s(~0s,112.3/s)Searching|███████████████████████████████████████|▄▆█487/500[97%]in5s(~0s,111.1/s)Searching|███████████████████████████████████████|▅▇▇488/500[98%]in5s(~0s,109.9/s)Searching|███████████████████████████████████████|▆█▆488/500[98%]in5s(~0s,108.8/s)Searching|███████████████████████████████████████▏|▇▇▅489/500[98%]in5s(~0s,107.7/s)Searching|███████████████████████████████████████▎|█▆▄490/500[98%]in5s(~0s,106.7/s)Searching|███████████████████████████████████████▎|▇▅▃490/500[98%]in5s(~0s,105.6/s)Searching|███████████████████████████████████████▎|▆▄▂491/500[98%]in5s(~0s,104.6/s)Searching|███████████████████████████████████████▍|▅▃▁492/500[98%]in5s(~0s,103.7/s)Searching|███████████████████████████████████████▍|▄▂▂492/500[98%]in5s(~0s,102.8/s)Searching|███████████████████████████████████████▍|▃▁▃492/500[98%]in5s(~0s,101.8/s)Searching|███████████████████████████████████████▍|▂▂▄492/500[98%]in5s(~0s,100.8/s)Searching|███████████████████████████████████████▍|▁▃▅492/500[98%]in5s(~0s,99.8/s)Searching|███████████████████████████████████████▍|▂▄▆492/500[98%]in5s(~0s,98.8/s)Searching|███████████████████████████████████████▍|▃▅▇492/500[98%]in5s(~0s,97.8/s)Searching|███████████████████████████████████████▍|▄▆█492/500[98%]in5s(~0s,96.9/s)Searching|███████████████████████████████████████▍|▅▇▇492/500[98%]in5s(~0s,95.9/s)Searching|███████████████████████████████████████▍|▆█▆492/500[98%]in5s(~0s,95.0/s)Searching|███████████████████████████████████████▌|▇▇▅493/500[99%]in5s(~0s,94.1/s)Searching|███████████████████████████████████████▌|█▆▄493/500[99%]in5s(~0s,93.3/s)Searching|███████████████████████████████████████▌|▇▅▃493/500[99%]in5s(~0s,92.4/s)Searching|███████████████████████████████████████▌|▆▄▂493/500[99%]in5s(~0s,91.6/s)Searching|███████████████████████████████████████▌|▅▃▁493/500[99%]in6s(~0s,90.8/s)Searching|███████████████████████████████████████▌|▄▂▂493/500[99%]in6s(~0s,90.0/s)Searching|███████████████████████████████████████▌|▃▁▃493/500[99%]in6s(~0s,89.2/s)Searching|███████████████████████████████████████▌|▂▂▄493/500[99%]in6s(~0s,88.3/s)Searching|███████████████████████████████████████▌|▁▃▅493/500[99%]in6s(~0s,87.6/s)Searching|███████████████████████████████████████▌|▂▄▆493/500[99%]in6s(~0s,86.8/s)Searching|███████████████████████████████████████▌|▃▅▇493/500[99%]in6s(~0s,86.0/s)Searching|███████████████████████████████████████▌|▄▆█494/500[99%]in6s(~0s,85.3/s)Searching|███████████████████████████████████████▌|▅▇▇494/500[99%]in6s(~0s,84.6/s)Searching|███████████████████████████████████████▌|▆█▆494/500[99%]in6s(~0s,83.9/s)Searching|███████████████████████████████████████▋|▇▇▅495/500[99%]in6s(~0s,83.2/s)Searching|███████████████████████████████████████▋|█▆▄495/500[99%]in6s(~0s,82.6/s)Searching|███████████████████████████████████████▋|▇▅▃495/500[99%]in6s(~0s,81.9/s)Searching|███████████████████████████████████████▋|▆▄▂495/500[99%]in6s(~0s,81.2/s)Searching|███████████████████████████████████████▋|▅▃▁495/500[99%]in6s(~0s,80.5/s)Searching|███████████████████████████████████████▊|▄▂▂497/500[99%]in6s(~0s,80.0/s)Searching|███████████████████████████████████████▊|▃▁▃497/500[99%]in6s(~0s,79.4/s)Searching|███████████████████████████████████████▊|▂▂▄497/500[99%]in6s(~0s,78.7/s)Searching|███████████████████████████████████████▊|▁▃▅497/500[99%]in6s(~0s,78.1/s)Searching|███████████████████████████████████████▊|▂▄▆497/500[99%]in7s(~0s,77.5/s)Searching|███████████████████████████████████████▊|▃▅▇497/500[99%]in7s(~0s,76.9/s)Searching|███████████████████████████████████████▊|▄▆█497/500[99%]in7s(~0s,76.2/s)Searching|███████████████████████████████████████▊|▅▇▇497/500[99%]in7s(~0s,75.6/s)Searching|███████████████████████████████████████▊|▆█▆497/500[99%]in7s(~0s,75.0/s)Searching|███████████████████████████████████████▊|▇▇▅497/500[99%]in7s(~0s,74.4/s)Searching|███████████████████████████████████████▊|█▆▄497/500[99%]in7s(~0s,73.8/s)Searching|███████████████████████████████████████▊|▇▅▃497/500[99%]in7s(~0s,73.3/s)Searching|███████████████████████████████████████▊|▅▃▁497/500[99%]in7s(~0s,72.1/s)Searching|███████████████████████████████████████▊|▄▂▂497/500[99%]in7s(~0s,71.6/s)Searching|███████████████████████████████████████▊|▃▁▃497/500[99%]in7s(~0s,71.1/s)Searching|███████████████████████████████████████▊|▂▂▄497/500[99%]in7s(~0s,70.5/s)Searching|███████████████████████████████████████▉|▁▃▅498/500[100%]in7s(~0s,70.0/s)Searching|███████████████████████████████████████▉|▂▄▆498/500[100%]in7s(~0s,69.6/s)Searching|████████████████████████████████████████|500/500[100%]in7.3s(69.16/s)[-]Generatingreportinfo...[-]HTMLreportonallusernamessavedin/Users/account/work/maigret/reports/report_soxoj_plain.html[*]Shorttextreport:Searchbyusernamesoxojreturned22accounts.Foundtarget'sotherIDs:sox0j.Searchbyusernamesox0jreturned2accounts.Extendedinfoextractedfrom8accounts.Countries:us,ru,inInterests(tags):coding,messaging,gaming,photo,forum,discussion,video,porn,sharing,maps,blog,streaming,freelance,art,business,linksmaigretgit:(main)mmaigretgit:(main)mamaigretgit:(main)maimaigretgit:(main)maigmaigretgit:(main)maigrmaigretgit:(main)maigremaigretgit:(main)maigretsmaigretgit:(main)maigretsomaigretgit:(main)maigretsoxmaigretgit:(main)maigretsoxomaigretgit:(main)maigretsoxoj-maigretgit:(main)maigretsoxoj--maigretgit:(main)maigretsoxoj--hmaigretgit:(main)maigretsoxoj--htmaigretgit:(main)maigretsoxoj--htmmaigretgit:(main)maigretsoxoj--html-maigretgit:(main)maigretsoxoj--html--maigretgit:(main)maigretsoxoj--html--tmaigretgit:(main)maigretsoxoj--html--timaigretgit:(main)maigretsoxoj--html--timmaigretgit:(main)maigretsoxoj--html--timemaigretgit:(main)maigretsoxoj--html--timeomaigretgit:(main)maigretsoxoj--html--timeouSearching|▌|▆█▆0/500[0%]in0s(~0s,0.0/s)Searching|▌|▆█▆6/500[1%]in1s(~42s,11.7/s)Searching|▌|▇▇▅7/500[1%]in1s(~41s,12.2/s)Searching|▌|█▆▄7/500[1%]in1s(~41s,12.3/s)Searching|██|Searching|██|▆▄▂25/500[5%]in1sSearching|███|▅▃▁25/500[5%]in1s(~26s,25.7/s)Searching|███|▅▃▁38/500[8%]in1s(~19s,34.4/s)Searching|███|▄▂▂38/500[8%]in1s(~15s,40.3/s)Searching|███▋|▄▂▂38/500[8%]in1s(~15s,40.3/s)Searching|███▋|▃▁▃46/500[9%]in1s(~13s,46.3/s)Searching|███▉|Searching|████▋|▁▃▅58/500[12%]in1s(~9s,55.9/s)Searching|█████▍|▂▄▆58/500[12%]in1s(~9s,55.9/s)Searching|█████▍|▂▄▆67/500[13%]in1s(~8s,61.4/s)Searching|█████▋|Searching|█████▋|▃▅▇Searching|█████▋|▃▅▇70/500[14%]in1s(~7s,65.3/s)Searching|██████▍|▃▅▇70/500[14%]in1s(~7s,65.3/s)Searching|███████▎|▅▇▇90/500[18%]in1s(~6s,74.6/s)Searching|███████▌|▆█▆94/500[19%]in1s(~6s,78.0/s)Searching|████████▏|Searching|████████▏|▇▇▅Searching|████████▏|▇▇▅102/500[20%]Searching|████████▏|▇▇▅102/500[20%]in1sSearching|████████▏|▇▇▅102/500[20%]in1s(~5s,81.6/s)Searching|█████████▎|█▆▄106/500[21%]in1s(~5s,84.3/s)Searching|█████████▎|▇▅▃116/500[23%]in1s(~5s,84.3/s)Searching|█████████▊|▇▅▃116/500[23%]in1s(~5s,87.6/s)Searching|█████████▊|▆▄▂122/500[24%]in1s(~4s,90.1/s)Searching|██████████▎|▅▃▁128/500[26%]in1s(~4s,90.1/s)Searching|██████████▎|▅▃▁128/500[26%]in1s(~4s,92.2/s)Searching|██████████▎|Searching|██████████▎|▄▂▂Searching|██████████▊|▃▁▃135/500[27%]in1s(~4s,95.0/s)Searching|███████████▌|▂▂▄143/500[29%]in1s(~4s,97.0/s)Searching|█████████████|▃▅▇162/500[32%]in2sSearching|█████████████▊|▄▆█163/500[33%]in2s(~3s,101.9/s)Searching|█████████████▊|▅▇▇172/500[34%]in2s(~3s,103.1/s)Searching|██████████████▊|▅▇▇172/500[34%]in2s(~3s,103.1/s)Searching|███████████████▍|▆█▆184/500[37%]in2s(~3s,105.1/s)Searching|███████████████▍|▇▇▅192/500[38%]in2s(~3s,107.0/s)Searching|███████████████▍|Searching|███████████████▍|█▆▄Searching|███████████████▍|█▆▄192/500[38%]in2sSearching|████████████████▎|█▆▄192/500[38%]in2s(~3s,108.2/s)Searching|████████████████▎|▇▅▃203/500[41%]in2s(~3s,109.9/s)Searching|████████████████▊|▆▄▂Searching|████████████████▊|▆▄▂210/500[42%]in2sSearching|████████████████▊|▆▄▂210/500[42%]in2s(~3s,111.5/s)Searching|█████████████████▎|▆▄▂210/500[42%]in2s(~3s,111.5/s)Searching|█████████████████▎|▅▃▁216/500[43%]in2s(~3s,112.7/s)Searching|█████████████████▉|▄▂▂Searching|█████████████████▉|▄▂▂224/500[45%]in2s(~3s,114.2/s)Searching|██████████████████▌|▃▁▃232/500[46%]in2s(~3s,114.2/s)Searching|███████████████████▍|▂▂▄242/500[48%]in2s(~2s,117.3/s)Searching|███████████████████▉|▁▃▅248/500[50%]in2s(~2s,117.3/s)Searching|█████████████████████▉|▄▆█273/500[55%]in2s(~2s,121.2/s)Searching|██████████████████████▏|▅▇▇Searching|██████████████████████▊|▅▇▇277/500[55%]in2s(~2s,122.4/s)Searching|███████████████████████▍|▇▇▅292/500[58%]in2s(~2s,123.4/s)Searching|███████████████████████▍|▇▇▅292/500[58%]in2s(~2s,124.4/s)Searching|███████████████████████▉|█▆▄292/500[58%]in2s(~2s,124.4/s)Searching|███████████████████████▉|█▆▄299/500[60%]in2s(~2s,125.2/s)Searching|████████████████████████▌|█▆▄299/500[60%]in2s(~2s,125.2/s)Searching|████████████████████████▌|▇▅▃306/500[61%]in2s(~2s,125.9/s)Searching|█████████████████████████▎|▆▄▂316/500[63%]in2s(~2s,125.9/s)Searching|██████████████████████████▍|▅▃▁322/500[64%]in2s(~1s,127.5/s)Searching|██████████████████████████▍|▄▂▂330/500[66%]in3s(~1s,128.1/s)Searching|███████████████████████████▏|▄▂▂330/500[66%]in3s(~1s,128.1/s)Searching|███████████████████████████▊|▃▁▃339/500[68%]in3s(~1s,129.0/s)Searching|███████████████████████████▊|▂▂▄347/500[69%]in3s(~1s,129.8/s)Searching|████████████████████████████▎|▂▂▄347/500[69%]in3s(~1s,129.8/s)Searching|████████████████████████████▎|▁▃▅353/500[71%]in3s(~1s,130.3/s)Searching|████████████████████████████▊|▁▃▅353/500[71%]in3s(~1s,130.3/s)Searching|████████████████████████████▊|▂▄▆353/500[71%]in3s(~1s,130.3/s)Searching|████████████████████████████▊|▂▄▆359/500[72%]in3s(~1s,130.3/s)Searching|█████████████████████████████▍|▃▅▇359/500[72%]in3s(~1s,130.7/s)Searching|█████████████████████████████▉|▃▅▇367/500[73%]in3s(~1s,131.2/s)Searching|█████████████████████████████▉|▄▆█373/500[75%]in3s(~1s,131.4/s)Searching|██████████████████████████████▎|▄▆█373/500[75%]in3s(~1s,131.4/s)Searching|██████████████████████████████▎|▅▇▇378/500[76%]in3s(~1s,131.5/s)Searching|██████████████████████████████▊|▅▇▇378/500[76%]in3s(~1s,131.5/s)Searching|███████████████████████████████▍|▆█▆385/500[77%]in3s(~1s,131.7/s)Searching|███████████████████████████████▍|▇▇▅392/500[78%]in3s(~1s,131.9/s)Searching|████████████████████████████████▏|▇▇▅392/500[78%]in3s(~1s,131.9/s)Searching|████████████████████████████████▊|▇▅▃401/500[80%]in3s(~1s,132.3/s)Searching|████████████████████████████████▊|▇▅▃409/500[82%]in3s(~1s,132.3/s)Searching|█████████████████████████████████|Searching|█████████████████████████████████|▆▄▂413/500[83%]in3s(~1s,133.3/s)Searching|█████████████████████████████████▉|▅▃▁413/500[83%]in3s(~1s,133.3/s)Searching|█████████████████████████████████▉|▅▃▁423/500[85%]in3s(~1s,134.0/s)Searching|██████████████████████████████████▍|▅▃▁423/500[85%]in3s(~1s,134.0/s)Searching|███████████████████████████████████|▃▁▃430/500[86%]in3s(~1s,134.5/s)Searching|███████████████████████████████████|▃▁▃438/500[88%]in3s(~1s,134.5/s)Searching|███████████████████████████████████|▃▁▃438/500[88%]in3s(~1s,135.1/s)Searching|███████████████████████████████████▎|Searching|███████████████████████████████████▉|▂▂▄440/500[88%]in3s(~0s,135.2/s)Searching|███████████████████████████████████▉|▁▃▅448/500[90%]in3s(~0s,135.3/s)Searching|████████████████████████████████████▎|▁▃▅448/500[90%]in3s(~0s,135.3/s)Searching|████████████████████████████████████▍|▃▅▇455/500[91%]in3s(~0s,135.0/s)Searching|████████████████████████████████████▌|▄▆█457/500[91%]in3sSearching|████████████████████████████████████▌|▄▆█457/500[91%]in3s(~0s,134.4/s)Searching|████████████████████████████████████▉|▆█▆458/500[92%]in3s(~0s,134.0/s)Searching|████████████████████████████████████▉|▆█▆461/500[92%]in3s(~0s,133.4/s)Searching|█████████████████████████████████████▎|▇▇▅461/500[92%]in3s(~0s,133.4/s)Searching|█████████████████████████████████████▋|█▆▄470/500[94%]in4s(~0s,132.2/s)Searching|█████████████████████████████████████▉|█▆▄470/500[94%]in4s(~0s,132.2/s)Searching|██████████████████████████████████████|▆▄▂475/500[95%]in4s(~0s,130.9/s)Searching|██████████████████████████████████████▋|█▆▄483/500[97%]in4s(~0s,116.2/s)Searching|███████████████████████████████████████▎|▄▆█491/500[98%]in5s(~0s,105.7/s)Searching|███████████████████████████████████████▎|▅▇▇Searching|███████████████████████████████████████▍|█▆▄492/500[98%]in5s(~0s,103.0/s)Searching|███████████████████████████████████████▍|▅▃▁492/500[98%]in5s(~0s,100.1/s)Searching|███████████████████████████████████████▌|▆█▆494/500[99%]in6s(~0s,81.3/s)Searching|████████████████████████████████████████|▂▂▄499/500[100%]in8s(~0s,62.0/s)Searching|████████████████████████████████████████|500/500[100%]in8.2ss(~0s,62.0/s)Searching||▁▃▅0/500[0%]in0sSearching|▏|▆█▆1/500[0%]Searching|█▉|▇▇▅23/500[5%]n0s(~3:30,2.3/s)Searching|█▉|▇▇▅23/500[5%]in1s~3:30,2.3/s)Searching|███▎|█▆▄40/500[8%]in1s(~1:10,27.7/s)Searching|████▏|▇▅▃40/500[8%]in1s(~1:10,27.7/s)Searching|█████|▆▄▂51/500[10%]in1s(~41s,40.5/s)Searching|█████|▆▄▂62/500[12%]in1s(~41s,40.5/s)Searching|█████|▆▄▂62/500[12%]in1s(~25s,52.1/s)Searching|██████|▆▄▂62/500[12%]in1s(~25s,52.1/s)Searching|██████|▅▃▁75/500[15%]in1s(~16s,63.3/s)Searching|██████▌|▅▃▁75/500[15%]in1s(~16s,63.3/s)Searching|██████▌|▄▂▂81/500[16%]in1s(~11s,71.6/s)Searching|███████▎|▄▂▂81/500[16%]in1s(~11s,71.6/s)Searching|███████▎|▃▁▃91/500[18%]in1s(~8s,79.0/s)Searching|███████▉|▃▁▃91/500[18%]in1s(~8s,79.0/s)Searching|████████▌|▁▃▅107/500[21%]in1s(~5s,90.0/s)Searching|█████████▎|▂▄▆115/500[23%]in1s(~5s,94.4/s)Searching|█████████▋|▃▅▇115/500[23%]in1s(~5s,94.4/s)Searching|██████████▍|▃▅▇121/500[24%]in1s(~4s,97.6/s)Searching|██████████▍|▄▆█129/500[26%]in1s(~4s,100.6/s)Searching|██████████▋|▄▆█129/500[26%]in1s(~4s,100.6/s)Searching|██████████▋|▅▇▇133/500[27%]in1s(~4s,102.4/s)Searching|███████████▎|▅▇▇133/500[27%]in1s(~4s,102.4/s)Searching|███████████▎|▆█▆141/500[28%]in1s(~4s,104.2/s)Searching|███████████▉|▇▇▅148/500[30%]in1s(~3s,105.9/s)Searching|████████████▍|▇▇▅148/500[30%]in1s(~3s,105.9/s)Searching|████████████▍|█▆▄154/500[31%]in1s(~3s,107.3/s)Searching|████████████▊|Searching|████████████▊|▇▅▃159/500[32%]in1sSearching|█████████████▉|▆▄▂166/500[33%]in1s(~3s,109.3/s)Searching|█████████████▉|▅▃▁173/500[35%]in2s(~3s,110.3/s)Searching|██████████████▊|▅▃▁173/500[35%]in2s(~3s,110.3/s)Searching|██████████████▊|▄▂▂184/500[37%]in2s(~3s,112.1/s)Searching|███████████████▌|▃▁▃184/500[37%]in2s(~3s,112.1/s)Searching|█████████████████|▂▂▄203/500[41%]in2s(~3s,116.2/s)Searching|██████████████████▏|▃▅▇226/500[45%]in2s(~2s,120.6/s)Searching|██████████████████▊|▃▅▇226/500[45%]in2s(~2s,120.6/s)Searching|███████████████████▍|▄▆█235/500[47%]in2s(~2s,122.1/s)Searching|███████████████████▍|▅▇▇242/500[48%]in2s(~2s,122.1/s)Searching|███████████████████▊|▆█▆247/500[49%]in2s(~2s,124.0/s)Searching|████████████████████▍|▇▇▅254/500[51%]in2s(~2s,124.0/s)Searching|████████████████████▍|▇▇▅254/500[51%]in2s(~2s,124.6/s)Searching|█████████████████████|▇▇▅254/500[51%]in2s(~2s,124.6/s)Searching|█████████████████████▌|▇▅▃268/500[54%]in2s(~2s,125.4/s)Searching|█████████████████████▌|▇▅▃268/500[54%]in2s(~2s,125.9/s)Searching|██████████████████████|▆▄▂275/500[55%]in2s(~2s,126.5/s)Searching|██████████████████████▊|▆▄▂275/500[55%]in2s(~2s,126.5/s)Searching|██████████████████████▊|▅▃▁284/500[57%]in2s(~2s,127.3/s)Searching|███████████████████████▏|▅▃▁284/500[57%]in2s(~2s,127.3/s)Searching|███████████████████████▏|▄▂▂289/500[58%]in2s(~2s,127.8/s)Searching|███████████████████████▌|▄▂▂289/500[58%]in2s(~2s,127.8/s)Searching|███████████████████████▌|▃▁▃293/500[59%]in2s(~2s,127.8/s)Searching|████████████████████████|▃▁▃293/500[59%]in2s(~2s,127.8/s)Searching|████████████████████████▉|▁▃▅311/500[62%]in2s(~2s,128.8/s)Searching|█████████████████████████▍|▁▃▅311/500[62%]in2s(~2s,128.8/s)Searching|██████████████████████████▌|▄▆█323/500[65%]in2s(~1s,129.7/s)Searching|██████████████████████████▌|▄▆█332/500[66%]in3s(~1s,130.3/s)Searching|███████████████████████████▎|▄▆█332/500[66%]in3s(~1s,130.3/s)Searching|███████████████████████████▎|▅▇▇341/500[68%]in3s(~1s,131.1/s)Searching|████████████████████████████|▆█▆341/500[68%]in3s(~1s,131.1/s)Searching|████████████████████████████▋|▆█▆350/500[70%]in3s(~1s,132.0/s)Searching|████████████████████████████▋|▇▇▅358/500[72%]in3s(~1s,132.8/s)Searching|█████████████████████████████▍|▇▇▅358/500[72%]in3s(~1s,132.8/s)Searching|█████████████████████████████▍|█▆▄367/500[73%]in3s(~1s,133.7/s)Searching|█████████████████████████████▊|█▆▄367/500[73%]in3s(~1s,133.7/s)Searching|█████████████████████████████▊|▇▅▃372/500[74%]in3s(~1s,134.2/s)Searching|██████████████████████████████▏|▇▅▃372/500[74%]in3s(~1s,134.2/s)Searching|██████████████████████████████▏|▆▄▂377/500[75%]in3s(~1s,134.4/s)Searching|██████████████████████████████▊|▅▃▁384/500[77%]in3s(~1s,134.4/s)Searching|███████████████████████████████▋|▄▂▂384/500[77%]in3s(~1s,134.6/s)Searching|███████████████████████████████▋|▄▂▂395/500[79%]in3s(~1s,134.6/s)Searching|████████████████████████████████|▄▂▂395/500[79%]in3s(~1s,135.3/s)Searching|████████████████████████████████▊|▂▂▄409/500[82%]in3s(~1s,136.1/s)Searching|█████████████████████████████████▋|▁▃▅409/500[82%]in3s(~1s,136.1/s)Searching|█████████████████████████████████▉|▂▄▆424/500[85%]in3s(~1s,137.4/s)Searching|██████████████████████████████████▎|▂▄▆424/500[85%]in3s(~1s,137.4/s)Searching|██████████████████████████████████▎|▃▅▇428/500[86%]in3s(~1s,137.4/s)Searching|███████████████████████████████████▏|▃▅▇428/500[86%]in3s(~1s,137.4/s)Searching|███████████████████████████████████▏|▄▆█439/500[88%]in3s(~1s,137.9/s)Searching|███████████████████████████████████▍|▄▆█439/500[88%]in3s(~1s,137.9/s)Searching|███████████████████████████████████▍|▅▇▇442/500[88%]in3s(~0s,137.8/s)Searching|████████████████████████████████████▍|▆█▆449/500[90%]in3s(~0s,137.9/s)Searching|████████████████████████████████████▍|▇▇▅449/500[90%]in3s(~0s,137.9/s)Searching|████████████████████████████████████▉|▇▅▃461/500[92%]in3s(~0s,137.1/s)Searching|█████████████████████████████████████▎|▇▅▃461/500[92%]in3s(~0s,137.1/s)Searching|██████████████████████████████████████▉|▃▁▃486/500[97%]in4s(~0s,117.3/s)Searching|██████████████████████████████████████▉|▂▂▄486/500[97%]in4s(~0s,117.3/s)Searching|███████████████████████████████████████▍|▃▁▃492/500[98%]in5s(~0s,102.8/s)Searching|███████████████████████████████████████▌|▂▄▆493/500[99%]in6s(~0s,87.6/s)Searching|███████████████████████████████████████▌|▃▅▇493/500[99%]in6s(~0s,86.8/s)Searching|███████████████████████████████████████▋|▇▇▅494/500[99%]in6s(~0s,83.9/s)Searching|███████████████████████████████████████▋|▇▇▅495/500[99%]in6s(~0s,83.9/s)Searching|███████████████████████████████████████▋|█▆▄495/500[99%]in6s(~0s,83.2/s)Searching|███████████████████████████████████████▊|▆▄▂497/500[99%]in7s(~0s,72.7/s) \ No newline at end of file diff --git a/static/report_alexaimephotography_html_screenshot.png b/static/report_alexaimephotography_html_screenshot.png new file mode 100644 index 0000000..ee2833f Binary files /dev/null and b/static/report_alexaimephotography_html_screenshot.png differ diff --git a/static/report_alexaimephotography_xmind_screenshot.png b/static/report_alexaimephotography_xmind_screenshot.png new file mode 100644 index 0000000..34b790f Binary files /dev/null and b/static/report_alexaimephotography_xmind_screenshot.png differ diff --git a/static/report_alexaimephotographycars.html b/static/report_alexaimephotographycars.html new file mode 100644 index 0000000..4c9f861 --- /dev/null +++ b/static/report_alexaimephotographycars.html @@ -0,0 +1,4352 @@ + + + + + +alexaimephotographycars -- Maigret username search report + + + +
+
+
+

+ +

+ Generated by Maigret at 2021-01-16 17:06:15 +
+
+
+
+
+
+
Supposed personal data
+ + + Fullname: Alex Aimé + + + + Gender: m + + + + Location: France + + + + + Geo: fr (3), ru (1) + + + + Interests: photo (6), blogs (2), art (2), news (1), discussions (1), video (1), instagram (1) + + + + First seen: 2017-12-06T11:49:28+00:00 + + +
+
+
+
+
+
+
+
+
Brief
+ + Search by username alexaimephotographycars returned 1 accounts. Found target's other IDs: alexaimephotography, Alexaimephotogr. Search by username alexaimephotography returned 10 accounts. Found target's other IDs: AlexAimePhotography, Alexaimephotography, alexaimephotogr. Search by username Alexaimephotogr returned 1 accounts. Extended info extracted from 6 accounts. + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Photo +
+

+ 500px +

+ +
Tags: global, photo
+ +

+ https://500px.com/p/alexaimephotographycars +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UiddXJpOm5vZGU6VXNlcjoyNjQwMzQxNQ== +
Legacy id26403415 +
Usernamealexaimephotographycars +
NameAlex Aimé +
Created at2018-05-04T10:17:01.000+0000 +
Image bghttps://drscdn.500px.org/user_cover/26403415/q%3D65_m%3D2048/v2?webp=true&v=1&sig=bea411fb158391a4fdad498874ff17088f91257e59dfb376ff67e3a44c3a4201 +
Websitewww.flickr.com/photos/alexaimephotography/ +
Facebook linkwww.instagram.com/street.reality.photography/ +
Instagram usernamealexaimephotography +
Twitter usernameAlexaimephotogr +
+ +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Photo +
+

+ Facebook +

+ +
Tags: global
+ +

+ https://www.facebook.com/alexaimephotography +

+ +

+
+
+
+
+ + + + + +
+
+
+ Photo +
+

+ Reddit +

+ +
Tags: news, discussions
+ +

+ https://www.reddit.com/user/alexaimephotography +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Reddit idt5_1nytpy +
Reddit usernamealexaimephotography +
Fullnamealexaimephotography +
Is employeeFalse +
Is nsfwFalse +
Is modTrue +
Is followingTrue +
Has user profileTrue +
Hide from robotsFalse +
Created at2019-07-10 12:20:03 +
Total karma54632 +
Post karma53376 +
+ +

+
+
+
+
+ + + + + +
+
+
+ Photo +
+

+ VK +

+ +
Tags: global, ru
+ +

+ https://vk.com/alexaimephotography +

+ +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Photo +
+

+ Tumblr +

+ +
Tags: blogs, global
+ +

+ https://alexaimephotography.tumblr.com/ +

+ +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Photo +
+

+ Pinterest +

+ +
Tags: art, photo
+ +

+ https://www.pinterest.com/alexaimephotography/ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pinterest usernamealexaimephotography +
Fullnamealexaimephotography +
Board count3 +
Pin count4 +
CountryFR +
Follower count0 +
Following count1 +
Is website verifiedFalse +
Is indexedTrue +
Is verified merchantFalse +
Localefr +
+ +

+
+
+
+
+ + + + + +
+
+
+ Photo +
+

+ Vimeo +

+ +
Tags: global, video
+ +

+ https://vimeo.com/alexaimephotography +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Uid75857717 +
Genderm +
BioHello +Passionate about photography for several years. I set the video recently. +I use my Nikon d7200 and Nikkor 50mm 1.8d . Premiere Pro software. +Follow me on : +https://www.instagram.com/alexaimephotography/ +https://500px.com/alexaimephotography + + +Bonjour +Passionné par la photographie depuis quelques années . Je me suis mis à la video depuis peu. +J'utilise mon Nikon d7200 et l'objectif Nikkor 50mm 1.8d .Comme logiciel Premiere pro cc. +Suivez moi sur : +https://www.instagram.com/alexaimephotography/ +https://500px.com/alexaimephotography +
LocationFrance +
UsernameAlexAimePhotography +
Is verifiedTrue +
Created at2017-12-06T11:49:28+00:00 +
Videos14 +
Is looking for jobFalse +
Is working remotelyFalse +
+ +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Photo +
+

+ DeviantART +

+ +
Tags: global, photo, art
+ +

+ https://alexaimephotography.deviantart.com +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CountryFrance +
Created at2018-12-09 16:02:10 +
Gendermale +
UsernameAlexaimephotography +
Twitter usernamealexaimephotogr +
Websitewww.instagram.com/alexaimephotography/ +
Links['https://www.instagram.com/alexaimephotography/'] +
+ +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Photo +
+

+ Picuki +

+ +
Tags: global, instagram, photo
+ +

+ https://www.picuki.com/profile/alexaimephotography +

+ +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Photo +
+

+ We Heart It +

+ +
Tags: photo, global, blogs
+ +

+ https://weheartit.com/alexaimephotography +

+ +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Photo +
+

+ EyeEm +

+ +
Tags: global, photo
+ +

+ https://www.eyeem.com/u/alexaimephotography +

+ +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Photo +
+

+ Twitter +

+ +
Tags: global
+ +

+ https://twitter.com/Alexaimephotogr +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UidVXNlcjo5NDYzODMzNTA3ODAxMDQ3MDQ= +
FullnameAlexAimephotography +
BioPhotographe amateur +New gear : +Sony A7 ii +Sony FE 85mm 1.8 +
Created at2017-12-28 14:12:28+00:00 +
Image bghttps://pbs.twimg.com/profile_banners/946383350780104704/1548759346 +
Is protectedFalse +
Follower count300 +
Following count76 +
LocationFrance +
Favourites count6408 +
+ +

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/static/report_alexaimephotographycars.pdf b/static/report_alexaimephotographycars.pdf new file mode 100644 index 0000000..aaf748a --- /dev/null +++ b/static/report_alexaimephotographycars.pdf @@ -0,0 +1,430 @@ +%PDF-1.4 +% ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R /F2 6 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://github.com/soxoj/maigret) +>> /Border [ 0 0 0 ] /Rect [ 92.71646 734.6133 126.0565 749.6133 ] /Subtype /Link /Type /Annot +>> +endobj +4 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://500px.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 410.7371 79.42146 438.8621 ] /Subtype /Link /Type /Annot +>> +endobj +5 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://500px.com/p/alexaimephotographycars) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 374.9883 232.8865 389.9883 ] /Subtype /Link /Type /Annot +>> +endobj +6 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +7 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://drscdn.500px.org/user_cover/26403415/q%3D65_m%3D2048/v2?webp=true&v=1&sig=bea411fb158391a4fdad498874ff17088f91257e59dfb376ff67e3a44c3a4201) +>> /Border [ 0 0 0 ] /Rect [ 138.9281 243.7383 891.9081 258.7383 ] /Subtype /Link /Type /Annot +>> +endobj +8 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 300 /Length 22914 /Subtype /Image + /Type /XObject /Width 300 +>> +stream +s4IA0!"_al8O`[\!<<*#!!*'"s5nb!!3`5!tbS6_uLbW!!33(!%E;B?l\70r@@U4SSmZ7:;@S*%5da`Mp,75&H8C05Hqe7!UG4!]U/k"Jl[g5_BQPb&r]&kq?gS_E8Np).f!*dpA1F&m6$Z;mBdDR17fj&rOK*#8,W3hTP<;8Odpu"qL;!l)]sGR8&Pso+W06n_m5#t?'Icr@Al#0kM6CE$`WlU"//#O.1*"o6YfOIRVmu#n<=pNK-X\#+"BGN!<'E[`5GhJU+E$?eIJuW#K26AYY,0l<@XR'!/I^`BQZpO&dY$d'9$Gr47EuO)\R:jo--T]md+n%<,R1X'O^Z%GDTlg6&X*7=L]7!Pe5*@4P0Hpi28Ig(aB9j-?H#L^9%]<%SYGiVM7IK!,e6'*IhuQ24,"#UG7+3f!P^N;U\D<46B+CE@nLq4$.s#KWn1A'8kq6I>RcDJeO*op[G9H^IlJAq@;f$qHI77oYZXO=CX;=.r]o?RBP;"]#a39$T=E1fcQ[fTRsSi9k,:^aBE$:3OQgpYQo^;_ZC5lG*0a0"Pe1KWGPp+^7it0@X<:_c$543j^-!GuT;I+Vl(Cik'M50u_p>eAcWieKL&X-K!KCr!hR`K^M`l`F?7"dDiYi0SM"36`:=0J(NL_Hg;KqnfBBbV1s3\uS'C]Y45`T.X-)V7'nk7e*OVT">&%7iF!oF0EU`mcF)K6#LL/E`O1dU.^WDa$gW8"jMbC)C_!S(Y4GCi(p'q/]j7K+I>S83mi*gV[CZ;pM.&WAfk^1tXt#hLnTD4M2_N\(cXO7i7B#;B[Bf/T)T8WJqJAOHDE:P?+((@ZT+!bt4.c&Q9t@L7OP#hEeqJSu@-RPn\2s#)0U6._Y$IRn0WT1bWTd[529jP%cd.qX,EH2$/a%SMPXEm$OZR1-[MQIhZ=<+q^GVj2b@"92k6e>/MN^bpe$1nbdbN:(2J]i8.W!X,W7,DiT7&`*,j3g:!Y$4/R\a?F3pZga!#kq=!WrH(!<<*"z!!!!"!WW<*"U553g&MBZ!Y>>3!:Z-e/RuCK3u2ka^XN7$Q9$'Io('fX6Z2Z$qa@VbIT30%7kek+Yb)5RT?6@b*@g?**\4St:-&C$87I)\m-TVuR"F>d:QmGim>IC=#$6kk"aJ=-DK0Tb[V>B9l%G&keP&lLMZLXHrFbA+RE,%+Tk0W1fT`Ah=CSodt/@9\Ho7ict5Rf)SePL148qKX'G'[U#K)QYjD8!!u%2;?.G$G'M55R)F)0?B2qR#\$a^Z3F1SNI;lh=G\DD*g&ngdEA"B>MT?84"lRF(>?H9RNtR/GMW7DN)I^`k=58RbE<82I%)]\1h9b2jMS7h6nK+[c?",aL@E$k^&kml*t#D1\q*:X9itG)@aaJ,dFe)Z]p?!s&E'zz!!!'&!<`Q+"pb1^!!iT-&-)\1qEJr7!`Xl*`*c%=A;YVfNK/"_Uo\YD.1&Vt+p'GAct,?c7SGa(N$>_4$EmSt[>54kN-@tA*6FV<*9T/]J1@[CX;1d\!&5MC4iGI+1L[i_D;\,lb#6du&J5k9+rK='j!GEVD6j*SeYn`b?iVAQ&7Ds!jG]ECOdWH1rHbitQ)Ffc6j-;KHr"m,*17BVRi9PO8>(Q`>+D`>2Wn87!GkB0+8Bf_4.RLs;!$Dj^5Qq6,Z$*o6\B\Z=9K`P.@%`4hLj#))ZU;;>IYOXcb_fOKB;26$('5$k"/U^?/;Z^DHUhcN,Z8YPH6B$a/3!c#>ES*>C]nEmI3m(ejJ:k4cU\ZV"b[/sNP>Ie@U58$NNMDe"jE,^,%9^f,+r%s#`Ms_KX"s#Q2KCJhN+DYPfXdYP*E0^!Jl8a?T(th9Js?spH:YA]@/N);l6BB!X&a]@9t6N]&T=7g0V%XB%j/?9]oD*==sdZ"t$2l4S"rZ%DP?@;Jr`q1.5cRPq2nr(,6h0)SRPobc^E:V6NM[erlFG4]S=o!>U+k0cA_7j"mKR4_s8qSZOH\.?\+SWG>\WZJ['Gf#.,/\S2:P]tBnn-+?4IAk^NJCKN4&H%j@40muUa\n-$R4^MU"DWC7!Yk5n-"]e,[pu]!q\C,/<'1:rRmKS>_:-49aH>=7L.]eY.cIhp\UtrNg20j+#=+ATX`N)eVBsb6J+?=/!@%qIEnUEg1TE/CU_p)fi%;`AaA1BHjFp&$i38!;GNNA*iG?,D?79N>JO&K5aS(DGOcGr=Sbm5g9/$8ZT/82CHr-]BVZ1TsPe67lc>WM/CY\bE4u"b/'NGM?oW8uh[K2>?_o=^mj?g!B7rBU`VQUQmJg&F0+aGJ5*W'2AZWO[2gT+>e=FQrrE);!$i*U!WiE*!@<`_j;Q76;m&gB`+7Yma)J,fS!nG`JuAKU^:Je,j0X;PP?@q_T-;CKpl!2';r$lD3qZP4n[$"I2Dc^nR^(jJ=T$F35:`IJOiGh):a[DlUj(\#]3,mioN!M\B0Oj%#(d7uo>_F^QML6_IG*2-_3ks([LCQ!tR(/MSNj3@<.`he:p8\]m\_rA\cT_k&:o\-OQc#J`jGN59j.@E2m6D`(DKlsnZ^3M.UkUt]_>/g[RFC"?5PS2bKHcW:g`!\n\6@);b#X!]d\e@EI@m!_r,eC33FMsXO32bS0NkOQcC-fMp<^fLPA(q:*OkIL&j-I^f):"M2l><:#ho4pM'[^!rPUF/INb)":1n%Z%to__OZ5f&'R"FnV$&3DUdHlh@kJ0,BGOAaA'Bi8MS/4]8ed80EQK@"*DtE@2LTh:HK9cW=Ju=0Sgt)#3bl9AE=QCY>9*BjCT1i@!WMAL]tN!Z(oj6,c,$Lb++L[4q+b9gu"'00))'kU@]9fVZic<4)[T`aX[aYB3R]M^#;aH@c:LtK^e*Mo",*M[cG%A$cA/@&dI\[Qo6A"P[>:GfD#V]`*PjJb2]Q*7O#Q\nb-,Y9EG3Cq1G#puc)bq/2_fn*at[@$ZRpA<2-N[\Epi0%0gm5X7f.:d^`KQN*qV50,nPpJrLAHKACodX4%A!$J'Bl7X!JO[_"%*S^FH%ed`Lr*Y5PPlN^DJ)]g1%S,ETs]LE\!G:7(c&Ib(NEE)8;b(Z\QY?+sM]3\nbVWe#*'k/FbT5PfJpp9pK=&Wj/OO!5k%($F80OALH?*)T,a,sL$V=sso#nD4d?TDp`@r#Qa^W0\aHoC:HHBpf8i:>AQ5oZ!_uN:=!!30'!WrT/#6b88"p4i*!q*ArkW.Dc94t:7l)+P)u&(^ngl[&3+K*jG]n)`VKY.i<*'Hph`0aZO0&Y`*Cg49]]2htJPs+7.U4LVi!*R'Khcr&[CH[II!=$,4[%9;0I6@HoV0,j(KPl.p2[:>aPb9Ic*P=)YVT-6Q/`7>.8.GSD8'I.HsX)&:9[//?MYTSfQ%S[\D\WHgkMfg6TJq1VaO-eQgZ,mk/##[3;Au53Ajp4PgRUYB*Zl4e?>MlI#g>TPA"lPYf8>,N!;Be37Kgckk-NF0AHpV$q+X\="]hKu,V6`U1a90q^:rg;Bk+\8U)'3:-6.LL#IMm0l\&1qANYPn]cqe#&9n+9Va+HQ)53N^d&%@Q)O+hUp:?8\%1kbIr5#aVp5WK8OU)E`ni\CV$EWnm[G6\b9M90H_==k`T&Z=.NX,\Hk4>mFUKFN"X@mHYZ&@t"_WI'nqimA:KhQaqs"!h:7-D?A4J]9ac;cDMpc(Wfc_9Tsk20TrnckuRn'ldp2llHhhaORuIM!bVf,C?`e7R+mWXU4CO.C#h[fK%AqLN%,<[N'Bbhq9r1ZGqHJa3>+TDd4\qnE5h[F2K>k9_UPE,U5:pFh+KRpiP-]]Kf^i+Z%*&"?I-n*D=UdX\S*r[KVK1l/eO2dJ?YY1]3(*XFBU;!)]R5]R_p[OTf+u2/dDKA\peiGMq93PWSUNT6(#4E9%@lrr*!MU<*.B@L5S&(RQ7@W:5[kMoE!.DXPg*BggL7ER-#3oC\p'.fQh&Z.GWCt4]kdI?opOB6>ma]/':\Z=ju7a_>"JI2"%s0=.05kdLg7BSBr8IkkHko-7JE1,u**"'<pJd4$^$`#*1oYZ,+ACe8)E\L]RBBtSDcn/f9,P^,U+Xg^!dM+mC6MR'eH1^&2c0L\6VLdcjK:$k?V_4!!#2"'LTI4FkG,h6c%o>pm79Igs>-H_nsq$,E2uPlL$#JH>6^FImPT%m9LuS9!%P);90iHX.0(lH,A?PRtj$7IhX#QO>6ECe1f$F\q<8V6)#(8V!YqKn+A>D(Di5sl@p`u?\hUsRT5AGHu_e?3V+Ld;CAee")QR>RK7ZTA![,pB-/cI8:@>pXQP)19Djc,S^![ebjdGLZHA,+OFteKjD)isf%$HbP#[DNVA)MOSau%HI.PIXGLXm$MJoE_J&6'Op"*&ig#6/N06@kbqljhfV%_pj=>r]1WHqh[ntsEfBgo%/YMR?(N@?4&"o_A<@=.Qct1H()j/>GBM)iY3?!DQj?$/iZ.V&Gp(r]o5fI(s>EV#nbH,P^5=lO))`bBdcJ_8=;rY!W>9qQL/6#1YjpC4'k\7-dQ<4M=QIc`6KH=:f;d;Q@INJ2ad47i4M4m"D++5Yq#AB&.dXslD;gaUB4JG0=saZ(nf2G#lVUP@=+cFe]*,,_u6;D^Q7i2g;$S=W+=fMc#DfW=HO]X%aL[>]"Kn)47HYHm$.E/kWAM<0F!cK.@B4IaFBCkKP*..R]K.]GDHGRSTT-Ybk5)*@SRrkE(YIqLso"48]ir0I]=S.gs&mNH]Z2?fQ#l&+R(:8LKr?Y/]NP-_QM`2qNF2X3*/M`tU9i]!!/B%5M!8&O4Mpq6OD>hZZ6',F"s=^sS-G3!Frg46L8mQg(:(]?ct!@u'P+'H&P!(u:!G#Yi,=YcNSDet*>K_4"Meas/9=8HIBgkuHj0om>m*,M#-]Z431`n"jqCmbK>Q]dU9h+o;qpd9!BCo=Ra/S(I8%N_Mb;\h/A%o\[h\.9[P/<7>FQ$H+kLA4_h`iP/]B_P7XdZLi]a9#/7-qRrRc?Xp)q_@ZD+5+uI^C+'?DI]ggm6:dJdtD)*;9b<"%VXcnL0D+H*lN'UB)(/PiNp8;NT0iVJH:acjlBIPLU4W_D@snKd6)%L38GidN]b.Y9;WAuVC?gc'Bpn@)S3F/Lq%T\3sLim$iJ41'C/T6dJj4)4=s,0"g04a28nl*QJFNZ<\Qai=L`H>#%2_WbIieJK]9L;%u;W6M@mHQ8SJJ%lIEh$\Dm$tb=us/Jf.>kuoh!aQ8!P';PD#\@%@X5[=u+NWr+A+C_LT,^@;Hd)hmeQ-(fR,<.n;ifLBAh+Dl4(;]q`f+iBWD!"_BQBrf*Uo-[[*;Pjer6B):E@Ga'/e%-[cPm$f*69dbhO)Bb%qiCg73KD?ofp2Ar\peEG^De?1!:Q>Y3@&48tk!LetV-;h"tl'm'$%JQKUHk<[pA5bV?9)gMBY@4_XJ^;6*$h3:OK.)Mn6k;#S1e*JS@BLm@P`q%6on./c]=5W*(Q8$-?.4\2GG@!MNin#ZNhn"gjaUdjs3KDLH1KKod3rr=r7%+,pRLe+?=Uh;Pt`,E9Ib71BqpESO(I;7Ri;Vj#@Bd@@M=&j28WYTsmAup_LQ9+u-Y:=MW=J(bP@6l:%.3Z6KmO<+a2f:o04i@GcN:[kAb8n/8@kE^u3RtLgQaZ*F)ed*orXq\9p,D]'m8D+6ROb%l0:l;^9`D.k:MUUglls#Ch<$R3U4s3#H*&BWs(IB9;t@ql;)kLDnVH*eq;ZMB/+2_:NE)PN@,qkiI"UYD:sO,LELMn>M[G;NAh5],eYos8IT`Iu-3_NdmuhHQgt]4G7/Rd7b3%`Agc#nT2]'rR8GhL$5s&IUm/I(Q2J[odTZLl.X:6"#U)d7OM04MG&uig8m)-WqK?Br+aV:YUCF\.>NQ#RNT_QuXq/iLE7Zb',4H0ojI7Gpkq234;5C?U>QI)A"eA%%Ii_blKuW[d,b\N"WGk`lFE,,+Hmm=Sbm-e"0P!;0Er$:ctZ^#ELFj$N6O^J$^tf6Fc"K)GdMgMN5XEWIcOdFZrEM:FELc1.^N\BVT$4_\I134eL[18f']eL=p^XHr;e-#7'j11n7?s_(fbh#&$C_'Tsn7k!aK<%iHA4V5Z$.mfmkm^9nZ*SQc]8mrIb8K!Ob+P):)#R'%\6!7d.coc@,90ffA%(j5hm&O7YTlG/'l$2t^o[u%HcKkI\ASMA9#E-)m9R2QI7`pJ6Hb;1AArnbJn0ee\r%+KhLXHuCVF'Pjed,LH37&6+U:%;#(]C:i,eab)TBF?'6\D-fnBQ@OaY56hCk#_'I&h%Dtdt^aWZB.ToXa":((Y\=0mR-J!BLk%,VG9Q6P.,"2?S7\YlTof7gf$2;;+Gjh8A/!cLj+2T=pG"qh`]hA#4[^RdW4`rrBs5LWIl$Ld6%MAP^NIe'=L/>=iAN!7O87>T3+%:`GR2NBg#&;o#'hY;&@gPoi'=OZc-M=fpn5p3P>m)(-ItV5QPQ-d*X[#9pSH3'L;2bUGlkDjH+N37tF54UA*UY.M58muqp2?r%*`]O*!-GYg+aF1<(c.ii:G"If0ud;Es,5%]D+)"f_`,e!>E@_9V$g5_niDDP>k-6E0W:c^(KA)o-&Mb$Kc,#dEY&4#)K*5d.3j&O>cAQDBfa.dioFO8_%%gi-L86hn]4-MF+DY<'/<#OZSe9XGtQbc"U&]fQB$5U$>?j[;,s!Yu40Ph"oLge72l97rUd*JZ88#^`T[)Ui,;g".>q'DbO$B@>LKPg7jEVA!ajW+B,:&C'A\ANK.]UkpDRm.)u2ko;mVJp-fZ"eY_>5?0Mg;Mh-Xs4@d^&C6!XSOF,'Y,([.go$^c!)/Lb)p,):L9pc\oV>5Xc$X#W`j>%kUbOH9WN\S()V1A[4H("rClMb8*R6tr)"^W"b?`X-FQsb9G>R:$"YtI.X9iP8qPVBqrBAiE.'2B7]U5@ZhI56BVYco08M!I"nC,\#$?Y?I:g5H(?,N,cT(G_]NDEAdkr^S$'ls$7*.ChmFr>.7?mg%7fALg0,.NJYqbah6M49cA&;Jig<"`tMj#oERUa%a]3T^c`1[C2r+HdC<)"M*A'I;12j@*&Gcan@>c0AE?bD__a;k*CRtRFcuj6aReBYOXDN?haF<3c`8CPo_qd1;G`lTJ!("jmb%QuLDOkMMGfh-:eq6RiY""TW*9hDE$lW7*;E\_\=)Tm#k[U.2bosQTp^lQ.lID3emfo[L;92^%!&=f!O=;Z!R`MRQT^fPaV3AQOQR_3!LR9pr2YLou3=CG@k,32g44nqNk\l)j;*EhN8n3i_lYnUE'__Gm1:MlM),M-GAH86X,_.V,?,8UR9URrMc"I-VCF$APlII;AD6D+D-hjbXK\+]s3$_G@jW%]`1-DVgYO-/cYd7^U=`?MsFZtDY/R_5S(sd*_/7o$A(*t.:^fH(c`J0NH(MC$1ioWaO5X9RsIH$3`9-Jb8rau"rGX3d:,[)Q5%b23`/:!"HRK?%hRKAHOp:P%>8W?cO%@IcFU%r`?R1&c9W7^;7%O\Z9[a*J/M2si5Uo.6VK9:9(***q>jEI\?AUb&22!#jfm]Jn#Z,b!Y)'PJo:4-nHt=<0Xp"qERDNN7]ebq6[=^*Z['Yk#`dF/]3j"U@!qg%-^bcR4'[pDB$EQe2iZ1Seh9#o`o*FKreKA820cIb=FJ_M5oQEac64kB,=Wa_N0BYe7Gq:G^G8C&Q`QZb"Ec'[S>97'bm+2_l4JA\J[pn_npa?:=s(Cu&Br[`#\UQ>2oFG;u8$#bV6Vaq&cTOB30[:&%;JqEj(JQX@L@\dJKmKq,jJACIA'X7l4*P,Vs:D"%sNlI$SR@>^$F#f'r^o)Z\fr]dtTE3\,"Tq-8'q35RjgArur2[BBn'kbn)?0](ChPE4'?Nf[VsXmSJ>kVo-Uhhi-kmGiphE8ZZdQ7C2'&&`KTZA27ZAE+oqi>>1U\`aZ1Oq$K0:[ZkBp7?RsnjnQbCkKC*slZhPCD*2?:unUH5C8R=dFJOY,ZEE'U-m8_foR6ifeq_@7)N%qo@dd8N@+E-'908GU\-mi.4b4,U?,gkrR;9#RL_/,f!aC8.fF*_)sG5*YCM-F21+pfIL6!$MpT!!33'!rrE(z!!!!"!!367":t_L+9iK5'`Zke#QXu-!>Z.#?kloeY]b?Us_+rZ2b)Z24t3YFffCo8RcD:[$jBW4d*3&"OLh5T[5qceq"[_6q/@E+rs^l!.YU_WfT%N>#(IWM%L=D-D1N5!R]O&#Si7Sd1`m56puir.KfjH%Y,Ze%;SmG[7[2+3_a?5eg3Y$[jG@.Xc3LD\hRRE*`#Xbgr7"XlMP#>O4Eor!Cn[/b(s0O.*_>Ec%9=UR'bP"=9o%PjJ/gdIP!qY%h=sXg5U7-6.6E[jRHi/b&E4!!3g`)kJ6pX5c4i]Y6=a9Qe[*SUB9P1O&h2aH+Z)Sl[e[S6fjCZ'3SE/!K!HcF&JO57@14BWnS%Ge)mLY8r!nrr?JO2I:k\26WVF)0'fmGJ8l7i+kGhQC0%:F"/JV2r^N\]1$XsWk,0X\=@`(3ES*;6<3poT[[f&I42k.#`]\7$J(^GFW]M>B0KJHK+\_P%QKkrg9D=8a&@W*8auSXmK<2LKlA=)pFWB07qk"o-hpub=60N,Rk$_ZIuXc&U1M>i"k2$^$iPFAX^\\BL^a_f;hrN")bQU]oim&_iG\C[B4S:E+Ieb3I'2gZjr3:VEB@jGh0oORiuXKmZbPDlHP[$D\_XjhRTn7!NT:*VCU>Z^LLro]:,QUpcW*?>!EGShl>.hLF,/t.pl2gXW$?!:5D3i^rK,.Z-ek<1$Iq&GA2cU11S!\4Xt58AYn-_X_V)j9N9&b'O*_(4ckYJp:*E2?B&EA>%ErcR[U'f@1KIme'ltVX:p_/4`W8.8$Ds2!':bm!l'/3u@nOf'OiiN_M5_3*[k4iQ$S3HF>`L@=T;u_?-]aU/;DP+K6kKu_R(V%!?E,S/ciUl@Q:!i12;KW4@D-"8"@[?i$4URrd"6`(h^#I?Ra\R,,tG_cpPVTBV!rV[CD;'DUJ+pRH\k^:[P##b0F"OqkALdo'OP\'sGC>u6Q9m>ZhL!QcndiQosTsCfugkVI>@$??6Y(OOA)'/T+:5&'@'FCefH-ThK>7E'3cd&!4alnUJ*0>69I,K\t+J4Nrk(K_\;k!5"-5L&\L+24@:U*%(-Iuaq*rtMPS9)m9u,4:#(,#=,Up(\g8kWn^<09r;._\@L$t5mZKu\%c>&rM@Chf+M@16:)*%8TqQ8/$=RHel+/'2$G[Vq'S:_&.ouR$*7hn0E=DLlFb-4PjU2]X^9th0]275(ti9.a4acQnTW?T>)Scc%jG6/>%J0rJ.=;6O<,0fS-,jDO*O["ddgd)?H$Pft^G48kbnG`L^rrC/:UJllFbslegnT;:P%CpEI):nO]Ga`HIa&r>4"VK`(ac2e'ScRF@<0-Y9H3VNfk6F&9W8VogV_B/Z5b)ApbIXQiPT8_-BEqG-rZZ)AhDGDAT@G$q^0>4M+[O"G-b,C3.o^.fAO/RS%YJe3)JXp_EGS`.U&[BDoiu)59beRDJI?uW:EfsW5c_tlDp8<)R#a<6EC@V46EPCJ8.,-8O,*5@&0Mf3tf6Ag%61'"bOkGhE_]lPlUsmOF(,o3Zpc"Bj-4h`p),qosE93.pIKiLs<&&rZOR%I6m+<5CpIIMaI=BRg(LKmM!.$#q)0#3m0pMkF#d7>J[Oj@WF?PSJm^KHSrZnd;258"_jt7bZg.d.$k7K1IE".&:)WPDeUN@Md[p^Rb@Rd,]?/^J-3hq4=\nrV?mSm["8673&KQRYO,7%2KU>W!jrr<\?'9:,^)&YoJTad."c'.#BeqkZLdMYQS`](n@%MH(Wi?OKt%GEh8&u9UDQ^>I&5Q8OiXp19"s328`m.Ht="0CF3,R7ZQN2:`&0YB^T`H*ce"MuQ5h>.FiH,d'"ACA@0aO:XAU"l$@;o52a[@Qp8s.@%(PP*=K`.q"5,tqXl'U`L>!=3:0;8m_8fjpKY99Q7)-R?s7Ktl/Je4lri2hl?#;i1'CnhZ"$8>m6](!$-F(H9k^'u$7l'@JE1/68V-C=oafgUKPn%kV9GB1f-jXq,_@6tF(h4=nAgS-^,a6[`kqF1N);]rN+KI!o+P.#VUDINS4^puG1Sg5kn%IpJJFjR!X"+5[iR9Tp(+(a]P'[U%Y3]r.5lh*'AS!)U0m7#7,a`"$0V.t$q2qpD"<%CT"B(0qa"GY/,a(hT_[Jb[N9+(j)HesT-UA:U!=g!*Za19<@WZd8@=XLOH6$6J[1WlN(^PYD#X*?S@`4F'0^Q[eKI"$"#6btN)\?g&#U"`c99Tc0_[2&7FJ6TA4jYZUWb]Q>"Dhd[JiP*n9PANVLIY;qdA%f#`*h/3JoV;QJJr"E_[Io)'A-ko_U665-!anU)@Zs1+G'kH=u:(5Ig."4'+?Q^@;o-*LbAT21a(.t9ai_n$p$F'L^hr;_TTkY0oeG1dh82O!Vm:@To:.L(j:!ePYAhR1XJ_eXWGlPAAn*NZV@p/rrCt6_4cT#_!Jt55"t[UkSIN$CpT;8=]OM=>PutZdpM$^#)j\BUC91JRoe([(1>AaWh#./nF>s5\r`\$o#R-,ERp+&SYsC4Hkkk^."_M="mO"=:$)u!"NrXBU0t^F?pIo.A1_2#dOjW!amr^c#V_OH72JdfU)=3\^OO!Li[k\cA$'`CBUN9Ld(u/6l=:'#glNnhkWA=ID7N&Min"j]DU3_Neo;T%Ph"4"<%9W#U%#Fa@,)&dU2hH/],]J.K%F(SotlgrrAW.2"IW328C=77YWT>LigjW2LQ_Ndi\1"kSqN:#otIKi.RqSM3a&JCs#',j9%BWJtrr`8O5m.e:[[T_&q!\br1XD4%5D%pS:\,KSNV0.BgLtQT'&mi*5QCco)8\@#6QJuaW)t:IBY_'M?6I6&)U:CmR(/E-6dE:>>V-\uLr^\=!!*3>7l#pOr$\L`ALB7G>,oWAnUU`WpTp!1!WN-]E>DTPMb%T-!!,F'$m:Lg#XErig(/Y(S%!\!Nifl[?@<63[#F6!dmEOfM8'N?YQY.B9<9slu51@fKB_M["bV1AC;3AjrCX`C:>Z@SZmQS/OFnr6MXR])s^a&T!e7*32&0LQ2=_3Z;qN-pSSb]O>p.10n0-jUs>V?g/$Kh@MmY.VE_e5ioL4hU(5c"A"O>+U>mpCA>lea^N+.2AOXWE_D*jJ"NQLt'k[<"gJ1%5f=Z(%qM@JQX_YRbD#\Ldkm3ranTaRT1e5$t?B@),Di?i>!fZUcci!>r8^e)>$N=:Qpm9+KYbtc5]ri8Ttu#A2M[L16kIp^1:c#3IR0h@:5XN##-rkCg4,a_]&!(A5EC`VoV]J09^Q[:"KJ>n3hg$V#=POAP?N,f\'6bIt-m&-a*ZSck40>^L)J-Fd\QVk2aJrBLRHsYq]HH]9H?]iB91&k%/![P8r)pH<]_OH_&n;q^[Ms!U(n*4.J$%?jq@U)VGH`5QAY%4:qPp!W`<+!sJl3"p+l,!!!$$!"f;V":u2#5uAh7E>'HK14]To;N[ZX'I,r\,Vqhb@WE38A!4.tg&MBZ!s&Kg!<3%,*tk_ZSpRNrT8UnL*p5L/hqnZgp5AYqmNcigl_IuHYKT>E0I,Um-Bh0R+IrEi<]0!iE0(c6b;MqW3ZbOFjZE`&)I`0Che1tgqX1]%c5uQB=<#,o`&NPtFSHUfmra]@bMT9(F\@&9C_1e0"7L%<78Or2h:?j^E8'f#29a\@I>[91@[2M=='1+Ug6A40PMWTqPnhZ+0[lK:!K\A1^6p)adZ-^h'n?+*39p&dLr.:P9EsC0Y$61MtO>r?rl66<%-up-LGWcSS^PcV.b2e@J'u4)'Gi$1Bo_QRO;T)r+#F$P0'[hdlWFtN5qF/Ej-9T!XTR>_:Ggr;me:&7F%fn_I\8s/]nR==1.Fu="g2,')5/fJe*/%Q!(gHK0?^/M)94Ma9ii^n]GTYQ*oYC:F2\(8BC#RPl/iE9,:[8KA)028TMA6UpUPk:q,7&:G:4q\_^.OhkEIDJUW/J#k/!F-NhI+7-m6O>>=G,`YFDKK+,3Qq\m6qb+_@Df#EAXF)OLOaM_`kk#:l"[s*m(]jXS95SKW^$kRI'ni?R(c\LsK\u3<41V%Pbk+5^)H$lIqZAa3k'sA^dUVV5@$cq[$DG&,=!kN4qZ!.M'J4J0f*HRK!9Ha7U$O4#.@GLlE^]09AD_(u27Wdb+B]4L]>4"gd:u]91V-!b4@WR%L1i+#(j?=nkuF?Fl?C1'Su$6R_Mi^iV9'76SE#h:j%)gM[TXKD,KA1%Pg)'V5oTCS5"N;rrVp?secX0f#edh:s5fM"9u=5b,JO+\YD#*Y^I-hn^Wd!jshg,%d($feNTeAbbW!Nm.O6r1154pOo)j4/Ls<]$TiPo?N/.'%eq1KL.%D4=HO&sP_*FrCB8CcK1`fg_Ubh+=!ipg$0^#bitSU[9_B3-nD.+`Qrb<&\Oq_Xu$r78t?9rR/`>:(2XoqT]M0ZAf`"V%mntIqN::Yadd^W\B*j5#ITH)OiW_^=>l#TiPgZbb!&FksLO\%/VIQ!2da8!7G\N^WFENk,K1W;Rk57k1sYO(LaBoNCc19\bnD@RplDq;.dC^S6F2T&[d6DAk/W71l[KdPjjm4WY^*0`@8W=iHlA(Sj:1iAZB8_=lRI$!/Y<=\,QFZH0HjGr9NFY]Y1>[i7!K1mC;!"Nnk+_CP:34<>ilSL=%N9^sp*Q)'uWjKG]0q9T3[Q+E'T@j+SCRl(iB>J]^n$LR9d$pqBeV^:dpii@E:LQ3Q=;6@quV4fYe/@+n3RWmUfSfSNj8cCouI'7kM*<4m'))jud!UkLkZj4Np`-2e++K0$WP/K6BSa+`,FAILbs!]`[i+:qLNaA*N46<4Pr/QW,rKHE76]1+oYCLk;*VK-LA5G^`SCcagbZ;R1BF>0DnaNcS23fq3ui`7+['55Asf+S"Y3Z=c&?c&TG3ga_#!@>HLq7Mc6_T*<27b#>pOU1cf`[(8D'r3#$C4$i(&b'?YT<'s%T@%`OLMjZf\G"aWg`DX13oI+X;O*lk$EbcQr.>/Gs8T$=>49F='+@V&1I`$&B=&RPn:H4A[@,:mdTA)oenBuY^Zq2)'AW4pp9b!Gl1m@rNG79RAZRP9Wof4.a<"g=osA&!^^oUc_%?1hGr?V?bC\%LhRQV88K0aLm=^C.&S3C(Nh*ZC?Z;1FQ0bSWRGJH$e7T"1^2(^XI0,FV*ebiC4\86_gi)'rdGSORQL'IA7-Rr9@Kn;]43tP=';eKFn\gg*p86S=Gm$%=$M126qsK2-L*.7o=l$_buQ,*Q-LY6fl.a#BZYnL`h&lm'opLPGWS-Zt5>$,Qo6B8[S"S.#f8MT9GI8$SZ7)M2m!7d=9ijuJI]:srW9*qsI<>gah2JD'6'KeSA?/$BA)Ft3Cm9Rp/D!kODto_t;4YYa0od>'+O7dUC+\\K&G%S(\*:%'YKDg3H7RlOk69n&XW=upiV64F7:_+B4-)hR9G2ZiEqCVS/>8X-U6kU%JPQ,rt*N5/2u2MM/2dcM;fA(ju`!"8QtlSB/*!$/n3Q9_`#jBuOF<+&L8g6Iu2iXB:0Fe7"'.F+P!`@W]$3EK!$KOY\#68!KrQ:T,d$lm[UsjKU$Am#di+,ZudIcI/dN4Op7hk/+e6GBB'1(>N;<8Z]ULG"H(SsGmQk3s3&Se5L;A\M6:m-$*Pn)aWmi>%rK(g<)"&kut8AMi[4JguTN-q^SJ+X_Bp#S=7_7U/cU?KJF8V\g]#=5rI_:E^u)7]N,^KJO,]jh09(h!_@Ua!3sd=@^P6pBkn;%5l[=CI23E7AYXX.1Jp@?&>`cL"-7IF)qYL5V=S33[#92>0@F;;oHgkpc1Qg(7\k9hf5`s4I~>endstream +endobj +9 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.facebook.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 143.3621 110.6777 171.4871 ] /Subtype /Link /Type /Annot +>> +endobj +10 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.facebook.com/alexaimephotography) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 107.6133 243.4365 122.6133 ] /Subtype /Link /Type /Annot +>> +endobj +11 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 640 /Length 23427 /Subtype /Image + /Type /XObject /Width 640 +>> +stream +Gb"0Wk?9'6\,ZEu5D\LAo0Nk].^GHXZY`)B&4)FX$2<:Hn/nt`]'NbZ]kdkQJF@o7Y.iKC5pb'b`XH@#HMnCoa>;ps.fjF9P;o.3BeeEZc(O&+S$l_.L#gf/(NgZm=3jh,t^G$.!h^H=]lOC(d:bNDsY(Y=pmV0ZFL(41W>8=OJgMV4^&t7F][?IqTSV*]fX`'WXc"(]LQHHT=^;fU(rVOc1/k\nj5qc6EquH7\0#+Y;EI;&oa\Qe9c;.R_q""dl^`U4T\nXshn@@-mkfbVp(1ZUaU-Dm6[B6TH-&'A\[=8k4s*T#*a+fI]\L!>04M*f"i_Hs1e[dhAA(:A&[=`p_!<@A@@s;L:s(>A8S5Q]A$ZTZ&R?F<>kk)O@HLuhl%8B&!_uP=kV/o/1Vs4`r=-`&SYppX9h#X_FZsJ9872HRGZZ.Y1>-o/Ptbr_>o+1Ga[aflM&Q2@S%qcK&h?($7A?%V3@=tc1:8(jeu@MeQDm&hiWjoX*MBel_2#&Z`BEoOh;c.@J-G\'[Eh!0p@K-Y`,LROg9$N,]8`@Cu;^q3;)upO04k2WumGkO2=?77TS+1T\j;hG3lZqHB\XY?H#=n?$]>L>tm?#0b0XoP2Y@UA[>HQeZ$>U#h6a(>:4L8YGBT7*b),'):Y--l@a'q"H!9TG/i&m50f\YFko_7s?]O-c;Eeb<*$`(6NXU!0jAjQh,^msmq387>_SX6P1Z%*-:ktb=a*`$iD9aW8sbK88jd7N4[]n-LoJ=6/mT5"2le1GJP(SV3?S:c],2&mVqbhQt#Y3A)*,7FQ.95Q>fC^K!WnkCs+?BVU\j:+/(=3Slt_V@45[2de=Qk9OQ=ej,Gf6cfU2g9Ei0dBKE5J\kqQi**?L`@/uhic1PB[+ko&F`eZ!%[]k4E?"9ZH(dZ$,UHMuC=i^,1FQhS9o#(IsK*(cN0DRIl>E#FQfU+FF0R.JhTMm=P3jNdaum5RcE"$lXp9_`q1_rHP;k"K9E.4'14$SeE\=mYed[_m2@!/-\DU+KTl-#9Wm,F<;jhJ"@@i*sP[o;`C_*JZOU!"_bK[FJcbRkAN]a_5:bX\$WVeBHJ^%EBD#_#P#rl;TjkCG[,BWSCB,7JP.@Gr;@/-B^&9Y&?GkIu%J4#RN_CLJf4r)!Mc9>KrnoIaP'[AT,Z(,QJ+AKWd=^^8]\MPI%gLfuU;0e',!Pdu0r]:=&UIUqkl7!&1l]pj0iYlcN\lSEcrr7^he)U\]1DWN>T5_PWY4WMP9YQnTc",/5d\\suI9?e56loJM-rK!Ra%Mr$NVTfWJZ"@\+7g!t3jAkZKKX&6k$=6l$:b=5ZhC#"fj,&+YuA7DO.R9Rq;Dm!sm2nkQc8p`YsLS_oKh89mtT7`>+q/uH$\9)\s]t;%iZb*fVP?Zq/IhGE;tceEQZ2IESo9f61HOoA&;$DDj?G`BV*nI$QIl<3$A,gZuXD6g_/.VRaq-4%MG7GmM)2JKIYN*t)%POu'Urj'jq"c;7T=IEpBC9dqQ--:%`HlWPITrjGe4OE..Usc&4koZ-(q"\mQ)+9H[QC5\BDQPh5EUFTY\i.bA(qqp/e;d]U#!8nX[sLF2n#GmeuuC(R"#C:0qC,_.Y?^#mbtE8(EE@"&ccO8%c?hO29b$[93hk6V*mpb@O[_2b`rP0lFJ1YWG:TQoV@#&ZrKuh5H]Kkl"@YXW@.`GW^QR@=<0r[l!@Ai>G]#D-8.fm$K?/V)V;+U#Zc#__rnhmQ2iVn,^cG]P>Y./\-b>"IZE6#i?`YAWA16t>V#64?'^rjNrp,I.fL]@jajeN]l?L.42$)).?LA_QH\V'#4bG[,p#dW-&>W]m*qkNdU/$BJ,J+A5-lmZ!%(,$o6%b$7RPTUCuK0j<,sQ:dSc4HbcHJ$\Pd;AG7.=6lHF\I1H4g$Z/]K%r%Jc%E^([XnRJJDFF%ie=!M]p`CNd+$N"\7PK.;P*o4($?ikFs8LYp[7U#3N%JmC1Eq.cEjf'-Jj^`+KX*@sbOk>ra;Jm3pi&\I=%/SZS*?E'#gQL:'Dcmn.Q1Wdb4I55(@D+>hZ;P\AJcT8\oYCltCQ`nbiJ7^:1FsF.85,QjIrKGZH>'?of8nbWPe-=5L:dD8UK2lT=4`^:IWZfG`6u1M4OrnZi2)*0CG]:VB`NZW#)2coqJ\$?,!H7D$f(^dDYHP`U:L4l;7o3A,1Rs&N/+-m>q`6r5X_Ya[aTLe4AI]4E=OI!/uUWK&o%o>K'.[V],BQRoR(6PH!rt_-OCDk"f9d/'0ZnZ253*_QGh^H\p"Tno>6eF&+cf!M5Aa[m\u$#V*lfB^1B;WI5q;c_t7!eF4F\SYjg2b]BFI!.NKKn5'=R%Te8Ef2Te4o`j7ra>kX6Ghlm&Xc%+a9SI40ni,qkMA"1YlN]XSpIEeLAVt9jFV,%\RK(je`j\F9YZ(FF9K&oUT&'SH@c'Y?FsOU@j2`ir^8VNnqLr!SH*l'Xr(l$-?%hg7[WGH0PZU0;DK9T("'$C\!]fu$bcO)DX@LTh>e[OoX+)/q;jq*J8&B]pB.UclHXBT$+;_6HQlQai2rPUQgIG.DG0JQi<'!9q5Y">pG7#$fsW!1N].s1QMg_fZZU\#41csaIQo>'*#J>[[nHU&4*t2.^$XX(q&T;0e'#&pSbdcXmkq?ID-bT/[GI';kjgV'B2[:78%X[Z$-dZDDc6JRBQKXp;NHMJ*I*Vk-VVm3&T$8S)#Ce-BU+u`[9"5B+Cg%t8lR9j4\Go!q76IP`-W&qDtiQ(Sg9nPi8(,k-``f^i0b<\EsSg9nVfI+bj,o'07QWj##fe[G%^F==fal,UI9o+aX,Z7;&Zl^R)!)aEmnpVef,)EeF5gc\mNpIW3kZoZ[9Ic$Ao'I"C0I+#W.8d@jaP(`"U4dQ#rA&##L*=b0e^-lCWhiZ_91!&jO-n/*KL.&2iNQSPIA$\cUSi"e[[k%m6Vti#:+1Tl_:p'qouZn(f(SN?/=h^oZ'uSq\mKHTOW:cXatCVkbkbqbflFdbUuOpg:taMdN.eeGpBK5:7gEh3k#Ynb2&(].-7t&N8S%#*PC;*S4)@+l/:3h"9pPU])=pE@%"Q*eJga:9CYgW.XuU39&as(]n;NT==U53A-1.SV_36D0NS"lWmS-+hY/XM;4:G-W@-j>OS$cJ=3;Ob+=?_gXX'P1Oo@K?;""mpA4Y6V_KtPoopM4%f@LJNr3_:7QP9r)Qee:7BkR/oIO3u5!3W7J+md#%EVXbO1e'ak(L<0pBP\f%PI7/nA"p7rlVX[l`[PX=k<--7GM6V(%UF6)`j.sU@lm)cp4sEKiRbH@>/.br=@s`-kUjYCtU^nOTk2:Y1M\:;m9r9+!jGWM`Dm,QRI(BCp+?2%or+lrHgpnn74:]^`d8`?<;eR%jVh9l0XL@tFEAo2T4RZ+(a@K+A5O?4+Z!'E\K^kj.GJ]V7!ZU`7H%`5jEq3B7_hEXg/8db#.Sh0[B-%nKQ5"6TaIrM+Q1tJ!tSiY[83q*CLro^!#6>-?T8"VS^'%T4\Db8GNr'(/Ls&J?.WfpHuZ@E$I7C@]*->UO(&F]Z&0bFr9poh'\_B'YS&=9)rf>)hQdHX;M^^%b=skJO/(CPs>tQ"b9%r\!?VRu66Pnk+o379!/U^J-m=DpV.+:tR3A1,k9-]uX8(ZRu]G%Wo)\>Ff,(1>1beF+15V@iG&r2Z_>&i\?>iDK^ZQsso^gX5QE7JO>4bql=pjTR][\ou-'"A?IhjZ'Y;F"s'iquOO(hMAQ)9Hk&@c='18)bE^g:[Xcs--]cS+,1Dsp@PMb"li'@]Emq>Jod%:ta#TCLCn9[oV>GXIeT;R9%JhWDWo`sM?GJG8j5F@c53q12b!@pW#2=@p*!&.:Lb3)'\Q-[pp5Q<,X60WX3Z+^J>IERd,51T*&Ihd(K;QHH>JH:Fp?MI^o(VV["*.GnC]8WofL05;W;E[);?F/jmtcVErsT]<@rZkg3YO0La07?C!h_=^bk9JqYbtV:AM]cSFDRY8/F1BNpD_q4n.JpfQ8bH:cBa4j1IAQJ4XEue\G[iorsZ7"2Am95=tiD@`cecFmR09akIr'?X#6?JNq0#d"CrQjdYcMc3(l7l)kDlkEf-$F^a..(hke@3jJXa`6P.Idg,iA?`E%&N*R4l\Jke2:F#C4GRq_j=a:^0bN]Ogs*Oj_n*$<4$$I@a""A]JKoPU<^R?'g0!*=AU!J$$dMSI;!5Nim*-oGQ^Jhq?q)*&iFaL4/DnFbf03G@6/]O];n6(t7QfESsKUcrUHZXQt]e+`sKYQm,gt^SJ9H!Sr50Kj2$KL%pf"ugm*>t#(r`X[b5P*;$-;!<,^#*,Ic5Fj%UhVo*`Ai5cp&O8WVbJRq&0Fe_DeT$@N=8B49i!ku7KN:D9b!#V'MR=j+VWGX^UgXNTK16l)$Z5e)TCS(JlYF^[LLPmrir/T&H4?-5O&X'm/6:RUA=und;JX1pE8MY;)81-4hG.0E7S["5qb[X)?B])>b0po-!)S,?3Pf&`)!+>AiZ8nZlX&(*W*paC3epUqF_IkZhWh+;V>/%fC]q?"TC[hJ@FUN,Zgmg.`^PL&<`J].aq#Wc5HAFX3PD)dI?e6]F[#6CukCDGlm=+9m%4*6dPg"UYQk0]KjH!n;4EX\:DVI`Uego&)Y[eOlo,IL5TEP"DdJiKI'_#6A<]diABfgI5u'$Cplj*'=nQP1::.^?*FD1\,jAqQ+t6"XdqV84UR6p3kLb5b;Zno$X\,-lIhQ`OloeC1R#tb%I>fn$j2#UZ5b6u^,[u>hFtP[R?`,mlY=\6^mo?+A_OWLl,D(2$)X+qoDFeS.P&iF4CjaC!sfEenah:McQT""pSM,d`.BMAgE0OXRp4cR9$["7mn]5^.@*4$#aKsX2]q6G)%*/.X\C^$h;N="Df9XHVg[H#9;#e7AVDb$!5_(*7CM5WlOCBC#C_f*B1^oi_r'W-q)G);eSD;tk?uQb:Xg$@\8cn>_*Pj:6:,TS]$R"?=aUsG;>;J:Q260OG;q]((*K(-MUbD*^di2RZ8YrXJ]k#6:<]P8AE9%lnnY&BX8eHu"_`L9KW`p%t&&USp26X6emoB>mDSf/G;%$2d-q!1MpWf8;X_aV=RJeY/'V8GK>]5(%5!CHajQo$5?pUL/nTZ:;:L[k+s1!=0">q0/+K^L']jn$8(Uh)?]#^5gr_G@KglMNO=9C#?C/WP#tL\4cf&#_R#EclZB3>_1/7?YNL8)X7*HCD*N`Bn#105!F,LRJa?O>B#&/='JFsRLbG]RiuGF_,JT;#(mc;2nmYnn9$)t^>?b+2jord+ab#.Du^.Sakt-62elsb6!kSo`,#/)28:8]T9:)/GJqQ;+u-E%X4t#>!"]26gS+GnQdOb22-'E4mUX5EeS`D6h`(0V^fRnY!Y>ER's_YRIc"=$OM;GV3Oim;@d.^(oe>Y"Q$]N5.^qOt$a+rQoCqm_m#o*`Ju4u4\o+?f(Q"X$]P^C<)No_'.XZ<#N"ZY-$("-I;81G`8bi9M\"Gk]Icf&[$UE'\o?$Rjm6Zcoe9FFGmJYW&4(XVOqUIKRX_p5E_3aAd(Bu9V27P1;-B`SYcGcLSGl^aBGakt51=$('_mO,X)b4UM^qke`c_Y898*PRmpMn=c*07^k&r&qYCPJ7bD:Zn#VVE.gf38*f'2&\!F[km"?><78C8pfEVqumWcS\HQ8QQ1H2#njt1EMHd<\ARJ9L@9(`Xkt]D^Al/:!m06Qfp.nVqumW_s6r>Cq!f16k66E`?3g\)nM?PU<3Y[".Y`m&`h(\g@h(-6rsr;&AANuig3a8GDYWo<-c8:nJ3mRZ9>>\sDhC#iEDVci9ln^Qk2d"V!XOias/R[H?]@?&Q&V3bG.0E7m&+j<;L5B@q^qO6pP0V,s?qt-K`&3QMuQ^%p@++8k^GrF+HNU9;R37=]CeJ\nIiJR.'"F^89l%&@A!!LV4s4==$lB.HJjChio61IWT.b"6BbI3u3(;KFjCtEO2*qZF$JNqS^k+DZhErI_B0T`>sANTS^k#*B=tauhp7Ma?&0F9f+j)="V:b6JbAffN>h&s09=TGA^Abaisj&@k.*!d7]s53SDd<9lI<$QoRu"%t,G==P+[d73o7q<':SYA\4:]qjuM7XIWQ;Qg\HA$hUoeJ_0*EQMPfJWp$!>F(C'OM;k[:RXCgnc[+a33H=N06f,,eg/oThsjlFVAoM.!TtO*#_R\>V[FFo#0Uf^Nfd?==a'FdQLV)il7CHP0E&5EO/QT)rok_DRH`Lg1/i\lscr14Hl-/bqT]/!5O@]E(Kf5]t;%H0Zi4e]q-V5H9N2#p"\HlldbDAMfC!27lPcqN(di#_fFPJ5BHnPGs)6(qjE[hjRDceBWAU-&XEgD]la<*6M_onf&/p!*9".^1;_9E.m/IM$b$(QKO(gD.3aU/P(3fKt$!rGXe+ZL*Vron/":u2_^BIZ5orss^"iju+V6Wtu[)$`VrlWiTQQi$HZOq!d7a8-Z2`/8N&0<;e]"OK!iQD1Lj'Bm()K@jA<7@q]RN-TjX7Z\A2ZSNR_"P5;Zf1P)o\uprDnGF6MQ&>sr7/.Ca(H2#B&P,Whu)5?o.PX`BQng+kH04a/[5KDIIp+:HUfIDRS6]V3ui.'p36lj,aQTA\Q&snDU9Ia!-k?L+2:Yh/t7=kKSUn0j*FeY't,6uqg)S)`6=_)fM9j4/\]A&+%VNVUV=Oh6jFRH`r4Q;9a:IL?kYVHT&!P)TE:kk.iC[6%mQX:50iU/,2GmN-BU_`P'bnaW0_T]b2cY&B\WT+JQ6P^?%u?2tO'HN36_'j[KiA\=L8oTOcN=m!huKMgpqh0g&G!=0i3"aS-$XS7R?R8dU3?p!Cpnm-0YI!SQZNCe@tHo93o@K8)O]n'.(K6W.M_uFSmbbWiK#3/g5eTo9orT!>d!BD<qc1sGNju7c2gO,`eI,@"HU&W4[kfN\hQkmjG^t@m$9Vk"EoC)Z(l*'9lX\8YRD>[Q-[rcR_rf3P^PN@8!YZ\?tHj(XooIcM'XY0Fmq:H(aDa],U['$NU1aWS;K"Df]Q8M(JE2non9YbEU/Q%IEVl8HF?ud_1I?.[>^T_(MNj,(HMBg3Jo:G7Ta7gZNH-n4sf"r28DeC9+[kZOB/"')=U@oU3J&bK_=4;oA-[CW.^`%MG'Ino^?QWq&=W5B-,Io$G_nR6dY!)62q;f)fg8dF)h4VT%,1mT)hV)]a?f4B&ftErXnrFIP34D)12WBI8hGOiNmF?OX(Xt+Fcb=[Mo4DRQ_5VVHT&!OpjXk7K/%0OXiiZ`kfc@#+koiYO93k>F(C'd"p^6ni,Wq&ufL/;>#;Hq@`u3+!]m"jML?48L/1O!l*1ZRjER%8)C(87_5h7D7a]D+!1LX$n3Bh&!+n*N[&pmO]V@JOo![L4`t#ZVoeQ.r;8e6HO&X#B3uRbmFSkL<*`O2!LS=b0?TG]KgcM\n.qunc)oL>W>[1S6.(ni2Cad(8^,;8Ns$NQ.;?sl-@\kt9.)Bjcn^[9+TWR`AF)12WB@rr#^3]N#$&IDm?gS&0/2f4mmXgY)%fAAHGu[t*S$b_LiYTE.clJg@:^/EJ)(th75ZLg0\!16-b,N['Q[c,LlR/+q.;QF"ja(*F-J9fc6&,N`2(1PN_G"DDJ1\o4`gT-guMsJNq>i4,\CR]/)qXZMXS4qa'4L4;\!;&UZ>,/>>2s+Wb=s?icWTt#,iQuSXEV\MlrP-mbD_":Gq&;ug])H2XGIlfY2-k*0S,E42H!`-Bl.l-$jZ'Vn#(TdgJ^q4\,I]]E1RL4QH\9.ZfAG;bQR@946]X>g>*#!:;#CC1.m45FWSL#*?kdorqjA&cp\3?uiMn8EUeHKX371@%X`aks:t7\19*DOj-!!T:HbVNc88Yd(8rA7d'Rr;B7XFDf'929Eoq!;qj^*\GEH[N:cJ\g%IUqdjlYNJm*AQ]Yn\p`n=O@lQTa/C3h58EB6k:uN?P[nHVdn5N?%^RqFM2Hnod'#"A8Q+DAY_7PKC$dn5):.bG6P.]e4EAPA?4g8e?(BD0Of0?.:FE"Su9h\UkPJ<``LRmOhlL93/qL&VLF%@M-onIf@V[KbDg6>#)IPQ:P[rt7"gC=-V#QXHf,1mhu+.\un@``>@@.O'0iO]XoDXQjpY31Qn>C?Mp8?*"<%Snb$&\g1n1?b)JIjYuF;5:XNk]gjC&];lo&-f-la7E+J(*#9.U$iRfrr+L[XcghNpZTQcBX.X=iM%OK)cl9aW0ppL6@D`Eq>5X33m%o^@b`q'^N>7WKJ*=YO?TP8eS^keeM*U39`DajI-'=g,VqC0]#Ud>!"`U[M7+F+WhdMoFsIjOXhj)e42Y-;U(Z.,U\2]jJcH@2EhVo*[cP$)o]NEj;KBqpM'[?UNoVO%^citCQo98+E;dL^A.+<(RLYY]Q&'EBq;9P=]lEl*s8B^_X`%./^[`9p)sLoYF&B+(eQ.>V!)+V#HJ';Ier$;XW4tDR"=Yld7QcmL\ZJl3p$:Ad\5_o8fsON\pF4?oh:jEE?Y_hf3_];M^m*Y0Db569YDWm>;3m=r(qJ2e$N*24Ee;p3=D@`$pR5O.t=ma1:"QQZ(4!(AFFBD9l*'O;^Ka5'H\mFd,f+t)M<:uCuKg20AOgl!!j\@E\jn?]6]l(S\p]:Hp9asVi#71iUqs:V)k#Nd^=4eu"U#_30EsF)MT=TI&UQ[J6i4k83:\%JkNq9;e;ek:$TgtmbiqF_%e@^RocT9mRisg?/o`>-mL>J]dqCT$+auAS%7O4:)1=?KDF_'E=(EWFE7'3\VjNZbH:=$Pc^.7_q!'Xgj$i;0sf=/0GpRFk$!E3+RC1;GX6Yca2^!AH!9<%9YaQAO]O@T.Y]Fat9B?rf6"u0!,<&ukYWh9ehbk`G5\b@Q[o.-HN[o<&,VK.*m+S#5r2OoiH,EC\GC"P&?/JWCE6KtjV&l/P'8YKe]6]35(VF@/D?'CCC*5Na[TuBd59ql^?t,_=02obU[99KVI+UMA1%VFY8PB&moP9.?)rAT;'YNs8Y./g\XZ$Hm4ShnWa``I#"TWq4f5fO8L4.gUeF'bhpCl53"L1qE0142eGq?.]/*J'ZX_1\>RuF1bleb=$PtH6SE/-f;h@9]B!$F7<>n6bDL8>sX>F*cnH\]Y@_M0Z[QP-:LU,^A"Ch3RfggttQ=)K9/Lo&h=^9,L%FlWS;bjanE%fcS2-]t4FV/8dQDeM.KU\/SRG-P*'O\f8@V]p$aW;Wq.2NH\o%&;%+Ru;8BAnDF?g\]%KCQ54H:<6.`X^h+%j9GZ-KI!AMXOL-@VWC&.pJ!l198RJ63LQ&q16O=u9B4XhfUluNd#dh^lg)g=UVKTk$_t=cS7M'Hnb5ZCY2^T3V./%rWHJ:B;lAFl'o\;bQD:e=lh.CB_dg5T4ZGHedQ!XFX;IAE\03lr-aK1#Q>h58bCtG?o5EiB*qQ.-^8Bbq]\q+1b7-^!PF'':*?JRPDsj&G^[%co>3^:fgdM2C0YLfQ9[ZZ#@U3A6C"se4&!*8r]cfDGIr`-.Z^]k):1al21F'H32`I__eGK^iMnZ$Ss*4M@86kpe*_T+F/NFb-Z\`cfZbF!LD0PauseH0+Ygim@Bd8*Zjbi*#3Z.[n;":41k'!EHbc=7t,sVk[a_jg%!aL7/9Qb?GCDNcH:?nMHa*<6VjV^J%EQ/JP5,,!9VaG%dGJ/p'7TkQ<[IUZE"c_X*"%\6sg@&=NdnO^SCg\li1PNYA/4*^-lh!ZipHf4l5>l#6b%t!rr<$z!!'fNqs^Cu="hhh=(dNb#@64/^YL!HA'iO+!!&YcLHLj3ls"5rY?KKC\EYp0dDBMaF^_UP=KkFuTlIK]O6m/Kgf^9Ur0m/Jrd*W8?TQa(o_=)C(r@=bfGPOB]Fc2Y*ClS@]h56LrdK(\SWo&KDfNhMe=F]:#-aZ-3Q)a$<,R]XX,IB-Oigf3T@f9N\Clf5=0KB)Es_rL.?rQUnheZGCZk&u2`41i4l=l7H)D5I[[WVi3Q?T!!#aD=&C\m"4Vf0ifMEDGX'nu)&&;MC,&g4oNhh"k&p@nXO,@B6p.XgDBfgGq7I4$#A_4[6V2?^,KO\$\iqY23hM=q@b/BUA3Rh%dG7>LQ5Cle?q3pG'@@k29SP!5M;)A^1e`!qpb4Y%3h4Ss!IlmEXO'a,I>4aZG@/[Gm4BTgYe(k),:-:8[[ZooW?s62.BW7U<.WO-Ys.AL"nZO3EKLM(2ZaQh$K;_T]$_=fQJmkhe"nDjOd&V#KV@jaTcHVS9%e,>3HCR$j'V:Tpl:2N)Sd:c^S!UcuQ)^96%%%DRsZ+4,HYO6IFs-?Z_0I/l&g4K6,q$R*-8&&sarT9aX*TB,cQej"\gHLqoeYFJJo_V`_&M<[fghb&QV/k8g-^QF*m7Sl%kcY-ippKgV*KP?s^@Zu@im*j+ObbGfW[_XS00,NI8KKJ'Fi^S?]N@d]?!!&0bn^H)Tc:XMeg9$LSTDdH[Mp.e@A^6R-#NEA7-f<^2q](^'e-@^iO6K#EM21Br&rkZGN3aZSUDQFZmGu!FDAS;&,<1Wf'pX%KJm(Luk`%_89YhoVe<+N]AT[A(qW`8\P:=b:a;V4UM/gXD6c2l/QW1ChrrTd_6k5SF7BB=;J<%7^$SB)K:)r&?fI7`L'UFCCKlI:Y6E=;h'icP=3Vpu5+-gjA0\e_;BsB@:1e?k>K-,DXjQo2*!cJ'!W`/DgELhuLHAJ5pbc9:(FjBb-#hn4r/q2c?f"EGNm]gi+DnkGOl&:UYG9Z5`,TMkjBU]Sg$SJ2"m0jcjH7C]&1VTSf8j/oN@RG8rP!E#I_!"qCZ\ZaPG@YYWP!Zg>XjlDiHK8]9B?MMgBT+(2mp60b*M)_K,FT^\6f379,7WFQdYK9:HEPeooUc>?`c8I:=%OL4)uY!f5UQYLVV.I\5V=&*6Tptg(k]-9<<4#>GZu4Ei&X%e/?o6\ldej*U7)6Qm@s-reB4EBRc,qm1$)g]=jEsq2OcD3k#sX99`@nkAUN!'7>Pk]U[1]@[Xln`Y!\DqMLD,(H./_LKE(Ba^Vq@>>=MrX='RX6,-J%@+r"M]mkd'rQFQC[[W>=VjHM)@O[njq^nW#$nRUQZchiFhkWJm1"trhel8QRlWXTAhlHF)glJFhT70G9NZ+SY;%s,J?h%Y#V:6Lq*RC#N>J@f,ffr*jf7"cFAgV^S^!1#s#Eq5(\KBT$KoSR3#f)p%l+t'DZ>LX5CX("@fLcN,.67^;hG_VDW%>,/WPF<[&Jh0;O&0.6]U<.SED&SA4*AhT@e8L]P+G':&=Q$0Y"kanM%9==nOk6!slIYch=F0@g,eET+#7n0YSB6@QRh#bL;p]*HBXc$Z!Mi4%W[:8CulMC%MCQFp23urni^t_b-]5M0QWRif\b+"R5=o`/n^7)$dbl3d*qL,\lE,9%mqWKseG4G7T[c3X]dgLUn]N-Rh?!#PdVP1b>>2HaESj!,m!2ds*oWC8TPst<'naQEY]!/FV2\q6UKS-oDF[`BeVW4Z2p?mC+G1X2S[/us,@K9=qDr()!eqT6VhW\T3^Tk2:9_k6;7_=EW^[M;CkoePu`/AWabcU:ST%l2-l>?G[/kn>7+I(^u]U%SYl](;[IalRo`0/:s/"$LSbQ<9[bcN5jXi-?h3WM4QZ#sBeme6LWRg8%/J<5%\n4J[ZH@D8g;rc+$oPQ;W1=l_(&Uh:$U^hoOS[EVNN^i."OE)1'nD4qn[74YQG?"(7;".p@]T,YNE]Ch=I8R`+jY4$Y!5>&[q+L;D--c!&VjHMhg?,?l:$7[=]9kTCQ,=nJ%R2q%MeW-H#lIU-@(,=cN3/+/G]#^P98CQm<+[laZET5I`D$0,*)uDNTcX)h0Z.%Ml4H:?E`Ae6pJ^8Y3_M-6D[8%&2(jV\8I=+r7X&a8HV$Ing[;+]n']-"DmrSo;#jqnH&HM=>r;F:n[*qdZ8+H_Fp1"FGCQ54WGlufp&-h:;.!]+%Dct+n(U8)-?XZC\87:HLQ=3"3;k#k\c%ian%K#eC!bS#&N8(@fQ$[M!A*-f.@S(<@i/>:o$SNl+V1[f'\*"6V^&ENr#%j$GZu+Q;]O@X[QW`4)`/GFpj95T@g+OF)@qOleoXng>Y30q!@:4i2a13iFmGY:sH<;]c7,l4Lhao'^lOO!G4"Hk+L`)%ciOjPT3A4%3K"c+&pl(P.j_/M4BErLTqCH:gN5N'2qJ28n(oPjFhgt47H[2Fu/6:nYKP`KJUr][[6J28l(P1fcVE-1g7r6fU*MaA6d%DC&eD`bRd-VJHC!G>f[W8Zr>DBWcUei+PM7uotR#hnTI]sU>IbcaIp"pgQgK$Qa57]`,%o&)!<:7KkL[0aSiTaT'>_I$4fRI-]uR%Kr5SF3Zb6?f,Uohg#cH*Pf+iN)g`KXo0^qZ6POh%^Ek\VSULmQ!?530i*C/9P-Re(#Z".iu^Md8`bG$QGj)dLWaku+GTmWr9['To(7rjHB`!eH:p:<=7nEUoFFjs;>DqJ_dV"/i:HSCF^&WqCmWDVf')M_1XIlM,HJtbfis/F^De%L[5Mjr:7Hl%dWkk=??ak"R.(:KQ/mP'&2gmhqj-9J+q&IggE3rCkL9%G`OHL=kpd"tX6EBEL!=Iaod9t\@eTV1po:19H\Wu2=H_38!.ppaFJSJCO.@n]U+tEP)8;DR3UZ%TmK+u2!!ZV'U@EnjuNOPe^M49Y^.iLe_`OVGO/eih_d@clnDD0NR'DKRC:'#"@_6g[N=k8**t7JYZ4$HD&!_/r3n/44RcWopW#'=?qa]6PYQQFo)9qE=88jMhEa63M9,>8uCnJ/_bE)?j&p8f,[%nn*W^*SEC8f/u\AnbtL6bHgGi+gED1=p#KEAH,HE+o*)uI^c[`0hGQ+o/o:/3X)HZe6!oU+=*/fPb=XW)9?,Gk^cr;/nQI+!F'8d@j=I6$dCoPUGEVf"&Vj&A;Eo1VZYlHA_AEbJ.t;n(Ynm%.db$6*gS"TZ4bpmN3pR':IXi4.WInQU\&7KDA)VH)+$qhI\b@7LqW68*RIr-l'c9bP/?TZQkGfgr%3COOCjZPEr/V@OHDeF+15#&C@Ai%;>V3c8c!p0?.:OpK([8GE[2FhC$lSVsf9$3:&oYJiQ9/9=&Y`^htTFM7Ulp/6K"B>,/oW,eTnH\oDUV3GO#U@Xq0IBXQPOP&N0a`nIHBL4Bm5.uWN'%3X(ld*5+!.a()SaehpDqj9C_iA#N'%3X3(ZuRS4H5&,A#/!crYRIME]nklFIUb,mdoY(b`G&/gXFoi5h0aMOhPdq$<&<_!:RtM+g4[;[!%g"b>:$7\O>6MsH8D67fdrbH?"!:KVcD!0\'RZgoUSZ(Sc_]37tVC(^Lnk]J&7bK8*\Fur;>^L27-UJ/Uu\dskG]DJ"<]+A[k$q3N*D0L?3FI(o&!.pqnd369FFIND`J>j_`*=Zi4O`DN<1V`lj.S'":!5[)0nCc>LZbSAXA^:>f.XE91^p^j@#6ZBRgE6')a3:`i(_j^b&3RWBppsY8?*?s/4JR#-kGq34&u54*J5B&_ToF/&Zfno*L]!]KP/#\0XVE(ObQe*M!rsb&_ICB`h`#E,T`grMm;?"B[p!]$1@kkR@A6BPKXnLsk74+eKf+4K\p`3%2SPI;<@31r+B7?gge'?NC:=GV'6mhk]]:qe[N66KWPID'!.^]?0p"VMfOk83Xp]Z3;d6/AC>+uhR/Eskg2+Z%&!!js%,Ebp,<#sS+GIi>1#RJ@#:E71ekeqtcoo)]F4N.p0\b1k_)A`XX,K\VHIIX(.^$>VPuduHKFW0rXCEe2!5!!'doYJN&TcRrI@a:S!NCNk*-l^_@JC%r):iMYBqYAII')gHbgo5*%#Xnt8bJpq&-!<1GV,,KTo3K=eMJL:^eVVP8,Id``-V1]`]3skuWT8[S0Ot_(iNn=V"e_8jI5MLX.X+A$h!!*$jD%t51HBuN>i2LRgIkk(B7*)f?:5.f[jFbR7C!&/O@J!Z.:IUh,Uklj4]<6sadW95ruNrWQ+d0k7=o`eI+2i,3g-j]m@0$.p<+`@/?iOi4-%Ar1-=(+XaIRmCG6aH6d*Cjq.Se45GU#j'0Xq]I+1U$8K6hlK%l+c5Qa;)ck/kB*!d[jKI_UMn=b&/A;19R1N#&ULpsjmIaS5'lLJGjYsVLN&9S@!&,@X&n_*VA_@Pl^nISd?R;utHNX=)_T8i3`/T]@$3q`.R9KOdct;GQ!6bl-"`*SjPV-(3jY))Vo]#$ZK?jNO'Ds0'WK!Xe"?Pb>_(W(g)$"93^BC!X#fCGbpj)l^_W#2.Qm)GAkY-aXcsbJUa8QiI9?@nD$NRMD3LOVG4Al69QK:*:oe!TI.-S,I!+:a$'<,01BfRe=Yeis5fZ^HefmEo&1IQ(GMC#HECCXR16E)oJ]"NPDQ"0D=!6c(h"o._qbSK,UlNc>Kr-si?M;X)T!endstream +endobj +12 0 obj +<< +/Annots [ 3 0 R 4 0 R 5 0 R 7 0 R 9 0 R 10 0 R ] /Contents 45 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 44 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.18d02de38acddb26b18b4d340b3b9aa7 8 0 R /FormXob.45c0b1d09e8a1cc62cd07f5f6cdbe6aa 11 0 R +>> +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +13 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.reddit.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 780.7371 82.53396 808.8621 ] /Subtype /Link /Type /Annot +>> +endobj +14 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.reddit.com/user/alexaimephotography) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 744.9883 250.0965 759.9883 ] /Subtype /Link /Type /Annot +>> +endobj +15 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 256 /Length 13171 /Subtype /Image + /Type /XObject /Width 256 +>> +stream +s4IA0!"_al8O`[\!<<*#!!*'"s5F)"8OGjP:f:(Y8PDPQ!!s&E&zz!!!'&!<`Q+#63BW$j-M1!Y>GF!!!&Yc6L]b.j8Iu1LP&q.jJVA,9peIk4n!k`L&L/f-:r%hW1\?nmP\/LhUX,`fN`Y'hqOK6"1*74[?X\JM@Wb@;/Ln@Vnmc<+ld.__VqLZG]&C,AY9\k,>Z>QPTEkI\3FVn#,.^qL5$;>NhMEi+A6"!IfK./>h[e",X8"@emiJf9*N=Me_8--X;prBF,u/HnT@\\67cmfJY)pU%Fig;jdo24*;#?tO7;hP7aN'9P.a9\?K(!RokE=6)1,B?WW\^Q9KsUrr>_<4;#Q'UTW1"O.t)tJ_i2m(*-M2),@U.>EWo^r81!MAejs^:OrF[aS71t(cL_tnHCY!8-"UA\n2$WkL44P>>mI2$#H)+ieKJdpU#D%Xp1De-H.l*XR8oGRaqIC'8mIR,f#4WEFs+HK81eRM`IM?\Gh@'/I81!5'rL;P0gutJeiWXn)h*_.Sr]:hX,u3crr@f;Aa&:DC2%;DF'N9G,[)T(.ldYt8T$&AM.+Vb/3=F"CGHPr%X[f68s`to7u&&&dEQ\H-l.9(bKO[HT:PqG[Hf58BU=TjA8+ogfRG@/Z)#Zl>Y^hZA.DEK;JV0.UI`['plY*Le+?2]AepU"%s.4nHdJh7H1/N._`XAN=AN"fqJe>)m-\prNTPQsF5Nu]';^nd:%.Z*[!1"e'4"`4p0`BUroBu&t;o)eaD(F1]+iW*dF!]Ahe7UY;Aq?($Mkj@0?C03Kl-Mj8&PRcQMk8?.cP-"g4n=m0Sj?OoN.>SsLXFAYLMVr4pJC0;cQhYSBOEZL2:hAEXTN^9a)P.'>KCV3C7@)J/I-<>$oC-[Rnac/OBGA\JD&LE-3bH&cBt?.#Hd(X2TWRl6\X]&c;17ULs1?!7$'4'HELrG(f*H!`W<[3en!FgZ=IEaJS+JJ8^P>)hroLPr]CoX%Dls)0dNj5)&`[Nlj,:`4ELW6t?qD`[3gFb);H7`GRD)ZbfZ.c+\Z$]RJ2F3[TQZA;3D0b7LQ2Dikk39sKi$^b1%@5u]iQOb4TT(&n_uM>"!!33'!*YW1tiSQH5UY[pRF.,:i-*NJeX4(?6rhU%(e>B,B+sJ:'Mr*?`;6a1l2ru[X^>![D`K/X+cdX6WEfJG?mC5nJjNAJ`a\!)6^*4aH6n`jnjm&1RbN6U"%<7s0[`[2MfcpRS=`<]g>NW+aZ<(K$d1R]qLgKb/H>rNr+7.q/Prn!aH\!X4^tZUN>d+/-_pP'[H:3T&+r@pW1!@[_jhJqtpNA.2`U5\-,ue/kN+%K@2_!Q)_\:JWMFJRToL+N;+r@thWlT/G9%o0+ZB@6;eGVZQCq-Jp$Qf0.aN)K%,!.16`/,'36MFXIn:fP;qL#,ujXR1_M\\#c\.WdMC3d8abTU5>'lg?IN/8/k@U`d_Z(kT8bW3g+G\t%*?Og!YXc)A+':&/QMV/hkYf3Xq$?c24eiJ.OM%V"A&;BjH6MTcf4u*';jPdf&0.52q(G&[pl"c3W]&PDJV!hATdd4<"EbuC47>Zge(Yuc`?ff\!1&h4nlu0b?9QhH*\[TYghUXS3<8-ufG\#jqF(gCG-:NcJLtKG_r+Ot`p+a_.mdZX!\78'M)]+.:HB)(n>Q.R]'NWAr!_Y,R87MF*E#.2@,n(@`;'*/R9KRqR[`?3s9#kJ^eIjiR.K?<JnS>ee([MB[_ZS;Au*r!Z?>PMkILU'S"_@VfNknp:h4,0BP(5nQI2aU]bcFA$WE>_qj5&;`/0)"M3#`EDj+C5olS9ip/;3kAVV`E&O(5;=esdaME^b!^t=k*=VVX/`P>6i&jT@&;^JWl[a),rb%ejk6#(-KPd37^$\+&2#_*)"OpRE[rF#UYnKU:rC%3fn+\?28_ccg''.gjr@=5qKPjbcAC42,P%'OkMF>-L)Kg!KG&(rN`C;d4HBTKf]9p6#Kq]*%gp'0]h3A_rqIJ&--711(R2Ka?6tj^:?gs"20<)@]h3!E%/(]b/]ua5r,hjFg8XPlK8kZq9N%3]YI#:A?W>0CZ>o8IT8R&JLLq),hFR/J.sa!W`?+!X&`/z!!!!"!YGMG&d0=#0i8TM+u4_C'I,:u@:F5ms4RGY!uT;A'P,WtWKa9)3&j0l\idBd%JZYE[5!=Vo$#:i@CSr2)3Bo#F^L:Z./GEC`tPEg0Yr8OfMNmYSZQ6X5OR/Ba6+`SkKhES@VOMs=o.VaV%(CEDT'=aK(]Fa_:R9U!ktTu0z!<<05"!J:3&0O5(;/m6n0O]NpYllgkTd)m#;KBV$n2"HkF+U.Fs4RGY!C^"!,Iqo\ci$s\X5>m\RNodOB7HjVG9\"RJ111?+2k,\`9bH,YJkBFG='#H("1O@3J@SI\r8cG,C)JL@c'C,au'([&C@8]l5O8.]E6Dk"iI@oQfPAEYhb)F=[qf_?);[Jk.40>)n>m*([NVolXX5lI(67Wh]ld9:8!odY?oWCmr[K,1nVE*9!F']R^!il_Yt2Zq%0>[Rt'2C@WTY8hC)95WVpDpSOn?6)N2,8cHa9:nqh=uT_>gD-%o`mEUm/&,V`Dm-s8R.mZg;_B;bO3OrJJUHf]Un(IYlmjJq^g#ddm>2]DmR.-f7[m!R<,SSIgW1mNd>!(92U0ZLn1!1leKJ:CM:@]m[.Q`8F*N@b%qagXM(7n:P5""-P_Xjc;`ufr!:dZY.i#U569*#SF.@]n(AGg`!bV?qT.LO4U(7+6e<>=%BPf)`ij-<6\OI-1S$-YS@U$f;9Q@!&NQCNegX4di/tCBojr6,WG[=17ETjY9,R2Od82Go/*7c`o4qMP7r'[9*#X%3AWQ;FTZ9WMEik>.7]X'?5L['`5>MVH,p/niu+MoCnPWV-#2%IJb1;Ek-!%AH[!!30'!s8]-!dAK\/^S&IRds+G.VZ;"TE)Wi.'B*=l/B*<`?=k["H.`k.gn%nMElH3OL5+%.:%4TX89]/Y3DUd5DC_pfk%E`Nb:SUARLG?6G6H6NVA!%S3NUB#U"nq@0gs=L/dUE-&Q_WhY6H6:&6!pR:GkI`I:]ZhG/K"Z,7Lf=%);T-WQ$2SW-(+UCH_I[47a"6E2mq8.E\Br(VJdklLQ!%NmA?^S^$H%qT:$,9u_>d6^D2)U5BLj%nY4G.[9E8Hee"P+BCZbS$V8udZ-$J8R2-gogPTm;1GZoPSZLn4eO3d=QBD#iriO_:YK)Xe5hjQ@AMFn7j"IZcp?l<$0B[qo-e/SQg[N\-[sMU6Lt1FEAN'm6H><`'p7H>W$nK+C57$(.B3HFIZ4I"qok;K&X0bZ,9CSlSMajNGU+NBV,N))2]PLN%skcQRYOd'jTW1ceA[ie%G?)4e0hL>eq2$s7f!2,9S`\gA`UrWkV.cNNIe[U3BD0PY%ORHC0$.ok)U+5?c6P*q3GFk,3WGWoVb;a4J"E"'p"HEObpO@Dl3`4sm7oDRE0g^KsAN1p&FT%9UbkR5-cLn?Gil=H]?m5)o"$lWOZk9KDO,/A[i8RTbHhiS^RZ&KD1&WV/!/5#;H8s"rp4$OfnA5mPAR+98.=,"V@q$@U7sYcrVYg%=jq[D@%MYGWAgjDHPGn\rn[d2V)WM=''30n7hG%[7pT4>QGdu.Onm"r-_5&je>lgG4(O1RoDAj'FR?l7fK&+s!a%Y/Dm0+_BXRCLg"LX!htZb;h,j&W_n:2o1G+hFei"!8+`a3-%b_-fgi5($M!nIKiR[1$D?L2GEclK?hr#rh"EN`KnGhoESZN+bihC`].CH+?qk)P<>6AoR5L/2O`g&MN`!<<0$!rr<$&@;3b\4aX+=8DJb0&Al!gF>2\`tO5d>ED>:W`EM,kec[(!Q\EY4f;)3RgD#WkL/kdqfUPQHPg.tR2GnbT,i@X`(_*J5^gs`O"oE5;+jL;dEB\DRkU1d3CAb\L+3B$*o!F8dqs>t)pe)Z^\2?W'P.`9=P_l_cHS*oJ&?Q=r=ELK2-uHN')ZCLhkZ%#C]dcTqGbYko4?GnjKR;o.FtQkig0P"(L.]YNp5HU4XHR%5@>Sgg#`=85QAY%,nU.X!WiB*!WrE)z!!!$"&Krl+&4'`EOeI?2_'%.ps4RGY!mcra,SlBhQuK[gMEU-8MVKOBTFJiLsW)',1\f:'=e;F8=S,0,7-Gm6`+4Eun//Wqg+l!P@fGCnJU\C;,lJ0/OTCdE4e)`KG&\"b(n,E(/!(IR)CClq]Xi0+"d>b:mn/>g8?QmfK8%=:kW?0bcW3=>Od4J?@$/fa$J#s24m^&HMk5!W`E+!i3h#QXu-!C%,mq2RQB3_@.6QI2T2*@XN79^Bapp5K9JHQNr'Q=qLd2&+lRnFVr#%0^7g(A'/_)+Hh6O@;AIqXbVhZ:NITnkM[\b-YCb>"%ElPd/9/>*"G"2/k@iM`+!0h50T5rHNEL5839RLk)cA*Z@^L[mKN!mOkuJCYXU5o4I\,O$.^C@NekRm@I7C?#nFr:)5#;AIU@0WC@i,"h^pE$5q*=*:rlRKibm&1CZ/[!Jg6c#u/6FYGJ?2eX&WjbH+?er<:F`:pG9O"H#6Ykt:d*dO*aI#B%"3"TLo+[bCgX-iWs@<+(np#SJn0WQ;%j]_#6fS7ju];MRid=^:oU`Y8!0^e0]sD5qj%@)_ZAk\m4.c]7V;B.hucM(]O*Y+UD\\UklQJALt5^\5C%iB>^R`70=5RG0.Z6RocLC5/RqVh.]A]f'#Yn!FpPrgXoABXCi22kAie=\6B-/GKIn/X`#qu0EJu-Aki&06_uM.r!<<0&!<`H*!s&E'z!<<]T0gQ@J@<$j\Ts;G]i?7X[s4RGY!;FDGU7`5"V?48BV;VB119-oR%[5aD?L/?)Jm7%1!`Pa\JJ&2=8"b/Dbb-$4o-+T_eLLI4\EX%0T6bRYO_eV^o\'OT'eoYp3InROU)jG>?c89HJ_U1o[FWbCX4PQ^MBck%=Q+kK+tQZ`XhNZqkN/C+`E>/[g[\N##^1(ACE=M*fr<,=n/M5(_j-CJa$BZET@+@-9"&;7!UN`g![9_FVgQSIWJ?J'&X!f#V$E5$!-<`/2E5knp\009bUd`":93F&:fO4_)O^jJ;6H@o9K&0U5UkD'$c@=AQE(!'*:.$'e0,P>uP&VN-$pO;dWaRF:a*Kd$CTjqB^1hiW9iuU*0W92`0pqNb"0*KZ;k#IS9"$$$C>AWM33U6.0iq6Onca)4K3[lai+P^IPe-8(I04*:VPh;U50Rs^]!8*eI2Prt(Pka%ShsGqe".Hc#%FUh?U=UWGP$esGamqf21La)ji.k4KL/oY!>t%Rtoe$P'%ne8lROY?d?3#BF#R7R\_+Zu#0%E46"8\co;+pNl!>5C@>Q\Sl.m\B!!E>=1kNZD/#3at<6]F@5#&,ZD$?do>nLVRLE[kqk$L+Dk(Lf]/fiaQ`Xl2.rIW5B!kqA&/0N.Qd8Bg,5c>Z_%!XJVK41Qn._@!$GKYn$-)\(FOT,;jI039G8RWA\lC._Q'9TdC`b-/_9!oF.9S%JTN]Bp.FujLK_!bX/:]`%XhpT0-_C"uPHn\%jKO*,hK/1TU\gcVD!Z^H,no=?3`))/'G%lAKLr*5C]7gEq[o!T2o*It+AJYp'(oa/n@VCg"7tN.^_1N"7K,/)eb?o;dO`=hI57jbGm=_=HD=oP^]=S*s^JDde<8KsT\G\dFS5=Yi8t1PL"5pUpMl>k;j46;r;&TP\AGPfd(@9.VJZA*O%hWArKYri\Ad.OWQPc0'Y;9-?9BH9YHCCRc$lO#%/4"r%ZjLH5:(beE$/$fKL-D[pb&)dC"-O62U2j"a'YoKS)LTo)Wm&pL9bTq#.(Vb[(bnqD*ah8$JN89_?`?>@/B`RZIi4LfD;OigpAuJRg]0e-"buug5sUmh?-F.!hnT/aP=\oTksO"$Z&<#Em3(*4K9WgWYJe:+<\5$mfat-Mp?qY8mpf#k],rfZfh+t[+$lc5RWC/'"V!Kq!cN4-^8HB2g&N"riXoLlmg(=.5k(0!7m$-8DX-HVs)FsZY#j8gd4bnCg#d59uk=m=omM2GH_V;#)A)_3\iDs5(ZY"&fBCCU`#Bdf`Ia-cj\%Lo[#;l>@"+96-#9q7@>KuCs"Enh#(\C;J(Ep\/[`#O;pKP4r7$a:oYP#ro#/:l%2pQLn=[AmcW(>`[:$ml+'XF,W)Q)R+DmX4%%38Y:@DZH,nb/,89T"\MRP5\372Le?:`'85Nse!(K+>@!ENB;3\_&,#kpN0)kq$Ej76\b:)foo)A]"[_M\N7F2$gLg_@Kb_B\ORH0rRF\NOq4OWV:oasW?jFrsp7Z=F&N^/ZHbCE5J>^,kSbeZV*98HY("hDALF,4JF*bTUlDLs]MW#&")p*-ub9%?*)!2sDAo2["'`LDT?M#BQJLQXm?]MsIYl/O+)79%YF)4L.ScMKJ2%sd*JjI'5np-9IQ:$P\b0n>#)\#*#C7X/3'WJqiH5F=P8PIt='/g4-gQm'Y@W9J:B.KF/4Di&,J_^MFnM`p0p3JZb>l6/Vqnd(_p?%"Jk<)%EZf/7/A;oq!O?Wit'FUhMHjtDHkVt;Z%E!D(OdPscTGE'Y!47L#/4P/tQF]Z0m`ne_1?+WfR2_>r$HO,kZ]2cgn1/8Gk52_Vn@SpTXBb1ibF3?Rs>/ZG9Q1R31bp_^fbgDiZ1;VVDi]-UT%s"0!<#)fs1dGna-#_?p[\Y%24IMY<1a:6g<2.9'/j.nk#AMeauT1RJeT-3qfCW%'=HGm/g8ca!.Bu$NnbEC#"*?#Pc)I\-8JQ:@=@dda=Hck[!%o8ORR;/96V;Z)nBIB0aM6#A417o1"RMSJ;#Z7BnHOL";]t)`XUqm"C#/1>Uc]sE5X,&&dMj(Mg'>Z)Y*]>Je8`,@C)?+#Y8*?UU`Y*"Nf'^@7DY^8nih@/N%&"75EjN)fgRr<^\@T#T%YILI/lt\&0YBNlp@a#u*C8=s$nd:o^K`2,Ha>3&E5?Kb9"U1fj(X3'.8Q?6D.nEQD6>=Q3-n)hj0Ze]_[%=SJSq&tj:Pj#jX-RTIZJ9>2]=h/b'hL/t;_r_L&8J^g8tL`gM[ZK^lM&X)P(>5cL#"U9PYqM#UlIS^gV$q"U>a)SI++&pMp/:=C6+[DZiW%b4FW&:Mmt@Y64#()I+a6:2/NhW9c02C54\(c9E#S,?(^f`~>endstream +endobj +16 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://vk.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 483.3621 53.35896 511.4871 ] /Subtype /Link /Type /Annot +>> +endobj +17 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://vk.com/alexaimephotography) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 447.6133 188.4165 462.6133 ] /Subtype /Link /Type /Annot +>> +endobj +18 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://tumblr.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 347.5096 86.67771 375.6346 ] /Subtype /Link /Type /Annot +>> +endobj +19 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://alexaimephotography.tumblr.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 311.7608 208.9765 326.7608 ] /Subtype /Link /Type /Annot +>> +endobj +20 0 obj +<< +/Annots [ 13 0 R 14 0 R 16 0 R 17 0 R 18 0 R 19 0 R ] /Contents 46 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 44 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.2e7c8928439139a498cc96709b47fe92 15 0 R /FormXob.45c0b1d09e8a1cc62cd07f5f6cdbe6aa 11 0 R +>> +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +21 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.pinterest.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 797.7371 102.334 825.8621 ] /Subtype /Link /Type /Annot +>> +endobj +22 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.pinterest.com/alexaimephotography/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 761.9883 243.9865 776.9883 ] /Subtype /Link /Type /Annot +>> +endobj +23 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 280 /Length 11841 /Subtype /Image + /Type /XObject /Width 280 +>> +stream +Gb"/lk>EPH&r$"ApO2a\2I^)!VK'IEfYIhP#g_GRi4\$Z-i/KOC0O6M\#K:S&/n#/eQ$lEZa*gcV)3qArqbr!+(J!Dp[n+MFEM_OSqe-0LS,(N5eOPEAUcQEo4]BB/1@WVsS0YB1*">#":t3;/A9EGoXI+%qn0\7oH?9V-<)/!oXU//7NW:RrEJ%SihV)W<=Y.*WZe'a2(-rYob%?XoW\p.OaCOMM!jJrFpKrc=?Ji^I]Jk1cum%'+ZV.#t03A-KS0bO6qJE1Ga9.+lP0Dr@HG?$?i5m_&VE4]P`dN7.e6BtNG2--Q(rEo@MlF/(+'%GTiaPSVc9*[7CeAZT]P9HOUo%YiSe2J1Sp8_DSk*m[@hQY6P7nCWlZ[k,9WG.=-sr7'>d?ZQop]pd#RjBoTXT:"i1gb!s:`D*:G^'<#TP5s$W-$>1H5##RlL!Y/W!9R;24l-`B:ugL]3,Wd,o)8B6Mj(!-jo%Rt!*6'=Kuatb5A[4"Ro;gbis67-Ug\`'s']>ekcJsFR5C0AKU^+"6X*MB3nF:cqoUr)Mh?:oWE9X%TM8`XL\+Jm%JjiaBS^m);@.I;^G_?jfefHk8Z+[igkKFNK%OUSdta!6DB+K>VJ?B*qg"e('H#^^u^L3X@s!]g)t:8_hZ0!_-a3.]8m8njY/!MhYa)l7sFkEj(T))dJ]PRO#10nk5HL*Rf&'r(5[D+,n3N*'Z`WfAMBV!jJS`u<%<'S^n)0'h!17FKoA0+O`l>;7o7RBZ?/3:!(tMg.0\%i>n+E:Pu]$*JHa7_W<(T,d*N>*%a0%XYT$_Z/omfr=6XeF\4W_)A1E-2Zcil4h82eMYihBuXGS&h=VZJgOfm8Y*#a>;Q`;5`a3%nq'UOA\ioL5&>cJ?^5QlkFGr\=a\\Z*JIdU"6f<2!C5"3gJK2\38Lp@m`\!/9FHWL*obe>ea]3WM23U0sFW_((P>8Y"Z9Y>/uL6d*+JQP`57*]`;'!r?s8855.&)?HEs[It,4j88/qq2D/X%]9MMT\LC>#q,'J0B1m8U&]XmtSgr0`K57-\1;YYUeD[+A?>M!SW.!@PWdKZe!_qS*g"Fd#nbr@ZDr8::qm7)O07a)>)t5buRGF)WWta>XRu3\.@P#ZCluhDcH"d-&_D`Q3-6fZ9)]N!`=BJp;hqm5Hh;(4T3]cdk3&oRDg"G*5>$5!rSXn#;ZTR<.T)`Hebr#N(V6VX7/d!DcP=%IWEgK*t&*8G$JoI$AQ6;CGgY:?3fD#%6J,fK!Pi^rcj6c7$q>'jWo()PDhmlu%ZGJ!,>JX*\lCfbBMED+sqGI[](=X!46c8okK@eT$e,0%>f@SUc:+=>H76b;-I:Y_#'g'[='.3l2(9F#74p5HUNegN$G\L8k2rPCTOql8N1fqa@H?5!*0]Y?9*lpP6\W(J+r9"&_O_%Y(-1,=2WBI!\hN&OX)96WpR[nFA25#`-3p5ao$lu)P]T=VaKSTek7LYsqL$f4md;\:3%P6d8-,$5&gU\cma\\QnRuq:S0R%2C*V]"#78_f7"RltQn/%[9k"7sC-[ep2<;,5Uuu(MAFGW$!#pn*]TrS'@\[%^r$tDCW<_:0+*8rhqF8.Z";lfN2-UD(CT*/0osCj5]0;H6pk\L:E,kpo]^&GAoDT'$d@f*[UmGanOa)V*:uic,i!0\m`lM/O_uiCr14$8R\-5Pq"QNt'G6J4&r,6QB(0?f1Y"gq,j>KCK>q'(mW;oIipH-X`)]9ZKtk.-E-'2>&)g*fasG/_&U!/BKaV.jJ4ea?Kij8SAnP`]SO;&;gJW8N)4+I'>*d2ST7;QPD)]jU-!g'Df7:Q5<77U'n^gU`#8(G='&Io)C:5)@cGZiFHhGSdoAYT7_)bVnHpIfbkq;7F?7[!-/F.<^eNiW`"5d@O:M0`63d+%I!f`ME(2aDMi4a??^1_3;iMV?)=,u^KSs8'>aR3>Qd'.0UZW7#]8O#%1T,suKE`M06>bAQdOEPjb0#T]aVjV?d<1D,N49YWOTqD!kP=_^@6[T00XAC'\hYo&a:o]H_$%8L0`*omA+(Dhc$JT57n6&_YWnjcporrEkHG*@<`I5T`i2!7J]jol4]%&,BuuB:#C1cIc=A]5AK/;!IEe`p6Tb0Q3o-u0*??.@)986Zi?Q[oc8mhF6tlKUmn4:+jS55WiI8J0RiCClNjcF+*R*5_er%(S?'6Y,H`qLo?6S>l5!I9.Ob:`@EsIIk?6,q&)!`F\fDKkJ%-hlDS8lsp)=))kKJsCP,l>)B;iQe_;l:K;YHT"f[@&6Y4uM+M2p$g1+<_k?gf6O+1;;bX=']r:cjB1-lkm3So^VH+1Ge'!b0DLWh8!fp9k>qKNn)Q<,JqVurquS%>h+r:VsIg6N`:-EVQoP]*Zc@4]BkX[cD\@egVK-``GBF03k22@5Rq'7hpJNlJe\A._)4aPOLc4bO(nNem@;^hgjNFa9B%W4Oj(VVJ:e`b:P"O&HOgVt/N2E(2?La)Ll[_Z'3S_bP65Y$6NI4m6,/N2EU_$<1g5'C(!P-le^g/2F/1KO].T"dTLSPH5GN.7dsZT@XaW\7?k`;=,SrE8%3]oNH=\#&:V$_DlH-U>V%D_M]h;+WA?:VW>]?]OVLqQBgbhu$T&n.+c682bjI=5rPee-Thg2^FgPX_(qR3ef\9O.W>r-3[>DOf>+g=i"%o<lE*ur$OfSqZT:^=K?'%dKd#Q5'dEtfj&]W=/QS``uGh1KuNS?L?It&OZ)ft:"QVW/t:]h8%W[MX1e$$?ATc!3e=BJZZDX6NJjX$Hm41K2Q!)F@/F@'"d8oPX/G_Zr_q^-dkr9:)79L20-2`GXBj0OkXIm2[X+Ze'C[>NqF@>Kg0n*c7"/r>Y%^VB6IL]kep=@^A,hbdjoMnBacP-\@?prH*$99(Cc"K(Mef8WAAgFFgi<L90/6(UZq#WSUhLu':o^`fl+S![6b_a9hnHp,9gW'\?$S:!#,fo_]b0g)>%U80B%L_7kV1pI*D9VFn?hc=+B:mD1)tXn[!D1*o^H+>hHiEm+gRmoei5`C/@uj*2.:m,C,RDTPm=IA7a)LRqFsO-a:j#FJL^sQ,#7D>dKl8j4&#X_rnel;u\&h^Ge;lR6:N,$h(aeZO='*;JoHkai]Ql*1lKD15<=PqE]b4`i.ScWi66.EJKN5Pr8W?(Lo_3BfVbnVlmj*??0rHsYs#,,HV8bg"DWq"V@ZM<]cbdG+Da"RHe&b1-tK)NMp?oYJ@0?XKGnM5VM&G3S7OM<;V(%^=Ks]fdu\25.$A^A@*Yl.<+GnYh84)Bl:3^Qun6$"?F@/%1Nbd5boT=#aCBVeC%<0X0>f-o#f)^GL=:\^/!6;-r#<8#M=!FJ,fBA3fck;XhB:S$@Et&>[1OpE]M.-T":VM@d?S:fiJG-8$P%hB2;Q^:337Qg\^)i`hk8"buckg\27f$Vl"3&h0k2*X=?[^NWZ^OL]]IW]dUGB`fVpkUosq>'jFiSiq]"s+#DgY(82hndrXChsNb@_3.7KHZj889#(nH`-q,(ut[.agK`>=M;D]I6MnlL9QT2-uh]2OQoA6C.@9Zq^*#RB&qMLh8cEA2'`"nFC01C/dD;Z!hgF,cZrtI'q&[8Bqca0oZXH(m'2UkuHL=gLTnW(h'P`2C$t6Z'So&"KA9rQJ@:?aiVrXdJj.EcHa_T`l@T?o%`$UjQ,Ckn1XnPSo5_GACXZNYg;.RF!-s0D8rr%p_c_[J7mHnc3jR2I(p%A"VrVbd:UT.TjGVf?amHs<:q>'=@$7]7e?\c/2a2cTGO:o9f$h0rSiDi@qOE2Q;>iOnnAM$(,]$kIR$fSnES=cG.Hd'ZHUlml2T)s#ghVLSmn8#A:ZNrc@B[fJQ%>5WSVQ,`)`:RBZHD&gY]S1Gg]stS.fZ?,G1Hk)M90^9OpD#8FDmQKt;,!c#U[74)q6Rt/V,RfeW(V'"pkl5kEHkK*g4^>^1E4!k-iH5,_JZ!-iUn:**7uW#;HNF>oi=ZdX<\1_o^Q;c>:r+.skTUVD6H68j4F?*o\Z%DX[Ee"3/�]QA@C;c#6#YfZHUD$o*a'+F*W>Z_?_!#8IS?)`8/)[4fS>4egKKh;Oift^"3Y[V8s6:9,V2A0Za#ol-L:eg#t2/)Ye\Jk.]UVZLPLYU)D4lHC(PYRm@q.,^M.nAU-PuS4\s";#CM0\gT`Wm%gpF1MW^YfkZC-mJRO3]aPu6)b_nir/`H/(r+$,cJ%*%(;1,T5<.+D(ah)<()^7%W$]\&j03(n5`.OEZo/L`G@Rt^N=C405S6n+I(=Oqg0r^j#3+*>J%`@Cm3k;\,:;hF;/ZWlg"qjUeM*]X,2Pm+_.@jaiWUh,mXWL"L/[,aIYg=)B&spUs0&eb3/A>M^o6l(&Re$#^]43=/%rDQ&ha0P'u+E="GmR/Ef2n$XiYah;)L=Ss\%/oJ^.&[`$Jp#4l'*7Q'Gap3'4BEtXcms%i=%.r`/+/:"e$&hFhOE9@A32M3f_W1epDb+!]c;)_8/VY:tgY:K$`'g]'6r@n@6`EbM*Ub:gRlQ6m1G^gJ/.)tiqsEcfHj<99DBpn(P*hJ)J<"_R'HL_W`9T!aLPV\;1U;d,]Ri-E$QI_5E-&(;-mC2q0?8'%M9?_YNUh^sim9=Gp[g27P:9QZFP)kl]Y%d]g"=Otfgk%kZ9b&KP%;gP9Tb-k7rZZJa\Q,!3`K+NW"m#Z=Q\Z(j*4":PXCl'f2=5X`s9T[?6fXa#6tJ\T(\ILUdN>eE\Y_mM&\!e7RX[^`)K7>,sdkM6k_K!c-8si?XI%bB-gLNAVQo2-$9q.q]VsDXjbbJF*2V:<()k%NO$+*)%2cV6E&$Ead\W`QT]g+D:m03*DA,fY-&ZX;,i[2_oTnioFh_!!9?tYN`(SIPSZ\-_&3F)$VCP1di9AK76e/S"B#tI(i1#o11_8sUVH&PG'8%fMC8t-NM`SMU-+u7j6*dHd&"*<:d9EkMbfES't%6M/Me'f_KS>#K)k)=,C`5BCNEa'W-Us:ApTV\N`Vk`L>B_INQc-FD-]=U-?kA`dU_o'BqYHMB(L/KJemf*.['?sAebauEll9oe@L&F8D_i`?telLG#Ti?R_/i5:;&P\Vaj_ghc0SM'M(\pe2kg0M<#'a.$#'DYPNO?O9+#TBqDgaKCVRqb[&igS`@!=p#N)it[N/B$T+RC_3N5X[&N/r2-lE=2L/e$Ug+P4rUB='W&%$KiSIHugFg2_XF\I57V@"!*X@oTU2Zce]n!pU7n5#o1a11PH5)(_b-u2+bHq^X(-JZoGGQGOb%K<&6\"+T%>ke`h0:>aL+^LDR\:]/-I^7)28[a4Stoek-r;jXYCAoe5^8"?Di"o_j1DUrUKpd"@al3g0NkF13>'TBPk:Or$Ws`el0H3e^Q),E6)GW&e'A4iSiYFc(*$$+CRj@^OcGHHKS""3H_?NcsGkGp"XVkUp*'tMh0u7mYI;MqR#ss[5C-4FknpFn^p)PiR%E9%LhV^F/1&f\`g[0ZUjcjO0+K,CeWf2jqb.>TT8ZKa5eC*c!,-7KreT7@752qp+^bC5+W.Qe_]/S;&pqpm\+30D:E`Q^r%b7^JF0']SK;`Ijn2$5-Ol\:1M/%h0:f/(>Q4r8g1-M\mT.,BuAP)`H?4mS\OUIu*U1_XU`pb?)P6ffXD>UV,7*mrEnj9NU-%XRF)s/(#$75pFnGP,g;(U`"/c,f+jjR:\kCWc86:*bSqVlPqGZ;,lq(,L`CE&)-u=;_lC5F`*hXG\Rt'Ff7XE;/PYk=0TY:tVkmbKG%n#_j.^gd3IVS3t1AB;$P5'gKO==nDH:SN;A]`@/2l$9:/q.icRW5TO-9>oD0i6=I4'Y-.cqcTei%8<1'7g*4,^Ybfjbo7`h^h$KQYfW8k(CGkF6L[ZQV7"em3984@M$!/,nRlY[[1Ll"h^>WjJSXK&%+;dMsN&t*PncAP5t(Cgla%Y!Z-<(G'-P`B,ggk1g?AO#k*jfH,EM7[HEW(D,rCl3@'A)O4HMMMJ3'Z9>Botq[u1UX#>8iAd\GC=mFFk)UOu\Q(]_mQK1QnSbuKf5Q[!+%=+Du.L5p.hDN*j/.7cOlSXj=I)74W+8h&=^$bj7&18bP]fWf-s7H7epjXfX2I@t@*HU5q,HRLbC6VF6'2=o8'l+=Q8ckCTGq>A.JK=#.HL#'\LZDNLMfR;kiK$YKN'Jp7;#gJ%B6Bg@eJYlC5i@ggfhj)I2bmjLl>%hhma,B?PD0sX*3bfu7;!@ZBhZEr_]G-[iSJ7J3C<;:S,NPUtJNnkV(sZOdQ$gY:J4r:i!$0sS:".8s!\2WHcJg-A*#\km+>3`I4,U!+dTH:uf$OoUI&S&!G!&K6(*@"9;U!=:<.mcjQC\Vq7`6Le!L>#73rn"?CWA+Vs`7VE-/.b1R`.+t!fWX2%&W!Ph$-HYMD3]fDn7RltEHm%9%d2:RrRpu1IIRAg^=un]*k^Zc@W&dnN/F5s-Jm7[lVLOp(rb@cg;5)m61?k(5K*_F:Ct>1nbB&9o!P8A`>Chl$`mVo3&m:mQp=3+a^f^DH5PhAp#d_3MM-STGUOhp9#&9\Eu"`dKh'#__COSRn]5k_TL(Jg;ej,C_-ULu$c_!Q.kC5_o3D%,bW37P=5np'EH*;@8J3`%)kRW;,e5H`Fd\il_a/JGViP/8(aZ:I$FK$M&*9(__2VO@H`^0_qffSsl^5d,D)-@^i%)kRWnUWVX2g5#ak>M+(Xb9HLe3uK=)>j=.E"KG#='SNb8-J8Z5$%K;:S_4,]`&H3XkJrdbRia_e9?c7)tZa6tdL2endstream +endobj +24 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://vimeo.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 515.3621 81.48396 543.4871 ] /Subtype /Link /Type /Annot +>> +endobj +25 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://vimeo.com/alexaimephotography) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 479.6133 205.0865 494.6133 ] /Subtype /Link /Type /Annot +>> +endobj +26 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 360 /Length 18823 /Subtype /Image + /Type /XObject /Width 360 +>> +stream +s4IA0!"_al8O`[\!<<*#!!*'"s4[O,!!NN0"U,&5"pP5:#R:V@$OR1H$4@FS%1E[S&K22o&.fKd)Aa>.'c%`).3KTM+=Srk,pt?+1G_$]6q:NgI/sKT"U,&5"U5/7#RCY@#R^tG#mq%P$k3US$kXBh'+b]g&/l?(()7T((F^IH*$?[`-RC,n3AWHO7mojQ?%)ai!"fJ;BE;cK!?qLF&HMtG!WU(<)uos?!WrH(zz!!!'&"9ef1#65&0g&MBZ!<<*"!1u#_a\jD,Pq#ag3MsY;4HX.S!.5.XW]XsWA&aKD,qR`U--;E-A@K72@h0hQAY/sQNW^+);I[S&(,SRHF(W^_/o9ciCRE!paVbo$lsMLK3#.$ER.0*'LD#btfomdXQM._F1Wbap9A]@sJ\[)%(:>SGU;DTkRXEeS'4j^M)T+AQB-j)F3;,(c?pmB`Bi:_EJHD!^gBmH-f!VAEAXo'7lmPH^`\EDX/3um+;$mI8q[3^KF'?I;@:qSR$oq4Z6U]&K`]PBK_Uau!4=tTnI-82FCC&/T=ii9AR/eak&(fLS#7D+YXXc^qM^brc9,cA!Oe,+LTUPVe4p]N.;6+X/#9FEV>1BQ407-mBY_\7N=bS&@A2iA`=AWZUmXE.\(_qQ&PtN:H@iWoA,L1@t&uI[LB9J(5BG7i7fFM@T!#3"G\jh>f6pgqu$E%Y\`Z%VB8!:sYp&(E=Cr>>]BhY[rYP27\OUo686pqh`f"$OTYd9X.,`Hd3+k,Y$00VYVEdcZ>lY(8kTub#WE$,0Nf/8LG0_:LuAh8G!?pO!^@O9%#CUe+`2bi^\7KJN(Mu\I/)"VM[k%'B14KDc_X*j*D]B8LYB'6SZ6Lo!5lg(4,\2YI93(akTlZg]o8MA1$i1*kDt`'r8iX$_(`t>Y$LmP_&r.q!3BjnmN@`n4K'=L49O?pjuCT'!E(b9XsHGW@^.-l.3ZV;HrVlkBAQ5R++Rne0phfr0D3rI7rpHkp`LKj"))EIQ+DQEHY-EWAa(i<29oS!?eek>5.7lCK\d.NNn:i8SWRmWUWBo0.=-BP1*#&:3K9D)Up1KA\&.$O=B*`#6WAImQ-#"Wgir2R.2@\lYUrLKQSLt,[ps#L0V7F,*fooZee"h=;F?LD`E=9$7oQhlbA0(6.n\V)O/1!`-;;+Bbf"2A-VF`VD3LX.VQGndaQTO%8a!_8T:e9*\tW6VHGqW2H#ht;\%@uY9J(/5`=O0H/ul;tm0=qfq/jp/Y&(PMW;!4/N<69sT_&!-jiH.&>-r8^[oD!i^q,k(!t_lDT;uU,=J!:+a1I3#06"[\;!T;%*8YMRP4s^d$*?''D!9V9b5+MrDk4;GYI3$FC3oTQ[+"XXUGo.S'"Tr29aZ:$F*][8=>)P^2#?(pIi>1:./;s`!0=MT7BUB1o5]b!hYQ&m\Fm,jlZ=Wb$+EttjB'>Uea%&?cDhd???OJe)>eB``GVm%VuGl`$j?$'OX:(8")Df':T*XL=<*Y+&,5\asfXIm-5=RQ>n-CM8(p!*%T`ii8H>:@mW$orCBWM/bNm.$:L:4\M,0SEl$?',kk*k&H$ZRf8;W?FC;39P-jse%&O"b=RYP%Q#Z[93CA!8$L9LlNcH#X-KLG)[nUk44_^0bD2fQq'ERVhFa5PW`.jAg:iE@k$H?]RlSBO^eT/E`%dggD=b':Bs!OkgokWA*,#bE(K]4gH.EjMGk7%L\A1Oe,=-G#M/MYTl*C?-!#kq=!WrH(!<<*"z!!!!#!s&N.!!W].g&MBZ!Y>>3!:Wluk*o&sI'JC-Bik_%O)l.S@h43X[4Q&g/X@Br0oTP2$n)mf!g:%*g2/aQN/1"+QF3i1H*H">CE-Un9G@K7K$;lr@p3dQ4%!QXn/QiB`V(*`cT+:i47/*8*=Q;q,!eIdh!`QAY#_[YFQA\#kMqQ#cP_Smo-h?4Alg.CS2HO7r.>u$Pr((kQMHJbTU^bMn;hd%Fnc*(`Cn0-FJ+_Z+@kT'"mN)81*Y[0`\(fD-X0L_4CDJcK!7iH!naCQE'5-i/ZV$$:;N-_uL_W!!<6&!1_r#0BZL?B#_CTb_.BB,ahTm(&@*^Z-Bk%,s\]3*;+[tY6PrMNP,WbKGMjZ2m+Chob:rSAs*d\#QoQ?nI4qnL"%f8gS6f1TFa?5K`*nm8uc;5%o-Xd!'qUe/"7<`<#:=c`bN_O$G][85E5FO#7@s(V9ipgW[\nXDM@VqMlZImcCWB#UrI^:]9XYK<"pt7T[TSDGH&_`oS0pLMhQnUeb)CX:I80O&DaC,FXlL`VXJ'Thqge.OE/l8B2bu=QfN-tV4e\O7rbs.e&5+Y>uraUcf#OTK+Wm0GN^o;>Z'e[%U#*A'pGBgrDIp.HJY.,jpPgtHMrVkk$Oe%O=MB&e%3hc5bWWnKaLe2UjW*).TEB:+f=m(,U82qZ;Pd!NA9crYNR?/%,`O$>d3FYsN?\]C-r?RY!+(3ATJNYoU,qM;*>.jAX",\Na!>RCOiWY1CDo\_EM=q]!%7gI#KRp-#Q/o3Jj)^JJf$0bQ-r4aN^SjO=Ah-+'iY/7J,fQMrr<7AmVJ^!!1pNo#LNs]UbHqV,`Xa=,"U6a5QCca_1V^sk&FYIiT"(6^\To[6kI1c<`b;PUIaF%'iZR^5Q_3!+-GgKrc,r+'f!lGO[XC7U,/kqX<<6#&Ba5E7$3!6$irW0k[;7'$5!u5O+NCQ*JjBpJpj.Qc4E>E#\Ai;<=0EK(bf@6KD&hP'IZc?nAr]q]%[q#IX3,hKH+B>KPHma!5XNm!!.`)pG5*m"s=#s.u24M]]3$W-dfhe%Q5;7JO5%m"tg<*`Xg=kJ.,[YbdcYPBlkTQr#@\8iPH'Q:q4"h@Y'0Y_1UD4faq&WaHCk48K$7*fZahRcfF'&LDV"9>[/+"@.ZSj++]*\L_g8#QF*O4gm2GYbiWudQgfEdE8e]oLD2?n$lC[+oIt_`D(O5p`B(?KB4i3D0ANkZ0\s]glY%^a9Em%-I1gMq5)q6(>Qf?i0OV`\IO0nj:/4/LB4mCWOX-+\lmKP)f3X4.VQsDNAsXE<>OZV/3,pW]i5($H*eni$pQ@B*[]jUo%iqbK@o+N*HJtJ<*(Er)e$3:"WEl\+Hq-g=l*Gk-0+9B,pL-DU!6(HXFeZdnGGk50p!Z%PA/p";-7j%mpT)rEdR;aLggHml()I/k='b>BqmF`&S>^f(%M(o>9:O$YMM>8O%i_%NGXlE"R^,.0m,.pOguZpSm#t=Bf%AjDsN1"pC&ZPN]%>)d)]/[;QT]cUn7oEp_<5o;b:0P=ei-dOHHUSP6*WD`/bIriZ8po@E2pUl>]8$C]$):U/=C;oFN*:01T:)l7'\-OR'&:<.,iVP"m!%(o1Oh7Lqij%mU+5B(NsT.GXI2bdKhqo/=Rff[3>+_!Hj19'T2_P"?q".0W6bJdl:8[QBJ\->X"OFlFWu9[,G(?o_eV0/9G8uc;,dCBN6EI6t7E,qEBj/@>iAYFq/LkB:V`S!`>fdWlpAY-IbP;3Ajpg>iq^\*EY\./oUX!T+P6iP&Z8sbHZEgk\$O0l8VKh"^RBr=!W(J!%b=sO2&gJt-!8Ek.WZZa^RL>E>IQ?7N.i1!r5>YH-Yq4;6]#]o7XT1_O-oM2]'E8&(*d?=NL3QDOAt(&M')qq>07NW7c#iDfW6neqmIWIcDPbGfaK&oB/C)Q\USFTb^gM)TI\\kIrpWGdQcmbAW(Op@jIS\LZY%57A^I(*P/f%EP%tiQ,bKLOGpe&/L>35AOBXM80A>O2gp;,mCNA$i#,)aQIP(2ONqEO*NhgfEhoZc:SX>DS?,b*$dWR'VdB"*N`urKQ"JZd3DV,:!67C*,rk$K,i1#Z[asIrgA:.dS>C"6Pq6o\L9C/l+dM/tk"@9On]MWg4EKa1YHF]@Q@[T@CNN\s=$O'ULR)5#_X5%]ok-#@>-P$c4k[cum6$+qZ"i^jp,+CX`7$]3bk0G1%?":2NWLo>rkUm:M*qCc1l?UpY/ViC@$AWm)j#,dhOXa'lCu>@mb3mP*8&<6WNb2ub4Xo#,#4FK\L,0fJi_"ch49Op]?R8+C<6Z"5o)pU,St56"M6_Uct;o,@[n_'dPSU_*_$t,pm#@Js)kFUU0Ljg&MBZ!<<3d!9NoZD<#`8*3j86ruh]=C`"HXF77#l+*q^:A(RKlL."1VLi:[*6..lSrH,VchrDmdQ)K.cdg\!j:PK4J\bM+T=R=nNW"-FOLq2M'N7l4-#L?o[!$ESM7mWTrI>:#%(R5^?'VgRkO?)(q!;?;=?ZF[S^5!Cf'qWYVT3;^d64VKn4Y(+kORX:C!Tal"eG]:pP'TtdR/S>!!-\*P*rO`s],YZb&&hBW5g9N2FW51r=-9V`L#.ZMM9:>5+p7%l2K<7[6R9pkq\&t4FK'Uf78VtTa?bQ6"bK$B7S:rt4O%l+SAXa(g-B0U+RmKl!O)iUg!.uJ=11EEP5Z;u7k'0b6rOo!!n>fr5[%.5T:dE!%REdGEN*Mjjp*ViDS>"2&YJ-or&,.)1DfId]$p@&h)q@R.uP1P7DW2OVK7MgeKRKP@Z\,c^1iR<'d:iOi3"UO:QGGOnGN/DSi)j.^H%i_;::6H45Q5ZCa#s^Y\V&kKqS,P&Vqr<)cIc".oZq#!T*d(Z&"[VcQtZX!`CH8c8TW]T#me+b#&Sslo60a@De*$+-[TisQc:cNku1>4W:!c)MR`laXK.q_c"L.rjCcoE#"gk=dug\h=kj3pUea.56c@Rd9Qr"tdPd274Qp(O7`-]V\GlQ8g^Pj,`]L-cgUInTF,joQ#/.;$]Js8&,M7fZ>`+j6n[\hR8$3`s`rWX.D.a438,Na^_"T*]0BG=8G8s84%<$e?&KtU`'W="n[)OV18!BRPcdgq>[)P72$:[i$/0$G"KZ/Kq&RqR,dYL38lVZG0AH7Md#n$Jt]Y8$Hoel]k_9sSY05^hJKFDMoGYi]/5H1]Ql.$D?PN$aIkoOHprjZ%\"fYTH>js.N'es^knMb9pT)_o@RSg2OV]AhFfPdlR-C->*O,P*b#4GF>Xd%7Gf&a8tnjbfuV0b&4;ENN++4V:$4,MtIn"F;7baXJ_gMK`*WQ3jcB6t&dk,+HbLL&b.mb>Q'Xmhg0DG!L7)3;R/oc%RY:_V`@QOJHpI:t\lhc63>Arm#"OmV/Y8a-.B8%;ekV9r]&sc6^K:=,O,cT6g>RQKC$opGLjE2L-1/fGiaU_k+Yj#5J8m0:N"Aa6[$k?3>)?trmWO,WT>9g`:WR%7L<=?A:NfVEK=^M`',D'W0IV*%p5]!=&X]#Bd+/T+a;Zg)tUkHe<_u/"Cj)0KMh#0-s:L\doOS-TRN=u(;.-I%LMn;0>aJoc:<(#1Km#M)l_/n''o6f[2XW`:c79*Y2>Q]Shc/#e`_Xa#Q"=`qA)\8NTgP;km_W"dpa`EQAc0FJJgpntB7jX_P:GQSq*TM!TDKOXu(c"0oHG&8sQ955aC:_0B=4%R!Q9Ko%p]gr\gb.(RRoi]K4]m_\I9>sl,/m,o,gRU@RlbO?"7K[3J\"(/p=62/LL+,'80_X:4,D[`5TJhen\n[:G@&kiR+^E.JR7S>Vt6&J)M7r"#S.W";(f^P(/1=eqDd[Lo*W"8@B!B8jMUqPXts_mpZjSpP)Q$b@pDMC>!NUi>.D9@AUD/Y%lK/VX8BsAp!,+uIp8oCTtMXVE]9Yl3Dh$1L.&:/h=d/rLVp%V.LmD6A:,l$l&>pD6!Qq4WH^?C\[*XCMcpupk7!K-jhI2!Xr51G@'I/LCKDb9#6\j3FU#<\l!^p.F3dFs"2jL*!:lKFH@:F9IXCBh<]kN6Zm3]/Xs>=uk$pW;T.sBunIc+L@H(5#lV]'5b3)#Pj,n],5H\`jDr^^R"Jl#Y=c?MZB-4Na+@(@>i]5;.]0Ho,!048LgKflHr&Vs29lZZ%7Qc=g>l:PV88e4)r3uE+%*b%YMR@09($2#bdkL9ODFZrSKjB%Hm0kRiVu*pU_b@`_at`GP$$>Sp3AtmbC8'X(-l&Q,_O5VaFL;)/V>PC0J!,!%s>nE,$QHaT-mCMS6Tb]=*R(*^N8m28oHii[3Ih,\m+GG2+I3)C&j,36P8b$YL:EIQU:'elrrDJpHRsuVoJH/!P#M7C'uROl0ul-"?\Mu'[4*+dB(_EG*>kB+=S>3;jl16N?>/uWm0/BF]QN8q1IaoIDtMDq,iFMS<;mfpnZJ+aNCTY\E66.X-6E=p/AAu+J$-:MWreBh2lg!i[(C%!KPRPFeVr`id!5t#djC>fRdrh)Jk)OBDClA2\2t2joREd8(k8nH<_WbW[K4)j"`YJJY[4AFk,`liNCrK;8Z1%$>/kPfj>^Lp%6_9PYfqUFQO<*>;[nG!T0KbQSeZCh@u;tbPTC"j4K2kMZLTm0>I#;c>+c8R8JS*p__N+Wg^'ZlrTbDC=b'k61KXjGB6mLe1_XV`&GW^Y[6B!%".X:8o*Df5S5^IAfe+Lj,e=Q,+pZZDRc&3T#7c>WN7.AR&?"\[4fa^3R"@!FPjj,:F*$BKRM@8(1YoMaNUSf@1+PcOJK37&KqLm`&6Mhe%u4V5BIq=8NW+Q6LHWKMf_WUnCKsQ+pr;7gdfkb@3?8`n03Sr-K:&/%Y3Kl;eu]V1)=mu3*$8Oe'?)4i,+0Y\;Wi%*n$!d.rrCK=g&D'JJPbjM42NYJe_OHc7jI793`P2"XEaaF&%U\#9.Ib8_Z1ug%?pi5W2V#<&l!7fU.O3uD)oEHk!6o$9N%5O\PSaXB%_@P"74!tU;$3T`%gG*9mmB.bf8`b+ombk7.GA\YpN"-,jorH'C]5O)(sntncAZOMO0*<)*!#L&tIu0WZ"o772WugJu6/LJiZ+IdkD5_#ioYn)+QkF8AJVlrJiCpB6bor)k-:8$KU6ais[HKPhWqBYj`_hj[C-"F6\P)=*JY&./[BUXJTbW[d9%SVDD3eBJnk)+Lqrd8*/rr=r9"B*KWhMt#^<`KFj#A,ba\ahRprKd/Cfm18b`]d!h)7[-b72[[u&H,^0E:+ZTDK$U-(EQ!5MBE,eHOQ;bd8!0!$TWX7V'H/P;d+2TG!EBaGOY3:$f^1/+c,7oWLt4Lrr;l6%C*/5VtsiLm)/8$IZ;6MLk?/.E.@`8TNG[/QsN+`EN4\*:HI*uWL.7d"3Q/27Q9q;3*iRWm?ZtL8ZB4Rm+2lY=c_c/Kj_$4)?)MMnEZ@c,n)t,MR'JM6),\rg%U^L2B5a(2%ZSAdTtTqiN``^719`@DhZGDGZM0i(61uI7k.OHk]3a\omM18CK-5V]`ts%q23VNeq']WL0BRHBo)`rJ!rSTo87e\c09;Xl97OcBuc6MUs>fqJpf]pIT9u\m%mu4-AHC+'a6?sj'"c4pKYHHRJ9+nJF;.q>@mO5^))P=[[7IifRikT)UMeNYoDVaap8R2MMUb.AD*[NdMYk8L7'_cFfp85Wf%lkp(08t"2csFZG'uKR+i3?3j3"U5%pE)CDaiKZ,Bc.r.-)cq%Wn'/iX9f)1@X"F]pB9fdXJrXBlcP2_YRSOIQ6-**.qUR>T6j>i>dS<,h[G9%B\Ru,#Y7eI'Hb/k\K5Xo"Ac/WFpjggqh]NGgRTl.hD"JDY$9n$L/Wb8/r:sC&"S8<#mf8!OpY`d&%sTLkh\P^uI;(_+`(\*^:<@OOb`%FVWkmc7<;ZU!(s9kl&ses<9Y/:p4!jCtODYPcrLa(?jR[#Q(5q6;9R8IXq3i6ZTL)#f;2J=&U!c?)@R)"G=ho#8!b>%CX*XCW#B/\Ogd:aQE\*`QKF5A^1BgY;3D0`W1oSqnaq$fkug5"c>"Y%;Ju*;?l?a>3V_%2#X$(HhR2G@t5p:-Vp6eJR[P>\^^(LsN_IP'[ur#k5@?Vi"N/O1IlZOgK[+(r5H&f8MYUXRM^ajN)gs-p\)X90>Ri^oYGG+t1H=E-B#3W]8"u/q\V;7u6a$.8DRE3b[*_k-BZf%,!HX%M.)F8F=e@1i7.`:nJ,'e9<;]#W,DrA)g2!SIT)/Tf([9;%O\He:?dp+G3/IPXC"_(SsJ=.3'h1%Wip5>QQq5d?*37eor'o.WQ%E9T.2b-"S(@(h/Y2,V8lp1t+I.3@*[WbgpN3/n/p$iYXll?-b]WNd[=O+!XR&ATnK.cPadADqNXI.umn(#I`,B&.#@&'V8=3=Zb2712&H7XX(&m4M<7:'nrAl?k!*]cn*g2"53!H]pZ-;"3cV(3]b3"HK;0&XlaX_3D,H)?N_%?JPGJgG/7/^fU5j!S`@E^jeLo=(X7S#hGoG:W*3&A*,Z.8<>mEg9Dd)kb=io8]FTXm`+Ho0?[22li+]\lqV4GNKK`3NU@7u(u+<4=S`69nT'#(,#c#V["DN15U)WDgbEAb1?L0/V5=<&<+$K:nD'oFEH85p=()rU]B1o#-;O`F2II1`,j1-/B4Y`a,=e<$JGUj>uM6F*8F.Li15kk:#eb_g%O8h)Qa3>?8Qd&_94*1Ffrq9ht>,OVY0:VbF_?-`Uo7O#4_!RKdVnmP7dP]J1GL*ZutNBAf'gH/G&jf;Nil&^jm7u3;r$7o;FgWGImU`Gn^D4G43L2Iq>eC,kXCLe7i(tUb;"Y07rttj`c4;o[gnigepctTJjMu18IT5WSqVH2_%h#99AeSBUfH*''dTmJHHV6-\_(g1l$.@BL+5=2_oSjq*9FUorZ1B+LN\"rJ,8jSmm5P[PZXLfntJIRFrZ3ILSiUuT-f9meQMspXQn]0.b%UDHmtl54KH(5Gc1Y&ngRN[(2-=aEWpZ%@mf64:M-L/L7Ze@9+b]7FE8.ioU+\)-&6-&@rkCfFBb*YT%#s24mm&HDk6!6?Lr<.)70?rW3$)2^J])OJ7hMqU+tFpJ,U=dp$7'(/RnObq]FH0Bi])o1M(&!eN(ClX84\UN'L[V-NMZnO%1NaU%2+KV7O2Fg,U=W\70s;H@P\+DA>%p=1c.$G1c.1RLld^[KHrtm#mrgL@fqJYJYo`3%1Ndl6Uh33+X&!8#`ADVMJUk[7e_Vn0kUS*aUJ[b84!l@+tQ,GAru$$^nBS,@A9ZP=Y/G`Z=!FTO1<6\#XT)U,=SMbU/R#JTnSfcG)ki%-Iut)VG"6Fd)qTLC4"[nI0EPdiFGp6GGUR%$1U":G%S'SoJ;DD0V:%0hYBc&3>E7ma2\'$M>%Ik!d1-c9HXrY-M>WKGA<0'o`pVUAO>=/Hs*@1Be`[p<2eCi,.L&sN0`S[P\QYj;baLV0+p->9#W[]4DLhDiYHB5;bCE39,8Rp[Q]L6&=C$U<9EPL6e:>,r^]W+$8V)31gl.,Gn(KC6Acoc*NO8[_'`d(afl^sos'Db7Ynuu7$f?3S4/sH+/_$O0Ge6Z>Hc!I,@MfHY?8ZLeKg+B2uV>ASdV9$c\%1ML7W,:iXgq6u5/c>J5D_-GN3aQ$k^U1;rrB"f.&U7Tl%E&`Xl_26B;s$MP);Jkl5K>sPIbdql<)n7``(&OeBtm"Vj_CYU9X1&pb#f0-b+PGApt*<=MMYb]'17hU&EBuF-<6eo"9GI,A=/hD>KF+ZblA-hkm]#Dq+8lU]!"bGcd^nD3bjW-Pir1\?Y$d-u6YQ_s56aYBPuR+7@_Kp]W3/"qZ6oM'B-4-ee5YH;ha'm\R&@@jM=\k/l@mDPNsQ[C2\&=UY9p/E/PV_g_X*B;#"(.Ze'tCX?`BGDO_droMsSR)f/Z?sP;hO`Ak)XIbfo!]aQ,?!h"oWj1m79@W/XYKqM@iMRZUS?b9&(F\&?XiOg`C*'>q`Oi\X]@Q>Xha*/?0/GJCE">Rfb$P=%]ul;,1#1PSXr'!mb%)jEQ5S[)Lbl=cO+-B+*6an%.'TK&$K(csI\8nfnJ/Gnp*Uk\Ki9igL*d'uK?K$.@R6@3[j,q,\a7PL8gQ#3,RA:5(:%S$V1X1fOmE(]6\(<1R?\aq_L2lAMlJ*_,Vtp,WC3Aj39mXGm^I>uNLMe(h%OO*sF!&Y>g!WiB)!X&W0"98Z,!!!!"!WW<7";2j]0bZiM@1XV0WaOeFR?J[#Co,XYINiW%U3#QY#.!C$S&+rJ?4hE/_j9J$W=d'O5a5gU>d!u9fX"qQG3NnBX[ArP*D-5-bRAnGXe?t]rX"%?ma'Yt'8E@c@s0oTNpQqShEad@!6O,/>&!K(?S>K($,k7ZC,d>TD,L,:]LEB"'OI9kj@4Q[7QNdX<;AB&s;`WA4f'Yn1FXVIS`JM)37b[VL-$o"&Bm2;f!5k,mB*D.D.0nq\.O+8o$$r[kUGa:6]GgVHs(ecY#F/YDo`]7FVFU;_O'C2GR8q-U*sE@ng`.\*]GYJZ0%PEe*`8#o9ZPJaR-B$78,iCq.@1+"\_JdNiD>(s>WEi#K$Bbs7TbJlM2fj-Uhf51"Hi.*[HV'jau>h`hR6X([qKXe?lgUYMd'3=>0`s`7q)-/R[2_Z@)1k.J&`+\@/(!Mb[D>U)A*7BKLEk6hqDMKl8:J'a6I\bm5-b?3f?cq6'^27fQXeMpR7gUD>dd=J8E\=;u$j'dQ'0'gYR%qHsIJ6a3:H!IaIRGj@!CkEQEZ((^'mGnY(V&+VPECRfZm.iH>i__I+sUbM10R!3FnG:*WW"mf`iU8^)-'WVoB+d\\t4O9bTP*gJc?+"5eoQ6QMS8BZ`1&7nN1Hh#nN%tK;ji\6$Q#_YMk-EL]IWrE(MdZ0nV)B5f^qUD([^9sRfp5`P/OkM,?I^Or26B@BAA$*5E/2iP41`@XReZI_G5_EkK#kX+gl63/4BIh_Fb#MPV`$=ht(]j1)5TgV,&.$-,N$/ag_AkkceZ\omT`5"#SLH%+RoQ5A.5!Oi0MZe`:ie[a8I@ZsVWOd=Vu?qMm0]dO3F?5N5FIDYj>ZFu8o(n5@b4%;SW)$>iMP&3T"I535'HKMl1PdffAZB#7u0?I*OCfE,*3`n0ad);#kDng+:ne]@2MI9<\Ykb&<)9\EX]uC"rL'@%Z=;]\4P*#SJChoZ2Xej<-Ekr15E@qn/WsonMKUNp,U,WBY>dhNdMU+`6G>Lm*b.8DW%`=i`%fjrnmH2I@L6:jqM=ie2bk4R.]hoRA7/"b+#XubNN[[fTV,dJ7&p>!YpZuXKX?fkJUq><;rT3h[u2'q"A,,krtgJWX&%iTo[XNTp92p]T(Sl&Ms[,3/Q,2G7h1f5+"08Gs7F!W4PX(Y*;p7<#6g$adk3BF^89@EH*B(Nb/'+NLk)u-&CO3ZmqBm!B`.,@j=t-(dK:$"64UsphGIt06S=c'Hb!:Ncp6##hq4?Usmk*YLuEa;s>mAobTdBI8"]E:BRQEDkj9rDT3&7eE3qi1-X\3.+jb=,@Tup:CLH6dQVRo'aQ*f@#bXqJOC[o(]Xl$$"rqQJ.WB46,s4kr^Ndf5"D!=1Gj6/hPOt..AKaD2WKrloeT?s%P\l,lDdE8"1asu=PCAF0D*can*^Su`7:jBLY?J8/r$8/O?o>(QIJRnqH.>Q_3A'7F.$X1=JFk=q1odiJBfJ@!%heb0^\>MR5pPAOV5%kCLo_,)'8<)`scr.7\5W"A+`GoXDS0B'_t>BQ850j1B8,"RFHPHlC=teMFV+@mU^&M2OM3INWY8Qtd(iWrs#&6rqYHnYXYB"0!J#Tb!JL[^E@47r19QDP_OJ&j@6Io@LgjJ7Tb2/d?IGD`>NCGfg0S1jqeR_<.Zg.kE#-ohpA/i\[B9u:#cSQ:iU?(c/S#OWr*<.1Z;f7e02H-J7PD+3T*&adHt25$mrTg'-eFn6T6\<_V:dHrBi+t1:KSMOTk(FQRq?Jl)Cl5PgnIqTsq4Q&&qc32p4=MTJH[PKdB3*u2RC[>ZZ31Gg=8`j%005.R'$&/LIO'8ulgA_.E-7;L8pE>UnMMkKC.LZ?76as-t,RD.UTE!R~>endstream +endobj +27 0 obj +<< +/Annots [ 21 0 R 22 0 R 24 0 R 25 0 R ] /Contents 47 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 44 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.b0aca76c54166cb7b24e50c387f1f7be 23 0 R /FormXob.ecd9546eb12e96919fd05b26d5000622 26 0 R +>> +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +28 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://deviantart.com) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 797.7371 129.409 825.8621 ] /Subtype /Link /Type /Annot +>> +endobj +29 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://alexaimephotography.deviantart.com) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 761.9883 222.3265 776.9883 ] /Subtype /Link /Type /Annot +>> +endobj +30 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.picuki.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 575.3621 78.35271 603.4871 ] /Subtype /Link /Type /Annot +>> +endobj +31 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.picuki.com/profile/alexaimephotography) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 539.6133 258.4265 554.6133 ] /Subtype /Link /Type /Annot +>> +endobj +32 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://weheartit.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 439.5095 123.1652 467.6345 ] /Subtype /Link /Type /Annot +>> +endobj +33 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://weheartit.com/alexaimephotography) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 403.7608 218.9865 418.7608 ] /Subtype /Link /Type /Annot +>> +endobj +34 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.eyeem.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 303.657 88.77771 331.782 ] /Subtype /Link /Type /Annot +>> +endobj +35 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.eyeem.com/u/alexaimephotography) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 267.9083 241.2065 282.9083 ] /Subtype /Link /Type /Annot +>> +endobj +36 0 obj +<< +/Annots [ 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R ] /Contents 48 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 44 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.45c0b1d09e8a1cc62cd07f5f6cdbe6aa 11 0 R +>> +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +37 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://www.twitter.com/) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 797.7371 84.59646 825.8621 ] /Subtype /Link /Type /Annot +>> +endobj +38 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://twitter.com/Alexaimephotogr) +>> /Border [ 0 0 0 ] /Rect [ 28.34646 761.9883 184.5165 776.9883 ] /Subtype /Link /Type /Annot +>> +endobj +39 0 obj +<< +/A << +/S /URI /Type /Action /URI (https://pbs.twimg.com/profile_banners/946383350780104704/1548759346) +>> /Border [ 0 0 0 ] /Rect [ 138.9281 645.7383 468.5681 660.7383 ] /Subtype /Link /Type /Annot +>> +endobj +40 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /DCTDecode ] /Height 512 /Length 40869 /Subtype /Image + /Type /XObject /Width 512 +>> +stream +s4IA0!"_al8O`[\!<<*#!!*'"s5F*Q8OGjP:f:(Y8PDPQ!!"8i?!%q\iF)XEA:eUihzzzzzzp=93Ezdk,BGD0#[Wzzzzzzzzzzz!"3=KF(51M!=/Z*!'"J-Ec_9]!C-Vb!)@`[E-)'[!K[9]!#/pV@:T?m"5!SR^m%r(=s*eFzDj15%3:6bH"-?Vf=s*eFz,b4o8%tai^[_>jH=s*eFz@\j&)[u^Ri(uB4?Ea\qJ!!!!$!!!!#AnD#CntuHf%9WZ2'@6^Z$!5X%p].h!(-_i!sA`0!sJf1"9er4"pYPB#6tJ=%graO$kX!_&ePWd&JGp"(D@K$'bM#p+W)+<*?Q@F',Mi<+s&!L*ZlI'gAjSA"U,&7"pYVD#S%mi&JQ9-*Zc@D*Zc@D*Zc@D*Zc@D*Zc@D*Zc@D*Zc@D*Zc@D*Zc@D*Zc@D*Zc@D*Zc@Ds2"aJ#Qau-!!<6G!!3`5!tbS6_uLbW!!36'!!s&E&zz!!!$$!!GF!!!&2`OCK`c)YB7@'I`6TT:WS*a6^p1U8Tk`j!Zi!u6:7VjUFY):c;MM<0g@ITR%7C%7PRn#)_lN*&]CLCKN-=X;6p>=?s;ua=T;-94;Hu`JQuR:frtcOo[;'6:_6r,UIspY`_O"1.?p!TqEeT'3nqM6\&0Q$It%72(bi1;VD4M?A2G&RVH%_VM`pqf:oM&de_Lug:&Z^fjPN8Bi/ABaXf?`94;G60dRtoapBA&0W]r3%1*$O5VTLb@1koB8L0CS">CRF8?g073"\MGAIJT9i"T6";(YVpV5g_!GG&dFl)?5Y?CKHhe``qi.oPHTeh*"fjgj\8M]SVOg7i'lN#@d8/?lul0J'HF5VS9.,Qf7sA0OSRP!UDu&7c>=,S5eT0abf#!5KCHX+b<>`!i[2X\rDtZdl(PZRn5<96p7`WMQ^51)iZa9X$V.9I1&NA0r'o^m-0$/24mc/0oq6)$ksd&k\t.WcYnVerXOJ7:FX0BJ%W%m>A>>'gOGb#R!I>!J3'2!J"Pb#7>6N'Kp5@X&WHh)`:g`>C!\(okZPp?A08HAh,5VOt1'S*t6eb_;=>((=4\9#D#B^m0We,a!X#PV>Q2Rr^Am@TZWt1EgGO\I=Qe,cr]%)JZ^kApSQ1CN+Fl=1RZh1=lPi!()cX;?6fmYYq0Z&-u?;FUX/m)[id)Up+?50Of]i.TolI0X@)i"NWkOZGRmn,V!>X=&VVtq^Si"m#Gk*Xc70CL.NX*Z:S>F+aS.s_Y.Ec,g)iP$j8*mJC#,=O9,Fi5Tha]!3376M1\m&ZEZnCR0a:$ZE[:nAVM$.&XB"7644&bM_aSC`ub6\,=\_^gL/Q+(J;42=1,TN0;DLL[?o%3'0MuH^RNEVHS#)dQ`0^`#Hdn.5kg.=sfMJ2@Bq!=D0!L;qBdkq&o5b-N!^(ZoTjGA/DmRdPG$sT21[0!nl"fG1Sbh%8qII:>VFF=10'`>dq7#!1I1PN5M=msB2<&&touf>N9Nq/Gce>F*Ph_Em&BOo-5R7Jo,`mOA+]nreaOP!:;H;CC,7u-1;H:lGW?@Ih8JnEV8;%U!"WE[;99sK8jRr-C(E^?@a23N]0:HJZ!ihdkg9nm7Yj_l&FDc_YO*FZ(X'7$'s8#pV]#Jk64N!Wc-MLc&pZ7k!I9Wtf*?Q&;msA8*1k!^UBC66l\i^sRRBB>^Lal!G7Rk&pVM"'6-3h0naOoq*Y4re@"G>BN!jh8ZVO(7LjCdlaNt]NTUZO#,\!Y(+rMA*Ngd^5mM6+&:1K_+f6S=+Ue3L]NYE8:VN_Ot;07JQiL2Y>_YPZGDEa<[pWd=K,k@#nV^iJ<3Bd#uX'@&^L2jeN=&Yr,6A%f^q9GYF@DWqp1Z.6fmuU]2(0SdH\6/d94o)Y'Wge$6,>doDREWDV#Q.LNh>(*W-t\KJZ]3be_+o9r(>d":5?qKk1HS"$lpSfc%P!aN[qS@\eVjO@kZBN)bbP#m9&fAX\lHN*t&a1g7_F>r&X7VruUea39fnPT8#Nl+s\P*DVq_R(^Z#kDl:CuN`;*2,tne6/R_95KSms)Te$bOD-VD%2L^\ah7jc8qCfuTQo9:%+7*sq4oi=7a`T=F]:3s<]!_+f9j"fI(=+Ao0DG9'3\G`_l1$rMk^PbFT2P'%T'gB:hj)9"S-C>bdRlRYRp>mES/_,S)#\5Uoo>esH(\N7et3N>/=)YQG"/q+j_CWn48l[P_l%_Mo;eX\E$MFLIX@XUMjDA-1Pt?m`K0JB8.0d>6IokKgVb=&r(7fKMUpB:b;-eFS#i.acR'/6q`*2&ERSAnhA1C#bnjOl`UPX69>N:XOIb.Hl1!jBl37ZZ!)DYIhcgW1fD);0n#\fMsbf\7gMt[+s?O_-=_i0i.sm/>C,4Hd_"nC7YeOZ<#f6G?LLmb:5rc+aiuS=&2%KQHd@0(AVph98pOa@iA6$sbD\eTI+qoB0IEb^P;F'2JQ-J+I"GD>sT:hraf=2/]QgRT-(G1h`k1A2e'moo.U6.U/=)K5OlqCOF]#VTdUYIfIio7(K#n+pg=Bc2OqKPKAJp!IV,I:;>4[&.;2ceXW91MXBNJ[JXHcuf#pkB56b3\"n:[QS6,omn,%J6OgB(U"dUKlp[n2d("J[l/uXBX9^aB"/:L913p*O#k.&gF1ssQdIA/>TBp>lYdSPF4DlQd+sXCu^e=IKq:L)Dp\[YH_+#C:GNnVEK#9_r^hm*pak^WL)T4EqIabqKm[$Y*T"k^#OMO5LB.Z90q2dZrY:t26u#GkD`1l4IeL9\ee.srU0W7/H%aI[]K>UncBDTVj=!CO?UR$+QW9a7.U?GF)-)J^)K0[mM4G]*^/g4umYE]ABsh0Ql@+0GZ?ABkXqpB[4ndj?*Ajc&1[ejaKD7uu#D8rFVW\p'="c6$>pHCA1Q"nL:gq$4(V*h*#]PI2r:FF`4g@REcqJ+^4cUD;Vb7oocd]YuPin(Alh+i.OS,:?Psdqsk&b\*F#7RInnQLC&PX,4B"KCKX2hsjC=0G1R"gdkfl^A>JHB(mXi.[%//DMA.a8StAT:7E/Zbqd*KY8[pUD+rFO8[):qF^b2D0W'n)[\YhX-iH'kl>oUhe^K_#FE7_uMJ&!!33'!!NH,"9JW,!<<*"!!*-'";(eK&g8tC+`kdNKYIheTrqS]q6Bf5,VNmDN=57P)Dj2G+#G,H>`cKA,\Tj@=rJ=?q*%T;&<.(MOH>ghFD,@>-8CHG&YTKWOH>R=*l^#kTo;;LKHVK^,@?RC)ApI;#XT.8^F&b2O-1;-LdM$G(rh4P+X&"Y.ENYiH@;;ZOk.ntVu29(LdDZ,r/"3=V'7Fof_Mmsaoj(0IiXLS6:)J7r+=[r&A=Mh8TJeoDP-Hf&;2^t55`e+bme]^.C5mY`^16O#1k:;72"mHnPFr;m2G](>bk@PMa*)Qr/!W'rJY55>kDLOe>)ep?cRPhrjFP?R:hNqhkg6>r/3bkMqG`3P9`\e_n:FRcR<,EM>LL!3scZB4_d3?J%14!PO+[I[Q!%6P8S:t&)$kkI'7D5ZqdBtoa\75XW'rEL0aN3/Rs5^q`QeUd0Z`<]#?"g-dAqblt%%T7#@6(N=*EnG;`_s?8#]aMp*Cp]f4PK"]Son`:=P,-dR*^a1YA;Frh"po,n7jL/lf5&/XXO8F-?3+>^]n<:.9/bl1^\c@[p$ChRp;uoTjl`*4t^C]BUojr7mb`!TG3l(n'ni*e^:nHqWr+2#Mhu#l9;4R[_dCLK(T8,=E\bAfN^u8@((/chRp/f?hKGP00UpZ-"iB];/`VKd?FG57bsc__je%YS1[&,L,cSelmo"BA<]fZ-Flhf>H])NY>;"H:=\Q)@j-'o:]h!9%#49;+28cS_2\<-,Fc@!10Tnkq`V=5_fUPk>!7TjTJ(C=,kIAo-AB\_5FRd#aAatkY+t;e`,g%a)2chE\%O#2WILNW#-.NFk_/LrdAW6+F^f?8m6S6W')qqiBC1*^B?A+K9aUFUfAY=qrEUfN!%2"H@XdbXrU(I$!:K#5iMJo*cVmsYrB9c-Ri==#rrh^(RXR15_Y`GJJG94pfm)?H_aa01(Mltm*3n^iLB+'KmM8a,a[FIB7pLc_[I3H,V)`B(gU//.FhnnIMqSOWnG`pV3m?."9^qEs5`j*+cCtZ.-%Eue8;\B`3*E1+!dNH*qq4hS:+eL=-gY*j8>/Q>[mc'+HYO)t=$HN$%Xj"Ag=og9rRNi[T]g9q)eGe#W,j5eg+)0YYNgiWnWA1Lec]gn4soZVX32.k\/eb$!_a.Y_/Z7"G6\)K2F7V3t;`m!FA_]l[/;cARDB3r\H;<84ei[uC"/DPtT:2_3qm"og_N)9`r:.c,$WT7RKEMlL?G8dY7JU61b+*KsrX?%%.CDlA.B-tflEN0f-4KGaW,>SPu*CgXhcbe;1)&jmW7D7cs$HC7rq*(.2pg.80A]/X=KpD15)_`nB,r-*'_FNhSPQ(WDX&6d1;5t#-7@=^:Z+:YI!C@/[kE8%UH9F"*O.!;i]]SW^P+7t`4IH].D[j>qjAkHiVefiO\K\]-M_6:G[S&$>e!W'ME,HVoA(AsIpYrPL=T8@q0CiV#8<9!n][\USrN"ScdZNHkpO?$e8c2`,457WFiKRm')e$[0FQ2Y]Fiq:t[CeSqH:\GLL,@uTiR_i]'!GXM+/)F&T>nO`^J4@H!7\d6[%,NJ-An3U]`.kgrrCX3\68^$:%uum4gHt(2E;]sJsg2>'SOcF./0<=SsCuT@SQL%bnS\ss!(;1?m%;rh5Ec$HesG)Y4EHkD*1/INAT[HI>HF_%!2f1qlt4?oltk@\9LN&NQ[-fX8KUr;V*l+o1qqXKZ?R[d):FSF:C=R!+(:^6\SX`Sm9H/bRQ&"RY@@3)]+;JYeT,B=MdBK)fA[jnpp.E_(feqmp=C(sfBTkOIY#5],Yua-\@eO/,r.Y8\OJT']UYrcND_RInn=MqkY4,::J2oNeMnquY#C@LA;JFB6iI/S*`(#2e6c1!d-a,sHQR?&cd`D.?\bcG@DTtrGU-(K2rCQu];'dMN+?aV/1Y?ErPK!1X@jqK_=-ZB(kse9LAR-&:Sms?--:KWjn!,;m<35AYJiTeL[K1pad,-j!*@5?pX?YCaPq5D;'\^3fe[,U6gVIR="5\`F-KO7Qnpto3-E!oPg1A#Vg^Lo;,Nb:_qUa1u?_bGMJjd.OaYTa^546P4\7Sq3Os4''7*4mhK-Oo>WURQ\W7NZWR)WpJnt/R.qW$sMkblVtaA"M59r!1kA+=U.qKQ:1$'"[qP9e8T%?J$l'q'9F3=,ttmYNU(`HnoKIN*K!nZ:MTq([q@Oeb[(S6D6WN'd7)?=DRE9A(RbHB@Ic$Kne,CtREVgoHIG8Tp>D0qqOm+mbGg>0>!2o12EYmR1+!=&"rC=gS"*I5BikmPROr/b4:j,nWpBe)nTec'pV-fgg>0lJH5d29Ds<27X&cW4f=&2H`0XXgQePCi#EJfQ7uH7]9[X/$';8N>#YONC#9riX8g@.J>Z=gWWlFTcu%Mi;Sf*7(gL$C//_]@U`rfrKt<9.t(:gZ(GgTO$gsoESkW&m4X^)1cO,d)t2j9LULm;Z8G!&/p>tp-:a41X!YObI!8Fpm>SiiVX+\JV:mSeK_mJ;kLHI\,`)dr`5KUi@f;bLU$;HAaaBkA-Q>+\4\"5J_mC2i8jp4+fSemVGa7^?2:X/@1@[1E&4X9-_)V:Upiuf=Zq.=aljHL4p9$_l4:f?jT6V&1Le/aE1Lag&2IZU:LHa1FmEP34r5d!@7RpPTiOQPYV:%QFA<,hEdE6LXi]19o:OK!dqJ:SR/Vo6ZM%#`<(-Ttbbp5j[!:>V+4A.S2508[KjN#B*B)>/VM2@][-:c>qM5";+Dj*-&9^40@bc^V?bK[m_Q]bF+(Qf>lnV*(0.iA$',)#m2Gr8MZ_ns0VqD!t(s'dJ,(6!BCnBdhXtYMQ0#M4k`l?8dR=3d@S=,LP>eRIN3n#T_6[Z'.rT#P8"ll5MW1%d5i^#JR/1N#B;UCmU_kBbsJWAlZSdo3@BX:+@\=m(:*PU#2.dgi*(SN+^T/AlU$12FWUbP4QAdZ@3`+',)#m+l5e9_aD\p[K;`$M]$8DhC2?HMst@Hq?CU0TZf09p>6hMb*"-ec*M'/jZhZGne)`5KoWM3snc]I]Sn!o3*crr=9[8F_TM?Q4i''ulX]MPa-f43=GlRhqG22K][G?Akm41]D)[RFjrpG)K!N9YgQ3Eb4OFWS2US`A(jpqB[#cdcD#6`,g!_4mWV!,B#Mn$@p+qd[mi6`&B:RpV$#+r.Oo$)=KI6)7&[)IjWnM:(Lps:hMDkVZL'FpcA5(s@cmi&@MAGkAY*ZniRL2L^!ddra12!\9W#Z_,;M&6Z;N`l=S+PX;XJ>l\?7nbRl39@E6)pF>mB%'P!)@!YqdiD[!tpir#qjo3Lsi#C3.d>KVhmaQ.@tAI&"h=(F1V;2K,.X+T&n0+mcoahD!+lk:X":IVT:aj3FN^<5$F]o/3TRi(Nb;KDr)#+*A7&kY-R8:E.)+H0>uo]OM*#3>adk:u=aUsIEB:NOYqop$FUi%dk%or68joIZ,#U14dCsD@I`*md-/aFCFF*7g:*4L&gi-_QSqoq;_@nla1/(U4R433qKP\`Dl!Jn`M0.:]h1O/q3or@fOCMp#e9)7LSV*+b^.q)YOXj:?K9j]YV/6")c3/QO6M>>](rZ&_c%`>en^MC.Z6*m.6=Q8%aC@+lHhKttMsV9Gp4SI$A!,>bkj&qnHC?3naip:#Xc?R?Cu;K0,OItFS+a-mU-Y?IneR$T=uJs2DqfXT`6(bnCY;l<-8J8)dJGg\V2:%h2p0NlXUum<1&GgR=_3GPACWnY&nCXpL-EPo,&Z"Yd:gN_+0cmi+*(k>lU@QiYLmZ;9?C[S6mP?DhRaWFU[O1L-:J%o8aS/-2si?A9j/npi>e3N]cXX1mtl)$pBkeUb:c@H2d)%caaXBWYf0t5*9!'ZS5T&_a.r)rPE^2-2pAt?+o,Wmp`;nNML70Tdq@JMVfA4h&5!uPZ;Pk,O(J2]ajeM_K96dE\^Ao!Pp-^[E-#VuWu[R=`>p5i,n?N/I`!7;n*=Jq#p1Pn/BY'Jdj3_&&q=>NajW\kb(cLM?)q!h++)J=agVn>6UY4TBscT)Q1/:?dc/$CH$H@<'RBBo\^u'q4:@aEZ8llXN.sLAC)/pRUQ(71"j%94lp#Qnn;LJ`R,j$k3kgs[ORR*FStGLLBm;[6T@8hbH"K6]Uh5Z3i5b$5A*mcg\?QF`f6eSi^L5#D^.tH"kCN:$(PI*[#kXNtn6tP@L[1Rqn&[WiU'>2+%jjj!4n#eM7H'jW[msa'Vb-iu2MtMNlSI'2Rl8DbP!2X@>A".3=re3@d8]'uS9D/\\T@P,]rIr6ZSsBHWj3u=\$:Sc&]r"'\=^:$Aq&DN1BnJJdC(2Ro%NoQEoSYAm\.+FM=(T,]-[PGi]`hU0.0\sa-Z(gA;)`LA5'N5!8'VDffniHZ,E=RE;I)QON*rm#n+b3l8*a"PB(hCf*"'q\6lk.aXSK'M5bGe(=l>gO+M\rNs+GjON1nn8qb9o=O*\?=MOKugtf5'PYIoQ+WVV-FCrN:W/DJBjHM&uPP[l1Z35GPaQ"f"-LI2Y;;g^qH>p/ac.`gB6HR0j)J"47[^=7VocR!D`QAf;Kuklf-_UMZ-Q#niDXeRcHP;6q5m8L(0f`q40.@%Bj//^ZJG#b_Z)'Ss'7j7:.InASo_IS1;!\J.c5HVU=n+j0G7,.1o^_'n\maM'']WLYY[aIW#_.2GBp7STpo:nfL<++YBRYpq%L1?C<(hSl36V2_)pjY:B*;Cla;aQ0lId=kBS_!X,X.p!rHcD*>SW#M.E?+bdhF(H:Lq@XKs`u7SHQDl0%gr`PIY'VHAoZ_uM>#!!33&!s8],!cUi3U:Jkoik?o=9kocVb*KD9aO#US'ub0+U&7K&?TaU%oSen*?E`QF$fHl*rAUeQ(WMeNNMUG9)>SEXeUd=(M2Bf39,uC@qNZ:M&\J4o\=hb7LrN?]V7X2jF0\>_HU?-lL`a&@n9Gh-f;b.pY(FF?hQ^[JLhGQh%?`N5K6ZFWd+)XAkC/j\S3^rdpr&+.$(YgXg#..L?WSd]+K3N#!Zut19]00NT._Jek>:M1Y\<.\j+k;#=qc.7$P[iG%?#]WW)s0rIRf1gYFO"rO,AFdB5VKl-r5Z@e+$OHDo\WB8fO;gJioLno#10Q[L1OGiFaIo]d7$`5OXAgb0n7>E4hhB[%:fUE=)#rr=$a,GtE#M02K_GKO]bq.P.mtAn>Yi%)+Ifb/VaOiJp!e]4fA$,/uKNeM?pW#`FD&H/V(ki5Z;-9,ef`0p3-:E-g*6AX6Yo7DX1&7nYCRd2:bh5>7!?0&"!B-tl)iCll[/]l-Sa'%*uR\eDG*R:4*md]@l0%@`@G>2^<[Ke6F%idZU/;!^dXBgj&"6:dT&50nrPN(e3]u5/!2&0gLG-Ft]RR^'9m>M#NXksf;m3'LjPSSY#KP;+88VN$oZU?^5RiH_+.]5eVkueD("WLIX:3c0-&71aV2g=Qo<#UIcPZ0DmS\s16I]M:hAd5gpP%DO3hnP57eNje=kT@;kudlM'cFP?W:=flDQk6'MS\/;P.]q1rrD#N#_M!L0h&q16ZXaFq_^dCM`*U>D/og]-'/0:$(dlQY.%SO>;#5Ga>?#P_T%S0Ko].`HS=.bYl@ei-P%4`&qeOrSi/_+lsB!/Z/T@nWmp)%be,>tFO"n'DNLCf@SA>L98$bu'$:NSubN_XL(U"C:hUPjIfD\/dRFi[\MN\Fc=!,hF6Y9+$=mP*"DBtDS.'$!>siL!]%Lfoc)%?Lu'i]$96tKbU1hWD02mb6X>I7O/)cDd?^k,GhYF8-&1a*iq)>$T>1'P[u7@.mcF:f\?;506JH.\-$(FZ0Ujaj@$;2t^:&8p<]'!;U!tH>ceMXD?\)4Hk7e_,GP+9Rd,%:.70uERSadED1;i!33YS8]=\ZpL&BoOn=-o89\mjiL9d3I&b-!%+lk7p)j.e[@uO-*B-SALDH8h]Q#&%\L9*8\,0@nWB."adVGKAH6Y]#KJUO:/X4o-d>-3k7LLm-Vr8j>Wa_L]B]g*ISof.&YIB[)34KR]^-H$bLWRTCbr\(q5+5f^LBTbC]V[5NRTAOMSc-'Y&Z.g/rf>"T@<#/9RsQIUeQ0l@&>4fP.hC.lW/PI8r>`$>4+J00"F>F$pQSfD,.2=P8BqnQ@[/]KgQG>iJO:G*<d&OC@*6)>HW4"#W.U!6%*gb#)^.R\t"BRdl7[qD]q'J-b"W[^%7=Sc`4hO7Eodj:]3nTo;:L;=:qGUbOZ'1G0\723';l>@&f!Ze`2Sk>XGs?-hUIf*S?#tSO9WR/N\jfV-XqX%6LcC4RDH&qpL0j-6=p#iJ-d`9MT[n=6n400ZeS2`)j3%iTBnn%0a4ejS%==GO4'+G5s3FpXe@8(q$AHIQO^GHFZgE'PfbZPmK?c'^Y;[AI"0Uk-f9=SEr@'C\Q;s9$=8]tTb>4BXS7[*iPh*\LTg2u6@0ea#j/l2`k13`.Ta"sC;A_n2^*&Jhq=uR08rLJoQ!K<,D3O)JZ0%aZMPp\uP7=_):Q-X8'i2_maEDsM_Y]"b31s3^3)e>lg*?mLWa.JX5_^'G*D?M)2#>-P,N4>f'2bk$A1bBbVCaF;T^@6U1?5rO?Co!gf)<*JBdNMB(PrgVg\K(6eCl'HJi8CdJ.CHA<@'mCY1P1an-Hj"6d[s51-JhB9Q.`qq3NI_8UL<6K%B_^-@8>"Zh!FChZ[d&(+AW[nZ#Sp/k`7,qVT@EjYdYW.V!&Ab@!_%_Pb"lu#0-n(>dUDh_>S55jgq+[@fU=i4K`RGQRAgM]/jt#=\>tdFCn8f0:TX$uP3Oi]mK]$-kLf\ioAn$36E@'Y?-,$cKGR4*accTbc;>[r?If>h0.A)h`?5BWtG]rLoV9Qi@&,7Z/a&XUR4,iJ_^MT\r8f:f@Mc,rr)PE+#"oE)`>G@^.,L&t)L_CX"c!erCn-3T7sKQRpU#7E.DACE.Zr-lu2apj!g>W,D+[[>_m%1+Ul(nDf\)%7bVsC6EYY0AGcQF]$AF"un*GU"(,e:W"R7.ATp%rKp\e4F/>QE?qg#e&;)CC6'XUrr<7AkVH#9mqCh"b$CMZ%_M`@;?$XE#X-%.c!h93bda'&>h0s2pDl9d..[3D8sLo1?qQ^.WD]R+kuq&g.O7S_,"GHT@3RuM,S4WSck&JK&0O7A&:jm^W#F0b>1St85kHk"P,1eCe>Z?B8r40A"p>M^7"Q[T1^G4T";!Em5S,56d\'3tX_JacLTsaRCJqO"Kttrf:o*6M(0cAP+k5HJC"inQlptd4TH$+TLsb:=/)NYr.e?GPnGg.&dU;s&4$F16)5WS"%,]R+6M1OM5iiS#U"s,0\U>p#TuBc1a2*Jc@&863[@6>K0V`d+@(Je#\\MpHi594+,%ZtpBQC9iXNtMWNj#"ggfPi8$eF@.KR_\(cn(i15jdqrg`p>'!ka$bas%3Yq_6W'Nf8a\ZB^e@]@"4D8tM93,R.Q>KK!u"(Z'0nnf0HgK9&H;_5I3h.60M7T[<)$huZS:LMN<`V\&UP$^YZQ"$kA7OWm'o@H(,VZgPPo7O/P_5_MA>ZEV1a":88]8EpWIa:l39T5jM.N*t"!%]5#Wp6?F&\qi`'l>4nNWP@5mHp6kkUE(?X+Un]D*g>;Xnsd%Kp/a`)F)q`h!"`8L&;31L4nT$HA0qK'4b:3G;`5%=dGMQa/9E$E%7ikDG-hNj<9K.`C!e?6Agjf3=dQbTpKpQ6#\ZRl&GOb6JPtV9H7BEWnSfXK4\*@Igk2HAF=n\N4RQk;T=;E.SHqP'PLOq+4eo>UJDlhJ70;;B=t4!6'H)3g(]t^",8UTu)^`t^X>U).h"aUdFmlmQKH]PB-ae@rR3dl#M!s-?;*.)RhM1C?*H:U+>*MGF(P30N=P[)G^_r!^[r?MSGB"T?=9WrpP2]jeLrX#_@AsN!&CAr#g];d8p+5_hBK82P:BPZXLQZP8=I`o(P(n?2BkOD8"Q!<3e\tL.ekN1?-2_,'i8-C?/,5C%Cj:]l1`d2M.mYZXH[+=:M+bKop>FLOA&^l31.N-E"spdJ_)N+aui--r&kroM1O6SJ0DJ2dcsIARai58OMb5%(>0kPkM^eBl^#]Y?E`X_!>(pfc0iDa,Zk]7QB-g7?+S*PF1d6j0H-Gi.I'PeMkI-,Wfs*E12Mg'IA9i??_.H1aA[#^QbDe9]YnV<#14"M.t6Eu[@71IPZAKDT&BmT#JfqcG8']NEuBIUe4]p3f7]AVYFgA'0V;*-h(N4IZ3gIMnN.m114^q^hUg@:W.DJB+J.guO4BMS]$-9aF,76e$GUSs\Y/V,*9[m>4T1J8kI[UU4p%cu,8$DsC_2n2[`NVj(]8;F[$B`*;e,m)mm7R9u+2gS,241HTPmp\t4*'&3n"'nfY`J6kL7qlcq*[Y:KE<'_;_:SIJf%1%8N6e$GG*[Sb53FVDoqdiMV=5C0WG,kojF8Vm6jW6M_-10%R7:U)@=lTdjluGbkBo#=C>P9.)#XT)WUcn1'ZMN6R0q\?BP5P=[&c=lAKRNk#`2K1*!*4e)[;;7(;5Vg_K.o#@=Ck2!r[%nlrfZA^+,r)P;1;mAe_48MQ'\W:hQ1gI!qO5qD3&l/eJn>T4V/1lVU-PZu;-L:"bYacGEA[A&,*4]],1$/[b8YZ90gs;YCLTL4&Et:1*^Y.ULJg)a_4:hU(JFMOsV:;cBcc+\$`;X?3]N0U::0mXK_@OIEf_uM;C>eo@c7IG_@1I+4*e6Lp_UOuhl9I?HnX4FUg298rD=eCdoq'R6D=WR\A:.]J;MF3@(NNLaiBA:BVW3-BD_$aW*+69b-Z1Qsl<7uB2jXZ^D/!Y1mf*:VraAA8&t895o`5*;hCgN[MdiWQBf'G<\l!I"TThQ(3gbjLmRM27D=+p'#\\^Cig!0hgfRRGa%l,h;Z37Dfq0sG:s9W;R>ou=W;BK5O`$(A')\C$qMCr;^gG%U8PF*W3EuGS=)0=[Inf$hU1>djg]qbJ7%s1#3#)X&\O+7!@JmCS\)^WS"g2[GgIh\_f',YOG"dNrX1YWZN\r`5SdP7?Kb]lSVt^$2).>\R/77o)29L[-&)lMci2(*!G222rg80M5GBXE"u-&W17e1tJ#&uln4Rp&9\\mQ5R.raD;"=e$QJtJ8=Pq#Pq7S=TX>T@SR?V(G3UcjpjH=g"9F%`.7^W\/3,Z<.mn`r*C7s`U&Hdm-udW%hLG00I*/PoS;;D(__cO`DY_Pb,:pT3jn#Ijp-27j;-Os1?Rn-8lrS>(inaMb[\?35]^pTmh!l5)BQ_k3b,"PE).[j8iUK?Q[s4Cm9&]>I)+N!OQg142!.!?$sDGN5A#ZgaN@5OdMM<`$m(9N0#j*TM3jH$9Or45UVb2F\!h+d[ZD'JqZWKBYiJ1Bf>"l1H!bObK6b1RP1H`Kf9\QEEARNT)15<2ljAD<[>sq6TW]Z-L3!AK9V,U>#HNqNZPdU?"6dr[mdTJZsNQ.o/8?^YpXMmT=..?^.T&6HGEaNh%t:-73=kD$+r\19XpU(jZI&6XEe2<#/HiHtY9.dq1CM2TK#+IN(e&pp@?r9p(AQSfOI5,.`=)!*%Z;/!%_0b^9iV+cA)&QQ$@0fK':pSYdJSF,!KQT2>e)@ShlMU;/iY:Bf,r;Vkf5m,D!*)3iC,k_DLaU!?&oiG`0+cea@D(GJ0e.e8JLrrC`<)a/)=$lD0\?SF21*A[iZ9RM]-*(LUmN.6M\@Bs>V'XjVW5H#?V@#g%T8<]D]^u"$``Zj&nSft(+=KG$&_][`GaPhV'Xa+g^N%gpO"[m>[aim@`fd94.L%?OYRq'gadEt9c:sbQ3F.)e8PRXG+42EJJl;0MV_kT+'GN*8J7^;m@=LqkKMZ'mL4gC__idqcaXr_Uj@-;r3hLZ!.co'Id9"9UINfbjrrBHJ3Ae][l[MOG98M8WD`Hd*$ojhh_2*&J//g)U2s?MJfscYD+:e%(+Ro$H*Z:8W8[KVLS':DTTZHhrM-[FHkim)RTOFRL\WP)q+K__hGD5kJi8V;.<-!ZBemju2`$%86DT:BQ>p.M'"B[@cX=aC-NkJ`MqRkkPFYI*]LiboL8>YM'=Xj^N#47$"q8!qR"R<9d>R%sKCd8mhm\E?lt>YqU0)JS1K<@lF>e;295jE?$hWKZn-```P9Xi>4%P6s),Oen0t(+nM@9UA0[)B/qZ3&SUP[R>/_DM+$0%A!/V,a$kjo:imU\aN]gqA/iJS>JlZ:GaC"@4X-r"?K+61#qfI]FAdlE.Dtp_.m)o^!2p5OrrqlBO\r='GrNF"q2Aj@H1DbN6";!#K=SJOVbm!)c/ljB0*1s6JX-qEc)k/(BgRu\3VjN`iUC`bZGgJm(+>5J3.[s9?"MFk[67e,?TOhgf1jCe[nMuRb1+W0b/^$ig0Pqk.M/mYAaJ?0mpCF,l[0&ZJ@)MU[^P&Fqd$-qN!6cGM(Fc_un8CJ4]]j@%fk(o8Btk8I#gmOd>1d9A$%:6'(a9b+&54^70WCQZKlNVNbf/77_CJt)hJJ*\KuC9NQJjRAL9@AmD:%lO/W#iD?l%uYd9u1]RED9*ZBA[>NA?&:K5iuoTX>P?[2^sV0o1$bINp9!5u]aV%9s<3,]AT%DO<`8-=s7/+uDBD=Rcj_a`dKG7H606NDb"Q`6d,#*(<\paFd?K&[XH@bh=ep"sJ^46lOa:\Qm<4i(L=-6QU0WVBKLA)gdhZ_rgAm"MN5-KQG:-Im0UYRh">&s"`R9GPsl=s?WXMDVINAWl@5=cCWa!m$&"MlL6Aju@s(K,EK;8e1H9Ml9i3:CYNWVV7!ABJ.\sJEZ=Z4HMo171"p]@2kQtVrCi57@Z19i6"[b&hhHb*RP"X+8;cMd2$ZHEg^CrRU%HkSTkr[GdEK$U_&&^g$Mf>Uk]$(U26uDNJD_#cZj5"^#QFk-(?(9teMC?[;NZsFA<&`3k;/\0f.RG._?itr/kbfb`_916JR7U&FRQ7hcO'eWl.%@>A?BmI6kMDjAo+t.hpIL>Nl?[nq2rr?<@/*[_.mg5OD81<52@L`I7N2G4uT[kLB52%?$#s35]QS?]"k$VHI9+%"<(M7%XKis"FSA`=2.YiGjB&TEo3dB#uoN\o1Ko/n>bEF,ZRqFYle`.(B^hX33b:>ig>E5R[bi&a6+M#Ao>UM`l$@/IkAen:I)8NF3OKlNc(7%7$'mDipj-=\QXn&98/r#-\E@qf[)N29^7@B9K\\TjrI'd?A9DF-.S$9)][14'B_(!URB.]t[g&MN`!<<0$!rr<$&:X:1rL##TPHWIJXj@"IeGMP:HXq?k6l,TA=FrRR)tp+EH>#E%_diXCL[I5<$t;FrFCJaJpi\'[eCd#fWMNG!'D]l-spM\N$MS&mSTtmN=Lhe-(G_fT#VQDG$0:33'bME[mB_[)ek%5%j)8E*8l4M+nf:JhOh/kBf9=U<'L-B+%4>)5ZD43[Tc]0Bf-O!CM#DO2tcpZe5jmh`h&?i37!ZD5Om6V@m//H(0OZ.q>DRH*<00a1;Yff8!qm=N5\PKfW8uR-*IL8AWNhW%jtn5qg@"#fmqq!f&12j]dM6X-HLE=T?;>-P6@[!<<0&!d_[e.Lo9N)&EXO=-Q<@dbD2'!<[NNHsLB,435%_^&=c4i>b:L;C[bGUVn3MdJ%M]aHRTX3f=a,Rcho35>gCV;t>Y]Qu^p;-:%(n-8d0%O>&pq@@m6,n!Lgc$7no$KeV3K.Z2U#Msfp;-Hi@t_'dMQDK@?`P+g/=5KAn@PrE&!%ned^Y&`rg-3_[J*#oR+i,UC>AnQi@!`R'gLX^qEiomYsE(:-7,D+kCB7uJ/LSaAoK`%YuB8)*6+U,Z!aGpO^i:(9F/EJF@'?OoVUYu+s$Gd$p]=mMnMl0n=XFj,.+7:clT5k3DLudKME\O(k'%.[jmf*:)q>ICFH"5BFUi*u"a,T+D^1-9o!e4K0S8J)/Cl%uj&=s0.jW"3?X-2P"?s_8],'Nhp7SdJ)"l^]Y^#K@5j/"O..U^$6Pf((`D9JIKC]+8L2u"fk$9frI8MkZjf2mrF@t^Gs3>06g)_Od*=l0k[rfGrpAWh?h)LI=,i24%mTkW'H8q6Q2ua+n,#iZ!%">/FFu@T?PeGYSWs;l`8LRn!"s+gddaN1$#mKf5m0U68L0((k$9\=i%dDL`WgPhl[H>:L?%Rh#OX6c%de,`,V*>nI%gQ?+SWXaMi=F\WuFTTojcO(#U#:T&mI)Oc?8$Nrr?l[*\R]b34Wb'qV%Y-l7q]/3KiU\2h!&:,GXgf5>-1rGPp8Qc-brG2ulE1_u[YC8L1s#8No\]qDK[J?'f)-ae,Apcda&oi#s7VG,K8NZk1i&I7TLYHCG;<#?+-l1DaPO36<_`7./:*gh3,WfUDqX2DaA?41,sb#/:%,=-diBM;Z5kZ6&,-6$g!-'5VoL:#R_$LL\?eR3&H)j7KXbA9h]-;@c^;G]\bf.b?i<>nN,Ud4VTJiNmW\36'NEbW.gn&edfE[XFpcD<:tRh:p.ko3(GU]FFJXHq-rigZ@rPIC_==4'=L`o65dA"-s0\eRWeBG6$"J+Zh6ej(Or@e#E)R)0KMqD1'Mlr\M:Hb(sDl^T/9UZl/]=Eb6_ENh@cUMXEOYru=^bS&fFgL")V[dROjloi%*\D)=NKd\Bb=FWT@IVJ@ON4ci?3e\^"E>Qih&m=n>On)b*XP5;GCf'okCuYtB1uMQDr'8r?iS%E-kQI\!<<0&!!M\K#f#h*&0jOZ:Q=)8LFMr#U"pGL`sQQ&@0S:pQq+!R3\1GP"@V8J:j!"5m.`b#8q&T[](g@8M$#r3!b*YK5?>dLk5p-jg7h7)_?aQbg-:p";)2c,0"S)aiT"P)_P9WOuPH6*0ChI]25?e>WaRP<4k?"1GKs`&^R;GoTZU.HLV28;7ee^8"M@T#HJ.e_T^6M"E6(8&B%=-KF#K\Mg1Q*Hq%3Srr?PNjj=R7de\sVeUafm"Be%J4)?pChE8-^0cZ=l_/6U]q#4egBC,0aL2CBX3])e6(d#Ao-.6F]rW:h_\)GkeO6535CS,AsHTukP8c-pTrY@HGqu6X$Mbc,:p&.hTHB'G@4tP#-#6D(bb;e]M_u^Od^n,IJOlsBPGZ2R=l=)jcq,r.L0^M%RR3"+Y[X#O+il&Rgb[r"sh:?#G[^;:8aD0"7"#2Ce7:KNpS,2cWFi:kaoGS/g"Qf[Z5p;cg^)L/]<$[5Y>mOq(lgVIf,FLUn#AUe@oLBFol$YJ((HK*W@D_%O!IFd.(i]HPd3?RaLiA@YW-$GCdh3_i2eF1F1n53+>$+bk3!PZH.BX[`ajUP3t-F]OGN8^@\Zd]4[Gr4jMZkD4++^'$0`f\kF=@eZ?`umG(]QgbTr)>;#8^`amX09;T9`A_CJ_KpSmR?:/Pt+UO=E=tg-o4r@G=&ofRlf_^G5f78o`s24mb&-2b4!WiE)!WiH)!<<*"!!*'3+Yc8[&7KR0OeK%r+OT0;nc.;C#QXr+!C%-hWg5\seAPiQ[T%Km`jpk$oe=8W$]*>iJf2<'KhW,AH3rFJ-c/f\&uGrI^eGrY[7rLj&KlqgS8g\:8`VIF&;KDmB1:Ss1'e+b"#&7QI#UU\['"]juiWm#0Q$P^*`XdZD.O.ePN&HVE.OtBm:P[I;eBIIA[$]t;:DO5jRIqtYRJVOjC/dKb)NM\#Ge#3)$Oh"\!oWtVGc5S4:cp/]WQB1`;P97#&qc#.,cIbJl8#2Y(hppf;'e[E%oS4DTa2/M5?+ZQ4VI00H0OhpAJ!-L@mn7F_s*KjduQA@IQ2J,%gIh?KES8N6B[-9+>US;M2>?FR8=c!U-t7r,]+.Y,YUZEEg@;$&D%Hp1VUt;VAtfIj0IjF-]J!iW3IjO9[,'HHDYTtGjl<";8aS"5e\B`-o!2P?pN%u+A.S=7X@0BWD]u6<(Q&+6lFKEWDH!]_r(e<_)^GmDL/../=;4?rXdfdW&:UEqOpjo1BJ+%5_/t>(mP.*#u[-']H1hBRdj3!ih]&.(s7[K&VPuRUB)j$'>Tg`4(WVHhhb:1fASSsL_M8$TT)5m@V@`c6/W;?Qp?oB(dl+M!TLl4e5BHK%'LE)Pq"s#E5jUVGa`AJ4t@qcCp+8I4=cht#Dr!1df]q!JVYF8("=,N,s_J1"8nBA_.p-[5384FF\@38?&1Vs")N$mW@?SObf>;$_^`Pc0ZV%TXS>>>Y7);'<+:0)M.T=Yk(=6`S#8D:lc*S3>0"?LgD'SV\:=&XBen`%$G'3#>d\f&_[eNiQV0^eg4IBgFXXFAoT,g?^1,blPA9@a/"S'?_eA\[,^`W>@i_,KW)hA0nKS\N(+@%(5Kst"sF$ZJXC1O4<@9["q41%?snN.\BO>jl;8scS(`V'2n29"lZ3DK*@t_*dq$4Ue95:b2;sBB187C"$qSAl6/W]I6(]rJiP[h\hgkk`,se#R+lq7"8Z3K(n`/+]5N)=2*(,A#_@VKiKI9URJcl>#^G^3BJtZ11](!A-W'^La`!2upETENraXKuKE1F;d)#"q0q@=qN3ffWN#&Z/S81k10>NRjS/d*d/bX)lAo>E&4p_'L-!(!-jW+m6'""l/3T+"*PiSJi(VX3S&keIrCo&]\XnbZ_:6!(2i&7'_hc1;[RE2*qNikYiSTFg(47iq@(>W?;q&PE&0MOZ^sk7"SP5a8nU:e_C;>SJLJFN'fFTjK$C=3##Qni,>\J#%\@&5j[0F)k2\@iBk$Ot,#=e8QN7Gc8N*D7`o=3K]3>%ChN+Z#S8##oOLG9Fo?OqjLHokgT`]KVZEHu_!SV&T$s;;(.eb]@3Y2;lc,6`QJ1OM7=]6oS2:6ipKGN!WP16.B>jI9^%"(76W9a@!RuDJD@!$YOO$DPO6s9#Q31BUm_$G<0'e2&;*5\l6,;6TD9kV"Xm"*UdJ]\i*aK5O$d2!>6`*qsL5Me2!7FD,8f)b/25EWIP/43gk\AD=1jc&Y[;uM1XU/Qk+qFQ2nD-7P/8H!D*%1MF`eJMeZg#lhu;HKJfV\a?7qhOr0)iOt">&Ts^R5TpB$=)#CTc$l_-t8%XWe##NbL_+3j%adkRQ\@"%QMNd/jq6:<(Fe(Lk^]&&_Ep\&hm^P/1[>1H<9h6]?b(-O4/+ZPn+d.)MqfS4Ucb,p`&u0N-]XL6i]eFV9.Q[_Tsd*28?NIV#PH"!Q3+''!8=OtZ!NV%'[utnIrYHijpa-U"?2rhC[+?Y236NW]#T,X6\8/"(\]Q.%"'Po`\EFr@`'n7"Z:rUbrha3"OufE9CZt1%^CR)OY5o3Q&1W':EaYW*=GnHb2m1?*H'"_UjcHk*B-Ine?,(kja;8?9Drp2;(mO(ar@gWkA;kLocRa$6CUQA.1YA+RiF>l[$fR%Si5P41pY^i]@0oQq+lJ*I^?1Bp&!qF>r1;cLtE^lQjke6u`4pn@e_tgdk$*b'=N[d$\N^$qT?e>Y,hQI;bdDL\=g]6aKWVV1Q8Tmg]=L!cDrrH\k&nLk?o*QgZ4V7u;G0s`jDnI;b!&]3Z,L^!.!fm,f8@:t\N4Ee0IMR;o1SM122+2\oVSDfE>4g+ek/8j!+ZL>E+C(niPj4H2/]#5m=(6h%if@7jH*Z9-0gXmQQ]q?-S]nn?ffL5bRSnW7Z&mOUT!O#\c'75-Kp^J&c\9oSD@XtJ:HPCRO4!n6H-qQJ*n>ncZ3nB)h$+.Pi->ljNJobGYWbd@na\9`XW&0eN'=Mo8"8n0+jYbQ.[o1OW*+!m8&=Z7h`NUn"0g`\+0+Uu9k4=c&?GStRih-pID#0HFr'1M'@QohSe:6093I\sSr?ap/sY#I)t1V!9Wc8KSd7N-e^JA_(Z'$!@[N$$T'N:)%e\W%dLc:p*UpF3&L>lbK_^^gMMA[$2u_>A^YO(sSaZ%#T>B/*Ip*pQS>%+:5+$Ke`P"YAk`!Hm3`ALPWr1H9o+$.p-iFoBJ4nG%&S4rF)MKQ]cioa!l+i&hYFk2=99#dIg];aU.]rEQgsQeW(T"6qS?_8d2W^c)_#XJYMdlTZNrYLXXgiZ:i,E:!9kg#HJ$&,M2UAQ_4B^)VKM;YabjFT"Z$(A-(J(c*6`D@HH.@H0RI@$s%j!WBaj%9bC!o5K8gts?PaRSHom:b&WG.AU5Ogk!s^Mg#^@?*n4T]H%OK)P4d,e55Y_>:o5P#QVTsd?`4.AOd.QWZ1tQ>BAPCtA3E,=edr@DmOk@el>1n\adk'_M!5IF@^BV"tb/5tb??p2XOJX.Q(0$Z9^\7qV21U`_5'QNN+JT[[.1XL)l@2YS%`;eAr#XDJ)M/skht7@eSMme"7GIJakpCGJZDhA$<*5$]'.Dc#/Ci_NT+#'7LqX:(j5T$TK*E_f"q2>&JKU(@Q9l.@(+`0U\CSL\GRS4`,BBa:5EJbbr7/2M4YG'%0ikE73,0rI+>nX'!gRJA%W@Qfc=KDTGYZ;Hb/TWAcrQ&(!'>fM/_h*!Y6'26Qt6(EpF8Cn"WqH0m6YCcaFC]0Fo9FO8fWm_a/jWBP3U.ikf;3V]%9FU9HQTu#;oOIn#f)ut+U_&/)"(,i^8BY]PB9%#AHM_Ds,0i8];=N?g#'Ng5)Emr[)-P24gfCY+M+Na`sM@5H/YXmN5ncM:6*7&1AR>Y>P,^\nuUF`7VFk]oG62@;uC^439[/;),/G]7W+1RNTL`>eYiY[+]$paa0!*`:o:.(fOq4-WK/+R_t/jo3BZA+K'-3!s8eBOK9`Dk!Sqq5">O[_aR^N%UUH^uq.Eto`a)4q9/*]Fic\?c$>Ku@H?/6T^lBK1V\;*k+GKYIX5i(G394:AhXQP"$U&uuj%M+"?hg"ZN,E_>^b:$!ZQ6J+oi\)tt/5*Vgj5KRg/6K09=f`1*POjY?:gjVn%7-+PgCq"Y^_?SFT:uB+GnF$L1,:$Punpf`Rk/6KlKVFbA.9NZr*).D#4E0iNg=bkcudDX$2&3(Pb^`X)TNEC';A>LmrE":k:7$5j6Q8O?%$.n653@UnOX;ZW]R)$b_Dpk?l[N'F$5T#>QonB6"a2'6@dU?&NRONt$8rr?G6mJrAgfAulCbr'*_A_3TS[Adr[]F;@lZN]`kg"QsF(oGq3bic(@:"()j88p$CTH,0"O/PK2N5:jG^>aa]BYBL%D\@fEUL[Oj(+cu#@`=5e&9L3kDDN$E#o$#:%BtKW_M+a=P7omnBqD*O^C,+'j%B-,X`GJ\]"$q3hkMe"NO@;c,,j&Rq3Zfhp-jQ#@[IZ>_J35kHg5*WC`/QSoV`Pcp4b1Q:0tPZUa.JF48&:%Y>lu?$"m!W=e.bV!;M6c#*?N4?&L0dkCm)RSE95`9omf>#8#>PnJXZ.0P`HY4W%p5*2Loj@?r4iX,"6*Xs2&U(+`Ro"sV2,4Y^\"30+5/KNX0?&a\I8Nh]#:!(LHI_4(^a+JrLup3=g-H6iVp6Y81OQN[OD)Da#p@,@q;kOfjUJ$>1>"'aREM^h5W%2W04B%M]dR6Dg`#9lYmD5&.A\%%)Lg';V+W`aN9_Z5ZUX?W20_4o4+LJ5?#>Iej+$F4$W,8(kPQ@`^[-?8G[VI6f'&@]\encjLH(\EUm]#=!q?,g,OZ!rV-4q>\1`3Kjqe/4k1&9/12!Ybc)o._AK;`Lj>PcI/Jh8:I_1s9)]iY-[k4i!:u(Bu+h$cZddGS8BGTh<5]<(tXCenOnMk!.X1ZOdQ-2QJH4/&;7/9[X(B9U,2?2['9LL#h8f\b?jm!r+?>Eu-on[t-]YM_I'o%(3"/;dP%a10*pN5gbNh(t6%_R3+,=jLApo!4_eR:N1h&MQ.M4b/@;4@8-)e3n[iJrh(13\b;fNb=$K0>OQp+j0khPP5]IfImVq!8OJ,nglX%JQ6Y:1?Os3aPkeWW[Bqq#AK>t%`]-f0oHh,jt't%Mn#*)B66$__=.`l_f4as?D'l0+7Q)e&;,3EULXbR?NW=bT/B!S\TQ:Z;6bK7mfPU%Q*fOM+@I7?"#pY#QH#tWj`@l"iZpCP/^"`lV``(LT-C]T&o\;#6r=l*6^(0/&ecJRl&*S7>or"e6XW"pD:RK#]d?US!h)qe5jbY,!lM)dt]1T<.ZI![6ED1\s2Y*foPP,`USe0p&-$haQa,QEf,)cW:q-[,^N,]Mu]fNIA$ks@dX0qKY%HJ6X(^KB%^5tV(pQ06QqC\7;D;!KITf9ChRMMG3Q&G"Kp9'*f3F"@['bD$**i"^ljgd`RH[q?h`KR9R9LSF&\]G/&QA$h&WESjIIEL"sN):9rE@+8/@$ikfr5T&P$aO28>]^7KLou]n\=K\\e(df)$MF-+)dH]T59po/o0J<3hqZ;"+0c*R6J]Ro.+;+8jp!dZpAY+a,"k#:1I&s/_#RSZ&5p(^do,SgfX"7?C7);Ai+iHm/Q&7qQg3hj@\ZQ^73n%C@hgi3-3dptD>]Ij#X5Li0>,Le)=3YS-u>1Q7\Z-HH0%Z&I0^^hdF>2O]9g/;R48VgT+Js8i)sQ4[fB7@T]WMjqUWbqMBbhYO3rHpj(o*SbW*Bn\^gg:ID^i7`7U64$*0C<>1OM1V/G04fmJS^X5`P_*7Gr8s@Lb102_$BD>Z3$Z^kXj>ND!bO7OCF42Z_$Eg^B>KR)R*nbQ@P,+G"@_+\GfVrDCoA/R"J!92>H'oLsI5Me0q?0UHs>qM#Q$&2;=?/1(VG"DTg<7V.FDiW9i,EN+M>\QBPs]3-W4jNOi6&FKWgbpR%*ocF0'AV7Udq4;stC9$BGP?LZ5;e$NuTNpRc\\nn0`1>eXff_B)A2h%Plo["/L(;72l<"MT(s:Vb77q6h#^:.^J5Le-dQ#Cg@&>0'7[*4CJ]'=8l^kqCZ8NYLffNe;<@[Ac55VJ#:rMFVu`Se=h(HlM.-,[-Z]E!N:ShuZ)Mm^;0XlQ/Jh8llp7qFLC@sDL`%uLC:M/Q'Cqrm=sEmjB+-BY/0j&bI\o#$8sm9:=^Nnh9]@J'>R,<0.c;Xr+c.uUQhMs3B.#Et!HA?Y*^T[\RK=Wo9Ep5)CW%]?gV?.jE"/:gC1`@j0cd4TAg9$\iIit`P]JfqO8p$>b'sC(BG0HNI'`ij!?Ig?b)@gdAC[;BXqg$n!;[Tp.>25W%;T7gK^fMFOb;bdt+n\/!d/V/P%R`)uF2*>qnX3'2^E,3!YI+H:pdas4P@:tUs%mOnhpe9CKj)VX57:k7*Y$X=TC<*D`"bcFtRL7^08)-X31>S&Z<2O=,;HJe^d[c2G4u5&\SW;J+0nl)1i[I9h#itfNgXfM\R.-Vr*I_)p<.`8lJVgo%h#Z;:q-)U\BERn6MM!crB5VXf+)<*Lh-@%S:1mN%aBK%hg*HrEPeE-qW)c4R/!L7-S]]Z8*U:Ggl68<0O0K/QfU,[s3DYCsUKV(miE8C*FEkG/n+39D\-dNtb1D)D-UY=Ync+Oc9?rWB63,F]4TZ]%k_Eh^QH_9__@*B=@#jN6ZaGO#9+\/NUi``CK+mXriHA+,3_q\GW=S0bCb5mTYe\;L[=UK%eN2q^IZJ.odqaM.h$PVRQ?e3Z%4Gj\DU/$h\-b]r=SJ9Y!(Q!(U6lCINq"!3lK(C-ibs;ZTeY'&pdJU;8);BUNoJ2ma+m]-D9F^F[o&scAlf>:UFEF3kIA](C0>"W2%MVsh4GTk@SNnolX^dT^5P/6\-$7]_G+B8W7VW$Sm1IkF%\(>KuVd<"'MebD1tI&:RJU%?J*CM7?mnU5h=(ImD0YE11M?Kb/"*/14nkLm*$mLM.LWJ\A;(EKhMe]f49/J.[XGd;PNK;RDkogacPGCg]2fbc+-eq/^2I7joKgcIbL'nkm5b8<.rB'pUZDN1;b[:G_8G;'X!a\%#rH^LN&#`KsNEd`@`@be3.+H[Li0Eieb,^W,X`!U'!@^^0bkkL-7m30aMt\((_Tn+Zl*;e*4,?fe9B:kcK3Of94oQC82:A"l[ZCe0]gl2*-eq2YiZj(1E0u9lPLMWP+,$#"M/FT`/nR]@/Rf!9nm5f3,!lAR'08Hp,2u[DdK]Q!3kjQ6Hfd;_mT(*J/mcns1D3k),d#7nLdN7>iD?3LTV2D5-#"/Qr5[Ioe=`\,[P9;R"ocbk0\Nt;3WB)ZFE7^LE@rOi)LN,F@2o@1MZMV:GAnqZUM.QrC??n7b]H;dloi9eZ?rE%qgt<+o,&90#ciI]OIKh>Q'WBPAeX0/Y>du.Q$c"..JS_8.JG;H;`nG)-<10OT%dkiZ#Q]N$%TLrJo&oS5cS0b9!\G+%?e\6pAqXQ7EC"=>b[V[G7rYF*i%ss;bIm;Z^SgIF\oYR%5:*KdT+0osO`ME!N),Z>RJE_dpN\_!/)/'8h@'j%OWj[R_UXX*7$*gckc*@f1;\1m7oeF#4Y,8t%f/2W"godW@e8nY@9;W%=j0n%S4F"T/6Loa!>7A+mN-,I\89qWpe\`,W/Lp=tfM-r_D&"F\.k$ne@mN<+@AD)ZQ"L)B5"CNI933$O@ZZ@VU@ROE7$`cA5rrC$`L1[FRQ9_,P*#@UQ+f*-Pg^s$]O39;N:,+7SmhpKdUr5l[[NgdFAWqn&d!rP3J0D>&E5HWI7o\FegW9%TI#qaJE$'=m%OEqcbKA$qO9>CBNlDNQNNZ^CQ9R>/1rV8/m:I#!Yf[`T'e[2UR>;C&;/mc$+c*nfdnW(LfNSu,HH.0'lFAW@'>qgiMEosqd7,l'A_]Il8^GrbVc5-56U*<<@fh,b4Adkgi,[j'l0*]Ap^>jU="6kX8qN,*A^ouEE&?Wgj!*Z6[[,'77:a3\B$lG=W2t,*rX(-Jio4)$>NoT/E]WW:-Zrt0RIQoK)i!#G+e&g7jt\m$p_'?1oTs]E3&r[.l1Qc'K8rHCb8)qVh,i!L]T]`8sO;0LmoSN6,#i#T$T)3NY3]A0d>mC*Bd'b@1L[b!kDl40f/T\C>/Cr9$@NOk%00NbLdVEN#j*Lnk2k,<$9t"c=4i*K$klf6iaJM>ei$m?4\WcNf?&Y#ad.H3B">\E>Pq!L^@9$!M\1NbWpuSa"lXP>$r`I9'A,S1;1PH%FelV3I."eFI+"CKVb):]3?Gl'l5K0"TU@\J2fB)&N?B37Lu.)nqp!DW;8C$=TM5bAmU0P\je0G<62)LY^WD]OWXfnjD":>16o:"AN&:\fNI4E!NEPM_U2%:PS"*=!I:t4@]6pPg]ZG*T'7p3"'!$47@mnRGieuf(Gg],@kTWH>c_4Y`lOZo')'/k?@t-5XN6235V?P!c3[Sg[*[)%bO3GB;6X\)&`!YNU$m728&PR",OAY:PnJ;@5Q>s0aaCO$B`O'(Ve1SY(^duomU42D1[16S./*ILG!U(j6X?;M/@Z`i?lD?K[02]uT6-OX^\dXKmaP+FEh+J3cb/]]C_k$.[.gXp*>VY[%)U+k^Fm^-]HA$4iQ&nV,!dc7Fh;0!b;Z5l,W;)9TQB2rs^'"$+!;[[O/*n:1WK#A)^U@1:(I'fb=V42?Jq`,aTIUU\4I?'CYb!BuEt/DBJI2Vh$M0&qo">,gr*=Y\SXJ?aj*-RmGT2.M5E;P'#PflKnM\B!6R`JmNW3FDh00Yl.Y=Kag`RdheI&1l/W0J9(%->!_+H]D)Y'*[SC_V'3J6o3endstream +endobj +41 0 obj +<< +/Annots [ 37 0 R 38 0 R 39 0 R ] /Contents 49 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 44 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.784c942130a535f727be4d3a2038d627 40 0 R +>> +>> /Rotate 0 + /Trans << + +>> /Type /Page +>> +endobj +42 0 obj +<< +/PageMode /UseNone /Pages 44 0 R /Type /Catalog +>> +endobj +43 0 obj +<< +/Author () /CreationDate (D:20210116170618-03'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20210116170618-03'00') /Producer (xhtml2pdf ) + /Subject () /Title (type="text/css" alexaimephotographycars -- Maigret username search report) /Trapped /False +>> +endobj +44 0 obj +<< +/Count 5 /Kids [ 12 0 R 20 0 R 27 0 R 36 0 R 41 0 R ] /Type /Pages +>> +endobj +45 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1800 +>> +stream +Gb!#\>Ar7S'RnB3i6/QNX_Ai6]%B8%Ue;`(BX;u,[pga^:_Mlg[4R`>j(,oR8+Its7CF2Z_edCL8W!Aja)`O]VfmfGj^6gkk9!X!7rkP!Wh^-mLfWP()\OIn"mLF]]qqE'ZXYM#g6eJ?;F_X[YoUUI*s)OrW!IHPuRc1:%1IL2b/+_4Uf=!Op=D2V@h5L;/TSNX)op?E"?`*4m9[mi$RmW8mAp+)ijj:I9=%Xq^!m0H#q8'ZCn>SL,RA+JCWt.a*hsFs>_aDJLo9S]P9$WCNF_U)&j6GkfstTe\#qA8l8gKf^>*h'U%^34MCGrT(Ua!bpY)e0Z1f7tIZKLN-:O'@;oL8YjJkF6iFURI7g6H@g"$[jtjmpLsCZZ/(@tdOI+gS)eGi5rh^`rB\k-Z&:hh8T[9L*@!F9$_h$)(oP1q9lU9d#4CMJ-*(>A-oDWcfC2$`*&rWRG@I*]oXG6.LGNlg^`1M^!OP:rc+TI&[2H$(;6U]^GGURU;;NesludQlf/cr0<@W[kFokhX2*40d]g).:R)MaX4-N)M/I@^[=3X-od(9CB6'+c0-DdMjpQ-5kqo\i$P/Q-)9l@,\8@D4`C)N*d$pCm=r;@f#._gZ'nE#38/9ADC=Um(]khE8?+Q>.f0ia>2[rb_8e?Og_hnCgWa>*"V$W'F55Q96gk6CAgr(tpi\<'ZVolr/5q.Ch*@gAEm;ZuMtr6G8o^\dN!K50#"BMiZKqYulSVd7Oi01:nRER,JI<=n0O&RY?$fM$_G>*j^CBT-^TTj_It"sL"CIA5gTTGtqgZ0f\(ut#rE@IhG4Cu:]Mj4r4H]e+3=`kP-eo6lG=?AUuJBWY[badm'C@%/Ja3@HS(%M0$M5^SGGmk1*)MB=r$cRtj2mY@599@pZh-@ISk4]t!/'%WE`#E@+CYnYiVTKuf(d4:dqY?3HZhjpMgM,H8p\7>fJB.uMZW\J?'Zs7Z4O4a>">9;YW.c+QX6`k(q3L>7OlIoa$5)2,mbcl<&iKQm^QbA1VQpXQ\,>C69W(f-%H?<8Su"oE;bOU]8'S`k=>`UZNXV/E,i?Zc*dt*3cZ()9o4^.NY$cejW2L)B4;to:_Du!bZk-/21"SVRqQiI1c,h6g6.p2D6Y>YR=_$HMB`ho$j>VboUSB&j?/Wp_:B&nPEA[%)UBSNXq^76;'#inlo#'j=3FugQ2<>\M>>5_W9RTi%1tZ$TI@%9Z"g7,C9PG'[t@M+l?.0!eBgBrY*1A7iO]F$pk2c:7.ifgpQqa%g<`/Fapr[C!nUf24P(S8W-=D@?HZ4iGVI]mbQ(afFEj5;_8A?eSS:endstream +endobj +46 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1122 +>> +stream +Gb"/'bAu;j']&?q>,Ii5oTm_,9kjH+Pgn1HXs7aMgt7G:VNej!C`q\RK2'c_@E8R]h0[Gp\X%=l5k^1q^Kq>a)]*UB(gmF#+i"LAi-kn!gt&Z0hgY(cDPA7bJdEP?!BHq)Na;N"K/R%@JI[qbbZZnUIa$km(IqF]e`'Q%3YD0JdpksY_M^A4tm"Ak>pa4o&qtpM[>UhgQ$aNc!#Wp2'[KnR46E][2%IdGCJa\BI/)^Ch7`5A%i\6J-_T=RlY$=+^]3lW&dVIcrWAdQ#d#?ETbY]qPLaZnF\^.QQg?iuoZPcFD9qZ.Yc85unNfJ]U3fJ^5]ueJHd?FHQ"i1b$c!if(%P)YJ,n/mQfJ\S/%kT>qj'60NElUn9kqFTZOZ%e>J)QS#N^YO^aNd1+$k5P<">n+(EeS(1"M7^Wp^]KYB9RV?CmZ<5[!LeSf8atn<0j0uNa2r$K<@*D@Ku*9DI+ON8:n3=Hl/DN%#gQQ!tUjj`VtR]+2NH7b?Hn!nE=L@*5i8dMWn$H-,O!*^ukHs@_lmbYFm`BQ*8<8#A;dXI%gf0dBAj(nj&:@p?L4K-,Y@]iHi&_apS,a+?!2Eed&.R1]&h7t`^[9=WHa:*04%?bFjS\YJ;XL]Fe+,V\k)%DVHqE2,m<%gqb4Z'r5p+,8JPEMFNq[uJo1^<^;;.S6b=>/hMZc9_K;^G+A,tK3!YQ`V:Wm/IGt%X;j]6h1b.eaJ!'/=2d:?Ibp"H%D?RRJOb2.k3qQ3[~>endstream +endobj +47 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1554 +>> +stream +Gb!kt9lo&I&A@sBln)oj6NHm1h.!9WPOWb]7*5(_$V3T>*0O,`d^&K1]9$lXd1W:=ZJ2?@Osq#G]R@BnFrpgDIr+frB)j;HkaaG9*/5\G/obq7k8[nL!OV?q.e^T$2\Xp\4[1W?S6:#SZ<2)u1#C#MW3g4Ha>#!j^=_;Qbrj^7,[QDh4I;`kUrc%P)pgB1M&3Ij/X1QR4cq^`9JWMGda\(PX3u)C(>8fQL]uXT#R;jc+8u5A%WtK-GC+>m/AXNppK+d.jE8]N2=RtY'0rAcG7M;!-#IQ`9!5:PbK,":HZ@r]>7]&+@1ecAks1L#S$-^hO-:T?TKAC'sS&BfQ3JLa&*Cf=*c]H_I1;O5pYE[7KcN``N:`X(\W_K]PegW\]07@U\crTnW:6r[=CEADfHk7Z%HG-&'YaNB(gofL(l8gQjPe>BF3CQ#5<.^9`<5ms#**m_<6$Xd^81a$!C75>H>HdPl-?'%u'q48a'BrJdX_;cCF57J'`0H63&EH[6`TI$B+X4.kI`f<2#Hi.YJKYb5-`niAtVhb,M-2Otq4a4i1QGH,cF%?@-.>U*khnPpPO(JZUKF&4"0JZST8A&&l.eK[0$6ol4pI87,!ZE!$#:sY`.PFDFE3npMkjgQkd`LmRiGbO_CL*>u@e+Gta'^)"Uge4U0j[FBjJ5ZWr2=.`mfHdcc+tn3+/K-Jf]O-d^H!p4"_*JPWBiIk94WD[:67$j5X7+Tgg3kCVsWCA`tkJkTBc>^m)O&`8l\mTbl1rM,"c]u)(5LI,1>iqGVI3EaPf%),OnV-'>,P&@T^Gq1jnmtU>q(UgN>>0m_QkC3^Ur6^&QDM=eAYk]`]'c`OQ;]#JVb]SEghV*cZ>ds,f\>d2)R-;DU($>Zi/udFZXjh"pp1k]I0*N/m3,17E!RF5@b&h:lrBTYk2EE`'0\l+fJ<=j"pKV&pN6ArmBDk[o]nlOlT'4h?nUHGs_d%+O\S*G-0YCRIp(6Gj"W05q)^jieRf~>endstream +endobj +48 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1055 +>> +stream +Gb"/'9lo#B&A@ZcFA(?p6BYnOk*@nID't+%\s(E]H4WPr)f/G_6M^A@%6-6M%'cLo:<^NK9=o,7p1[T9JFj'o^Q&Q7HQ0>p0u*qEI=NcB^qKtRG2meAUVD'L2A+QmbTI61e"^_47Y'O*gP$lG8&W,B#f)p&p#o"4]"#*(!rEc6p:D/.-OHQ3$V#U`h@9`nL:4dMKL8%7)#+C=b58[0@+#73;:(T'F"eX>;/d"U(aWj=JtY8nGp\ne'TFL-<_JJ&+6e)$JMRSnGW:Jl"]60VF96@kZ3Z6Y_V=GfD9iiPibV^m&tM0TOs1#mGqB9jUA2M/-b-CR'd$GC,)(mO&5<$NSp#8S0!B8:ru9$J1OVs8jXOXMBiad72(k3ZLm_87\l#@.3mtPEoKRa4VdD.7NE>'Cj:8;.1MnM=uM7hJ"*C`QX6*?2"YP^Ma:\a=4:%W$rekbp<8L?'nY\$>ZAUEBocM=k>tRgC(lAb#3*S6`qf-cPEsppO)K8:['F59n(c2PmHjah?$ZjCCmMM*7:DXQg@p7JMk^CiOP"OiEI*H8bs$2p?,`TBQ[qW1OTuNRML!Ph.1qIB2<2gH(#"C%_Iie4P(5@5\&^D`=C]2*o)>u5:h6_p/RDC>-l2i[kf/)tV9:SQff)"cXHg8*gcqGIK8X%E>`F=AT*S?F>HC77.mVj"8lE(HC:q"F^jd_/`?UXHbXn1"4CqH`Of=#03(JjK4Po>oWc_jD?$g/`Z0-+b>P=XM`N9%LdYcIhA,X7r`X@ItbEmF>HImI:_:.>mLcWN^-?e=oO+^?TenSJ$T2$!pK,=;X&.8(&i"quq_u,J=~>endstream +endobj +49 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 920 +>> +stream +Gau0C>Aoub'RnB3301["Nc/;QdN6i5OXbMjY^']:Bi_3=qn&6o4oLdQ+ga$K0#+:mQFsLSH!jL_u*@W(('^/,=+\/%I_(D85b4oD#NB7k:.rN&1(q^Op]$H!6FXI.UEG>Z7K(rBJ:hn/>1@cK5mW(<1N7(V(#-gJf,a\l5&"CmQA-`%ii3on&iK3KN2K#3:B#uk[:,X'dlF[(A\kVGEE\7RBV<7U:''1O-^;p$,O]H6lbL(/t=$HZR!1=hJDcSmVMIUDAJ2afjoL%AMRolrm\#]\hAuFA7N2GP"_^`2'n"YW)M^,c$6jjsh(/\::\j3O82Q[_uZLoZ+Wp6t6bse/d?ON-13\L\)mPDtPLP\uLf!_Js#WCi&F0-UVWnOI8-P/LVk*(%!W>-G'G:t/uf/_1Hu\d2;ua'&&?cjtb+%p_"BT6-Up;\Q/d2HfA2drDgo\]Vd$WUFZ\3m5/3A(Gp1lJcB3mfZCV%%lR.20HV8Kiendstream +endobj +xref +0 50 +0000000000 65535 f +0000000073 00000 n +0000000114 00000 n +0000000221 00000 n +0000000405 00000 n +0000000575 00000 n +0000000770 00000 n +0000000882 00000 n +0000001180 00000 n +0000024284 00000 n +0000024461 00000 n +0000024658 00000 n +0000048278 00000 n +0000048645 00000 n +0000048821 00000 n +0000049021 00000 n +0000062383 00000 n +0000062551 00000 n +0000062738 00000 n +0000062910 00000 n +0000063102 00000 n +0000063475 00000 n +0000063653 00000 n +0000063852 00000 n +0000075886 00000 n +0000076057 00000 n +0000076247 00000 n +0000095261 00000 n +0000095620 00000 n +0000095794 00000 n +0000095989 00000 n +0000096165 00000 n +0000096368 00000 n +0000096543 00000 n +0000096737 00000 n +0000096910 00000 n +0000097106 00000 n +0000097444 00000 n +0000097621 00000 n +0000097809 00000 n +0000098029 00000 n +0000139089 00000 n +0000139392 00000 n +0000139462 00000 n +0000139792 00000 n +0000139881 00000 n +0000141773 00000 n +0000142987 00000 n +0000144633 00000 n +0000145780 00000 n +trailer +<< +/ID +[<2e1e10d1e0e8ca085fd10ba150a64cfe><2e1e10d1e0e8ca085fd10ba150a64cfe>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 43 0 R +/Root 42 0 R +/Size 50 +>> +startxref +146791 +%%EOF diff --git a/static/web_interface_screenshot.png b/static/web_interface_screenshot.png new file mode 100644 index 0000000..2d18c17 Binary files /dev/null and b/static/web_interface_screenshot.png differ diff --git a/static/web_interface_screenshot_start.png b/static/web_interface_screenshot_start.png new file mode 100644 index 0000000..1d19da0 Binary files /dev/null and b/static/web_interface_screenshot_start.png differ diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..397bc07 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,118 @@ +import glob +import logging +import os + +import pytest +from _pytest.mark import Mark + +from maigret.sites import MaigretDatabase +from maigret.maigret import setup_arguments_parser +from maigret.settings import Settings +from aiohttp import web + + +LOCAL_SERVER_PORT = 8080 + +CUR_PATH = os.path.dirname(os.path.realpath(__file__)) +JSON_FILE = os.path.join(CUR_PATH, '../maigret/resources/data.json') +SETTINGS_FILE = os.path.join(CUR_PATH, '../maigret/resources/settings.json') +TEST_JSON_FILE = os.path.join(CUR_PATH, 'db.json') +LOCAL_TEST_JSON_FILE = os.path.join(CUR_PATH, 'local.json') +empty_mark = Mark('', (), {}) + + +RESULTS_EXAMPLE = { + 'Reddit': { + 'cookies': None, + 'parsing_enabled': False, + 'url_main': 'https://www.reddit.com/', + 'username': 'Skyeng', + }, + 'GooglePlayStore': { + 'cookies': None, + 'http_status': 200, + 'is_similar': False, + 'parsing_enabled': False, + 'rank': 1, + 'url_main': 'https://play.google.com/store', + 'url_user': 'https://play.google.com/store/apps/developer?id=Skyeng', + 'username': 'Skyeng', + }, +} + + +def by_slow_marker(item): + return item.get_closest_marker('slow', default=empty_mark).name + + +def pytest_collection_modifyitems(items): + items.sort(key=by_slow_marker, reverse=False) + + +def get_test_reports_filenames(): + return glob.glob(os.path.join('report_*'), recursive=False) + + +def remove_test_reports(): + reports_list = get_test_reports_filenames() + for f in reports_list: + os.remove(f) + logging.error(f'Removed test reports {reports_list}') + + +@pytest.fixture(scope='session') +def default_db(): + return MaigretDatabase().load_from_file(JSON_FILE) + + +@pytest.fixture(scope='function') +def test_db(): + return MaigretDatabase().load_from_file(TEST_JSON_FILE) + + +@pytest.fixture(scope='function') +def local_test_db(): + return MaigretDatabase().load_from_file(LOCAL_TEST_JSON_FILE) + + +@pytest.fixture(autouse=True) +def reports_autoclean(): + remove_test_reports() + yield + remove_test_reports() + + +@pytest.fixture(scope='session') +def settings(): + settings = Settings() + settings.load([SETTINGS_FILE]) + return settings + + +@pytest.fixture(scope='session') +def argparser(): + settings = Settings() + settings.load([SETTINGS_FILE]) + return setup_arguments_parser(settings) + + +@pytest.fixture(scope="session") +def httpserver_listen_address(): + return ("localhost", 8989) + + +@pytest.fixture +async def cookie_test_server(): + async def handle_cookies(request): + print(f"Received cookies: {request.cookies}") + cookies_dict = {k: v for k, v in request.cookies.items()} + return web.json_response({'cookies': cookies_dict}) + + app = web.Application() + app.router.add_get('/cookies', handle_cookies) + runner = web.AppRunner(app) + await runner.setup() + server = web.TCPSite(runner, port=LOCAL_SERVER_PORT) + await server.start() + yield server + await runner.cleanup() diff --git a/tests/db.json b/tests/db.json new file mode 100644 index 0000000..91d1a51 --- /dev/null +++ b/tests/db.json @@ -0,0 +1,63 @@ +{ + "engines": { + "Discourse": { + "name": "Discourse", + "site": { + "presenseStrs": [ + "' + '' + '' + ) + + await ParsingActivator.wikimapia(site, Mock(), html=challenge) + + assert site.headers["Cookie"] == "verified=1; ngxsession=deadbeef0123456789" + + +@pytest.mark.asyncio +async def test_wikimapia_activation_replaces_stale_token(): + """A previously merged ngxsession is replaced, not duplicated, on re-activation.""" + site = Mock() + site.name = "WikimapiaSearch" + site.headers = {"Cookie": "verified=1; ngxsession=0000000000000000"} + + challenge = '' + + await ParsingActivator.wikimapia(site, Mock(), html=challenge) + + assert site.headers["Cookie"] == "verified=1; ngxsession=abcdef0123456789" + + +@pytest.mark.asyncio +async def test_wikimapia_activation_no_token_leaves_cookie_untouched(): + """If the body carries no token, the cookie header is left as-is.""" + site = Mock() + site.name = "WikimapiaSearch" + site.headers = {"Cookie": "verified=1"} + + await ParsingActivator.wikimapia(site, Mock(), html="no challenge here") + + assert site.headers["Cookie"] == "verified=1" diff --git a/tests/test_checking.py b/tests/test_checking.py new file mode 100644 index 0000000..e6bd258 --- /dev/null +++ b/tests/test_checking.py @@ -0,0 +1,989 @@ +import asyncio +from argparse import ArgumentTypeError + +from unittest.mock import Mock +import pytest + +from maigret import search +from maigret.activation import ParsingActivator +from maigret.checking import ( + extract_ids_data, + parse_usernames, + update_results_info, + get_failed_sites, + timeout_check, + debug_response_logging, + process_site_result, + check_site_for_username, +) +from maigret.error_detection import detect_error_page +from maigret.errors import CheckError +from maigret.result import MaigretCheckResult, MaigretCheckStatus +from maigret.sites import MaigretSite + + +def site_result_except(server, username, **kwargs): + query = f'id={username}' + server.expect_request('/url', query_string=query).respond_with_data(**kwargs) + + +@pytest.mark.slow +@pytest.mark.asyncio +async def test_checking_by_status_code(httpserver, local_test_db): + sites_dict = local_test_db.sites_dict + + site_result_except(httpserver, 'claimed', status=200) + site_result_except(httpserver, 'unclaimed', status=404) + + result = await search('claimed', site_dict=sites_dict, logger=Mock()) + assert result['StatusCode']['status'].is_found() is True + + result = await search('unclaimed', site_dict=sites_dict, logger=Mock()) + assert result['StatusCode']['status'].is_found() is False + + +@pytest.mark.slow +@pytest.mark.asyncio +async def test_checking_by_message_positive_full(httpserver, local_test_db): + sites_dict = local_test_db.sites_dict + + site_result_except(httpserver, 'claimed', response_data="user profile") + site_result_except(httpserver, 'unclaimed', response_data="404 not found") + + result = await search('claimed', site_dict=sites_dict, logger=Mock()) + assert result['Message']['status'].is_found() is True + + result = await search('unclaimed', site_dict=sites_dict, logger=Mock()) + assert result['Message']['status'].is_found() is False + + +@pytest.mark.slow +@pytest.mark.asyncio +async def test_checking_by_message_positive_part(httpserver, local_test_db): + sites_dict = local_test_db.sites_dict + + site_result_except(httpserver, 'claimed', response_data="profile") + site_result_except(httpserver, 'unclaimed', response_data="404") + + result = await search('claimed', site_dict=sites_dict, logger=Mock()) + assert result['Message']['status'].is_found() is True + + result = await search('unclaimed', site_dict=sites_dict, logger=Mock()) + assert result['Message']['status'].is_found() is False + + +@pytest.mark.slow +@pytest.mark.asyncio +async def test_checking_by_message_negative(httpserver, local_test_db): + sites_dict = local_test_db.sites_dict + + site_result_except(httpserver, 'claimed', response_data="") + site_result_except(httpserver, 'unclaimed', response_data="user 404") + + result = await search('claimed', site_dict=sites_dict, logger=Mock()) + assert result['Message']['status'].is_found() is False + + result = await search('unclaimed', site_dict=sites_dict, logger=Mock()) + assert result['Message']['status'].is_found() is True + + +# ---- Pure-function unit tests (no network) ---- + + +def test_detect_error_page_site_specific(): + err = detect_error_page( + "Please enable JavaScript to proceed", + 200, + {"Please enable JavaScript to proceed": "Scraping protection"}, + ignore_403=False, + ) + + assert err is not None + assert err.type == "Site-specific" + assert err.desc == "Scraping protection" + + +def test_detect_error_page_403(): + err = detect_error_page("some body", 403, {}, ignore_403=False) + assert err is not None + assert err.type == "Access denied" + + +def test_detect_error_page_403_ignored(): + # XenForo engine uses ignore403 because member-not-found also returns 403 + assert detect_error_page("not found body", 403, {}, ignore_403=True) is None + + +def test_detect_error_page_999_linkedin(): + # LinkedIn returns 999 on bot suspicion — must NOT be reported as Server error + assert detect_error_page("", 999, {}, ignore_403=False) is None + + +def test_detect_error_page_500(): + err = detect_error_page("", 503, {}, ignore_403=False) + assert err is not None + assert err.type == "Server" + assert "503" in err.desc + + +def test_detect_error_page_ok(): + assert detect_error_page("hello world", 200, {}, ignore_403=False) is None + + +def test_detect_error_page_instagram_login_wall(): + """Regression for #11: when Instagram serves the login wall (typically the + response after rate-limiting an unauthenticated client), the JSON state + contains `"routePath":"\\/"` (root path) rather than a username route. The + Instagram entry in data.json carries this marker in `errors` so the result + surfaces as UNKNOWN instead of a false AVAILABLE. + """ + instagram_errors = { + "Login • Instagram": "Login required", + '"routePath":"\\/"': "Login required (rate-limited or session blocked)", + } + login_wall_html = '...{"routePath":"\\/"},"timeSpent":...' + err = detect_error_page(login_wall_html, 200, instagram_errors, ignore_403=False) + assert err is not None + assert err.type == "Site-specific" + assert "rate-limited" in err.desc + + +def test_detect_error_page_instagram_marker_no_false_positive_on_profile(): + """The login-wall marker must NOT match a real profile page. On a claimed + user page, `routePath` carries the user-route template + (`"routePath":"\\/{username}\\/..."`); the closing-quote form + `"routePath":"\\/"` only appears on the login wall. + """ + instagram_errors = { + '"routePath":"\\/"': "Login required (rate-limited or session blocked)", + } + profile_html = ( + 'foo,"routePath":"\\/{username}\\/{?tab}\\/{?view_type}\\/",bar' + ) + err = detect_error_page(profile_html, 200, instagram_errors, ignore_403=False) + assert err is None + + +def test_parse_usernames_single_username(): + logger = Mock() + result = parse_usernames({"profile_username": "alice"}, logger) + assert result == {"alice": "username"} + + +def test_parse_usernames_list_of_usernames(): + logger = Mock() + result = parse_usernames({"other_usernames": "['alice', 'bob']"}, logger) + assert result == {"alice": "username", "bob": "username"} + + +def test_parse_usernames_malformed_list(): + logger = Mock() + result = parse_usernames({"other_usernames": "not-a-list"}, logger) + # should swallow the error and just return empty + assert result == {} + assert logger.warning.called + + +def test_parse_usernames_rejects_url_value(): + """Regression for #1403: extractors sometimes return a URL under a *_username + key; that URL must not be fed back as a candidate username.""" + logger = Mock() + result = parse_usernames( + {"instagram_username": "https://instagram.com/zuck"}, logger + ) + assert result == {} + + +def test_parse_usernames_rejects_email_value(): + """Regression for #1403: e.g. socid_extractor's 'your_username' returns an + email under a key matching the username heuristic.""" + logger = Mock() + result = parse_usernames({"your_username": "alice@example.com"}, logger) + assert result == {} + + +def test_parse_usernames_filters_urls_inside_list(): + logger = Mock() + result = parse_usernames( + {"other_usernames": "['alice', 'https://example.com/bob']"}, logger + ) + # 'alice' should survive; the URL should be dropped. + assert result == {"alice": "username"} + + +def test_parse_usernames_supported_id(): + logger = Mock() + # "telegram" is in SUPPORTED_IDS per socid_extractor + from maigret.checking import SUPPORTED_IDS + if SUPPORTED_IDS: + key = next(iter(SUPPORTED_IDS)) + result = parse_usernames({key: "some_value"}, logger) + assert result.get("some_value") == key + + +def test_update_results_info_links(): + info = {"username": "test"} + result = update_results_info( + info, + {"links": "['https://example.com/a', 'https://example.com/b']", "website": "https://example.com/w"}, + {"alice": "username"}, + ) + assert result["ids_usernames"] == {"alice": "username"} + assert "https://example.com/w" in result["ids_links"] + assert "https://example.com/a" in result["ids_links"] + + +def test_update_results_info_no_website(): + info = {} + result = update_results_info(info, {"links": "[]"}, {}) + assert result["ids_links"] == [] + + +def test_extract_ids_data_bad_html_returns_empty(): + logger = Mock() + # Random HTML should not raise — returns {} if nothing matches + out = extract_ids_data("nothing special", logger, Mock(name="Site")) + assert isinstance(out, dict) + + +def test_get_failed_sites_filters_permanent_errors(): + # Temporary errors (Request timeout, Connecting failure, etc.) are retryable → returned. + # Permanent ones (Captcha, Access denied, etc.) and results without error → filtered out. + good_status = MaigretCheckResult("u", "S1", "https://s1", MaigretCheckStatus.CLAIMED) + timeout_err = MaigretCheckResult( + "u", "S2", "https://s2", MaigretCheckStatus.UNKNOWN, + error=CheckError("Request timeout", "slow server"), + ) + captcha_err = MaigretCheckResult( + "u", "S3", "https://s3", MaigretCheckStatus.UNKNOWN, + error=CheckError("Captcha", "Cloudflare"), + ) + results = { + "S1": {"status": good_status}, + "S2": {"status": timeout_err}, + "S3": {"status": captcha_err}, + "S4": {}, # no status at all + } + failed = get_failed_sites(results) + # Only the temporary-error site is retry-worthy + assert failed == ["S2"] + + +def test_timeout_check_valid(): + assert timeout_check("2.5") == 2.5 + assert timeout_check("30") == 30.0 + + +def test_timeout_check_invalid(): + with pytest.raises(ArgumentTypeError): + timeout_check("abc") + with pytest.raises(ArgumentTypeError): + timeout_check("0") + with pytest.raises(ArgumentTypeError): + timeout_check("-1") + + +def test_debug_response_logging_writes(tmp_path, monkeypatch): + monkeypatch.chdir(tmp_path) + debug_response_logging("https://example.com", "hi", 200, None) + out = (tmp_path / "debug.log").read_text() + assert "https://example.com" in out + assert "200" in out + + +def test_debug_response_logging_no_response(tmp_path, monkeypatch): + monkeypatch.chdir(tmp_path) + debug_response_logging("https://example.com", None, None, CheckError("Timeout")) + out = (tmp_path / "debug.log").read_text() + assert "No response" in out + + +def _make_site(data_overrides=None): + base = { + "url": "https://x/{username}", + "urlMain": "https://x", + "checkType": "status_code", + "usernameClaimed": "a", + "usernameUnclaimed": "b", + } + if data_overrides: + base.update(data_overrides) + return MaigretSite("TestSite", base) + + +def test_process_site_result_no_response_returns_info(): + site = _make_site() + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a"} + out = process_site_result(None, Mock(), Mock(), info, site) + assert out is info + + +def test_process_site_result_status_already_set(): + site = _make_site() + pre = MaigretCheckResult("a", "S", "u", MaigretCheckStatus.ILLEGAL) + info = {"username": "a", "parsing_enabled": False, "status": pre, "url_user": "u"} + # Since status is already set, function returns without changes + out = process_site_result(("", 200, None), Mock(), Mock(), info, site) + assert out["status"] is pre + + +def test_process_site_result_status_code_claimed(): + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a"} + out = process_site_result(("", 200, None), Mock(), Mock(), info, site) + assert out["status"].status == MaigretCheckStatus.CLAIMED + assert out["http_status"] == 200 + + +def test_process_site_result_status_code_available(): + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a"} + out = process_site_result(("", 404, None), Mock(), Mock(), info, site) + assert out["status"].status == MaigretCheckStatus.AVAILABLE + + +def test_process_site_result_message_claimed(): + site = _make_site({ + "checkType": "message", + "presenseStrs": ["profile-name"], + "absenceStrs": ["not found"], + }) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a"} + out = process_site_result(("
Alice
", 200, None), Mock(), Mock(), info, site) + assert out["status"].status == MaigretCheckStatus.CLAIMED + + +def test_process_site_result_message_available_by_absence(): + site = _make_site({ + "checkType": "message", + "presenseStrs": ["profile-name"], + "absenceStrs": ["not found"], + }) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a"} + out = process_site_result(("

not found

profile-name too", 200, None), Mock(), Mock(), info, site) + # absence marker wins even if presence marker also appears + assert out["status"].status == MaigretCheckStatus.AVAILABLE + + +def _process_default_site(site, body, status_code=200, username="random"): + info = { + "username": username, + "parsing_enabled": False, + "url_user": site.url.replace("{username}", username), + } + return process_site_result((body, status_code, None), Mock(), Mock(), info, site) + + +def test_hackernews_requires_profile_marker(default_db): + site = default_db.sites_dict["HackerNews"] + + claimed = _process_default_site( + site, + '{"id":"blue","created":1270058024,"karma":1}', + username="blue", + ) + missing = _process_default_site(site, "null", username="random-hn-user") + generic = _process_default_site(site, "Sorry.", username="random-hn-user") + + assert claimed["status"].status == MaigretCheckStatus.CLAIMED + assert missing["status"].status == MaigretCheckStatus.AVAILABLE + assert generic["status"].status == MaigretCheckStatus.AVAILABLE + + +def test_rajce_requires_profile_marker(default_db): + site = default_db.sites_dict["Rajce.net"] + + claimed = _process_default_site( + site, + '', + username="blue", + ) + missing = _process_default_site( + site, + "Uživatel neexistuje", + status_code=410, + username="random-rajce-user", + ) + generic = _process_default_site( + site, + "Rajce.net", + username="random-rajce-user", + ) + + assert claimed["status"].status == MaigretCheckStatus.CLAIMED + assert missing["status"].status == MaigretCheckStatus.AVAILABLE + assert generic["status"].status == MaigretCheckStatus.AVAILABLE + + +def test_process_site_result_with_error_is_unknown(): + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a"} + resp = ("body", 403, CheckError("Captcha", "Cloudflare")) + out = process_site_result(resp, Mock(), Mock(), info, site) + assert out["status"].status == MaigretCheckStatus.UNKNOWN + assert out["status"].error is not None + + +def test_process_site_result_error_context_uses_instance(): + # Regression: context must render the CheckError instance, not the class. + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a"} + err = CheckError("Request timeout", "slow server") + out = process_site_result(("body", 0, err), Mock(), Mock(), info, site) + assert out["status"].context == "Request timeout error: slow server" + assert "class" not in out["status"].context + + +@pytest.mark.asyncio +async def test_check_site_for_username_awaits_activation_before_retry(monkeypatch): + site = _make_site({ + "checkType": "status_code", + "headers": {"X-Initial": "1"}, + "activation": { + "method": "test_async", + "marks": ["NEEDS_ACTIVATION"], + }, + "protocol": "https", + }) + + class FakeChecker: + def __init__(self): + self.calls = 0 + self.prepared_headers = [] + self.url = None + self.headers = None + self.allow_redirects = True + self.timeout = 0 + self.method = "get" + self.payload = None + + def prepare( + self, + url, + headers=None, + allow_redirects=True, + timeout=0, + method="get", + payload=None, + ): + self.url = url + self.headers = headers + self.allow_redirects = allow_redirects + self.timeout = timeout + self.method = method + self.payload = payload + self.prepared_headers.append(dict(headers or {})) + return None + + async def check(self): + self.calls += 1 + if self.calls == 1: + return "NEEDS_ACTIVATION", 200, None + return "activated", 200, None + + async def activate(site, logger, **kwargs): + await asyncio.sleep(0) + site.headers["X-Activated"] = "yes" + + checker = FakeChecker() + monkeypatch.setattr( + ParsingActivator, + "test_async", + staticmethod(activate), + raising=False, + ) + + options = { + "parsing": False, + "cookie_jar": None, + "forced": True, + "id_type": "username", + "timeout": 3, + "proxy": None, + "checkers": {"https": checker}, + } + + _, result = await check_site_for_username( + site, + "a", + options, + Mock(), + Mock(), + ) + + assert checker.calls == 2 + assert checker.prepared_headers[-1]["X-Activated"] == "yes" + assert result["status"].status == MaigretCheckStatus.CLAIMED + + +@pytest.mark.asyncio +async def test_concurrent_activation_uses_independent_checkers(monkeypatch): + instances = [] + + class FakeChecker: + def __init__(self): + self.calls = 0 + self.prepared_urls = [] + self.url = None + self.headers = None + self.allow_redirects = True + self.timeout = 0 + self.method = "get" + self.payload = None + instances.append(self) + + def prepare( + self, + url, + headers=None, + allow_redirects=True, + timeout=0, + method="get", + payload=None, + ): + self.url = url + self.headers = headers + self.allow_redirects = allow_redirects + self.timeout = timeout + self.method = method + self.payload = payload + self.prepared_urls.append(url) + return None + + async def check(self): + await asyncio.sleep(0) + self.calls += 1 + if self.calls == 1: + return "NEEDS_ACTIVATION", 200, None + return "activated", 200, None + + async def activate(site, logger, **kwargs): + await asyncio.sleep(0) + site.headers["X-Activated"] = site.name + + monkeypatch.setattr( + ParsingActivator, + "test_async", + staticmethod(activate), + raising=False, + ) + + options = { + "parsing": False, + "cookie_jar": None, + "forced": True, + "id_type": "username", + "timeout": 3, + "proxy": None, + "checkers": {"https": FakeChecker}, + } + first = _make_site({ + "url": "https://x/one/{username}", + "urlMain": "https://x", + "checkType": "status_code", + "activation": {"method": "test_async", "marks": ["NEEDS_ACTIVATION"]}, + "protocol": "https", + }) + first.name = "First" + second = _make_site({ + "url": "https://x/two/{username}", + "urlMain": "https://x", + "checkType": "status_code", + "activation": {"method": "test_async", "marks": ["NEEDS_ACTIVATION"]}, + "protocol": "https", + }) + second.name = "Second" + + await asyncio.gather( + check_site_for_username(first, "a", options, Mock(), Mock()), + check_site_for_username(second, "a", options, Mock(), Mock()), + ) + + assert len(instances) == 2 + assert [checker.prepared_urls for checker in instances] == [ + ["https://x/one/a", "https://x/one/a"], + ["https://x/two/a", "https://x/two/a"], + ] + + +# ---- CurlCffiChecker: TLS impersonation header sanitisation ---- + + +class _FakeCurlResponse: + def __init__(self, text="ok", status_code=200): + self.text = text + self.status_code = status_code + + +class _FakeCurlSession: + """Captures constructor + .get/.post/.head call kwargs for assertions.""" + + last_method = None + last_kwargs = None + last_init_kwargs = None + + def __init__(self, **kwargs): + type(self).last_init_kwargs = kwargs + + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc, tb): + return False + + async def get(self, **kwargs): + type(self).last_method = 'get' + type(self).last_kwargs = kwargs + return _FakeCurlResponse() + + async def post(self, **kwargs): + type(self).last_method = 'post' + type(self).last_kwargs = kwargs + return _FakeCurlResponse() + + async def head(self, **kwargs): + type(self).last_method = 'head' + type(self).last_kwargs = kwargs + return _FakeCurlResponse() + + +@pytest.fixture +def fake_curl_cffi(monkeypatch): + """Replace CurlCffiAsyncSession with a recorder. Resets capture between tests.""" + from maigret import checking + _FakeCurlSession.last_method = None + _FakeCurlSession.last_kwargs = None + _FakeCurlSession.last_init_kwargs = None + monkeypatch.setattr(checking, 'CurlCffiAsyncSession', _FakeCurlSession) + return _FakeCurlSession + + +@pytest.mark.asyncio +async def test_curl_cffi_strips_random_user_agent_to_let_impersonation_drive_ua(fake_curl_cffi): + """Regression: maigret used to forward `get_random_user_agent()` (often Chrome 91) + to curl_cffi alongside `impersonate="chrome"` (Chrome 131 TLS). Cloudflare composite + bot scoring rejects the resulting "Chrome 91 UA + Chrome 131 TLS" combo with a JS + challenge. The fix strips User-Agent and Connection from the headers passed to + curl_cffi so the impersonation default UA wins. + """ + from maigret.checking import CurlCffiChecker + + checker = CurlCffiChecker(logger=Mock(), browser_emulate='chrome') + checker.prepare( + url='https://example.com/u/test', + headers={ + "User-Agent": "Mozilla/5.0 ... Chrome/91.0.4472.124 ...", # maigret default + "Connection": "close", # maigret default + }, + allow_redirects=True, + timeout=10, + method='get', + ) + await checker.check() + + sent = fake_curl_cffi.last_kwargs + assert fake_curl_cffi.last_method == 'get' + assert sent['impersonate'] == 'chrome' + # The whole point of the fix: random UA must not leak through. + assert sent['headers'] is None or 'User-Agent' not in sent['headers'] + assert sent['headers'] is None or 'user-agent' not in {k.lower() for k in sent['headers']} + # Connection: close also stripped (interferes with impersonation defaults). + assert sent['headers'] is None or 'Connection' not in sent['headers'] + + +@pytest.mark.asyncio +async def test_curl_cffi_preserves_site_specific_headers(fake_curl_cffi): + """Site-specific headers (e.g. Content-Type for POST APIs, auth tokens, cookies) + must survive the User-Agent strip — only UA and Connection are removed. + """ + from maigret.checking import CurlCffiChecker + + checker = CurlCffiChecker(logger=Mock(), browser_emulate='chrome') + checker.prepare( + url='https://example.com/api', + headers={ + "User-Agent": "Mozilla/5.0 random", + "Connection": "close", + "Content-Type": "application/json", + "X-Csrf-Token": "abc123", + }, + allow_redirects=True, + timeout=10, + method='get', + ) + await checker.check() + + sent_headers = fake_curl_cffi.last_kwargs['headers'] + assert sent_headers is not None + assert sent_headers.get("Content-Type") == "application/json" + assert sent_headers.get("X-Csrf-Token") == "abc123" + # Sanity: stripped pair is gone + assert "User-Agent" not in sent_headers + assert "Connection" not in sent_headers + + +@pytest.mark.asyncio +async def test_curl_cffi_handles_empty_headers(fake_curl_cffi): + """No headers at all → headers kwarg is None (not an empty dict that could confuse + curl_cffi's impersonation header injection).""" + from maigret.checking import CurlCffiChecker + + checker = CurlCffiChecker(logger=Mock(), browser_emulate='chrome') + checker.prepare( + url='https://example.com/u/test', + headers=None, + allow_redirects=True, + timeout=10, + method='get', + ) + await checker.check() + + assert fake_curl_cffi.last_kwargs['headers'] is None + assert fake_curl_cffi.last_kwargs['impersonate'] == 'chrome' + + +@pytest.mark.asyncio +async def test_curl_cffi_strips_ua_for_post_too(fake_curl_cffi): + """The same UA-strip must apply on POST (e.g. Discord-style POST username probes + with `tls_fingerprint`).""" + from maigret.checking import CurlCffiChecker + + checker = CurlCffiChecker(logger=Mock(), browser_emulate='chrome') + checker.prepare( + url='https://example.com/api/check', + headers={ + "User-Agent": "Mozilla/5.0 random", + "Content-Type": "application/json", + }, + allow_redirects=True, + timeout=10, + method='post', + payload={"username": "test"}, + ) + await checker.check() + + sent = fake_curl_cffi.last_kwargs + assert fake_curl_cffi.last_method == 'post' + assert sent['json'] == {"username": "test"} + assert "User-Agent" not in sent['headers'] + assert sent['headers'].get("Content-Type") == "application/json" + + +@pytest.mark.asyncio +async def test_curl_cffi_forwards_proxy_to_async_session(fake_curl_cffi): + """Regression for #2648: when --proxy is set, the proxy URL must be + forwarded to curl_cffi's AsyncSession via the `proxies` kwarg on the + session constructor. Otherwise sites with `tls_fingerprint` protection + (Instagram, Reddit, SoundCloud, Threads, …) silently bypass the + configured proxy and connect direct. + """ + from maigret.checking import CurlCffiChecker + + proxy = "http://user:pass@proxy.example.com:8080" + checker = CurlCffiChecker(logger=Mock(), browser_emulate='chrome', proxy=proxy) + checker.prepare( + url='https://example.com/u/test', + headers=None, + allow_redirects=True, + timeout=10, + method='get', + ) + await checker.check() + + init = fake_curl_cffi.last_init_kwargs + assert init is not None, "CurlCffiAsyncSession was never constructed" + # curl_cffi expects the standard requests-style {scheme: url} mapping + assert init.get('proxies') == {'http': proxy, 'https': proxy} + + +@pytest.mark.asyncio +async def test_curl_cffi_no_proxy_omits_proxies_kwarg(fake_curl_cffi): + """Counterpart to the proxy-forwarding test: when no proxy is configured, + the `proxies` kwarg must NOT appear on the AsyncSession constructor. + Passing `proxies=None` or an empty mapping would let curl_cffi inherit + the process-wide HTTPS_PROXY env var unintentionally. + """ + from maigret.checking import CurlCffiChecker + + checker = CurlCffiChecker(logger=Mock(), browser_emulate='chrome') + checker.prepare( + url='https://example.com/u/test', + headers=None, + allow_redirects=True, + timeout=10, + method='get', + ) + await checker.check() + + init = fake_curl_cffi.last_init_kwargs + assert init is not None, "CurlCffiAsyncSession was never constructed" + assert 'proxies' not in init + + +# ----------------------------------------------------------------------------- +# DNS-resolver selection (issue #2688). When --dns-resolver=threaded is passed, +# SimpleAiohttpChecker must build the TCPConnector with an explicit +# ThreadedResolver instead of letting aiohttp default to AsyncResolver +# (aiodns/c-ares), which fails on Windows / VPN / corporate networks with +# "Could not contact DNS servers". +# ----------------------------------------------------------------------------- + + +def _capture_tcpconnector(monkeypatch): + """Replace aiohttp.TCPConnector with a constructor-recorder. Each call + appends its kwargs to the returned list. ClientSession will then receive + a never-used dummy connector — we don't actually want to open sockets in + tests.""" + from maigret import checking + captured = [] + + class _DummyConnector: + def __init__(self, *args, **kwargs): + captured.append(kwargs) + # aiohttp's ClientSession expects these on its connector + self._loop = None + self.closed = False + async def close(self): + pass + @property + def force_close(self): + return False + + monkeypatch.setattr(checking, 'TCPConnector', _DummyConnector) + return captured + + +@pytest.mark.asyncio +async def test_dns_resolver_threaded_passes_threaded_resolver_to_tcpconnector(monkeypatch): + """Issue #2688: with dns_resolver='threaded', the connector must be built + with a ThreadedResolver so DNS resolution goes through the OS, not aiodns.""" + from maigret.checking import SimpleAiohttpChecker + from aiohttp.resolver import ThreadedResolver + + captured = _capture_tcpconnector(monkeypatch) + + checker = SimpleAiohttpChecker(logger=Mock(), dns_resolver='threaded') + checker.prepare(url='https://example.com/u/test') + # The ClientSession context manager will try to use _DummyConnector and + # then make an HTTP request — we don't care about the request itself, + # only about the TCPConnector kwargs that were captured before any I/O. + try: + await checker.check() + except Exception: + pass + + assert captured, "TCPConnector was never constructed — check() bailed out earlier" + init_kwargs = captured[0] + assert 'resolver' in init_kwargs, "dns_resolver='threaded' did not forward a resolver to TCPConnector" + assert isinstance(init_kwargs['resolver'], ThreadedResolver) + + +@pytest.mark.asyncio +async def test_dns_resolver_async_omits_resolver_kwarg(monkeypatch): + """Default ('async') must NOT pass an explicit resolver, so aiohttp uses + its DefaultResolver (AsyncResolver via aiodns). Passing resolver=None + would override the smart default with an invalid value.""" + from maigret.checking import SimpleAiohttpChecker + + captured = _capture_tcpconnector(monkeypatch) + + checker = SimpleAiohttpChecker(logger=Mock()) # default + checker.prepare(url='https://example.com/u/test') + try: + await checker.check() + except Exception: + pass + + assert captured + init_kwargs = captured[0] + assert 'resolver' not in init_kwargs, ( + "Default dns_resolver='async' must not pass a resolver kwarg — let " + "aiohttp pick DefaultResolver" + ) + + +# ----------------------------------------------------------------------------- +# cookie_jar forwarding (issue #2666). SimpleAiohttpChecker.check() builds the +# ClientSession with `cookie_jar=self.cookie_jar if self.cookie_jar else None`, +# but the path was flagged `# TODO: tests` because nothing asserted the jar +# passed to the checker actually reached the outgoing ClientSession. +# ----------------------------------------------------------------------------- + + +def _capture_clientsession(monkeypatch): + """Replace aiohttp.ClientSession with a constructor-recorder so we can + assert on the kwargs it received (cookie_jar in particular) without + opening any sockets. Mirrors the _capture_tcpconnector pattern above.""" + from maigret import checking + captured = [] + + class _DummySession: + def __init__(self, *args, **kwargs): + captured.append(kwargs) + + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc, tb): + return False + + async def close(self): + pass + + monkeypatch.setattr(checking, 'ClientSession', _DummySession) + return captured + + +@pytest.mark.asyncio +async def test_cookie_jar_forwarded_to_clientsession(monkeypatch): + """Issue #2666: the cookie_jar passed to SimpleAiohttpChecker must reach + ClientSession(cookie_jar=...) on the outgoing request. Reuses the + constructor-capture pattern from the DNS-resolver tests above. + + A sentinel object stands in for the real aiohttp.CookieJar: check() only + does `self.cookie_jar if self.cookie_jar else None`, so any truthy object + proves the forwarding. Avoiding CookieJar() also sidesteps its event-loop + requirement under pytest-asyncio, keeping this a pure unit test.""" + from maigret.checking import SimpleAiohttpChecker + + captured = _capture_clientsession(monkeypatch) + _capture_tcpconnector(monkeypatch) # keep check() from opening a socket + + sentinel_jar = object() # any truthy stand-in for the CookieJar + checker = SimpleAiohttpChecker(logger=Mock(), cookie_jar=sentinel_jar) + checker.prepare(url='https://example.com/u/test') + try: + await checker.check() + except Exception: + pass + + assert captured, "ClientSession was never constructed — check() bailed out earlier" + init_kwargs = captured[0] + assert init_kwargs.get('cookie_jar') is sentinel_jar, ( + "cookie_jar passed to SimpleAiohttpChecker was not forwarded to ClientSession" + ) + + +@pytest.mark.asyncio +async def test_no_cookie_jar_passes_none_to_clientsession(monkeypatch): + """Counterpart to the above: with no cookie_jar configured, ClientSession + must receive `cookie_jar=None` (the `else None` branch), not the default + aiohttp CookieJar — maigret manages cookie persistence explicitly via + import_aiohttp_cookies and must not let aiohttp silently persist cookies.""" + from maigret.checking import SimpleAiohttpChecker + + captured = _capture_clientsession(monkeypatch) + _capture_tcpconnector(monkeypatch) + + checker = SimpleAiohttpChecker(logger=Mock()) # no cookie_jar + checker.prepare(url='https://example.com/u/test') + try: + await checker.check() + except Exception: + pass + + assert captured, "ClientSession was never constructed — check() bailed out earlier" + init_kwargs = captured[0] + assert init_kwargs.get('cookie_jar') is None, ( + "No cookie_jar configured, but ClientSession received a non-None cookie_jar" + ) diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..a85f946 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,149 @@ +"""Maigret command-line arguments parsing tests""" + +from argparse import Namespace +from typing import Dict, Any + +DEFAULT_ARGS: Dict[str, Any] = { + 'all_sites': False, + 'auto_disable': False, + 'connections': 100, + 'cookie_file': None, + 'csv': False, + 'db_file': 'resources/data.json', + 'debug': False, + 'dns_resolver': 'async', + 'diagnose': False, + 'disable_extracting': False, + 'disable_recursive_search': False, + 'folderoutput': 'reports', + 'html': False, + 'graph': False, + 'neo4j': False, + 'id_type': 'username', + 'ignore_ids_list': [], + 'info': False, + 'json': '', + 'new_site_to_submit': False, + 'no_color': False, + 'no_progressbar': False, + 'parse_url': '', + 'pdf': False, + 'permute': False, + 'print_check_errors': False, + 'print_not_found': False, + 'proxy': None, + 'reports_sorting': 'default', + 'retries': 0, + 'self_check': False, + 'site_list': [], + 'stats': False, + 'tags': '', + 'exclude_tags': '', + 'timeout': 30, + 'tor_proxy': 'socks5://127.0.0.1:9050', + 'i2p_proxy': 'http://127.0.0.1:4444', + 'top_sites': 500, + 'txt': False, + 'use_disabled_sites': False, + 'username': [], + 'verbose': False, + 'web': None, + 'with_domains': False, + 'xmind': False, + 'md': False, + 'ai': False, + 'ai_model': 'gpt-4o', + 'no_autoupdate': False, + 'force_update': False, + 'cloudflare_bypass': False, + 'keywords': [], + 'dns_resolver': 'async', +} + + +def test_args_search_mode(argparser): + args = argparser.parse_args('username'.split()) + + assert args.username == ['username'] + + want_args = dict(DEFAULT_ARGS) + want_args.update({'username': ['username']}) + + for arg in vars(args): + assert getattr(args, arg) == want_args[arg] + + +def test_args_search_mode_several_usernames(argparser): + args = argparser.parse_args('username1 username2'.split()) + + assert args.username == ['username1', 'username2'] + + want_args = dict(DEFAULT_ARGS) + want_args.update({'username': ['username1', 'username2']}) + + for arg in vars(args): + assert getattr(args, arg) == want_args[arg] + + +def test_args_self_check_mode(argparser): + args = argparser.parse_args('--self-check --site GitHub'.split()) + + want_args = dict(DEFAULT_ARGS) + want_args.update( + { + 'self_check': True, + 'site_list': ['GitHub'], + 'username': [], + } + ) + + for arg in vars(args): + assert getattr(args, arg) == want_args[arg] + + +def test_args_multiple_sites(argparser): + args = argparser.parse_args( + '--site GitHub VK --site PornHub --site Taringa,Steam'.split() + ) + + want_args = dict(DEFAULT_ARGS) + want_args.update( + { + 'site_list': ['GitHub', 'PornHub', 'Taringa,Steam'], + 'username': ['VK'], + } + ) + + for arg in vars(args): + assert getattr(args, arg) == want_args[arg] + + +def test_args_exclude_tags(argparser): + args = argparser.parse_args('--exclude-tags porn,dating username'.split()) + + want_args = dict(DEFAULT_ARGS) + want_args.update( + { + 'exclude_tags': 'porn,dating', + 'username': ['username'], + } + ) + + for arg in vars(args): + assert getattr(args, arg) == want_args[arg] + + +def test_args_tags_with_exclude_tags(argparser): + args = argparser.parse_args('--tags coding --exclude-tags porn username'.split()) + + want_args = dict(DEFAULT_ARGS) + want_args.update( + { + 'tags': 'coding', + 'exclude_tags': 'porn', + 'username': ['username'], + } + ) + + for arg in vars(args): + assert getattr(args, arg) == want_args[arg] diff --git a/tests/test_cloudflare_webgate.py b/tests/test_cloudflare_webgate.py new file mode 100644 index 0000000..fe8053e --- /dev/null +++ b/tests/test_cloudflare_webgate.py @@ -0,0 +1,303 @@ +"""Tests for the Cloudflare webgate config + checker.""" + +import json +from types import SimpleNamespace + +from unittest.mock import Mock +import pytest + +from maigret.checking import ( + CloudflareWebgateChecker, + build_cloudflare_bypass_config, +) + + +def _settings(payload): + return SimpleNamespace(cloudflare_bypass=payload) + + +def test_config_disabled_by_default(): + s = _settings({"enabled": False, "modules": [{"method": "json_api", "url": "x"}]}) + assert build_cloudflare_bypass_config(s, force_enable=False) is None + + +def test_config_force_enable_overrides_disabled_settings(): + s = _settings({"enabled": False, "modules": [{"method": "json_api", "url": "http://x:8191/v1"}]}) + cfg = build_cloudflare_bypass_config(s, force_enable=True) + assert cfg is not None + assert cfg["modules"][0]["url"] == "http://x:8191/v1" + + +def test_config_drops_invalid_modules(): + s = _settings({ + "enabled": True, + "modules": [ + {"method": "url_rewrite", "url": "http://x:8000/html"}, # missing {url} + {"method": "json_api", "url": "http://x:8191/v1"}, + {"method": "unknown", "url": "http://x"}, + ], + }) + cfg = build_cloudflare_bypass_config(s) + assert len(cfg["modules"]) == 1 + assert cfg["modules"][0]["method"] == "json_api" + + +def test_config_returns_none_when_no_valid_modules(): + s = _settings({"enabled": True, "modules": [{"method": "url_rewrite", "url": "no-placeholder"}]}) + assert build_cloudflare_bypass_config(s) is None + + +def test_config_default_trigger_protection(): + s = _settings({"enabled": True, "modules": [{"method": "json_api", "url": "http://x:8191/v1"}]}) + cfg = build_cloudflare_bypass_config(s) + assert "cf_js_challenge" in cfg["trigger_protection"] + assert "cf_firewall" in cfg["trigger_protection"] + assert "webgate" in cfg["trigger_protection"] + + +@pytest.mark.asyncio +async def test_flaresolverr_success(httpserver): + httpserver.expect_request("/v1", method="POST").respond_with_json({ + "status": "ok", + "solution": {"status": 404, "response": "missing", "url": "https://site/missing"}, + }) + config = { + "modules": [{"name": "fs", "method": "json_api", "url": httpserver.url_for("/v1")}], + "session_prefix": "test", + } + c = CloudflareWebgateChecker(logger=Mock(), config=config) + c.prepare(url="https://site/missing", timeout=5) + body, status, err = await c.check() + assert err is None + assert status == 404 # upstream status preserved — fixes status_code checktype + assert "missing" in body + + +@pytest.mark.asyncio +async def test_flaresolverr_solver_error_propagates(httpserver): + httpserver.expect_request("/v1", method="POST").respond_with_json({ + "status": "error", + "message": "Challenge could not be solved", + }) + config = { + "modules": [{"name": "fs", "method": "json_api", "url": httpserver.url_for("/v1")}], + } + c = CloudflareWebgateChecker(logger=Mock(), config=config) + c.prepare(url="https://site/page", timeout=5) + body, status, err = await c.check() + assert err is not None + assert "Challenge could not be solved" in err.desc + + +@pytest.mark.asyncio +async def test_falls_back_to_next_module_on_failure(httpserver): + # Bind only the second module — the first is unreachable. + httpserver.expect_request("/v1", method="POST").respond_with_json({ + "status": "ok", + "solution": {"status": 200, "response": "ok-from-second", "url": "https://x"}, + }) + config = { + "modules": [ + {"name": "broken", "method": "json_api", "url": "http://127.0.0.1:1/v1"}, + {"name": "good", "method": "json_api", "url": httpserver.url_for("/v1")}, + ], + } + c = CloudflareWebgateChecker(logger=Mock(), config=config) + c.prepare(url="https://site/page", timeout=5) + body, status, err = await c.check() + assert err is None + assert status == 200 + assert body == "ok-from-second" + + +@pytest.mark.asyncio +async def test_url_rewrite_returns_html_with_synthetic_200(httpserver): + # CloudflareBypassForScraping returns just the rendered HTML, no JSON wrapper. + httpserver.expect_request("/html").respond_with_data( + "profile body", status=200, content_type="text/html" + ) + config = { + "modules": [{ + "name": "cbfs", + "method": "url_rewrite", + "url": httpserver.url_for("/html") + "?url={url}", + }], + } + c = CloudflareWebgateChecker(logger=Mock(), config=config) + c.prepare(url="https://site/page", timeout=5) + body, status, err = await c.check() + assert err is None + assert status == 200 # synthetic — url_rewrite cannot recover real status + assert "profile body" in body + + +@pytest.mark.asyncio +async def test_all_modules_unreachable_actionable_error(): + """When every module fails with 'Webgate unreachable' (TCP/DNS refused at + the configured URL), the user almost certainly opted into cloudflare_bypass + and forgot to start the solver. Surface that fact explicitly so the user + knows it's their config, not a Maigret bug.""" + config = { + "modules": [ + {"name": "fs", "method": "json_api", "url": "http://127.0.0.1:1/v1"}, + {"name": "cbfs", "method": "url_rewrite", "url": "http://127.0.0.1:2/html?url={url}"}, + ], + } + c = CloudflareWebgateChecker(logger=Mock(), config=config) + c.prepare(url="https://site/page", timeout=2) + body, status, err = await c.check() + assert err is not None + assert err.type == "Webgate unavailable" + # The opt-in nature of cloudflare_bypass must be explicit — the user needs + # to understand the error came from THEIR enabling it, not Maigret guessing. + assert "cloudflare_bypass is enabled" in err.desc + assert "--cloudflare-bypass" in err.desc + # Per-module attempt summary still helps users see WHICH backend failed + assert "fs:Webgate unreachable" in err.desc + assert "cbfs:Webgate unreachable" in err.desc + # Primary URL is shown so the user knows where to look + assert "http://127.0.0.1:1/v1" in err.desc + # FlareSolverr docker hint when primary is json_api + assert "flaresolverr" in err.desc.lower() + # The escape hatch — disabling — must be mentioned for users who don't + # want to run the solver at all. + assert "disable cloudflare_bypass" in err.desc + + +@pytest.mark.asyncio +async def test_mixed_failure_modes_keep_generic_summary(monkeypatch): + """If some modules fail with a non-reachability error (e.g. the solver IS + running but returned a 500 / timeout), the 'opted-in but unreachable' + framing would be misleading. Fall back to the generic summary.""" + from maigret import checking as checking_module + from maigret.errors import CheckError + + config = { + "modules": [ + {"name": "fs", "method": "json_api", "url": "http://127.0.0.1:1/v1"}, + {"name": "cbfs", "method": "url_rewrite", "url": "http://127.0.0.1:2/html?url={url}"}, + ], + } + c = CloudflareWebgateChecker(logger=Mock(), config=config) + c.prepare(url="https://site/page", timeout=2) + + # Force the FIRST module to fail with a non-reachability error so the + # all_unreachable branch is bypassed. + async def fake_flaresolverr(self, module): + return None, 0, CheckError("Solver error", "FlareSolverr returned 500") + monkeypatch.setattr(checking_module.CloudflareWebgateChecker, + '_check_flaresolverr', fake_flaresolverr) + + body, status, err = await c.check() + assert err is not None + assert err.type == "Webgate unavailable" + # Mixed failure → must NOT use the opted-in wording (it implies "the + # solver isn't reachable", which isn't true here — it's reachable but + # broken). + assert "cloudflare_bypass is enabled" not in err.desc + # The generic summary still surfaces the failed module names + assert "fs:Solver error" in err.desc + + +@pytest.mark.asyncio +async def test_session_is_scoped_per_host(httpserver): + seen_sessions = [] + + def handler(request): + seen_sessions.append(request.get_json()["session"]) + return {"status": "ok", "solution": {"status": 200, "response": "", "url": "x"}} + + httpserver.expect_request("/v1", method="POST").respond_with_handler(handler) + config = {"modules": [{"name": "fs", "method": "json_api", "url": httpserver.url_for("/v1")}]} + c = CloudflareWebgateChecker(logger=Mock(), config=config) + + c.prepare(url="https://patreon.com/foo", timeout=5) + await c.check() + c.prepare(url="https://patreon.com/bar", timeout=5) + await c.check() + c.prepare(url="https://lomography.com/baz", timeout=5) + await c.check() + + assert seen_sessions[0] == seen_sessions[1], "same host -> same session" + assert seen_sessions[0] != seen_sessions[2], "different host -> different session" + assert "patreon.com" in seen_sessions[0] + assert "lomography.com" in seen_sessions[2] + + +@pytest.mark.asyncio +async def test_flaresolverr_request_body_shape(httpserver): + captured = {} + + def handler(request): + captured["body"] = request.get_json() + return {"status": "ok", "solution": {"status": 200, "response": "", "url": "x"}} + + httpserver.expect_request("/v1", method="POST").respond_with_handler(handler) + config = {"modules": [{"name": "fs", "method": "json_api", "url": httpserver.url_for("/v1")}]} + c = CloudflareWebgateChecker(logger=Mock(), config=config) + c.prepare(url="https://site/page", headers={"User-Agent": "test-ua/1.0"}, timeout=5) + await c.check() + body = captured["body"] + assert body["cmd"] == "request.get" + assert body["url"] == "https://site/page" + assert body["session"].startswith("maigret-") + # userAgent was removed in FlareSolverr v2; the impersonated browser's + # own UA must be used to keep TLS+UA consistent. + assert "userAgent" not in body + assert "proxy" not in body + + +@pytest.mark.asyncio +async def test_flaresolverr_proxy_string_passed_through(httpserver): + captured = {} + + def handler(request): + captured["body"] = request.get_json() + return {"status": "ok", "solution": {"status": 200, "response": "", "url": "x"}} + + httpserver.expect_request("/v1", method="POST").respond_with_handler(handler) + config = { + "modules": [ + { + "name": "fs", + "method": "json_api", + "url": httpserver.url_for("/v1"), + "proxy": "socks5://localhost:1080", + } + ] + } + c = CloudflareWebgateChecker(logger=Mock(), config=config) + c.prepare(url="https://site/page", headers={}, timeout=5) + await c.check() + assert captured["body"]["proxy"] == {"url": "socks5://localhost:1080"} + + +@pytest.mark.asyncio +async def test_flaresolverr_proxy_dict_with_credentials(httpserver): + captured = {} + + def handler(request): + captured["body"] = request.get_json() + return {"status": "ok", "solution": {"status": 200, "response": "", "url": "x"}} + + httpserver.expect_request("/v1", method="POST").respond_with_handler(handler) + config = { + "modules": [ + { + "name": "fs", + "method": "json_api", + "url": httpserver.url_for("/v1"), + "proxy": { + "url": "http://proxy.example:3128", + "username": "u", + "password": "p", + "stripped_extra": "ignored", + }, + } + ] + } + c = CloudflareWebgateChecker(logger=Mock(), config=config) + c.prepare(url="https://site/page", headers={}, timeout=5) + await c.check() + proxy = captured["body"]["proxy"] + assert proxy == {"url": "http://proxy.example:3128", "username": "u", "password": "p"} diff --git a/tests/test_data.py b/tests/test_data.py new file mode 100644 index 0000000..4fdd371 --- /dev/null +++ b/tests/test_data.py @@ -0,0 +1,104 @@ +"""Maigret data test functions""" + +import pytest +from maigret.utils import is_country_tag + + +TOP_SITES_ALEXA_RANK_LIMIT = 50 + +KNOWN_SOCIAL_DOMAINS = [ + "facebook.com", + "instagram.com", + "twitter.com", + "tiktok.com", + "vk.com", + "reddit.com", + "pinterest.com", + "snapchat.com", + "linkedin.com", + "tumblr.com", + "threads.net", + "bsky.app", + "myspace.com", + "weibo.com", + "mastodon.social", + "gab.com", + "minds.com", + "clubhouse.com", +] + + +@pytest.mark.slow +def test_tags_validity(default_db): + unknown_tags = set() + + tags = default_db._tags + + for site in default_db.sites: + for tag in filter(lambda x: not is_country_tag(x), site.tags): + if tag not in tags: + unknown_tags.add(tag) + + # make sure all tags are known + # if you see "unchecked" tag error, please, do + # maigret --db `pwd`/maigret/resources/data.json --self-check --tag unchecked --use-disabled-sites + assert unknown_tags == set() + + +@pytest.mark.slow +def test_top_sites_have_category_tag(default_db): + """Top sites by alexaRank must have at least one category tag (not just country codes).""" + sites_ranked = sorted( + [s for s in default_db.sites if s.alexa_rank], + key=lambda s: s.alexa_rank, + )[:TOP_SITES_ALEXA_RANK_LIMIT] + + missing_category = [] + for site in sites_ranked: + category_tags = [t for t in site.tags if not is_country_tag(t)] + if not category_tags: + missing_category.append(f"{site.name} (rank {site.alexa_rank})") + + assert missing_category == [], ( + f"{len(missing_category)} top-{TOP_SITES_ALEXA_RANK_LIMIT} sites have no category tag: " + + ", ".join(missing_category[:20]) + ) + + +@pytest.mark.slow +def test_no_unused_tags_in_registry(default_db): + """Every tag in the registry should be used by at least one site.""" + all_used_tags = set() + for site in default_db.sites: + for tag in site.tags: + if not is_country_tag(tag): + all_used_tags.add(tag) + + registered_tags = set(default_db._tags) + unused = registered_tags - all_used_tags + + assert unused == set(), f"Tags registered but not used by any site: {unused}" + + +@pytest.mark.slow +def test_social_networks_have_social_tag(default_db): + """Known social network domains must have the 'social' tag.""" + from urllib.parse import urlparse + + missing_social = [] + for site in default_db.sites: + url = site.url_main or "" + try: + hostname = urlparse(url).hostname or "" + except Exception: + continue + for domain in KNOWN_SOCIAL_DOMAINS: + if hostname == domain or hostname.endswith("." + domain): + if "social" not in site.tags: + missing_social.append(f"{site.name} ({domain})") + break + + assert missing_social == [], ( + f"{len(missing_social)} known social networks missing 'social' tag: " + + ", ".join(missing_social) + ) diff --git a/tests/test_db_updater.py b/tests/test_db_updater.py new file mode 100644 index 0000000..5ae2b3e --- /dev/null +++ b/tests/test_db_updater.py @@ -0,0 +1,236 @@ +"""Tests for the database auto-update system.""" + +import json +import os +import hashlib +from datetime import datetime, timezone, timedelta +from unittest.mock import patch, MagicMock + +import pytest + +from maigret.db_updater import ( + _parse_version, + _needs_check, + _is_version_compatible, + _is_update_available, + _load_state, + _save_state, + _best_local, + _now_iso, + resolve_db_path, + force_update, + CACHED_DB_PATH, + BUNDLED_DB_PATH, + STATE_PATH, + MAIGRET_HOME, +) + + +def test_parse_version(): + assert _parse_version("0.5.0") == (0, 5, 0) + assert _parse_version("1.2.3") == (1, 2, 3) + assert _parse_version("bad") == (0, 0, 0) + assert _parse_version("") == (0, 0, 0) + + +def test_needs_check_no_state(): + assert _needs_check({}, 24) is True + + +def test_needs_check_recent(): + state = {"last_check_at": _now_iso()} + assert _needs_check(state, 24) is False + + +def test_needs_check_expired(): + old_time = (datetime.now(timezone.utc) - timedelta(hours=25)).strftime("%Y-%m-%dT%H:%M:%SZ") + state = {"last_check_at": old_time} + assert _needs_check(state, 24) is True + + +def test_needs_check_corrupt(): + state = {"last_check_at": "not-a-date"} + assert _needs_check(state, 24) is True + + +def test_version_compatible(): + with patch("maigret.db_updater.__version__", "0.5.0"): + assert _is_version_compatible({"min_maigret_version": "0.5.0"}) is True + assert _is_version_compatible({"min_maigret_version": "0.4.0"}) is True + assert _is_version_compatible({"min_maigret_version": "0.6.0"}) is False + assert _is_version_compatible({}) is True # missing field = compatible + + +def test_update_available_no_cache(tmp_path): + with patch("maigret.db_updater.CACHED_DB_PATH", str(tmp_path / "nonexistent.json")): + assert _is_update_available({"updated_at": "2026-01-01T00:00:00Z"}, {}) is True + + +def test_update_available_newer(tmp_path): + cache = tmp_path / "data.json" + cache.write_text("{}") + with patch("maigret.db_updater.CACHED_DB_PATH", str(cache)): + state = {"last_meta": {"updated_at": "2026-01-01T00:00:00Z"}} + meta = {"updated_at": "2026-02-01T00:00:00Z"} + assert _is_update_available(meta, state) is True + + +def test_update_available_same(tmp_path): + cache = tmp_path / "data.json" + cache.write_text("{}") + with patch("maigret.db_updater.CACHED_DB_PATH", str(cache)): + state = {"last_meta": {"updated_at": "2026-01-01T00:00:00Z"}} + meta = {"updated_at": "2026-01-01T00:00:00Z"} + assert _is_update_available(meta, state) is False + + +def test_load_state_missing(tmp_path): + with patch("maigret.db_updater.STATE_PATH", str(tmp_path / "missing.json")): + assert _load_state() == {} + + +def test_load_state_corrupt(tmp_path): + corrupt = tmp_path / "state.json" + corrupt.write_text("not json{{{") + with patch("maigret.db_updater.STATE_PATH", str(corrupt)): + assert _load_state() == {} + + +def test_save_and_load_state(tmp_path): + state_file = tmp_path / "state.json" + with patch("maigret.db_updater.STATE_PATH", str(state_file)): + with patch("maigret.db_updater.MAIGRET_HOME", str(tmp_path)): + _save_state({"last_check_at": "2026-01-01T00:00:00Z"}) + loaded = _load_state() + assert loaded["last_check_at"] == "2026-01-01T00:00:00Z" + + +def test_best_local_with_valid_cache(tmp_path): + cache = tmp_path / "data.json" + cache.write_text('{"sites": {}, "engines": {}, "tags": []}') + with patch("maigret.db_updater.CACHED_DB_PATH", str(cache)): + assert _best_local() == str(cache) + + +def test_best_local_with_corrupt_cache(tmp_path): + cache = tmp_path / "data.json" + cache.write_text("not json") + with patch("maigret.db_updater.CACHED_DB_PATH", str(cache)): + assert _best_local() == BUNDLED_DB_PATH + + +def test_best_local_no_cache(tmp_path): + with patch("maigret.db_updater.CACHED_DB_PATH", str(tmp_path / "missing.json")): + assert _best_local() == BUNDLED_DB_PATH + + +def test_resolve_db_path_custom_url(): + result = resolve_db_path("https://example.com/db.json") + assert result == "https://example.com/db.json" + + +def test_resolve_db_path_custom_file(tmp_path): + custom_db = tmp_path / "custom" / "path.json" + custom_db.parent.mkdir(parents=True) + custom_db.write_text("{}") + result = resolve_db_path(str(custom_db)) + assert result.endswith("custom/path.json") + + +def test_resolve_db_path_no_autoupdate(tmp_path): + with patch("maigret.db_updater.CACHED_DB_PATH", str(tmp_path / "missing.json")): + result = resolve_db_path("resources/data.json", no_autoupdate=True) + assert result == BUNDLED_DB_PATH + + +def test_resolve_db_path_no_autoupdate_with_cache(tmp_path): + cache = tmp_path / "data.json" + cache.write_text('{"sites": {}, "engines": {}, "tags": []}') + with patch("maigret.db_updater.CACHED_DB_PATH", str(cache)): + result = resolve_db_path("resources/data.json", no_autoupdate=True) + assert result == str(cache) + + +@patch("maigret.db_updater._fetch_meta") +def test_resolve_db_path_network_failure(mock_fetch, tmp_path): + mock_fetch.return_value = None + with patch("maigret.db_updater.MAIGRET_HOME", str(tmp_path)): + with patch("maigret.db_updater.STATE_PATH", str(tmp_path / "state.json")): + with patch("maigret.db_updater.CACHED_DB_PATH", str(tmp_path / "missing.json")): + result = resolve_db_path("resources/data.json") + assert result == BUNDLED_DB_PATH + + +# --- force_update tests --- + + +@patch("maigret.db_updater._fetch_meta") +def test_force_update_network_failure(mock_fetch, tmp_path): + mock_fetch.return_value = None + with patch("maigret.db_updater.MAIGRET_HOME", str(tmp_path)): + with patch("maigret.db_updater.STATE_PATH", str(tmp_path / "state.json")): + assert force_update() is False + + +@patch("maigret.db_updater._fetch_meta") +def test_force_update_incompatible_version(mock_fetch, tmp_path): + mock_fetch.return_value = {"min_maigret_version": "99.0.0", "sites_count": 100} + with patch("maigret.db_updater.MAIGRET_HOME", str(tmp_path)): + with patch("maigret.db_updater.STATE_PATH", str(tmp_path / "state.json")): + assert force_update() is False + + +@patch("maigret.db_updater._download_and_verify") +@patch("maigret.db_updater._fetch_meta") +def test_force_update_success(mock_fetch, mock_download, tmp_path): + mock_fetch.return_value = { + "min_maigret_version": "0.1.0", + "sites_count": 3200, + "updated_at": "2099-01-01T00:00:00Z", + "data_url": "https://example.com/data.json", + "data_sha256": "abc123", + } + mock_download.return_value = str(tmp_path / "data.json") + with patch("maigret.db_updater.MAIGRET_HOME", str(tmp_path)): + with patch("maigret.db_updater.STATE_PATH", str(tmp_path / "state.json")): + with patch("maigret.db_updater.CACHED_DB_PATH", str(tmp_path / "missing.json")): + assert force_update() is True + state = _load_state() + assert state["last_meta"]["sites_count"] == 3200 + + +@patch("maigret.db_updater._fetch_meta") +def test_force_update_already_up_to_date(mock_fetch, tmp_path): + cache = tmp_path / "data.json" + cache.write_text('{"sites": {}, "engines": {}, "tags": []}') + state_file = tmp_path / "state.json" + state_file.write_text(json.dumps({ + "last_check_at": _now_iso(), + "last_meta": {"updated_at": "2026-01-01T00:00:00Z", "sites_count": 3000}, + })) + mock_fetch.return_value = { + "min_maigret_version": "0.1.0", + "sites_count": 3000, + "updated_at": "2026-01-01T00:00:00Z", + } + with patch("maigret.db_updater.MAIGRET_HOME", str(tmp_path)): + with patch("maigret.db_updater.STATE_PATH", str(state_file)): + with patch("maigret.db_updater.CACHED_DB_PATH", str(cache)): + assert force_update() is False + + +@patch("maigret.db_updater._download_and_verify") +@patch("maigret.db_updater._fetch_meta") +def test_force_update_download_fails(mock_fetch, mock_download, tmp_path): + mock_fetch.return_value = { + "min_maigret_version": "0.1.0", + "sites_count": 3200, + "updated_at": "2099-01-01T00:00:00Z", + "data_url": "https://example.com/data.json", + "data_sha256": "abc123", + } + mock_download.return_value = None + with patch("maigret.db_updater.MAIGRET_HOME", str(tmp_path)): + with patch("maigret.db_updater.STATE_PATH", str(tmp_path / "state.json")): + with patch("maigret.db_updater.CACHED_DB_PATH", str(tmp_path / "missing.json")): + assert force_update() is False diff --git a/tests/test_error_detection.py b/tests/test_error_detection.py new file mode 100644 index 0000000..7659197 --- /dev/null +++ b/tests/test_error_detection.py @@ -0,0 +1,38 @@ +""" +Unit tests for error page detection helpers. +""" + +from maigret.error_detection import detect_error_page +from maigret.errors import CheckError + + +def test_site_specific_error(): + err = detect_error_page( + "this page is blocked", + 200, + {"blocked": "Blocked by site"}, + ignore_403=False, + ) + + assert isinstance(err, CheckError) + assert err.type == "Site-specific" + + +def test_http_403(): + err = detect_error_page("x", 403, {}, ignore_403=False) + + assert err.type == "Access denied" + + +def test_http_500(): + err = detect_error_page("x", 500, {}, ignore_403=False) + + assert err.type == "Server" + + +def test_no_error(): + assert detect_error_page("ok", 200, {}, ignore_403=False) is None + + +def test_ignore_linkedin_999_status(): + assert detect_error_page("", 999, {}, ignore_403=False) is None diff --git a/tests/test_errors.py b/tests/test_errors.py new file mode 100644 index 0000000..1b8ba35 --- /dev/null +++ b/tests/test_errors.py @@ -0,0 +1,336 @@ +import pytest +from maigret.checking import _is_dns_error +from maigret.errors import notify_about_errors, CheckError, solution_of, threshold_for, THRESHOLD +from maigret.result import MaigretCheckResult, MaigretCheckStatus + + +def test_notify_about_errors(): + results = { + 'site1': { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.UNKNOWN, error=CheckError('Captcha') + ) + }, + 'site2': { + 'status': MaigretCheckResult( + '', + '', + '', + MaigretCheckStatus.UNKNOWN, + error=CheckError('Bot protection'), + ) + }, + 'site3': { + 'status': MaigretCheckResult( + '', + '', + '', + MaigretCheckStatus.UNKNOWN, + error=CheckError('Access denied'), + ) + }, + 'site4': { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.CLAIMED, error=None + ) + }, + } + + notifications = notify_about_errors(results, query_notify=None, show_statistics=True) + + # Notifications now carry the actionable advice as a separate 3rd tuple + # element so notify.warning can render it in normal weight (the count + # line stays bold). + expected_output = [ + ( + 'Too many errors of type "Captcha" (25.0%)', + '!', + 'Try to switch to another ip address or to use service cookies', + ), + ( + 'Too many errors of type "Bot protection" (25.0%)', + '!', + 'Try to switch to another ip address', + ), + ( + 'Too many errors of type "Access denied" (25.0%)', + '!', + "It's recommended to use --cloudflare-bypass or proxy, " + "e.g. https://vaultproxies.net/maigret", + ), + ('Verbose error statistics:', '-'), + ('Captcha: 25.0%', '!'), + ('Bot protection: 25.0%', '!'), + ('Access denied: 25.0%', '!'), + ('You can see detailed site check errors with a flag `--print-errors`', '-'), + ] + assert notifications == expected_output + + +def test_below_threshold_non_integer_percent_stays_silent(): + # 1 Captcha error out of 40 sites = 2.5%, below the 3% threshold. The raw + # fraction must be scaled to a percentage before rounding; rounding the + # fraction first turned 2.5% into 3.0% and fired a spurious warning. + results = { + 'cap': { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.UNKNOWN, error=CheckError('Captcha') + ) + } + } + for i in range(39): + results[f'ok{i}'] = { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.CLAIMED, error=None + ) + } + + notifications = notify_about_errors(results, query_notify=None) + + assert all('Captcha' not in n[0] for n in notifications), notifications + + +def test_below_threshold_rate_rounding_up_stays_silent(): + # 8 Captcha errors out of 267 sites = 2.99625%, strictly below the 3% + # threshold. The percentage must be compared raw: rounding it to 2 decimals + # before the threshold check turns 2.996% into 3.0% and fires a spurious + # "Too many errors" warning for a sub-threshold rate. + results = {} + for i in range(8): + results[f'cap{i}'] = { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.UNKNOWN, error=CheckError('Captcha') + ) + } + for i in range(259): + results[f'ok{i}'] = { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.CLAIMED, error=None + ) + } + + notifications = notify_about_errors(results, query_notify=None) + + assert all('Captcha' not in (n[0] if n else '') for n in notifications), notifications + + +# Tests for the DNS-vs-generic split of "Connecting failure" introduced for +# https://github.com/soxoj/maigret/issues/2688 — when the user's machine +# cannot reach a DNS server, the result was previously reported as plain +# "Connecting failure" with the misleading advice "decrease number of +# parallel connections" (irrelevant when the network layer is broken). + + +class _FakeDNSError(Exception): + """Stand-in for older aiohttp versions where ClientConnectorDNSError + doesn't exist. _is_dns_error must still classify these via substring.""" + + +@pytest.mark.parametrize( + "message", + [ + # exact wording from the issue #2688 trace (Windows + aiohttp 3.13) + "Cannot connect to host www.facebook.com:443 ssl:default [Could not contact DNS servers]", + # other OS / resolver wordings observed in the wild — case-insensitive + "Cannot connect to host x.example:443 ssl:default [Name or service not known]", + "[Errno 8] nodename nor servname provided, or not known", + "[Errno -3] Temporary failure in name resolution", + "getaddrinfo failed", + # mixed case must still match + "Cannot connect to host y.example:443 ssl:default [COULD NOT CONTACT DNS SERVERS]", + ], +) +def test_is_dns_error_matches_known_resolver_wordings(message): + assert _is_dns_error(_FakeDNSError(message)) is True + + +@pytest.mark.parametrize( + "message", + [ + # genuine non-DNS connection failures must NOT be misclassified + "Cannot connect to host www.example.com:443 ssl:default [Connection refused]", + "Cannot connect to host www.example.com:443 ssl:default [Network is unreachable]", + "[Errno 110] Connection timed out", + "Connection reset by peer", + ], +) +def test_is_dns_error_does_not_misfire_on_other_connection_failures(message): + assert _is_dns_error(_FakeDNSError(message)) is False + + +def test_is_dns_error_uses_subclass_when_available(): + """When aiohttp >=3.10 is installed, isinstance(ClientConnectorDNSError) + must be the primary classifier — independent of the message text, so a + DNS error with an unfamiliar wording is still caught.""" + try: + from aiohttp.client_exceptions import ClientConnectorDNSError + except ImportError: + pytest.skip("aiohttp < 3.10 — no ClientConnectorDNSError subclass to test") + + # Build a minimal ClientConnectorDNSError using its real parent signature. + # We don't want to instantiate the full aiohttp ConnectionKey — sub-class + # the exception to bypass the constructor and verify the isinstance path. + class _Sub(ClientConnectorDNSError): + def __init__(self, msg): + Exception.__init__(self, msg) + + assert _is_dns_error(_Sub("something the substring matcher would not catch")) is True + + +def test_connecting_failure_dns_has_specific_recommendation(): + """The new error class must have a DNS-specific recommendation that + does NOT mention parallel connections (the old, misleading advice), + AND must point at the actual fix (--dns-resolver threaded).""" + advice = solution_of("Connecting failure (DNS)") + assert advice # not empty + assert "DNS" in advice + # the misleading advice from the original "Connecting failure" must NOT + # leak into the DNS-class recommendation + assert "parallel connections" not in advice + # and it must point at the actual fix Maigret can offer + assert "--dns-resolver threaded" in advice + # the user-side fallbacks should also be mentioned + assert "internet connection" in advice.lower() + + +def test_dns_failures_get_their_own_recommendation_in_notifications(): + """End-to-end: a result set dominated by DNS errors must surface the + DNS-specific advice, not the generic "Connecting failure" one. The + advice now lives in a separate tuple slot so notify.warning can render + it without the bold/bright treatment applied to the count line.""" + results = { + f'site{i}': { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.UNKNOWN, + error=CheckError('Connecting failure (DNS)', 'Could not contact DNS servers'), + ) + } + for i in range(10) + } + + notifications = notify_about_errors(results, query_notify=None, show_statistics=False) + + assert notifications + first = notifications[0] + # 3-tuple now: (count line, symbol, advice) + assert len(first) == 3 + assert 'Connecting failure (DNS)' in first[0] + assert first[1] == '!' + # notify_about_errors passes the advice through .capitalize() before + # display, which lowercases everything after the first character — so + # compare case-insensitively. + advice_ci = first[2].lower() + assert 'dns resolution failed' in advice_ci + assert 'parallel connections' not in advice_ci + # The count line itself must NOT carry the advice — that's what lets + # notify.warning render the two pieces with different weights. + assert 'dns resolution failed' not in first[0].lower() + + +def test_webgate_unavailable_advice_points_at_flaresolverr_and_the_opt_out(): + """When the 'Too many errors' summary is dominated by 'Webgate + unavailable', the user almost certainly opted into cloudflare_bypass + and the solver isn't running. The advice must: + - reaffirm that cloudflare_bypass is enabled (so the user knows it's + their own config, not Maigret auto-trying it), + - give the FlareSolverr docker one-liner as the most common fix, + - mention the opt-out (disable cloudflare_bypass) for users who do + not want to run a solver at all.""" + results = { + f'cf-site{i}': { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.UNKNOWN, + error=CheckError('Webgate unavailable', 'solver at http://localhost:8191/v1 unreachable'), + ) + } + for i in range(10) + } + + notifications = notify_about_errors(results, query_notify=None, show_statistics=False) + assert notifications + first = notifications[0] + assert len(first) == 3 + assert 'Webgate unavailable' in first[0] + + advice = first[2].lower() + assert 'cloudflare_bypass is enabled' in advice + assert 'flaresolverr' in advice + # Specific docker invocation, not a vague "run a solver" + assert 'docker run' in advice + # Escape hatch: turning the feature off entirely + assert 'set `cloudflare_bypass.enabled` to false' in advice + + +# Per-error-type threshold overrides. Default is 3%; DNS failures need 10% +# because the database always contains a few sites with dead DNS records, +# and we don't want to recommend "configure your DNS" when only 3% of +# checks fail (almost certainly data rot, not the user's machine). + + +def test_default_threshold_unchanged_for_unknown_types(): + assert threshold_for('Captcha') == THRESHOLD + assert threshold_for('Bot protection') == THRESHOLD + assert threshold_for('Some unknown type') == THRESHOLD + + +def test_dns_threshold_is_higher_than_default(): + assert threshold_for('Connecting failure (DNS)') == 10 + assert threshold_for('Connecting failure (DNS)') > THRESHOLD + + +def _results_with_dns_errors(dns_count, total): + """Build a result set with `dns_count` DNS errors and (total - dns_count) + successful CLAIMED results, so the DNS error rate is exactly + dns_count/total.""" + results = {} + for i in range(dns_count): + results[f'dead-site{i}'] = { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.UNKNOWN, + error=CheckError('Connecting failure (DNS)', 'no DNS'), + ) + } + for i in range(total - dns_count): + results[f'good-site{i}'] = { + 'status': MaigretCheckResult('', '', '', MaigretCheckStatus.CLAIMED) + } + return results + + +def test_dns_errors_below_10_percent_are_silenced(): + """5% DNS error rate = a handful of dead domains in a normal batch. + Maigret must NOT bother the user with VPN/firewall troubleshooting at + this rate — it would be wrong advice for nearly every user.""" + results = _results_with_dns_errors(dns_count=5, total=100) + notifications = notify_about_errors(results, query_notify=None) + # No notification should mention DNS — the only signal would be the + # "Verbose error statistics:" block, which we did not request here. + assert all('Connecting failure (DNS)' not in (n[0] if n else '') for n in notifications) + + +def test_dns_errors_at_10_percent_or_above_fire_the_warning(): + """10% DNS error rate = systemic, almost certainly the user's resolver. + THIS is when the advice is helpful.""" + results = _results_with_dns_errors(dns_count=10, total=100) + notifications = notify_about_errors(results, query_notify=None) + assert notifications, "Expected at least one warning at 10% DNS error rate" + assert any('Connecting failure (DNS)' in n[0] for n in notifications) + + +def test_non_dns_errors_still_fire_at_3_percent(): + """The DNS threshold override must NOT change behaviour for other error + types — Captcha at 3% should still surface as before.""" + results = {} + for i in range(3): + results[f'cap{i}'] = { + 'status': MaigretCheckResult( + '', '', '', MaigretCheckStatus.UNKNOWN, + error=CheckError('Captcha', 'cf'), + ) + } + for i in range(97): + results[f'ok{i}'] = { + 'status': MaigretCheckResult('', '', '', MaigretCheckStatus.CLAIMED) + } + notifications = notify_about_errors(results, query_notify=None) + assert any('Captcha' in n[0] for n in notifications) diff --git a/tests/test_executors.py b/tests/test_executors.py new file mode 100644 index 0000000..a0961a8 --- /dev/null +++ b/tests/test_executors.py @@ -0,0 +1,46 @@ +"""Maigret checking logic test functions""" + +import pytest +import asyncio +import logging +from typing import List, Tuple, Callable +from maigret.executors import AsyncioQueueGeneratorExecutor + +logger = logging.getLogger(__name__) + + +async def func(n): + await asyncio.sleep(0.1 * (n % 3)) + return n + + +@pytest.mark.asyncio +async def test_asyncio_queue_generator_executor(): + tasks: List[Tuple[Callable, list, dict]] = [(func, [n], {}) for n in range(10)] + + executor = AsyncioQueueGeneratorExecutor(logger=logger, in_parallel=2) + results = [result async for result in executor.run(tasks)] # type: ignore[arg-type] + assert results == [0, 1, 3, 2, 4, 6, 7, 5, 9, 8] + assert executor.execution_time > 0.5 + assert executor.execution_time < 1.3 + + executor = AsyncioQueueGeneratorExecutor(logger=logger, in_parallel=3) + results = [result async for result in executor.run(tasks)] # type: ignore[arg-type] + assert results == [0, 3, 1, 4, 6, 2, 7, 9, 5, 8] + assert executor.execution_time > 0.4 + assert executor.execution_time < 1.2 + + executor = AsyncioQueueGeneratorExecutor(logger=logger, in_parallel=5) + results = [result async for result in executor.run(tasks)] # type: ignore[arg-type] + assert results in ( + [0, 3, 6, 1, 4, 7, 9, 2, 5, 8], + [0, 3, 6, 1, 4, 9, 7, 2, 5, 8], + ) + assert executor.execution_time > 0.3 + assert executor.execution_time < 1.1 + + executor = AsyncioQueueGeneratorExecutor(logger=logger, in_parallel=10) + results = [result async for result in executor.run(tasks)] # type: ignore[arg-type] + assert results == [0, 3, 6, 9, 1, 4, 7, 2, 5, 8] + assert executor.execution_time > 0.2 + assert executor.execution_time < 1.0 diff --git a/tests/test_extractors.py b/tests/test_extractors.py new file mode 100644 index 0000000..d99845c --- /dev/null +++ b/tests/test_extractors.py @@ -0,0 +1,77 @@ +""" +Unit tests for username extraction helpers. +""" + +from maigret.utils import extract_usernames +from maigret.maigret import extract_ids_from_page + +from unittest.mock import Mock, patch + + +def test_extract_username(): + logger = Mock() + + result = extract_usernames( + {"profile_username": "emily"}, + logger, + ) + + assert result == ["emily"] + + +def test_extract_list_usernames(): + logger = Mock() + + result = extract_usernames( + {"profile_usernames": "['emily','ashton']"}, + logger, + ) + + assert set(result) == {"emily", "ashton"} + + +def test_reject_invalid_username(): + logger = Mock() + + result = extract_usernames( + {"profile_username": "https.example.com/au"}, + logger, + ) + + assert result == [] + + +def test_ignore_invalid_username_list(): + logger = Mock() + + result = extract_usernames( + {"profile_usernames": "not-a-list"}, + logger, + ) + + assert result == [] + assert logger.warning.called + +def test_extract_ids_from_page_username_contract(): + logger = Mock() + + with patch("maigret.maigret.parse") as mock_parse, \ + patch("maigret.maigret.extract") as mock_extract, \ + patch("maigret.maigret.extract_usernames") as mock_usernames: + + # fake page fetch + mock_parse.return_value = ("", {}) + + # no structured IDs + mock_extract.return_value = {} + + # username detection + mock_usernames.return_value = ["emily"] + + result = extract_ids_from_page( + "https://example.com/profile", + logger, + timeout=5, + ) + + assert result == {"emily": "username"} diff --git a/tests/test_generate_changelog.py b/tests/test_generate_changelog.py new file mode 100644 index 0000000..6973531 --- /dev/null +++ b/tests/test_generate_changelog.py @@ -0,0 +1,63 @@ +"""Unit tests for the pure CHANGELOG-manipulation logic in utils/generate_changelog. + +The GitHub-fetching part (fetch_release_notes) is intentionally not tested here — +it is a thin `gh api` wrapper. Everything that decides *what the file becomes* is +pure and covered below. +""" + +from utils.generate_changelog import build_section, upsert_section + +NOTES = ( + "## What's Changed\n" + "* Fix site checks by @soxoj in https://github.com/soxoj/maigret/pull/2826\n" + "* Add Neo4j export by @soxoj in https://github.com/soxoj/maigret/pull/2774\n\n" + "**Full Changelog**: https://github.com/soxoj/maigret/compare/v0.6.1...v0.6.2" +) + + +def test_build_section_shape(): + section = build_section("0.6.2", "2026-07-01", NOTES) + assert section.startswith("## [0.6.2] - 2026-07-01\n\n## What's Changed\n") + assert section.endswith("compare/v0.6.1...v0.6.2\n") + + +def test_upsert_replaces_empty_placeholder(): + changelog = ( + "# Changelog\n\n" + "## [0.6.2] - 2026-07-01\n\n" + "## What's Changed\n\n" + "## [0.6.1] - 2026-05-15\n\n" + "## What's Changed\n" + "* old release entry\n" + ) + section = build_section("0.6.2", "2026-07-01", NOTES) + out = upsert_section(changelog, "0.6.2", section) + + # The placeholder is filled with the real notes... + assert "* Fix site checks by @soxoj" in out + # ...exactly once (no duplicate heading)... + assert out.count("## [0.6.2]") == 1 + # ...and the previous release entry is untouched. + assert "* old release entry" in out + assert out.count("## [0.6.1]") == 1 + # New entry precedes the old one. + assert out.index("## [0.6.2]") < out.index("## [0.6.1]") + + +def test_upsert_inserts_when_absent(): + changelog = "# Changelog\n\n## [0.6.1] - 2026-05-15\n\n* old\n" + section = build_section("0.7.0", "2026-08-01", NOTES) + out = upsert_section(changelog, "0.7.0", section) + + assert out.startswith("# Changelog\n") + assert out.index("## [0.7.0]") < out.index("## [0.6.1]") + assert "* old" in out + + +def test_upsert_is_idempotent(): + changelog = "# Changelog\n\n## [0.6.1] - 2026-05-15\n\n* old\n" + section = build_section("0.6.2", "2026-07-01", NOTES) + once = upsert_section(changelog, "0.6.2", section) + twice = upsert_section(once, "0.6.2", section) + assert once == twice + assert once.count("## [0.6.2]") == 1 diff --git a/tests/test_idempotent_writes.py b/tests/test_idempotent_writes.py new file mode 100644 index 0000000..79262d3 --- /dev/null +++ b/tests/test_idempotent_writes.py @@ -0,0 +1,247 @@ +"""Tests for the 'don't rewrite files unless content actually changed' logic +in utils.generate_db_meta and utils.update_site_data. The point is to keep +sites.md and db_meta.json untouched when only the embedded timestamp/date +would change — so a precommit hook doesn't end up staging a no-op diff +every time someone runs the updater. +""" + +import json +from datetime import datetime, timezone + +from utils.generate_db_meta import ( + DEFAULT_MIN_VERSION, + build_meta, + meta_payload_equals, + resolve_min_version, + write_meta_if_changed, +) +from utils.update_site_data import ( + sites_md_payload_equals, + write_sites_md_if_changed, +) + + +# --------------------------------------------------------------------------- +# generate_db_meta +# --------------------------------------------------------------------------- + + +def _write_data_json(path, sites): + with open(path, "w", encoding="utf-8") as f: + json.dump({"sites": sites}, f) + + +def test_meta_payload_equals_ignores_timestamp(): + a = {"sites_count": 10, "data_sha256": "abc", "updated_at": "2026-01-01T00:00:00Z"} + b = {"sites_count": 10, "data_sha256": "abc", "updated_at": "2027-12-31T23:59:59Z"} + assert meta_payload_equals(a, b) + + +def test_meta_payload_equals_detects_real_change(): + a = {"sites_count": 10, "data_sha256": "abc", "updated_at": "2026-01-01T00:00:00Z"} + b = {"sites_count": 11, "data_sha256": "abc", "updated_at": "2026-01-01T00:00:00Z"} + assert not meta_payload_equals(a, b) + + +def test_write_meta_creates_file_when_missing(tmp_path): + data_path = tmp_path / "data.json" + meta_path = tmp_path / "db_meta.json" + _write_data_json(data_path, {"GitHub": {}}) + + meta, written = write_meta_if_changed( + str(data_path), str(meta_path), "0.6.0", "https://example/data.json" + ) + + assert written is True + assert meta_path.exists() + on_disk = json.loads(meta_path.read_text()) + assert on_disk["sites_count"] == 1 + assert on_disk["updated_at"] == meta["updated_at"] + + +def test_write_meta_skips_when_only_timestamp_would_change(tmp_path): + data_path = tmp_path / "data.json" + meta_path = tmp_path / "db_meta.json" + _write_data_json(data_path, {"GitHub": {}}) + + # First write seeds the file with an old timestamp. + old = datetime(2026, 1, 1, tzinfo=timezone.utc) + _, written_first = write_meta_if_changed( + str(data_path), str(meta_path), "0.6.0", "https://example/data.json", now=old + ) + assert written_first is True + seeded_bytes = meta_path.read_bytes() + + # Second call with a NEW `now` but identical data.json — must be a no-op. + new = datetime(2027, 6, 15, tzinfo=timezone.utc) + _, written_second = write_meta_if_changed( + str(data_path), str(meta_path), "0.6.0", "https://example/data.json", now=new + ) + assert written_second is False + # File on disk is byte-for-byte the same — including the OLD timestamp. + assert meta_path.read_bytes() == seeded_bytes + on_disk = json.loads(meta_path.read_text()) + assert on_disk["updated_at"] == "2026-01-01T00:00:00Z" + + +def test_write_meta_writes_when_data_sha256_changes(tmp_path): + data_path = tmp_path / "data.json" + meta_path = tmp_path / "db_meta.json" + + _write_data_json(data_path, {"GitHub": {}}) + write_meta_if_changed( + str(data_path), + str(meta_path), + "0.6.0", + "https://example/data.json", + now=datetime(2026, 1, 1, tzinfo=timezone.utc), + ) + + # Real change to data.json — sha256 + sites_count both move. + _write_data_json(data_path, {"GitHub": {}, "GitLab": {}}) + new_now = datetime(2027, 6, 15, tzinfo=timezone.utc) + meta, written = write_meta_if_changed( + str(data_path), str(meta_path), "0.6.0", "https://example/data.json", now=new_now + ) + + assert written is True + on_disk = json.loads(meta_path.read_text()) + assert on_disk["sites_count"] == 2 + assert on_disk["updated_at"] == "2027-06-15T00:00:00Z" + + +def test_write_meta_writes_when_min_version_changes(tmp_path): + data_path = tmp_path / "data.json" + meta_path = tmp_path / "db_meta.json" + _write_data_json(data_path, {"GitHub": {}}) + + write_meta_if_changed( + str(data_path), + str(meta_path), + "0.5.0", + "https://example/data.json", + now=datetime(2026, 1, 1, tzinfo=timezone.utc), + ) + + _, written = write_meta_if_changed( + str(data_path), + str(meta_path), + "0.6.0", # bumped + "https://example/data.json", + now=datetime(2026, 1, 2, tzinfo=timezone.utc), + ) + + assert written is True + on_disk = json.loads(meta_path.read_text()) + assert on_disk["min_maigret_version"] == "0.6.0" + + +def test_write_meta_writes_when_existing_file_is_corrupt(tmp_path): + data_path = tmp_path / "data.json" + meta_path = tmp_path / "db_meta.json" + _write_data_json(data_path, {"GitHub": {}}) + meta_path.write_text("this is not valid json") + + _, written = write_meta_if_changed( + str(data_path), str(meta_path), "0.6.0", "https://example/data.json" + ) + + assert written is True + json.loads(meta_path.read_text()) # now parseable + + +def test_resolve_min_version_prefers_cli_value(tmp_path): + meta_path = tmp_path / "db_meta.json" + meta_path.write_text(json.dumps({"min_maigret_version": "0.6.1"})) + + assert resolve_min_version("0.9.0", str(meta_path)) == "0.9.0" + + +def test_resolve_min_version_preserves_existing_when_no_cli_value(tmp_path): + # Routine regeneration (e.g. after a version bump) must keep the existing + # floor, not raise it to the current release. + meta_path = tmp_path / "db_meta.json" + meta_path.write_text(json.dumps({"min_maigret_version": "0.5.0"})) + + assert resolve_min_version(None, str(meta_path)) == "0.5.0" + + +def test_resolve_min_version_falls_back_to_default_when_no_meta(tmp_path): + meta_path = tmp_path / "db_meta.json" # does not exist + + assert resolve_min_version(None, str(meta_path)) == DEFAULT_MIN_VERSION + + +def test_build_meta_uses_provided_now(tmp_path): + data_path = tmp_path / "data.json" + _write_data_json(data_path, {"GitHub": {}}) + fixed = datetime(2030, 7, 4, 12, 0, 0, tzinfo=timezone.utc) + + meta = build_meta(str(data_path), "0.6.0", "https://example/data.json", now=fixed) + + assert meta["updated_at"] == "2030-07-04T12:00:00Z" + + +# --------------------------------------------------------------------------- +# update_site_data +# --------------------------------------------------------------------------- + + +_SITES_MD_TEMPLATE = ( + "## List of supported sites (search methods): total 1\n\n" + "Rank data fetched from Majestic Million by domains.\n\n" + "1. [GitHub](https://github.com/)*: top 100*\n" + "\nThe list was updated at ({date})\n" + "## Statistics\n\n" + "Some stats.\n" +) + + +def test_sites_md_payload_equals_ignores_date(): + a = _SITES_MD_TEMPLATE.format(date="2026-01-01") + b = _SITES_MD_TEMPLATE.format(date="2027-12-31") + assert sites_md_payload_equals(a, b) + + +def test_sites_md_payload_equals_detects_body_change(): + a = _SITES_MD_TEMPLATE.format(date="2026-01-01") + b = a.replace("GitHub", "GitLab") + assert not sites_md_payload_equals(a, b) + + +def test_write_sites_md_creates_file_when_missing(tmp_path): + target = tmp_path / "sites.md" + content = _SITES_MD_TEMPLATE.format(date="2026-05-15") + + written = write_sites_md_if_changed(content, str(target)) + + assert written is True + assert target.read_text() == content + + +def test_write_sites_md_skips_when_only_date_would_change(tmp_path): + target = tmp_path / "sites.md" + seeded = _SITES_MD_TEMPLATE.format(date="2026-01-01") + target.write_text(seeded) + + # New content has a different date but identical body. + new_content = _SITES_MD_TEMPLATE.format(date="2027-12-31") + written = write_sites_md_if_changed(new_content, str(target)) + + assert written is False + # File untouched, including the OLD date. + assert target.read_text() == seeded + + +def test_write_sites_md_writes_when_body_changes(tmp_path): + target = tmp_path / "sites.md" + target.write_text(_SITES_MD_TEMPLATE.format(date="2026-01-01")) + + new_content = _SITES_MD_TEMPLATE.format(date="2026-01-01").replace( + "GitHub", "GitLab" + ) + written = write_sites_md_if_changed(new_content, str(target)) + + assert written is True + assert "GitLab" in target.read_text() + assert "GitHub" not in target.read_text() diff --git a/tests/test_keyword_filtering.py b/tests/test_keyword_filtering.py new file mode 100644 index 0000000..044974a --- /dev/null +++ b/tests/test_keyword_filtering.py @@ -0,0 +1,190 @@ +from unittest.mock import Mock + +from maigret.errors import CheckError +from maigret.notify import QueryNotifyPrint +from maigret.result import MaigretCheckStatus, MaigretCheckResult, KeywordMatchStatus +from maigret.sites import MaigretSite +from maigret.checking import process_site_result + + +def test_keyword_match_status_enum(): + assert KeywordMatchStatus.NO_KEYWORDS.value == "No Keywords" + assert KeywordMatchStatus.KEYWORD_FOUND.value == "Keyword Found" + assert KeywordMatchStatus.KEYWORDS_NOT_FOUND.value == "Keywords Not Found" + assert str(KeywordMatchStatus.NO_KEYWORDS) == "No Keywords" + assert str(KeywordMatchStatus.KEYWORD_FOUND) == "Keyword Found" + assert str(KeywordMatchStatus.KEYWORDS_NOT_FOUND) == "Keywords Not Found" + + +def test_result_default_keyword_fields(): + result = MaigretCheckResult( + username="test", + site_name="SITE", + site_url_user="http://example.com/test", + status=MaigretCheckStatus.CLAIMED, + ) + assert result.keywords == [] + assert result.keyword_match_status == KeywordMatchStatus.NO_KEYWORDS + + +def test_result_with_keywords_no_match(): + result = MaigretCheckResult( + username="test", + site_name="SITE", + site_url_user="http://example.com/test", + status=MaigretCheckStatus.CLAIMED, + keywords=["nothing"], + keyword_match_status=KeywordMatchStatus.KEYWORDS_NOT_FOUND, + ) + assert result.keywords == ["nothing"] + assert result.keyword_match_status == KeywordMatchStatus.KEYWORDS_NOT_FOUND + + +def test_result_with_keywords_match(): + result = MaigretCheckResult( + username="test", + site_name="SITE", + site_url_user="http://example.com/test", + status=MaigretCheckStatus.CLAIMED, + keywords=["tech", "python"], + keyword_match_status=KeywordMatchStatus.KEYWORD_FOUND, + ) + assert result.keywords == ["tech", "python"] + assert result.keyword_match_status == KeywordMatchStatus.KEYWORD_FOUND + assert result.is_found() is True + + +def test_result_json_includes_keywords(): + result = MaigretCheckResult( + username="test", + site_name="SITE", + site_url_user="http://example.com/test", + status=MaigretCheckStatus.CLAIMED, + keywords=["tech"], + keyword_match_status=KeywordMatchStatus.KEYWORD_FOUND, + ) + data = result.json() + assert data["keywords"] == ["tech"] + assert data["keyword_match_status"] == "Keyword Found" + + +def test_notify_claimed_keyword_match(): + n = QueryNotifyPrint(color=False) + result = MaigretCheckResult( + username="test", + site_name="SITE", + site_url_user="http://example.com/test", + status=MaigretCheckStatus.CLAIMED, + keywords=["tech"], + keyword_match_status=KeywordMatchStatus.KEYWORD_FOUND, + ) + assert n.update(result) == "[++] SITE: http://example.com/test" + + +def test_notify_claimed_no_keywords(): + n = QueryNotifyPrint(color=False) + result = MaigretCheckResult( + username="test", + site_name="SITE", + site_url_user="http://example.com/test", + status=MaigretCheckStatus.CLAIMED, + keywords=[], + keyword_match_status=KeywordMatchStatus.NO_KEYWORDS, + ) + assert n.update(result) == "[+] SITE: http://example.com/test" + + +def test_notify_claimed_keywords_not_found(): + n = QueryNotifyPrint(color=False) + result = MaigretCheckResult( + username="test", + site_name="SITE", + site_url_user="http://example.com/test", + status=MaigretCheckStatus.CLAIMED, + keywords=["nonexistent"], + keyword_match_status=KeywordMatchStatus.KEYWORDS_NOT_FOUND, + ) + assert n.update(result) == "[+] SITE: http://example.com/test" + + +def test_notify_available(): + n = QueryNotifyPrint(color=False) + result = MaigretCheckResult( + username="test", + site_name="SITE", + site_url_user="http://example.com/test", + status=MaigretCheckStatus.AVAILABLE, + ) + assert n.update(result) == "[-] SITE: Not found!" + + +def test_notify_unknown(): + n = QueryNotifyPrint(color=False) + result = MaigretCheckResult( + username="test", + site_name="SITE", + site_url_user="http://example.com/test", + status=MaigretCheckStatus.UNKNOWN, + ) + result.error = CheckError("Type", "Reason") + assert n.update(result) == "[?] SITE: Type error: Reason" + + +# --------------------------------------------------------------------------- +# Integration tests — exercise the keyword detection block inside +# process_site_result with real ``html_text`` and a MaigretSite object. +# --------------------------------------------------------------------------- + +def _make_site(data_overrides=None): + base = { + "url": "https://x/{username}", + "urlMain": "https://x", + "checkType": "status_code", + "usernameClaimed": "a", + "usernameUnclaimed": "b", + } + if data_overrides: + base.update(data_overrides) + return MaigretSite("TestSite", base) + + +def test_process_site_result_no_keywords_yields_no_keywords(): + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a", "keywords": []} + out = process_site_result(("python developer", 200, None), Mock(), Mock(), info, site) + assert out["status"].keyword_match_status == KeywordMatchStatus.NO_KEYWORDS + + +def test_process_site_result_keyword_found_in_html(): + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a", "keywords": ["python"]} + out = process_site_result(("I love python programming", 200, None), Mock(), Mock(), info, site) + assert out["status"].keyword_match_status == KeywordMatchStatus.KEYWORD_FOUND + + +def test_process_site_result_keyword_not_found_in_html(): + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a", "keywords": ["python"]} + out = process_site_result(("I love rust programming", 200, None), Mock(), Mock(), info, site) + assert out["status"].keyword_match_status == KeywordMatchStatus.KEYWORDS_NOT_FOUND + + +def test_process_site_result_keyword_case_insensitive(): + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a", "keywords": ["Python"]} + out = process_site_result(("I love python programming", 200, None), Mock(), Mock(), info, site) + assert out["status"].keyword_match_status == KeywordMatchStatus.KEYWORD_FOUND + + +def test_process_site_result_empty_html_yields_no_keywords(): + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a", "keywords": ["python"]} + out = process_site_result(("", 200, None), Mock(), Mock(), info, site) + assert out["status"].keyword_match_status == KeywordMatchStatus.NO_KEYWORDS + + +def test_process_site_result_keywords_one_of_many_found(): + site = _make_site({"checkType": "status_code"}) + info = {"username": "a", "parsing_enabled": False, "url_user": "https://x/a", "keywords": ["rust", "python"]} + out = process_site_result(("I love rust programming", 200, None), Mock(), Mock(), info, site) + assert out["status"].keyword_match_status == KeywordMatchStatus.KEYWORD_FOUND diff --git a/tests/test_maigret.py b/tests/test_maigret.py new file mode 100644 index 0000000..d77f11c --- /dev/null +++ b/tests/test_maigret.py @@ -0,0 +1,295 @@ +"""Maigret main module test functions""" + +import asyncio +import copy +from unittest.mock import Mock, patch + +import pytest + +from maigret.maigret import self_check, maigret +from maigret.maigret import ( + extract_ids_from_page, + extract_ids_from_results, +) +from maigret.checking import site_self_check +from maigret.sites import MaigretSite, MaigretDatabase +from maigret.result import MaigretCheckResult, MaigretCheckStatus +from tests.conftest import RESULTS_EXAMPLE + + +@pytest.mark.slow +@pytest.mark.asyncio +async def test_self_check_db(test_db): + # initalize logger to debug + logger = Mock() + + assert test_db.sites_dict['InvalidActive'].disabled is False + assert test_db.sites_dict['ValidInactive'].disabled is True + assert test_db.sites_dict['ValidActive'].disabled is False + assert test_db.sites_dict['InvalidInactive'].disabled is True + + await self_check( + test_db, test_db.sites_dict, logger, silent=False, auto_disable=True + ) + + assert test_db.sites_dict['InvalidActive'].disabled is True + assert test_db.sites_dict['ValidInactive'].disabled is False + assert test_db.sites_dict['ValidActive'].disabled is False + assert test_db.sites_dict['InvalidInactive'].disabled is True + + +@pytest.mark.slow +@pytest.mark.asyncio +async def test_self_check_no_progressbar(test_db): + """Verify that no_progressbar=True disables the alive_bar in self_check.""" + logger = Mock() + + with patch('maigret.checking.alive_bar') as mock_alive_bar: + mock_bar = Mock() + mock_alive_bar.return_value.__enter__ = Mock(return_value=mock_bar) + mock_alive_bar.return_value.__exit__ = Mock(return_value=False) + + await self_check( + test_db, test_db.sites_dict, logger, silent=True, + no_progressbar=True, + ) + + # First call is the self-check progress bar; subsequent calls are + # from inner search() invocations. + self_check_call = mock_alive_bar.call_args_list[0] + _, kwargs = self_check_call + assert kwargs.get('title') == 'Self-checking' + assert kwargs.get('disable') is True + + +@pytest.mark.slow +@pytest.mark.asyncio +async def test_self_check_progressbar_enabled_by_default(test_db): + """Verify that alive_bar is enabled by default (no_progressbar=False).""" + logger = Mock() + + with patch('maigret.checking.alive_bar') as mock_alive_bar: + mock_bar = Mock() + mock_alive_bar.return_value.__enter__ = Mock(return_value=mock_bar) + mock_alive_bar.return_value.__exit__ = Mock(return_value=False) + + await self_check( + test_db, test_db.sites_dict, logger, silent=True, + ) + + self_check_call = mock_alive_bar.call_args_list[0] + _, kwargs = self_check_call + assert kwargs.get('title') == 'Self-checking' + assert kwargs.get('disable') is False + + +@pytest.mark.asyncio +async def test_site_self_check_handles_exception(test_db): + """Verify that site_self_check catches unexpected exceptions and returns a valid result.""" + logger = Mock() + sem = asyncio.Semaphore(1) + site = test_db.sites_dict['ValidActive'] + + with patch('maigret.checking.maigret', side_effect=RuntimeError("test crash")): + result = await site_self_check(site, logger, sem, test_db) + + assert isinstance(result, dict) + assert "issues" in result + assert len(result["issues"]) > 0 + assert any("Unexpected error" in issue for issue in result["issues"]) + + +@pytest.mark.asyncio +async def test_self_check_handles_task_exception(test_db): + """Verify that self_check continues when individual site checks raise exceptions.""" + logger = Mock() + + with patch('maigret.checking.maigret', side_effect=RuntimeError("test crash")): + result = await self_check( + test_db, test_db.sites_dict, logger, silent=True, + no_progressbar=True, + ) + + assert isinstance(result, dict) + assert 'results' in result + assert len(result['results']) == len(test_db.sites_dict) + for r in result['results']: + assert 'site_name' in r + assert 'issues' in r + + +@pytest.mark.slow +@pytest.mark.skip(reason="broken, fixme") +def test_maigret_results(test_db): + logger = Mock() + + username = 'Skyeng' + loop = asyncio.get_event_loop() + results = loop.run_until_complete( + maigret(username, site_dict=test_db.sites_dict, logger=logger, timeout=30) + ) + + assert isinstance(results, dict) + + reddit_site = results['Reddit']['site'] + assert isinstance(reddit_site, MaigretSite) + + assert reddit_site.json == { + 'tags': ['news', 'social', 'us'], + 'checkType': 'status_code', + 'presenseStrs': ['totalKarma'], + 'disabled': True, + 'alexaRank': 17, + 'url': 'https://www.reddit.com/user/{username}', + 'urlMain': 'https://www.reddit.com/', + 'usernameClaimed': 'blue', + 'usernameUnclaimed': 'noonewouldeverusethis7', + } + + del results['Reddit']['site'] + del results['GooglePlayStore']['site'] + + reddit_status = results['Reddit']['status'] + assert isinstance(reddit_status, MaigretCheckResult) + assert reddit_status.status == MaigretCheckStatus.ILLEGAL + + playstore_status = results['GooglePlayStore']['status'] + assert isinstance(playstore_status, MaigretCheckResult) + assert playstore_status.status == MaigretCheckStatus.CLAIMED + + del results['Reddit']['status'] + del results['GooglePlayStore']['status'] + + assert results['Reddit'].get('future') is None + del results['GooglePlayStore']['future'] + del results['GooglePlayStore']['checker'] + + assert results == RESULTS_EXAMPLE + + +@pytest.mark.slow +def test_extract_ids_from_url(default_db): + assert default_db.extract_ids_from_url('https://www.reddit.com/user/test') == { + 'test': 'username' + } + assert default_db.extract_ids_from_url('https://vk.com/id123') == {'123': 'vk_id'} + assert default_db.extract_ids_from_url('https://vk.com/ida123') == { + 'ida123': 'username' + } + assert default_db.extract_ids_from_url( + 'https://my.mail.ru/yandex.ru/dipres8904/' + ) == {'dipres8904': 'username'} + assert default_db.extract_ids_from_url( + 'https://reviews.yandex.ru/user/adbced123' + ) == {'adbced123': 'yandex_public_id'} + + +@pytest.mark.slow +def test_extract_ids_from_page(test_db): + logger = Mock() + extract_ids_from_page('https://www.reddit.com/user/test', logger) == { + 'test': 'username' + } + + +def test_extract_ids_from_results_aggregates_usernames_and_links(default_db): + """Covers the recursive ID-extraction path flagged at maigret.py:946 + (`# TODO: tests`, `if recursive_search_enabled: extract_ids_from_results(...)`). + + The previous incarnation of this test was a bare expression + (`extract_ids_from_results(...) == {...}`) with no `assert`, so it silently + passed regardless of the return value. It also pinned the result against + `test_db` (tests/db.json), whose site set never matched the Reddit URL and + thus returned `{'test1': ...}` — silently dropping `test2`. Restored here as + a real assertion against `default_db`, which carries the Reddit URL pattern. + """ + TEST_EXAMPLE: dict = copy.deepcopy(RESULTS_EXAMPLE) + TEST_EXAMPLE['Reddit']['ids_usernames'] = {'test1': 'yandex_public_id'} + TEST_EXAMPLE['Reddit']['ids_links'] = ['https://www.reddit.com/user/test2'] + + assert extract_ids_from_results(TEST_EXAMPLE, default_db) == { + 'test1': 'yandex_public_id', + 'test2': 'username', + } + + +def test_extract_ids_from_results_merges_ids_usernames_across_sites(default_db): + """ids_usernames from every site must be merged into the result dict, + keyed by username with the per-site id type as the value.""" + example = { + 'SiteA': {'ids_usernames': {'alice': 'username', 'bob': 'telegram'}}, + 'SiteB': {'ids_usernames': {'carol': 'username'}}, + } + assert extract_ids_from_results(example, default_db) == { + 'alice': 'username', + 'bob': 'telegram', + 'carol': 'username', + } + + +def test_extract_ids_from_results_skips_empty_site_entry(default_db): + """A site whose result dict is empty (`{}`) must be skipped via + `if not dictionary: continue` rather than raising on the subsequent + `.get('ids_usernames')` / `.get('ids_links')` calls.""" + example = { + 'EmptySite': {}, + 'SiteA': {'ids_usernames': {'alice': 'username'}}, + } + assert extract_ids_from_results(example, default_db) == {'alice': 'username'} + + +def test_extract_ids_from_results_empty_input_returns_empty(default_db): + """No sites searched → no extracted ids. Guards against accidental + KeyError / iteration over None.""" + assert extract_ids_from_results({}, default_db) == {} + + +# ----------------------------------------------------------------------------- +# Ctrl+C handling (https://github.com/soxoj/maigret/issues from +# "two presses needed to exit + traceback"). The contract: +# +# 1. First Ctrl+C during a running search → cancel that search but proceed +# to report generation with whatever was collected. +# 2. Any KeyboardInterrupt that escapes to __main__.py (e.g. second Ctrl+C +# during the report write, or interrupt before the search loop runs) +# must exit with the conventional SIGINT code (130) and a one-line +# message — never a Python traceback. +# ----------------------------------------------------------------------------- + + +def test_main_entrypoint_handles_top_level_keyboard_interrupt_cleanly(): + """Verify the __main__.py wrapper around asyncio.run catches + KeyboardInterrupt and exits with code 130 + a clean message. We can't + SIGINT the test process itself without disrupting pytest's signal + handlers, so we drive __main__.py in a subprocess with asyncio.run + monkey-patched to raise KeyboardInterrupt directly.""" + import subprocess + import sys + from pathlib import Path + + repo_root = Path(__file__).resolve().parents[1] + script = ( + "import asyncio, sys, runpy\n" + # Simulate the second-Ctrl+C-during-asyncio.run path: + "def _raise(*a, **kw):\n" + " raise KeyboardInterrupt()\n" + "asyncio.run = _raise\n" + # run_module executes maigret/__main__.py with __name__ == '__main__' + "runpy.run_module('maigret', run_name='__main__')\n" + ) + result = subprocess.run( + [sys.executable, "-c", script], + capture_output=True, + text=True, + cwd=str(repo_root), + ) + # 130 is the conventional SIGINT exit code (128 + SIGINT=2) + assert result.returncode == 130, ( + f"expected exit 130, got {result.returncode}. " + f"stdout={result.stdout!r} stderr={result.stderr!r}" + ) + # The user-facing message replaces the traceback + assert "Maigret interrupted" in result.stderr + # No Python traceback may leak through + assert "Traceback" not in result.stderr + assert "KeyboardInterrupt" not in result.stderr diff --git a/tests/test_notify.py b/tests/test_notify.py new file mode 100644 index 0000000..fb61851 --- /dev/null +++ b/tests/test_notify.py @@ -0,0 +1,121 @@ +from colorama import Fore, Style + +from maigret.errors import CheckError +from maigret.notify import QueryNotifyPrint +from maigret.result import MaigretCheckStatus, MaigretCheckResult + + +def test_notify_illegal(): + n = QueryNotifyPrint(color=False) + + assert ( + n.update( + MaigretCheckResult( + username="test", + status=MaigretCheckStatus.ILLEGAL, + site_name="TEST_SITE", + site_url_user="http://example.com/test", + ) + ) + == "[-] TEST_SITE: Illegal Username Format For This Site!" + ) + + +def test_notify_claimed(): + n = QueryNotifyPrint(color=False) + + assert ( + n.update( + MaigretCheckResult( + username="test", + status=MaigretCheckStatus.CLAIMED, + site_name="TEST_SITE", + site_url_user="http://example.com/test", + ) + ) + == "[+] TEST_SITE: http://example.com/test" + ) + + +def test_notify_available(): + n = QueryNotifyPrint(color=False) + + assert ( + n.update( + MaigretCheckResult( + username="test", + status=MaigretCheckStatus.AVAILABLE, + site_name="TEST_SITE", + site_url_user="http://example.com/test", + ) + ) + == "[-] TEST_SITE: Not found!" + ) + + +def test_notify_unknown(): + n = QueryNotifyPrint(color=False) + result = MaigretCheckResult( + username="test", + status=MaigretCheckStatus.UNKNOWN, + site_name="TEST_SITE", + site_url_user="http://example.com/test", + ) + result.error = CheckError('Type', 'Reason') + + assert n.update(result) == "[?] TEST_SITE: Type error: Reason" + + +# `warning(message, symbol, advice=None)` was added so that the "Too many +# errors..." summary can render the count line bold and the advice in +# normal weight. The pieces must stay visually distinct because the advice +# is multi-line guidance, not part of the alarm. + + +def _capture_warning_string(monkeypatch, **warning_kwargs): + """Patch builtins.print so we capture the *exact* string warning passed — + independent of colorama's terminal/TTY heuristics, which strip ANSI in + capsys mode. We care about what notify generated, not what colorama + decided to do with it on a captured pipe.""" + captured = [] + import builtins + monkeypatch.setattr(builtins, 'print', lambda *a, **kw: captured.append(a[0] if a else '')) + n = QueryNotifyPrint(color=warning_kwargs.pop('color', True)) + n.warning(**warning_kwargs) + assert captured, "warning() did not call print()" + return captured[0] + + +def test_warning_no_advice_renders_as_single_yellow_bold_line(monkeypatch): + out = _capture_warning_string( + monkeypatch, color=True, message='something happened', symbol='!', + ) + # Existing behaviour preserved for the no-advice path + assert out == Style.BRIGHT + Fore.YELLOW + '[!] something happened' + + +def test_warning_with_advice_keeps_header_bold_and_advice_normal(monkeypatch): + """Advice must come after Style.NORMAL so terminals stop boldfacing it. + The Fore.YELLOW colour stays — the visual cue is weight, not colour.""" + out = _capture_warning_string( + monkeypatch, color=True, message='count line', symbol='!', advice='do the thing', + ) + # Header is bold... + assert out.startswith(Style.BRIGHT + Fore.YELLOW + '[!] count line') + # ...advice is preceded by Style.NORMAL so the boldface ends before it + assert Style.NORMAL + '. do the thing' in out + # ...and the whole line resets all SGR state at the end so no styling + # leaks into the next print + assert out.endswith(Style.RESET_ALL) + + +def test_warning_with_advice_no_color_uses_plain_dot_separator(monkeypatch): + """In no-colour mode the visual distinction is impossible to render, so + a plain ". " separator between the count line and the advice is enough. + No ANSI codes must leak into the output.""" + out = _capture_warning_string( + monkeypatch, color=False, message='count line', symbol='!', advice='do the thing', + ) + assert out == '[!] count line. do the thing' + # Defence in depth: no escape codes survived the no-colour branch + assert '\x1b[' not in out diff --git a/tests/test_permutator.py b/tests/test_permutator.py new file mode 100644 index 0000000..8b466cb --- /dev/null +++ b/tests/test_permutator.py @@ -0,0 +1,50 @@ +import pytest +from maigret.permutator import Permute + + +def test_gather_strict(): + elements = {'a': 1, 'b': 2} + permute = Permute(elements) + result = permute.gather(method="strict") + expected = { + 'a_b': 1, + 'b_a': 2, + 'a-b': 1, + 'b-a': 2, + 'a.b': 1, + 'b.a': 2, + 'ab': 1, + 'ba': 2, + '_ab': 1, + 'ab_': 1, + '_ba': 2, + 'ba_': 2, + } + assert result == expected + + +def test_gather_all(): + elements = {'a': 1, 'b': 2} + permute = Permute(elements) + result = permute.gather(method="all") + expected = { + 'a': 1, + '_a': 1, + 'a_': 1, + 'b': 2, + '_b': 2, + 'b_': 2, + 'a_b': 1, + 'b_a': 2, + 'a-b': 1, + 'b-a': 2, + 'a.b': 1, + 'b.a': 2, + 'ab': 1, + 'ba': 2, + '_ab': 1, + 'ab_': 1, + '_ba': 2, + 'ba_': 2, + } + assert result == expected diff --git a/tests/test_report.py b/tests/test_report.py new file mode 100644 index 0000000..50603ce --- /dev/null +++ b/tests/test_report.py @@ -0,0 +1,929 @@ +"""Maigret reports test functions""" + +import copy +import json +import os +import subprocess +import sys +import textwrap +import pytest +from io import StringIO + +import xmind # type: ignore[import-untyped] +from jinja2 import Template +from markupsafe import escape + +from maigret.report import ( + filter_supposed_data, + sort_report_by_data_points, + _md_format_value, + generate_csv_report, + generate_txt_report, + save_csv_report, + save_txt_report, + save_json_report, + save_markdown_report, + save_xmind_report, + save_html_report, + save_pdf_report, + generate_report_template, + generate_report_context, + generate_json_report, + get_plaintext_report, + _graph_to_cypher, +) +from maigret.errors import CheckError +from maigret.result import MaigretCheckResult, MaigretCheckStatus +from maigret.sites import MaigretSite + + +GOOD_RESULT = MaigretCheckResult('', '', '', MaigretCheckStatus.CLAIMED) +BAD_RESULT = MaigretCheckResult('', '', '', MaigretCheckStatus.AVAILABLE) + +EXAMPLE_RESULTS = { + 'GitHub': { + 'username': 'test', + 'parsing_enabled': True, + 'url_main': 'https://www.github.com/', + 'url_user': 'https://www.github.com/test', + 'status': MaigretCheckResult( + 'test', + 'GitHub', + 'https://www.github.com/test', + MaigretCheckStatus.CLAIMED, + tags=['test_tag'], + ), + 'http_status': 200, + 'is_similar': False, + 'rank': 78, + 'site': MaigretSite('test', {}), + } +} + +BROKEN_RESULTS = { + 'GitHub': { + 'username': 'test', + 'parsing_enabled': True, + 'url_main': 'https://www.github.com/', + 'url_user': 'https://www.github.com/test', + 'http_status': 200, + 'is_similar': False, + 'rank': 78, + 'site': MaigretSite('test', {}), + } +} + +ERROR_RESULTS = { + 'GitHub': { + 'username': 'test', + 'parsing_enabled': True, + 'url_main': 'https://www.github.com/', + 'url_user': 'https://www.github.com/test', + 'status': MaigretCheckResult( + 'test', + 'GitHub', + 'https://www.github.com/test', + MaigretCheckStatus.UNKNOWN, + error=CheckError('Request timeout', 'slow server'), + ), + 'http_status': 0, + 'is_similar': False, + 'rank': 78, + 'site': MaigretSite('test', {}), + } +} + +GOOD_500PX_RESULT = copy.deepcopy(GOOD_RESULT) +GOOD_500PX_RESULT.tags = ['photo', 'us', 'global'] +GOOD_500PX_RESULT.ids_data = { + "uid": "dXJpOm5vZGU6VXNlcjoyNjQwMzQxNQ==", + "legacy_id": "26403415", + "username": "alexaimephotographycars", + "name": "Alex Aim\u00e9", + "website": "www.flickr.com/photos/alexaimephotography/", + "facebook_link": " www.instagram.com/street.reality.photography/", + "instagram_username": "alexaimephotography", + "twitter_username": "Alexaimephotogr", +} + +GOOD_REDDIT_RESULT = copy.deepcopy(GOOD_RESULT) +GOOD_REDDIT_RESULT.tags = ['news', 'us'] +GOOD_REDDIT_RESULT.ids_data = { + "reddit_id": "t5_1nytpy", + "reddit_username": "alexaimephotography", + "fullname": "alexaimephotography", + "image": "https://styles.redditmedia.com/t5_1nytpy/styles/profileIcon_7vmhdwzd3g931.jpg?width=256&height=256&crop=256:256,smart&frame=1&s=4f355f16b4920844a3f4eacd4237a7bf76b2e97e", + "is_employee": "False", + "is_nsfw": "False", + "is_mod": "True", + "is_following": "True", + "has_user_profile": "True", + "hide_from_robots": "False", + "created_at": "2019-07-10 12:20:03", + "total_karma": "53959", + "post_karma": "52738", +} + +GOOD_IG_RESULT = copy.deepcopy(GOOD_RESULT) +GOOD_IG_RESULT.tags = ['photo', 'global'] +GOOD_IG_RESULT.ids_data = { + "instagram_username": "alexaimephotography", + "fullname": "Alexaimephotography", + "id": "6828488620", + "image": "https://scontent-hel3-1.cdninstagram.com/v/t51.2885-19/s320x320/95420076_1169632876707608_8741505804647006208_n.jpg?_nc_ht=scontent-hel3-1.cdninstagram.com&_nc_ohc=jd87OUGsX4MAX_Ym5GX&tp=1&oh=0f42badd68307ba97ec7fb1ef7b4bfd4&oe=601E5E6F", + "bio": "Photographer \nChild of fine street arts", + "external_url": "https://www.flickr.com/photos/alexaimephotography2020/", +} + +GOOD_TWITTER_RESULT = copy.deepcopy(GOOD_RESULT) +GOOD_TWITTER_RESULT.tags = ['social', 'us'] + +TEST = [ + ( + 'alexaimephotographycars', + 'username', + { + '500px': { + 'username': 'alexaimephotographycars', + 'parsing_enabled': True, + 'url_main': 'https://500px.com/', + 'url_user': 'https://500px.com/p/alexaimephotographycars', + 'ids_usernames': { + 'alexaimephotographycars': 'username', + 'alexaimephotography': 'username', + 'Alexaimephotogr': 'username', + }, + 'status': GOOD_500PX_RESULT, + 'http_status': 200, + 'is_similar': False, + 'rank': 2981, + }, + 'Reddit': { + 'username': 'alexaimephotographycars', + 'parsing_enabled': True, + 'url_main': 'https://www.reddit.com/', + 'url_user': 'https://www.reddit.com/user/alexaimephotographycars', + 'status': BAD_RESULT, + 'http_status': 404, + 'is_similar': False, + 'rank': 17, + }, + 'Twitter': { + 'username': 'alexaimephotographycars', + 'parsing_enabled': True, + 'url_main': 'https://www.twitter.com/', + 'url_user': 'https://twitter.com/alexaimephotographycars', + 'status': BAD_RESULT, + 'http_status': 400, + 'is_similar': False, + 'rank': 55, + }, + 'Instagram': { + 'username': 'alexaimephotographycars', + 'parsing_enabled': True, + 'url_main': 'https://www.instagram.com/', + 'url_user': 'https://www.instagram.com/alexaimephotographycars', + 'status': BAD_RESULT, + 'http_status': 404, + 'is_similar': False, + 'rank': 29, + }, + }, + ), + ( + 'alexaimephotography', + 'username', + { + '500px': { + 'username': 'alexaimephotography', + 'parsing_enabled': True, + 'url_main': 'https://500px.com/', + 'url_user': 'https://500px.com/p/alexaimephotography', + 'status': BAD_RESULT, + 'http_status': 200, + 'is_similar': False, + 'rank': 2981, + }, + 'Reddit': { + 'username': 'alexaimephotography', + 'parsing_enabled': True, + 'url_main': 'https://www.reddit.com/', + 'url_user': 'https://www.reddit.com/user/alexaimephotography', + 'ids_usernames': {'alexaimephotography': 'username'}, + 'status': GOOD_REDDIT_RESULT, + 'http_status': 200, + 'is_similar': False, + 'rank': 17, + }, + 'Twitter': { + 'username': 'alexaimephotography', + 'parsing_enabled': True, + 'url_main': 'https://www.twitter.com/', + 'url_user': 'https://twitter.com/alexaimephotography', + 'status': BAD_RESULT, + 'http_status': 400, + 'is_similar': False, + 'rank': 55, + }, + 'Instagram': { + 'username': 'alexaimephotography', + 'parsing_enabled': True, + 'url_main': 'https://www.instagram.com/', + 'url_user': 'https://www.instagram.com/alexaimephotography', + 'ids_usernames': {'alexaimephotography': 'username'}, + 'status': GOOD_IG_RESULT, + 'http_status': 200, + 'is_similar': False, + 'rank': 29, + }, + }, + ), + ( + 'Alexaimephotogr', + 'username', + { + '500px': { + 'username': 'Alexaimephotogr', + 'parsing_enabled': True, + 'url_main': 'https://500px.com/', + 'url_user': 'https://500px.com/p/Alexaimephotogr', + 'status': BAD_RESULT, + 'http_status': 200, + 'is_similar': False, + 'rank': 2981, + }, + 'Reddit': { + 'username': 'Alexaimephotogr', + 'parsing_enabled': True, + 'url_main': 'https://www.reddit.com/', + 'url_user': 'https://www.reddit.com/user/Alexaimephotogr', + 'status': BAD_RESULT, + 'http_status': 404, + 'is_similar': False, + 'rank': 17, + }, + 'Twitter': { + 'username': 'Alexaimephotogr', + 'parsing_enabled': True, + 'url_main': 'https://www.twitter.com/', + 'url_user': 'https://twitter.com/Alexaimephotogr', + 'status': GOOD_TWITTER_RESULT, + 'http_status': 400, + 'is_similar': False, + 'rank': 55, + }, + 'Instagram': { + 'username': 'Alexaimephotogr', + 'parsing_enabled': True, + 'url_main': 'https://www.instagram.com/', + 'url_user': 'https://www.instagram.com/Alexaimephotogr', + 'status': BAD_RESULT, + 'http_status': 404, + 'is_similar': False, + 'rank': 29, + }, + }, + ), +] + +SUPPOSED_BRIEF = """Search by username alexaimephotographycars returned 1 accounts. Found target's other IDs: alexaimephotography, Alexaimephotogr. Search by username alexaimephotography returned 2 accounts. Search by username Alexaimephotogr returned 1 accounts. Extended info extracted from 3 accounts.""" +SUPPOSED_BROKEN_BRIEF = """Search by username alexaimephotographycars returned 0 accounts. Search by username alexaimephotography returned 2 accounts. Search by username Alexaimephotogr returned 1 accounts. Extended info extracted from 2 accounts.""" + +SUPPOSED_GEO = "Geo: us (3)" +SUPPOSED_BROKEN_GEO = "Geo: us (2)" + +SUPPOSED_INTERESTS = "Interests: photo (2), news (1), social (1)" +SUPPOSED_BROKEN_INTERESTS = "Interests: news (1), photo (1), social (1)" + + +def test_generate_report_template(): + report_template, css = generate_report_template(is_pdf=True) + + assert isinstance(report_template, Template) + assert isinstance(css, str) + + report_template, css = generate_report_template(is_pdf=False) + + assert isinstance(report_template, Template) + assert css is None + + +def test_generate_csv_report(): + csvfile = StringIO() + generate_csv_report('test', EXAMPLE_RESULTS, csvfile) + + csvfile.seek(0) + data = csvfile.readlines() + + assert data == [ + 'username,name,url_main,url_user,exists,http_status,error_reason\r\n', + 'test,GitHub,https://www.github.com/,https://www.github.com/test,Claimed,200,\r\n', + ] + + +def test_generate_csv_report_broken(): + csvfile = StringIO() + generate_csv_report('test', BROKEN_RESULTS, csvfile) + + csvfile.seek(0) + data = csvfile.readlines() + + assert data == [ + 'username,name,url_main,url_user,exists,http_status,error_reason\r\n', + 'test,GitHub,https://www.github.com/,https://www.github.com/test,Unknown,200,Unknown\r\n', + ] + + +def test_generate_csv_report_error_reason(): + csvfile = StringIO() + generate_csv_report('test', ERROR_RESULTS, csvfile) + + csvfile.seek(0) + data = csvfile.readlines() + + assert data == [ + 'username,name,url_main,url_user,exists,http_status,error_reason\r\n', + 'test,GitHub,https://www.github.com/,https://www.github.com/test,Unknown,0,Request timeout error: slow server\r\n', + ] + + +def test_generate_neo4j_report(): + import networkx as nx + + G = nx.Graph() + G.add_node("username: alice") + G.add_node("account: https://github.com/alice") + G.add_node("bio: o'brien\nbreak") # tricky value: single quote + newline + G.add_edge("username: alice", "account: https://github.com/alice") + + cypher = _graph_to_cypher(G) + + assert "CREATE CONSTRAINT maigret_node_name IF NOT EXISTS" in cypher + assert cypher.count("MERGE (n:MaigretNode {name: ") == 3 + assert cypher.count("-[:LINKED_TO]->") == 1 + assert "SET n.type = 'username', n.label = 'alice'" in cypher + + # the value with a quote and a newline stays on one terminated line, escaped + bio_lines = [ln for ln in cypher.splitlines() if "bio:" in ln] + assert len(bio_lines) == 1 + assert bio_lines[0].endswith(";") + assert "o\\'brien\\nbreak" in bio_lines[0] + + +def test_generate_txt_report(): + txtfile = StringIO() + generate_txt_report('test', EXAMPLE_RESULTS, txtfile) + + txtfile.seek(0) + data = txtfile.readlines() + + assert data == [ + 'https://www.github.com/test\n', + 'Total Websites Username Detected On : 1', + ] + + +def test_generate_txt_report_broken(): + txtfile = StringIO() + generate_txt_report('test', BROKEN_RESULTS, txtfile) + + txtfile.seek(0) + data = txtfile.readlines() + + assert data == [ + 'Total Websites Username Detected On : 0', + ] + + +def test_generate_json_simple_report(): + jsonfile = StringIO() + MODIFIED_RESULTS = dict(EXAMPLE_RESULTS) + MODIFIED_RESULTS['GitHub2'] = EXAMPLE_RESULTS['GitHub'] + generate_json_report('test', MODIFIED_RESULTS, jsonfile, 'simple') + + jsonfile.seek(0) + data = jsonfile.readlines() + + assert len(data) == 1 + assert list(json.loads(data[0]).keys()) == ['GitHub', 'GitHub2'] + + +def test_generate_json_simple_report_broken(): + jsonfile = StringIO() + MODIFIED_RESULTS = dict(BROKEN_RESULTS) + MODIFIED_RESULTS['GitHub2'] = BROKEN_RESULTS['GitHub'] + generate_json_report('test', BROKEN_RESULTS, jsonfile, 'simple') + + jsonfile.seek(0) + data = jsonfile.readlines() + + assert len(data) == 1 + assert list(json.loads(data[0]).keys()) == [] + + +def test_generate_json_ndjson_report(): + jsonfile = StringIO() + MODIFIED_RESULTS = dict(EXAMPLE_RESULTS) + MODIFIED_RESULTS['GitHub2'] = EXAMPLE_RESULTS['GitHub'] + generate_json_report('test', MODIFIED_RESULTS, jsonfile, 'ndjson') + + jsonfile.seek(0) + data = jsonfile.readlines() + + assert len(data) == 2 + assert json.loads(data[0])['sitename'] == 'GitHub' + + +def test_save_xmind_report(): + filename = 'report_test.xmind' + save_xmind_report(filename, 'test', EXAMPLE_RESULTS) + + workbook = xmind.load(filename) + sheet = workbook.getPrimarySheet() + data = sheet.getData() + + assert data['title'] == 'test Analysis' + assert data['topic']['title'] == 'test' + assert len(data['topic']['topics']) == 2 + assert data['topic']['topics'][0]['title'] == 'Undefined' + assert data['topic']['topics'][1]['title'] == 'test_tag' + assert len(data['topic']['topics'][1]['topics']) == 1 + assert ( + data['topic']['topics'][1]['topics'][0]['label'] + == 'https://www.github.com/test' + ) + + +def test_save_xmind_report_broken(): + filename = 'report_test.xmind' + save_xmind_report(filename, 'test', BROKEN_RESULTS) + + workbook = xmind.load(filename) + sheet = workbook.getPrimarySheet() + data = sheet.getData() + + assert data['title'] == 'test Analysis' + assert data['topic']['title'] == 'test' + assert len(data['topic']['topics']) == 2 + assert data['topic']['topics'][0]['title'] == 'Undefined' + assert data['topic']['topics'][1]['title'] == 'Errors' + assert data['topic']['topics'][1]['topics'][0]['title'] == 'GitHub: Unknown' + + +def test_save_xmind_report_error_reason(): + filename = 'report_test.xmind' + save_xmind_report(filename, 'test', ERROR_RESULTS) + + workbook = xmind.load(filename) + sheet = workbook.getPrimarySheet() + data = sheet.getData() + + assert data['title'] == 'test Analysis' + assert data['topic']['title'] == 'test' + assert len(data['topic']['topics']) == 2 + assert data['topic']['topics'][0]['title'] == 'Undefined' + assert data['topic']['topics'][1]['title'] == 'Errors' + assert ( + data['topic']['topics'][1]['topics'][0]['title'] + == 'GitHub: Request timeout error: slow server' + ) + assert ( + data['topic']['topics'][1]['topics'][0]['label'] + == 'https://www.github.com/test' + ) + + +def test_html_report(): + report_name = 'report_test.html' + context = generate_report_context(TEST) + save_html_report(report_name, context) + + report_text = open(report_name).read() + + # the HTML report escapes its context, so the brief is rendered with + # HTML entities (e.g. the apostrophe in "target's") + assert str(escape(SUPPOSED_BRIEF)) in report_text + assert SUPPOSED_GEO in report_text + assert SUPPOSED_INTERESTS in report_text + + +# profile data from scanned sites must be escaped so a planted payload cannot +# execute in the report +XSS_NAME_PAYLOAD = '' +XSS_IMAGE_PAYLOAD = 'x" onerror="alert(1)' +XSS_LINK_PAYLOAD = 'http://evil.example/">' + + +def _xss_username_results(): + result = copy.deepcopy(GOOD_RESULT) + result.tags = ['photo', 'us'] + result.ids_data = { + "name": XSS_NAME_PAYLOAD, + "bio": XSS_NAME_PAYLOAD, + "image": XSS_IMAGE_PAYLOAD, + "external_url": XSS_LINK_PAYLOAD, + } + data = { + 'EvilSite': { + 'username': 'victimtarget', + 'parsing_enabled': True, + 'url_main': 'https://evil.example/', + 'url_user': 'https://evil.example/victimtarget', + 'status': result, + 'http_status': 200, + 'is_similar': False, + 'rank': 1, + 'site': MaigretSite('EvilSite', {}), + 'found': True, + 'ids_data': result.ids_data, + }, + } + return [('victimtarget', 'username', data)] + + +def _assert_no_xss(rendered: str): + # no executable payload markup survives, only escaped (harmless) text + assert XSS_NAME_PAYLOAD not in rendered + assert 'alert(1)' not in rendered + assert 'onerror="alert(1)"' not in rendered # image attribute breakout + assert '<img src=x onerror=alert(document.domain)>' in rendered + + +def test_html_report_escapes_extracted_profile_data(): + context = generate_report_context(_xss_username_results()) + template, _ = generate_report_template(is_pdf=False) + rendered = template.render(**context) + + _assert_no_xss(rendered) + + +def test_pdf_report_escapes_extracted_profile_data(): + context = generate_report_context(_xss_username_results()) + template, _ = generate_report_template(is_pdf=True) + rendered = template.render(**context) + + _assert_no_xss(rendered) + + +def test_report_preserves_legit_auto_link(): + # A benign extracted link must still render as a real, clickable anchor. + result = copy.deepcopy(GOOD_RESULT) + result.ids_data = {"external_url": "https://example.com/profile"} + data = { + 'Site': { + 'username': 'u', + 'parsing_enabled': True, + 'url_main': 'https://example.com/', + 'url_user': 'https://example.com/u', + 'status': result, + 'http_status': 200, + 'is_similar': False, + 'rank': 1, + 'site': MaigretSite('Site', {}), + 'found': True, + 'ids_data': result.ids_data, + }, + } + context = generate_report_context([('u', 'username', data)]) + template, _ = generate_report_template(is_pdf=False) + rendered = template.render(**context) + + assert ( + '
' + 'https://example.com/profile' + ) in rendered + + +def test_html_report_broken(): + report_name = 'report_test_broken.html' + BROKEN_DATA = copy.deepcopy(TEST) + BROKEN_DATA[0][2]['500px']['status'] = None + + context = generate_report_context(BROKEN_DATA) + save_html_report(report_name, context) + + report_text = open(report_name).read() + + assert SUPPOSED_BROKEN_BRIEF in report_text + assert SUPPOSED_BROKEN_GEO in report_text + assert SUPPOSED_BROKEN_INTERESTS in report_text + + +@pytest.mark.skip(reason='connection reset, fixme') +def test_pdf_report(): + report_name = 'report_test.pdf' + context = generate_report_context(TEST) + save_pdf_report(report_name, context) + + assert os.path.exists(report_name) + + +def test_save_pdf_report_raises_helpful_error_without_xhtml2pdf( + monkeypatch, tmp_path +): + # Setting an entry to None makes a subsequent `import` raise ImportError — + # this simulates the optional 'pdf' extra not being installed without + # actually uninstalling xhtml2pdf from the test environment. + monkeypatch.setitem(sys.modules, 'xhtml2pdf', None) + monkeypatch.setitem(sys.modules, 'xhtml2pdf.pisa', None) + + context = generate_report_context(TEST) + target = tmp_path / "report.pdf" + + with pytest.raises(RuntimeError) as excinfo: + save_pdf_report(str(target), context) + + msg = str(excinfo.value) + assert "maigret[pdf]" in msg + assert "pip install" in msg + assert not target.exists() + + +def test_xhtml2pdf_is_not_module_level_dependency(): + # Guard against a regression where someone hoists `import xhtml2pdf` / + # `from xhtml2pdf import pisa` to the top of maigret/report.py — that + # would force every Maigret user to install the optional extra. + import maigret.report as report_module + + module_globals = vars(report_module) + assert 'xhtml2pdf' not in module_globals + assert 'pisa' not in module_globals + + +def test_import_maigret_without_pdf_extras(): + # End-to-end check: spawn a fresh interpreter with every package in the + # [pdf] extra blocked before any maigret module is loaded, and confirm + # the package, the report module, and save_pdf_report itself all import + # cleanly. Mirrors what a user who ran `pip install maigret` (without + # [pdf]) would experience. + code = textwrap.dedent( + """ + import sys + for name in ( + 'xhtml2pdf', 'xhtml2pdf.pisa', + 'arabic_reshaper', + 'bidi', 'bidi.algorithm', + ): + sys.modules[name] = None + + import maigret + import maigret.report + from maigret.report import save_pdf_report + + assert callable(save_pdf_report) + print("OK") + """ + ) + result = subprocess.run( + [sys.executable, "-c", code], + capture_output=True, + text=True, + ) + assert result.returncode == 0, ( + f"stdout={result.stdout!r} stderr={result.stderr!r}" + ) + assert "OK" in result.stdout + + +def test_text_report(): + context = generate_report_context(TEST) + report_text = get_plaintext_report(context) + + for brief_part in SUPPOSED_BRIEF.split(): + assert brief_part in report_text + assert 'us' in report_text + assert 'photo' in report_text + + +def test_text_report_broken(): + BROKEN_DATA = copy.deepcopy(TEST) + BROKEN_DATA[0][2]['500px']['status'] = None + + context = generate_report_context(BROKEN_DATA) + report_text = get_plaintext_report(context) + + for brief_part in SUPPOSED_BROKEN_BRIEF.split(): + assert brief_part in report_text + assert 'us' in report_text + assert 'photo' in report_text + + +def test_filter_supposed_data(): + data = { + 'fullname': ['Alice'], + 'gender': ['female'], + 'location': ['Berlin'], + 'age': ['30'], + 'email': ['x@y.z'], # not allowed, must be dropped + 'bio': ['hi'], # not allowed + } + result = filter_supposed_data(data) + assert result == { + 'Fullname': 'Alice', + 'Gender': 'female', + 'Location': 'Berlin', + 'Age': '30', + } + + +def test_filter_supposed_data_empty(): + assert filter_supposed_data({}) == {} + assert filter_supposed_data({'nope': ['v']}) == {} + + +def test_filter_supposed_data_scalar_values(): + # Strings and scalars must be kept whole — previously v[0] on "Alice" + # silently returned "A" instead of "Alice". + data = { + 'fullname': 'Alice', + 'gender': 'female', + 'location': 'Berlin', + 'age': 30, + } + assert filter_supposed_data(data) == { + 'Fullname': 'Alice', + 'Gender': 'female', + 'Location': 'Berlin', + 'Age': 30, + } + + +def test_filter_supposed_data_empty_list_yields_empty_string(): + # Edge case: list value present but empty should not crash with IndexError. + assert filter_supposed_data({'fullname': []}) == {'Fullname': ''} + + +def test_filter_supposed_data_mixed_values(): + # List and scalar mixed in the same payload. + data = {'fullname': ['Alice', 'Alicia'], 'gender': 'female'} + assert filter_supposed_data(data) == { + 'Fullname': 'Alice', + 'Gender': 'female', + } + + +def test_sort_report_by_data_points(): + status_many = MaigretCheckResult('', '', '', MaigretCheckStatus.CLAIMED) + status_many.ids_data = {'a': 1, 'b': 2, 'c': 3} + status_one = MaigretCheckResult('', '', '', MaigretCheckStatus.CLAIMED) + status_one.ids_data = {'a': 1} + status_none = MaigretCheckResult('', '', '', MaigretCheckStatus.CLAIMED) + + results = { + 'few': {'status': status_one}, + 'many': {'status': status_many}, + 'zero': {'status': status_none}, + 'nostatus': {}, + } + sorted_out = sort_report_by_data_points(results) + keys = list(sorted_out.keys()) + # site with 3 ids_data fields must come first + assert keys[0] == 'many' + # site with 1 field next + assert keys[1] == 'few' + + +def test_md_format_value_list(): + assert _md_format_value(['a', 'b', 'c']) == 'a, b, c' + + +def test_md_format_value_url(): + assert _md_format_value('https://example.com') == '[https://example.com](https://example.com)' + assert _md_format_value('http://x.y') == '[http://x.y](http://x.y)' + + +def test_md_format_value_plain(): + assert _md_format_value('hello') == 'hello' + assert _md_format_value(42) == '42' + + +def test_save_csv_report(): + filename = 'report_test.csv' + save_csv_report(filename, 'test', EXAMPLE_RESULTS) + with open(filename) as f: + content = f.read() + assert 'username,name,url_main' in content + assert 'test,GitHub' in content + + +def test_save_txt_report(): + filename = 'report_test.txt' + save_txt_report(filename, 'test', EXAMPLE_RESULTS) + with open(filename) as f: + content = f.read() + assert 'https://www.github.com/test' in content + assert 'Total Websites Username Detected On : 1' in content + + +def test_save_json_report_simple(): + filename = 'report_test.json' + save_json_report(filename, 'test', EXAMPLE_RESULTS, 'simple') + with open(filename) as f: + data = json.load(f) + assert 'GitHub' in data + + +def test_save_json_report_ndjson(): + filename = 'report_test_ndjson.json' + save_json_report(filename, 'test', EXAMPLE_RESULTS, 'ndjson') + with open(filename) as f: + lines = f.readlines() + assert len(lines) == 1 + assert json.loads(lines[0])['sitename'] == 'GitHub' + + +def _markdown_context_with_rich_ids(): + """Build a context with found accounts, ids_data (incl. image, url, list) to exercise all branches.""" + found_result = copy.deepcopy(GOOD_RESULT) + found_result.tags = ['photo', 'us'] + found_result.ids_data = { + "fullname": "Alice", + "name": "Alice A.", + "location": "Berlin", + "bio": "Photographer", + "external_url": "https://example.com/profile", + "image": "https://example.com/avatar.png", # must be skipped + "aliases": ["alice", "alicea"], # list value + "last_online": "2024-01-02 10:00:00", + } + data = { + 'Github': { + 'username': 'alice', + 'parsing_enabled': True, + 'url_main': 'https://github.com/', + 'url_user': 'https://github.com/alice', + 'status': found_result, + 'http_status': 200, + 'is_similar': False, + 'rank': 1, + 'site': MaigretSite('Github', {}), + 'found': True, + 'ids_data': found_result.ids_data, + }, + 'Similar': { + 'username': 'alice', + 'url_user': 'https://other.com/alice', + 'is_similar': True, + 'found': True, + 'status': copy.deepcopy(GOOD_RESULT), + }, + } + return { + 'username': 'alice', + 'generated_at': '2024-01-02 10:00', + 'brief': 'Search returned 1 account', + 'countries_tuple_list': [('us', 1)], + 'interests_tuple_list': [('photo', 1)], + 'first_seen': '2023-01-01', + 'results': [('alice', 'username', data)], + } + + +def test_save_markdown_report(): + filename = 'report_test.md' + context = _markdown_context_with_rich_ids() + save_markdown_report(filename, context, run_info={'sites_count': 100, 'flags': '--top-sites 100'}) + with open(filename) as f: + content = f.read() + assert '# Report by searching on username "alice"' in content + assert '## Summary' in content + assert '## Accounts found' in content + assert '### Github' in content + assert '[https://github.com/alice](https://github.com/alice)' in content + assert 'Ethical use' in content + assert '100 sites checked' in content + # image field must NOT appear in per-site listing + assert 'avatar.png' not in content + # list field rendered with join + assert 'alice, alicea' in content + # external url formatted as markdown link + assert '[https://example.com/profile](https://example.com/profile)' in content + + +def test_save_markdown_report_minimal_context(): + """No run_info, no first_seen — exercise the fallback branches.""" + filename = 'report_test_min.md' + context = { + 'username': 'bob', + 'brief': 'nothing found', + 'results': [], + } + save_markdown_report(filename, context) + with open(filename) as f: + content = f.read() + assert '# Report by searching on username "bob"' in content + assert '## Summary' in content + + +def test_get_plaintext_report_minimal(): + """Minimal context without countries/interests.""" + context = { + 'brief': 'Nothing to report.', + 'interests_tuple_list': [], + 'countries_tuple_list': [], + } + out = get_plaintext_report(context) + assert 'Nothing to report.' in out + assert 'Countries:' not in out + assert 'Interests' not in out diff --git a/tests/test_sanitize_username.py b/tests/test_sanitize_username.py new file mode 100644 index 0000000..ba0b20f --- /dev/null +++ b/tests/test_sanitize_username.py @@ -0,0 +1,28 @@ +import pytest + +from maigret.web.app import sanitize_username_for_path + + +@pytest.mark.parametrize( + "input_username, expected", + [ + ("../../tmp/x", "_.._tmp_x"), + ("..", "_"), + ("....", "_"), + ("foo/bar", "foo_bar"), + ("\0foo", "_foo"), + ("normaluser123", "normaluser123"), + ], +) +def test_sanitize_username_for_path(input_username, expected): + result = sanitize_username_for_path(input_username) + assert result == expected + # Verify no path separators or null bytes remain + assert "/" not in result + assert "\\" not in result + assert "\0" not in result + # Verify result is not empty + assert len(result) > 0 + # Verify no leading/trailing dots + assert not result.startswith(".") + assert not result.endswith(".") diff --git a/tests/test_settings.py b/tests/test_settings.py new file mode 100644 index 0000000..7e0fb9d --- /dev/null +++ b/tests/test_settings.py @@ -0,0 +1,53 @@ +import unittest +from unittest.mock import patch, mock_open + +from maigret.settings import Settings + + +class TestSettings(unittest.TestCase): + @patch('json.load') + @patch('builtins.open', new_callable=mock_open) + def test_settings_cascade_and_override(self, mock_file, mock_json_load): + file1_data = {"timeout": 10, "retries_count": 3, "proxy_url": "http://proxy1"} + file2_data = {"timeout": 20, "recursive_search": True} + file3_data = {"proxy_url": "http://proxy3", "print_not_found": False} + + mock_json_load.side_effect = [file1_data, file2_data, file3_data] + + settings = Settings() + paths = ['file1.json', 'file2.json', 'file3.json'] + + was_inited, msg = settings.load(paths) + + self.assertTrue(was_inited) + self.assertEqual(settings.retries_count, 3) + self.assertEqual(settings.timeout, 20) + self.assertTrue(settings.recursive_search) + self.assertEqual(settings.proxy_url, "http://proxy3") + self.assertFalse(settings.print_not_found) + + @patch('builtins.open') + def test_settings_file_not_found(self, mock_open_func): + mock_open_func.side_effect = FileNotFoundError() + + settings = Settings() + paths = ['nonexistent.json'] + + was_inited, msg = settings.load(paths) + + self.assertFalse(was_inited) + self.assertIn('None of the default settings files found', msg) + + @patch('json.load') + @patch('builtins.open', new_callable=mock_open) + def test_settings_invalid_json(self, mock_file, mock_json_load): + mock_json_load.side_effect = ValueError("Expecting value") + + settings = Settings() + paths = ['invalid.json'] + + was_inited, msg = settings.load(paths) + + self.assertFalse(was_inited) + self.assertIsInstance(msg, ValueError) + self.assertIn('Problem with parsing json contents', str(msg)) diff --git a/tests/test_sites.py b/tests/test_sites.py new file mode 100644 index 0000000..8b57e7e --- /dev/null +++ b/tests/test_sites.py @@ -0,0 +1,424 @@ +"""Maigret Database test functions""" + +import logging +import re + +from typing import Any, Dict + +from maigret.sites import MaigretDatabase, MaigretEngine, MaigretSite + +EXAMPLE_DB: Dict[str, Any] = { + 'engines': { + "XenForo": { + "presenseStrs": ["XenForo"], + "site": { + "absenceStrs": [ + "The specified member cannot be found. Please enter a member's entire name.", + ], + "checkType": "message", + "errors": {"You must be logged-in to do that.": "Login required"}, + "url": "{urlMain}{urlSubpath}/members/?username={username}", + }, + }, + }, + 'sites': { + "Amperka": { + "engine": "XenForo", + "rank": 121613, + "tags": ["ru"], + "urlMain": "http://forum.amperka.ru", + "usernameClaimed": "adam", + "usernameUnclaimed": "noonewouldeverusethis7", + }, + }, +} + + +def test_load_empty_db_from_str(): + db = MaigretDatabase() + db.load_from_str('{"engines": {}, "sites": {}}') + + assert db.sites == [] + assert db.engines == [] + + +def test_load_valid_db(): + db = MaigretDatabase() + db.load_from_json(EXAMPLE_DB) + + assert len(db.sites) == 1 + assert len(db.engines) == 1 + + assert db.sites[0].name == 'Amperka' + assert db.engines[0].name == 'XenForo' + + +def test_site_json_dump(): + db = MaigretDatabase() + db.load_from_json(EXAMPLE_DB) + + init_keys = EXAMPLE_DB['sites']['Amperka'].keys() + # contains engine data + obj_keys = db.sites[0].json.keys() + + assert set(init_keys).issubset(set(obj_keys)) + + +def test_site_correct_initialization(): + db = MaigretDatabase() + db.load_from_json(EXAMPLE_DB) + + xenforo = db.engines[0] + assert xenforo.name == 'XenForo' + assert xenforo.site['checkType'] == 'message' + + amperka = db.sites[0] + assert amperka.name == 'Amperka' + assert amperka.check_type == 'message' + + +def test_site_strip_engine_data(): + db = MaigretDatabase() + db.load_from_json(EXAMPLE_DB) + + amperka = db.sites[0] + amperka_stripped = amperka.strip_engine_data() + + assert amperka_stripped.json == EXAMPLE_DB['sites']['Amperka'] + + +def test_site_strip_engine_data_with_site_prior_updates(): + db = MaigretDatabase() + UPDATED_EXAMPLE_DB = dict(EXAMPLE_DB) + UPDATED_EXAMPLE_DB['sites']['Amperka']['absenceStrs'] = ["test"] + db.load_from_json(UPDATED_EXAMPLE_DB) + + amperka = db.sites[0] + amperka_stripped = amperka.strip_engine_data() + + assert amperka_stripped.json == UPDATED_EXAMPLE_DB['sites']['Amperka'] + + +def test_saving_site_error(): + db = MaigretDatabase() + + DB = dict(EXAMPLE_DB) + DB['sites']['Amperka']['errors'] = {'error1': 'text1'} + + db.load_from_json(DB) + + amperka = db.sites[0] + assert len(amperka.errors) == 2 + assert len(amperka.errors_dict) == 2 + + assert amperka.strip_engine_data().errors == {'error1': 'text1'} + assert amperka.strip_engine_data().json['errors'] == {'error1': 'text1'} + + +def test_update_from_engine_warns_on_conflicting_dict_entries(caplog): + site = MaigretSite( + 'Example', + { + 'urlMain': 'https://example.com', + 'url': 'https://example.com/{username}', + 'errors': { + 'Shared marker': 'site value', + 'Same marker': 'same value', + }, + }, + ) + engine = MaigretEngine( + 'ExampleEngine', + { + 'site': { + 'errors': { + 'Shared marker': 'engine value', + 'Same marker': 'same value', + 'Engine marker': 'engine-only value', + }, + }, + }, + ) + + with caplog.at_level(logging.WARNING): + site.update_from_engine(engine) + + assert site.errors == { + 'Shared marker': 'engine value', + 'Same marker': 'same value', + 'Engine marker': 'engine-only value', + } + assert 'Example' in caplog.text + assert 'errors' in caplog.text + assert 'Shared marker' in caplog.text + assert 'Same marker' not in caplog.text + + +def test_site_url_detector(): + db = MaigretDatabase() + db.load_from_json(EXAMPLE_DB) + + assert ( + db.sites[0].url_regexp.pattern + == r'^https?://(www\.|m\.)?forum\.amperka\.ru/members/\?username=(.+?)$' + ) + assert ( + db.sites[0].detect_username('http://forum.amperka.ru/members/?username=test') + == 'test' + ) + + +def test_extract_id_from_url_skips_none_groups(): + site = MaigretSite( + "Example", + { + "urlMain": "https://example.com", + "url": "https://example.com/{username}", + }, + ) + site.url_regexp = re.compile(r"^https://example\.com/([^/?#]+)(?:/(.*))?$") + + assert site.extract_id_from_url("https://example.com/username") == ( + "username", + "username", + ) + + +def test_ranked_sites_dict(): + db = MaigretDatabase() + db.update_site(MaigretSite('3', {'alexaRank': 1000, 'engine': 'ucoz'})) + db.update_site(MaigretSite('1', {'alexaRank': 2, 'tags': ['forum']})) + db.update_site(MaigretSite('2', {'alexaRank': 10, 'tags': ['ru', 'forum']})) + + # sorting + assert list(db.ranked_sites_dict().keys()) == ['1', '2', '3'] + assert list(db.ranked_sites_dict(top=2).keys()) == ['1', '2'] + assert list(db.ranked_sites_dict(reverse=True, top=2).keys()) == ['3', '2'] + + # filtering by tags + assert list(db.ranked_sites_dict(tags=['ru'], top=2).keys()) == ['2'] + assert list(db.ranked_sites_dict(tags=['forum']).keys()) == ['1', '2'] + + # filtering by engine + assert list(db.ranked_sites_dict(tags=['ucoz']).keys()) == ['3'] + + # disjunction + assert list(db.ranked_sites_dict(names=['2'], tags=['forum']).keys()) == ['2'] + assert list(db.ranked_sites_dict(names=['2'], tags=['ucoz']).keys()) == [] + assert list(db.ranked_sites_dict(names=['4'], tags=['ru']).keys()) == [] + + # reverse + assert list(db.ranked_sites_dict(reverse=True).keys()) == ['3', '2', '1'] + + +def test_ranked_sites_dict_names(): + db = MaigretDatabase() + db.update_site(MaigretSite('3', {'alexaRank': 30})) + db.update_site(MaigretSite('1', {'alexaRank': 2})) + db.update_site(MaigretSite('2', {'alexaRank': 10})) + + # filtering by names + assert list(db.ranked_sites_dict(names=['1', '2']).keys()) == ['1', '2'] + assert list(db.ranked_sites_dict(names=['2', '3']).keys()) == ['2', '3'] + + +def test_ranked_sites_dict_disabled(): + db = MaigretDatabase() + db.update_site(MaigretSite('1', {'disabled': True})) + db.update_site(MaigretSite('2', {})) + + assert len(db.ranked_sites_dict()) == 2 + assert len(db.ranked_sites_dict(disabled=False)) == 1 + + +def test_ranked_sites_dict_id_type(): + db = MaigretDatabase() + db.update_site(MaigretSite('1', {})) + db.update_site(MaigretSite('2', {'type': 'username'})) + db.update_site(MaigretSite('3', {'type': 'gaia_id'})) + + assert len(db.ranked_sites_dict()) == 2 + assert len(db.ranked_sites_dict(id_type='username')) == 2 + assert len(db.ranked_sites_dict(id_type='gaia_id')) == 1 + + +def test_ranked_sites_dict_excluded_tags(): + db = MaigretDatabase() + db.update_site(MaigretSite('3', {'alexaRank': 1000, 'engine': 'ucoz'})) + db.update_site(MaigretSite('1', {'alexaRank': 2, 'tags': ['forum']})) + db.update_site(MaigretSite('2', {'alexaRank': 10, 'tags': ['ru', 'forum']})) + + # excluding by tag + assert list(db.ranked_sites_dict(excluded_tags=['ru']).keys()) == ['1', '3'] + assert list(db.ranked_sites_dict(excluded_tags=['forum']).keys()) == ['3'] + + # excluding by engine + assert list(db.ranked_sites_dict(excluded_tags=['ucoz']).keys()) == ['1', '2'] + + # combining include and exclude tags + assert list(db.ranked_sites_dict(tags=['forum'], excluded_tags=['ru']).keys()) == [ + '1' + ] + + # excluding non-existent tag has no effect + assert list(db.ranked_sites_dict(excluded_tags=['nonexistent']).keys()) == [ + '1', + '2', + '3', + ] + + # exclude all + assert list(db.ranked_sites_dict(excluded_tags=['forum', 'ucoz']).keys()) == [] + + +def test_ranked_sites_dict_tag_filter_is_case_insensitive(): + # The include (whitelist) tag filter must be case-insensitive, like the + # exclude (blacklist) filter and every sibling lambda (name/source/engine), + # all of which lowercase the site-side value. A site tagged 'US' must be + # found by tags=['us'] just as it is excluded by excluded_tags=['us']. + db = MaigretDatabase() + db.update_site(MaigretSite('1', {'alexaRank': 2, 'tags': ['US']})) + + assert list(db.ranked_sites_dict(tags=['us']).keys()) == ['1'] + # the blacklist already treats the same tag case-insensitively + assert list(db.ranked_sites_dict(excluded_tags=['us']).keys()) == [] + + +def test_ranked_sites_dict_excluded_tags_with_top(): + """Excluded tags should also prevent mirrors from being included.""" + db = MaigretDatabase() + db.update_site( + MaigretSite('Parent', {'alexaRank': 1, 'tags': ['forum'], 'type': 'username'}) + ) + db.update_site( + MaigretSite( + 'Mirror', + { + 'alexaRank': 999999, + 'source': 'Parent', + 'tags': ['forum'], + 'type': 'username', + }, + ) + ) + db.update_site( + MaigretSite('Other', {'alexaRank': 2, 'tags': ['coding'], 'type': 'username'}) + ) + + # Without exclusion, mirror should be included + result = db.ranked_sites_dict(top=1, id_type='username') + assert 'Parent' in result + assert 'Mirror' in result + + # With exclusion of 'forum', both Parent and Mirror should be excluded + result = db.ranked_sites_dict(top=2, excluded_tags=['forum'], id_type='username') + assert 'Parent' not in result + assert 'Mirror' not in result + assert 'Other' in result + + +def test_ranked_sites_dict_mirrors_disabled_parent(): + """Mirror is included when parent ranks in top N but parent is disabled.""" + db = MaigretDatabase() + db.update_site( + MaigretSite( + 'ParentPlatform', + {'alexaRank': 5, 'disabled': True, 'type': 'username'}, + ) + ) + db.update_site( + MaigretSite( + 'OtherSite', + {'alexaRank': 100, 'type': 'username'}, + ) + ) + db.update_site( + MaigretSite( + 'MirrorSite', + { + 'alexaRank': 99999999, + 'source': 'ParentPlatform', + 'type': 'username', + }, + ) + ) + + result = db.ranked_sites_dict(top=1, disabled=False, id_type='username') + assert list(result.keys()) == ['OtherSite', 'MirrorSite'] + + +def test_ranked_sites_dict_mirrors_no_extra_without_parent_in_top(): + db = MaigretDatabase() + db.update_site(MaigretSite('A', {'alexaRank': 1, 'type': 'username'})) + db.update_site( + MaigretSite( + 'B', + {'alexaRank': 2, 'source': 'NotInDb', 'type': 'username'}, + ) + ) + + assert list(db.ranked_sites_dict(top=1, id_type='username').keys()) == ['A'] + + +def test_get_url_template(): + site = MaigretSite( + "test", + { + "urlMain": "https://ya.ru/", + "url": "{urlMain}{urlSubpath}/members/?username={username}", + }, + ) + assert ( + site.get_url_template() + == "{urlMain}{urlSubpath}/members/?username={username} (no engine)" + ) + + site = MaigretSite( + "test", + { + "urlMain": "https://ya.ru/", + "url": "https://{username}.ya.ru", + }, + ) + assert site.get_url_template() == "SUBDOMAIN" + + +def test_update_site_replaces_existing_entry(): + """update_site() must replace the list element, not just rebind a loop variable.""" + db = MaigretDatabase() + db.update_site(MaigretSite('Example', {'urlMain': 'https://example.com', 'disabled': False})) + + updated = MaigretSite('Example', {'urlMain': 'https://example.com', 'disabled': True}) + db.update_site(updated) + + # The database must contain exactly one entry and it must be the updated one + assert len(db.sites) == 1 + assert db.sites_dict['Example'].disabled is True + + +def test_update_site_appends_when_name_not_found(): + """update_site() must append when no site with that name exists.""" + db = MaigretDatabase() + db.update_site(MaigretSite('Alpha', {'urlMain': 'https://alpha.com'})) + db.update_site(MaigretSite('Beta', {'urlMain': 'https://beta.com'})) + + assert len(db.sites) == 2 + assert 'Alpha' in db.sites_dict + assert 'Beta' in db.sites_dict + + +def test_has_site_url_or_name(default_db): + # by the same url or partial match + assert default_db.has_site("https://aback.com.ua/user/") == True + assert default_db.has_site("https://aback.com.ua") == True + + # acceptable partial match + assert default_db.has_site("https://aback.com.ua/use") == True + assert default_db.has_site("https://aback.com") == True + + # by name + assert default_db.has_site("Aback") == True + + # false + assert default_db.has_site("https://aeifgoai3h4g8a3u4g5") == False + assert default_db.has_site("aeifgoai3h4g8a3u4g5") == False diff --git a/tests/test_standalone_wrapper.py b/tests/test_standalone_wrapper.py new file mode 100644 index 0000000..bdc6798 --- /dev/null +++ b/tests/test_standalone_wrapper.py @@ -0,0 +1,149 @@ +"""Unit tests for the PyInstaller Windows wrapper. + +The wrapper at ``pyinstaller/maigret_standalone.py`` lives outside the +``maigret`` package, so we load it by path. +""" +import importlib.util +import os +import sys +from unittest import mock + +import pytest + + +WRAPPER_PATH = os.path.join( + os.path.dirname(os.path.dirname(os.path.realpath(__file__))), + "pyinstaller", + "maigret_standalone.py", +) + + +@pytest.fixture +def wrapper(): + spec = importlib.util.spec_from_file_location( + "maigret_standalone_under_test", WRAPPER_PATH + ) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def test_returns_false_on_non_windows(wrapper): + with mock.patch.object(wrapper.platform, "system", return_value="Darwin"): + assert wrapper._launched_by_double_click() is False + + +def test_returns_false_when_username_argument_present(wrapper): + # Extra argv => user invoked from a shell with a username; never a double-click. + with mock.patch.object(wrapper.platform, "system", return_value="Windows"), \ + mock.patch.object(wrapper.sys, "argv", ["maigret_standalone.exe", "alice"]): + assert wrapper._launched_by_double_click() is False + + +def test_double_click_detected_when_only_our_process_attached(wrapper): + fake_ctypes = mock.MagicMock() + fake_ctypes.windll.kernel32.GetConsoleProcessList.return_value = 1 + + with mock.patch.object(wrapper.platform, "system", return_value="Windows"), \ + mock.patch.object(wrapper.sys, "argv", ["maigret_standalone.exe"]), \ + mock.patch.dict(sys.modules, {"ctypes": fake_ctypes}): + assert wrapper._launched_by_double_click() is True + + +def test_cmd_invocation_detected_when_shell_also_attached(wrapper): + fake_ctypes = mock.MagicMock() + fake_ctypes.windll.kernel32.GetConsoleProcessList.return_value = 2 + + with mock.patch.object(wrapper.platform, "system", return_value="Windows"), \ + mock.patch.object(wrapper.sys, "argv", ["maigret_standalone.exe"]), \ + mock.patch.dict(sys.modules, {"ctypes": fake_ctypes}): + assert wrapper._launched_by_double_click() is False + + +def test_returns_false_when_console_api_raises(wrapper): + fake_ctypes = mock.MagicMock() + fake_ctypes.windll.kernel32.GetConsoleProcessList.side_effect = OSError("boom") + + with mock.patch.object(wrapper.platform, "system", return_value="Windows"), \ + mock.patch.object(wrapper.sys, "argv", ["maigret_standalone.exe"]), \ + mock.patch.dict(sys.modules, {"ctypes": fake_ctypes}): + assert wrapper._launched_by_double_click() is False + + +def test_main_runs_cli_when_not_double_click(wrapper): + sentinel = object() + with mock.patch.object(wrapper, "_launched_by_double_click", return_value=False), \ + mock.patch.object(wrapper.asyncio, "run") as run_mock, \ + mock.patch.object(wrapper.maigret, "cli", new=mock.Mock(return_value=sentinel)) as cli_mock: + wrapper.main() + + cli_mock.assert_called_once_with() + run_mock.assert_called_once_with(sentinel) + + +def test_main_prompts_and_runs_search_on_double_click(wrapper): + sentinel = object() + original_argv = ["maigret_standalone.exe"] + inputs = iter(["alice", ""]) # username prompt, then pause prompt + + with mock.patch.object(wrapper, "_launched_by_double_click", return_value=True), \ + mock.patch.object(wrapper.sys, "argv", list(original_argv)), \ + mock.patch("builtins.input", side_effect=lambda *_: next(inputs)) as input_mock, \ + mock.patch.object(wrapper.asyncio, "run") as run_mock, \ + mock.patch.object(wrapper.maigret, "cli", new=mock.Mock(return_value=sentinel)): + wrapper.main() + # argv was rewritten to feed argparse the entered username. + assert wrapper.sys.argv == ["maigret_standalone.exe", "alice"] + + run_mock.assert_called_once_with(sentinel) + assert input_mock.call_count == 2 # username prompt + final pause + + +def test_main_skips_search_on_empty_username(wrapper): + inputs = iter(["", ""]) # empty username, then pause prompt + + with mock.patch.object(wrapper, "_launched_by_double_click", return_value=True), \ + mock.patch.object(wrapper.sys, "argv", ["maigret_standalone.exe"]), \ + mock.patch("builtins.input", side_effect=lambda *_: next(inputs)) as input_mock, \ + mock.patch.object(wrapper.asyncio, "run") as run_mock, \ + mock.patch.object(wrapper.maigret, "cli") as cli_mock: + wrapper.main() + + cli_mock.assert_not_called() + run_mock.assert_not_called() + assert input_mock.call_count == 2 # asked for username, then paused + + +def test_main_pauses_even_when_cli_raises_system_exit(wrapper): + inputs = iter(["alice", ""]) + + with mock.patch.object(wrapper, "_launched_by_double_click", return_value=True), \ + mock.patch.object(wrapper.sys, "argv", ["maigret_standalone.exe"]), \ + mock.patch("builtins.input", side_effect=lambda *_: next(inputs)) as input_mock, \ + mock.patch.object(wrapper.asyncio, "run", side_effect=SystemExit(2)), \ + mock.patch.object(wrapper.maigret, "cli", new=mock.Mock()): + with pytest.raises(SystemExit): + wrapper.main() + + # Both inputs should have fired: username prompt + final pause via finally. + assert input_mock.call_count == 2 + + +def test_main_treats_keyboard_interrupt_at_prompt_as_empty(wrapper): + def fake_input(*_args, **_kwargs): + if fake_input.calls == 0: + fake_input.calls += 1 + raise KeyboardInterrupt + fake_input.calls += 1 + return "" + fake_input.calls = 0 + + with mock.patch.object(wrapper, "_launched_by_double_click", return_value=True), \ + mock.patch.object(wrapper.sys, "argv", ["maigret_standalone.exe"]), \ + mock.patch("builtins.input", side_effect=fake_input), \ + mock.patch.object(wrapper.asyncio, "run") as run_mock, \ + mock.patch.object(wrapper.maigret, "cli") as cli_mock: + wrapper.main() + + cli_mock.assert_not_called() + run_mock.assert_not_called() diff --git a/tests/test_submit.py b/tests/test_submit.py new file mode 100644 index 0000000..97a9895 --- /dev/null +++ b/tests/test_submit.py @@ -0,0 +1,360 @@ +import re + +import pytest +from unittest.mock import MagicMock, patch +from maigret.submit import Submitter +from aiohttp import ClientSession +from maigret.sites import MaigretDatabase, MaigretSite +import logging + + +@pytest.mark.slow +@pytest.mark.asyncio +async def test_detect_known_engine(test_db, local_test_db): + # Use the database fixture instead of mocking + mock_db = test_db + mock_settings = MagicMock() + mock_logger = MagicMock() + mock_args = MagicMock() + mock_args.cookie_file = "" + mock_args.proxy = "" + + # Mock the supposed usernames + mock_settings.supposed_usernames = ["adam"] + # Create the Submitter instance + submitter = Submitter(test_db, mock_settings, mock_logger, mock_args) + + # Call the method with test URLs + url_exists = "https://devforum.zoom.us/u/adam" + url_mainpage = "https://devforum.zoom.us/" + # Mock extract_username_dialog to return "adam" + submitter.extract_username_dialog = MagicMock(return_value="adam") # type: ignore[method-assign] + + sites, resp_text = await submitter.detect_known_engine( + url_exists, url_mainpage, session=None, follow_redirects=False, headers=None + ) + + # Assertions + assert len(sites) == 2 + assert sites[0].name == "devforum.zoom.us" + assert sites[0].url_main == "https://devforum.zoom.us/" + assert sites[0].engine == "Discourse" + assert sites[0].username_claimed == "adam" + assert sites[0].username_unclaimed == "noonewouldeverusethis7" + assert resp_text != "" + + await submitter.close() + + # Create the Submitter instance without engines + submitter = Submitter(local_test_db, mock_settings, mock_logger, mock_args) + sites, resp_text = await submitter.detect_known_engine( + url_exists, url_mainpage, session=None, follow_redirects=False, headers=None + ) + assert len(sites) == 0 + + await submitter.close() + + +@pytest.mark.slow +@pytest.mark.asyncio +async def test_check_features_manually_success(settings): + # Setup + db = MaigretDatabase() + logger = logging.getLogger("test_logger") + args = type( + 'Args', (object,), {'proxy': None, 'cookie_file': None, 'verbose': False} + )() + + submitter = Submitter(db, settings, logger, args) + + username = "KONAMI" + url_exists = "https://play.google.com/store/apps/developer?id=KONAMI" + + # Execute + presence_list, absence_list, status, random_username = ( + await submitter.check_features_manually( + username=username, + url_exists=url_exists, + session=ClientSession(), + follow_redirects=False, + headers=None, + ) + ) + await submitter.close() + # Assert + assert status == "Found", "Expected status to be 'Found'" + assert isinstance(presence_list, list), "Presence list should be a list" + assert isinstance(absence_list, list), "Absence list should be a list" + assert isinstance(random_username, str), "Random username should be a string" + assert ( + random_username != username + ), "Random username should not be the same as the input username" + assert sorted(presence_list) == sorted( + [ + ' title=', + 'og:title', + 'display: none;', + '4;0', + 'main-title', + ] + ) + assert sorted(absence_list) == sorted( + [ + ' body {', + ' ', + '>Not Found', + '