diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 000000000..867978dd8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,147 @@ +name: Bug Report +description: Report a bug in Stoat — please fill out every required field to help us triage quickly. +title: "[Bug]: " +labels: + - bug + - unconfirmed + +body: + # ── Thank you section ──────────────────────────────────────────────────────── + - type: markdown + attributes: + value: | + **Thank you for taking the time to report a bug for Stoat!** + + Please follow the instructions below and provide as much detail as possible to help us understand and reproduce the issue. + + # ── Pre-flight checks ──────────────────────────────────────────────────────── + - type: checkboxes + id: preflight + attributes: + label: Pre-flight checklist + description: Please confirm all of the following before submitting. + options: + - label: I am on the latest available version of Stoat. + required: true + - label: I searched existing issues and did not find a duplicate. + required: true + - label: This is a bug report, not a support question or feature request. + required: true + + # ── Bug description ────────────────────────────────────────────────────────── + - type: textarea + id: description + attributes: + label: Bug description + description: > + What happened? What did you expect to happen instead? + Keep this brief — detailed steps go in the next field. + placeholder: "Example: When I open a DM thread, new messages from the other person do not appear unless I reload the page." + validations: + required: true + + # ── Steps to reproduce ─────────────────────────────────────────────────────── + - type: textarea + id: steps + attributes: + label: Steps to reproduce + description: > + Provide a numbered list of every step needed to trigger the bug. + The clearer this is, the faster we can fix it. + placeholder: | + 1. Log in to Stoat on the web client. + 2. Open a direct message conversation. + 3. Ask the other person to send a message. + 4. Observe that the message does not appear without reloading. + validations: + required: true + + # ── Expected behavior ──────────────────────────────────────────────────────── + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What should have happened? + placeholder: "New messages should appear in real time without a page reload." + validations: + required: true + + # ── Client / platform ──────────────────────────────────────────────────────── + - type: dropdown + id: platform + attributes: + label: Client / platform + description: Which Stoat client are you using? + options: + - Web (browser) + - Stoat for Desktop + - Android + - iOS + - Self-hosted server + validations: + required: true + + # ── Client version ─────────────────────────────────────────────────────────── + - type: input + id: version + attributes: + label: Client version + description: > + Find this in **Settings**. For the web client, include the build + number shown in the footer or About page. + placeholder: "e.g. Stoat for Desktop 1.3.0 or 0.2.1 (2025-10-10)" + validations: + required: true + + # ── OS / browser details ───────────────────────────────────────────────────── + - type: input + id: os + attributes: + label: OS / browser details + description: Your operating system and, for web bugs, your browser and its version. + placeholder: "e.g. Windows 11, Chrome 121 or macOS 14.3, Stoat for Desktop 1.3.0 or Android 14" + validations: + required: true + + # ── Reproducibility ────────────────────────────────────────────────────────── + - type: dropdown + id: reproducibility + attributes: + label: Reproducibility + description: How consistently does this bug occur? + options: + - Always + - Usually + - Rarely + - Only once + - Unknown + validations: + required: true + + # ── Screenshots or video ───────────────────────────────────────────────────── + - type: textarea + id: screenshots + attributes: + label: Screenshots or video + description: Paste images or drag-and-drop a screen recording here. GitHub accepts common image and video formats. + validations: + required: false + + # ── Additional context ─────────────────────────────────────────────────────── + - type: textarea + id: additional + attributes: + label: Additional context + description: > + Anything else that might help: workarounds you found, links to related issues, + self-hosted configuration details (Redis, MongoDB, LiveKit, SMTP), network environment, etc. + validations: + required: false + + # ── Closing note ───────────────────────────────────────────────────────────── + - type: markdown + attributes: + value: | + --- + A maintainer will review your report. Please watch for follow-up questions — issues + that go unanswered are harder to resolve and may be closed after 30 days of inactivity. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..da918526e --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,24 @@ + + +Fixes # (issue) + +## How was this PR tested? + + + +- [ ] Test A +- [ ] Test B + +## Checklist: + +- [ ] I have carefully read [the contributing guidelines](https://developers.stoat.chat/developing/contrib/) +- [ ] I have performed a self-review of my own code +- [ ] I have made corresponding changes to the documentation if applicable +- [ ] I have no unrelated changes in the PR +- [ ] I have confirmed that any new dependencies are strictly necessary +- [ ] I have written tests for new code (if applicable) +- [ ] I have followed naming conventions/patterns in the surrounding code + +## Please declare, if any, LLM usage involved in creating this PR + +... diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml deleted file mode 100644 index 00f7ef712..000000000 --- a/.github/workflows/book.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Build documentation -on: - push: - branches: - - main - -jobs: - deploy: - runs-on: ubuntu-latest - permissions: - contents: write # To push a branch - pages: write # To push to a GitHub Pages site - id-token: write # To update the deployment status - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Install latest mdbook - run: | - tag=$(curl 'https://api.github.com/repos/rust-lang/mdbook/releases/latest' | jq -r '.tag_name') - url="https://github.com/rust-lang/mdbook/releases/download/${tag}/mdbook-${tag}-x86_64-unknown-linux-gnu.tar.gz" - mkdir mdbook - curl -sSL $url | tar -xz --directory=./mdbook - echo `pwd`/mdbook >> $GITHUB_PATH - - name: Build Book - run: | - cd doc - mdbook build - - name: Setup Pages - uses: actions/configure-pages@v4 - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: "doc/book" - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/docker-cleanup.yaml b/.github/workflows/docker-cleanup.yaml new file mode 100644 index 000000000..830619495 --- /dev/null +++ b/.github/workflows/docker-cleanup.yaml @@ -0,0 +1,46 @@ +name: Docker PR Image Cleanup + +on: + pull_request: + types: + - closed + +permissions: + contents: read + packages: write + +concurrency: + group: docker-cleanup-${{ github.event.pull_request.number }} + cancel-in-progress: false + +jobs: + cleanup: + runs-on: ubuntu-latest + if: ${{ !github.event.pull_request.head.repo.fork }} + strategy: + fail-fast: false + matrix: + package: + - base + - api + - events + - file-server + - proxy + - gifbox + - crond + - pushd + - voice-ingress + steps: + - env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ORG: stoatchat + PACKAGE: ${{ matrix.package }} + TAG: pr-${{ github.event.pull_request.number }} + run: | + set -euo pipefail + gh api --paginate \ + "/orgs/${ORG}/packages/container/${PACKAGE}/versions" \ + --jq ".[] | select(.metadata.container.tags | index(\"${TAG}\")) | .id" \ + | while read -r id; do + gh api -X DELETE "/orgs/${ORG}/packages/container/${PACKAGE}/versions/${id}" + done diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index fccaf6341..69df98360 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -5,20 +5,21 @@ on: tags: - "*" pull_request: - branches: - - "main" - paths: - - "Dockerfile" + workflow_dispatch: permissions: contents: read packages: write +concurrency: + group: docker-test-${{ github.head_ref || github.ref }} + cancel-in-progress: true + jobs: base: - name: Test base image build - runs-on: ubuntu-latest - if: github.event_name == 'pull_request' + name: Test base image build (fork) + runs-on: arc-runner-set + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork steps: # Configure build environment - name: Checkout @@ -38,8 +39,8 @@ jobs: cache-to: type=gha,scope=buildx-base-multi-arch,mode=max publish: - runs-on: self-hosted - if: github.event_name != 'pull_request' + runs-on: arc-runner-set + if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork }} name: Publish Docker images steps: # Configure build environment @@ -49,13 +50,6 @@ jobs: uses: docker/setup-buildx-action@v2 # Authenticate with Docker Hub and GHCR - - name: Login to DockerHub - uses: docker/login-action@v2 - with: - registry: docker.io - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Login to Github Container Registry uses: docker/login-action@v2 with: @@ -63,6 +57,15 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Determine base image tag + id: base + run: | + if [ "${{ github.event_name }}" = "pull_request" ]; then + echo "tag=pr-${{ github.event.number }}" >> "$GITHUB_OUTPUT" + else + echo "tag=latest" >> "$GITHUB_OUTPUT" + fi + # Build the image - name: Build base image uses: docker/build-push-action@v4 @@ -70,16 +73,17 @@ jobs: context: . push: true platforms: linux/amd64,linux/arm64 - tags: ghcr.io/${{ github.repository_owner }}/base:latest + tags: ghcr.io/${{ github.repository_owner }}/base:${{ steps.base.outputs.tag }} + cache-from: type=gha,scope=buildx-base-multi-arch + cache-to: type=gha,scope=buildx-base-multi-arch,mode=max - # revoltchat/server + # stoatchat/api - name: Docker meta id: meta-delta uses: docker/metadata-action@v4 with: images: | - docker.io/revoltchat/server - ghcr.io/revoltchat/server + ghcr.io/stoatchat/api - name: Publish uses: docker/build-push-action@v4 with: @@ -89,17 +93,16 @@ jobs: file: crates/delta/Dockerfile tags: ${{ steps.meta-delta.outputs.tags }} build-args: | - BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:latest + BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:${{ steps.base.outputs.tag }} labels: ${{ steps.meta-delta.outputs.labels }} - # revoltchat/bonfire + # stoatchat/events - name: Docker meta id: meta-bonfire uses: docker/metadata-action@v4 with: images: | - docker.io/revoltchat/bonfire - ghcr.io/revoltchat/bonfire + ghcr.io/stoatchat/events - name: Publish uses: docker/build-push-action@v4 with: @@ -109,17 +112,16 @@ jobs: file: crates/bonfire/Dockerfile tags: ${{ steps.meta-bonfire.outputs.tags }} build-args: | - BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:latest + BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:${{ steps.base.outputs.tag }} labels: ${{ steps.meta-bonfire.outputs.labels }} - # revoltchat/autumn + # stoatchat/file-server - name: Docker meta id: meta-autumn uses: docker/metadata-action@v4 with: images: | - docker.io/revoltchat/autumn - ghcr.io/revoltchat/autumn + ghcr.io/stoatchat/file-server - name: Publish uses: docker/build-push-action@v4 with: @@ -129,17 +131,16 @@ jobs: file: crates/services/autumn/Dockerfile tags: ${{ steps.meta-autumn.outputs.tags }} build-args: | - BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:latest + BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:${{ steps.base.outputs.tag }} labels: ${{ steps.meta-autumn.outputs.labels }} - # revoltchat/january + # stoatchat/proxy - name: Docker meta id: meta-january uses: docker/metadata-action@v4 with: images: | - docker.io/revoltchat/january - ghcr.io/revoltchat/january + ghcr.io/stoatchat/proxy - name: Publish uses: docker/build-push-action@v4 with: @@ -149,17 +150,35 @@ jobs: file: crates/services/january/Dockerfile tags: ${{ steps.meta-january.outputs.tags }} build-args: | - BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:latest + BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:${{ steps.base.outputs.tag }} labels: ${{ steps.meta-january.outputs.labels }} - # revoltchat/crond + # stoatchat/gifbox + - name: Docker meta + id: meta-gifbox + uses: docker/metadata-action@v4 + with: + images: | + ghcr.io/stoatchat/gifbox + - name: Publish + uses: docker/build-push-action@v4 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + file: crates/services/gifbox/Dockerfile + tags: ${{ steps.meta-gifbox.outputs.tags }} + build-args: | + BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:${{ steps.base.outputs.tag }} + labels: ${{ steps.meta-gifbox.outputs.labels }} + + # stoatchat/crond - name: Docker meta id: meta-crond uses: docker/metadata-action@v4 with: images: | - docker.io/revoltchat/crond - ghcr.io/revoltchat/crond + ghcr.io/stoatchat/crond - name: Publish uses: docker/build-push-action@v4 with: @@ -169,17 +188,16 @@ jobs: file: crates/daemons/crond/Dockerfile tags: ${{ steps.meta-crond.outputs.tags }} build-args: | - BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:latest + BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:${{ steps.base.outputs.tag }} labels: ${{ steps.meta-crond.outputs.labels }} - # revoltchat/pushd + # stoatchat/pushd - name: Docker meta id: meta-pushd uses: docker/metadata-action@v4 with: images: | - docker.io/revoltchat/pushd - ghcr.io/revoltchat/pushd + ghcr.io/stoatchat/pushd - name: Publish uses: docker/build-push-action@v4 with: @@ -189,5 +207,24 @@ jobs: file: crates/daemons/pushd/Dockerfile tags: ${{ steps.meta-pushd.outputs.tags }} build-args: | - BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:latest + BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:${{ steps.base.outputs.tag }} labels: ${{ steps.meta-pushd.outputs.labels }} + + # stoatchat/voice-ingress + - name: Docker meta + id: meta-voice-ingress + uses: docker/metadata-action@v4 + with: + images: | + ghcr.io/stoatchat/voice-ingress + - name: Publish + uses: docker/build-push-action@v4 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + file: crates/daemons/voice-ingress/Dockerfile + tags: ${{ steps.meta-voice-ingress.outputs.tags }} + build-args: | + BASE_IMAGE=ghcr.io/${{ github.repository_owner }}/base:${{ steps.base.outputs.tag }} + labels: ${{ steps.meta-voice-ingress.outputs.labels }} diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml new file mode 100644 index 000000000..26a065fc1 --- /dev/null +++ b/.github/workflows/docs-test.yml @@ -0,0 +1,23 @@ +name: Documentation (test) + +on: + pull_request: + +jobs: + test-deploy: + name: Test deployment + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./docs + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@cd24790a7f5f6439ac32cc94f5523cb2de8bfa8c # use-mise-action-v1.1.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + + - run: mise docs:build diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..451deda74 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,48 @@ +name: Documentation + +on: + push: + branches: + - main + +jobs: + build: + name: Build Docusaurus + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./docs + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@cd24790a7f5f6439ac32cc94f5523cb2de8bfa8c # use-mise-action-v1.1.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + + - run: mise docs:build + + - name: Upload Build Artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./docs/build + + deploy: + name: Deploy to GitHub Pages + needs: build + + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/git-town.yml b/.github/workflows/git-town.yml new file mode 100644 index 000000000..678b60c1f --- /dev/null +++ b/.github/workflows/git-town.yml @@ -0,0 +1,23 @@ +# DO NOT EDIT DIRECTLY IN REPOSITORY +# Managed in Terraform templates + +name: Git Town + +on: + pull_request: + +jobs: + git-town: + name: Display the branch stack + runs-on: ubuntu-slim + + if: ${{ github.event.pull_request.head.repo.full_name == github.repository && !startsWith(github.head_ref, 'release-please--') }} + + permissions: + contents: read + pull-requests: write + + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: stoatchat/action-git-town@4bc5c942e4603bffa0806b51d5fe5f0bc5deb0ac + continue-on-error: true \ No newline at end of file diff --git a/.github/workflows/publish-crates.yml b/.github/workflows/publish-crates.yml new file mode 100644 index 000000000..5e35d3580 --- /dev/null +++ b/.github/workflows/publish-crates.yml @@ -0,0 +1,26 @@ +name: Publish Crates + +on: + workflow_dispatch: + release: + types: [published] + +jobs: + publish: + name: Publish Crates + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + persist-credentials: false + + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@cd24790a7f5f6439ac32cc94f5523cb2de8bfa8c # use-mise-action-v1.1.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Publish + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + run: mise publish --workspace diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 000000000..63d9a88e3 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,63 @@ +name: Release Please + +on: + push: + branches: [main] # updates/opens the release PR when commits land on main + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + id-token: write + +concurrency: + group: release-please + cancel-in-progress: true + +jobs: + release-please: + name: Release Please + runs-on: ubuntu-latest + outputs: + release_created: ${{ steps.rp.outputs.release_created }} + tag_name: ${{ steps.rp.outputs.tag_name }} + steps: + - id: app-token + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ secrets.GH_STOAT_RELEASE_APP_ID }} + private-key: ${{ secrets.GH_STOAT_RELEASE_APP_PRIVATE_KEY }} + - id: rp + uses: googleapis/release-please-action@v4 + with: + token: ${{ steps.app-token.outputs.token }} + config-file: release-please-config.json + + - name: Install latest stable + uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # v1 + with: + toolchain: stable + + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + token: ${{ steps.app-token.outputs.token }} + - name: Update Cargo.lock + if: ${{ steps.rp.outputs.prs_created == 'true' || steps.rp.outputs.prs_updated == 'true' }} + env: + GH_TOKEN: ${{ steps.app-token.outputs.token }} + RP_PR_OUTPUT_JSON: ${{ steps.rp.outputs.prs }} + run: | + PR_NUMBER=$(echo "$RP_PR_OUTPUT_JSON" | jq -r '.[0].number') + gh pr checkout "$PR_NUMBER" + + cargo update -w + + if git diff --quiet Cargo.lock; then + echo "No changes to Cargo.lock" + else + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add Cargo.lock + git commit -s -m "chore: update Cargo.lock" + git push + fi diff --git a/.github/workflows/release-webhook.yml b/.github/workflows/release-webhook.yml new file mode 100644 index 000000000..3996b1f87 --- /dev/null +++ b/.github/workflows/release-webhook.yml @@ -0,0 +1,26 @@ +# DO NOT EDIT DIRECTLY IN REPOSITORY +# Managed in Terraform templates + +name: Release Webhook + +on: + workflow_dispatch: + release: + types: [published] + +jobs: + release-webhook: + name: Send Release Webhook + runs-on: ubuntu-latest + + steps: + - name: Send release notification webhook + env: + TAG_NAME: ${{ github.event.release.tag_name }} + REPOSITORY: ${{ github.repository }} + WEBHOOK_URL: ${{ secrets.STOAT_WEBHOOK_UPDATES_URL }} + run: | + RELEASE_URL="https://github.com/${REPOSITORY}/releases/tag/${TAG_NAME}" + curl -X POST "$WEBHOOK_URL" \ + -H "Content-Type: application/json" \ + -d "{\"content\": \"$RELEASE_URL\"}" \ No newline at end of file diff --git a/.github/workflows/renovate.yml b/.github/workflows/renovate.yml new file mode 100644 index 000000000..7ce0d5ba0 --- /dev/null +++ b/.github/workflows/renovate.yml @@ -0,0 +1,30 @@ +# DO NOT EDIT DIRECTLY IN REPOSITORY +# Managed in Terraform templates + +name: Renovate +on: + workflow_dispatch: + schedule: + - cron: '0/15 * * * *' +jobs: + renovate: + runs-on: ubuntu-latest + steps: + - id: app-token + uses: actions/create-github-app-token@v2 + with: + app-id: ${{ secrets.GH_STOAT_RELEASE_APP_ID }} + private-key: ${{ secrets.GH_STOAT_RELEASE_APP_PRIVATE_KEY }} + + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@7b8610a904d57da241e4ddba17fa62b62b15aed4 # use-mise-action-v2.0.2 + with: + github_token: ${{ steps.app-token.outputs.token }} + + - name: Self-hosted Renovate + uses: renovatebot/github-action@v46.1.14 + with: + token: '${{ steps.app-token.outputs.token }}' + env: + RENOVATE_PLATFORM_COMMIT: 'enabled' + RENOVATE_REPOSITORIES: '${{ github.repository }}' \ No newline at end of file diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index f0bd33894..99f218ee5 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -2,16 +2,12 @@ name: Rust build, test, and generate specification on: push: - paths-ignore: - - ".github/**" - - "!.github/workflows/rust.yaml" - - ".vscode/**" - - "doc/**" - - ".gitignore" - - "LICENSE" - - "README" - pull_request: branches: [main] + pull_request: + +concurrency: + group: rust-build-test-${{ github.head_ref || github.ref }} + cancel-in-progress: true env: CARGO_TERM_COLOR: always @@ -19,63 +15,60 @@ env: jobs: check: name: Rust project - runs-on: ubuntu-latest + runs-on: arc-runner-set steps: - - uses: actions/checkout@v2 - - name: Install latest stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - components: rustfmt, clippy - - name: Install cargo-nextest - uses: baptiste0928/cargo-install@v1 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: - crate: cargo-nextest - locked: true + persist-credentials: false - - name: Run cargo build - uses: actions-rs/cargo@v1 - with: - command: build + # Using our own runners for now: + # - name: Free up disk space + # run: | + # sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc - - name: Run services in background - run: | - docker compose -f compose.yml up -d + - name: Setup Mise + uses: immich-app/devtools/actions/use-mise@cd24790a7f5f6439ac32cc94f5523cb2de8bfa8c # use-mise-action-v1.1.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} - - name: Run cargo test + - run: mise build + - run: mise docker:start + + - name: Reference Test env: TEST_DB: REFERENCE + continue-on-error: ${{ github.ref_name == 'main' }} run: | - cargo nextest run + mise test - - name: Run cargo test (with MongoDB) + - name: MongoDB Test env: TEST_DB: MONGODB MONGODB: mongodb://localhost + continue-on-error: ${{ github.ref_name == 'main' }} run: | - cargo nextest run + mise test - name: Start API in background if: github.event_name != 'pull_request' && github.ref_name == 'main' env: TEST_DB: REFERENCE run: | - cargo build --bin revolt-delta && (cargo run --bin revolt-delta &) + mise build --bin revolt-delta && (mise service:api &) - name: Wait for API to go up if: github.event_name != 'pull_request' && github.ref_name == 'main' - uses: nev7n/wait_for_response@v1 + uses: nev7n/wait_for_response@7fef3c1a6e8939d0b09062f14fec50d3c5d15fa1 # v1.0.1 with: url: "http://localhost:14702/" - name: Checkout API repository if: github.event_name != 'pull_request' && github.ref_name == 'main' - uses: actions/checkout@v3 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: - repository: revoltchat/api + repository: stoatchat/javascript-client-api path: api - token: ${{ secrets.PAT }} + ssh-key: ${{ secrets.DEPLOY_KEY_JAVASCRIPT_CLIENT_API }} - name: Download OpenAPI specification if: github.event_name != 'pull_request' && github.ref_name == 'main' @@ -83,10 +76,10 @@ jobs: - name: Commit changes if: github.event_name != 'pull_request' && github.ref_name == 'main' - uses: EndBug/add-and-commit@v4 + uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9.1.4 with: cwd: "api" add: "*.json" - author_name: Revolt CI - author_email: revolt-ci@users.noreply.github.com + author_name: Stoat CI + author_email: stoat-ci@users.noreply.github.com message: "chore: generate OpenAPI specification" diff --git a/.github/workflows/triage_issue.yml b/.github/workflows/triage_issue.yml deleted file mode 100644 index ecc69f590..000000000 --- a/.github/workflows/triage_issue.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Add Issue to Board - -on: - issues: - types: [opened] - -jobs: - track_issue: - runs-on: ubuntu-latest - steps: - - name: Get project data - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - run: | - gh api graphql -f query=' - query { - organization(login: "revoltchat"){ - projectV2(number: 3) { - id - fields(first:20) { - nodes { - ... on ProjectV2SingleSelectField { - id - name - options { - id - name - } - } - } - } - } - } - }' > project_data.json - - echo 'PROJECT_ID='$(jq '.data.organization.projectV2.id' project_data.json) >> $GITHUB_ENV - echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV - echo 'TODO_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .options[] | select(.name=="Todo") |.id' project_data.json) >> $GITHUB_ENV - - - name: Add issue to project - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - ISSUE_ID: ${{ github.event.issue.node_id }} - run: | - item_id="$( gh api graphql -f query=' - mutation($project:ID!, $issue:ID!) { - addProjectV2ItemById(input: {projectId: $project, contentId: $issue}) { - item { - id - } - } - }' -f project=$PROJECT_ID -f issue=$ISSUE_ID --jq '.data.addProjectV2ItemById.item.id')" - - echo 'ITEM_ID='$item_id >> $GITHUB_ENV diff --git a/.github/workflows/triage_pr.yml b/.github/workflows/triage_pr.yml deleted file mode 100644 index 3010d2e5e..000000000 --- a/.github/workflows/triage_pr.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: Add PR to Board - -on: - pull_request_target: - types: [opened, synchronize, ready_for_review, review_requested] - -jobs: - track_pr: - runs-on: ubuntu-latest - steps: - - name: Get project data - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - run: | - gh api graphql -f query=' - query { - organization(login: "revoltchat"){ - projectV2(number: 5) { - id - fields(first:20) { - nodes { - ... on ProjectV2SingleSelectField { - id - name - options { - id - name - } - } - } - } - } - } - }' > project_data.json - - echo 'PROJECT_ID='$(jq '.data.organization.projectV2.id' project_data.json) >> $GITHUB_ENV - echo 'STATUS_FIELD_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .id' project_data.json) >> $GITHUB_ENV - echo 'INCOMING_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Status") | .options[] | select(.name=="🆕 Untriaged") |.id' project_data.json) >> $GITHUB_ENV - - - name: Add PR to project - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - PR_ID: ${{ github.event.pull_request.node_id }} - run: | - item_id="$( gh api graphql -f query=' - mutation($project:ID!, $pr:ID!) { - addProjectV2ItemById(input: {projectId: $project, contentId: $pr}) { - item { - id - } - } - }' -f project=$PROJECT_ID -f pr=$PR_ID --jq '.data.addProjectV2ItemById.item.id')" - - echo 'ITEM_ID='$item_id >> $GITHUB_ENV - - - name: Set fields - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - run: | - gh api graphql -f query=' - mutation ( - $project: ID! - $item: ID! - $status_field: ID! - $status_value: String! - ) { - set_status: updateProjectV2ItemFieldValue(input: { - projectId: $project - itemId: $item - fieldId: $status_field - value: { - singleSelectOptionId: $status_value - } - }) { - projectV2Item { - id - } - } - }' -f project=$PROJECT_ID -f item=$ITEM_ID -f status_field=$STATUS_FIELD_ID -f status_value=${{ env.INCOMING_OPTION_ID }} --silent diff --git a/.github/workflows/validate-pr-title.yml b/.github/workflows/validate-pr-title.yml new file mode 100644 index 000000000..1374d58cc --- /dev/null +++ b/.github/workflows/validate-pr-title.yml @@ -0,0 +1,23 @@ +# DO NOT EDIT DIRECTLY IN REPOSITORY +# Managed in Terraform templates + +name: "Lint PR" + +on: + pull_request_target: + types: + - opened + - reopened + - edited + - synchronize + +jobs: + main: + name: Validate PR title + runs-on: ubuntu-latest + permissions: + pull-requests: read + steps: + - uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8483bc435..ae3bfadb5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ venv/ .vercel .DS_Store +livekit.yml .idea \ No newline at end of file diff --git a/.mise/config.toml b/.mise/config.toml new file mode 100644 index 000000000..331ba7971 --- /dev/null +++ b/.mise/config.toml @@ -0,0 +1,28 @@ +[tools] +node = "25.4.0" +pnpm = "10.28.1" + +gh = "2.25.0" + +rust = "1.92.0" +"cargo:cargo-nextest" = "0.9.122" + +"github:git-town/git-town" = "22.7.1" + +[settings] +experimental = true +idiomatic_version_file_enable_tools = ["rust"] + +[tasks.start] +description = "Run all services" +depends = ["docker:start", "build"] +wait_for = ["docker:start", "build"] +run = [{ task = "service:*" }] + +[env] +BUILDER = "cargo" +DOCKER_NETWORK_NAME = "stoatchat_default" +DATABASE_PORT = "27017" +RABBIT_PORT = "5672" +REDIS_PORT = "6379" +_.file = { path = ".env", tools = true } diff --git a/.mise/tasks/build b/.mise/tasks/build new file mode 100755 index 000000000..2e584eaf4 --- /dev/null +++ b/.mise/tasks/build @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Build project" +set -e + +${BUILDER} build "$@" diff --git a/.mise/tasks/check b/.mise/tasks/check new file mode 100755 index 000000000..116f10166 --- /dev/null +++ b/.mise/tasks/check @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Check project with clippy" +set -e + +cargo clippy diff --git a/.mise/tasks/docker/start b/.mise/tasks/docker/start new file mode 100755 index 000000000..c045a4bd0 --- /dev/null +++ b/.mise/tasks/docker/start @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +#MISE description="Start Docker containers" +set -e + +docker compose up -d + +docker run \ +--network=${DOCKER_NETWORK_NAME} \ +--name wait \ +--rm dokku/wait -c \ +rabbit:${RABBIT_PORT},\ +database:${DATABASE_PORT},\ +redis:${REDIS_PORT} diff --git a/.mise/tasks/docker/stop b/.mise/tasks/docker/stop new file mode 100755 index 000000000..51d39d613 --- /dev/null +++ b/.mise/tasks/docker/stop @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Stop Docker containers" +set -e + +docker compose down diff --git a/.mise/tasks/docs/_default b/.mise/tasks/docs/_default new file mode 100755 index 000000000..742d586fd --- /dev/null +++ b/.mise/tasks/docs/_default @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +#MISE description="Start the Stoat Developers website" +#MISE depends=["docs:install"] +#MISE dir="{{config_root}}/docs" +set -e + +pnpm build diff --git a/.mise/tasks/docs/build b/.mise/tasks/docs/build new file mode 100755 index 000000000..ae3cdb65f --- /dev/null +++ b/.mise/tasks/docs/build @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +#MISE description="Build the Stoat Developers website" +#MISE depends=["docs:install"] +#MISE dir="{{config_root}}/docs" +set -e + +pnpm build diff --git a/.mise/tasks/docs/install b/.mise/tasks/docs/install new file mode 100755 index 000000000..753779c1d --- /dev/null +++ b/.mise/tasks/docs/install @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +#MISE description="Install dependencies for docs site" +#MISE dir="{{config_root}}/docs" +set -e + +pnpm i --frozen-lockfile diff --git a/.mise/tasks/publish b/.mise/tasks/publish new file mode 100755 index 000000000..27df8f9a7 --- /dev/null +++ b/.mise/tasks/publish @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Publish project" +set -e + +cargo publish "$@" diff --git a/.mise/tasks/service/api b/.mise/tasks/service/api new file mode 100755 index 000000000..07915c17c --- /dev/null +++ b/.mise/tasks/service/api @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Run API server" +set -e + +cargo run --bin revolt-delta diff --git a/.mise/tasks/service/crond b/.mise/tasks/service/crond new file mode 100755 index 000000000..ce4bc4918 --- /dev/null +++ b/.mise/tasks/service/crond @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Run cron daemon" +set -e + +cargo run --bin revolt-crond diff --git a/.mise/tasks/service/events b/.mise/tasks/service/events new file mode 100755 index 000000000..85bea49a6 --- /dev/null +++ b/.mise/tasks/service/events @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Run events server" +set -e + +cargo run --bin revolt-bonfire diff --git a/.mise/tasks/service/files b/.mise/tasks/service/files new file mode 100755 index 000000000..431c5a521 --- /dev/null +++ b/.mise/tasks/service/files @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Run file server" +set -e + +cargo run --bin revolt-autumn diff --git a/.mise/tasks/service/gifbox b/.mise/tasks/service/gifbox new file mode 100755 index 000000000..bc72192be --- /dev/null +++ b/.mise/tasks/service/gifbox @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Run GIF proxy server" +set -e + +cargo run --bin revolt-gifbox diff --git a/.mise/tasks/service/proxy b/.mise/tasks/service/proxy new file mode 100755 index 000000000..a16634fc4 --- /dev/null +++ b/.mise/tasks/service/proxy @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Run proxy server" +set -e + +cargo run --bin revolt-january diff --git a/.mise/tasks/service/pushd b/.mise/tasks/service/pushd new file mode 100755 index 000000000..1cbb96bab --- /dev/null +++ b/.mise/tasks/service/pushd @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +#MISE description="Run push daemon" +set -e + +cargo run --bin revolt-pushd diff --git a/.mise/tasks/test b/.mise/tasks/test new file mode 100755 index 000000000..848ad35db --- /dev/null +++ b/.mise/tasks/test @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +#MISE description="Test project" +set -e + +: "${TEST_DB:=REFERENCE}" +export TEST_DB + +cargo nextest run diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 000000000..297819281 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.13.7" +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..9912f5b65 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,288 @@ +# Changelog + +## [0.13.7](https://github.com/stoatchat/stoatchat/compare/v0.13.6...v0.13.7) (2026-05-21) + + +### Bug Fixes + +* sanitize emoji input to handle variation selectors ([#774](https://github.com/stoatchat/stoatchat/issues/774)) ([2d308e0](https://github.com/stoatchat/stoatchat/commit/2d308e03d58c19f27b5b4d65dc2a15ef20b56190)) +* update mention count badge for channel acks ([#769](https://github.com/stoatchat/stoatchat/issues/769)) ([0d9ae50](https://github.com/stoatchat/stoatchat/commit/0d9ae508d9d2199f0e408b8ca634d20489be6f61)) + +## [0.13.6](https://github.com/stoatchat/stoatchat/compare/v0.13.5...v0.13.6) (2026-05-18) + + +### Features + +* Update FCM payload for android notifications ([#766](https://github.com/stoatchat/stoatchat/issues/766)) ([acbc087](https://github.com/stoatchat/stoatchat/commit/acbc087982e9aeb05cabc5ab4c9b1291f67490ad)) +* user slowmode events ([#760](https://github.com/stoatchat/stoatchat/issues/760)) ([af0d8aa](https://github.com/stoatchat/stoatchat/commit/af0d8aad14dc68d88159d0e1c714077d362e21e4)) + + +### Bug Fixes + +* include `minio` region as tests need it ([#761](https://github.com/stoatchat/stoatchat/issues/761)) ([298742d](https://github.com/stoatchat/stoatchat/commit/298742dbad4eafae356f976c56b9db23904b0c3a)) +* set env var for publishing crates ([#768](https://github.com/stoatchat/stoatchat/issues/768)) ([018afaf](https://github.com/stoatchat/stoatchat/commit/018afaf38f6330d92dad2a68b640c0cb3f6b639a)) +* Use proper headers to determine IP when not behind cloudflare ([#764](https://github.com/stoatchat/stoatchat/issues/764)) ([494c8b7](https://github.com/stoatchat/stoatchat/commit/494c8b7cabaae2a51039a7a5b559d5e2e5279554)) +* voice ingress crashing due to new Result in AMQP::new_auto() ([#765](https://github.com/stoatchat/stoatchat/issues/765)) ([2871632](https://github.com/stoatchat/stoatchat/commit/2871632382395cb20cbe0047c542d3ac31ff3f03)) + + +### Miscellaneous Chores + +* switch to lapin ([#767](https://github.com/stoatchat/stoatchat/issues/767)) ([5b19853](https://github.com/stoatchat/stoatchat/commit/5b1985381ae829a92c80a19e91a414cd9dc4de93)) + +## [0.13.5](https://github.com/stoatchat/stoatchat/compare/v0.13.4...v0.13.5) (2026-05-17) + + +### Bug Fixes + +* dont panic on hash missing when deleting files ([#755](https://github.com/stoatchat/stoatchat/issues/755)) ([c902077](https://github.com/stoatchat/stoatchat/commit/c902077cf51076fee11712eb732dc8a8f786fc4b)) + +## [0.13.4](https://github.com/stoatchat/stoatchat/compare/v0.13.3...v0.13.4) (2026-05-16) + + +### Bug Fixes + +* add TLS feature to livekit-api crate ([#753](https://github.com/stoatchat/stoatchat/issues/753)) ([6cfee1f](https://github.com/stoatchat/stoatchat/commit/6cfee1f601c1e084df7c8f1e7a5e8a560d1dd514)) + +## [0.13.3](https://github.com/stoatchat/stoatchat/compare/v0.13.2...v0.13.3) (2026-05-15) + + +### Bug Fixes + +* don't automatically set up rabbitmq in delta ([#749](https://github.com/stoatchat/stoatchat/issues/749)) ([7647cfc](https://github.com/stoatchat/stoatchat/commit/7647cfc8d93aba99f5faef13eb3d970097540d76)) +* don't declare queues which seem to cause the backend to crash in prod ([7647cfc](https://github.com/stoatchat/stoatchat/commit/7647cfc8d93aba99f5faef13eb3d970097540d76)) + +## [0.13.2](https://github.com/stoatchat/stoatchat/compare/v0.13.1...v0.13.2) (2026-05-11) + + +### Bug Fixes + +* update default exchange to `revolt.default` ([#746](https://github.com/stoatchat/stoatchat/issues/746)) ([fcb8091](https://github.com/stoatchat/stoatchat/commit/fcb8091cd7a00d7f26c798daa33aae4b923b2a8b)) + +## [0.13.1](https://github.com/stoatchat/stoatchat/compare/v0.13.0...v0.13.1) (2026-05-10) + + +### Bug Fixes + +* amqprs startup bug ([#744](https://github.com/stoatchat/stoatchat/issues/744)) ([1100eaf](https://github.com/stoatchat/stoatchat/commit/1100eaf46f849f2509ae01ac497556ca33bde778)) + +## [0.13.0](https://github.com/stoatchat/stoatchat/compare/v0.12.1...v0.13.0) (2026-05-08) + + +### Features + +* add embed support for YouTube Shorts ([#734](https://github.com/stoatchat/stoatchat/issues/734)) ([d46c7f7](https://github.com/stoatchat/stoatchat/commit/d46c7f7f3c04524c0639c3e0a122626f8e0b3bf7)) +* add emoji rename endpoint ([#714](https://github.com/stoatchat/stoatchat/issues/714)) ([23ad135](https://github.com/stoatchat/stoatchat/commit/23ad1359834bb7d07a460b8678d6a6ebffc73eb0)) +* add legal links to root payload ([#733](https://github.com/stoatchat/stoatchat/issues/733)) ([21d8201](https://github.com/stoatchat/stoatchat/commit/21d82018cf84ab0fdd10613d254b9562aea8eea3)) +* add role icon support ([#724](https://github.com/stoatchat/stoatchat/issues/724)) ([841985d](https://github.com/stoatchat/stoatchat/commit/841985d3b994df1c6eefab2fc7ecbd77ab22c493)) +* Add webhook endpoints for editing and deleting messages ([#682](https://github.com/stoatchat/stoatchat/issues/682)) ([6f3441c](https://github.com/stoatchat/stoatchat/commit/6f3441cf4acac2a8e6e1bf07a279a153b80f7956)) +* automatically sanitise usernames on create/update ([#689](https://github.com/stoatchat/stoatchat/issues/689)) ([e937697](https://github.com/stoatchat/stoatchat/commit/e93769786c7669485a659ee471630740d3cea702)) +* blacklist private ip ranges and add january domain blocklist ([#731](https://github.com/stoatchat/stoatchat/issues/731)) ([6b41db9](https://github.com/stoatchat/stoatchat/commit/6b41db984bb491b2e58324309cc70d8c14e0b814)) +* Rewrite acks ([#741](https://github.com/stoatchat/stoatchat/issues/741)) ([ab5bd47](https://github.com/stoatchat/stoatchat/commit/ab5bd47a39ee889de0b5ae6e7b560620853daead)) + + +### Bug Fixes + +* add new_user_hours to configuration limits ([#729](https://github.com/stoatchat/stoatchat/issues/729)) ([279f5d5](https://github.com/stoatchat/stoatchat/commit/279f5d5fd7af2df55902c706859ec07f569cdb1e)) +* add reconnection policy to Redis subscriber to prevent ghost state ([#708](https://github.com/stoatchat/stoatchat/issues/708)) ([057f2bb](https://github.com/stoatchat/stoatchat/commit/057f2bb8b359f8b942741a30ff54eeb8fbe3e0b1)) +* docker compose file had personal url in it ([#742](https://github.com/stoatchat/stoatchat/issues/742)) ([0719985](https://github.com/stoatchat/stoatchat/commit/0719985ac5636590f91e6f9ec4b68f3eded70c13)) +* don't strip ICC from exif ([#735](https://github.com/stoatchat/stoatchat/issues/735)) ([d76a711](https://github.com/stoatchat/stoatchat/commit/d76a71141f3e508f6308ba52fa28eaeb56fb3438)) +* dont send notification in fcm ([#721](https://github.com/stoatchat/stoatchat/issues/721)) ([89171e9](https://github.com/stoatchat/stoatchat/commit/89171e9bd0f15711157e78c6eec0fe7b480de93a)) +* encode filenames in redirects ([#737](https://github.com/stoatchat/stoatchat/issues/737)) ([9fd7128](https://github.com/stoatchat/stoatchat/commit/9fd7128f800badbd184baf943d4f799e601201e4)) +* january ip redirects & domain resolver ([#738](https://github.com/stoatchat/stoatchat/issues/738)) ([356491e](https://github.com/stoatchat/stoatchat/commit/356491e934b274f9e895df883dd63ef0b3123510)) +* update message length validation to remove upper limit ([#723](https://github.com/stoatchat/stoatchat/issues/723)) ([ed4fd5e](https://github.com/stoatchat/stoatchat/commit/ed4fd5ebfe6d0ea534a0898da4afdc1f4e2cd6c5)) +* use correct response for NoEffect errors ([#732](https://github.com/stoatchat/stoatchat/issues/732)) ([5378cd2](https://github.com/stoatchat/stoatchat/commit/5378cd22b4c7d85f44c31a6af0dda00941b80d5c)) + +## [0.12.1](https://github.com/stoatchat/stoatchat/compare/v0.12.0...v0.12.1) (2026-04-10) + + +### Bug Fixes + +* add migration to update existing files to be animated ([#705](https://github.com/stoatchat/stoatchat/issues/705)) ([f2c056a](https://github.com/stoatchat/stoatchat/commit/f2c056a1515be493b195f3f5db5886c2ddf36700)) +* don't send self dm notifications ([#706](https://github.com/stoatchat/stoatchat/issues/706)) ([f30b729](https://github.com/stoatchat/stoatchat/commit/f30b729ca90d0be6853c57ab4935694e5e59ae56)) +* mise start + missing docker image ([#564](https://github.com/stoatchat/stoatchat/issues/564)) ([fb8fe16](https://github.com/stoatchat/stoatchat/commit/fb8fe1655776791421284a6a093e86f0320c258a)) +* test failure due to wrong assertion ([#707](https://github.com/stoatchat/stoatchat/issues/707)) ([f81e329](https://github.com/stoatchat/stoatchat/commit/f81e3291bdd57af9ceedb2987b111acc7051d69c)) + +## [0.12.0](https://github.com/stoatchat/stoatchat/compare/v0.11.5...v0.12.0) (2026-03-28) + + +### Features + +* add bug report template for issue tracking ([#627](https://github.com/stoatchat/stoatchat/issues/627)) ([f777e28](https://github.com/stoatchat/stoatchat/commit/f777e2863c6ca50057c8b5d0a5be14915d287724)) +* Add slowmode functionality to text channels ([#680](https://github.com/stoatchat/stoatchat/issues/680)) ([6107f24](https://github.com/stoatchat/stoatchat/commit/6107f242fd3ebaff71a15f9a16330ffbcb4f2d7b)) +* Allow restricting server creation to specific users ([#685](https://github.com/stoatchat/stoatchat/issues/685)) ([edfa97d](https://github.com/stoatchat/stoatchat/commit/edfa97db108c9c81828547f98a1db5315cb5ba4a)) +* compute thumbhash for images ([#596](https://github.com/stoatchat/stoatchat/issues/596)) ([c2d4369](https://github.com/stoatchat/stoatchat/commit/c2d4369e160f32d79bce0a0b0f14677f89de3669)) +* Detect animation in image files for fetch_preview ([#574](https://github.com/stoatchat/stoatchat/issues/574)) ([3fa0abf](https://github.com/stoatchat/stoatchat/commit/3fa0abf47f5f42ddd8ee041fe4c44fbc5ba800c1)) +* expose global and user limits in root API response ([#644](https://github.com/stoatchat/stoatchat/issues/644)) ([0b522eb](https://github.com/stoatchat/stoatchat/commit/0b522ebddc17f2e3f792ff5e2347793e9849fa23)) +* implement time based message sweep on user ban ([#670](https://github.com/stoatchat/stoatchat/issues/670)) ([98c7b1b](https://github.com/stoatchat/stoatchat/commit/98c7b1b5a5b9fdac5c0ab83be10f0e23114dbfc9)) +* load config from env vars ([#576](https://github.com/stoatchat/stoatchat/issues/576)) ([5191bd1](https://github.com/stoatchat/stoatchat/commit/5191bd16b2a905b8409838e34eb0baca96f08580)) +* parse message push notification content and replace internal formatting ([#693](https://github.com/stoatchat/stoatchat/issues/693)) ([d1e72ce](https://github.com/stoatchat/stoatchat/commit/d1e72cee42c54e16f4e49af569897528b10a28ca)) +* Transfer ownership ([#396](https://github.com/stoatchat/stoatchat/issues/396)) ([735d644](https://github.com/stoatchat/stoatchat/commit/735d644e043793cb86e74aab5b88bb4b8bc17ba2)) +* update livekit ([#698](https://github.com/stoatchat/stoatchat/issues/698)) ([f181edc](https://github.com/stoatchat/stoatchat/commit/f181edc8f2ff3ce4b6d48938dfc73931ecfa2279)) + + +### Bug Fixes + +* add flag for disabling events instead of commenting them out ([#695](https://github.com/stoatchat/stoatchat/issues/695)) ([a5cd08a](https://github.com/stoatchat/stoatchat/commit/a5cd08a655dece4269f3ac84fa2387ae356709a5)) +* add masquerade permission to default direct message settings ([#665](https://github.com/stoatchat/stoatchat/issues/665)) ([ab52569](https://github.com/stoatchat/stoatchat/commit/ab525699bd6663333f0e9fed6d2455e482e6a09f)) +* Check for appropriate permission for removing other users avatar ([#657](https://github.com/stoatchat/stoatchat/issues/657)) ([d56135e](https://github.com/stoatchat/stoatchat/commit/d56135e0cbc713884c9378832952f7ad490fa315)) +* default video resolution is a non-existent size ([#601](https://github.com/stoatchat/stoatchat/issues/601)) ([0698e11](https://github.com/stoatchat/stoatchat/commit/0698e115e8d003d615e468c4fb9654e6bbc9107f)), closes [#588](https://github.com/stoatchat/stoatchat/issues/588) +* **docs:** Update GitHub links ([#647](https://github.com/stoatchat/stoatchat/issues/647)) ([b830631](https://github.com/stoatchat/stoatchat/commit/b830631bd25a546844b7bdd30386084bb365e4de)) +* don't use a bitop for OR ([#676](https://github.com/stoatchat/stoatchat/issues/676)) ([5701b5c](https://github.com/stoatchat/stoatchat/commit/5701b5c18c513f796af365169ceaea372a22638c)) +* Fix typo for p256dh in vapid notification flow ([#622](https://github.com/stoatchat/stoatchat/issues/622)) ([a80ad1c](https://github.com/stoatchat/stoatchat/commit/a80ad1cbe58b8af5e45751e51d94d93c1cea1c9f)) +* improve generated openapi.json ([#584](https://github.com/stoatchat/stoatchat/issues/584)) ([52ed510](https://github.com/stoatchat/stoatchat/commit/52ed5100c2446e0b261085639e123e7e124cab2c)) +* no node state set on channel creation ([#653](https://github.com/stoatchat/stoatchat/issues/653)) ([24d0d2b](https://github.com/stoatchat/stoatchat/commit/24d0d2b7266f6f8a692d0a52704acfecf517674c)) +* only show first line on commit messages ([#696](https://github.com/stoatchat/stoatchat/issues/696)) ([91783b9](https://github.com/stoatchat/stoatchat/commit/91783b906697fc85305dee683f7c15dda55f0c50)) +* pass &str to Reference ([#697](https://github.com/stoatchat/stoatchat/issues/697)) ([ccda6f5](https://github.com/stoatchat/stoatchat/commit/ccda6f5c53ee043705f7ff6b5f6c393f020781de)) +* redis_url vs redis_uri in config ([#666](https://github.com/stoatchat/stoatchat/issues/666)) ([b0b728f](https://github.com/stoatchat/stoatchat/commit/b0b728fb0dbc9ee28360301de1c3ea501bbbff1d)) +* replace some links and Revolt mentions to current Stoat ([#515](https://github.com/stoatchat/stoatchat/issues/515)) ([d629e89](https://github.com/stoatchat/stoatchat/commit/d629e89304be2f0011e189293b278f07d346aa7d)) +* send push notifications for DM and group messages ([#660](https://github.com/stoatchat/stoatchat/issues/660)) ([52c0d2f](https://github.com/stoatchat/stoatchat/commit/52c0d2f266b76d8975bba2d5e75c62bb30149c45)) +* store server id in redis and in room metadata to be able to delete voice state in all scenarios ([#656](https://github.com/stoatchat/stoatchat/issues/656)) ([49c6289](https://github.com/stoatchat/stoatchat/commit/49c628958070e4f0a5edc764d3b48158589219d9)) +* uname is missing from crond ([#675](https://github.com/stoatchat/stoatchat/issues/675)) ([dc4438b](https://github.com/stoatchat/stoatchat/commit/dc4438bc3c7b2cad8d442b3cd438afb9ed566a5e)) + +## [0.11.5](https://github.com/stoatchat/stoatchat/compare/v0.11.4...v0.11.5) (2026-02-17) + + +### Reverts + +* disable user update events ([#593](https://github.com/stoatchat/stoatchat/issues/593)) ([1c98ead](https://github.com/stoatchat/stoatchat/commit/1c98ead69579b4700be0b51c9020bb8402336cc6)) + +## [0.11.4](https://github.com/stoatchat/stoatchat/compare/v0.11.3...v0.11.4) (2026-02-16) + + +### Bug Fixes + +* add separate config option for redis events replica url ([#590](https://github.com/stoatchat/stoatchat/issues/590)) ([a75e4ea](https://github.com/stoatchat/stoatchat/commit/a75e4eabfc4b34aba7620c82ba77558a32d9e10a)) + +## [0.11.3](https://github.com/stoatchat/stoatchat/compare/v0.11.2...v0.11.3) (2026-02-13) + + +### Bug Fixes + +* cut presence traffic too while we engineer a new events architecture ([#561](https://github.com/stoatchat/stoatchat/issues/561)) ([1f8ea96](https://github.com/stoatchat/stoatchat/commit/1f8ea963ad742f693f405e6438f1c343c81e6579)) + +## [0.11.2](https://github.com/stoatchat/stoatchat/compare/v0.11.1...v0.11.2) (2026-02-13) + + +### Bug Fixes + +* cut events traffic while we engineer a new events architecture ([#559](https://github.com/stoatchat/stoatchat/issues/559)) ([a11986b](https://github.com/stoatchat/stoatchat/commit/a11986ba1ad16b672ff1080913a684567d88adbb)) + +## [0.11.1](https://github.com/stoatchat/stoatchat/compare/v0.11.0...v0.11.1) (2026-02-13) + + +### Bug Fixes + +* bots in multiple voice channel logic ([#544](https://github.com/stoatchat/stoatchat/issues/544)) ([94cb916](https://github.com/stoatchat/stoatchat/commit/94cb916231b9b8befb2e94065917ff40815bec52)) + +## [0.11.0](https://github.com/stoatchat/stoatchat/compare/v0.10.3...v0.11.0) (2026-02-10) + + +### Features + +* appeal to the almighty Spamhaus ([#524](https://github.com/stoatchat/stoatchat/issues/524)) ([5132270](https://github.com/stoatchat/stoatchat/commit/5132270f2edd6df25ce414daa42ed1b2aa6fa7a9)) + +## [0.10.3](https://github.com/stoatchat/stoatchat/compare/v0.10.2...v0.10.3) (2026-02-07) + + +### Bug Fixes + +* update `Revolt` -> `Stoat` in email titles/desc. ([#508](https://github.com/stoatchat/stoatchat/issues/508)) ([84483ce](https://github.com/stoatchat/stoatchat/commit/84483cee7af3e5dfa16f7fe13e334c4d9f5abd60)) + +## [0.10.2](https://github.com/stoatchat/stoatchat/compare/v0.10.1...v0.10.2) (2026-01-25) + + +### Bug Fixes + +* thumbnailification requires rgb8/rgba8 ([#505](https://github.com/stoatchat/stoatchat/issues/505)) ([413aa04](https://github.com/stoatchat/stoatchat/commit/413aa04dcaf8bff3935ed1e5f31432e11a03ce6f)) + +## [0.10.1](https://github.com/stoatchat/stoatchat/compare/v0.10.0...v0.10.1) (2026-01-25) + + +### Bug Fixes + +* use Rust 1.92.0 for Docker build ([#503](https://github.com/stoatchat/stoatchat/issues/503)) ([98da8a2](https://github.com/stoatchat/stoatchat/commit/98da8a28a0aa2fee4e8eee1d86bd7c49e3187477)) + +## [0.10.0](https://github.com/stoatchat/stoatchat/compare/v0.9.4...v0.10.0) (2026-01-25) + + +### Features + +* allow kicking members from voice channels ([#495](https://github.com/stoatchat/stoatchat/issues/495)) ([0dc5442](https://github.com/stoatchat/stoatchat/commit/0dc544249825a49c793309edee5ec1838458a6da)) +* repository architecture for files crate w. added tests ([#498](https://github.com/stoatchat/stoatchat/issues/498)) ([01ded20](https://github.com/stoatchat/stoatchat/commit/01ded209c62208fc906d6aab9b08c04e860e10ef)) + + +### Bug Fixes + +* expose ratelimit headers via cors ([#496](https://github.com/stoatchat/stoatchat/issues/496)) ([a1a2125](https://github.com/stoatchat/stoatchat/commit/a1a21252d0ad58937e41f16e5fb86f96bebd2a51)) + +## [0.9.4](https://github.com/stoatchat/stoatchat/compare/v0.9.3...v0.9.4) (2026-01-10) + + +### Bug Fixes + +* checkout repo. before bumping lock ([#490](https://github.com/stoatchat/stoatchat/issues/490)) ([b2da2a8](https://github.com/stoatchat/stoatchat/commit/b2da2a858787853be43136fd526a0bd72baf78ef)) +* persist credentials for git repo ([#492](https://github.com/stoatchat/stoatchat/issues/492)) ([c674a9f](https://github.com/stoatchat/stoatchat/commit/c674a9fd4e0abbd51569870e4b38074d4a1de03c)) + +## [0.9.3](https://github.com/stoatchat/stoatchat/compare/v0.9.2...v0.9.3) (2026-01-10) + + +### Bug Fixes + +* pipeline fixes ([#487](https://github.com/stoatchat/stoatchat/issues/487)) ([aeeafeb](https://github.com/stoatchat/stoatchat/commit/aeeafebefc36a43a656cf797c9251ca50292733c)) + +## [0.9.2](https://github.com/stoatchat/stoatchat/compare/v0.9.1...v0.9.2) (2026-01-10) + + +### Bug Fixes + +* disable publish for services ([#485](https://github.com/stoatchat/stoatchat/issues/485)) ([d13609c](https://github.com/stoatchat/stoatchat/commit/d13609c37279d6a40445dcd99564e5c3dd03bac1)) + +## [0.9.1](https://github.com/stoatchat/stoatchat/compare/v0.9.0...v0.9.1) (2026-01-10) + + +### Bug Fixes + +* **ci:** pipeline fixes (marked as fix to force release) ([#483](https://github.com/stoatchat/stoatchat/issues/483)) ([303e52b](https://github.com/stoatchat/stoatchat/commit/303e52b476585eea81c33837f1b01506ce387684)) + +## [0.9.0](https://github.com/stoatchat/stoatchat/compare/v0.8.8...v0.9.0) (2026-01-10) + + +### Features + +* add id field to role ([#470](https://github.com/stoatchat/stoatchat/issues/470)) ([2afea56](https://github.com/stoatchat/stoatchat/commit/2afea56e56017f02de98e67316b4457568ad5b26)) +* add ratelimits to gifbox ([1542047](https://github.com/stoatchat/stoatchat/commit/154204742d21cbeff6e2577b00f50b495ea44631)) +* include groups and dms in fetch mutuals ([caa8607](https://github.com/stoatchat/stoatchat/commit/caa86074680d46223cebc20f41e9c91c41ec825d)) +* include member payload in ServerMemberJoin event ([480f210](https://github.com/stoatchat/stoatchat/commit/480f210ce85271e13d1dac58a5dae08de108579d)) +* initial work on tenor gif searching ([b0c977b](https://github.com/stoatchat/stoatchat/commit/b0c977b324b8144c1152589546eb8fec5954c3e7)) +* make message lexer use unowned string ([1561481](https://github.com/stoatchat/stoatchat/commit/1561481eb4cdc0f385fbf0a81e4950408050e11f)) +* ready payload field customisation ([db57706](https://github.com/stoatchat/stoatchat/commit/db577067948f13e830b5fb773034e9713a1abaff)) +* require auth for search ([b5cd5e3](https://github.com/stoatchat/stoatchat/commit/b5cd5e30ef7d5e56e8964fb7c543965fa6bf5a4a)) +* trending and categories routes ([5885e06](https://github.com/stoatchat/stoatchat/commit/5885e067a627b8fff1c8ce2bf9e852ff8cf3f07a)) +* voice chats v2 ([#414](https://github.com/stoatchat/stoatchat/issues/414)) ([d567155](https://github.com/stoatchat/stoatchat/commit/d567155f124e4da74115b1a8f810062f7c6559d9)) + + +### Bug Fixes + +* add license to revolt-parser ([5335124](https://github.com/stoatchat/stoatchat/commit/53351243064cac8d499dd74284be73928fa78a43)) +* allow for disabling default features ([65fbd36](https://github.com/stoatchat/stoatchat/commit/65fbd3662462aed1333b79e59155fa6377e83fcc)) +* apple music to use original url instead of metadata url ([bfe4018](https://github.com/stoatchat/stoatchat/commit/bfe4018e436a4075bae780dd4d35a9b58315e12f)) +* apply uname fix to january and autumn ([8f9015a](https://github.com/stoatchat/stoatchat/commit/8f9015a6ff181d208d9269ab8691bd417d39811a)) +* **ci:** publish images under stoatchat and remove docker hub ([d65c1a1](https://github.com/stoatchat/stoatchat/commit/d65c1a1ab3bdc7e5684b03f280af77d881661a3d)) +* correct miniz_oxide in lockfile ([#478](https://github.com/stoatchat/stoatchat/issues/478)) ([5d27a91](https://github.com/stoatchat/stoatchat/commit/5d27a91e901dd2ea3e860aeaed8468db6c5f3214)) +* correct shebang for try-tag-and-release ([050ba16](https://github.com/stoatchat/stoatchat/commit/050ba16d4adad5d0fb247867aa3e94e3d42bd12d)) +* correct string_cache in lockfile ([#479](https://github.com/stoatchat/stoatchat/issues/479)) ([0b178fc](https://github.com/stoatchat/stoatchat/commit/0b178fc791583064bf9ca94b1d39b42d021e1d79)) +* don't remove timeouts when a member leaves a server ([#409](https://github.com/stoatchat/stoatchat/issues/409)) ([e635bc2](https://github.com/stoatchat/stoatchat/commit/e635bc23ec857d648d5705e1a3875d7bc3402b0d)) +* don't update the same field while trying to remove it ([f4ee35f](https://github.com/stoatchat/stoatchat/commit/f4ee35fb093ca49f0a64ff4b17fd61587df28145)), closes [#392](https://github.com/stoatchat/stoatchat/issues/392) +* github webhook incorrect payload and formatting ([#468](https://github.com/stoatchat/stoatchat/issues/468)) ([dc9c82a](https://github.com/stoatchat/stoatchat/commit/dc9c82aa4e9667ea6639256c65ac8de37a24d1f7)) +* implement Serialize to ClientMessage ([dea0f67](https://github.com/stoatchat/stoatchat/commit/dea0f675dde7a63c7a59b38d469f878b7a8a3af4)) +* newly created roles should be ranked the lowest ([947eb15](https://github.com/stoatchat/stoatchat/commit/947eb15771ed6785b3dcd16c354c03ded5e4cbe0)) +* permit empty `remove` array in edit requests ([6ad3da5](https://github.com/stoatchat/stoatchat/commit/6ad3da5f35f989a2e7d8e29718b98374248e76af)) +* preserve order of replies in message ([#447](https://github.com/stoatchat/stoatchat/issues/447)) ([657a3f0](https://github.com/stoatchat/stoatchat/commit/657a3f08e5d652814bbf0647e089ed9ebb139bbf)) +* prevent timing out members which have TimeoutMembers permission ([e36fc97](https://github.com/stoatchat/stoatchat/commit/e36fc9738bac0de4f3fcbccba521f1e3754f7ae7)) +* relax settings name regex ([3a34159](https://github.com/stoatchat/stoatchat/commit/3a3415915f0d0fdce1499d47a2b7fa097f5946ea)) +* remove authentication tag bytes from attachment download ([32e6600](https://github.com/stoatchat/stoatchat/commit/32e6600272b885c595c094f0bc69459250220dcb)) +* rename openapi operation ids ([6048587](https://github.com/stoatchat/stoatchat/commit/6048587d348fbca0dc3a9b47690c56df8fece576)), closes [#406](https://github.com/stoatchat/stoatchat/issues/406) +* respond with 201 if no body in requests ([#465](https://github.com/stoatchat/stoatchat/issues/465)) ([24fedf8](https://github.com/stoatchat/stoatchat/commit/24fedf8c4d9cd3160bdec97aa451520f8beaa739)) +* swap to using reqwest for query building ([38dd4d1](https://github.com/stoatchat/stoatchat/commit/38dd4d10797b3e6e397fc219e818f379bdff19f2)) +* use `trust_cloudflare` config value instead of env var ([cc7a796](https://github.com/stoatchat/stoatchat/commit/cc7a7962a882e1627fcd0bc75858a017415e8cfc)) +* use our own result types instead of tenors types ([a92152d](https://github.com/stoatchat/stoatchat/commit/a92152d86da136997817e797c7af8e38731cdde8)) diff --git a/Cargo.lock b/Cargo.lock index 4d310e03f..872ee2a0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -23,7 +23,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "generic-array 0.14.7", ] @@ -35,7 +35,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -58,7 +58,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "version_check", ] @@ -70,7 +70,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -78,13 +78,22 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + [[package]] name = "aligned-vec" version = "0.6.4" @@ -94,6 +103,21 @@ dependencies = [ "equator", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -101,35 +125,54 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] -name = "amqp_serde" -version = "0.4.2" +name = "amq-protocol" +version = "10.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46af430da4849b906416235798be5d0b8ff07e478d9809f05a00f81eb9527781" +checksum = "2eab68e8836c5812a01b34c5364d28db50bf686b442e902d9d93e4472318d86e" dependencies = [ - "bytes 1.10.1", + "amq-protocol-tcp", + "amq-protocol-types", + "amq-protocol-uri", + "cookie-factory", + "nom 8.0.0", "serde", - "serde_bytes", ] [[package]] -name = "amqprs" -version = "1.8.0" +name = "amq-protocol-tcp" +version = "10.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f1b4afcbd862e16c272b7625b6b057930b052d63c720bc90f6afab0d9abe8a8" +checksum = "8689f976dbd9864922f4f53e01ad2b43700ed3eb1bb5667b260522f291434dae" dependencies = [ - "amqp_serde", - "async-trait", - "bytes 1.10.1", + "amq-protocol-uri", + "async-rs", + "cfg-if", + "tcp-stream", + "tracing", +] + +[[package]] +name = "amq-protocol-types" +version = "10.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27894e9e57d07f701251aeee3d2ab3d7d114bc830bf722d6626027eb55f3b222" +dependencies = [ + "cookie-factory", + "nom 8.0.0", "serde", - "serde_bytes_ng", - "tokio 1.47.1", + "serde_json", ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "amq-protocol-uri" +version = "10.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "64fd5ca63f1b8cba2309aaec8595483c36f3a671225d5ab9fe8265adb9213514" +dependencies = [ + "amq-protocol-types", + "percent-encoding", + "url", +] [[package]] name = "android_system_properties" @@ -142,24 +185,24 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" -dependencies = [ - "backtrace", -] +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" [[package]] name = "arc-swap" -version = "1.7.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +dependencies = [ + "rustversion", +] [[package]] name = "arg_enum_proc_macro" @@ -168,8 +211,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -180,29 +223,56 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" [[package]] -name = "async-attributes" -version = "1.1.2" +name = "as-slice" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" dependencies = [ - "quote 1.0.40", - "syn 1.0.109", + "stable_deref_trait", ] [[package]] -name = "async-channel" -version = "1.9.0" +name = "asn1-rs" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "b7f43a50ac4fdca5df8e885c21b835997f0a1cdee65494a6847694a98652d9d8" dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom 7.1.3", + "num-traits", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", + "synstructure 0.13.2", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -214,56 +284,48 @@ dependencies = [ "concurrent-queue", "event-listener-strategy", "futures-core", - "pin-project-lite 0.2.16", + "pin-project-lite", +] + +[[package]] +name = "async-compat" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ba85bc55464dcbf728b56d97e119d673f4cf9062be330a9a26f3acf504a590" +dependencies = [ + "futures-core", + "futures-io", + "once_cell", + "pin-project-lite", + "tokio", ] [[package]] name = "async-executor" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.3.0", - "futures-lite 2.6.1", - "pin-project-lite 0.2.16", + "fastrand 2.4.1", + "futures-lite", + "pin-project-lite", "slab", ] [[package]] name = "async-global-executor" -version = "2.4.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +checksum = "13f937e26114b93193065fd44f507aa2e9169ad0cdabbb996920b1fe1ddea7ba" dependencies = [ - "async-channel 2.5.0", + "async-channel", "async-executor", - "async-io", - "async-lock 3.4.1", + "async-lock 3.4.2", "blocking", - "futures-lite 2.6.1", - "once_cell", - "tokio 0.2.25", - "tokio 1.47.1", -] - -[[package]] -name = "async-io" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" -dependencies = [ - "async-lock 3.4.1", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite 2.6.1", - "parking", - "polling 3.10.0", - "rustix 1.0.8", - "slab", - "windows-sys 0.60.2", + "futures-lite", + "tokio", ] [[package]] @@ -277,31 +339,13 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ "event-listener 5.4.1", "event-listener-strategy", - "pin-project-lite 0.2.16", -] - -[[package]] -name = "async-process" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" -dependencies = [ - "async-channel 2.5.0", - "async-io", - "async-lock 3.4.1", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener 5.4.1", - "futures-lite 2.6.1", - "rustix 1.0.8", + "pin-project-lite", ] [[package]] @@ -311,54 +355,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", -] - -[[package]] -name = "async-signal" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" -dependencies = [ - "async-io", - "async-lock 3.4.1", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.0.8", - "signal-hook-registry", - "slab", - "windows-sys 0.60.2", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] -name = "async-std" -version = "1.13.1" +name = "async-rs" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" +checksum = "3cd5147201b63ba6883ffabca3a153822f71541748d7108e3e799beaeb283131" dependencies = [ - "async-attributes", - "async-channel 1.9.0", + "async-compat", "async-global-executor", - "async-io", - "async-lock 3.4.1", - "async-process", - "crossbeam-utils", - "futures-channel", + "async-trait", "futures-core", "futures-io", - "futures-lite 2.6.1", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite 0.2.16", - "pin-utils", - "slab", - "wasm-bindgen-futures", + "hickory-resolver", + "tokio", + "tokio-stream", ] [[package]] @@ -369,7 +383,7 @@ checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", - "pin-project-lite 0.2.16", + "pin-project-lite", ] [[package]] @@ -379,8 +393,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -391,13 +405,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -406,12 +420,12 @@ version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1b71b31561643aa8e7df3effe284fa83ab1a840e52294c5f4bd7bfd8b2becbb" dependencies = [ - "async-std", "futures-io", "futures-util", "log", - "pin-project-lite 0.2.16", - "tungstenite", + "pin-project-lite", + "tokio", + "tungstenite 0.17.3", ] [[package]] @@ -446,41 +460,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "authifier" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a03b810b342b4c584cdc1cfc40d1ec763b1d653ef4086f7494740f35d9e1f0" -dependencies = [ - "async-std", - "async-trait", - "base32", - "bson", - "chrono", - "futures", - "handlebars", - "iso8601-timestamp", - "lazy_static", - "lettre", - "log", - "mongodb", - "nanoid", - "rand 0.8.5", - "regex", - "reqwest 0.11.27", - "revolt_okapi", - "revolt_rocket_okapi", - "rocket", - "rust-argon2", - "schemars 0.8.22", - "serde", - "serde_json", - "sha1", - "totp-lite", - "ulid 0.5.0", - "validator 0.15.0", -] - [[package]] name = "auto_ops" version = "0.3.0" @@ -489,47 +468,58 @@ checksum = "7460f7dd8e100147b82a63afca1a20eb6c231ee36b90ba7272e14951cb58af59" [[package]] name = "autocfg" -version = "0.1.8" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.5.0", -] +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] -name = "autocfg" -version = "1.5.0" +name = "av-scenechange" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.18", + "v_frame", + "y4m", +] [[package]] name = "av1-grain" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" dependencies = [ "anyhow", "arrayvec", "log", - "nom", + "nom 8.0.0", "num-rational", "v_frame", ] [[package]] name = "avif-serialize" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea8ef51aced2b9191c08197f55450d830876d9933f8f48a429b354f1d496b42" +checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" dependencies = [ "arrayvec", ] [[package]] name = "aws-config" -version = "1.8.4" +version = "1.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483020b893cdef3d89637e428d588650c71cfae7ea2e6ecbaee4de4ff99fb2dd" +checksum = "e33f815b73a3899c03b380d543532e5865f230dce9678d108dc10732a8682275" dependencies = [ "aws-credential-types", "aws-runtime", @@ -541,15 +531,16 @@ dependencies = [ "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", "aws-types", - "bytes 1.10.1", - "fastrand 2.3.0", + "bytes", + "fastrand 2.4.1", "hex", - "http 1.3.1", - "ring", + "http 1.4.2", + "sha1 0.10.6", "time", - "tokio 1.47.1", + "tokio", "tracing", "url", "zeroize", @@ -557,9 +548,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.5" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1541072f81945fa1251f8795ef6c92c4282d74d59f88498ae7d4bf00f0ebdad9" +checksum = "8f20799b373a1be121fe3005fba0c2090af9411573878f224df44b42727fcaf7" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -569,9 +560,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.13.3" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" dependencies = [ "aws-lc-sys", "zeroize", @@ -579,11 +570,10 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.30.0" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" dependencies = [ - "bindgen", "cc", "cmake", "dunce", @@ -592,9 +582,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.10" +version = "1.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c034a1bc1d70e16e7f4e4caf7e9f7693e4c9c24cd91cf17c2a0b21abaebc7c8b" +checksum = "6c9b9de216a988dd54b754a82a7660cfe14cee4f6782ae4524470972fa0ccb39" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -605,22 +595,26 @@ dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", - "bytes 1.10.1", - "fastrand 2.3.0", + "bytes", + "bytes-utils", + "fastrand 2.4.1", "http 0.2.12", + "http 1.4.2", "http-body 0.4.6", + "http-body 1.0.1", "percent-encoding", - "pin-project-lite 0.2.16", + "pin-project-lite", "tracing", "uuid", ] [[package]] name = "aws-sdk-s3" -version = "1.101.0" +version = "1.137.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b16efa59a199f5271bf21ab3e570c5297d819ce4f240e6cf0096d1dc0049c44" +checksum = "c2dd7213994e2ff9382ff100403b78c30d1b74cdfcd8fa9d0d1dc3a94a5c4874" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-sigv4", @@ -629,115 +623,124 @@ dependencies = [ "aws-smithy-eventstream", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes 1.10.1", - "fastrand 2.3.0", + "bytes", + "fastrand 2.4.1", "hex", - "hmac", + "hmac 0.13.0", "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", - "lru 0.12.5", + "http 1.4.2", + "http-body 1.0.1", + "lru", "percent-encoding", "regex-lite", - "sha2", + "sha2 0.11.0", "tracing", "url", ] [[package]] name = "aws-sdk-sso" -version = "1.79.0" +version = "1.102.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a847168f15b46329fa32c7aca4e4f1a2e072f9b422f0adb19756f2e1457f111" +checksum = "8c82b3ac19f1431854f7ace3a7531674633e286bfdde21976893bfee36fd493b" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", - "bytes 1.10.1", - "fastrand 2.3.0", + "bytes", + "fastrand 2.4.1", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.80.0" +version = "1.104.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b654dd24d65568738593e8239aef279a86a15374ec926ae8714e2d7245f34149" +checksum = "321000d2b4c5519ee573f73167f612efd7329322d9b26969ad1979f0427f1913" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", - "bytes 1.10.1", - "fastrand 2.3.0", + "bytes", + "fastrand 2.4.1", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.81.0" +version = "1.107.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92ea8a7602321c83615c82b408820ad54280fb026e92de0eeea937342fafa24" +checksum = "3d0d328ba962af23ecfa3c9f23b98d3d35e325fa218d7f13d17a6bf522f8a560" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-smithy-xml", "aws-types", - "fastrand 2.3.0", + "fastrand 2.4.1", "http 0.2.12", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.3.4" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084c34162187d39e3740cb635acd73c4e3a551a36146ad6fe8883c929c9f876c" +checksum = "bae38512beae0ffee7010fc24e7a8a123c53efdfef42a61e80fda4882418dc71" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", "aws-smithy-http", "aws-smithy-runtime-api", "aws-smithy-types", - "bytes 1.10.1", - "crypto-bigint 0.5.5", + "bytes", + "crypto-bigint", "form_urlencoded", "hex", - "hmac", + "hmac 0.13.0", "http 0.2.12", - "http 1.3.1", - "p256 0.11.1", + "http 1.4.2", + "p256", "percent-encoding", - "ring", - "sha2", + "sha2 0.11.0", "subtle", "time", "tracing", @@ -746,119 +749,124 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.5" +version = "1.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" +checksum = "2ffcaf626bdda484571968400c326a244598634dc75fd451325a54ad1a59acfc" dependencies = [ "futures-util", - "pin-project-lite 0.2.16", - "tokio 1.47.1", + "pin-project-lite", + "tokio", ] [[package]] name = "aws-smithy-checksums" -version = "0.63.6" +version = "0.64.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9054b4cc5eda331cde3096b1576dec45365c5cbbca61d1fffa5f236e251dfce7" +checksum = "e9e8e65f4f81fcccdeb6c3eca2af17ac21d421a1786a26a394aecf421d616d3a" dependencies = [ "aws-smithy-http", "aws-smithy-types", - "bytes 1.10.1", + "bytes", "crc-fast", "hex", - "http 0.2.12", - "http-body 0.4.6", - "md-5", - "pin-project-lite 0.2.16", - "sha1", - "sha2", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "md-5 0.11.0", + "pin-project-lite", + "sha1 0.11.0", + "sha2 0.11.0", "tracing", ] [[package]] name = "aws-smithy-eventstream" -version = "0.60.10" +version = "0.60.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604c7aec361252b8f1c871a7641d5e0ba3a7f5a586e51b66bc9510a5519594d9" +checksum = "78d8391e65fcea47c586a22e1a41f173b38615b112b2c6b7a44e80cec3e6b706" dependencies = [ "aws-smithy-types", - "bytes 1.10.1", + "bytes", "crc32fast", ] [[package]] name = "aws-smithy-http" -version = "0.62.3" +version = "0.63.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c4dacf2d38996cf729f55e7a762b30918229917eca115de45dfa8dfb97796c9" +checksum = "ba1ab2dc1c2c3749ead27180d333c42f11be8b0e934058fb4b2258ee8dbe5231" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", "aws-smithy-types", - "bytes 1.10.1", + "bytes", "bytes-utils", "futures-core", - "http 0.2.12", - "http 1.3.1", - "http-body 0.4.6", + "futures-util", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", "percent-encoding", - "pin-project-lite 0.2.16", + "pin-project-lite", "pin-utils", "tracing", ] [[package]] name = "aws-smithy-http-client" -version = "1.0.6" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f108f1ca850f3feef3009bdcc977be201bca9a91058864d9de0684e64514bee0" +checksum = "5c3ef8931ad1c98aa6a55b4256f847f3116090819844e0dd41ea682cac5dd2d3" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", "h2 0.3.27", - "h2 0.4.11", + "h2 0.4.15", "http 0.2.12", - "http 1.3.1", + "http 1.4.2", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.6.0", + "hyper 1.10.1", "hyper-rustls 0.24.2", - "hyper-rustls 0.27.7", + "hyper-rustls 0.27.9", "hyper-util", - "pin-project-lite 0.2.16", + "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", + "rustls 0.23.41", + "rustls-native-certs 0.8.4", "rustls-pki-types", - "tokio 1.47.1", + "tokio", + "tokio-rustls 0.26.4", "tower", "tracing", ] [[package]] name = "aws-smithy-json" -version = "0.61.4" +version = "0.62.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a16e040799d29c17412943bdbf488fd75db04112d0c0d4b9290bacf5ae0014b9" +checksum = "701a947f4797e52a911e114a898667c746c39feea467bbd1abd7b3721f702ffa" dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.1.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9364d5989ac4dd918e5cc4c4bdcc61c9be17dcd2586ea7f69e348fc7c6cab393" +checksum = "a06c2315d173edbf1920da8ba3a7189695827002e4c0fc961973ab1c54abca9c" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.7" +version = "0.60.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" +checksum = "1a56d79744fb3edb5d722ef79d86081e121d3b9422cb209eb03aea6aa4f21ebd" dependencies = [ "aws-smithy-types", "urlencoding", @@ -866,89 +874,115 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.8.6" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e107ce0783019dbff59b3a244aa0c114e4a8c9d93498af9162608cd5474e796" +checksum = "b8e6f5caf6fea86f8c2206541ab5857cfcda9013426cdbe8fa0098b9e2d32182" dependencies = [ "aws-smithy-async", "aws-smithy-http", "aws-smithy-http-client", "aws-smithy-observability", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", - "bytes 1.10.1", - "fastrand 2.3.0", + "bytes", + "fastrand 2.4.1", "http 0.2.12", - "http 1.3.1", + "http 1.4.2", "http-body 0.4.6", "http-body 1.0.1", - "pin-project-lite 0.2.16", + "http-body-util", + "pin-project-lite", "pin-utils", - "tokio 1.47.1", + "tokio", "tracing", ] [[package]] name = "aws-smithy-runtime-api" -version = "1.8.7" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75d52251ed4b9776a3e8487b2a01ac915f73b2da3af8fc1e77e0fce697a550d4" +checksum = "9db177daa6ba8afb9ee1aefcf548c907abcf52065e394ee11a92780057fe0e8c" dependencies = [ "aws-smithy-async", + "aws-smithy-runtime-api-macros", "aws-smithy-types", - "bytes 1.10.1", + "bytes", "http 0.2.12", - "http 1.3.1", - "pin-project-lite 0.2.16", - "tokio 1.47.1", + "http 1.4.2", + "pin-project-lite", + "tokio", "tracing", "zeroize", ] +[[package]] +name = "aws-smithy-runtime-api-macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d7396fd9500589e62e460e987ecb671bad374934e55ec3b5f498cc7a8a8a7b7" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", +] + +[[package]] +name = "aws-smithy-schema" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7442cb268338f0eb8278140a107c046756aa01093d8ef5e99628d34ae09c94f5" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-types", + "http 1.4.2", +] + [[package]] name = "aws-smithy-types" -version = "1.3.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8" +checksum = "32b42fcf341259d85ca10fac9a2f6448a8ec691c6955a18e45bc3b71a85fab85" dependencies = [ "base64-simd", - "bytes 1.10.1", + "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.3.1", + "http 1.4.2", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", "itoa", "num-integer", - "pin-project-lite 0.2.16", + "pin-project-lite", "pin-utils", "ryu", "serde", "time", - "tokio 1.47.1", + "tokio", "tokio-util", ] [[package]] name = "aws-smithy-xml" -version = "0.60.10" +version = "0.60.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728" +checksum = "0ce02add1aa3677d022f8adf81dcbe3046a95f17a1b1e8979c145cd21d3d22b3" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.8" +version = "1.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b069d19bf01e46298eaedd7c6f283fe565a59263e53eebec945f3e6398f42390" +checksum = "d16bf10b03a3c01e6b3b7d47cd964e873ffe9e7d4e80fad16bd4c077cb068531" dependencies = [ "aws-credential-types", "aws-smithy-async", "aws-smithy-runtime-api", + "aws-smithy-schema", "aws-smithy-types", "rustc_version", "tracing", @@ -962,12 +996,13 @@ checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", - "bytes 1.10.1", + "axum-macros", + "bytes", "futures-util", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", "http-body-util", - "hyper 1.6.0", + "hyper 1.10.1", "hyper-util", "itoa", "matchit", @@ -975,14 +1010,14 @@ dependencies = [ "mime", "multer", "percent-encoding", - "pin-project-lite 0.2.16", + "pin-project-lite", "rustversion", "serde", "serde_json", "serde_path_to_error", "serde_urlencoded", "sync_wrapper 1.0.2", - "tokio 1.47.1", + "tokio", "tower", "tower-layer", "tower-service", @@ -996,13 +1031,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", - "bytes 1.10.1", + "bytes", "futures-util", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", "http-body-util", "mime", - "pin-project-lite 0.2.16", + "pin-project-lite", "rustversion", "sync_wrapper 1.0.2", "tower-layer", @@ -1018,16 +1053,16 @@ checksum = "c794b30c904f0a1c2fb7740f7df7f7972dfaa14ef6f57cb6178dc63e5dca2f04" dependencies = [ "axum", "axum-core", - "bytes 1.10.1", - "fastrand 2.3.0", + "bytes", + "fastrand 2.4.1", "futures-util", "headers", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", "http-body-util", "mime", "multer", - "pin-project-lite 0.2.16", + "pin-project-lite", "serde", "tower", "tower-layer", @@ -1041,8 +1076,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -1054,13 +1089,13 @@ dependencies = [ "anyhow", "axum", "axum_typed_multipart_macros", - "bytes 1.10.1", + "bytes", "chrono", "futures-core", "futures-util", "tempfile", "thiserror 1.0.69", - "tokio 1.47.1", + "tokio", "uuid", ] @@ -1071,18 +1106,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11eeb275b20a4c750c9fe7bf5a750e97e7944563003efd1c82e70c229a612ca1" dependencies = [ "darling 0.20.11", - "heck", + "heck 0.5.0", "proc-macro-error", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", "ubyte", ] +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand 2.4.1", +] + [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -1090,15 +1134,9 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - [[package]] name = "base16ct" version = "0.2.0" @@ -1141,9 +1179,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.8.0" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "beef" @@ -1166,29 +1204,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.9.1", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote 1.0.40", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.104", - "which", -] - [[package]] name = "binstring" version = "0.1.7" @@ -1197,9 +1212,9 @@ checksum = "0669d5a35b64fdb5ab7fb19cae13148b6b5cbdf4b8247faf54ece47f699c8cef" [[package]] name = "bit_field" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] name = "bitfield" @@ -1215,21 +1230,24 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" [[package]] name = "bitstream-io" -version = "2.6.0" +version = "4.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" +checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" +dependencies = [ + "no_std_io2", +] [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -1239,13 +1257,13 @@ dependencies = [ [[package]] name = "blake2b_simd" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e903a20b159e944f91ec8499fe1e55651480c541ea0a584f5d967c49ad9d99" +checksum = "b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3" dependencies = [ "arrayref", "arrayvec", - "constant_time_eq", + "constant_time_eq 0.4.2", ] [[package]] @@ -1257,19 +1275,56 @@ dependencies = [ "generic-array 0.14.7", ] +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "blocking" version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.5.0", + "async-channel", "async-task", "futures-io", - "futures-lite 2.6.1", + "futures-lite", "piper", ] +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bson" version = "2.15.0" @@ -1279,13 +1334,13 @@ dependencies = [ "ahash 0.8.12", "base64 0.22.1", "bitvec", - "getrandom 0.2.16", - "getrandom 0.3.3", + "getrandom 0.2.17", + "getrandom 0.3.4", "hex", - "indexmap 2.10.0", + "indexmap 2.14.0", "js-sys", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde_bytes", "serde_json", @@ -1295,21 +1350,21 @@ dependencies = [ [[package]] name = "built" -version = "0.7.7" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" [[package]] name = "byteorder" @@ -1325,15 +1380,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" - -[[package]] -name = "bytes" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" [[package]] name = "bytes-utils" @@ -1341,7 +1390,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" dependencies = [ - "bytes 1.10.1", + "bytes", "either", ] @@ -1359,7 +1408,7 @@ dependencies = [ "instant", "once_cell", "thiserror 1.0.69", - "tokio 1.47.1", + "tokio", ] [[package]] @@ -1371,7 +1420,7 @@ dependencies = [ "cached_proc_macro_types", "darling 0.14.4", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "syn 1.0.109", ] @@ -1383,29 +1432,39 @@ checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" [[package]] name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cbc" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] [[package]] name = "cc" -version = "1.2.31" +version = "1.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", ] [[package]] -name = "cexpr" -version = "0.6.0" +name = "cesu8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfb" @@ -1419,32 +1478,37 @@ dependencies = [ ] [[package]] -name = "cfg-expr" -version = "0.15.8" +name = "cfg-if" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] -name = "cfg-if" -version = "1.0.1" +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", - "serde", "wasm-bindgen", "windows-link", ] @@ -1455,44 +1519,42 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "inout", ] [[package]] -name = "clang-sys" -version = "1.8.1" +name = "cmake" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ - "glob", - "libc", - "libloading", + "cc", ] [[package]] -name = "cloudabi" -version = "0.0.3" +name = "cmov" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags 1.3.2", -] +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" [[package]] -name = "cmake" -version = "0.1.54" +name = "cms" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +checksum = "7b77c319abfd5219629c45c34c89ba945ed3c5e49fcde9d16b6c3885f118a730" dependencies = [ - "cc", + "const-oid 0.9.6", + "der 0.7.10", + "spki 0.7.3", + "x509-cert", ] [[package]] name = "coarsetime" -version = "0.1.36" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91849686042de1b41cd81490edc83afbcb0abe5a9b6f2c4114f23ce8cca1bcf4" +checksum = "e58eb270476aa4fc7843849f8a35063e8743b4dbcdf6dd0f8ea0886980c204c2" dependencies = [ "libc", "wasix", @@ -1511,11 +1573,11 @@ version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "bytes 1.10.1", + "bytes", "futures-core", "memchr", - "pin-project-lite 0.2.16", - "tokio 1.47.1", + "pin-project-lite", + "tokio", "tokio-util", ] @@ -1537,7 +1599,7 @@ dependencies = [ "async-trait", "json5", "lazy_static", - "nom", + "nom 7.1.3", "pathdiff", "ron", "rust-ini", @@ -1559,6 +1621,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "const-random" version = "0.1.18" @@ -1574,7 +1642,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "tiny-keccak", ] @@ -1585,11 +1653,20 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + [[package]] name = "convert_case" -version = "0.4.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "cookie" @@ -1656,31 +1733,22 @@ dependencies = [ ] [[package]] -name = "crc" -version = "3.3.0" +name = "cpufeatures" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ - "crc-catalog", + "libc", ] -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - [[package]] name = "crc-fast" -version = "1.3.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf62af4cc77d8fe1c22dde4e721d87f2f54056139d8c412e1366b740305f56f" +checksum = "e75b2483e97a5a7da73ac68a05b629f9c53cff58d8ed1c77866079e18b00dba5" dependencies = [ - "crc", - "digest", - "libc", - "rand 0.9.2", - "regex", + "digest 0.10.7", + "spin 0.10.0", ] [[package]] @@ -1698,6 +1766,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -1749,9 +1823,9 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" -version = "0.4.9" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", @@ -1760,26 +1834,23 @@ dependencies = [ ] [[package]] -name = "crypto-bigint" -version = "0.5.5" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", - "subtle", - "zeroize", + "typenum", ] [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "typenum", + "hybrid-array", ] [[package]] @@ -1801,15 +1872,15 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "ct-codecs" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b10589d1a5e400d61f9f38f12f884cfd080ff345de8f17efda36fe0e4a02aa8" +checksum = "49fb0c6640b4507ebd99ff67677009e381ba5eee1d14df78de4a3d16eb123c39" [[package]] name = "ctr" @@ -1820,26 +1891,35 @@ dependencies = [ "cipher", ] +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + [[package]] name = "curl" -version = "0.4.48" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e2d5c8f48d9c0c23250e52b55e82a6ab4fdba6650c931f5a0a57a43abda812b" +checksum = "79fc3b6dd0b87ba36e565715bf9a2ced221311db47bd18011676f24a6066edbc" dependencies = [ "curl-sys", "libc", - "openssl-probe", + "openssl-probe 0.1.6", "openssl-sys", "schannel", - "socket2 0.5.10", + "socket2 0.6.4", "windows-sys 0.59.0", ] [[package]] name = "curl-sys" -version = "0.4.82+curl-8.14.1" +version = "0.4.87+curl-8.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d63638b5ec65f1a4ae945287b3fd035be4554bbaf211901159c9a2a74fb5be" +checksum = "61a460380f0ef783703dcbe909107f39c162adeac050d73c850055118b5b6327" dependencies = [ "cc", "libc", @@ -1851,6 +1931,33 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", +] + [[package]] name = "darling" version = "0.13.4" @@ -1881,6 +1988,16 @@ dependencies = [ "darling_macro 0.20.11", ] +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + [[package]] name = "darling_core" version = "0.13.4" @@ -1890,7 +2007,7 @@ dependencies = [ "fnv", "ident_case", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "strsim 0.10.0", "syn 1.0.109", ] @@ -1904,7 +2021,7 @@ dependencies = [ "fnv", "ident_case", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "strsim 0.10.0", "syn 1.0.109", ] @@ -1918,9 +2035,22 @@ dependencies = [ "fnv", "ident_case", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", + "strsim 0.11.1", + "syn 2.0.118", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote 1.0.46", "strsim 0.11.1", - "syn 2.0.104", + "syn 2.0.118", ] [[package]] @@ -1930,7 +2060,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core 0.13.4", - "quote 1.0.40", + "quote 1.0.46", "syn 1.0.109", ] @@ -1941,7 +2071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ "darling_core 0.14.4", - "quote 1.0.40", + "quote 1.0.46", "syn 1.0.109", ] @@ -1952,8 +2082,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -1971,15 +2112,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" [[package]] name = "data-url" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" [[package]] name = "deadqueue" @@ -1988,7 +2129,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ff1266be84e4e04a81e2d1cbb998cb271b374fb73ce780245ef96c037c50cd" dependencies = [ "crossbeam-queue", - "tokio 1.47.1", + "tokio", ] [[package]] @@ -2003,9 +2144,13 @@ dependencies = [ [[package]] name = "decancer" -version = "1.6.5" +version = "3.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080b09f6adad25c23d8c47c54e52e59b0dc09d079c4b23e0f147dac440359d0d" +checksum = "a9244323129647178bf41ac861a2cdb9d9c81b9b09d3d0d1de9cd302b33b8a1d" +dependencies = [ + "lazy_static", + "regex", +] [[package]] name = "der" @@ -2014,7 +2159,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79b71cca7d95d7681a4b3b9cdf63c8dbc3730d0584c2c74e31416d64a90493f4" dependencies = [ "const-oid 0.6.2", - "der_derive", + "der_derive 0.4.1", ] [[package]] @@ -2035,10 +2180,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid 0.9.6", + "der_derive 0.7.3", + "flagset", "pem-rfc7468 0.7.0", "zeroize", ] +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom 7.1.3", + "num-bigint", + "num-traits", + "rusticata-macros", +] + [[package]] name = "der_derive" version = "0.4.1" @@ -2046,19 +2207,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8aed3b3c608dc56cf36c45fe979d04eda51242e6703d8d0bb03426ef7c41db6a" dependencies = [ "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "syn 1.0.109", "synstructure 0.12.6", ] +[[package]] +name = "der_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", +] + [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -2068,19 +2239,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "derive-where" -version = "1.5.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510c292c8cf384b1a340b816a9a6cf2599eb8f566a44949024af88418000c50b" +checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -2088,12 +2259,57 @@ name = "derive_more" version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ "convert_case", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "rustc_version", - "syn 2.0.104", + "syn 2.0.118", + "unicode-xid 0.2.6", +] + +[[package]] +name = "des" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e" +dependencies = [ + "cipher", +] + +[[package]] +name = "device-info" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ca8e71544c1b67dcdbc2699ab258828aff985e5bc8d5f6b486d90d7df2f848" +dependencies = [ + "core-foundation 0.10.1", + "jni 0.21.1", + "libc", + "thiserror 2.0.18", + "wasm-bindgen", + "web-sys", + "windows-sys 0.59.0", ] [[package]] @@ -2113,7 +2329,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71b28680d8be17a570a2334922518be6adc3f58ecc880cbb404eaeb8624fd867" dependencies = [ "devise_core", - "quote 1.0.40", + "quote 1.0.46", ] [[package]] @@ -2122,11 +2338,11 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.0", "proc-macro2", "proc-macro2-diagnostics", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -2135,21 +2351,43 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid 0.9.6", - "crypto-common", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid 0.10.2", + "crypto-common 0.2.2", + "ctutils", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.0", + "objc2", +] + [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -2160,9 +2398,9 @@ checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" [[package]] name = "dtoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" [[package]] name = "dtoa-short" @@ -2185,18 +2423,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - [[package]] name = "ecdsa" version = "0.16.9" @@ -2204,9 +2430,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der 0.7.10", - "digest", - "elliptic-curve 0.13.8", - "rfc6979 0.4.0", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", "signature 2.2.0", "spki 0.7.3", ] @@ -2225,18 +2451,42 @@ dependencies = [ "once_cell", "openssl", "serde", - "sha2", + "sha2 0.10.9", "thiserror 1.0.69", ] [[package]] -name = "ed25519-compact" -version = "2.1.1" +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8 0.10.2", + "signature 2.2.0", +] + +[[package]] +name = "ed25519-compact" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9b3460f44bea8cd47f45a0c70892f1eff856d97cd55358b2f73f663789f6190" +checksum = "5c24599140dc39d7a81e4476e7573d41bbc18e07c803900298e522a5fbcfbfb6" dependencies = [ "ct-codecs", - "getrandom 0.2.16", + "getrandom 0.4.3", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", ] [[package]] @@ -2247,29 +2497,9 @@ checksum = "12a0bb14ac04a9fcf170d0bbbef949b44cc492f4452bd20c095636956f653642" [[package]] name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest", - "ff 0.12.1", - "generic-array 0.14.7", - "group 0.12.1", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "elliptic-curve" @@ -2277,17 +2507,17 @@ version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.5", - "digest", - "ff 0.13.1", + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", "generic-array 0.14.7", - "group 0.13.0", + "group", "hkdf", "pem-rfc7468 0.7.0", "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1 0.7.3", + "sec1", "subtle", "zeroize", ] @@ -2317,18 +2547,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", -] - [[package]] name = "enum-iterator" version = "1.5.0" @@ -2340,13 +2558,13 @@ dependencies = [ [[package]] name = "enum-iterator-derive" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -2378,8 +2596,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -2399,19 +2617,19 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "euclid" -version = "0.22.11" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" dependencies = [ "num-traits", ] @@ -2430,7 +2648,7 @@ checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", - "pin-project-lite 0.2.16", + "pin-project-lite", ] [[package]] @@ -2440,14 +2658,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener 5.4.1", - "pin-project-lite 0.2.16", + "pin-project-lite", ] [[package]] name = "exr" -version = "1.73.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", "half", @@ -2469,9 +2687,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fax" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" [[package]] name = "fcm_v1" @@ -2495,16 +2719,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "ff" version = "0.13.1" @@ -2525,6 +2739,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "figment" version = "0.10.19" @@ -2539,6 +2759,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "findshlibs" version = "0.10.2" @@ -2551,11 +2777,23 @@ dependencies = [ "winapi", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flagset" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe" + [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -2570,6 +2808,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "flume" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2578,9 +2827,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "fontconfig-parser" @@ -2611,7 +2860,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -2620,11 +2890,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -2637,18 +2913,18 @@ checksum = "4b8e3a1339ed45ad8fde94530c4bdcbd5f371a3c6bd3bf57682923792830aa37" dependencies = [ "arc-swap", "async-trait", - "bytes 1.10.1", + "bytes", "bytes-utils", "crossbeam-queue", "float-cmp", "futures", "log", "parking_lot", - "rand 0.8.5", + "rand 0.8.6", "redis-protocol", "semver", "socket2 0.5.10", - "tokio 1.47.1", + "tokio", "tokio-stream", "tokio-util", "url", @@ -2661,12 +2937,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - [[package]] name = "funty" version = "2.0.0" @@ -2685,9 +2955,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -2700,9 +2970,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -2710,15 +2980,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -2727,24 +2997,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "1.13.0" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite 0.2.16", - "waker-fn", -] +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-lite" @@ -2752,11 +3007,11 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ - "fastrand 2.3.0", + "fastrand 2.4.1", "futures-core", "futures-io", "parking", - "pin-project-lite 0.2.16", + "pin-project-lite", ] [[package]] @@ -2767,43 +3022,54 @@ checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" dependencies = [ "futures-channel", "futures-task", - "tokio 1.47.1", + "tokio", ] [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", +] + +[[package]] +name = "futures-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" +dependencies = [ + "futures-io", + "rustls 0.23.41", + "rustls-pki-types", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -2812,8 +3078,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.16", - "pin-utils", + "pin-project-lite", "slab", ] @@ -2836,21 +3101,7 @@ dependencies = [ "libc", "log", "rustversion", - "windows 0.48.0", -] - -[[package]] -name = "generator" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" -dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows 0.61.3", + "windows", ] [[package]] @@ -2866,59 +3117,73 @@ dependencies = [ [[package]] name = "generic-array" -version = "1.2.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c8444bc9d71b935156cc0ccab7f622180808af7867b1daae6547d773591703" +checksum = "c2e55f16dcf0e9c00efbe2e655ffe45fc98e7066b52bc92f8a79e64060a79351" dependencies = [ + "rustversion", "typenum", ] [[package]] name = "getopts" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" dependencies = [ "unicode-width", ] [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "r-efi 6.0.0", + "rand_core 0.10.1", "wasm-bindgen", ] [[package]] name = "getset" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" +checksum = "6cf442baaabe4213ce7d1239afc26c039180b6456da2cededa316ae2c8a77a77" dependencies = [ - "proc-macro-error2", "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -2941,11 +3206,21 @@ dependencies = [ "weezl", ] +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "git2" @@ -2962,32 +3237,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.12.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "group" @@ -2995,7 +3247,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.1", + "ff", "rand_core 0.6.4", "subtle", ] @@ -3006,46 +3258,47 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ - "bytes 1.10.1", + "bytes", "fnv", "futures-core", "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.10.0", + "indexmap 2.14.0", "slab", - "tokio 1.47.1", + "tokio", "tokio-util", "tracing", ] [[package]] name = "h2" -version = "0.4.11" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", - "bytes 1.10.1", + "bytes", "fnv", "futures-core", "futures-sink", - "http 1.3.1", - "indexmap 2.10.0", + "http 1.4.2", + "indexmap 2.14.0", "slab", - "tokio 1.47.1", + "tokio", "tokio-util", "tracing", ] [[package]] name = "half" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "zerocopy", ] [[package]] @@ -3082,22 +3335,24 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.12", - "allocator-api2", -] [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "headers" version = "0.4.1" @@ -3105,12 +3360,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ "base64 0.22.1", - "bytes 1.10.1", + "bytes", "headers-core", - "http 1.3.1", + "http 1.4.2", "httpdate", "mime", - "sha1", + "sha1 0.10.6", ] [[package]] @@ -3119,9 +3374,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 1.3.1", + "http 1.4.2", ] +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" @@ -3150,47 +3411,72 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "hickory-proto" -version = "0.24.4" +name = "hickory-net" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" +checksum = "e2295ed2f9c31e471e1428a8f88a3f0e1f4b27c15049592138d1eebe9c35b183" dependencies = [ "async-trait", "cfg-if", "data-encoding", - "enum-as-inner", "futures-channel", "futures-io", "futures-util", - "idna 1.0.3", + "hickory-proto", + "idna 1.1.0", + "ipnet", + "jni 0.22.4", + "rand 0.10.1", + "thiserror 2.0.18", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-proto" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bab31817bfb44672a252e97fe81cd0c18d1b2cf892108922f6818820df8c643" +dependencies = [ + "data-encoding", + "idna 1.1.0", "ipnet", + "jni 0.22.4", "once_cell", - "rand 0.8.5", - "thiserror 1.0.69", + "prefix-trie", + "rand 0.10.1", + "ring", + "thiserror 2.0.18", "tinyvec", - "tokio 1.47.1", "tracing", "url", ] [[package]] name = "hickory-resolver" -version = "0.24.4" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" +checksum = "f0d58d28879ceecde6607729660c2667a081ccdc082e082675042793960f178c" dependencies = [ "cfg-if", "futures-util", + "hickory-net", "hickory-proto", "ipconfig", - "lru-cache", + "ipnet", + "jni 0.22.4", + "moka", + "ndk-context", "once_cell", "parking_lot", - "rand 0.8.5", + "rand 0.10.1", "resolv-conf", "smallvec", - "thiserror 1.0.69", - "tokio 1.47.1", + "system-configuration 0.7.0", + "thiserror 2.0.18", + "tokio", "tracing", ] @@ -3200,7 +3486,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac", + "hmac 0.12.1", ] [[package]] @@ -3209,40 +3495,49 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", +] + +[[package]] +name = "hmac" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" +dependencies = [ + "digest 0.11.3", ] [[package]] name = "hmac-sha1-compact" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18492c9f6f9a560e0d346369b665ad2bdbc89fa9bceca75796584e79042694c3" +checksum = "b0b3ba31f6dc772cc8221ce81dbbbd64fa1e668255a6737d95eeace59b5a8823" [[package]] name = "hmac-sha256" -version = "1.1.12" +version = "1.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad6880c8d4a9ebf39c6e8b77007ce223f646a4d21ce29d99f70cb16420545425" +checksum = "ec9d92d097f4749b64e8cc33d924d9f40a2d4eb91402b458014b781f5733d60f" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] name = "hmac-sha512" -version = "1.1.7" +version = "1.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89e8d20b3799fa526152a5301a771eaaad80857f83e01b23216ceaafb2d9280" +checksum = "019ece39bbefc17f13f677a690328cb978dbf6790e141a3c24e66372cb38588b" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3266,8 +3561,8 @@ dependencies = [ "mac", "markup5ever", "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -3276,19 +3571,18 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "bytes 1.10.1", + "bytes", "fnv", "itoa", ] [[package]] name = "http" -version = "1.3.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ - "bytes 1.10.1", - "fnv", + "bytes", "itoa", ] @@ -3298,9 +3592,9 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ - "bytes 1.10.1", + "bytes", "http 0.2.12", - "pin-project-lite 0.2.16", + "pin-project-lite", ] [[package]] @@ -3309,8 +3603,8 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "bytes 1.10.1", - "http 1.3.1", + "bytes", + "http 1.4.2", ] [[package]] @@ -3319,11 +3613,11 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ - "bytes 1.10.1", + "bytes", "futures-core", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", - "pin-project-lite 0.2.16", + "pin-project-lite", ] [[package]] @@ -3348,12 +3642,21 @@ dependencies = [ ] [[package]] -name = "hyper" -version = "0.14.32" +name = "hybrid-array" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ - "bytes 1.10.1", + "bytes", "futures-channel", "futures-core", "futures-util", @@ -3363,9 +3666,9 @@ dependencies = [ "httparse", "httpdate", "itoa", - "pin-project-lite 0.2.16", + "pin-project-lite", "socket2 0.5.10", - "tokio 1.47.1", + "tokio", "tower-service", "tracing", "want", @@ -3373,22 +3676,23 @@ dependencies = [ [[package]] name = "hyper" -version = "1.6.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ - "bytes 1.10.1", + "atomic-waker", + "bytes", "futures-channel", - "futures-util", - "h2 0.4.11", - "http 1.3.1", + "futures-core", + "h2 0.4.15", + "http 1.4.2", "http-body 1.0.1", "httparse", "httpdate", "itoa", - "pin-project-lite 0.2.16", + "pin-project-lite", "smallvec", - "tokio 1.47.1", + "tokio", "want", ] @@ -3404,7 +3708,7 @@ dependencies = [ "log", "rustls 0.21.12", "rustls-native-certs 0.6.3", - "tokio 1.47.1", + "tokio", "tokio-rustls 0.24.1", ] @@ -3415,12 +3719,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", - "http 1.3.1", - "hyper 1.6.0", + "http 1.4.2", + "hyper 1.10.1", "hyper-util", "rustls 0.22.4", "rustls-pki-types", - "tokio 1.47.1", + "tokio", "tokio-rustls 0.25.0", "tower-service", "webpki-roots 0.26.11", @@ -3428,18 +3732,17 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.3.1", - "hyper 1.6.0", + "http 1.4.2", + "hyper 1.10.1", "hyper-util", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", - "rustls-pki-types", - "tokio 1.47.1", - "tokio-rustls 0.26.2", + "rustls 0.23.41", + "rustls-native-certs 0.8.4", + "tokio", + "tokio-rustls 0.26.4", "tower-service", ] @@ -3449,50 +3752,33 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.10.1", + "bytes", "hyper 0.14.32", "native-tls", - "tokio 1.47.1", - "tokio-native-tls", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes 1.10.1", - "http-body-util", - "hyper 1.6.0", - "hyper-util", - "native-tls", - "tokio 1.47.1", + "tokio", "tokio-native-tls", - "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64 0.22.1", - "bytes 1.10.1", + "bytes", "futures-channel", - "futures-core", "futures-util", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", - "hyper 1.6.0", + "hyper 1.10.1", "ipnet", "libc", "percent-encoding", - "pin-project-lite 0.2.16", - "socket2 0.6.0", - "system-configuration 0.6.1", - "tokio 1.47.1", + "pin-project-lite", + "socket2 0.6.4", + "system-configuration 0.7.0", + "tokio", "tower-service", "tracing", "windows-registry", @@ -3500,9 +3786,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -3524,12 +3810,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -3537,9 +3824,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -3550,11 +3837,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -3565,42 +3851,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -3614,17 +3896,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "0.3.0" @@ -3647,9 +3918,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -3658,9 +3929,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -3668,31 +3939,32 @@ dependencies = [ [[package]] name = "if_chain" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" +checksum = "cd62e6b5e86ea8eeeb8db1de02880a6abc01a397b2ebb64b5d74ac255318f5cb" [[package]] name = "image" -version = "0.25.6" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", "color_quant", "exr", - "gif", - "image-webp 0.2.3", + "gif 0.14.2", + "image-webp 0.2.4", + "moxcms", "num-traits", - "png", + "png 0.18.1", "qoi", "ravif", "rayon", "rgb", "tiff", - "zune-core", - "zune-jpeg", + "zune-core 0.5.1", + "zune-jpeg 0.5.15", ] [[package]] @@ -3707,9 +3979,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" dependencies = [ "byteorder-lite", "quick-error 2.0.1", @@ -3723,9 +3995,9 @@ checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] name = "imgref" -version = "1.11.0" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" +checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" [[package]] name = "impl_ops" @@ -3739,20 +4011,21 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "autocfg 1.5.0", + "autocfg", "hashbrown 0.12.3", "serde", ] [[package]] name = "indexmap" -version = "2.10.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.17.1", "serde", + "serde_core", ] [[package]] @@ -3776,6 +4049,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ + "block-padding", "generic-array 0.14.7", ] @@ -3795,79 +4069,61 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", -] - -[[package]] -name = "io-uring" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "libc", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "ipconfig" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" dependencies = [ - "socket2 0.5.10", + "socket2 0.6.4", "widestring", - "windows-sys 0.48.0", - "winreg", + "windows-registry", + "windows-result", + "windows-sys 0.61.2", ] [[package]] name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.8" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" dependencies = [ - "memchr", "serde", ] [[package]] name = "is-terminal" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi 0.5.2", "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "isahc" -version = "1.7.2" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" +checksum = "82d93e1769c5c2b13a8e0d8ca9b6466c60bafade047326f25e3bcb97a947d875" dependencies = [ - "async-channel 1.9.0", + "async-channel", "castaway", "crossbeam-utils", "curl", "curl-sys", "encoding_rs", - "event-listener 2.5.3", - "futures-lite 1.13.0", + "event-listener 5.4.1", + "futures-lite", "http 0.2.12", "log", "mime", - "once_cell", - "polling 2.8.0", + "polling", "serde", "serde_json", "slab", @@ -3884,12 +4140,21 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d4e5d712dd664b11e778d1cfc06c79ba2700d6bc1771e44fb7b6a4656b487d" dependencies = [ - "generic-array 1.2.0", - "schemars 0.8.22", + "generic-array 1.4.3", + "schemars", "serde", "time", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -3899,35 +4164,113 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] -name = "jobserver" -version = "0.1.33" +name = "jni" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ - "getrandom 0.3.3", - "libc", + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", ] [[package]] -name = "jpeg-decoder" -version = "0.3.2" +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "rustc_version", + "simd_cesu8", + "syn 2.0.118", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote 1.0.46", + "syn 2.0.118", +] + +[[package]] +name = "jobserver" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -3942,6 +4285,28 @@ dependencies = [ "serde", ] +[[package]] +name = "jsonwebtoken" +version = "10.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" +dependencies = [ + "base64 0.22.1", + "ed25519-dalek", + "getrandom 0.2.17", + "hmac 0.12.1", + "js-sys", + "p256", + "p384", + "rand 0.8.6", + "rsa 0.9.10", + "serde", + "serde_json", + "sha2 0.10.9", + "signature 2.2.0", + "zeroize", +] + [[package]] name = "jwt-simple" version = "0.11.9" @@ -3957,10 +4322,10 @@ dependencies = [ "hmac-sha256", "hmac-sha512", "k256", - "p256 0.13.2", + "p256", "p384", - "rand 0.8.5", - "rsa", + "rand 0.8.6", + "rsa 0.7.2", "serde", "serde_json", "spki 0.6.0", @@ -3970,18 +4335,18 @@ dependencies = [ [[package]] name = "jxl-bitstream" -version = "0.4.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5855ff16398ffbcf81fee52c41ca65326499c8764b21bb9952c367ace98995fb" +checksum = "b480e752277e29eb4054f69546887a9b84656fe78c08f54ba5850ced98a378fe" dependencies = [ "tracing", ] [[package]] name = "jxl-coding" -version = "0.4.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5b5093904e940bc11ef50e872c7bdf7b6e88653f012b925f8479daf212b5c9" +checksum = "cd972bcd125e776f1eb241ac50e39f956095a1c2770c64736c968f8946bd9a3c" dependencies = [ "jxl-bitstream", "tracing", @@ -3989,28 +4354,31 @@ dependencies = [ [[package]] name = "jxl-color" -version = "0.7.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb1c31e10054079df585633fc14fb9e4c96565c58c05b983c502e2472b57fa0" +checksum = "f316b1358c1711755b3ee8e8cb5c4a1dad12e796233088a7a513440782de80b2" dependencies = [ "jxl-bitstream", "jxl-coding", "jxl-grid", + "jxl-image", + "jxl-oxide-common", "jxl-threadpool", "tracing", ] [[package]] name = "jxl-frame" -version = "0.9.0" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35b289aa0f24044167d83a1c29ae2b99210c5082ab7e3e90dacbcae818aa0a2" +checksum = "2d967c6fd669c7c01060b5022d8835fa82fd46b06ffc98b549f17600a097c2b3" dependencies = [ "jxl-bitstream", "jxl-coding", "jxl-grid", "jxl-image", "jxl-modular", + "jxl-oxide-common", "jxl-threadpool", "jxl-vardct", "tracing", @@ -4018,60 +4386,94 @@ dependencies = [ [[package]] name = "jxl-grid" -version = "0.4.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b96735a85299a6bce8664643fcb759f29ea73ce344a90b6f7de9b92a8e9b2d" +checksum = "01671307879a033bfa52e6e8784b941aca770b3f3a7d33830b455b6844f793fb" dependencies = [ "tracing", ] [[package]] name = "jxl-image" -version = "0.9.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b31b17ed3bd0e3b65e7b06628f5930e009dda6cd17638cf5159a20a3feedec6" +checksum = "c5f752d62577c702a94dbbce4045caf08cb58639e8a4d56464b40ecf33ffe565" dependencies = [ "jxl-bitstream", - "jxl-color", "jxl-grid", + "jxl-oxide-common", + "tracing", +] + +[[package]] +name = "jxl-jbr" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35d032bcec660647828527ff42c6f5776d2fd44b8357f9f6d9ac6dc07218e46" +dependencies = [ + "brotli-decompressor", + "jxl-bitstream", + "jxl-frame", + "jxl-grid", + "jxl-image", + "jxl-modular", + "jxl-oxide-common", + "jxl-threadpool", + "jxl-vardct", "tracing", ] [[package]] name = "jxl-modular" -version = "0.7.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3b9fb8f46e63a14ecedefbd0f873b04162aaf8a09676b630c31bc8dadc4638" +checksum = "2a2f045b24c738dd91d482be385512b512721ae08a671bd4b27bf1c47f215235" dependencies = [ "jxl-bitstream", "jxl-coding", "jxl-grid", + "jxl-oxide-common", "jxl-threadpool", "tracing", ] [[package]] name = "jxl-oxide" -version = "0.8.1" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba1ee3895e6c62b131994807b1ee6d179013613a86c01c203369af8d1e8d2f0" +checksum = "d36c662923f47586880211f3bc7c0d83fb3a9b410d278c7bde93450748abeef3" dependencies = [ + "brotli-decompressor", + "bytemuck", + "image", "jxl-bitstream", "jxl-color", "jxl-frame", "jxl-grid", "jxl-image", + "jxl-jbr", + "jxl-oxide-common", "jxl-render", "jxl-threadpool", "tracing", ] +[[package]] +name = "jxl-oxide-common" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62394c5021b3a9e7e0dbb2d639d555d019090c9946c39f6d3b09d390db4157b" +dependencies = [ + "jxl-bitstream", +] + [[package]] name = "jxl-render" -version = "0.8.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "203a79b3025b86f875cc97a6f39e1fcc6314f915b2f6b69f767fca45fd482a11" +checksum = "d34386bfdb6a19b5a30cc9beb4d475d537422c31ae8c39bb69640fcce3fcaf19" dependencies = [ + "bytemuck", "jxl-bitstream", "jxl-coding", "jxl-color", @@ -4079,6 +4481,7 @@ dependencies = [ "jxl-grid", "jxl-image", "jxl-modular", + "jxl-oxide-common", "jxl-threadpool", "jxl-vardct", "tracing", @@ -4086,9 +4489,9 @@ dependencies = [ [[package]] name = "jxl-threadpool" -version = "0.1.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9c78eaf899cce165e266300f9963d8d376d4ed95cf4d12dd7066f05542cd88" +checksum = "25f15eb830aa77a7f21148d72e153562a26bfe570139bd4922eab1908dd499d3" dependencies = [ "rayon", "rayon-core", @@ -4097,14 +4500,15 @@ dependencies = [ [[package]] name = "jxl-vardct" -version = "0.7.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16af82a1ad770887cad720bfd3cc6a6d023faf377036989a24cf2c6538b649e0" +checksum = "ce72a18c6d3a47172ab6c479be2bdb56f22066b5d7092663f03b4490820b4511" dependencies = [ "jxl-bitstream", "jxl-coding", "jxl-grid", "jxl-modular", + "jxl-oxide-common", "jxl-threadpool", "tracing", ] @@ -4116,10 +4520,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", + "ecdsa", + "elliptic-curve", "once_cell", - "sha2", + "sha2 0.10.9", "signature 2.2.0", ] @@ -4144,12 +4548,21 @@ dependencies = [ ] [[package]] -name = "kv-log-macro" -version = "1.0.7" +name = "lapin" +version = "4.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +checksum = "0fd20e01fd92597ca352ca7ceed3c589851ebad279dfcada48aa4d24fd3a7caa" dependencies = [ - "log", + "amq-protocol", + "async-rs", + "async-trait", + "backon", + "cfg-if", + "event-listener 5.4.1", + "flume", + "futures-core", + "futures-io", + "tracing", ] [[package]] @@ -4158,20 +4571,37 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin", + "spin 0.9.8", ] [[package]] -name = "lazycell" -version = "1.3.0" +name = "lcms2" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75877b724685dd49310bdbadbf973fc69b1d01992a6d4a861b928fc3943f87b" +dependencies = [ + "bytemuck", + "foreign-types 0.5.0", + "lcms2-sys", +] + +[[package]] +name = "lcms2-sys" +version = "4.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +checksum = "1c2604b23848ca80b2add60f0fb2270fd980e622c25029b6597fa01cfd5f8d5f" +dependencies = [ + "cc", + "dunce", + "libc", + "pkg-config", +] [[package]] name = "lebe" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "lettre" @@ -4189,24 +4619,24 @@ dependencies = [ "idna 0.3.0", "mime", "native-tls", - "nom", + "nom 7.1.3", "once_cell", "quoted_printable", "socket2 0.4.10", - "tokio 1.47.1", + "tokio", ] [[package]] name = "libc" -version = "0.2.174" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libfuzzer-sys" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" dependencies = [ "arbitrary", "cc", @@ -4224,27 +4654,17 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libloading" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" -dependencies = [ - "cfg-if", - "windows-targets 0.53.3", -] - [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libnghttp2-sys" -version = "0.1.11+1.64.0" +version = "0.1.13+1.68.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6c24e48a7167cffa7119da39d577fa482e66c688a4aac016bee862e1a713c4" +checksum = "492e00167f1418c15648144f42bbfc63099806ecee9bf8d09a6353d6b4856b3c" dependencies = [ "cc", "libc", @@ -4262,9 +4682,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.22" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "libc", @@ -4280,18 +4700,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linkify" -version = "0.6.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1986921c3c13e81df623c66a298d4b130c061bcb98a01f5b2d3ac402b1649a7f" -dependencies = [ - "memchr", -] - -[[package]] -name = "linkify" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d9967eb7d0bc31c39c6f52e8fce42991c0cd1f7a2078326f0b7a399a584c8d" +checksum = "28d9967eb7d0bc31c39c6f52e8fce42991c0cd1f7a2078326f0b7a399a584c8d" dependencies = [ "memchr", ] @@ -4304,65 +4715,112 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] -name = "lock_api" -version = "0.4.13" +name = "livekit-api" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "6479ff15fd0108f8ebd698b4458dce5091686b8c11e130e08e99a925f1cc1881" dependencies = [ - "autocfg 1.5.0", + "base64 0.21.7", + "device-info", + "http 1.4.2", + "jsonwebtoken", + "livekit-protocol", + "log", + "os_info", + "parking_lot", + "pbjson-types", + "prost", + "rand 0.9.4", + "reqwest 0.12.28", + "rustls-native-certs 0.8.4", "scopeguard", + "serde", + "serde_json", + "sha2 0.10.9", + "thiserror 2.0.18", + "tokio-rustls 0.26.4", + "tokio-tungstenite", + "url", ] [[package]] -name = "log" -version = "0.4.27" +name = "livekit-protocol" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd59f3759f1a14e60b6bc6d4d415414e1aed686c8e4d2c7862542d95301cdc70" +dependencies = [ + "pbjson", + "pbjson-types", + "prost", + "serde", +] + +[[package]] +name = "livekit-runtime" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532e84c6cdc5fe774f2b5d9912597b5f3bea561927a48296d03e24549d21c3f6" +dependencies = [ + "tokio", + "tokio-stream", +] + +[[package]] +name = "lock_api" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "value-bag", + "scopeguard", ] +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + [[package]] name = "logos" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6f536c1af4c7cc81edf73da1f8029896e7e1e16a219ef09b184e76a296f3db" +checksum = "ff472f899b4ec2d99161c51f60ff7075eeb3097069a36050d8037a6325eb8154" dependencies = [ "logos-derive", ] [[package]] name = "logos-codegen" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189bbfd0b61330abea797e5e9276408f2edbe4f822d7ad08685d67419aafb34e" +checksum = "192a3a2b90b0c05b27a0b2c43eecdb7c415e29243acc3f89cc8247a5b693045c" dependencies = [ "beef", "fnv", "lazy_static", "proc-macro2", - "quote 1.0.40", - "regex-syntax 0.8.5", + "quote 1.0.46", + "regex-syntax", "rustc_version", - "syn 2.0.104", + "syn 2.0.118", ] [[package]] name = "logos-derive" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebfe8e1a19049ddbfccbd14ac834b215e11b85b90bab0c2dba7c7b92fb5d5cba" +checksum = "605d9697bcd5ef3a42d38efc51541aa3d6a4a25f7ab6d1ed0da5ac632a26b470" dependencies = [ "logos-codegen", ] @@ -4374,7 +4832,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ "cfg-if", - "generator 0.7.5", + "generator", "scoped-tls", "serde", "serde_json", @@ -4382,19 +4840,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator 0.8.5", - "scoped-tls", - "tracing", - "tracing-subscriber", -] - [[package]] name = "loop9" version = "0.1.5" @@ -4406,39 +4851,18 @@ dependencies = [ [[package]] name = "lru" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" -dependencies = [ - "hashbrown 0.12.3", -] - -[[package]] -name = "lru" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a83fb7698b3643a0e34f9ae6f2e8f0178c0fd42f8b59d493aa271ff3a5bf21" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "lru" -version = "0.12.5" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.16.1", ] [[package]] -name = "lru-cache" +name = "lru-slab" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -dependencies = [ - "linked-hash-map", -] +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lru_time_cache" @@ -4460,8 +4884,8 @@ checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" dependencies = [ "macro_magic_core", "macro_magic_macros", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -4474,8 +4898,8 @@ dependencies = [ "derive-syn-parse", "macro_magic_core_macros", "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -4485,8 +4909,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -4496,8 +4920,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ "macro_magic_core", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -4522,19 +4946,13 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - [[package]] name = "matchit" version = "0.7.3" @@ -4558,20 +4976,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "md-5" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" +dependencies = [ + "cfg-if", + "digest 0.11.3", ] [[package]] name = "memchr" -version = "2.7.5" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "memmap2" -version = "0.9.7" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" dependencies = [ "libc", ] @@ -4610,13 +5038,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -4625,7 +5053,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "316a7d198b51958a0ab57248bf5f42d8409551203cb3c821d5925819a8d5415f" dependencies = [ - "async-std", "async-trait", "futures-channel", "futures-core", @@ -4634,7 +5061,7 @@ dependencies = [ "log", "metrics", "thiserror 1.0.69", - "tokio 1.47.1", + "tokio", "tracing", "tracing-subscriber", ] @@ -4651,85 +5078,108 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.10" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" dependencies = [ - "async-lock 3.4.1", + "async-lock 3.4.2", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", + "equivalent", "event-listener 5.4.1", "futures-util", - "loom 0.7.2", "parking_lot", "portable-atomic", - "rustc_version", "smallvec", "tagptr", - "thiserror 1.0.69", "uuid", ] +[[package]] +name = "mongocrypt" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da0cd419a51a5fb44819e290fbdb0665a54f21dead8923446a799c7f4d26ad9" +dependencies = [ + "bson", + "mongocrypt-sys", + "once_cell", + "serde", +] + +[[package]] +name = "mongocrypt-sys" +version = "0.1.5+1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224484c5d09285a7b8cb0a0c117e847ebd14cb6e4470ecf68cdb89c503b0edb9" + [[package]] name = "mongodb" -version = "3.2.4" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f8c69f13acf07eae386a2974f48ffd9187ea2aba8defbea9aa34e7e272c5f3" +checksum = "276ba0cd571553d1f6936c6f180964776ece6ab7507dc8765f8a9c9c49d8cd00" dependencies = [ - "async-trait", - "base64 0.13.1", - "bitflags 1.3.2", + "base64 0.22.1", + "bitflags 2.13.0", "bson", - "chrono", "derive-where", - "derive_more", + "derive_more 2.1.1", "futures-core", - "futures-executor", "futures-io", "futures-util", "hex", + "hickory-net", "hickory-proto", "hickory-resolver", - "hmac", + "hmac 0.12.1", "macro_magic", - "md-5", + "md-5 0.10.6", + "mongocrypt", "mongodb-internal-macros", - "once_cell", "pbkdf2", "percent-encoding", - "rand 0.8.5", + "rand 0.9.4", "rustc_version_runtime", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", + "rustls 0.23.41", "serde", "serde_bytes", "serde_with", - "sha1", - "sha2", - "socket2 0.5.10", + "sha1 0.10.6", + "sha2 0.10.9", + "socket2 0.6.4", "stringprep", "strsim 0.11.1", "take_mut", - "thiserror 1.0.69", - "tokio 1.47.1", - "tokio-rustls 0.24.1", + "thiserror 2.0.18", + "tokio", + "tokio-rustls 0.26.4", "tokio-util", "typed-builder", "uuid", - "webpki-roots 0.25.4", + "webpki-roots 1.0.8", ] [[package]] name = "mongodb-internal-macros" -version = "3.2.4" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9202de265a3a8bbb43f9fe56db27c93137d4f9fb04c093f47e9c7de0c61ac7d" +checksum = "99ceb1a9a1018e470077ec94cf3a8c2d0e6da542b2c05ea95a59a0a627147375" dependencies = [ "macro_magic", "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", ] [[package]] @@ -4738,24 +5188,30 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" dependencies = [ - "bytes 1.10.1", + "bytes", "encoding_rs", "futures-util", - "http 1.3.1", + "http 1.4.2", "httparse", "memchr", "mime", - "spin", - "tokio 1.47.1", + "spin 0.9.8", + "tokio", "tokio-util", "version_check", ] +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + [[package]] name = "mutate_once" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" +checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" [[package]] name = "nanoid" @@ -4763,32 +5219,59 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" dependencies = [ - "rand 0.8.5", + "rand 0.8.6", ] [[package]] name = "native-tls" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ "libc", "log", "openssl", - "openssl-probe", + "openssl-probe 0.2.1", "openssl-sys", "schannel", - "security-framework 2.11.1", + "security-framework 3.7.0", "security-framework-sys", "tempfile", ] +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + [[package]] name = "new_debug_unreachable" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no_std_io2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +dependencies = [ + "memchr", +] + [[package]] name = "nom" version = "7.1.3" @@ -4799,6 +5282,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + [[package]] name = "noop_proc_macro" version = "0.3.0" @@ -4807,21 +5299,20 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] name = "ntapi" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" dependencies = [ "winapi", ] [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "overload", - "winapi", + "windows-sys 0.61.2", ] [[package]] @@ -4836,26 +5327,25 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-derive" @@ -4864,8 +5354,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -4883,7 +5373,7 @@ version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ - "autocfg 1.5.0", + "autocfg", "num-integer", "num-traits", ] @@ -4905,7 +5395,7 @@ version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "autocfg 1.5.0", + "autocfg", "libm", ] @@ -4919,34 +5409,13 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" dependencies = [ - "num_enum_derive 0.6.1", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote 1.0.40", - "syn 1.0.109", + "num_enum_derive", ] [[package]] @@ -4957,8 +5426,8 @@ checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -4971,150 +5440,337 @@ dependencies = [ ] [[package]] -name = "object" -version = "0.36.7" +name = "objc2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ - "memchr", + "objc2-encode", ] [[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "opaque-debug" -version = "0.3.1" +name = "objc2-cloud-kit" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.0", + "objc2", + "objc2-foundation", +] [[package]] -name = "openssl" -version = "0.10.73" +name = "objc2-core-data" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", + "objc2", + "objc2-foundation", ] [[package]] -name = "openssl-macros" -version = "0.1.1" +name = "objc2-core-foundation" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "bitflags 2.13.0", + "dispatch2", + "objc2", ] [[package]] -name = "openssl-probe" -version = "0.1.6" +name = "objc2-core-graphics" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] [[package]] -name = "openssl-sys" -version = "0.9.109" +name = "objc2-core-image" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "objc2", + "objc2-foundation", ] [[package]] -name = "ordered-multimap" -version = "0.4.3" +name = "objc2-core-location" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" dependencies = [ - "dlv-list", - "hashbrown 0.12.3", + "objc2", + "objc2-foundation", ] [[package]] -name = "os_info" -version = "3.12.0" +name = "objc2-core-text" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e1ac5fde8d43c34139135df8ea9ee9465394b2d8d20f032d38998f64afffc3" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "log", - "plist", - "serde", - "windows-sys 0.52.0", + "bitflags 2.13.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", ] [[package]] -name = "outref" -version = "0.5.2" +name = "objc2-encode" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] -name = "overload" -version = "0.1.1" +name = "objc2-foundation" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.0", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] [[package]] -name = "p256" -version = "0.11.1" +name = "objc2-io-surface" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2", + "bitflags 2.13.0", + "objc2", + "objc2-core-foundation", ] [[package]] -name = "p256" -version = "0.13.2" +name = "objc2-quartz-core" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "primeorder", - "sha2", + "bitflags 2.13.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", ] [[package]] -name = "p384" -version = "0.13.1" +name = "objc2-ui-kit" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "ecdsa 0.16.9", - "elliptic-curve 0.13.8", - "primeorder", - "sha2", + "bitflags 2.13.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", ] [[package]] -name = "parking" -version = "2.2.1" +name = "objc2-user-notifications" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +dependencies = [ + "critical-section", + "portable-atomic", +] + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags 2.13.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ordered-multimap" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" +dependencies = [ + "dlv-list", + "hashbrown 0.12.3", +] + +[[package]] +name = "os_info" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf20a545b305cf1da722b236b5155c9bb35f1d5ceb28c048bd96ca842f41b5b" +dependencies = [ + "android_system_properties", + "log", + "nix", + "objc2", + "objc2-foundation", + "objc2-ui-kit", + "serde", + "windows-sys 0.61.2", +] + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "p12-keystore" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb9bf5222606eb712d3bb30e01bc9420545b00859970897e70c682353a034f2" +dependencies = [ + "base64 0.22.1", + "cbc", + "cms", + "der 0.7.10", + "des", + "hex", + "hmac 0.12.1", + "pkcs12", + "pkcs5", + "rand 0.10.1", + "rc2", + "sha1 0.10.6", + "sha2 0.10.9", + "thiserror 2.0.18", + "x509-parser", +] + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.9", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2 0.10.9", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -5122,15 +5778,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -5139,19 +5795,162 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + [[package]] name = "pathdiff" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pbjson" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1030c719b0ec2a2d25a5df729d6cff1acf3cc230bf766f4f97833591f7577b90" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "pbjson-build" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2580e33f2292d34be285c5bc3dba5259542b083cfad6037b6d70345f24dcb735" +dependencies = [ + "heck 0.4.1", + "itertools 0.11.0", + "prost", + "prost-types", +] + +[[package]] +name = "pbjson-types" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18f596653ba4ac51bdecbb4ef6773bc7f56042dc13927910de1684ad3d32aa12" +dependencies = [ + "bytes", + "chrono", + "pbjson", + "pbjson-build", + "prost", + "prost-build", + "serde", +] + [[package]] name = "pbkdf2" -version = "0.11.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest", + "digest 0.10.7", + "hmac 0.12.1", +] + +[[package]] +name = "pdk-classy" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b272f9dc3cd8446c4be61715a2396d1c0dea022e45c701c8446fa7bc81a0448" +dependencies = [ + "bincode", + "futures", + "getrandom 0.2.17", + "http 0.2.12", + "log", + "pdk-proxy-wasm-stub", + "protobuf", + "proxy-wasm", + "serde", + "serde_derive", + "thiserror 1.0.69", +] + +[[package]] +name = "pdk-core" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e3a49e0045a651298424a582db6ef81978b3f619f914b485feb2a8d3cb18eb" +dependencies = [ + "anyhow", + "log", + "pdk-classy", + "pdk-macros", + "pdk-script", + "protobuf", + "protobuf-codegen", + "rmp-serde", + "serde", + "serde_derive", + "serde_json", + "sha2 0.10.9", + "url", +] + +[[package]] +name = "pdk-ip-filter-lib" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eab0326a148dc64b3ce0b444b9be79e77e2c32c8a11e98800cb897f46d077ec" +dependencies = [ + "anyhow", + "ipnet", + "pdk-core", + "thiserror 1.0.69", +] + +[[package]] +name = "pdk-macros" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3123ab64f4cea8374fbb6d0697997a209fe16794e330caacb4914967530d10a" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 1.0.109", +] + +[[package]] +name = "pdk-pel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7af9cbea6ed98d843d106e95451ea907b5e411061e23783b86a37c5748f7be3a" +dependencies = [ + "base64 0.22.1", + "getrandom 0.2.17", + "serde_json", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "pdk-proxy-wasm-stub" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9469584d6a62ac97a46cfd3e67a270dbac8af33e27169b4e87a1a7f2e10d321f" + +[[package]] +name = "pdk-script" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db9968802349bd53285e846450a534ff91d9c9d51f9bd1da4e833eff17b906d9" +dependencies = [ + "log", + "num-traits", + "pdk-classy", + "pdk-pel", + "roxmltree", + "serde", + "serde_json", + "thiserror 1.0.69", + "url", ] [[package]] @@ -5173,8 +5972,8 @@ checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -5190,12 +5989,12 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ "base64 0.22.1", - "serde", + "serde_core", ] [[package]] @@ -5218,26 +6017,25 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.1" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" dependencies = [ "memchr", - "thiserror 2.0.12", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.8.1" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc" +checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" dependencies = [ "pest", "pest_generator", @@ -5245,25 +6043,35 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.1" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966" +checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" dependencies = [ "pest", "pest_meta", "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "pest_meta" -version = "2.8.1" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5" +checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" dependencies = [ "pest", - "sha2", + "sha2 0.10.9", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.14.0", ] [[package]] @@ -5312,7 +6120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" dependencies = [ "phf_shared 0.10.0", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -5322,7 +6130,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared 0.11.3", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -5334,8 +6142,8 @@ dependencies = [ "phf_generator 0.11.3", "phf_shared 0.11.3", "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -5353,7 +6161,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher 1.0.1", + "siphasher 1.0.3", ] [[package]] @@ -5364,35 +6172,29 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "pin-project-lite" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" - -[[package]] -name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -5402,12 +6204,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", - "fastrand 2.3.0", + "fastrand 2.4.1", "futures-io", ] @@ -5423,6 +6225,47 @@ dependencies = [ "zeroize", ] +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der 0.7.10", + "pkcs8 0.10.2", + "spki 0.7.3", +] + +[[package]] +name = "pkcs12" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "695b3df3d3cc1015f12d70235e35b6b79befc5fa7a9b95b951eab1dd07c9efc2" +dependencies = [ + "cms", + "const-oid 0.9.6", + "der 0.7.10", + "digest 0.10.7", + "spki 0.7.3", + "x509-cert", + "zeroize", +] + +[[package]] +name = "pkcs5" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" +dependencies = [ + "aes", + "cbc", + "der 0.7.10", + "pbkdf2", + "scrypt", + "sha2 0.10.9", + "spki 0.7.3", +] + [[package]] name = "pkcs8" version = "0.9.0" @@ -5445,22 +6288,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plist" -version = "1.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" -dependencies = [ - "base64 0.22.1", - "indexmap 2.10.0", - "quick-xml", - "serde", - "time", -] +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "png" @@ -5476,33 +6306,30 @@ dependencies = [ ] [[package]] -name = "polling" -version = "2.8.0" +name = "png" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "autocfg 1.5.0", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite 0.2.16", - "windows-sys 0.48.0", + "bitflags 2.13.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", ] [[package]] name = "polling" -version = "3.10.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi 0.5.2", - "pin-project-lite 0.2.16", - "rustix 1.0.8", - "windows-sys 0.60.2", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", ] [[package]] @@ -5512,22 +6339,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -5553,6 +6380,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prefix-trie" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf6e3177f0684016a5c209b00882e15f8bdd3f3bb48f0491df10cd102d0c6e7" +dependencies = [ + "either", + "ipnet", + "num-traits", +] + [[package]] name = "pretty_env_logger" version = "0.4.0" @@ -5565,12 +6403,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.36" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.104", + "syn 2.0.118", ] [[package]] @@ -5579,7 +6417,7 @@ version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ - "elliptic-curve 0.13.8", + "elliptic-curve", ] [[package]] @@ -5600,7 +6438,7 @@ checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "syn 1.0.109", "version_check", ] @@ -5612,37 +6450,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "version_check", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote 1.0.40", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", -] - [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -5654,29 +6470,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", "version_check", "yansi", ] [[package]] name = "profiling" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" dependencies = [ "profiling-procmacros", ] [[package]] name = "profiling-procmacros" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" dependencies = [ - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -5693,6 +6509,126 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck 0.5.0", + "itertools 0.12.1", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.118", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "protobuf" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65a1d4ddae7d8b5de68153b48f6aa3bba8cb002b243dbdbc55a5afbc98f99f4" +dependencies = [ + "once_cell", + "protobuf-support", + "thiserror 1.0.69", +] + +[[package]] +name = "protobuf-codegen" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d3976825c0014bbd2f3b34f0001876604fe87e0c86cd8fa54251530f1544ace" +dependencies = [ + "anyhow", + "once_cell", + "protobuf", + "protobuf-parse", + "regex", + "tempfile", + "thiserror 1.0.69", +] + +[[package]] +name = "protobuf-parse" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4aeaa1f2460f1d348eeaeed86aea999ce98c1bded6f089ff8514c9d9dbdc973" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "log", + "protobuf", + "protobuf-support", + "tempfile", + "thiserror 1.0.69", + "which", +] + +[[package]] +name = "protobuf-support" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e36c2f31e0a47f9280fb347ef5e461ffcd2c52dd520d8e216b52f93b0b0d7d6" +dependencies = [ + "thiserror 1.0.69", +] + +[[package]] +name = "proxy-wasm" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de8f6564bd52c2f4ff79fa5d1bd3bc10d8f822162af8d527e121e46703496aa0" +dependencies = [ + "hashbrown 0.16.1", + "log", +] + +[[package]] +name = "pxfm" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + [[package]] name = "qoi" version = "0.4.1" @@ -5715,18 +6651,65 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] -name = "quick-error" -version = "2.0.1" +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.41", + "socket2 0.6.4", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" +dependencies = [ + "aws-lc-rs", + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash", + "rustls 0.23.41", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] [[package]] -name = "quick-xml" -version = "0.38.1" +name = "quinn-udp" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9845d9dccf565065824e69f9f235fafba1587031eda353c1f1561cd6a6be78f4" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ - "memchr", + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.4", + "tracing", + "windows-sys 0.60.2", ] [[package]] @@ -5737,9 +6720,9 @@ checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" [[package]] name = "quote" -version = "1.0.40" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -5757,35 +6740,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "radium" -version = "0.7.0" +name = "r-efi" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] -name = "rand" -version = "0.6.5" +name = "radium" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi", -] +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -5794,22 +6764,23 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] -name = "rand_chacha" -version = "0.1.1" +name = "rand" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -5829,120 +6800,50 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", + "rand_core 0.9.5", ] -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.3", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "wasm-bindgen", - "winapi", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", + "getrandom 0.3.4", ] [[package]] -name = "rand_xorshift" -version = "0.1.1" +name = "rand_core" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rav1e" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" dependencies = [ + "aligned-vec", "arbitrary", "arg_enum_proc_macro", "arrayvec", + "av-scenechange", "av1-grain", "bitstream-io", "built", "cfg-if", "interpolate_name", - "itertools", + "itertools 0.14.0", "libc", "libfuzzer-sys", "log", @@ -5951,23 +6852,21 @@ dependencies = [ "noop_proc_macro", "num-derive", "num-traits", - "once_cell", "paste", "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.4", + "rand_chacha 0.9.0", "simd_helpers", - "system-deps", - "thiserror 1.0.69", + "thiserror 2.0.18", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.20" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" dependencies = [ "avif-serialize", "imgref", @@ -5980,9 +6879,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -5990,21 +6889,21 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", ] [[package]] -name = "rdrand" -version = "0.4.0" +name = "rc2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd" dependencies = [ - "rand_core 0.3.1", + "cipher", ] [[package]] @@ -6012,18 +6911,17 @@ name = "redis" version = "0.23.3" source = "git+https://github.com/revoltchat/redis-rs?rev=523b2937367e17bd0073722bf6e23d06042cb4e4#523b2937367e17bd0073722bf6e23d06042cb4e4" dependencies = [ - "async-std", "async-trait", - "bytes 1.10.1", + "bytes", "combine", "futures-util", "itoa", "percent-encoding", - "pin-project-lite 0.2.16", + "pin-project-lite", "ryu", "sha1_smol", "socket2 0.4.10", - "tokio 1.47.1", + "tokio", "tokio-util", "url", ] @@ -6050,92 +6948,77 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c31deddf734dc0a39d3112e73490e88b61a05e83e074d211f348404cee4d2c6" dependencies = [ - "bytes 1.10.1", + "bytes", "bytes-utils", "cookie-factory", "crc16", "log", - "nom", + "nom 7.1.3", ] [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.0", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-lite" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" - -[[package]] -name = "regex-syntax" -version = "0.6.29" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -6144,7 +7027,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64 0.21.7", - "bytes 1.10.1", + "bytes", "encoding_rs", "futures-core", "futures-util", @@ -6152,7 +7035,7 @@ dependencies = [ "http 0.2.12", "http-body 0.4.6", "hyper 0.14.32", - "hyper-tls 0.5.0", + "hyper-tls", "ipnet", "js-sys", "log", @@ -6160,14 +7043,14 @@ dependencies = [ "native-tls", "once_cell", "percent-encoding", - "pin-project-lite 0.2.16", + "pin-project-lite", "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", "system-configuration 0.5.1", - "tokio 1.47.1", + "tokio", "tokio-native-tls", "tower-service", "url", @@ -6179,37 +7062,76 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "hyper 1.10.1", + "hyper-rustls 0.27.9", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.41", + "rustls-native-certs 0.8.4", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-rustls 0.26.4", + "tower", + "tower-http 0.6.11", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "reqwest" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64 0.22.1", - "bytes 1.10.1", + "bytes", "encoding_rs", "futures-core", - "h2 0.4.11", - "http 1.3.1", + "h2 0.4.15", + "http 1.4.2", "http-body 1.0.1", "http-body-util", - "hyper 1.6.0", - "hyper-rustls 0.27.7", - "hyper-tls 0.6.0", + "hyper 1.10.1", + "hyper-rustls 0.27.9", "hyper-util", "js-sys", "log", "mime", - "native-tls", "percent-encoding", - "pin-project-lite 0.2.16", + "pin-project-lite", + "quinn", + "rustls 0.23.41", "rustls-pki-types", + "rustls-platform-verifier", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", - "tokio 1.47.1", - "tokio-native-tls", + "tokio", + "tokio-rustls 0.26.4", "tower", - "tower-http 0.6.6", + "tower-http 0.6.11", "tower-service", "url", "wasm-bindgen", @@ -6219,9 +7141,9 @@ dependencies = [ [[package]] name = "resolv-conf" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] name = "resvg" @@ -6229,7 +7151,7 @@ version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a325d5e8d1cebddd070b13f44cec8071594ab67d1012797c121f27a669b7958" dependencies = [ - "gif", + "gif 0.13.3", "image-webp 0.1.3", "log", "pico-args", @@ -6237,12 +7159,12 @@ dependencies = [ "svgtypes", "tiny-skia", "usvg", - "zune-jpeg", + "zune-jpeg 0.4.21", ] [[package]] name = "revolt-autumn" -version = "0.8.8" +version = "0.13.7" dependencies = [ "axum", "axum-macros", @@ -6254,24 +7176,28 @@ dependencies = [ "jxl-oxide", "kamadak-exif", "lazy_static", + "lcms2", "moka", "nanoid", "revolt-config", "revolt-database", "revolt-files", + "revolt-ratelimits", "revolt-result", "revolt_clamav-client", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "simdutf8", "strum_macros", "tempfile", - "tokio 1.47.1", + "thumbhash", + "tokio", "tower-http 0.5.2", "tracing", "tracing-subscriber", - "ulid 1.2.1", + "ulid", + "url-escape", "utoipa", "utoipa-scalar", "webp", @@ -6279,21 +7205,20 @@ dependencies = [ [[package]] name = "revolt-bonfire" -version = "0.8.8" +version = "0.13.7" dependencies = [ - "async-channel 2.5.0", - "async-std", + "async-channel", "async-tungstenite", - "authifier", "bincode", "fred", "futures", "log", - "lru 0.7.8", + "lru", "lru_time_cache", "once_cell", "querystring", "redis-kiss", + "regex", "revolt-config", "revolt-database", "revolt-models", @@ -6304,66 +7229,91 @@ dependencies = [ "sentry", "serde", "serde_json", - "ulid 0.5.0", + "tokio", + "tokio-util", + "ulid", +] + +[[package]] +name = "revolt-coalesced" +version = "0.13.7" +dependencies = [ + "indexmap 2.14.0", + "lru", + "tokio", ] [[package]] name = "revolt-config" -version = "0.8.8" +version = "0.13.7" dependencies = [ - "async-std", "cached", "config", "futures-locks", "log", - "once_cell", "pretty_env_logger", "revolt-result", "sentry", "sentry-anyhow", "serde", + "tokio", ] [[package]] name = "revolt-crond" -version = "0.8.8" +version = "0.13.7" dependencies = [ + "futures", + "futures-lite", + "iso8601-timestamp", + "lapin", "log", + "redis-kiss", "revolt-config", "revolt-database", "revolt-files", + "revolt-permissions", "revolt-result", - "tokio 1.47.1", + "revolt_optional_struct", + "serde", + "serde_json", + "tokio", ] [[package]] name = "revolt-database" -version = "0.8.8" +version = "0.13.7" dependencies = [ - "amqprs", "async-lock 2.8.0", "async-recursion", - "async-std", "async-trait", - "authifier", "axum", + "base32", "base64 0.21.7", "bson", "deadqueue", "decancer", "futures", - "indexmap 1.9.3", + "handlebars", + "indexmap 2.14.0", "isahc", "iso8601-timestamp", - "linkify 0.8.1", + "lapin", + "lettre", + "linkify", + "livekit-api", + "livekit-protocol", + "livekit-runtime", "log", - "lru 0.11.1", + "lru", "mongodb", "nanoid", "once_cell", - "rand 0.8.5", + "rand 0.8.6", "redis-kiss", "regex", + "reqwest 0.13.4", + "revolt-coalesced", "revolt-config", "revolt-models", "revolt-parser", @@ -6374,70 +7324,77 @@ dependencies = [ "revolt_optional_struct", "revolt_rocket_okapi", "rocket", - "schemars 0.8.22", + "rust-argon2", + "schemars", "serde", "serde_json", - "ulid 1.2.1", + "sha1 0.10.6", + "tokio", + "totp-lite", + "ulid", "unicode-segmentation", "url-escape", - "validator 0.16.1", + "utoipa", + "validator", ] [[package]] name = "revolt-delta" -version = "0.8.8" +version = "0.13.7" dependencies = [ - "amqprs", - "async-channel 1.9.0", - "async-std", - "authifier", + "async-channel", "bitfield", "chrono", "dashmap", - "env_logger", "futures", "impl_ops", "iso8601-timestamp", + "lapin", "lettre", - "linkify 0.6.0", + "linkify", + "livekit-api", + "livekit-protocol", "log", - "lru 0.7.8", + "lru", "nanoid", - "num_enum 0.5.11", + "num_enum", "once_cell", - "rand 0.8.5", + "rand 0.8.6", "redis-kiss", "regex", - "reqwest 0.11.27", + "reqwest 0.13.4", "revolt-config", "revolt-database", "revolt-models", "revolt-permissions", "revolt-presence", + "revolt-ratelimits", "revolt-result", "revolt_rocket_okapi", "rocket", - "rocket_authifier", "rocket_cors", "rocket_empty", "rocket_prometheus", - "schemars 0.8.22", + "schemars", "serde", "serde_json", - "ulid 0.4.1", + "tokio", + "ulid", "url", - "validator 0.16.1", + "validator", "vergen", ] [[package]] name = "revolt-files" -version = "0.8.8" +version = "0.13.7" dependencies = [ "aes-gcm", + "anyhow", + "async-trait", "aws-config", "aws-sdk-s3", - "base64 0.22.1", + "base64 0.21.7", "ffprobe", "image", "imagesize", @@ -6446,16 +7403,42 @@ dependencies = [ "revolt-config", "revolt-result", "tempfile", + "thiserror 2.0.18", "tiny-skia", + "tokio", "tracing", "typenum", "usvg", + "uuid", "webp", ] +[[package]] +name = "revolt-gifbox" +version = "0.13.7" +dependencies = [ + "axum", + "axum-extra", + "lru_time_cache", + "reqwest 0.13.4", + "revolt-coalesced", + "revolt-config", + "revolt-database", + "revolt-models", + "revolt-ratelimits", + "revolt-result", + "serde", + "serde_json", + "tokio", + "tower-http 0.5.2", + "tracing", + "utoipa", + "utoipa-scalar", +] + [[package]] name = "revolt-january" -version = "0.8.8" +version = "0.13.7" dependencies = [ "async-recursion", "axum", @@ -6464,8 +7447,9 @@ dependencies = [ "lazy_static", "mime", "moka", + "pdk-ip-filter-lib", "regex", - "reqwest 0.12.22", + "reqwest 0.13.4", "revolt-config", "revolt-files", "revolt-models", @@ -6474,108 +7458,156 @@ dependencies = [ "serde", "serde_json", "tempfile", - "tokio 1.47.1", + "tokio", "tracing", "tracing-subscriber", + "url", "utoipa", "utoipa-scalar", ] [[package]] name = "revolt-models" -version = "0.8.8" +version = "0.13.7" dependencies = [ - "indexmap 1.9.3", + "indexmap 2.14.0", "iso8601-timestamp", - "num_enum 0.6.1", + "num_enum", "once_cell", "regex", "revolt-config", "revolt-permissions", "revolt_optional_struct", "rocket", - "schemars 0.8.22", + "schemars", "serde", + "serde_json", "utoipa", - "validator 0.16.1", + "validator", ] [[package]] name = "revolt-parser" -version = "0.8.8" +version = "0.13.7" dependencies = [ "logos", ] [[package]] name = "revolt-permissions" -version = "0.8.8" +version = "0.13.7" dependencies = [ - "async-std", "async-trait", "auto_ops", "bson", - "num_enum 0.6.1", + "num_enum", "once_cell", "revolt-result", - "schemars 0.8.22", + "schemars", "serde", + "tokio", ] [[package]] name = "revolt-presence" -version = "0.8.8" +version = "0.13.7" dependencies = [ - "async-std", "log", "once_cell", - "rand 0.8.5", + "rand 0.8.6", "redis-kiss", "revolt-config", + "tokio", ] [[package]] name = "revolt-pushd" -version = "0.8.8" +version = "0.13.7" dependencies = [ - "amqprs", "anyhow", "async-trait", - "authifier", - "base64 0.22.1", + "base64 0.21.7", "fcm_v1", "isahc", "iso8601-timestamp", + "lapin", "log", "pretty_env_logger", + "redis-kiss", + "regex", "revolt-config", "revolt-database", "revolt-models", + "revolt-parser", "revolt-presence", "revolt-result", "revolt_a2", "revolt_optional_struct", "serde", "serde_json", - "tokio 1.47.1", - "ulid 1.2.1", + "tokio", + "ulid", "web-push", ] +[[package]] +name = "revolt-ratelimits" +version = "0.13.7" +dependencies = [ + "async-trait", + "axum", + "dashmap", + "log", + "revolt-config", + "revolt-database", + "revolt-result", + "revolt_rocket_okapi", + "rocket", + "serde", +] + [[package]] name = "revolt-result" -version = "0.8.8" +version = "0.13.7" dependencies = [ "axum", + "log", "revolt_okapi", "revolt_rocket_okapi", "rocket", - "schemars 0.8.22", + "schemars", + "sentry", "serde", "serde_json", "utoipa", ] +[[package]] +name = "revolt-voice-ingress" +version = "0.13.7" +dependencies = [ + "chrono", + "futures", + "livekit-api", + "livekit-protocol", + "livekit-runtime", + "log", + "lru", + "redis-kiss", + "revolt-config", + "revolt-database", + "revolt-models", + "revolt-permissions", + "revolt-result", + "rmp-serde", + "rocket", + "rocket_empty", + "sentry", + "serde", + "serde_json", + "ulid", +] + [[package]] name = "revolt_a2" version = "0.10.1" @@ -6584,20 +7616,21 @@ checksum = "edbe1f79cb41271d3cd8f932d75dddeba963c19dc93d1ee6cbe0391b495ab2f5" dependencies = [ "base64 0.21.7", "erased-serde", - "http 1.3.1", + "http 1.4.2", "http-body-util", - "hyper 1.6.0", + "hyper 1.10.1", "hyper-rustls 0.26.0", "hyper-util", + "openssl", "parking_lot", - "pem 3.0.5", + "pem 3.0.6", "ring", "rustls 0.22.4", "rustls-pemfile 2.2.0", "serde", "serde_json", "thiserror 1.0.69", - "tokio 1.47.1", + "tokio", ] [[package]] @@ -6613,7 +7646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23bfdf7ae769c3042fe727f6e5c17363b02a64b4b33ad60c3e5f73b26df7835b" dependencies = [ "log", - "schemars 0.8.22", + "schemars", "serde", "serde_json", ] @@ -6639,7 +7672,7 @@ dependencies = [ "revolt_okapi", "revolt_rocket_okapi_codegen", "rocket", - "schemars 0.8.22", + "schemars", "serde", "serde_json", ] @@ -6652,37 +7685,26 @@ checksum = "cc6620569d8ac8f0a1690fcca13f488503807a60e96ebf729749b59aca1dbef9" dependencies = [ "darling 0.13.4", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "rocket_http", "syn 1.0.109", ] -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac", - "zeroize", -] - [[package]] name = "rfc6979" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac", + "hmac 0.12.1", "subtle", ] [[package]] name = "rgb" -version = "0.8.52" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" dependencies = [ "bytemuck", ] @@ -6695,7 +7717,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -6703,22 +7725,19 @@ dependencies = [ [[package]] name = "rmp" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" dependencies = [ - "byteorder", "num-traits", - "paste", ] [[package]] name = "rmp-serde" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" dependencies = [ - "byteorder", "rmp", "serde", ] @@ -6733,18 +7752,18 @@ dependencies = [ "async-trait", "atomic 0.5.3", "binascii", - "bytes 1.10.1", + "bytes", "either", "figment", "futures", - "indexmap 2.10.0", + "indexmap 2.14.0", "log", "memchr", "multer", "num_cpus", "parking_lot", - "pin-project-lite 0.2.16", - "rand 0.8.5", + "pin-project-lite", + "rand 0.8.6", "ref-cast", "rocket_codegen", "rocket_http", @@ -6753,7 +7772,7 @@ dependencies = [ "state", "tempfile", "time", - "tokio 1.47.1", + "tokio", "tokio-stream", "tokio-util", "ubyte", @@ -6761,22 +7780,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "rocket_authifier" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f98a5be96ac4144ee1adc809c1594e8212032b8a08d9bc4cef70735dfd976e" -dependencies = [ - "authifier", - "iso8601-timestamp", - "revolt_okapi", - "revolt_rocket_okapi", - "rocket", - "rocket_empty", - "schemars 0.8.22", - "serde", -] - [[package]] name = "rocket_codegen" version = "0.5.1" @@ -6785,11 +7788,11 @@ checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46" dependencies = [ "devise", "glob", - "indexmap 2.10.0", + "indexmap 2.14.0", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "rocket_http", - "syn 2.0.104", + "syn 2.0.118", "unicode-xid 0.2.6", "version_check", ] @@ -6832,19 +7835,19 @@ dependencies = [ "futures", "http 0.2.12", "hyper 0.14.32", - "indexmap 2.10.0", + "indexmap 2.14.0", "log", "memchr", "pear", "percent-encoding", - "pin-project-lite 0.2.16", + "pin-project-lite", "ref-cast", "serde", "smallvec", "stable-pattern", "state", "time", - "tokio 1.47.1", + "tokio", "uncased", ] @@ -6882,12 +7885,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "094052d5470cbcef561cb848a7209968c9f12dfa6d668f4bca048ac5de51099c" dependencies = [ "byteorder", - "digest", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-iter", "num-traits", - "pkcs1", + "pkcs1 0.4.1", "pkcs8 0.9.0", "rand_core 0.6.4", "signature 1.6.4", @@ -6896,6 +7899,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid 0.9.6", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1 0.7.5", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "signature 2.2.0", + "spki 0.7.3", + "subtle", + "zeroize", +] + [[package]] name = "rust-argon2" version = "1.0.1" @@ -6904,7 +7927,7 @@ checksum = "a5885493fdf0be6cdff808d1533ce878d21cfa49c7086fa00c66355cd9141bfc" dependencies = [ "base64 0.21.7", "blake2b_simd", - "constant_time_eq", + "constant_time_eq 0.3.1", "crossbeam-utils", ] @@ -6920,15 +7943,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustc-hash" -version = "1.1.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -6949,13 +7972,22 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom 7.1.3", +] + [[package]] name = "rustix" version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -6964,15 +7996,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.8" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.0", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", ] [[package]] @@ -7003,25 +8035,42 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" dependencies = [ "aws-lc-rs", + "log", "once_cell", + "ring", "rustls-pki-types", - "rustls-webpki 0.103.4", + "rustls-webpki 0.103.13", "subtle", "zeroize", ] +[[package]] +name = "rustls-connector" +version = "0.23.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7664e32b0ffbec386bdf1d7cbca51a89551a90d3278f135186cd6cb3cfa889c" +dependencies = [ + "futures-io", + "futures-rustls", + "log", + "rustls 0.23.41", + "rustls-pki-types", + "rustls-platform-verifier", + "rustls-webpki 0.103.13", +] + [[package]] name = "rustls-native-certs" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ - "openssl-probe", + "openssl-probe 0.1.6", "rustls-pemfile 1.0.4", "schannel", "security-framework 2.11.1", @@ -7029,14 +8078,14 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ - "openssl-probe", + "openssl-probe 0.2.1", "rustls-pki-types", "schannel", - "security-framework 3.2.0", + "security-framework 3.7.0", ] [[package]] @@ -7059,13 +8108,41 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ + "web-time", "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni 0.22.4", + "log", + "once_cell", + "rustls 0.23.41", + "rustls-native-certs 0.8.4", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.13", + "security-framework 3.7.0", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -7089,9 +8166,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -7101,9 +8178,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rustybuzz" @@ -7111,7 +8188,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c85d1ccd519e61834798eb52c4e886e8c2d7d698dd3d6ce0b1b47eb8557f1181" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.0", "bytemuck", "core_maths", "log", @@ -7125,52 +8202,47 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] -name = "schannel" -version = "0.1.27" +name = "salsa20" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" dependencies = [ - "windows-sys 0.59.0", + "cipher", ] [[package]] -name = "schemars" -version = "0.8.22" +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "dyn-clone", - "indexmap 1.9.3", - "schemars_derive", - "serde", - "serde_json", + "winapi-util", ] [[package]] -name = "schemars" -version = "0.9.0" +name = "schannel" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", + "windows-sys 0.61.2", ] [[package]] name = "schemars" -version = "1.0.4" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ "dyn-clone", - "ref-cast", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars_derive", "serde", "serde_json", ] @@ -7182,9 +8254,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" dependencies = [ "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "serde_derive_internals", - "syn 2.0.104", + "syn 2.0.118", ] [[package]] @@ -7215,6 +8287,17 @@ dependencies = [ "tendril", ] +[[package]] +name = "scrypt" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" +dependencies = [ + "pbkdf2", + "salsa20", + "sha2 0.10.9", +] + [[package]] name = "sct" version = "0.7.1" @@ -7231,27 +8314,13 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array 0.14.7", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct 0.2.0", + "base16ct", "der 0.7.10", "generic-array 0.14.7", "pkcs8 0.10.2", @@ -7276,7 +8345,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -7285,11 +8354,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.2.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -7298,9 +8367,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -7312,9 +8381,9 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.0", "cssparser", - "derive_more", + "derive_more 0.99.20", "fxhash", "log", "new_debug_unreachable", @@ -7327,9 +8396,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "sentry" @@ -7346,7 +8415,7 @@ dependencies = [ "sentry-debug-images", "sentry-panic", "sentry-tracing", - "tokio 1.47.1", + "tokio", "ureq", ] @@ -7405,7 +8474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "901f761681f97db3db836ef9e094acdd8756c40215326c194201941947164ef1" dependencies = [ "once_cell", - "rand 0.8.5", + "rand 0.8.6", "sentry-types 0.31.8", "serde", "serde_json", @@ -7463,7 +8532,7 @@ checksum = "da956cca56e0101998c8688bc65ce1a96f00673a0e58e663664023d4c7911e82" dependencies = [ "debugid", "hex", - "rand 0.8.5", + "rand 0.8.6", "serde", "serde_json", "thiserror 1.0.69", @@ -7480,10 +8549,10 @@ checksum = "04b6c9287202294685cb1f749b944dbbce8160b81a1061ecddc073025fed129f" dependencies = [ "debugid", "hex", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.18", "time", "url", "uuid", @@ -7491,40 +8560,42 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.17" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] -name = "serde_bytes_ng" -version = "0.1.2" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb0ebce8684e2253f964e8b6ce51f0ccc6666bbb448fb4a6788088bda6544b6" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ - "serde", + "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -7534,31 +8605,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "serde_json" -version = "1.0.142" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.14.0", "itoa", "memchr", - "ryu", "serde", + "serde_core", + "zmij", ] [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -7584,34 +8657,24 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.10.0", - "schemars 0.9.0", - "schemars 1.0.4", - "serde", - "serde_derive", - "serde_json", + "serde_core", "serde_with_macros", - "time", ] [[package]] name = "serde_with_macros" -version = "3.14.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ - "darling 0.20.11", + "darling 0.23.0", "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -7630,8 +8693,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", ] [[package]] @@ -7641,8 +8704,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha1" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -7658,8 +8732,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -7673,16 +8758,17 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -7692,7 +8778,7 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -7702,15 +8788,25 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simd_cesu8" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] [[package]] name = "simd_helpers" @@ -7718,7 +8814,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" dependencies = [ - "quote 1.0.40", + "quote 1.0.46", ] [[package]] @@ -7744,41 +8840,41 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slotmap" -version = "1.0.7" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" dependencies = [ "version_check", ] [[package]] name = "sluice" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" +checksum = "160b744a45e8261307bcfe03c98e2f8274502207d534c9a64b675c4db1b6bd58" dependencies = [ - "async-channel 1.9.0", + "async-channel", "futures-core", "futures-io", ] [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "socket2" @@ -7802,12 +8898,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7815,6 +8911,15 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" [[package]] name = "spki" @@ -7847,9 +8952,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "state" @@ -7857,7 +8962,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" dependencies = [ - "loom 0.5.6", + "loom", ] [[package]] @@ -7891,7 +8996,7 @@ dependencies = [ "phf_generator 0.11.3", "phf_shared 0.11.3", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", ] [[package]] @@ -7923,11 +9028,11 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "rustversion", - "syn 2.0.104", + "syn 2.0.118", ] [[package]] @@ -7943,7 +9048,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ "kurbo", - "siphasher 1.0.1", + "siphasher 1.0.3", ] [[package]] @@ -7964,18 +9069,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.104" +version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "unicode-ident", ] @@ -8010,7 +9115,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "syn 1.0.109", "unicode-xid 0.2.6", ] @@ -8022,8 +9127,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -8053,11 +9158,11 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.13.0", "core-foundation 0.9.4", "system-configuration-sys 0.6.0", ] @@ -8082,19 +9187,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml 0.8.23", - "version-compare", -] - [[package]] name = "tagptr" version = "0.2.0" @@ -8114,22 +9206,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] -name = "target-lexicon" -version = "0.12.16" +name = "tcp-stream" +version = "0.34.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "300d0735de48a565461c2ea14cc75b80ee5b6be3b4f5aeabe3553e4c2df8d23d" +dependencies = [ + "async-rs", + "cfg-if", + "futures-io", + "p12-keystore", + "rustls-connector", +] [[package]] name = "tempfile" -version = "3.20.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ - "fastrand 2.3.0", - "getrandom 0.3.3", + "fastrand 2.4.1", + "getrandom 0.4.3", "once_cell", - "rustix 1.0.8", - "windows-sys 0.59.0", + "rustix 1.1.4", + "windows-sys 0.61.2", ] [[package]] @@ -8163,11 +9262,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.18", ] [[package]] @@ -8177,19 +9276,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -8201,45 +9300,53 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "thumbhash" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7726e0245a7331bd0c9a1fb4fd99fd695bcd478ca569f0eda2ff2cb14e7a00" + [[package]] name = "tiff" -version = "0.9.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" dependencies = [ + "fax", "flate2", - "jpeg-decoder", + "half", + "quick-error 2.0.1", "weezl", + "zune-jpeg 0.5.15", ] [[package]] name = "time" -version = "0.3.41" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" dependencies = [ "deranged", - "itoa", "libc", "num-conv", "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" dependencies = [ "num-conv", "time-core", @@ -8265,7 +9372,7 @@ dependencies = [ "bytemuck", "cfg-if", "log", - "png", + "png 0.17.16", "tiny-skia-path", ] @@ -8282,9 +9389,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -8292,9 +9399,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -8307,44 +9414,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" -dependencies = [ - "bytes 0.5.6", - "pin-project-lite 0.1.12", - "slab", -] - -[[package]] -name = "tokio" -version = "1.47.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ - "backtrace", - "bytes 1.10.1", - "io-uring", + "bytes", "libc", "mio", "parking_lot", - "pin-project-lite 0.2.16", + "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.6.4", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] @@ -8354,7 +9447,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", - "tokio 1.47.1", + "tokio", ] [[package]] @@ -8364,7 +9457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ "rustls 0.21.12", - "tokio 1.47.1", + "tokio", ] [[package]] @@ -8375,42 +9468,59 @@ checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ "rustls 0.22.4", "rustls-pki-types", - "tokio 1.47.1", + "tokio", ] [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.31", - "tokio 1.47.1", + "rustls 0.23.41", + "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", - "pin-project-lite 0.2.16", - "tokio 1.47.1", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" +dependencies = [ + "futures-util", + "log", + "rustls 0.23.41", + "rustls-native-certs 0.8.4", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tungstenite 0.29.0", ] [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ - "bytes 1.10.1", + "bytes", "futures-core", "futures-io", "futures-sink", - "pin-project-lite 0.2.16", - "tokio 1.47.1", + "futures-util", + "pin-project-lite", + "tokio", ] [[package]] @@ -8449,7 +9559,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.14.0", "toml_datetime", "winnow 0.5.40", ] @@ -8460,12 +9570,12 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.14.0", "serde", "serde_spanned", "toml_datetime", "toml_write", - "winnow 0.7.12", + "winnow 0.7.15", ] [[package]] @@ -8480,23 +9590,23 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8e43134db17199f7f721803383ac5854edd0d3d523cc34dba321d6acfbe76c3" dependencies = [ - "digest", - "hmac", - "sha1", - "sha2", + "digest 0.10.7", + "hmac 0.12.1", + "sha1 0.10.6", + "sha2 0.10.9", ] [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "pin-project-lite 0.2.16", + "pin-project-lite", "sync_wrapper 1.0.2", - "tokio 1.47.1", + "tokio", "tower-layer", "tower-service", "tracing", @@ -8508,32 +9618,32 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.9.1", - "bytes 1.10.1", - "http 1.3.1", + "bitflags 2.13.0", + "bytes", + "http 1.4.2", "http-body 1.0.1", "http-body-util", - "pin-project-lite 0.2.16", + "pin-project-lite", "tower-layer", "tower-service", ] [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.9.1", - "bytes 1.10.1", + "bitflags 2.13.0", + "bytes", "futures-util", - "http 1.3.1", + "http 1.4.2", "http-body 1.0.1", - "iri-string", - "pin-project-lite 0.2.16", + "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -8550,32 +9660,32 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", - "pin-project-lite 0.2.16", + "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -8604,14 +9714,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -8643,33 +9753,61 @@ checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" dependencies = [ "base64 0.13.1", "byteorder", - "bytes 1.10.1", + "bytes", "http 0.2.12", "httparse", "log", - "rand 0.8.5", - "sha-1", - "thiserror 1.0.69", + "rand 0.8.6", + "sha-1", + "thiserror 1.0.69", + "url", + "utf-8", +] + +[[package]] +name = "tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" +dependencies = [ + "bytes", + "data-encoding", + "http 1.4.2", + "httparse", + "log", + "rand 0.9.4", + "rustls 0.23.41", + "rustls-pki-types", + "sha1 0.10.6", + "thiserror 2.0.18", "url", - "utf-8", ] [[package]] name = "typed-builder" -version = "0.10.0" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "398a3a3c918c96de527dc11e6e846cd549d4508030b8a33e1da12789c856b81a" +dependencies = [ + "typed-builder-macro", +] + +[[package]] +name = "typed-builder-macro" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" +checksum = "0e48cea23f68d1f78eb7bc092881b6bb88d3d6b5b7e6234f6f9c911da1ffb221" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 1.0.109", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "typenum" -version = "1.18.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ubyte" @@ -8686,35 +9824,13 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" -[[package]] -name = "ulid" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e95a59b292ca0cf9b45be2e52294d1ca6cb24eb11b08ef4376f73f1a00c549" -dependencies = [ - "chrono", - "lazy_static", - "rand 0.6.5", -] - -[[package]] -name = "ulid" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "220b18413e1fe5e85a5580b22f44241f82404a66c792c9f3c9eda74c52d9a22e" -dependencies = [ - "chrono", - "rand 0.8.5", - "serde", -] - [[package]] name = "ulid" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", "web-time", ] @@ -8739,9 +9855,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicase_serde" @@ -8773,36 +9889,36 @@ checksum = "260bc6647b3893a9a90668360803a15f96b85a5257b1c3a0c3daf6ae2496de42" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-script" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-vo" @@ -8812,9 +9928,9 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" @@ -8834,7 +9950,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "subtle", ] @@ -8859,14 +9975,15 @@ dependencies = [ [[package]] name = "url" -version = "2.5.4" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", - "idna 1.0.3", + "idna 1.1.0", "percent-encoding", "serde", + "serde_derive", ] [[package]] @@ -8901,7 +10018,7 @@ dependencies = [ "roxmltree", "rustybuzz", "simplecss", - "siphasher 1.0.1", + "siphasher 1.0.3", "strict-num", "svgtypes", "tiny-skia-path", @@ -8929,7 +10046,7 @@ version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.14.0", "serde", "serde_json", "utoipa-gen", @@ -8943,10 +10060,10 @@ checksum = "20c24e8ab68ff9ee746aad22d39b5535601e6416d1b0feeabf78be986a5c4392" dependencies = [ "proc-macro-error", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "regex", - "syn 2.0.104", - "ulid 1.2.1", + "syn 2.0.118", + "ulid", ] [[package]] @@ -8963,13 +10080,13 @@ dependencies = [ [[package]] name = "uuid" -version = "1.17.0" +version = "1.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.4.3", "js-sys", - "serde", + "serde_core", "wasm-bindgen", ] @@ -8984,21 +10101,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "validator" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f07b0a1390e01c0fc35ebb26b28ced33c9a3808f7f9fbe94d3cc01e233bfeed5" -dependencies = [ - "idna 0.2.3", - "lazy_static", - "regex", - "serde", - "serde_derive", - "serde_json", - "url", -] - [[package]] name = "validator" version = "0.16.1" @@ -9025,7 +10127,7 @@ dependencies = [ "lazy_static", "proc-macro-error", "proc-macro2", - "quote 1.0.40", + "quote 1.0.46", "regex", "syn 1.0.109", "validator_types", @@ -9047,12 +10149,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" -[[package]] -name = "value-bag" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" - [[package]] name = "vcpkg" version = "0.2.15" @@ -9077,12 +10173,6 @@ dependencies = [ "time", ] -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - [[package]] name = "version_check" version = "0.9.5" @@ -9101,6 +10191,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -9117,90 +10217,74 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasix" -version = "0.12.21" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fbb4ef9bbca0c1170e0b00dd28abc9e3b68669821600cad1caaed606583c6d" +checksum = "ae86f02046da16a333a9129d31451423e1657737ecdafed4193838a5f54c5cfe" dependencies = [ - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" dependencies = [ - "quote 1.0.40", + "quote 1.0.46", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" dependencies = [ + "bumpalo", "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", - "wasm-bindgen-backend", + "quote 1.0.46", + "syn 2.0.118", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" dependencies = [ "unicode-ident", ] @@ -9215,12 +10299,12 @@ dependencies = [ "base64 0.13.1", "chrono", "ece", - "futures-lite 2.6.1", + "futures-lite", "http 0.2.12", "isahc", "jwt-simple", "log", - "pem 3.0.5", + "pem 3.0.6", "sec1_decode", "serde", "serde_derive", @@ -9229,9 +10313,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" dependencies = [ "js-sys", "wasm-bindgen", @@ -9249,19 +10333,22 @@ dependencies = [ [[package]] name = "webp" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f53152f51fb5af0c08484c33d16cca96175881d1f3dec068c23b31a158c2d99" +checksum = "c071456adef4aca59bf6a583c46b90ff5eb0b4f758fc347cea81290288f37ce1" dependencies = [ "image", "libwebp-sys", ] [[package]] -name = "webpki-roots" -version = "0.25.4" +name = "webpki-root-certs" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "webpki-roots" @@ -9269,23 +10356,23 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.2", + "webpki-roots 1.0.8", ] [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" dependencies = [ "rustls-pki-types", ] [[package]] name = "weezl" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "which" @@ -9301,9 +10388,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] name = "winapi" @@ -9323,11 +10410,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -9345,33 +10432,11 @@ dependencies = [ "windows-targets 0.48.5", ] -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core", - "windows-future", - "windows-link", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core", -] - [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", @@ -9380,60 +10445,39 @@ dependencies = [ "windows-strings", ] -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core", - "windows-link", - "windows-threading", -] - [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-numerics" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core", - "windows-link", -] +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-registry" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ "windows-link", "windows-result", @@ -9442,22 +10486,31 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -9491,7 +10544,31 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -9527,29 +10604,26 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] -name = "windows-threading" -version = "0.1.0" +name = "windows_aarch64_gnullvm" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link", -] +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" @@ -9565,9 +10639,15 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" @@ -9583,9 +10663,15 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" @@ -9601,9 +10687,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -9613,9 +10699,15 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" @@ -9631,9 +10723,15 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" @@ -9649,9 +10747,15 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" @@ -9667,9 +10771,15 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" @@ -9685,9 +10795,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -9700,9 +10810,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] @@ -9718,19 +10828,16 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wyz" @@ -9741,6 +10848,34 @@ dependencies = [ "tap", ] +[[package]] +name = "x509-cert" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" +dependencies = [ + "const-oid 0.9.6", + "der 0.7.10", + "spki 0.7.3", +] + +[[package]] +name = "x509-parser" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom 7.1.3", + "oid-registry", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + [[package]] name = "xmlparser" version = "0.13.6" @@ -9753,6 +10888,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "yaml-rust" version = "0.4.5" @@ -9773,11 +10914,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -9785,13 +10925,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", "synstructure 0.13.2", ] @@ -9808,7 +10948,7 @@ dependencies = [ "http 0.2.12", "hyper 0.14.32", "hyper-rustls 0.24.2", - "itertools", + "itertools 0.12.1", "log", "percent-encoding", "rustls 0.22.4", @@ -9817,63 +10957,77 @@ dependencies = [ "serde", "serde_json", "time", - "tokio 1.47.1", + "tokio", "tower-service", "url", ] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", "synstructure 0.13.2", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote 1.0.46", + "syn 2.0.118", +] [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -9882,9 +11036,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -9893,21 +11047,33 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", - "quote 1.0.40", - "syn 2.0.104", + "quote 1.0.46", + "syn 2.0.118", ] +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + [[package]] name = "zune-core" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -9919,9 +11085,18 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.20" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core 0.4.12", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" dependencies = [ - "zune-core", + "zune-core 0.5.1", ] diff --git a/Cargo.toml b/Cargo.toml index 5c320e633..dcbdb01d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -resolver = "2" +resolver = "3" members = [ "crates/delta", @@ -14,9 +14,192 @@ redis23 = { package = "redis", version = "0.23.3", git = "https://github.com/rev #authifier = { package = "authifier", version = "1.0.10", path = "../authifier/crates/authifier" } #rocket_authifier = { package = "rocket_authifier", version = "1.0.10", path = "../authifier/crates/rocket_authifier" } -# I'm 99% sure this is overloading the GitHub worker -# hence builds have been failing since, let's just -# disable it for now. In the future, we could use this -# if we were rolling our own CI (that is now). [profile.release] lto = true + +[workspace.dependencies] +# Async +async-trait = "0.1.89" +tokio = "1.49.0" +async-channel = "2.3.1" +futures = "0.3.32" +async-tungstenite = "0.17.0" +futures-locks = "0.7.1" +async-lock = "2.8.0" +async-recursion = "1.0.4" +tokio-util = { version = "0.7.18" } + +# Error Handling +anyhow = "1.0.100" +thiserror = "2.0.18" +sentry = "0.31.5" +sentry-anyhow = "0.38.1" + +# Data Validation +regex = "1.12.3" +validator = "0.16" + +# Data Types +uuid = "1.19.0" +ulid = "1.2.1" +nanoid = "0.4.0" +typenum = "1.17.0" +num_enum = "0.6.1" +bitfield = "0.13.2" + +# Time +chrono = "0.4.15" +iso8601-timestamp = "0.2.10" + +# Data Collections +lru = "0.16.3" +indexmap = "2.13.1" +dashmap = "5.2.0" +moka = "0.12.8" +lru_time_cache = "0.11.11" +deadqueue = "0.2.4" + +# Web scraping +scraper = "0.20.0" +encoding_rs = "0.8.34" + +# Mail +lettre = "0.10.0-alpha.4" +handlebars = "4.3.0" + +# HTTP Requests +reqwest = "0.13.2" +isahc = "1.7" + +# Notifications +fcm_v1 = "0.3.0" +web-push = "0.10.0" +revolt_a2 = "0.10" + +# Parsing +logos = "0.15" + +# SVG rendering +usvg = "0.44.0" +resvg = "0.44.0" +tiny-skia = "0.11.4" + +# Logging +log = "0.4.29" +pretty_env_logger = "0.4.0" + +# Redis +redis-kiss = { version = "0.1.4", default-features = false } +fred = "8.0.1" + +# Serialisation +bincode = "1.3.3" +serde_json = "1.0.79" +rmp-serde = "1.0.0" +serde = { version = "1", features = ["derive"] } +strum_macros = "0.26.4" + +# MongoDB +bson = { version = "2.1.0" } +mongodb = { version = "3.1.0" } + +# S3 +aws-config = "1.5.5" +aws-sdk-s3 = "1.46.0" + +# Axum (HTTP server) +axum-macros = "0.4.1" +axum_typed_multipart = "0.12.1" +axum = "0.7.5" +axum-extra = "0.9" +tower-http = "0.5.2" + +# Rocket (HTTP server) +rocket = "0.5.1" +rocket_empty = "0.1.1" +revolt_rocket_okapi = "0.10.0" +rocket_cors = { git = "https://github.com/lawliet89/rocket_cors", rev = "072d90359b23e9b291df6b672c07c93de9c46011" } +rocket_authifier = "1.0.16" +rocket_prometheus = "0.10.0-rc.3" + +# Spec Generation +utoipa = "4.2.3" +revolt_okapi = "0.9.1" +schemars = "0.8.8" +utoipa-scalar = "0.1.0" + +# Image Processing +jxl-oxide = "0.12.5" +sha2 = "0.10.8" +kamadak-exif = "0.5.4" +webp = "0.3.0" +image = "0.25.2" # avif encode requires dav1d system library: features = ["avif-native"] +thumbhash = "0.1.0" +lcms2 = "6.1.1" # for color profile processing + +# File processing +revolt_clamav-client = "0.1.5" +simdutf8 = "0.1.4" + +# Content type processing +infer = "0.16.0" +ffprobe = "0.4.0" +imagesize = "0.13.0" + +# OpenTelemetry +tracing = "0.1.44" +tracing-subscriber = { version = "0.3.22", features = [ + "env-filter", +] } # consider https://crates.io/crates/better-tracing +opentelemetry = { version = "0.31.0", features = ["logs"] } +opentelemetry_sdk = { version = "0.31.0", features = ["logs"] } +opentelemetry-otlp = { version = "0.31.0", features = ["logs"] } +opentelemetry-appender-tracing = "0.31.1" + +# RabbitMQ +lapin = "4.7.1" + +# Voice +livekit-api = "=0.4.23" +livekit-protocol = "=0.7.7" +livekit-runtime = "0.4.0" + +# Other Utilities +once_cell = "1.9.0" +config = "0.13.3" +cached = "0.44.0" +rand = "0.8.5" +base64 = "0.21.3" +decancer = "3.3.3" +linkify = "0.8.1" +url-escape = "0.1.1" +revolt_optional_struct = "0.2.0" +unicode-segmentation = "1.10.1" +querystring = "1.1.0" +tempfile = "3.12.0" +aes-gcm = "0.10.3" +auto_ops = "0.3.0" +url = "2.2.2" +impl_ops = "0.1.1" +lazy_static = "1.5.0" +mime = "0.3.17" +totp-lite = "2.0.0" +rust-argon2 = "1.0.0" +base32 = "0.4.0" +sha1 = "0.10.6" +futures-lite = "2.6.1" + +# Build Dependencies +vergen = "7.5.0" + +# Local packages +revolt-coalesced = { version = "0.13.7", path = "crates/core/coalesced" } +revolt-config = { version = "0.13.7", path = "crates/core/config" } +revolt-database = { version = "0.13.7", path = "crates/core/database" } +revolt-files = { version = "0.13.7", path = "crates/core/files" } +revolt-models = { version = "0.13.7", path = "crates/core/models" } +revolt-parser = { version = "0.13.7", path = "crates/core/parser" } +revolt-permissions = { version = "0.13.7", path = "crates/core/permissions" } +revolt-presence = { version = "0.13.7", path = "crates/core/presence" } +revolt-ratelimits = { version = "0.13.7", path = "crates/core/ratelimits" } +revolt-result = { version = "0.13.7", path = "crates/core/result" } diff --git a/Dockerfile b/Dockerfile index 524e7e0e9..aca233ec6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build Stage -FROM --platform="${BUILDPLATFORM}" rust:1.86.0-slim-bookworm +FROM --platform="${BUILDPLATFORM}" rust:1.92.0-slim-bookworm USER 0:0 WORKDIR /home/rust/src @@ -27,10 +27,14 @@ COPY crates/core/parser/Cargo.toml ./crates/core/parser/ COPY crates/core/permissions/Cargo.toml ./crates/core/permissions/ COPY crates/core/presence/Cargo.toml ./crates/core/presence/ COPY crates/core/result/Cargo.toml ./crates/core/result/ +COPY crates/core/coalesced/Cargo.toml ./crates/core/coalesced/ +COPY crates/core/ratelimits/Cargo.toml ./crates/core/ratelimits/ COPY crates/services/autumn/Cargo.toml ./crates/services/autumn/ COPY crates/services/january/Cargo.toml ./crates/services/january/ +COPY crates/services/gifbox/Cargo.toml ./crates/services/gifbox/ COPY crates/daemons/crond/Cargo.toml ./crates/daemons/crond/ COPY crates/daemons/pushd/Cargo.toml ./crates/daemons/pushd/ +COPY crates/daemons/voice-ingress/Cargo.toml ./crates/daemons/voice-ingress/ RUN sh /tmp/build-image-layer.sh deps # Build all apps diff --git a/Dockerfile.useCurrentArch b/Dockerfile.useCurrentArch index f36c08081..9bcce8ac7 100644 --- a/Dockerfile.useCurrentArch +++ b/Dockerfile.useCurrentArch @@ -1,5 +1,5 @@ # Build Stage -FROM rust:1.86.0-slim-bookworm +FROM rust:1.92.0-slim-bookworm USER 0:0 WORKDIR /home/rust/src @@ -23,10 +23,14 @@ COPY crates/core/parser/Cargo.toml ./crates/core/parser/ COPY crates/core/permissions/Cargo.toml ./crates/core/permissions/ COPY crates/core/presence/Cargo.toml ./crates/core/presence/ COPY crates/core/result/Cargo.toml ./crates/core/result/ +COPY crates/core/coalesced/Cargo.toml ./crates/core/coalesced/ +COPY crates/core/ratelimits/Cargo.toml ./crates/core/ratelimits/ COPY crates/services/autumn/Cargo.toml ./crates/services/autumn/ COPY crates/services/january/Cargo.toml ./crates/services/january/ +COPY crates/services/gifbox/Cargo.toml ./crates/services/gifbox/ COPY crates/daemons/crond/Cargo.toml ./crates/daemons/crond/ COPY crates/daemons/pushd/Cargo.toml ./crates/daemons/pushd/ +COPY crates/daemons/voice-ingress/Cargo.toml ./crates/daemons/voice-ingress/ RUN sh /tmp/build-image-layer.sh deps # Build all apps diff --git a/README.md b/README.md index 3dd25cf5b..e090149e7 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@

- Revolt Backend + Stoat Backend - [![Stars](https://img.shields.io/github/stars/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/stargazers) - [![Forks](https://img.shields.io/github/forks/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/network/members) - [![Pull Requests](https://img.shields.io/github/issues-pr/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/pulls) - [![Issues](https://img.shields.io/github/issues/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/issues) - [![Contributors](https://img.shields.io/github/contributors/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/graphs/contributors) - [![License](https://img.shields.io/github/license/revoltchat/backend?style=flat-square&logoColor=white)](https://github.com/revoltchat/backend/blob/main/LICENSE) + [![Stars](https://img.shields.io/github/stars/stoatchat/stoatchat?style=flat-square&logoColor=white)](https://github.com/stoatchat/stoatchat/stargazers) + [![Forks](https://img.shields.io/github/forks/stoatchat/stoatchat?style=flat-square&logoColor=white)](https://github.com/stoatchat/stoatchat/network/members) + [![Pull Requests](https://img.shields.io/github/issues-pr/stoatchat/stoatchat?style=flat-square&logoColor=white)](https://github.com/stoatchat/stoatchat/pulls) + [![Issues](https://img.shields.io/github/issues/stoatchat/stoatchat?style=flat-square&logoColor=white)](https://github.com/stoatchat/stoatchat/issues) + [![Contributors](https://img.shields.io/github/contributors/stoatchat/stoatchat?style=flat-square&logoColor=white)](https://github.com/stoatchat/stoatchat/graphs/contributors) + [![License](https://img.shields.io/github/license/stoatchat/stoatchat?style=flat-square&logoColor=white)](https://github.com/stoatchat/stoatchat/blob/main/LICENSE)

-The services and libraries that power the Revolt service.
+The services and libraries that power the Stoat service.

| Crate | Path | Description | | @@ -21,9 +21,11 @@ The services and libraries that power the Revolt service.
| `core/permissions` | [crates/core/permissions](crates/core/permissions) | Core: Permission Logic | ![Crates.io Version](https://img.shields.io/crates/v/revolt-permissions) ![Crates.io Version](https://img.shields.io/crates/msrv/revolt-permissions) ![Crates.io Version](https://img.shields.io/crates/size/revolt-permissions) ![Crates.io License](https://img.shields.io/crates/l/revolt-permissions) | | `core/presence` | [crates/core/presence](crates/core/presence) | Core: User Presence | ![Crates.io Version](https://img.shields.io/crates/v/revolt-presence) ![Crates.io Version](https://img.shields.io/crates/msrv/revolt-presence) ![Crates.io Version](https://img.shields.io/crates/size/revolt-presence) ![Crates.io License](https://img.shields.io/crates/l/revolt-presence) | | `core/result` | [crates/core/result](crates/core/result) | Core: Result and Error types | ![Crates.io Version](https://img.shields.io/crates/v/revolt-result) ![Crates.io Version](https://img.shields.io/crates/msrv/revolt-result) ![Crates.io Version](https://img.shields.io/crates/size/revolt-result) ![Crates.io License](https://img.shields.io/crates/l/revolt-result) | +| `core/coalesced` | [crates/core/coalesced](crates/core/coalesced) | Core: Coalescion service | ![Crates.io Version](https://img.shields.io/crates/v/revolt-coalesced) ![Crates.io Version](https://img.shields.io/crates/msrv/revolt-coalesced) ![Crates.io Version](https://img.shields.io/crates/size/revolt-coalesced) ![Crates.io License](https://img.shields.io/crates/l/revolt-coalesced) | | `delta` | [crates/delta](crates/delta) | REST API server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | | `bonfire` | [crates/bonfire](crates/bonfire) | WebSocket events server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | | `services/january` | [crates/services/january](crates/services/january) | Proxy server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | +| `services/gifbox` | [crates/services/gifbox](crates/services/gifbox) | Tenor proxy server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | | `services/autumn` | [crates/services/autumn](crates/services/autumn) | File server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | | `daemons/crond` | [crates/daemons/crond](crates/daemons/crond) | Timed data clean up daemon server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | | `daemons/pushd` | [crates/daemons/pushd](crates/daemons/pushd) | Push notification daemon server | ![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue) | @@ -35,22 +37,19 @@ The services and libraries that power the Revolt service.
Rust 1.86.0 or higher. -> [!CAUTION] -> The events server has a significant performance regression between Rust 1.77.2 and 1.78.0 onwards, see [issue #341](https://github.com/revoltchat/backend/issues/341). This is currently solved by build time options but we are looking for a proper fix. - ## Development Guide -Before contributing, make yourself familiar with [our contribution guidelines](https://developers.revolt.chat/contrib.html) and the [technical documentation for this project](https://revoltchat.github.io/backend/). +Before contributing, make yourself familiar with [our contribution guidelines](https://developers.stoat.chat/developing/contrib/) and the [technical documentation for this project](https://developers.stoat.chat/). Before getting started, you'll want to install: -- Rust toolchain (rustup recommended) +- mise - Docker - Git - mold (optional, faster compilation) > A **default.nix** is available for Nix users! -> Just run `nix-shell` and continue. +> Run `nix-shell` to activate mise. As a heads-up, the development environment uses the following ports: @@ -66,15 +65,25 @@ As a heads-up, the development environment uses the following ports: | `crates/bonfire` | 14703 | | `crates/services/autumn` | 14704 | | `crates/services/january` | 14705 | +| `crates/services/gifbox` | 14706 | Now you can clone and build the project: ```bash -git clone https://github.com/revoltchat/backend revolt-backend -cd revolt-backend -cargo build +git clone https://github.com/stoatchat/stoatchat stoat-backend +cd stoat-backend +mise install +mise build ``` +> [!TIP] +> You can override `BUILDER` in your `.env` file to run cargo with mold if you installed it: +> +> ```bash +> # .env +> BUILDER = "mold --run cargo" +> ``` + A default configuration `Revolt.toml` is present in this project that is suited for development. If you'd like to change anything, create a `Revolt.overrides.toml` file and specify relevant variables. @@ -111,7 +120,7 @@ If you'd like to change anything, create a `Revolt.overrides.toml` file and spec > - "14672:15672" > ``` > -> And corresponding Revolt configuration: +> With the corresponding Revolt configuration: > > ```toml > # Revolt.overrides.toml @@ -123,51 +132,41 @@ If you'd like to change anything, create a `Revolt.overrides.toml` file and spec > [rabbit] > port = 14072 > ``` +> +> And mise configuration +> +> ```bash +> #.env +> DATABASE_PORT = "14017" +> RABBIT_PORT = "14072" +> REDIS_PORT = "14079" +> ``` Then continue: ```bash -# start other necessary services -docker compose up -d +cp livekit.example.yml livekit.yml -# run everything together -./scripts/start.sh -# .. or individually -# run the API server -cargo run --bin revolt-delta -# run the events server -cargo run --bin revolt-bonfire -# run the file server -cargo run --bin revolt-autumn -# run the proxy server -cargo run --bin revolt-january -# run the push daemon (not usually needed in regular development) -cargo run --bin revolt-pushd - -# hint: -# mold -run -# mold -run ./scripts/start.sh +mise start ``` -You can start a web client by doing the following: +You can start a web client by doing the following in another terminal: ```bash # if you do not have yarn yet and have a modern Node.js: corepack enable # clone the web client and run it: -git clone --recursive https://github.com/revoltchat/revite -cd revite -yarn -yarn build:deps -echo "VITE_API_URL=http://local.revolt.chat:14702" > .env.local -yarn dev --port 14701 +git clone --recursive https://github.com/stoatchat/for-web stoat-web +cd stoat-web +# refer to stoat-web/README.md for startup, creating an account and loging in ``` -Then go to http://local.revolt.chat:14701 to create an account/login. - When signing up, go to http://localhost:14080 to find confirmation/password reset emails. +To stop all services, hit (CTRL + c) in the terminal you ran `mise start` and run `mise docker:stop` + + ## Deployment Guide ### Cutting new crate releases @@ -196,14 +195,14 @@ Tag and push a new release by running: just release ``` -If you have bumped the crate versions, proceed to [GitHub releases](https://github.com/revoltchat/backend/releases/new) to create a changelog. +If you have bumped the crate versions, proceed to [GitHub releases](https://github.com/stoatchat/stoatchat/releases/new) to create a changelog. ## Testing First, start the required services: ```sh -docker compose -f docker-compose.db.yml up -d +docker compose up -d ``` Now run tests for whichever database: @@ -215,6 +214,6 @@ TEST_DB=MONGODB cargo nextest run ## License -The Revolt backend is generally licensed under the [GNU Affero General Public License v3.0](https://github.com/revoltchat/backend/blob/master/LICENSE). +The Stoat backend is generally licensed under the [GNU Affero General Public License v3.0](https://github.com/stoatchat/stoatchat/blob/main/LICENSE). **Individual crates may supply their own licenses!** diff --git a/Revolt.toml b/Revolt.toml index 33e044348..7398ed53a 100644 --- a/Revolt.toml +++ b/Revolt.toml @@ -15,7 +15,7 @@ host = "127.0.0.1" [hosts] # Web locations of various services # Defaults assume all services are reverse-proxied -# See https://github.com/revoltchat/self-hosted/blob/master/Caddyfile +# See https://github.com/stoatchat/self-hosted/blob/main/Caddyfile # # Remember to change these to https/wss where appropriate in production! app = "http://local.revolt.chat:14701" @@ -26,6 +26,11 @@ january = "http://local.revolt.chat:14705" voso_legacy = "" voso_legacy_ws = "" +# Public urls for livekit nodes +# each entry here should have a corresponding entry under `api.livekit.nodes` +[hosts.livekit] +worldwide = "ws://local.revolt.chat:14706" + [api] [api.smtp] @@ -40,6 +45,18 @@ port = 14025 use_tls = false use_starttls = false +[api.livekit] + +# Config for livekit nodes +# Make sure to change the secret when deploying +# The key and secret should match the values livekit is using +[api.livekit.nodes.worldwide] +url = "http://livekit" +lat = 0.0 +lon = 0.0 +key = "worldwide" +secret = "ZjCofRlfm6GGtjlifmNpCDkcQbEIIVC0" + [files.s3] # S3 protocol endpoint endpoint = "http://127.0.0.1:14009" diff --git a/STYLE_GUIDE.md b/STYLE_GUIDE.md deleted file mode 100644 index 7999b388a..000000000 --- a/STYLE_GUIDE.md +++ /dev/null @@ -1,73 +0,0 @@ -# Code Style Guide - -Beyond using Cargo format and Clippy, there are some specific code style guidelines laid out in this document for different parts of the project. - -## Writing Style - -- Shorten "identifier" to "Id" with that exact casing, i.e. Server Id. - -## `core/database` crate - -w.r.t. `model.rs` files - -- All struct definitions must be commented. - ```rust - /// Server - pub struct Server { - /// Name of the server - pub name: String, - ``` -- Struct definitions should not include derives unless necessary (if additional traits such as Hash are required) and instead use `auto_derived!` and `auto_derived_partial!`. - ```rust - auto_derived_partial!( - /// Server - pub struct Server { .. }, - "PartialServer" - ); - ``` -- `auto_derived!` macro accepts multiple entries and should be used as such: - - ```rust - auto_derived!( - /// Optional fields on server object - pub enum FieldsServer { .. } - - /// Optional fields on server object - pub enum FieldsRole { .. } - ); - ``` - -- If special serialisation conditions are required, such as checking if a boolean is false, use the existing definitions for these functions from the crate root: - ```rust - #[serde(skip_serializing_if = "crate::if_false", default)] - ``` -- `impl` blocks may be defined below the struct definitions and should be ordered in the same order of definition. Methods in the block must follow the same guidelines as traits where-in: methods are ordered in terms of CRUD, there are empty line breaks, and methods are commented. - -w.r.t. `ops` module for models - -- All traits must use a the name format `AbstractPlural` where Plural is the plural form of the collection. e.g. Servers -- Traits defined must follow these guidelines: - - - Methods are ordered in terms of CRUD, create-read-update-delete ordering. - - ```rust - #[async_trait] - pub trait AbstractServerMembers: Sync + Send { - /// Insert a new server member into the database - async fn insert_member(&self, member: &Member) -> Result<()>; - - /// Fetch a server member by their id - async fn fetch_member(&self, server_id: &str, user_id: &str) -> Result; - - /// Update information for a server member - async fn update_member(&self, .. ) -> Result<()>; - - /// Delete a server member by their id - async fn delete_member(&self, id: &MemberCompositeKey) -> Result<()>; - } - ``` - - - There should be an empty line break between each method declaration. - - All methods must have an appropriate comment. - -- When implementing the trait defined in `ops.rs` with each driver, the method declaration style should be the same for ease of searching: same ordering, same comments, same line breaks. diff --git a/compose.yml b/compose.yml index 89b295940..b7e73689d 100644 --- a/compose.yml +++ b/compose.yml @@ -8,18 +8,33 @@ services: # MongoDB database: image: mongo + command: mongod --replSet rs0 ports: - "27017:27017" volumes: - ./.data/db:/data/db + extra_hosts: + - "host.docker.internal:host-gateway" + healthcheck: + test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'127.0.0.1:27017'}]}) }" | mongosh --port 27017 --quiet + interval: 5s + timeout: 30s + start_period: 0s + start_interval: 1s + retries: 30 + ulimits: + nofile: + soft: 65536 + hard: 65536 # MinIO minio: - image: minio/minio - command: server /data + image: firstfinger/minio:latest + #command: server /data environment: MINIO_ROOT_USER: minioautumn MINIO_ROOT_PASSWORD: minioautumn + MINIO_REGION: minio volumes: - ./.data/minio:/data ports: @@ -40,7 +55,7 @@ services: # Rabbit rabbit: - image: rabbitmq:3-management + image: rabbitmq:4-management environment: RABBITMQ_DEFAULT_USER: rabbituser RABBITMQ_DEFAULT_PASS: rabbitpass @@ -55,7 +70,7 @@ services: # Mock SMTP server maildev: - image: soulteary/maildev + image: maildev/maildev ports: - "14025:25" - "14080:8080" @@ -64,3 +79,10 @@ services: MAILDEV_WEB_PORT: 8080 MAILDEV_INCOMING_USER: smtp MAILDEV_INCOMING_PASS: smtp + + livekit: + image: ghcr.io/stoatchat/livekit-server:v1.9.13 + command: --config /etc/livekit.yml + network_mode: "host" + volumes: + - ./livekit.yml:/etc/livekit.yml diff --git a/crates/bonfire/Cargo.toml b/crates/bonfire/Cargo.toml index e447825d4..91dc90c29 100644 --- a/crates/bonfire/Cargo.toml +++ b/crates/bonfire/Cargo.toml @@ -1,48 +1,46 @@ [package] name = "revolt-bonfire" -version = "0.8.8" +version = "0.13.7" license = "AGPL-3.0-or-later" edition = "2021" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] # util -log = "*" -sentry = "0.31.5" -lru = "0.7.6" -ulid = "0.5.0" -once_cell = "1.9.0" -redis-kiss = "0.1.4" -lru_time_cache = "0.11.11" -async-channel = "2.3.1" +log = { workspace = true } +sentry = { workspace = true } +lru = { workspace = true } +ulid = { workspace = true } +once_cell = { workspace = true } +redis-kiss = { workspace = true, default-features = false, features = ["tokio-runtime"] } +lru_time_cache = { workspace = true } +async-channel = { workspace = true } # parsing -querystring = "1.1.0" +querystring = { workspace = true } +regex = { workspace = true } # serde -bincode = "1.3.3" -serde_json = "1.0.79" -rmp-serde = "1.0.0" -serde = "1.0.136" +bincode = { workspace = true } +serde_json = { workspace = true } +rmp-serde = { workspace = true } +serde = { workspace = true } # async -futures = "0.3.21" -async-tungstenite = { version = "0.17.0", features = ["async-std-runtime"] } -async-std = { version = "1.8.0", features = [ - "tokio1", - "tokio02", - "attributes", -] } +futures = { workspace = true } +async-tungstenite = { workspace = true, features = ["tokio-runtime"] } +tokio = { workspace = true } +tokio-util = { workspace = true, features = ["compat"] } # core -authifier = { version = "1.0.15" } -revolt-result = { path = "../core/result" } -revolt-models = { path = "../core/models" } -revolt-config = { path = "../core/config" } -revolt-database = { path = "../core/database" } -revolt-permissions = { version = "0.8.8", path = "../core/permissions" } -revolt-presence = { path = "../core/presence", features = ["redis-is-patched"] } +revolt-result = { workspace = true } +revolt-models = { workspace = true } +revolt-config = { workspace = true } +revolt-database = { workspace = true, features = ["voice"] } +revolt-permissions = { workspace = true } +revolt-presence = { workspace = true, features = ["redis-is-patched"] } # redis -fred = { version = "8.0.1", features = ["subscriber-client"] } +fred = { workspace = true, features = ["subscriber-client"] } diff --git a/crates/bonfire/Dockerfile b/crates/bonfire/Dockerfile index d1829137b..9a608d930 100644 --- a/crates/bonfire/Dockerfile +++ b/crates/bonfire/Dockerfile @@ -1,5 +1,5 @@ # Build Stage -FROM ghcr.io/revoltchat/base:latest AS builder +FROM ghcr.io/stoatchat/base:latest AS builder FROM debian:12 AS debian # Bundle Stage diff --git a/crates/bonfire/src/config.rs b/crates/bonfire/src/config.rs index 5642d3baa..d70a63205 100644 --- a/crates/bonfire/src/config.rs +++ b/crates/bonfire/src/config.rs @@ -1,9 +1,15 @@ use async_tungstenite::tungstenite::{handshake, Message}; use futures::channel::oneshot::Sender; +use once_cell::sync::Lazy; +use regex::Regex; use revolt_database::events::client::ReadyPayloadFields; use revolt_result::{create_error, Result}; use serde::{Deserialize, Serialize}; +/// matches either a single word ie "users" or a key and value ie "settings[notifications]" +static READY_PAYLOAD_FIELD_REGEX: Lazy = + Lazy::new(|| Regex::new(r#"^(\w+)(?:\[(\S+)\])?$"#).unwrap()); + /// Enumeration of supported protocol formats #[derive(Debug)] pub enum ProtocolFormat { @@ -17,6 +23,7 @@ pub struct ProtocolConfiguration { protocol_version: i32, format: ProtocolFormat, session_token: Option, + ready_payload_fields: ReadyPayloadFields, } impl ProtocolConfiguration { @@ -25,11 +32,13 @@ impl ProtocolConfiguration { protocol_version: i32, format: ProtocolFormat, session_token: Option, + ready_payload_fields: ReadyPayloadFields, ) -> Self { Self { protocol_version, format, session_token, + ready_payload_fields, } } @@ -86,14 +95,8 @@ impl ProtocolConfiguration { } /// Get ready payload fields - pub fn get_ready_payload_fields(&self) -> Vec { - vec![ - ReadyPayloadFields::Users, - ReadyPayloadFields::Servers, - ReadyPayloadFields::Channels, - ReadyPayloadFields::Members, - ReadyPayloadFields::Emoji, - ] + pub fn get_ready_payload_fields(&self) -> &ReadyPayloadFields { + &self.ready_payload_fields } } @@ -124,6 +127,23 @@ impl handshake::server::Callback for WebsocketHandshakeCallback { let mut protocol_version = 1; let mut format = ProtocolFormat::Json; let mut session_token = None; + let mut ready_payload_fields = if params.iter().any(|(k, _)| *k == "ready") { + // If they pass the ready field, set all fields to false + + ReadyPayloadFields { + users: false, + servers: false, + channels: false, + members: false, + emojis: false, + voice_states: false, + user_settings: Vec::new(), + channel_unreads: false, + policy_changes: false, + } + } else { + ReadyPayloadFields::default() + }; // Parse and map parameters from key-value to known variables. for (key, value) in params { @@ -139,6 +159,31 @@ impl handshake::server::Callback for WebsocketHandshakeCallback { _ => {} }, "token" => session_token = Some(value.into()), + "ready" => { + // Re-enable all the fields the client specifies + if let Some(captures) = READY_PAYLOAD_FIELD_REGEX.captures(value) { + if let Some(field) = captures.get(0) { + match field.as_str() { + "users" => ready_payload_fields.users = true, + "servers" => ready_payload_fields.servers = true, + "channels" => ready_payload_fields.channels = true, + "members" => ready_payload_fields.members = true, + "emojis" => ready_payload_fields.emojis = true, + "voice_states" => ready_payload_fields.voice_states = true, + "channel_unreads" => ready_payload_fields.channel_unreads = true, + "user_settings" => { + if let Some(subkey) = captures.get(1) { + ready_payload_fields + .user_settings + .push(subkey.as_str().to_string()); + } + } + "policy_changes" => ready_payload_fields.policy_changes = true, + _ => {} + } + } + } + } _ => {} } } @@ -151,6 +196,7 @@ impl handshake::server::Callback for WebsocketHandshakeCallback { protocol_version, format, session_token, + ready_payload_fields, }) .is_ok() { diff --git a/crates/bonfire/src/events/impl.rs b/crates/bonfire/src/events/impl.rs index 160e7c6c0..96a0f2ab0 100644 --- a/crates/bonfire/src/events/impl.rs +++ b/crates/bonfire/src/events/impl.rs @@ -1,9 +1,11 @@ -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use futures::future::join_all; +use redis_kiss::AsyncCommands; use revolt_database::{ events::client::{EventV1, ReadyPayloadFields}, util::permissions::DatabasePermissionQuery, + voice::{get_channel_voice_state, UserVoiceChannel}, Channel, Database, Member, MemberCompositeKey, Presence, RelationshipStatus, }; use revolt_models::v0; @@ -17,8 +19,9 @@ use super::state::{Cache, State}; impl Cache { /// Check whether the current user can view a channel pub async fn can_view_channel(&self, db: &Database, channel: &Channel) -> bool { + #[allow(deprecated)] match &channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { + Channel::TextChannel { server, .. } => { let member = self.members.get(server); let server = self.servers.get(server); let mut query = @@ -95,21 +98,23 @@ impl State { pub async fn generate_ready_payload( &mut self, db: &Database, - fields: Vec, + fields: &ReadyPayloadFields, ) -> Result { let user = self.clone_user(); self.cache.is_bot = user.bot.is_some(); // Fetch pending policy changes. - let policy_changes = if user.bot.is_some() { - vec![] + let policy_changes = if user.bot.is_some() || !fields.policy_changes { + None } else { - db.fetch_policy_changes() - .await? - .into_iter() - .filter(|policy| policy.created_time > user.last_acknowledged_policy_change) - .map(Into::into) - .collect() + Some( + db.fetch_policy_changes() + .await? + .into_iter() + .filter(|policy| policy.created_time > user.last_acknowledged_policy_change) + .map(Into::into) + .collect(), + ) }; // Find all relationships to the user. @@ -120,12 +125,7 @@ impl State { .unwrap_or_default(); // Fetch all memberships with their corresponding servers. - let members: Vec = db.fetch_all_memberships(&user.id).await?; - self.cache.members = members - .iter() - .cloned() - .map(|x| (x.id.server.clone(), x)) - .collect(); + let mut members: Vec = db.fetch_all_memberships(&user.id).await?; let server_ids: Vec = members.iter().map(|x| x.id.server.clone()).collect(); let servers = db.fetch_servers(&server_ids).await?; @@ -154,6 +154,55 @@ impl State { } } + let voice_states = if fields.voice_states { + let mut voice_state_server_members: HashMap> = HashMap::new(); + + // fetch voice states for all the channels we can see + let mut voice_states = Vec::new(); + + for channel in channels.iter().filter(|c| { + matches!( + c, + Channel::DirectMessage { .. } + | Channel::Group { .. } + | Channel::TextChannel { voice: Some(_), .. } + ) + }) { + if let Ok(Some(voice_state)) = + get_channel_voice_state(&UserVoiceChannel::from_channel(channel)).await + { + if let Some(server) = channel.server() { + let set = voice_state_server_members + .entry(server.to_string()) + .or_default(); + + for participant in &voice_state.participants { + user_ids.insert(participant.id.clone()); + set.insert(participant.id.clone()); + } + } else { + for participant in &voice_state.participants { + user_ids.insert(participant.id.clone()); + } + } + + voice_states.push(voice_state); + } + } + + // Fetch all the members for for the participants who are in a server + for (server, user_ids) in voice_state_server_members { + let user_ids = user_ids.into_iter().collect::>(); + let voice_members = db.fetch_members(&server, &user_ids).await?; + + members.extend(voice_members); + } + + Some(voice_states) + } else { + None + }; + // Fetch presence data for known users. let online_ids = filter_online(&user_ids.iter().cloned().collect::>()).await; @@ -167,8 +216,14 @@ impl State { ) .await?; + self.cache.members = members + .iter() + .cloned() + .map(|x| (x.id.server.clone(), x)) + .collect(); + // Fetch customisations. - let emojis = if fields.contains(&ReadyPayloadFields::Emoji) { + let emojis = if fields.emojis { Some( db.fetch_emoji_by_parent_ids( &servers @@ -176,25 +231,34 @@ impl State { .map(|x| x.id.to_string()) .collect::>(), ) - .await?, + .await? + .into_iter() + .map(|emoji| emoji.into()) + .collect(), ) } else { None }; // Fetch user settings - let user_settings = if let Some(ReadyPayloadFields::UserSettings(keys)) = fields - .iter() - .find(|e| matches!(e, ReadyPayloadFields::UserSettings(_))) - { - Some(db.fetch_user_settings(&user.id, keys).await?) + let user_settings = if !fields.user_settings.is_empty() { + Some( + db.fetch_user_settings(&user.id, &fields.user_settings) + .await?, + ) } else { None }; // Fetch channel unreads - let channel_unreads = if fields.contains(&ReadyPayloadFields::ChannelUnreads) { - Some(db.fetch_unreads(&user.id).await?) + let channel_unreads = if fields.channel_unreads { + Some( + db.fetch_unreads(&user.id) + .await? + .into_iter() + .map(|unread| unread.into()) + .collect(), + ) } else { None }; @@ -241,30 +305,27 @@ impl State { } Ok(EventV1::Ready { - users: if fields.contains(&ReadyPayloadFields::Users) { - Some(users) - } else { - None - }, - servers: if fields.contains(&ReadyPayloadFields::Servers) { + users: if fields.users { Some(users) } else { None }, + servers: if fields.servers { Some(servers.into_iter().map(Into::into).collect()) } else { None }, - channels: if fields.contains(&ReadyPayloadFields::Channels) { + channels: if fields.channels { Some(channels.into_iter().map(Into::into).collect()) } else { None }, - members: if fields.contains(&ReadyPayloadFields::Members) { + members: if fields.members { Some(members.into_iter().map(Into::into).collect()) } else { None }, - emojis: emojis.map(|vec| vec.into_iter().map(Into::into).collect()), + voice_states, + emojis, user_settings, - channel_unreads: channel_unreads.map(|vec| vec.into_iter().map(Into::into).collect()), + channel_unreads, policy_changes, }) @@ -279,19 +340,14 @@ impl State { let id = &id.to_string(); for (channel_id, channel) in &self.cache.channels { - match channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { - if server == id { - channel_ids.insert(channel_id.clone()); - - if self.cache.can_view_channel(db, channel).await { - added_channels.push(channel_id.clone()); - } else { - removed_channels.push(channel_id.clone()); - } - } + if channel.server() == Some(id) { + channel_ids.insert(channel_id.clone()); + + if self.cache.can_view_channel(db, channel).await { + added_channels.push(channel_id.clone()); + } else { + removed_channels.push(channel_id.clone()); } - _ => {} } } @@ -346,6 +402,11 @@ impl State { /// Push presence change to the user and all associated server topics pub async fn broadcast_presence_change(&self, target: bool) { + let config = revolt_config::config().await; + if config.disable_events_dont_use { + return; + } + if if let Some(status) = &self.cache.users.get(&self.cache.user_id).unwrap().status { status.presence != Some(Presence::Invisible) } else { @@ -459,6 +520,7 @@ impl State { server, channels, emojis: _, + voice_states: _, } => { self.insert_subscription(id.clone()).await; diff --git a/crates/bonfire/src/events/state.rs b/crates/bonfire/src/events/state.rs index eae398019..09bef49eb 100644 --- a/crates/bonfire/src/events/state.rs +++ b/crates/bonfire/src/events/state.rs @@ -1,10 +1,8 @@ use std::{ - collections::{HashMap, HashSet}, - sync::Arc, - time::Duration, + collections::{HashMap, HashSet}, num::NonZeroUsize, sync::Arc, time::Duration }; -use async_std::sync::{Mutex, RwLock}; +use tokio::sync::{Mutex, RwLock}; use lru::LruCache; use lru_time_cache::{LruCache as LruTimeCache, TimedEntry}; use revolt_database::{Channel, Member, Server, User}; @@ -57,7 +55,7 @@ impl Default for Cache { members: Default::default(), servers: Default::default(), - seen_events: LruCache::new(20), + seen_events: LruCache::new(NonZeroUsize::new(20).unwrap()), } } } diff --git a/crates/bonfire/src/main.rs b/crates/bonfire/src/main.rs index f4e8a3870..e592a7a33 100644 --- a/crates/bonfire/src/main.rs +++ b/crates/bonfire/src/main.rs @@ -1,6 +1,6 @@ use std::env; -use async_std::net::TcpListener; +use tokio::net::TcpListener; use revolt_presence::clear_region; #[macro_use] @@ -12,7 +12,7 @@ pub mod events; mod database; mod websocket; -#[async_std::main] +#[tokio::main] async fn main() { // Configure requirements for Bonfire. revolt_config::configure!(events); @@ -33,7 +33,7 @@ async fn main() { // Start accepting new connections and spawn a client for each connection. while let Ok((stream, addr)) = listener.accept().await { - async_std::task::spawn(async move { + tokio::task::spawn(async move { info!("User connected from {addr:?}"); websocket::client(database::get_db(), stream, addr).await; info!("User disconnected from {addr:?}"); diff --git a/crates/bonfire/src/websocket.rs b/crates/bonfire/src/websocket.rs index 913245e9c..172cf74a0 100644 --- a/crates/bonfire/src/websocket.rs +++ b/crates/bonfire/src/websocket.rs @@ -1,11 +1,10 @@ use std::{collections::HashSet, net::SocketAddr, sync::Arc}; use async_tungstenite::WebSocketStream; -use authifier::AuthifierEvent; use fred::{ error::RedisErrorKind, interfaces::{ClientLike, EventInterface, PubsubInterface}, - types::RedisConfig, + types::{ReconnectPolicy, RedisConfig}, }; use futures::{ channel::oneshot, @@ -13,7 +12,7 @@ use futures::{ stream::{SplitSink, SplitStream}, FutureExt, SinkExt, StreamExt, TryStreamExt, }; -use redis_kiss::{PayloadType, REDIS_PAYLOAD_TYPE, REDIS_URI}; +use redis_kiss::{get_connection, AsyncCommands, PayloadType, REDIS_PAYLOAD_TYPE, REDIS_URI}; use revolt_config::report_internal_error; use revolt_database::{ events::{client::EventV1, server::ClientMessage}, @@ -22,19 +21,21 @@ use revolt_database::{ }; use revolt_presence::{create_session, delete_session}; -use async_std::{ +use tokio::{ net::TcpStream, sync::{Mutex, RwLock}, task::spawn, }; +use tokio_util::compat::{TokioAsyncReadCompatExt, Compat}; use revolt_result::create_error; use sentry::Level; use crate::config::{ProtocolConfiguration, WebsocketHandshakeCallback}; use crate::events::state::{State, SubscriptionStateChange}; +use revolt_models::v0; -type WsReader = SplitStream>; -type WsWriter = SplitSink, async_tungstenite::tungstenite::Message>; +type WsReader = SplitStream>>; +type WsWriter = SplitSink>, async_tungstenite::tungstenite::Message>; /// Start a new WebSocket client worker given access to the database, /// the relevant TCP stream and the remote address of the client. @@ -44,7 +45,7 @@ pub async fn client(db: &'static Database, stream: TcpStream, addr: SocketAddr) // e.g. wss://example.com?format=json&version=1 let (sender, receiver) = oneshot::channel(); let Ok(ws) = async_tungstenite::accept_hdr_async_with_config( - stream, + stream.compat(), WebsocketHandshakeCallback::from(sender), None, ) @@ -128,6 +129,14 @@ pub async fn client(db: &'static Database, stream: TcpStream, addr: SocketAddr) return; } + let slowmodes = fetch_user_slowmodes(&user_id).await.unwrap_or_default(); + if !slowmodes.is_empty() { + let event = EventV1::UserSlowmodes { slowmodes }; + if report_internal_error!(write.send(config.encode(&event)).await).is_err() { + return; + } + } + // Create presence session. let (first_session, session_id) = create_session(&user_id, 0).await; @@ -218,10 +227,16 @@ async fn listener( kill_signal_r: async_channel::Receiver<()>, write: &Mutex, ) { - let redis_config = RedisConfig::from_url(&REDIS_URI).unwrap(); - let subscriber = match report_internal_error!( - fred::types::Builder::from_config(redis_config).build_subscriber_client() - ) { + let stoat_config = revolt_config::config().await; + let url = stoat_config + .database + .redis_pubsub + .unwrap_or(REDIS_URI.to_string()); + + let redis_config = RedisConfig::from_url(&url).unwrap(); + let mut builder = fred::types::Builder::from_config(redis_config); + builder.set_policy(ReconnectPolicy::new_exponential(8, 100, 30_000, 2)); + let subscriber = match report_internal_error!(builder.build_subscriber_client()) { Ok(subscriber) => subscriber, Err(_) => return, }; @@ -230,16 +245,21 @@ async fn listener( return; } + // Let Fred automatically re-subscribe to tracked channels on reconnect. + subscriber.manage_subscriptions(); + // Handle Redis connection dropping let (clean_up_s, clean_up_r) = async_channel::bounded(1); let clean_up_s = Arc::new(Mutex::new(clean_up_s)); subscriber.on_error(move |err| { + warn!("Redis subscriber error: {:?}", err); if let RedisErrorKind::Canceled = err.kind() { let clean_up_s = clean_up_s.clone(); spawn(async move { clean_up_s.lock().await.send(()).await.ok(); }); } + // Transient errors (IO, timeout) are handled by the reconnect policy. Ok(()) }); @@ -335,22 +355,20 @@ async fn listener( break 'out; }; - if let EventV1::Auth(auth) = &event { - if let AuthifierEvent::DeleteSession { session_id, .. } = auth { - if &state.session_id == session_id { - event = EventV1::Logout; - } - } else if let AuthifierEvent::DeleteAllSessions { - exclude_session_id, .. - } = auth - { - if let Some(excluded) = exclude_session_id { - if &state.session_id != excluded { - event = EventV1::Logout; - } - } else { + if let EventV1::DeleteSession { session_id, .. } = &event { + if &state.session_id == session_id { + event = EventV1::Logout; + } + } else if let EventV1::DeleteAllSessions { + exclude_session_id, .. + } = &event + { + if let Some(excluded) = exclude_session_id { + if &state.session_id != excluded { event = EventV1::Logout; } + } else { + event = EventV1::Logout; } } else { let should_send = state.handle_incoming_event_v1(db, &mut event).await; @@ -422,6 +440,8 @@ async fn worker( mut read: WsReader, write: &Mutex, ) { + let revolt_config = revolt_config::config().await; + loop { let t1 = read.try_next().fuse(); let t2 = kill_signal_r.recv().fuse(); @@ -458,6 +478,10 @@ async fn worker( match payload { ClientMessage::BeginTyping { channel } => { + if revolt_config.disable_events_dont_use { + continue; + } + if !subscribed.read().await.contains(&channel) { continue; } @@ -470,6 +494,10 @@ async fn worker( .await; } ClientMessage::EndTyping { channel } => { + if revolt_config.disable_events_dont_use { + continue; + } + if !subscribed.read().await.contains(&channel) { continue; } @@ -507,3 +535,42 @@ async fn worker( } } } + +async fn fetch_user_slowmodes(user_id: &str) -> Option> { + let mut conn = get_connection().await.ok()?.into_inner(); + let idx_key = format!("slowmode_idx:{}", user_id); + + let channel_ids: Vec = conn.smembers(&idx_key).await.unwrap_or_default(); + if channel_ids.is_empty() { + return Some(vec![]); + } + + // Bulk fetch all TTLs in one round trip + let mut pipe = redis_kiss::redis::pipe(); + for channel_id in &channel_ids { + pipe.ttl(format!("slowmode:{}:{}", user_id, channel_id)); + } + let ttls: Vec = pipe.query_async(&mut conn).await.unwrap_or_default(); + + // Partition into alive/expired in one pass + let mut slowmodes = vec![]; + let mut expired = vec![]; + for (channel_id, ttl) in channel_ids.iter().zip(ttls.iter()) { + if *ttl > 0 { + slowmodes.push(v0::ChannelSlowmode { + channel_id: channel_id.clone(), + duration: *ttl as u64, + retry_after: *ttl as u64, + }); + } else { + expired.push(channel_id.as_str()); + } + } + + // Bulk remove all expired members in one SREM call + if !expired.is_empty() { + conn.srem::<_, _, ()>(&idx_key, expired).await.ok(); + } + + Some(slowmodes) +} diff --git a/crates/core/coalesced/Cargo.toml b/crates/core/coalesced/Cargo.toml new file mode 100644 index 000000000..1c8102adb --- /dev/null +++ b/crates/core/coalesced/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "revolt-coalesced" +version = "0.13.7" +edition = "2021" +license = "MIT" +authors = ["Paul Makles ", "Zomatree "] +description = "Revolt Backend: Coalescion service" +repository = "https://github.com/stoatchat/stoatchat" + +[features] +tokio = ["dep:tokio"] +queue = ["dep:indexmap"] +cache = ["dep:lru"] + +default = ["tokio"] + +[dependencies] +tokio = { workspace = true, features = ["sync"], optional = true } +indexmap = { workspace = true, optional = true } +lru = { workspace = true, optional = true } + +[dev-dependencies] +tokio = { workspace = true, features = [ + "rt", + "rt-multi-thread", + "macros", + "time", +] } diff --git a/crates/core/coalesced/LICENSE b/crates/core/coalesced/LICENSE new file mode 100644 index 000000000..7c2815b9f --- /dev/null +++ b/crates/core/coalesced/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2024 Pawel Makles + +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/crates/core/coalesced/src/config.rs b/crates/core/coalesced/src/config.rs new file mode 100644 index 000000000..23da16989 --- /dev/null +++ b/crates/core/coalesced/src/config.rs @@ -0,0 +1,24 @@ +#[derive(Clone, PartialEq, Eq, Debug)] +/// Config values for [`CoalescionService`]. +pub struct CoalescionServiceConfig { + /// How many tasks are running at once + pub max_concurrent: Option, + /// Whether to queue tasks once `max_concurrent` is reached + #[cfg(feature = "queue")] + pub queue_requests: bool, + /// Max amount of tasks in the buffer queue + #[cfg(feature = "queue")] + pub max_queue: Option, +} + +impl Default for CoalescionServiceConfig { + fn default() -> Self { + Self { + max_concurrent: Some(100), + #[cfg(feature = "queue")] + queue_requests: true, + #[cfg(feature = "queue")] + max_queue: Some(100) + } + } +} diff --git a/crates/core/coalesced/src/error.rs b/crates/core/coalesced/src/error.rs new file mode 100644 index 000000000..6be897858 --- /dev/null +++ b/crates/core/coalesced/src/error.rs @@ -0,0 +1,27 @@ +use std::fmt; + +#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] +/// Coalescion service error. +pub enum Error { + /// Failed to receive the actions return from the channel for unknown reason + RecvError, + /// Reached the `max_concurrent` amount of actions running at once and could not queue the action + MaxConcurrent, + /// Reached the `max_queue` amount of actions in the queue + MaxQueue, + /// Failed to downcast the type to the current type being returned, this will be most likely an ID collision + DowncastError, +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Error::RecvError => write!(f, "Unable to receive data from the channel"), + Error::MaxConcurrent => write!(f, "Max number of tasks running at once"), + Error::MaxQueue => write!(f, "Max number of tasks in queue"), + Error::DowncastError => write!(f, "Failed to downcast type, possible key collision with different types") + } + } +} + +impl std::error::Error for Error {} diff --git a/crates/core/coalesced/src/lib.rs b/crates/core/coalesced/src/lib.rs new file mode 100644 index 000000000..89839e23a --- /dev/null +++ b/crates/core/coalesced/src/lib.rs @@ -0,0 +1,39 @@ +//! # Coalesced +//! +//! Coalescion service to group, caching and queue duplicate actions. +//! useful for deduplicating web requests, database lookups and other similar resource +//! intensive or rate-limited actions. +//! +//! ## Features +//! - `tokio`: Uses tokio for the async backend, this is currently the only backend. +//! - `queue`: Whether to support queueing requests to only allow X amount of actions running at once. +//! - `cache`: Whether to cache the actions results for future actions with the same id, uses an LRU cache internally. +//! +//! [`CoalescionService`] uses both [`Arc`] and [`RwLock`] internally and can be cheaply cloned to +//! use in your codebase. +//! +//! It is common practice to wrap the service and in your own which delegates the executions to ensure all ids are tracked in one location across your codebase. +//! +//! All values are stored using [`Any`] and must be [`'static`] + [`Send`] + [`Sync`], if there is an id mismatch +//! and a type is wrong the library will return an error, values returned from the service are also +//! wrapped in an [`Arc`] as they are shared to each duplicate action. +//! +//! ## Example: +//! ```rs +//! use revolt_coalesced::CoalescionService; +//! +//! let service = CoalescionService::new(); +//! +//! let user_id = "my_user_id"; +//! let user = service.execute(user_id, || async move { +//! database.fetch_user(user_id).await.unwrap() +//! }).await; +//! ``` + +mod config; +mod error; +mod service; + +pub use config::CoalescionServiceConfig; +pub use error::Error; +pub use service::CoalescionService; diff --git a/crates/core/coalesced/src/service.rs b/crates/core/coalesced/src/service.rs new file mode 100644 index 000000000..aadadc8a0 --- /dev/null +++ b/crates/core/coalesced/src/service.rs @@ -0,0 +1,208 @@ +use std::{any::Any, collections::HashMap, fmt::Debug, future::Future, hash::Hash, sync::Arc}; + +use tokio::sync::{ + watch::{channel as watch_channel, Receiver}, + RwLock, +}; + +#[cfg(feature = "cache")] +use lru::LruCache; + +#[cfg(feature = "queue")] +use indexmap::IndexMap; + +use crate::{CoalescionServiceConfig, Error}; + +#[derive(Debug, Clone)] +#[allow(clippy::type_complexity)] +/// # Coalescion service +/// +/// See module description for example usage. +pub struct CoalescionService { + config: Arc, + watchers: Arc, Error>>>>>>, + #[cfg(feature = "queue")] + queue: Arc, Error>>>>>>, + #[cfg(feature = "cache")] + cache: Option>>>>, +} + +impl CoalescionService { + pub fn new() -> Self { + Default::default() + } + + pub fn from_config(config: CoalescionServiceConfig) -> Self { + Self { + config: Arc::new(config), + watchers: Arc::new(RwLock::new(HashMap::new())), + #[cfg(feature = "queue")] + queue: Arc::new(RwLock::new(IndexMap::new())), + #[cfg(feature = "cache")] + cache: None, + } + } + + #[cfg(feature = "cache")] + pub fn from_cache( + config: CoalescionServiceConfig, + cache: LruCache>, + ) -> Self { + Self { + cache: Some(Arc::new(Mutex::new(cache))), + ..Self::from_config(config) + } + } + + async fn wait_for( + &self, + mut receiver: Receiver, Error>>>, + ) -> Result, Error> { + receiver + .wait_for(|v| v.is_some()) + .await + .map_err(|_| Error::RecvError) + .and_then(|r| r.clone().unwrap()) + .and_then(|arc| Arc::downcast(arc).map_err(|_| Error::DowncastError)) + } + + async fn insert_and_execute< + Value: Send + Sync + 'static, + F: FnOnce() -> Fut, + Fut: Future, + >( + &self, + id: Id, + func: F, + ) -> Result, Error> { + let (send, recv) = watch_channel(None); + + self.watchers.write().await.insert(id.clone(), recv); + + let value = Ok(Arc::new(func().await)); + + send.send_modify(|opt| { + opt.replace(value.clone().map(|v| v as Arc)); + }); + + #[cfg(feature = "cache")] + if let Some(cache) = self.cache.as_ref() { + if let Ok(value) = &value { + cache.lock().await.push(id.clone(), value.clone()); + } + }; + + self.watchers.write().await.remove(&id); + + value + } + + /// Coalesces an function, the actual function may not run if one with the same id is already running, + /// queued to be ran, or cached, the id should be globally unique for this specific action. + pub async fn execute< + Value: Send + Sync + 'static, + F: FnOnce() -> Fut, + Fut: Future, + >( + &self, + id: Id, + func: F, + ) -> Result, Error> { + #[cfg(feature = "cache")] + if let Some(cache) = self.cache.as_ref() { + if let Some(value) = cache.lock().await.get(&id) { + return Arc::downcast::(value.clone()).map_err(|_| Error::DowncastError); + } + }; + + let (receiver, length) = { + let watchers = self.watchers.read().await; + let length = watchers.len(); + + (watchers.get(&id).cloned(), length) + }; + + if let Some(receiver) = receiver { + self.wait_for(receiver).await + } else { + match self.config.max_concurrent { + Some(max_concurrent) if length >= max_concurrent => { + #[cfg(feature = "queue")] + if self.config.queue_requests { + let (receiver, length) = { + let queue = self.queue.read().await; + + (queue.get(&id).cloned(), queue.len()) + }; + + if let Some(receiver) = receiver { + return self.wait_for(receiver).await; + } else { + if self + .config + .max_queue + .is_some_and(|max_queue| max_queue >= length) + { + return Err(Error::MaxQueue); + }; + + let (send, recv) = watch_channel(None); + + self.queue.write().await.insert(id.clone(), recv); + + loop { + let length = self.watchers.read().await.len(); + + if length < max_concurrent { + let first_key = { + let queue = self.queue.read().await; + queue.first().map(|v| v.0).cloned() + }; + + if first_key == Some(id.clone()) { + self.queue.write().await.shift_remove(&id); + + let response = self.insert_and_execute(id, func).await; + + send.send_modify(|opt| { + opt.replace( + response + .clone() + .map(|v| v as Arc), + ); + }); + + return response; + } + } + } + } + } else { + Err(Error::MaxConcurrent) + } + + #[cfg(not(feature = "queue"))] + Err(Error::MaxConcurrent) + } + _ => self.insert_and_execute(id, func).await, + } + } + } + + /// Fetches the amount of currently running tasks + pub async fn current_task_count(&self) -> usize { + self.watchers.read().await.len() + } + + #[cfg(feature = "queue")] + /// Fetches the current length of the queue + pub async fn current_queue_len(&self) -> usize { + self.queue.read().await.len() + } +} + +impl Default for CoalescionService { + fn default() -> Self { + Self::from_config(CoalescionServiceConfig::default()) + } +} diff --git a/crates/core/config/Cargo.toml b/crates/core/config/Cargo.toml index 26cc1c25f..59d2f6af3 100644 --- a/crates/core/config/Cargo.toml +++ b/crates/core/config/Cargo.toml @@ -1,10 +1,11 @@ [package] name = "revolt-config" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "MIT" authors = ["Paul Makles "] description = "Revolt Backend: Configuration" +repository = "https://github.com/stoatchat/stoatchat" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -12,29 +13,28 @@ description = "Revolt Backend: Configuration" anyhow = ["dep:sentry-anyhow"] report-macros = ["revolt-result"] sentry = ["dep:sentry"] -test = ["async-std"] -default = ["test", "sentry"] +test = ["tokio"] +default = ["sentry"] [dependencies] # Utility -config = "0.13.3" -cached = "0.44.0" -once_cell = "1.18.0" +config = { workspace = true } +cached = { workspace = true } # Serde -serde = { version = "1", features = ["derive"] } +serde = { workspace = true } # Async -futures-locks = "0.7.1" -async-std = { version = "1.8.0", features = ["attributes"], optional = true } +futures-locks = { workspace = true } +tokio = { workspace = true, optional = true } # Logging -log = "0.4.14" -pretty_env_logger = "0.4.0" +log = { workspace = true } +pretty_env_logger = { workspace = true } # Sentry -sentry = { version = "0.31.5", optional = true } -sentry-anyhow = { version = "0.38.1", optional = true } +sentry = { workspace = true, optional = true } +sentry-anyhow = { workspace = true, optional = true } # Core -revolt-result = { version = "0.8.8", path = "../result", optional = true } +revolt-result = { workspace = true, optional = true } diff --git a/crates/core/config/Revolt.test.toml b/crates/core/config/Revolt.test.toml index d7241d418..684f625fc 100644 --- a/crates/core/config/Revolt.test.toml +++ b/crates/core/config/Revolt.test.toml @@ -1,3 +1,5 @@ +environment = "test" + [database] mongodb = "mongodb://localhost" redis = "redis://localhost/" @@ -10,3 +12,12 @@ password = "rabbitpass" [features] webhooks_enabled = true + +[api.smtp] +host = "localhost" +username = "smtp" +password = "smtp" +from_address = "development@stoat.chat" +reply_to = "support@stoat.chat" +port = 14025 +use_tls = false \ No newline at end of file diff --git a/crates/core/config/Revolt.toml b/crates/core/config/Revolt.toml index e3a04f2ae..5fe64cd04 100644 --- a/crates/core/config/Revolt.toml +++ b/crates/core/config/Revolt.toml @@ -1,4 +1,6 @@ production = false +disable_events_dont_use = false +environment = "dev" [database] # MongoDB connection URL @@ -11,7 +13,7 @@ redis = "redis://redis/" [hosts] # Web locations of various services # Defaults assume all services are reverse-proxied -# See https://github.com/revoltchat/self-hosted/blob/master/Caddyfile +# See https://github.com/stoatchat/self-hosted/blob/main/Caddyfile # # Remember to change these to https/wss where appropriate in production! app = "http://local.revolt.chat" @@ -22,17 +24,23 @@ january = "http://local.revolt.chat/january" voso_legacy = "" voso_legacy_ws = "" +[hosts.livekit] + [rabbit] host = "rabbit" port = 5672 username = "rabbituser" password = "rabbitpass" +default_exchange = "revolt.default" + +[rabbit.queues] +acks = "internal.ack" [api] [api.registration] # Whether an invite should be required for registration -# See https://github.com/revoltchat/self-hosted#making-your-instance-invite-only +# See https://github.com/stoatchat/self-hosted#making-your-instance-invite-only invite_only = false [api.smtp] @@ -46,6 +54,10 @@ from_address = "noreply@example.com" # port = 587 # use_tls = true +[api.smtp.expiry] +expire_verification = 604800 # 3600 * 24 * 7 +expire_password_reset = 86400 # 3600 * 24 +expire_account_deletion = 86400 # 3600 * 24 [api.security] # Authifier Shield API key @@ -56,18 +68,31 @@ voso_legacy_token = "" trust_cloudflare = false # easypwned endpoint easypwned = "" +# Tenor API Key +tenor_key = "" [api.security.captcha] # hCaptcha configuration hcaptcha_key = "" hcaptcha_sitekey = "" +[api.security.shield] +host = "" +key = "" + [api.workers] # Maximum concurrent connections (to proxy server) max_concurrent_connections = 50 -[api.users] +[api.livekit] +# How long to ring devices for when calling in dms/groups, in seconds +call_ring_duration = 30 +[api.livekit.nodes] + +[api.users] +# Minimum allowed length of usernames +min_username_length = 2 [pushd] # this changes the names of the queues to not overlap @@ -79,12 +104,18 @@ production = true # Increasing this will resolve mentions faster, but will consume more memory while resolving. mass_mention_chunk_size = 200 +# How long pushd will cache resolved names for rendered message notifications. +# Increasing this will result in lower database usage, but may result in a situation where a user/channel/role name changes +# and the notifications still resolve to the old name. +render_cache_time = 60 + # none of these should need changing exchange = "revolt.notifications" message_queue = "notifications.origin.message" mass_mention_queue = "notifications.origin.mass_mention" # handles messages that contain role or everyone mentions fr_accepted_queue = "notifications.ingest.fr_accepted" # friend request accepted fr_received_queue = "notifications.ingest.fr_received" # friend request received +dm_call_queue = "notifications.ingest.dm_call" # direct message voice call generic_queue = "notifications.ingest.generic" # generic messages (title + body) ack_queue = "notifications.process.ack" # updates badges for apple devices @@ -114,6 +145,8 @@ pkcs8 = "" key_id = "" team_id = "" +[january] +blocked_domains = [] [files] # Encryption key for stored files @@ -210,6 +243,10 @@ new_user_hours = 72 # (should be greater than any one file upload limit) body_limit_size = 20_000_000 +# If any userids are entered here, only those users will be able to create servers. +# Leave empty to allow all users to create servers +restrict_server_creation = [] + [features.limits.new_user] # Limits imposed on new users @@ -228,6 +265,18 @@ message_attachments = 5 # Maximum number of servers the user can create/join servers = 50 +# Maximum audio frequency (Hz) in voice calls +voice_quality = 16000 + +# Whether the user can use video streams in voice calls +video = true + +# Maximum resolution (width, height) of video streams in voice calls +video_resolution = [1080, 720] + +# Minimum and maximum aspect ratio of video streams in voice calls +video_aspect_ratio = [0.3, 2.5] + [features.limits.new_user.file_upload_size_limit] # Maximum file size limits (in bytes) attachments = 20_000_000 @@ -255,6 +304,18 @@ message_attachments = 5 # Maximum number of servers the user can create/join servers = 100 +# Maximum audio frequency (Hz) in voice calls +voice_quality = 16000 + +# Whether the user can use video streams in voice calls +video = true + +# Maximum resolution (width, height) of video streams in voice calls +video_resolution = [1280, 720] + +# Minimum and maximum aspect ratio of video streams in voice calls +video_aspect_ratio = [0.3, 2.5] + [features.limits.default.file_upload_size_limit] # Maximum file size limits (in bytes) attachments = 20_000_000 @@ -269,11 +330,19 @@ emojis = 500_000 # default: 5 process_message_delay_limit = 5 +[features.legal_links] +# URLs for legal documents +terms_of_service = "" +privacy_policy = "" +guidelines = "" + [sentry] # Configuration for Sentry error reporting api = "" events = "" +voice_ingress = "" files = "" proxy = "" pushd = "" crond = "" +gifbox = "" diff --git a/crates/core/config/src/lib.rs b/crates/core/config/src/lib.rs index 6c4d58de5..937892080 100644 --- a/crates/core/config/src/lib.rs +++ b/crates/core/config/src/lib.rs @@ -1,9 +1,10 @@ -use std::collections::HashMap; +#[cfg(feature = "test")] +use std::sync::OnceLock; +use std::{collections::HashMap, path::Path, sync::LazyLock}; use cached::proc_macro::cached; -use config::{Config, File, FileFormat}; +use config::{Config, Environment, File, FileFormat}; use futures_locks::RwLock; -use once_cell::sync::Lazy; use serde::Deserialize; #[cfg(feature = "sentry")] @@ -66,13 +67,28 @@ static CONFIG_SEARCH_PATHS: [&str; 3] = [ static TEST_OVERRIDE_PATH: &str = "Revolt.test-overrides.toml"; /// Configuration builder -static CONFIG_BUILDER: Lazy> = Lazy::new(|| { +static CONFIG_BUILDER: LazyLock> = LazyLock::new(|| { RwLock::new({ let mut builder = Config::builder().add_source(File::from_str( include_str!("../Revolt.toml"), FileFormat::Toml, )); + let cwd = std::env::current_dir().unwrap(); + let mut cwd: Option<&Path> = Some(&cwd); + + while let Some(path) = cwd { + for config_path in CONFIG_SEARCH_PATHS { + let config_path = path.join(config_path); + if config_path.exists() { + builder = builder + .add_source(File::new(config_path.to_str().unwrap(), FileFormat::Toml)); + } + } + + cwd = path.parent(); + } + if std::env::var("TEST_DB").is_ok() { builder = builder.add_source(File::from_str( include_str!("../Revolt.test.toml"), @@ -94,11 +110,7 @@ static CONFIG_BUILDER: Lazy> = Lazy::new(|| { } } - for path in CONFIG_SEARCH_PATHS { - if std::path::Path::new(path).exists() { - builder = builder.add_source(File::new(path, FileFormat::Toml)); - } - } + builder = builder.add_source(Environment::with_prefix("REVOLT").separator("__")); builder.build().unwrap() }) @@ -108,6 +120,12 @@ static CONFIG_BUILDER: Lazy> = Lazy::new(|| { pub struct Database { pub mongodb: String, pub redis: String, + pub redis_pubsub: Option, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct RabbitQueues { + pub acks: String, } #[derive(Deserialize, Debug, Clone)] @@ -116,6 +134,8 @@ pub struct Rabbit { pub port: u16, pub username: String, pub password: String, + pub default_exchange: String, + pub queues: RabbitQueues, } #[derive(Deserialize, Debug, Clone)] @@ -125,8 +145,7 @@ pub struct Hosts { pub events: String, pub autumn: String, pub january: String, - pub voso_legacy: String, - pub voso_legacy_ws: String, + pub livekit: HashMap, } #[derive(Deserialize, Debug, Clone)] @@ -144,6 +163,18 @@ pub struct ApiSmtp { pub port: Option, pub use_tls: Option, pub use_starttls: Option, + pub expiry: EmailExpiry, +} + +/// Email expiration config +#[derive(Deserialize, Debug, Clone)] +pub struct EmailExpiry { + /// How long email verification codes should last for (in seconds) + pub expire_verification: i64, + /// How long password reset codes should last for (in seconds) + pub expire_password_reset: i64, + /// How long account deletion codes should last for (in seconds) + pub expire_account_deletion: i64, } #[derive(Deserialize, Debug, Clone)] @@ -183,13 +214,20 @@ pub struct ApiSecurityCaptcha { pub hcaptcha_sitekey: String, } +#[derive(Deserialize, Debug, Clone)] +pub struct ApiSecurityShield { + pub host: String, + pub key: String, +} + #[derive(Deserialize, Debug, Clone)] pub struct ApiSecurity { - pub authifier_shield_key: String, + pub shield: ApiSecurityShield, pub voso_legacy_token: String, pub captcha: ApiSecurityCaptcha, pub trust_cloudflare: bool, pub easypwned: String, + pub tenor_key: String, } #[derive(Deserialize, Debug, Clone)] @@ -197,9 +235,29 @@ pub struct ApiWorkers { pub max_concurrent_connections: usize, } +#[derive(Deserialize, Debug, Clone)] +pub struct ApiLiveKit { + pub call_ring_duration: usize, + pub nodes: HashMap, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct LiveKitNode { + pub url: String, + pub lat: f64, + pub lon: f64, + pub key: String, + pub secret: String, + + // whether to hide the node in the nodes list + #[serde(default)] + pub private: bool, +} + #[derive(Deserialize, Debug, Clone)] pub struct ApiUsers { pub early_adopter_cutoff: Option, + pub min_username_length: usize, } #[derive(Deserialize, Debug, Clone)] @@ -208,6 +266,7 @@ pub struct Api { pub smtp: ApiSmtp, pub security: ApiSecurity, pub workers: ApiWorkers, + pub livekit: ApiLiveKit, pub users: ApiUsers, } @@ -216,10 +275,12 @@ pub struct Pushd { pub production: bool, pub exchange: String, pub mass_mention_chunk_size: usize, + pub render_cache_time: usize, // Queues pub message_queue: String, pub mass_mention_queue: String, + pub dm_call_queue: String, pub fr_accepted_queue: String, pub fr_received_queue: String, pub generic_queue: String, @@ -250,6 +311,10 @@ impl Pushd { self.get_routing_key(self.mass_mention_queue.clone()) } + pub fn get_dm_call_routing_key(&self) -> String { + self.get_routing_key(self.dm_call_queue.clone()) + } + pub fn get_fr_accepted_routing_key(&self) -> String { self.get_routing_key(self.fr_accepted_queue.clone()) } @@ -263,6 +328,11 @@ impl Pushd { } } +#[derive(Deserialize, Debug, Clone)] +pub struct January { + pub blocked_domains: Vec, +} + #[derive(Deserialize, Debug, Clone)] pub struct FilesLimit { pub min_file_size: usize, @@ -307,6 +377,8 @@ pub struct GlobalLimits { pub new_user_hours: usize, pub body_limit_size: usize, + + pub restrict_server_creation: Vec, } #[derive(Deserialize, Debug, Clone)] @@ -317,6 +389,10 @@ pub struct FeaturesLimits { pub message_length: usize, pub message_attachments: usize, pub servers: usize, + pub voice_quality: u32, + pub video: bool, + pub video_resolution: [u32; 2], + pub video_aspect_ratio: [f32; 2], pub file_upload_size_limit: HashMap, } @@ -332,6 +408,16 @@ pub struct FeaturesLimitsCollection { pub roles: HashMap, } +#[derive(Deserialize, Debug, Clone)] +pub struct LegalLinks { + /// Terms of Service URL + pub terms_of_service: String, + /// Privacy Policy URL + pub privacy_policy: String, + /// Guidelines URL + pub guidelines: String, +} + #[derive(Deserialize, Debug, Clone)] pub struct FeaturesAdvanced { #[serde(default)] @@ -349,6 +435,7 @@ impl Default for FeaturesAdvanced { #[derive(Deserialize, Debug, Clone)] pub struct Features { pub limits: FeaturesLimitsCollection, + pub legal_links: LegalLinks, pub webhooks_enabled: bool, pub mass_mentions_send_notifications: bool, pub mass_mentions_enabled: bool, @@ -361,10 +448,12 @@ pub struct Features { pub struct Sentry { pub api: String, pub events: String, + pub voice_ingress: String, pub files: String, pub proxy: String, pub pushd: String, pub crond: String, + pub gifbox: String, } #[derive(Deserialize, Debug, Clone)] @@ -374,10 +463,13 @@ pub struct Settings { pub hosts: Hosts, pub api: Api, pub pushd: Pushd, + pub january: January, pub files: Files, pub features: Features, pub sentry: Sentry, pub production: bool, + pub environment: String, + pub disable_events_dont_use: bool, } impl Settings { @@ -403,23 +495,52 @@ pub async fn read() -> Config { CONFIG_BUILDER.read().await.clone() } -#[cached(time = 30)] -pub async fn config() -> Settings { +pub async fn config_no_cache() -> Settings { let mut config = read().await.try_deserialize::().unwrap(); // inject REDIS_URI for redis-kiss library - if std::env::var("REDIS_URL").is_err() { + if std::env::var("REDIS_URI").is_err() { std::env::set_var("REDIS_URI", config.database.redis.clone()); } // auto-detect production nodes - if config.hosts.api.contains("https") && config.hosts.api.contains("revolt.chat") { + if config.hosts.api.contains("https") + && (config.hosts.api.contains("revolt.chat") || config.hosts.api.contains("stoat.chat")) + { config.production = true; } config } +#[cached(time = 30)] +pub async fn config() -> Settings { + #[cfg(feature = "test")] + if let Some(overwrites) = CONFIG_OVERWRITES.get() { + return overwrites.clone(); + } + + config_no_cache().await +} + +#[cfg(feature = "test")] +static CONFIG_OVERWRITES: OnceLock = OnceLock::new(); + +/// Modify the config values for a test, this can only be called once +/// +/// This will also fail if two or more tests are running in the same process and both try to modify the config, +/// This could happen if tests where run under `cargo test` instead of `nextest`. +#[cfg(feature = "test")] +pub async fn overwrite_config(f: impl FnOnce(&mut Settings)) { + let mut config = config_no_cache().await; + + f(&mut config); + + CONFIG_OVERWRITES.set(config).expect( + "Cannot overwrite config multiple times, make sure you are running tests through nextest.", + ); +} + /// Configure logging and common Rust variables #[cfg(feature = "sentry")] pub async fn setup_logging(release: &'static str, dsn: String) -> Option { @@ -465,7 +586,7 @@ macro_rules! configure { mod tests { use crate::init; - #[async_std::test] + #[tokio::test] async fn it_works() { init().await; } diff --git a/crates/core/database/Cargo.toml b/crates/core/database/Cargo.toml index 02e554118..38d831746 100644 --- a/crates/core/database/Cargo.toml +++ b/crates/core/database/Cargo.toml @@ -1,98 +1,113 @@ [package] name = "revolt-database" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "AGPL-3.0-or-later" authors = ["Paul Makles "] description = "Revolt Backend: Database Implementation" +repository = "https://github.com/stoatchat/stoatchat" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] # Databases -mongodb = ["dep:mongodb", "bson", "authifier/database-mongodb"] +mongodb = ["dep:mongodb", "bson"] # ... Other tasks = ["isahc", "linkify", "url-escape"] -async-std-runtime = ["async-std", "authifier/async-std-runtime"] -rocket-impl = ["rocket", "schemars", "revolt_okapi", "revolt_rocket_okapi", "authifier/rocket_impl"] -axum-impl = ["axum"] +tokio-runtime = ["tokio"] +rocket-impl = [ + "rocket", + "schemars", + "revolt_okapi", + "revolt_rocket_okapi", +] +axum-impl = ["axum", "revolt-result/axum", "utoipa"] redis-is-patched = ["revolt-presence/redis-is-patched"] +voice = ["livekit-api", "livekit-protocol", "livekit-runtime"] # Default Features -default = ["mongodb", "async-std-runtime", "tasks"] +default = ["mongodb", "tokio-runtime", "tasks"] [dependencies] # Core -revolt-config = { version = "0.8.8", path = "../config", features = [ - "report-macros", -] } -revolt-result = { version = "0.8.8", path = "../result" } -revolt-models = { version = "0.8.8", path = "../models", features = [ - "validator", -] } -revolt-presence = { version = "0.8.8", path = "../presence" } -revolt-permissions = { version = "0.8.8", path = "../permissions", features = [ - "serde", - "bson", -] } -revolt-parser = { version = "0.8.8", path = "../parser" } +revolt-config = { workspace = true, features = ["report-macros"] } +revolt-result = { workspace = true } +revolt-models = { workspace = true, features = ["validator"] } +revolt-presence = { workspace = true } +revolt-permissions = { workspace = true, features = ["serde", "bson"] } +revolt-parser = { workspace = true } +revolt-coalesced = { workspace = true } # Utility -log = "0.4" -lru = "0.11.0" -rand = "0.8.5" -ulid = "1.0.0" -nanoid = "0.4.0" -base64 = "0.21.3" -once_cell = "1.17" -indexmap = "1.9.1" -decancer = "1.6.2" -deadqueue = "0.2.4" -linkify = { optional = true, version = "0.8.1" } -url-escape = { optional = true, version = "0.1.1" } -validator = { version = "0.16", features = ["derive"] } -isahc = { optional = true, version = "1.7", features = ["json"] } +log = { workspace = true } +lru = { workspace = true } +rand = { workspace = true } +ulid = { workspace = true } +nanoid = { workspace = true } +base64 = { workspace = true } +once_cell = { workspace = true } +indexmap = { workspace = true } +decancer = { workspace = true } +deadqueue = { workspace = true } +linkify = { workspace = true, optional = true } +url-escape = { workspace = true, optional = true } +validator = { workspace = true, features = ["derive"] } +isahc = { workspace = true, features = ["json"], optional = true } +base32 = { workspace = true } +sha1 = { workspace = true } # Serialisation -serde_json = "1" -revolt_optional_struct = "0.2.0" -serde = { version = "1", features = ["derive"] } -iso8601-timestamp = { version = "0.2.10", features = ["serde", "bson"] } +serde_json = { workspace = true } +revolt_optional_struct = { workspace = true } +serde = { workspace = true } +iso8601-timestamp = { workspace = true, features = ["serde", "bson"] } # Events -redis-kiss = { version = "0.1.4" } +redis-kiss = { workspace = true, default-features = false, features = ["tokio-runtime"] } # Database -bson = { optional = true, version = "2.1.0" } -mongodb = { optional = true, version = "3.1.0" } +bson = { workspace = true, optional = true } +mongodb = { workspace = true, optional = true } # Database Migration -unicode-segmentation = "1.10.1" -regex = "1" +unicode-segmentation = { workspace = true } +regex = { workspace = true } # Async Language Features -futures = "0.3.19" -async-lock = "2.8.0" -async-trait = "0.1.51" -async-recursion = "1.0.4" +futures = { workspace = true } +async-lock = { workspace = true } +async-trait = { workspace = true } +async-recursion = { workspace = true } # Async -async-std = { version = "1.8.0", features = ["attributes"], optional = true } +tokio = { workspace = true, optional = true } # Axum Impl -axum = { version = "0.7.5", optional = true } +axum = { workspace = true, optional = true } +utoipa = { workspace = true, features = ["axum_extras"], optional = true } # Rocket Impl -schemars = { version = "0.8.8", optional = true } -rocket = { version = "0.5.1", default-features = false, features = [ - "json", -], optional = true } -revolt_okapi = { version = "0.9.1", optional = true } -revolt_rocket_okapi = { version = "0.10.0", optional = true } - -# Authifier -authifier = { version = "1.0.15" } +schemars = { workspace = true, optional = true } +rocket = { workspace = true, features = ["json"], optional = true } +revolt_okapi = { workspace = true, optional = true } +revolt_rocket_okapi = { workspace = true, optional = true } # RabbitMQ -amqprs = { version = "1.7.0" } +lapin = { workspace = true, features = ["tokio"] } + +# Voice +livekit-api = { workspace = true, features = ["rustls-tls-native-roots"], optional = true } +livekit-protocol = { workspace = true, optional = true } +livekit-runtime = { workspace = true, features = ["tokio"], optional = true } + +# Security +totp-lite = { workspace = true } +rust-argon2 = { workspace = true } + +# Email +lettre = { workspace = true } +handlebars = { workspace = true } + +# Web Requests +reqwest = { workspace = true, features = ["json", "form"] } diff --git a/crates/core/database/assets/pwned100k.txt b/crates/core/database/assets/pwned100k.txt new file mode 100644 index 000000000..a57738388 --- /dev/null +++ b/crates/core/database/assets/pwned100k.txt @@ -0,0 +1,100005 @@ +this file contains the top 100,000 passwords from the have i been pwned (https://haveibeenpwned.com) data set (by troy hunt). +source: https://www.ncsc.gov.uk/static-assets/documents/pwnedpasswordstop100k.txt +all entries are lowercase +-- + +123456 +123456789 +qwerty +password +111111 +12345678 +abc123 +1234567 +password1 +12345 +1234567890 +123123 +000000 +iloveyou +1234 +1q2w3e4r5t +qwertyuiop +123 +monkey +dragon +123456a +654321 +123321 +666666 +1qaz2wsx +myspace1 +121212 +homelesspa +123qwe +a123456 +123abc +1q2w3e4r +qwe123 +7777777 +qwerty123 +target123 +tinkle +987654321 +qwerty1 +222222 +zxcvbnm +1g2w3e4r +gwerty +zag12wsx +gwerty123 +555555 +fuckyou +112233 +asdfghjkl +1q2w3e +123123123 +qazwsx +computer +princess +12345a +ashley +159753 +michael +football +sunshine +1234qwer +iloveyou1 +aaaaaa +fuckyou1 +789456123 +daniel +777777 +princess1 +123654 +11111 +asdfgh +999999 +11111111 +passer2009 +888888 +love +abcd1234 +shadow +football1 +love123 +superman +jordan23 +jessica +monkey1 +12qwaszx +a12345 +baseball +123456789a +killer +asdf +samsung +master +azerty +charlie +asd123 +soccer +fqrg7cs493 +88888888 +jordan +michael1 +jesus1 +linkedin +babygirl1 +789456 +blink182 +thomas +qwer1234 +333333 +liverpool +michelle +nicole +qwert +j38ifubn +131313 +asdasd +0 +987654 +lovely +q1w2e3r4 +0123456789 +gfhjkm +andrew +hello1 +joshua +status +justin +anthony +angel1 +iloveyou2 +1111111 +zxcvbn +hello +1111 +jennifer +hunter +naruto +bitch1 +welcome +159357 +101010 +tigger +147258369 +babygirl +jessica1 +parola +5201314 +robert +fuckyou2 +696969 +102030 +0987654321 +loveme +123456q +apple +pokemon +mother +money1 +secret +anthony1 +purple +q1w2e3r4t5y6 +baseball1 +qazwsxedc +1111111111 +abc +buster +matthew +andrea +soccer1 +basketball +hannah +freedom +golfer +chelsea +passw0rd +george +trustno1 +friends +william +iloveu +amanda +number1 +chocolate +qwerty12 +summer +flower +charlie1 +maggie +pakistan +samantha +asdf1234 +letmein +asshole1 +superman1 +marina +147258 +batman +fuk19600 +butterfly +010203 +qweqwe +29rsavoy +forever +1 +mustang +sunshine1 +ashley1 +internet +london +666 +harley +alexander +xbox360 +00000000 +12341234 +q1w2e3 +pepper +family +loveyou +50cent +joseph +whatever +! +jasmine +orange +user +junior +cookie +martin +qweasdzxc +212121 +1qazxsw2 +password12 +google +password2 +111222 +lol123 +hello123 +jordan1 +shadow1 +patrick +3rjs1la7qe +ginger +nicole1 +mylove +arsenal +12344321 +abcdef +love12 +232323 +vqsablpzla +taylor +myspace +brandon +angel +12345q +brandon1 +chris1 +diamond +snoopy +asshole +qweasd +starwars +matrix +mickey +school +jonathan +melissa +eminem +1234561 +cjmasterinf +lovers +1234567891 +nikita +richard +1342 +yellow +12345qwert +oliver +q1w2e3r4t5 +cheese +a123456789 +christian +290966 +wall.e +12345678910 +12413 +sophie +tudelft +diosesfiel +dpbk1234 +pe#5gz29ptzmse +bailey +u38fa39 +mercedes +victoria +147852 +asdasd5 +matthew1 +abcdefg +peanut +456789 +red123 +happy1 +sandra +benjamin +dragon1 +444444 +123654789 +$hex +elizabeth +prince +amanda1 +angels +angela +qqqqqq +samuel +banana +barcelona +ghbdtn +computer1 +michelle1 +william1 +hockey +monster +carlos +justin1 +antonio +qwertyu +nathan +55555 +123789 +0000 +killer1 +11223344 +chicken +lucky1 +gabriel +welcome1 +zaq12wsx +jasmine1 +silver +hunter1 +bubbles +hottie1 +purple1 +andrew1 +daniel1 +liverpool1 +1qaz2wsx3edc +rainbow +morgan +natasha +fuckoff +jackson +austin +vanessa +mommy1 +madison +adidas +xxxxxx +252525 +america +james1 +metallica +slipknot +chicken1 +87654321 +jesus +null +0000000000 +alexis +!ab#cd$ +spiderman +steven +ferrari +lauren +456123 +robert1 +147852369 +qwaszx +buddy1 +butterfly1 +!~!1 +tinkerbell +bandit +danielle +0123456 +nicholas +hannah1 +qwerty12345 +1234554321 +asdfasdf +pokemon1 +nirvana +destiny +scooter +cookie1 +123qweasd +loveme1 +chelsea1 +chocolate1 +1234567a +juventus +rachel +111222tianya +qazxsw +zzzzzz +monica +stella +america1 +999999999 +jennifer1 +freedom1 +taylor1 +741852963 +yamaha +victor +00000 +qwertyui +a1b2c3 +ronaldo +1password +smokey +david1 +money +daddy1 +cocacola +a838hfid +1234abcd +joshua1 +123asd +buster1 +myspace123 +booboo +madison1 +samantha1 +heather +7654321 +elizabeth1 +poop +tigger1 +family1 +mustang1 +142536 +november +jasper +lovely1 +diamond1 +success +edward +music1 +valentina +harley1 +sweety +tennis +zxc123 +friend +qaz123 +whatever1 +thomas1 +nothing +n0=acc3ss +super123 +casper +password +chester +exigent +password123 +cheese1 +spongebob1 +mynoob +hahaha +hellokitty +098765 +alexandra +canada +david +1q2w3e4r5t6y +dennis +december +olivia +a1b2c3d4 +playboy +sabrina +patricia +summer1 +friends1 +mexico1 +dakota +barbie +loulou +johnny +music +123456m +password1 +lover1 +maggie1 +pretty +123hfjdk147 +nicolas +qwert1 +charles +phoenix +rebecca +thunder +sexy123 +iloveu2 +123456789q +batman1 +beautiful +carolina +4815162342 +vincent +jeremy +spider +master1 +heather1 +weed420 +sojdlg123aljg +pepper1 +sebastian +yankees +dallas +pussy1 +cameron +caroline +peanut1 +guitar +startfinding +midnight +i +iw14fi9j +yankees1 +elephant +124578 +scorpion +sexy +tweety +bubbles1 +fuckoff1 +cowboys1 +fuckme +fucker +louise +dolphin +852456 +patrick1 +loser1 +mother1 +lalala +naruto1 +veronica +melissa1 +sparky +newyork +adrian +123456s +september +heaven +alexander1 +jessie +crystal +tigers +k.: +p +iloveyou! +chris +gemini +raiders1 +135790 +zxcvbnm1 +peaches +merlin +12121212 +spongebob +scooby +stephanie +shannon +james +246810 +1a2b3c +555666 +sergey +lovelove +202020 +159951 +precious +123456j +lakers +manchester +ginger1 +134679 +cristina +apples +a1234567 +qqww1122 +pussy +daniela +jackson1 +123456b +jackie +rocky1 +asdfghjkl1 +sakura +qazwsx123 +yellow1 +flower1 +apple1 +010101 +newyork1 +sammy1 +alex +muffin +cherry +poohbear +richard1 +nigger1 +test123 +destiny1 +flowers +slipknot1 +cooper +753951 +monster1 +password +baby123 +mexico +blessed1 +toyota +spiderman1 +beauty +fuck +emmanuel +genius +winston +tiffany +charlotte +741852 +iloveu1 +diablo +onelove +tiger1 +badboy +maverick +joseph1 +winner +mickey1 +creative +beautiful1 +softball +hotmail +421uiopy258 +brittany +1314520 +aa123456 +asdf123 +lastfm +manuel +sayang +kristina +austin1 +stupid1 +hottie +booboo1 +murphy +stalker +carmen +doudou +qazqaz +scorpio +m123456 +pimpin1 +pass +badoo +garfield +0000000 +fuckme1 +scooter1 +151515 +aaaaa +brandy +kitty1 +myspace2 +steelers +compaq +claudia +123456d +rabbit +bailey1 +crazy1 +august +isabella +orange1 +october +q123456 +green1 +black1 +samson +aaaa +angelo +1a2b3c4d +9876543210 +boomer +junior1 +12345678a +shorty1 +tyler1 +456456 +kimberly +guitar1 +cowboys +shorty +passion +soleil +christ +1v7upjw3nt +111 +albert +andrey +ranger +dexter +lucky7 +popcorn +babyboy1 +bitch +alyssa +brittany1 +123456abc +forever1 +fucker1 +barney +1122334455 +blessed +metallica1 +1029384756 +karina +krishna +cameron1 +california +christian1 +melanie +j123456 +password! +happy +963852741 +woaini +danielle1 +samsung1 +gangsta1 +icecream +letmein1 +qwerty123456 +eagles +love13 +qwert123 +uqa9ebw445 +fucku2 +smokey1 +leonardo +asdfgh1 +police +christine +windows +bismillah +miguel +iloveyou12 +: +snickers +arsenal1 +7758521 +bubba1 +cowboy +denise +pretty1 +george1 +q12345 +winter +dancer +coffee +player1 +fernando +maxwell +swordfish +rangers +horses +francis +951753 +martina +fylhtq +chivas1 +secret1 +s123456 +marlboro +qwerty1234 +kitten +lauren1 +twilight +florida +141414 +pass123 +yagjecc826 +jason1 +54321 +nathan1 +sydney +pumpkin +molly1 +dolphin1 +vfhbyf +natalie +hiphop +skater1 +fishing +bond007 +kobe24 +barbara +loveyou1 +tiffany1 +john316 +cassie +iloveme +hardcore +stupid +fatima +alexis1 +rockstar +abc1234 +123456z +playboy1 +321321 +123123a +greenday +baby +maria +angelina +starwars1 +google1 +b123456 +school1 +bonnie +123qwe123 +sz9kqcctwy +lucky +father +courtney +sexy12 +007007 +crystal1 +abc123456 +fluffy +kissme +marseille +trinity +sweet1 +candy1 +qwerty7 +password3 +alejandro +a +pookie +roberto +sarah1 +player +justinbieb +turtle +poohbear1 +simone +corvette +jackass1 +lolita +jonathan1 +steven1 +alicia +lollipop +jackass +123456c +786786 +biteme +honey +motorola +nicholas1 +friendster +angel123 +portugal +iloveme1 +simple +012345 +vfrcbv +brooklyn +morgan1 +darkness +rainbow1 +shelby +slayer +natalia +snowball +chicago +454545 +aaaaaa1 +1234512345 +people +lovers1 +sharon +golden +snoopy1 +shannon1 +raiders +123qweasdzxc +sweetie +789789 +teresa +blue123 +242424 +awesome +boston +victoria1 +pamela +wilson +ssssss +mike +kevin +test +klaster +123456k +kenneth +bonjour +tucker +catherine +hockey1 +pa55word +9379992 +password. +eminem1 +love11 +mnbvcxz +logitech +redsox +remember +popcorn1 +kevin1 +isabelle +p3rat54797 +seven7 +steelers1 +qwe +marcus +bulldog +yfnfif +cricket +lakers24 +edward1 +tweety1 +qazwsx1 +123456t +single +lizottes +nastya +amber1 +sarah +blessing +marley +rockstar1 +fender +aaa111 +willow +camille +aaaaaaaa +florida1 +peaches1 +bella1 +carlos1 +connor +d123456 +love4ever +cutie1 +indian +goodluck +marie1 +loveme2 +marine +hammer +chance +stephen +121314 +123456l +z123456 +santiago +strawberry +abcdefg1 +bigdaddy +daisy1 +thunder1 +asdfghjk +marvin +mmmmmm +vanessa1 +happy123 +abcd123 +fuckyou! +iverson3 +hotdog +svetlana +arthur +1212 +never +tintin +234567 +iceman +orlando +satan666 +superstar +babygurl1 +090909 +johnson +fyfcnfcbz +freddy +rachel1 +magic +qwert12345 +chester1 +loverboy +miller +cookies +parker +azertyuiop +porsche +teacher +5555555555 +angelica +yourmom1 +bullshit +sunday +christopher +love1234 +travis +5555555 +evildick +666999 +monika +nissan +qwer +asdfg +midnight1 +williams +please +55555555 +spencer +aaaaa1 +gateway +tiger +dallas1 +111111a +charles1 +321654 +gracie +raymond +ladybug +sweetpea +rush2112 +greenday1 +sunflower +1123581321 +baby12 +jason +precious1 +lakers1 +brooklyn1 +stephanie1 +undertaker +m +12345t +sweetheart +ihateyou +zachary +emily1 +fktrcfylh +123698745 +tamara +asdfjkl +21212121 +456852 +lebron23 +andrei +paradise +doctor +kawasaki +polniypizdec0211 +a12345678 +money123 +171717 +sophia +winnie +bianca +bigboy +22222222 +qqq111 +jacob1 +andrea1 +john +julian +pantera +lucky13 +poopoo +lollol +3d8cubaj2e +lorenzo +sasuke +babyboy +nascar +hahaha1 +vladimir +abc12345 +sierra +shopping +career121 +12345qwerty +genesis +christina +bandit1 +mylove1 +cool +nelson +abcd +january +sweet +qq123456 +scarface +159159 +montana +ricardo +dolphins +giovanni +frankie +soccer12 +johnny1 +facebook +changeme +zxcvbnm123 +jerome +sassy1 +password11 +123454321 +qw123321 +dakota1 +australia +southside1 +soccer10 +zoosk +maryjane +пїѕпїѕпїѕпїѕпїѕпїѕ +brenda +rebecca1 +baller1 +honey1 +jeffrey +xavier +eagles1 +ryan +getmoney1 +brianna1 +realmadrid +8675309 +k. +scooby1 +westside +minnie +bobby1 +vampire +linkinpark +asdasdasd +francesco +inuyasha +1478963 +asdfg1 +falcon +123456r +green +laura +1q1q1q +aaa +rosebud +katie1 +alex123 +111222333 +asdfghj +ig4abox4 +sergio +nigger +sterling +sophie1 +claire +100200 +italia +ronaldo7 +timothy +jaguar +mariana +maksim +abigail +isabel +sairam +520520 +jackie1 +savannah +bigdaddy1 +courtney1 +disney +bigboy1 +nigga1 +blue +zaqwsx +love22 +c123456 +dancer1 +1qwerty +musica +single1 +123456aa +valentin +brooke +oliver1 +chicago1 +cherry1 +london1 +cjkysirj +alberto +jesus123 +565656 +blabla +maria1 +warcraft +patches +cat123 +mahalkita +banana1 +p +monkey123 +hollister1 +alyssa1 +lover +butter +walter +black +alessandro +778899 +w5txn36alfw +tigers1 +password7 +danny1 +awesome1 +bestfriend +dominic +gabriel1 +michele +gateway1 +oscar1 +sex +cancer +helpme +volleyball +yuantuo2012 +marie +123456g +princess12 +love69 +justine +chouchou +bitch123 +champion +france +kitty +element1 +963852 +jasmin +fishing1 +4444 +darling +united +manutd +teddybear +regina +natalie1 +passwort +francesca +181818 +abcdef1 +maximus +rafael +buddy +victory +qwerasdf +animal +student +hawaii +apple123 +spirit +jamaica +carter +kayla1 +gabriela +mariposa +abcdefgh +love23 +super +yahoo1 +rental +eddie1 +dreams +sexy69 +cheyenne +babygirl12 +poop123 +1234321 +england +eduardo +valeria +zachary1 +1986 +bob123 +antonio1 +sniper +napoli +panther +willie +redsox1 +hallo +zaq123 +calvin +veronika +111111111 +lol +nintendo +copper +millie +georgia +ybccfy +dog123 +brianna +123zxc +happiness +diesel +monkey12 +mohamed +123321a +camaro +bigdog +7895123 +100000 +engineer +bitches1 +estrella +grandma1 +princesa +oksana +gloria +penguin +virginia +skater +scarface1 +suzuki +martin1 +blue22 +donald +123456e +password +1234560 +newlife +chris123 +++++++ +123qaz +leslie +jimmy1 +sweet16 +anderson +abcdefg123 +77777777 +blahblah +wwwwww +aleksandr +shelby1 +adriana +kisses +giuseppe +softball1 +skyline +audrey +fucku1 +trouble +badboy1 +rey619 +tristan +celtic +vkontakte +love101 +pimpin +simpsons +liberty +7777 +jeremy1 +godisgood +angels1 +262626 +cupcake +twilight1 +skate1 +potter +bradley +warrior +qw123 +miranda +pumpkin1 +barbie1 +sexsex +100 +147896325 +smile +hesoyam +debbie +ruslan +online +maddie +jessie1 +pink123 +speedy +taurus +loveyou2 +olivia1 +ladybug1 +wizard +allison +pierre +domino +benjamin1 +apples1 +silvia +kingkong +bobby +monday +polina +fuckyou123 +honda1 +mercury +nokia +rascal +pepsi1 +6969 +silver1 +angela1 +florence +adgjmptw +cookies1 +margarita +hallo123 +monique +258456 +fuck123 +9111961 +love14 +pass1234 +children +zzzzzzzz +tyler +123451 +cristian +star +justice +password5 +booger +knight +mamapapa +dreamer +siemens +esther +soccer11 +hollywood +qawsed +password01 +monkey2 +cassie1 +anna +inuyasha1 +amoremio +sister +gregory +191919 +serenity +natali +sabrina1 +n8zgt5p0shw= +prince1 +rangers1 +camila +123456qwerty +ncc1701 +1bitch +nirvana1 +ronald +business +texas1 +element +avatar +panasonic +gangster +serega +brandy1 +asasas +25802580 +missy1 +colorado +jenny1 +microsoft +cowboy1 +909090 +1989 +sammy +jupiter +stanley +madonna +123456p +serena +valerie +superstar1 +legolas +groupd2013 +31415926 +dbrnjhbz +rocket +megan1 +airforce1 +apollo +3odi15ngxb +internet1 +westside1 +qwer123 +brooke1 +kelsey +pebbles +system +catdog +christina1 +flowers1 +passw0rd +sultan +icecream1 +bulldog1 +redneck1 +123457 +123987 +gizmo1 +johncena1 +danger +chichi +donkey +nfnmzyf +asdzxc +india +titanic +compaq1 +thebest +kirill +javier +hamster +myspace! +223344 +gangsta +packers +asdasd123 +pookie1 +hitman +kathleen +qwqwqw +cupcake1 +skittles +sports +coucou +frankie1 +p@ssw0rd +aaron1 +christmas +molly +casper1 +qti7zxh18u +blondie +football12 +smiley +snickers1 +lasvegas +sam123 +445566 +september1 +2222 +jayjay +basket +elena +ireland +110110 +123456789m +k123456 +tommy1 +jesus7 +madrid +marshall +vegeta +people1 +minecraft +terminator +security +drowssap +sparky1 +123456789z +19871987 +poiuytrewq +j12345 +pauline +jackson5 +jetaime +p@ssw0rd +ronnie +skippy +kimberly1 +rammstein +alexandre +scotland +nikki1 +rocky +asdfjkl: +motdepasse +stefan +celine +harrypotter +aaaaaaa +babydoll +manman +violet +dddddd +192837465 +pizza1 +legend +321654987 +iloveyou. +bella +truelove +harvey +tanner +runescape1 +fantasy +peter +casanova +friday +robbie +katrina +philips +spencer1 +francisco +cool123 +viktor +exigent +fluffy1 +qwertz +chocolat +christophe +phoenix1 +poiuyt +z +bambam +jesus777 +99999999 +1qaz1qaz +323232 +pussy69 +killer123 +rhbcnbyf +alejandra +muffin1 +kelly1 +stonecold +aurora +chivas +loser +gordon +love21 +gandalf +lalala1 +jasper1 +a1s2d3f4 +spanky +love10 +mitchell +g9l2d1fzpy +jack +babygirl2 +19851985 +welcome123 +franklin +russia +carpediem +aaaaaaaaaa +linked +zaq1xsw2 +megaparol12345 +travis1 +admin123 +daisy +lorena +froggy +smiles +douglas +handsome +shithead +1blood +tatiana +santos +little1 +anastasia +unicorn +5555 +12369874 +savannah1 +tinker1 +sweetie1 +jenny +diwtgm8492 +1234567q +super1 +margaret +viking +muhammad +maxwell1 +pppppp +sexyboy +phantom +fatboy +m12345 +tomtom +080808 +monica1 +ballin1 +eclipse +andres +elijah +maurice +piglet +baxter +123456654321 +pikachu +india123 +platinum +gangster1 +garcia +passport +jesuschrist +kelly +sandra1 +hotmail1 +mahalko +charmed +loving +272727 +corazon +katherine +michel +myspace12 +access +bunny1 +123321123 +wisdom +mozart +snowball1 +147147 +asdfghjkl: +patches1 +abcde +chloe1 +horses1 +d1lakiss +98765 +church +everton +12345m +nicola +peace1 +marcus1 +trouble1 +13579 +dylan1 +tinker +161616 +candy +69696969 +valentine +grace +sandy1 +hercules +123456f +beatrice +puppy1 +cooper1 +wolverine +12345s +mama +jamesbond +jamie1 +theman +anton +19841984 +toshiba +cthutq +maradona +emily +gibson +787878 +bingo1 +green123 +marcel +lolipop +maganda +penis1 +turtle1 +amsterdam +joanna +fashion +mercedes1 +yahoo.com +123000 +19861986 +britney +boston1 +goldfish +power +james123 +kitkat +network +lawrence +pass1 +112358 +beatles +winston1 +saibaba +princess2 +trevor +promise +norman +14789632 +hotdog1 +idontknow +hollywood1 +damian +star123 +123456y +diamonds +trinity1 +ihateyou1 +kkkkkk +cutiepie +soccer13 +bulldogs +felipe +yoyoyo +heaven1 +enigma +marion +angel12 +brian1 +jayden +germany +mario +onelove1 +369369 +soccer7 +casey1 +sasha +brother +matteo +max123 +melody +jimmy +success1 +simona +julien +hjvfirf +loveu2 +digital +english +reggie +shalom +power1 +einstein +forever21 +karate +135792468 +hello12 +bubble +nathalie +benfica +billy +spartak +hahahaha +harrison +timothy1 +mom123 +123456123 +danny +kingdom +poopoo1 +admin +gunner +ranger1 +1234asdf +anhyeuem +helena +sasha1 +buttercup +argentina +water1 +cocacola1 +polska +soccer123 +omsairam +saturn +hg0209 +manager +georgia1 +stephen1 +baller +282828 +forest +12345r +johncena +sweets +elaine +maryjane1 +dragonball +milano +stargate +colombia +brian +19891989 +captain +infinity +pandora +amelia +trfnthbyf +dianne +eagle1 +redskins +digital1 +sexybitch1 +general +pogiako +dinosaur +zidane +7894561230 +colt45 +spring +sureno13 +arnold +catdog1 +jesse1 +eugene +teddy1 +penelope +19921992 +runescape +paintball1 +little +blood1 +test1234 +summer08 +billy1 +nadine +myname +therock +rusty1 +fatboy1 +ciaociao +football2 +swimming +wesley +travel +telechargement +zxczxc +orlando1 +nonmember +grandma +password4 +654123 +tennis1 +shithead1 +denise1 +thuglife +bbbbbb +vrbgqns997 +nothing1 +nigga +asd +subaru +chacha +tequiero +moomoo +charly +penis +chopper +comeon11 +lacrosse +12345j +scoobydoo +butter1 +gracie1 +sadie1 +zxcv1234 +iverson +bowwow1 +123789456 +bullshit1 +020202 +faith1 +kitten1 +monique1 +pink +victor1 +wordpass +bullet +r123456 +duncan +a11111 +1qa2ws3ed +adrian1 +laura1 +thx1138 +russell +love15 +cutiepie1 +flatron +sebastian1 +gordon24 +sexygirl1 +123321q +ilovegod +asdf12 +pickle +mememe +mar +kristen +143143 +kittycat +420420 +bamboo +mylife +e123456 +walker +oscar +boobies +cleopatra +pascal +alaska +testing +dragons +?????? +19821982 +qwerty321 +pippo +porsche1 +perfect +password13 +hummer +justme +303030 +megaparol12345 +sammie +smile1 +19801980 +david123 +teddybear1 +baseball12 +blue12 +joker1 +dustin +katerina +cynthia +11112222 +mario1 +harry1 +qazwsx12 +fabian +samuel1 +fuckyou69 +cecilia +roland +2 +golfcourse +070707 +daddy +magic1 +313131 +alfred +martinez +elephant1 +2004 +fktrctq +katie +ass123 +yahoo +ilovejesus +l123456 +123456123456 +houston1 +allison1 +smoke420 +godzilla +bernard +ganesh +peterpan +mybaby +brutus +pitbull +buddy123 +iloveme2 +skittles1 +spurs1 +logan1 +x4ivyga51f +9-11-1961 +ciccio +pineapple +panthers +napoleon +chopper1 +honda +drummer1 +louise1 +holiday +11235813 +federico +music123 +houston +startrek +vincent1 +qazxswedc +alabama +mohammed +qwe12345 +cambiami +iloveyou3 +christine1 +gggggg +friendship +911911 +pa55w0rd +pokemon123 +mountain +boomer1 +steve +galina +12301230 +vfvjxrf +college +biteme1 +raymond1 +bitches +looking +bhf +bradley1 +packers1 +berlin +lindsay +linkin +isabella1 +hassan +hacker +booger1 +987456 +my3kids +scotty +storm1 +19831983 +martha +5211314 +123456789s +bigdog1 +catch22 +mariah +marco +catalina +wildcats +solomon +caramel +michigan +oicu812 +44444 +butthead +myspace. +13131313 +vampires +philip +amber +cheer1 +753159 +sunny1 +peewee +bob +charmed1 +change +hiphop1 +yourmom +mybaby1 +theman1 +strength +panther1 +tommy +badass1 +jjjjjj +cdtnkfyf +charlotte1 +barcelona1 +hardcore1 +bubba +1loveyou +pussycat +spitfire +myself +tnk0mk16vx +babygurl +qweasd123 +chanel +fender1 +howard +andreas +megan +bluebird +a123123 +123456987 +carolina1 +asdqwe123 +sexygirl +sandy +popeye +matt +ybrbnf +pickles +2012comeer +medicine +autumn +something +evelyn +misty1 +cutie +naruto123 +peter1 +soccer2 +maxime +miriam +10101010 +grace1 +fordf150 +asd123456 +ilovehim1 +moonlight +caprice +lonely +123098 +t123456 +skipper +damien +llllll +angel2 +10203040 +yfdbufnjh10305070 +spider1 +johnson1 +deejay +giulia +africa +joel +saints +bananas +bonita +password10 +tucker1 +rodrigo +runner +joanne +000 +567890 +archie +birthday +77777 +baseball2 +trixie +mark +789123 +dearbook +spike1 +19951995 +null +password0 +q1q1q1 +pimp123 +blackberry +lilwayne1 +king +maddog +sugar1 +linda +elvis1 +66666666 +the +ffffff +firebird +kermit +jake +phoebe +aaliyah +7758258 +123456n +alison +s12345 +22222 +s +123465 +salvador +barney1 +sexy101 +drpepper +melanie1 +miracle +aaa123 +c +mypassword +caitlin +wxcvbn +fred +harry +ironman +thebest1 +natasha1 +ferrari1 +fuku00198 +d +usa123 +lololo +102938 +pebbles1 +898989 +abigail1 +a111111 +thumper +familia +rfrfirf +spartan117 +chance1 +goober +2222222 +qwerty11 +brenda1 +monkeys +cassandra +aaron +2cute4u +darren +135246 +tiger123 +always +smokie +steve1 +freddie +nick +poopy1 +genesis1 +panget +guinness +chiara +athena +personal +alabama1 +jaimatadi +gators +israel +darkangel +ellie +evony192 +19881988 +smoke1 +knopka +hershey +budlight1 +peace +lovebug +alicia1 +pencil +mikey1 +a1a1a1 +predator +ka_djkhjsy6 +alejandro1 +torres +hayden +newport1 +montana1 +111111q +marcos +lvbnhbq +qwerty +bigdick +20102010 +chevy1 +fuckme69 +sporting +indonesia +fernanda +aezakmi +olivier +devil666 +147369 +pizza +aquarius +dragon123 +bonnie1 +kelsey1 +mexican1 +12qw23we +1234567890q +future +franco +vikings +rahasia +222333 +jayden1 +44444444 +diana +sunset +lovelife +love01 +theone +sample123 +b +penguin1 +lizzie +bearshare +denver +my3sons +remember1 +drummer +lorraine +12345d +aaliyah1 +lindsey +davide +scott +nemesis +blondie1 +mike123 +hector +holly1 +tarzan +jeremiah +brasil +badass +pimp +magnum +temp +boogie +death1 +connie +capricorn +12131415 +wrestling1 +private +potato +special +пїѕпїѕпїѕпїѕпїѕпїѕпїѕ +good +manuela +cherokee +florian +asdfasdf1 +kenneth1 +blablabla +sexy13 +lincoln +friend1 +sheila +christ1 +yvonne +minnie1 +turkey +dipset1 +yamaha1 +veronica1 +punk +summer09 +a1s2d3 +love09 +passer2011 +sex123 +kennedy +2hot4u +marine1 +maddie1 +cricket1 +nikki +selena +goldie +cooldude +giants +broncos +123qwerty +juliana +myspace3 +buddha +skateboard +sk84life +chloe +buttons +westlife +norte14 +lizard +kissme1 +111qqq +defender +dumbass1 +favour +shaggy +vampire1 +456654 +darkness1 +tequila +daniel123 +azerty123 +1984 +bball1 +assassin +testtest +youbye123 +samurai +dragons1 +sk8ter +505050 +hello2 +14531453 +penny1 +11111a +federica +marian +killa1 +dance1 +explorer +simple1 +ibrahim +death +matilda +dickhead +qwer12 +pioneer +ducati +babylove +formula1 +crazy +angel13 +janice +789654 +micheal +password9 +jayjay1 +hailey +wangyut2 +363636 +1987 +l +dfvgbh +marissa +gilbert +cheyenne1 +canada1 +f +faith +12345z +monkeys1 +dominique +tokiohotel +xxx +j +delete +miller1 +deedee +alexandra1 +cantik +1985 +kenny1 +12345k +mama123 +connor1 +antoine +papillon +111555 +123455 +dolphins1 +haha123 +123456h +babyblue +pitbull1 +emerald +1313 +love16 +miranda1 +343434 +beauty1 +fondoom +sebastien +hhhhhh +simon +teacher1 +monalisa +ekaterina +19941994 +larisa +hearts +jeffrey1 +sapphire +disney1 +england1 +alex12 +wolves +jamie +warren +surfer +subzero +gustavo +arizona +bear +puppies +freeman +19931993 +april +julia +1234567899 +vision +k +telefon +1myspace +jacob +pink12 +sydney1 +dragon12 +killer12 +theresa +agent007 +123456789j +getmoney +33333333 +picasso +idontknow1 +linda1 +morris +spooky +julius +336699 +design +camilla +wrestling +jamaica1 +racing +lucky123 +9999 +salvatore +loverboy1 +shanna +19901990 +fuck69 +pinky1 +panthers1 +snowman +brownie +lollipop1 +murphy1 +kkkkkkkk +random +hughes +1princess +death666 +shirley +321456 +cjkywt +roberta +digger +miguel1 +stefano +zoey101 +19811981 +dude +benson +money2 +sierra1 +jayson +sputnik +9999999999 +watermelon +iloveyou7 +654321a +alpha1 +special1 +valera +bambam1 +8888 +bluefish +525252 +american +voodoo +malibu +123456w +rabbit1 +dodgers1 +slayer1 +amore +carmen1 +april1 +money12 +frank +blahblah1 +poopie1 +123123q +050505 +dustin1 +elijah1 +cuddles +fucking +winter1 +ily123 +liliana +fuckit +scott1 +frank1 +abcde1 +karolina +shelly +bonbon +90210 +6666 +tigger2 +justice1 +1234566 +adidas1 +shadow12 +harmony +fuckit1 +deborah +qazwsxedcrfv +1lover +babydoll1 +sam +king123 +paloma +golden1 +bethany +pimp12 +julie +celeste +sachin +906090 +123456qwe +marines +bulldogs1 +hotrod +forget +369258147 +bollocks +daniele +gerald +dalejr88 +abcde12345 +132435 +mustafa +password00 +6hbf28w791 +kisses1 +broncos1 +sweetpea1 +ficken +kitty123 +buttercup1 +987456321 +alessia +dominik +zk.: +lilmama1 +kissmyass +mommy +stellina +123456asd +d12345 +dragonfly +karen +bitch12 +matrix1 +980099 +loser123 +dominic1 +password8 +lindsey1 +stinky +sublime +ronaldinho +volcom1 +asdasd1 +shit +summer07 +jacobs +garrett +hotstuff +smiley1 +qweqweqwe +gundam +24680 +19911991 +beckham +maison +blood5 +candy123 +0.00000000 +thegame +nightmare +water +235689 +best +bunny +ghjcnj +doggy1 +password69 +thailand +password22 +simpson +sexymama1 +raven1 +february +lala123 +stella1 +lovebug1 +viktoria +oooooo +newlife1 +josh +doggie +soccer3 +201301 +redwings +aspirine +tobias +pirate +badger +energy +charlene +adam +emilie +5678 +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +dickhead1 +letter +123456789k +master123 +dennis1 +n +geronimo +gregor +redneck +riley1 +beaver +atlanta +atlanta1 +dadada +mariam +funny1 +garden +545454 +country +mommy123 +james23 +mookie +electra +buffalo +curtis +xavier1 +scorpio1 +yousuck1 +god +barbara1 +justdoit +massimo +marley1 +pakistan1 +olga +122333 +ytrewq +19781978 +tatyana +josephine +1980 +qawsedrf +ladygaga +f123456 +singer +carrie +soccer9 +lover123 +yankees2 +popopo +godislove +cuteako +valencia +insanity +sk8ordie +molly123 +twins2 +creative1 +fountain +harold +driver +redskins1 +suckit +rose +3333 +mollie +poop12 +queen1 +kristen1 +dexter1 +bella123 +bitch2 ++++++++ +liberty1 +rolltide +madmax +german +dylan +jazzy1 +valentino +christmas1 +vanilla +connect +clowns +burrito +october1 +sunny +schalke04 +preston +prettygirl +tornado +panda1 +stacey +cloud9 +willie1 +sammy123 +pavilion +vacation +love08 +tottenham +5hsu75kpot +callie +broken +love143 +hey123 +coffee1 +2222222222 +fish +hihihi +usdopaa +fireball +yankee +privet +bobbob +shakira +soccer14 +noway +akopa123 +illinois +pantera1 +rockon +newcastle +samsam +daniels +kkkkkkk +shadow123 +drpepper1 +sexy11 +scarlett +season +gabby1 +cedric +teddy +melvin +avalon +a1b2c3d4e5 +321123 +usdopaa +lucas +12345679 +ashton +froggy1 +shamrock +tomcat +shawn1 +marius +simba1 +mariah1 +frances +eternity +12345b +vagina +volcom +wallace +goodboy +rosemary +marlon +lollypop +paris1 +bubble1 +rooster +topgun +sasasa +g123456 +psycho +patricia1 +332211 +warcraft1 +123456789d +gerard +qwerqwer +donkey1 +dick +young1 +dodgers +milena +canyon +magnet +kristin +blackie +sanane +1jesus +989898 +1945 +manuel1 +redrose +bacchus +linkedin +19791979 +zombie +01020304 +flores +poopie +phillip +area51 +taco +fatass1 +12 +gabrielle +holland +magnolia +784512 +naruto12 +314159 +666777 +budlight +1951 +fresh1 +tanner1 +chandler +1982 +hello! +11111q +maxmax +jellybean +soccer5 +paramore +romeo1 +stratfor +istanbul +john123 +4200 +ragnarok +goddess +sunflower1 +andromeda +dollar +redbull +sweety1 +cinderella +michael2 +mamama +mason1 +bigred +laguna +9999999 +warrior1 +november1 +rocker +dinamo +258258 +passion1 +lala +delfin +1022 +sasuke1 +blacky +marines1 +030303 +1234567890a +sanchez +annie1 +fuckme2 +tattoo +cool12 +hamilton +batista +2000 +galaxy +000111 +dillon +police1 +education +whitney +rosario +henry1 +porsche911 +bogdan +antonella +gregory1 +michigan1 +alessandra +cookie123 +cxfcnmt +99999 +yoyoyo1 +sunrise +copper1 +casablanca +vikings1 +20092009 +wilson1 +1988 +starcraft +vivian +enterprise +famous1 +ocpoook325 +lionking +marissa1 +samira +temppass +100100 +19751975 +lucifer +my2girls +a1a2a3 +rooney +patriots +zxasqw12 +qazwsxedc1 +ghbdtnbr +123456789l +sabina +fuckyou12 +isaiah +judith +respect +cme2012 +yahoo123 +reddog +chargers1 +yasmin +sparkle +passat +wayne1 +iluvu2 +aaron431 +brother1 +stanley1 +samara +simon1 +country1 +bettyboop +blazer +swordfish1 +1010 +nigeria +3333333 +info +theone1 +marketing +december1 +newport +dog +dorothy +karen1 +p123456 +amores +boobies1 +alice +hola +chris12 +leonard +spam +catherine1 +98765432 +sobaka +julian1 +kent +ricky1 +kittycat1 +patriots1 +manson +hershey1 +outlaw +sidney +1qa2ws +dance +johanna +monkey7 +family5 +998877 +holly +stratus +moomoo1 +sara +holden +monkey11 +anything +bluesky +blueeyes +kurt +samson1 +perfect1 +carter1 +1979 +willow1 +andreea +000001 +twinkle +123456789p +carlitos +coconut +haha +scoobydoo1 +lester +skyline1 +roxanne +madeline +rosie1 +fucky0u +south13 +douglas1 +butterfly2 +pisces +bentley +blackjack +122001 +mamamia +newton +bigdick1 +19961996 +redhead +hotties +mahal +boubou +corona +baby13 +peewee1 +micheal1 +baseball7 +desiree +wow12345 +gogogo +caroline1 +dupont +shane1 +hongkong +b12345 +pickles1 +ticket +marilyn +space1 +bobmarley +classic +wonderful +qwe123qwe +ethan1 +1q2w3e4 +widget +zvezda +laptop +kevin123 +thuglife1 +youngmoney +underground +indiana +w123456 +acmilan +hailey1 +smile123 +224466 +1983 +7777777777 +4321 +tripper +yomama1 +red +fireman +renata +billabong +777888 +annette +bernie +++++++++ +blossom +chase1 +williams1 +football10 +lakshmi +joe123 +makaveli +456321 +almond +ninja1 +sugar +panda +sigma +love24 +burton +google123 +clifford +pepito +daddysgirl +morena +stormy +1357924680 +cartman +kristine +nikola +washington +freckles +bishop +trigger +1q2w3e4r5 +hendrix +password23 +tristan1 +cracker +detroit +beatriz +lilwayne +oblivion +giovanna +spike +gizmo +germany1 +fortuna +paul +kayla +callum +maverick1 +parker1 +soccer4 +bscirc +alfredo +lisa +bettyboop1 +divine +sister1 +coupons +megaman +353535 +poison +broken1 +myspace.co +juggalo1 +star12 +blah +blue13 +blowme +060606 +markus +jeter2 +coming +starfish +welcome1 +toronto +sandrine +amigos +ronnie1 +telephone +jordan12 +thankyou +renee1 +stardust +chubby +billybob +258369 +armando +skywalker +rebel1 +freddy1 +snowman1 +babies +lindsay1 +montreal +herman +jesse +777 +hotboy1 +jester +ncc1701d +football7 +alladin79 +mierda +k12345 +heyhey1 +random1 +1977 +peugeot +monkey3 +333666 +cassidy +mandy1 +therock1 +myspace7 +albert1 +arianna +casey +max +savage +just4fun +mate1 +20082008 +hernandez +spiderman3 +horse1 +marianne +apollo13 +paintball +katherine1 +789987 +azerty1 +fucklove1 +godbless +mobile +baseball3 +robinson +munchkin +hayley +000000a +eeyore +1asshole +ronaldo9 +punkrock +icehouse +skeeter +sharp +serenity1 +brownie1 +everton1 +chemistry +joejoe +292929 +gothic +paris +warcraft3 +ireland1 +sergei +missy +bubblegum1 +hotstuff1 +mykids +claudia1 +gators1 +1981 +hookem +jrcfyf +12345qwe +griffin +kaktus +dietcoke +asdfg123 +bitch69 +cashmoney +cashmoney1 +steaua +brazil +1236987 +jack123 +ilove1 +snuggles +snowflake +martini +entropy +bubblegum +1q2w3e4r5t6y7u8i9o0p +piazza +deftones +longhorns1 +123456789o +aobo2010 +redrum +kaylee +nicole12 +damilola +christy +aol123 +marlboro1 +loveme123 +callofduty +michaela +pegasus +bluemoon +tony +flipper +sheena +omg123 +spanky1 +marshall1 +michael +eric +192837 +catfish +bruno +superman12 +please1 +jerry1 +juliette +521521 +garfield1 +iloveyou +artist +something1 +birdie +mouse1 +carson +blueberry +warriors +tyson1 +1122 +polniypizdec110211 +12345abc +september2 +millie1 +speedy1 +cheater1 +sexxxy +wicked +claudio +cracker1 +mackenzie +19761976 +unknown +sanjay +michal +trevor1 +janine +lancer +great1 +brandi +5xfgs3ii9d +stefania +sommer +arizona1 +paddle +love18 +superman2 +1978 +y6p67ftrqj +timmy1 +hanuman +universal +monkey13 +hammer1 +jojo +lighthouse +password6 +rock +coco +marcelo +656565 +pop123 +rosebud1 +angelito +dalton +testpass +rocky123 +winner1 +kingston +bozo +esperanza +roscoe +cat +andre +singapore +scrappy1 +skyhawk +rjntyjr +rayray1 +doodle +rocknroll +magdalena +jordan123 +boxcar +rajesh +cougar +thumper1 +slayer666 +braves +yolanda +1234qwe +fake123 +enrique +n123456 +service +rrrrrr +cubs +allah1 +helpme1 +love07 +black123 +flamingo +tester1 +pinky +linkedin1 +rastaman +extreme +dkflbvbh +blizzard +baseball11 +1qwert +antonia +soulmate +112211 +sharon1 +qwertyqwerty +skate4life +1babygirl +incubus +office +point +marisa +gjkbyf +ramona +***** +alexia +butthead1 +kolobok +fellow +bastard +raquel +buffy1 +derrick +jeanne +nuttertools +blackcat +cynthia1 +iforgot +369258 +19731973 +momdad +yomama +mememe1 +my2kids +godfather +zxzxzx +elvis +mamita +1990 +sexy14 +banane +maximus1 +123456789123 +ironmaiden +1991 +geheim +lkjhgfdsa +mister +fatcat +semperfi +qwerty2 +coolio +mommy2 +angel7 +sassy +elodie +richie +mendoza +3 +pastor +tasha1 +lane +revolution +fisher +santana +whitney1 +as123456 +indigo +purple12 +ilovehim +account +angie1 +rascal1 +leslie1 +225588 +colombia1 +poppy1 +soccer15 +raptor +maria123 +wicked1 +jay123 +cccccc +hilary +fiesta +baseball10 +maxine +t +1a2s3d4f +felicia +toyota1 +ilove +111aaa +amour +motherlode +12qwas +1monkey +clover +debbie1 +shopping1 +nks230kjs82 +galatasaray +123456as +milan +just4me +dreamer1 +sexybitch +golf +kaitlyn +camero1 +priyanka +tyler123 +fashion1 +tootsie +powers +rfnthbyf +praise +target +ricardo1 +rayray +c12345 +babygirl13 +112233445566 +ashley12 +biscuit +princess10 +evolution +pwd1234 +romain +trooper +webhompass +blonde +23232323 +preston1 +lightning +bianca1 +rbhbkk +felix +skiffy +alejandra1 +ivanov +westham +sports1 +wildcats1 +princesse +lollol1 +olamide +585858 +alexandru +tttttt +champion1 +yugioh +research +12345c +88888 +cutie123 +pokemon12 +number2 +nichole1 +lilly1 +animal1 +ashley123 +animals +johnjohn +labrador +g-unit +nathaniel +paulina +dingdong +12345g +smallville +lavender +annie +boricua1 +jakarta +12345l +imissyou +19771977 +hitler +sonic1 +vagina1 +love12345 +susana +gladiator +january1 +rodney +russell1 +qqqqqqqq +sweetness +moose1 +handball +quentin +scruffy +jojo123 +1976 +playstation +mauricio +gemini1 +marijuana +justinbieber +lovelove1 +twister +anamaria +daniel12 +moloko +19971997 +zk. +classof09 +ibanez +techno +my2boys +redred +simpsons1 +ariana +chipper +sammie1 +ingrid +azsxdc +eastside1 +family4 +monkey22 +sherry +12345678q +windows1 +suckit1 +alessio +hobbit +bananas1 +dave +papamama +suzanne +987654321a +danilo +aragorn +warhammer +casino +hottie101 +kaitlyn1 +naughty +nick123 +derrick1 +trinidad +123love +joker +25252525 +baseball5 +daddy123 +unreal +henry +xxxxxx1 +oceane +laurent +carebear +anthony2 +dusty1 +12345671 +pinkfloyd +raphael +nicole123 +jason123 +reggie1 +pizza123 +zxcasdqwe +bigred1 +esmeralda +street +stewart +1975 +monday1 +pickle1 +immortal +000000000 +iceman1 +andy +truelove1 +allen1 +panzer +gabriella +hehehe +atlantis +beatles1 +gibson1 +larry1 +spartan +katana +123456v +shane +girls +power123 +zeppelin +vincenzo +julia1 +vaffanculo +metal666 +surfing +happy2 +369852 +mission +qwe123456 +hornet +jerry +football11 +darwin +virgin +asddsa +cadillac +corvette1 +mary +diana1 +garrett1 +123456789987654321 +loveless +scrappy +applepie +aurelie +radiohead +heyhey +zxcvbn1 +snowboard +123456qw +counter +brown1 +frederic +private1 +babycakes1 +insane +rodriguez +stinky1 +believe +19741974 +larissa +1234abc +godisgreat +inlove +youtube +1fr2rfq7xl +julie1 +puppies1 +sexy01 +hayden1 +diablo2 +111213 +scarlet +logan +aaaa1111 +soccer22 +6666666 +maprchem56458 +baller23 +424242 +wedding +cheryl +kittykat +michael123 +sophia1 +randy1 +teresa1 +nintendo1 +valerie1 +wonder +sublime1 +arturo +coolman +weed +bowling +gabriele +eleven11 +harris +monitor +watson +asshole2 +esteban +qqqqqq1 +robbie1 +lolo +logitech1 +flying +hallo1 +pepsi +sherlock +iloveyou13 +pineapple1 +1992 +fuck12 +skate +iloveyou22 +smith +roman +qweasdzxc123 +vfhecz +clement +pamela1 +marianna +fireman1 +autumn1 +jajaja +baby11 +money6 +man +hannah123 +caitlin1 +granny +zxcvbnm,./ +kenshin +qwertyuio +cindy +rough +w1985a +peter123 +australia1 +gorgeous +what +pasaway +dthjybrf +clayton +angelica1 +mathew +justin123 +fuckyou3 +787898 +nascar1 +pancho +anderson1 +denis +r +sandman +888999 +unknown +sampson +emma +poopy +blake1 +chrissy +verbatim +phantom1 +wildcat +tdutybq +nugget +w1980a +trisha +jakjak +breanna1 +myspace11 +frosty +asterix +2468 +cindy1 +alibaba +monkey5 +skorpion +maureen +motherfucker +jumpman23 +apache +chico1 +kickass +graham +wwe123 +vfrcbvrf +sprite +babyko +riccardo +asdf3423 +123456789123456789 +paige1 +homer1 +andre1 +gagged +rockon1 +drowssap1 +coyote +ernesto +colleen +jose123 +sunshine2 +808080 +pornstar +qwerty6 +purple123 +lasvegas1 +habibi +nana +fuckyou. +brendan +empire +marlene +enter +5532361cnjqrf +123456789b +fernando1 +sarah123 +w1979a +sooners1 +love17 +rusty +voyager +madman +iloveyou14 +258963 +romance +heart +smudge +college1 +cotton +1974 +password21 +horse +wolfgang +armani +detroit1 +irish1 +nevermind +secret666 +football9 +23456789 +collins +a801016 +miamor +ghetto1 +angelina1 +vfksirf +dixie1 +inferno +juliet +highheel +chrisbrown +z1x2c3 +w1990a +123567 +theking +bethany1 +a23456 +kelvin +bowwow +fire +abhishek +1a1a1a +norton +ultimate +jersey +retard1 +bryan1 +tester +fighter +backspace +osiris +987987 +zaqxsw +disturbed1 +francis1 +kaiser +f00tball +control +1a2b3c4d5e +carebear1 +gbpltw +spiderman2 +free +robin +mitchell1 +polaris +katrina1 +iloveyou4 +ericsson +gonzalez +bigman +134679852 +sexyboy1 +airforce +awful +campbell +chevrolet +babyface +jojojo +aleksandra +haley1 +1598753 +w1989a +jungle +cookie12 +soccer17 +car +deepak +hawaii50 +xyz123 +romashka +jillian +mermaid +cassidy1 +qwertyuiop[] +ninja +donald1 +whore1 +irina +jellybean1 +ghost1 +boobs +carole +24682468 +devils +200000 +francois +football3 +hakr +123456ab +halloween +axio +morrison +blaze1 +cactus +global +motocross +111000 +abraham +chevelle +sarita +fucklove +h123456 +skolko +iloveyou11 +princess13 +1020304050 +unicorn1 +vladik +hunting1 +kenny +blue1234 +buttons1 +lucas1 +415263 +162534 +princess11 +soccer8 +pyon +soldier +sandiego +halo123 +southpark +sentnece +1973 +erika +america10 +schatz +london12 +anjali +aditya +emilia +laurence +daisy123 +1million +moreno +ash123 +kissmyass1 +phone +austin316 +prayer +elvira +q123456789 +nature +bryan +universe +aztnm +hola123 +1969 +master12 +diego +doggie1 +h +pk3x7w9w +romeo +starlight +toulouse +richmond +86 +desire +cinnamon +holiday1 +allstar +mexico13 +punkin +puppy +hunting +isaiah1 +airborne +w1982a +charlie2 +w1984a +viper1 +steph1 +raven +patience +university +147741 +nokia1 +1993 +keyboard +mastermind +jonas1 +kucing +kramer +delpiero +lestat +unique +farmer +phillip1 +action +adriana1 +qwe321 +noodles +britney1 +abcdefghij +carina +xxxxx +crazy123 +boogie1 +window +2cool4u +renault +hawaii1 +passwort1 +hamster1 +rocker1 +merlin1 +jesusislord +33333 +sayangku +castle +football5 +d71lwz9zjs +virginia1 +rocket1 +ganteng +emanuel +thegame1 +flower123 +angel01 +lennon +house1 +purple2 +baxter1 +timber +cuddles1 +xxxxxxxx +letmein2 +ktyjxrf +yankee1 +joey +25251325 +w1986a +justin12 +14344 +sabine +my +jesus12 +cheese123 +whynot +1angel +jefferson +nnnnnn +iloveyou5 +meghan +aliali +stars +sexylady +12345678900 +eleonora +iloveyou123 +fucku +jeremiah1 +nichole +r2d2c3po +qazwsxedc123 +mamamama +malcolm +kiki +franklin1 +w1988a +xxxx +raider +sucker +kathryn +malina +backend +lover12 +angel11 +sexy15 +bobcat +uvgx8f8232 +1994 +a1a2a3a4 +emilio +7 +iamthebest +jessica123 +1314521 +makayla1 +slimshady +ghetto +nellie +reaper +stephane +tomato +bruno1 +faggot1 +794613 +amorcito +aspire +cheche +treasure +family6 +cannabis +house +babygirl10 +calvin1 +sirius +wordpass1 +titans +я +rockyou +assass +sandeep +maestro +metal1 +salman +walter1 +123ewq +vodafone +pirates +alisha +mushroom +love33 +jesucristo +rebelde + +stuart +deedee1 +w1983a +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +deniska +babyblue1 +mouse +taekwondo +amelie +kotenok +cheval +messi10 +naughty1 +billabong1 +peanuts +9 +hottie12 +kennedy1 +webster +lonely1 +giants1 +hannah12 +philippe +345678 +malika +goldfish1 +chantal +natalya +president +firefly +baseball13 +charity +1000000 +amazing +168168 +netlog +w1975a +southside +james007 +a123456 +scruffy1 +deathnote +skate123 +princess3 +catcat +maurice1 +chrissy1 +nokia6300 +princess7 +lucy +hottie123 +faithful +556677 +kingkong1 +theking1 +suckme +nicolas1 +helene +lawyer +agnieszka +history +12345678901 +lillian +w1987a +qqqqq1 +mississippi +1995 +love123456 +united1 +vietnam +marvin1 +dudley +kristin1 +opensesame +mexican +1andonly +rebelde1 +jake123 +19721972 +guadalupe +blackie1 +captain1 +1230 +rambler +father1 +pearljam +soledad +angel3 +mimi +newcastle1 +hermione +qweewq +babyboo1 +rochelle +hudson +simba +melinda +national +falcons1 +franky +spunky +summer06 +dating +pimp101 +taytay1 +landon +sailor +kamikaze +543210 +pingpong +corey1 +chevy +dracula +pussy123 +hunter12 +indiana1 +soccer21 +calimero +myspace13 +granny1 +brittney +saints1 +southpark1 +boomboom +rfhbyf +jessica2 +nelson1 +seattle +gandako +misty +oxford +adriano +1a2s3d +1234568 +dan +games +viewsonic +mike12 +download +marcela +big +abc123 +skippy1 +w1981a +angeles +qqq123 +yamahar1 +herbert +colorado1 +w1978a +diablo1 +forgot +jocelyn +1234569 +diesel1 +121212a +jackass2 +fenerbahce +pentium +svetik +castillo +1qaz +sylvia +159632 +littleman1 +renato +g +renegade +noodle +whiskey +international +juggalo +ironman1 +felix1 +amadeus +american1 +freaky1 +microlab +sally1 +676767 +bonjovi +erica1 +ivan +trumpet1 +dumbass +devin1 +teamo1 +victory1 +3rjs1la2qe +redman +sexy23 +mnbvcxz1 +shadow2 +daniela1 +summer12 +killbill +annabelle +penny +palermo +charlie123 +ihateyou2 +beverly +megane +hellfire +nursing +claude +yousuck +eclipse1 +ryan123 +hearts1 +jordan2 +friday13 +shelly1 +sharks +information +lover2 +12345678s +skipper1 +ashleigh +8 +love4u +teamo +horny +vfvekz +interests +qwertyu1 +justme1 +6543210 +betty1 +cosmos +bridget +beyonce +gunner1 +home +luckydog +man123 +freaky +w1976a +rosita +marie123 +ab123456 +tyrone +mohammad +onepiece +r12345 +friends2 +billie +bronco +princess01 +password1234 +789654123 +1972 +kasper +153624 +panama +manolo +natalia1 +moose +romania +foster +123456789c +babylon5 +kyle +sexylady1 +redhead1 +2323 +guest +caesar +wombat +d9zufqd92n +nicole2 +alpha +dallas214 +ilovemymom +jobsearch +discovery +abdullah +route66 +blowjob +nissan1 +jenna1 +darius +myspace5 +savage1 +chiquita +bitch! +135791 +qweqwe123 +blue11 +qwertyuio1 +qwert12 +ali123 +chipie +666888 +vitalik +batista1 +15426378 +kiss +vanille +wesley1 +tarheels +wolfpack +andrew12 +shadow13 +dolores +19981998 +dirtbike1 +august1 +goodman +felicidade +rhfcjnrf +classof08 +123456789r +football21 +anita +123456789t +t12345 +deadman +asdqwe +1zn6fpn01x +3girls +123456qq +arschloch +guillaume +leticia +hobbes +2005 +elisabeth +woody1 +belinda +payton +seven +golfer1 +shiloh +w1977a +jeff +doraemon +aleksey +western +squirrel +blood +sparta +mirage +werewolf +lampard +skeeter1 +madonna1 +mittens +soccer23 +momdad1 +lucas123 +123mudar +ricky +inside +dude123 +mikey +sampson1 +devil +lincoln1 +pass1word +dominique1 +emo123 +white1 +1family +sadie +eddie +junjun +terry1 +killer2 +thanks +batman123 +lacoste +pimp69 +babygirl3 +asd456 +pompier +memory +rommel +nascar24 +alenka +allstar1 +hot123 +alex1234 +andrew123 +cassandra1 +honeybee +lilman1 +inlove1 +enter1 +murray +darkside +winnie1 +kittens +ciao +million +trucker1 +texas +rooster1 +akax89wn +qwert6 +kinder +kaylee1 +oscar123 +gerrard8 +ashton1 +brandi1 +hotgirl1 +javier1 +luciano +2121 +karina1 +marathon +hello1234 +matias +hottie2 +libertad +shutup +louloute +zxcvbnm: +asdfgh123 +freak1 +password123 +3rjs5la8qe +g13916055158 +sweetness1 +manutd1 +zxcvb +vladislav +bleach +strong +cellphone1 +ssyu1314 +lovehurts1 +hi +blue42 +science +miami305 +coco123 +lovingyou +babycakes +princess! +rachael +lilian +etoile +leanne +dfkthbz +3children +monkey69 +soccer16 +audia4 +damian1 +karachi +elliott +memphis +120120 +football22 +falcon1 +v123456 +sherman +swimming1 +again1 +123qwe123 +alberto1 +krystal +chicken2 +258852 +eunice +chandra +chichi1 +mathilde +heart1 +sandro +jacqueline +tonton +vfvfgfgf +nutella +jehovah +2girls +josh123 +james12 +violeta +a000000 +fallen +goober1 +q1q2q3 +domenico +leelee +azsxdcfv +ji394su3 +kristina1 +fernandez +p4ssw0rd +michael12 +jobs +farfalla +odessa +chris2 +kamila +soccer6 +chocolate2 +132456 +michele1 +alfonso +maxima +manman1 +gloria1 +island +johndeere +my3girls +fussball +qarglr123 +963258 +4 +joyjoy +money5 +12qw34er +ronaldo1 +gerrard +green12 +boo123 +scotland1 +001122 +angie +loveme12 +newjob +sexy21 +lacrosse1 +turkey1 +peace123 +bigfoot +sunshine12 +catfish1 +foxpass +пїѕпїѕпїѕпїѕпїѕ +1230123 +5 +iloveu123 +474747 +jean +roberto1 +123qwer +6v21wbgad +2sexy4u +layouts1 +fuckyou7 +airplane +volume +thompson +verizon1 +nightmare1 +dalejr8 +pothead1 +attila +china1 +robin1 +danny123 +temppassword +sasha123 +cute +krystal1 +corona1 +porkchop +change1 +king12 +timmy +eileen +ganda +sayang1 +mathieu +angel5 +misiek +kokoko +melina +nopassword +regina1 +mama12 +milton +dawson +qwertyuiop1 +dancing +shooter +singer1 +qwerty +badgirl +mymother +designer +macmac +camaro1 +anubis +000007 +nikolas +nancy +papa +alexandr +cheater +elizabeth2 +hamlet +janjan +12345abcde +toshiba1 +potter1 +hooters +maiden +drjynfrnt +alex13 +adgjmp +motorola1 +peyton +01234567 +jonjon +monkey! +makayla +tacobell1 +ilovemyself +patata +marjorie +amandine +bullet1 +fktrcfylhf +harvey1 +elliot +sk8board +carlos123 +fallen1 +ashlee +behappy +emily123 +bobby123 +newpass +hunter123 +desiree1 +malaysia +tigger12 +erica +omni +ass +12345e +fuckthis1 +nancy1 +flames +goodgirl ++++++++++ +manunited +qqqq +123450 +eduardo1 +salome +12345p +chosen1 +1234567890- +112112 +kakashi +blonde1 +curtis1 +waheguru +q +123456x +xiang123456 +myspace01 +theresa1 +platinum1 +eagle +priscilla +poppop +pedro +kendall +love45 +chargers +babylove1 +loving1 +baby01 +rolltide1 +polniypizdec1102 +attitude +newman +flamengo +diamonds1 +project1 +nascar88 +nina +ramirez +losangeles +chronic +gladys +5150 +poisson +marina1 +jasmin1 +kendra +socrates +dwade3 +salvation +wachtwoord +cristiano +doggy +iubire +inter +spongebob2 +killme +464646 +hellohello +ilikepie +figaro +thomas123 +paula +admin1 +player69 +kayleigh +moimoi +brittney1 +qqqqqqq +rose123 +danila +syncmaster +viper +mnbvcx +leo123 +fuckfuck +lourdes +champ1 +mario123 +sweet123 +loveya +presario +freddie1 +breanna +facebook1 +amerika +john12 +steph +express +cartman1 +1qaz!qaz +dodge1 +password14 +qwedsa +linkedin123 +kingdom1 +loser12 +heckfy +pangit +amber123 +happy12 +polska1 +skyler +school123 +fatty1 +yasmine +honey123 +alina +nounours +brucelee +357159 +qwerty123 +cookie2 +larry +digimon +insane1 +tazmania +jacob123 +hell666 +fu7u4a#$$$ +professional +wanker +321321321 +fitness +963963 +8888888888 +wow123 +mookie1 +69camaro +opeyemi +eh1k9oh335 +cheetah +eeeeee +surfing1 +freestyle +nokia123 +m123456789 +pontiac +oracle +member +pacman +tuning +converse +jerome1 +qdujvyg5sxa +caleb1 +xxx123 +sally +poland +nguyen +11221122 +shotgun +hernandez1 +booty1 +girls1 +doberman +poppy +fuckoff! +keith1 +geraldine +placebo +http +dodger +beavis +futbol +sexy10 +lupita +search +castro +lovelife1 +eastside ++++++ +caramelo +kristi +z1x2c3v4 +24681012 +central +lilly +abcdef123 +whocares +l12345 +johannes +636363 +lexmark +microsoft1 +emerson +marika +sissy1 +757575 +tony123 +dante1 +playa1 +vvvvvv +walker1 +040404 +ziggy1 +bitch101 +voiture +candice +201314 +virginie +martine +chicco +hector1 +honesty +snake1 +cardinal +mylife1 +2112 +homer +bangladesh +pasword +church1 +sailing +milagros +122002 +babygirl11 +sexymama +anaconda +sniper1 +mexico123 +planet +topolino +110092 +12345f +rock123 +hariom +dragon2 +samsung123 +musique +lollypop1 +lionel +coupon +mamma +shasta +ashley2 +sexy16 +aa123456 +maryam +lobster +laurie +dragon13 +musicman +bintang +sesame +bomber +a654321 +jessica12 +baseball9 +abracadabra +555777 +general1 +scotty1 +xander +1357911 +20002000 +daniel +gotohell +benny1 +bill +porter +boots1 +nofear +gianni +stars1 +delphine +18atcskd2w +1996 +racecar +tacobell +love19 +yfdbufnjh63 +angel10 +summer123 +333 +1q2w3e4r5t6y7u +bigboss +omg199 +gonzales +oklahoma +student1 +taylor12 +anthony123 +smooth +bigtits +whiskers +testing123 +1970 +vfczyz +nounou +safety +walmart1 +ilovesex +123aaa +darkstar +sylvester +myfamily +alfaromeo +betty +wolf +excalibur +969696 +juanita +badgirl1 +myspace4 +0102030405 +laetitia +zxcasd +blue32 +velvet +trunks +19071907 +tabitha +555 +queen +harrison1 +trumpet +buster123 +morgane +celtic1 +tammy1 +coolio1 +password99 +bright +buckeyes +car123 +littleman +7ugd5hip2j +whatthezor +marta +donna1 +kitkat1 +summertime +star69 +abcabc +library +debora +ganesha +741258 +dream +messenger +snowflake1 +simone1 +katelyn +amanda123 +solnce +quincy +love4life +jesus2 +yoyo +wrangler +katie123 +carolyn +martinez1 +wanted +paradise1 +111112 +lovers2 +cintaku +c43qpul5rz +rctybz +love25 +leopard +qwe1122334 +selena1 +sexy22 +suresh +111333 +buffalo1 +kim123 +openup +armagedon +radio +london123 +lovehurts +party1 +manish +wendy1 +zxcvb1 +kirsten +baby14 +mersedes +megadeth +okokok +gerard1 +familyguy1 +lizzie1 +monamour +allen +trombone +prodigy +frogger +water123 +vanilla1 +cartoon +carrot +101112 +123456781 +gsxr1000 +1971 +beyonce1 +surfer1 +cm6e7aumn9 +martha1 +roadrunner +satellite +landon1 +123456a +piglet1 +hellboy +smile4me +gunners +angel101 +lee123 +stoner420 +happiness1 +harmony1 +brandon2 +abcd12 +eleanor +baseball8 +pupsik +love88 +komputer +joseluis +layout1 +1truelove +electric +rambo1 +carla +sundance +shaman +bigman1 +aussie +godisgood1 +marino +love20 +demon1 +freebird +beast1 +fuckoff2 +jazmin +pakistan123 +moocow +smackdown +monaco +ihateu +matt123 +shaggy1 +nickjonas1 +cutie12 +19691969 +12345654321 +blah123 +briana +marisol +firefox +business1 +ismail +dangerous +kisskiss +ben +mandy +snakes +marcin +register +p0o9i8u7 +nokian73 +rachelle +bhbirf +8ix6s1fceh +shadow11 +groovy +margot +isabel1 +wolverine1 +easy123 +anakin +tangkai +squirt +thankgod +insert +thomas12 +teiubesc +friday1 +jennie +fredfred +trabajo +conner +4runner +garcia1 +miley1 +james2 +ballet + +brigitte +baker3 +ethan +oakland1 +maroon5 +rootbeer +asshole123 +ashish +jeanette +2525 +tottenham1 +lakers8 +dfktynbyf +carmela +ford +packers4 +iw14fi9jxl +weezer +20012001 +jose +mackenzie1 +summer11 +ramses +glitter +angelika +goblue +heslo +theboss +mystery +career +voyager1 +sonia +bobbie +love77 +sahara +kathleen1 +deanna +stevie +sascha +hotrod1 +ilovegod1 +hummer1 +sofia +lowrider +mammamia +melisa +welcome2 +moscow +66666 +raider1 +lola +iloveher1 +momof3 +i +parola12 +pikachu1 +imagine +gianluca +369852147 +2002 +snake +akatsuki +ronald1 +stranger +a123456a +mattie +whatsup +white +bryant +ramesh +dogdog +giggles +aaa123123 +chucky +dima +omega1 +852963 +billybob1 +qazzaq +filippo +computer12 +sparkle1 +anastasiya +chandler1 +rebound1 +babybaby +qwerasdfzxcv +zxcv123 +senha123 +sunday1 +alex11 +wassup +qwertyuiop123 +bentley1 +robert123 +yellow12 +kicker +falcons +lorenzo1 +tina +alvaro +asd12345 +married +blasted1 +darren1 +daredevil +bingo +spanish +ernest +kikeunyw +vectra +madness +1234qw +happyday +beagle +rainbow6 +claire1 +jericho +butterfly7 +supernova +maman +ilovemom +morpheus +dandan +linkedin +miami1 +rfrnec +emmanuel1 +kangaroo +football23 +ntktajy +neptune +accord +carol +sexsexsex +tigger123 +sailormoon +metal +cooldude1 +philly1 +patrik +bangalore +hotboy +strike +brooks +nobody +famous +alice1 +878787 +guardian +soldier1 +mine +cecile +becky1 +freak +smart1 +m +desmond +simran +me1234 +gameboy +clarence +sonic +q1234567 +running +alexandria +amanda12 +2580 +buster12 +369963 +derek1 +joshua12 +blueberry1 +standard +arlene +marijuana1 +omarion1 +zzzzzzz +evangelion +fantasy1 +amazing1 +iloveyou8 +crazy8 +poop11 +hamburg +kathy1 +scania +dragonballz +trigger1 +capslock +yvette +ultima +adam12 +hitman1 +viphv5j736 +me +kakashka +giorgio +escape +456 +sean +chargers21 +cats +lalalala +dublin +qweasdzxc1 +thomas +purple7 +ghost +hannibal +gameover +fuck11 +clayton1 +pas +suckmydick +999666 +penguins +trixie1 +moneymaker +shelley +sharma +oleg +last.fm +stacey1 +jenny123 +million2 +camera +oranges +qwerty13 +ramones +courage +mateusz +junebug +9876543 +cristal +****** +pink11 +mongoose +pyramid +carrie1 +johndeere1 +myangel +1999 +000webhost +smith1 +shirley1 +mumbai +cooler +cfitymrf +wasser +mylove123 +172839 +estrella1 +wolves1 +clinton +8888888 +redhot +loveu1 +welcome12 +caterina +randy +philly +enrico +asdfg12345 +654654 +ace123 +juicy1 +mother123 +3333333333 +bubba123 +q2w3e4r5 +dannyboy +sergio1 +19701970 +salope +pa +zipper +1966 +michelle12 +anarchy +koshka +roger1 +1231234 +benny +nelly1 +westham1 +biggie +lesbian +pooper +charger +angel14 +security1 +movies +sameer +13243546 +kentucky +delta1 +queenie +matematica +sexy1234 +.adgjm +125125 +juanito +danger1 +coldplay +lokomotiv +michael7 +schalke +collin +alonso +namaste +ilovemom1 +iforgot1 +mommy3 +babyphat1 +159263 +monopoly +mazda626 +741963 +cherry123 +flash1 +funny +z12345 +stingray +200 +katarina +bonita1 +fuckyou13 +++ +1968 +univers2l +patriot +014789 +trinity3 +nintendo64 +tom +goblin +patrick +jeffhardy1 +1qazwsx +bernardo +valentine1 +qweasd1 +santosh +batman12 +medina +1z2x3c +retard +snowboard1 +blackdog +backspace1 +dorian +algerie +hendrix1 +bushido +asdfgh12 +bitchy1 +v +joe +leavemealone +marino13 +lonewolf +flyers +aubrey +swimmer +sakura1 +moneyman1 +mickeymouse +cristo +sooners +jesusis1 +myspace08 +momma1 +2fast4u +donnie +jimbob +baby1234 +01230123 +cucciolo +umbrella +louis +6666666666 +denver1 +diego1 +123456o +20202020 +tracey +goodbye +686868 +abc123abc +god123 +12qw12qw +killer7 +katelyn1 +110 +rodney1 +megaman1 +anthony12 +knight1 +575757 +fletcher +bitch13 +hellothere +soccer18 +yellow123 +lol12345 +love06 +angelo1 +kickass1 +trance +iloveu! +king23 +hello5 +margaret1 +christy1 +guigui +nonono +fuckyou666 +hello11 +122112 +summer69 +vfhufhbnf +741741 +joker123 +goldberg +kristian +angel22 +bball23 +love99 +ana123 +donovan +morales +magic123 +858585 +zxcvbnm, +22446688 +paladin +brutus1 +brown +vitoria +kendra1 +belle +515151 +buffy +2001 +rupert +barsik +wutang +jordan11 +software +madina +woodstock +dalton1 +my3boys +bigmac +dondon +mattia +punisher +rosie +sisters +000123 +11 +hayley1 +cheese12 +playboy69 +none +waters +987321 +trucker +football13 +poodle +dan123 +jimmy123 +gilbert1 +godzilla1 +baby08 +bubbles2 +angelique +antony +baseball4 +callie1 +147963 +machine +lilmama +adam123 +shawn +manisha +girl +mountain1 +1997 +tractor +fortune +houston713 +windows7 +primavera +madden +piggy1 +snuggles1 +reebok +kieran +eugene1 +sonny1 +godfather1 +babatunde +gorilla +lahore +together +buddy2 +gratis +goldie1 +myname1 +bastard1 +briana1 +holahola +jeffhardy +integra +mechanical +qwert1234 +postal +basket1 +hot +server +benito +redalert +bugsbunny +gretchen +dragonfly1 +...... +button +jesuschris +december12 +princess5 +polopolo +maldita +june12 +12345w +money$ +ferret +1a2a3a +wildcat1 +hanna +honeyko +daphne +money23 +bayern +wendy +hollister +smitty +romano +dookie +duke +hussain +tiger2 +michelle2 +busted +kendall1 +qwaszx12 +michael3 +maryann +baby23 +family123 +everest +roger +alucard +candy12 +bears1 +letmein123 +iloveyou10 +pudding +bearbear +sandiego1 +123456789n +babygirl01 +papito +benoit +blaster +sparrow +10203 +19711971 +mathias +dont4get +prakash +kamasutra +vegeta1 +estelle +nana123 +535353 +catarina +booboo2 +616161 +monty1 +tootsie1 +megaparol +beach1 +katrin +holden1 +trucks +help +2010 +legend1 +jared1 +852852 +bitchass1 +anna123 +404040 +anime1 +hondacivic +sponge +better +wizard1 +cardinals1 +sexybeast1 +guillermo +pokemon2 +cheesecake +television +love00 +spirit1 +blue23 +poker1 +summer10 +noodles1 +414141 +as790433 +devon1 +english1 +elaine1 +spartan1 +ben123 +123456789g +prelude +fabulous +andres1 +reading +nikolay +beckham7 +hurricane +peekaboo +tyrone1 +#1bitch +pussycat1 +studio +spooky1 +positive +20022002 +britt1 +memphis1 +manager1 +mon +estrela +alaska1 +skylar +baseball22 +contact +beethoven +maximilian +kristy +arthur1 +grizzly +lancelot +chanel1 +loved1 +loveya1 +popo +francisco1 +sunny123 +scorpion1 +taytay +coolcat +shadow01 +hihihi1 +cody +audrey1 +santiago1 +devil1 +dimitri +1football +turner +hunter01 +taylor123 +cheer +babyface1 +always1 +coolguy +alpine +lena +innocent +joyce +tkfkdgo +kosmos +muslim +goddess1 +infiniti +soccer09 +fatass +fytxrf +jewels +norman1 +lawrence1 +1q1q1q1q +allah786 +silence +74108520 +original +monkey01 +joaquin +ravens +aqwzsx +chickens +blades +pedro1 +mamour +pink13 +packard +nathaniel1 +balls +supergirl +meowmeow +alexander +jesussaves +hayabusa +chicken123 +connie1 +sandy123 +112233a +medion +gerardo +domino1 +yellow2 +woaini1314 +colton +ybrjkfq +babygirl14 +hotmama1 +anjing +carlo +chelsea123 +cleveland +love55 +eleven +pallmall +hawkeye +767676 +frances1 +werder +edison +cha +center +7753191 +q11111 +hotshot +flower12 +2008 +tattoo1 +tanya +dragon11 +marco1 +comfort +higgins +yfnfkmz +passpass +trooper1 +666666a +longhorn +beach +chloe123 +softball12 +dragoon +poonam +my4kids +giorgia +incorrect +leandro +kontol +trebor +morning21 +warlock +joanna1 +email +gunit1 +chipper1 +oakland +kosama +tarheels1 +matthew2 +team +demon666 +grapes +temp123 +128500 +mariano +dillon1 +dragon69 +shutup1 +arianna1 +myspace10 +goofy1 +lemons +orange123 +qqqqq +j123456789 +fabiola +striker +krista +terry +2007 +noname +dmitriy +director +unique1 +sanchez1 +puppy123 +faithful1 +destroy +youyou +money3 +crimson +eatshit +annette1 +jacques +mariposa1 +gamecube +jersey1 +ilove69 +moneyman +lesbian1 +mexico12 +gegcbr +cocoa1 +dirtbike +gatito +juancarlos +santana1 +marcia +network1 +braves1 +chuck1 +jundian2011xr +eureka +fucking1 +milana +dell123 +sylvie +stormy1 +chemical +minime +pencil1 +kawasaki1 +demon +fatcat1 +puertorico +jones +123456i +92k2cizcdp +daniil +dharma +mihail +2006 +paradox +mazdarx7 +weasel +1234zxcv +thirteen13 +mishka +french +fuckyou22 +fallout +howard1 +dad123 +meredith +abcd1234 +nyq28giz1z +grandpa1 +printer +cancer1 +redbull1 +angelbaby1 +ab1234 +anything1 +cavalier +hentai +paramore1 +123456789e +145236 +triumph +lulu +noelle +william2 +iloveme123 +starbucks +pimp13 +rdfhnbhf +monkey10 +sunshine7 +jesus01 +luciana +david12 +elefante +class09 +fatman +purple11 +taylor2 +lovergirl1 +love2010 +matthias +1967 +mama1234 +summer01 +smiles1 +brendan1 +159753456 +qqqq1111 +iamnumber1 +sassy123 +haters1 +222 +apple2 +jasmine2 +pepper12 +e12345 +mckenzie +lala12 +qaz +portland +mahesh +khalid +0987654 +kentucky1 +longhorns +vb +knights +boss +justin2 +321 +loveyou123 +susan +prasad +1998 +revenge +whiskey1 +soccer101 +showtime +holla1 +gatita +joshua123 +e +mankind +123456789abc +1fuckyou +456987 +stoner1 +hope +kimkim +sevilla +yfcntymrf +kjkszpj +cristina1 +babyboo +yamahar6 +boobs1 +pepsi123 +456456456 +lebron +impala +dream1 +doodle1 +hejsan +zouzou +onlyme +maymay +felicidad +333444 +jones1 +lol1234 +lovegod +auburn +riley +kipper +kittykat1 +srinivas +azamat +angel21 +zaqxswcde +marvel +purple13 +tom123 +cardinals +1hottie +manny1 +hunter2 +soccer! +741258963 +coconut1 +griffin1 +whatsup1 +asdfzxcv +rooney10 +notthat +abrakadabra +administrator +895623 +oluwaseun +irock1 +a123654 +monkey6 +baseball21 +dimples +janelle +zxcvbnm12 +chase +balaji +shasha +silly1 +robert12 +sheba1 +terror +batman2 +pippin +ivanova +pirates1 +vinnie +home0401 +baby22 +lady +stalker1 +ismael +finalfantasy +ilovemusic +camilo +stoner +jordan01 +evelyn1 +jenjen +broadway +addison +brayden1 +souljaboy1 +cutegirl +kaka22 +runner1 +rodriguez1 +violin +green2 +telefono +emanuele +rfn.if +shotgun1 +beer +hithere +dkflbckfd +hanson +333777 +cepetsugih +vancouver +ellie1 +spectrum +258000 +123459 +baby15 +daughter +ilaria +roxanne1 +nikita1 +outlaw1 +mason +dfcbkbq +jenifer +fuckface +salmon +nasty1 +sexyme +pavilion1 +braveheart +120 +mmmmmmmm +blink123 +cathy +fra +camille1 +balance +selina +monroe +starcraft1 +giggles1 +frogger1 +qazxsw123 +dfkthf +chris13 +children3 +babygirl7 +rachael1 +agustin +football4 +halloween1 +warriors1 +football8 +asdfghj1 +boy123 +cosmo1 +amarillo +113113 +797979 +stinger +12312312 +evgeniy +bruce1 +flash +747474 +bratz1 +chronic1 +coolgirl +bobo +diosesamor +boxing +adventure +bordeaux +roxana +pooppoop +007 +biscuit1 +kissme2 +angel23 +joker13 +qwertyuiop +meandyou +beetle +mykids3 +werner +purple3 +apple12 +kaykay1 +999888 +imcool1 +agosto +tracy1 +dimple +domingo +irish +chivas10 +andrew2 +393041123 +cantona +s123456789 +cinema +temp1234 +luna +penis123 +vfibyf +jonas123 +ashlee1 +artemka +12345n +coolcool +oakley +kansas +torres9 +bacardi +erika1 +beanie +maggie12 +thug4life +italia1 +1212121212 +reagan +fallout3 +missy123 +kitty2 +tyson +lionheart +budweiser +temitope +kenzie +tiesto +rocknroll1 +columbia +gillian +19681968 +junior123 +harry123 +dogs +topsecret +king1234 +number3 +brandon12 +loredana +skater123 +titans1 +burger +bumblebee +number +start123 +scream +simpleplan +waterloo +libero +1mother +angel15 +assass1 +bender +fossil +loves1 +amours +legion +373737 +iloveyou69 +irene +woody +leonie +bernadette +hannah01 +home1234 +vishal +996633 +jessica +iloveme! +jumper +kitty12 +ludmila +romina +secret123 +kayla123 +changeme1 +jenna +rivera +pelusa +1z2x3c4v +citroen +4444444 +blessings +kaykay +teddy123 +thirteen +beloved +buckeyes1 +jjcg16dj5k +dietcoke1 +hermes +hubert +charlie +keith +eduard +tupac1 +daniel2 +smackdown1 +myspace9 +khushi +1964 +passwords +jorge1 +carmelo +heroes +123qwe123qwe +qwerty77 +krasotka +gizmo123 +lovergirl +fuckface1 +archana +kleopatra +password15 +amelia1 +prissy +2020 +cobra1 +hollister2 +anime +pirate1 +online1 +busted1 +hoover +yomomma1 +monkey4 +wonderland +jorge +susan1 +orange12 +celtic1888 +bigmoney +legolas1 +gambit +chivas11 +dorothy1 +donna +monster123 +lukas +ballin +114477 +loser2 +alex01 +su123456 +stones +giraffe +yahooo +money7 +jesuss +svoboda +overlord +baby101 +blackjack1 +mommy12 +almighty +cute123 +commando +amalia +megan123 +lovesucks1 +salvador1 +johnny5 +jazmine +rustam +escort +nick12 +honest +goodness +wertyu +flower2 +friends123 +thierry +damien1 +loves +zigzag +mustangs +archer +xfiles +alinka +lamborghini +parrot +iloveyou23 +bloods +school12 +141516 +14141414 +12345h +1965 +star11 +kelly123 +maggie123 +hotty1 +nicole13 +princess21 +sssss +19051905 +belle1 +1qazzaq1 +pass12 +theodore +patrice +newpassword +ihateu1 +cutie101 +diamante +stefanie +cgfhnfr +health +dominican1 +qwerty777 +mallory +buckeye +brandon123 +fuck0ff +shibby +asd123asd +eragon +andy123 +jupiter1 +princess14 +d2xyw89sxj +fyutkbyf +ayesha +brothers +mittens1 +lifesucks +olayinka +honduras +qqwwee +qaz123456 +12345qw +leonardo1 +lillian1 +anne +hellsing +battle +killers +sucesso +vicente +justine1 +1234rewq +168asd168 +blanca +toto +birthday1 +maddog1 +nicky1 +ihateu2 +cherokee1 +jazmine1 +monkey23 +vicky +stargate1 +charley +hockey12 +123abc123 +23456 +willy +lizard1 +life +mustang2 +plastic +12345600 +georgie +rebeca +chelseafc +michael1 +richie1 +dragon +thesims2 +pot420 +ericka +melody1 +westwood +pothead420 +lucky2 +retired +rambo +starbucks1 +bitch3 +2sweet +sexy09 +renee +mother2 +1111qqqq +cinta +demons +lewis +dauphin +system1 +01010101 +shitface1 +123admin321 +harley01 +multiplelog +plymouth +josh12 +1money +mark123 +red1234 +lolipop1 +bowling1 +allah +henry14 +gsxr750 +konstantin +963258741 +luke +kate +hermosa +corinne +password09 +bernard1 +keeper +biology +sephiroth +derek +gabrielle1 +albina +don +951357 +kontakt +hannah2 +lowrider1 +mexico10 +duchess +cricri +silent +789789789 +romero +camaroz28 +myspace23 +poncho +pooper1 +market +maurizio +nicole11 +baby10 +www123 +123456789w +mondeo +piccolo +lineage2 +pandora1 +tiger12 +qqqwww +weed123 +myspace101 +welkom +nevaeh1 +helloo +momo +celtics +taishan2011 +manila +gandalf1 +venus +jennifer +animals1 +evergreen +iloveyou21 +eatshit1 +786786786 +artemis +tricia +estrellita +bloody +1234567z +hottie! +nikki123 +danica +love44 +matador +leelee1 +ferari +toffee +wallace1 +alexander2 +alexalex +123698741 +girlfriend +loveu +projectsadminx +marilyn1 +married1 +sponge1 +brayden +jack12 +money11 +someone +blowme1 +cowgirl1 +bobbob1 +toledo +highlander +jktymrf +1221 +torino +surside13 +titanic1 +volkswagen +2good4u +bartek +00112233 +pdtplf +bkl29m2bk +pavel +fabrizio +babyboy2 +mayday +sleepy +twins +444555 +assman +sullivan +isaac1 +484848 +annamaria +g12345 +herbie +ufkbyf +darlene +april12 +blabla1 +happydays +fgtkmcby +seattle1 +a1s2d3f4g5 +cheese2 +preciosa +temple +uhfybn8888 +rainbows +senegal +pollito +jordan3 +11111111111 +wenoob +pimpdaddy1 +masters +imperial +gay123 +yandex +kiki123 +coolman1 +iamcool +number9 +frederick +pacific +rossi46 +passport1 +hooters1 +prettyboy1 +journey +luis123 +quality +georgina +560076 +mylord +becky +chubby1 +lola123 +scooter2 +tamara1 +moneys +rootbeer1 +kenken +ou812 +diane +maribel +warning +cowgirl +buddy12 +love2009 +shanti +rereirf +0123 +minerva +asroma +lights +jordan13 +spring1 +alex10 +nadia +123458 +sweets1 +karine +gavin1 +elmo123 +lewis1 +jasmine123 +aiden1 +jose12 +halflife +jermaine +burton1 +myspace22 +baby09 +capricorn1 +shogun +dortmund +zxcv +ichliebedich +viviana +mariel +spitfire1 +fusion +utopia +free123 +zaqwsxcde +painter +catania +carlotta +baseball23 +stitch +omega +azertyui +jonas +computer2 +000999 +zxcasdqwe123 +sexyme1 +stealth +a123321 +jeffery +mehmet +sexylove1 +mathew1 +??????? +three3 +horny1 +mihaela +corazon1 +carmel +ginger12 +qwer4321 +bagira +turbo1 +swimmer1 +techn9ne +moon +jesusfreak +hercules1 +sandman1 +lemonade +mango1 +arnaud +lovely2 +2345678 +wellington +nurse1 +ilovechris +punkrock1 +millwall +p12345 +daniella +lassie +daniel01 +pazzword123 +mummy1 +massage +unknown1 +youandme +huhbbhzu78 +chico +bennett +635241 +loveislife +patate +87654321q +neveragain +kifj9n7bfu +gator1 +7007 +7777777a +gordon1 +ali +dominika +silverado +123456789qwe +number7 +lizzy1 +987123 +joejonas1 +myself1 +tasha +1sunshine +colleen1 +teamo123 +kodiak +1235789 +kill +tigger01 +adrien +zazaza +jamie123 +redwings1 +kathryn1 +sucker1 +wayne +karate1 +kayode +latino +dancing1 +whatever! +start1 +peterpan1 +bighead1 +mhine +nigga123 +confused +rtyuehe +sonyericsson +lalala123 +butterfly3 +myspace09 +6 +balls1 +bubbles123 +gfhjkm123 +abc321 +rihanna +cannon +123412 +anthony3 +73501505 +delta +magnus +asdfghjkl123 +addison1 +left4dead +brighton +francine +malaga +austin12 +shadow +jamesbond007 +maddy1 +charger1 +networking +poetry +zacefron1 +stunt101 +carol1 +fatman1 +jesus3 +clarinet +conrad +ohiostate1 +whisper +cavallo +michelle +hi1234 +celeron +smooth1 +yolanda1 +mission1 +sexy18 +cellphone +ramram +faster +walmart +princess22 +madison2 +babe +beaner1 +technics +resident +aerosmith +india1 +youtube1 +salomon +bitch11 +mike1234 +010 +cafemom +senior09 +choupette +sagitario +november11 +cobra +sunshine3 +shanghai +mazda6 +igor +19671967 +ashley11 +astonvilla +durango1 +snoopy2 ++ +angel16 +jeffery1 +latina1 +princesa1 +testing1 +a00000 +mykids2 +pompom +dance123 +7412369 +jg3h4hfn +yanyan +mollie1 +grizzly1 +434343 +benji +blazer1 +buddyboy +koolaid1 +benben +mafalda +1234567m +matheus +support +loulou1 +squall +demon123 +jade +june22 +margarita1 +qwe1234 +dddd +blacky1 +hohoho +trust +1qay2wsx +demo +115599 +dt123456 +soccer19 +roscoe1 +lisa123 +dreams1 +12211221 +sta +147896 +gertrude +linda123 +polo +madagascar +727272 +astrid +coleman +iphone +gabby +matilde +durango +tabitha1 +volley +bobmarley1 +bitch01 +nicole3 +working +iloveyou9 +splash +kingsley +jackjack +zombie1 +princess4 +carbon +pussy2 +carson1 +joshua01 +daddy2 +badminton +desert +20052005 +europa +warszawa +skater12 +reaper1 +hollie +fuckthis +dusty +toby +maksimka +dirty1 +1963 +felicia1 +linkedin2011 +n12345 +raiderz1 +candyman +cheetah1 +babygirl15 +a112233 +willy1 +faggot +madeleine +vfitymrf +summer2 +babygirl5 +storm +fuckyou5 +kathy +murder1 +1231231 +violetta +jerusalem +warren1 +w66yrybgra +viktoriya +sexsex1 +baby07 +yummy1 +loveme3 +blackrose +1234567s +blackbird +laura123 +159753a +alexa1 +fullaccess +ahmed +ms0083jxj +8522003 +peyton1 +respect1 +emiliano +kostya +popo123 +green7 +davids +june23 +sunita +roxy +pearl1 +hfytnrb +chaton +carlos12 +baker +panda123 +adelina +myboys +chevys10 +kathmandu +ariel +becca1 +1596321 +czz000 +miracle1 +notebook +megasecret +michael23 +america123 +nokia5800 +ryan12 +apollo1 +ananas +ihatethisgame +musica1 +shakira1 +werty +princess +ncc1701a +susanne +playstation3 +19651965 +archie1 +pothead +jokers +ariel1 +bertha +7896321 +meatball +131415 +bigmoney1 +imnumber1 +forzamilan +nacional +browns +caca123 +fre +sandhya +pimp11 +kingking +marcello +blake +hacker1 +yannick +racecar1 +15151515 +moonlight1 +shit123 +smelly +caca +smart +cantona7 +mercury1 +chris11 +diamond2 +benji1 +pulsar +spartans +boricua +555556 +yvonne1 +isabelle1 +lucky12 +josefina +tommy123 +babygirl09 +nodefinido +201010 +classic1 +bunny123 +babygurl12 +saskia +stewart1 +geoffrey +harrypotte +select +delacruz +1a2a3a4a +solution +10577 +butthole1 +ilove123 +allie1 +powder +gaston +nestor +triskelion +pinkie +condor +liverpool8 +chivas123 +oldman +start +1475369 +nanana +ale +606060 +remington +kakaka +jake12 +qqqqqqqqqq +alegria +lilman +david2 +iloveu12 +123456789h +gabriela1 +maximum +music101 +qwe1asd +skyler1 +girasole +didier +ginger123 +rakesh +money100 +honduras1 +london22 +disturbed +arsenal123 +madeline1 +poochie +poseidon +mulder +celica +davidson +revenge1 +bruce +sparkles +777999 +bossman +fabio +crjhgbjy +silvana +chacha1 +123456789f +monika1 +grumpy +fxzz75 +seagull +you +colts18 +yxcvbnm +front242 +muppet +login +chicca +momomo +p455w0rd +cody123 +superfly +tyler12 +blade +w12345 +mariya +132465 +57chevy +clifford1 +coco12 +aileen +1loveu +bear123 +leader +2009 +kim +gaurav +iamcool1 +sexy08 +dylan123 +198 +joejoe1 +1qazxsw23edc +portugal1 +paolo +tomtom1 +noodle1 +bigpimpin1 +senior08 +mileycyrus +survivor +robert +123654a +vanesa +tomate +senior +mike23 +sara123 +freckles1 +makemoney +willis +mississipp +pepper123 +godsmack +finger +celeste1 +bautista +vendetta +seventeen +ncc1701e +camelot +junebug1 +lovestory +pooh +pablo +briciola +helloworld +tresd5 +jermaine1 +fuck666 +skinny +semperfi1 +rabota +jess123 +pierre1 +121 +bubbles12 +mikemike +work +poipoi +pictures +pornstar1 +princess23 +sasha12 +adeline +superman7 +sprite1 +knicks +pillow +ltybcrf +daddy12 +charlie12 +bebe +pa55word +livelife +juan123 +oklahoma1 +cancel +kashmir +tdutybz +jess +hotmama +hospital +boo +4myspace +sweden +x3luym2mmj +2003 +45454545 +skiing +chrisb1 +hamish +tyler2 +cleveland1 +maniac +meghan1 +billy123 +trojan +june13 +handsome1 +blueeyes1 +spyder +roses +beaner +moises +steelers7 +blade1 +rhiannon +slipknot6 +nightwish +yankees13 +four20 +101101 +aaron123 +ilovehim2 +357951 +anthony7 +mystic +san +labtec +hammers +crip4life +lifeisgood +daewoo +dragon7 +indians +october10 +wolfman +stryker +tammy +sexyman1 +tekken +marie12 +yyyyyy +qwerty78 +orchid +coolkid1 +keisha +africa1 +iverson1 +navigator +gotmilk +584520 +ashley13 +myspac3 +334455 +bionicle +humtum +1loveme +simpson1 +waterfall +999 +noisette +mimi123 +jordan5 +huskers +scottie +luther +superman3 +psycho1 +yahoomail +20072007 +motocross1 +jared +armando1 +123456. +1iloveyou +nataly +rasmus +clarissa +shorty12 +fisherman +baby21 +hello9 +zxcvb123 +abcde123 +hardrock +annalisa +safari +159753123 +june21 +darkangel1 +hotgirl +chucky1 +babe123 +789632145 +celina +awsome +rockets1 +elisa +rjycnfynby +patito +1michael +cbr600 +milkshake +lightning1 +monkey21 +greg +simsim +myspace8 +montgom2409 +tesoro +bitch5 +solomon1 +- +s8ylpe9jdpvym +classof07 +google12 +love2008 +560037 +newstart +bigbang +classof201 +stallion +wonderful1 +firebird1 +olenka +sterling1 +daniel11 +playboy123 +forest1 +evony1 +1435254 +nicole01 +kaka +121121 +frog +hustler1 +razvan +blackman +poo +baseball6 +snoopdog +haha12 +female +franck +company +159159159 +bhebhe +adewale +whisky +mallorca +freeze112 +0192837465 +killer11 +green13 +myspace69 +adelaide +daytona +cimbom +emachines1 +paola +19031903 +baseball24 +reality +bball +april20 +m1234567 +monkey101 +tomorrow +mathis +peanut12 +legenda +shorty13 +shania +mobster1 +bunnies +868686 +ecuador +sunset1 +199 +bookmark +bangbang +rjynfrn +alison1 +sausage +lavoro +peanut2 +thomas2 +northside1 +class08 +naruto2 +198888 +johnpaul +subway +andrew11 +cuteme +justin01 +brian123 +amazon +leoleo +oliveira +pharmacy +fish123 +duncan1 +forget1 +maximo +nopass +kalina +lifesucks1 +vbkfirf +albatros +banshee +lil +foxtrot +new +giacomo +steffi +william3 +freedom2 +littlebit +sheldon +capone +keegan +central1 +glamour +beaver1 +april21 +thursday +indya123 +mollydog +reggae +gringo +bounty +greece +25011990 +rowena +princesita +adekunle +robinhood +lorraine1 +zaraza +cowboys22 +march17 +heineken +qw123456 +cheer123 +space +sexy17 +palmer +fuckyou11 +light +coolboy +professor +646464 +april22 +1q2w3e4r5t6y7u8i +mazafaka +homework +dbrnjh +koroleva +radio1 +principessa +gothic1 +baseball14 +angelus +z00000 +10 +godis1 +lampard8 +husband +persik +nugget1 +killer13 +corey +landrover +tequila1 +redred1 +a1a2a3a4a5 +heidi +kfhbcf +dwayne +rancid +medicina +candle +negrita +cotton1 +school2 +beckham23 +cooking +veronique +faisal +bookworm +answer +godhelpme +dragon01 +fghtkm +catwoman +smelly1 +friendly +phone1 +matahari +pleasure +ludacris +19991999 +july21 +will +saturday +mygirls +springer +shawty1 +fuzzy1 +zhjckfd +buster01 +babylon +aliens +chillin +peluche +triton +tsunami +maryland +cutie2 +jensen +black12 +1diamond +mickey123 +randall +marihuana +hello3 +love26 +frosty1 +football24 +nokian70 +candice1 +12321 +ilikepie1 +robert2 +coolcat1 +pink22 +adeola +baby16 +pandas +venera +webster1 +ankara +reddog1 +simon123 +cancun +12345qwer +control1 +flyboy1 +queens +venezuela +thomas22 +default +w +blueblue +asd1234 +ssss +roxy123 +incubus1 +angel88 +anuradha +ashleigh1 +pancho1 +reset123 +guatemala +ssssssss +applepie1 +12345v +garbage +manowar +mickey12 +food +project +alexis12 +kikiki +gremlin +ghostrider +m0nkey +1366613 +butler +gorgeous1 +kenwood +jillian1 +qwertyui1 +pok29q6666 +bonehead +22334455 +pimp23 +jaguar1 +rammstein1 +minette +forrest +mitch +leonard1 +amy123 +password08 +123asd123 +eeyore1 +1234567j +godofwar +amoure +create +junior12 +farida +dude12 +beaches +n1frdz +emerald1 +june16 +love777 +mighty +thomas01 +ordinateur +23jordan +zxcvbnm +george123 +krokodil +nastia +kittie +therese +giovanni1 +password88 +jessica3 +password24 +account1 +racing1 +angel07 +az123456 +383838 +pat +lucia +auburn1 +abcd123456 +sadie123 +qazzaq1 +lovebird +mommy11 +a1a1a1a1 +venice +meme +flipper1 +rogers +novo +bigbird +big123 +qwe789 +bengals1 +jasmine12 +versace +maggie01 +mary123 +heidi1 +satana +123456789v +malachi +greenday12 +family2 +veritas +porkchop1 +tatiana1 +eight8 +terrell1 +verona +puppylove1 +legacy +tootie +dipset +holland1 +mazda323 +homeboy +zander +baker1 +deutschland +manning18 +open +april13 +zxcvb12345 +1475963 +yuliya +margherita +tomas +my1love +janet +mango +family3 +12345677 +iguana +birdman +123456aaa +poptart1 +1234565 +123abcd +tweetybird +louis1 +south1 +lovely123 +ठ: +london +porn +1q2q3q +mom +blossom1 +shorty123 +thelma +chivas12 +chosen +qwerty69 +samantha12 +lucille +speed +aberdeen +martin123 +hockey11 +orange2 +candy2 +fabrice +love27 +ebony1 +l1nk3d1n +barbados +1357913579 +biteme2 +tkbpfdtnf +???????? +weezy1 +go2hell +tuesday +fanfan +guitarra +michela +killian +lucy123 +speaker +456789123 +munchkin1 +godislove1 +latina +220 +sprint +pancakes +grover +melvin1 +escorpion +liberte +626262 +ashley01 +twister1 +basketbal1 +payton1 +mynameis +k.lvbkf +guadalupe1 +babygirl21 +edward123 +ray123 +hottie3 +il0veyou +training +bassman +21122112 +progress +qwaszx1 +123123123123 +zelda1 +melinda1 +june11 +grandpa +myspace0 +angeline +violet1 +sexybaby1 +roberts +love34 +grace123 +motherfuck +ghjcnjnfr +q2w3e4 +scully +guilherme +john!20130605at1753 +333333333 +skyblue +123890 +cherries +buckeye1 +forzaroma +janette +taylor01 +music2 +newmoon +14881488 +wednesday +indira +andrew01 +clemson1 +kittens1 +april23 +whiteboy1 +peanuts1 +mummy +fighter1 +2children +789852 +dinesh +ilovepussy +deftones1 +619619 +tenerife +march +mariana1 +chris01 +dallas22 +alisha1 +jingjing +pankaj +icarus +eternal +707070 +parkour +jaden1 +history1 +c.ronaldo +justin11 +fuckers +luis +pietro +ignacio +babygirl! +bellissima +huskers1 +kungfu +goforit +babygirl16 +rosalie +zeppelin1 +redman1 +mancity +deanna1 +nokian95 +110085 +lovesucks +vertigo +destroyer +cadillac1 +good123 +amor +lesley +babygirl08 +princess15 +evanescence +roma +123321123321 +pepper2 +byusdg23 +smoking +56789 +ripper +winchester +holmes +йцукен +love4you +dilbert +sexy07 +1232323q +z123456789 +duckie +doctor1 ++ +number5 +rashmi +18n28n24a5 +great +rawr123 +fabregas +sexyman +operator +babygirl23 +possum +09876 +19641964 +kings1 +jordan10 +freeman1 +gotcha +phoebe1 +rjhjktdf +xxxxxxx +technology +angel69 +bessie +210 +panties +jesusc +billyboy +rafael1 +arnold1 +comcast1 +apsk54321 +tara +dixie +music4life +andrew +gotcha1 +time +suzuki1 +bridget1 +paige +principe +concrete +anita1 +porno +monsters +battlefield +mother12 +ayomide +nike +pirata +turbo +lolo123 +missyou +carolyn1 +fergie +pakistani +z0102030405 +april15 +greenbay +chivas13 +grandkids +789 +home123 +whatever2 +indian1 +roller +mylene +bruno123 +horizon +besiktas +yeah +1232123 +kiss123 +qwerty666 +dutchess +janet1 +ठ +monkey8 +owt243ygbj +ursula +nikolai +blingbling +angel4 +bigfoot1 +chevrolet1 +nigger123 +qwerty01 +maynard +101 +24242424 +emotional +qwerty789 +marcella +manu +redsox04 +qwegta13091990 +boris +armstrong +717171 +bandung +zainab +iluvu1 +maradona10 +pauline1 +football20 +cock +lord +as1234 +madalina +joey123 +badboy2 +748596 +april14 +2424 +sherman1 +paula1 +colts1 +biggie1 +1414 +budweiser1 +alexa +louie1 +confused1 +snoop1 +star13 +cherie +9293709b13 +theused1 +sweet12 +valeria1 +dalila +kochanie +adonis +214365 +bailey12 +zzzzzzzzzz +village +street1 +zenith +theboss1 +333222 +nursing1 +ppppp +prashant +love5683 +buster2 +travel1 +cazzo +shorty2 +yesyes +hunter11 +chuck +kirsty +ontario +wisdom1 +ariana1 +june24 +qwerty22 +clover1 +sunshine +slavik +leo +morris1 +emma123 +vicky1 +barkley +0147258369 +rastafari +samtron +!qaz2wsx +donnie1 +777666 +march12 +aaasss +spike123 +softball11 +abby +petunia +sharingan +shady1 +catalin +dick123 +lovely12 +aaaaaaa1 +leonid +.adgjmptw +abiodun +dogdog1 +111111111111 +donovan1 +qwerty5 +223322 +mash4077 +130 +dollar1 +momof2 +111999 +stevie1 +mystery1 +mimosa +paperino +chicken12 +lalaland +hyderabad +liverpoolfc +20112011 +пароль +nelly +soccer08 +nokia3310 +canela +redrum1 +money4 +iloveyou15 +princess8 +marriage +sextrime1 +bertie +explorer1 +aa123123 +100200300 +famille +breeze +losers +jesse123 +yumyum +numba1 +iloveyou09 +italian1 +daniel13 +marlin +p@ssword +sousou +amanda2 +argentina1 +patty1 +mar123 +dottie +charming +blizzard1 +pizzas +123456abcd +mostwanted +110011 +pobeda +antares +patrizia +medved +compton1 +bonheur +fantastic +123stella +110120 +santos1 +iloveher +rhonda +martina1 +sssssss +crazy12 +bradford +butthole +lopez +daisy12 +magali +bugger +234234 +lynn +chinnu +angelbaby +jocelyn1 +mandarin +hamilton1 +love89 +honda123 +football09 +sunderland +tropical +mallory1 +desperado +discover +puppylove +march1 +samiam +pimpin2 +drogba +159 +family12 +edwards +jamila +rebels +321678 +wishbone +qwerty! +losers1 +ludovic +looser +booty +malcolm1 +mafia1 +conner1 +medical +princess +5poppin +fuckyou6 +transam +supergirl1 +cookiemons +helen +pistons1 +livestrong +sidekick3 +babygirl4 +pokerface +lee +bestfriends +manson1 +test1 +carlton +jessica7 +matthew12 +iloveyou6 +sidney1 +tigrou +deadman1 +hannah11 +hater1 +sammy12 +1962 +kimbum +young +christian2 +pringles +lovehate +juventus1 +85208520 +smoke +bugsbunny1 +commander +gianna +password19 +gwapo +papapa +nipper +1234509876 +bharat +pie123 +loveis +punkin1 +friends4 +bobobo +enrique1 +fred123 +mat +nikitos +142857 +jesus4me +picture +black2 +cabbage +jesus! +asdffdsa +scarlett1 +green11 +shmily +vacation1 +gonzalo +linkin1 +qaz123wsx +glitter1 +rodolfo +pupuce +games1 +mellon +jackpot +harley123 +737373 +123456zxc +2bornot2b +bogart +lamont1 +italiano +valentina1 +lemon8 +peters +zasada +dalejr +lance +goodbye1 +123456789. +charlie3 +yugioh1 +212223 +rhjrjlbk +rolando +goodlife +extreme1 +abcdefgh1 +badboys +tulips +cool11 +sweetgirl +roman1 +management +14121412 +2128506 +delete1 +pluto +hejhej +offspring +never1 +slick1 +eric123 +gabriel123 +schatzi +nissan350z +michael11 +blink +felicity +momanddad +bones1 +amistad +pablito +star1234 +angel18 +dodgeram +sheila1 +softball2 +august12 +isabela +thedoors +monkeybutt +hyundai +trial +one +zacefron +candycane1 +12qw12 +china +jordan7 +113355 +ferdinand +spunky1 +chaos +summer99 +heritage +butt +20062006 +kobebryant +badman +lover69 +jamal1 +bruins +19631963 +cecilia1 +kumar +booboo12 +spanish1 +1anthony +gameboy1 +hidden +4children +babygirl69 +1butterfly +princess9 +splinter +naveen +cruzazul +fantasia +sexyback1 +2blessed +baseball15 +natural +leather +hello. +freeway +morgana +nathan12 +bridge +jaihanuman +aa1234 +april16 +september9 +joseph12 +lickme +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +hjccbz +harriet +lopez1 +sonali +leon +light1 +zorro +51505150 +stanislav +exodus +bailey123 +argentina +booboo123 +fxzz75yer +benedict +mmmmm +dodge +katkat +football! +doodoo +aptx4869 +qwertasdfg +malachi1 +peanut123 +cinnamon1 +fuckyou4 +dolly1 +242526 +stepan +gorilla1 +fktyrf +mitsubishi +angel6 +murder +blue10 +caramel1 +electro +gold +wifey1 +theend +soccer20 +doomsayer.2.7mords.v +soccer24 +myspace07 +pink101 +sneakers +nevaeh +nokia6233 +march23 +highland +bristol +dookie1 +scarlet1 +coolguy1 +imgay1 +natacha +pepette +assasin +121283 +mildred +joshua2 +micaela +kannan +azerty +maria12 +150 +omarion +tweety2 +revelation +psalm23 +halo +nathan123 +vjcrdf +monster2 +june14 +weather +summer05 +password07 +19661966 +corolla +il0vey0u +lespaul +martins +adrienne +janice1 +charlie1 +bologna +klapaucius +ariane +rasengan +arsenal14 +polarbear +austin123 +aprilia +skinhead +sha +cevthrb +bossman1 +jessica13 +777555 +ciara1 +h2vwdubjx4 +wookie +strong1 +june10 +709394 +snowwhite +228228 +deborah1 +logan123 +bball12 +soccer07 +bluebird1 +alexis123 +april10 +sexybabe +caballo +william123 +kimmie +poochie1 +lexmark1 +fireball1 +hedgehog +keyboard1 +password20 +1004 +lolita1 +michael01 +angel8 +adv24 +pearl +angel08 +gggg +scooby2 +chuckie +april11 +margie +momoney +110001 +barbie123 +maciek +june28 +shinigami +1cookie +ruby +everything +shooter1 +27653 +maddison +bailey01 +love02 +love4me +19411945 +fishes +christie +aaaaaa +00001111 +devildog +chuchu +chivas100 +scout1 +aardvark +blessing1 +poussin +badger1 +kellie +soprano +250 +john1234 +crackers +lenochka +beautiful2 +march11 +delfino +sherry1 +scvmofas79 +july23 +01011980 +kirsten1 +ilovejusti +twisted1 +caline +maggie2 +cookie3 +matthew123 +seniseviyorum +shitty1 +june17 +trenton1 +sleepy1 +pacman1 +bloods1 +skylar1 +picard +smarty +chronic420 +qazqazqaz +xboxlive +jelly1 +destiny2 +110688 +jazz +holly123 +hello7 +joseph123 +eagles5 +funky1 +chiefs +nicole7 +piramida +michael13 +colton1 +vanhalen +softball13 +green3 +rebel +246813579 +dr.pepper +number12 +135798642 +amormio +chewy1 +harley12 +lucky777 +victoire +marcopolo +titties +bluebell +110019 +thegreat1 +aries +ladies +vernon +sagitarius +ghblehjr +october31 +monkey9 +secure +885522 +1a2s3d4f5g +nevada +mikayla +123123qwe +writer +casey123 +nikhil +creation +piper1 +forzainter +diablo666 +letmein1 +angel9 +snapper +kenworth +marcos1 +eldorado +march22 +daniel19 +corrado +annika +blackops +seamus +liverp00l +x123456 +italien +asshole12 +dom +shark +kelley +darius1 +believe1 +jennifer12 +apples123 +magandaako +skinny1 +ravens1 +faith123 +trojans1 +232425 +finance +123456789asd +beast +andrej +bigben +christelle +imcool +softball7 +andre123 +kenzie1 +josiah +dragon88 +baby69 +softball10 +firefly1 +you123 +starlight1 +i23456 +snoopdogg +piggy +carmelo15 +recovery +bitch23 +alvin +maryjane42 +amethyst +bulls23 +mazda3 +vittoria +rainbow123 +janina +andreas1 +juan +laguna1 +paper1 +aikido +sherwood +bambino +123456qwer +abcd12345 +shamrock1 +twinkle1 +children2 +april17 +w5tn36alfw +princess16 +sacred +gilles +warlord +slamdunk +jane +babygirl22 +soccer01 +doreen +qweqwe1 +benjamin +hogwarts +supersonic +crazy4u +qwerqwer2 +orion +tony12 +010203040506 +killa +110075 +lipgloss1 +123kid +cazzone +angeleyes +denisa +america12 +qwerty99 +greeneyes +kagome +joanne1 +jordan +dragon5 +banana123 +starfish1 +columbus +holla +porcodio +hotpink1 +goldeneye +isaac +alissa +nevermore +josie1 +eqes606898 +sunshine! +pallina +champagne +mmmmmmmmmm +winmx1 +456123789 +madden1 +1213141516 +esther1 +bushido1 +morning +paper123 +mariajose +cougar1 +sky123 +badbitch1 +lily +fordf250 +forever2 +harold1 +theonly1 +ninja123 +davinci +gucci1 +bass +houses +rufus1 +qazxsw1 +trololo +monkeyman +bebe123 +cambridge +anfield +vlad +bollox +rovers +cornelia +blue21 +1960 +design1 +restart +cougars +byebye +all4one +090807 +nabila +cookies123 +crosby87 +derp12!@ +mustang69 +onedirection +kacper +gidget +sweet2 +golfing +?????????? +friends! +zarina +cheese! +borussia +killer666 +tracy +pop +mexico2 +123369 +purple22 +hurricane1 +knights1 +football14 +viking1 +europe +362436 +skater2 +chris23 +400053 +yfnfkb +matthew +lacey1 +wonder1 +palace +allahu +urmom1 +vishnu +babybear +123258 +bonsai +eatme +cristian1 +pussy12 +mike11 +fucku123 +august11 +xxxxxxxxxx +septiembre +starstar +johnlock +dimadima +billie1 +buddha1 +drake1 +littlebit1 +muskan +princess08 +nimrod +twilight12 +window1 +bajingan +digger1 +cherry12 +20032003 +fatima1 +march15 +brady12 +lipgloss +opelastra +riverside +santino +popeye1 +march13 +caravan +birdman1 +wilbur +april24 +iloveyou08 +serena1 +987789 +irinka +ilovehim! +nolimit +131421 +nicole21 +bailey +bleach1 +hooligan +560078 +bishop1 +theused +12345asd +mygirls2 +illusion +command +makaveli1 +russel +ready2go +achilles +computers +taylor11 +zxc123456 +aaaaaaaaa +pablo1 +acuario +venkat +granada +elliott1 +55555a +sexysexy +kevin12 +june15 +a123098 +123soleil +underworld +password17 +cinder +monkey14 +shadows +julieta +7elephants +inspiron +mamochka +aishiteru +123a123 +vermont +peaceout +oliver123 +lemon1 +heaven7 +google.com +fart +prissy1 +harper +southern +crusader +hillary +chinese +moritz +lamont +caitlyn +tweety12 +rocky2 +1player +jubjub +mclaren +230 +1001 +milkshake1 +samuel01 +florencia +panasonic1 +samanta +pinkfloyd1 +sangeeta +sweety12 +sasuke123 +ducky1 +satan +snooker +jojo12 +sarajevo +pasquale +fullmoon +lillie +dynasty +mermaid1 +brasil +u77789 +1zxcvbnm +darrell +anarchy1 +slipknot66 +sheeba +dana +13 +passwd +lenovo +june26 +naruto11 +darkstar1 +chaos1 +feder_1941 +classof200 +easter +potpot +drew +cucciola +kirby1 +12345qaz +999000 +brodie +solange +gymnastics +140 +hurley +sterva +music12 +eminem123 +walnut +ziggy +pradeep +sophie123 +sammy2 +bella12 +girl123 +japan +secrets +fearless +fuckme123 +praveen +montecarlo +baba +zanzibar +0147852369 +azazaz +monster12 +firefighter +myheart +caliente +chris10 +peacock +eminem12 +luckydog1 +frank123 +carola +goose1 +shitface +bretagne +roxane +stonecold1 +aurore +banana11 +oregon +elizaveta +rose12 +jesus77 +gsxr600 +cessna +zxccxz +princess09 +wildfire +messiah +rajkumar +buddie +matilda1 +snoopy123 +dagger +pudding1 +twisted +dell +pretty12 +654987 +murcielago +babygirl9 +penis69 +818181 +mypass +pasword1 +guerrero +vijaya +ijrjkfl +kolawole +rosemarie +chihuahua +money4me +crazy2 +bryant24 +butterfly8 +architect +sabbath +junior2 +kakashi1 +nicole22 +june +topcat +lorena1 +mocha1 +hooker +glasgow + +louie +wright +july22 +juanita1 +pancake +yummy +cesar +hilary1 +1superman +camera1 +clara +1qazxc +palmtree +mikejones1 +cristi +203040 +gordo1 +malik1 +070809 +tricolor +rockstar12 +polaris1 +loretta +kasia +theatre +пїѕпїѕпїѕпїѕ +alexis09 +sexygurl1 +monty +1515 +password01 +bigcock +maricel +july14 +sailboat +ste +kkk123 +millenium +nolove +1nigga +varvara +dollars +guess +darklord +history278 +gfhjkm1 +olawale +1961 +123a456 +floppy +xbox +printer1 +topper +naynay1 +tototo +2011 +liverpool +chobits +lupita1 +brazil1 +jesus33 +march21 +tango +nickjonas +baili123com +987654321q +koolaid +patriots12 +midget +pioneer1 +march18 +1234ab +angel17 +gunit +hottie13 +peterson +hustler +jimenez +narayana +nicky +alliance +rossella +1000 +denden +phillips +dynasty1 +texas123 +sonic123 +youssef +windsor +uganda +ibanez1 +michael5 +craig1 +softball3 +darling1 +yoyo123 +hilton +password77 +snapple +bitch22 +traktor +pooh12 +420weed +moneymoney +peachy +1chance +dark +feather +july12 +friends12 +jesus11 +emachines +usher1 +mirror +0000001 +fuckyou8 +wedding1 +1hotmama +kavita +laurita +butch1 +malibu1 +fireblade +pinky123 +pedro123 +seven77 +adebayo +familia1 +d123456789 +198000 +partizan +futurama +april18 +mygirl +dayday1 +jktxrf +polly +myspace200 +deerhunter +love1 +moremoney +chennai +lover13 +yellow11 +alondra +dkflbr +pr1ncess +tango1 +kool +mymusic +miamor1 +olesya +password16 +hamburger +jonny1 +matthew3 +1234567b +molson +amsterdam1 +solrac +1212123 +august13 +nssadmin +question +june18 +greens +mylinkedin +itachi +kimberley +666555 +sun +chippy +lottie +qwertzuiop +couponsc10 +buster11 +june25 +moonshine +jazmin1 +ludwig +110017 +666333 +nana12 +09876543 +kalpana +amor123 +boobear1 +mattie1 +mimimi +dontforget +audia3 +friendofemily +darlene1 +zebra1 +lance1 +baller12 +allan +bloody1 +helen1 +shaolin +nutmeg +marie2 +nike123 +jose13 +saturn1 +senior07 +wagner +diego123 +sf49ers +family7 +italian +cruise +philips1 +jack1234 +mikaela +skywalker1 +cupcakes +barselona +piolin +devilmaycry +santa1 +dolly +kronos +y123456 +sony +456258 +qwerty21 +mickey2 +holyshit +doodoo1 +19283746 +alexey +852258 +bumbum +photo1 +jamjam +sriram +tekiero +seven777 +matt12 +8phrowz624 +converse1 +savanna +joshua11 +future1 +startrek1 +pimping1 +sonia1 +clemson +francy +photos +guinness1 +dayana +sixteen +irishka +ad123456 +h12345 +1daddy +muhammed +athena1 +mac123 +thegreat123 +iluvme1 +onetwo3 +raiders13 +crossfire +lkjhgf +meagan +147896321 + +basketball1 +impossible +beverly1 +shadow7 +optimus +elefant +budapest +chris3 +zyjxrf +suzanne1 +pontiac1 +ralph +number11 +123qwert +blackhawk +johann +jobshop2002 +babygirl19 +heartbreak +bossy1 +12348765 +promise1 +kosova +amigas +june20 +ballin23 +ezekiel +lonestar +fisher1 +august23 +lov +boobear +patton +password33 +lobster1 +2gether +alfredo1 +++ +22 +chris14 +radhika +alvarez +loveless1 +green5 +familyguy +cerise +cthtuf +superman23 +robinson1 +sinner +israel1 +ichigo +children1 +pretty123 +tortuga +volvo +kaka123 +grenouille +kawaii +dragon22 +ashley7 +laptop1 +monkeyboy +pokemon11 +patty +tommaso +desmond1 +foobar +darina +loveme! +liverpool9 +kkkk +ralph1 +sam12345 +puppydog +espoir +brandon3 +??? +remote +cachorro +2babies +fabien +qazqaz1 +german1 +fabienne +meme123 +layla1 +4444444444 +lollollol +valley +poppy123 +555888 +hhhh +clouds +macarena +a7777777 +slimshady1 +speed1 +qwedsazxc +12345678m +kaitlin +ladybird +myspace21 +lucifer666 +root +zxc +112233q +cheers +atomic +angel09 +wolfie +420 +trojans +19191919 +2wsx3edc +oktober +shweta +bmx4life +canadian +tigger11 +khadija +dolapo +sdfsdf +3odi15ngxb +godlovesme +latino1 +333555 +trinidad1 +dante +idunno +lauren12 +1q2w3e4r5t6y7u8i9o +terrell +asshole! +love28 +open123 +edwin +class07 +1122334 +240 +francisca +mia123 +anthony5 +lipstick +hotpink +meow +teamomucho +not4you +jefferson1 +anthony13 +natalka +nebraska +110119 +today +lemon +2lovers +maimai +december25 +nomore +6543211 +jasmine3 +люблю +che +blaze +poohbear12 +kyle123 +sparks +1love1 +zxasqw +naruto13 +009988 +nastena +986532 +babes +france1 +tecktonik +hanna1 +passwort +august21 +159357456 +rainbow2 +filomena +ilovemysel +sasuke12 +tolkien +123123123a +iluvme +evil666 +clinton1 +lucero +river1 +xtreme +mylove2 +petrov +morgan12 +adrianna +redroses +person +simba123 +1mommy +george +25800852 +iamthe1 +magpie +football08 +player2 +zzzzz +1pussy +1231 +cool1234 +20122012 +ghbywtccf +trenton +april26 +transformers +smitty1 +s1234567 +bigsexy1 +master2 +nicole14 +coltrane +taylor13 +october13 +951159 +k123456789 +millions +pentium4 +marija +4everlove +angelita +musical +majestic +raffaele +ruben +surenos13 +looking1 +0000007 +longhorn1 +j1234567 +sexual +sveta +fucker2 +bonjour1 +hinata +dani +1secret +medusa +1melissa +minicooper +love100 +alfred19 +595959 +jansen +123456789i +idontcare +nextel1 +welcome123 +ukraine +red12345 +techno1 +april25 +supermario +joejonas +westcoast +horney +penelope1 +190 +harley2 +party +fkbyjxrf +kissme123 +megatron +money101 +qazwsxed +393939 +twiggy +steven123 +cheeky +dilligaf +goldstar +conejo +nicole10 +qazxcv +killer5 +bosco1 +nwo4life +hottie11 +78963214 +goliath +april19 +132132 +money22 +klaudia +123698 +baller3 +jackson2 +march24 +love92 +loco13 +170 +candygirl1 +musicman1 +matthieu +luigi +damnit +1111111a +philip1 +dee123 +strider +andrea123 +dwayne1 +powerful +althea +abc123 +cordoba +fuckoff123 +brandon7 +guatemala1 +richmond1 +mmmm +candycane +56565656 +melo15 +cheryl1 +margaux +james3 +diamant +florence1 +geneva +march10 +++++ +kingfisher +gfhjkmgfhjkm +tennessee1 +suicide +phillies +ohmygod +pathfinder +august22 +cucumber +jay +carter15 +1959 +1fucker +drakon +stinker +marseille13 +today1 +123456qaz +carrera +cococo +snow +asdfghjk1 +chase123 +ginger2 +capital1 +playgirl +abby123 +valerio +susanna +minouche +sonny +tanya1 +180 +bluesky1 +malena +karthik +daddygirl1 +flavia +football33 +123zaq +159852 +pepita +mushroom1 +jackal +mikayla1 +june19 +tmm +poop1234 +avalanche +princes +carpenter +yourmom2 +bermuda +deutsch +garnet +charlie01 +forgot1 +jethro +samurai1 +mckenzie1 +prince123 +zodiac +kimmy1 +cdtnbr +supernatural +ferguson +197777 +novembre +eliana +deskjet +mazdarx8 +123456798 +weare138 +zero +genius1 +tits +killer69 +blaze420 +pooh123 +money10 +yesterday +chris5 +++++++++++ +r1cd38d +mamacita +rosemary1 +jordyn +clancy +nicole23 +maxine1 +moimeme +freebird1 +753357 +charlie7 +radiohead1 +obiwan +april28 +topher +rock12 +really +thomas11 +myspace14 +indya123 +intruder +fabulous1 +bear12 +crimson1 +justin13 +ewanko +edgar1 +curious +fuckyou9 +fucklove13 +shilpa +chelle +959595 +enter123 +17171717 +turtles +rahman +running1 +1957 +fiorentina +topdog +reddevil +monkeyman1 +roswell +hahaha123 +gymnast1 +capoeira +condom +paul123 +narnia +20082009 +ferreira +julia123 +belinda1 +knowledge +money09 +powell +vasilisa +halima +tinkerbel1 +killers1 +july15 +bitchy +superman11 +kennwort +lukasz +333999 +e3r4t5y6 +anders +candace +blue99 +trains +daniel10 +bombay +sonnenschein +joelle +goaway +bonjovi1 +asshole69 +computador +sheena1 +user888 +alex22 +ddddd +любовь +chris22 +football6 +hopper +lespaul1 +1chicken +tralala +ihateyou! +260 +geminis +jan +marlene1 +archangel +criminal +131420 +qwerty23 +36mafia +artist1 +balla1 +chris21 +virgo +none +. +cash +bacon1 +7758520 +corleone +828282 +aa +oreo123 +100500 +romance1 +june27 +florin +seven11 +master +borabora +b123456789 +000777 +qwerty. +princeton +flight +123q123 +frisco +money13 +stephan +cesar1 +america2 +pink1234 +tennessee +madagaskar +cartoon1 +jonjon1 +rainbow7 +121234 +slut +margarida +darrell1 +qwerty0 +afrodita +nfytxrf +wazzup +a1111111 +hey +caleb +f12345 +tommyboy +march25 +nicole +222111 +crevette +maggie11 +daniel +loveable +hotshot1 +elwood +charmaine +saxophone +lover101 +oranges1 +9876543211 +160 +misfits +dynamite +a121212 +asdfjkl; +michael +password18 +expert12 +emerica1 +pimpin69 +moskva +100484 +boobie +telephone1 +norbert +annaanna +purple! +shankar +iloveyou16 +cathy1 +sinbad +hannah +milkyway +l6ho3tg7wb +love05 +ne1469 +manhattan +sanders +froggie +sugar123 +1234567d +underoath1 +hazel +karen123 +gmoney +nemesis1 +expert +555555555 +april29 +gamecube1 +angel666 +joshua +babygirl20 +aurelia +tartaruga +momanddad1 +craig +sample123 +libby1 +werwer +lingling +cutiepie12 +presley +bam123 +hihi +sharpie1 +hejsan123 +gribouille +171204jg +lol101 +multimedia +george12 +srilanka +austin01 +misty123 +computer123 +bitch7 +miami +patrick2 +erin +alex14 +mitch1 +krishna1 +edward12 +krissy +priscilla1 +boobie1 +louisa +malinka +211314 +121212q +pete +ohyeah +5482++ +steven12 +666666666 +zzzxxx +minnesota +emanuela +severine +kassandra +012345678 +serendipity +ashley3 +meatloaf +miguelito +cookie11 +souris +sweetlove +colocolo +havana +annie123 +boxing1 +princess19 +1234567k +physics +mamasita +infinity1 +asasasas +boyfriend +camper +cobain +karma1 +shiva +lolalola +harris1 +panic! +dontknow +1dragon +cunt +happy7 +sexybaby +scream1 +niklas +alexis2 +yellow5 +coolkid +poiuy +eloise +jehova +q111111 +eugenia +berenice +1213 +400101 +shiloh1 +undead +polpol +pepper01 +654321q +trigun +angels2 +sexybabe1 +august14 +love2love +dupa +bigboobs +kasia1 +olumide +147 +boomboom1 +victor123 +loser5 +wz362308 +summer2010 +henrique +aggies +12345678900987654321 +nokia5300 +empire1 +bighead +mahalkita1 +terminal +hello2u +diana123 +divorce +dinara +blanche +alcatel +premier +gideon +258741 +lisalisa +q1q1q1q1 +chino1 +march14 +ranetki +1958 +chelsey +hockey10 +checkers +m1chp00h +hopeful +mylove12 +maggot +sanjose +angus1 +pink10 +lovehate1 +fuckoff69 +qwerty3 +baptiste +67mustang +zebra +password12345 +crackhead1 +gbhfvblf +allmine +ocean +bdfyjd +moocow1 +yjdsqgfhjkm +ashanti +zimmer483 +nico +june30 +ale123 +zzzzzz1 +mexican13 +samsara +amanda11 +bigmac1 +gayathri +lion +diane1 +purple5 +kingpin +sneaky1 +sinaloa1 +rookie +1onelove +myspace6 +goodday +marc +steve123 +imesh +toronto1 +789123456 +pretty2 +champ +loveyou12 +cookies2 +haley +corina +mikael +starwars3 +pepsicola +numero1 +kylie1 +stalin +lunita +berry1 +babygurl2 +o123456 +johanna1 +coralie +jordan23 +gbcmrf +poppop1 +tajmahal +forward +12369 +godsmack1 +josephine1 +bassman1 +tripleh +woohoo +satish +9562876 +cv1230 +lotus +shitty +1357908642 +fabiana +jason12 +manzana +alpha123 +voodoo1 +hotchick +million1 +salazar +987412365 +benjie +nicole27 +momoney1 +jehovah1 +jeff24 +ulysse +oliver12 +zxcvzxcv +james11 +sander +1qaz!qaz +rockets +milka +whiskers1 +service1 +jesus10 +pharma +science1 +snatch +hello123 +kool123 +godson +bjk1903 +marty +linkedln +789456a +abcdefghi +gwapako +sexy24 +smoker +annabelle1 +iloveyou01 +elena1 +cute12 +libra +3456789 +devin +juice +death123 +74107410 +nigga12 +football32 +pink14 +tina123 +kayleigh1 +khalil +sofia1 +aubrey1 +dbnfkbr +20042004 +bakugan +malboro +claudine +april27 +seeker +orange11 +neopets12 +firenze +medion1 +summit +november19 +martin +tangerine +hello13 +lilbit1 +brennan +laurel +savior +truck +190986 +mmmmmm1 +avatar1 +1233210 +soccer99 +imthebest +azertyu +juice1 +blue14 +alex21 +syracuse +loser! +zerocool +wolfpack1 +mariela +regine +fuck1234 +blackcat1 +scorpions +blanco +detroit313 +iloveu3 +1231230 +fucked +denmark +c123456789 +woshiyazi +asdfqwer +henry123 +july10 +anthony +ghbrjk +giorgi +spikey +green22 +memories +shalini +zsazsa +mrf11277215 +sanandreas +lucky3 +koko +richard +black13 +silverado1 +journey1 +browns1 +quincy1 +passer2010 +zalupa +coleman1 +newyork2 +samantha2 +operation +one2three +kiara1 +quantum +vegas1 +homerun +0o9i8u7y +popcorn2 +1q2q3q4q +wanker1 +lambert +puddin +rob123 +302010 +sapphire1 +yeshua +military +magnolia1 +jimbo1 +iluvu +zzz123 +sunshine11 +moncoeur +spoiled1 +racoon +july13 +july16 +tree +mama11 +300 +killme1 +avril +iloveindia +luckyme +obama08 +for +honey2 +poupette +ramones1 +teodoro +virus +candace1 +etienne +198500 +nookie +bababa +afrika +rochelle1 +ocean1 +western1 +peaches2 +vince +guitar123 +lili +marek +xanadu +breezy +lamar1 +keystone +jonny +goodgod +t: +dfa72dfj +cbr600rr +birillo +neelam +pissoff +rasta +hellyeah +jordan22 +player12 +poptart +benson1 +a987654321 +goldwing +camel +justin +boots +mykids1 +the123 +calypso +???? +superman13 +bobcat1 +vampir +whoami +nitram +football55 +darthvader +superman5 +capital +memorex +o +roland1 +torres1 +avery1 +herman1 +samsam1 +trustnoone +poohbear2 +robert01 +270 +bonkers +notredame +fucker! +love666 +july17 +glenda +playboy2 +fuck13 +ffff +julio1 +198600 +karaoke +bombom +joyce1 +ann +chunky +carla1 +master11 +liverpool2 +maximka +020 +felix123 +corsica +12qwerty +dentist +savanna1 +nigga2 +ethan123 +nadejda +challenger +dialog +coolness +andrew13 +madison3 +biatch +villanueva +ademola +flamingo1 +spidey +selene +fuckyou23 +cougars1 +ellen +catcat1 +crack1 +chopin +agatha +carmine +resume +moses1 +plumber +faker1 +ventura +truck1 +222555 +848484 +ilovejosh1 +electric1 +artur +213213 +rasputin +donuts +romario +zoloto +yop7s55 +00000a +1qaz2w +nicole! +1123 +drama1 +fitness1 +carpet +pppp +purple4 +shivani +falcons7 +bluedog +pallavi +123456789a +romantic +martine1 +personal1 +doktor +waffles +atlantic +fantomas +olimpia +flipflop +marmar +tazman +scott123 +baby18 +livelife1 +driver1 +number10 +birmingham +aladin +oceans11 +limpbizkit +celtics1 +waterpolo +matisse +number8 +assassin1 +sashka +mister1 +brady1 +357357 +number4 +momof4 +lilly123 +moonbeam +october23 +12345y +machine1 +garage +v12345 +paulina1 +critter +159874 +picture1 +hummerh2 +yellow3 +oblivion1 +918273645 +werty123 +sprint1 +smokey12 +123xyz +indians1 +express1 +123123456 +momo123 +tatarin +alex23 +and +october12 +aurelien +leonidas +hip-hop +hotchick1 +funfun +2012 +jjjj +chocolate! +june29 +alphabet +hottie01 +declan +slipknot666 +tink123 +armageddon +chelsea2 +q12345678 +anonymous +diciembre +hotsex +1234567t +03082006 +ashley21 +y +fun +brando +bobafett +hooker1 +android +helena1 +polly1 +hello22 +dominick +winners +iloveyou0 +cosita +sylvain +doodles +loveable1 +cosmo +kenny123 +yfcntyf +qawsedrftg +tania +oxygen +196 +joseph2 +aabbcc +123qqq +march19 +salamander +liliana1 +integra1 +fuckers1 +d +deacon +nigger2 +anthony11 +sheryl +iloveyou +navarro +alfie1 +1955 +aaaaaaaaa1 +soraya +snoopy12 +football44 +h1xp2z2duk +poopy12 +easy +4wheeler +pompey +loveforever +09090909 +tigger13 +90909090 +myworld +bird +mickeymous +disneyland +gonzalez1 +rugby1 +blueboy +jagger +callum1 +marcel1 +monkey99 +yogibear +rhfcfdbwf +golfclub +ultras +saratoga +bigben1 +brittany12 +c +skate12 +ollie1 +goodtimes +breezy1 +smokeweed1 +sausages +aaabbb +karla1 +1357 +because +aurora1 +chelsey1 +yangyang +newport100 +pizdec +junior13 +rusty123 +a12345 +krolik +sexxy1 +duck +frisky +reddragon +rosie123 +armand +e23456 +july11 +asdasd666 +barracuda +kids +reynolds +godbless1 +alan +amizade +fingers +lauren123 +p0o9i8 +ronron +carlos13 +perrito +x +austin11 +palmeiras +tessa1 +dejavu +crawford +1jessica +roadking +3edc4rfv +excellent +maggie +blessed2 +chi +molina +wetpussy +loveit +audia6 +smirnoff +ruben1 +football25 +browneyes +280 +princess18 +gmoney1 +634142554 +esmeralda1 +football15 +daffodil +starwars2 +bruiser +carlito +bigboy2 +idk123 +flavio +astonmartin +georgie1 +william +dingdong1 +change1234 +resetme +i123456 +bla +78945612 +tigger22 +queenie1 +angel24 +gabby123 +aaabbb2 +shadow3 +cfvceyu +stone +gollum +march26 +october21 +gustavo1 +charmed3 +twinkie +preacher +buster +ilove2 +star22 +piotrek +baseball25 +jennifer2 +tupac +clemence +servus +cortez +hammer123 +tracey1 +fire123 +lilbit +anna12 +kavitha +abbey1 +asdf11 +bubba2 +bigboy12 +s +kamil +thethe +shasta1 +dogs123 +master01 +chelsea12 +prettyboy +asawako +bluestar +prosper +bullseye +001001 +pizza12 +gerald1 +farhan +lovegod1 +biteme69 +typhoon +13572468 +145632 +aleksei +camila1 +timber1 +randall1 +qwertyuiop12 +connect1 +hugoboss +tim +whocares1 +webmaster +march31 +sexyass1 +pimp01 +paranoid +brett1 +223456 +cameron2 +crazygirl1 +leopold +aqwzsxedc +1stunna +john11 +estefania +lucky11 +elvis123 +riverside1 +janelle1 +akira +target1 +blood123 +schule +cleopatra1 +another1 +q1q2q3q4 +chocolate7 +bobbie1 +zephyr +elsalvador +marisol1 +cruzazul1 +9876 +needforspeed +model1 +gypsy1 +brewster +gotmilk1 +thalia +duchess1 +arcangel +mic +chica1 +jfgvcqbuzug +wewewe +jazzy +desember +blood4life +film@123 +chris18 +maiyeuem +backstreet +jonathan12 +grumpy1 +austin2 +bella2 +santa +droopy +myszka +wilfried +apollo11 +gtnhjdbx +sekret +1hello +gagaga +august18 +fabian1 +morgan123 +smudge1 +dupa123 +lexor123 +197 +august19 +951951 +biologia +march16 +july24 +jesuscristo +maddy +new123 +sharky +sienna +valhalla +matty1 +varsha +mickael +ana +double +collin1 +asshole3 +bastian +ashley! +august16 +sarah12 +intrepid +secreto +rencontre +iloveyouba +westside13 +artem +werty1 +tahiti +carlitos1 +bollocks1 +271282 +march27 +badboy123 +1qaz2wsx3edc4rfv +michaela1 +clueless +dodger1 +bigmama +sexii1 +blues1 +hitler1 +blink123 +cosworth +hunter +963369 +shevchenko +lovely +shreya +ant123 +william12 +4jesus +boeing +zxcvbn123 +stimpy +slovensko +123admin32 +cody12 +lady123 +ctrhtn +4545 +1111aaaa +doobie +wireless +miles1 +carine +rhfcjnf +money08 +capucine +eddie123 +9874123 +topbutton +bitch21 +stefan1 +494949 +gucci +supreme +reunion +magical +piccola +agustina +nenita +trust1 +kfgjxrf +shadow22 +migrationschool +godwin +dddddddd +letsgo +tricky +78787878 +myriam +noemie +mistral +vinicius +aassdd +mischief +oreo +gary +calculator +kat123 +198400 +abc123! +highschool +mustangs1 +fishy1 +gwapoako +mudvayne +celtic67 +daisydog +niners +radical +philipp +orange3 +mongoose1 +jon123 +rivers +stewie1 +jaime1 +cookie13 +qw1234 +numberone +killer23 +hazel1 +weedman1 +lovely69 +tootie1 +asdfghjkl +357753 +miles +purple23 +kazantip +bears +gabriella1 +moussa +potato1 +paper +melissa123 +massage1 +matthew7 +hellboy1 +pepper11 +marron +loveme4 +stasik +blue15 +fyfnjkbq +bitchass +march20 +mikey123 +mars +667788 +olalekan +ksenia +zidane10 +cuteko +1956 +july27 +payton34 +nuvola +hockey7 +august15 +peanutbutter +hillbilly +citizen +gangsta2 +insomnia +surabaya +rocketman +abraham1 +12345687 +090790 +baby17 +genevieve +hunter3 +dominik1 +butterfly6 +jesus1 +loveu4ever +1moretime +maminka +baggio +formula +120679 +japanese +heka6w2 +boob +march28 +overdrive +919191 +fordfocus +14789 +wiggles +michael4 +crazy13 +harlem1 +wally1 +tipper +123wer +august25 +celtic123 +babygirl8 +money21 +poupee +1234567890-= +a666666 +espana +angelic +keepout +superman! +1234567u +fxzz75yer +boxer1 +1gangsta +my204856 +edwin1 +engine +sunrise1 +michelle3 +vfntvfnbrf +chocolate3 +119119 +d4 +shaun1 +sunsh1ne +amanda01 +deathnote1 +timtim +grapes1 +doomsayer.2.7mords.vv +profile +qwerty88 +nipples +013579 +ashley14 +ggggggg +love93 +zzzz +jessica11 +gorillaz +bolton +shashi +cuties +mother3 +smarties +peanut01 +dummy1 +bigbird1 +lexus1 +greeneyes1 +lolololo +thiago +play +elizabeth +lbvjxrf +ou8122 +armyof1 +david13 +august28 +qwaszx123 +emerson1 +aventura +bowser +aze +poodle1 +depeche +redfox +leigh1 +godblessme +kickflip +yahoo12 +southpole1 +caitlyn1 +capone1 +sancho +augusto +qwezxc +cheese3 +hithere1 +december19 +oldschool +blogs123 +nokia6600 +drag0n +contrasena +reglisse +babies1 +getajob +david01 +awsome1 +bigballs +justin10 +charity1 +my.space +casper123 +trustno1 +delilah +avenger +charlene1 +200200 +danny12 +lenlen +zelda +iiiiii +qaz12345 +misha +chiquita1 +danielle12 +1225 +juliana1 +metalica +noviembre +music! +burger1 +dani123 +jesus13 +qw3rty +quiksilver +bernie1 +july18 +justin3 +tiburon +christian +777777777 +chris15 +665544 +october22 +qwe123asd +dragon10 +joyful +rasta1 +babygirl18 +marion1 +melbourne +mommy4 +redhot1 +ashley16 +smokeweed +chipmunk +ddd +pokpok +rubber +hockey13 +ludacris1 +pereira +poncho1 +woaiwojia +asdfgh01 +gatorade +sepultura +sheba +123odidol +michael! +molly12 +gaetano +homie1 +redfish +sixers +mark12 +valery +love03 +jeff123 +pancake1 +hilaryduff +01234 +preeti +rosanna +maemae +princess07 +liquid +naruto10 +caracas +divina +riverplate +virgo1 +britt +iriska +nathan01 +july28 +usher +sunnyday +vika +1hunter +jackie123 +tanker +october7 +lester1 +canabis +magician +dada +chinita +heyheyhey +nicole16 +765432 +qwer12345 +makemoney1 +passme +lifetime +mmmmmmm +intermilan +sexygirl12 +ggggg +bigmama1 +ljxtymrf +zzz111 +sooner +keisha1 +tictac +ahmed123 +chick1 +subway1 +18436572 +whatthefuck +babygirl07 +anthony01 +obelix +samantha +crocodile +game +yourmom! +anastasia1 +luis12 +rebekah +1234567891011 +candyman1 +nice +papa123 +broncos7 +pillow1 +windowsxp +marty1 +chicken! +kristy1 +summer! +19621962 +thompson1 +alexan +love94 +dave123 +yahoo! +freestyle1 +mail.ru +mahalkoh +peace2 +purple01 +fake +shelley1 +200991 +lover3 +lucky5 +universal1 +madinina +jordan21 +manunited1 +karima +webcam +october2 +198700 +aaa123456 +dynamo +molly2 +toby123 +boyboy +social +tribal +bigboi1 +killbill1 +scoobydoo2 +hello12345 +pink23 +asdzxc123 +jjjjjj1 +01011990 +dawn +chinedu +fucker69 +him666 +888 +привет +tornado1 +dinosaur1 +julio +rodina +gatinha +orion1 +mike13 +777333 +050 +dogcat +dddddd1 +killer3 +qaz741 +xblhintb9w +hhhhhhhh +jelly +akshay +telecom +patrick123 +babyphat +olamilekan +lancaster +charley1 +rhonda1 +silent1 +r9lw4j8khx +bastardo +chihuahua1 +guitare +camaro69 +revolver +giselle +rocco1 +homero +matheo +qaywsx +ilovealex1 +freedom7 +smokey123 +nike23 +zxczxczxc +groovy1 +123546 +muriel +whitesox +merda123 +vortex +daniel7 +goodgirl1 +rfhnjirf +salut +reese1 +brett +barry1 +vittorio +cupcake123 +bigguy +caonima +swords +135135 +vadim +chantelle +marquis1 +yellow22 +greentea +ledzep +ilovenick1 +harley +huskies +darnell1 +starfire +hello0 +starcraft2 +nibbles +biohazard +fuckmylife +poison1 +dead +goodluck1 +henderson +sal +icu812 +friends3 +yvette1 +tatata +nadine1 +redwine +forgotten +hottie5 +emperor +meatball1 +1killer +macaco +sonata +natascha +sanjana +norway +jill +bullfrog +murzik +frozen +edgar +bingo123 +melissa2 +sexybeast +elisha +gansta1 +12131213 +dallas12 +rusty2 +constantin +skate2 +bettina +leanne1 +deluxe +holidays +mike22 +mustard +camping +pepe +chaser +penny123 +sport +kickflip1 +popcorn123 +arschloch1 +atticus +sandra123 +kisskiss1 +titi +rick +spotty +bdfyjdf +speaker1 +sherwin +snapple1 +naomi1 +gggggggg +rocco +cats123 +solaris +mv46vkmz10 +kingston1 +zxcasd123 +tantan +common +people123 +july29 +030201 +james01 +tmnet123 +studio1 +michael8 +tequiero1 +albania +square +thankyou1 +333666999 +wwwwwwww +petra +andrea12 +jimbo +napoleon1 +august17 +raquel1 +princess6 +du8484 +holyspirit +need4speed +cherry2 +pumas1 +friends4ev +redrose1 +alena +chunky1 +markiz +apples12 +abc456 +bumblebee1 +bradpitt +zzs000000 +cam +chris17 +xtseo2011tdx +patricio +nadia1 +chris7 +redline +peaceful +kayla12 +poi098 +july19 +luisito +cruiser +goodboy1 +princess69 +my1space +chicken3 +qqq +1223334444 +honeys +samuel123 +sta +ripley +bigbear +jester1 +ambition +mommie1 +kenshin1 +290892 +trucks1 +dayday +clever +bitch6 +bronco1 +freeze +qwert5 +lovelovelove +hola12 +narayan +art +caralho +jessica01 +access1 +mobile1 +gareth +charlton +lfitymrf +jarule +eugenie +grateful +jonathon +1020 +deepika +vova +snakes1 +120279 +newpass1 +superman10 +bball11 +sunlight +vanessa123 +august10 +triplets +malaka +track1 +dammit +sicilia +rhjkbr +colin1 +metalgear +blackman1 +tim123 +hansen +july25 +cherries1 +gutierrez +hellomoto +fucker123 +lovers123 +graffiti +??????@mail.ru +silver123 +magenta +bitch14 +elizabeth3 +konrad +bryant1 +saraswati +martin12 +patryk +asdfjkl1 +maya +baby06 +password55 +1babyboy +chavez +knuckles +bouncer +152535 +lizzy +amber12 +somebody +tabby1 +-deleted- +batman11 +nirmala +jungle1 +biloute +chandu +falloutboy +pancakes1 +rugby +letmein! +lilith +246800 +all4me +kkkkkk1 +bud420 +1qw23er4 +zaragoza +tamtam +3angels +alfred1 +doghouse +6358986 +angel777 +remington1 +ilovemybab +aussie1 +bitch09 +16051980 +aguila +marquis +iloveboys1 +magda +baseball17 +spongebob3 +zero00 +*123456 +jesus +river +twelve12 +gitara +marsha +222222a +blowjob1 +bisous +asdfg12 +meister +sukses +bball3 +ilovemike +admiral +scout +april2 +111122 +pimpin101 +awesome123 +2345 +google2 +kansas1 +198200 +kamala +costarica +darryl +apple3 +alohomora +destiny123 +199999 +titleist +fuckyoubit +reading1 +hastings +piano1 +18181818 +shearer9 +!qaz2wsx +fuckyou420 +fuckyou21 +sasa +adadad +georges +torrent +spartacus +number23 +august24 +brad +mad +pooppoop1 +michoacan1 +chivas9 +fantastic4 +truman +956208q +alone +bruiser1 +cristiano7 +iamgod +pixie1 +warning1 +gustav +qwerty00 +redhat +newzealand +hotwheels +6strings +amanda13 +lakeside +colette +welkom01 +brandon5 +french1 +mamma1 +brandon13 +fk3456abc +december10 +warhammer1 +niggas1 +shark1 +007bond +151617 +johnathan1 +12s3t4p55 +fantom +tyuiop +030 +lol123456 +atreyu1 +bennie +hitman47 +timoxa94 +king11 +cyclone +1ashley +greenbay1 +ashley22 +worship +190494 +yousuck2 +davis1 +showme +gregorio +stupid2 +walkman +iloveme12 +anthony4 +daniel22 +charli +penguins1 +miriam1 +colby1 +yfz450 +elisabetta +siemens1 +pppppppp +mommie +cerberus +123147 +kobe08 +fergie1 +nautilus +compton +1friend +lovable +jerry123 +dwight +123abc456 +marina +thesims +122334 +picasso1 +crazybitch +playtime +098098 +bluemoon1 +julius1 +1shadow +0o9i8u +midnight12 +ssssssssss +ximena +tessie +007007007 +rotterdam +mayhem +nosferatu +yellow7 +westlife1 +ramazan +purple10 +evelina +compaq123 +stupid123 +lulu123 +mandy123 +jesus101 +heather2 +butch +dad +space123 +angel1234 +gfcgjhn +dreaming +rapper1 +america13 +collins1 +dmoney1 +stone1 +wer123 +butters +gthcbr +sunshine01 +rob +tinker2 +lfybbk +040506 +angel06 +august31 +dragon3 +calibra +musiclover +husband1 +gu1tar +allahuakbar +camelia +bar +gunsnroses +feyenoord +99887766 +cheer12 +demon1q2w3e +zaq12345 +python +gatorade1 +howareyou +olanrewaju +james13 +123456789123456 +tresor +sassi123 +gofish +hannes +toutou +jessica! +lpl +president1 +gettherefast +a +killerman +roses1 +football07 +papichulo1 +heavymetal +minime1 +nina123 +garden1 +shivam +digimon1 +65mustang +julianna +april4 +solidsnake +tttt +pwtest +andrey +dasha +baller2 +112 +rugrats +floflo +png +dreamcast +u23456 +phoenix +partner +pepino +countryboy +farmer1 +ginger01 +honda250 +soloyo +sexy19 +cloud +hotmail123 +aishwarya +liverpool5 +southern1 +banana12 +guitar2 +milashka +aidan1 +345345 +bitches2 +football34 +ashanti1 +ashley10 +deusefiel +evolution1 +chestnut +heavenly +princess24 +devils1 +123123z +l +bubbles3 +secret2 +flores1 +florent +october11 +clementine +cousin +shauna +ilovematt1 +popstar +1223 +camara +anitha +dancer12 +dragon21 +liverpool1 +seahawks +kidrock +chevelle1 +sexy#1 +link123 +anakonda +scottie1 +puzzle +zero123 +maryland1 +campbell1 +dra +110018 +pimp4life +ksusha +maureen1 +butterfly9 +pommes +july31 +carrot1 +platon +geetha +geheim123 +andrew3 +jordan4 +vipers +hampton +no1knows +anusha +pink21 +shearer +find_pass +518518 +lover5 +sheridan +fiorella +homies1 +snoop +mommyof2 +3698741 +karolina1 +mcdonalds1 +christin +kitchen +mistress +kowalski +smokey2 +myspace4me +motherof3 +liverpool123 +diamond123 +chris16 +predator1 +happy3 +rfn.irf +april30 +tarheel +b +nicole5 +love2007 +123456789* +internazionale +bernice +000666 +daniel3 +852741 +tunafish +seahorse +sidekick1 +lovers12 +ramirez1 +jasper123 +fidelio +michael10 +smile2 +1234qwerty +sporty +asd666fds +hotty +salamandra +bubby1 +octavia +loveyou! +1235 +c00kie +pizzahut +goldfinger +bbbbbb1 +system32 +bball22 +bengals +hurley1 +love +jackson123 +walleye +dawson1 +carlton1 +01012011 +2twins +shahrukh +ananda +march29 +demon1q2w3e4r + +marie3 +baggies1 +method +october14 +bvp33w7epu +tracker +klopklop +gospel +pinkpink +monroe1 +morrowind +lordjesus +princess17 +dragoon1 +jackass123 +whitesox1 +clarisse +october15 +butters1 +princess20 +snowie +ruthie +ringo1 +chicks +masamune +alligator +kolbasa +vivian1 +balloon +nessa1 +love420 +rufus +sarasara +beloved1 +oioioi +mike69 +mygirl1 +1baseball +whatup1 +immortal1 +jordan45 +ankita +einstein1 +leonel +wert +mohamed1 +cutie13 +havefun +insurance +hottie4 +pink15 +krista1 +mandrake +taylor10 +zaqzaq +football. +carebears1 +football69 +denis1 +magick +magicman +apples2 +123454 +1flower +adrian123 +destiny7 +popo09 +789456123a +alianza +nicole15 +candela +beatrice1 +viper12 +shane123 +bigone +iloveme3 +snowy1 +maisie +players +watson1 +grant1 +1112 +stacy1 +3daysgrace +stuff +alex15 +bobby4 +rjhjdf +thisisme +octubre +kids123 +matrix123 +silver12 +eatme1 +19601960 +siobhan +azert +origin +68camaro +friendofjoan +mateusz1 +lululu +y23456 +paradis +gallardo +362514 +hellomoto1 +password45 +mindy1 +mel123 +1010101010 +bitch4 +doremi +victoria +dragon99 +poop69 +mark_963 +loser101 +tereza +&hearts: +green23 +jalisco1 +bounce +gayatri +deadhead +pistache +embrace +taylor3 +saretta +roberta1 +rbotmvz954 +tortue +gamer +titanium +lennon1 +harish +lara +5plk4l5uc7 +jim123 +nellie1 +magnum1 +raistlin +nfy.irf +alisa +dakota12 +leroy1 +jade123 +maria13 +aramis +wareagle +continue +grandad +090 +uzumaki +eistee +stewart20 +fraser +159357a +taylor +portable +tunisie +goofy +avinash +painter1 +23 +jamesbond1 +stuart1 +bearbear1 +a55555 +0007 +martini1 +myspace06 +eri +hey12345 +ballerina +yourgay1 +rashid +tata +kaitlin1 +verizon +aloha +pandabear +hansolo +cornwall +qwerpoiu +july20 +beretta +nanny1 +b-ball +bobdylan +quattro +weronika +21 +1qaz@wsx +poiuytre +omar123 +sixty9 +lovesex +alexia1 +147258369a +1nicole +starwars12 +jayson1 +samsung2 +reliance +juliana123 +eternal1 +chuckie1 +wisconsin +adrenalin +jimmie +belinea +squirt1 +notredame1 +jessie123 +blackout +myboys2 +killzone +bangkok +liz123 +animation +cocaine +bigfish +alyssa12 +mac +ola +o23456 +vasiliy +shakur +jaime +kkkkk +nokia5200 +booster +flo +twinkie1 +sisters1 +gunther +forrest1 +thebeatles +marie13 +catman +ruby123 +singing +12346789 +fatty +children4 +nickolas +bertrand +diva123 +102030405060 +hannah10 +kat +windsurf +rerere +vera +hockey123 +xiaoxiao +bandit12 +youknow1 +combat123654 +p4ssword +coccinella +angell +superman123 +love32 +salasana +babygirl6 +vjqgfhjkm +queens1 +marimar +princess123 +555555a +bookie +slinky +whatever4 +class2010 +mustang50 +member1 +marie05 +bmw325 +herbert1 +fuckfuck1 +rfntymrf +5845201314 +contrase +nick11 +sophie12 +monkeyboy1 +serseri +suslik +doodlebug +555444 +public +tzir25l5kn +12345678d +3.1415926 +star10 +harekrishna +chingy +5x1cjdsb9p +whatever12 +monkey15 +schneider +vienna +marita +4girls +thailand1 +maserati +meandyou1 +rooney1 +july26 +777888999 +vivien +electrical +khaled +bacon +august26 +vintage +capetown +fuckyou0 +aliyah +bible +peterbilt +shazam +november12 +jacob12 +consuelo +senator +michael21 +qwerty1 +mel +grant +inuyasha12 +ddddddd +sheffield +softball5 +reno911 +omni +love96 +pegasus1 +squirrel1 +jaybird +snoopdog1 +jammer +nurse +gina +chad +pipoca +love90 +brandon11 +getsome +infantry +london01 +thematrix +1chris +perros +ohiostate +hugo +qwerty10 +richard123 +dedewang +rapper +sandwich +ashley15 +natasha +pigeon +lacrimosa +password25 +hello4 +30media +ilovemykids +punisher1 +cookie! +kitties +cocksucker +downtown +tundra +peace12 +pooter +137900 +diamond12 +lemons1 +dedede +whatup +combat +cvzefh1gkc +stronger +queenbee +chloee +doggies +filipe +coca-cola +pol +qwer1234 +richard2 +pimpdaddy +makaka +roxie1 +jason2 +wrangler1 +playstation2 +japan1 +terrence +tigger +macdaddy +tigerlily +1fptjtl919 +uzumymw +freedom123 +1234123 +hockey99 +justin21 +1dollar +blues +187187 +india123 +jesusloves +twins1 +west +q123123 +generation +rich +loveme22 +johnnydepp +sauron +madman1 +corentin +jackson +sheetal +abby12 +bubbles! +scheisse +niggers1 +softball14 +bart +robert11 +airplane1 +rescue +auditt +world +can +player123 +egorka +101090 +arod13 +heyheyhey1 +baltimore +lopata +kurtcobain +rocky12 +armani1 +cutie11 +bambi1 +jazzy123 +tatjana +edward2 +meenakshi +w1aubvoq +danish +surprise +mariners +040 +rachel12 +ottootto +bismilah +gwapoko +flatblocker +chocho +mustang67 +gaelle +sokolov +122122 +michael22 +dreamgirl +hottie69 +sharks1 +ann123 +algebra +barbie12 +rudolf +babyboy123 +checkmate +welder +skyliner34 +himanshu +merlot +lollol123 +aerosmith1 +llama1 +blaster1 +joselito +hunter5 +october3 +stuttgart +david11 +sylvester1 +centrino +zach +sex101 +060 +barry +hockey2 +pink16 +nik +realestate +romans +dodong +honolulu +nascar8 +bob1234 +blue44 +stoney +santafe +sergey +beamer +& +27081989 +918273 +sinatra +vietnam1 +1mustang +juju +longbeach1 +football99 +turtle2 +analsex +boss123 +guess1 +princess. +daughter1 +kirby +romane +charlie5 +camel1 +keller +lolol +julie123 +scamper +keywest +purple8 +vickie +jasmine7 +couscous +myfriend +cheese11 +miley123 +sally123 +1sexybitch +wasabi +skaterboy1 +carlos2 +trisha1 +noelia +butterfly5 +tenten +lynlyn +funtime +bitch08 +maxim +camion +linker +naynay +mickey01 +kamran +matematika +native1 +zorro1 +400064 +softball22 +ang +weather1 +eastside13 +ricky123 +camden +500500 +peach +tony20 +softball8 +nokia5130 +sony123 +bailey2 +12345x +brebre1 +justin22 +halo12 +birdie1 +poophead1 +asasas1 +forever123 +foster1 +iloveyou18 +antonina +sch +popopopo +heartless1 +wassup1 +trapper +blacks +1qazxsw +tiamo +7894561 +bobby12 +love66 +love95 +bubba12 +boyfriend1 +sahabat +august27 +bryce1 +nenette +demon1q2w3e4r5t +trinitron +iluvyou +property +italy1 +beebee +vacances +290 +ninjas +johncena12 +may +divine1 +devine +171819 +dundee +browneyes1 +korova +saopaulo +dfytxrf +junkie1 +weston +1jordan +1a2a3a4a5a +0147852 +101088 +tiziana +pistol +forgetit +nipple +gangsta6 +rafaela +putter +19 +antoinette +jeannie +hunter13 +proview +myspace201 +9958123 +sephiroth1 +active +dirty +chintu +asdfgh +bootsie +coolgirl1 +hello99 +pegaso +october16 +rita +010989 +paris123 +noah +newyear +godslove +carter3 +allie +junpyo +kimber +taurus1 +cullen +olive +lovejesus +harley69 +hej123 +lynette +500072 +roshan +1234as +emokid1 +titan1 +fiona +zaqxsw12 +annmarie +hockey19 +transport +unlimited +allyson +harvest +trustme +fyutkjxtr +iloveyou143 +surf +curious1 +tigers12 +cutter +musical1 +cowboys9 +island1 +aries1 +jordan14 +tink12 +fun123 +bastien +1954 +fcbayern +hot97hot +cesare +berlin1 +mallard +jessica1 +satan1 +2cxdn8s271 +grayson +vaishali +anamika +number6 +r123456789 +nike12 +saviour +kevin11 +????? +steph123 +fernandes +tigger3 +plasma +cheerleader +and123 +salinas +celticfc +gunnar +dougie +frodo +diehard +987654a +jim +stephanie2 +!qaz1qaz +520530 +march3 +concorde +12345six +edinburgh +community +johnboy +mouse123 +++ +static +slipknot12 +wheels +annemarie +omar +badboy12 +bra +mutter +happy5 +hungry +rockie +topgun1 +01234567890 +pimp14 +becca +loveme69 +1224 +chris6 +bball10 +riley123 +subaru1 +1234aa +foxracing1 +gravity +cancan +opopop +jj1234 +monkey. +sensei +j1v1fp2bxm +everlast +tiger5 +swallow +13141314 +seminole +fanny +marias +last +romana +misfits1 +sunshine13 +tommie +dragon01 +111777 +hunter10 +sternchen +silly +berkeley +eleanor1 +rb26dett +globus +favre4 +felipe1 +ernesto1 +nickel +kermit1 +ilovejosh +mazda +1234567r +purple21 +leedsutd +ilovematt +papaya +fragola +123lol +nokia3100 +1234567qq +marta1 +hannah3 +elizabeth7 +azerty12 +hudson1 +serpent +metallica2 +bangbang1 +yu5l97wk8q +qazxsw12 +1qwertyuio +dieter +yahoo2 +renegade1 +blackwater +nevermind1 +marielle +killer99 +bismillah1 +coolbeans +squash +yassine +daisy2 +matthew1 +doglover +harvard +cnfybckfd +gcheckout +hothot +historia +superman69 +samsung12 +chinna +fudge1 +alexis01 +hikari +124578963 +vader1 +ryan11 +bubble01 +username +976431 +thunderbird +nikita +idontcare1 +hopeless +getmoney2 +maomao +letme1n +looney +meridian +divorce1 +poopy123 +airbus +bigpimp1 +october17 +normal +fluffy123 +ball +mcdonalds +sport1 +123467 +cindy123 +psychology +123a123a +gordito +gamer1 +emanuel1 +miamia +black5 +12345zxcvb +ingodwetrust +hfljcnm +123581321 +poker +coach1 +catalina1 +nicole18 +prudence +cornelius +justin7 +mommy5 +russia1 +buddyboy1 +flowers2 +acc123. +1818 +brendon +messi +1baller +ola123 +colin +arcobaleno +masha +jjjjj +junior01 +doggy123 +iloveu7 +nat +nicola1 +morrison1 +catdog123 +lolipop123 +eraser +humberto +1apple +junior10 +brayan +butcher +orange7 +12love +cake +trident +blue45 +gracia +celular +titeuf +michael9 +mamadou +10101 +duke123 +linkedin1 +football77 +booker +rockstar2 +happyfeet1 +ib6ub9 +david3 +augusta +spaceman +flames1 +coventry +sdf7asdf6asdg8df +19611961 +successful +sunshine5 +mason123 +kevin2 +mysterio +blanca1 +ashley23 +nicole08 +12345asdfg +harlem +manning +libra1 +badazz1 +prince12 +hillbilly1 +anthony23 +ffffffff +colors +1212121 +1life2live +iloveyou24 +thecure +hiphop2 +1brandon +universo +honeybear +earth +babybaby1 +tempest +applesauce +hannah7 +cancer69 +estate +dragon23 +rememberme +1919 +zoomzoom +superman +goose +1peanut +tardis +abc1234567 +oceans +amylee +football123 +primus +bennett1 +call911 +bad +qpalzm +station +olaola +3babies +alanis +vikram +shotokan1 +nono +121213 +star14 +ginger11 +cvzefh1gkc +peanut11 +atreyu +mariella +champs +01091989 +krissy1 +austria +green4 +horse123 +august8 +cheer101 +apple5 +987 +manchester1 +emily12 +qwertyasdfgh +sticky +banzai +bv123 +honeybun +159258357 +emogirl +salem1 +reuben +james22 +cooter +darkside1 +nymets +sheldon1 +girl12 +bailey11 +jessica5 +plastic1 +1computer +august20 +hippie +fuckme! +batman13 +hateyou +diamond7 +iloveyou19 +iloveboys +motherof2 +muffins +changes +12345678901234567890 +abc123456789 +charlie11 +manny +pierce +pyramid1 +iceberg +66mustang +hawaiian +chelsea11 +newnew1 +chewie +haslo1 +snuffy +420247 +naomi +davis +maxence +sawyer +3qdlqb49js +nic +nastenka +963741 +mahmoud +sprinter +warrior1 +alcatraz +shiela +marlon1 +morgan2 +foxylady +kimmy +sergej +october25 +matthews +inferno1 +talisman +cloud1 +jer2911 +poiuyt1 +brownsugar +neopets +xander1 +sunshine1 +glenn +living +justin5 +adidas123 +59trick +bizkit +tarheel1 +babyboy12 +kolokol +kareem +monmon +olivia123 +alicante +october5 +emma12 +larissa1 +johnathan +torpedo +hello23 +karukera +1123456 +tiffany2 +1z2x3c4v5b +hhhhh +hoe123 +superfly1 +roxy12 +daddys1 +castor +princessa +angie123 +george2 +shepherd +rjitxrf +honey12 +tonino +devon +nigeria1 +october18 +12345612 +nokia5230 +l123456789 +vandana +miguel123 +max1234 +cypress +hamburger1 +michelle7 +buddy01 +monkey77 +123456@ +stayout1 +weed12 +panama1 +qwerrewq +songoku +skater13 +piper +halflife2 +jen123 +ivan123 +taz123 +beth +meteor +malik +march30 +wtf123 +butterfly0 +bitch. +adrianna1 +david7 +lionking1 +icecream12 +bryan123 +purple14 +woaini123 +planeta +josie +bbbb +dramaqueen +compaq12 +killer01 +shit12 +carly1 +thekid +magic32 +songbird +vargas +octopus +seahawks1 +scooby123 +football01 +marisa1 +daniel23 +winter12 +flyboy +ramon1 +iloveyou20 +milton1 +ballet1 +family1st +alondra1 +santacruz +macintosh +reynaldo +samsung +samuele +drizzt +hell +fredrick +@!@ +love91 +sunshine4 +htubcnhfwbz +pink01 +011194 +arielle +stardust1 +aragorn1 +bieber +looser1 +myjesus +coke +rachel123 +sophie +abcdef12 +silvio +waffles1 +kris +babyg1 +15 +punker +commerce +dupadupa +iloveyou17 +didididi +aminata +iloveyou07 +bff123 +doogie +14725836 +dannyboy1 +october8 +r4e3w2q1 +jello1 +jesus07 +24862486 +obinna +paulette +123qwe456 +philippine +123456zz +1qazse4 +chris69 +ilovemike1 +romans828 +sausage1 +43214321 +tester01 +aze123 +viviane +constance +tweety123 +james5 +mireille +sexyred1 +ladybug2 +travail +12345aa +killa123 +atlars10 +com +angel25 +159357258 +chuckles +juan12 +athlon +bobo123 +1111qq +carmel1 +mackie +whitey +tractor1 +godspeed +november20 +hope123 +king13 +needajob +brandon01 +nfy.if +star23 +triangle +shruti +elmo +121288 +ecuador1 +tycoon +bbbbbbbb +hammed +tree123 +shawna +whisper1 +timberland +patrick12 +horses123 +peach1 +test12 +jarvis +3344520 +shinobi +1717 +ashley18 +pussys +love29 +dudley1 +franky1 +cookie7 +polo123 +kishore +nevim +bigbrother +liliya +zildjian +papichulo +id6c3wr6un +psicologia +madzia +1harley +pistons +19591959 +ser +patriot1 +a1234567890 +bynthytn +ipod123 +kitty5 +ultimate1 +800620 +chanel5 +love4eva +november18 +hellfire1 +westcoast1 +nicoleta +mercado +chicken7 +groove +aguilar +mail +peppino +accounting +woaini520 +angel19 +secret12 +babygurl13 +chicken5 +karla +iamtheone +michal1 +hockey14 +aku123 +crazydog +jimbob1 +bones +goodnews +bookie1 +qwertz123 +limegreen1 +lalakers +dangerous1 +777777a +mango123 +piano +passions +football +terrance1 +blink182 +sixteen16 +den +killyou +babe12 +hassan1 +cookie01 +football88 +sugarbear +jessica +girly1 +vagina69 +anabel +567567 +london11 +erick +spinner +wednesday1 +casper12 +format +antonia1 +qwerty12 +cassie123 +people12 +shadow10 +tigger69 +katharina +integrity +lucifer1 +barber +kamilla +morgan01 +classof06 +123456789x +nefertiti +jessica21 +091296 +superior +money01 +character +070 +cottage +augustus +playstatio +yoshi1 +1472583690 +cheyanne +chipper10 +100986 +fhntvrf +bbbbbbb +buckshot +fujitsu +michaeljac +sassy2 +bacardi1 +ilovehim12 +message +starburst1 +mcdonald +rachid +cheerleade +jennie1 +cacaca +sansan +voetbal +windows98 +jjjjjjjj +tianya +ilovemymum +yasmin1 +andrea +panchito +bandit01 +131061 +megadeth1 +zavilov +400067 +gjkbujy +popova +kittylove +123123aa +winxclub +www +sara12 +tommy2 +schumacher +jenkins +poi123 +phil413 +mighty1 +jazzman +butterfly4 +scooby12 +soccer. +fickdich +gordita +flyfly +sylvia1 +753753 +123red +1bigdick +jordan08 +everyday +casino1 +yes +academia +852369 +ballin2 +8eight +totti10 +sasasasa +cheech +justin23 +shayla +flame +nathan2 +salami +baseball20 +charles2 +mam +modern +killer22 +killer +eminem2 +myangel1 +120197 +mortal +word +dale88 +lakers08 +rfhfylfi +kambing +kamil1 +babygirl17 +24crow +lola12 +robert13 +jellyfish +specialk +deadpool +pelican +132465798 +alberta +gwapa +pauline +leah +simmons +aldrin +quadro +sexylove +1heart +gundam1 +jacky +yosemite +bibiche +hottie7 +brandon +world1 +fox123 +yesenia +hgfdsa +psalms23 +my2sons +mary12 +portland1 +goat +giancarlo +hgrfqg4577 +nash13 +hahaha! +cupcake2 +bugatti +aragon +luke123 +1235813 +greyhound +softball4 +gogo +fy.nrf +rahul +bottle +romeo123 +blue55 +flowerpower +hellos +house123 +mexico11 +terence +cherish +icecream2 +impreza +emerica +strange +oliver +nuggets +runescape2 +muffins1 +12monkeys +danielle2 +lauren2 +passord +wiggles1 +qwerty111 +happy11 +antoine1 +gavin +newday +asdfghjkl:': +tauchen +blue24 +????????? +haters +lover4 +starr1 +nbvjatq +102102 +minicalibra +chinchin +gateway2 +portia +ghost123 +monkey24 +delicious1 +major1 +saffron +galileo +sheriff +ghbdtn123 +mashka +lavinia +gilberto +ghhh47hj7649 +bangsat +1234567y +1234567890z +patch1 +555222 +hansol +kerstin +b1234567 +mustang66 +alien +saurabh +838383 +terserah +football18 +anton1 +oriflame +bosco +shayne +pinocchio +matthew11 +misiaczek +manfred +graham1 +jesus5 +dutchess1 +madden08 +angeleyes1 +grandma2 +anime123 +kitten12 +t123456789 +apocalypse +diamond3 +amparo +rehbwf +jake11 +1012 +mingming +gigi +rocky5 +myspace15 +calle13 +dictionary +1234567l +153426 +uranus +kramer1 +pulamea +rodrigo1 +lololol +jake1234 +cba321 +boys +only4me +mendoza1 +dimples1 +quality1 +august29 +zimbabwe +zhou1980 +phillies1 +jingle +1v7upjw3nt +09051945 +guitar12 +360flip +jaylen +patatina +bronson +jordan! +begemot +cupcake12 +poopoo2 +windmill +daniel14 +october27 +bobesponja +monitor1 +jimjim +barosan +59mile +bigsexy +summer7 +ant +1121 +engineer1 +19weed +number13 +marcin1 +bravo +1asdfghjkl +jackie12 +thomas13 +lucky21 +kartal +vision1 +sassy12 +chickens1 +imagine1 +grammy +tyson123 +pinklady +hawkeye1 +taylor7 +kokakola +dallas123 +qwerty9 +monica123 +1aaaaa +maxell +asturias +weezer1 +royal1 +jkl123 +mephisto +october24 +graciela +coregmedia +moses +qazwsx +j +mimi12 +possible +teresita +zxcvasdf +southside3 +melissa12 +josiah1 +buck +bball21 +dancer2 +thegreat +120702 +madhuri +ssssss1 +simple123 +redsox34 +milkman +sunshine22 +hockey17 +braxton +olatunji +01011985 +gemma +123456789aa +kthjxrf +bab +prettyme +love04 +soleil13 +lawson +lipton +qazwsx1234 +janvier +chico123 +economics +parents +121106 +cookie5 +reload +george01 +gagarin +horses2 +anissa +kiki12 +hallo12 +shawn123 +homer123 +fener1907 +blowme69 +cocoa +katie12 +shibby1 +orange22 +reginald +chris08 +newman1 +redbone1 +rosalinda +lexie1 +poophead +dodo +friendofgerly +lauretta +buckwheat +someone1 +talent +lucky8 +quebec +daisymae +monster3 +stronzo +matty +tonyhawk +cosmic +water12 +loveya2 +dragon666 +boom +jasper12 +fred1234 +winter08 +jameson +jelszo +dick69 +underdog +pat123 +alfie +ilovemydad +sister2 +baby24 +firewall +god777 +soccer25 +nate +blue33 +soccer33 +380015 +123321z +sissy +dino +skidoo +woofwoof +poo123 +terrance +tamahome +killkill +tomboy +chilli +jordyn1 +champions +89898989 +zacatecas1 +shasha1 +z1x2c3v4b5 +kjrjvjnbd +echizen18 +girls2 +piramide +iamgay1 +evony123 +ramiro +prosperity +james21 +gromit +pixies +hannah13 +marco123 +1210 +dfhdfhf +mayowa +chelsea +beyond +335577 +tolulope +yesenia1 +baseball! +sushi1 +080 +kamote +inactive1996aug +tarakan +carnival +russian +marble +dick12 +198900 +pawpaw +angel05 +1233211 +boogers +ilovemyfam +sparky123 +poupoune +4ever +biggles +televizor +nicole4 +buddy11 +blue01 +crazygirl +iw14fi9jwqa +221122 +golfball +liverpool0 +googoo +shad0w +bigboss1 +66bob +fightclub +greedisgood +1summer +stanford +oilers +dbm +girlie +sr20det +happygirl +chris1234 +1230456 +gogeta +worship1 +connection +hurensohn +caballero +october20 +christopher1 +scratch +0123654789 +ellen1 +puppy2 +asa123 +zipper1 +prelude1 +12step +chinni +barcelone +clark +froggie1 +hockey9 +bigboy123 +smokin +roadkill +ministry +virgin1 +sinclair +francesca1 +winter11 +452001 +jenny12 +cena54 +employment +national1 +mommyof3 +raindrop +kitty3 +12qw! +april7 +ifeanyi +irock123 +ellobo +1234567890qwertyuiop +&hearts +patterson +xt97794xt +mike01 +hackers +ilovegirls +warlock1 +r +gfhjkm +prosto +judith1 +tata123 +vfhujif +october6 +delaney +schnecke +wowwow +policia +forzajuve +prasanna +silvia1 +matthew5 +s0ccer +140473 +reader +frodo1 +tobias1 +jeanette1 +brooks1 +ashley5 +spaghetti +junior11 +00110011 +lily123 +321456987 +audi80 +54321a +alliswell +airborne1 +maurice4 +maldini +mickey7 +monkey16 +marinka +barkley1 +bahamas +banana2 +cachou +28081976 +markie +flamenco +avemaria +mat123 +tacoma +147147147 +25257758 +01478520 +colombo +sowhat +razor1 +yahweh +vfndtq +puppy12 +lithium +joshua3 +couponmom +andrew22 +privacy +paprika +love2011 +1newlife +popular +baseba11 +f: +fynjirf +chat +november17 +zlatan +twenty20 +bahamut +vjkjrj +eastwood +maryann1 +people2 +lioness +rebels1 +1pimpin +74123698 +metall +safety1 +asdf12345 +christa +1234556 +pro100 +look +1michelle +sk8erboi +comeon +delilah1 +steelers43 +joshua13 +malone +vfhbirf +viewsonic1 +nick1234 +karamba +jordan6 +james7 +meggie +albion +mortimer +tripleh1 +jello +superduper +sexy25 +lemonade1 +08520852 +copenhagen +advocate +guevara +fffff +jaylen1 +hotdog123 +ebenezer +amatory +1111122222 +baseball09 +567tyu +iloveu4 +irene1 +ginger +741236985 +mozart1 +love56 +beyblade +motorcycle +almost1 +madison123 +bratz +69cougar +samsung +kitty7 +november23 +kamikadze +560034 +caveman +braxton1 +bramble +voyager1 +derparol +qwerfdsa +rfgecnf +10201020 +porter1 +imthebest1 +198300 +mario64 +anthony6 +foolish +brittany2 +mustapha +gayboy1 +ou29q6666 +14 +office1 +freefree +encore +midnight2 +jarhead +mimine +16161616 +independent +dancer123 +superman21 +bobby2 +16 +october4 +chula1 +just4you +bitch07 +jack11 +november10 +status +leeann +winwin +rfvfcenhf +playa +greenwood +852654 +tiger7 +undercover +pheonix +volley1 +159875321 +dean +67camaro +szczurek +raven123 +girlpower +vergessen +sherri +12345o +november21 +brent1 +purple69 +outkast +waterfall1 +bmw123 +natural1 +marguerite +counter1 +jasmine +sunshine10 +zapata +deeznuts +december20 +dima123 +12345678j +qwertyasd +chris07 +chaselo +barrett +keenan +1badass +tiger23 +holein1 +jericho1 +komputer1 +michael6 +400093 +kiara +sexyblack1 +cavalo +leilani +baller21 +daniel15 +ortega +benten +lineage +speedway +chapman +malish +eskimo +zeynep +slipknot2 +friends7 +123qwe +greatest +demilovato +astalavista +nonono1 +yes123 +haslo +dogfood +amanda +pimp10 +fergus +maplestory +jessie12 +stacy +churchill +stress +joker12 +0okm9ijn +wolfgang1 +qweasd12 +bribri1 +tigerwoods +jeronimo +quartz +as12345 +brokenhear +violette +night +destiny3 +beefcake +jancok +baracuda +890890 +dragon +juanjose +ronaldo123 +wanrltw +loser4 +heyyou +justin! +asswipe1 +nigger12 +nicole09 +shahid +yasmina +onlyme1 +first1 +hello10 +sixsix6 +vulcan +chief1 +12344321a +humble +qh6xl1p9xj +unlock +moo123 +myspace99 +money69 +brilliant +grisha +1211 +spinner +voyage +titan +marymary +fisherman1 +hippo1 +26262626 +arsenalfc +kidrock1 +m1chael +amdturion64 +twenty +sweetiepie +ilovemykid +kratos +cnthdf +puddles +jacob2 +n +baltimore1 +sean123 +18273645 +100001 +idiot +allen123 +clyde1 +december21 +madison12 +madmax1 +stolen1 +random123 +hindustan +lotus123 +demon1234 +mack +p00p00 +asdf123456 +daniel21 +vodka1 +niceguy +thunder2 +michael123 +kolkata +doomsday +crystal2 +979797 +skate8 +wojtek +super12 +golfgti +!@#$%^ +cingular1 +johnny123 +bombers +1asdfgh +shadow5 +kochamcie +dell12 +astros +qwertz1 +october28 +maria2 +emily2 +wally +********** +pinkie1 +angus +hockey22 +angel +noway1 +november22 +marketing1 +999111 +zx123456 +123asdf +123four +makeup +slonik +petrova +slave1 +delpiero10 +9638527410 +gretchen1 +chainsaw +justyna +melodie +chewbacca +goalie +mas +i< +vehpbr +kerry +zxcv12 +786110 +lions1 +stayout +nestle +energy1 +pa$$word +telecaster +andrew7 +luca +sacramento +zamora +itsmylife +hondas +1abcdefg +hardware +asian1 +ilikesex +pastor1 +mikimiki +198611 +ewq321 +hunter7 +icecube +fff +maxpower +slapshot +walrus +stereo +october26 +earnhardt3 +10293847 +lansing +trombone1 +hellow +kostik +juliet1 +puppys +dragon77 +bigballs1 +maynard1 +hamada +biker1 +whiteboy +blackdog1 +powerof3 +alonzo +2000comeer +mailman +ashley +saints25 +aleksandr +shampoo +elway7 +jordan15 +xxxxx1 +good2go +carlota +hi12345 +loveme11 +banshee1 +12340987 +nick13 +kay123 +aleksander +tascha +lkjhgfdsa1 +vanessa06 +mukesh +skating1 +reshma +tekila +babies2 +redstar +xoxoxo +doudoune +titine +hootie +alexis13 +anthony15 +baby2008 +mmo110110 +wersdf +janek1 +korn +orange13 +opernhaus1 +arturo1 +delldell +lolek123 +campeon +7415963 +fuckit2 +woodland +harman +pandabear1 +trouble2 +69mustang +flower11 +crepusculo +cabron +merda +praline +everett +coolbeans1 +thomas +7779311 +jonathan2 +carol123 +humphrey +hello6 +astra +dfcbkbcf +7ugd5hip2j +joey12 +nokia5530 +monkey88 +robert3 +november13 +shadow21 +luisa +waterboy +inter10 +johan +01012010 +beaches1 +daniel5 +password44 +green420 +paulo +demon12345 +gogogo1 +joshua +coolboy1 +eric12 +jessika +charlie4 +swagger +easton +cassie12 +stars123 +c2h5oh +123456789+ +01011991 +monkey1234 +#1pimp +kameron1 +van +justin16 +311311 +alice123 +lancer1 +august30 +apelsin +joy123 +nomore1 +armada +soldat +221188 +tiger11 +hhhhhhh +persona +delgado +delicious +fat +taylor5 +presto +joshua10 +++ +beachbum +cocoloco +manson666 +funmilola +ken123 +graduate +scuba1 +summer22 +lalaland1 +jordan24 +sarah2 +ruth +priya +july30 +nicole +codered +d1234567 +lazarus +jingles +faraon +steven2 +gymnast +wsbe279qsg +night1 +anchor +jordan07 +francia +jonathan +parola123 +shawna1 +turner1 +presario1 +wutang1 +wdtnjxtr +johnjohn1 +china123 +baseball16 +taylor21 +colonel +frog123 +freaks +22071972 +powder1 +tarzan1 +fresh123 +alfonso1 +rollin60 +prestige +spurs +perfection +virtual +anthony +portal +cool123456 +midget1 +denali +lisa12 +clipper +smile! +life123 +frederik +jorge123 +mario12 +april5 +othello +valencia1 +sexbomb +vfvf +ilovemylife +darnell +leland +myfamily1 +family01 +cjytxrf +honesty1 +arkansas +jessy +jen +igorek +love4ever1 +socks1 +packard1 +justina +123password +brianna2 +free12 +m1am1b3ach +chick +jasmine5 +tristan01 +marina123 +loverman +zack +pa55w0rd +coldplay1 +dantheman +reyes +just4u +brendon1 +mechanic +1charlie +westwood1 +mike21 +december22 +hopeful1 +pippen33 +realnigga1 +myhoney +robin123 +reefer +batata +joshua7 +aaaaaaaa1 +andy12 +winter99 +marmite +chicharito +martyn +loser11 +plumber1 +short1 +100261 +10pace +martian +shoes +raziel +password89 +noreen +fivestar +avrillavigne +3000gt +tinker12 +hollywood2 +starburst +taffy1 +400076 +roberts1 +minhasenha +shopper +catdog12 +dogman +09061976 +xxx666 +clarence1 +maryrose +afghanistan +themaster +jazz123 +stunna1 +500000 +12345123 +graphics +anthony21 +plokij +samuel12 +rainbow12 +mafia +superstar2 +131 +ilovemyfamily +soccer06 +crash1 +ezequiel +ganja +nolove1 +lavigne +murray1 +lebanon +homework1 +cookies12 +amoramor +cyprus +bigtits1 +academy +admin1234 +mellow +kings +ilikeyou +confidence +october19 +elliot1 +ppoo0099 +lovehim1 +ghghgh +cronaldo +suckit69 +120389 +lakota +sarina +thomas3 +filip +ashley69 +12345i +manon +slider +32167 +mozilla +chrysler +angele +stewie +usarmy +tiger13 +dennis123 +baller22 +parlament +montgomery +sweet13 +brasil1 +global1 +mirela +31x7t5xbke +mishijos +iloveryan +pendejo +boris1 +gold123 +wyatt1 +happyfeet +strange1 +slick +kill123 +traveler +jack01 +diabolo +november15 +laurah +tryagain +vauxhall +angle1 +alexis11 +aleksa +hammers1 +bball24 +niunia +thisisit +erik +govols +popcorn12 +paloma1 +merde +butterfly! +treasure1 +jewel1 +20092010 +nata +pittsburgh +drake +bmx123 +32323232 +gisela +tyler11 +dewayne1 +candle1 +praise1 +giraffe1 +sparrow1 +fish12 +etnies +timepass +luv123 +kkk +mckenna +homers +asdfghjkl; +dragon6 ++ +lonnie +socrate +ashlyn +mylover +herrera +alanna +rosa +weed69 +baddog +lavezzi +meowmeow1 +giulio +positivo +13579- +horses12 +baybay1 +harley11 +online123 +brisbane +hotsauce +gigolo +fxzz75$yer +domenica +nicole07 +123456u +firefox1 +joseph +ordenador +milo +aloha1 +son +harry24 +amanda3 +poulette +tennis123 +fcporto +summer3 +spongebob9 +1master +transforme +braden +berserk +feuerwehr +designer1 +ilovesam1 +brooke12 +cosmin +oasis1 +moumoune +simba11 +jarrett +venom1 +kamehameha +redcar +gangsta123 +153153 +swatch +sexy20 +mustang7 +purple6 +cutie3 +showtime1 +123456788 +baboso +capricornio +yeahyeah +bmwbmw +maxmax1 +lavanya +button1 +1236 +alyssa123 +shakespeare +rosario1 +12345689 +dragonfire +lisboa +poop00 +hottie14 +prayer1 +minimum +1justin +limegreen +loveme23 +mate +crystal123 +justin14 +fffffff +cnfkrth +meredith1 +pimp22 +neworleans +qwerty55 +pennstate +bandit123 +lavender1 +anno1602 +linked1 +123456zx +kittys +121290 +benjamin15 +mulligan +zakaria +patrice1 +aug +baseball18 +dolores1 +woodstock1 +m0nk3y +carpediem1 +all +arcadia +cooler1 +dddddddddd +pussy101 +queen123 +wanda1 +cbr900rr +poptropica +angelok +bigtime +nowehaslo +fghjkl +nicholas2 +mack10 +jessica10 +vfhbyjxrf +muffin12 +939393 +matt1988 +fuc +element2 +prophet +foryou +kyle12 +fishbone +music4me +laughter +kitty13 +seaman +110024 +fred12 +black666 +tiger3 +hm9958123 +1soccer +dolphins13 +erick1 +jamess +qwertyytrewq +wanted1 +juniper +sophie01 +1234qaz +ninanina +andrew21 +december13 +vitaliy +dogcat1 +liverpool7 +kaycee +swathi +fcbarcelona +missouri +chris09 +lauren01 +builder +pinguino +eternity1 +bronx1 +yamaha125 +calcio +dfg5fhg5vgfh1 +austin13 +748159263 +ghjcnjq +timberlake +viriato +protect +cool13 +funny123 +destiny12 +sweet666 +bucket +misskitty +12qw34 +presley1 +richards +circle +mini +computadora +krasota +jessy1 +thegreat123 +bologna1 +metroid +lovely7 +hustle1 +screen +sirena +erika22 +wertzu +suicide1 +iloveryan1 +nokia6230 +lapochka +drums1 +alina1 +mollydog1 +pumpkins +10011001 +kelvin1 +whatwhat +cardinal1 +century +shayshay1 +ram +911 +fat123 +bravo1 +lilwayne12 +zoe123 +totoro +counterstrike +blue16 + +tippy1 +phuong +fullmetal +salsa +4money +esperanza1 +allahis1 +dkxjizc282 +euteamo +markiza +challenge +cas +elmejor +ilovelucy +k1234567 +morena1 +softball9 +1597530 +newnew +buddy3 +1024 +marie11 +jonathon1 +baller24 +13241324 +daddy01 +sun123 +121289 +m@d!z +nathan01 +kanchan +sugarbear1 +boobies2 +rjhjkm +gbenga +febrero +ballin12 +sooner1 +sss +sathya +amor12 +202122 +qugrqfo825 +bagpuss +superman22 +batman3 +beckham1 +michelle11 +mathematics +bonbon1 +kumar123 +football17 +shadow69 +danilka +ilovealex +ilovedogs +kameron +ryan962052 +profit +dragon76 +helpme2 +federal +andrew10 +dance4life +heartless +iverson03 +waffle +jesuslovesme +naruto +nicholas +cardiff +amanda! +cars123 +tamere +pizza2 +mmm123 +madden07 +mari +milacek +green10 +baggins +augustine +a12121212 +871982 +rashad1 +september3 +bbbbb +ilovecats +tessa +massive +hoover1 +ghjdthrf +redline1 +555333 +143 +abcxyz +mommy01 +ken +marker +ketchup +trojan1 +izabella +bling1 +love111 +jordan +redwood +maddison1 +henrik +salamanca +1234567c +music7 +lukasz12 +eagles12 +melissa +nkechi1 +daddy3 +1robert +sunshine69 +1245 +marbella +jobhunt +gjhjkm +ramsey +daisey +perkins +wordlife +awesome! +lover11 +angelito1 +1qaz2wsx3e +germania +newyork123 +cocaine1 +krishnan +apache1 +pimpin12 +ipswich +education1 +bunnies1 +pearls +walalang +lover21 +stacie +hunter08 +lennox +rochester +punk123 +wwww +beagle1 +123qazwsx +426hemi +babygirl24 +fuckshit +ashley17 +1destiny +130130 +michelle13 +1907 +rjyatnrf +frogs1 +muscle +kristine1 +tigger7 +suckme1 +october29 +dododo +gopher +gunners1 +tujhrf +tomcat1 +pavlik +heythere +beardog +matthew01 +40028922 +fishtank +dabears +elmo12 +131313a +dimension +dookenr1 +pearljam1 +harsha +powers1 +1011 +chioma +chris4 +bambou +hammond +music3 +november5 +ddzj39cb3 +41034103 +fucklife +babykoh +renren +kaikai +wildman +snapper1 +llll +michael69 +angeli +francoise +starwar5 +woshishui +3syqo15hil +januari +sassie +zeus +newpasswor +400706 +noiembrie +felicita +scorpione +1william +jessica14 +nataha +159753159753 +hannover +paulie +kobe +lorenz +password27 +denzel +amoureux +fresh +ichliebedi +198111 +sailing1 +blue69 +feline +forzanapoli +giuliana +1a1a1a1a +amanda21 +615243 +phil +bambi +nideknil +saveme +cowboys81 +anurag +jelena +shortie1 +football +coolness1 +jam123 +sanjeev +1453 +food123 +gucio +girls123 +modena +jasmine13 +star15 +a123456789 +gator +loserface1 +foxy +mydear +baltazar +william1 +150801 +robocop +natasa +jaiden +killua +victoria12 +stinky01 +millennium +13791379 +abbie1 +putangina +shayne123 +5050 +loveme7 +peppe +austin10 +holler +1953 +sushi +123852 +mangos +concord +black3 +venus1 +lickme1 +michael. +hamburg1 +lovelygirl +dadadada +pimp21 +kasey1 +playboy12 +negro1 +lunatic +mykids4 +selenagome +nascar3 +brennan1 +cannon1 +chris24 +chicago23 +12345as +josette1 +ineedyou +aq1sw2de3 +kitty11 +parola1 +dropdead +1950 +pookie2 +123456789y +pollo +leeloo +timmy123 +aaron12 +love +funky +googletester +macaroni +fake12 +311070 +super8 +blackrose1 +canelle +newjersey +fletcher1 +gizzmo +kingpin1 +mybabies +01012000 +amanda22 +books +raptor1 +forever12 +poop22 +papapapa +brucelee1 +laracroft +habiba +mancity1 +daddys +198800 +lololo1 +magical1 +411014 +olivia12 +raj123 +ilovesex1 +bryson +guiness +2angels +love321 +imissu +bluedog1 +hawaii808 +meme12 +teodora +qwqwqwqw +william7 +virgil +tyler13 +suerte +marusya +nikki12 +summer13 +shayla1 +justdoit1 +marinara +118118 +serious +kagome1 +kampala +jordan8 +rfhfvtkmrf +franci +longbeach +326159487 +redfish1 +angedemon +777111 +vh5150 +hacker123 +tay123 +barbie2 +3232 +daytona1 +10987654321 +pascale +brooklyn2 +mickey11 +134679258 +doglover1 +november16 +whynot1 +ryjgrf +automobil +mustard1 +movies1 +sincere +cinzia +200669 +smoking1 +goodgood +dim +teste123 +december23 +justin15 +xdqwerty +grease +mybaby2 +star21 +197800 +batman01 +edward17 +103196 +stigmata +lakers32 +val +marseille1 +starbuck +333888 +misterio +karma +boulette +warner +junk123 +inter1908 +asas +yankees7 +meadow +jaigurudev +dolphin2 +beanie1 +dkssud12 +888666 +scotch +2hot4you +trent1 +shoes1 +0101 +getout +airport +meathead +felipe123 +llamas +bri +chivas#1 +shadow99 +blessed7 +andreia +3s43pth5aea +because1 +ilovejoe +nat123 +polarbear1 +felice +newuser +women +romaroma +222222222 +surena13 +daemon +alexander3 +langga +brothers1 +bazooka +pjkjnj +tingting +dog1234 +agathe +villevalo +475869 +anthony22 +vince1 +301197 +ww111111 +fishfish +skating +poker123 +bummer +soleluna +rasheed +hal9000 +messi19 +olusegun +lucy12 +troy +stinger1 +blue77 +stinker1 +1237895 +loser13 +nigger69 +no +cvbhyjdf +batman7 +opelcorsa +forgiven +absolute +gerardo1 +olechka +football54 +premium +angel20 +valley1 +stratocaster +freedom1 +candy11 +001100 +madness1 +slut69 +bigbooty1 +batman23 +assholes +bolaji +happydays1 +tanginamo +primrose +198511 +temppassword +angels3 +aligator +allahakbar +flounder +nessa1234 +ford150 +loser3 +12101961 +pokemon10 +111666 +bottom +leika1 +november2 +scrabble +amber2 +goodies +sweet69 +snoopdogg1 +bumble +dottie1 +lolotte +19821108 +mahalq +252627 +angel99 +staples +pocket +tombrady12 +wwwwwww +electronics +tuesday1 +jessica22 +racer1 +bbbbb1 +solitario +mcgrady1 +hawkesbury93 +cuttie1 +sk8erboy +mommom +bicycle +choochoo +paola1 +misha1 +quentin1 +adonai +weaver +goodtime +angel77 +happy22 +bonito +espagne +shandy +yomomma +barca +terrys + +198411 +shell +sanjuan +154322358 +g00gle +mickey13 +love!! +daisymay +art123 +1234567891234567 +dj1234 +251314 +h +cvthnm +unicorns +buffy123 +steffen +glamorous1 +miroslav +leicester +lydcc20091314 +october9 +elements +yfcnz +perico +second +titties1 +madison5 +munchie +weedman +paddy1 +bribri +aparna +sam1234 +moonstar +bunny12 +12345abcd +feather1 +k.,jdm +money07 +wolfman1 +alex07 +peyton18 +shadows1 +cristo1 +hf +painting +tichuots +pampam +december11 +jessica4 +caramba +55667788 +meagan1 +estela +original1 +waters1 +mirella +leralera +cooper12 +senior06 +aphrodite +ilovesam +198612 +bunny2 +saphire +yourmom123 +nolimit1 +minnesota1 +5551212 +x99qomx561 +w8woord +nha7ebf6kp +chevy350 +dude11 +negrito +april6 +pleasure1 +onetwo12 +abundance +lozinka +avalon08 +shelby12 +123123123q +loveme13 +black7 +dumdum +apple22 +zebulon +3sisters +forgotten1 +bhaby +lonewolf1 +deshawn1 +fernanda1 +steele +ilov3you +hello8 +hx28o9e646 +flower4 +sup +adam1234 +iamhappy +boosie1 +phyllis +assman1 +2short +rainman +123q123q +gemma1 +dayton +marietta +johnny12 +taekwondo1 +baller123 +kelly12 +keepout8 +manuel123 +fearless1 +joseph11 +jake01 +pro +jewel +852123 +annabell +itsme +canada123 +cfiekz +dozer1 +rabbits +27272727 +mivida ++ +uuuuuu +angelface +rampage +loveyou3 +ntktdbpjh +123456780 +lunaluna +1200nerds +vinnie1 +123456asdf +400072 +yellow13 +q1w2e3r4 +willem +92dk2cidp +marta7 +elizabet +slacker +mouette +kayden +u +callaway +roserose +my-space +green14 +alemania +shanice +hawaiian1 +austin3 +1q2w3e4r5t6 +monopoly1 +star01 +david23 +loretta1 +tulipe +zhang123 +jayden08 +damilare +achille +gearsofwar +adeyemi +onetime +david5 +fuzzy +amoreterno +160403 +winter09 +bebita +pedarsag +traffic +italy +ram1500 +badman1 +121001 +1chocolate +bitch15 +marilou +lenny1 +corbin +missie +powerpuff +soccer01 +satanas +scooter123 +bad123 +lokita +klinger1 +record +headshot +johnny2 +nextel +chiqui +shadow23 +ashwini +yaroslav +michael14 +birdie123 +marishka +loco123 +198585 +tyler01 +ernie1 +dakota01 +senha +habbo123 +198989 +123456789qwerty +calico +smirnova +sphinx +lina90 +ownage +edxk20qmfs +jaycee +damon1 +salima +brent +cascade +temporary +tytyty +rajendra +oatmeal +ficken1 +bracken +schumi +fucker12 +desire1 +missy2 +holyshit1 +treefrog +robot +joy +fduecn +native +jan123 +159753852 +naruto101 +yahoo100 +ulises +itsme1 +tweety13 +newthree51 +123qq123 +adrian12 +jesus#1 +perry1 +lzhan16889 +pink69 +triple +language +jayhawks +dashka +pfqxbr +tbone1 +lovemom +adolfo +swinger +moemoe +maricar +ilove? +total90 +deandre1 +december17 +maranatha +july +gadget +engineering +north1 +clemente +tkfkdgo7 +e93c50 +bebe12 +keepout1 +gandhi +pqntmt1247 +wdtnjr +lauren +123654987 +real +hunter99 +zoosk1 +2010comer +dominick1 +sunshine8 +rowdy1 +0r968ji9ufj6 +leinad +perach +candy13 +canon +haylee +mag +678910 +1faith +invisible +evan +nobody1 +password32 +gardenia +kate123 +lighting +plus44 +monalisa1 +peaceout1 +lalitha +parole +tyler5 +ilovenick +transam1 +zaxscd +robotech +000786 +breakdance +wyoming +kristal +sword +27352735 +charlie! +montero +smile12 +ludivine +musician +sexy06 +@@@@@@ +nasty +fer +powerman +koko123 +kayla2 +panic1 +mirantte +yaallah +important +bankai +fourteen +gotohell1 +salvation1 +vitamin +raduga +123admin321a +guitarhero +greenday2 +mustang5 +dynamic +spider123 +amoureuse +shorty3 +chelle1234 +cubbies +luv4ever +rktjgfnhf +klaudia01 +woofer +yankees23 +playgirl1 +pictures1 +login123 +pocahontas +spikes +fuckthewor +lady12 +pedrito +alexander1 +alone1 +cream +hallohallo +lukas1 +cutie5 +fuckyou09 +puppet +arsenal +rudeboy +yomismo +rudy +kurama +tigres +carajo +enigma1 +inna +onetwo +spiderman7 +amy +frankfurt +girlsrule +rachelle1 +alfa147 +kakakaka +rai-131 +liza +juanito1 +k +cornell +reilly +w1991a +nanook +december2 +under18 +positive1 +catlover +1qaz@wsx +f4u*123 +tonya1 +onkelz +lfybkf +juventini +ollie +boogers1 +25 +sardegna +password06 +bigblue +moneys1 +stretch +kseniya +198787 +myhome +charlie +rain +merida +iluvme2 +anthony1 +cristh +ella +thomas10 +28282828 +sidekick +borboleta +samsun +shubham +chocolate5 +1andrew +satyam +chingy1 +peepee +joseph01 +4391634m +pa$$w0rd +pass9876 +michel1 +trabalho +stealth1 +chevy2 +ahov +polska123 +vermont1 +kaiser1 +constantine +cristy +vbifyz +allen3 +schatz1 +ophelia +quicksilver +rockandroll +sailor1 +fuckyou10 +malice +solnishko +naruto +hillary1 +lilpimp1 +chinchilla +smokey01 +miracles +310 +win +buddy7 +thedog +blackstar +04022000 +tilly1 +jules +peppermint +nadege +isabel972 +12345678r +another +gentle +danielle +3526535265 +armenia +wert1234 +boy +essence +waswas +football28 +devildog1 +lynn123 +spongebob7 +messenger1 +popopo1 +koala +zhd741220 +memphis10 +401107 +jjjjjjjjjj +deadmau5 +escalade +carl +porno1 +ncc74656 +rupert1 +shaun +oscar12 +werter +haribo +oldschool1 +september8 +lloyd +cowboys2 +wildwood +13587930210 +teddy2 +change1234 +jumper1 +galaxy1 +smile0_0 +library1 +ab12345 +paramedic +maritza +reborn +qwertqwert +katie2 +elizabeth9 +emo666 +doughboy +pass_2011 +l1nked1n +naresh +juanpablo +astrid29 +april8 +qazwsxedcrfvtgb +bball13 +poopmaster +korean +twenty1 +speedo +13571357 +lover23 +antivirus +bunghole +critter1 +helicopter +000006 +itachi1 +619rey +har +gfgfvfvf +esteban1 +110016 +damnit1 +12344321q +raiders2 +houdini +hbhc8290826 +only1me +nescafe +427468 +bahia1979 +forever7 +baseball08 +1234love +pingpong1 +lovers +grande +maria666 +asakapa +babybear1 +games123 +marquez +01011981 +mentos +qwerty8 +auriane +neverland +laddie +morgan11 +mynameis1 +1purple +junior88 +masters1 +solitude +cameron123 +antonio123 +mongol +nicole. +victor12 +rivera1 +ahmed1 +villa1 +jon +spartans1 +mewtwo +11110000 +198686 +liberta +557799 +hitachi +p@$$w0rd +minemine +17 +sweetie2 +beowulf +joel123 +spoiled +castillo1 +nicky123 +hal +198512 +flowers123 +fischer +atlantis1 +173928 +soccer69 +katya +paladin1 +143143143 +imyaimyaimya +mamma123 +jose1234 +jubilee +kool12 +benny123 +zwickau +heythere1 +whore +sunshine +spears +12345zxc +alyssa2 +123456! +cuttie +sabine12 +arvind +twingo +zxc841219 +dalejr88 +14629227 +29422277 +mustang65 +gaara1 +notorious +anthony10 +spionin8688 +edwards1 +929292 +aqswde +madison7 +123987456 +112020 +101089 +313313 +thizz2 +fowler +mmmmm1 +juggalo420 +gianna1 +high420 +andrews +31313131 +ghjuhfvvf +florian1 +pilipinas +carissa +ramona1 +larry123 +confirm +december18 +bball123 +chachi +llllllll +chris101 +december15 +kirill1990 +germaine +0420 +jakejake +ww651118 +nicole17 +myspace24 +green21 +husker +201001 +12365478 +omshanti +elizabeth8 +bea +sammy01 +fucklife1 +gtavicecity +macdre1 +skinner +krazy1 +iloveyou<3 +byteme +0987 +gangster12 +24 +123456+ +prince2 +hollie1 +raspberry +lucky4 +jordan09 +jimmy2 +myspacepas +baba123 +barnes +heyyou1 +82214989 +bubbles13 +soccer77 +luckies +football95 +shaina +1234567898 +10241024 +trunks1 +browning +circus +sodapop +lhfrjy +chriss +password1! +synergy +salam +broadband1 +happy13 +fylhtq12 +madison4 +anthony9 +hotdog2 +asdf:lkj +marigold +blbyf +hellraiser +yogesh +112345 +will123 +shorty7 +hshshs +freestuff +babyboy3 +seminoles +money1234 +asdasd12 +mari123 +baseball19 +mobsters1 +louise123 +finley +prova +blake123 +latoya +baylee +d0r1nc0urt +gusgus +canard +kittie1 +wasdwasd +bubbles7 +buckley +jazzie +derick +mudvayne1 +cronaldo7 +mullet +silkroad +******** +davidic1 +1211109032 +baseball33 +harvick29 +striker1 +rtw150809 +22152182 +stoned +midnite +jessica69 +t36473647 +sebastian + +sincere1 +chadwick +prodigy1 +wildchild +venezia +bird33 +nibbles1 +killer6 +fuckyouall +92298899 +elisabeth1 +david +san123 +435453 +780813 +amrita +godgod +lonsdale +djkjlz +#1stunna +edberg +petey1 +ariadna +flame1 +pl +pennstate1 +ettore +hotmail.com +absolut +nikki6 +brandon4 +fucku69 +anthony14 +mamamia1 +1treehill +cedric1 +den221991 +198100 +orange5 +myrtle +production +fuckmehard +ram123 +beans1 +cool10 +pasadena +arabella +blaine +texas12 +fletch +honda125 +madison01 +handyman +kims89 +198711 +may123 +cheeky1 +carlos10 +nedved +november14 +andrew23 +mariusz +transit +1bigdaddy +kellie1 +53472235 +magda1 +victoria2 +pushpa +ilds4edad +lou +pixie +luis13 +cocotte +aquarius1 +todd +angela123 +teamo12 +washburn +jiefang007 +staredobre +mosquito +200888 +121286 +addicted +586016 +quality123 +h8llp9f +flower5 +qpwoeiruty +hate +124124 +psp123 +kisses2 +xsw21qaz +sparkles1 +red456 +bitch10 +resing1965 +chevyz71 +khan +stevens +007700 +karakartal +jojojo1 +cupcakes1 +lala11 +ash +duckie1 +caramella +monster13 +153759 +platypus +05200520 +rebekah1 +november7 +boeing747 +sandra +rhiannon1 +w123456789 +7410 +a4tech +vfcnth +eatme69 +012012 +football16 +lucian +1,00001e+14 +198412 +lananh +hellas +perfect10 +peggy1 +mohammed1 +23skidoo +golfing1 +money9 +rihanna1 +tetris +bayern94 +oooooooo +tl281188t +nautica +littleone +charisma +giogio +xige5516726 +kismet +520025 +gggggg1 +sundance1 +serrano +florida2 +pushkin +valkyrie +chiefs1 +jjjjjjj +tasha123 +vanille1 +uhfaabnb +hockey16 +madryt +9632147 +hikaru +ploppy10 +alucard1 +reveur +welcome +110091 +1qwertyu +lakers123 +muhammad1 +greene +wrestle1 +darkman +beethoven9 +hannah! +yayaya +pajero +charly1 +vanessa12 +jeep +toilet +roseann +20 +tinman +newcall +ducky +alivioo +vuc7neyu0 +185800 +player13 +police123 +alexandra +123ert +diva +eugenio +niki +mbahurip +battery +jkljkl +uchiha +ovr220278 +blackcat123 +sexy1 +turtles1 +madrid1 +564335 +magdalena1 +andrea +mm123456 +edoardo +degrassi1 +sales +summer5 +weasel1 +annabel +killer4 +pussy7 +serkan +april123 +19561956 +pimp1234 +dogshit +charlie13 +dimebag1 +7418529630 +zzzzz1 +darkknight +december16 +buzhidao +adeline +fordf350 +bitch1234 +paisley +flower3 +gwarmonster +bartman +hunter22 +yemi19900911 +leigh +belmont +alesha +80 +johncena54 +654789 +muffin123 +meteora +popstar1 +ilovedavid +mibebe +nuggets1 +brandon10 +skank1 +shadow! +ekmzyf +prototype +cat1234 +peanut3 +pink07 +piffish +colibri +raluca +gfs2z6wb +kookie +smokin1 +homies +qazxswedcvfr +nicole6 +spolana +juninho +halifax +kindness +gossipgirl +kapej111 +mmm +book +qiciqdp162 +phx602 +hellen +elizabeth0 +loveis1 +sunfire +buddie1 +tortoise +jasmine11 +athens +michelle! +buddah +melania +ryan1234 +shitshit +supervisor +leticia1 +the +tigger21 +alex16 +anthony8 +angel! +butter12 +morales1 +dtxyjcnm +bhbyrf +roro1024 +zaq1zaq1 +electron +2wsxzaq1 +citron +dragoste +lucille1 +monkey09 +kangaroo1 +tennis12 +31081981rs +reason +password66 +050965 +amanda69 +123456789qw +comedy +poepen19 +jkjkjk +ilovejohn +locura +povlmly727 +nigger! +159753258 +swampfire +123qweasd +dontknow1 +shorty11 +arslan +pppppp1 +foolish1 +bible1 +radeon +realtor +lovemykids +p5415420 +jordan2345 +godisable +monkey33 +12345678z +valeriya +139381512 +anthony! +25393275 +volume1 +tyler3 +poser2 +happy1234 +1234567g +bball2 +behappy1 +jeremy12 +kassie +babymama1 +zander1 +roderick +dou +didine +weiwei +hambone +znt: +bon +monkey07 +jesuslives +groupd2013 +maggie3 +firestorm +firefire +uphill45 +68582988 +puppydog1 +69charger +frogs +11111111a +supa1906 +mamita1 +dede +monkey08 +eggplant +blunts +moreno1 +mustang01 +01011987 +bartek1 +mywife +fathead1 +lil123 +1abcdef +1q2q3q4q5q +choice +gummybear +anechka +jimmy12 +minecraft +19571957 +mierda1 +secret +dieguito +eli +vegas +cortez1 +xaxaxa +spyder1 +queenbee1 +paluso00 +whatever7 +shrimp +mjdsf11 +j4n4jel4 +shanice1 +rodrigues +18 +1amanda +123123321 +cumshot +brodie10 +acapulco +1952 +trapdoor60 +kristel +nascar20 +snorre98 +7seven +maggie13 +olitec00 +superman1 +248001 +sonoio +petram +ballon +mumdad +acts238 +linkedin11 +vascorossi +sharpie +bigpimpin +crazy101 +qwarty +jkiuztdftl57 +lovely! +paraiso +alex18 +justus +jenni +bob101 +connard +5children +swapna +wang123 +iloveyoux3 +trina1 +pokemon3 +thissucks1 +kitty6 +kiss12 +xantria10315 +batman69 +aabb1122 +gangsta12 +idiot1 +kuana230345 +ophelie +starwarsfan10 +taylor! +fluffy12 +civic1 +lindinha +familiyafamiliya +patience1 +lexus +viper123 +bluejay +pommes123 +5a8b9c2d +maxpayne +cksdnd12 +aksrms8010 +fiona1 +111888 +awei1616 +buffett +teddybear2 +pumpkin2 +policeman +futyn007 +gigabyte +lilili +bhjxrf +infamous1 +fruity +candygirl +uchenna +sable1 +bouboule +star101 +shayshay +rambo123 +niggers +lebronjame +frosch +alesana +0987654321q +gutschein +attack +blkdrag0ns +1598741 +supernova1 +finger1 +dragon9 +13245768 +justin08 +marilyn59 +blablabla1 +lightning2 +astig +topbull +astros1 +dakota123 +wrasloco11 +skaterdude +catdog2 +blah12 +luc +poilut +aa224466 +500016 +randyorton +singing1 +myspace00 +placebo1 +ulisse +jewels1 +lilica +brandon! +killer21 +ornella +usa12345 +jadakiss +fubar09 +nacho1 +angels12 +foofoo +myblocker +jesus +19941028 +mustafa1 +pissoff1 +jessica8 +rhinos111 +0147896325 +almighty1 +kokokoko +clapton +4826159 +26665806 +sverige +kar +teonamaria1 +fuckthat1 +candies +advance +volcano +asdf1234 +sn00py +mal +salem +124356 +marmotte +haloreach +hockey5 +juancho +water2 +courage9 +ronaldo17 +good4u +jiang8kevin +allmine1 +shaheen +destin +kokomo +ficken76 +avenged +jewish +bonanza +chocolate9 +dakota2 +dangerous12 +isabella +1272446 +loyola +seigneur +tiger10 +tiger22 +nineteen +jasmine4 +nerone +mercurio +mark1234 +bluerose +mis +looby123 +ice +sexychick1 +railroad +november25 +wildthing +anetka11 +recovery1 +rancid1 +chambers +fritz +zbychlas +allrecipes +punjab +axelle +cds04121989 +masterkey +1324 +princes1 +fucku12 +ray +fx-one +latifa +12345678k +pipeline +motorhead +happyhappy +icxkyb7972 +1daniel +yfhenj +londres +vitor1268123 +369369369 +rosales +september7 +asdasdasd1 +mamapapa1 +monkey17 +123456789qaz +sithlord +monica12 +1jasmine +skater11 +lena123 +1023 +araceli +wendell +kurwamac +healthy +povray14 +nfvfhf +don123 +glasses +1q2w3e4r +bloodz1 +lloyd1 +password123456 +music11 +vicecity +painkiller +159357r +aviation +849vak17 +kurdistan +peppers +ringo +lillie1 +q1w2e3r4t5y6u7i8o9p0 +mysecret +rockers +smokie1 +cutie01 +texas100 +www111 +saitou +4567 +killemall +altair +11121314 +focus +mutant +tony1234 +action1 +berry +mamikawada +aa261599 +bucky1 +jul +stitch1 +epsilon +alchemist +christmas2 +bigbear1 +killer10 +jessica15 +diamond +element123 +weronika1992 +a5201314 +2211 +tintin1 +62543234 +rodeo1 +sweetangel +ghosts +honda450 +antonio2 +scarface2 +icegirl +upperd7 +clovis +oreo12 +nena123 +128128 +thomson +@bigmir.net +jdd04257 +anfisa +maiden666 +catholic +j5644574 +doggystyle +trueblue +camilla1 +freiheit +twinkle15 +leopoldo +jetsmets +serdar +hornets +tenshin +chilly +19581958 +ashraf +b2spirit +emirates +jordon +valeri +1002 +konfetka +zaq1 +ehdgnl12 +abcd1234 +sipfhair +cheguevara +baller5 +doodlebug1 +aquila +nathan11 +football1 +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +m01759766727 +sandie +1867sb +summer00 +barakuda +neo123 +19451945 +baby2009 +vergeten +juju1987 +584521 +ernest1 +class +campos +april9 +neworleans12345 +marygrace +po918dg +tyrael04 +liam +kjifhf +william2631 +calgary +december31 +learning +clifton +400050 +pass1478 +jordan9 +norton1 +me1212 +superwoman +singh +rogelio +leika86 +keystone1 +luna123 +1905 +kara2711 +sonics +aug!272010 +noelle1 +062593 +jessi1 +green6 +choclate +green15 +2fresh +october30 +kissing +avalon1 +brenden +gogirl +homerun1 +vampiro +blabla123 +frontier +rosalia +corbin1 +katana1 +sexy4life +frisco415 +purdue +letmeinnow +party123 +wasted +naruto7 +1234567h +u83xu3u83 +kirkland +sushma +crack +vfkbyf +master69 +danielito +eli123 +101080 +candy5 +alain +honeybun1 +passward +spitsy16 +yggdrasil4 +pallino +n123456789 +dianna +stupid! +ss563563ss +carpet1 +voldemort +bamidele +lynette1 +angels123 +mazda1 +macdaddy1 +letizia +robert7 +attitude1 +poiu07 +iminlove +dinero +charly2004 +hannah5 +computer +dilbert1 +94246843 +shelby123 +ferret1 +crystal12 +superhero +jackmore1 +ohshit +susie +fathead +32342711 +james10 +toonarmy +wiktoria +stargazer +infinito +floyd1 +shriram +rockey +single2 +superman8 +coco11 +aliceadsl +madison +irving +kalyani +maryjoy +nomeacuerdo +52hoova +happy01 +idefix +gfynthf +sabrina123 +perro +cxfcnkbdfz +seminoles1 +cannibal +mnbvcxz123 +renuka +richardson +wealth +45678 +ashley6 +nation +qq1234 +myspace77 +pink09 +tigers2 +sandra12 +piepie +222444 +komputer12 +1olmetec1 +145145 +soccer88 +yfcn.if +robert +fb1907 +c6h12o6 +leningrad +musik +lalita +u8t6e4 +heavenly1 +mamika10 +david21 +deadly +satsuki +impact +fire12 +alleycat +yolo +ashley09 +football19 +poland1 +pollux +mousse +cookie4 +523456 +kevnwo128 +trackstar1 +ytreza +spongebob0 +crybaby1 +pauko97 +kaleb1 +abayomi +teenaa111 +staples1 +pessac +gogators +akademiks11 +denis123 +fourkids +cabbage1 +shadow14 +battle1 +ewelina +youandme1 +carpenter1 +fairy +seahorse1 +pie +natiichen999 +maiden1 +lover22 +dallas2 +vaughn +21052003 +jessica23 +fhctybq +tanzania +1cutie +goblue1 +james1234 +roger123 +125678 +27254931 +1loves +pass11 +abcdef +goodtimes1 +pepsi2 +halo219 +courtney12 +llama +dallas01 +swetha +marmalade +l1verpool +hockey21 +ldgend +iforget +moon123 +django +budman +newstart1 +concrete1 +cleo +ganja420 +andrea2 +charlie10 +threekids +david22 +hamburg15 +basketbal9 +werewolf1 +qq18ww899 +complete +hermione1 +ilovejoe1 +london01 +5656 +maximiliano +lost +hunter07 +nokia5310 +326598 +tarzan00 +alfa156 +truth1 +pentagon +85218812 +killer9 +killjoy +ipad +chocolate8 +nwolf72 +orient +buster13 +vicky123 +meow123 +pioupiou +h4t3cr3w +dfktynby +lauren11 +incredible +velvet1 +smb0512bz +luckyboy +tricky1 +steflio3123 +hello69 +198311 +001579238 +bharathi +michelle01 +94327579 +bettina23 +hunter4 +bucuresti +zerozero +cordell123 +411001 +29694419 +minimal +110034 +stani06 +werock1 +monarch +courage1 +hannover96 +heather +batman22 +bond +thibault +andre1986 +matthew4 +sentinel +nummero1 +black11 +summer2008 +fleurs +love30 +123456789101112 +yvonne90 +jarox1301! +seinfeld +love87 +kittykitty +sexybitch2 +farley +jordan99 +vfhnsirf +ashwin +john13 +cloclo +43922572 +mlb229 +money8 +notebook1 +bin +alvin1 +cacca +sex666 +shurik +santhosh +football27 +franca +heather12 +bl8lygb0 +alex2000 +homeboy1 +ayodeji +qazplm +starwars111 +ziggy123 +semangat +dizzy1 +breaker +kambal +biscuit22 +slipknot9 +together1 +ibanezjs +rainbow3 +banaan +green17 +haha1234 +hydrogen +kinomoto89 +pt120439 +fragolina +evgeniya +passw0rd1 +123321aa +mahendra +ludi1234 +video +maburro +mercedes +yomisma +ebony +skeleton +lara1308 +lokoloko +1zn6fpn01n +missy12 +ch0c0late +tigger! +121282 +cowboys12 +soccer05 +boobies2 +abhinav +felix1952 +medical1 +ilove12 +pa +110059 +whistler +maciek06 +jarrod +pokemon7 +markus1 +godlike +stumpy +gs1905 +superman4 +pakistan12 +nikolas1 +candy3 +farmacia +123321qwe +charlotte +mikemike1 +0range +hehehe1 +madona +boomerang +princess1 +succes +someday +kartoffelpuffer +ijrjkflrf +nickiminaj +passcode +ashley08 +barcelona +52253823 +m12345678 +spider-man +27412678 +sabbath1 +1nigger +agustus +matt1234 +raiders12 +mayquinn2 +1987123 +55665566 +wiseman +loco +sweet18 +q1q2q3q4q5 +david10 +devil123 +wwe619 +shalom1 +april3 +iloveyouso +198712 +gonzo1 +pugsley +dario +abc@123 +alejandro2 +zack123 +milan1 +agnes +redhorse +cherry13 +garbage1 +520love101182 +halo22 +mojojojo +515253 +doodles1 +chelsea7 +loyalty +smoker1 +1asdfg +illini +starry +linked123 +matyas2001 +leopard1 +barley +melrose +elise +stupid12 +spice1 +buttface1 +qaqaqa +1233 +hannahmontana +nothings123 +j0rdan +yumyum1 +12346 +love456 +pa$$w0rd +montreal1 +34343434 +tuputamadre +135792 +10200718 +ciccia +96101z +yasemin +jesusis +huskies1 +montagne +boxers +malvina +bowwow2 +leolong1985 +vodka +kelley1 +mental +braves10 +cutie10 +chris! +888777- +march5 +cannelle +qwertzu +love1314 +jesus1234 +21152117 +sandberg5 +ska02ska +d41d8cd +march6 +44332211 +malishka +6817zd57 +listen +ffffffffff +twiztid1 +lightpower12345 +nikita123 +bmw320 +300300 +misfit +000000000000 +chantel +somerset +1234567890123 +dell500 +duster +rfhfgep +superman +bella01 +jaiden1 +kissmyass2 +mandingo +lolly +nanou4552 +jammin +raprap +lenalena +blackpool +majesty +mommy7 +aladdin +vbienrf +hans4queck +vaibhav +l5l5l5 +qq123123 +henderson1 +saigon +openup1 +smirnov +hillside +gangbang +vale46 +caca12 +sunshine21 +tuangbi +123456az +girlygirl1 +zaq12wsx +kakashi21 +link +newjersey1 +maella1311 +2w3e4r +101086 +bertha1 +thebeast +102030a +197900 +1grandma +football56 +31337a +fysihz5g +messiah1 +hello01 +fenchel55 +thissucks +gaudens +saddam +l3tm31n +nashville +qazedc +killer +barbiegirl +1204 +junkmail +berger +custom +surethang +boroda +jcdenis1 +pennywise +ilovelife +madmad +morango +123666 +bunker +98989898 +evelin +098poi +robotics +brody1 +hockey3 +123234 +grayson1 +jewish1 +moose123 +watever +beast556 +riddick +dar +1america +creeper +finland +qwerty123456789 +a6543210 +paopao +orange! +mckenna1 +crowbird +gaylord +312312 +mu080295 +coyote1 +1234qq +techno13 +honeybunny +laska +nikki2 +shorty14 +nandini +yfnfirf +1freedom +hollister3 +622906268 +sad123 +pinguin +1234asd +legend22 +hampton1 +nicholas12 +220389 +emoboy +qq123456789 +2sisters +booboo11 +rose1234 +horror +ghbdtnrfrltkf +123456mm +cocococo +crackers1 +twelve +thecat +fktyeirf +110025 +1214 +manu123 +sedona +cars +231 +karo13 +rotten +jesse12 +123edc +1314 +pilgrim +ohyeah1 +britt12 +thriller +alana1 +treguier +sim +addl0223 +madden09 +sangeetha +mkal2707 +br00klyn +ilo +brown13 +shayna +monday123 +smokey13 +angelseye22 +farfallina +chitown1 +ilove3 +chief +cookies! +cole +buddydog +lotus1 +stefangreil1983 +jackjack1 +naruto5 +makenzie +0909 +limited +791159392 +monkeys2 +hannahmont +jet +hfleuf +121285 +lebron1 +priscila +redab1993 +letitbe +pelota +danny2 +myfather +virtue1234 +southside2 +bri123 +wheeler +julieann +aninha +zooyork1 +adrienne1 +serafina14 +4mykids +111680 +leonor +bou +brandnew1 +naruto9 +fuckit! +ladiesman1 +me12345 +heart123 +wishbone1 +redbone +dark123 +2kroliczek +total12scherz +baseball +1234567p +single123 +201 +nene +bright1 +abcdefghi1 +poiu0987 +cutie14 +jmoney1 +slash1 +lover14 +sample +hockey8 +stunner +cummins +ogplanet +tulipan +dracula1 +freeway1 +adams33486 +lakewood +chocolate4 +o12345 +12345678987654321 +bitch666 +010180 +marsik +crybaby +sweet17 +gabriel2 +fuckyou +111111111111111 +whoknows +kkkkkkkkkk +contra +sss111 +spez3012 +julie2811 +ch +lucinda +vijay +smokey420 +cutiepie2 +daniel18 +max12345 +mormor +chicken11 +f1uuhza723 +eve +moi +razjel1 +november8 +tinkerbell1 +cierra +a54321 +tapout +rose24731 +mildred1 +qwert54321 +pendejo1 +150556 +trainer +softball21 +studio54 +jasper01 +lisamarie +shortie +damion +getsome1 +kimmie1 +mickey +goldberg1 +reloaded +eva +wpcakir264 +r1234567 +wert123 +eatpussy +emilio1 +myspace88 +132680 +par +armstrong1 +cervantes +anthony08 +rooney8 +buddy5 +whitetiger +power12 +mickey3 +54321q +vader +joshua21 +4224035 +andreita +viola +mario140773 +accounts +asswipe +sunshine9 +manolito +64impala +badgers +alex17 +umbrella1 +mob123 +oojs4ykl +ruler1991 +paquito +dav +ramon +treflip +november24 +bbleo1zz +tendulkar +marilena +william5 +angel27 +oldnavy +green8 +legendary +rhodan01 +nathan +voltaire +fuckyou88 +guardian1 +weyersheim +honey215 +carebears +cool22 +ripcurl +linusd8 +vanessa2 +rainbows1 +depechemode +bandit2 +gidget1 +purple16 +dabears1 +01011988 +marko +axlrose +armorgames +superman01 +dkz1999 +lucie +sodapop1 +santamaria +father123 +m1chelle +pg260365 +mexicano1 +sexymama12 +bumper +121284 +sacha1234 +winter01 +mgreen39 +moderncombat +q1a2z3 +baller13 +stella123 +hola1234 +nazareth +christina2 +19810301 +november27 +zz8807zpl +theband1 +123459876 +nimbus +mendez +dance12 +december28 +rockon! +dora123 +tuxedo +nice123 +pizzahut1 +lucky10 +billiejoe1 +getlost +polenka1 +magazine +bootsie1 +beast123 +la +gruby12 +taiwan +jesus143 +babababa +duncan21 +olivia2 +ace +southwest1 +pomalo123 +rocky3 +863560 +theshit1 +somanypickles27 +forever3 +ahbird1984 +norma1 +01470147 +services +michelle +mil +moonmoon +chr +jujuju +latoya1 +dd123456 +191191 +vanhalen1 +leliane50934 +lmapacey +gggggggggg +smith123 +peggy +shorty69 +august2 +papatoma1 +forsaken +fudge +wayne123 +sammy7 +159487 +rabat1945 +333221 +optimus1 +rachel +imelda +aczx7812 +sadsad +chanelbag +puttana +hester23 +blunt420 +johnny1959 +rashad +masina +herbalife +jessica. +daniel16 +pussy5 +yancai +12345a +lovers69 +andrew5 +678678 +awesome2 +sexe +123456ok +madonna12 +hattie +saint +257ers +hello101 +oasis +damaris +desadesa +libby +bored1 +drifter +fuckme12 +onlyyou +sanders1 +blix729 +1234five +2password +nickie +monstercha +a1169619 +badboys2 +pascual +kitty101 +itisme +brooke123 +gab +bambolina +nottingham +softball23 +cubbies1 +marian1 +nancy123 +onlyone +4rfv5tgb +pokemon +lacey +edmond +puppies2 +purple9 +1tigger +purple15 +cowboyup +maxima1 +rangerover +3232547 +wrestler1 +castle1 +momo12 +przyjaciolki +beavis1 +morton +yellow! +123678 +viagra +moonshine1 +123zzz +zombies +stripes +sdream +christian7 +lenka +wigolf +hawkeyes +21864812 +satnam +tanja1993 +butterball +mexico01 +cooper123 +erotic +music5 +rosaria +fuckyou01 +iloveyou88 +bergkamp +50505050 +ahmad +ligabue +pookie12 +mpeater +wsxedc +sevgilim +jomacapa +crash +lolo12 +lilwayne2 +edmonton +hollie99 +advent +youporn +eastern +benfica1 +jesus23 +e2yfp41b +b00bies +8008070 +tkfkdgo1 +lacoste1 +zesh1412 +makulit +jasmine01 +ignoranto +henni1907 +hooper +music13 +dragon8 +1007 +monster7 +zac123 +crunch +escola +soulja1 +good12 +han +dark666 +faca210898 +northern +dogshit1 +grateful1 +december14 +goodmorning +lovebug2 +bff4ever +chris19 +flyers1 +yaoiisgrand +fineboy +221133 +rosco1 +haha11 +1ofakind +roanne42300 +murali +nokia3250 +allsop +candy101 +fantasma +01012009 +qw12qw12 +graffiti1 +rs11220 +pokemon9 +sokolova +clown1 +776158ab +one234 +phoenix888 +102 +jyothi +123456789as +sk8ers +lilmama2 +mexico7 +kerry1 +rover +alex24 +1234567n +marie7 +oliver01 +maldives +bubbas +baller11 +1205 +xlsl9963 +icetea +islamabad +aaaa11 +c1234567 +laurel12creek +1e+14 +kingfish +kfcnjxrf +bball14 +91866709 +2w3e4r5t +chutrung +malcom +tadpole +cavs23 +560001 +mase4ever +yoyoyoyo +deirjj +edmund +mom1234 +qwertyu8 +romy01 +1106782 +seanpaul +escobar +coco1234 +fucked1 +bangaram +kassandra1 +andrusic1 +yandi20080527 +manuel12 +ezekiel11991 +marek14michal +fuchurli +lovehurts2 +721521 +jimmie48 +raffaella +liverpool +monterrey +haggis +unforgiven +lancia037 +golfinho +davidoff +yanks1 +484066 +barker +jordan06 +fidelity +boomer12 +gambion32 +0icotpd785 +hateme1 +guillermo1 +trivium1 +treu14 +042945d +rakaii +scanner +qwerty4 +puma123 +landmark +dogg +ronaldo07 +november3 +arsenal12 +cosmopolitan +muffin2 +ice123 +ossi2000 +qyahzn +gigaman8891 +author +1shorty +hermann +alyson +101087 +yt +assface1 +cxy831126 +rocks +fabregas4 +bibi +lucky6 +bre123 +mufasa +117117 +keegan1 +mercy +ibicguwjic +comcast +heartbroke +sparky12 +mustang +carnage +apple11 +greatone +becker +monkey18 +trandafir +blackout1 +birdhouse +fossil1 +winter123 +delphi +saxophone1 +jes +121292 +floyd +101085 +87calis +metal123 +lucky77 +123abc +sestra +blue88 +qwe456 +josh13 +power999 +carrots +xbonesx +working1 +holler1 +boguska123 +tmvlzj12 +156156 +skillet +illuminati +w12101957 +snoopy13 +rover1 +black22 +lightbulb +milk +gazelle +1208 +emmanuelle +maddox +74699723 +super7 +jenjen1 +chandan +bball5 +jasmina +cal +cream1 +2933455 +michael18 +aguilas +wrigley +komodo +sig53num +shorty01 +baby05 +wubin007 +ballin3 +brebre +grine89 +popper +teetee1 +iloveu13 +8008beb +ruqueb +marvel5454 +covenant +00 +yamato +cierra1 +aaaaa5 +hotlips +kris10 +camden1 +butterflies +madara +thebears12 +doug +aimee +eragon1 +sammy13 +555000 +181920 +wan123 +black23 +20070509031 +asdfghjkl12 +789321 +james4 +1bigdog +bobcats1 +testtest1 +67529353 +46265216 +solo7590 +2pacshakur +bukola +forever4 +papabear +iloveu22 +marie23 +panorama +samsun55 +brother2 +assh0le +soulmate1 +pink08 +kylie +robert22 +lydia1 +crysis +prisca +peepee1 +italie +colgate +waldiw82 +salmankhan +skateordie +batman5 +robinho +icthus01 +123333 +michael08 +malik123 +malaysia1 +chelsea8 +tigger5 +chitarra +jm0753 +almario927 +thinking +dogs12 +jjjjj1 +rosa123 +kakaroto +eighteen +1102 +heterosexual +hardwork +meowmix +jamal +maganda1 +kira +smashing +mateus +poster +lapinou +awesome12 +wolf123 +monster5 +gisele +weekend +phoenix +giggle +makeup1 +mariama +sheshe +capecod +spiker +lucinka +alpacino +neopets1 +breathe +madison1 +tracker1 +waterman +thieric +arabella24630 +jigsaw +tigger23 +patron +chasity1 +guesswho +softball15 +justin18 +dominion +jojojojo +killer1234 +anjana +royals22 +junior3 +2727 +seatleon +2416101113 +calderon +concepcion +chinook +xred4654 +micah1 +rdukv46x +soukayna +hummer2 +lovejoy +bela2404 +edwardcullen +money4940 +aimee1 +alex99 +jr1234 +alterego +siempre +heinrich +america7 +anatoliy +khan123 +jose1995 +bingbing +power2 +chivas2 +120n2x +diego10 +cat15175 +winter07 +z1234567 +march7 +overkill +eightball +1zzzzz +soulfly +killa12 +michael15 +3d8cubaj2e +metro1 +ania1986 +chanelle +x12345 +098890 +mostafa +weed13 +lasalle +dipset5 +pluto1 +sandoval +red321 +jolinek33 +meatball99 +01011986 +110110110 +smokey11 +vfvfvfvf +ada +600041 +my5kids +000009 +philly215 +quake3 +slut123 +pokemon5 +hockey4 +monyet +lilli2006 +myspace16 +fishing2 +focus1 +superboy +pilot1 +myspace17 +seneca +1banana +tronwell +weenie +krystyna56 +newton1 +sinned +20072008 +whoareyou +23628221 +geniusv +raleigh +rksk3210 +71191926 +pri +festival +minister +simson +pranav +myboo1 +petting +yomamma1 +daredevil1 +sebastian106 +peace! +gautam +monkey +marie14 +slunicko +nitro1 +baby25 +angela12 +badoobadoo +b00b00 +cookie23 +jackie2 +oliver2 +jayden07 +cameron12 +royal +gobucks +panda12 +aja152 +trader +lionheart1 +buceta +dabomb +theodore1 +fifa2010 +he635789 +224488 +mm170667 +igetmoney1 +bears54 +freedom! +rayman +elite1 +lestat1 +shaney14 +marica +snake123 +85726648 +easyas123 +fallen_angel +colour +racerx +puto81 +jackpot1 +knackwurst8853 +mommom1 +852456i +400059 +pingvin +carnaval +110058 +pimp15 +asdewq +s12345678 +turtle12 +111444 +miki +3141592654 +irock +5234055 +volkova +dbrecz +nicole8 +betty123 +teetee +baby02 +veri1234 +lizbeth +pop168168 +dalbas73 +наташа +pinky2 +2246926 +frisco1 +hoffman +121287 +hello14 +money14 +parolamea +baritone +gennaro +0p9o8i7u +tommy12 +giulietta +1124 +james69 +ethanryan01 +kjiflm +jimena +paul12 +mikael412 +198484 +supreme1 +arianne +godim001 +pussies +tony13 +andrew! +lucky69 +istanbul34 +rockford +march9 +p1466186 +fullmetal1 +yoyo12 +independen +lovely3 +1215 +ghjnjnbg +chemical1 +babygurl14 +thedude +4me2know +croskey +sindhu +atletico +kitten123 +carito +lilsexy1 +salerno +bitches! +imsexy1 +caroline. +taylor14 +heather123 +accountant +1badboy +shania1 +carmelo1 +gdcc9921 +marshal +juan13 +bratz123 +michaeljackson +221 +wil +licorice +create1 +megafon +cradle +renee123 +adv23 +sammi1 +1111111q +444 +mayank +clarinet1 +sol +fiesta01 +abcabc123 +tomek +odette +kaboom +clochette +mammina +grandad1 +milly1 +ziom82 +gabbie +babygirl06 +ohcaptain +electronic +pinkpanther +friends5 +feathers +incognito +tkgsoo083bsr +volimte +lehjxrf +angola +heeren981a +nougat +ezekiel11989 +hallie +perry +vanessa141175 +shawty +d6ug7epz +noel +astroboy +teapot +253314 +alisher +nebraska1 +proverbs +grinch +kinky1 +marsel +mytime +kaden10 +cats12 +channel +4567890 +destinee +killer45 +shashank +spiderman4 +layla +freedom +sabine21 +daniel07 +lovemom1 +lilou +lilmama12 +cr1st1an +terrence1 +maribel1 +sampdoria +47593893 +skittles12 +ggg +ravens52 +kenya1 +proverbs31 +cars98 +bill123 +pakistan786 +kipper1 +bobcats +leeds1 +poiuytreza +dolphin7 +ilcerchio +mygirls3 +889900 +timfranzke +beans +metallica6 +freedom12 +01011984 +zippy1 +nataliya +wonderwoman +119911 +password? +jessica9 +15731573 +crescent +black21 +211 +qwertzui +justin69 +198410 +computer11 +mustang123 +deeznutz +pablo123 +tagesgruppe2010 +hockey15 +?? +speranza +md1998pb +cronos +ashley4 +mamina +kingjames +robert69 +jemima +gbgbcmrf +hans +nickelback +ytrewq1 +schokolade +marie22 +manjula +nglw9840 +chris06 +morelle45 +gilmore +wilma +charline +uae_boy +jp72l05w +baller10 +karaoke1 +pimpjuice1 +1947 +neeraj +renate +freemusic +jibopogie +redemption +november30 +columbia1 +taylor4 +robby1 +palomino +lucky07 +anthony07 +christo +camron1 +lana +fialka +fatboy2 +alexis10 +tweety3 +pimping +redsox12 +grazia +memorex1 +chester2 +hanson1 +monange +josemanuel +nene123 +shell1 +12312345 +12345678c +1209 +rapture +starship +yorkie +holycow +hermosa1 +jasper +summer21 +zaq1xsw2cde3 +enocnayr +football45 +texas2 +futbol1 +zk.: +51615801 +kaifer124 +blackhawk1 +raiden +acdc123 +020304 +estrada +yasmine1 +redskins21 +vitor1 +1948 +abc123123 +silverkey3 +8520 +clark1 +miguel12 +tiffany123 +namaste78 +maddie123 +j12345678 +slimjim +hiphop123 +dewayne +ledzeppelin +kolodiy +oscar2 +mia305 +dresden +hateme +wiccan +blueangel +tanisha +elmira +socorro +precious2 +airsoft1 +flower7 +miniclip +jonas3 +hernan +joseph3 +marvel1 +tater1 +sweethome +oliver11 +qwerty66 +dimasik +35365123 +jonny5 +blueboy1 +live4him +12345678b +527728 +baby19 +06lb18 +abercrombie +danika +defender101 +shannon2 +kasandra +love2006 +foundation +newvision +jack13 +108108 +299kgj8hgf +111111aa +neneng +asia +pink18 +splendid +hateyou1 +mexico3 +password34 +cayman +nessie +dale +prison +tania1 +haley123 +mjdh065 +welcome6 +webber +cutlass +bigboi +toaster +cg9600 +crazyman +22021988 +jadebibou +cheer08 +weewee +bob12345 +lahmy1 +baseball. +lumiere +justin07 +fluffy2 +toulouse31 +893208 +goliath1 +123456ss +faith7 +salsa1 +gerrard1 +airtel +nastya +zebra123 +qwertyu123 +what123 +trapdoor39 +madafaka +marykay +lllll +beeline +horny69 +abiola +john23 +maik1996 +ananya +barton +amina +perkele +cabrera +1236547 +utjhubq +maryanne +794613852 +tanaka +godson1 +kitten2 +rockman +979575 +mesedka +c0mputer +greg123 +domdom +jackson12 +zxcvbnm0 +197979 +nasser +lucky22 +papers +imissyou1 +woshishei319 +lahoumti +wow +lilred1 +dominator +olympus +allyson1 +aysa2423 +qwe123qwe123 +hondacbr +kxdw0980 +nashi1996 +master13 +dylan12 +1420839army +matt11 +110006 +federer +jolene +doctorwho +alex +fenohasina39 +kaulitz +love2000 +samir +12356 +maxix565656 +44f16f17f +iforgot2 +qqqqqqo +c00kies +buddy13 +ks120473 +rhino1 +sophie2 +anton123 +mclarenf1 +123443 +patch +chidori +november26 +motorbike +asassin1997 +guruji +taylor22 +facundo +1701 +sunshine23 +billiejoe +hippo +astray +kehinde +gal +nmt89109328673 +flash123 +nuclear +velocity +asd321 +80173rroom5 +midori +julian1705 +16246149 +savings +poot62 +soso +pangga +marques +560066 +sonysony +halo1234 +oluwafemi +fraise +wrestler +casandra +fireworks +bulldog2 +babi123 +junior5 +elizabeth5 +tayuya44 +julio123 +george11 +qwerty67 +pussy4me +ee19920528 +gremio +132040 +123456789000 +qamilek1 +chantel1 +renard +leloto +kiwi +xup6xup6 +lover! +89173371487v +qawsed123 +lh6209lh +987987987 +d1e234tp +oooo +112233qq +forgetmenot +vanessa +albatross +774517397 +15727666 +1234567890qwe +borec123654 +26r10d +magma9824660 +pussy3 +toutoune +sinister +315315 +b4272327 +inibif47 +morenita +klopik +dardevilk +dimas34rus +brinchen23 +tracer +8-9899578642 +chowder +nemo +tristen +212212 +9508402243id +89058895869cth +brown123 +fgjrfkbgcbc34 +kretsaha53 +cristal1 +rachel2 +hejhej123 +1loser +holuha00 +manchesterunited +123456* +mummy123 +vladcherktecktonik +eileen1 +101092 +lenny +jumanji +duke12 +huangfeisuny +brady +3tktkthth +silverfox +312881040 +james14 +lightbulb1 +emmitt22 +esidez57 +brenna +44442013vkkv +chimera +198312 +montoya +november9 +mymusic1 +bo1997 +littlegirl +qazwsx11 +1357reti99 +521125 +paula04 +dallas11 +bublik +lover7 +destiny5 +searching +camel232 +padilla +adsl120 +family11 +bullet695 +13301827475 +josh11 +g +looney1 +olufiz14 +brandy12 +25nuvaha +11231123 +soccer1234 +toni +summer +ramzes +1590736tany +rejoice +dental +harley13 +sarika +nj2mp73t +snoopy01 +80fefune +baraka +narendra +9121318barssuki +butter2 +taco123 +sonya +funtik +andrade +119872653 +ashutosh +k25061405u +juliadronina1996 +disco1 +qw10081973 +andrey1412ua +110096 +maine1 +usarmy1 +578322 +iloveu143 +marcus123 +3106934abc +william11 +05081980bija +19541954 +mortgage +blackburn +lucky01 +metallic +alexis3 +ethiopia +gualapmi +011151zangetsu +d04081999 +latrice1 +fragile +yfnfitymrf +reflex +payback1 +hacked +junior08 +lanlan1234 +51200000 +j: +ccopacell1 +pookie123 +jandre007 +laurie1 +islam +mustang12 +newyork12 +amnesia +cam123 +josh1234 +ktvt6tn9 +jeremy123 +moldova +cisco1 +cow123 +buzzard +ltybcrj1992 +dougie1 +loveme01 +class06 +esprit +m8a8vhr6 +beardog1 +080365 +hoodnigga1 +1urkilbth674 +casanova1 +nicknick +november6 +maggiemay +814336633 +dank420 +cameron3 +starter +asshole5 +pimp09 +bella13 +coke123 +madalena +1488 +mosima11 +honda2 +chemistry1 +lukas123 +min +mother01 +rastaman1 +kirik26trimyasov +ellie123 +ranjan +12three +gummybear1 +bullet83 +treehouse +sasin414 +asemmanis +alex08 +theboys +punky1 +japanese92 +settembre +mcr123 +dedamiwa +angel26 +iopjkl12 +qawsed1 +spanner +bristol1 +belinea85 +sexygirl2 +klg604 +usuck1 +blackbird1 +aspen1 +love31 +justin17 +ingo10477 +britt123 +soccer00 +junior8 +jessica16 +jesus4life +diplomat +juicy +freedom3 +fanculo +e123456789 +antonino +p123456789 +nevergiveup +tiptop +c3por2d2 +fuck22 +aquamarine +pasha +kimberly12 +whiskers1 +jeannette +zy19791201 +190190 +dusty123 +anushka +spongebob5 +gaby123 +austin +cyber +maks +andg1705 +q2345678 +xzibit +arsenal11 +comics +1pepper +honeybee1 +126126 +toriamos +mayra1 +kapusta +rolandia42 +fabolous +goodlove +newlife09 +disaster +jonasbroth +scraty98 +enjoy +matthew13 +shotokan +immanuel +asdfghjkl0 +royals +sassygirl +vangogh +dadounet +911turbo +semarang +lucky9 +poulet +mocha +vaemai31 +bella11 +jarhead1 +dianita +1abcde +potatoes +u79999i +alexander7 +hello21 +zxc123zxc +bijoux +susie1 +peekaboo1 +ju2002 +totototo +goaway1 +northside +211211 +moneyman87 +bimmer +queenb1 +clarissa1 +agnieszka1 +rhfcfdxbr +princess06 +comet1 +marcus12 +giuliano +patterson1 +1234567890987654321 +jayden2 +cristobal +snickers2 +scouts +ooooo +conpro73 +sakina +bitch16 +spider12 +pregmar2 +happy! +candy7 +inflames +hannah4 +123456789zxc +john2567 +database +nicoletta +sdsdsd +723723723 +maika2006 +iloveu5 +arkansas1 +26 +jesus4ever +login1 +aquino +fuckyou14 +hopkins +reptile +neptune1 +1basketbal +560043 +7eleven +110070 +bryce ++ +gayboy +joshua22 +justin4 +slater +chanda +chicken4 +imation +gudiya +ele +andi121382 +seymour +1111112 +t +sweet15 +019283 +was123 +giselle1 +redbird +kenwood1 +lookatme +1993ga4mi +13489277 +hotdogs +underoath +friend2 +donaldduck +snowy +shorty15 +mypass1 +ronaldo10 +etnxtxsa65 +kitty69 +transfer +killing +hohoho1 +a159753 +woowoo +chewy +jackoff +tiger01 +john22 +iamawesome +broadway1 +donato +jam +dopeboy1 +f +jess12 +patrick7 +schilf02 +banner +114114 +capitals11 +crackhead +01011982 +pimpin3 +lala1234 +money15 +zpaqrt2963 +shadow9 +cutie4 +ilovejohn1 +baby88 +shorty5 +gemelli +engel00007 +dodgeram1 +morgan +aabbccdd +bulbul +15516210 +vflfufcrfh +martinique +sandokan +iluvyou1 +joseph +1203 +milanista +hshn7669 +love333 +madelyn +gag5691 +jesus22 +clarke +rahul123 +eagle123 +happyday1 +kikikiki +13marino +bloods5 +66613666 +mischa +koupelna +major +oregon1 +monty123 +piccolo1 +silver2 +grecia +tiramisu +euphoria +chelsea01 +jessica18 +tucker12 +please123 +111188 +18297649 +bulgaria +jac +satria +marcio +leilani1 +1orange +shiningeagle +locked +harley07 +rajeev +redwin3d +carroll +llllll1 +patrick3 +301285mn +frederick1 +salama +121233 +cookie22 +blue25 +biscotte +naruto924 +sonicx +mnbmnbmnb +rossia19 +freak123 +mara +osvaldo +ramos +198282 +robert23 +tink +wolf359 +sonyvaio +sisters2 +sutton +starwars03ja +burrito1 +sainath +45533990 +harley08 +srikanth +fkbyrf +allstars +fu00190 +samson123 +love2012 +sober3 +wm0001 +hhh +josefa +december24 +shadow +kristi1 +wanderer +binky1 +cookie10 +aldebaran +michael09 +stubby +angel02 +nvidia +54226269 +120689 +nthvbyfnjh +galant +mydream +marisha +mad123 +johndoe +teufel99 +vidaloka +garlic +swansea +t1234567 +ilovejames +password42 +mandarina +inter123 +mona +escorpio +master +dbnfkbq +jetski +xenosaga1234 +david69 +mob4life +telefon1 +ilovedogs1 +smurf1 +55chevy +yellow23 +cassius +rohini +reality1 +emeline +111985 +uhbujhbq +band123 +sweetgirl1 +darwin1 +oieoie +snoopy +blacksheep +loveme21 +tabatha +iloveher2 +kamil555 +blackboy +sanjose1 +121088 +isabell +1aaaaaa +better1 +peugeot206 +happyman +apple7 +november28 +search1 +menace +fuckyou08 +snoopy11 +spiders +memememe +myaccount +petrovich +gabber +burnout +mexico5 +olive1 +69664848 +kahitano +joana +blade123 +virgilio12 +linkedin01 +1234567e +audi +roscoe131 +fantasy7 +suckdick1 +fairy1 +concetta +lakers12 +kmk420 +sofiane +jayjay123 +misiek1 +ilovemoney +blackbelt +nicole69 +smithy +chairman +topdog1 +pieter +teejay +poop101 +trikers21 +december29 +radical1 +therapy +12345789 +angel +runaway +tielandros01 +happy4 +thomas21 +srbija +qqqwwweee +daniel17 +130989 +approtec +warwick +brighton1 +stargirl +rosana +dsadsa +number22 +rubberduck +dutch1 +89272585 +gillian1 +1hateyou +missing +viet12 +herbie1 +vampires1 +258147 +honeypie +biteme! +ghjcnjgfhjkm +bush25 +impala1 +zz123456 +ouioui +19551955 +callme +8phrowz622 +austin7 +gunit50 +emmawatson +andrew14 +killerin66 +angelgirl +court1 +merdeka +station1 +diamond5 +pisces1 +christian0 +farside +dancer! +pinpin +bbb123 +111987 +megan12 +love86 +jnkwear1 +alex12345 +tigers11 +youknow +falp5050 +softball! +civic +1q2a3z +bank24 +sammy11 +photo +170845 +abcdefg12 +29271188 +tarantula +angel675 +ballack +cadbury +november4 +jason13 +elcubano1893a +urdg5psk5 +doggy2 +ashley +ashley07 +1matthew +mantis +player23 +tigers123 +terry123 +frost +andrew +avenger1 +thanks1 +lucky23 +uzumaki2 +bro +123580 +daddy5 +slimjim1 +loveyou7 +nonenone +htown713 +197878 +kmzwa8awaa +chicca39 +karishma +27140621 +ltdjxrf +ganster1 +67890 +brianna12 +zxcvbn12 +leroy +kokot +rfgbnjirf +xiomara +secret! +leader1 +christoph +q0tsrbv488 +tropical1 +grasshopper +alan123 +95135876 +secrets1 +meimei +cuervo +musift10 +bremen +password1 +source +goku +monte1 +love98 +twilight13 +naruto14 +playboy13 +wwwwwwwwww +shannon123 +chango +fucku! +ozzie1 +jaw138whet330 +jaisairam +caterpillar +lydia +gaspar +eagles10 +2233 +73439984 +pokemon1 +lucien +kuwait +venom +hannah99 +fugazi +residentevil +8616695 +clyde +83742222 +iloveu. +idiota +haylee1 +123963 +james15 +kevin13 +poopy2 +32flame +asshole. +puddles1 +alyssa01 +a696969 +poupou +rex123 +heitor250493 +metropolis +saint1 +r041stcu +dlfaor09 +vfhbjk1801 +poohpooh +infinite +valentin1 +1234567w +brandon14 +wokami +rider1 +czsxumtf +diva12 +golf123 +abc123. +cooter1 +vitolino10 +audiopel +verena +glacier +blood12 +dickens +qqqq11 +kevco33 +littlebear +wrinkles +amanda10 +baller15 +11223343 +strelok +vector +luckystar +johana +hotdog12 +pussyeater +jokers1 +cookiemonster +hi123456 +katiebug +seaside +brandon8 +valdez +daddy11 +female1 +columbus1 +sk8ing +bas +zaphod +medina1 +greenday! +shanna1 +luther1 +cyclops +696969a +wwwww +princess25 +woody123 +carollo12 +tinker123 +michael07 +p@ssword +fab +goodwill +switch +bigmike +bunbun +abbey2010 +876543 +shine +smiling +ozzy +gutta1 +engelchen +valentino1 +nico39 +raerae1 +tokio1 +akasha +angeles1 +nederland +beastie0 +nathalia +nolose +magno456 +pfkegf +1114 +gopher12 +owt243ygbh +mustang3 +three +aaaa1234 +support1 +nodoubt +tomas1 +fishman +brammi1 +peleleco +yyyy +leno4ka +karlita +anastacia +daniel! +skydive +112200 +pacheco +vandah +lin456 +ernie +299792458 +zimmermann33 +yeahbaby +paddy +badboys1 +berlin +daniel4 +grinface +charlie8 +pidaras +mother11 +london2 +sherlock1 +linkedin4me +102010 +karlos +01011989 +king22 +capitan +tigger10 +tangina +ghjcnbnenrf +sunkist1 +manuela1 +packer +moomoo2 +hunter69 +march2 +1lovers +mom101 +dzxtckfd +scooter12 +654456 +comando +kavkaz +bradford1 +yoshi +dei3mutter +earnhardt +marbles +sha22una +1616 +cooldude09 +reggae1 +lilone1 +13579a +gerardway1 +19960122 +blood2 +andres123 +chica +pacific1 +111116 +fosters +softball6 +emotion +furball +ballack13 +kendrick +bugger1 +snowwhite1 +chinese1 +kolkol90 +nicole24 +newdelhi +chess +256256 +irock! +whitepower +loplop +22janv67 +undergroun +mariage +lucky14 +nhanngu +9198425200 +pimp07 +197600 +120588 +casillas +w3wjnhek +zhenya +wright1 +summer2009 +auckland +560017 +sha123 +stallion1 +redsox24 +kenshi21 +con +tttttttt +robert21 +hawkins +476730751 +12345678l +senthil +linda12 +01011983 +cali +highlife +elizabeth4 +ltymub +500034 +mojo +chino +pianoman +wildlife +666satan +rolling +dancer11 +skater3 +sc00ter +gargamel +120789 +59230120 +kardelen +mauro +oluwatosin +volvo1 +sexual1 +tvs3108 +jesica +flipflop1 +perez +kocham +peacemaker +pitapooe1 +orioles +1getmoney +beijing +amanda7 +hijodeputa +199000 +ralphie +jellybeans +vesproongh12 +vladimir +king21 +3456 +erwin +gabriel +ryan01 +150781 +lauren! +hollow +wendy123 +palmtree1 +caroline +jacky1 +600017 +7heaven +jorgito +ravindra +howdy +leedsunited +vadimka +diabolik +pourquoi +website +brm600 +carlita +bandit +march8 +puddin1 +khongbiet +ayanami +alina123 +pass1234 +brandon6 +keke123 +nihaoma +refresh +jhonny +gre +girlsrule1 +ricard +super2 +musashi +alexxx +thursday1 +dmsgk0103 +2q2w3e8r5t +grendel +gracey +marie15 +travis12 +kevinbg01 +goodyear +774411 +yana +mindy +desktop +butler1 +robert5 +3tutso24qf +just +hyperion +tank +worker +pepsi12 +apinoy +brandnew +janine1 +alex69 +delivered +caracol +sophie11 +broker +whatever3 +sc00by +chrono +shady +440226 +jayhawk +fake11 +skittles2 +valkenhayn +ripple +carlos01 +reagan1 +xerxes +nofear1 +ural +ballsack1 +starman +63245009 +comanche +umit1406 +goldenboy +karappinha +lowell +saleen +magno07 +skater8 +cfif +jacopo +brook1 +theend1 +minecraft123 +umberto +hotsauce1 +mordor +webkinz1 +blind1 +pringles1 +strobe93 +bryson1 +ihateyou12 +buddys +mycomputer +iloveyou00 +yacine +sanfran +sean12 +260686 +triforce +fucklove12 +123qweasdz +opendoor +133113 +familyof5 +koolio +dinner +ballsack +tomek1 +111986 +pioner +hunter21 +hovno +x8coqx1f1zh +spikey1 +123159 +laura12 +2626 +brandy123 +jaypee +ganja1 +qsdfghjklm +socks +baby03 +1cowboy +aaa000 +xsdsxs +hamtaro +kristian1 +chowdary +jkl +babies3 +hunter09 +manana +mor +thunder123 +campanita +abbey +lovehim +bigben7 +realtor1 +lancia +198211 +39073588 +cocodrilo +cheyanne1 +vesper +jackson3 +tech +redsox07 +120286 +jesus. +vinayaka +smooch +almeida +dance2 +nokia7610 +alex06 +qazxcvbnm +pimpin123 +astro1 +gobears +hardy1 +poopface1 +cobalt +pitiponc +ocean11 +cheer09 +sheep1 +bernice1 +crap +carly +tiger21 +happy6 +fox +calendar ++++++++++++ +ama +chester123 +1101 +mintal24 +anapaula +marcus2 +gunther1 +12345677654321 +sexy77 +fuckshit1 +marie5 +110049 +12qwer +82597971 +jenn +bball15 +121087 +honeymoon +jackass12 +requiem +republic +4friends +taichi +bathroom +5550123 +biology1 +jemoeder +boxer +v3xafy4k3y +football42 +angelic1 +0123654 +400080 +sunflowers +money99 +randy123 +enamorada +demons1 +sexy45 +nicaragua +maddie12 +1winner +198212 +hewlett +namour +electro1 +magodeoz +1qaz3edc +jenifer1 +thing1 +january12 +sebastian2 +math +sixtynine +cheeks +aaaaaa6 +sayangkamu +neville +fritz1 +connor01 +andersen +hustla1 +tickle +vtldtlm +cincinnati +profile1 +leeminho +metallica +newhouse +ppppppp +125478 +kristie +hornets1 +fresno1 +greatness +steven01 +bear11 +danny13 +inlove2 +satellite1 +basti_1014 +peanut7 +paulchen +5stars +junior23 +1thomas +oldnavy1 +rerjkrf +babyboy13 +1sexygirl +jardin +filter +loveit1 +cj: +sunflower2 +anna1234 +family +jbond007 +faster1 +carcar +teddy12 +parliament +generals +121984 +christel +baby2010 +gagoka +fun4me +girls3 +peanutbutt +magica +pinball +westside12 +alissa1 +hardon +bolivia +gaetan +30seconds +1104 +keaton +lavalamp +10971199 +ccc123 +ganster +1ty2an3ja +01233210 +d9189498 +richard3 +098123 +john01 +$money$ +stafford +mystic1 +cristine +heartbeat +lipy110593 +slasher +hongkong1 +1queen +endless +futuro +bonehead1 +carvalho +thunder12 +jesper +dblock1 +silver7 +gamemaster +001234 +michael17 +basil1 +herbsmd +maple1 +timeout +hottie22 +g123456789 +candles +melissa7 +28 +keke12 +eastside5 +butter123 +z +atticus1 +blue18 +121416 +zmx870919123 +str +danzig +fester +babaji +brasil +vball1 +truffles +1103 +ambrose +rivaldo +jackson1 +peanut13 +1lovely +poppie +1949 +christoph89 +cnfcbr +120589 +toocool +baybay +mike10 +maxie1 +bullshit2 +march4 +01012001 +magpies +puravida +joshua5 +cherry7 +me123456 +210210 +yomama2 +raumschiff +harley06 +backsdau +twilight2 +lourdes1 +thecrow +gypsy +)ryan +pogi +92246247 +napster +judy +1903 +alien1 +eliane +iloveu +sunshine. +gladys1 +monkeys123 +naruto22 +560068 +jennifer1 +chispita +susieq +money! +yesyes1 +allegro +purple17 +ragnarok1 +bikini +nashville1 +vivaldi +shikha +120587 +venkatesh +xx123456 +gardner +jmoney +joseph13 +555999 +hockey18 +copyright +paintball2 +daniel08 +6661313 +toby12 +kujawka98 +messina +booboo3 +familie +loyalty1 +skulls +whatthe +philippines +kayden1 +batistuta +february1 +spongebob4 +justin6 +jellybelly +bloodz +emmett +cannabis1 +omgomg1 +rustydog +tilly +hurricanes +angelface1 +12451245 +diablo123 +bender1 +lina +167943 +cooking1 +beruska +lollipop12 +shadow0262 +cash123 +joonah +747546 +angel03 +bnm123 +dogfood1 +milkman1 +master10 +willis1 +sexychick +pikapika +she +1school +cannondale +martin2 +dogwood +oceano +verygood +alexander0 +gaygay1 +mario2 +dakota11 +ponpon +101288 +football81 +skelitor66 +gabriel12 +juliocesar +purity +tucson +soccer02 +vernon1 +siddharth +sunshine123 +dougal +nananana +elcamino +venture +passer +choppers +barney123 +2121321q +brooklyn12 +110009 +fofinha +horace +tra +camels +kazanova +lovehina +12101210 +meatloaf1 +keyblade +63145151 +bearcat +natashka +dotcom +juillet +woohoo1 +muschi +fuckit69 +vinny1 +timosha +sami +michelle19 +3doorsdown +workout +l58jkdjp!m +w1970a +belinha +pepper5 +lpz93ssskqw8q +sandy12 +seashell +110022 +liz +talk2me +babyangel +fag123 +tweety01 +1234567890p +brenden1 +jonalyn +merlin +198222 +honda12 +120687 +sinaloa +darian +paige123 +daniel. +kelebek +fallout1 +bunnie +analyn +mamatata +vagabond +caleb123 +ninguna +justforfun +1kitty +audi1991 +casa +fandango +star16 +cheese7 +weirdo +keeper1 +violin1 +mafioso +banker +benedetta +guyana +death13 +009009 +slim +2boobies +mexicano +mauricio1 +military1 +12231223 +gohome +999777 +goodman1 +baguvix +gra +4freedom +mer +xxx111 +karim +smeghead +fancy1 +qvo78evm +nate123 +isis +t7u9hx +tito +polinka +m1ul9x9i20 +signature +.ktymrf +120788 +graces +anisha +alizee +mother4 +5610405 +m0nster +panpan +686611 +password12 +superman9 +werilopert +repytwjdf +respekt +boston12 +tyler10 +zodnat +piggy123 +loxpider +louisiana1 +1234567f +113322 +555551 +dixie123 +batman21 +newspaper +tata1964 +volcom123 +wwewwe +soccer03 +branden +love2hate +sss123 +123www +alex09 +a12b13c14 +ingeniero +beastie +ya623349 +celinesimon +1jennifer +donjuan +27 +peachy1 +nadegda +sweety123 +king10 +bh90210 +longlong +olivetti +tonyhawk1 +home12 +nick01 +nicole88 +wweraw +joker69 +gamers +money24 +ss123456 +maricon +hate123 +gambler +mjordan23 +pollito1 +1badbitch +goodies1 +andrea01 +mike14 +roosters +vikavika +azacos +nothing123 +manutd7 +ebeans +adidas12 +qazwsxedcr +balboa +kissme12 +050607 +katelynn +fishes1 +zoezoe +qw12345 +rosetta +pomidor +myworld1 +interista +harley +angelgirl1 +yousuck! +matchbox20 +pass@123 +joshua23 +jonas12 +edward11 +123cat +odyssey +vicekw +delaney1 +babyblue2 +allan1 +samantha11 +pink17 +cheese4 +delight +thedog1 +barbiedoll +cool23 +mod7tygrysow +chitra +michelle10 +polpetta +scarface12 +marcelle +li0903 +hhhhhhhhhh +seaways +01 +emopunk +8675309a +j0nathan +freedom08 +thekid1 +30303030 +tyler7 +wingzero +frenchie +fishy +yellow01 +chukwu +james09 +blessed1 +silver11 +roman123 +deleon +ginevra +osiris1 +glenn1 +lashay1 +1125 +askimsin +113456 +monkey25 +norwich +booter +december7 +sanantonio +yenyen +rakista +lovebirds +pan +salamat +hott +emi +toietmoi +shelby2 +michelle5 +kill666 +lol123lol +wareagle1 +pippen +12233445 +konijn +alexus +cholo13 +sweet5 +james07 +tucker2 +ilove420 +playmate +cowboy69 +maggie10 +baseball07 +brian12 +1buster +fripouille +blackboy1 +happy12345 +villa +preety +connor12 +niggas +dagestan +12341234a +hero +chatte +program +hello +december5 +super5 +korona +zzz +bubbles11 +skull1 +tomato1 +malibog +im +123 +passwords1 +dancer13 +pokemons +gobucks1 +avenged7x +121090 +white123 +sarah11 +kiran +masterchief +12152325 +1brother +tony11 +astral +knicks1 +sheep +ankara06 +jesus08 +govinda +franco1 +cyborg +007008 +hokies +ivanka +baseball1 +moo +milo123 +jackass3 +feniks +i12345 +010191 +cowboys123 +baby20 +mateo +jerico +dada123 +naenae1 +golfgolf +emokid +andrea11 +1029 +castro1 +hate666 +brandon22 +snowball2 +dor +bessie1 +sensation +anita123 +gladiator1 +billy2 +a123456b +soso123aljg +1tweety +adam11 +jujuvivi +arwd89 +irisha +huhuhu +soccer44 +lfiekz +jordan05 +sky +futebol +jb1234 +888888888 +wer +220a220a +excite +abenteuer +h123456789 +cherry69 +tiffany12 +dennis +dct +stormdogs +alpine1 +qazxsw2 +dexter123 +dbnfkz +omgomg +supermanboy +hallo1234 +azsxdcfvgb +fullhouse +lasvegas +sukasuka +qwe123123 +justme2 +888777 +protection +azazel +cards1 +galadriel +pilot +forfun +naruto1234 +saleem +koolkid1 +melanie +free4all +mybossmyhero1 +napoleone +sugars +taylor99 +nascar48 +blink-182 +killer101 +brenda123 +bronson1 +norris +flego0815 +10101990 +rebecca +west123 +jaja +lovemusic +nairobi +3647226 +fuckoff666 +112255 +mexico14 +monster11 +tatertot +chillin1 +football52 +beta +1226 +padlock +f1f2f3f4 +141 +!qaz1qaz +venezuela1 +kathy123 +iiyama +chantal1 +1220 +hakeem +yjdsqujl +010190 +hellsing1 +justin09 +xyz +reklama +geronimo1 +satriani +ybrbnjc +urmom +blondy +rossana +foxtrot1 +andrew4 +poopie2 +1357900 +10101987 +pinetree +946hvt +economia +121986 +penner +poopoo123 +jojo11 +volcom12 +rocky4 +cicero +121312 +william01 +jacob01 +poiuytr +gulliver +cavalier1 +forever! +1323456 +daphne1 +52525252 +dahlia +ayodele +1q2w3e +reallove +lovemyself +121987 +lights1 +rerehepf +witch1 +december27 +raketa +brownies +stellar +lilmama123 +lisenok +vbkfyf +08080808 +buttercup2 +lonnie1 +ers +boohoo +pokemon13 +mayflower +411038 +a12345a +january13 +cccccccc +choco +everett1 +csyjxtr +36363636 +turtle123 +gloria123 +bitchs1 +vasile +krishna123 +august5 +karol +sex6969 +helmut +password2 +asshole7 +vintage1 +willard +secret7 +secret +sexyass +planet1 +gigi123 +december26 +margera +333111 +helper +7783757s +nadezhda +momomomo +sakshi +killer14 +tushar +560008 +corndog +101084 +north14 +1201 +madeira +thunder7 +jamie12 +1monster +myfriends +paco +gooner +harry12 +slash123 +keekee1 +hotwheels1 +tristen1 +escape1 +fanny1 +nevertarget7 +775533 +bigdaddy2 +love<3 +james08 +julian123 +helloween +upyours +rocky11 +lucrezia +trinity2 +peacelove +nyjets +bebebe +caveman1 +cor +2212 +elizabeth! +ass1234 +deathrow +slappy +elias +1christ +oldman1 +windsor1 +danone +dream123 +yzerman19 +highland1 +kid123 +devin123 +element12 +peaches123 +tapout1 +lili123 +casimir +macho1 +120488 +celtics34 +solutions +assassins +x7vs8mxg +151 +wocaonima +football66 +simeon +12345670 +nguyen4thewin +dublin1 +1003 +12345ab +samantha3 +twilight! +meowmix1 +yasmeen +jenkins1 +colasisi +naruto3 +redwing +munchie1 +eagles11 +morozova +christian3 +jason11 +six666 +rogers1 +lalala2 +zaqwsx123 +rafael123 +alphaomega +yj2009 +182182 +ilovepink +playball +open4me +polonia +sprocket +michael16 +defiant +rottweiler +antonine1 +fotbal +ser123 +peace7 +august4 +candie +rastafari1 +david1234 +privacy1 +158158 +nbvjif +juliet123 +freedom09 + +dragon14 +malaya +campus +sexy33 +sweetypie +darryl1 +nathan23 +jaguars +lover01 +obama09 +bre +максим +123456789@ +alex88 +k47rizxt2g +hippie1 +rocknsock1 +512512 +perlita +p939468 +1025 +jasmine1 +zydfhm +jamesbond0 +heaven2 +cheese5 +hellyeah1 +carlos11 +bombon +ashley. +richard12 +kahuna +wormix +mikmik +aaron2 +jessie2 +aceace +mormon +cobras +nutrition +december3 +blackangel +cheddar +resistant50m +1234o8o +avril1 +honeybear1 +douchebag1 +sayonara +ballin123 +bugaboo +sticks +robert10 +cbcmrb +20102011 +person1 +70142021103 +naruto23 +joker2 +casey2 +contreras +mommy6 +rachel01 +intel +111111z +drpepper23 +desperate +smiley123 +tuffy1 +angels7 +brodie1 +161718 +ludovica +qaz1234 +muerte +hendrik +blessme +malakas +babmicmar +ceasar +shadow6 +taylor6 +manning1 +tanner12 +black6 +morado +abcdabcd +lynn12 +game123 +poop13 +hannah22 +gangsta13 +qwerty555 +fr33dom +yellow4 +198610 +500003 +canucks +arsenal10 +hoihoi +saved1 +minnie2 +lipstick1 +kkkkk1 +theboy +lepidus +merhaba +968574 +windows123 +181181 +hunter06 +rose11 +liliane +159123 +metin2 +babyboo2 +dupont24 +rocky7 +epiphone +shadow666 +741236 +mailru +hawks1 +westside2 +tigre +belle123 +master7 +anakin1 +jcfs32014 +250588 +pink88 +burgerking +good4you +somierda +america11 +dmoney +frankie2 +touchdown +inuyasha2 +loveme4me +giuseppina +250250 +sexo69 +90801 +cooper2 +packardbell +barney +classof11 +54545454 +joshua19 +brandon1 +tierra +pool +1228 +mortgage1 +1joshua +daddy13 +197500 +1thursday +iloveyou33 +allah123 +marcelino +sullivan1 +jaybird1 +kevin7 +fyfcnfcbz +boner1 +looloo +kristina +niagara +clara1 +yingyang +purple. +bazas52 +ladies1 +drakula +things +shampoo1 +export +martin01 +wildflower +baseball99 +kamil123 +chelsea1 +fktrcfylh +marie16 +fucktheworld +jesus111 +cacacaca +292tom +alexandre1 +sonic2 +all4love +millwall1 +jalen1 +l1qoh9wq2u +master5 +aquarium +natalie2 +cattle +kailey +chris8 +okokok1 +plants +choco1 +fuckme3 +dennis12 +tigger4 +111984 +flatron1 +jennifer3 +barber1 +gracie01 +eagles2 +lectures +ceckbr +anna11 +paranoia +andy1234 +friend123 +96132925 +junior22 +calabria +rrrrrrrr +elise1 +timisoara +chicho +bowler +cocktail +12123 +bobdole +g4life +micky +wood +november29 +010203a +level27 +steelers12 +800001 +net +foxracing +bud +mutley +alex2010 +patrycja +baby2007 +tumbin +rosita1 +0931541082 +321ewq +premier1 +timmy2 +hahaha2 +olympia +snowbird +direct +checkers1 +theman123 +111111m +guerra +4561230 +summer04 +social1 +hhhhhh1 +muneca +bichon +accord1 +war +sweet11 +booboo13 +vfhbyrf +doggies1 +david14 +lumina +angel143 +120590 +australie +schoolboy +bouncer1 +canada12 +yankees123 +baboon +password92 +hammerhead +bonkers1 +egghead +stockholm +400607 +qw12er34 +booboo22 +120688 +hilltop +killa2 +jessica6 +happyness +ltkmaby +stargatesg1 +dylan2 +skater5 +minnie123 +hottie23 +millionaire +appletree +schatzi1 +chenchen +111189 +password93 +cisco123 +dfghjc +fuckoff12 +angelique1 +050585 +aabbcc123 +cody11 +sexsex69 +granite +steven11 +chocolate0 +300000 +teamwork +hotdogs1 +test12345 +1107 +mussolini +123456lol +pinky12 +taylorswif +sneakers1 +135799 +flexible +sabaka +1218 +latitude +communication +colt1911 +withoutu +nokiaa +army +santander +v1ct0ry +411027 +smiley13 +batman10 +pointer +minnie12 +mumanddad +supriya +zafira +dollface +120586 +kkk666 +matthew8 +cara4com +summer4 +jonatan +abdallah +kumari +chowchow +groucho +gizmo2 +sabres +147258a +cristiana +hunter +airsoft +master22 +payaso +jade12 +sonnenblume +mapamapa7 +250585 +nathalie1 +tiny +101189 +jordan16 +avalanche1 +logan2 +drogba11 +fotografia +monita +blackheart +william +lollipop0 +chivas14 +badakhshan +paparoach +donatella +omega123 +charles123 +bitch9 +1432 +family10 +joseluis1 +hakunamatata +radar1 +rodman +december30 +password123456789 +gangsta3 +1134 +guitar7 +120489 +spiderman5 +graceland +aaff +becky123 +taylor08 +sweet10 +777000 +159963 +223311 +dbrekz +sixsix +mavericks +marie10 +120690 +180888 +3762352 +rockstar! +ericson +1234qwerasdf +wisconsin1 +shorty101 +macross +flora +hoosiers +werdna +chelsea10 +christine2 +cunt123 +shitfuck1 +default1 +memyselfandi +rbcekz +minchia +bambina +110048 +pepe123 +medellin +sunny36 +cessna172 +bowling300 +buster22 +jakub +andrzej +derevo +2much4u +zv_!80lo +spice +chester +ranger12 +butterfly +master77 +nbvcxw +katia +3434 +griffey +gonzo +serebro +monkey +liberdade +1105 +gallagher +casper13 +jojo1234 +jazzie1 +tititi +open1234 +01011970 +hunter23 +tricia1 +chucho +lachlan +cheer2 +michelle22 +sommer1 +dakota +lakers2 +sujatha +1005 +morrissey +brains +mama22 +trapper1 +balls123 +makoto +joshua08 +wibble +austin99 +123 +elena123 +brandon15 +peaches12 +micron +ghana +slutty1 +johncena2 +13311331 +klondike +family! +bball33 +marie21 +luckygirl +remo1d72a +coconuts +wrestle +sarahjane +hotgirls +tyler4 +wellness +antoni +nicole06 +45m2do5bs +essence1 +qwerty89 +brandon9 +cesar123 +spongebob! +luv +kukolka +retired1 +vladvlad +nicotheo +camaleon +bean +jake13 +sexy4u +bonnie +zmf1704c +wawawa +haslo123 +hazard +badass2 +erika123 +ros +111222a +cheer! +indonesia1 +cdtnjxrf +belladonna +daydream +gungun +ceckbrcerfkbxyjcnm2 +bateau +hehe +tonytony +elephants +iklo +seccion33 +maxi +bettyboo +mewmew +negro +lonestar1 +barron +maumau +internet +aspirin +aqswdefr +sanjose408 +dragos +hollister7 +jediknight +martino +maximovie +branden1 +sexysexy1 +yakuza +snow123 +enzo +121085 +gaby +boner +fart123 +1james +eagles20 +gomez +fernandez1 +draven +cashflow +antonio12 +526452 +january11 +crf450 +bartender +june06 +2daughters +matthew6 +enfants +brooke2 +portsmouth +faith2 +hahahaha1 +andrew15 +zelda123 +martin6 +070787 +lassie1 +dudeman +4r3e2w1q +minecraft1 +chantelle1 +alex1995 +oskar +zzxxcc +jennifer +ooo000 +subaru29 +players1 +camaron +tombraider +favorite +crazy88 +seth +1booboo +texas10 +sharmila +poohbear3 +templar +password02 +romero1 +blood666 +manatee +eagles123 +segredo +chellam +nika +fatty123 +football50 +monaliza +dulce1 +bedford +110288 +bennie!! +aiden +soriano +eminem11 +1samantha +123123m +nantes +q1w2e3r4t5y6u7 +637846 +engage +doris +lakers23 +12312300 +alexus1 +kanada +7seven7 +hottie10 +19870212 +170787 +shraddha +businka +hunnybunny +impulse +brandon21 +silvestre +mobydick +string +blue17 +zach123 +fatfat1 +far +celine1 +banjo1 +panter +boring +as +skate3 +fruitcake +bull +chloe2 +kieran1 +hottie16 +aaaaaa11 +aeynbr +tiantian +jaguars1 +vepsrf +jackdaniels +supermom +121985 +larson +paixao +sammy3 +198011 +boobs123 +121280 +helios +food12 +semsem +laser1 +purple24 +mjmj12 +maria11 +101285 +bmw525 +friends11 +30 +karina123 +nicole9 +anais +james6 +mimimimi +lewis123 +searay +oakland510 +rhapsody +1qw23e +168888 +9lives +33rjhjds +habbo1 +dragon4 +porche +nigga5 +258789 +dingo1 +dudedude +jamesdean +jennifer8 +120288 +william4 +password87 +robot1 +qazwsxe +lesley1 +meg123 +sayang123 +lopez123 +hottie15 +hockey77 +101188 +oks65b6666 +spongebob8 +papito1 +500081 +1batman +moochie +middle +rockrock +legacy1 +213141 +nookie1 +slugger +albany +bomber1 +vick44 +163163 +shakti +jayjay12 +service45 +123xxx +sapper +patrol +magic12 +interpol +cdjkjxm +ashley8 +numbers +buffon +temptation +125521 +mikhail +joujou +abubakar +christie1 +jennifer7 +smail.ru +purple18 +jessica17 +10101991 +nameles +nova +icandoit +winamp +single09 +stallone +baseball01 +xtube +billy12 +marios +gangsta74 +edward13 +babypapa +asss +olga123 +yf +hatred +yankees3 +ashley19 +cowboy2 +bajskorv +irishman +sugar2 +peace3 +tomahawk +10102010 +asshole11 +121188 +999888777 +kelechi +adorable +bell +kamiloza +compass +hannah08 +isadora +2monkeys +slash +bethel +951753852 +qwerty654321 +chris9 +johnnie +hoosier +ferris +looping +333333a +proton +swagger1 +6820055 +imawesome +cowboys13 +999999a +chicky +motley +caesar1 +120000 +elenanesterova +muaythai +sakura12 +walleye1 +mother5 +ducks1 +arielle1 +aurelio +adamadam +video1 +flossie +123123s +121089 +mamacita1 +keywest1 +020406 +bitch18 +wwwwww1 +gulfik +fishing123 +dimafilippov +753951852 +1222 +ohmygod1 +5845211314 +mrbean +2brothers +tmoney1 +jalisco +400601 +corey123 +10000 +james +natalie123 +primetime +thanatos +gundam00 +newone +spice333 +101286 +crazy11 +stripper1 +christine +myspace18 +gracie123 +sefa1986 +heather7 +pavlova +1013 +sisters3 +brandon23 +nighthawk +603575 +jones123 +1dumbass +conan +snivanie +soccer27 +fatboy123 +jasmine10 +yuliana +nilesh +ops111 +assword +byron1 +ad2021 +joseph7 +taffy +volkorez +owolabi +milan88 +etnies1 +j0shua +delaware +naranja +man55580 +------ +slava +rrrr +greece1 +225522 +marylou +michelle4 +missika +baron1 +gleiser4 +saleens7 +glory1 +bmw318 +maxwell2 +ilovedad +nutter +whatthefuc +july0788 +january22 +rightnow +pink24 +de +yourmom12 +teamo13 +1202 +213456 +110588 +carmen123 +123456q +happyface +hasan +h2opolo +michelle21 +boys123 +kj +abe1973 +jessejames +atlantida +honeybunch +stingray1 +shadow15 +edwina +carissa1 +powerful1 +boss167 +varico +newlife2 +smiti1 +beatles4 +mia30 +gemini2 +123ass +customer +hatelove +bellissimo +ingeras +1babygurl +babygurl3 +q1234567890 +wizard101 +gady123 +t326598 +1236547890 +kokoro +simonona +pooter1 +michou +computer5 +cunt69 +sex1234 +capslock1 +slaptasis +dorcas +tobydog +qwerty1517 +soccer55 +waterboy1 +camillo +evelyne +cranberry +yeahyeah1 +k2010302 +robert1708 +ernestsantikov +bubbles5 +shirankova42 +620850 +matthew10 +crunk1 +quadd +shiznits +august7 +elektro73 +123555 +100686 +lailas +kelsie +lyva84 +loveme +kotox76 +michelle14 +vitaminka88 +maxpredator +1mickey +jimelen +kotyk22 +dorota +vibi123 +shuhrat007 +sulamifcherenchikova1979 +vkuradovetc +mushroomka +yanchikchmoki +fredfred1 +moshco +summer2011 +1qasw2 +varga43 +musyka85 +vkrbashyan +troika93 +dantheman1 +1234567qwe +lenyi +lifestyle +vfvfvskfhfve +princess99 +spread-hop +myzone +baronessa87 +gorlonis +olgastrashney +god7507 +123321456 +sta93 +cobain1 +arkoximsp +dfdfdf +daewoo65 +kuzya-ser +eremei_vasechkin +loveko +nif686 +forgin +679956 +thug__ +maksimka876 +charlie6 +22222a +vkorotin +rtertuy77ijyhu7i +grih-rom +casper2 +volkova.ksyusha.89 +kotkova37 +maks.abramov.99.99 +kotmichanik +valya.kryuchkova.1990 +d9160847880 +papuskin +ramsia1986 +volkovoi_net +muhon +strekoza79 +sunnyest +lorik197110 +pokey1 +r_masick +betsynx0kof +aliya.mutallapova +aleksej.shorin.86 +gifema +buster10 +bellaboo +maksimilian_nasirov +5695595 +shukshinasveta +erast.82 +rio7777 +nusha.88 +renkanom +prosvirkind +spection +solomaha-denis +sagalil +valya-garanina +galina9181 +soloveibormalei +oksana130279 +robby +zabivay +kotya_bagdan +jeremie +lexa.maxus +560029 +okein +tema-bushelev +sans2010 +alexrv_06 +inar_ka +enyvbuois +maria-fam +g1hp +guldaniya.galina +sgga +len_nik44 +lopew +sivenkovklin +skrip-natalya +filatovaev1981 +63val63 +blond72 +sergeev2212 +raymonde336schwegel7331987 +zarinalin87 +tyrell +miha-nov +djedenhit +e.ovcharova +sofya.kulikova.87 +elwooo +marinaorlova1991 +vkot_2010 +shukurova-ismigu +yulyasik2002 +123654q +taskaev777 +borismf5tsh +volohovich-t +smirl +maxonina22 +trustme_k +sewewf +mbrim +len4ik31 +stronghold +serban24 +rezo_2010 +victorclavier +varduhigohar +vkravchenko +annagor20 +volkovanata77 +kirill.kirillov.2013 +sin1_19 +supervista +wwwksenechkawww +kotovichvalentina +cowboys09 +texasdoor +artov.95 +mknaxhxeh8yp3tf +sheela +nbvcxz +vargden +mkjhgf1996 +11-05-1992 +kovalienko63 +ghusieva1958 +julia_eduardovna +vip_trading +mihail_alekseevskiy406 +sidorow64 +rer-tuy +hugo854lataille1988 +andreyka.gorshkov.98 +aleksandr.ustinov.2012 +stavr75 +fggjkbyfhbq007 +maxim3999 +tolstyh.oxana +regina-rebina +mishanna1936 +gluxov70 +rickjames1 +bolshoj_zmej +sgydvntep +kotovas-70 +mir-180991 +aleksis1611 +oleg2ci +summer.fruit +x444am +vkoomare88 +sraka105 +zabolotnov1968 +61atnakaeva +beloved_a_devil +zablo +yulianaz85 +volfram.kozlov173902 +possum1 +veralipatnikova +rena.vano1990 +antonichmeli +zabolotneva_ira +sheba417yorck1986vxm7 +ineedajob +rus20dem +nika_kisa88 +madtubes +kotikova_n_m +zabelina12391 +ghrhfh +kovalskaya-t +emo_limonad +stassenka +baleri22 +opiumbaron +goman1985 +yy.tt.67 +dmitrii-skargo +yuliasha87 +mr.stas192 +dimok091 +antonls +spiridonmarkin1982 +bandidas747 +hismatdan +radik070775 +victori1967 +serg-niki20 +marina.shapovalo +cheetos1 +shar-vin +firakoki +masjnj67 +boromirus +sredina-va +vihlaeva2012 +cutegirl1 +mol.kos +mam_p +mihail-saratov +1qaw321 +ggolob +sevgeyq9v7kor +ksushapanda +vm.shlykov +malhotra493ozzy1991282151 +lobkova.1979 +delirium9111 +sava_72 +radion-dankov +valya.2057 +romka_ya93 +6610_2006 +arina-sharapova-80 +jannaarhipova +rusali_1979 +dnina666 +forgiven1 +kovach8 +d-x-m +mavriciy +burchenkovi +subprodukty +6651953 +isaulov.a +nust007 +stone_mitich +stecova85 +irinabrig +stas.gorodissky +lucky17 +rashaun966krager1993 +victoria.kl106 +vadyusha.isaev.83 +oleg272727 +lexir777 +sonya200102 +rusiphon4 +sor1989 +imabitch1 +miss-evgeniya-93 +ivankaterinchenko +mkolendzyan +panmen188 +gheniagabb +hermina617berno1990f6i +sergan11 +kudielia.anna +asa62 +valya-city +varich-masha +ser_kuzmin +qwert.0002 +olga.rumyanceva.1985 +kovalevagn2057 +vkors +victoria989 +101083 +asil.dovlatov.1982 +kotova.69 +svetlana-mironova-13 +venta021 +6552090 +max_masha +nastina33592 +sirazhdinov.shamil +alena_plotnikova_1995 +elenst14 +netti-88 +vkoval87 +vks1zz9v_7ceu69 +sveta-kisil +313233 +plankova2012 +varadero +u.hohlov +tarik-66 +raskevichtanja +stepanov_georgij +yluy1981 +duskolyan +innabuk +mpnaduysi +anna2976 +victoria14.09 +samitluiza1 +razdvatri3 +mirlan_o +nikolay_thebest +mobiline_b +teh-consul +zabludshaya +asabsmelik5g +marinochka.zhelannaya +rachelle289ariyoshi5251987 +derector-85 +narashchivaiunoghti +kotovam85 +volgograd.orlovka +aliev0583 +75fs +kir-ettk +slavik200887 +rinat-88 +serash2240 +belinova14 +computer3 +madcow +mmakssimka +galinkaru +zabirov2 +r6a50de3ujwtog4 +surooo777 +su4ik +shaquillesecx10 +ksyusha.kulagina.91 +loveone +sssuka80 +mudok +ravich92 +oleginator1 +zabolotniy.a +kelly2 +bolatov.almaz +bavixepym +stas_the_best.ru +macegorova.mariya +nastya-b86 +sopli22 +monp5haynes +prosto_chelkynchik +serpa7 +zabor.hut2 +dud_1995 +kirill999_97 +maitland571ka1994 +axssyha +vkontkate +grishin0308 +jasmin-ris +ribka227555 +volkova.elena.13 +111zabavina +vkryshkin +djdjfedor +i18bzbk3ay8 +mikhayildopy +asotjan +mozellbranou81e +simonova_lyudmila_73 +777kroxa +matrassesotk +stason729 +ok20.07 +nataliystre +nata271283 +kukatov86 +mklmkl22 +tyumchenko_ok +dovbeshkosushova.1972 +thehock +aukewpyrt +miuaybecv +olga.kazakova_85 +almaz_kiramov +marina.ushakovaznuv +ms.cc.gg +vktorov +golubinskij.87 +spn5 +fler_2351 +julija2010x +spuvd +volhsara56 +yansubina +6572757 +natalya.dmitrieva.1978 +yana.kolomoets +ira.klopot +apalkova.tatiana +bayrafis +yxelik +scsc78 +bulka-a-shah +renesmeecallen +ifuckyou1987 +vkovshut_annab1988fg +elensobko +silantyi1987 +zarygalina +olesya.kolchina +igaev90 +irina280374 +tor8585 +shevcov_alesha +elynca96 +botafogo +ghkdf14 +volodya-ivanov-63 +mutalim.gusenov +djhjyf010 +silakova.nadezhda.2012 +olechka061187 +victorfrunz +ktv910 +ahmed_orudzhov +guzel.t.f +sergey.lushnikoff +voroshilova.liliya +maxa-06 +oksanav-13 +goderdzikarxjxv +helga_557634 +moscowcallin +victor_evdokimov +sirik010875 +levenyatko2007 +victoria392eliezrie1992frp +moshkin1998 +vic685 +zaxarov-1976 +maxemys +slipchenko2004 +manovitskaya +zabelinaalena +igorek-filatov +constance626boilard1987 +aleks-270379 +rendakova_sveta +sodikov.talat +dok74rus +sss-nastya-sss +rauzawcsiv +victoria-berkat-energo +simonovskiy1970 +raduga388 +sorokina7778 +artemblya +erofka +maxchislov +soyma.ivan +siiifonjiknalivai +victoria_shkurco +ksyuta76 +smail2u +mayrik67 +minkova_i +sungatullinad +reginka2393 +sp.zakaz +mishaghbdtn +milay-ven2011 +rexrex +albina-1945 +julia.olga +kubnik +mmedinaa +275-22-74 +miss.marina.nikolaeva.2013 +spamar33 +astigor +victoriandr01 +zaborskiy80 +maximus1393 +sigreic +89217657066 +sergeevna_10.10.91 +sin-gulya +valya.ivko +victoria_002 +rita497 +valentina.victoria +djtatko +kuchelaeva +maksus_2003 +stella354926 +margo.emi +aminin94 +dan_cheb +serj-gr1966 +strelka.m +almira +raduga2508 +ratashn67 +ms.dolgikh +stan021092 +kudrina1962 +stas_kolos +andrei_rew +egor.vasilin +blyad_be_90 +sukasbliat +len_rin_kagamine_02 +marininys +annhen1 +vgizetdinov +fedorov717 +sergey_brrr24 +mnenrad6983616 +denis_nazarenko +pokopushkin +kirienko_svetlana +13grom +sidorval +rcalgif86 +style_style +semina-alina +zezina80 +andrey.shalanov +antoha50a +7777_74 +6917123 +666fafnir +valya.korobeynik +elvira198927 +sophieytorf +komnatnyy88 +milanova-kira +torgsotra +6215348 +oksanaorgadykova +varfeevich +ch_vitalij +raif.21 +evgenii-shenderovich +egorov_maxim +kudakova.83 +gvinpinka123 +feram0n +yanaluch +svoron1977 +irochka-ova +e-eremeeva1976 +dima199219921 +qwertykolakola +svetlana26rus +dimapet09 +mikalyalia +mariagoncharenko +galina-davidyuk +galinka_korneeva +foks8484 +manka198707 +miraa_84 +zarina_sabirova +piankova72 +maximova_elena77 +mrdmarina +varfolomeeva0990 +svetlana_07 +nadjaem +panda_3108 +srcuqq1_2j1h3rbf +sibiryak5 +valya-sidenko +olqa_motosova +victoria_91 +olyashev12 +yulia-dubrovina +ghrimachiova64 +ya_nochka86 +volgirevagv +volfram.kozlov123633 +dolgushina.76 +nata_titj25 +sergei_man9 +9602929770 +isatelt +thesmokin +nastyaanciferova +olga.lekarewa +alexdok76 +aydani_ +voliahim1891 +sfasdfsdfa +michel69.69 +shponka35 +lexaafanasiev84 +milankasanakoeva +mikhailova-w +limonyk +dima35360 +dmitrij.mironov2014 +vika.krivonos.1995 +andreyka.zhilin.1981 +arinayu0 +vkulak +mariannaz2 +sh_o_a_2013 +rinat.76 +andruhova.1982 +www.ivan-18 +angarova81 +olya.i.02 +victoria-dyatlova +drozdovaksusha +florida123 +kakosja +xalitova1988 +mar_prod +vova436 +kudrjashova62 +nargiz-a +s-firsova +sharmaine005foskett6071988 +silenakriv +mitia159 +svetik_kryuchkov +zarinochka_b +vkundeyai +antusenok_zhekonya +shishmarev76 +maksim.bychkov.1986 +lady.procenko71 +seregakalygin +slava_kulbidyuk +serova2008 +bazueva.1990 +golga.70 +lisicyna704 +mocanuv +kuchierova1994 +lllllll +volkova.67 +moss032 +stepa-2009 +kovshikova1981 +vihrova1974 +ravshan1017 +armyach-aleksandra +slastenka93 +natasha_19.65 +vkpxrnoda +mjuan5ogm +valya.gorodn +r.polinin +neslyxovska +sergio.b93 +victoria.20000 +reyrtutyd +89140041205 +dimlimonov +dr.karaul +maximova.60 +ira202909 +g_alisa1502 +mkalancea +pridprid +vikatc +zabloczkaya2012 +listopad.iuliia +simorodok62 +canon1 +zarinka1111 +kovrnatasha +tamriko0942 +naz-74 +levana928 +akkolesnikov +onamrdiu +yulia_yulia_13 +djon.net +yahnox75 +kuponatora +filatov_and +zabotin_sasha +prozukin-shift +mila90974 +ber +n_pletneva +oleg.jann +kovalha +cartoons +dymkovpavel +slava.grinco +volga11955 +molchanova_tlt +goluboglazka08 +marinadeduxinaa +lupashku89 +natatuma79 +vashenko.u.u +djmaikl86 +sm.karat +qwedcxzas +andrey-1983_08 +blackpearl +dianochka1924 +mishas001 +max6751 +bad_boys_adience +rozlori +manin-d +ololoeva-99 +chucha0810 +vakantie +6125060 +bytopmcd +zuewamarija +kotopes_o +spring938burston0001990 +serega-cash +manuliktatyana +zenit-talnah +olgha.pietrova.1979 +rerghr +dana-14 +kurmangazieva_gulmira +oriflame_1910 +melmel +vika-selfish +sungelika86 +volhina-73 +seregjvich +maria_q +osynadepu +mzyankin +101020 +misch.sosnin +playboy7 +sigora79 +aztyvl_ka44ze +yushinazena2009 +ben_a95 +safronov_3112 +mito.lo +ignatova_1978_09 +ralphc8xf +avkhachev78 +valya-lera1 +pyanzina_elena +sorokina-999-01 +sonia-91 +motrya.larina +sakoshka_masha +glafira110169 +rbtsozeva +vkoryano +hamulakvitaly +zarina_loves +max.kirilov.90 +shunia0505 +milena699803 +rkamkin.karoli1988mp +mahmudali1987 +bolno_18035 +rezvanov_a +shirshov.1968 +zabolotnova31337 +nat5g +olegshut +nati.beridze.92 +riwr2hky4w3tjgg +tender +mixaxa2003 +kotova_74 +posoxina.88 +avetisyanartur +morozovavalya28 +voloshink +kuliiev.79 +kuznecovviktorr +eanovozhilov +valya-valya-1982 +varida.alibaeva +raisa720290 +mandds1mg6bv8re +aksenov.dms +sergei1986inna +lena5stars +rita_nizhnik_r +prikoluxa +avikuzen +standard1 +oxana.o +crosby +mojurus5575566 +machukreeva +arividerchi_shatalov +zolotarev08 +lisenkogv +rexocinod +ghalina_1971 +rzaev_ilgar +ivanov2305 +6430130 +tema.barabin +never_desponding +litosik +dimebag +varfolomey_72 +azik_06 +pletnevakaterina +simonova5570 +karusev_spb +felix.1957 +dove797 +gofman_osk +rahmudinov92 +tasya.5 +volokitina.olga +kati-leva +fishbaracuda +rogovsasha123 +777dashuta157 +ms.polza +hallucinationse +magic-n12 +azefirov.inno1987.r +davidstrokov +lexa-let4ik +gjcaixxx +victoriy70 +bakuman.manga.drawing +mirellabroersma1987570 +mordva1783 +mityukova.anya +stroikarat +welder1 +zarinaismailova +mylfard +qwertyuiopasdfghjkl151515 +k.u.r.t +sergey-personal +starpozitiv +victor_sakhalin1990-20 +dimulya.vasilenko +alfakran +fs.swl +safonova.1967 +evial_marina +mede_voda +kuchinovao +sporu-netu +aylyan2001 +anna.savickaya.1986 +vartk +ivanovamotya +blackangel09021 +slonenok1009 +vihotsieva94 +simonoff-dj +regawf7ss1dm7rn +krick.bk +golovizina_elena +aceeva.irina +vicusa.tatyana +gidrometeoburo +stalker_lemurrr +volik-yulia +mks.01 +damira.shagabutdinova +tishenkoff +malina_bratsk +0210-605 +jeka-ka85 +aqwleeb_6e0pk59 +mks33 +iurkeawov +ksyukha1990 +mak301988 +football26 +andohz +kejan82 +simakov_evg +sieuwaprd +tema_ku +sogevigdil1981 +jeter02 +valya.lantux.83 +jekan860803 +ylik1911 +stsnatasha2008 +zaborov_t +volkovaolguna +dgonni86 +maxa-78 +universidad +matveev792010 +gadjieva.gulmira +famar219948 +valya.shapoval +vs-nd +fyujk.fyukf.87 +connor123 +sbally_64 +6041074 +slava-45 +zevs_ev +annywka_86 +kinyabuzova.eleonora +e_dovich +popovkin83 +fomalex10 +alija-gatina0 +sgtrsgh +sunnny56 +laobidenko +strezhetova +sovin.sv +zabihullin99 +stason16.92 +wwwamador91 +aza_93-93 +sergej_de_sad +olga.ponomarenko.2012 +sattorov-q +armada-n +marimax.85 +leto-nataly +thecrazymaxim +26.09.67 +sov1_86 +maria-demidchik +eloisa +korostelev_3333 +fjodorova-natashenka +avto55.rus +ari-kyarova +valya.klimenko.87 +sergey.melnik-1996 +londra +serikpaevna_92 +vik22535477 +frant_nat +voljanka1976 +koala_1995 +nemochkao1975 +marina_stryazhkova +fotinia-66 +oleg-andry +rogovivan72 +stepanov.ag +evgenkac +barkov_65 +serg.aleg +fatimah +hrustem65 +sergdock +ry1dtv +gaar_vitalik73 +balentinra +monaliza2786 +shilard +strange.lena +sataieva.elinka +babich.e +romanova.natalya.96 +redko5 +abrejkina +gatina_albina +trofimishe +volodina.elena66 +lizasp07 +6450716 +arturamirov89 +black10 +t_v_belyakova +efimkin_igor +ilya_al_80 +aram198309 +sergio-emperior +samsuchonok +arsik-di-noxcho95 +fardubay +zarina_zhasan +fedotovsa76 +laser +palmer1 +mihailpezhemskii +sosexy1 +antsiferova1973 +monk3y +serg-ks.87 +kamazist.tsobenko +mogychajagopa +dimitr692010 +gholovach75 +zachodnio +skorpions23.5 +shorty23 +serega_torov +telegina_65 +parfenovav +llll.70 +ramis_bairamov +simmons1 +raisa_smelkova +compaq2 +ss_1983 +kafedra_oisp +ametistfatal +dua82 +shea019bernabei1992 +donskihv +varika0 +marielwfledlow +dimastic +volkslt35 +leeann1 +bikers +nastenabendel +amigo +kudryavcevavalya +ilovekiss +nikkie +ryabec.m +myhouse +lexa290195 +lipovv70 +shakmakovataisiya1992 +79621601378.kirill +ryan13 +143love +10101989 +halohalo007 +231288 +an4oys12120 +vedro.ru +marcia1 +1space +monica2 +january23 +sexy_julija +bigdaddy69 +pepper13 +codered1 +dawid +loser7 +chocolate6 +criminal1 +monkey55 +1guitar +bubblegum2 +231089 +rfnz +brianna123 +alcohol +ei33a +chrome +gargoyle +560100 +bwfq23jp7f +douche1 +alchemy +sinead +1taylor +bonnie123 +10231023 +1mexico +joshua07 +candys +badboy69 +whyme +asshole4 +denise12 +selenagomez +nfhfrfy +thedoors1 +joachim +danielle3 +bigger +gatto +1357997531 +mshelp12 +hussein +coolcool1 +bailey13 +02020202 +festus +dindin +doom +bondage +newlife08 +hannibal1 +1junior +7878 +motherof4 +girlpower1 +buster3 +edcrfv +matrix12 +rock101 +mylove4u +providence +keekee +080888 +120388 +1206 +elohim +560032 +moses123 +hummingbird +pierrot +kilian +maciek1 +travis123 +200100 +hybrid +2gelaf3h4a +babloo +zaq1234 +skate13 +554433 +loser. +fulham +marek1 +corndog1 +123456qqq +waffle1 +1black +lauren13 +alvarado +december8 +sexyback +ashlyn1 +ronaldinho10 +5482 +shocker +sleeping +++ +august08 +minou +shithappens +indy500 +michelle23 +pwlamea10 +adeniyi +101091 +elias1 +mark11 +soleil1 +michael24 +f123456789 +savemoney +ivonne +stas +aa12345 +kikay +3monkeys + +avery +raerae +1hotdog +chance12 +101187 +biodun +sabrina2 +peaceful1 +barbara +miamiheat +yellow21 +lobito +micky1 +petrus +angela01 +friends. +julianne +nokia6630 +f22raptor +dude1234 +nipples1 +cntgfy +nickname +1231231231 +tsubasa +firetruck +dre +103103 +outkast1 +zimmerman +damiano +shanshan +sloneczko +oneone +espresso +manda1 +firstlove +doughboy1 +imagination +reddwarf +5tgb6yhn +kristinka +jeff12 +sorry1 +maria10 +ararat +fourteen14 +helloyou +splash1 +3stooges +gorillaz1 +jesus21 +conrad1 +kamal +tiny123 +rock11 +tillie +freeride +mikejones +fuck_you +freeme +friendly1 +nbuhtyjr +chelsie +my2babies +jaiganesh +sunkist +rockband1 +laila +beemer +emergency +youtube123 +223366 +060686 +010188 +12345678p +1021 +luckie +password90 +burberry +dia +audi100 +reece1 +snookie +johnny +830928urodziny +llllllllll +tina12 +miley +198510 +alaina +daniel99 +praisegod +ukraina +leila +pitufo +12121987 +george +batman! +2bitches +rey123 +monterrey1 +saun +anutka +sorry +1dream +mikado +jenna123 +putamadre +stocks +120987 +amerika1 +guzman +nokianokia +lostlove +seven1 +buddies +papa12 +maxx +organic +yoda +petewentz1 +708090 +pass007 +hardstyle +matrix2 +rubber1 +rockwell +password91 +getalife +кристина +halo23 +bailey10 +xboxlive1 +jjj123 +dragon15 +newman12 +thomas7 +ramana +cayenne +wertwert +blahblahblah +maggie22 +margera1 +preacher1 +thomas23 +fabricio +chelsea3 +yankees12 +toujours +margosha +12541254 +jessie +troll +mentor +12351235 +cake123 +martin11 +aa112233 +csyekz +loveme5 +omar12 +qwerasdf1 +718293 +gbyudby +ficken123 +princess88 +scarecrow +r0ckstar +12121990 +dianka +brenda12 +january21 +perez1 +mercy1 +arcoiris +massimiliano +120686 +cho +030609 +markmark +jackson7 +naruto01 +steeler1 +imogen +bigblue1 +5xq57cgseb +tuermchen +number21 +hannah07 +suarez +000333 +rose13 +mamo4ka +souljaboy +niknik +king01 +196969 +amanda15 +123321s +invincible +august3 +lyonnais +richelle +43211234 +dilara +gamer123 +400097 +brigada +google3 +avanti +ahovwpib +guerrero1 +hel +savita +milly +slayer123 +1106 +50cents +blackmetal +qqaazz +i81u812 +t1gger +midnite1 +hassan123 +randolph +kakadu +lppnldtzx +10101988 +trapdoor43 +charlie9 +chloe12 +playa69 +020508 +rerecz +iminlove1 +apple4 +michelin +405060 +qwerty09 +nisha1 +coorslight +mydick1 +vasco +gaygay +szymon +0o0o0o +redalert2 +sangoku +chivas01 +purple77 +custom1 +bbb +400001 +daniel6 +gamecocks1 +stgiles +brittany11 +derek123 +123456prof_root3.sql.txt:, +welcome01 +ig4abox4 +lulu12 +energie +monkey00 +hattrick +bicicleta +london10 +hellno +bearcats +tyrese +49ers1 +hicham +12123434 +happy10 +aidan +susana1 +harley03 +cookie14 +alexis7 +truth +richard +pinkrose +rexona +sweet3 +555111 +dudeman1 +roflcopter +bball4life +gretta +linden +micah +murat +silence1 +jimmie1 +lolly1 +bonethugs +babygirl25 +patrick5 +aka1908 +anthony69 +computer1 +123456 +fingers1 +infamous +pippin1 +antalya +baldwin +senorita +949494 +ron +edwardcull +101082 +apple1234 +sewing +olivia01 +44magnum +fer123 +carina1 +pornstar69 +pepper +blowfish +accent +foreveryou +cowboy12 +visual +jonasbrothers +aaaaaaaaaaaa +jordans23 +120485 +altima +rosewood +cameroon +oakley1 +sarge1 +lambchop +morten +sydney01 +tiffany +dfghjk +breeze1 +cherry11 +lover15 +pppppppppp +flirt +lockdown +francais +angel04 +1superstar +101287 +852147 +coventry1 +111983 +green16 +alfa +ofelia +hallo123 +amanda18 +woaini521 +asstastic +amber13 +brock1 +computer +niko +nicolo +lala22 +zeeshan +magadan +greentea1 +qwerty14 +sunshine6 +dongdong +jomama +zigzag1 +010109 +okidoki +leomessi +fuck23 +titleist1 +123dog +contacts +101289 +hungry1 +in2806rbk +stefani +veracruz +conway +jitendra +lexington +gandon +octobre +seatibiza +alex05 +today123 +balloon1 +marcelo1 +tmoney +wingnut +atdhfkm +kbctyjr +hannah +sakuragi +sonne +sweet! +fight1 +jeremias +mikkel +198811 +101290 +locoloco +ilia16739 +htubyf +punjabi +filipino +koukou +molly11 +justin +mourad +percy1 +highbury +family05 +beautiful7 +annann +cheer13 +defense +disney123 +peace&love +thetruth +babygirl. +single12 +books1 +olo65b6666 +qsdfgh +jess1ca +nascar08 +jigga1 +rapunzel +alexei +hyacinth +1elizabeth +14521452 +mohawk +melissa3 +skater7 +110388 +hunter6 +chelseafc1 +richard1 +135 +flowers12 +wellcome +kristopher +buzz +j3ssica +nakamura +redneck2 +maddy123 +nitro +reggie25 +hardrock1 +12345678t +owen +blink1 +morgan13 +brianne +bear1234 +booger2 +112244 +offspring1 +600042 +mike15 +alex25 +charlie22 +3030 +quinton1 +mike08 +michi +natale +12345trewq +asdfghjkl;' +taylor07 +newbie +optimist +bassoon +jayden123 +dawid1 +flower10 +vedder +fuckm3 +roflmao +purplehaze +150150 +gilligan +dionne +marlin1 +3429795 +macbook +baker123 +josiane +yorkshire +110589 +baby77 +11211121 +dragon00 +ashley24 +fallon +tyrell1 +noah123 +ramadan +1buddy +draco +webster7 +tretre +volkov +romanov +fuckyoubitch +25tolife +sugarplum +147852963 +baron +chesterfield +230388 +andrea13 +spider2 +baseball27 +sexyone1 +10111213 +perro1 +sidewinder +okinawa +chevy123 +pervert +david4 +forester +whatever. +dickie +force1 +fresita +torres09 +arlene1 +anthony09 +mememe123 +marie01 +chevy69 +delta123 +tarantino +pheonix1 +1password1 +brandon08 +connected +dunhill +katelynn1 +margie1 +diamond4 +cheetos +2828 +disco +zaxscdvf +clock +classof10 +cloudy +ginger13 +ziomek +bolero +millie123 +wilson123 +jesus4 +gewinner +cassie2 +dallas13 +1poohbear +270787 +limerick +kodiak1 +hinata1 +zxcvbn +cghfqn +bluebear +angelina +usnavy +reefer1 +9379992a +weare1 +mallard1 +051988 +korn666 +del +jesus09 +junior7 +андрей +noemi +rebeka +happyme +mustang99 +camron +290989 +alphonse +riders +godfrey +10121012 +football51 +denise2 +pass12345 +123456prof_root2.sql.txt:, +soccer04 +industrial +puneet +420420420 +justin8 +1207 +angel89 +trance1 +chicago2 +rockstar13 +robson +mydaddy +dayton1 +w1w2w3 +blaise +120888 +blue07 +jayjay2 +manchester +sidekick2 +lighter +pitbull2 +gatsby +nurses +ilovemommy +jeremy2 +cali123 +misery +amanda23 +gbgrf +benjamin2 +201201 +cherish1 +azer +ashishbiyani +135797531 +060708 +sometimes +fifa09 +coffee123 +120585 +kalinka +sarah13 +raiders123 +drums +cadence +bigfish1 +584131421 +makarov +jacob11 +100688 +th0mas +nene12 +carlo1 +a11111111 +jayden09 +88889999 +rene +virgilio +lmao123 +солнышко +kush420 +123400 +titoune +dogface +a123a123 +mother +eroticy +1bigboy +mika +raja +tennis2 +cneltyn +111980 +dell1234 +iluvyou2 +leighton +alexander9 +myspace33 +kobina +012345678910 +elektra +http://www +gol +jj123456 +grammy1 +110789 +130588 +artemis1 +beatriz1 +amitie +cutie7 +alexis5 +calcutta +geibcnbr +jeanne1 +genius +doghouse1 +nick22 +onelove2 +megan2 +147123 +biggirl +mnmnmn +1031 +peanut22 +merlino +manyak +hilton1 +blue52 +chanchan +auggie +macgyver +chemist +suck +sporty1 +520123 +jazzy12 +gracie2 +s9qxa9yn9cc= +ahmad123 +120988 +lovealways +110487 +turismo +summers +1120 +suckit2 +stalker +cookie101 +pittbull +terror1 +nicole19 +football30 +ross +kirsty1 +fling1 +sesshomaru +russland +bubbles4 +imsexy +joshua4 +thatsme +tabasco +ou8123 +downtown1 +selina1 +plies1 +savior1 +1cheese +plymouth1 +manga +erica123 +virginia +universe1 +explore +detective +sa123456 +bigboobs1 +emploi +143445254 +cocochanel +08082008 +4242 +crazyboy +joshua06 +cowboys21 +destinee1 +forsaken1 +gaylord1 +tiziano +lekker +ytngfhjkz +junior21 +jeannie1 +322223 +brabus +bitch24 +o0o0o0 +priest +bettyboop2 +jose14 +gfgjxrf +david15 +afghan +asdfghjkl2 +l1234567 +september6 +andrew69 +zxc12345 +deathmetal +water5 +thelma1 +flip +abcd4321 +asdf4321 +paint1 +sweetbaby +vfylfhby +20080808 +furkan +camino +star55 +janeth +owen10 +lovely11 +volkodav +orange4 +gremlin1 +lions +10001000 +258025 +@yahoo.com +dima1995 +skater14 +forever +doris1 +bogota +9268356683 +pinkgirl +greenapple +121291 +dragon24 +nana11 +110989 +trent +forever13 +ladybugs +110065 +aslan +hollister5 +angela +1227 +zxcdsa +cyy813zrvr +210588 +1david +vanguard +emma1234 +nadeem +evil +metoyou +phenix +aliyah1 +grandma3 +mexico15 +ilovetyler +ottawa +paradiso +bella10 +rockstar7 +sexy12345 +capullo +yellowcard +renaud +101010a +12345666 +pepsimax +shamil +dance101 +ababab +tooshort +samantha1 +shelby01 +520520520 +cheese13 +01478963 +alex77 +shorty10 +9874563210 +rebecca123 +224422 +nachos +++ +1478520 +shamus +420smoke +tahoe1 +cinder1 +7890 +11223 +shocker1 +rockstar10 +mustanggt +furniture +everquest +221288 +harryp +chetan +197300 +mailbox +solo +guyana1 +hottie6 +chrisb +jessie01 +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +3344521 +misskitty1 +lalala12 +000ooo +abbie +214214 +google11 +258258258 +macbeth +orgasm +ghbdtn1 +myboys3 +kaden1 +bluetooth +remote1 +stranger1 +1qa2ws3ed4rf +topgear +bartender1 +john3 +louise12 +heartbreaker +trucking +141001 +112233aa +snapon +daddy7 +emmitt +jaqueline +12251225 +junior +skyblue1 +fabolous1 +keesha +fxzz75 +healthy1 +jajajaja +molly01 +elisa1 +qa27111985qa +cooker +vthctltc +1133557799 +passwerd +whyme1 +qwerty56 +vfhrbp +1jackass +deshawn +beograd +datnigga1 +rostov +transformer +fruity1 +salina +chelsea +olivia +blunt1 +password101 +amor13 +grunge +chocolate. +rugrats1 +a123456a +blade2 +romania1 +1joseph +pavlov +amanecer +tubby1 +lambda +credit +400063 +shadow88 +fortune1 +pawel1 +toomuch +1madison +vjhrjdrf +willy123 +bronze +niggaz1 +fusion1 +ckfdbr +buggy1 +uruguay +1tiger +schmidt +guitars +wtpmjgda +poetry1 +sunshine09 +sweet6 +131211 +hockey33 +aremania +pinnacle +glory +пїѕпїѕпїѕпїѕпїѕпїѕ@mail.ru +quinton +lexi +bigdog2 +gmail.com +cheer07 +cerveza +allblacks +soccer +dancer87 +kotek +sweet7 +марина +guitar3 +august6 +screwyou +100888 +120486 +198622 +fordtruck +green77 +bb123456 +sujata +nygiants +ibrahim1 +funfun1 +jason01 +boobs2 +betsy1 +beautiful3 +231188 +iceland +trees +cool101 +maymay1 +bimsta +sassygirl1 +matthew23 +hannah14 +lovers! +alex101 +123412341234 +5203344 +jimboy +babushka +jacob3 +tommyboy1 +subwoofer +blu +maestro1 +iloveyou77 +560075 +jesuslove +10101986 +rookie1 +sonnyboy +michelle8 +princ3ss +dolly123 +cherry3 +leon123 +greenday7 +hannah6 +samantha7 +dorian1 +135789 +hihihihi +cookies3 +work123 +naruto99 +shinobi1 +retarded1 +suckit! +asgard +shithead2 +florentina +memyself +maddie01 +december9 +120487 +123321qq +jenny2 +jesusislor +james17 +idunno1 +rukawa +evergreen1 +recipes +eatme2 +player3 +emily13 +blaze123 +mustang1 +jas123 +1raiders +otto +davidson1 +bluegrass +shanthi +salmon1 +warcraft2 +iloveben +gurudev +carolina12 +keith123 +mollymoo +crayola1 +patrick1 +olives +bartolo +polish +peanut5 +aguilas1 +khalil1 +uptown1 +chicken. +movie +wilfred +222888 +12141214 +dipshit1 +143001 +shauna1 +tri +duracell +5683love +nostromo +1yellow +molotov +officer +1dancer +dorina +cla +green33 +000011 +howdy1 +492001 +prettygurl +astro +jason5 +00998877 +icecube1 +ilovepink1 +carlos22 +120989 +vfvf123 +carlos23 +matrix +puffin +vfnbkmlf +bubble2 +gomez1 +charizard +wookie1 +naked +mikey12 +superman6 +destiny4 +raissa +franny +miguelangel +weiner +costa90 +carlos +school11 +dom123 +samantha13 +++++++@mail.ru +lerochka +apple23 +560093 +sosiska +rfnzrfnz +1008 +blowjob69 +carlos3 +maggie7 +hard +skylark +bball32 +200588 +dandan1 +hemant +midway +543216 +naruto15 +oxford1 +8080 +belfast +hottie21 +sofiya +filosofia +nothing2 +bunnys +smart123 +flossy +sowhat1 +mysterio1 +happylife +ginger22 +family8 +september5 +guitar11 +squeaky +shitfuck +frisky1 +mariamaria +saranya +111982 +pussy23 +password26 +saturday1 +svetka +170986 +lfhbyf +123! +denisse +buddy10 +superman. +mangas +different +fatiha +shannon12 +pratibha +freedom11 +chispa +james18 +orange23 +callofduty4 +pf +3131 +godschild1 +amber11 +football72 +ghbdtnghbdtn +94793763 +friends6 +olabode +celestial +emo4life +tripod +1redneck +pinhead +fs7600 +pendragon +whatever11 +martyna +whitey1 +batman +alex2008 +mike24 +jacque +harriet1 +hobbit1 +punker1 +film +daniel09 +123hello +sslazio +400092 +fantastic1 +jason21 +pipiska +loveme. +morozov +retire +shorty21 +dipstick +murugan +dasdas +121989 +charmander +paragon +shay123 +1234576 +n111011 +christopher +tacos1 +cupcake3 +peaches3 +crazy69 +goofball +alias +timothy2 +boulder +alex777 +bulls1 +sysadmin +sparkie +jaden +amanda14 +yankees27 +drumline +24081986 +morgan10 +sneaky +sakura123 +austin5 +pepperoni +decembre +strider1 +ilikepie2 +laserjet +conchita +travis2 +courtney2 +jellyfish1 +philou +leviathan +cameron7 +200300 +chance123 +marlen +333222111 +tweety7 +lin +friends13 +monday12 +methodman +fleur +timeless +lbfyjxrf +carmen12 +anth0ny +231231 +damion1 +adrian2 +sparky2 +nigga3 +loreto +eastern1 +dammit1 +chance2 +fatboy12 +ryan22 +120887 +130988 +montenegro +taetae +emily3 +tigger14 +122 +george3 +thor +memory1 +oriana +2580456 +daisuke +worldcup +edgar123 +fucker. +sunitha +sonia123 +deguzman +natasha123 +topbutton +god1st +poop25 +meandyou2 +carletto +chip +mcfly1 +pepper22 +tonight +daniel69 +bimbo +mantra +deleted +palembang +whosyourdaddy +rock1234 +champs1 +hotgirls1 +claymore +2hearts +stephanie +q18lg49iq8bhu +varsity +palestine +makenzie1 +mooses +graziella +z1z1z1 +foot +bitch8 +aventura1 +221286 +triumph1 +12241224 +blackmagic +balloons +achtung +wonderwall +buttface +zxzxzxzx +nathan3 +carioca +temple1 +nelly123 +ddddd1 +133133 +loki +tiger4 +class2011 +411007 +yinyang +lindas +gangster2 +peterbilt1 +garuda +babyboi1 +chris20 +rachel11 +merlin123 +byebye1 +abuela +metro +197000 +buster7 +oluwasegun +250587 +321cba +kenworth1 +loca123 +duke11 +rico +kahlua +alla +harper1 +sexy88 +killswitch +black69 +acidburn +scareface1 +payday +111187 +12311231 +katie3 +newyork7 +weedman420 +buddah1 +yetunde +samara1 +only1god +alex20 +vlad123 +itsasecret +ketchup1 +120986 +vancouver1 +br +nicolas +tianna +13579246 +four +mountaindew +angel007 +machoman +301087 +steelers86 +berserker +babygirl +warpten +yourmom69 +jajaja1 +1911 +karine73 +patricia +greengrass +120889 +carotte +madison11 +clarice +minerva1 +guadeloupe +77778888 +toto123 +sydney12 +peter12 +james16 +jocker +marialuisa +jos +carter2 +baby89 +lisa1234 +68mustang +a987654 +xtreme1 +cocacola12 +robertson +christiane +flower +123myspace +cancun1 +strike1 +1015 +helsinki +p00hbear +12qwasyx +ginger3 +dazzle +23wesdxc +peace11 +pianos +091209 +hollaback1 +countrygir +cs_000 +fatoumata +tumadre +javier123 +baraban +ban +tequieromucho +edward01 +arshavin +daniel20 +hibiscus +profession +abc.123 +miaomiao +sexy55 +angel33 +bidule +cherrypie +aztecs +wetpussy1 +antonio +jesus14 +joshua14 +bella3 +bullrider1 +bmw +lunchbox +frog12 +happys +220788 +loveu3 +collie +logan12 +suzana +shana1 +amadeus1 +heaven123 +neoneo +121186 +1233211234567 +cowboys8 +john14 +january17 +74123 +skater101 +patches2 +disciple +shadow4 +cross +sexygurl +matthew +kevin01 +nonsense +100689 +klimov +sar +loveyou4 +flower22 +smokes +brooklynn1 +louise +generic +120490 +bruins1 +chicks1 +nina12 +verano +fuckubitch +madhavi +mu0lfpv2 +110686 +tatertot1 +delfina +18121812 +cancel1 +ruffles +kingdomhearts +asdf456 +198383 +jason23 +110889 +carling +heybaby1 +soprano1 +love123456789 +lucia1 +johnson +cactus1 +cheese. +fagget1 +1sister +sorrow +success123 +polo12 +rainbow5 +triniti +rainbow69 +dianne1 +luigi1 +pollo1 +786000 +rugrat +penis! +rocks1 +playboy3 +freshman +yo +mexico23 +iloveu11 +loaded +redeye +1234567v +bball4 +dortmund09 +commodore +karamel +brian2 +softball24 +amore1 +nigger5 +emolove +baseball44 +p0o9i8u7y6 +track +datsun +ranger01 +iamgreat +joshua18 +127127 +kolkol +oberon +shana +090989 +buster5 +caution +evaeva +december6 +bitch420 +chevy454 +manny123 +adams +dumbledore +marmar1 +return +stockton +vidanova +ford123 +diamond6 +iris +bebeto +231090 +changes1 +password78 +speak2me +mami123 +110389 +kirakira +110888 +lottie1 +monster! +barrett1 +crespo +theworld +killer007 +augustin +gilmore1 +mus +aini1314 +rjcvjc +amit +sweetu +turnip +darknight +ilovecody1 +spillo +k1ller +julian12 +5252 +1216 +maverick +alicia123 +hogwarts1 +jose11 +boom123 +tamerlan +happy69 +cadence1 +sixpack +lovey1 +john69 +198911 +001973 +wingman +120187 +chessie +iluvu! +beverley +hotmail2 +110088 +capcom +marcela1 +mia +hehe123 +patagonia +paris75 +lovable1 +223223 +david07 +sober1 +sofia123 +save +drew123 +custard +sgdhhfc4x2 +freddy123 +maritza1 +02021987 +kzkzkz +luckyone +knuckles1 +1qqqqq +gnusmas +mimoza +brooklynn +ivana +november +8letters +grimreaper +discus +technics1 +trustn01 +daniella1 +jomblo +crazy7 +geisha +intelinside +cardenas +annalena +nicolas123 +pig123 +bbbbbbbbbb +scooter3 +gracie12 +lazaro +lanena1 +jjj +henry12 +storm123 +gangsta7 +blue56 +upyachka +matthew9 +starlite +smile3 +marie08 +help123 +220687 +eliza1 +nastja +121185 +address +partygirl1 +dragon101 +william13 +1qayxsw2 +costarica1 +nihao123 +bluejays +babygrl1 +hilltop1 +vampire666 +wankers1 +shalimar +iseedeadpeople +play123 +command1 +smartass +harley3 +carlos21 +bilancia +polipo +georgiana +speakers +rescue1 +cheese22 +135531 +123lol123 +candyfloss +freefall +clifton1 +mouton +buster +moumou +198522 +chris +123445 +fucker5 +hannah23 +whatwhat1 +blondie2 +matt13 +biatch1 +12121986 +bisexual +taylor23 +daddyo +savannah2 +teamo2 +mexico9 +ganapati +120790 +rrrrrrr +zebras +cosmo123 +daniel06 +sandrita +198012 +12356789 +shinchan +peppers1 +indigo1 +khankhan +asd123123 +321987 +edward +california1 +solitaire +orchidea +january10 +jaihind +ginger7 +316316 +katusha +family09 +811224bai +pizzas1 +nemo123 +amanda16 +typetogether +hedwig +sugarbaby1 +bb1234 +pajarito +bootsy +bitanem +my123456 +dwight1 +worldwar2 +121988 +12many +punk12 +1111aa +ich +cooper +22061941 +carnage1 +suburban +gfgfgf +gabriel7 +nicole25 +210688 +vijay123 +vladimir1 +kareem1 +arrow +1217 +ben10 +profesor +january28 +123sexy +popcorn3 +slipknot13 +0202 +friends +element5 +flower13 +1rockstar +openopen +shuttle +my4boys +jimbeam +420000 +vodafone1 +phones +bailey7 +tombstone +gasgas +sambo1 +jackie01 +woainima +loco12 +analog +741147 +lamejor +feelgood +jayla1 +love4all +vaishnavi +banks +beautiful! +masyanya +jordan17 +provence +jameson1 +luckey +110786 +softball16 +abraxas +killah +hawk +camcam +doggy12 +isabelle +yourmama +vinay123 +gostosa +angela2 +garfield +1drummer +snappy +qwerty90 +daddy23 +6789 +filipa +joshua99 +watford +sangita +12121988 +sup3rman +mydick +argent +loveall +fhvfutljy +joaquin1 +fresno +rocko1 +shippuden +rosina +poop99 +michelle69 +flower! +110990 +tx9z6ht5eo +luckys +u6kz2lppto +raghav +pompiers +123123qq +benjamin12 +minimini +miguel13 +pentium1 +vincent +pandas1 +pugsley1 +secreta +diving +summer23 +happy101 +balong +lamine +556655 +babes1 +flaquita +bamako +emily11 +razor +1369 +happybunny +koolio1 +fuckthat +forgive +building +bel +pooky1 +asdasdasdasd +tomasz +kantutan +100486 +cherry5 +prospect +a2a2a2a2 +shizzle +muffy1 +hunny1 +rockydog +hunter05 +fafafa +liefde +123qwe456rty +cedrick +jordan18 +220288 +denise123 +leanna +defender1 +trinity7 +rollin +jun +weiner1 +roseline +helloo1 +pussylover +notorious1 +mummypapa +pa1ub65udd +pepper3 +neenee +ab12cd34 +thizz1 +millos13 +ch33s3 +cutie15 +junior09 +papercut +december4 +07071987 +sitaram +lanena +wallpaper +171 +eduarda +blue08 +jojo13 +010185 +221088 +goxyboib +beaumont +whore123 +casey12 +pepsicola1 +lauryn +crayola +z010203 +birdhouse1 +mousey +1234567qwertyu +cowboyup1 +qqqqqqq1 +godswill +dragon! +fighting +sas +vk_vk_777 +sabrina +qwerty15 +loraine +superb +music01 +moustique +deskjet1 +7788521 +melissa13 +caligula +sco +canes1 +survivor1 +bombers1 +moment +matthew! +chelsea13 +goodnight +120188 +samuel +batman +lizzy123 +110590 +sadie2 +xzsawq21 +intheend +miss +dtkjcbgtl +chippy1 +deandre +110045 +nirmal +snikers +libera +bowl300 +tool +biscuits +jenn1fer +fuckhead +01011978 +pookey +legoland +idontknow2 +kashif +pepper7 +sting +killer! +021084 +alonso1 +jane123 +kendrick1 +cheska +1234go +innocent1 +winter10 +slippers +jasmine8 +10101985 +xsw23edc +doobie1 +scooby-doo +goirish +sexy100 +elvisp +6poppin +topsecret1 +johnny7 +superman14 +201088 +bong420 +lover6 +198210 +zero12 +namaste1 +assfuck +yankee2 +firdaus +audir8 +123456789987 +redwall +pineda +chameleon +111111s +skeptron +crissy +juanmanuel +football31 +makita +dexter12 +blondinka +hopper1 +january25 +smiths +stonewall +maggio +1stlove +junkie +saturno +kelsey12 +ruby12 +blinky +roselyn +blunts1 +january2 +dipset2 +thc2000 +mysterious +champ123 +creator +bhbcrf +minina +babygurl01 +12121989 +maggie! +london99 +himmel +191 +hope12 +lori +ilovejason +анастасия +bailey3 +vorona +knowledge1 +pekpek +bigass1 +brandy2 +element7 +miller12 +nissan240 +ibiza +120685 +1hannah +anaana +1128 +deuce2 +fabiola1 +dance! +christa1 +lucydog +hahaha3 +140289 +pumkin +hambone1 +marley420 +sucess +bambola +dagmar +jesse2 +1478 +cheer11 +luvbug +seminole1 +110489 +cubalibre +cooper01 +tony14 +wade03 +masterp +netball +catcher +ashley9 +dallas21 +nico123 +peluche1 +angelz +morocco +emo +sergio123 +eliza +eumeamo +crusher +jingles1 +thrasher +chikita +egor +easter1 +230689 +kassie1 +567765 +postman +kukuku +abc123456 +krypton +pussy13 +francesco1 +bowman +music4 +bhabes +guadalajara +juan23 +jologs +jared123 +snoopy7 +0p9o8i +evgenia +cole123 +786 +adrenaline +jiggaman +password12345678 +justin06 +ghj +sandy2 +100585 +oooooooooo +code +rkfdbfnehf +gaming +lolol1 +gary123 +fbu89bxx5f +babygurl15 +fatfat +starlet +frenchy +mustang +ver +fucku3 +flvbybcnhfnjh +220688 +123456love +maggiemae +000000q +silvester +foreverlove +jeanie +subzero1 +facebook12 +green9 +hounddog +lion123 +jacob13 +yokohama +karuna +printing +11223344a +parol +bitchs +smileyface +carlito1 +301090 +whatever5 +piccolina +05051985 +bigbuck1 +olgaolga +usmc1775 +5454 +chips +ioioio +ilovejake1 +150585 +senveben +vanity +godofwar1 +fuckyou99 +acdc +eastenders +iloveyou25 +allegra +topolina +vertical +under1 +kayla13 +tastatura +stokrotka +pokemon22 +sweet14 +exit_window +dotnet +jordan03 +cocopuff +12121 +gameover1 +pizzaman +3151020 +braden1 +bowwow12 +gogo123 +biggirl1 +olatunde +sashasasha +makmak +sunshine19 +mom&dad +198912 +skynet +silly123 +copper12 +vbhevbh +chris25 +angel12345 +ready +rainer +pooh13 +poopoo12 +watever1 +flyfish +#1hottie +lucky101 +tori +luvme2 +godofwar2 +220488 +prabha +blowme2 +construction +poornima +eudlekb645 +sunsun +a0123456 +frimousse +fars419 +001986 +nature1 +daniel9 +jordan02 +acosta +rockstar11 +chocolate123 +iloveyoubaby +1ladybug +198722 +nyt +my3babies +il0veu +andrew08 +sommar +wings +orchard +120385 +harley99 +glamorous +girlygirl +anupama +nurlan +231189 +jules1 +1233214 +121003 +jennings +harley7 +f14tomcat +spinner1 +eagles36 +shekinah +sexy26 +1christian +sylwia +qazqaz123 +buckshot1 +mama12345 +alcapone +noob +nirvana123 +duck123 +meuamor +okay +hannah06 +hooter +08081988 +eduardo123 +andromeda1 +january14 +war123 +iloveyou99 +woman +castello +minmin +kimberley1 +prabhu +grandson +sadie12 +mooney +mamasita1 +bigbutt1 +nicole20 +supercool +boston123 +2244 +w1965a +albert123 +junaid +4brothers +arjay +kwiatek +master23 +apple13 +1212312121 +catnip +jennifer11 +4twenty +mexico86 +jessa +jetaime1 +zuzana +psalm91 +classy1 +9thward +crayon +szeretlek +1111114 +bubbles01 +chaos123 +iloveyou +nokia2000 +890 +whitetail +a789456 +001985 +120390 +10101984 +mylife2 +porshe +loveu123 +tester123 +family08 +1108 +sanpedro +damage +garnett +saratov +alex19 +stefanie1 +juanjo +dragon18 +docrafts +besties1 +dadmom +2pretty +sting1 +fynjybyf +bert +twiztid +hello111 +elizabeth6 +senior10 +inspector +120785 +password1234567 +takecare +origami +fuentes +trujillo +4meonly +1127 +dino123 +sweetmother +hondas2000 +tucker123 +eldiablo +camping1 +pet +cameron5 +master1234 +cutie09 +110062 +atlas1 +marina +oluwole +boomer123 +creature +sandra +giordano +secret01 +iphone3g +wakeup +ladybug7 +bennyboy +ginger5 +cameroun +1028 +101284 +soloio +100487 +barney12 +kasper1 +corrie +goonies1 +bowhunter +diana12 +sugarbaby +1234me +1sexymama +mirko +coolest1 +spalding +amapola +snowball12 +funnybunny +spencer2 +stephy +1412 +bigbooty +koliko +123121 +cocker +franzi +smoothie +phillips1 +cnhtktw +kapitan +ashley06 +supermen +noob123 +121277 +lokiloki +dickface1 +new_user +2friends +ihateyou. +sara1234 +funtimes +blackjack2 +13691369 +avgust +bumbum1 +saheed +grape1 +crazy3 +543211 +westside3 +jewell +lollipop2 +baobao +1forever +understand +wireless1 +starr +jordans1 +zimmer +paulita +sonoma +melani +harvest1 +shadow8 +sasa123 +babygurl10 +davida +201090 +annick +london2012 +130688 +mamama1 +death12 +fuckin +killbill2 +110690 +annamarie +1109 +120386 +olya +six6six +tink13 +120584 +123520 +coco13 +highway +bubba3 +gabby12 +21122012 +jenny13 +trainer1 +loveme09 +01011992 +steven13 +240484 +samantha01 +10101980 +120484 +a1b1c1 +bojangles +anthony18 +angel28 +15963 +robyn +qwerty2010 +bucket1 +acmilan1 +bullshit! +pimp08 +chocobo +irule1 +sheeba1 +miami123 +espace +twenty2 +squishy1 +qazwsxedc +230588 +cameron +lickme69 +1q2w3e4r5t +acer +yomama123 +pink33 +012 +crazy5 +147852a +edgardo +dbz123 +jordon1 +one23456 +qwe123 +holiness +australien +turkiye +saphira +hanane +tuborg +mickey22 +110386 +121187 +cartagena +high +green18 +pisica +gfhjdjp +theman12 +ball12 +001984 +louis123 +toaster1 +sssss1 +taylor15 +acura1 +widzew +onetwothree +cromwell +treacle +gogetta1 +yourmom. +maddalena +jezebel +senior1 +malagu +121200 +jelly123 +rammstein +sierra12 +iloveit +alexandra2 +andika +mountains +sharingan1 +3ans97t397 +1346798520 +destiny01 +spiderman9 +south +555666777 +t-bone +159456 +0808 +brownpride +chivas7 +fiesta1 +elephant2 +gay +supers +xxx777 +january27 +blue101 +198310 +bonovox +me2you +becool +ladybug12 +samuel +skates +trees1 +inter1 +mama13 +byajhvfnbrf +fiorellino +bigbaby1 +beerbeer +grace2 +cowboys24 +spurs21 +martin +michelle1 +kevin3 +phoenix2 +senha1 +nigger. +ferrari +dancer3 +222666 +3brothers +vwgolf +230589 +springfield +alinochka +black9 +shorty22 +redeemed +sinatra1 +900900 +secret11 +12031990 +ericka1 +greenman +cornbread +tigris +olabisi +oneday +chipmunk1 +mustang05 +terranova +ariel123 +finally +spa +septembre +warlord1 +ladygaga1 +tsunami1 +alex1994 +lightsaber +smokin420 +shamanking +aaliyah2 +qwertyuiopasdfghjkl +cummins1 +thomas! +beethoven1 +lionelmessi +14321432 +snicker1 +melany +jazz12 +joshua05 +44445555 +nikolka +richboy1 +cookie21 +1017 +peaceandlove +russian1 +jasmine6 +peanut! +johnsmith +football75 +gtnhjdf +january7 +versace1 +198812 +vineyard +951753aa +131189 +frankie123 +1hxboqg2s +january16 +deltaforce +80808080 +hanumanji +lancaster1 +lala13 +charles +frogman +myspace25 +120287 +258 +florida +pussy11 +zaq11qaz +leeds +maldonado +joshua09 +2cute4you +polska12 +iluvhim1 +discovery1 +521314 +123345 +welcome3 +djljktq +samantha! +redalert1 +beastmode1 +astra1 +love78 +axel +221287 +chillout +diamond11 +dina +7654321a +smiley12 +mickey5 +denise +harley10 +angelwings +121281 +eva123 +maniek +ezekiel1 +melina1 +alfie123 +barcelona2 +jack22 +sparky11 +02580258 +corky1 +polly123 +sunshine08 +geraldine1 +120190 +royalty +dingding +maya123 +angela +cholo1 +willsmith +jasmine9 +nothing0 +parigi +kalyan +helpmegod +justin99 +311 +050588 +agata +larkin +trish1 +gertie +2bad4u +farhana +dragan +redapple +5566 +zachary2 +159789 +shiraz +mamans +sex4me +baby_girl +kicker1 +181 +11223300 +mitico +sassie1 +hawthorn +mailman1 +wildfire1 +poopsie +280888 +32103210 +kmzway87aa +hobbes1 +ichigo1 +january18 +fran +candyland1 +111289 +ladybug123 +basketball23 +poopie123 +yeah123 +1411 +r2d2r2d2 +seventeen1 +alex1993 +isaac123 +january15 +writer1 +whiterose +simply +volunteer +summer6 +babygurl16 +glendale +batuhan +ilovedad1 +yjwfn73j +marcos123 +familyof4 +20091988 +jaclyn +poppet +pepper! +100588 +adminadmin +blue09 +every1 +tipper1 +lalala3 +avenged1 +chelle1 +moemoe1 +password28 +slipknot +andreas +persib +159753q +badbitch +glasses1 +volare +petunia1 +monique2 +senior2010 +natnat +snickers12 +spoon +woodie +paroll +teatro +casper01 +11001100 +soccer45 +p1234567 +221090 +loveforeve +140290 +220689 +freelancer +fanta +commander1 +numlock +bermuda1 +w111111 +aline +pimps1 +100490 +feedback +234432 +bluedragon +sweet22 +assholes1 +hidalgo +gangsta5 +matter +harmonie +bigmike1 +morgan3 +gonzaga +ybrjkftdbx +basil +hurensohn1 +guitars1 +southafrica +daniela123 +verseau +vans123 +muzika +massey +ronaldo99 +251088 +blueblue1 +steel +man12345 +happy21 +isa +winter06 +theo +hotshit1 +slayer69 +1cowboys +atmosphere +sankar +january19 +porsche +westie +oc247ngucz +120787 +lorelei +milenium +pajaro +253634 +murphy +prachi +1qaz2wsx +19531953 +aleksandar +barcellona +00123456 +space4me +reddragon1 +lastfm1 +0505 +class10 +bubbles8 +12312 +jessi +tito123 +bamboo1 +tyler14 +250788 +applejuice +yellow10 +precious12 +julissa1 +rock666 +malaika +1113 +burgess +leone +freedom4 +josh14 +251 +666000 +hitman2 +mickey10 +madhatter +walton +369147 +thomas5 +bubbly +tabby +catman1 +jake22 +lord123 +maddie2 +hannah09 +12121991 +stuff1 +baubau +250589 +jeanpaul +money20 +jayden01 +221289 +greta +djdjxrf +dawgs1 +michoacan +chocolates +789632 +vickie1 +000005 +gogogogo +090990 +delta88 +dolphin123 +metalhead1 +lalala! +kitty4 +carmina +sweet21 +120786 +bigass +ilove4 +1812 +askim +rfntyjr +12345678i +fuck14 +fausto +degrassi +fatgirl1 +96321478 +patrick11 +qwepoi +mauritius +daisy01 +jose23 +12ab34cd +mclovin1 +vicious1 +piyush +long +earth1 +angel55 +mensuck1 +nokia1100 +edward3 +muneca1 +zackary +ariete +bubulina +211288 +guitarman +230988 +himalaya +jolly1 +demetrius1 +rebecca2 +02 +valeriy +6173580 +jose15 +supra1 +ashlynn1 +234 +friends +bowser1 +newworld +pooja +informatica +120886 +asdfg1234 +alskdjfhg +katzen +m1m2m3 +1horse +bling +udacha +higgins1 +january26 +czz123456 +octavio +rom +123aze +complicated +12345u +dkflbvbhjdyf +live +6y4rv0a992 +evangeline +fuck777 +110890 +empress +jonathan13 +izabela +sassy101 +gunslinger +1richard +bandit11 +101186 +lincogo1 +caprice1 +tit +nikoniko +advanced +2311 +arsenal1 +darshan +harley05 +kanarya +00000007 +volcom2 +alex1996 +v123456789 +1heaven +coolest +mother1234 +82468246 +.......... +love1995 +fenway +rocky6 +cheerios +12121985 +prince22 +jensen1 +workhard +kk1234 +raj +pacers +poontang +maelle +1q3e2w4r +oscars +jason22 +198181 +250388 +okmijn +dogsrule1 +kerala +9090 +maltese +jose10 +shinichi +nakita +bella22 +gossip +baller4 +asdqwe123 +chiquito +thalia1 +akira1 +241188 +infotech +soledad1 +121086 +yasser +seos1234 +halfpint +davina +stopit1 +fuck-you +david17 +natalie +popcorn7 +rudolph +cj +ttttt +carver +asdfgf +weston1 +anand +180180 +guildwars +lolilol +acer123 +410210 +241088 +shobha +console +hollydog +bullfrog1 +password94 +love1994 +230987 +raphael1 +lsutigers1 +booyah +olaoluwa +roxie +1qazwsxedc +yfnfkbz +alexis +loser22 +coach +vinayak +password05 +destiny11 +5683 +marcolino +misspiggy +dasher +iceice +123444 +karin +sunny2 +1prince +madison6 +capitano +wolfie1 +password +devilman +andrew16 +director1 +tamika +nazgul +020288 +snicker +cris123 +lock +kris123 +cooper11 +right1 +1maggie +marivic +omega3 +jennifer13 +bored +roma123 +ddd123 +niggaz +collection +jetta1 +annabella +roxygirl +100789 +bryanna1 +orange01 +tango123 +130686 +qwer11 +vanvan +ravi +charlie08 +robyn1 +6666661 +piotrek1 +12332100 +milan1899 +david6 +zippy +kitsune +redeemer +tigercat +tomorrow1 +claudiu +bibibi +00000001 +babyboy7 +softball08 +120290 +col +hannah02 +sportster +samiam1 +110788 +sacrifice +psalms +grenoble +021 +101081 +jayden12 +cochon +1234 +nena12 +andrew07 +dakota13 +lashawn1 +squeak +didi +googlecheckout +foufou +daisy13 +200808 +pawel +rich123 +froggy12 +05051989 +mylove3 +bigdick69 +nguyen1 +j3qq4h7h2v +john21 +excellence +september4 +1234qwert +killer09 +1946 +utn05wwy +st +qwertyuiop12345 +holysh!t +szerelem +kitty! +imperial1 +happiness2 +jessica08 +bobo12 +210990 +martita +dima1997 +weeman +steel1 +louie123 +daniel1234 +pepito1 +taytay123 +brando1 +jacinto +servant +23031990 +spoon1 +rainbow! +july07 +pronto +passe +logout +maniac1 +jesus8 +catlover1 +asdfghjkl9 +loveme1234 +ladybug3 +asdcxz +number14 +211221 +landscape +best123 +spankme +reebok1 +love97 +superman19 +gatinho +asakura +bonifacio +face2face +hack +redsox11 +12345678911 +babyj1 +090988 +phoenix7 +wanted123 +cuntface1 +honeydew +quaresma +samolet +aassddff +987654321z +fathima +speedracer +phone123 +heyhey123 +ricardo123 +bismark +corinthians +bello +rubbish +mongolia +chavez1 +12300 +iloveyou!! +hubert1 +forever5 +jasper2 +nokia8800 +vitamia +bengals85 +cabron1 +120491 +maxdog +1014 +baseball34 +davies +james24 +12349876 +billyboy1 +sh +130689 +dallascowb +tanya123 +first +camacho +basketba11 +nikole +amanda5 +starz1 +chelsie1 +smokey +dragon1234 +1026 +superman24 +squishy +maximius +lizaliza +fan +bigcat +hottie07 +wilbur1 +kennwort1 +budgie +aliska +master3 +fuckoff3 +reynolds1 +196666 +mopar1 +trout1 +parola12 +sparks1 +america01 +dreamland +naples +mapuce +nirvana +77777778 +caring +140288 +wildbill +love1993 +7thheaven +shantel1 +angelfire +121190 +gerber +penguin123 +eintracht +tre123 +anthony16 +terra +chappy +101184 +viktorija +kimberly2 +tanisha1 +911119 +pogiko +seadoo +imperator +11111z +262728 +hunter14 +220188 +kingdom2 +alexander5 +password: +isobel +010407 +5starchick +lover10 +penis2 +daniel24 +garrison +sadness +hamlet1 +fuckhead1 +hollister9 +foxfox +quinn1 +kevin22 +preciosa1 +avenir +marianne1 +sami123 +her +weewee1 +maricris +foxfire +freshman1 +12q12q +kiko +swag +sanane123 +ciara +daisy11 +stephan1 +sexymomma1 +shosho +yesterday1 +amaterasu +princeton1 +qazxsw21 +2000000 +hockey23 +dancer101 +robert! +isabella2 +bloodlust +1nonly +1030 +121084 +carlos7 +amores1 +shopper1 +monkey27 +paolita +schlampe +jennifer01 +210987 +anthony06 +salvo +chuchi +linkme +jas +ilovesex69 +yankees +123456654 +stop +123456qwert +rockie1 +800800 +aaaaa11111 +roxy11 +cameron1 +patpat +bavaria +115115 +a222222 +addict +monito +village1 +prisonbreak +perfume +vfvfvf +darkness +square1 +johnnie1 +godiva +mot +blazers +z123123 +barcelona10 +654 +blah1234 +birgit +halo117 +tigger +schnuffi +user123 +130690 +happy23 +contrase+a +info123 +bububu +shine1 +stoney1 +stronger1 +referee +pin +lola1234 +romanova +mine123 +madison08 +20101987 +sparco +1234561234 +matthew21 +andriy +montana16 +dmitrii +dulce +taylor8 +lookout +blacks1 +iamgod1 +sunny12 +carley +sycamore +110490 +chandigarh +erasmus +ultraman +01011977 +passionate +120387 +compact +fortaleza +420allday +hrvatska +lexi123 +queen2 +novikova +newlove +planning +godfirst +aaa333 +369 +rayray12 +pretzel +karolinka +thornton +sparkey +lockout +texas13 +pongo +katina +q123321 +120985 +love1992 +250590 +cypress1 +internet12 +imthe1 +asdzxc1 +spring08 +leland1 +goodfood +anthony17 +hesoyam123 +brianna3 +moe123 +1126 +monkeys! +asroma1927 +leopardo +horselover +3353212li +linklink +poohbear13 +xxx333 +mike07 +padres +lauren10 +matthew22 +david08 +100388 +espinosa +izzy123 +victor2 +101190 +passcode1 +samina +141288 +vvvvvvvv +1fuckoff +duke01 +f00tba11 +girish +22332233 +boozer +vaz21099 +onelove123 +manasa +catwoman1 +liezel +almost +baller14 +belkin +123456789qq +110003 +120990 +daisey1 +desperados +dolfijn +samantha +svetlana +hitler88 +crystal7 +ponies +tupac2 +zinedine +2wsxcde3 +andrew06 +cowboy22 +bohica +princess94 +greenhouse +amylee1 +995511 +herkules +leather1 +143444 +65656565 +josue1 +linux +get +1234567890qw +alex1992 +skeet1 +120890 +roadster +joemama +iloveu8 +babycakes2 +thistle +dre123 +nebula +slipknot69 +hayastan +123098a +top +1playboy +filler +parts +2puppies +3141592 +architecture +rubyred +soyelmejor +sonic12 +mouser +gangster13 +newyork5 +tammie +blubber +hotel +waiting +angel00 +111223 +biker +ilovekevin +ambulance +czekolada +zoltan +kitty22 +kisses123 +sasha1998 +benjamin1 +boss302 +fuckedup +dalejr08 +******* +happygirl1 +clarita +jason3 +dtythf +gatita1 +mommy101 +nbvbb32fa9 +kitty10 +thebeast1 +010181 +computer! +@mail.ru +bonethugs1 +221189 +findus +buddy23 +alexander8 +phyllis1 +password95 +johnboy1 +azzurro +tttttt1 +1alexander +hottie09 +flhtyfkby +gangstar +mymoney +feeling +diamond1 +contest1 +redsox123 +celtic88 +diamond8 +15975346 +lovers3 +christina +marquise +110586 +adventure1 +centurion +hiphop12 +death2 +pepper10 +saiyan +superbad1 +united123 +hotty123 +akatsuki1 +07072007 +sweetdream +pap +aisha +admin12345 +lauren3 +shaker +internet2 +attention +110015 +august9 +100889 +jughead +001987 +princess95 +smartboy +rudeboy1 +ocelot +hotbabe +231186 +cutie23 +anna13 +ma +lolz +miguel10 +spiffy +rhbcnbyjxrf +jeanine +blackbelt1 +231088 +willywonka +ironman2 +music22 +exchange +120885 +denny +hesoyam1 +smurf +manuelito +excalibur1 +1234578 +1928374655 +oatmeal1 +michaels +ninja2 +waldemar +mavericks1 +metalhead +shikamaru +dee +lucy1234 +tonka1 +bitter +doors +iluvu123 +kenny12 +makenna +lilwayne3 +junior07 +ve +hannah05 +belarus +400058 +kayla11 +panther2 +q2w3e4r5t6 +elektro +ppppp1 +aberdeen1 +baby143 +babette +110985 +sa2rawybas +football80 +purple99 +camilita +olds442 +231286 +mandela +avrora +150388 +homerj +petite +charles3 +all4you +candy01 +kozerog +livewire +johnston +getmoney5 +marciano +karmen +herohonda +sexymama2 +alonzo1 +clay +agente007 +karoline +brandon16 +booboo7 +jet'aime +fuckher1 +pebbles2 +thugstools +monsoon +queen12 +spoons +kane +juju123 +edward! +monies +369874125 +2wsx1qaz +josh23 +890iop +hamza +wordup +123456kk +qwer123456 +vlad1997 +shadow16 +drago +getmoney12 +sdfsdfsdf +rockhard +ktutylf +witch +vicious +veronica12 +411028 +boating +eric1234 +love42 +tweety11 +air +nathan10 +greatday1 +allaboutme +purple09 +140688 +198721 +summer8 +goodcharlotte +1music +beetle1 +papounet +001002 +king15 +100827092 +andrew6 +loveyou +jasmine +matheus123 +111288 +baseball123 +jesus15 +knockout +1234567abc +210487 +islander +bastet +241 +tierra1 +parol1 +dingo +handball1 +dasha123 +tigger08 +rosalina +val123 +natalie12 +abimbola +attorney +corinna +naosei +baylee1 +chingon1 +111186 +british +1597535 +cjytxrj +mickey23 +hotboy2 +tigers10 +christian +olajide +melisa1 +pride1 +1hotboy +0815 +theatre1 +fallenangel +963214785 +wrestling2 +facebook123 +garibaldi +juggernaut +26041986 +01011975 +120483 +ererer +escort1 +nirvana2 +nomercy +cccc +liebe +radhasoami +princess92 +!qazxsw2 +thakur +freak69 +spotty1 +trapstar1 +blackhole +210586 +220022 +gerrard08 +mommy10 +cumming +bharti +letmein12 +five55 +220589 +super1231 +silva +segun +power5 +franz +milkyway1 +travel88 +jesus666 +ayobami +vasquez +yankees1 +29 +kb9zc8uxtx +kylian +1george +freedom5 +benita +nightwish1 +cameron01 +stunner1 +kevin21 +ser12345 +blahblah2 +ashley20 +lyudmila +bigpimp +horizon1 +hotsex1 +diabetes +arrowhead +master21 +heaven12 +missouri1 +pakistan +kryptonite +jledfyxbr +pramod +hippos +maranata +faith12 +bmw325i +vic123 +cambodia +foo +wolf12 +emogirl1 +reporter +marie09 +tayler +310589 +lovebug123 +deadly1 +niharika +123789a +201286 +wildchild1 +blood13 +157157 +starwars123 +meathead1 +1001wdst +daisy3 +oswald +cruzeiro +paroli +hammertime +player11 +alexis08 +babygirl#1 +100589 +mamabear +100289 +brittany7 + +candy69 +baby12345 +belize +speed123 +shadow00 +baby1 +2210 +loser6 +manman12 +zcxfcnkbdf +y12345 +latin1 +1006 +150688 +justlove +moochie1 +maniez +neenee1 +sososo +iulian +asdfg6 +iloveyou05 +loser01 +ian123 +muffin11 +210890 +111988 +gordo +1219 +karen12 +michelle. +ikechukwu +cat12345 +brighteyes +duarte +303677 +dog12345 +andrew17 +emma11 +17931793 +fifa08 +lucas12 +111286 +ngockhoa +mayfair +blumen +death2all +230687 +110587 +salinas1 +10121990 +mamusia +251089 +justlooking +vermelho +241086 +hopeless1 +vasantha +clitoris +joey11 +friends4ever +cassie01 +shimmer +210789 +smartie +halo3odst +joaopedro +backdoor +chester12 +chicha +banana! +210690 +1love +mazdamx5 +john +froggy123 +lera +computer. +02021988 +skate11 +submarine +apjsqpm844 +lovely01 +marrakech +230393 +cyclones +nick16 +princess89 +cocoa123 +saravanan +monkey44 +family13 +hockey6 +230390 +110687 +teclado +vignesh +cbr1000 +b12345678 +hercule +sexkitten +sabrina12 +magico +mai +mikey2 +251090 +jesus123 +football06 +jean123 +bruce123 +ipodtouch +ron123 +kara +cubano +weirdo1 +ghbdtndctv +slinky1 +42424242 +jc1234 +murphy123 +key +brittany! +abc123abc123 +198523 +penis12 +metro2033 +tabatha1 +damian123 +blackmamba +margo +15975300 +210188 +trey +230389 +junior14 +231087 +ggg111 +maroon +100489 +dancer7 +lovingyou1 +seguridad +volodya +compassion +151188 +asuncion +question1 +2balls +1492 +killer88 +123456321 +emilie1 +micasa +outback +maruti +cruiser1 +momdad123 +123654789a +oli +anubis1 +nevada1 +alexander4 +winniethepooh +wildthing1 +jolly +asian +weapon +danial +rockin +kareena +karissa +55555q +jaydee +madison10 +soumya +lifeline +230688 +159357123 +088011 +kikokiko +go +lovegirl +charlie07 +ilove13 +shelton +beach123 +testqa12 +rfnmrf +acacia +fender123 +pbvfktnj +omerta +210488 +310588 +tre +homealone +erin123 +09 +11121987 +pimpin7 +sugar12 +moore +love911 +fairways +web123 +boston2 +chocolate +goonies +brandon09 +behemoth +ric +tigger07 +131088 +mohamad +201288 +spawn1 +super10 +323323 +sunday123 +justin24 +131186 +softball09 +eyeball +emotional1 +candy22 +charleston +newmoon1 +197700 +equinox +happy8 +loveispain +325325 +angel95 +charlie21 +06061986 +43046721 +police911 +birddog +jasper11 +1bulldog +saravn +150890 +trustno1 +dodgeviper +prince01 +velasco +ambrosia +vampire13 +5432112345 +iwantyou +nikitka +bowhunter1 +antoshka +hahaha12 +ducks +fiction +tennis11 +l1verp00l +linked +wonderman2 +cornell1 +destroyer1 +thomas69 +llcoolj +paolino +arjuna +freedom +cvbhyjd +maria15 +barca10 +cbr900 +100890 +xsplit +loca13 +arcangel1 +atalanta +machines +cross1 +postal1 +taylor09 +22112211 +brandon07 +buterfly +topher1 +kikugalanetroot +pimpjuice +raiders7 +bianka +azrael +alcantara +lucylucy +moomoo123 +bassmaster +rfgbnfy +thethe1 +family04 +urlacher54 +muller +cameleon +love520 +rhodes +infantry1 +sevens +gametime +22011988 +newyork3 +marci +ukflbfnjh12 +center1 +231086 +husker1 +varsity1 +kevins +sarmiento +remember2 +guille +140789 +daniel88 +kotek1 +job +lanzarote +251188 +nick10 +asshole13 +raheem +january29 +bujhtr +factory +261088 +jesse13 +chelsea! +teufel +nana1234 +princess05 +carlos14 +55556666 +tiger6 +bahamas1 +smarty1 +iloveadam +christ7 +abc_123 +roosevelt +woodside +katie11 +amicizia +january3 +teddie +bitches69 +spiderman0 +pitbul +louisiana +bff4life +victor13 +serene +music. +symphony +icecold +100389 +123123asd +termit +12341 +destiny13 +amo +911911911 +maniak +251288 +balla +010189 +tiger69 +bigbig +katy +jasons +pretty3 +ninja12 +jamielee +poop23 +anthony. +delboy +abcdef1234 +100687 +jaredleto +killian1 +1010101 +znt +silvestro +mj1234 +sammy5 +110987 +thedon +201289 +summer2007 +foreveryoung +197400 +mandala +fishface +kittycat12 +catsrule +230383 +danielita +fuck420 +ingrid1 +elvis77 +scirocco +prikol +bryant8 +stoned1 +dolphin12 +chris05 +zombie666 +buster69 +++++++++++++ +1580@welcamino +martinka +246246 +sunnyboy +4linkedin +goodie +donkey123 +johnson2 +mindfreak1 +andrew18 +petra1 +grand +candy10 +apples11 +eniola +lebanon1 +joseph10 +daisydog1 +ilovelucy1 +diamond +р№с†сѓрєрµрѕ +skills +zxcvvcxz +redskin +ham +hannah9 +myspace666 +momma +mets +surgery +bonnie12 +goodlife1 +sticky1 +010186 +al +sasha2 +09870987 +niceday +carlisle +delmar +stanton +brewer +floppy1 +qweasdzx +admin12 +thatshot1 +mike16 +deejay1 +lovely21 +gracias +carlos15 +wyatt +destroy1 +fresno559 +151288 +passwor1 +brownie2 +iwantu +yadira +drumline1 +boytoy +savannah12 +198710 +monkey92 +jarrett1 +220388 +bitches123 +bismarck +alex00 +daddy69 +roller1 +openit +triplets3 +mombasa +220487 +tunafish1 +barefoot +rocky13 +daniel8 +kukushka +makarova +curly1 +thomas14 +100190 +jeremy01 +cookie69 +winston +buddy1234 +1spongebob +manutd123 +ade +dance3 +241089 +orange10 +maria01 +ronaldo +cheesy +diablo12 +closer +scuba +simplicity +reese + +getmoney08 +media +animal123 +surfsup +purple08 +130589 +q1w2e3r4t5 +292814lolo +rickey +raoujfl963 +bubble123 +happy420 +mentira +heybaby +danielle7 +singapore1 +coronado +400703 +sarah01 +flyaway +scooby11 +alexander6 +bambam123 +fightclub1 +raptor660 +martin13 +sword1 +120783 +131131 +mabuhay +tolentino +kitty01 +password31 +candyland +crush +georgina1 +liuchang +blades1 +monster4 +dipshit +stars12 +my3angels +cubswin +emmaemma +die +guam671 +greens1 +tumadre1 +orange21 +sombra +troy123 +longlife +220987 +sorrento +pearson +220690 +aprile +soccerball +jaishriram +192168 +andrew99 +stretch1 +$money +bubba7 +mydaddy1 +161 +jeroen +milica +210489 +trick1 +tara123 +lhepmz +tagada +charon +metallica7 +rerfhtre +nickolas1 +fuckup +marie +titans10 +company1 +motivation +900000 +cars12 +goodguy +tiger9 +b00ger +u0hgtkt617 +schnucki +joker5 +green69 +1qazxcvb +frdfhbev +131286 +favour1 +lovely22 +luvme1 +1234qwer +killah1 +victoria +theater +dima1996 +shelby11 +emily01 +3636 +peacock1 +lifesux +131087 +robots +gilipollas +blazeit420 +angel94 +david18 +400066 +coline +firefighte +tinatina +mustang07 +78907890 +nigel1 +puppys1 +sexyone +easytocrack1 +stream +donkeykong +oassw0rd +new975wen +angel2008 +john10 +ratchet +buttmunch +101001 +jackoff1 +cris +passwor +turtle3 +family07 +ohshit1 +ccccccc +google5 +120189 +lawyer1 +noles1 +goalie1 +filhos +dabest1 +aleks +50000 +beer123 +yaalimadad +blaine1 +inspiron1 +everest1 +hancock +baggies +timur +florida12 +mike18 +110984 +feifei +alex1990 +buratino +brad123 +daking1 +123fuck +world123 +mtizndu2 +creamy +peace13 +beacon +bronte +boobies! +spidey1 +fyyeirf +edison1 +katarzyna +fuckoff. +thetruth1 +microphone +olemiss1 +grace12 +marlyn +sammydog +231187 +kovalenko +198623 +13421342 +hellokitty1 +nolan1 +mohamed123 +underdog1 +stones1 +231289 +ledzep1 +americano +210385 +erhfbyf +tiara1 +5544332211 +11011990 +lickit +qwerty33 +amanda +hustle +gelato +imani1 +donbosco +monkeys12 +poiuy1 +taytay12 +100488 +mama10 +karinka +manny24 +moises1 +rajput +thesims1 +ilovedan +survey +badass123 +bubbles +nigger3 +michelle08 +destiny6 +1jackson +ismael1 +mishra +wealthy1 +hellome +lemon123 +rockstar3 +14021991 +chango1 +pft: +010187 +jumong +jarjar +sexy34 +newyork11 +nicholas1 +dani12 +204060 +politics +labtec1 +123321456654 +favorit +dickson +monkey0 +vivalavida +greeny +asdfgh123456 +201186 +liteon +bella08 +hellno1 +supra +bambam2 +whore69 +computer7 +studioworks +buddy101 +88888888a +giggs11 +ayrton +mindless +21071988 +baby92 +kitties1 +aj1234 +230585 +220590 +123pass +samson12 +lc519qlpuu +nikki13 +february14 +panda2 +love007 +zachery +fish1234 +uptown +gonzales1 +fishhead +bloom +halohalo +fh +flower01 +71 +ilovecats1 +sunfire1 +lambert1 +kaka12 +gfhfljrc +231190 +sickness +buddy22 +grandprix +veritas1 +hihi123 +robins +madison07 +september0 +banderas +manhattan1 +110887 +sardar +candy23 +yang123 +nishant +knitting +222000 +110790 +shinoda +maksik +qwert11 +oooooo1 +michael06 +youngblood +cute11 +clippers +honey3 +slipknot7 +150690 +dragon25 +realtek. +luv2shop +711711 +tammy123 +scarabeo +pickles2 +sexy05 +ally +godlove +shadow17 +thewho +231085 +qwerty17 +jessie11 +080880 +kk123456 +adelaida +021288 +pigpig +230789 +secretary +dadada1 +jamie2 +brokenheart +sara2000 +cxfcnmttcnm +playa4life +pimpin23 +qwertyuiop1234567890 +123579 +maxmaxmax +tabata +monkey19 +fleetwood +toodles +piopio +1256 +hotman +leckmich +knockers +music08 +alexander +fredrick1 +qw12qw +robert14 +my4girls +bedrock +alvarez1 +icecream! +schalke04 +peanut10 +onlyone1 +welcome7 +cthulhu +paula123 +1018 +machado +august +cheer5 +daffyduck +mustang88 +pistol1 +316497 +beachbum1 +megastar +brandy +pitchoune +oussama +gjmptw +algeria +hannah15 +1mexican +carlos5 +lilone +jeremy +1hotgirl +antonio +radost +michael19 +matt22 +123qaz123 +tony69 +nicolle +k.: +i<3you +yamaha250 +rocawear1 +crf250 +superman15 +morley +tazmania1 +221087 +fuckabitch +lovely23 +hottie8 +muziek +dooley +sanmiguel +knickers +beast666 +sweetlove1 +guitar13 +210988 +redneck01 +january31 +kisses12 +mannheim +steven +110486 +fake01 +mm1234 +maui +soniya +jayden06 +olakunle +jodie1 +monterey +tashkent +345543 +jiajia +mommy23 +gaga +060689 +reyes1 +scenic +110005 +joaninha +bball20 +children5 +concept +hello00 +arrows +1friends +derek2 +34erdfcv +211187 +cristiano1 +oliver10 +kathrine +eagle2 +bilbo +pantyhose +doudou1 +kolyan +110986 +marnie +saunders +think +sissy123 +titanik +william8 +logitech +cowboys7 +110390 +guanajuato +threesome +maria23 +chaparrita +king14 +olivia11 +my_space +rebirth +brittany +tututu +hothot1 +abbott +tygrysek +silver +hottie9 +nathan13 +rock13 +hayabusa1 +dbjktnnf +kids03 +hinder1 +4family +slayer12 +tigresse +den123 +n0thing +1016 +123baby +jordan98 +11041988 +05051987 +jomar +brianne1 +penguin2 +123456aa +buddy4 +bailey22 +111290 +pretender +purple25 +gina123 +shreeram +stripes1 +12091209 +browny +simons +abercrombi +pascal1 +geneva1 +flubber +abacus +reeses +100590 +31121987 +miki123 +godschild +halowars +1whatever +patrick +wanda +tempesth1941 +fgfr56hfve6 +samuel2 +myshit1 +dogman1 +parrot1 +dante123 +111088 +12345qq +12021988 +999333 +3691215 +iloveyou89 +apostol +250188 +angels11 +700091 +pallavolo +mama01 +elissa +w1960a +lakewood1 +anfield1 +molly7 +01234567891 +130789 +forever22 +recall +zhanna +nathan08 +220585 +cyclone1 +bhavani +221186 +alex123456 +superman20 +zaqwsx1 +hoochie1 +money16 +century21 +chips1 +christian9 +amateur +hockey101 +ladylove +jessica09 +jello123 +reussite +bebeko +cisco +deepti +lilman2 +waldo1 +130585 +130586 +corsair +xxxxxx +triathlon +1234567895 +buddy6 +cfvfhf +tweety5 +benetton +pasport +solene +larsen +paul1234 +137137 +bitch00 +240587 +joseph22 +z1z2z3 +carolin +030388 +clocks +shorty! +e8szn4e5zc +nino +horton +radar +281188 +r0bert +bigpoppa +gabriel +joey1234 +karina12 +decker +19101989 +yessir +jack10 +thomas4 +asasin +misha123 +honey01 +blue20 +bless1 +gan +duende +parolparol +waterpolo1 +humbug +rebel123 +121091 +060690 +cocorico +chukwudi +160686 +marie4 +dickies +!@#$%^&*() +chubbs +aspire1 +guesswho1 +brooklyn5 +1heather +bubba01 +rostik +raiders24 +bosslady +ilenia +comedy1 +boyboy1 +marathon1 +chamber +emilee +150290 +lovely. +kurtis +jeanjean +ipod12 +131089 +123admin321 +bobobobo +chinito +casper11 +amir +comets +100586 +vengeance +34523452 +gallina +tt1234567 +fresh12 +w1234567 +ilovekyle1 +max333 +fuller +tippy +sonson +261089 +yo1234 +harry2 +calogero +saviola +spider13 +albino +metalgear1 +blanka +120583 +2myspace +100987 +aguilera +med +kayla5 +kamilek +amanda17 +cory +jason69 +loveyou. +george13 +101291 +nicegirl +nnnnnnnn +euclid +251187 +aspen +daylight +bloody5 +cheer4life +peoples +tweety14 +210388 +maks123 +bug123 +170588 +110287 +palacios +relisys +dragon89 +arellano +spaceman1 +roseanne +pujols5 +zxcvbnm7 +aeiou +moroni +casa123 +david16 +january8 +nipper1 +actress +241186 +babygurl09 +12041990 +whitegirl1 +socom3 +hallmark +bear01 +packers12 +jacob5 +v000001 +pussy6 +963214 +bat +zinger +password30 +147369258 +small1 +west12 +ilovegod2 +jaisriram +mommy22 +231184 +muppet1 +tundra_cool2 +112233445566778899 +lisette +frisbee +paperclip +viviana1 +ripper1 +summer02 +angel92 +popsicle +210587 +genius123 +carman +221190 +princess27 +lilkim1 +111981 +krzysiek +rolando1 +aakash +808state +suzette +lovebaby +cyrano +molly3 +morkovka +987654123 +nicolai +ada123 +duffy1 +severus +mouses +algebra1 +ub6ib9 +death6 +forever. +trase1990 +codename +heather1 +skater69 +sebastiano +mustang73 +19491001 +bike +soccer26 +220988 +tenchi +anderlecht +videogames +christi +january24 +mashina +woailaopo +preethi +finnegan +love2dance +198425 +suikoden +02021985 +joshua15 +sexy27 +pogiako1 +dmitry +shaolin1 +heather3 +anthrax +boss12 +austin22 +jana +lambofgod1 +mahalo +loveme08 +miley12 +january6 +michael88 +pretty7 +121983 +nike10 +friend12 +rjcnbr +poiu +chinadoll +naruto21 +balla23 +bigdaddy12 +stan +whatthe1 +emma01 +ljrnjh +12051988 +amarelo +frank12 +maelys +eddy +sweet23 +integral +pencil2 +230487 +domingo1 +cornbread1 +1q2w1q2w +jannat +nickcarter +kochanie1 +dfgdfg +outsider +bongbong +alex2009 +987321654 +miller2 +beware +eeee +cena123 +ginger! +draco1 +12121992 +dima1998 +babyangel1 +xtkjdtr +goarmy +spinning +975310 +goodwin +rossi +21101986 +estrellas +ladyluck +kil +linlin +122436 +star17 +222324 +leeroy +301 +230888 +nigga23 +tatanka +jesus1st +050589 +ireland +dummy +babe13 +heaven11 +yellow. +adam01 +vanessa13 +ambers +nadia123 +251286 +peterson1 +cowboys11 +4r5t6y +linkedinpass +98741236 +150488 +sairam123 +wildman1 +12344 +marie17 +dimitri1 +58585858 +20101988 +ball123 +cashmoney2 +executive +veronika +mommy13 +girly +records +just1n +misamores +jeanpierre +abc123def +110289 +barbados1 +100690 +assclown +merlyn +peanut +jimenez1 +123zxc123 +bass123 +pass2 +nicole05 +101283 +233223 +908070 +redbaron +amanda. +madison06 +kayla3 +shadow77 +100886 +glass +fannie +comet +nikola1 +110886 +per +gabriel10 +1world +butterflie +orange8 +galway +astana +albero +ilove7 +milano1 +123456aa +251183 +nipple1 +daughters +231287 +01011979 +monkey06 +iamgay +greatest1 +summerof69 +kitchen1 +lau +cowcow +amadeus55 +saverio +dead123 +babygurl7 +220588 +corinne1 +antonio13 +comeon111 +marriage1 +19501950 +drummerboy +schwarz +314159265 +138138 +010184 +nisha +shaira +gotenks +sk8forlife +1stupid +agent +tigers08 +outside +lumberjack +entrar +tacoma1 +pharmacy1 +rizwan +sammy101 +rock4ever +09877890 +patric +melissa11 +lovex3 +alyssa3 +lizaveta +alexis4 +arhangel +josh22 +teacup +nolongthing +silenthill +bal +hairspray1 +mariner +lovely +richman +alltimelow +one123 +southwest +caravan1 +smile13 +dandelion +love555 +bella09 +forzalazio +pimp24 +jackson01 +computers1 +gaviota +magics +glenda1 +nick14 +maria5 +jocelyne +rhbcnbyrf +gemstone +popolo +bigboy3 +paramore12 +lebronjames +loading +ayanna +dragon55 +badass12 +hunter03 +jeadmin +110787 +billgates +habibi1 +radek +getmoney09 +kiki11 +230989 +dragon16 +666devil +qwqwqw1 +marie07 +220888 +students +260689 +spike2 +dkair8dda +121990 +rahasia1 +stella12 +test01 +momof5 +balance1 +lovely5 +150590 +naruto! +gonavy +xavier12 +asdfg5 +apple10 +jordan. +bubba13 +sparta1 +halo2 +a123sd +navyseal +400709 +miroslava +130487 +spawn +lilred +dondon1 +lakers11 +marie18 +1129 +29292929 +teabag +hunter! +powell1 +24681357 +w1w2w3w4 +cbr1000rr +bluesman +eagles05 +lovesick +ceejay +150587 +01012008 +monkey66 +tan +orlando2 +sonya1 +120391 +darien +dempsey +sublime420 +a123123123 +data +poopface +jordan25 +kaplan +ignatius +230986 +hacked1 +1beauty +thejoker +flapjack +loverboy12 +killer66 +1ginger +blacklabel +monster69 +mayamaya +fylh.if +fairies +assface +austin08 +500082 +damon +beautifull +bricks +allh11 +12021987 +wer11111 +jurassic +290988 +bollywood +michelle09 +joecool +20051987 +charlotte2 +nicole89 +lautaro +beastmode +james8 +oinkoink +220587 +5678910 +198919 +jonathan3 +dallas +baby93 +dade305 +volvo850 +josh01 +neopets11 +softball17 +110387 +000555 +redskin1 +hotmail.co +zaq12wsxcde3 +rupali +gabi +go4jobs +number24 +devon123 +singh123 +landry +madison8 +210689 +popcorn! +van123 +chaser1 +bitch17 +171288 +220586 +yaya +giggle1 +gallery +zxcvbnm12345 +230786 +oscar13 +negative +gsxr1100 +w1973a +welcome +dfcbkmtdf +monbebe +101282 +hannah8 +moore1 +kissme3 +fender12 +alex02 +02021986 +w1969a +cheddar1 +poop09 +charcoal +mymyspace1 +tookie +201020 +655321 +candy14 +220890 +nikolaev +bacon123 +farcry +kukuruza +love222 +daddy4 +lambretta +rodent +mexican123 +vika123 +teacher2 +ginger10 +lbc562 +junior15 +87654321a +rabbit123 +run4fun +111989 +cheshire +110585 +jacinta +110007 +brookie1 +александр +sheriff1 +lakeview +magalie +lmfao1 +silver01 +micro +apples! +spiderman8 +ma123456 +fishon +summer. +sexyboy123 +anatomy +infoinfo +el +elijah2 +10021987 +fr33d0m +cazzimiei +master99 +baby26 +3e2w1q +ilovemom2 +date +0303 +dede123 +sharp1 +linda2 +tweety21 +sacha +shadow1234 +mifamilia +stripper +molly5 +bcp201109a +120691 +cullen1 +justin05 +purple88 +whitehouse +251186 +mario13 +baller7 +12031993 +gato +angel2009 +001453 +020292 +maryjane420 +110292 +alyssa11 +cutiepie10 +joshua! +gar +1312 +baby04 +boomer2 +lilkim +141289 +2crazy +moonie +220289 +beavers +iamsexy +promotion +091088 +shortcake +landrover1 +funmilayo +sept11 +anthony24 +builder1 +12121984 +cherub +option +emyeuanh +ambassador +fernando12 +lamour +yogurt +carnell1 +sakthi +dana123 +rawr12 +hunter00 +sdf7asdf6asdg8df1 +iloveme4 +134567 +190989 +nick15 +forever23 +fenomeno +genova +asshole22 +12345678912 +gryphon +champions1 +qazxsw111 +040484 +confirm1 +harald +sanfran1 +120684 +unreal1 +pi314159 +jesus100 +fordfiesta +chapstick1 +batman08 +131187 +tanker1 +seeyou +silver22 +wrigley1 +hoffman1 +orange6 +221086 +destiny8 +pauleta +magic2 +yz250f +mike17 +joyful1 +sulaimon +pussy4 +terrible +speedy123 +honey7 +siobhan1 +abcabc1 +baby33 +thomas99 +sexyma1 +disney12 +131288 +yamyam +johannes1 +150489 +151286 +cheech1 +lansing1 +girlie1 +ruthless +drache +lilangel +ruthie1 +198080 +magicman1 +jennifer5 +10111986 +january20 +lamisma +200585 +caldwell +googoo1 +boobs69 +gambit1 +101079 +oleole +adams1 +fuckyou101 +holly12 +200489 +candy4 +whales +archer1 +hannah03 +redneck69 +121002 +hearts2 +lorenza +goldman +tomas123 +172839456 +wweraw1 +150989 +070788 +prince +001982 +000013 +789520 +120292 +bunny7 +producer +zmxncbv +princess02 +a1l2e3x4 +kevin5 +milagro +franks +william10 +sparky01 + +100387 +neil +lostsoul +northstar +photoshop +flaca1 +rosalba +evertonfc +kevin10 +marsha1 +oaktree +marijuana4 +ollie123 +1942 +mylover1 +120891 +14101987 +2312 +normandy +bambam12 +socrates1 +mercedes +asdfgh1234 +krasnodar +single08 +passion2 +210389 +poppin1 +mascara +heroes1 +brandie1 +maricela +kill12 +iloveadam1 +miller123 +satana666 +brittany13 +lover45 +password56 +123456456 +england66 +defjam +star24 +community1 +fri +21061989 +cutie16 +shining +221221 +dork +15021990 +sammyboy +black01 +ben100 +daboss1 +evildead +fktrcfylhjdyf +villevalo1 +coo +shabnam +alex2005 +safira +99xfxlo19ui +massive1 +money25 +15101987 +samurai7 +jesus25 +cosimo +system123 +catherine +dollface1 +pretty11 +mot2passe +william! +a777777 +munster +wasted1 +ffffff1 +muruga +nik123 +111089 +c0cac0la +arrow1 +dallas08 +dead666 +brujita +dancer01 +inspiration +201189 +stopit +sydney123 +mik +110488 +hermine +middle1 +qwerty007 +scratch1 +poohead +10101992 +kevin23 +burning +nanou +orchidee +dreambig +delfines +1teacher +gianfranco +cccccc1 +eddie12 +jandikkz +delfin1 +nhfrnjh +saudade +500032 +passw0rd1 +matvey +666666q +playmate1 +deniro +261 +22223333 +sativa +mamako +select1 +151090 +qwe123 +mike1 +sexmachine +220390 +wombat1 +250789 +bubba11 +gretzky99 +xoxo123 +1944 +tomasek +yorkie1 +200688 +alejandra2 +javier12 +yusuf +kungfu1 +241189 +1rainbow +rj +lollol12 +sienna1 +invest +brookie +12021990 +shaq32 +311287 +sparky +hummel +02021989 +dfaeff34232 +jagger1 +pokemon99 +waterski +rockandrol +donthate1 +hockey88 +120892 +sergeant +shiner +austin! +1234a +wakawaka +rocky01 +thunder +papatya +poklop +yandel1 +inspire +199200 +location +softball20 +skunk1 +kitkat123 +amadou +angel93 +garland +123q321 +strelec +141088 +bellabella +99problems +ballin! +killer8 +seether1 +121189 +1austin +q963258741q +january5 +wheeler1 +poobear +300487 +jenni1 +bella5 +little123 +isa123 +melati +powerade +gateway123 +cali4nia +cows +christian5 +fiore +1337 +shyanne1 +menace1 +tomboy07 +123654123 +6lfxlo629ui +201187 +lalito +josejose +heather69 +gerry +150589 +veterinaria +protoss +royalty1 +cherrypie1 +pass01 +dogsrule +toffee1 +rockstar5 +class2009 +photography +davids1 +morelia1 +kerrie +rockstar69 +bubu +moulin +210590 +davey1 +news +314314 +kobe123 +dominguez +1carlos +hooligans +ty2t1hv3oc +madelyn1 +hollister! +ira123 +operation1 +santa123 +lol111 +25121987 +robert4 +jarvis1 +1234567890qwerty +121279 +crazyhorse +free2bme +megatron1 +240588 +jasmine14 +nikita +bananas2 +princess93 +maryse +julissa +usmc0311 +ilovedick1 +22051987 +121083 +richard7 +skater4 +251189 +251085 +fuckall +211088 +savana +sempre +11335577 +kleenex +notvalid +camelot1 +jarred +aeiou123 +fucku13 +111185 +230189 +chainsaw1 +grand1 +logan5 +01020102 +hallodu +lauren22 +chivas09 +sossos +sleeper +kacper1 +spongebob6 +dumbbitch1 +cayden +loser23 +200587 +austin07 +hunter8 +19877891 +purplerain +stardoll +purple +261186 +l1nk3d1n +120784 +mymom1 +freedom10 +cortina +football40 +lukasz1 +230190 +lucy11 +treysongz +vic +partytime +198621 +skiffy +10101983 +20101986 +w1974a +monkey666 +nikko +ooooooo +t1nkerbell +jaishiv +20081991 +psyche +honda400 +splinter1 +olufemi +marina12 +tracie +tyler6 +revolucion +mateo1 +jasmine08 +robert15 +purple33 +alex2006 +vfiekz +140287 +nicholas3 +hammer12 +nick23 +eagles22 +198422 +nikanika +gentleman +anointed1 +escuela +jakey1 +hester +pony +bebito +sara2000 +systems +ritchie +0123456a +laurentiu +444777 +2dumb2live +sevenof9 +cambridge1 +lafayette +armadillo +muzyka +joshua02 +summer14 +a1234567 +myspace100 +parol123 +jamesb +7777777s +155155 +muskaan +pololo +110008 +laurine +candy6 +1229 + +cool99 +carwash +sexytime1 +dunlop +boobies69 +warehouse +08 +wimbledon +music10 +west13 +987410 +221085 +12051987 +seaweed +cutie22 +blue19 +261188 +wazzup1 +07070707 +zxcvbnm,. +bigboy11 +400705 +booger12 +donna123 +fuckyou18 +misfit1 +13231323 +bookworm1 +19111991 +1pitbull +katie13 +594love168 +zaqxsw123 +357mag +sk8er1 +jason7 +bosslady1 +iddqdidkfa +shadow09 +cocacola2 +251200 +14021990 +motor1 +gjkbyjxrf +toluca +matt01 +antonietta +1stlady +321qaz +tyler22 +sherwood1 +train1 +tmm +laura2 +holmes1 +forever11 +efnesonline +patrick! +sporting1 +soccer94 +141087 +adrian13 +larsson +357magnum +#1princess +1379 +linkedin +vlad1996 +guido +yankees11 +westside5 +dallas09 +grover1 +chaitanya +mikele +902100 +sexpistols +entu6ea64h +ferrarif50 +ammaappa +arman +buckwheat1 +100988 +vertigo1 +lynne +terezka +nini +samsung7 +killer77 +cody13 +angle +images +130788 +789963 +paddington +200988 +bigdog12 +bigshow +dolcevita +dirk41 +angel2010 +1q2w3e4r +schnuffel +uifkjhf522 +maggie4 +1027 +kasey +111990 +producer1 +america9 +ya +money88 +seniors08 +slipknot! +baby90 +140987 +sweetness2 +farrah +wsxqaz +benji123 +glamour1 +trabzon +400068 +220986 +caden1 +rbd123 +styles +150390 +celia +240890 +mansur +cutter1 +pimp16 +sammy10 +hunny +alicia12 +yuriy +qwerzxcv +crazy4 +sanlorenzo +apple01 +kendal +froggy2 +230890 +ilovetom +123456789012 +0707 +anastasija +rajani +steven7 +110285 +babylove12 +youloveme +201086 +201087 +julianna1 +ilovepie +replay +121991 +michelle20 +kitty9 +brasilia +lampshade1 +101987 +zidane1 +whitewolf +thekiller +492529 +22121986 +baddest1 +fuckthis2 +lego123 +chirag +brown12 +starfox +illinois1 +forum +justin9 +giants10 +brunette +anetka +cheesy1 +123sex +taylor9 +sk84ever +guizmo +1402 +432156 +winona +scooter7 +telefoon +bigbutt +memento +070789 +friends10 +dj +batman6 +gasman +diver1 +changeit +++ +oladimeji +oluwaseyi +gutierrez1 +finger11 +200488 +bigbuck +ih8you +120384 +honda600 +school3 +mahal1 +love67 +pampers +shabana +eighteen18 +mystical +xavier123 +2510 +molly13 +d21lwz1zjs +maksim2425 +worldwide +guyver +lakeside1 +030383 +69chevy +parissg +110988 +spike12 +jewelry +240486 +ahmad1 +paraguay +kinky +w1971a +bhaskar +mommy08 +crossroads +haterz1 +dude101 +sierra123 +alexis07 +lover09 +pasion +10071987 +titus +101986 +ready1 +fifa10 +iloveu23 +maman1 +211086 +moto +change123 +queenb +811009 +costello +baby00 +w1972a +mama23 +ryan23 +110027 +fuck21 +downhill +gfdkbr +prophet1 +james9 +a555555 +paperclip1 +201184 +100288 +gj +amber01 +thunder5 +w1ll1am +gerbil +aeroplane +sanctuary +151189 +shriganesh +goarmy1 +hyper1 +florian +bolivar +122222 +media1 +pokemon! +twiggy1 +22021989 +44448888 +chaparra +2202 +michelle9 +pineapple2 +snoopy3 +1478523690 +143jesus +15031988 +salvatore1 +020289 +tasmania +nokia2700 +woodrow +12041988 +llamas1 +douche +16121987 +080890 +141188 +football89 +sweetdreams +teodor +moomoo12 +jujuba +270488 +boneca +14101991 +karel +lilgirl1 +mariners1 +player01 +biotech +fgfgfg +nacho +nolan +gretzky +222777 +winston2 +loshara +shailesh +scooter +nathan7 +12021985 +sasuke13 +zacatecas +130990 +qazwsx123456 +cameron4 +bryanna +mahalko1 +rainbow +2fast4you +gorda1 +jennyfer +tucker01 +bubbie +sooty1 +chicken6 +editor +faith01 +serious1 +laluna +198666 +finance1 +fussball1 +january9 +pla +tigers01 +zachery1 +ilovey0u +kirikou +jordan1234 +brain +12031203 +21031988 +990099 +110689 +rangers123 +princess28 +pickup +head +godslove1 +brandy01 +steeler +goodlord +farscape +raven12 +20052006 +matchbox +jonathan7 +hannah21 +250987 +198520 +sagittarius +springer1 +cowboy123 +tampabay +stud +ttd955audg +161288 +thinkpad +theforce +rampage1 +babydaddy1 +bryan12 +develop +dumdum1 +281 +5201314520 +230590 +sunshine14 +jasmine09 +jupiter2 +240688 +johnny13 +jeannine +ghfdlf +linked2011 +140689 +shawnee +001978 +12101988 +joseph21 +chris88 +121982 +headhunter +lovepink +220486 +2511 +smurfs +lozano +rhjirf +ariadne +lfybkrf +dash920 +fairytail +marky +unicornio +lambofgod +84569280 +fucklove2 +austin14 +lalalala1 +snowdrop +yygjmy1984 +twoboys +tig +560038 +ger +pastel +260690 +240485 +iloveme7 +tbilisi +151287 +kylee1 +poderoso +cupcake11 +cutie! +blondi +sunshine77 +scooby13 +elnene1 +netscape +cc123456 +121980 +sports12 +john316 +greenday3 +pelon1 +1110 +25101987 +1331 +raccoon +231084 +justin1234 +060688 +marybeth +kishan +tylers +851216 +12101987 +purple07 +100189 +heritage1 +thunder3 +boots123 +climbing +andrey1983 +reece +navidad +1957chevy +13121987 +golden12 +220789 +smiley2 +rachel13 +250689 +dragon. +adamek +251289 +bugsy1 +110188 +paxton +tianna1 +14041987 +4angels +brahim +gavin123 +140292 +elizabeth1 +chicken22 +awdawd +what12 +10111990 +150389 +wutang36 +juicy123 +mymail +paramedic1 +nbvjirf +skate101 +beth123 +120883 +200789 +400078 +football78 +patrick13 +north +ravinder +131086 +doberman1 +kristie1 +triple6 +mp3player +wert12 +angels +carino +100787 +angel637 +fraggle +asdfgh7 +thomas08 +dude13 +flipmode +deeppurple +1708 +colegio +bojangles1 +sector9 +biteme123 +baseball +tarkan +sony12 +tobi +danny7 +123qweasd +nigga! +ajcuivd289 +120285 +misty2 +sampoerna +251086 +superstar3 +antigua +mallika +210187 +bibles +booboo01 +joseph5 +levi +usausa +football35 +hennessy +100386 +aa1234561 +airwolf +nautica1 +tekken5 +lauren7 +dragon64 +sassycat +ilovemark +4204life +smokey3 +gerhard +shadow. +gwada971 +barbar +brand0n +hickory +ballin5 +amigos1 +121992 +helmet +kingofkings +chacal +mercer +tmobile1 +mayumi +james06 +sexy89 +julia12 +silver13 +131290 +tigerlily1 +reverse +lovers4 +ashley88 +1q2w3e4r5t +jedi +050690 +iloveyou4e +009900 +121278 +kimber1 +240590 +12361236 +andy11 +alex03 +2w2w2w +gregoire +cerfcerf +ikenna +arlington +2kool4u +gizmo12 +bhbyf +section8 +titus1 +green101 +ttttttt +glorious +alexis22 +20071987 +ulrich +redfred1 +libelula +141186 +mustang11 +samsung01 +gumball +jesusc1 +1313131313 +serafim +10121987 +1alexis +lamborgini +patrick01 +felicity1 +jxsgx2yd87 +smilla +achilles1 +fiatpunto +bananas! +130680 +policy1 +gohan +ilovebrian +drunk1 + +ratman +chandra1 +230486 +654852 +perla +imcute +joebob +bootie +pflybwf +15121986 +aggies1 +101183 +santorini +firebolt +22121989 +warthog +gunjan +charlie69 +nathan06 +ultra +150588 +sweety2 +bone +vanessa +kikiriki +boomer +130389 +vale +angel0 +crazy14 +w00tw00t +unhappy +prince11 +taylor06 +5t6y7u8i +mexicana1 +facile +lovely6 +oyster +shadow101 +sai +summer03 +king24 +mayang +waswas1 +q123q123 +joshua16 +210486 +781227 +prince +z: +redsox2004 +pimpin5 +hottie08 +toxic +13031991 +04041988 +sarah7 +024680 +140988 +rabbit12 +120282 +cutie08 +takamine +fleming +babyboy08 +ilovekyle +doritos +251290 +12061990 +pinkey +dude22 +checker +qeqeqe +vfpfafrf +meganfox +heart2 +230586 +socom2 +maggie5 +hotness1 +coco10 +fghfgh +1100 +wowwow1 +kamlesh +obama1 +john15 +dallas23 +amigo1 +091 +nike11 +redsox33 +furious +brittany10 +bridge1 +sammy6 +karla123 +159357852 +popular1 +19521952 +vicki1 +donuts1 +wiccan1 +present +melbourne1 +ralphie1 +2255 +p@$$w0rd +181088 +cody1234 +121080 +zxcvbnm2 +111287 +vinny +destiny08 +300688 +mygirls1 +thesims3 +rocketmail +ilikeit +green1234 +hoochie +ulysses +198719 +110685 +241190 +chicago +qwerqwer1 +honey22 +elizabeth. +england123 +qg9543bh7 +totti +jinjin +hugo123 +999666333 +zack12 +marwan +sk8er4life +williams +austin06 +privat +654321m +merlin01 +staind +mellow1 +246824 +260488 +alexis14 +brutal +anarchy99 +modem +jorden +alex04 +havefaith +sydney +wayne2 +guitar! +down4life +3003 +newbaby +231285 +cet333333 +david09 +fishin +shredder +14121987 +150888 +links123 +specialk1 +10121988 +deeznuts1 +120884 +12345aaa +1dontknow +alanna1 +lolwut +barbie13 +199119 +jeanluc +iamtheman +luke12 +dog101 +rayane +barbie11 +happyboy +sissi +non +210191 +hamham +angel98 +horse2 +tratata +autocad +bisounours +dantes +mowgli +alex1991 +blessings1 +leslie123 +14041988 +des +100685 +exercise +19761968serg +03 +king101 +pfchfytw +lovelove2 +vick07 +pakito +benidorm +1117 +sol123 +allison2 +marilu +560047 +daisies +danielle13 +400054 +aaabbbccc +1912 +zaq!2wsx +ajtdmw +bigapple +dj123456 +fujitvpass +yellow6 +binbin +sandwich1 +150788 +thankgod1 +120289 +pdq4rv +raiders3 +sandal +vip123 +250584 +101191 +3amigos +airjordan +emily7 +mcnabb5 +100286 +owens81 +kazuya +211188 +g1234567 +vfhrbpf +optiplex +aerobics +crusader1 +bigcock1 +a13579 +1tinkerbel +regional +cupcake! +olaitan +rules +dicembre +pussys1 +terri1 +210386 +bucks1 +jayvee +221177 +cagliari +zooyork +jirka +admin2010 +denzel1 +villegas +chrisbln +mommys +angel96 +antonello +amarillo1 +horses! +220686 +scott12 +jordan69 +kittycat2 +nicole99 +fuck.you +redbird1 +christ +lucy01 +studmuffin +carroll1 +govols1 +elamor +destination +cocolino +cashmere +artista +abfkrf +14071987 +palomita +mari12 +blue92 +12345678g +qaywsxedc +yuyuyu +23041987 +blah11 +560016 +tyler23 +brooke11 +02061986 +246890 +zackary1 +110110jp +02021984 +dolphin13 +mary1234 +hawkins1 +lucile +hottie#1 +beatle +taylor16 +210989 +kernel +signal +kookoo +151086 +198555 +mullen +rose22 +emilia1 +murphy12 +teenager +motor +dreamer13 +qwertyuiop +skate4 +123123w +casper +almeria +koala1 +140285 +elmo13 +cordelia +liebling +erickson +hunters +iloveweed +polpol11 +121082 +22121987 +michell +harini +abidjan +americana +ceaser +pitcher +lily12 +sandra2 +glasgow1 +cokolada +midnight3 +conejita +kilimanjaro +_ +tiffany7 +harley22 +dumbass2 +tiger14 +101077 +honey5 +choupinette +rowing +130888 +pretty +1009 +anonymous1 +11111111111111111111 +cocaina +wolfwolf +carlos +josette +nymets1 +tweety22 +1941 +hawk1020 +12345asdf +assfuck1 +horse12 +14021992 +ginette +131289 +25121986 +speakes +kaushik +federico1 +hamsters +231185 +523523 +jedimaster +pelangi +201190 +skibum +diamond9 +bandido +22041987 +rocking +doritos1 +hollister4 +270790 +130587 +buddydog1 +samantha8 +tweety16 +buford +8989 +rebecca12 +fatass123 +babydoll2 +raiders14 +darlin +tagged +ferrari123 +bubble12 +140286 +zezette +johnmark +tank123 +iloveme13 +shazia +251287 +trevon1 +01011976 +jessica07 +racheal +11121985 +ab123456 +110684 +password96 +p3avbwjw +brandon17 +jonathan +donny1 +slacker1 +victoria7 +48624862 +chad123 +myspacesuc +clockwork +westwest +syracuse1 +1nternet +jackie +housemusic +austin23 +connor2 +celebrity +demola +serge +alex1997 +music09 +ghjghj +lost4815162342 +eight +jackie11 +vjhjpjdf +kosovo +11021987 +fifi +fastcars +rrrrrr1 +120984 +13121312 +220990 +imtheman +141287 +andrea10 +summerlove +willie2 +1112131415 +bettis36 +261184 +kenny2 +120393 +250888 +haider +makelove +280688 +shadow24 +beer30 +110385 +271088 +andrew24 +trish +player7 +forbidden +lokita1 +01031980 +jasmine! +12121983 +02061987 +carmelita +satelite +loverboy2 +++++ +james101 +19071988 +ndacebx2wx +lifetime1 +monkey89 +120782 +111090 +chingon +lost123 +baylor +think1 +bigtime1 +skaterboy +bluenose +midnight +400005 +cj1234 +100990 +1410 +1234554321q +25051990 +cute13 +101185 +developer +bachelor +260188 +iceman12 +samantha10 +dredre +kucing1 +homeless +250989 +manutd99 +piston +123a456b +monet +090987 +pink25 +latrice +aeropostal +poptarts +trading +tink11 +turion64 +susan123 +marley123 +dollars1 +bubbles22 +dildo +headache +220485 +tookie1 +fifa07 +godisgood +sfring31 +auto +coffee2 +madison05 +naveed +110190 +wholefoo +dragon17 +starfire1 +santacruz1 +tigerlilly +shadow18 +030405 +basketball +sensizim +geegee +jasmin123 +07 +mammoth +arsenal2 +1qazxcvbnm +pen +qwsxza +mickey21 +210685 +20061986 +michael20 +verito +chaos666 +player5 +261288 +14021987 +maries +12101986 +spades +green88 +alibaba1 +iloveyou27 +popo12 +mina +charles12 +wannabe +chewbacca1 +dr +17ciao72 +1elephant +oskar1 +14921492 +hondacrx +lottery +maria7 +101078 +kane123 +karol1 +4seasons +goofy123 +pretty13 +258654 +lyndon +comfort1 +12101990 +hamish1 +napalm +linkedin.com +karizma +green01 +na +130687 +justin19 +cristovive +100788 +nettie +666111 +coincoin +emily5 +star77 +espanol +honey11 +i234i234i234 +veteran +binky +10121991 +020890 +3blindmice +govind +dragon66 +winfield +230686 +230788 +famous123 +king09 +danielle! +peace101 +labrador1 +1130 +colby +gothic666 +101292 +jonah1 +130189 +madcat +chitown +mandarinka +trout +tijger +maria22 +edith1 +color1 +joseph08 +shimano +guccimane +20021986 +1lakers +clueless1 +kalimera +commandos +nieves +karthika +conan1 +mario66 +seraphim +101098 +babygurl11 +current +escaflowne +freddy12 +bigboy23 +jackson10 +201089 +saibaba1 +mouse2 +110583 +joshua8 +damola +yourface1 +burbuja +elephant12 +juan316 +110584 +family +sweetie12 +251185 +danger123 +120291 +vsijyjr +0404 +shit11 +kamikaze1 +bigtruck +110691 +ileana +katka +bongo1 +215487 +sammi +buster21 +oscar22 +2kitties +12321232 +azerbaycan +myspace007 +200990 +geology +tony22 +10031987 +ryan21 +10121986 +deepfrequency +161188 +13051986 +kelli1 +121006 +daniel05 +chobits1 +guitarra1 +freeatlast +samsung11 +loveme10 +ciaoo +halo33 +nanny +nana13 +121182 +sexything1 +mu +fuckitall +140488 +loser69 +horses11 +ilovemydog +271288 +arsenal +120681 +yellowstone +andre3000 +michelle15 +250890 +ganpati +lovem3 +macedonia +delldell1 +me4ever +daniel25 +crazy! +invalid +bella1234 +andrew05 +winner123 +izzy +qawsed12 +zaqqaz +.ktxrf +khushboo +310000 +d12345678 +171285 +maria3 +201005 +puppy101 +martial +sk8sk8 +exclusive +020689 +please12 +qaz123qaz +naenae +perla1 +cena12 +jesusrocks +12081988 +stlouis +mortalkombat +ranetka +100101 +brandie +25121989 +novikov +20051986 +dominican +sexgod +12332112 +jonny123 +annmarie1 +mathias1 +doorknob +june08 +spiderman6 +banan +02041987 +230289 +love85 +220386 +radhaswami +locker +smile7 +warrior2 +strength1 +rap123 +ellabella +shorty16 +superman09 +star88 ++++: +onions +arsenal7 +jasmin12 +yoyoyo123 +futura +124 +brandon18 +musician1 +mike09 +twilight4 +ferrari360 +shay12 +echo +yourmama1 +woofwoof1 +mami +3kings +211289 +holyghost +horacio +naked1 +complex +stella +danielle11 +myspace19 +bud123 +chicken13 +ghbdtn +bruna +treetop +iskandar +america +kev123 +espinoza +sesso +yoohoo +live4ever +morning1 +shinji +12011987 +laxman +daddy10 +kaiden +great123 +isabella12 +chepalle +piscis +13121988 +clock1 +oscar01 +0cdh0v99ue +greyhound1 +serg +cassie11 +100785 +smalls +seamus1 +mounir +milosc +456789a +140690 +jazzman1 +peacelove1 +mary13 +samael +iloveangel +paint +shorty4 +pingping +19091990 +pinklady1 +fly123 +151088 +final +football36 +bella7 +171189 +number15 +211290 +110484 +12031987 +ranger123 +renee12 +buttsex1 +shyanne +constant +170589 +cf +123asd123asd +alyssa13 +dave12 +maximum1 +pompey1 +diamond01 +australia +salmo23 +211186 +241187 +parveen +jagoda +jackson4 +alexa123 +bladerunner +1cherry +vivere +u6e6r9hwix +20021987 +cheer10 +snoopy22 +deputy +waleed +albania1 +wind +vfy.yz +smokey7 +kiwi123 +hereford +redfred +fuckbitche +pippopippo +andrew09 +tiberius +560085 +family06 +sathish +stargirl1 +keyblade1 +21121987 +ganjaman +ashley101 +korea +katlyn +flower +tyler08 +sanfrancisco +cupcake13 +mediawire +callisto +123jesus +reeves +yfcnz123 +panties1 +bianca123 +rhubarb +raiders18 +newports1 +cookie +qqqqqqqqq +iloveme. +a333444 +140788 +210185 +lizzard +pink77 +meriem +13121984 +230690 +l0veme +cyber123 +12121982 +hospital1 +1tunde +motion +browndog +speedy12 +life12 +345 +130985 +ijeoma +shizzle1 +magellan +buster! +n1gger +manuel13 +230889 +gulnara +porto +matt69 +baby99 +sarah3 +hsm123 +271 +11121986 +emoemo +luna12 +gumby1 +92702689 +12081987 +purple +grandam +111182 +tropicana +1killa +ihatelove +boat +basement +undefined +01011993 +shadow08 +poker21 +flowergirl +steelers2 +120983 +summit1 +dave1234 +jose01 +mymother1 +любимая +testqa1 +aviator +por +peaches7 +w1968a +koleso +dimon +karissa1 +blade55 +summer11 +любимый +licker +green! +sailboat1 +fast +nick101 +1dallas +bennie1 +alana +911111 +selena123 +jabroni +rubens +rfkbyf +foxhound +vfrfrf +ilovedaddy +money77 +mustang89 +131285 +d85lwz0zjs +morelia +momdad12 +lady01 +amanda4 +230288 +rrrrr +playing +carmine1 +twilight09 +181188 +02021990 +ttt +prowler +shree420 +lianne +funfunfun +angel29 +au +301188 +murphy01 +zachary12 +butt123 +mariah12 +1scooter +mas123 +vivienne +rolex +211286 +natedogg +trinity +261286 +hoops +splendor +carlie +789456123q +coffee12 +ren +ladybird1 +freakshow +23101987 +block +jobseeker +15101986 +jamison +12031991 +100485 +20021985 +sanya +bigbob +jordan04 +600040 +008008 +lover16 +shortcake1 +roc +141086 +varanasi +147789 +23021989 +violeta1 +240388 +fuckyou17 +blessed3 +fiat500 +urlaub +amiret2015 +sonora +striper +110683 +princess77 +210788 +kenneth123 +spooner +225225 +mingus +sasuke2 +10011989 +alphabeta +twilight7 +joe1234 +pasadena1 +rhythm +hillcrest +shirin +ckjybr +fifteen +durham +thinking1 +united99 +mouche +131188 +trustgod +badgers1 +archangel1 +jacqui +bluedevils +bogey1 +qwerty87 +fuckyou00 +angelus1 +saywhat +videos +brandon +504boy +281281 +101181 +broken2 +sac916 +240988 +230787 +11922960 +190788 +charlie23 +september +maracaibo +rachele +dopey1 +mustang06 +juanma +lucknow +josemaria +260388 +joshua6 +opennow +klingon +narnia1 +120692 +220786 +starwars11 +daisymae1 +0147 +computer01 +1newyork +150987 +spliff +bitch4life +bullsh1t +beauty123 +reddevils +14021989 +jakester +newera +7e9lnk3fco +chelsea5 +william23 +greatman +junior +101095 +elite +ballin07 +dildo1 +mariaa +240489 +03031988 +avangard +pongo1 +rosamaria +19031987 +ilovejess1 +profesional +z123456z +daisy7 +hewitt ++ +226001 +shawn12 +246801 +acoustic1 +pushok +100287 +franko +lin123 +krusty +walnut1 +america3 +barclay +sheba123 +lssy123 +pookie3 +beauty2 +bigbucks +priora +matmat +210787 +honeykoh +13031990 +spectrum1 +hot101 +chicken8 +vsjasnel12 +punk77 +yfcnzyfcnz +232629 +bully1 +antonov +clint +12151215 +jasmine23 +111110 +191288 +gendut +ja +700007 +141285 +paola123 +gabriel3 +dealer +tucker +wishes +888555 +camprock +050590 +poohead1 +garima +america +mmm111 +carolina2 +kisska +pink99 +1stunner +02031987 +105105 +bigboy13 +glock17 +46709394 +planner +110191 +natedog +fruits +maria14 +lake +311288 +monteiro +goodjob +mum +151190 +198325 +197200 +clown +azerty1234 +skulls1 +christian8 +mercedes2 +hot2trot +barnaby +green55 +crown1 +fla +bigguy1 +271190 +250688 +gio123 +monkies +warhammer40k +steveo +170288 +0911 +sohail +10051987 +daddy6 +10041991 +freedom01 +klootzak +indochine +dimension1 +kyle11 +alesana1 +mutiara +chauncey +model +hentai1 +kids1234 +antonio3 +150188 +250790 +alex2007 +joaquim +byron +131190 +berlingo +beamer1 +kaleigh +spiral +mahogany +101182 +22051991 +10111987 +highlife1 +ganeshji +rockin1 +toblerone +jahjah +soccer95 +candy! +justin88 +211190 +221282 +camero +171188 +passed +julien1 +111284 +masha123 +marvin123 +100887 +1ck75iflga +nayeli +bellevue +baseball00 +joshua04 +200689 +cowboys5 +swingers +yogibear1 +something2 +options +tony23 +241090 +janna +willow12 +badboy13 +171171 +12101989 +garret +andr3w +shawn2 +moremoney1 +joan123 +charmaine1 +100100100 +jakers +morgen +230488 +original21 +kelsey123 +qpqpqpqp +destiny9 +sinbad1 +ilya +moon12 +death101 +rotten1 +271189 +10101982 +20121988 +fuckyou15 +kostas +deaths +luciano1 +stratford +130488 +shayna1 +letsplay +blackcat13 +johnwayne +drake123 +roy123 +120185 +poi +baller32 +elmer +lucylu +290688 +221284 +shadow07 +chowder1 +10251025 +aq1sw2 +zildjian1 +grapefruit +trailer +pravin +fuckit123 +mini123 +18021988 +wiktor +yfcn.irf +jennifer! +teamobebe +checco +policy +legends +5201314a +twilight11 +fontaine +iam +train +pelikan +babymama +volvov70 +050290 +hackers1 +rewq4321 +gizzmo1 +luckycharm +let +retarded +tanechka +jimmys +12031992 +moustache +kolade +dogpound +753951456 +4getmenot +monica13 +ilovejake +aceracer +framboise +crazyfrog +130684 +yzerman +steph12 +10051991 +apples3 +angel111 +sunbeam +douchebag +killall +epiphone1 +anal +gitrdone1 +horsey +120591 +football65 +10051988 +phoenix602 +trustme1 +carmella +monet1 +green99 +twinkles +melancia +southpaw +ilovejb +2104 +210889 +goo +bigdawg +auction +horney1 +starshine +160486 +150889 +music23 +geography +purple101 +100185 +bru +lilly12 +june07 +28091992 +tony01 +bushra +jumoke +babyg1rl +240589 +03031987 +01470258 +bolton1 +loreal +220989 +marlena +taetae1 +yyxthh8j9k +wicket +crazy6 +peralta +010182 +sridevi +corncake21 +gossip1 +star99 +paradigm +bigpapa1 +noaccess +bridgette +221184 +kingofking +vfrcbvec +mensuck +hao123 +1patrick +20031990 +151289 +southeast1 +danny11 +glock40 +massacre +fucklov3 +enfant +190588 +imcool2 +111086 +nomar5 +concordia +arsenal01 +lbhtrnjh +coldbeer +m1m2m3m4 +201188 +good12345 +fil +figueroa +movingon +1pretty +021090 +flanker +drama +superior1 +130489 +little2 +nba123 +quimica +fuckoff13 +infernal +eric11 +softail +becca123 +gohan1 +120184 +221100 +220787 +rachida +gfhjkm12 +wenwen +yahoo11 +gorila +quest +heather11 +makaveli7 +peter2 +katie01 +keeley +23121988 +soccergirl +aaaaa6 +240990 +5thward +180889 +140787 +p@55w0rd +cookie6 +loveme14 +vlad1995 +samoht +passwordd +02081988 +master666 +150586 +cinders +smoke123 +198112 +saw123 +jodete +pasword123 +smile5 +lietuva +venere +abudhabi +inessa +fire911 +virago +2013 +fred11 +pinkpink1 +oneway +makenna1 +1father +14101985 +240689 +natali +molotok +21121989 +bertie1 +sammie123 +rayray2 +berries +272829 +holla123 +smile11 +kuba +malang +100587 +brandon69 +celestine +basile +chloe01 +garnett21 +poopies +250787 +superbowl +yecgaa +12071990 +nonstop +max2000 +d2itsr81jo +puppy7 +fifty50 +maggie08 +tunisia +mustang68 +skiing1 +skate5 +chasity +shrimp1 +james19 +bear13 +kira123 +michael99 +sistemas +mandie +dorado +700700 +rockies +210790 +fxzz75$yer +sinner1 +69chevelle +pantera666 +cutie07 +bogoss +hahahahaha +alhambra +mental1 +baby2006 +10121989 +147852369a +taratara +121184 +aa1111 +1qazaq1 +assunta +02071987 +211189 +mike88 +zoosk123 +ramrod +holger +lover9 +lokesh +124816 +tigers7 +lilly2 +220584 +tamanna +220685 +sxuaiehatp +azucena +choose +ghbdtnbrb +daywalker +zoey123 +tigger99 +famiglia +pimpster1 +princess33 +cutie6 +sonny123 +111190 +160288 +123456789aaa +arigato +thinkpink +marimari +sexy28 +steven3 +mizzou +15121987 +hitomi +toluca1 +jannah +hidden1 +110485 +cookie9 +870621345 +love247 +mahmood +303303 +afrique +261185 +irock2 +suckit123 +flower6 +buttmunch1 +britta +951236 +joan +joker23 +daycare +05 +1234512 +21051987 +mylove01 +tigers13 +01041988 +fling123 +cioccolato +koolkat +gordo123 +banana7 +19101990 +tbone +brooke01 +punky +yomama12 +198777 +12331233 +01021985 +josefine +gators15 +pierce34 +bradshaw +prout +toilatoi +125 +1person +240986 +24091991 +17121987 +photos1 +bulls +ghana123 +320320 +dreamteam +fetish +chien +johnson48 +hockey24 +kayla01 +derecho +tiger101 +2310 +tiffany3 +bigboy7 +carter12 +mustang95 +qwertyasdf +filipek +sashok +chichi123 +alicja +flanders +121979 +35353535 +pretty5 +bergen +brown2 +kosova1 +130790 +040488 +10071991 +development +juliane +136136 +miamiheat3 +2boobs +planb1 +shantel +newbaby1 +farzana +smokey69 +19051987 +qwerty24 +killa5 +cowboys08 +sinister1 +gfhreh +kevin14 +aaa222 +joshua03 +jordan20 +fairytale +abcxyz123 +abegail +robinhood1 +herrera1 +120893 +letter1 +dontcare +171286 +houdini1 +natusik +111978 +310191 +vova123 +syzygy +laila1 +george22 +wizards +3216732167 +wxcvbn123 +160389 +20041987 +mani +lister +ipod +tanner2 +120581 +dylan01 +killer15 +smile22 +wendys +valdemar +racer +150986 +gansta +mama2010 +game12 +20101989 +davinci1 +suzie +gamble +110044 +kissmoko +220886 +manalo +tigers +111285 +ryanryan +00000p +karl +whitehorse +011 +22101987 +light123 +moondog +odessa1 +201285 +130289 +121981 +12031986 +03031990 +analsex1 +princess00 +bnmbnm +210390 +nikenike +finalfanta +william9 +fslhggi +fight +www333 +hotmail12 +190988 +brittany3 +kiana1 +261187 +johnny3 +виктория +ranger2 +janicka +1914 +200586 +apple6 +daycare1 +cipolla +hotstuff12 +natalie3 +monica +1q2 +2morrow +240790 +211287 +bailee +mommy! +toystory +sexxy +m123123 +1peaches +ashley1234 +zach12 +thedude1 +01061988 +mexico100 +ykvpoia569 +sexy32 +password86 +monkey20 +111111d +17081945 +1daughter +boomer11 +sweeney +lakers13 +221185 +140588 +171088 +23452345 +godis +guillaume +200686 +juarez +filimon +22121992 +tangerine1 +dollie +danny01 +20031987 +wodemima +nathan07 +sammie12 +123pro +140585 +11051987 +myheart1 +moimoimoi +angel100 +mexico21 +austin4 +bluebell1 +230985 +power3 +124563 +tivogliobene +abdul +xbox123 +250990 +younes +lagarto +aquiles +tomika +number123 +fruit +switch1 +160590 +15041987 +bobobo1 +shrek2 +punk101 +annapurna +money12345 +suckdick +collingwood +chocolat1 +madden06 +fylhtq +claudio1 +13041987 +chrissie +misty12 +ducati999 +reefer420 +130685 +25051987 +alliance1 +jimmy7 +10121985 +220889 +marykay1 +fortress +jamar1 +sunshine07 +pokemon4 +marykate +nevermore1 +romans12 +vfrfhjdf +paradox1 +26842684 +juventus10 +good123654 +cfvjktn +250386 +240789 +23121987 +fabio1 +pavement +mark23 +william22 +pogiako123 +vbhjckfdf +monster23 +010390 +221089 +240586 +theman2 +whatthehell +sweetpea2 +bluegrass1 +suchka +jaroslav +amine +dakota3 +alberta1 +peabody +qwerty12345 +dustin12 +7153 +bratz12 +15051990 +linkedin12 +azzurra +mon123 +redsox2 +peluchin +vincent123 +candelaria +10061986 +198521 +121191 +eminem +560095 +le +rabbit2 +karapuz +escalade1 +visitor +laylay1 +angelochek +reginald1 +zappa1 +johnlennon +23091989 +mexican12 +lelewa123 +chuck123 +fucker3 +505505 +270988 +jeter +michael25 +colts +www123456 +paris2 +jake10 +cowboys3 +manju +cutie9 +tyler07 +frederico +hoops1 +200002 +casio +perkins1 +booboo5 +18081988 +741123 +chris89 +6acaxa54be +flower23 +260988 +patricia +passions1 +181187 +shop ++ +doughnut +loop1206ssdsff +pavithra +frankie12 +sameera +220887 +sadiedog +130890 +charlie99 +anette +mustang9 +221285 +punkie +2m66xf2ajt +1й2ц3у +akanksha +barca1 +bidemi +gertrude1 +100885 +barney01 +liljon +fckgwrhqq2 +motorbike1 +2happy +harley09 +bandit13 +dingle +kailey1 +tanner123 +vincent2 +bounce1 +alialiali +workshop +platano +199111 +coelho +jimbeam1 +norma +bigblock +black14 +1danielle +asshole23 +higher +13031987 +newyorkcity +mimi13 +orochimaru +satchmo +patton1 +active1 +sliver +easton1 +gamecocks +sixers1 +140889 +jeepers +bitch06 +michelle16 +sesamo +cygnusx1 +fakefake +dragons2 +kurwa1 +zaq!2wsx +guitarman1 +ritter +fir +milk123 +amir123 +milomilo +281288 +veronika1 +070790 +14121988 +bambino1 +zaza +241288 +joseph23 +hank +trinity123 +sunshine24 +notreal1 +polaroid +zujlrf +whore! +animal12 +endurance +shower +111184 +klaudia1 +thebest123 +fyutkjr +22121988 +joshie +batman4 +jockey +100883 +freedom07 +cfifcfif +140586 +12111987 +myshit +myspace20 +terran +sanford +elenka +trivium +maravilla +victor +cheche1 +10121992 +ivanivan +people3 +p0p0p0 +taylor +kanika +1357246 +candyshop +tayson +natedog1 +130188 +meg +louise2 +judoka +michelle6 +almendra +toolman +meryem +301088 ++ +dragon09 +pokemon8 +apricot +8balls +1budlight +baby91 +havefun1 +120680 +bourbon +funny2 +309309 +chachacha +bobby3 +health1 +willow123 +02071986 +ragdoll +bobby7 +zaqwer +11qqaazz +230485 +kapow +11121990 +openme +angelo123 +jacob10 +0987poiu +waterloo1 +mathilda +280588 +sil +14101988 +2501 +230187 +moinmoin +yamamoto +qwert2 +market1 +fruitcake1 +karamelka +surrender +laredo +anhtuan +itsme123 +butterbean +superman88 +broadband +primera +240488 +230387 +anibal +godawgs +mashenka +250686 +victor01 +karting +crfprf +parakeet +nikitina +retro1 +palomo +monkeys3 +521521521 +savage2 +11021989 +200288 +freunde +zoe101 +250586 +010889 +seo12345 +789qwe +krystian +diamond13 +e1234567 +christian4 +harvey123 +130190 +bionicle1 +21031986 +240787 +lilli +030390 +fy.njxrf +sexyred +w1966a +fuckyou07 +li123456 +22071986 +198822 +lovebird1 +2ealtd3y4y +beatrix +rrrrrrrrrr +princess26 +puffy1 +dutch +taytay2 +turbo123 +asia123 +pimp#1 +steven22 +asddsa123 +pimp420 +flowers3 +eeeeeeee +hatebreed +pad +love1996 +15051985 +amber3 +boycrazy1 +1904 +asd123456789 +240687 +amorcito1 +lovesong +marie6 +250288 +manpower +tweety08 +121092 +080889 +blue02 +artur1 +puppies123 +olidata +jobjob +jaja123 +jellybean2 +101985 +joshua17 +260687 +600020 +mark13 +11031990 +12051205 +bigmomma +400071 +antonio7 +741 +101984 +250488 +280690 +180288 +wentworth +w1967a +toast1 +ali12345 +241290 +15091987 +panasonik +linnea +liverpoo +04041991 +iloveyou* +22362236 +0147258 +fiddle +123456sa +chance01 +caramelo1 +celina1 +261190 +1jonathan +player21 +rugby123 +thomas15 +exotic +n1234567 +02051987 +brooklyn +... +gravity1 +nikolaus +esperance +traviesa +21121990 +110189 +15051991 +elnino +lovely13 +maria +78945 +oliver13 +maintain +elisabet +201012 +reeses1 +chaplin +11091986 +hostmaster +ilovemama +tiana1 +cheer4 +gabriel01 +456123a +123777 +ggggg1 +tonto +tulipano +redredred +tiamat +geirby +rainbow11 +dancer22 +star33 +311286 +destiny +mexico#1 +13121991 +garage1 +claude1 +02031988 +001983 +redcat +mick +kaylie +4711 +camila123 +1908 +291189 +25051985 +longhair +elijah12 +wetter +mattmatt +240985 +toocool1 +duffer +170686 +hunter02 +howell +220220 +scoubidou +bonzai +092124 +25061987 +cornflakes +150990 +12061987 +20051988 +lollie +lucky15 +11041990 +200986 +171090 +02031989 +munich +301089 +1skater +skyrim +230790 +gerardway +101192 +daisymay1 +coco22 +sara11 +love1990 +sincity +22021991 +grillo +psalm139 +alexis06 +miguel2 +waseem +31121986 +melanie2 +hansolo1 +aiden123 +king69 +420time +kimba1 +14021986 +beejay +02101987 +cookie8 +fatass2 +sexy99 +cc1234 +records1 +fuzzball +600001 +jarrod1 +vindiesel +010690 +170890 +123smile +mommy09 +miranda2 +100786 +babyboy5 +111111111a +spiderman123 +hotties1 +110885 +161086 +123123e +tyler! +r2d2c3p0 +steam +w1964a +spanien +coke12 +15975321 +stephie +maxim1 +eliska +squeaky1 +198619 +125689 +katherine2 +ozzy123 +rocketman1 +balls2 +vaseline +andree +140686 +cabernet +311088 +cameron10 +topper1 +andrews1 +15051986 +kittys1 +rider +darian1 +secure1 +princess96 +kbcbxrf +brooklyn7 +lionel1 +nastya123 +michelle18 +yankees26 +james! +quique +23021987 +binladen +240685 +bluewater +crawford1 +10000000 +291188 +130984 +22041988 +skull +yamaha123 +fuckoff7 +andrew8 +nnnnnnn +asterix1 +cheergirl1 +porsche911 +226016 +cliff +morgan7 +allie123 +frank2 +karola +kitten11 +daisy5 +megumi +weeman1 +23101991 +name +150487 +oliver +10051990 +231183 +seventy7 +kathrin +mbtvibranike +311089 +indian123 +commercial +jay1234 +winter2 +liljay1 +intern +01041987 +heretic +ufhvjybz +good1234 +prozac +230188 +sprout +hunter9 +nolimits +knockout1 +greenwood1 +radio123 +ruger1 +kestrel +robert18 +cyril +001980 +carlsberg +030688 +dbityrf +evgenii +20041988 +asdfjkl:1 +#1love +channing1 +3006 +toby1234 +borussia09 +tanguy +gustavo123 +luckystrike +thomas18 +310789 +legendary1 +charlton1 +19021988 +150689 +blitzkrieg +maulana +theshit +26031998m +ilove5 +jumpjet +diddle +ranger11 +blue27 +kozlova +townsend +moreira +angelika1 +mulberry +250487 +juvenile +ribbit +iloveyou06 +volvos40 +tanja +pepepe +ppp123 +victor +black8 +bella07 +tyler15 +cool14 +dietpepsi +loveyou13 +william6 +100187 +lucky16 +babygirl95 +2512 +helen123 +maryjane69 +200787 +25121990 +198525 +250986 +anathema +sweetie123 +240889 +ruslan +austin21 +ilovesarah +bubbles101 +fastcar +christmas +dagger1 +70chevelle +sasha1996 +ivan12 +aircraft +271087 +111191 +antonin +200690 +250486 +16061987 +lolek +none123 +badboy11 +nameless +donkey12 +rus +16101987 +superman08 +estella +140283 +cazzo1001 +biscuits1 +10061988 +luana +chamonix +sixers3 +fromage +pallmall1 +290990 +112288 +beaker +270788 +breast +nokia6303 +kelsie1 +medic1 +234561 +yourname +susanne1 +mimi11 +kurosaki +vvvvvvv +198625 +080886 +eeeee +purpl3 +presidente +bigjohn +panzer1 +goldorak +kingkhan +iamlegend +raven2 +brasile +jackie13 +wordup1 +qazwsx2 +11111986 +babyd1 +pulcino +slayer6 +belier +robert6 +canary +booker1 +h-town +50cent1 +jeremy11 +11121991 +josh15 +reymysterio +guesswhat +030393 +raisin +10031988 +penguin7 +jackie3 +chocolate12 +mark01 +trebor1 +happyface1 +mapleleafs +zapato +cabezon +leahcim +zxcvbn123456 +123456000 +qazwsxedc12 +agent47 +star18 +34 +barkada +dark12 +cluster +charms +kantot +stephani +kraken +111975 +281088 +raptors +yourmother +gattina +19021991 +shelton1 +yaya123 +ilovefood +roxy101 +rasengan1 +dinosaurio +tyler06 +100290 +optima +grass1 +jerkoff +140890 +20061988 +01021990 +1111111111a +271185 +default_password +pooh11 +sundar +20031989 +lexie +blue66 +abcdefg +terra1 +tree12 +carbon1 +rockband2 +271289 +taylorgang +300888 +hollister8 +zamzam +woowoo1 +181286 +145300 +cyrus +princess#1 +140388 +1marine +money17 +12345678n +demonio +dragster +281287 +110286 +crazyman1 +cheese23 +1lovegod +201085 +lucero1 +america5 +cheese01 +freelove +neverdie +meaghan +pokerface1 +eagles7 +joh +kelsey2 +310189 +pants +edward22 +dawkins20 +90909 +tink101 +122987 +dinmamma +123bitch +annaba +paparazzi +killer55 +fake1234 +darkness2 +010388 +250988 +12081990 +130986 +mark22 +123456777 +bongo +griffith +plokijuh +tijuana +20121990 +honeyb +25101989 +hello15 +boomer01 +justin03 +bullseye1 +changeme123 +barbosa +260586 +sophia123 +jollibee +a88888888 +baggio10 +2pac4life +brenna1 +cyrille +120392 +erik123 +231181 +110063 +130187 +23051991 +tweety15 +mustang13 +workout1 +110892 +sexi123 +clear +ubnfhf +softball18 +playboy! +princess91 +chateau +marcella1 +nokia3210 +mercedes12 +iloveallah +220292 +123321qw +150988 +blandine +123usa +1019 +281190 +porn69 +1qwerty1 +20061987 +1love4me +orioles1 +110383 +hello55 +joanie +monte +dbrnjhbz +funny12 +nokia3230 +im2cool +green24 +jimmy3 +roshni +tottigol +150787 +121293 +020788 +gears2 +rose14 +mybuddy +carrots1 +140590 +160589 +260588 +cucumber1 +02031986 +02041991 +rachel! +angels +starstruck +wuschel +checkmate1 +vlad1998 +stamford +110785 +megan11 +daiana +310310 +200989 +eagles01 +130887 +rfnthbyrf +151183 +soccerstar +characters +caterham7 +12061988 +wilma1 +heckfyxbr +icecream3 +rosey1 +11061987 +sergiu +peanut08 +ballers1 +vero +ranger +010183 +windstar +140886 +brotherhood +experience +050689 +boycrazy +lefty1 +brooke3 +mahalcoh +willie123 +aristotle +golden123 +loveyou22 +nyc123 +098765432 +17071987 +alphabet1 +skater15 +1beautiful +skyline34 +4christ +shades +4040 +matthew07 +aniolek +xavier2 +lullaby +drifter1 +yahoomail1 +aftermath +230285 +heather! +insight +sultana +jasmine07 +rosa12 +mamont +moneyy +charisse +wilson12 +laurel1 +lighter1 +password03 +barbie3 +200788 +arsch +bolinha +scofield +nicholas7 +161286 +alisa1 +andresito +pass_word +casamento +fujifilm +150288 +alex1987 +30041991 +candie1 +500018 +kevin +persia +steelers6 +imgay123 +hecnfv +thegirls +11081988 +14785236 +joker7 +candies1 +westbrom +130787 +roxy1234 +scandal +444555666 +mustang08 +saphir +grape +color +01031988 +12081991 +gotigers +19101987 +chelsea9 +money18 +matt23 +werwolf +мамочка +nigga4life +25051988 +orange99 +kimchi +usmc +gunbound +grandma5 +loser14 +ashl3y +julian +ricky12 +portos +dancer4 +198519 +1115 +161085 +cocoliso +destino +10041987 +rocker123 +051288 +bigbaby +daddy22 +jeff1234 +kirby123 +constance1 +120882 +saniya +tinhyeu +chapman1 +angellove +salame +a1234 +vodoley +locos13 +198322 +23021990 +poobear1 +super3 +crazy22 +greenbay4 +000888 +needjob +1tiffany +10041990 +ilona +18811881 +vbktyf ++ +481516 +151087 +230287 +08154711 +040985 +singles +lauras +200389 +170590 +nicole1234 +jerald +020686 +calculus +12071988 +cloud7 +undertaker1 +121294 +zxcvbnm +never4get +bailey08 +dixiedog +dashadasha +johnny11 +jk1234 ++++ +nicaragua1 +1iloveu +wilhelm +harley02 +noone1 +120683 +truman1 +130486 +celeron1 +stephany +toledo1 +jump +your +austin02 +flaco1 +fallout2 +blunt +23031991 +bluegreen +natalia123 +jessica20 +blazers1 +merchant +170585 +baptist +pimpin! +andyandy +saraswathi +aaron11 +10081987 +danmark +thomas07 +ninjas1 +sam123456 +wakeboard1 +22031991 +mircea +11031991 +jacob7 +mega +20041990 +250190 +malossi +little12 +09091987 +sananelan +chicago7 +10011992 +shane12 +popcorn5 +porsche944 +michael05 +angelica12 +110029 +110591 +nekoneko +anya +killer. +manumanu +olayemi +250189 +luismiguel +signup +cookie. +131185 +baller33 +4babies +05081988 +harley! +dora12 +alvaro1 +fatima123 +120580 +21041992 +pastis +elgato +12345678w +fel +onizuka +tictac1 +nathan22 +kamal123 +ugly123 +bharath +sebring +diamond10 +myspace27 +nelson123 +barbie7 +120480 +220385 +123rf +140589 +princess03 +210189 +2015 +force +fuckyou77 +jessica19 +02071988 +lessthan3 +loveangel +damian12 +150289 +laika +220885 +061 +scooter5 +honest1 +underwear +199100 +elenita +monica01 +forever8 +mindfreak +11111987 +niewiem +ss1234 +goku123 +vjflkig522 +justin20 +twokids +popcorn11 +050587 +a789456123 +1passion +140587 +14011987 +444666 +13121990 +15081990 +billbill +littleman2 +vatoloco +content +guccimane1 +180590 +mak +qqwweerr +link1234 +290488 +single! +yfnecbr +david! +nietzsche +choclate1 +14021985 +diablo11 +leah123 +caro +100492 +bobby11 +foreverlov +qweras +blackdragon +22091991 +booboo69 +pazaway +yellow9 +twitter +adelka +demetrius +woodward +internacional +170688 +sheree +170488 +star07 +ranita +tanger +mysecret1 +120283 +simba2 +isaiah2 +titou +bless +w1963a +201080 +cricket123 +10041004 +3ehd1ixi1y +malayalam +101011 +ktm125 +maggot1 +siegheil ++ +12041986 +hello09 +100884 +angel2007 +sharky1 +16101988 +caribou +197575 +9988776655 +07071988 +cherry22 +250489 +all4him +alice12 +400004 +snooker1 +141089 +saab9000 +wanadoo +gizmos +140990 +super11 +wargames +cthuttdyf +models +q1w2e3r +lampshade +111979 +przemek +hooper1 +23121986 +bilbao +19051992 +sexy66 +200685 +smirnoff1 +asd123asd123 +vette +mko09ijn +bigpapa +static1 +cfytxrf +thuggin1 +fish11 +gfhjkzytn +abc789 +12021991 +getrich +samarth +drew12 +1311 +money55 +yazmin +test11 +benton +skazka +goldmine +albastru +66778899 +201000 +caroline12 +capa +parker12 +manolo1 +justice2 +12081986 +myspace45 +781001 +kassidy +sweetie3 +1kitten +davidd +15121989 +termite +poop90 +evolution8 +brewster1 +18061991 +140188 +241085 +catherine2 +12031988 +june2008 +chino123 +020290 +131090 +20081990 +medium +kikimora +fuckyou89 +diablo +funeral +sad +sexisgood +billyjoe +nokia6120 +spring09 +281189 +10021990 +123456789012345 +bubba5 +mary11 +grease1 +ginuwine +garcia123 +chocolate +mitch123 +play2win +sector +greedy +priya123 +april04 +5858 +mynigga1 +coglione +bigboy69 +bitchface1 +angels4 +ilovehim. +killzone1 +21436587 +anne123 +25101990 +quantum1 +230684 +iceman2 +201290 +6string +gospel1 +essendon +coniglio +ashlynn +johndeer +15051987 +looking123 +rafa123 +consultant +shygirl +metallica9 +lizbeth1 +100790 +daryl +dagobert +maharaja +sasha1995 +triplex +twentyone +170586 +marduk +mickie +lashay +nike13 +sancho1 +rjnzhf +241286 +estrella12 +heidi123 +picachu +valentina +adelante +reckless +221183 +shivers +130592 +190586 +fiocco +onmyown +21021986 +summer77 +aaa12345 +cherry14 +mydog1 +255255 +download1 +raul +leadership +john3:16 +23021988 +david24 +cellulare +11qq22ww +adrian11 +mustang98 +02061988 +amante +cousins +lolman +swordfish2 +angelangel +a102030 +elisha1 +141290 +3112 +hadley +impala64 +200589 +iamhere +251284 +150687 +jody +madame +justinb +10011986 +mariam1 +brandon06 +alternative +261087 +rainbow13 +pickles123 +pimpin13 +tomasito +030389 +14111987 +hannah16 +171086 +tobydog1 +12041991 +11061991 +andres12 +vjq +05050505 +matthew08 +241087 +gutentag +october +ihatelife1 +grandkids3 +13121986 +199512 +300588 +laloca1 +stephanie3 +admin123 +five +carlos18 +150486 +walking +potter7 +120592 +120791 +gfhkfvtyn +hjvjxrf +angel91 +punkass +vfhecmrf +197911 +lynne1 +asshole9 +contessa +diehard1 +taz +carla123 +150789 +oneluv +duranduran +rangersfc +ivanna +150686 +wild +friendofarriane +100591 +ballin13 +mckinley +delores +liljon1 +anna88 +410206 +carter123 +redwood1 +goforit1 +marysia +abhijeet +s7777777 +muffin01 +bigdawg1 +bucky +171290 +19121991 +hejhej1 +jayhawk1 +dropdead1 +210686 +mandi1 +melissa +securite +otis +27101987 +az1234 +edalwin12 +12051986 +thomas09 +jack23 +sirius1 +kamila1 +mommy1234 +reaper666 +woodlands +spot +paulinha +741852963a +babygirl99 +niconico +23051987 +bubbles14 +02021982 +tantra +121183 +mike33 +140389 +20101984 +giada +sergeev +spain +myhouse1 +alfabeta +170388 +cahaya +15041988 +destiny10 +browning1 +230290 +bigdog123 +160890 +rodion +061288 +aqwxsz +grandma4 +star08 +free11 +1crystal +mail123 +100186 +seniors09 +kurwa +210684 +19121986 +claudia123 +pimpin01 +oreo11 +wildone +110592 +quest1 +22552255 +17121990 +asdlkj +lovesucks2 +caccola +shaved +commando1 +vredina +miyuki +blacklab +jiefang998 +mimmo +130590 +moymoy +olivia3 +020389 +finish +fitzgerald +qwerty101 +bowwow123 +100188 +lampard1 +zippo +lovey +11041991 +lazio +040490 +rocky10 +bossboss +cutiepie13 +larousse +jose21 +hunnie +210985 +10121984 +1254 +terrier +sports2 +serafina +banana5 +jacques1 +bienvenue +janeman +170289 +310590 +polopolo1 +badass69 +teodio +chicago123 +ali123456 +deicide +mariela1 +zazazaza +loveee +turtoise +dragon0 +140489 +221084 +javon1 +13021990 +soccer28 +221290 +police12 +18041991 +blackice +270989 +alex1998 +milanisti +mariko +bailey07 +bimbo1 +112212 +golf1234 +56835683 +hallelujah +xyzxyz +artem123 +petey +197676 +cod12qw75rqyi59n +1fatboy +murdock +13041988 +crystal3 +11031987 +987654321m +chopper2 +angels01 +stephen2 +grass +ducati1 +13061986 +20061991 +andone +snicket +cochise +rosemarie1 +pamplona +130891 +hetfield +scooby3 +prince7 +sarita1 +winifred +hopkins1 +confident +justina1 +13101987 +careers +bearcat1 +q1w2q1w2 +020688 +110784 +eunice1 +13371337 +babalu +vfvektxrf +oscar11 +10051989 +dannie +11092001 +rocio +chinky +alex92 +hotbabe1 +skinner1 +dolphin3 +cou +250685 +181186 +240788 +sawyer1 +jess1234 +asdjkl +thecat1 +marites +ma1234 +twins123 +271089 +alex007 +1candy +dasha1 +сџ +101295 +anelka +sunmoon +bustamante +dogboy +160688 +diploma +lakers09 +10031989 +010192 +ripcurl1 +katenok +180690 +220187 +jazzy2 +20021991 +steelers10 +jayden3 +1lovejesus +july4th +olemiss +tori123 +healing +nikeair +gennaio +121978 +assclown1 +scooter1 +getmoney3 +johnny01 +kellys +a22222 +numbers1 +260490 +nalini +240686 +221187 +25121985 +sunshine20 +hockey +zalina +hollaback +taylormade +stefany +berry123 +samantha5 +salazar1 +skillet1 +guitar69 +31121990 +120186 +rehman +04 +aaron13 +gaucho +jesusis#1 +george7 +alf +kallie +rhinos +120383 +walik007 +lemuel +breaker1 +husky1 +rogue1 +alex2001 +scarface13 +11021988 +210984 +mike25 +alex1 +tuktuk +kevin07 +nikko1 +maharani +baby45 +winnipeg +archery +kay +iloveyousomuch +dreamon +bently +gucci123 +dizzy +scissors +touchdown1 +212121a +1234567890123456 +keykey +magyar +roldan +manga1 +12091989 +qwerasd +130286 +malawi +sheridan1 +peaches +ilike69 +alicia2 +helpme123 +lahore123 +allahabad +281290 +regenbogen +23061990 +cheer06 +150790 +mexican2 +sp1derman +tigger09 +198421 +babygirl88 +prague +principal +illmatic +444888 +rafiki +230587 +200887 +nokia3110 +sabado +ventura1 +antony1 +straight +monkey05 +cheer3 +lapo4ka +asdfgh2 +180388 +intel1 +prancer +fuckl0ve +bringiton +boston +171287 +mailkuliev +sequoia +nicolas +kingjames2 +baby55 +anaconda1 +hero123 +polini +gui +edelweiss +donkey2 +fifteen15 +tiffani +reyrey +shuffle +deep +danil +jaylin1 +nigga13 +choppers1 +m654321 +alexis23 +asdasd11 +des123 +fidodido +copper123 +210589 +210886 +aleksey +liverpool12 +milagros1 +millerlite +140484 +basura +wicked13 +horses101 +700001 +74185296 +diana13 +20062007 +110391 +scroll +baseball69 +20021989 +130886 +03041991 +footba11 +kartik +23051990 +peewee2 +mogwai +tucker11 +mariah2 +segun1 +black4 +droopy1 +maybe +candy21 +nata123 +47474747 +260590 +super6 +77887788 +dungeon +mirinda +w +monika123 +123007 +07071986 +mememe3 +playa123 +231092 +nokias +bluegirl +19511951 +nana01 +111183 +301190 +whiteout +gabriel13 +scorpio7 +july04 +171186 +harvard1 +austin8 +02041988 +1dolphin +wwe12345 +lovebug12 +powerade1 +21011991 +galicia +colombia12 +stewart14 +snuggle +tequilla +020282 +starwars1 +301286 +060788 +020590 +allday +02051986 +19071989 +cartier +lamborghin +15061987 +element3 +wilfredo +rfhjkbyf +261090 +cheer7 +belleza +dingbat +1steven +flawless +17121991 +internet123 +130288 +181089 +cosita1 +josh21 +emolove1 +bubbas1 +0001 +1sexylady +icarly +mona123 +12031985 +220186 +hammy1 +adidas11 +251190 +rainbow4 +grandkids4 +aka123 +vendetta1 +13121985 +20051985 +230785 +21051991 +taratata + +azerty123456 +sunshine88 +pasta +v +thickness1 +bigmomma1 +160588 +tweety23 +hearty +april08 +25101988 +abcdef123456 +joker11 +20081987 +alexis +cecelia +260589 +mariane +babyblue12 +joker666 +ryan14 +qwerty25 +joel12 +rubina +hockey01 +passion8 +multisync +bismilla +tomandjerry +lucky18 +int +breakfast +matthews1 +da +loveme6 +mustang6 +jijiji +02031991 +19031993 +261083 +charlie09 +pokemon23 +251182 +fuck1t +bobdylan1 +smoke20 +15071987 +agostino +cuba +williams2 +tigger15 +lelouch +nokia6500 +122003 +310585 +pepper4 +teachers +southpole +friends101 +roxygirl1 +mikolaj +duckduck +a147258 +southside4 +jasmine15 +123456tt +2410 +spaces +gethigh420 +dadsgirl1 +jessika1 +come2me +konoha +metallica8 +dreamer2 +ruben123 +riddle +chrissi +jonathan10 +girl11 +stupidass1 +monkey95 +10111011 +150190 +element13 +nevershout +salavat +050586 +eddie2 +250690 +28121987 +football64 +midnight7 +suckme69 +babe101 +rocklee1 +mankind1 +200390 +199412 +basic +nikitin +hunter04 +uekmyfhf +as0620 +estupido +180587 +dakota10 +egypt1 +winner12 +cioccolata +050788 +250886 +jerrey232x +tallulah +301285 +dawidek +almera +winniepooh +verde +220290 +020287 +1brittany +solnze +deb +hamster123 +sbc123 +f1f2f3 +virgule +12051992 +cardinals5 +198321 +jigger +antiques +000222 +lucky007 +thanh123 +katerina1 +webkinz +hannah04 +22031990 +vfkbyrf +fresh2def +sony1234 +sammy22 +edouard +tigertiger +ralphy +12051990 +henriette +10041986 +loser1234 +taztaz +x60zay0468 +sharan +10091990 +honney +mickey14 +150386 +culture +120991 +iloveu14 +250286 +namrata +234567890 +athome +11121989 +powerhouse +january4 +vaz2106 +@elit-centr.com.ua +georgia2 +mischief1 +hubbabubba +withlove +2014 +300687 +koteczek +pimp06 +fuckyeah +kid1412 +111282 +murda1 +novell +210786 +290788 +robert08 +forward1 +gracie +mangoes +lakers34 +montes +brock +fastball +15101985 +gmail +051289 +freedom13 +character1 +babygurl! +house2 +123888 +love6969 +yellowrose +babyboy01 +froggies +kashmir1 +pebble +wlafiga +erick123 +charis +rhianna +01011994 +fullmoon1 +beepbeep +jack111 +24688642 +getout1 +glamur +darby1 +130390 +ribeiro +bandito +qazxswedc1 +11081987 +sexytime +happy123 +norbert1 +events +deacon1 +11061986 +123456789- +23101985 +maggie +2505 +love36 +15101990 +debra1 +6cxd2x986x +sandra01 +1bubbles +honey23 +makedonija +ladiesman +juegos +06061987 +k12345678 +catalyst +230292 +24041991 +keenan1 +26061989 +1turtle +180588 +puma +friends8 +584131420 +toptop +password98 +nnnn +frazier +liquid1 +pussy! +tiger8 +honda99 +nicki +bieberfeve +animelover +fyabcf +korn123 +311086 +lolek1 +melissa5 +tormenta +monster22 +acquario +raiders11 +zangetsu +juanes +myspace44 +mothers +kasumi +21031991 +arcade +nutmeg1 +rubicon +bonnie01 +geo +600004 +dawg +0311 +211087 +olivier1 +class2012 +22061987 +07071984 +carmencita +11071989 +151187 +100783 +260986 +10061987 +qfcfgda3zx +333000 +babygurl08 +der +ok123456 +dany +22071987 +laylay +flirty +jackass69 +tanner01 +notagain +queen23 +pickle123 +airjordan2 +26101987 +220282 +robert16 +smoke2 +1119 +utyyflbq +gocubs +280689 +stirling +25051989 +mayday1 +pinokio +300690 +buster99 +karaganda +tinker11 +redsox5 +janessa1 +layouts! +timati +030588 +aa000000 +hollister0 +210190 +200187 +prime1 +02081989 +lovelife2 +oluwatoyin +peanut4 +cookie15 +11071987 +willi +hockey27 +sammy14 +240690 +roswell1 +agadir +password29 +s123123 +state1 +alexis05 +badabing +bebe13 +johnny! +caraculo +erotica +memories1 +365365 +sasquatch +18091991 +raffles +spring07 +aminat +hrithik +kilkenny +roxette +ce +141189 +110491 +20031991 +stickman +altoids +1smile +fenix +260989 +123456jj +oliwia +dragonslayer +271090 +25101991 +anhyeuem1 +170685 +faerie +killer24 +shannon7 +abigail2 +1green +hogan1 +carrillo +booboo10 +klklkl +elliemae +rockon123 +240987 +avatar123 +190589 +paulinka +13031985 +genesis11 +softball07 +jesus9 +nathan5 +110882 +loopy1 +muslim1 +father12 +s111111 +carlos69 +anonelbe +egorova +player22 +rodger +261289 +lollypop12 +sa1234 +101094 +14031991 +richard01 +monsters1 +160490 +adenike +ally123 +web +caballo1 +sydney11 +monster8 +pussy22 +furball1 +190789 +13061990 +lalaine +fuckyou24 +yourmom3 +cool21 +kilroy +bluejay1 +281289 +80sbaby +270688 +huihui +stephy1 +13121989 +banjo +jakarta1 +3535 +020687 +pooh14 +allgood +josie123 +stupid11 +mates +te +260691 +morgan5 +quick1 +kanker +12071991 +251285 +bobbys +alkaline +23081990 +seo123456 +renee2 +198723 +lordlord +pedrinho +14041992 +11021985 +240989 +100984 +lucass +ilovehim3 +repmvf +yeahright +im2sexy +aezakmi1 +loveyou5 +souleater +23061987 +lekkerding +ani +120120120 +050988 +underoath7 +double07 +23041986 +smile4u +timberwolf +190488 +chevalier +chelsea08 +dilligaf1 +hjvfyjdf +150886 +160587 +moc.oohay +25031988 +function +300590 +w1962a +love1989 +23051988 +carsten +kin +111177 +bee123 +next +301288 +jsbach +iggypop +barcelona +shabba +21031990 +1eminem +15987 +lucky24 +260190 +green25 +yingying +dustydog +nantucket +tijuana1 +jm1234 +monkeylove +cody01 +iamsexy1 +claudia +celica1 +cock69 +666666s +110582 +screamo +milwaukee +mailbox1 +456asd +crips1 +jordan00 +abc123xyz +181290 +nathan05 +raymond2 +june09 +250490 +schwein +tissot +1943 +paupau +111087 +pisolo +emmarose +xxkk01234 +7u8i9o0p +foxylady1 +carmen2 +domain +kitkit +01021988 +islam1 +ghbhjlf +lilwayne23 +fishtank1 +coocoo +grandmother +setembro +harshita +30031988 +15021987 +puppy3 +asd789 +051 +matrix +02061989 +mario3 +130490 +crispy +100882 +22041986 +05051988 +soul +230891 +198010 +josh16 +13051987 +woe45byzry +diablo3 +p0pc0rn +b1lkeb6711 +12051989 +shit69 +22061989 +guitar5 +kaleigh1 +iloveeric +06061988 +sochi2014 +peoples1 +romeo2 +11111985 +marquez1 +juan1234 +emin3m +hireme +greywolf +millertime +pumpkin12 +football84 +lyubov +kitty23 +ambika +21031987 +thecure1 +tomcruise +12061986 +14051987 +gogators1 +jackson11 +zappa +210785 +junior16 +agenda +mother +qwerty18 +310888 +paulinho +rusty12 +230386 +looking4 +135795 +bammargera +deepblue +wakeboard +upload1 +andreeva +110692 +100985 +juniper1 +colors1 +banana3 +tigers07 +verbatim1 +120880 +131425 +butterfly +madhu +12111211 +merlin12 +spider3 +ole4ka +dukeduke +11011991 +nirvana7 +angels13 +angel. +20071988 +никита +iopiop +30061987 +austin6 +tigers09 +jiujitsu +fatbitch1 +dfcmrf +291 +240487 +asshole6 +10011985 +watch +skateboarding +quinn +oldsmobile +101988 +mirabelle +010788 +cash12 +12081208 +123456ma +buffett1 +chase12 +maruska +13101988 +7788250 +11101991 +jigsaw1 +liza123 +spectre +fvthbrf +sound1 +13111987 +common1 +timoha +19051988 +shorty6 +280188 +baby27 +bitch88 +chinatown +ilovesteve +280882 +12121212a +13101986 +matthew14 +00000000a +baseball32 +bondarenko +twilight +220692 +16041987 +210186 +? +chapstick +18121991 +060789 +liverpool4 +bayarea1 +carolann +zinaida +bulldog12 +adebowale +280889 +slayer2 +1223456 +alireza +superman18 +668899 +wzf2sme498 +24111987 +love1991 +12061991 +20061989 +harley04 +mizuno +270587 +roxy13 +titilayo +hemmelig +ender +12021202 +121081 +10011991 +000000000000000 +cameron11 +renata1 +150785 +yellow8 +1happy +dasani1 +football00 +booger123 +mariah123 +cyber1 +142536789 +adedeji +bella23 +11251125 +maria21 +120191 +12071989 +pochacco +198319 +alex95 +daddy101 +livelaughl +penny2 +boytoy1 +12101992 +cybershot +allahisgreat +jadakiss1 +161190 +albert12 +grace7 +jack24 +napoli1 +folgore +error +hotsex69 +20081988 +02051988 +06061990 +summer9 +hillside1 +161287 +150786 +07071989 +rovers1 +201283 +1shithead +kingjames1 +schools +minhavida +young123 +gtkmvtym +vaz2107 +school5 +andrea. +lilman12 +patty123 +titina + +010688 +welkom01 +tigger24 +pollon +live4love +augusta1 +greek1 +20121985 +170790 +220285 +fredrik +yellow99 +sexy67 +mi +oluwatobi +valenzuela +16061986 +bananas123 +saphire1 +chouette +bleach123 +clotilde +120682 +hawaii +rotary +martin10 +12071987 +210687 +4455 +tabbycat +16021990 +freaks1 +gfgekz +samira1 +tatatata +butcher1 +robert24 +49ers +160989 +199212 +120582 +gam +betina +1midnight +lucky88 +12101985 +bungle +21121988 +tigers3 +198910 +fuckedup1 +100682 +12121980 +vikings28 +tigerman +resident1 +dizzle1 +221091 +mario5 +161187 +250889 +rayray123 +silicon +noname1 +deniss +10021989 +05061987 +271286 +m111111 +horatio +500038 +pleasant +20051991 +sable +241285 +anabelle +modesto +heart12 +avenged7 +240490 +piazza31 +micmic +king99 +2412 +225566 +yomamma +17021991 +frankie3 +claudette +111192 +clarkkent +sensitive +vip +200487 +alan12 +nathan! +161090 +ktjybl +140487 +saisai +090986 +030987 +tamika1 +yanina +shushu +sasuke11 +princess98 +basket12 +manpreet +honda01 +24101988 +160290 +perfecto +daria +google. +070786 +160985 +katie5 +paralelepipedo +maxwell +myspace55 +jayden05 +beau +iliana +070890 +bailey24 +sunshin3 +160888 +19091985 +qwertyuio0 +211285 +nostradamus +deer +caruso +tiger1234 +babygirl02 +twenty4 +thewall +muyiwa +10041989 +pumkin1 +lifeguard +01031989 +camryn +17031987 +sou +bolabola +sensor +myszka1 +101520 +maktub +immaculate +crissy1 +123asd456 +mclaren1 +lifegoeson +shelby13 +cheeks1 +chucha +inlinked +020888 +elpaso +crazyboy1 +shyshy +sos123 +poohbear11 +mystique +khalsa +signin +1234567a +joker3 +email1 +comein +majiajun +homie +161189 +sophie +chicken69 +series +hello +missingyou +pawpaw1 +godawgs1 +kiran123 +pipipi +fonzie +inuyasha +shipping +17101987 +diamond21 +wolverines +leonora +22061988 +271186 +alistair +bullrider +nin +surendra +pennylane +friends01 +feyenoord1 +japanese1 +bottom1 +silencio +andrew. +17121985 +170389 +tigger77 +eureka7 +nessa123 +magaly +espada +isaias +110291 +alpina +piepie1 +papamaman +terremoto +13061989 +vasilek +lilboy1 +crappy +280488 +110290 +sweden1 +888000 +110682 +david8 +sandra11 +15031990 +raulito +18101988 +17051988 +11091989 +dasani +15031991 +4vgyvq46aj +stars2 +humble1 +invictus +quick +159357159357 +rerfhfxf +131085 +11bravo +xoxo +apple21 +12011988 +luis15 +samuel11 +10111988 +delano +sasha11 +corporation +santos123 +melissa1 +annabell1 +5841314520 +1234567890s +twin +13081989 +310586 +jacobo +kisses4u +22041991 +13971397 +frida +virus1 +11021992 +ashley99 +prison1 +bmwm3gtr +dragon07 +230990 +family101 +leslie12 +crusty +devilmaycry4 +141190 +130987 +1number +121181 +andre12 +naruto4 +q1w2e3r4t5y6u7i8 +121295 +260684 +esqueci +mausi +25121991 +19051989 +minniemouse +tulip +canada +pinkgirl1 +harpreet +260290 +nena13 +finlay +jessica24 +lucydog1 +22061991 +4209211 +261285 +pizza5 +01061987 +manuella +251084 +alex94 +wangwei +13051988 +121221 +130683 +errereer +mario10 +futbol10 +football74 +260685 +clouds1 +06 +angelie +quaker +chicken9 +littleone1 +weed11 +love2u +ryan10 +30101987 +trabzon61 +201083 +4everyoung +654321j +phoenix13 +l0vely +kisses! +031286 +a!515253 +1597532486 +icecream7 +trigun1 +hanna123 +kissme! +hockey! +jennifer19 +habana +jack07 +gifted +160487 +valiant +ilovemyson +vangie +eumesmo +peanut69 +snoopy +classical +shinigami1 +hey1234 +computer4 +kiki13 +johnny23 +crazy23 +hearts123 +lan +13081991 +juliette1 +260688 +gen +mayfield +16061988 +april07 +hellow1 +mahavir +automobile +dfcbktr +peepers +pink89 +kenneth2 +sarahs +10101993 +alyssa10 +daddy09 +george10 +28101991 +formule1 +lalalalala +250582 +02051989 +maryjane2 +231290 +channing +abby1234 +001979 +boxster +26061991 +270990 +penguin12 +nicolette +jumping +123456bb +290388 +pants1 +kiki1234 +david9 +softball00 +25031987 +smartass1 +10021988 +20091991 +rochester1 +bitches3 +mamanpapa +tazmanian +nnnnnnnnnn +cuteboy +hallie1 +121192 +20021990 +dirtbikes1 +11041986 +ballin22 +celibataire +washburn1 +fungus +p6264758 +ichbins +fhntv1998 +stupid3 +198110 +7us20 +jesusjesus +beebee1 +bailey5 +777444 +outback1 +231282 +numberone1 +198419 +23091986 +198423 +kostyan +hangover +luis14 +160987 +junior18 +jerkoff1 +jackass! +monster +atlantic1 +sophia12 +holly2 +hyper +limewire +123321fvfv +hombre +auntie +tweety6 +tiger99 +123a321 +dinky1 +blahblah12 +16081988 +micha +141085 +apple123 +290987 +home12345 +klaus +kadett +brody +nachito +1chelsea +315920 +lambo1 +19031990 +mikaela1 +10031992 +johndeer1 +gulnaz +241091 +fuckyou16 +031187 +mymummy +sudhir +buckley1 +vovavova +music1234 +190888 +199012 +oswaldo +amiga +persoff +hallo +040489 +eminem69 +123569 +260789 +100691 +rarara +edcvfr +100991 +thundercat +buddy14 +sabina1 +lakeland +katten +112234 +honza +pink06 +critical +envision +honey21 +goodness1 +morgan22 +05051991 +atlas +tru +badboy3 +swim +getalife1 +12061989 +sureno +gateway12 +atomic1 +jimmy5 +454647 +270873_ +21041988 +21091987 +bigjoe +sarang +05051986 +scott2 +02041986 +11041987 +amoroso +bubba69 +edwin123 + +11031985 +271187 +purple89 +chivas15 +daftpunk +zombie13 +lalo123 +annie12 +21121985 +live2love +faith777 +adidas69 +magic7 +crazylove +maldito +198720 +21061990 +10021991 +lateralus +canaille +forgetful1 +fubar1 +marcus01 +101293 +14021988 +161285 +1118 +appleapple +a1s2d3f4g5h6 +pokemon +happybirthday +kakarot +d54q7xjmhx +fuckmenow +african +cloud123 +210585 +mybabies2 +andrea21 +151283 +kayla10 +holahola1 +13071987 +pizza3 +16101986 +pray4me +juggalo69 +markie1 +kailash +love35 +gangsta101 +tyler09 +pink00 +01021986 +turtle13 +23021985 +020388 +peanut07 +170786 +angel90 +corner +pizza11 +irina123 +a1b1c1d1 +230489 +lvbnhbq +cfrehf +2020327 +lapin +chewy123 +monster6 +louisville +210490 +babygirl27 +17121986 +pepper23 +21011987 +faith3 +c00per +robles +11051990 +1234qwerasdfzxcv +newlife4me +ford250 +freebie +sargent +240186 +78963 +victoria3 +kamera +mautauaja +coc +1smokey +010488 +thibaut +zoozoo +cheap +blood3 +example +gerson +ganesh123 +asd123 +ayden1 +ineedmoney +130385 +offshore +kampret +a23456789 +babyboy11 +101202 +ballin21 +hollywood7 +funtime1 +261290 +sexkitten1 +jennifer21 +23091991 +amber14 +cde34rfv +qwe123rty +alex1999 +01071986 +poohbear5 +100891 +leicester1 +baby94 +croatia +151290 +motylek +coccinelle +130784 +micheal2 +15021991 +turk182 +whatever69 +orbital +280886 +tortilla +hawks +website1 +261189 +231182 +soccer96 +vicelord5 +eleonore +class2008 +111111qq +11081989 +pookie11 +moonchild +100684 +spiderman! +afolabi +toilet1 +jennifer23 +medico +sridhar +tatyana1 +tin +100692 +chelsea4 +210683 +afroman1 +30031992 +speech +maggiemay1 +140291 +basset +brain1 +scoobie +tttttttttt +021089 +cheyenne12 +missie1 +220391 +arisha +include +220489 +321meins +220284 +bitch#1 +1sweetie +volgograd +141187 +cippalippa +shemale +021088 +1nicholas +s1s2s3 +24689 +zxc1234 +04041986 +100390 +stephens +beauty12 +asnaeb +rhino +22111989 +191188 +fkm: +cnhtrjpf +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +antelope +vfvfbgfgf +packer1 +lechat +tweety07 +babalola +421201 +bailey99 +face +sonu +bianca12 +violator +wendell1 +pecker +190590 +charlot +cantor +280388 +000012 +20121986 +30121986 +226010 +lambada +12031989 +book123 +123212 +dragon33 +fairview +hammerfall +morgan! +booboo! +married2 +alex1989 +iloveyouu +summer +dewey1 +nittany +pimp99 +joey13 +zoey +cookie17 +241084 +110384 +irvine +vegas123 +270984 +rockband +161084 +innovation +jonesy +300589 +icp123 +aniyah1 +bubbles23 +15021985 +1234567i +henry2 +amit123 +jeevan +sunnyday1 +10011990 +treble +kimkim1 +njkcnsq +tasneem +cheesey1 +yagami +candy15 +living1 +strasbourg +sin +core2duo +anonim +dulcinea +271188 +mylove11 +12021992 +panda13 +dunkin +321321a +snowman2 +25021988 +12561256 +198424 +accept +fuckuall +swetlana +19031985 +kickboxing +01101987 +eatshit2 +081 +26041988 +ccccc +01021987 +mujeres +fartface +2pac +doubled +momdad2 +bmw2002 +agusia +melissa01 +les +heineken1 +21guns +love2you +schubert +iloveamy +carnival1 +sure +shogun1 +mickey07 +jacksparrow +jenny11 +travolta +callaway1 +mariska +crockett +291088 +happy99 +toolbox +pumpkin3 +18041987 +senate +230185 +ifeoma +nate12 +18121989 +dancer5 +100191 +notnow +ac +password* +fylhtqrf +babita +140390 +21021991 +nathan +250687 +imabitch +19071991 +margareta +11021990 +gauthier +ionela +albert +hazelnut +031089 +25101985 +290689 +01011974 +sex12345 +mynewlife +austen +roosevelt1 +irlanda +patrick4 +28041987 +godrules +03031986 +prometheus +140790 +sexiest1 +pittbull1 +z12345678 +160889 +matt21 +220684 +pcwac33gb9 +18021991 +14061988 +bella4 +13061987 +010102 +cerber +georgette +andrea22 +19041988 +satan6 +marie! +football85 +785612 +lulu889jdddd +05061986 +alexis02 +dol +jojo22 +ride4life +121004 +comida +270789 +gjvbljh +223355 +automatic +cyrus1 +sea +30secondstomars +deadhead1 +school10 +171085 +bradley2 +daniel00 +09091989 +nyyankees +rollie +bobby5 +140385 +iloveher! +kate12 +cassey +luis1234 +510510 +buldog +sabian +punjabi1 +alexander123 +candles1 +875421 +kl098709 +members +100491 +rocker12 +251280 +11121984 +281185 +bigboy5 +steelers36 +bobbyjack1 +slovakia +dodge1500 +170988 +epson +denton +believer +devendra +davedave +10021986 +cielo +18051990 +140985 +17021990 +blbntyf +shygirl1 +12091991 +ibrahimovic +98769876 +yourmum1 +ibelieve +herewego +123qweqwe +geforce +monserrat +jonathan11 +sierra01 +dynamite1 +071188 +oliver22 +adedoyin +190587 +152152 +abcde1234 +caliente1 +orange. +124567 +channel1 +02051991 +lilfizz +pussy21 +edward7 +bastos +andrea3 +tampa1 +11071991 +09091990 +padrepio +radiation +yan +ralph123 +150592 +parsons +04041989 +021286 +jaipur +500029 +elwood1 +198765 +polkmn +pochta +marzia +12021986 +10011987 +weed4life +jennifer69 +benben1 +20071990 +220785 +130388 +lumber +snow12 +leon12 +123qwe321 +200285 +torito +110891 +thelord +plopplop +marker1 +cherry! +jodie +tiamaria +january30 +524645 +154154 +13071988 +brianna7 +1234we +scooby01 +keller1 +gabbie1 +wilder +justin. +140986 +301085 +01071987 +hyphy1 +260489 +pookie01 +01071985 +houston2 +jacko +marley12 +iloveme11 +22111991 +12041987 +140984 +020987 +calista +diedie +myson1 +120284 +lilfizz1 +bullshit69 +turtle11 +clever1 +nokia12 +brooklyn3 +terrapin +salute +county +10011984 +marjorie1 +abuelita +sexy44 +23101990 +systemofadown +letsfuck +happydog +1q1q1q1q1q +sachin123 +emoemo1 +gjgeufq +11061988 +luis10 +airport1 +matrix01 +06061985 +29710455d +musics +10031991 +sarah22 +pokemon0 +superman07 +101280 +270188 +girasol +runaway1 +mickey69 +06061989 +wellcome1 +loveher1 +wojiushiwo +snoopy! +23031987 +010108 +271284 +juggle +180490 +fender2 +a147258369 +semper +jammin1 +blue34 +pomme +desert1 +050595 +10051986 +214 +seb +babygirl123 +260288 +stalingrad +231091 +uhf9qdh +vicente1 +santi +angie12 +x1x2x3 +120482 +100989 +madzia1 +abdulla +chicas +hailey01 +21061987 +alex2002 +riviera +101093 +29121987 +200386 +19051990 +coklat +metroid1 +aquafina +111977 +falcon7 +1122331 +mickey4 +longhorns2 +boysoverfl +gretel +28051991 +mila +jrcfyjxrf +240187 +131191 +mir +mustang8 +millicent +123123d +davidb +lovess +army123 +owner +200800 +22051990 +sudhakar +mariaelena +pompom1 +malatya44 +asa +160388 +chijioke +loveyou11 +151184 +201084 +movement +betito +01041986 +victor11 +pluton +gogreen +daniel89 +heartagram +lea +120281 +anastasia +cutiepie11 +12111991 +15081987 +ilovejacob +doc +tuscany +140486 +170785 +brianna5 +1234567qw +webcam1 +bugaboo1 +1303 +12001200 +11111989 +25041987 +heynow +bedroom +aaa777 +120183 +lego +mohsin +letters +cowboys01 +watkins +kalani +271184 +lovegame +210289 +poop10 +keerthi +money +qwertyui2p +020488 +urmom123 +eagles09 +130186 +candyshop1 +nosmoking +gemini69 +4815162342lost +2110 +bulldogs12 +mamica +paris12 +melon1 +crappy1 +greenday13 +521000 +jus +performance +250185 +montrose +please2 +dolphins2 +12041989 +luckyme1 +england +eric13 +everquest1 +132 +zorro123 +john1010 +270487 +01081988 +ashley93 +really1 +trey123 +olivia13 +kassidy1 +ruslana +melon +zindagi +piranha +vfhctkm +ppp +gb15kv99 +101210 +260486 +wasd123 +200290 +paulpaul +skaters +r1chard +200882 +outlaws +281286 +101193 +kevin15 +vince15 +amaya1 +291287 +eminem13 +051290 +tyrese1 +123456.. +tanusha +061290 +310787 +metallica! +13031992 +brooke13 +rock&roll +260790 +mommy07 +nippon +311285 +hardcore69 +allo +18121990 +michael0 +happy4u +160585 +condom1 +21041987 +viola1 +jojo23 +riley2 +111976 +turtle7 +poohbear7 +soccer32 +1405 +leavemealo +money33 +nicki1 +crazy10 +290687 +samsung1 +charlee +bianco +160390 +budda1 +16071987 +taco12 +matthias1 +star67 +kitty8 +godfirst1 +jayhawks1 +03041987 +11071988 +1charles +sulaiman +171187 +alright +01091987 +mickey +energia +manman123 +agustin1 +250887 +brasil10 +pasta1 +18021987 +23011985 +gta123 +freshstart +mustang03 +fruit1 +willard1 +annie2 +11061990 +sowmya +sopranos +optical +pepepepe +18121987 +170484 +cassy1 +2204 +andrew9 +marmaris +arsenal4 +180990 +tigger16 +bus +111991 +phish +meme11 +majestic1 +hometown +laura13 +1nathan +304050 +03061986 +demonic1 +1310 +211089 +lalola +rose23 +654321s +67676767 +525525 +waterford +tempest1 +dthjxrf +alexis6 +tracy123 +carmela1 +revival +mickey! +190985 +romulus +junkyard +zxcvbnm8 +211085 +charlie. +10061989 +allthebest +yannis +ilov3u +15011987 +piesek +ocampo +dean123 +310388 +loveme8 +1308 +sumerki +gjyxbr +twinboys +040888 +190288 +170987 +199011 +babyboy09 +redwing1 +vaughn1 +rommel1 +glass1 +050686 +silver3 +hooch1 +20031986 +nassim +goodfellas +03041986 +iloveyou02 +alyssa +chester7 +francine1 +haruka +bliss +more +santaclaus +niranjan +april01 +stevens1 +loser21 +311090 +123йцу +falling +010888 +02081986 +informatio +300388 +azer1234 +freeze1 +fxnocp14 +9876541 +whoops +160689 +22021990 +takeshi +13081988 +01041985 +chooch +19061987 +clancy1 +percy +bolanle +bailey! +portvale +luckyman +irock12 +199312 +1200 +19091988 +lthtdj +plmokn +banger +24101986 +sarah5 +backpack +mine12 +11111991 +rendezvous +hotmail. +13051991 +landen +teardrop +240585 +211283 +laloca +hitesh +hardcore12 +skater10 +220286 +amber5 +17051990 +210484 +julito +20051992 +firetruck1 +19041991 +adrian01 +monella +260788 +david +canadian1 +fakefake1 +130591 +130885 +gamefreak1 +space2 +beerman +lexington1 +denya2531914 +karina +tinker01 +findme +tomboy1 +transporter +221281 +16051988 +a3eilm2s2y +020588 +bluestar1 +beezer +130287 +sayang2 +casamia +260390 +240389 +bambie +300686 +220185 +sham69 +201092 +200591 +classy +peanut23 +smile4 +jesus12345 +jennifer10 +rideordie1 +zoomer +welcome11 +oriental +junk +16897168 +sammy4 +13011987 +austin09 +iddqd +gcb +250785 +250683 +polish1 +selim2010 +311289 +360360 +200289 +280988 +tigers22 +547896321 +david06 +10061985 +joseph4 +yogi +one4all +129129 +ducky123 +loca12 +chiken +161089 +daman1 +pokemon101 +ritesh +020286 +monique12 +sananto210 +love234 +lovelove12 +20071989 +cricket2 +sweety +03031983 +19091986 +160787 +jose22 +001981 +jeniffer +310190 +sexy02 +24101987 +xyzzy +11021991 +fresh2 +marcopolo1 +vostok +fakeass1 +05051990 +shanny +traveller +skillz +pianoforte +271086 +140888 +143445 +amira +q2w3e4r +trackstar +198620 +babycat +babyboo12 +marihuana1 +montana2 +pikachu2 +madison13 +utility +10081985 +4everyours +22061985 +051186 +jamison1 +duke22 +kulangot +killer00 +subtitle +forklift +barefoot1 +voltage +iceage +bokbok +shannon3 +charm +cards +love2shop +1234567o +bouchon +sab +madhouse +caution1 +010589 +opel +princess45 +14041989 +199511 +20121991 +24121987 +firestar +diabolika +fire11 +nicole03 +02588520 +threeboys +150887 +3210 +king07 +beefcake1 +star09 +08081986 +junior4 +michelle17 +william08 +football82 +sorriso +15041991 +long123 +21121991 +210887 +190490 +010588 +rakker +11011987 +allahallah +12121993 +301184 +23101989 +willie12 +lakers01 +manoj +27051988 +andrei1 +bunny13 +someday1 + +sophie13 +tujheirf +teagan +wormwood +160488 +0711 +28101987 +franziska +stlouis1 +afrodite +golf12 +199612 +zachary1 +norwood +23081988 +doodie +26061990 +kelinci +baobab +130387 +ily1234 +mou +official +13111990 +deidara +micro1 +elmejor1 +ilovetim +10051985 +filefront +nithya +dobermann +300488 +bunghole1 +radcliffe +01061990 +imsocool1 +110283 +yanochka +mylove13 +20121987 +robert. +papi123 +cristianoronaldo +180589 +capricorne +240289 +ter +181086 +ducati916 +damn +nando +aloysius +lulululu +antigone +1qqqqqq +daniel27 +manman2 +lockdown1 +231082 +samantha21 +jkjkjk1 +luisa1 +kayla7 +1antonio +824655 +1fishing +remedios +haleigh1 +ella123 +direito +28081991 +dodo123 +midland +170985 +snooky +mariola +140989 +170789 +elemental +live2die +alysha +hell123 +fucku7 +free1234 +chevys +4141 +180687 +hailey2 +lover1234 +101281 +600018 +panget1 +poppies +bayern1 +passion123 +mickey08 +230490 +paco123 +magazin +annisa +rimini +261086 +clement1 +spanky123 +mike +turquoise +cali13 +eminem3 +andalucia +shannon +04041990 +charl1e +230885 +sales1 +wilkinson +110392 +annarita +zaqwsx12 +compton310 +153246 +14121989 +texas11 +cute14 +shareaza +kirill +belmont1 +conquest +sisisi +bread1 +melons +031 +melanie123 +dance11 +smithers +justin02 +anaclara +i97wb6sxq7 +asshole21 +myspace111 +bestia +tyler8 +screwyou1 +123321qweewq +blondes +bigballer1 +badoo123 +hannah1234 +1910 +170486 +firehouse +nessuna +220191 +catania46 +poop1 +edith +17111986 +13061988 +az147258 +030990 +johnson123 +20091989 +sophie10 +allen12 +270588 +linus +1234qwer +dragon20 +20121989 +duke1234 +240288 +020789 +253545 +2205 +13021987 +cupcake7 +jacko1 +170485 +tazman1 +16121986 +maddog2020 +treetree +raja123 +crystal13 +josh69 +301086 +111180 +ghbphfr +lesbian69 +princess97 +7410852963 +kitten7 +chloe3 +110492 +shaggy2 +031189 +reddy +cookie09 +01071988 +outlawz +tatina +100584 +vfnhbwf +coleen +ch1cken +19071987 +251083 +jetta +angel45 +hotboy12 +aguila1 +cereal +shortstop +brazil10 +sports123 +marusia +moogle +wsx123456 +kacenka +h97e7ijwwb +lionlion +busdriver +wsxzaq +primetime1 +boston11 +volkan +pam +28021992 +110884 +240386 +babyboy07 +asdfasdfasdf +christian1 +dance13 +onetreehill +130290 +010590 +280800 +010389 +12041992 +marinella +alex89 +130485 +miami3 +swapnil +180886 +matt14 +dragonlord +cap +nokian +1906 +peanut21 +a123 +021188 +17101991 +alligator1 +lopas123 +smooches +180887 +arshad +pete123 +11101986 +moi123 +sassy01 +281087 +21101987 +230591 +temporary1 +whiplash +11051988 +iloveyou26 +131287 +18031988 +riverrat +25111986 +yahooo1 +cowboys#1 +shakes +197811 +pointblank +250691 +#1girl +marinela +110791 +samdog +cherry01 +03031989 +ania +jessie13 +semenova +04041987 +versus +311087 +091190 +thelove +311085 +flawless1 ++ +12011985 +231284 +thuglife2 +andrew02 +5236 +300587 +zxczxc123 +chaussette +220983 +mitchel +austin05 +pink20 +240390 +270689 +dakine +rashida +sasori +elizabeth +indica +110883 +justin25 +cintia +a0000000 +16101991 +gareth1 +20081985 +swagga1 +140887 +manda +gatito1 +wally123 +200687 +hannah. +puerto +yuanyuan +26121990 +pamelita +salam123 +thedoctor +180986 +spence +crkurrp954 +john16 +diamond23 +bobafett1 +adonis1 +a7654321 +120992 +747747 +isabell1 +24121990 +181191 +18121986 +22101986 +10qpalzm +love43 +jennifer22 +google! +181090 +rocket12 +246135 +13021991 +250583 +sambuca +marriott +201185 +mashamasha +tommy3 +160786 +pacino +junior24 +freedom69 +biologie +e3w2q1 +12111986 +fucku22 +cunningham +primax +rush +lacika +acting +31031987 +15071986 +alex93 +lalakers1 +azerty31 +14101986 +madison9 +podolski +200188 +alex2004 +11241124 +vipers1 +december +b33m6yghef +131183 +210485 +dmb2010 +jackson +salma +connections +270589 +16101990 +holas +mathys +potter12 +060685 +love4god +hiphop101 +080989 +cheese101 +12061985 +pro123 +victor10 +zaq1@wsx +22031984 +hornet1 +anthony05 +lbyfvj +nicole26 +puerto1 +12021989 +alex1988 +sanjuan1 +honey13 +04041985 +13061991 +martusia +password@123 +cinta1 +random12 +leanna1 +200485 +02101986 +200886 +mexico18 +intel123 +a1b2c3d4e5f6 +morpheus1 +motors +aekara21 +121180 +2111 +07071990 +soylamejor +halley +heaven77 +j654321 +wsydcig761 +140187 +26061987 +wordlife1 +tilly123 +11051989 +cassie13 +sprinkles +20011987 +21071987 +21101988 +ca +181289 +271290 +heidelberg +lildee1 +secret69 +231191 +150285 +exeter +friendz +260485 +fakegirl1 +monkey45 +600000 +251184 +ratchet1 +moonpie +parker2 +198326 +deportivo +cowboys10 +gabe +cosmos1 +amirah +ian +ethan01 +200592 +nikki11 +skittle1 +07071977 +queeny +london +15051989 +cement +kinglove5 +tigger6 +muscle1 +1305 +miley101 +william. +230685 +andrea23 +submit +050591 +badazz +paramount +diank123 +babyphat12 +pinky7 +charter1 +kolibri +climber +heyman +05071986 +27121989 +ryder1 +alexis03 +gattino +cherry101 +nigel +skate7 +batman99 +thomas06 +bigbang1 +24041990 +24121986 +200885 +160687 +citibank +veronica2 +hotlips1 +anthony19 +omomom +mylove +way2cool +rainman1 +reyna1 +maggot666 +sunshine33 +danica1 +12roses +bogart1 +hanswurst +terence1 +festina +loveme101 +kalender +saranghae +blair1 +230886 +24051988 +brandon. +espiritu +yamaha12 +cvtifhbrb +cassie3 +mcabdaw2vx +e6fc37 +sherif +rudy123 +lordgod +archibald +121977 +22111986 +170989 +strannik +pakistan +novita +16111987 +212 +111181 +yahoocom +chulo1 +16121991 +291085 +laughing +fairway +280585 +merrill +cascada +1qazxcv +baby28 +130393 +koalas +barbie10 +lisa11 +blanket +scamper1 +250285 +120479 +14121991 +boston34 +austin98 +12051991 +25101986 +kittens2 +chatting +heyhey2 +290590 +311290 +momma2 +19021990 +230392 +walters +02011986 +ladder +31101991 +hunter15 +baseball06 +fakename1 +griselda +sallie +191088 +24061986 +dominic2 +1234567aa +14021984 +dell11 +010489 +math123 +< +chichi12 +matvei +ferrer +snyder +julian01 +hilfiger +aggie1 +brat +21081987 +landlord +catdaddy +frankie +edward23 +thienthan +thisisme1 +newhope +flygirl1 +12051985 +020490 +elvira1 +280390 +motley1 +iloveyou28 +aa123456789 +200484 +030589 +daniel04 +olivia10 +yashar +hummerh3 +ab69432 +redblue +210288 +ericsson1 +denny1 +purchase +140209 +130892 +wwwaaabbb +barcelona9 +marianita +mireya +dashawn1 +sherbert +21232123 +danny3 +myspace34 +thomas6 +strawberry1 +misiaczek1 +kalleanka +strike3 +pimousse +150685 +sister3 +ovidiu +xm55xexbzs +19111987 +02071985 +holeinone +yusuke +mohammad1 +cherry6 +271285 +lorenita +blind +160788 +23041991 +250684 +300689 +obsidian +luck +solotime +hendra +buster08 +gogirl1 +fashion123 +michelle123 +marquise1 +godis#1 +gremlins +barcelona7 +ghtktcnm +02021980 +prinsesa +030890 +phoenix123 +koolkid +manuel2 +221283 +geheim1 +04061991 +wysiwyg +avatar12 +golova +undead1 +asmara +victoria11 +jaime123 +navajo +02071984 +chivas23 +yankee13 +17891789 +mafia123 +224455 +netgear +ljubav +1230321 +kyle1234 +mehdi +d54p7xjkha +20031988 +thomas. +21021987 +horses3 +17041986 +iskander +flakes +mason2 +teamo15 +02091988 +sas123 +130391 +180685 +300585 +misael +cruise1 +sammys +treehouse1 +141090 +halloo +230883 +stefano1 +brenda2 +197474 +gwendoline +glory2god +171289 +xoxoxo1 +monster10 +30061988 +beautiful8 +karlitos +14101989 +25121988 +t5r4e3w2q1 +ifeoluwa +fische +281089 +pre +chyna1 +duckies +love2005 +crips13 +22021985 +baikal +01021989 +17101990 +130386 +washere +wilson2 +polina +caramail +201284 +010689 +shutup! +sahara1 +killa3 +141182 +okok +fremont +109876 +310890 +bottle1 +cool12345 +lokito +11031988 +stop123 +jakedog +deneme +deepali +nuts +061089 +14031990 +170490 +summer15 +armystrong +151186 +25091987 +10101981 +4mutdfgvtp +22081990 +dork123 +thebitch1 +14121990 +a1a2a3a4a5a6 +yolande +vecmrf +130785 +101214 +olamide1 +ranjana +nana10 +236236 +playtime1 +bettyboo1 +200891 +whores +0987654321a +101980 +230191 +whitetail1 +heyy +10071986 +takethat +270490 +molly10 +fluffy +adidas2 +200387 +kickme +duckman +black15 +26031991 +290190 +babygirl05 +151282 +mutabor +12081992 +250595 +me&you +1edward +jeter1 +17111987 +marchelle27 +1505 +cinthia +101989 +10031990 +superjunior +nick21 +sugarplum1 +ugly +deedee12 +trabant +charter +azalea +taylor02 +100683 +258369147 +cvb123 +060691 +ipodnano +cheers1 +carnation +123111 +040690 +justin101 +cakes1 +aa123456789 +rodrigo123 +lovely4 +blood23 +heaven01 +ytpyf. +rockey1 +tophat +taylor18 +220884 +davenport +p00pie +170888 +woodman +190990 +sniper123 +310591 +avenue +ww123456 +131291 +likeme +19101988 +freaky69 +18101987 +mexico22 +8uxzd1b3bd +76543210 +wartune +lostlove1 +roberto123 +aosamples +110783 +soccer89 +160189 +210584 +14051991 +hello90 +010687 +will12 +cellphone2 +revathi +abby11 +oldskool +170984 +1512 +whatever13 +21091990 +pooky +15121990 +191289 +superstar7 +100583 +versailles +241281 +waterart +230791 +newports +hyundai1 +bismillah +16021987 +flight1 +samuel10 +banane1 +183461 +5t4r3e2w1q +lisa01 +fenster +bagheera +1709 +harrypotter1 +hamza123 +soroka +ayanna1 +moving +2sweet4u +dickies1 +02021992 +4music +15111988 +bloodz5 +14061989 +250784 +monamona +magister +12345. +hector123 +230584 +final1 +221191 +311284 +44556677 +guido1 +280489 +w1961a +macika +123456ll +100383 +cocopops +sexman +joseantonio +football53 +10011988 +rosco +blueskies +123123abc +031288 +20101990 +100284 +imfree +daddy08 +crafty +my2angels +scout123 +bball34 +iloveeric1 +robert17 +4567891 +12345676 +polkadot +280590 +fhntvbq +tiburon1 +99 +netball1 +mommyof4 +301186 +natasha2 +270785 +170487 +screamer +joshua24 +14111986 +500001 +hotrod69 +crazy01 +sunflower7 +krasavica +02101985 +mason12 +15081988 +bubbles10 +kierra +ilovelife1 +zanoza +a123456789a +fuckthis! +220291 +rickjames +12456 +james25 +mimi1234 +02021991 +tobiloba +14101984 +bobdole1 +slipper +rebecca1 +101982 +pooh23 +smiler +loser10 +gabby2 +ahmet +343536 +footbal +cabinet +sonne1 +12354 +140786 +changed1 +100283 +manowar1 +11031983 +neversaynever +100184 +football0 +220491 +240190 +proview1 +moose2 +19021987 +j8675309 +costanza +jonathan01 +qwertyu7 +survival +darkness12 +cutiepie3 +wwwaaabbb + +22051986 +251282 +22061990 +magomed +200590 +251987 +699669 +plane +nanette +123alex +22101985 +19481948 +steven10 +marmelad +34567890 +kazeem +280486 +210290 +court +23101986 +09091986 +s3cr3t +q12we34r +15101988 +rfnhby +13101989 +muffin! +laranja +shi +4wdaxq642f +12101984 +kusanagi +tinker3 +ilovedanny +110067 +cstrike +r12345678 +toejam +ballerina1 +bergkamp10 +devonte1 +250985 +baghdad +lieben +engel +mendes +hellos1 +151185 +monkey02 +210387 +beluga +anilkumar +210691 +160988 +millie12 +1234q +cuisine +bears123 +vfhcbr +babylove2 +freelance +macdonald +delores1 +okocha +15101991 +onetwo34 +12091987 +followme +humility +rfcgth +pieman +insert1 +naruto6 +daydreamer +tempo +hernandez2 +maine +dan1el +sexiest +delete2 +11111111q +doggie2 +rivers1 +charlie14 +02091987 +gandalf +jesus6 +asaasa +famous12 +12345 +john117 +shadow0 +24101989 +22011987 +george! +marcel +hockey44 +031086 +051287 +iphone4 +6969696969 +tony21 +3uc9xn53xh +jesus2009 +ilovemum +kaliber44 +3rdward +leila1 +love84 +240786 +cometa +ashash +saddie +pass2word +21011988 +12101991 +gunit123 +soccer93 +pimpin11 +wan0425 +hamburg +110483 +19121988 +andreev +philadelphia +right +cool15 +marine +gosia +limone +insurance1 +jesus777 +230385 +boris123 +prosper1 +ginger4 +june01 +nicole87 +bsxxbgs322 +twitch +cobra11 +pocholo +saab900 +10121983 +bootycall +chris12345 +zachary3 +5213344 +job4me +241183 +tweety09 +20091985 +jack21 +uqa9ebw445 +wutangclan +florida7 +scooby7 +260990 +dallas10 +sayang +13101992 +100384 +baberuth +bebo123 +tobias +021087 +rocket123 +chance11 +hairball +matrix11 +isabel123 +140685 +198524 +fabiano +mastercard +pizzapie +technical +shay +puffetta +261085 +salomon1 +4horsemen +11011986 +cannavaro +nnamdi +31121985 +nicole94 +fanatic +hedgehog1 +170683 +salaam +130786 +teixeira +1victoria +flower8 +prunelle +music21 +rodolfo1 +270489 +gtnhjd +gangsta4 +blackwidow +110020 +18051988 +lakers3 +nike90 +parkour1 +ansari +windows +22021987 +laurette +cooper3 +session +bubblez1 +kompages4u +mojito +19041990 +bommel +vanessa3 +120481 +c12345678 +carlos1234 +shaquille +jesus17 +030386 +computer10 +godloves +sexy00 +chouchou1 +denise01 +hailee +happy2008 +mcgrady +emily10 +25111987 +bob111 +231192 +overlord1 +12041204 +skunk +020586 +lavalamp1 +maryjane13 +johanne +papasito +babygirl92 +fubar +831012 +hothothot +collette +02051985 +520 +46494649 +twenty3 +quake +24031990 +marko1 +sexythang1 +luv2dance +house12 +sexyboy12 +01081985 +wilmer +ramone +steven69 +26031987 +babygurl21 +vanessa7 +compaq11 +babouche +oakwood +1cheater +natas666 +020589 +joemama1 +ignacio1 +zero1234 +star45 +tigger88 +peace5 +sexsexsex1 +130383 +34567 +victoria1 +281191 +kt +banana69 +vivi +monique123 +muttley +triple3 +10081990 +080885 +din +cretin +171087 +geordie +195 +taliban +bobert +loop +25262526 +ferguson1 +bernhard +232323a +panchita +masaya +sheffield1 +anggandako +catfood +180686 +061289 +bridgette1 +live4god +frogfrog +dothedew +justindrew +sept23 +daytek +15121985 +21021989 +23111988 +hottie17 +1407 +marie8 +puteri +lunatica +river123 +131282 +jimmy11 +160190 +cassie +jkmuf +qaz321 +godisone +nikolaeva +kerouac +111qqq111 +vfylfhbyrf +mickey6 +azqswx +deedee123 +22111987 +310587 +301187 +halamadrid +cherry10 +11071985 +01041990 +21061991 +131084 +sfgiants +161289 +neverever +130291 +emo101 +annushka +290589 +william21 +bengal +q123456q +kenya +phoenix1 +layla123 +skidoo1 +141185 +junior06 +elijah01 +brothers2 +iloveyou2 +10061991 +200490 +lesbians +humberto1 +hitman123 +021187 +briggs +161088 +heartbroken +zapper +a:sldkfj +22091987 +130582 +geo123 +12111990 +lilangel1 +jakob1 +fuck01 +ilikeu123 +jeremy13 +99998888 +malatya +iloveweed1 +alex2003 +kam +andrea7 +heslo123 +kombat +qwerttrewq +audirs4 +sunshine17 +moneybags +210384 +25101984 +miamiheat1 +clowns1 +ovechkin8 +helpme! +necromancer +19081988 +imsocool +26061986 +buster23 +jd1234 +never123 +shaman1 +20111987 +170489 +20061990 +dogface1 +wayne12 +03031991 +key123 +boiler +200889 +octavian +loulou +cualquiera +patryk1 +awesome11 +nightwolf +cocopuff1 +anh123 +050790 +maksimus +scorpio11 +jasmine21 +marie24 +yousef +cayden1 +simple12 +mexico! +tony10 +adam13 +only1love +what3v3r +farrell +sherri1 +020690 +anyone +23011990 +24041987 +thequeen +0102 +hangar18 +110095 +liverpool10 +120578 +110284 +banana13 +15081989 +650829yjm +26051987 +vef6g55frz +jake23 +traffic1 +william07 +130691 +24081988 +rockstar21 +17071985 +luis23 +17101988 +pentagram +discover1 +31121991 +17041987 +10111989 +wannabe1 +100292 +95368452 +recruit +halloween2 +310786 +everton123 +010787 +doggydog +blobby +family9 +01011971 +manger +benjamin +jianfei000 +sam101 +fedorov +anselmo +monster9 +jaylin +130285 +250389 +kitty14 +tunder +marjan +220387 +ilovejesse +trash1 +william69 +peanut6 +13021989 +20101985 +rachel3 +291286 +jerry12 +yellow25 +selena12 +151084 +swinger1 +kelli +vf +1bunny +230286 +piggie +hotness +02081990 +texans +18091987 +250385 +louise01 +paoletta +amazon1 +lina123 +allstars1 +natividad +lyndsey +igor123 +ladder49 +bball7 +babycake +220490 +23031985 +20121983 +sunil +blessed +breizh +railroad1 +advantage +phish1 +outcast +bubbles. +ar +130783 +23071991 +121275 +251087 +kingtut +cinco5 +mullet1 +maxim1935 +101180 +14091990 +ray619 +ethan12 +120881 +1cupcake +170889 +sistema +260587 +jamal123 +020485 +300486 +greetings +bhavana +26031990 +050989 +mahalqoh +197812 +janet123 +235235 +koffie +job123 +310187 +maverik +smile101 +198920 +winners1 +kensington +29662012 +1cameron +lakers10 +hotstuff2 +evan123 +02041985 +bronco2 +christia +46464646 +18041990 +eagles21 +florida1 +sandia +a131313 +bebe11 +19091989 +270289 +durban +21021990 +melissa22 +arashi +thomas88 +assword1 +andy13 +110120119 +longman +101279 +13041990 +poptarts1 +nelson12 +120981 +marius1 +24061987 +barbie! +198819 +jimmy69 +11101985 +bolita +warwar +pedro12 +miller +bear22 +ily4ever +paulo123 +supper +221092 +diego12 +copeland +sierra2 +andrew1234 +nas +paisley1 +buckaroo +qwasqwas +160885 +vampire2 +solnyshko +100592 +180688 +camper1 +nicol +29071986 +porky1 +pamela123 +17101989 +jasmine16 +daddy21 +19081991 +kissme11 +230384 +forlife +schlumpf +280884 +georgi +1muffin +vierge +ginger +310788 +21051988 +010585 +051188 +safeway +19091991 +joseph14 +20031992 +01051986 +24101990 +leonardo +charger69 +040486 +ruthless1 +291087 +schlange +smokeweed4 +hotpants +spi +volvo240 +nathan21 +zackery +13111986 +852000 +151091 +jaxson +ronaldo09 +020285 +281085 +16031987 +mybaby12 +pooh22 +irina1 +jackson6 +babe11 +260888 +purple27 +ghjkju +meister1 +11091990 +porn123 +021085 +001976 +maestra +cheeto +7894 +021021 +04051990 +198323 +01031984 +21111986 +internatio +fuckass1 +seether +qwerty1234567 +paquita +steven! +291086 +jerrylee +23101992 +30031990 +rock69 +010890 +cleaning +2103 +hunter24 +itdxtyrj +marauder +amstel +country2 +180890 +terri +700019 +router +godofwar3 +i84avh9lti +nikolaj +knoxville +lotlot +scorpion +280887 +15041990 +211282 +ozzie +demon13 +14121985 +balder +quasar +jasmine22 +constanza +000008 +halflife1 +hotmomma1 +fucker11 +link12 +moonstone +monika +01031987 +141184 +blank1 +kingkong12 +051190 +tobytoby +panhead +why +wasser1 +megapolis +rutgers +drummer2 +bitch25 +mymoney1 +110030 +zoom +110185 +++ +city +20132013 +februari +030686 +concord1 +02051984 +280280 +lakota1 +jessica88 +conejito +260385 +leandra +skater! +77889900 +booboo9 +201011 +invader +freakout +22121991 +simba12 +400051 +ala +87878787 +210591 +fakeone1 +trident1 +genesis2 +nicole92 +destiny07 +301185 +18051987 +301189 +cheaters1 +chachi1 +benzema +89216279708a +310790 +19121989 +dolphin +28061991 +candida +123456789u +newday1 +heyman1 +sabine1 +spiderpig1 +myboys1 +24031987 +nadine +test123 +21051990 +231988 +liam123 +1honey +250591 +120780 +040590 +boosie +sarasota +tennis +mustang10 +avocado +220383 +taylor05 +09091985 +steph2 +160289 +sapito +clutch +lolypop +22101988 +241289 +grandson1 +1231231234 +grinder +dev +angela11 +170990 +48484848 +monica11 +10041992 +mayaki +fairlane +peace4 +15021989 +180389 +abcdefghijk +hansel +sharon123 +king08 +iluvmlml +123478 +partyboy1 +peewee12 +daniela +javelin +joseph15 +290188 +ari123 +jonathan5 +grundig +david12345 +dreamz +musik1 +mustang04 +31051991 +12345678909 +120492 +rohit +maple +27041988 +14091987 +but +babygurl5 +22011991 +05061989 +poohpooh1 +passwerd1 +stacie1 +25061985 +11121988 +slipknot8 +stubby1 +madison04 +bones123 +123456789q +lilmike1 +highway1 +stefan123 +fdfnfh +maksim +zxc321 +25091986 +963210 +bitches12 +310188 +chewie1 +mamata +babygurl69 +gamecock +amanda07 +everlast1 +margret +03031992 +bobb +110593 +madden10 +25081994 +sandi +17061986 +sleep +jukebox +biagio +dance5 +100392 +anna2010 +150983 +22051989 +balling1 +050688 +261284 +dolphin5 +logitech12 +123!@# +taison +hello321 +johnny69 +201002 +02091986 +200189 +monday01 +paredes +4given +02081985 +30061986 +p51mustang +passpass1 +130889 +loveone1 +cheyenne2 +jason10 +010289 +thomas17 +20041985 +orange14 +1232 +141286 +badboy7 +chill1 +sabres1 +090690 +29041991 +15111986 +deeznutz1 +10021992 +21041989 +3110 +gringo1 +arunkumar +killing1 +150884 +130884 +22041992 +michelle07 +lucinda1 +11021986 +000002 +3qvn5k4qgv +bball25 +130484 +imhot1 +cachito +030590 +171183 +yankees22 +speedy2 +11091985 +be +200790 +passera +060692 +25011991 +a999999 +burner +snuffles +parisien +160287 +luvyou +7fxf3jba8t +cristopher +13111985 +celinedion +4myself +198626 +banks1 +111123 +lizeth +lovekoto +171190 +beautiful0 +oscar3 +longer +skittles! +nortex4 +ms1234 +12041985 +silverstar +tadpole1 +15081991 +22081991 +charlote +170287 +060990 +robert07 +spurs123 +198624 +140284 +18101985 +270290 +151182 +25081988 +doitnow +wes +robert09 +251283 +mirian +230884 +pokemon6 +whatisit +nicholas11 +lkj65b6666 +260692 +211090 +jobsearch1 +020990 +number1mom +looker +research1 +yoyoma +mommy8 +cingular +iuliana +shitshit1 +rocket88 +harley5 +300990 +prescott +paranoid1 +creeper1 +23071985 +24041985 +clint1 +080891 +111091 +patrick8 +lobo +glover +kabal +326326 +nineteen19 +220683 +020486 +figaro1 +15091989 +oreo1234 +240991 +eight888 +400016 +pumpkin7 +bimbim +mariangela +28081990 +01061989 +25061991 +20081986 +gemini13 +fuck10 +ramsey1 +panthers12 +fivekids +230186 +2208 +26021990 +steelers +10031986 +110393 +kingkong2 +29041987 +01031985 +12091986 +kitkat12 +110052 +acoustic +barbie01 +testament +240189 +123123r +amanda24 +viceroy +100784 +findajob +charlie06 +20041986 +19071990 +northwest +rawr +punkass1 +13011989 +problem +guiness1 +526282 +060687 +sveta123 +montse +100680 +nutty1 +capecod1 +nikeair1 +penpen +03111987 +jennifer4 +10071990 +aloha123 +roosters1 +1408 +wwwww1 +19051986 +10061992 +fiammalex1@hotmail.it +23021991 +13031986 +theiigd4x2 +021287 +rocky22 +1066 +15121984 +nononono +01081990 +alex96 +copper2 +210286 +not_needed +djdxbr +hottie. +23061988 +170583 +frontera +juggalo17 +02081987 +alexis99 +willsmith1 +cazador +alex27 +241287 +10311031 +10111985 +ipswich1 +24101991 +cabrio +octavia1 +24061988 +rfhfvtkm +010490 +anna01 +woman1 +010587 +silver69 +27071991 +190688 +11011989 +josecarlos +hate12 +takashi +lover8 +banking +gracie11 +23051986 +152207 +shante1 +texas5 +22031989 +fluffy11 +30121987 +11111qqqqq +01061986 +br549 +antani +20051989 +25041988 +skinhead1 +cheer14 +21121986 +word123 +140189 +academy1 +hibernian +katarina1 +vicki +ipodnano1 +holybible +t12345678 +padrino +natalie7 +john18 +rabbits1 +amorsito +22091988 +happy9 +141284 +greenpeace +15061988 +rug +left4dead2 +8562835 +steven21 +23051989 +sithlord1 +18061987 +290587 +love#1 +mike06 +sully1 +010290 +mike20 +school01 +rocawear +mandeep +sweetp +190388 +sugipula +lkjlkj +sister12 +xcvbnm + +amyamy +playbill +donut1 +25041991 +dawn123 +04051987 +fgjrfkbgcbc +tangkay +27071987 +33445566 +nascar12 +290585 +240784 +howard12 +hammond1 +heaven777 +116116 +saxon +11061992 +belette +bubbles69 +melissa! +katerinka +talita +cammello +urgay1 +thesaint +baboy +lithium1 +15121982 +steve12 +121994 +xep624 +26011990 +lovinglife +280288 +andreina +walter123 +spiders1 +danni1 +steelhead +green45 +20011989 +snoopy69 +dragonforce +040487 +wildcard +01051985 +haleigh +am1234 +1234456 +amisha +26041991 +playboy11 +intelligent +01091985 +10091986 +lola11 +alexis! +240286 +bam +totally +eagles08 +sincity1 +198444 +rocklee +22101990 +7410852 +pussy01 +motown +19121987 +real123 +chestnut1 +130284 +14061991 +nodoubt1 +++ +ronny +osprey +311282 +alexandro +bunny11 +140386 +260387 +jumbo +080690 +eyeball1 +painless +angel97 +170190 +ciprian +trevor12 +drpepper12 +julian2 +20091987 +nepal123 +020986 +marta123 +ethan2 +irish123 +280386 +240785 +setter +280290 +21071986 +280890 +charles7 +197666 +140387 +13041991 +20021988 +dickface +jacobblack +123456- +ilovejon +nasa +11061985 +haggard +corazones +tiger88 +dora +dionisio +teens +ilovejose1 +youth1 +30041987 +230984 +alexis21 +thug +swansea1 +regent +18091985 +blake12 +191087 +cad +12091988 +him123 +030789 +scooter11 +pratik +15121988 +tess +venice1 +jada123 +josh10 +111085 +9inchnails +24121989 +canarias +08522580 +topogigio +curly +chairs +pocitac +hardcore! +boobies123 +eastwood1 +maxwell123 +maddie11 +aero87 +sandra13 +nightshade +mayhem1 +shockwave +fordtruck1 +chris33 +lala10 +14071986 +a232323 +belldandy +31 +963963963 +110681 +13011988 +01091986 +steven23 +hailey12 +codegeass +material +anointed +552255 +berkut +hailey123 +090390 +alaina1 +wasd1234 +vfhbif +tellme +pretty! +beast12 +nnnnn +mamaliga +yc6abqsfjo +laugh1 +18101986 +alino4ka +140983 +05061990 +lala23 +cardiff1 +29091987 +mexico4 +vendredi +littlefoot +newport2 +19051993 +041 +dam +mother7 +mushrooms +marble1 +bingbong +16021989 +21041990 +madison! +770880 +10071989 +marmite1 +150490 +towers +pikachu123 +vfrfhjys +orlando +01041983 +budlight2 +james12345 +19001900 +paris11 +unlimited1 +050888 +alvarito +arlette +vaughan +19051991 +gabika +19933991 +catcher1 +051088 +rjdfktyrj +loveislove +ravi123 +30031991 +11031993 +11201120 +laverne +fucklove69 +mousepad +210885 +melo123 +230683 +brian13 +150891 +cavaliers +rockon2 +lastochka +sunnyside +wyoming1 +haircut +30101986 +160986 +jayanthi +jablay +cottoncandy +271828 +greta1 +210888 +alex1985 +ammananna +fishy123 +chilly1 +5.254.105.20:test +quilter +160387 +giallo +12011990 +kruger +501501 +180788 +270189 +rainyday +04041984 +orange69 +16121989 +ilovejay +22031988 +dakota7 +ritika +bereza +jarule1 +frieda +cd123456 +thomas16 +sc00byd00 +dimanche +wiggle +556644 +connor11 +281186 +7777777q +060684 +gizzy1 +america. +mothermary +hunt +25962596 +150291 +teddybear3 +121993 +hellohi +jordans +vjzctvmz +smitha +02101984 +14121992 +betsy +070784 +mylove! +magneto +110983 +wwe +badboyz +death69 +рїр°сђрѕр»сњ +sterne +dylan13 +852741963 +mariee +220790 +thechosen1 +blood14 +111283 +samsamsam +08081991 +211185 +heyhey12 +dev123 +131182 +plumbing +171284 +loquita +imissyou2 +brianna4 +angel87 +21051986 +travis01 +aisyah +marissa2 +sunshine16 +tandem +iloveyou93 +sassy7 +lauren5 +12071992 +obsession +partygirl +ciaociao1 +201082 +kimmy123 +23isback +26101989 +sayuri +261287 +zse45rdx +terrible1 +davidvilla +251192 +yflt:lf +180585 +punk13 +catnip1 +junior69 +begood +player14 +ronaldo +amanda08 +ilovekim +150384 +20061985 +password11 +mandolin +040491 +17121988 +coolio123 +starwars6 +macbook1 +12081985 +fro +indianalib +270386 +geronto +windows2 +babygirl89 +iphone1 +041188 +jeffgordon +23081991 +150783 +rain123 +888888a +theclash +sage +30051989 +engine1 +time2go +magenta1 +15031989 +tinky1 +tigran +cashflow1 +samuraix +231291 +1w2w3w +hello88 +adidas10 +alfons +admin +170885 +dentist1 +091091 +sweetthing +frankies +vfrcbr +11021102 +bundy1 +snoopy10 +29091988 +yassin +fernan +nermal +beto123 +graduation +rosalind +dreamboy +11081992 +123money +mydreams +051089 +cordova +werthrf +gangsta! +170185 +miranda123 +karachi1 +cindy12 +block1 +09091988 +maria1234 +111100 +23031989 +canario +84268426 +king55 +therion +honeypot +turbo2 +23011991 +26101988 +02071991 +151284 +16121988 +flyhigh +aeiou1 +dashboard +thunderbolt +gillette +jamiroquai +lucky08 +171185 +dexter +matthew06 +17041991 +sergio12 +moss18 +560040 +560094 +farah +grisou +piper123 +adi123 +mattman +17051991 +dogbone +lotion +trx450r +220682 +nicole93 +killerbee +rachel7 +snookie1 +291290 +junior17 +ravikumar +callme1 +renault1 +nicole02 +anamaria1 +eveline +kiko123 +hannah00 +katiebug1 +yukon1 +brandy11 +blue00 +280686 +85200258 +27041990 +elijah123 +031285 +zoe +belly1 +afroman +newark +lilmomma1 +megan13 +010487 +worinima +300586 +11041989 +batman09 +mustang02 +a1314520 +redsox13 +lolpop +150684 +richard5 +zkl858 +alma +thekillers +210982 +suzie1 +01101991 +ginger69 +redneck12 +20031984 +0110 +tacos +blazedup42 +belochka +15071991 +1puppy +welldone +love&hate +rick123 +len +martina +lickme2 +250984 +29041992 +cobra427 +canada11 +10081988 +audis4 +kwiatuszek +kai123 +230887 +charito +abogado +babby1 +howie1 +5t6y7u +fatina +nascar2 +chinadoll1 +lander +1404 +life101 +100391 +ivette +marvelous +281086 +030690 +jorge12 +170491 +hunter101 +whores1 +061285 +jerson +600600 +23041992 +danny22 +2305 +hydro1 +vanessa11 +hotgirl2 +escobar1 +sweetypie1 +r123098 +nascimento +cobra123 +ciaran +switzerland +gusgus1 +ballin11 +200385 +katze +girls12 +31121992 +131284 +xavier01 +jose18 +florida3 +141083 +success2 +27101989 +winslow +270986 +athlon64 +orologio +30041985 +++++++ +011088 +11121112 +dustin123 +harhar +nala +hockey20 +ciccina +april09 +adgjmptw +omolara +victoria10 +23031993 +outlook +topcat1 +1302 +280989 +andrey123 +16081991 +1power +cohiba +rockme +nicole00 +290389 +danny5 +020487 +11111984 +geoffrey1 +131082 +luckie1 +110032 +komando +lovechild +youyou1 +15021988 +sushi123 +weedweed +abudfv +14121986 +iloveyou92 +homo123 +bitch33 +fuckher +17021987 +09091991 +kikker +fabio123 +babygirl26 +nan +number20 +11031989 +150885 +music4ever +23041990 +hjlbyf +inlove! +22081987 +maranda1 +kiskis +starwars +27101986 +pawelek +2411 +sammy21 +260889 +budget +bubby +89mustang +wolf13 +pakistan1 +samson01 +joann1 +230491 +xswqaz +killme2 +220891 +austin9 +urmila +tia123 +qpwoei +27061988 +happyy +chess1 +14231423 +321abc +30051985 +honda3 +thunder11 +7894561231 +micheline +butterfly. +vovchik +sexme1 +123456xx +berliner +061088 +pokhara +pookie13 +31011990 +dylan3 +qy5togr996 +dec +18071991 +bearcats1 +17051987 +chrystal +220190 +15051984 +hoebag1 +coquine +pooh15 +123-123 +rustem +22021992 +madera +010486 +paulie1 +limpopo +210583 +nosey1 +shanta +bohemia +murmur +06061991 +love1986 +caribe +forbes +romeo12 +orange88 +flower. +princess32 +zxczxc1 +12091990 +barney2 +00001 +kusuma +yankees21 +iloveyouma +qwert123456 +green08 +210991 +namita +riddick1 +220883 +160485 +libertad1 +3yixda15hr +periwinkle +cjrjkjdf +typewriter +canton +kyle13 +glenwood +airmax +010786 +180789 +110014 +24071987 +underwood +192021 +300986 +sandydog +130681 +devil6 +looking4u +sister123 +1598753a +031188 +morrow +231280 +050584 +yfafyz +cowboy11 +111291 +chivas3 +19960309 +22011992 +mansfield +29101991 +04051988 +simonsays +disney2 +soeusei +superhero1 +16061992 +mumtaz +ranger99 +a111111111 +pig +181288 +7474 +22121990 +15031985 +191185 +2929 +moody1 +javiera +20101992 +199019 +buster14 +24041992 +23061991 +jonah +shark123 +291186 +15031987 +bonsoir +13101990 +master00 +26121988 +18101991 +10091987 +helpme12 +eminem. +220984 +chacho +guyguy +210491 +escorpion1 +22101984 +17101986 +hhhhh1 +cracker2 +051185 +dd1234 +roxy01 +13091988 +23091987 +golfnut +30031987 +w1992a +jitterbug +gheorghe +11101990 +slbenfica +z28camaro +jejeje +gamefreak +dumb +gblfhfc +hotmomma +yniqnmk733 +master88 +25041990 +raven13 +020585 +12365 +a2345678 +zaza123 +chivas101 +susanita +watashi +hollywood3 +shawnee1 +20101991 +ground +tennis01 +mouloudia +chris99 +01081984 +lauren21 +emilka +198810 +stamps +report +missyou1 +2508 +limewire1 +rohan +daniel02 +291185 +cascades +topaz +110881 +libras +haha22 +01051990 +people11 +hereiam +cherry15 +rajasthan +babygirl94 +rainier +rapido +bestrong +01051987 +pimpin21 +gunter +210391 +pretty10 +animal2 +blueman +24051991 +160187 +poohbear4 +bailey4 +10041985 +200388 +devdas +ytyfdb +180387 +winter00 +caliber +wizzard +troubles +hunter88 +palace1 +cortney1 +frontline +toby11 +210181 +shrek1 +159951159 +jackiechan +batman14 +121093 +jesuscrist +mythology +asteroid +dreamgirl1 +240982 +fatality +160790 +120381 +241284 +ozzy666 +250186 +150584 +1415926 +duffy +159753456852 +damaris1 +150591 +coco01 +ateneo +250592 +mariana123 +251180 +190690 +kierra1 +ms123456 +140783 +134134 +dallas5 +281283 +hamster2 +31031988 +281182 +bubbles21 +amador +jer +superman77 +stellar1 +success7 +151085 +finalfantasy7 +budman1 +22051988 +123124 +fosters1 +parker01 +kfylsi +peggysue +reeree +qwertyu +toast +luis11 +240185 +301289 +natation +180188 +lucylou +samantha4 +benedikt +angels5 +kissass1 +02081991 +asdfghjkl:' +backup +ou8124me +14081988 +fake101 +amber7 +dickdick +180190 +a2a2a2 +220691 +sept22 +280490 +amanda6 +190188 +7so2ekbc6r +ramadhan +ham123 +ihatethis1 +personnel +luminita +231080 +bramble1 +stepanova +oliveoil +nora +pelon13 +megan01 +02021993 +raymond123 +2504 +15081986 +23121985 +280487 +310785 +comrade +dating1 +cbrown1 +florina +carousel +chico12 +03061988 +hacking +300785 +ryan15 +181085 +imtheman1 +jenny01 +ghjnjrjk +161091 +orange +zoolander +14041986 +yoshi123 +290486 +12fuckyou +mercedez +three333 +welcome5 +elias123 +araceli1 +narut0 +20000 +dreaming1 +nessa +26021988 +kumasi +140687 +justin00 +lbvekz +.kzirf +fuckin1 +150187 +12041984 +nigger11 +jesusteamo +norfolk +25051991 +joejonas12 +beautiful9 +19121990 +makayla2 +141091 +13031989 +28121988 +booboo4 +nathan4 +fatgirl +130583 +diamond22 +overdose +290185 +bitch99 +samantha14 +123456ty +kelly7 +olaniyi +8inches +soccer34 +ownage1 +mocha123 +school9 +28021985 +30101985 +freenet +291289 +02011987 +specialized +kaylie1 +1243 +garten +chivas5 +changed +250484 +02021983 +109109 +nuggets15 +killzone2 +2304 +useless +sokolik +miller31 +707707 +170689 +fresh23 +12061992 +foofighters +230284 +busayo +loveth +02071983 +121193 +180489 +happy77 +codmw2 +444444444 +100293 +strekoza +220985 +putri +110495 +henrietta +jenny7 +23031988 +jake14 +summer88 +sal123 +rufus123 +18031987 +191286 +030685 +gjgjdf +taylor17 +rylee1 +field +chuckles1 +mychemical +020284 +amor15 +24041989 +31051990 +chidori1 +janaki +jordan97 +money111 +199222 +santafe1 +iloveyouto +tavares +redcar1 +donte1 +511511 +leedsutd1 +goducks +jesus333 +darcy1 +fishfood +spencer123 +andrew88 +020279 +02101988 +24011991 +anytime +baller69 +01081987 +manuel +iloveben1 +jesus18 +120982 +monkeyface +15121992 +210184 +16101989 +zxcvfdsa +dominika1 +smokey22 +thrice +alex98 +smartguy +zaratustra +jordan19 +seniseviyoru +bulldog123 +250184 +tigger8 +blondie! +mandragora +14041990 +123456789 +15061990 +oliver3 +110010 +ran +23111987 +butter11 +rancho +thinkpink1 +25011988 +290690 +samsung3 +qwerty16 +140186 +18061985 +coffee11 +240682 +bugaga +telefone +raleigh1 +shayne1 +czarina +omotayo +katalina +533656 +27071989 +12071984 +hottie24 +ballin7 +22111990 +beertje +15051992 +sarah10 +photograph +luisito1 +13021986 +xyz12345 +anthony02 +richter +141282 +280389 +yellow77 +nikki7 +11081986 +dogger +shrek +cortney +201192 +water3 +fynjif +jeffrey2 +salzburg +gangsta23 +29051990 +baby-girl +dick11 +booty2 +10081991 +100285 +09051985 +fuckme. +loveme16 +ytyfdbcnm +zxcvb12 +fucker4 +justin04 +18061984 +zxcasdqwe1 +12081989 +soccer92 +josef +mw0501 +fuckmyspac +10041984 +sigma1 +kingking1 +music07 +139139 +14121982 +analiza +140583 +homersimpson +sembarang +20021984 +250885 +dakota99 +battery1 +300989 +10081989 +marlins1 +dodododo +fidget +muscles +24091986 +miles123 +enternow +21031985 +zackery1 +marcus11 +chris77 +20071986 +bonnie2 +150492 +25021987 +300390 +dancer14 +batman8 +picolo +may2008 +220591 +15081985 +floriane +famous2 +device +chi123 +nuevavida +180691 +passione +memorial +15121983 +vkontakte.ru +5254143 +allen2 +summer16 +9852a9 +280586 +svetlanka +196900 +hunger +sidorov +3edcvfr4 +coolman123 +mami12 +kalle +makassar +rodrigue +221182 +mememe2 +rebelde123 +montserrat +metallica0 +snickers3 +eminem7 +heather5 +157359 +100385 +naseem +cocacola123 +100892 +trina +25051986 +hardstyle1 +24111989 +18061990 +audia8 +pep +semaj1 +deepthi +sexy29 +iluvme! +fuck3r +26121987 +o123456789 +888168 +yellow33 +200890 +koshechka +crazy4you +rjpthju +1234562 +roadkill1 +1sweet +14051990 +shooting +4071505 +alberto123 +blanco1 +mitzi1 +lakers +251292 +est +kelsey11 +diamonds2 +23061989 +nadezda +booty123 +blueballs +bowwow3 +hameed +j111111 +2468101214 +bailey06 +28051990 +love1987 +womble +daddygirl +mandy12 +krystle +peewee123 +aaazzz +hjkl +falcon12 +finest1 +buttfuck +010988 +buster4 +hellspawn +rosette +heath +22051992 +13081987 +taureau +lorien +melrose1 +blackburn1 +chevy01 +112000 +embassy +cowboy01 +billkaulitz +madeleine1 +motogp +10121993 +22071991 +lunchbox1 +pelican1 +pregnant +supermom1 +wraith +210986 +ellis1 +corolla1 +secret3 +281282 +120879 +13121983 +8ba9klw1ce +iloveny +1909 +willow01 +0okmnji9 +15071988 +10121982 +031289 +22021986 +291184 +isidora +fullhouse1 +teddys +corporate +kookie1 +water11 +baloncesto +pitufina +karisma +17031992 +kashish +onetime1 +mamulya +clearwater +20111986 +230482 +marion +gfnhbjn +25091989 +241185 +123zxcv +25091990 +dudes +drpepper2 +23121991 +mae123 +birtanem +01031986 +091286 +love41 +110480 +11081990 +400614 +12345678e +11111112 +jesus2008 +nokia5700 +century1 +iceberg1 +786123 +bullets +fishman1 +christiana +gigigi +hydro420 +monster21 +261082 +astoria +iloveaaron +madhav +dancer08 +crazy21 +babilonia +smegma +18061988 +buller +ricky2 +friendsforever +trevon +aisha1 +vatoloco1 +cameron6 +150186 +20091984 +pretty6 +fred01 +mirror1 ++ +1596357 +1spiderman +18011987 +log +245245 +300987 +pepper +artem1999 +kalimero +080887 +14081991 +friends08 +america#1 +m1garand +bemine +biteme12 +killacam1 +makina +guessit +111111j +h1234567 +03031984 +161184 +071290 +carebear12 +21061988 +220783 +cheer01 +27071988 +kristal1 +lll +241192 +18081990 +15091990 +lucky +06081991 +190290 +kimbo1 +17041989 +songbird1 +husky +brick1 +12061984 +pascha +nevets +taylor03 +020587 +22121985 +picnic +kumar1 +qaz123123 +198821 +prettywoman +10091985 +bassplayer +melissa69 +kirara +babyboy23 +stumpy1 +maggie07 +100482 +24121991 +gramma +28121990 +nikki3 +bobby13 +password81 +marc123 +02071989 +abnormal +david19 +debil +maemae1 +27051986 +121208 +the1andonl +ripken +1510 +guitar01 +slippery +190689 +cuteangel +03061985 +loveme24 +21081991 +22081986 +emprego +lifelife +fire1234 +smellycat +heath1 +2101 +106106 +112113 +19061991 +001988 +hotman1 +123432 +ryan07 +030988 +13love +eggman +200985 +24051990 +111084 +yoyo11 +tiger15 +jazzmine +150000 +mario11 +241184 +041187 +lucky99 +26031988 +23102310 +16041991 +01051988 +10111983 +hhh123 +270690 +251094 +andrea14 +courtney +30121988 +26021985 +mobil +ericeric +cheese69 +bil +geelong +footbal1 +littleboy +14081989 +newone1 +170189 +pastis51 +100192 +comeback +23242526 +050990 +hotshit +16061989 +210892 +madrigal +satisfaction +080988 +psalms91 +mansour +redondo +02051990 +iloveme5 +deeven +130584 +imcool123 +28101988 +19031991 +23071986 +lagwagon +261084 +farouk +hockey69 +180292 +260785 +rockys +menina +barbie +carefree +131181 +friends9 +burnout1 +852456a +lovejesus1 +sept16 +buddy07 +1life1love +lealea +11101987 +240888 +sandy11 +uf +ripazha +myhusband +31121988 +luvu4ever +270784 +230792 +281091 +15987532 +mystuff +tigger18 +301287 +thought +chauhan +120980 +24071990 +150385 +23041985 +joyjoy1 +01101984 +2303 +yyz59gtp100 +meadow1 +jimmy13 +genuine +passat1 +27121991 +600028 +lakers21 +11031986 +07071992 +889988 +baldwin1 +boulot +password85 +01081989 +volvos60 +180391 +carlson +tgbyhn +citrus +talgat +19121992 +lenusik +iamtheking +14081986 +funstuff +250485 +thedon1 +cutify +ujnbrf +letsgo1 +cow +silver21 +aznpride +191089 +single01 +solo123 +240188 +met +spaghetti1 +yayang +amazonka +tinkerbell +bears23 +stick +sarah! +hiroshi +beer69 +gy3yt2rgls +shreeganesh +24021990 +leaves +111www +advokat +27091991 +not +7794422 +caseydog +220484 +301084 +fonseca +donny +987456123 +29061990 +hysteria +wade +230784 +28101986 +ooo +modelo +12345678h +150984 +sharik +catscats +1.23457e +sexygirls +azerty01 +josefina1 +june2006 +1234567890m +freeme1 +211091 +pearl123 +glorioso +11051991 +1234321q +llcoolj1 +6d2-24e5r +emm +1truth +dominique2 +aptiva +14061986 +cutie21 +23111989 +250287 +bridges +150286 +mikel +jackman +300490 +161087 +hair +slugger1 +21061986 +29101990 +babyboo123 +190285 +250491 +eagles13 +f1234567 +1937 +orwell +houses1 +snuggle1 +421301 +sophie3 +slammer +crocodil +papi +110991 +peaches! +11051984 +hippo123 +tebow15 +101178 +25051984 +chaingang1 +100582 +sashenka +218540 +03061987 +210383 +215215 +14061987 +coors1 +icecold1 +1westside +22101991 +betty21 +vfkmdbyf +02041990 +larsson7 +cole12 +sasasa1 +07061985nina +steven5 +gattuso +repytwjd +google1234 +11071986 +univers +sassy11 +halo3rocks +raw123 +rodeo +17121984 +shorty09 +matthew09 +28051987 +8520456 +baller01 +pinocho +197611 +keykey1 +110382 +24081991 +280790 +shortstuff +21101991 +130792 +superman16 +bestfriend1 +gfhfif +shyshy1 +coolie +moveon +101213 +laptop123 +ashley05 +22041990 +081288 +051092 +cousin1 +300190 +09876543211 +camaro68 +15071985 +class11 +jp1234 +born2win +goth666 +transcend +riodejaneiro +planes +06011982 +darlington +17041992 +161282 +132001 +bluefish1 +salinas831 +patricia12 +chicken23 +mistake +shekhar +28101985 +darrin +19471947 +123123l +1900 +22081988 +.adgj +manamana +snatch1 +sasha13 +yamaha2 +091288 +chill +200580 +cardoso +macho +21101989 +270389 +poilkj +omen666 +shahzad +iluvchris1 +120382 +awerty +stampede +ottobre +onlylove +198601 +gender +tyler21 +120678 +25071987 +hill +654654654 +weird1 +290588 +emil +dragonz +process +300485 +vavilon +21011986 +17081988 +colombe +ramakrishna +babygirl93 +poubelle +kumkum +181185 +060988 +290487 +pfqxjyjr +04021987 +p2ssw0rd +18081987 +aileen1 +apollo12 +aserzx1 +olympic +020989 +demian +mechanic1 +1357642 +ilovemark1 +27011988 +aardvark1 +keke +180987 +christian! +6666667 +140891 +pocket1 +konami +milly123 +sentra +ministry1 +kiersten +sample1 +angel2000 +27021990 +myebiz123 +happy14 +070990 +why123 +anicka +240591 +grandkids1 +zzzzzz +welcom +roflmao1 +civilwar +wallst +johny +border +duck12 +maggie21 +snoopy5 +cookie08 +divorced +parker123 +500028 +iloveno1 +15111987 +link2011 +21041986 +05091984 +2106 +090588 +imperium +hotpussy +barone +21021988 +shadow89 +babygirl96 +star25 +08081987 +tweety +300788 +bipbip +17071990 +29061988 +040890 +irule +puppies12 +aaaaaa12 +cock123 +20011988 +230991 +211284 +nikita12 +291090 +calabaza +lucky1 +honda7 +mermaids +janeiro +dominica +massimo1 +antman +juventus +shells +sutherland +franco123 +beavers1 +tigger17 +nexus +canine +13101984 +blue06 +adebola +wagner1 +pumpkin123 +tygrys +loveu12 +missy01 +140490 +03071987 +george5 +gamma +catering +281082 +mustang23 +16101985 +10021984 +2597758 +mongo1 +bauhaus +1hotmomma +220287 +mae +champ24 +030490 +lashawn +pelumi +221987 +kimerald +ashtray +10071988 +shannon1 +199300 +hellboy2 +agatka +30081988 +05031987 +ohbaby1 +asasasasas +wtpfhm +carebear2 +kelly11 +billion +110021 +rolltide12 +mommydaddy +apollon +260386 +kaylin +januar +samsung5 +anna22 +lol321 +hearts12 +kakawka +260391 +jack +snowhite +badboy23 +ciocolata +230391 +david25 +mike19 +170386 +abc12345 +280289 +alisson +radmila5 +arthur123 +ripley1 +231283 +jacob22 +blue456 +021086 +cleo123 +camaro67 +260187 +01021984 +inzaghi +24021986 +maradona1 +pressure +29031988 +asdfdsa +110981 +191186 +atx512 +tugboat +040485 +1forgot +29011987 +awesome3 +110186 +19061990 +brit +crystal +tommy7 +football76 +cucaracha +iron +030689 +sweetboy +143441 +reggie12 +okokokok +150383 +12111985 +270985 +bigone1 +mansoor +cacahuete +cerulean +ocean123 +matt17 +prince3 +midnight13 +090985 +250883 +20041991 +gaby12 +michael27 +23031986 +luanda +copito +matrix23 +alfalfa +holloway +david88 +gemini +hubby1 +puppy5 +11101988 +sexxxx +darkmoon +211184 +02031984 +kill3r +23121990 +aaaaaa2 +bang +28091987 +020785 +morgan99 +080892 +01021992 +sweet4 +131092 +ladydog +rajarani +12071985 +pennywise1 +b1tches +gunner12 +05051992 +281092 +310387 +winning +vfvfgfgfz +bionda +passes +jesse3 +mykids5 +gjkbyrf +13071990 +19101986 +ronnel +anime12 +kkk111 +ducati996 +lilian1 +290390 +kelly13 +dominicana +gfhnbpfy +azteca +elvispresley +korea1 +09080706 +kaiden1 +daughters2 +15091986 +united7 +jolina +sambo +shorty18 +moonwalk +airjordan1 +8iiw4ct9rq +manzanita +stephanie7 +100791 +310784 +170387 +sierra11 +131192 +kayla14 +favorite1 +rainbow22 +popeyes +torero +piggies +laura11 +13031988 +161283 +easy1234 +pooh1234 +090991 +wildones +10221022 +moremore +050789 +cubswin1 +catalan +27031990 +bubbles9 +gilgamesh +nisha123 +medieval +timmy12 +16041988 +25041989 +200884 +marlee +25021986 +04071988 +qweqwe12 +irochka +class05 +fickdich1 +dallas7 +28021988 +george23 +pw2012yr +vergara +dicker +ugochukwu +shelbygt500 +aliens1 +faceoff +19061986 +buddy8 +220483 +conor1 +ira +belgium +robbie123 +311091 +20061984 +pedersen +hayden123 +01041991 +omar13 +samwise +blank +phantom2 +250991 +minion +wal +rahmat +pimpin09 +10091991 +angel2006 +30071987 +heather01 +daniel98 +zagreb +football58 +vfufpby +boondocks1 +yeshua1 +expedition +17101985 +iloveamy1 +eagles3 +020390 +lover24 +01121986 +zippo1 +240691 +fudge123 +smeagol +live2ride +1928 +joey01 +20051990 +flower21 +22031987 +butthead2 +26101983 +tigger06 +martin23 +151089 +pantek +helpdesk +a1234a +codelyoko +28031991 +amandeep +011086 +181182 +201287 +tata12 +qq123456 +261182 +muffy +130983 +crazy15 +14081987 +estefany +joseph! +17041990 +amanda09 +mike101 +arina +gambler1 +chandana +060890 +200892 +iaminlove +kikina +198123 +yankees5 +aaron3 +1q2w3e1q2w3e +19866891 +021289 +sparkey1 +buggy +nena +16101984 +230583 +petter +270890 +18101989 +170784 +tiger77 +cutie8 +bulldog3 +mustang21 +hannah18 +17021988 +15101992 +11091991 +audrey +pernille +grace01 +21091991 +010288 +grandkids5 +29121986 +171089 +280987 +halo13 +sarah69 +26121986 +26101984 +peoria +tigers! +poopie! +buddys1 +panatha13 +mexico17 +hollis +froglegs +190785 +seth123 +raiders1 +nicholas5 +flygirl +170887 +25091991 +14101992 +magic13 +170390 +lebedeva +27071990 +2horses +hallo12345 +jonathan123 +170286 +steelers1 +mom12345 +milan123 +tonyromo9 +halo360 +cook +bailey05 +bulldog7 +lemans +10081984 +access123 +tho +billabong2 +maddox1 +antonio10 +140885 +oneone1 +170186 +lbvfcbr +trevor123 +tunde1 +24041988 +brittany14 +antosha +210483 +150692 +semenov +69eyes +player10 +dipset3 +221083 +lfc123 +mustang4 +sadhana +cool01 +bulldozer +nick69 +hatice +17031991 +25071989 +airwalk +dozer +25071991 +inside1 +amaury +280891 +jr123456 +834001 +ellis +dnstuff +12011991 +cherry4 +a1b2c3d4 +certified +love_me +mamaku +gwendolyn +cupido +rock10 +241182 +12121981 +021285 +freespirit +musique1 +monkey26 +server1 +diablo13 +mykids03 +ransom +a010203 +kandy1 +superuser +natasha +viktor +040589 +19031988 +lalala. +logan01 +jammer1 +mividaloca +p4vkinrw6x +louloutte +300889 +12041994 +230692 +03030303 +230782 +221984 +daniela12 +160891 +kellen +08031990 +soulmates +patches123 +cristina +mj2345 +fin +suzuki750 +301080 +topaz1 +andrew19 +friday +adrian10 +22051985 +click5 +internet +sultan1 +14071990 +springtime +eagles23 +160491 +victoria13 +asskicker +hardcore2 +bichette +steven +karina13 +anthony25 +pickle2 +lover08 +ballin24 +tyler101 +jenn123 +sexything +chino13 +mashimaro +3100 +hippopo +hanihani +280786 +hotgurl1 +15021983 +031287 +sleep1 +31051988 +yemisi +kimberly +smokey10 +280587 +andy01 +pookey1 +natalia +19141914 +181189 +191090 +delorean +abcdef2 +14051985 +jesus24 +mustang00 +rjnzif +weller +030687 +vampire123 +190891 +14051988 +qwe223 +140492 +john17 +adgjmpt +bug +friend +back2back +memyselfan +toytoy +31101990 +primus1 +gurpreet +jonathan1 +midcont +tiago +toni123 +ferrari2 +maggie23 +ikillyou +18051989 +whatever22 +200287 +alyssa7 +gtkmvtyb +it +21071989 +football60 +020790 +ccc +tinker13 +02041989 +yessir1 +boeing737 +17091985 +sexy2009 +221292 +02101989 +22081985 +lisbeth +31011989 +11111988 +100481 +aman +260593 +sasha1997 +erevan +260189 +yahoo3 +hotdog11 +melmel1 +duke13 +love1997 +03031993 +251091 +261191 +05121985 +290786 +cordero +23101984 +fuckhim1 +010193 +diciembre1 +xchange +cookies5 +151191 +punk666 +01031990 +genocide +arrowhead1 +281184 +arroyo +pinky3 +journal +24051989 +1clen1 +gonzalo1 +daisy22 +mommy21 +261183 +melita +frost1 +generic1 +graves +1gangster +amor10 +03061990 +315023 +02101990 +homehome +120579 +rotimi +21101985 +nikolina +shadow1 +197511 +25051992 +karatekid +411006 +persian +121212w +rollins +nikki01 +player4 +parsifal +yandel +rhfdxtyrj +group +29041988 +newyork13 +football67 +23081989 +westside23 +210000 +intranet +football70 +vbkbwbz +963 +25041986 +eeeeeee +trfnthbyf +20111985 +setiawan +96969696 +26041990 +mariusz1 +princess90 +191187 +liarliar1 +buddy69 +maybe1 +werock +zaq +31121989 +trains1 +supersuper +edward21 +pinky13 +poohbear14 +bama12 +lucy13 +jordan95 +mike77 +segreto +josh18 +grace5 +100483 +zwn6vbdvpj +puppie +23091992 +nigga11 +chris26 +angel1 +221226 +21021984 +07051987 +teamo. +260987 +steve2 +melissa21 +16031990 +taylor. +08081985 +weed101 +dirtbike12 +yummy123 +220380 +gracious +gaara +22071985 +20031985 +shift1 +051286 +190000 +musicmusic +17061991 +11091987 +tj1234 +ane4ka +24031988 +21081990 +raiders5 +godsgrace +15051988 +120595 +saun +hoosier1 +george69 +katlyn1 +22081989 +derrick2 +ghost13 +hotty101 +sosexy +awesome +akolang +11041984 +jenny10 +220881 +24121988 +cantik1 +baxter12 +vasant +yankees02 +ilovetony +pomodoro +270987 +560010 +180386 +040788 +030387 +560102 +london7 +puppet1 +cletus +000000m +lover. +stockton1 +050890 +mybabygirl +22111985 +flowers7 +101983 +241291 +attack1 +honey143 +choochoo1 +1liverpool +jamaica2 +16121990 +23111990 +danny14 +carlin +nafisa +mabel +290789 +grounded1 +hannah98 +18011991 +10021983 +f0rever +joeblow +booyaka619 +201191 +vipergts +sammie2 +250391 +harry7 +satanas666 +thedevil +18081989 +131213 +elegance +gracie3 +one1love +198505 +sexygirl10 +elisabeth +hardy +201183 +parachute +240492 +magick1 +jerome123 +03051990 +johan1 +oscardog +18021989 +mimama +200684 +messi123 +191285 +180786 +135642 +pooface +princess04 +19021992 +missing1 +11071990 +demonic +region +buzzer +ryan16 +andrada +261192 +tasha12 +270586 +ford12 +251080 +19061984 +05061992 +ryan69 +ilovetony1 +31121984 +150883 +cubby1 +alleycat1 +28021986 +181287 +taylor04 +feliks +28021990 +31031986 +23071990 +dalejr1 +28111986 +lucas10 +041088 +basketball12 +chevy1500 +anhnhoem +11111983 +170191 +pimpin07 +dewalt +papa1234 +14081990 +10041988 +15011985 +booboo23 +nathan09 +liverpool3 +mars13 +zaebali +47114711 +onimusha +14061985 +akusayangk +130384 +19011989 +150191 +270388 +macska +001977 +sean1234 +jeffry +daxter +14111985 +maimouna +megamanx +10031993 +rodica +marshal1 +poppy12 +hookup +lordoftherings +class2007 +wertyuiop +19111985 +nokia2 +roadking1 +dearest +rockstar22 +sassy3 +lilman123 +190585 +14111991 +30041992 +buddy08 +tessa123 +16041990 +sasa1234 +vjybnjh +tweety10 +01011 +20071991 +13051985 +meggie1 +thatshot +181285 +seafood +skater01 +120978 +zhangwei +280885 +mnb123 +220192 +severin +heroin +kobe81 +amber69 +pimp00 +andrew04 +lovestinks +200186 +030888 +rangers1 +level42 +joshua9 +21021985 +miamia1 +031088 +xbox360 +0277127298 +rogerio +23101988 +31101988 +laugh +19251925 +mommys1 +feelings +ramarama +stokecity +shamim +mira +25031991 +abc111 +150482 +abuse_123456_abuse +baluga +n1cole +201182 +sammy23 +987654321s +petr +091189 +27051987 +100382 +19091987 +taker1 +190584 +mariano1 +alcohol1 +12341234q +master77 +250383 +michael77 +simon12 +jack69 +alabama12 +18111987 +16091988 +18121984 +myjesus1 +pappy1 +lauren14 +22041989 +snickers +mylove22 +9itz78vufw +d68pyfuh2v +peaches01 +hermano +akomismo +legoman +sahana +minino +colnago +odz1w1rb9t +linkedinpassword +patrick9 +master007 +check1 +22031986 +29031991 +liana +banana22 +120792 +060790 +141191 +300389 +301280 +superman25 +wallace2 +flower9 +pigpen +070792 +chicken10 +051285 +260484 +16051987 +lance123 +babyboy4 +aqaqaq +god4life +ronaldo12 +20081989 +14061990 +breathe1 +shelby10 +011287 +kilokilo +lildevil +03071986 +iloveme23 +26061985 +2107 +27021987 +worlds +sayangku1 +ragnar +pravda +golaso64 +pupkin +sno +2201 +20041989 +rex +10021993 +monster666 +taterbug +rfhfufylf +28121986 +green09 +16021988 +webmaster1 +31101989 +rfvbkkf +210781 +sharmaine +291284 +100881 +134679a +programmer +yellow14 +110581 +291190 +bell123 +cherie1 +fatboy69 +raindrops +100291 +bmw520 +thorsten +jacob4 +rock01 +1rabbit +baxter123 +008hotboy +saints12 +raymundo +gundamwing +redsox7 +271192 +yellow69 +lucas2 +250786 +russia +monkeygirl +rosalie1 +moomin +shadow33 +17091991 +alex666 +nasreen +istanbul1 +destruction +gnbxrf +19121985 +251291 +calvin123 +160785 +roderick1 +173173 +13091986 +dogs101 +black101 +harmon +301182 +19011986 +mercure +killa23 +cameron13 +270187 +20011986 +29091991 +1bitches +snowy123 +198602 +lizzie123 +17071991 +son123 +patches +16061991 +15061985 +sizzle +april05 +40404040 +180488 +alex33 +eskimo1 +damned +040688 +122345 +22101992 +zizou +magic5 +xxxxxx6 +a333333 +forgetit1 +dreamers +tgpw53j3kg +dalida +sweet101 +eric01 +amanda19 +02081984 +derby1 +nonloso +17091986 +jannie +221181 +ramon123 +tony15 +sai123 +henning +freesex +180486 +10291029 +venture1 +joker21 +yakumo +black1234 +181282 +madison09 +031186 +180290 +sucks +sampras +ford01 +flying1 +peridot +fluffy01 +tigers06 +kevin69 +29101987 +10101994 +sexy30 +daniel77 +davidm +asdfgh6 +sounds +aaaaaa123 +gaspard +170687 +hailmary +280286 +kitten3 +mimino +290586 +22061992 +lollollol1 +zxc789 +penny12 +faizal +tristan2 +arvin +151285 +dragonfly2 +alyssa5 +baby95 +180487 +continue1 +hotty12 +iloveu9 +10071985 +310386 +purple19 +prada1 +chobit +220189 +doofus +nestor1 +bunnie1 +tecnico +passord1 +hollyy +123213 +ciao123 +131184 +230682 +subhash +delsol +11101989 +tiffani1 +17111989 +9052950013 +beastie1 +210891 +ybrjkftdyf +mustang22 +christ123 +storms +250000 +ramkumar +paganini +sigmund +forever14 +j11111 +danidani +paakow +myrtille +135798 +27111985 +081289 +290992 +seagulls +weaver1 +luisfigo +0o9i8u7y6t +stephanie0 +emilee1 +blue12345 +conker +22442244 +baseball26 +myboo +03101991 +369874 +gabi123 +love54 +ilove23 +091188 +300886 +sonnenschein +jesus20 +23121989 +197373 +dfczdfcz ++++++++++++++ +maja +monster01 +29091992 +westside7 +280788 +bunnyboo +411411 +30071986 +1504 +valter +antwan1 +27081990 +13041989 +peanut09 +190786 +marito +23091993 +kimono +blbjn007 +31071986 +12stones +june04 +marie9 +aleale +monica +arpita +bugs +02061991 +oneandonly +1bailey +naruto95 +fussball +tanner +15041986 +33 +therese1 +cheeseburger +nikki69 +ciccione +batman9 +020885 +godisgood2 +26061988 +27121990 +dance4 +15253545 +sexy92 +kornkorn +zurich +160484 +footprints +rehana +conquer +2105 +social123 +200987 +loren +joystick +bagels +fsd9shtyut +nfnmzyf +babygirl45 +euskadi +25061989 +imyours +36987412 +carwash1 +general01 +198219 +291183 +sassy13 +21121992 +29051991 +lakers7 +alex1986 +291288 +21051985 +badgirl2 +actress1 +190687 +forever +23011989 +23041988 +#1lover +070888 +1bandit +firestarter +sushil +arthur +280492 +21111991 +stevenson +soyfeliz +zolika +kiwikiwi +dada12 +cutlass1 +198426 +orange44 +bateria +kurniawan +daniel03 +241283 +400057 +like +1301 +pickle12 +craig123 +пїѕпїѕпїѕ +mybabe +251191 +3000 +chicky1 +852 +gino +blast +ami +400002 +jovana +chatter +lidia +12051984 +matthew16 +daisuki +9inches +playground +hehehehe +marbles1 +computer22 +tonya +180592 +adadeh +hayward +310389 +dj12345 +ttr125 +lookin +bigpoppa1 +19011987 +geezer +ibragim +zachary7 +rc.itymrf +yyyyyyyy +23021986 +penis5 +13101991 +dima1994 +201282 +30121985 +18051985 +donald123 +26081987 +19101991 +07091988 +john1 +29061989 +180989 +scooby69 +spacemy1 +fallen123 +allure +021189 +killjoy1 +netnet +saffron1 +131083 +030587 +10061990 +13061985 +28021991 +250382 +160883 +100282 +rachel10 +sharif +orlova +wings1 +chiaretta +852963741 +14011992 +210784 +al1234 +25111985 +hannah101 +biedronka +skater22 +cassano +bulldogs2 +150683 +mc1234 +ilonka +atlanta7 +25081987 +ilovefood1 +otioti +22061986 +money06 +steelers07 +oluchi +brenda13 +parts +191287 +24021989 +patron1 +31071991 +280892 +freed0m +tweety! +321qwe +miami13 +ilovegod! +baseball05 +dulcemaria +streetball +avengers +nichols +shorty07 +delhi123 +120493 +mkmkmk +170692 +120593 +290986 +rusalka +210682 +rat123 +idontno1 +citadel +carl123 +aa123123 +williams12 +12345@ +lztez2xe98 +import +kids04 +270390 +reeree1 +godsgift +2332 +bilbo1 +1511 +dejesus +chanchal +21081986 +160489 +jerick +dimochka +riley12 +240583 +mariachi +02121988 +double1 +210285 +john24 +15021992 +sasha2010 +pepper33 +sarada +pollo123 +151281 +040889 +pedros +sammy1234 +school7 +dragones +patrick10 +27081991 +daniela +ctcnhf +hol +fuckoff11 +240387 +komatsu +raiders01 +chaparra1 +1love2 +21061985 +dragon19 +dididi +shiva1 +heavy1 +memole +onelove12 +solano +14031988 +morgan4 +18101990 +26021991 +burzum +simcity +moonbeam1 +19121984 +241083 +june02 +java +moneybags1 +tan123 +831001 +neo +01011973 +250505 +aaaaa2 +chandru +wendys1 +saloni +pistola +patita +souljaboy2 +spirou +4747 +220693 +199411 +nicholas01 +080990 +18021992 +norte4 +311283 +die666 +longbow +456963 +16031988 +260786 +patrick22 +mariateresa +superman17 +panchito1 +220791 +13091991 +140982 +lilchris1 +nigger7 +murphy11 +macaroni1 +deanne +2stupid +gemini12 +delphin +babigurl1 +four44 +theodora +02041992 +170892 +mcdonald1 +28081985 +bong +ajay +rockstar23 +cool55 +spider11 +cherrycoke +camilo1 +shippo +197100 +170290 +160690 +may2006 +pixiedust +161186 +tyler05 +snooker147 +baileys +daddad +bambush +scrapper +abcdefg2 +sclub7 +221986 +14011991 +wrinkles1 +devika +mamusia1 +yourface +121976 +nani +football87 +140483 +yahoos +29091989 +17091987 +spencer +olegoleg +catcatcat +discount +win123 +2206 +badbad +travis +14111989 +yourmom7 +190485 +scimmia +hawthorne +starsky +shortys +240287 +30031989 +dalmation +fuckoff420 +222221 +17031989 +absolute1 +homies13 +01091992 +sniper12 +01101986 +nicole101 +gardener +yousuck123 +nottelling +sydney2 +260783 +bartlett +a159357 +10091984 +20091986 +17101992 +001 +april06 +slipknot3 +butchie +mazahaka +harder +11223355 +schultz +pooja123 +yugioh123 +warwick1 +jonas101 +lbvf +1123456789 +defiant1 +mariaclara +199315 +gemini22 +naomie +baseball28 +031090 +pierce1 +230484 +210884 +24041986 +scorpio2 +muenchen +magpies1 +majeed +cheeze +settings +100million +aaron01 +scrappy2 +matteo1 +candy16 +24091987 +21081985 +24021991 +boriqua1 +30051990 +cherry23 +polizei +green44 +19111986 +alienware +google7 +301183 +lol666 +loveme9 +linksys +orange9 +turtle22 +hertha +jaimie +22071988 +emoboy1 +orlando123 +thunder1 +jesus16 +17021992 +sokrates +zemfira +170788 +111974 +280990 +rolling1 +black09 +03101989 +cvbncvbn +seymour1 +bl +160284 +skittles3 +310186 +041286 +69love +lovergirl2 +paul11 +23061992 +yoyoyo2 +cherry21 +lenchik +1snoopy +neverland1 +070889 +4343 +190287 +kalle123 +210983 +230184 +delhi +different1 +291187 +sunny7 +skater32 +pinky5 +kotkot +clarion +11111990 +040691 +140582 +070783 +rosado +brian11 +mlqdakf8yt +fuck101 +qwerty86 +75757575 +yusuf1 +lilrob1 +230283 +isabella1 +melly1 +nannie +29051987 +summer2006 +maxie +matt10 +170591 +121079 +lady11 +221082 +mavrick +rita123 +julienne +140684 +tes +shorty17 +fuck88 +141082 +021190 +18021990 +serenity2 +050592 +140282 +myspace89 +12481632 +001002003 +scumbag1 +12071986 +010686 +fontana +kaleb +uncle +jayman +150485 +03061991 +heslo1 +171184 +1vanessa +trythis1 +bichito +organic1 +andrea5 +555123 +molly1234 +fuckoff5 +cuties1 +p00kie +cosanostra +triton1 +qwertasdfgzxcvb +cfiekmrf +fericire +football73 +my1andonly +140494 +1badgirl +25021990 +fevrier +brooke +300385 +traviesa1 +011090 +sophie! +231081 +270885 +welc0me +hello24 +pimp18 +12password +01101988 +roofer +ilovecody +091287 +crown +071287 +nero +style +shoes123 +131281 +adetunji +westside4 +kamilka +110580 +23051983 +140591 +rangers11 +02061990 +3141592653 +160583 +ilovemybaby +ja1234 +keepitreal +123789654 +030786 +carlos17 +kochamcie1 +eagles07 +nepali +giants21 +meemee +broncos24 +15111990 +30031986 +1pumpkin +ppp000 +girls69 +mymommy1 +mervin +01061983 +rickey1 +cathy123 +rennes +310584 +27011987 +ciaobella +my2dogs +1mylove +08021990 +killer07 +airhead +simon2 +elijah3 +agbdlcid +031290 +millos +small +10102020 +220892 +lynnette +zaqxsw1 +25061986 +fgrd58es24 +1304 +mike45 +dude69 +050687 +rose10 +candy1234 +medicine1 +05061985 +wingchun +stella +10051983 +01121990 +071 +198333 +milito +sarah14 +happy08 +balls69 +orange33 +nique1 +chiodos1 +pork +wonderboy +naruto16 +25071985 +16111990 +burgos +raffaello +mamalove +ashlie +240885 +270590 +pomona1 +thebeach +240887 +250290 +020988 +dietpepsi1 +21031989 +babu +rose01 +chambers1 +141283 +250187 +270288 +020787 +hockey25 +041291 +jj +180684 +29041986 +gemini11 +skate! +010107 +20101983 +santino1 +babie1 +imapimp1 +130292 +290985 +piloto +sunshine15 +dos +orquidea +mickey16 +060683 +ilovescott +280789 +badoo1 +angel30 +01021991 +300685 +royboy +khalifa +especial +1258963 +19491949 +21071992 +18121985 +17071986 +spain1 +qq12345 +mclovin +411048 +mojomojo +goodone +garland1 +reptile1 +tyson2 +xzxzxz +apple9 +190686 +myname123 +260887 +01071989 +17011989 +alvin123 +virgos +garfield2 +concon +southampton +041189 +14031987 +4me2no +kidney +alexis9 +aleman +1morgan +27061985 +02061985 +06061992 +1sammy +jeremy7 +pink19 +111292 +31101987 +110293 +fatboy13 +faith11 +tyler16 +normandie +04081987 +red100 +truelove2 +24121984 +anyuta +bismillah786 +vin +230882 +29031990 +21111987 +250191 +james33 +guess123 +23091988 +creation1 +july08 +7788414 +26041989 +babochka +051090 +dmitriy +walkman1 +graphic +aurora32 +esquire +zaq123wsx +111zzz +parabola +basshunter +10021985 +wybe4591 +198918 +111281 +traci +estrelinha +felipe12 +fuckyou2 +25081989 +6children +nouveau +3rjs1la7qe +1116 +kit +waylon +aguilar1 +sept12 +mahadev +monkey28 +091285 +chelsea14 +james +iii +golf18 +scuola +linkinpark1 +13071989 +26081988 +orlandobloom +katekate +12021993 +klubnika +smarties1 +560025 +281083 +poop21 +cassius1 +bosco123 +slayer13 +vidhya +300985 +northern1 +mark21 +alladin +asshole01 +stephen123 +clapton1 +228 +chubbs1 +310889 +11041985 +220583 +pimpen1 +bogus1 +144144 +010586 +priceless +16121985 +james20 +ramadevi +jeepster +anonimo +9898 +polar1 +knives +babygurl07 +21041991 +04061988 +16081990 +nicole77 +amirul +sheckler1 +swift +chicago12 +alpha2 +joshua98 +12081983 +28121989 +10211021 +15101984 +shella +010886 +suisse +spock1 +skippy123 +kindergarten +d1amond +12021981 +donomar1 +198225 +gitrdone +raptor700 +198820 +30051987 +8x2h4fddap +willow2 +rosie2 +08081992 +rock4life +260287 +hibernia +24031986 +greengreen +modupe +monami +babylon1 +iloveu6 +kasey9 +koolkool +gemini +kingcobra +29051986 +18111986 +15061991 +180884 +graeme +pr1nc3ss +saveme1 +fatdog +02011989 +gambia +paterson +berber +30101991 +cookie1234 +11921192 +fantasia1 +trotter +170690 +yankees09 +marlins +loveman +001974 +maggie99 +26121989 +angel44 +241282 +121095 +150287 +220384 +kfvgjxrf +tables +ashley25 +17071989 +5151 +2526 +snoopy21 +natura +130491 +skaters1 +19071985 +thriller1 +15111989 +oldspice +280691 +blahblahbl +231083 +171083 +miramar +lovely8 +2020fb +heather4 +gunman +number17 +alexis15 +23081987 +16061990 +kerri +darkness6 +leones +1593575 +einstein +03121987 +tribal1 +india +040789 +85858585 +1zxcvbn +140391 +27041989 +6363 +tampabay1 +19061989 +milford +swerty +watsup +17061987 +hillsong +celtic1967 +hondas1 +amazonas +26051986 +++ +truand +slipknot11 +daniel26 +wangwang +rainbow8 +010179 +l3tm3in +250390 +lovemama +rockout1 +270786 +mywife1 +ryjgjxrf +170587 +darrel +coco23 +vampire12 +potter123 +cashew +55 +041289 +tyree1 +00009999 +160586 +bigdog69 +bailey09 +jackdog +diamond08 +gussie +trinitron1 +camila12 +password67 +vfhvtkfl +07071985 +revilo +sw0rdfish +munmun +kevin1234 +lenore +23111992 +290386 +211291 +calipso +amoretiamo +ronnie123 +sourire +babygirl +frenzy +ocarina +douglas2 +feeder +041186 +jesus2010 +10051984 +steffi1 +@gmail.com.mx +sue123 +hunter77 +brasil123 +bellas +dallas3 +angels! +nachos1 +sergeevna +230492 +lolipop12 +061286 +140592 +veronica +analaura +199712 +stifler +panthers2 +17061988 +hang10 +mr +elvis2 +grandma12 +carole1 +deathstar +bhushan +zambia +tanga +sanjay123 +parasite +kwabena +doreen1 +emmanuel12 +30051988 +01091988 +smartgirl +pipicaca +princess0 +elloco +15011986 +farhad +seanjohn +kaitlynn +shorty08 +duchesse +26011987 +какашка +030392 +thomas05 +sexy2008 +tomjerry +isaiah12 +danielle5 +anupam +160789 +148888 +argyle +emily4 +temporal +05071990 +shinta +calvary +contreras1 +zachary +160990 +loved +chase2 +zhongguo +ryan06 +29121985 +21111985 +01081986 +freshboy +getfucked +16051991 +sexygirl13 +21011985 +sports11 +myspace777 +goblin1 +fanta1 +130482 +123456me +poiuytrewq1 +291283 +spring12 +04061984 +ange +23021984 +25011987 +23051984 +051191 +bella06 +loveyou8 +27021992 +charles +23041989 +millie01 +11011984 +doggys +21011989 +121296 +06071984 +220482 +250580 +underwear1 +safina +newyear1 +271182 +04061987 +bandit7 +bella21 +68686868 +03091987 +rediska +momo11 +horndog +28071988 +isabella3 +justme123 +lamar +luvbug1 +15111985 +loveme18 +110782 +26091986 +adidas3 +091186 +umesh +01011972 +flowers5 +200584 +nigger4 +vqsablpzla +12345678f +cookies7 +300988 +02071990 +29071987 +arsehole +manuel +zoulou +werwerwer +100681 +291291 +123321m +040588 +26071990 +25031986 +agnese +150691 +01061992 +johnnyboy +030787 +18091986 +abdullah1 +1472580 +love1988 +apple8 +password04 +adrian +kokoko1 +dustin2 +goldfish2 +labyrinth +rainbow9 +halifax1 +grzegorz +ticktock +miumiu +football62 +harman1 +15011990 +12111984 +02091989 +malandi +180191 +agassi +20091990 +270685 +video123 +libby123 +400013 +dancedance +23081986 +chris27 +blacksmith +240884 +agyeman +josue +10111984 +money2009 +11061989 +superstar! +wholesale +16111989 +percival +010990 +22071989 +montevideo +pimpin6 +lowrider13 +180689 +20121992 +calypso1 +sanjo408 +lala14 +justyna1 +22031985 +tanner11 +ou812ic +vette1 +suckmycock +pretty01 +tayler1 +perrine +210287 +101179 +13051992 +zxcvbnmmnbvcxz +alleluia +fuckyou33 +29061987 +joshua20 +05091987 +ubuntu +15031986 +mybuddy1 +17051985 +bracken1 +coucou1 +011289 +160791 +28031990 +14041984 +chico2 +dolphins12 +davion1 +010789 +e65r82kni2 +malin +peaces +toodles1 +jorden1 +beulah +stetson +trauma +tinytim +27061990 +281090 +paige12 +23061986 +ryan08 +evanescenc +yellow15 +sexyboy2 +260984 +21121984 +10091988 +nintend0 +kp9v1ro7lh +polo1234 +1234567654321 +meow12 +diablo22 +1503 +belair +beltran +paparoach1 +berenice1 +antique +25011985 +football71 +jhonatan +caballos +nigga4 +strawberries +pipi +purpose +160591 +310885 +23051985 +darklord1 +08081990 +love1212 +kuba123 +271084 +iamfree +chester1 +020891 +110693 +kenobi +houston123 +dogbert +28011987 +tarantado +213 +allied +danny21 +mitchel1 +jeremiah2 +02121986 +14071988 +03051987 +dakota5 +18021986 +02031983 +malaka1 +andi +ginny1 +harding +kipling +danielle10 +hayden01 +skadden +maria +baddog1 +negrita1 +300186 +candi +honda11 +articolo31 +bathroom1 +sparkie1 +topaze +dylan11 +ghbdtnekmrb +zelda64 +180385 +turtle5 +197346 +q1w +iheartyou +univer +23071988 +14031989 +whore. +ashley89 +sagesse +jessy123 +jesus1 +butter5 +sept20 +23011987 +200500 +diosmio +scrubs +123123b +19371937 +cri +19051985 +sssssssss +hattie1 +10111991 +playboy21 +jerry2 +30041986 +йцукенгшщз +laura01 +13071985 +513513 +emily! +gr33nday +janie1 +11223311 +bird123 +awesomeness +210492 +a12341234 +loubna +goldeneye1 +01041989 +natalie1 +ramiro1 +veggie +01031992 +mouse12 +clothes +gabriel1 +vfktymrfz +davis123 +special2 +040492 +28081992 +25021991 +marcus +170584 +narciso +putain +edward +281285 +fucking69 +theduke +demolition +granger +max007 +raiders21 +24091990 +2wsx2wsx +261283 +14071992 +23031992 +nascar99 +395007 +harvey +nutella1 +danny10 +vining1 +prinzessin +e +welding +170891 +ilovepaul +kaffee +pimp17 +bashir +jingle1 +magic3 +ashton123 +1940 +aq12ws +copycat +fortunato +lexi12 +jackdaniel +haroon +brianna13 +27041987 +bigblack1 +03041990 +google +killer44 +chicka1 +dupa12 +77777771 +cowboys! +blackberry1 +yamakasi +manoj123 +280387 +drive +eyeshield21 +300787 +lavander +lacey123 +hottie18 +05081987 +akinola +bubbles09 +29121990 +omolola +171182 +25021992 +30041988 +orchids +paiste +orange +230681 +200691 +12011989 +010100 +sternchen1 +maxcat +28101989 +02091985 +280191 +050583 +lllll1 +271287 +dallascowboys +lifetec +dragonball1 +joke +200284 +biggles1 +portakal +151083 +1peace +lookout1 +squall1 +211183 +1a2b3c4d5e6f +pimpin08 +carlos16 +26021987 +taylor69 +year2010 +cendrillon +29011990 +06071987 +soleil +554455 +bandgeek1 +rebelde12 +playnow +michael26 +allalone +mamababa +navarro1 +football43 +04081986 +20081984 +23121983 +dexter11 +mather +alyssa07 +meandu +apocalipsis +sparky13 +pass-word +16011987 +140892 +bla123 +18111988 +abba +ponchik +trilly +aqw123 +16051989 +rulez +mexico09 +hockey30 +blackwolf +17081992 +tweety4 +26041987 +loveisgood +fucku5 +1stborn +31101986 +christian6 +blitz +raiders +level1 +isabel12 +ridwan +athletic +17021986 +ramos1 +imran +raihan +130483 +201081 +151151 +marcelina +pass12sa +shruthi +biblia +myangels +babbygirl1 +pink55 +20111984 +121094 +22041983 +money44 +560071 +inuyasha13 +osborne +asdasdas +vincent +tigers23 +rene123 +vasileva +19021985 +logan11 +15011991 +seadog +change12 +music6 +luke1234 +thebitch +pleomax +blackstone +alakazam +guru +150483 +8602229096klo +silver5 +mexico8 +13041986 +sonja +tania123 +vadim1 +ihatelife +hottie1234 +lachlan1 +marieta +1marie +061189 +12431243 +fool +radheradhe +mafia2 +dancer21 +tayl0r +16011990 +toonces +blueberry2 +246813 +05101988 +mama21 +270483 +whatitdo1 +199199 +130184 +teehee +crow +abby01 +football92 +russell +ttt123 +17071992 +14011988 +1blessed +gun +25061988 +199123 +310583 +ilove22 +101990 +justinbeib +301290 +19031983 +fotboll +mylove4 +metallica3 +cookies11 +filip1 +310185 +katyperry +170284 +240886 +221081 +191989 +flakita +101979 +gwapito +vitalina +speedway1 +nightmare2 +985985 +pusspuss +29101985 +180883 +iloveyoumo +bethoven +160584 +161185 +endless1 +270286 +aisling +landen1 +250289 +270591 +28031986 +evans +56785678 +felixx +1redhead +dfkthbq +final7 +lafouine +femmes +superman99 +shiznit +tina1234 +lavanda +240692 +sunshine99 +wangjian +qwer789 +dinheiro +iforgotit +christoph1 +asdasd123123 +241280 +sasha2003 +alamakota +01021982 +miyvarxar +bayside1 +hardc0re +tnt123 +h1992iding +wwewwe1 +ab +280285 +sarah +audioslave +jordan33 +andron +mariobros +lisamarie1 +cali12 +faith56 +180784 +281284 +koko12 +samba +tyler1234 +redwine1 +super13 +catdog11 +bestbuy1 +mollygirl +211083 +version1 +sexycani1 +vtuf36jhufpv +skylinegtr +brianna01 +onegod +260487 +230680 +300786 +france98 +fordgt40 +june05 +bears34 +041290 +poop666 +declan1 +199090 +cupcake5 +25121983 +ashley02 +mummys +tiger +bubba10 +dragon1 +25051983 +orangina +mnbvcxz12 +gordito1 +corine +horses13 +reggie31 +jj12345 +falling1 +samuray +starwars! +bembem +1234567as +michelle24 +warfare +130991 +guardian101 +littlemiss +poppydog +kobe23 +14031986 +260985 +basebal1 +loser45 +thing2 +anneke +040990 +120693 +tolkien1 +song +210183 +avefenix +031291 +12031984 +norwich1 +lor +sunnie +soldado +tink01 +260886 +ghana1 +ghost12 +korean1 +reggina +cookie16 +kinder1 +110982 +124578a +28031989 +fireflies +280190 +323046 +nathan8 +ochoa1 +ball23 +23071989 +dennis2 +iluvu12 +11051992 +tasty1 +19101985 +europe1 +pride +panther7 +melnik +leonleon +march08 +spierdalaj +reckless1 +jailbird +kl123456 +northwest1 +alyssa08 +28071991 +geraldo +dadmom1 +oscar10 +19101984 +121975 +happyone +31011987 +sirisha +181091 +band +21111990 +cordell1 +14011986 +maggie14 +23011986 +live4life +dallas9 +napoli1926 +fireworks1 +13091990 +111083 +310887 +1johnny +dabomb1 +300890 +181291 +041085 +200483 +atchoum +golden +08081984 +stella2 +190889 +101177 +22021983 +yjdbrjdf +fashion101 +200384 +11011985 +11091992 +lisa69 +08021987 +020672 +danny23 +othello1 +chevy4x4 +scooby22 +10011983 +654321b +dakota22 +fercho +nacho123 +men +gosia1 +hektor +18041984 +fly +1406 +12091985 +05071988 +widescreen +jacky123 +13051989 +gr8ful +millonarios +steiner +19011990 +steven14 +click +jamie13 +micaela1 +maxman +katie7 +redlight +softball19 +alexander. +mohawk1 + +almighty5 +courtney3 +catalunya +hershey2 +tigers5 +diavolo +marat +180485 +05071991 +password1234 +28041986 +jobs4me +emmajane +18041988 +godfather2 +contact1 +020283 +24111988 +penelopa +4321rewq +03011987 +miranda12 +elliemay +jessie3 +family22 +bunny3 +inlove123 +labello +money00 +290991 +alex26 +280484 +25091985 +sexy56 +cimbom1905 +29111991 +28061990 +sunshine25 +23071987 +qweasz +110482 +njhygtftb567 +080884 +28121984 +calendario +28081988 +130782 +rfhfrfnbwf +satori +asshole8 +clementina +210580 +7272 +destiny09 +christ12 +400052 +jasmin3 +1234567x +100782 +orchid1 +16101992 +241092 +сергей +22121982 +happy09 +apples22 +wolverin +19071986 +lovers7 +13111991 +frenchy1 +siddiqui +inuyasha! +231292 +hollow1 +220492 +100183 +y +diva09 +shane2 +sasha01 +metallica1 +smash1 +ty1234 +agape1 +moss84 +021282 +xj453cxdxq +bonner +dumass1 +bloodline +01091984 +04071986 +28041989 +190487 +170385 +fruitloop1 +daddyo1 +flyguy1 +donner +mayra +1902 +20011992 +seniors07 +javier13 +270585 +terry26 +cortes +01091990 +300584 +tooter +41414141 +1bowwow +yoville1 +jumpman +dapper +26101991 +guitarist +devilish +vero123 +tasha2 +pal +logical +101075 +galina +270886 +160781 +everyone +yankees24 +springs +kaykay123 +loveme15 +pretty21 +elegant +mother22 +monster1 +061188 +darkness13 +thematrix1 +25121984 +107107 +010178 +barbara123 +29121989 +space12 +230983 +loveno1 +123456789! +170183 +06031987 +forgetful +255225 +01121987 +houston3 +200984 +aezakmi123 +mmklub +fortuna1 +rico123 +shadowman +05051984 +shaikh +13101985 +lissette +exclusive1 +411037 +koolkat1 +stepanov +24101984 +wateva +tryagain1 +fahrenheit +22071992 +gv5235523532 +100982 +jake21 +123abc! +190386 +lausanne +190390 +131081 +250682 +hon +jumbo1 +271283 +skittle +juggalo666 +timothy +loveisblind +12hat93 +30101989 +02011985 +bee +311083 +monkey03 +02041984 +200583 +qwqw1212 +themaster1 +pinkish +100581 +seahorse1 +hubbard +123456abcdef +maranello +dynamic1 +g00dpa$$w0rd +barlow +310390 +24021988 +310588m +taylor24 +alexis8 +panther3 +beasley +turkey2 +js1234 +annina +debbie123 +music40 +antonio11 +15101989 +1a23456 +qwertyu12 +050889 +1478963250 +241080 +120781 +sephora +13021988 +22121984 +anna1987 +stone123 +password!! +010987 +kimber45 +wolves12 +russel1 +iceman123 +sharon12 +ferdie +skooter +logitech123 +money. +poohbear10 +asimov +230992 +sand +tiger45 +mission123 +johnson12 +secret22 +24081990 +horseshoe +puppy11 +juicyfruit +1booger +tuppence +megan3 +29051989 +13081990 +desant +autobus +hunter98 +270683 +26121991 +manusia +masterp1 +22041985 +p3rat54797 +who +crips +sexylady12 +123123k +pacopaco +03041985 +juliano +24061991 +redstone +909909 +solid1 +301091 +bigshow1 +morrissey1 +vovochka +ferrari +12181218 +miguelito1 +13031984 +rockon12 +mtndew +150593 +metalcore +nokia6131 +30091987 +codeman +080898 +16051986 +17081990 +virus123 +robert8 +190187 +020889 +051085 +10z10z +purple20 +mouhamed +noviembre1 +02021981 +bingos +nathan02 +nemo12 +110992 +12011986 +magpie1 +architect1 +naruto8 +noah12 +131283 +070988 +n1cholas +atilla +oluwakemi +26121985 +urban1 +061184 +carolina +24011987 +zombies1 +28051988 +buddy1 +28061989 +hellsbells +05101987 +blueeyes2 +hotguy1 +12021984 +071289 +zxc5555 +shelby3 +26101990 +kisser +27031987 +hotass1 +yesyesyes +27101992 +123z123 +raju +iforget1 +snapon1 +14111988 +granite1 +pau +lililili +teresa12 +lifesux1 +270485 +18031986 +hayden12 +14071985 +041090 +24071991 +amanda88 +qweszxc +221180 +freedom8 +ski +gummybears +devious1 +jayden10 +cameron8 +surveyor +carrasco +altavista +25522552 +30091986 +lemah +bading +31031990 +marie19 +09092009 +wesley123 +cascade1 +546546 +31031989 +julchen +030288 +tycoon1 +161181 +gold12 +a1b2c3 +13081986 +benedicte +puta123 +shy123 +9875321 +tundra1 +kola +16071985 +24121981 +27111989 +trash +taylor98 +19081989 +g86ua5qsn5 +millions1 +oneill +24061985 +14041993 +babygirl98 +220283 +godess +bigboy10 +stunna +parker +240290 +16041986 +monarch1 +27051991 +180491 +150682 +flowerpot +18091992 +a101010 +ilovegod7 +11051985 +pinto +16061985 +170383 +318318 +246810a +emperor1 +08091988 +13051990 +140691 +getmoney7 +sarkar +rororo +peace2u +lawson1 +danman +1233456 +soulja +nickel1 +090688 +412412 +25061990 +14091989 +120677 +crystal11 +goodgod1 +scampi +241191 +laurence1 +16091987 +champagne1 +101277 +200785 +takahiro +gasolina +260389 +25021985 +197912 +100992 +20011991 +megaman2 +tiff123 +24051985 +fucking123 +adrian +keshav +tat +basket23 +filipp +ajajaj +tenshi +chuchu1 +ilovejoey +lemontree +baerchen +bakugan1 +23021993 +16051990 +kevin08 +bomba +monkey94 +gingin +bicycle1 +171084 +28041991 +torrente +03021987 +fuckoff6 +abhi +loving123 +16011986 +1920 +22091990 +skinhead88 +nathan04 +badboy01 +l0vers +maxpower1 +291082 +280483 +16041992 +101296 +lifesucks2 +batman88 +lilyrose +157953 +159753z +iloveu21 +sweetcheeks +23322332 +21091988 +playboy5 +tigger9 +180787 +winnie12 +19111990 +skysky +27071992 +baboune +pooh16 +blackstar1 +hottopic1 +peppy1 +year2000 +greenfield +iloveme22 +04061986 +26051988 +killyou1 +fartface1 +martin22 +887766 +tyler99 +pass123456 +110893 +kitten13 +amber15 +vfcmrf +haircut1 +221080 +250982 +speed2 +280186 +23091990 +karen13 +spark +movie1 +staci +apple! +28041990 +dragon45 +jackass5 +020489 +26031986 +25031992 +password-1 +truong +20051983 +raiders69 +allday1 +1307 +k43a5vztox +password84 +buchanan +iphone3gs +canelo +998899 +monopoli +government +matros +qwqwqw12 +05081989 +181084 +greenday11 +0204 +fuckit12 +250783 +anirudh +adewunmi +soap +allright +lukasek +windex +roudoudou +111280 +fabian123 +toyotamr2 +15081984 +markus +01041984 +chickie +maria18 +m11111 +darek +sieben +231079 +dreamcast1 +autumn12 +1redrose +03101988 +hemalatha +17121992 +dragao +sojdlg123aljg +arquitectura +sprinkles1 +22111984 +amit1234 +kalamazoo +jacob07 +bomberman +12111988 +kaykay12 +techdeck +11love +navy +gladiatore +e10adc3949ba59abbe56 +600010 +chadwick1 +04091986 +04071990 +cheese10 +28071986 +chessie1 +lovers11 +football90 +06021988 +nope +golfpro +260585 +231986 +delarosa +270888 +spring01 +19091992 +passw +011288 +татьяна +arselect +foxyroxy +badgurl +2711 +niceone +rubyred1 +27121988 +27021985 +yamina +shammy +1trinity +cutie#1 +saturn5 +infosys +valentina +amsterdam +cannes +12011201 +coimbatore +amber22 +10031983 +ines +vfhbfyyf +v1234567 +07021987 +popper1 +oscar5 +godisgr8 +mybabies3 +tuffy +snehal +corina1 +derder +spring11 +orlando12 +courtney7 +180390 +honey6 +realdeal +я +raiders#1 +kellyann +20021992 +11101984 +tupacshakur +loser9 +ronnie12 +100693 +blackhorse +magnavox +03041988 +sarajevo1 +18051991 +nicole33 +mylove23 +balogun +241180 +chaingang +02061992 +58666z +eliott +alex97 +280189 +29121988 +concha +honey +andrew25 +pizzapizza +patito1 +302001 +17111988 +07081985 +30111988 +051187 +shit1234 +22021984 +munchies +4yfb2s753c +24011989 +180882 +bestbuy +normal1 +270387 +agent1 +20081992 +sagar +maggie09 +killkill1 +celestina +ktyxbr +260186 +17011988 +2smart4u +matty123 +jessica99 +flintstone +luckey1 +28021989 +fuzzy123 +summers1 + +28061988 +1234555 +alena1 +timothy123 +marshmallow +20111988 +siamese +jackets +030887 +ceecee +06031990 +180790 +mommysgirl +22121983 +150782 +140384 +16021991 +240582 +loxlox +322322 +10031985 +montpellier +20011984 +pitbulls +270686 +mara13 +19081985 +31071985 +bunbury +240491 +anasofia +332233 +02061984 +140485 +leann1 +100983 +211191 +confidential +010509 +22111988 +sexymami1 +heaven3 +seagate +181190 +exodia +osman +23111985 +1qaz0okm +therapy1 +10101995 +110880 +precious +masamune1 +estelle1 +041285 +hihi12 +escada +mccartney +ardilla +plant +040687 +mignon +290787 +jamies +200784 +290888 +22031992 +recruiter +�: +saywhat1 +211212 +bub +121276 +110183 +lovers. +bobbobbob +dima2010 +010177 +flirt1 +090388 +247247 +ester +pokwang +mailmail +gabriel11 +rambo2 +7788 +topnotch1 +3daughters +alex2539 +999555 +hullcity +20051984 +goldstar1 +camcam1 +salado +31081988 +secret13 +auralog +220580 +160386 +10081993 +edu2008 +blood55 +austin15 +rose21 +ingeborg +nbvfnb +120380 +1901 +jason1234 +chester3 +30101984 +6exe3za97v +741963852 +skippy12 +legends1 +grandam1 +liarliar +raheem1 +121995 +110112 +220581 +rachel69 +aaaaaaaa +rascal123 +160692 +240191 +14121983 +cutiepie! +230192 +sexy31 +birdy1 +190583 +10301030 +13111989 +paolo1 +wg8e3wjf +lizzie12 +pastrana +recon1 +110680 +bullit +macmac1 +31011985 +monkey93 +02031985 +john7502gee +191190 +15091988 +twilight01 +06031986 +azsxdc1 +sassas +08091989 +stephen +jacks1 +rubyruby +290187 +richard11 +101096 +150283 +livingston +artur123 +vicecity1 +04121987 +121078 +babygurl22 +smith22 +iloveu69 +reyrey619 +400049 +30101988 +icecream11 +250387 +230691 +inkognito +tiger55 +cronic +27111986 +101991 +2301 +kimbum1 +odyssey1 +220784 +120594 +america1 +fucklove! +16011991 +abbygirl +alexis04 +17011990 +110064 +tinker7 +tw33ty +ufyljy +guildwars1 +18011988 +chaparro +yahooyahoo +cccccccccc +88002000600 +darek1 +lollies +whatisthis +lazio1900 +catita +110980 +iloveyou55 +290983 +130581 +23091985 +hellcat +swift1 +lancelot1 +london08 +rolex1 +eduardo12 +13021992 +17081989 +getmoney23 +18071988 +marlboro +jackson13 +171282 +18071990 +lovepussy +jade1234 +190684 +love.. +bubbles6 +yana123 +12051993 +sampaguita +dasilva +20071984 +110595 +260890 +tyler9 +pratama +123412345 +01031994 +jrock1 +toshiba123 +trilogy +ymhpnmj733 +atybrc +200286 +eve123 +160384 +gio +ishmael +pretty23 +miguel01 +asparagus +235711 +marie69 +buddy! +sasha777 +johnpaul1 +luv4life +180881 +020386 +matthew24 +colossus +nikki5 +adejimi1 +giuseppe1 +loren1 +211292 +22091989 +270385 +money777 +21011990 +sharpay +ngentot +cherry16 +spaniel +talon1 +cirrus +yxcvbn +01071991 +bannono8 +nothing12 +panda11 +upyours1 +kelsey13 +officer1 +30121992 +jason +280685 +bbking +minnie3 +subhanallah +300790 +matthew18 +28041988 +usuck2 +mariposa12 +01091991 +texas3 +20101982 +airhead1 +26101986 +ok +cheeto1 +billy5 +x0x0x0 +blitz1 +25121992 +a456789 +160784 +tiger24 +calvin12 +monkeynuts +260583 +nastyanastya +061187 +161280 +kuldeep +100792 +kids02 +xtvgbjy +18021993 +bullwinkle +111973 +rebel2 +moss81 +zxcvbnm11 +140683 +191085 +233233 +25091988 +stefan +july05 +monique3 +blue321 +live123 +nafnaf +waco254 +140991 +150189 +2207 +270792 +crush1 +honeyq +kourtney +19081992 +10051992 +01love +190991 +scarface7 +100381 +texas22 +090992 +acdc12 +sawsaw +sept15 +121272 +cel +pizza13 +danielle4 +031085 +24051987 +gumby +daniele1 +seabass +260491 +caracola +greenland +hunter17 +120477 +27111990 +17031985 +serpiente +bunso +iloveyou44 +250884 +250791 +10151015 +daniels1 +spencer12 +asdfghj123 +14111990 +sunshine18 +1133 +071288 +250283 +michael89 +hasan123 +madyson +certified1 +300188 +shelter +skyline123 +17081987 +rasheed1 +260682 +surfboard +180880 +rewind +1й2ц3у4к +constanta +emilyrose +27031992 +2kittens +240891 +01041992 +280985 +240984 +09091984 +03051989 +iamtheman1 +boston5 +248248 +bat123 +benladen +brandon24 +24121992 +15041985 +290890 +harrier +helphelp +17061985 +dumbo1 +das123 +pharmacist +160185 +mexicana +30051986 +keens_1 +fktrctq +firedragon +малышка +slapper +445544 +221280 +poodles +jurgen +ilovejeff +salman123 +lovely14 +sexy666 +hootie1 +14021983 +majiajun8888 +patches12 +redtruck +chatterbox +b1b2b3 +wheels1 +watsup1 +14091988 +angela13 +pipper +offroad +15021986 +198724 +olympiakos +200391 +buenosaires +520000 +131091 +190886 +amira1 +trails +050190 +brooklyn11 +marie93 +flowers! +scumbag +denmark1 +130982 +260584 +27031991 +03121990 +123e456 +onepiece1 +051087 +dionne1 +210192 +saddle +15061984 +diesel123 +13211321 +germain +hao123456 +150791 +04051989 +football29 +050787 +partytime1 +19101992 +110481 +day123 +240483 +sh0rty +110792 +sept21 +nowayout +triston +nando1 +190685 +26091991 +241181 +rock23 +071189 +14031985 +nicole04 +230980 +061291 +basilio +kitty21 +this +10071984 +zzzz1111 +pussylicker +31051985 +loving2 +lovergurl1 +coltrane1 +070785 +adidas13 +abuelo +manage +67chevy +tiktak +28051992 +davey +bruxelles +aaron7 +myspace66 +not4u2c +blinks +26021986 +290485 +emo4ever +251181 +honda22 +amber21 +woodpecker +150985 +111a111 +vampire +southside5 +400022 +orion123 +carros +equitydev +030788 +maxwell12 +30051991 +14041991 +paperina +jonathan23 +restaurant +11121992 +rooroo +babyboy21 +100580 +140884 +020291 +opera +11011988 +18051992 +101099 +07071982 +buddy21 +amber16 +supernatur +ludwig1 +blondie123 +julia2 +blanket1 +bmw330 +habitat +123456dd +pony123 +010010 +bear69 +hartford +vasilica +winnie123 +levis501 +butterscotch +guadalajar +20111990 +breath +08081989 +070777 +200486 +dumbo +bethan +britneyspears +james99 +nesha1 +kickers +rock22 +surgeon +heather13 +shelly123 +freakshow1 +tattoo2 +280192 +kosova123 +lavidaesbella +111115 +blueyes +nacional1 +pisello +blazin1 +10081992 +loverboy69 +june03 +280880 +solyluna +tickets +010385 +bestman +nikki23 +george21 +19011991 +190387 +william14 +poopies1 +baby66 +swindon +01021983 +nokian97 +creamy1 +pebbles123 +james05 +sports3 +divinity +18011990 +fields +13456789 +17031993 +nada +2good4you +swoosh +181284 +05031989 +forreal +berlioz +maxwell1 +280787 +hockey09 +wilbert +1hustler +250782 +niners1 +nicholas10 +300885 +130579 +amari1 +gat +2203 +strega +fktyjxrf +thick1 +260285 +cat101 +boogie2 +steveo1 +gotika +jaden123 +********* +muslimah +waldo +04081988 +catolica +wassermann +160482 +040886 +look123 +kissass +010887 +22021993 +19011988 +sandip +09071987 +14021402 +andrea15 +kitcat +1qwertyuiop +7532159 +lowell1 +010483 +110282 +buck12 +15061992 +16091991 +franny1 +azeqsd +8vfhnf +12071983 +300383 +cervantes1 +hanhan +melone +insanity1 +230982 +31081987 +janae1 +angwar77 +kitty1234 +5432154321 +..... +27101988 +donsun123 +samantha. +football68 +texas23 +tootsie2 +jayshree +batgirl +sept18 +20042005 +superdog +david20 +28061986 +151082 +24021987 +18031991 +200190 +sebas +password321 +7uqbwx8n4z +honda2000 +30111987 +brett123 +emily6 +marky1 +cutiegirl +barbos +reyrey1 +31101985 +020382 +nikkie1 +281183 +gunsmoke +logan3 +erica12 +02121987 +music69 +kingman +09071990 +17011987 +google4 +a12321 +nor +19081986 +melissa4 +131986 +taylor00 +ronaldo7 +17051989 +lam +tommie1 +190691 +july06 +leander +diddy1 +261081 +jade01 +matata +dredre1 +21111989 +03051985 +29051985 +takuya +fuck1you +06061984 +inuyasha11 +29101992 +lili12 +jeremy23 +qweasdyxc +antoha +helloyou1 +22091986 +290684 +lilsis1 +bree123 +240983 +23101983 +020484 +198606 +19031986 +pinecone +231281 +method1 +101278 +august07 +270482 +deinemudda +sunil123 +07041987 +dental1 +motherland +classified +kappa1 +abigail +green19 +20071985 +pass +avensis +elocin +nb +04061990 +triangle1 +frogman1 +saruman ++++ +blunts420 +17051984 +redstar1 +install +m00m00 +07081991 +cupid +1dickhead +111178 +1derful +huf7dkgd +27041991 +dentista +metalica1 +pooface1 +mabelle +kinky69 +miguel +sunbird +dancer10 +sho +30061989 +14251425 +blue26 +ripper6 +rosie12 +йцукенгшщзхъ +volvos80 +kevin16 +rossignol +251081 +123z321 +destiny +swagg1 +150681 +310886 +170886 +simone12 +shaggy69 +starstar1 +13071992 +fatdaddy1 +� +nygiants1 +171283 +230483 +lollo +damascus +nicolas2 +03051988 +kamasutra1 +mamasboy1 +140681 +freddy2 +lineage2 +10111982 +jeannette1 +14091991 +rangers +s1s2s3s4 +250182 +a12345678 +bassist +290584 +dance7 +jess13 +03041989 +04071985 +badooo +james88 +black24 +dennis01 +orleans +05021985 +fottiti +051184 +27111987 +ash1234 +softball25 +apples01 +fuckyou1 +qwerty123 +ade123 +football63 +malabar +ten +ilikepie12 +25121982 +13011986 +012369 +cody14 +marcus3 +forgive1 +24gordon +11051986 +girlgirl +alinaalina +25111988 +marmota +letmein01 +lovely10 +giotto +nanna1 +271191 +lyndsey1 +florencia1 +2122 +010485 +17011991 +300991 +ktm250 +simona1 +carlos. +atreides +554466 +america100 +london09 +thekids +jeanclaude +hondacity +medecine +paulus +anthony20 +11081985 +moctar +maroc +150192 +070688 +greg12 +marianna1 +alex55 +01041993 +19061985 +220880 +bayside +28101992 +1welcome +16021986 +bilal +choupi +010785 +gaga123 +babygurl4 +love83 +16071991 +369741 +dominik +molly22 +123456789r +191184 +29081987 +klara +matrix3 +demetrio +nakata +19031989 +metallica. +katie4 +baseball77 +starwars7 +kazuki +football93 +120894 +lothar +beyourself +vhbth55jec +gato123 +fozzie +01012007 +connor10 +jobless +dylan5 +miespacio1 +zrszd9p238 +pink92 +was +300491 +17121983 +24101985 +220782 +rascal12 +10021002 +240584 +allana +11111982 +shelby +integrity1 +ukflbjkec +bugbug +kiara123 +seasons +rjpzdrf +boeing777 +babypink +smokey5 +14151415 +111992 +97531 +lion12 +inday +230592 +fairfield +bunny5 +emily07 +090890 +jorgeluis +november +piotr1 +cleaner +199414 +180591 +24111986 +spikes1 +654321z +pooh01 +161281 +15121991 +diana2 +261291 +291084 +800000 +29091986 +bioshock +bitch20 +michelangelo +reina1 +02031990 +21111988 +mydarling +june123 +rockport +neworder +310582 +badminton1 +29041990 +1245780 +nicetry +kfgekz +tea4two +momo1234 +a123456z +201280 +loko123 +scotland +elmer1 +mikevick7 +kuttan +bornagain +vidaloca +tar +26111987 +18111989 +spamspam +dino12 +19051984 +spooky13 +thebig1 +169169 +pokey +27121987 +120878 +analucia +romans1 +lucky1234 +19944991 +060891 +gamer4life +toontown +270384 +fernando +remedy +27031989 +130192 +scooter01 +beasty +666hell +28081987 +mustang! +freezer +tiffany11 +thebomb +20011983 +190790 +19111984 +mike420 +friendster1 +player101 +hahaha. +18041985 +simple2 +heller +symone1 +220781 +19061992 +frozen1 +brandon05 +198725 +mojo123 +29101988 +mysp4c3 +1billion +120779 +tommys +23071992 +19041987 +murillo +ziomal +franki +arctic +vasya +121298 +070590 +goldgold +rapture1 +05031988 +zanetti +chukwuma +140482 +12081984 +bcnjhbz +aracely +03081987 +morgan6 +123498765 +micheal123 +06041987 +bigsis1 +giants56 +fuck!! +1705 +grandma7 +muffin3 +she123 +290490 +24111992 +071187 +iop890 +friends09 +130182 +waterh2o +1712 +salsabila +100393 +jackie7 +180988 +elmo11 +homo +flippy +gabriel5 +dima1234 +italiana +diet +290785 +09041986 +adedayo +carling1 +280792 +agnes1 +zh8o9ly3gi +marusa +papagaio +25021989 +05021987 +shadow25 +shannen +10041983 +030488 +230282 +19031992 +20111989 +120494 +31071990 +aaa555 +benito1 +mitica +rucaxefu +pepe12 +080585 +25071984 +190389 +division +asd123qwe +password97 +poopie12 +jolanda +041086 +040887 +rumble +11071984 +014702580369 +1hahaha +17031990 +diamante1 +canterbury +honzik +vanessa10 +200786 +11031103 +05051993 +bannana +cornholio +151092 +cuntface +murielle +jhenny +gitana +thumper2 +halo11 +morgan21 +scoobydo +cookie24 +110901 +nehemiah +password.1 +21071991 +tortuga1 +jake99 +nanita +13071986 +aravind +happy100 +andria +27021988 +210783 +chuchay +laker1 +jason08 +2469 +welcome01 +wishmaster +faith07 +lucky09 +starla +duane1 +220592 +money45 +221093 +02041983 +boom12 +13081985 +satanic +giovana +lolo1234 +talking +benjamin3 +elevator +200883 +jigga +donnell1 +angel66 +dflbvrf +001975 +rikimaru +taylorlaut +brook +mixail +200282 +august06 +18081992 +bagpuss1 +pinball1 +shield +18071986 +thecrow1 +softball33 +kopa1961 +deathwish +complicate +120495 +pallone +amanda8 +copacabana +040686 +mature +freestyler +030692 +texas01 +red666 +bisexual1 +rajesh123 +25111990 +040587 +22071990 +030586 +friends22 +18031985 +shanti1 +19081987 +hummer3 +061087 +soares +samsung22 +katie! +919293 +red111 +surya +jennifer. +pomona +290783 +hawkeyes1 +hersheys +marvin +vanbasten +idontknow! +ily143 +domani +andrew20 +single13 +baseball55 +quintin +2apples +football98 +030889 +babyboy14 +prince13 +050685 +saab93 +sanluis +21051992 +ikaika +starchild +cookie99 +15051981 +141092 +270582 +01121989 +john12345 +120478 +password_rr +musika +adamant +usa12345 +31121983 +can123 +18101992 +tigers21 +batman24 +sevenfold +rfghbp +spirit123 +1346795 +labelle +joyce123 +serhat +bratislava +scarface3 +cornelius1 +shadow06 +020786 +01061985 +gibson123 +connect4 +harrys +160385 +buggie +rocco123 +lilboosie1 +nathan14 +w1959a +22011985 +140785 +licorne +ranjit +optic99 +class1 +23031983 +silvano +ophelia1 +01071992 +22122212 +buck123 +anjink +qqqqqq +roselle +951623 +98mustang +emailonly +spanner1 +tazzy1 +123123qweqwe +hayhay +lefty +djeter2 +tinker5 +lionne +commons21 +maisie1 +2404 +321000 +tiddles +bowie1 +09051986 +sexy123456 +18041986 +250483 +206206 +414243 +08121987 +holanda +ladygirl +pimpin4 +28031987 +disney01 +asdfasdf12 +heyjude +18091984 +tylerj +5girls +1icecream +anthony03 +25011989 +sarahh +mustang09 +tokyo1 +perrita +++ +098 +01051989 +cliff1 +babamama +pilates +padfoot +rockroll +210692 +030585 +aspirine1 +08061988 +thaddeus +260286 +thesimpsons +chair1 +rafael12 +snoopy23 +jenny23 +daisy10 +alex91 +lala01 +031190 +18041989 +sluggo +lolipop0 +08031985 +twinkies +chilli1 +060696 +distance +giovani +jenny3 +31081991 +030384 +5alive +200202 +5fingers +british1 +california +nini123 +caligirl1 +matthew99 +enchanted +snowbunny1 +masha1 +1dakota +memyself1 +13071984 +4grandkids +nikita1998 +amarachi +party12 +walker12 +pinewood +23011992 +16071988 +wiseguy +true +25071988 +danny69 +travis11 +sean11 +1andrea +nokia6230i +greentree +110055 +1508 +12041993 +cutecute +220582 +standart +kristoffer +domination +lovepink1 +jean12 +280391 +starwars5 +redneck123 +antichrist +123589 +18031992 +1brooklyn +egypte +kroshka +sarah21 +bullet123 +19391945 +babydoll12 +sherrie +rebel01 +milena1 +14121984 +kibbles +31081986 +shiva123 +311084 +juve +nirvana! +kylie123 + +28021987 +shakur1 +freelander +palestra +pamela12 +280187 +dimitris +cigarette +01031983 +150784 +kolokolo +0606 +parent +qwasyx +pashka +1234567809 +joseph09 +marvin12 +sarahb +pulpfiction +tyrant +kot +skidrow +babygurl23 +prizrak +andrew1 +01101985 +longboard +hatebreed1 +1234zxc +marcie +picsou +ceecee1 +1234er +break +monolit +pfhfpf +123kids +whatever123 +carcar1 +ilovehim7 +mike12345 +nazareno +11111981 +181292 +innuendo +klokan +shady123 +budlight12 +sirenita +rebelde2 +16031991 +martin21 +carlos19 +booty69 +loveya! +excelsior +silvietta +05051982 +02071982 +171291 +25101983 +smokes1 +190489 +thomas9 +loko13 +23121992 +ositos +09041990 +kitana +peter +trueblue1 +hellome1 +madison03 +170384 +jenny5 +070887 +horseman +23111986 +hello33 +4mylove +18061992 +test1234 +08150815 +160685 +290686 +270684 +fermer +24121985 +01071984 +12061206 +brooke10 +monkey96 +cameltoe +120793 +15061986 +07051990 +dblock +doudou +061086 +farting +salim +fishstick1 +bailey21 +mollys +morphine +maryjane! +swifty +luisangel +haley12 +toby01 +chicos +11021984 +strongbow +mybaby123 +021292 +160188 +140784 +friendster +allfor1 +sweet19 +marcell +260681 +29101986 +brandon19 +261091 +villa123 +030785 +202202 +hotboy123 +24111990 +khulet +puppies3 +291089 +jimbo123 +truffle +t-pain +03011991 +080390 +04081990 +07831505 +ninini +bunny69 +123423 +03031985 +marin +tumama +laura +estrella2 +chair +monkee +11031984 +savanah +1qasw23ed +yungmoney1 +robert25 +sabotage +kissing1 +adam22 +gismo +1324354657 +21011992 +153351 +raining +kali +kbnthfnehf +sweetbaby1 +sugarpie +151080 +deedee2 +20041984 +nicole95 +uniden +killa13 +bubba22 +rosary +fifa2000 +japan123 +dianna1 +03071990 +30011986 +baseball03 +volkswagon +220681 +fri3q9arjg +potatoes1 +rome +jakarta10 +654312 +14111984 +bluecat +fatboy01 +katasandi +121005 +sham123 +200383 +voltron +22101989 +05031990 +220792 +dipset23 +a77777 +myspace321 +courtney! +werty12 +nessuno +speedy +2306 +110187 +050886 +neng2000 +080883 +tiger007 +17041988 +purple26 +baltika +schweden +31081989 +casper22 +fart12 +31051989 +goober2 +heaven07 +6letters +251082 +assasin1 +hiuyt75f +da1nonly +one2one +metals +bigdick2 +amidamaru +wilber +marques1 +rams +safari1 +nasir1 +220382 +260791 +christmas0 +asdfas +burnley +reznor +05051983 +masaki +cartel +nightwing +king12345 +400708 +brittany5 +jamie11 +ebony123 +royale +20101993 +newyork! +lolz123 +f15eagle +1664 +lindsay +enamorado +powpow +110780 +nigga7 +pepper99 +josh17 +moosey +20121984 +lauren6 +hejsan1 +warcraft12 +reunion974 +08031986 +20071992 +210582 +ghbynth +francois1 +030385 +morgan +fucker7 +hacker12 +11031992 +clean1 +toohot +biking +dogwood1 +fucktard1 +vans12 +12345678o +74747474 +skyline2 +valentino46 +26061992 +kayley +15061989 +cvetok +circle1 +ilovemylif +6669 +worldwide1 +26011991 +050786 +htown1 +altima1 +bigbass +carolina23 +glock19 +sczouvie26 +stronza +151280 +myles1 +margo1 +travieso +20041992 +1804 +16051985 +teaching +apteka +faggot! +mano +winter05 +animes +5bt2jtztke +dani1234 +jackets1 +19021986 +22558800 +muffin13 +jakedog1 +240681 +091090 +minnie01 +r3m3mb3r +28031988 +calamar +liberty2 +martin7 +abbey123 +161284 +180289 +03071988 +steelers09 +thomas24 +woodland1 +princessa1 +zwjbvhy184 +18041992 +071190 +18081986 +magnus1 +polska11 +seun20 +schatje +skittles7 +root123 +austin03 +050582 +darkmaster +babygirl0 +6565 +farscape1 +charlott +24011990 +16121992 +deirdre +iloveyou32 +74a82s78 +nokia5228 +king88 +stars5 +reggie123 +badboy22 +15111991 +florence +mueller +190984 +january +allycat +22101982 +skumar +31071987 +wojtek1 +scorpion +25071990 +3214789 +efrain +140792 +lovekiss +270391 +spring06 +29081986 +legolas +kronos1 +warcraft123 +05011987 +feefee +oiseau +teresa123 +jamesd +130692 +tootoo +daz3d +26081986 +300682 +221079 +joseph6 +eminem! +prettylady +belles +21041985 +geografia +01051991 +pitbull123 +25031989 +30101990 +090545 +playboy23 +darthmaul +19071983 +adrianne +break1 +300393 +austin +kane12 +retro +emeraude +1playa +20061992 +230291 +cookie +sakarya54 +familia123 +150491 +bianchi +141987 +25071986 +chaves +08051990 +modernwarfare2 +babyboy6 +delaware1 +15041992 +caligirl +12031983 +1spirit +4j9r4rnttp +27051990 +single11 +march03 +24031989 +thrasher1 +14101990 +170991 + +12111992 +198327 +20011990 +khadijah +computer9 +palmira +ginger23 +mahmud +b0ll0cks +marcinek +040586 +ginger21 +luscious +mike99 +chikita1 +deniz +05021992 +26051991 +kaizer +fallon1 +shreyas +mannie +010885 +123456789zx +130392 +051183 +201180 +dragon08 +260289 +polkadot1 +oleg123 +rahasia123 +11091984 +trogdor +drywall +nezabudka +19121912 +260191 +061282 +230580 +sweetest +sexo123 +121000 +rastas +05041988 +godislove7 +m000000 +091289 +17101984 +scully1 +wes123 +nathan99 +29121992 +adriana123 +change2 +jordan96 +14051986 +greatness1 +12081993 +jets +30011987 +baseball31 +vyacheslav +5jn16uxpid +ganapathi +my1234 +030883 +listopad +gather +kellykelly +stabilo +rama +destiney +ckiue73jp +karen2 +jenny14 +123blue +160887 +11011101 +almudena +16071992 +199211 +winkie +22011990 +buzzard1 +sk8er +060987 +maarten +parvathi +100297 +adelaide1 +dallas07 +250581 +babygirl33 +280385 +mufasa1 +05121990 +wwefan1 +amber10 +28081986 +1e +15091985 +santina +86402241 +baybee1 +boyssuck1 +xxxxxxxxx +cameron06 +yankees25 +success +privetik +2143658709 +tweety06 +kruemel +danie1 +ginebra +matkhau +before +twinky +18061986 +chan +juan11 +200683 +030489 +290489 +1478523 +181183 +gjpbnbd +123bob +naruto. +panther5 +11071992 +002200 +19071994 +thunder13 +bajaonel12 +77777a +prince10 +666xxx +eddie3 +03021989 +28031985 +cornel +lettuce +sexy90 +beautiful5 +sausages1 +170691 +cheerleading +20100728 +pizza! +coolio12 +duh123 +alyson1 +martinez12 +mit +aniram +1502 +ilovemyboy +26051989 +dancer09 +kirkwood +sexy93 +060991 +180286 +crabby +star44 +24091988 +ilovehim13 +baseball30 +1111111111111 +wingman1 +boracay +010986 +identity +stalker123 +301284 +27111984 +080590 +150981 +06081990 +070690 +27041986 +asecret +antonova +poppie1 +chico13 +nailpolish +superstar5 +2403 +calamity +10091992 +closed +zealot +01101990 +jacob08 +07021990 +haters123 +191284 +mark10 +270186 +chinyere +191189 +johnny6 +evgesha +02031982 +hughes1 +danuta +alhamdulillah +nmnmnm +macky +030379 +janessa +boyscout +010391 +dinamo1 +juneau +jessica25 +28111988 +cecil + +050490 +melissa8 +150980 +snuffy1 +22061984 +sunnyd +cottage1 +lauren. +310192 +tokio1 +elmo1234 +7575 +grady1 +alejandro +13021985 +harley883 +football57 +familyguy2 +09121987 +26101992 +danielle22 +gajanan +#1mommy +petersen +17031988 +eee +iamsocool +bartman1 +piero +liliput +123rrr +irakli +happy2009 +29011991 +02121991 +chiquis +100879 +08031987 +eagles +gloire +creed +1234pass +afonso +click1 +connor +18051986 +15011989 +weronika1 +panther12 +131001 +021290 +beautiful4 +elnene +heather21 +thomas1234 +lacrosse2 +sz9kqcctwy +808808 +lila +marine12 +031087 +charmed123 +itsallgood +gangstar1 +ilovejoey1 +baller25 +success1 +85bears +mensah +1lilmama +ggg123 +lilshorty1 +adeline1 +honda400ex +green07 +trey12 +lovers13 +keaton1 +erick1234 +051083 +sweetie7 +amanda20 +alkaline3 +luna13 +xiaoyu +15061983 +june2007 +271085 +zlenk77nge +sport123 +pink93 +420bitch +120596 +zaq1@wsx +13261326 +21091986 +morgan23 +22021994 +28462846 +31081990 +24051986 +28091991 +sheepdog +dfcbkmtd +789456q +barnsley +06021987 +nov +peace. +190486 +130880 +superfreak +margaret +300789 +198702 +sarah23 +slipknot. +124578369 +103 +soccer#1 +babyboy10 +asdasdasd123 +170391 +nic123 +15021984 +loopy +smile23 +19021989 +5q2w3e4r5t +blanche1 +jason14 +loser15 +290683 +randolph1 +finally1 +music14 +hs +sto +21081992 +yamaha22 +12041983 +1,00002e+14 +yamaha450 +monkey98 +tiscali +angel86 +kodak1 +kitten! +55555f +120182 +19955991 +121974 +1236541 +20041993 +261282 +010386 +jessem1 +itsmine +240680 +qwertz12 +iluvu4ever +190189 +tempesta +09121986 +puffer +sevastopol +batista123 +andrei123 +maeva +singh1 +viridiana +150393 +26111991 +fuckyou +florida08 +destin1 +15071992 +bball44 +dkflbvbhjdbx +12111989 +20202 +sadiemae +nights +brownie123 +killer90 +crash123 +2509 +nikki22 +1whore +lollipop9 +kankan +bastian1 +yoyoyo! +123456789qwer +defence +suckit12 +dickweed +shishi +24071992 +midwest1 +161182 +harrison +30091988 +27101990 +homes +198402 +logmein +elshaddai +nike1234 +121178 +bluesclues +anna2000 +rebellion +jansport +111179 +michael02 +2302 +kappa +nester +1forall +060588 +mollyb +1a2s3d4f5g6h +boxers1 +260784 +110281 +mayuri +141080 +pericles +ballin101 +13081984 +julio12 +210581 +14011989 +gemini6 +belvedere +jackass7 +080688 +281187 +devin12 +badromance +peters1 +estudiante +a8675309 +050189 +mamedov +evolution9 +160682 +300189 +26011989 +dallas41 +sticazzi +saavedra +qwertyuiopasdfghjklzxcvbnm +120379 +090585 +jaz123 +adidas7 +july2007 +xiomara1 +270184 +271083 +love200 +0909090909 +050691 +crunch1 +26111986 +jacobs1 +130882 +jeffjeff +560054 +raiders4 +mylife123 +27021991 +dennis11 +150391 +170783 +westlake +temptemp +050581 +linus1 +nbnfybr +progress1 +haven1 +jackie5 +27121986 +10071992 +hamasaki +treysongz1 +fuckme4 +jack99 +bitchin1 +nation1 +111222333444 +brianna11 +anarchie +03051991 +nerina +100981 +ryan18 +loveboy +sanibel +28091988 +hockey66 +1020304 +16111991 +cexfhf +flicka +26071991 +190787 +idiots +tomatoes +bitch19 +041089 +faith5 +08041986 +12121994 +020983 +1969camaro +040689 +144001 +meadows +rustydog1 +explosion +motorolav3 +1w1w1w +jomama1 +071088 +210981 +25122512 +brielle +interior +newage +10101978 +07021991 +asaness +spankme1 +19071984 +holycow1 +270285 +misery1 +davidek +viorel +matthias +punto +2cookies +1jason +30011985 +02031992 +farmboy +27091987 +jimjones1 +allison123 +melissa10 +fresa1 +211084 +m1m1m1 +debbie +freak2 +tazz +sophia +....... +goodday1 +jake08 +ybrbnrf +251281 +andrew03 +160886 +reds +austin04 +27031986 +bear10 +laker24 +scientist +sunflower3 +granny2 +tisha1 +aneta +miller11 +cookies4 +1dreamer +david05 +240184 +260582 +stolen +monica10 +21121983 +lulu22 +qzwxec +galleta +180484 +06081988 +411021 +blue28 +juandavid +216216 +190385 +galaxie +260483 +150595 +28091984 +mishel +good4me +blair +pass.word +crisis +tournesol +dirtbag +jeremy3 +barman +09071991 +12101993 +training1 +reason1 +12091984 +corky +09031988 +rhfcbdfz +loves2 +victory7 +scooby +senhas +071089 +yan123 +medvedev +280185 +guy123 +081287 +17011985 +z1z2z3z4 +lild123 +poderosa +22041993 +150792 +littleboy1 +144000 +larry2 +09121988 +boston617 +dicks1 +150382 +lbvflbvf +lovely09 +siegfried +wertyu1 +231987 +matthew17 +7555545 +louise11 +bradpitt1 +onyeka +honda95 +clippers1 +mysp +daniel95 +04051984 +23021983 +cornwall1 +vasilii +issues +venise +nayana +iheartyou1 +123cool +junior19 +1q2w +katie14 +260683 +cappuccino +lucaluca +240684 +241986 +nathalie +amor22 +141292 +egypt +17021989 +crystal01 +u123456 +david101 +bravo123 +karachi123 +030886 +ghosts1 +marissa123 +murphy2 +beryl +casita +260983 +100880 +dragon27 +screwyou2 +1angels +cowboys23 +kissmyass! +jerwin +hunter16 +yahoo13 +29041985 +busted4 +marie06 +030485 +terrorist +chesney1 +progressive +161291 +arquitecto +271082 +sick +nickie1 +08071987 +jh +purple44 +123564 +nigga69 +douglas123 +abstract +07071983 +freedom9 +marlow +290887 +naomi123 +12091983 +missy11 +17121993 +170782 +vandamme +19891229 +toothpaste +ghbdfn +17071984 +c44n6vijgc +301282 +qwerty44 +nicnic +may2007 +pizza10 +06071991 +112233123 +putanginam +honda150 +20041983 +slutty +hejmeddig +hennessy1 +lovers22 +05061988 +18121988 +04051983 +apples5 +bluedevil +westport +27061987 +sept13 +juju12 +fireman2 +pretty4 +livorno +26031984 +tina11 +chasse +juventus +shift +04041994 +hazel123 +1710 +15121981 +300583 +passion7 +manhunt +motherlove +gericom +5000 +eastside2 +pieces +199595 +041091 +21061992 +olivia08 +mumanddad1 +020383 +ilovecandy +ichiro51 +amormio1 +mitchell +peace22 +barcelona123 +qwerty91 +mahima +anna1996 +may1992 +cordell +03051986 +30051992 +310891 +jordan88 +11071983 +winter21 +lukman +jeezy1 +chicago1 +100479 +jess11 +volcano1 +23121993 +ckflrfz +21071990 +amorzinho +powerpower +vfhbyf +11101983 +marife +170884 +010790 +4everme +qwerty999 +marcy +patchy +26071988 +mitzie +magallanes +2405 +claire +29051992 +mexico. +daddy1234 +29061985 +060490 +26121992 +ilovemax +music8 +karsten +palermo1 +gus123 +040988 +cameron07 +kelly01 +060989 +love82 +07081989 +walrus1 +preston2 +caddy1 +tigger05 +27071986 +lovee1 +janika +010685 +ilovedan1 +1415 +stylus +eminem8 +2beautiful +210392 +270991 +081090 +kelly5 +18101984 +patrick23 +bitch12345 +cdtnrf +gotigers1 +sept25 +bitch45 +bouchra +missymoo +bubbles08 +123qweas +god666 +jason4 +11081991 +homepage +cjcbnt +anna1994 +twilight08 +batman15 +130791 +313001 +greenday5 +09091992 +melove +sara13 +pinhead1 +megans +babygirl32 +060787 +redrock +sravanthi +nicole28 +carley1 +dizzle +skate10 +tigress +iamcool2 +08031991 +700064 +160285 +girl13 +sexyguy +150484 +barbie5 +nomelase +rachana +fidelis +baby44 +matias1 +200983 +jsmith +brisbane1 +jesuis +natasha12 +13091985 +whopper +020294 +fellowes +candy8 +colonial +210482 +allstar2 +midnight11 +beyonce2 +bankole +250881 +040989 +16041985 +197711 +07071991 +iloveyou94 +bootsy1 +020884 +asdqwe1 +prishtina +ruffles1 +612345 +30011990 +210291 +marley2 +poohbear! +02121985 +adeola1 +angle123 +03091991 +070588 +ghost2 +america23 +071186 +twilight10 +02031993 +pass123 +maria16 +300492 +1604 +200292 +kick +1precious +02011982 +ashley04 +atlanta2 +bunbun1 +nic0le +ta123456 +67shelby +boo-boo +02011984 +09011987 +destiny06 +jayashree +benten10 +capricon +02081994 +6996 +009d9cc2 +05091989 +1nation +charming1 +131080 +sputnik1 +27011992 +twilight17 +blackbear +dragons123 +spenser +missy3 +thomas8 +neon +azazazaz +soccer0 +13051983 +andrei +1bullshit +03091988 +123100 +gtxtymrf +murzilka +11011992 +zxcvbnm1234 +dr0wssap +monkey97 +05121989 +061284 +bailey23 +04051985 +cheerios1 +06081987 +12345! +appleseed +redrover +03021986 +nariman +17011986 +26091985 +1warrior +l0llip0p +casual +cowboys31 +purple1234 +060290 +pandey +26071987 +250183 +12091992 +240683 +greenleaf +yura +raiders23 +boating1 +catia +1593570 +250681 +nfyz +butt12 +clubpenguin +141183 +29081990 +sasha1234 +snake2 +1chivas +kbpjxrf +271180 +getmoney4 +124512 +13071991 +170882 +milou +781005 +fatboy11 +baby#1 +220184 +05011990 +footballer +12358 +23011988 +22011986 +180586 +lol999 +11051982 +23061993 +poohbear01 +jennifer123 +11111s +1shannon +196800 +marina11 +110294 +130580 +030985 +1success +taken1 +tiny12 +050986 +05111986 +271092 +broccoli +dthyjcnm +stimpy1 +carcass +coopers +10111992 +16081989 +fuckevery1 +america8 +123qw123 +160286 +bratan +yourmomma +30031985 +15011983 +mysister +15031984 +051086 +020691 +falco +04101988 +ertert +windex1 +fighters +dragons12 +23111984 +poops +nathanael +mackey +ecstasy +040787 +gobears1 +borges +flounder1 +2loveme +002002 +421421 +zxcvbnm123456789 +monkey1 +10121980 +melissa23 +generator +caracoles +jayden11 +110184 +avvocato +janie +maxxxx +25111989 +getrich1 +crf250r +torchwood +casiopea +030790 +fuckyou!! +bedford1 +westside6 +281291 +15041989 +140584 +13pass13 +mechta +20011985 +honda5 +caster +23061985 +2324 +chilling +adamko +11091988 +poppa1 +johannes +justice123 +25051995 +alex1984 +passsword +01071983 +2506 +02011988 +scipio +12345678v +taranto +king16 +jessica06 +bobo1234 +10071983 +28041992 +backup1 +121007 +vargas1 +federal1 +2cool4you +austin97 +needlove +dubai +19871015 +janusz +21091989 +kokain +starter1 +ultra1 +09071986 +06051987 +texas21 +chucho1 +anthony88 +411057 +barney11 +kjiflrf +03081991 +040790 +silver23 +dodgers13 +020392 +270783 +020886 +oreocookie +jc123456 +08091986 +philipp1 +19041985 +rjvgm.nth +coolbuddy1 +310791 +qwer1234 +batman1234 +nichole2 +291083 +120895 +mollycat +dylandog +kitty666 +qwsazx +puffy +27021989 +123456pp +01061984 +vallejo +2109 +2r97xj3xey +gunnar1 +131180 +pescado +010783 +jasper13 +260185 +28061984 +roxy22 +880088 +198324 +anna21 +789000 +cristian12 +-9 +1605 +beater +leigh123 +alchemy1 +nanda +aaron5 +12011992 +270486 +ronalyn +15071990 +chalupa +adrenalina +sakarya +qwerty1234 +041185 +twodogs +28051984 +sales123 +aquafina1 +tiffany13 +........ +colonia +zzzxxxccc +longshot +hightimes +231180 +sadiegirl +bronx +hawaii12 +dawid123 +buddylove +29111987 +1810 +supermodel +longview +220780 +typhoon1 +honeywell +mushr00m +sunday12 +kissyou +12gauge +03021988 +18121992 +canada01 +11111992 +iloveandre +20111991 +ilovetom1 +elephants1 +qxxm93js +reboot +08071986 +jetjet +mariposa2 +25031985 +310184 +thinker +lauren23 +3214 +honey08 +27021986 +26051990 +hater123 +padres1 +slipkn0t +1612 +spartan117 +alien123 +21081988 +panasonic +spiderman +illusion1 +6yhn7ujm +lighting1 +giuditta +noonoo +willys +05081986 +essj408 +budlight69 +toxic1 +dogbreath +zxcvbnm9 +element4 +ukfveh +recycle +qwerty1992 +caravaggio +amanda9 +18031989 +sept17 +ddddddddd +170982 +sarge +norteno14 +14071991 +funnyman +iloverob +271181 +110280 +mccarthy +1lovehim +120181 +jonboy +st.louis +03101990 +199415 +family23 +musicovery +catanddog +ginger99 +hayhay1 +03071991 +101070 +11051983 +25051993 +300489 +13101982 +topino +081190 +oliver7 +scooter +asawaq +jackson22 +31051987 +123wwe +chicago5 +180185 +teddy3 +hawaii11 +06071988 +14071989 +14081985 +catrina +rishabh +24071988 +playboy14 +jasmin +02091991 +samedi +140185 +pussy09 +05071985 +mary420 +jet123 +newlife10 +firestone +cantante +aniket +condo +aaasssddd +112358132134 +chisom +060288 +analia +shadow55 +plazma +victoria01 +2h7vkzo266 +newjob1 +250680 +barbie +lindsey2 +19071992 +cubana +bradley +ds +carlos20 +camaross +pennie +rican1 +2503 +qwas12 +12021983 +lexus300 +chicano1 +bertram +ctdfcnjgjkm +091283 +aaa1234 +angelita1 +15111984 +document +morgan08 +philosophy +baller20 +05041990 +1qazxs +20081993 +04091990 +peaceandlo +mother! +190384 +linebacker +051284 +sept24 +peaches5 +loverz +thunder4 +august09 +270484 +79797979 +angelo +d41d8cd98f00 +codeman1 +momomo1 +120192 +smokey21 +160983 +300387 +rfpfynbg +precision +candi1 +15081992 +lakers24 +090980 +140383 +gibsonsg +jade11 +03081989 +flashlight +anderson +jackass13 +doomsday1 +islcollective +darla1 +2108 +forever18 +pilote +iloveu10 +24031991 +jada +google13 +mama123456 +06071990 +10281028 +29081985 +perrito1 +precious3 ++ +element11 +scooter13 +floriana +tanita +25061984 +pickles12 +011286 +firework +gabe123 +29061991 +1776 +22101983 +07091987 +hayden2 +14021982 +030486 +mine1234 +onelove7 +grad2010 +020782 +hater +ss +0412 +dandy1 +emotions +taylor95 +azer123 +sexy6969 +inlove12 +rockford1 +mercedesbenz +070780 +05021991 +blueballs1 +mustafa123 +5121314 +600116 +rofl123 +jeremy22 +osito1 +200582 +nas123 +olivia07 +020293 +061190 +casacasa +04051991 +ilovedave +1naruto +cuore +bread +23121984 +bowtie +hellou +manual +korn69 +7f4df451 +hoodstar1 +`1234 +24111985 +sanglier +7788520 +05121986 +lateef +23122312 +jayesh +29021988 +11081984 +21021992 +jump4joy +dexter01 +25091984 +01061982 +velcro +051189 +joshy1 +montag +140782 +redone +bebang +linksys1 +pervert1 +pretty14 +watford1 +johncena10 +28111991 +strife +maldonado1 +16051992 +ville1 +202020a +p4ssw0rd +ilikecheese +josh07 +cestmoi +123max +hell0kitty +billy7 +titan123 +nathan6 +yahweh1 +12101982 +tweetie +hastings1 +vespa +maggie06 +130481 +mickey15 +adgjm +dima12345 +280183 +dance4me +hondacrv +24071989 +tendresse +22091985 +bor +samantha9 +edward5 +mylovely +vivalafiga +milo12 +05071989 +demi123 +29091990 +x123456789 +erin12 +280983 +061606 +azsxdc123 +blue89 +coquito +060889 +rush2112 +dod +clipper1 +150185 +red101 +meghana +20021983 +ghjkl +burning1 +270190 +crafts +glock22 +takumi +resistance +daisyduke +febbraio +170791 +texas7 +anthea +jovelyn +saosin1 +270887 +zaq123456 +199112 +allahisone +24081987 +bukowski +merdes +09021988 +damilola1 +rohit123 +jazzjazz +vvvv +291191 +password1! +16031989 +busybee +kartika +090983 +yourmum +crusaders +patel +isidoro +ondra +miche11e +28101990 +jeremy21 +bandicoot +bigboy22 +rebel12 +101981 +120377 +mirage1 +180285 +sooty +23031984 +titti +grenade +111193 +021184 +nokiae71 +01011995 +diablos +elefant1 +dumnezeu +buddy09 +confusion +28051985 +cute10 +317537 +controller +flocon +macchina +honeyy +sascha1 +vehpbkrf +delirium +ladydi +pft +walter12 +161183 +saber1 +05071984 +blessed09 +25081984 +199500 +heat +03081988 +150387 +mauser +160383 +girlsrock +asdasd456 +717273 +280591 +26051993 +indien +fifa2008 +cuddles2 +shahin +310892 +pdtpljxrf +perrin +molly6 +jamjam1 +21051989 +lalala11 +passwo +200191 +160982 +21101992 +califas13 +morgan06 +271183 +orange77 +11qq11 +2812 +gemini21 +150282 +11061984 +x1x2x3x4 +seaside1 +mestre +liverpool6 +040685 +cheater2 +lollipop! +hottie45 +291292 +03121991 +justus2 +02061983 +27091990 +21031984 +081089 +ballin10 +150581 +cheburashka +pan123 +l12345678 +jerjer +290387 +121179 +tyler03 +yngwie +trashcan +lovers23 +hotguy +fishers +forever17 +poopy! +ячсмит +woodrow1 +13051984 +jojo10 +020591 +hope11 +300692 +011091 +online12 +martin5 +ponce1 +17071988 +010203010203 +nuggets3 +19081990 +260991 +01031991 +25081986 +alex90 +lovelovelo +vjz +shannon01 +198502 +1409 +180991 +alycia +22011989 +st3v3n +mikey11 +kingsize +qwerty2011 +198627 +199292 +27041985 +060886 +iiii +29081988 +nummer1 +sexyme123 +vandal +rosangela +bears85 +290186 +cognac +ciaoatutti +babyphat2 +stanford1 +artyom +290581 +17101983 +03061989 +180892 +azn123 +25101992 +farooq +heavensent +juan10 +hotboys1 +110194 +bowler1 +rfrltkf +frolova +1258 +daddy14 +friday123 +matt15 +spook1 +meeko1 +852852852 +bonita12 +abcde12 +17061992 +020584 +306090 +babe14 +nomad1 +lilibeth +tristan +020188 +candy9 +030989 +mymymy +benjamin10 +baller34 +190887 +chinaman +ss6z2sw6lu +020387 +vlinder +power11 +booboo +schnee +270891 +platina +suckers +140682 +100110 +sharon +kevin09 +12201220 +130781 +198618 +bubba4 +qq5201314 +saturne +111111k +campanita1 +05031991 +brooke! +mnbvcxy +260384 +a888888 +10121994 +austin69 +02021994 +vanessa01 +bigbro1 +29091985 +198615 +130682 +weed1234 +0210 +30071991 +26021989 +ilovesos1 +kathleen +nicolas12 +2lovely +leonida +pearly +sven +movistar +160683 +skater23 +billy3 +1725782 +13121992 +1metallica +qweqwe123123 +jimmy01 +03081985 +tupac123 +muffinman1 +010791 +friendofthenext18peoplew +instant +amour1 +230781 +brizet07 +15935746 +011087 +13101983 +071086 +stoner69 +skater9 +nicholas +reggaeton1 +southpark2 +twilight3 +joseph69 +junior05 +18091989 +ortiz34 +06121986 +manasi +hello77 +papabear1 +17081991 +jake69 +justus1 +10sne1 +alabama2 +ringo123 +ilove6 +robbie12 +17091988 +flower14 +talbot +whiting +197111 +123456yu +21051984 +170983 +241082 +blake2 +leandro1 +21101990 +babii1 +090587 +morgan14 +10031984 +061090 +kiera1 +26121984 +desdemona +myrtle1 +garcia13 +beautiful +161082 +191192 +gfdkjdf +22091984 +lizette +candys1 +partners +muffin +ali1234 +230981 +blackhawks +faith08 +george4 +celtics33 +232232 +john08 +24021985 +borman +qaz1wsx2 +rebel69 +tower1 +loko +lovell +ultimo +gold1234 +mal123 +biblioteca +earl +school! +infinite1 +091187 +newyork23 +2611 +171091 +506070 +timofey +jolie +0000000a +ford350 +27011986 +1honda +fuckyou19 +tara12 +lee1234 +forever69 +hotone +gilera +132103 +budbud +19844891 +ashes1 +patrick21 +roy +d2tqqn28tc +05061991 +locust +allison12 +07061988 +fish22 +tigrenok +fdsafdsa +prancer1 +redsox08 +1711 +411004 +1shot1kill +29061986 +25081990 +troyboy +manzana1 +cummings +18071992 +199216 +doggie12 +07081990 +jaijai +winston123 +13091989 +20111992 +03041992 +131280 +741741741 +03011990 +chloe11 +080878 +blueprint +nana22 +rachel21 +bordeaux33 +qq111111 +05031992 +200982 +13051993 +18071987 +cntgfyjdf +trueblood +220982 +linkpass +dimarik +8seconds +soccer98 +celticfc1 +nokia5610 +thesecret +asdfg2 +cjcbcrf +pink94 +16031985 +malacka +890098 +23021992 +br5499 +jailbird1 +topaz.null +1939 +151180 +stella01 +witchcraft +scorpio69 +bella14 +110380 +13111984 +030391 +170392 +69 +viktor1 +fahjlbnf +crystals +roucky +210882 +15011988 +yankees8 +050188 +91827364 +jesus06 +dimond +eagle3 +18111992 +kamisama +rat +chatchat +taugamma +catsrule1 +g-unot +08041988 +redwings19 +shokolad +yellow +17031986 +23121982 +180683 +96321 +cute23 +coolcat123 +050593 +500015 +09101986 +170883 +tommy5 +stainless +110579 +12345love +29081991 +epiphany +davion +310181 +140191 +01091983 +ballin08 +121077 +stitches +matthew15 +med +hello16 +211092 +ginger08 +230481 +shawty12 +150582 +302302 +elsa +robert19 +marshall +frogger2 +clemens +hallo11 +07041988 +16641664 +090982 +malika1 +zcegth +anil +ramil +ghtpbltyn +198526 +alyona +cara +addidas +16091985 +guitar. +ilovesome1 +13011990 +09021987 +monday11 +16111986 +famous13 +270791 +030691 +honda13 +dream2 +merci +vazquez +monster14 +sophie7 +aceman +its420 +225 +marocco +181087 +201291 +bratz10 +thuglove +776655 +qwerty54321 +25021993 +normajean +triston1 +werner1 +peeper +ningning +13011991 +13251325 +161191 +pasteur +hoppel +sassycat1 +1pizza +020692 +27051989 +18081985 +purple55 +valentine2 +gerbera +tarasova +mommy9 +menthol +lestari +26011988 +savanah1 +dragone +superman00 +beer12 +17061983 +10061984 +nickj1 +buster09 +197355 +rachel22 +inglaterra +christina7 +maryan +love<:3 +filou +090078601 +ginger9 +lolo009 +180584 +bulldog5 +180885 +alskdj +02021995 +05101986 +kings123 +tiger08 +test123456 +0123456789a +hulk +astronomy +sanford1 +estrada1 +juelz1 +georgia123 +karma123 +10081986 +05081985 +milky1 +20142014 +21071985 +lilmama13 +190784 +27071985 +vagina2 +fr +latasha1 +invisible1 +foreman +280292 +xfactor +19841985 +english2 +queteimporta +30041990 +career1 +anshul +norris1 +1newport +090490 +faizan +12051983 +jamaal +tweety69 +soccer66 +primo1 +18071989 +milesdavis +brian01 +hayati +football79 +125896 +santhi +destiny23 +bazooka1 +mookie2 +25081991 +babycoh +starwar +folake +polkaudio +shaq34 +21121982 +20021982 +251179 +29051984 +pisicuta +140981 +lady13 +27091985 +tr +27081987 +marryme +daviddavid +jorge13 +123@123 +need +21091984 +tugger +250001 +gforce +huang123 +140491 +bosley +15071989 +loka123 +melike +sexyness1 +290886 +forsythe +answer1 +fucker13 +12345 +1lucky +veronica +rouge +salty1 +temitayo +19041989 +ballard +280589 +211281 +050580 +gwapings +greedy1 +31031985 +schnitzel +welcome! +210992 +rajeswari +qazwsx123 +taylor97 +pencil123 +1catdog +nokian82 +qazedctgb +141281 +bloodyhell +240883 +defjam1 +destini1 +mother23 +060589 +justforme +jenova +190890 +reg +ludovico +ninja13 +291091 +2ndchance +280687 +a33k5afgdh +02091983 +07121987 +134652 +jesuss1 +stephanie9 +thunder9 +optimusprime +michael33 +sagar123 +madalin +sexy111 +fuckitall1 +divya +bhavya +261181 +my1baby +bhbyjxrf +12011993 +07091982 +spanking +manitou +imtheshit1 +catsanddogs +monster +garfild +spe +mimamamemima +hunter18 +120395 +alex1982 +allyssa +idontno +hot1234 +060783 +snoop123 +240992 +babygurl18 +banana01 +dragon87 +cayuga +vikash +qwerty93 +bobby69 +040388 +cammie +gilberto1 +zwilling +thepimp1 +maximo1 +2102 +redneck3 +170492 +shutup2 +stoopid1 +600034 +gunner123 +ballroom +iloveandy +jason24 +rockydog1 +combat1 +shazam1 +17041985 +richard13 +1luckydog +bigbad#13 +formula1 +paulino +180291 +160186 +180785 +alameda +hunter1234 +291092 +1309 +1925 +1yankees +zombie123 +4ever1 +130181 +03061992 +alejandro. +katmandu +060391 +198501 +100180 +14101983 +ayoola +money420 +teddy11 +fluminense +bandit +07081987 +justice7 +061191 +suzieq +ringer +manifest +290891 +yingyang1 +hitman12 +mendez1 +intrepid1 +father2 +fajardo +gjrtvjy +mikey3 +120193 +power7 +cameron08 +22081983 +27061986 +06081986 +carmona +27081986 +1qwertyui +04071987 +revolver1 +veravera +niki123 +240892 +101978 +currency +missions +pain +julie12 +samtron1 +419419 +onlygod +241292 +luckycat +narutouzumaki +snooze +peanut14 +siva +slytherin +04041992 +171292 +lozinka1 +29071988 +sillybilly +everclear +threekids3 +dima1991 +francis123 +boohoo1 +алексей +abcd1234 +carolina +pink44 +250981 +250891 +playboy15 +bubba23 +dodge123 +210493 +140680 +010305 +sharapova +robert9 +encore1 +starwars77 +ronnie2 +181083 +67896789 +devine1 +batigol +08121986 +ang123 +martie +password82 +bunny6 +jamie3 +asdf0987 +kunimi92 +tae123 +chicago3 +113311 +070891 +hugohugo +cute16 +june2009 +132546 +likeaboss +1610 +july09 +password3 +!qazxsw2 +turtle! +edifier +destiney1 +slayers +berbatov +crazylove1 +classof05 +wladimir +180985 +matador1 +regina +23051992 +230780 +pumas +30061983 +02051983 +platano1 +200692 +31051986 +correct +robert99 +07051986 +vwpolo +1597531 +160884 +281292 +dude23 +pentium3 +kinsey +280684 +26091989 +kiss11 +america21 +just123 +290591 +gryffindor +gustave +phoenix3 +kitten5 +tigger25 +babygrl +yourmom5 +kenyon +bangkok1 +nonnie +conor +sparky7 +28121983 +papera +jacob06 +elements1 +gregory2 +28011991 +181192 +30081991 +11111980 +pelusa1 +lauren4 +singhisking +tiffy1 +pepper21 +bollox1 +221176 +now +scarecrow1 +mattias +bocephus +janette1 +quintana +080388 +treefrog1 +226688 +logger +260882 +jason6 +sadie01 +123456gg +sanity +babydog +12456789 +kam123 +tongue +max123456 +aminah +gismo1 +020985 +silver33 +redsox10 +16121983 +07071993 +grace3 +qwert123 +killer89 +gethigh1 +biggy1 +gathering +ilovejamie +220981 +rosebud2 +12081982 +05091991 +buongiorno +qwe111 +kissme69 +genesis7 +crazy08 +monkies1 +tyson12 +homie123 +sl1pknot +290288 +blazin +madras +starry1 +gordita1 +fashion2 +puppy10 +ayomikun +09061987 +13061984 +australia2 +lynn11 +221985 +070782 +4peace +canela1 +199494 +riquelme +30061992 +napster1 +alessa +johnny22 +spark1 +230892 +killer16 +i_love_you +aguirre +198922 +hollywood8 +795001 +mike00 +cigars +300484 +21031983 +fffffffff +10111981 +muffinman +caribbean +110479 +04031987 +harakiri +891 +linkedin2011 +andrew00 +01021980 +sean21 +14101993 +09091983 +22121994 +17051992 +01081991 +kayseri +11051993 +motorhead1 +08061990 +municipal +zachary123 +booger7 +13141516 +260885 +jackson08 +tammie1 +30101992 +hashim +121996 +marie88 +teresa +ari +16071984 +pratima +winger +010692 +shakespear +aleena +300386 +rogelio1 +cowboys88 +04121992 +michael28 +lasagna +290984 +rocafella1 +010683 +fifa +summer2011 +poopy7 +jeremy! +962464 +maya12 +avondale +creed1 +awesome7 +morfeo +091087 +ac1234 +24091989 +moonwalker +29071990 +chris03 +4815162342a +gagagaga +191283 +golfvr6 +070791 +18111991 +daddy07 +xsw2zaq1 +250384 +caracas1 +s1t2o3n4 +180891 +asdfjk +ghjcnb +saudades +davon1 +007123 +joseph16 +batman101 +peshawar +25111991 +nielsen +fishing12 +180980 +15101982 +912401 +240481 +mazdamx6 +27071984 +sammie01 +sammy08 +199400 +danielle. +brutal1 +porno69 +dance10 +#1baby +honda750 +egorov +13071993 +enough +04041983 +zuzanna +210782 +mexico1234 +ryan09 +brittany15 +mammamia1 +ferrets +sevenup +jennifer14 +tomtom123 +aa11bb22 +kompas +100893 +everlong +goody1 +olifant +01061991 +411033 +1100101 +derp +22091992 +aaa666 +nov151963 +131517 +110678 +250393 +poppen +softball01 +jaymataji +corey12 +jimjim1 +daffy1 +garcia12 +isabela1 +dancers +badguy +104104 +hemligt +280582 +asdfrewq +careca +30061990 +123admin +aniyah +garner +kitty15 +crip123 +22111983 +cooper13 +151001 +16041993 +qwerty19 +24011985 +ingoditrust +weenie1 +191987 +04121985 +1805 +lonesome +funnyface +wateva1 +lifehouse +romulo +fkmnthyfnbdf +230280 +emily06 +joshua69 +010492 +westside14 +myspace26 +derekjeter +bored123 +1.23457e+11 +sexybitch6 +reader1 +125690 +ousmane +30041989 +400069 +aziz +10081008 +samson11 +21111983 +sexy2007 +tommy13 +buzzer +020784 +26061984 +18071985 +baller8 +planotx +qwerty2012 +metro123 +250480 +xfx3ayfjrk +171986 +09051987 +abulafia +red777 +1fatcat +10061983 +3334444 +seviyorum +09081990 +160783 +eighty8 +210292 +lucky27 +bambang +fran123 +yahoo5 +usuck +lol000 +110381 +brewers1 + +wmilan +10181018 +fed +4646 +breanne +yohann +badkitty +fatty2 +020783 +08121989 +051291 +11081983 +monday2 +dixie2 +painting1 +fatass12 +16091986 +mariposas +mackenzie2 +shaggy123 +over2yangshuo +lima +bumble1 +1thunder +daedae1 +hardcock +13101993 +agent99 +141192 +conejo1 +robert1234 +pitufa +utjvtnhbz +kangoo +danielle01 +qwqw +ukflbfnjh +thunder +myspace93 +eastside12 +abgrtyu +26091990 +1506 +111222333a +160684 +batman. +murilo +031284 +monkey87 +reymisterio +jethro1 +030382 +180582 +040494 +jason07 +112299 +05021990 +beckett +monia +13021984 +fob123 +yellow +saimon +06051988 +gobigred +061287 +198718 +thereal1 +mikamika +04041995 +courtney11 +31071984 +ashton9 +lockwood +gogeta1 +sample1234 +ringhio +ethiopia1 +baseball88 +sharda +maxmotives +26121983 +omega7 +prince55 +kyleigh1 +couple +2507 +29071991 +09081985 +23061984 +avery123 +sirene +0303456 +06060606 +cecily +17091990 +babygirl00 +dbrnjhjdyf +celtics5 +tamara +blessed4 +17121989 +sagapo +devochka +raspberry1 +300983 +07041989 +230230 +27061989 +27051992 +mackie1 +31011991 +emma13 +bakery +rebel13 +28111987 +270192 +yourlove +25011984 +kaizen +shopping12 +otello +280682 +fnkfynblf +jiggaman1 +renaissance +ilovej1 +lennie +06041990 +aydink +198206 +04121986 +chante +06071985 +querida +28111989 +140881 +0411 +dhjnvytyjub +marillion +school13 +stella11 +25011986 +minamina +volcom7 +270491 +butt3rfly +knoxville1 +tommy11 +jeremy +020384 +301082 +kia123 +bombero +1306 +wallstreet +199771 +gondor +150583 +11021983 +greene1 +graziano +merengue +20031983 +150284 +160192 +brat123 +lilmama09 +fatima +headshot1 +booboo6 +180593 +classmate +191183 +1lauren +luglio +444333 +azul +bootycall1 +spongbob1 +4128 +020887 +280184 +20061983 +carrefour +200893 +max777 +silver +atl123 +tattoos +hotmama2 +lookatme1 +andrea69 +lovekita +180984 +cowboys1 +02081983 +toscana +28091989 +blackops2 +baby123456 +monthy25 +ashok +120995 +08061987 +burhan +tricks +040585 +www12345 +tarheels23 +290592 +denise3 +letsdoit +vanhelsing +das +omar1234 +fuckass +texas210 +azertyuiop123 +10million +alex87 +200783 +210880 +honey69 +master9 +starss +pockets +28081989 +29071989 +28071987 +29041989 +maianbinh +showmethemoney +12121995 +paul01 +foofoo1 +lovers21 +omicron +1234567890qaz +noway123 +quilting +colette1 +steph13 +webkinz123 +tartine +190987 +05101989 +100380 +silver99 +juli +asdfgh11 +confiance +joshua00 +anna +thomas25 +guilty +volcom13 +11041983 +shelby7 +sonshine +cake12 +eric22 +windmill1 +lilia +300982 +16021992 +murakami +741953 +090686 +concac +s11111 +12345zx +15091991 +28111990 +misfits138 +school +spencer3 +12161216 +thankyou2 +lozer1 +06021990 +santro +ligaya +saroja +ninette +kianna +221005 +volvo740 +03081984 +17051986 +calico1 +getmoney$ +mongo +honey14 +adriel +spring99 +10131013 +pekida30 +290383 +sabre1 +fastfood +280584 +flirty1 +computer13 +050892 +amber23 +princess55 +26071989 +passage +11021993 +strokes +21031992 +20051982 +pootie +if +dud +06021992 +onelove3 +iolanda +iamhot1 +j696969 +bounty1 +adgjmptw1 +270691 +redbull123 +draven1 +alicat +parishilton +mexicano13 +katerina +eagle5 +medvidek +one2345 +william09 +19061988 +rickie +wonderfull +199191 +021183 +31p5wtdyg/wgq +s654321 +iloveyou95 +191290 +forever08 +24121982 +stasya +ladylove1 +pacifica +1704 +benitez +kbytqrf +qwerty32 +gizmo13 +creepy +diva11 +02101991 +mojisola +witness +gayman1 +121111 +morticia +blessed08 +07051985 +asia12 +memo123 +19101983 +yadira1 +olusola +romantic1 +sound +metal4life +21111984 +271080 +09021989 +love40 +020992 +dandy +123999 +dede12 +198406 +091089 +homes1 +143637 +anderson12 +252525a +pass10 +diamond09 +angels22 +prettyboy2 +black08 +software1 +star19 +bella101 +merijaan +nanakwame +tiberian +jabber +backstab +natty1 +16011992 +06091989 +27061991 +121274 +04021986 +15041983 +wale +missy5 +capricorno +2fly4u +13061992 +baseball02 +1florida +freedom201 +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +011290 +cutebaby +bobby22 +23071984 +dutchman +danielle14 +231179 +010285 +yahoo1234 +stick1 +chandni +tennis10 +amma +stupid7 +sassy5 +05071983 +041287 +playboy01 +love2live +rtyfgh +wassim +kolokoy +29031985 +schwartz +07051988 +150580 +250692 +tweety8 +26091988 +130282 +200291 +brother3 +raiders! +88998899 +premiere +jamaika +kuroneko +071185 +28011988 +111994 +adele +seansean +goose123 +rabbit +198605 +36chambers +biancaneve +021291 +159632478 +050187 +dancer23 +hermit +111279 +14101982 +goober12 +101008 +220992 +2309 +mimi22 +derick1 +handyman1 +taylorswift +merrill1 +tabassum +tater +20021993 +hemingway +1313666 +26101985 +buddies1 +07081986 +wendel +11121981 +zero13 +160892 +151081 +556688 +farina +trista +15051983 +rogue +120575 +ferrarif1 +mulder1 +antonio5 +killer17 +love< +121008 +31p5wtdyg +giovanna1 +maricarmen +06011987 +mohini +westfield +doncaster +jesse7 +182838 +younglove1 +camprock1 +orazio +indra +mierda123 +010484 +170582 +21081989 +fire13 +1938 +aladdin1 +zucchero +18011989 +runrun +23111991 +198226 +gjlcnfdf +karthick +05051980 +02081982 +290889 +corwin +170792 +forever09 +december08 +24061989 +portugal +271081 +karate123 +181184 +workwork +141291 +advance1 +missy13 +05051994 +mironova +081188 +chicosci +survive +mexico69 +515515 +abhijit +23112311 +sept27 +master4 +020491 +retard123 +jasmine06 +iomega +sexybaby12 +savannah +a87654321 +roadtrip +250593 +katy123 +anand123 +2810 +1martin +meonly +01011996 +prophecy +avisis7 +follow +biohazard1 +jojo15 +buster07 +270889 +240384 +money19 +carrier +14041985 +218218 +master6 +genesis +01051984 +060389 +310383 +cowboy7 +samourai +12011984 +diamond14 +dumpling +pussyman +101074 +sagitario1 +gjikbdctyf +123123f +27091984 +piggy2 +030584 +21101984 +yasmin123 +stalker2 +kisses3 +granata +family1234 +180483 +brians +gateway7 +02111987 +pokemon01 +12071982 +gui123 +julies +jbgr3v7n3b +allstate +28051989 +harleydavidson +charli1 +090888 +dastan +19091984 +london07 +colin123 +cegthgfhjkm +280984 +krisha +lerato +diallo +15101980 +vanessa14 +tommy10 +juanca +autobahn +imgay +30071985 +allan123 +trini1 +martin3 +07021989 +hotdog3 +black07 +kobebryant24 +74gangsta +mariapia +molson1 +19171917 +joker14 +flashy +240791 +01021993 +13091984 +purgen +1q2w3e4r +28091986 +lqfg4hwt +binkie +centrum +nina11 +caboose +segundo +percussion +123321d +28051986 +kevin18 +tomek123 +291285 +400037 +nascar03 +14051989 +05021988 +landon2 +solstice +chica123 +120979 +pimp25 +iamno1 +pewdiepie +120577 +patsy1 +16011989 +at1234 +norberto +ekaterina +musica123 +marcelita +08051991 +electronica +01051983 +220480 +myspace05 +tank12 +ironhorse +mormon1 +130281 +300887 +tristan123 +luxury +26071986 +040987 +barbarian +16031992 +borisov +cassandra2 +moose12 +30091991 +13091987 +goody +jasper +qdye17t1zv +161083 +2610 +02061982 +lfiekmrf +04081989 +06121988 +timtim1 +16081986 +24061992 +piglet2 +100780 +29081992 +181082 +babygirl28 +turtle4 +pea +coffee01 +duckling +26031992 +yahoo7 +123123j +280291 +skydive1 +gayass1 +04061985 +01041980 +xgx39zgisl +230479 +301283 +110578 +debbie12 +134109 +scarface23 +madison22 +198613 +paswoord +vivalabam1 +250983 +191083 +bresil +190791 +matute +260291 +dale03 +praisethelord +serenade +bart123 +18111985 +chiara1 +bailey +saritha +talktome +southside13 +261080 +bumper1 +16111988 +sheikh +neverforget +lalang +19855891 +angelbaby2 +bobby6 +neverwinter +babygirl91 +alexande +loveyou9 +01051980 +28081984 +dirt +dexter2 +020791 +lilbaby1 +cheerio +789852123 +5757 +han123 +07121990 +devlin +daddy0 +samsung88 +conman +11qq11qq +marisela +sexyeyes +03091986 +turtle01 +111111b +130283 +070488 +bush +warrior12 +150882 +1111111111q +310884 +yessica +scene1 +130881 +jordan101 +29111989 +hjcnbr +family. +cola +killer08 +159951a +280284 +brogan +230783 +junior6 +ton +banan1 +southend +jahbless +nicole86 +claire123 +cicciobello +slowhand +22061993 +020683 +28011986 +goirish1 +13111988 +asecret1 +ciara123 +morrigan +101294 +03071992 +global123 +14061992 +babyboy69 +speciala +greenbean +5.254.105.20:test1 +edward10 +28071989 +flute1 +300591 +stu +dance22 +eastside6 +spud +mathews +rainmaker +pierre +matthew05 +hatelove1 +spanky2 +chevytruck +nick08 +histoire +170285 +florida5 +230293 +ed1234 +panther +18091988 +whippet +exodus1 +rice80 +poopypants +tamilnadu +300384 +rossia +2307 +.kbxrf +oleander +emogurl +200680 +07031991 +manatee1 +roxana1 +share +pissed +sarah15 +faustino +arun +arsenalfc1 +122500 +butter44 +cherry1234 +spleen +150184 +smokey! +seyxe44hca +fridolin +paddy123 +198818 +fire22 +ktyecbr +jolene1 +olivia +buttfuck1 +08091991 +gators01 +coheed1 +27121983 +100579 +nicole91 +011085 +gerrit +1qazzaq! +passwordpassword +mama55 +limaperu +graphics1 +pescador +20041982 +fifa2006 +10121981 +06071989 +thomas19 +260696 +airforce2 +211987 +gangsta11 +bandgeek +27031985 +091086 +pussy10 +jesusteama +arlington1 +25061992 +am123456 +magic11 +081081 +superstar9 +100182 +kim1234 +contract +joking +walden +saliha +1allah +odeyemi +mylove21 +28061992 +16111982 +markos +qwertyas +1789 +polito +01061993 +soccer97 +110494 +300784 +katenka +robert20 +270183 +bokkie +260383 +appletree1 +1people +toyota123 +redhouse +j3nn1f3r +texans1 +joey22 +250482 +198227 +queer1 +13011992 +07031985 +redford +220579 +samantha19 +198713 +chesney +angela21 +031185 +lebowski +mandi +precious7 +emmagrace +kal +anna1990 +meandu1 +maggie6 +jaybee +mexico +emily22 +alyssa! +anglia +merrick +270185 +21051993 +megan7 +260884 +31121980 +nostalgia +j0seph +trevor01 +taotao +141180 +290483 +987654321j +pitbull13 +ninonino +michaelj +1coffee +goku12 +061185 +aleyna +28121985 +grace11 +30081986 +11041992 +101195 +password83 +dounia +21011983 +gerry1 +check123 +03021985 +03011989 +tessie1 +melanie12 +pickles! +tyler69 +amritsar +marconi +adriano1 +lemmein +groove1 +25041985 +200782 +123hot +k1ll3r +bobo11 +john09 +18021983 +170188 +crayon1 +megan! +31071988 +26111985 +jonathan14 +191292 +redsox9 +198420 +151292 +letmein69 +250892 +mihaita +sergeeva +myaccount1 +simone123 +realtors +oldfart +27091988 +danadana +mya123 +haley2 +marcus23 +jonathan21 +payback +250380 +759153 +agape +1pioneer +stupid. +puppylove2 +jagdish +alex28 +ashley00 +sebastian +301180 +180189 +brittani +30071992 +soccer30 +29111988 +danielle21 +pagedown +hope1234 +tiger07 +ytyfdb:e +070989 +toctoc +181283 +mexico08 +utopia1 +21121993 +carlos25 +199313 +christi1 +240183 +040783 +football41 +school4 +olivia06 +usa1234 +kalinina +iloveyou03 +admins +1z2z3z +ihateyou3 +gjhjctyjr +kissthis +youwish +lolito +700000 +280986 +dipper +rocky1234 +aayush +olivia7 +kvartira +papasmurf +nelson +secret5 +141084 +chris02 +kaylin1 +tor +def456 +may1993 +auxerre +020583 +good4now +saosin +0203 +physics1 +56tyghbn +gooddog +ninja636 +02061980 +julian13 +alicia01 +smile01 +fernando2 +19041986 +290385 +191988 +faggot123 +josh08 +ggggggggg +slam1984 +260182 +221291 +shadow19 +24111991 +yourock +golden2 +190582 +150392 +415415 +021186 +uncle1 +jacket +dreamtheater +20051994 +wow1234 +cooper10 +raikkonen +roygbiv +246802 +15071984 +enforcer +kayla4 +logistics +benz +123456789love +number01 +123qwe! +mobil1 +25021983 +blahblah! +q121212 +michelle88 +210791 +13071994 +jk123456 +reilly1 +231985 +05021986 +1crazy +130883 +teddybears +kristof +ratdog +mychem1 +serpente +02091984 +stalker +010684 +badgurl1 +lois +66669999 +nothanks +050683 +giants25 +tripper1 +michelle25 +200185 +sch00l +anabela +bryan2 +patrick6 +120195 +naruto96 +rae123 +gameon +not4u2no +gallego +bigman2 +me4life +28091990 +210380 +12pack +wesley12 +electra1 +1hundred +monkey32 +funnygirl +030290 +carmen +020385 +yeahright1 +081088 +nokia6680 +goleafsgo +19922991 +sc0tland +yellow24 +al123456 +101194 +2123 +kerstin1 +spades1 +28111985 +hotdog69 +apple14 +04021992 +simonetta +shonda1 +180791 +vincent12 +lover18 +malkin71 +080809 +junior25 +ferrari12 +rod123 +minimi +oscar7 +mousie +nfnfhby +season1 +okechukwu +tyler02 +ololol +tirana +a234567 +biotch +goldensun +06091987 +05011989 +ukrnet +sonechka +madison +steelers11 +1sunflower +football61 +order66 +hbk123 +karandash +qzwxecrv +24071985 +951753456 +21061983 +040892 +montecristo +03011986 +christ01 +sarkar123 +081286 +211080 +muhammet +catholic1 +karthi +270287 +frankie7 +240284 +250492 +qwert789 +harley21 +199217 +02071992 +registration +jacob14 +manning10 +05081992 +manchas +maple123 +06021986 +stroker +258147369 +12122012 +justin98 +050987 +sabrina +6464 +trooper2 +devil13 +260592 +180287 +marley11 +jacare +198717 +revolt +omgwtf +dogfish +brittany16 +angles +j0hnny +30051984 +180184 +johan123 +pizzaman1 +19111992 +30111990 +400086 +beeper +scanner1 +rowdy +060985 +4sisters +080486 +silva1 +22051984 +people5 +040786 +qwert7 +circa1 +200493 +280180 +bella6 +10031982 +05041991 +facebox +220493 +bmw318is +400055 +short +midwife +130492 +texas08 +baran +06091991 +civicsi +300691 +18121983 +teddy5 +26081981 +110879 +terry2 +shorty8 +yankees4 +lele +rtynfdh +jungfrau +183729 +greenfrog +saleen1 +mandingo1 +thomas20 +maggie8 +image +080881 +51515151 +ewq123 +190391 +q7w8e9 +cra +lovers5 +03101984 +28121991 +lovely16 +single69 +robinho10 +bailey14 +travelmoleoptin +1zg1h9suza +orange15 +88 +music15 +babycat1 +thankful +12071993 +black16 +lovebug3 +independence +098765a +080787 +master55 +pixie123 +160191 +ladylady +pass13 +ihatethis +24081984 +ryan17 +05081991 +890123 +12101983 +281080 +281192 +310883 +101069 +ass12345 +sarah1234 +cereal1 +iloveher12 +pelado +supercool1 +kimiko +forever15 +mousey1 +27121985 +30061985 +27101991 +291182 +090981 +301192 +260382 +olympe +buttsex +197272 +raymond +25071983 +140182 +thongs +angus123 +james1 +giant1 +tabby123 +lick +gedeon +tiger09 +030507 +20121982 +45m2do5bs +190491 +251092 +jose16 +vagina123 +mithrandir +cecelia1 +000000z +24021992 +spencer1 +seville +070781 +blackpool1 +pussie +young12 +vika2010 +shakey +jetset +09011991 +re +311291 +271193 +09041985 +contador +deutschland +evangelist +bitch0 +culinary +543543 +1936 +compass1 +29011988 +babygirl77 +picard1 +jojo14 +purdue1 +pottery +crystal5 +jackson5 +wallet +08071985 +05071987 +akon123 +brunos +already +tequieromu +divorced1 +carmen +freedom4me +levski +august01 +fedex +nirvana666 +amina1 +hokage +140791 +superman0 +alperen +198022 +yulya +060488 +kundalini +kevin17 +synergy1 +fullback +femist22 +cheese21 +blueice +201181 +passwrd +danita +07061985 +jonnie +lollypop2 +mary01 +kinkin +shadowfax +++ +keebler +bass12 +120293 +betty2 +winnie2 +froggy11 +pip +maggie05 +josemiguel +060504 +fdsa +amorypaz +belgique +union1 +13041992 +04091989 +patricia2 +778877 +rapid +16081987 +counselor +010170 +22061982 +08051987 +young2 +00000000000 +100781 +07041992 +zaizai +inject +leilei +hotass +l1nked1n +110995 +zoo123 +nicole85 +kik +210592 +tam +peter11 +30081990 +22081992 +racheal1 +eastside3 +20071983 +14081408 +ianian +1707 +mich +micheal12 +kevin4 +vaz2109 +pizza7 +rfvtgb +584201314 +shannon13 +qwertyuiop0 +siracusa +15091984 +nepenthe +16011985 +westside18 +mylove7 +cupcake4 +2233445566 +hatteras +chiller +010292 +entertainment +kevin6 +eddy123 +28071985 +park +jeddah +fl0wer +03121986 +whitedog +000aaa +люблютебя +13011985 +090590 +04011991 +280592 +21061993 +196000 +150292 +wildwood1 +08031988 +24091985 +240385 +20101995 +120280 +gusano +290191 +lovebugs +lovely08 +sw705547 +kenzo +ichiro +matt6288 +opelvectra +qawsedrftgyh +loveher +050887 +28101983 +huggies +28121992 +fordmustang +dominic123 +31011992 +denali1 +290982 +lopez13 +owned1 +mountainde +just4now +jayjay11 +gametime1 +playboy6 +030487 +150150as +13661366 +mjolnir +040380 +123sam +123321w +portia1 +12345678912345 +060892 +gokart +hbxfhl +wsx123 +whywhy +mart +jahlove +red333 +sid123 +max101 +hs: +yamaha01 +hawaii123 +shifty +30121991 +bradley123 +bubbles15 +screwu2 +morbid +breanna2 +30121984 +jordan2345 +191182 +25031984 +jenna12 +1403 +18081991 +getlost1 +hiroki +lauren +betty12 +foxy123 +amen +badboy5 +08031983 +sup123 +26031985 +brittany01 +06051991 +270687 +trekker +corey2 +taylor96 +gray +15111992 +14051992 +130893 +sonnen +austin96 +ratatouille +199513 +141181 +jack1 +naruto90 +ohbaby +27041992 +black18 +rainbow1 +sept10 +cheaters +110033 +mark69 +070892 +larry12 +17111990 +serega +cowboys +baby2000 +ballin4 +cupcake22 +candybar +400081 +16071990 +301281 +kiss1234 +200881 +cashcrate +240383 +pimpster +20121994 +sherly +040188 +leoleo1 +sailfish +jasper10 +070290 +170187 +kitten69 +101076 +1811 +tastiera +jamaican +140190 +bitch55 +111080 +150982 +24041984 +curitiba +rincewind +logan13 +130191 +cooldude12 +belen +03101987 +doggy5 +nana14 +proteus +021283 +26091984 +07101987 +haggard1 +041288 +mickey09 +holycrap +andiamo1 +nokia3220 +30071990 +11021982 +matrimonio +money2010 +aloevera +shanty +28011989 +corazon2 +221988 +summer98 +120808 +livefree +sonofgod +jonathan19 +737kkblskv +chelsea22 +warrior7 +10081983 +mononoke +prince23 +486486 +baskets +zxcvbnm1 +marzena +halliwell1 +chester11 +guitar6 +brand1 +jakob +030289 +toyota2 +22091983 +damnyou +sexy95 +godisgood7 +nanook1 +160992 +18041983 +shuriken +hd764nw5d7e1vb1 +futurama1 +fuckme13 +17081984 +sonora1 +jackrabbit +250292 +godblessyou +lavieestbelle +myspace198 +1323 +saoirse +150480 +27091989 +yxcvbnm1 +branson +blabla12 +casey11 +19011985 +05091988 +100679 +s666666 +198706 +131179 +axlrose1 +dima12 +nestea +dickhead2 +pussy420 +260891 +#1cutie +zhanglei +20061994 +emma22 +travis13 +300684 +chaotic1 +ogechi +manohar +weekend1 +ilovekatie +loser09 +fis +15101983 +vinita +skate14 +analla +titotito +williamson +sissy2 +charlee1 +181281 +ilovemywife +aaaabbbb +yankees10 +samoan1 +rodgers +roger01 +110192 +samantha6 +scarlett +jasmine18 +saltydog +061186 +170981 +199613 +260282 +jor +soccer +konrad1 +198921 +lildevil1 +140280 +honeyz +24101992 +050692 +vfifvfif +020190 +010384 +luv4eva +reward +qweasdzxc +smokey +linalina +daisys +annika1 +1881 +567891 +mockingbird +florida11 +pepsi11 +2710 +120180 +01012006 +17011992 +14121993 +barnabas +100194 +countrygirl +nike22 +560079 +03081990 +dieumerci +chriss1 +black88 +qwerty08 +monkey34 +101992 +zenzen +fatjoe +30111985 +stylin1 +kirstie +030986 +jehova1 +10years +rallye +1blunt +corrine +manouche +joshua. +juan14 +ok1234 +500004 +dickweed1 +120977 +120777 +getmoney10 +sexx +zx1234 +karatedo +hogan +24101983 +071284 +stripe +cranberry1 +eminem +serafin +pdiddy +25071992 +3737 +123masha +linkedin2 +freeport +sickness1 +diocane +poop12345 +june1986 +sweetie! +xcountry +mack123 +24091984 +900900m +30011991 +dropkick +quake2 +626626 +olesia +tristin +w1958a +123456789987654 +pop12345 +enfermera +cmoney1 +246 +pizza101 +030891 +superstar8 +24071986 +hairspray +210792 +yellow55 +11081982 +spike13 +forever16 +greenwich +270584 +gab123 +tink14 +05091986 +kalimantan +28021984 +andreas123 +iamhot +200880 +slayer +07041990 +matthew. +160392 +police2 +04091991 +riffraff +654321d +screamo1 +style1 +fastcar1 +02041993 +senna +mariagrazia +15071983 +270782 +vagina! +271291 +dashenka +190286 +oddball +mantle +12345qqq +tulip1 +210680 +030885 +gannon +austin16 +lauren16 +silver10 +gnomik +casper +manutd11 +devilmaycr +250392 +honey4 +sweet01 +crap123 +26111992 +ricky13 +hatchet1 +16031984 +12021982 +kimba +starz +pardon +aidana +19071993 +longtime +210283 +000000s +linkedin2010 +alley1 +jimmy6 +password007 +110002 +evans1 +ukraine1 +1timothy +lulu1234 +030684 +dfgdfgdfg +ajibola +empires +creativity +300592 +shanel +hottie06 +alayna +198405 +metallica4 +1q2w3e4r5t6y7 +0511 +25081992 +superpower +030991 +rebeca1 +11aa11 +time4fun +guy +newyork22 +love_you +26011986 +heather22 +17121982 +1trouble +06071992 +29121991 +22031983 +24081992 +therasmus +duke23 +12111982 +letsrock +lbyfhf +beata +lilwayne5 +newborn +danny1234 +damdam +250882 +timmie +8008 +babcia +hotgirl123 +rockstar14 +qwerty100 +theblues +100480 +bella +23091982 +sdfghjkl +dea +010891 +rap +ltleirf +07061991 +menorca +pasha1 +loveme07 +destini +flyguy +pepper69 +07021985 +lon +volcom3 +18061983 +imawesome1 +metallica123 +sweetpea12 +analuisa +230880 +butter3 +silver6 +water4 +shyguy +200791 +forever10 +140392 +terminator1 +26071984 +190983 +watanabe +newyork21 +putamadre1 +sadist +strategy +07111987 +kelly69 +peaches11 +adelia +volcom11 +26081985 +redmond +igetmoney +fluffy13 +orange24 +kabouter +29031987 +system12 +passwort1 +georgia +130577 +17061989 +10051993 +petals +25011992 +samantha23 +yellow16 +020189 +03071984 +kaktus1 +210881 +holley +whatnow +nickey +allahuakba +171192 +160291 +gwen +hardwood +penguin3 +dirtysouth +raider12 +kendal1 +basher +dc1234 +gratitude +kids12 +300992 +17111985 +qwerta +claudius +naruto09 +18081982 +210693 +12121977 +friends07 +password#1 +14101410 +kingsley1 +plaisir +macman +gecko1 +pablito1 +malutka +liverpool. +danny15 +zanessa +mimi01 +120696 +03081992 +baba12 +p3pp3r +scooby10 +31081992 +baller101 +&3 +buster6 +300782 +gotti1 +mamasboy +genaro +sweet9 +09041987 +38special +rajaraja +mylove1234 +1703 +261180 +09061986 +290979 +12581258 +pimp33 +dgf68yg +m00000 +211181 +31101984 +260782 +sk8terboy +26091987 +s0cc3r +coimbra +doodoo2 +michael04 +pumpkinpie +jaquan1 +batman18 +zara +patch123 +thenumber1 +120877 +270983 +02041982 +24021993 +131079 +20091983 +21061984 +djhjyf +black17 +250992 +pika12 +ovation +sexy911 +yourname1 +kas +conway1 +moosie +sugars1 +comrades +666123 +fedora +petrucci +3@p@g# +way2go +drandreb +blackbeauty +winter22 +kid +jack2000 +qwerty07 +dmitri +ihate1 +star12345 +19091983 +jesse11 +tenten10 +19031984 +26081992 +14011985 +molly4 +ladybug13 +mybaby3 +carlos4 +charm1 +01081992 +pam123 +15121993 +skip +14091986 +artiste +apostle +19081983 +brady123 +razorback +lilmama3 +booboo14 +pianoman1 +jordan32 +tiffany01 +07051991 +31122008 +lovestory1 +212224 +001989 +agarwal +1steelers +565758 +neptun +edward14 +ashley03 +210780 +depeche1 +29071985 +gfhtym +ghbrjkmyj +dorothee +20062008 +sexy94 +wildrose +uniden1 +artart +rebecca7 +preppy1 +millonario +johnson5 +denise11 +yijeong +enduro +loveme33 +260292 +badong +201179 +taxman +baby_gurl +cassis +30111989 +031192 +300883 +seinfeld1 +islamic +acura +flowers4 +160483 +lakers22 +record1 +kristen2 +191084 +231177 +laughter1 +aol.com +mario7 +reggie5 +carlos6 +egghead1 +060888 +b1b2b3b4 +31031992 +hartley +warsaw +king77 +cielito +pimpshit1 +13121982 +26051992 +201091 +pass22 +nahuel +31031991 +italia90 +12101981 +110979 +timoteo +pangetako +13581358 +23081984 +ruby1234 +rangers9 +buttercup7 +maximus +michael03 +31081985 +lan123 +lokiju +itunes +alchemist1 +lacrosse12 +manjunath +alyssa4 +lynn13 +tt123456 +unicorn7 +07031990 +16111985 +darkwolf +davidc +torres123 +meaghan1 +1pookie +197612 +truck123 +uniform +04061992 +troy12 +23081985 +180783 +greatdane +100281 +bubble3 +seashore +lucienne +04061983 +lol123123 +ricardo12 +moppel +06121991 +antman1 +hoova52 +ivanhoe +12061980 +tennis7 +tigger02 +dakota07 +29011985 +030791 +canada2 +angel31 +canberra +run123 +30031984 +061283 +19051983 +edward4 +wetwet1 +110679 +0212 +123123qw +emelec +olivia5 +winter +gogo12 +jeffhardy2 +26011985 +171281 +tankist +suckme2 +83773049 +astrid1 +love2 +fatdaddy +1401 +kenneth12 +gators12 +dima777 +14781478 +123456yy +passme1 +angelo12 +lovers01 +mickey8 +shanelle +0211 +161092 +bestbest +biotch1 +161290 +bond007 +nikita11 +31011988 +23041993 +dededede +784951623 +snowbell +fuckoff4 +270392 +daniel28 +280493 +got2go +tartar +lesbica +miller01 +03121985 +lolly123 +goldrush +pedigree +johnny21 +nineball +angie2 +geometra +12121979 +230993 +30091984 +120994 +090288 +18031993 +gocats +scottish +baller08 +pink27 +poppys +florine +30091985 +crusher1 +010110 +060188 +16091990 +123456cc +unicorns1 +111111w +1501 +brother123 +bailey6 +niko123 +070886 +thatnigga1 +claudia12 +rainbow +lovelace +missile +mylove69 +220381 +blo +snowflake2 +bobby01 +badboy21 +oksana +punani +nathaniel2 +soccer90 +123321zxc +sw3434! +198228 +290790 +akinyemi +chelsea09 +bratz2 +080789 +sigrid +ilovejack +stereo1 +crossfire1 +180284 +money0 +251093 +laura10 +vfif +amazone +wrench +mydestiny +cats1234 +125874 +beefy1 +heygirl1 +220293 +26111990 +mike55 +henry8 +1southside +fuckup1 +maurice2 +pimpin. +mamounette +den1ks +cooper22 +kilo +tay +ritinha +bunnyboo1 +badboy10 +sesame1 +gianni1 +tommylee +987654321k +spanky12 +111993 +patrycja1 +27011989 +01071990 +ladybug5 +qwerty1231 +chicken01 +300884 +bahrain +myspace92 +gayguy1 +samarinda +omooba +coraline +fal +181280 +copper11 +030380 +kaka1234 +ghetto2 +time123 +041192 +tikitiki +280883 +25041992 +louise +as123123 +03091985 +steelers5 +brooke7 +kiersten1 +250291 +210381 +daddy! +dipset12 +nokian72 +direktor +240482 +solid +sebastian0 +16121984 +rere +vectra1 +flossy1 +sneaker +superbad +sandra10 +dunbar +delgado1 +polka1 +tiff +nick07 +foolproof +peanut +cosmic1 +paige2 +dragon420 +090785 +29101989 +john07 +rebecca +klm123 +nunzia +celebrate +spongebob. +05041985 +buttons2 +tristin1 +040986 +teadoro +starbuck1 +05101985 +sugardaddy +198701 +princess87 +bloodhound +milkmilk +sammycat +samantha22 +zzaaqq11 +dfczcghjcbnm +191991 +chanti +1234563 +bama +martin69 +fermin +stupid01 +cowboy13 +buddy15 +albert2 +kjkbnf +uuuu +08051985 +bandits +monster. +charlie15 +lovely9 +09021990 +newcastle9 +administra +11121983 +tianshi +tiffany! +hickory1 +gatitos +78kdow9spf +06091990 +richards1 +knightrider +523456789 +tiger33 +0310 +lolita123 +hardball +0.0 +260392 +jackie22 +steeve +01121985 +teamo10 +jac123 +baby29 +987654321d +010584 +hjpjxrf +1234554321a +pozitiv +010175 +03021984 +22071983 +talia1 +katherin +111082 +jackson8 +georgetown +230480 +tuttle +198705 +25102510 +blaze2 +04071991 +anaheim +pooh10 +01101989 +soccer91 +pacifico +cool1 +18121982 +112266 +bacteria +050388 +chartered +jenny15 +lisa13 +football96 +lovemusic1 +enriquez +andrey1 +21011984 +sel +14111983 +gumball1 +apollo13 +danny6 +undertow +1507 +08081983 +cfif123 +flameboy +220593 +monkey56 +160882 +america! +suzanna +7654321q +br1ttany +3838438 +25031990 +boston3 +jordon23 +gothic3 +30121990 +gangbang1 +crazy16 +bonds25 +pepsi3 +chula123 +kishor +kayla08 +ilovepie1 +bella2010 +protocol +spartak +joao123 +anthony99 +6767 +apsk0518 +harrington +redcross +21091992 +20071982 +kameleon +211182 +flipside +170781 +netgear1 +joakim +17091992 +050891 +skater4lif +27031988 +pudge1 +snowing +060680 +екатерина +03021992 +francisco2 +/.,mnbvcxz +promises +cory123 +010984 +100980 +fyfyfc +lennox1 +trampoline +ponyboy +leighann +04051986 +baseball0 +20031993 +marketa +jeffrey +12281228 +411040 +reinaldo +homebrew +skydiver +simonka +090687 +4getit +travelmate +basia +mawmaw +praveena +nadya +noble1 +milwaukee1 +babygirl90 +bianca +25051982 +abigail3 +918918 +isuckdick1 +120794 +05061984 +rapid123 +booboo21 +nancy12 +2308 +flamer +270777 +21091985 +billy69 +woodwind +ihatemen +silver77 +sergey-ivanov +sammy9 +15031983 +qazqwe +tamale +culito +29021984 +sakura +robben +usajobs +1611 +07101991 +twogirls +dima1993 +170282 +vanessa5 +basket101 +padilla1 +farid +andrejka +300981 +lopez12 +spider7 +kyle01 +30061991 +royals1 +892 +mikey13 +daniel1 +13081993 +boyssuck +060492 +sadie11 +ilovesean +dude01 +17111982 +salman1 +23111983 +2468013579 +fuckyeah1 +230183 +babygirl97 +maiyeu +google22 +26021992 +1maryjane +05091990 +marino1 +666999666 +girlsrock1 +choudhary +holycrap1 +rocio1 +02101981 +pakistan1947 +bummer1 +yfdbufnjh +ninja7 +hoffnung +dudedude1 +070486 +2707 +lunallena +021092 +anna23 +30071988 +blessed +samson2 +bugman +080589 +angelo4ek +reaper13 +brian69 +apartment +wicca +1qw23er45t +pazzword +zubair +020685 +240693 +barker1 +300683 +bitch77 +google23 +09061988 +summer101 +240882 +beachbabe1 +states +babatunde1 +4success +baxter01 +bhardwaj +23011984 +sweetcandy +16061983 +gracie08 +assilem +available +031091 +100694 +011089 +hunter25 +123456789_ +gostoso +silverchair +table +28061985 +benjamin123 +hermoso +050885 +cenerentola +03041984 +1kevin +oliver99 +kaylee2 +100181 +1cookies +u1v7hhh7ef +fuckme11 +peace10 +whoknows1 +290685 +03071985 +17061990 +19861010 +metal4ever +killemall1 +110193 +lovingu +yamaha +callum123 +annemarie1 +glendale1 +yy123456 +julita +schroeder +8xxg4gcc9q +parker11 +29031989 +minnie11 +python1 +megan5 +religion +mexico99 +selene1 +khalid1 +nicholas13 +07091992 +24081989 +16061984 +thomas02 +oliver! +redsox01 +oladipupo +03031981 +rissa1 +qazwsx12345 +pembroke +221178 +240392 +whore2 +az12345 +langley +10071007 +23041984 +hfvbkm +05091985 +gerger +20021980 +black99 +strat1 +janejane +130780 +rufina +28041984 +grandchase +obrien +bvgthbz +01021981 +trogdor1 +shan +chorizo +mafiawars1 +010884 +adrian3 +солнце +270707 +grandma123 +198198 +010194 +29071992 +china12 +honda4 +juggalo2 +hidayah +morrowind1 +morton1 +180392 +wildcats12 +14031984 +moni +130382 +nikki21 +05021989 +pinacolada +120294 +jeremy69 +cbhbec +011285 +stupid5 +30011989 +redwall1 +barbara2 +jamesdean1 +090984 +30011992 +140281 +dupa11 +bills1 +abigail123 +darkelf +mymommy +071291 +091290 +onmyown1 +18111990 +29031984 +chandran +08041987 +united11 +26081991 +luis21 +lovejones +200581 +katinka +fishsticks +100993 +19001560 +hotgirl12 +bastards +piotr +30081987 +alliecat +130679 +happy07 +18051983 +030190 +s8kril9u4f +superdude +12345678u +marcus22 +gateway3 +zxcqwe +070188 +150992 +02021979 +12345611 +luis01 +chester5 +f5ghyjqhav +apple69 +pauline +25101982 +farter +joe12345 +2911 +198202 +14081984 +brandy13 +yaq12wsx +vincent7 +srikrishna +scooby5 +02011990 +tarpon +300580 +151192 +tito12 +switchfoot +drummond +sasha5 +lovelyme +icecream5 +091185 +09101985 +pol123 +13041993 +250180 +140992 +420man +251193 +buttercup3 +12111983 +ching +partyboy +charan +yupyup +121484 +joeyjoey +260183 +portugues +ritarita +willow11 +300187 +fordescort +560004 +fjfjfj +kayseri38 +newlife07 +ak47ak47 +666666m +123456_ +110182 +ятебялюблю +jasmine. +deadpool1 +helena +sandra22 +noel123 +young10 +cytuehjxrf +sheeps +samson +brutis +abc1231 +kaktys +triana +600073 +291282 +19121983 +06071986 +chacha123 +iraira +pecker1 +bedroom1 +jamie01 +dragon44 +angela22 +14061983 +22041984 +060681 +zzzzzzzzz +150695 +minolta +maryline +slonko +fuck99 +280808 +youwish1 +matthew69 +dallas88 +kulit +11061983 +frida1 +imissu2 +shann0n +comets1 +farside1 +black25 +31051992 +pantera2 +111278 +081085 +jesuschrist1 +tanning1 +letmein +tigger. +18101993 +brownies1 +auntie1 +estefani +090287 +lupin +nnnnnn1 +asdfgh. +150892 +250381 +9749676621ok +kitkat2 +071285 +peace01 +hewlett1 +1808 +jessie7 +chevyman +sperma +horror1 +30121989 +tonymontana +08091987 +lovesux1 +210382 +120694 +brave1 +jesusa +comeon1 +123bbb +abe123 +stokes +bubblebutt +zoomzoom1 +bureau +310393 +chris92 +snoppy +velasquez +healer +honey10 +qwerty45 +211082 +samantha123 +220481 +farm +romuald +12041982 +11223344q +tennis3 +blanco10 +tazdevil +sovereign +message1 +francis +legend123 +samir123 +savage12 +nathan15 +kirk +ladybug4 +victorious +hulk123 +sophia01 +shimmy +legia1 +harley4 +200183 +241178 +london21 +whisky1 +alex1981 +centre +13011984 +smackdown2 +ilovemyindia +cowcow1 +196500 +joseph18 +pipo +wangjing +bear23 +030491 +131279 +06061983 +190783 +07091990 +semeolvido +jackie23 +adrian23 +marie95 +felipe10 +killer420 +motorcross +24011992 +2199127551 +barbie22 +mookie123 +nine99 +241078 +24111984 +street12 +victoria5 +il0v3y0u +tigger101 +260284 +sondra + +231293 +111972 +72chevy +03021990 +08061989 +031084 +wilson +170192 +20091994 +10091989 +28091985 +xxxzzz +pollock +bur +christina3 +creative12 +russell2 +deepak123 +28061983 +aa111111 +aaliyah3 +ilovetim1 +registrati +07041983 +11011994 +fylhsq +aquaman +31121982 +minami +08031989 +boys12 +siemens +ontario1 +wallpaper1 +110993 +b00mer +haters2 +violino +050386 +babygirl03 +solution1 +180983 +ichunddu +poopsie1 +19101982 +refinnej +sookie +rbh.if +arturik +autumn2 +johncena11 +samantha16 +01071982 +180692 +raul123 +01011960 +pinpon +sparty +caca1234 +october08 +tajudeen +260787 +19041984 +tweety +250594 +bittersweet +25091992 +21101983 +17011984 +spirit +rkelly +godsent +27111991 +flower69 +serenity7 +111092 +chili1 +binder +130980 +nataly1 +addie1 +bocajuniors +02081992 +hpl +outside1 +victoria! +happy4me +atkinson +770077 +05121988 +rfhfcm +monkeys7 +bartolome +cathrine +mustang96 +december +mylove08 +tehran +slipknot5 +020191 +peter5 +u6e6r9hwix +banban +darkman1 +element6 +door +zachary5 +socks123 +0312 +060390 +bandit10 +030984 +dallas69 +05101990 +hottopic +q2q2q2 +223 +guismo +12021980 +zoom1234 +25031983 +sebastien1 +051084 +100394 +king25 +20061982 +29031986 +qazxswedc123 +randy12 +rocky101 +30081989 +1pokemon +marco12 +telefonica +ge0rge +boswell +240480 +330330 +soccer29 +021082 +brandon99 +hit +crip13 +sanju +260883 +1qazxdr5 +030884 +147852zes +miruna +important1 +11021994 +babies4 +militaire +011188 +eliseo +svenja +audio1 +fengshui +brian5 +198025 +makeitso +14022009 +06021989 +prospero +171180 +single3 +busta1 +tori12 +011011 +malou +bintou +mounette +holymoly +sonic3 +123mmm +210284 +peepers1 +sandoval1 +princess34 +10031981 +060287 +inicio +pop1234 +rasta123 +passwort12 +katya123 +chelsea07 +1234567899876543 +tweet1 +sophie22 +mitzi +240192 +yomama! +061182 +milacik +2200 +190484 +watkins1 +230581 +teddybear7 +550055 +20021981 +102030102030 +nicole96 +nissan123 +bambam11 +123456789qwertyuiop +shyann +joshua25 +haikal +22081984 +emiliano1 +k9g2xpce1e +crossover +dominic +021185 +198401 +leslie +barrera +powerpuff1 +171280 +official1 +jaydon +02011983 +denise13 +spring123 +1qazzaq! +27081985 +500026 +manutd10 +05121987 +261193 +m0rgan +andre2 +111293 +041292 +01121988 +8675309j +phoenix12 +hun +29011992 +symone +ilovebrand +titten +ajhneyf +gunawan +denver7 +babyluv +peanut8 +13591359 +171191 +fireblade1 +milanac +carmen01 +rocky23 +mike6453 +salsal +pink05 +10111980 +meatballs +devil12 +charles5 +steven15 +shan123 +210793 +sundin13 +prime +miniman +poopoo22 +140581 +180383 +magoo1 +17021985 +dale123 +giusy +asddsa1 +sacred1 +03071989 +04101990 +jacek +arafat +bebe01 +08091992 +1702 +a7x4life +humphrey1 +10051981 +vanesa1 +doogie1 +outlaws1 +jackie10 +demon6 +killer18 +pissed1 +hamster +imhappy +07051992 +amedeo +carlie1 +1l0v3y0u +mirek +asdfghjkl. +rjyatnf +13121980 +142536a +06101987 +beehive +sexy91 +bandit3 +islanders +125125125 +catfood1 +morgan07 +freeporn +220680 +superbowl1 +hotbitch1 +romans8 +04101986 +gramps +198707 +summ3r +superjunio +18021985 +beauty +momo13 +1fatass +las +y0y0y0 +137946 +ingram +1tyler +rosalyn +elevation +29081984 +wendi +081189 +shaina1 +baxter +09051990 +redroses1 +1scooby +snake12 +spicegirls +iamblessed +100478 +310183 +rfhbyjxrf +padang +08041985 +hannah17 +yang +puszek +1425 +sebas123 +smash +reggie2 +shaaba +04011989 +chevy88 +qwertyui12 +poppy2 +300185 +chastity +05051995 +07061984 +090788 +love999 +djamila +19101993 +linkedin99 +010493 +aaron10 +imsingle +lucrecia +kupal +18021984 +280683 +nicolae +400061 +ert123 +171181 +13081992 +jose17 +monk +10101979 +060885 +070585 +underwater +30101983 +15041984 +dctktyyfz +12abcd +timothy3 +04011988 +222222q +dortmund +artemon +society +sherpa +pepperoni1 +lulu11 +nicholas4 +25041984 +weezie +berkay +geegee1 +miomio +nathan03 +04121990 +mariguana +jacob6 +1jeremy +sammydog1 +dinger +bellaboo1 +jlbyjxtcndj +chelsea21 +25121980 +costa +110781 +blondie7 +nsync +16081985 +steven18 +21031993 +strato +198603 +05031985 +helpmelord +07021986 +only4u +wooster +090586 +cookie88 +continental +dolce +18051984 +grandkids6 +mecanico +hammer2 +110795 +frodo123 +impact1 +217217 +david99 +auditor +santiago +081091 +shinhwa +jeanmarc +06041988 +090487 +22071993 +28011990 +football83 +fifa2009 +21071984 +raiders10 +yoyoyo3 +rrr +pool123 +27091986 +lady1234 +07061990 +sandhu +821010 +antonette +killer0 +icetea1 +nina1234 +myspace95 +iglesia +rfvtym +lord12 +simens +katie10 +frfltvbz +awsedr +500008 +16111983 +landon06 +emily23 +langka04 +bandit69 +blacknight +cookie07 +22071984 +10081982 +winters +admiral1 +jjj111 +cute15 +riches +shkola +blondie12 +zidane5 +140183 +austin00 +ромашка +wouter +chauncey1 +06091988 +198122 +negra1 +bebebebe +anna10 +doodie1 +080591 +181081 +06101988 +2222221 +coolkid123 +annabel1 +07021992 +191985 +190001 +221192 +thebear +17091982 +04081992 +galapagos +celestino +trouble3 +07091989 +230679 +babyboy15 +firestorm1 +gary12 +vatoslocos +inflames1 +albert +letmein7 +oliver5 +slurpee +sonja1 +sasha1994 +040482 +0246810 +makaron +football86 +1forme +18091990 +wizard123 +india@123 +151986 +pyramids +bala +090979 +adam23 +angel#1 +gblfhfcs +manimani +batman77 +redsea +simone +youaifa569 +wilson11 +669966 +smarts +10031995 +nfymrf +12101994 +20101994 +game1234 +layton +chandrika +adolf +tweety18 +slamdunk1 +lyon69 +dogbone1 +osito +26111984 +020991 +everlasting +wenef45313 +birds +26081990 +26111988 +1champion +hector12 +26061993 +nitrous +ibm +13011983 +hunter55 +ivan1234 +210883 +iceman69 +haydee +09111987 +06041989 +010287 +fodase +garrett2 +1penis +hotline +w1957a +29111985 +red123456 +manchita +rascal2 +ilove11 +fucktop8 +300382 +mobbdeep +familia5 +toothbrush +caro123 +lauren18 +dupa1234 +totally1 +enjoylife +hawaii2 +051283 +emelie +wootwoot +gil +genesis1 +iam2cool +phi +satine +sandy01 +29111990 +170293 +18011985 +ainhoa +jr12345 +pippo1 +qwertyq +013013 +environment +chris143 +161161 +samsung13 +14071984 +050287 +louisa1 +panthers89 +brit123 +358358 +sabedoria +123456789ab +breakdown +410410 +070390 +29061984 +lubimaya +opaopa +buddy9 +looloo1 +bernal +slut12 +baby2011 +76767676 +210577 +alyssa06 +230582 +donut +mouloud +070689 +12qw34er56ty +200909 +coco14 +alex1983 +jesse5 +daisy4 +cool24 +richard! +asshole +pookie7 +boomer13 +francis2 +13041985 +020582 +kona +gabriel22 +khan1234 +311281 +lupe123 ++ +aleksej +63636363 +cobblers +04031989 +16081983 +joseph07 +akhilesh +thisisgay1 +chaudhary +athens1 +lovingme +steve01 +binweevils +dipset123 +130185 +241081 +27081988 +playgame +bayliner +biggun +katharina1 +fancy +2811 +bigboy21 +octopus1 +1qaz2wsx +1269 +piano123 +caceres +asshole101 +travian +trevor2 +basti +purzel +mario23 +mic123 +kyler1 +glock23 +rachel +20091992 +killer25 +candyass +montana +16091992 +05051981 +211081 +peaches4 +n12345678 +tobias123 +03061984 +yamaha11 +foreverand +dfghjkl +191817 +tigres1 +090908 +nirvana12 +malaikat +zac +iguana1 +cottoncand +match +matt16 +allmylife +2502 +110051 +rosa13 +daddy8 +orange16 +070793 +chelsea15 +13101310 +2580369 +prettyboys +31071989 +kahne9 +sixsixsix +260184 +united12 +dylan07 +slipknot123 +onyx +robocop1 +hujhuj +7777771 +301301 +23021994 +boudin +skate69 +281084 +motomoto +beleza +jeepjeep +ячсмить +horses01 +161080 +feanor +fatboy3 +cheese8 +come +050991 +anna1997 +010583 +kozlov +madarchod +jade13 +100179 +football94 +robertino +christ +010782 +09101987 +boston7 +198205 +miguel11 +navyseal1 +azul123 +darling1 +2802 +10061994 +randi1 +050684 +delia +woods1 +tdutif +05121991 +uytrewq +inshallah +poop01 +david77 +sparky69 +jasonb +tacos123 +27031984 +crazy1234 +carisma +starfox1 +windy1 +30101982 +izabella1 +12121978 +071283 +kris12 +10091982 +2209 +garnier +rugrat1 +08071988 +papamama1 +tiancai +heaven +modesto1 +trilli +27051993 +bigman12 +woogie +270580 +02101983 +drew22 +16111992 +123man +violence +chrism +240285 +angel123 +over9000 +changeme2 +21041993 +retirement +winner11 +september +frank13 +180583 +duckies1 +tobago +06101989 +rai +cody10 +199393 +vc123456 +26031993 +sept19 +doggie123 +12081994 +tyty +ellada +mylord1 +aarons +69966996 +nicolino +fortis +26051985 +03081993 +26041985 +karlmarx +skipper2 +sugar11 +500033 +jannik +charmed2 +callahan +leona +alex111 +m1ch3ll3 +2112rush +199515 +070289 +03101986 +teamo14 +naruto94 +17111984 +070389 +741852a +que +eastwest +sundevil +fuckoff22 +789521 +08051989 +29051988 +liverpool09 +hemlock +katherine +zero11 +12011983 +04101991 +evil123 +050783 +rocky21 +010383 +jamaica123 +johnny4 +zhuzhu +071286 +godsfavor +bandit22 +elina +brinkley +140781 +ninja11 +pretty15 +blue777 +yellow88 +alexander12 +07071994 +leeryan +22051983 +sonechko +231178 +sammy07 +froggy13 +20101981 +120875 +mariokart +000069 +cellardoor +angel34 +peaches69 +juanjuan +05061983 +thomas89 +yfcnz1 +nastya1 +22011993 +260482 +seeking +marina13 +00000008 +batteria +chris. +bogie1 +10031994 +w1955a +12213443 +socool +anna1995 +westside21 +peanut06 +basket11 +unity1 +07041986 +midwest +crazycat +bahagia +011084 +thebest99 +27061984 +pebbles +081087 +honda98 +040885 +1234wert +ilu123 +karol123 +hisham +101012 +199311 +oaxaca +mitten +010171 +turkish +260680 +290884 +12081981 +junior9 +09031987 +199611 +montblanc +15021993 +jmfxl78nhe +250193 +branco +alianzalima +england7 +roxy10 +1f3q8aunke +casper69 +comandos +001972 +selamat +tinkerbelle +eclipse2 +eddie13 +pirulo +sharad +190591 +02091982 +aaaassss +200381 +070885 +frederique +vvv666vvv +porcupine +samuel13 +03081986 +spookie +998998 +24seven +girafe +bj1234 +33103310 +naruto24 +butch123 +mancha +homeless1 +gabby13 +14031992 +player15 +200810 +maddie3 +s1s1s1 +cghfibdfq +william16 +10011993 +jarrett88 +21041994 +tiara +sardine +trucking1 +tpklmq9668 +mindless1 +11111aaaaa +300482 +trinity5 +amanda06 +estefania1 +fernando9 +rideordie +molina1 +16051984 +dancer16 +202 +toronto +stephanie8 +florida09 +fuckoff9 +griffon +sasanext +summer89 +13041984 +comedian1 +manuel01 +500050 +fotball +bankhead1 +060887 +751953 +carter01 +198203 +140192 +04011985 +01051992 +scooter4 +16071986 +parfum +270284 +newhome +lemonlime +marie89 +alannah +raiders81 +a1a1a1a1a1 +chris04 +311280 +03011985 +pringle +professora +sandi1 +sexy03 +saintsrow2 +sangre +ryan24 +keziah +maple12 +daniel96 +invader1 +loulou123 +kayla15 +170283 +andone1 +master101 +fktrcfylhjdbx +diva101 +080292 +2ps5wlc4xq +060609 +kenneth +uchiha1 +toxicity +200482 +11111k +jonathan8 +student123 +lauren15 +lovemylife +ginger6 +1chick +170992 +brian23 +mikey7 +180682 +allahu1 +2277 +lsutigers +22061983 +kiefer +michal123 +heihei +171080 +ginger14 +kristofer +chad85 +280282 +07081988 +god4ever +museum +jeff11 +25041983 +jo +06081984 +jamaal1 +manuel11 +24071984 +reddevil1 +lindsey +siberia +anna1998 +leto2010 +boss1234 +11101992 +nimrod1 +nuclear1 +scotch1 +mando1 +poohbear21 +04031986 +tuna +060388 +051182 +1606 +hamster12 +14051983 +10111993 +1234aaaa +21101994 +121096 +27071983 +24011986 +090290 +savannah3 +26031989 +joao +rdfhnfk +anime101 +09071988 +270583 +vivi123 +030591 +harry11 +bujhm +butterfly123 +220882 +love50 +mylife12 +amber08 +domingos +nixon1 +07121986 +qw1qw2 +super69 +hokies1 +lola13 +pancha +horses7 +sat +191086 +sexymom1 +kcchiefs +04021990 +ksooz +fishin1 +250481 +2552 +230182 +160481 +lanlan +greenville +teamobb +ivan13 +09091982 +goofball1 +montana123 +jerusalem1 +cookie18 +melissa9 +alessia1 +awsome123 +14041982 +leslie2 +nihongo +bleach12 +1988comeer +yoville +southside6 +291081 +ja8yc8uxsx +17111991 +05041989 +09081988 +marley01 +dsmwssr955 +jomari +eeeeee1 +manhater +06101986 +10041982 +tongtong +070489 +2606 +nothing! +14081992 +friday12 +elaine +starman1 +amanda25 +0410 +maicol +nails1 +170292 +151985 +daffodils +lele123 +08021992 +vanina +06121985 +270982 +redwolf +davidj +145263 +140580 +donald12 +22041982 +261281 +100578 +ace154ever +041083 +cheeta +fernandito +18011984 +nana23 +jenny22 +alalal +aolsucks +vitara +kevin! +400604 +09101991 +110394 +mani123 +3105 +serendipit +emma07 +loveguru +spacey1 +shaquille1 +pasha123 +5starg +zamalek +100677 +187 +310384 +reaver +porno123 +123234345 +romanista +132333 +newlife7 +booyah1 +skaska +iloveu15 +mustang94 +wolves123 +race +overload +william06 +220578 +rodriguez2 +steven16 +monkey78 +atanda +zooropa +flavie +theone2 +love1111 +babe01 +14091985 +08101991 +david. +050291 +hannelore +hollister6 +galang +siberian +140295 +050387 +200480 +sashas +jayjay13 +123pimp +gemini23 +12345698 +nassau +kitty16 +08011990 +gopher1 +220183 +luke01 +eminem5 +blue29 +whodat +memo +babylone +money2008 +invaderzim +unleashed +imbored1 +choco123 +basement1 +money$$ +factor +1thuglife +12501250 +250781 +198427 +jayden04 +wayne3 +190282 +favorites +050785 +01081983 +08061992 +skate4ever +heater +guitar4 +party2 +merlin11 +02041980 +24031985 +akinwale +060785 +kai +bigboy14 +sebastian1 +123happy +19851986 +prince21 +25021984 +110577 +jason18 +lavida +hoobastank +18051994 +steward +adi +221989 +shannara +260892 +boulder1 +intense +zasranec +1pickle +diane123 +milhouse +210681 +27041984 +ilovem3 +hairy1 +shutup123 +180293 +qwertyuiop1234 +jimihendrix +huntington +sniffer +summer17 +riversidec +jazzy13 +mikel1 +rage +eden +groundhog +08021985 +nfqcjy +1144 +sundari +9379992q +computer8 +poiuy6 +hello45 +poissons +1923 +newyork10 +160991 +fkbyf001 +flathead +grad08 +010881 +mark +04011987 +300192 +baggins1 +31011986 +05121992 +07011988 +rachna +charchar +09061990 +alanis1 +010283 +navigator1 +lastfm123 +puta +mostro +adeleke +lis +stafford1 +10051982 +159357q +classof12 +010286 +171082 +1236540 +kitty08 +b111111 +1321 +yuiop +170382 +rainrain +flashback +selena2 +flossie1 +mookie12 +131984 +wizards1 +janani +boone1 +hammad +ugaug55jdb +barbie69 +22101993 +bonou2 +060489 +joker22 +balla4life +haribol +dr4life +mclean +15121994 +halliwell +dirtydog +buster15 +20031980 +pitbull3 +pratap +18061989 +striper1 +jackhammer +ginola +nyq28giz1z +longdong +solare +amethyst1 +10061993 +brittani1 +jordy1 +160493 +301191 +g00ber +iseeyou +bitch89 +1goddess +guitar22 +cheese6 +dallas24 +240981 +yfnfif +brentwood +margarita2 +2323232323 +2406 +travis3 +roses123 +favored1 +300891 +single10 +160782 +blow +love1985 +090488 +night123 +alejandro7 +tiesto1 +kinetic +purple28 +010892 +gordon +06051986 +26121982 +cupcake101 +usa +apple99 +packers04 +cassie10 +08101986 +sarah08 +lexus123 +24051993 +adam21 +25081985 +31051984 +liljay +spider01 +250780 +atlant +anjing1 +peejay +dolphin8 +alegre +trevor11 +dirtbike2 +babolat +120394 +masahiro +170483 +yourmom11 +lampard123 +falcons2 +24031992 +18101983 +lapins +hateyou2 +blue05 +wijaya +hanuman1 +wang +frenchie1 +050491 +bet +180681 +090189 +vivitron +knight123 +bakla +00000o +mansion +paralegal +060585 +one1two2 +voetbal1 +21041984 +jager1 +lugano +328328 +cleopatre +gfgfgfgf +gabriell +280782 +manilyn +tigger33 +codydog +kizzy1 +cb1234 +victorhugo +000003 +tuananh +renzo +020592 +imhotep +177177 +garry +shadowcat +mariafernanda +weareone +fernand +280287 +010106 +2hott4u +doutdes +chinita1 +iluv69 +samy +23071982 +j7777777 +231278 +cadets +requin +lmfao123 +lincoln +jonnyboy +mefisto +shannon11 +01051982 +firehouse1 +killmenow +tennis13 +feder_1941 +blondie3 +fresita1 +1chevy +traxdata +198607 +marcos12 +151987 +4848 +pele10 +krakow +210593 +24121983 +mahler +22111982 +blink183 +123mom +080389 +10101977 +julian11 +register1 +caralho1 +water7 +1gabriel +21081984 +princess29 +01031993 +tomtomtom +doorknob1 +131987 +1please +051082 +liverpool11 +melissa. +rc.irf +stupid4 +olivia4 +adrian08 +asdfgasdfg +ak123456 +500062 +orphee +06121989 +jonathan4 +lafayette1 +dinodino +jack08 +26101993 +nikon +02061981 +03051992 +190382 +180186 +040891 +sweetlover +harajuku +chelsea. +ilovemymother +cameron9 +password2010 +sponge12 +babyboy! +serpico +sammy69 +fakeid1 +aly123 +benjamin7 +26091992 +pipopipo +joseph9 +goodyear1 +nasfat12 +jenny69 +steven4 +deinemutter +abcabcabc +catgirl +04091988 +heydude +naughty69 +pollyanna +braydon +arenas +daniela2 +freak12 +7979 +контакт +11261126 +blood4 +pooh08 +16021982 +040583 +brenda +fletch1 +200492 +asqw12 +fkbcrf +130480 +151181 +pantera123 +jo1234 +04031991 +26041983 +110594 +alinutza +maciej +pimmel +gofast +190581 +christen +getlikeme1 +3004 +bharati +katorse +13061983 +101276 +horses5 +2bigtits +201988 +100493 +redeyes +1houston +everybody +ethan3 +brianna10 +11112 +26071983 +getmoney07 +198224 +satoshi +aaaaaa. +ajax +26061983 +16031986 +197411 +cool69 +251079 +01071993 +kayla07 +sebastian3 +190885 +burak +060592 +pacers1 +kayla22 +300882 +221279 +saltanat +110277 +qweasdqwe +199218 +270182 +1pothead +delbert +delivery +2407 +infiniti1 +ramses1 +duckman1 +chocolat3 +110694 +louane +shayan +yamada +walter +youandme2 +eminem23 +kisakisa +040291 +cacapipi +13031993 +290691 +charlie16 +drawing +7angels +jake15 +04031988 +surekha +12051994 +tijgertje +ilove14 +95mustang +superman33 +19041982 +whatever8 +victor7 +1112223 +160492 +020984 +episode1 +hobo123 +qwerty20 +sekhar +harry5 +02031995 +xavier11 +20071993 +12345678aa +gallagher1 +kitten01 +meduza +ethan06 +garfield12 +26081989 +1w2w3w4w +skoda +jennifer6 +17051993 +annaba23 +darklight +marie25 +ipanema +04051992 +020186 +2525252525 +chakra +14061984 +orders +minombre +gwyneth +papillon1 +fordman +a11223344 +29091984 +renault19 +photon +250693 +24031984 +111222q +5353 +02091992 +rfhnbyf +keerthana +19081908 +pencil12 +penis11 +shital +anaheim1 +marie20 +178178 +hanover +gibraltar +mary22 +joshua88 +titanic2 +619 +rocky69 +daniel92 +darkhorse +arrakis +140780 +21091982 +scuderia +sophia2 +ainsley +belkin1 +15011984 +brianna +fireplace +16041984 +edinburgh1 +141986 +rjnjgtc +jonathan16 +191986 +061084 +monkey04 +199696 +1922 +01061980 +audition + +23091984 +troia +anabella +080290 +300680 +29121984 +breakdown1 +pompon +04040404 +descartes +amanda1234 +golf11 +30091989 +060786 +beaver69 +260591 +16041989 +mylady +cowboy10 +leonardo12 +1423 +031282 +bluefire +nadanada +wander +08081980 +buttbutt +bombshell +madyson1 +arcadia1 +maryjo +28031984 +p455word +roxydog +lovedove +nigger9 +blood6 +bloodlust1 +number33 +monkey420 +180283 +smiley3 +xpress +20051980 +08021984 +1malaysia +donatello +goofy2 +deathrow1 +babala123 +kaunas +vtkrbq +harry01 +a7xa7x +jake101 +lisandro +gunblade +600033 +july02 +bizarre +kourtney1 +salem123 +elbereth +babe23 +ripdad1 +197512 +kaulitz1 +ladydog1 +clare +happy1 +zhjckfdf +4thekids +290491 +241987 +xpressmusic +caroline2 +coaster +25111992 + +191291 +naruto0 +240792 +djdjdj +smiles2 +28071990 +0812 +4xxlqu94yo +143341 +candyapple +31101992 +#1daddy +159753852456 +jubilee1 +123pop +courtney13 +jesse01 +nomad +121177 +232 +12081980 +sticks1 +1933 +sniffles +21071983 +240781 +420pot +pato +04021991 +0512 +400021 +324324 +negros +client +010203040506070809 +lovers09 +140883 +raymund +samsam123 +30041984 +angelica +internal +bubblegum3 +030381 +280783 +123452 +1231233 +paintball3 +asdffdsa1 +honey8 +271280 +schoolbus +251985 +imran123 +dillan +summer24 +mewmew1 +waffenss +princess44 +trustno1 +wazup1 +lovely18 +pebbles12 +japan4 +daewoo1 +steve +yourgay +felina +lifeguard1 +johanna +studly +dark1234 +fiona123 +19966991 +leonie1 +090289 +bballer1 +emmalou +kissthis1 +dragana +bobsaget1 +slutface1 +battousai +198207 +manuel10 +7845120 +290582 +fhnehxbr +breebree +mylove09 +i4gotit +tigers4 +gatekeeper +55555s +02011991 +lunarossa +1452 +jupiler +1alyssa +251279 +170481 +deuce1 +bumerang +inverness +22121993 +vfhnbyb +122000 +messer +010291 +081086 +juana1 +keira1 +normajean1 +vfrcbv +kiki01 +131989 +265349 +30081985 +020684 +htrkfvf +07091991 +kaibigan +ibukun +sargent1 +beer4me +lemmings +03121988 +041281 +17111992 +amoremio1 +pitbull12 +open12 +oracle1 +newuser1 +77 +jaclyn1 +250282 +shelby! +charlieboy +gabriel08 +sushmita +marsupilami +montoya1 +08051986 +manny12 +elijah07 +tommy69 +260492 +teddy13 +155555 +01031982 +rocky +198507 +170393 +thelordisgood +buster9 +23041982 +020492 +rachel24 +elephant7 +john33 +50 +gofish1 +19021984 +segovia +dragon12 +anjela +solosolo +440010 +milion +martin06 +polite +fulton +purchasing +telecono +28011985 +lunatic1 +280992 +1a2a3a4a5a6a +perro123 +302004 +lilman3 +adagio +cece123 +hardik +yfltymrf +sexxxy1 +sept26 +pthrfkj +weedhead1 +hello1 +bkmlfh +071282 +spicey +jacob9 +021281 +spock +256buowriz +16051983 +1212qw +20081983 +babycake1 +040682 +denice +alicia +malmsteen +1savior +1popcorn +motleycrue +fishcake +18dummy +chelsea23 +dylan10 +maria6 +qawsedrf1 +201079 +wolfpac +jb123456 +ihateyou7 +lucky! +buccaneers +160282 +1letmein +01101983 +maldini3 +freiburg +02121992 +040591 +18071984 +ratboy +161192 +270594 +050985 +deutsch1 +jessie! +123.123 +darcy +rediff +196700 +06121990 +money123 +virtue +blah22 +yeah12 +15321532 +kasia123 +ted +killer34 +fender69 +guyg56fghf +010784 +supply +elijah08 +01101992 +rimmer +dominicano +190483 +panda5 +07121985 +nowhere +030492 +abigail1 +andressa +2712 +mugsy1 +071192 +21101993 +magique +021192 +azerty789 +sanders21 +18081983 +18081984 +athletics +bigdog11 +03031980 +xantia +qasdfg +rainbow23 +lynn22 +fucklove14 +papero +master15 +football05 +mohan +harley77 +15071982 +tempo1 +taipan +121299 +surfsup1 +300582 +1brianna +newark1 +600078 +cococo1 +three6 +230381 +nasty69 +pimpin22 +lupita12 +*love* +infinity8 +05101991 +260283 +fuckme666 +pretzel1 +daniel97 +skittles13 +230180 +110878 +210695 +vasanthi +scooters +070985 +gene +17071983 +nunzio +cazzarola +bb +ulrike +ducati748 +pimp20 +vvvvvvvvvv +christal +liebe1 +021083 +kaitlynn1 +270884 +28021994 +vaness +gus +dezembro +alberto2 +aftermath1 +pharmacie +anhyeuem123 +kinger +pooh09 +10021982 +kazama +treetop1 +02031981 +pancho123 +02111990 +sexybitch! +12345lol +cynthia2 +06031988 +sleepy13 +colonel1 +magiya +newlife11 +joseph. +cheer22 +welcome4 +piglet12 +201293 +dreamy +07081984 +hockey26 +nyjets1 +music9 +popsicle1 +201093 +nina13 +270495 +deluxe1 +loveme17 +190291 +c.ronaldo7 +678901 +shadow02 +chargers12 +trendy +jm123456 +191181 +antonela +vivek +raffy +joann +fuckme22 +04091987 +formentera +1qa +harlequin +salisbury +150780 +sept14 +13071983 +22111992 +201281 +love1998 +thatsme1 +06021991 +loquesea +marilia +chachita +vivalabam +dikoalam +sadie3 +lolol123 +30011988 +daffyduck1 +190481 +190191 +shivbaba +qweqaz +junction +sanches +16111984 +150680 +cxzdsaewq +nitsuj +nkechi +130183 +305mia +eagles06 +ambrose1 +newmexico +chiave +19071995 +comercial +d111111 +seven07 +mellissa +mich3ll3 +nassima +zachary11 +cometome +krisna +goalkeeper +mihai +diego13 +nothing. +071191 +290682 +ronron1 +qwertgfdsa +sk8ergirl +mother6 +derby +miranda3 +parkside +weezy123 +ditto +salasana1 +ingles +anthony101 +08091990 +chucknorris +slavka +ireland2 +040190 +31071992 +golden11 +mabel1 +hustla +197810 +1singer +19111989 +19841010 +ersatz +111111l +maria17 +osbourne +allsop1 +psicologa +27121984 +011092 +240493 +cash1234 +brand +kubrick +thanhcong +600024 +chinook1 +13021302 +melocoton +090591 +090789 +290885 +fuckit13 +26091983 +meatwad1 +dillion1 +logan07 +3grandkids +marissa12 +cthutq +yahoo10 +i123456789 +hihihi123 +kenken1 +030309 +baby67 +merdaccia +devin2 +311082 +#1baller +farmville +06121987 +ahahah +ilovemom12 +whatislove +los +kahina +mojojojo1 +aries123 +210394 +trophy +hoi123 +sagittario +baby56 +ferhat +hummer123 +kamelot +hiawatha +onedirecti +goldfish12 +302020 +30061984 +flasher +13011993 +15121980 +040191 +400062 +sasha12345 +240881 +chaotic +08021989 +26071985 +apocalipse +20081982 +13031983 +kaylee123 +hooters2 +chicken21 +sim123 +love2fuck +09041991 +210480 +xavier3 +azertyuiop +peace23 +personne +winston1 +16021984 +121012 +tucano +illmatic1 +140481 +111081 +12061993 +neopet12 +orlane +060791 +09051983 +squid +rollin1 +demon12 +1803 +chivas21 +football91 +06091985 +gfhjkmxbr +inuyasha7 +heloise +sarah16 +faustine +ybnkoia569 +november08 +remember12 +beba123 +newdom +ad1234 +bmw330ci +23021980 +hiphop7 +hilario +1212qwqw +200781 +angela7 +240292 +highfive +fabietto +06091986 +bruno12 +560003 +packers +keepsmiling +100894 +04071992 +keines +driller +310385 +love4real +15901590 +net123 +25031993 +abc123!@# +july01 +150693 +emily08 +baba1234 +abcd@1234 +skyfire +bellbell +academic +katies +06011989 +26051984 +131293 +feliciano +pretty09 +qsefthuko +clockwork1 +kelly3 +i.love.you +cosworth1 +bernardo1 +lovesux +27081992 +yuvraj +fuckhaters +whatever10 +almaty +slappy1 +160592 +clean +diver +chicken +loveya12 +restless +041191 +kaylee12 +aikman +j3nnifer +810810 +razzle +123012 +myspace28 +pretty8 +241279 +brittany8 +140293 +bofo100 +jesus316 +10061980 +rempit46 +coronel +2805 +130000 +azteca1 +cacamaca +nani123 +austin24 +karebear +serega123 +011189 +jangan +1098765432 +melissa14 +0912 +qqq222 +toto12 +m666666 +missy7 +hooter1 +241991 +thebest12 +lauren8 +123578951 +east13 +kaka10 +limited1 +toiyeuem +23071993 +szkola +04071989 +090689 +28061987 +orsetto +alivia +basketbal +yflt +07051984 +blood7 +birddog1 +trafford +xjcri66kfd +202001 +kodaira523 +220879 +soulfly1 +ward86 +je +slapshock +alexis00 +graduate1 +colts88 +driving +15081983 +cre +1509 +22051995 +phillip2 +17091993 +12091994 +hihello +180282 +040481 +020391 +pepper14 +brian21 +27011990 +scrabble1 +05111987 +kiki22 +040290 +16091983 +2million +brittany18 +newyork8 +200792 +jacoby +16121982 +focker +08031992 +7777777z +theking123 +norway1 +25011993 +southeast +millie +15041993 +1tinker +zoccola +250679 +mart1n +231193 +muffin7 +kathy12 +27051984 +georgia12 +naruto93 +gabriela12 +kenseth17 +chels1 +05041987 +nanana1 +wolfen +031184 +220182 +canon123 +yankees! +30091992 +alex1980 +spanky69 +heinz57 +dempsey1 +zaqwsxcderfv +24061982 +061192 +15091992 +allah99 +child +fellowship +k123098 +050288 +energizer +05121984 +18031990 +cynthia123 +bitchin +2143 +130479 +130981 +qwerty765 +07061987 +02121981 +160792 +240782 +alexis16 +america15 +lokomoko +171081 +secreto1 +asdflkjh +baseball29 +yomomma2 +220393 +lakeland1 +123456ad +rileydog +250878 +yugioh12 +250192 +25111983 +motard +chessmaster +08061986 +luis18 +1231231230 +11271127 +29111986 +mybrother +pussy +alpha1906 +benjam1n +150182 +mamas1 +05041986 +notyours +11061981 +1qa2ws3ed4rf5tg +number18 +03031994 +michael00 +200392 +centaur +marines2 +yell0w +06031985 +whatnot +08021991 +scott69 +09051984 +280182 +230881 +marcus13 +hari +fallinlove +brenton +wootwoot1 +aymeric +lucas01 +13091992 +indy +teddy7 +thething +star20 +blanah +peanut15 +bikerboy +randy2 +brokencyde +05111991 +kool-aid +precioso +charlie17 +qwerty1990 +dianas +annelise +260981 +300191 +joey23 +332335 +ashely1 +kinga +iloveu4eve +meeting +junpyo1 +choppa1 +100495 +adolfhitler +polizia +natalija +kathmandu1 +24061990 +061183 +gauloises +nighthawk1 +112131 +08021988 +mommy2be +1larry +fartfart +hot4you +200681 +application +catdog3 +bubblez +bianca2 +charlie24 +sem +250792 +cosenza +111970 +18011992 +tink08 +scott11 +010592 +040189 +180382 +ypt123 +breasts +roxie123 +290184 +ava123 +skunky +198515 +040883 +abccba +chrispaul3 +22121981 +tro +huevos +baby87 +251194 +041190 +121973 +meridian1 +mag123 +9086916264 +vauxhall1 +ducati1098 +171987 +02061993 +iloveyou04 +peanut99 +coco69 +diablo69 +jonathan! +04121984 +dracon +1802 +040483 +20051981 +grihan +hat123 +- +3344 +lookup +ana1234 +170682 +2408 +alexandre +wealthy +06041991 +11011983 +walker123 +270592 +caleb2 +040785 +1jackie +eeeeeeeeee +150378 +190592 +bellamy +1fineday +07031987 +9988 +natalia12 +14041994 +jaxon1 +21091983 +tbfj7no671 +guzman1 +rfczgecz11 +bayram +iceman23 +teddy01 +sugar3 +zoey12 +power13 +iloilo +pimp45 +rfhectkm +asswhole1 +ytgfhjkm +q1111111 +tourism +10091983 +poopers +07121989 +tivoli +11121993 +skorpion1 +babyboy22 +school +april2008 +sasha10 +tiphaine +lotion1 +jasmine17 +310882 +15011992 +joseph8 +arequipa +brian22 +marianne +08021986 +puppies! +301092 +lucy22 +lovejoy1 +platoon +5grandkids +211293 +090787 +0612 +bigdaddy3 +210182 +songs +money247 +zxcvbnmzxcvbnm +genesis123 +180992 +04101984 +oklick +fuck999 +mopar +22021982 +miss123 +sa +cowboy21 +27041993 +sierra13 +20304050 +calliope +me4you +250980 +020693 +030680 +pandit +23091983 +boston10 +08101987 +nikki14 +brielle1 +obvious +fluffy! +brownie12 +ihateu! +23081983 +07101986 +junjun1 +123456kl +aparecida +christine3 +lilwayne13 +skorpio +skater6 +rockstar01 +bulldog11 +timeout1 +robert77 +09081989 +15111983 +rhianna1 +jerk123 +mmm666 +letsgetit1 +kzkmrf +trickster +tw +280991 +juehtw +telefono1 +barsuk +sweeper +giugno +katie22 +yellow17 +27111982 +rockstar4 +azeaze +james77 +01121992 +29111984 +301083 +majestic12 +15051993 +250284 +dragon26 +honda69 +melchor +niunia1 +julija +saber +27101984 +himura +bunny01 +havana1 +fuckyou87 +290384 +oxnard805 +chiens +potatoe +28011992 +130593 +leapfrog +211111 +novembro +040288 +311292 +240980 +fairydust +5zgb2t764b +ass1ass1 +820820 +19051995 +08101990 +261092 +korede +zoolander1 +070794 +humanity +200980 +julie2 +22011984 +superhuman +09101990 +horses4 +fucku4 +stargazer1 +fregis +anna1988 +2601 +hjhjhj +newholland +no +twilight14 +07031986 +vbkkbjy +campanilla +band12 +241193 +20111983 +121269 +123456789abcd +elle +metal6 +24091992 +digital123 +220991 +10011980 +hannah97 +spiderman +wetwet +smack1 +sergio13 +cheerleadi +lucky +3010 +poopie3 +jack5225 +buckfast +donnell +grounded +noentry +halina +06081985 +200184 +jessie10 +marine01 +missbitch1 +bambus +trashcan1 +curley +andrea16 +301081 +gfhjkm +66666a +rachel14 +huangjin1987 +murmansk +000111222 +bunnys1 +ditto1 +letmein3 +niniko +010691 +1sweetpea +abigail12 +199117 +bhavna +199010 +topgear1 +14021995 +kzueirf +230379 +krokodyl +teremok +kiss13 +water23 +30121982 +cartel1 +1drowssap +ayinde +1apples +1scarface +marmalade1 +amadeo +123india +martha123 +11091983 +gitler +robert06 +2funny +braulio +12345678abc +gazette +nike21 +06011986 +evidence +04121991 +151079 +15001500 +review +bf4ever +lampard08 +2604 +free4me +raistlin1 +cmpunk +foreveralone +sassy10 +anajulia +armelle +15101993 +jazmyn +whateva +skoal1 +gdn7414 +8585 +jagannath +carrington +lottery1 +june1987 +sammy! +charliebrown +130193 +12041980 +100280 +bahamut1 +230382 +warden +2741001 +shoelace +perfect2 +101176 +110379 +crystal69 +01011965 +240893 +drew11 +neha +gundam01 +miguel23 +161988 +lovesex1 +040791 +161292 +1johnson +mickey18 +anne12 +z111111 +bmw320i +minimal1 +29101984 +jake07 +sarthak +jayda1 +padmavathi +forever9 +101097 +09031991 +bentley +29031992 +hobart +$hex +strat +02011981 +jennifer9 +mistress1 +fuckhoes1 +30041993 +stef +kayla09 +naruto18 +25112511 +270481 +newyork4 +160283 +shotgun12 +lara123 +228822 +dima1992 +021284 +soccer4lif +tester01 +moomoo22 +nicetry1 +residentev +140882 +19111988 +darksoul +polka +31011984 +aavlg728 +college2 +montagna +230577 +gabita +my2boyz +sajjad +171092 +pooh07 +getmoney6 +surf123 +greater +03091984 +akucintaka +emilyann +ekx1x3k9bs +golfer12 +rose15 +gigigigi +222999 +nt +greenday10 +020880 +annalise +rich12 +1346790 +14021993 +220980 +hahaha11 +abosede +cdtnkfyrf +kayla! +dragon92 +destiny! +zeke +eureka1 +pokemon21 +rad +boost1 +peavey +cecil1 +school09 +mercredi +sally12 +latisha +lalo +custard1 +loislane +britney2 +22111976 +woobie +sept28 +beaute +1603 +flora1 +leighton1 +isidro +kennyg +221001 +tinker10 +bubbles16 +bmw318i +tokio +chris#1 +palestine1 +ricardo2 +a123b456 +17021984 +12345q +slater1 +03041993 +smoky1 +naruto17 +ara123 +jai +disc +playboy22 +iloveu1234 +helloman +abcdefg. +198309 +14011984 +198506 +bopper +xk55xdxcyr +maxell1 +030394 +steven17 +erfolg +05011991 +china2 +03051984 +danielle8 +homestead +hoanganh +012345a +diamond! +craft +03031995 +kindred +booster1 +donald2 +panda3 +199020 +05081984 +170684 +ali786 +ishtar +adrian21 +oreo13 +sept29 +lauren99 +kratos1 +boxer123 +water22 +200192 +gifted1 +demarrer +chad12 +hamida +cicamica +playboy +nikki8 +150395 +lytwa813ib +caspian +010195 +puma123 +dkssud +7896541230 +141081 +alesia +22051982 +310392 +nakita1 +dennis +juergen +chloe5 +patrick14 +estopa +cancer7 +halowars1 +pitcher1 +29011986 +mack11 +excellent1 +2psxvvd7 +09121985 +19281928 +09081984 +23091994 +310792 +optimistic +paokara +11101993 +dirtbag1 +06011988 +alias1 +alejandro3 +gothic2 +ncc-1701 +27101985 +help911 +mariel1 +bolivia1 +school1234 +59piru +aspirina +youandi +hakim +kardon +carlos24 +171984 +agata1 +21121994 +1sexyman +punkrocker +198314 +boogie123 +dexter21 +kloklo +010681 +calamaro +15111981 +corona13 +mikey5 +29041984 +1soldier +160880 +22071994 +1456 +hotspur +mexicali1 +mybitch1 +sen +lashae1 +tweety101 +jordan93 +121202 +chichi2 +071085 +fourboys +myonly1 +178500 +140208 +myspace90 +belly +rayquaza +stratus1 +060784 +alesya +rangers1690 +170170 +28101984 +1babydoll +olivia! +1qwerty7 ++ +wolverine2 +lololol1 +carbon12 +02111988 +assassass +molly101 +jordan94 +21031980 +diogo +250579 +brothers3 +salam1 +230281 +stephen12 +ethan05 +161081 +junior02 +dogs11 +22101980 +27011985 +jared12 +komo123 +dumitru +addicted1 +020680 +30031993 +anacleto +candy09 +wolf11 +br0ken +290492 +050489 +emachine +opensaysme +khairul +kalima +dominican2 +06051989 +finder +escorpiao +myass1 +23101993 +ilovejose +25011994 +jeremy10 +bagpipes +rafal +12061983 +xdf65b6666 +150193 +clinic +443322 +mamoune +angelina2 +brisingr +07121984 +taobao887 +spike11 +mylife09 +154263 +iluvjesus +harbor +santos12 +1barbie +wel +erika12 +ljames23 +jacob! +sybil +rakizta +120396 +mommy24 +031182 +lindsay2 +170893 +08091985 +kamryn +speakers1 +shovel +030189 +twentyfour +16031993 +stomatolog +protect1 +010176 +10101996 +yahaya +cincin +natalie5 +igorigor +spider69 +viper2 +cupcake10 +corvette +putter1 +301181 +cheese9 +11041980 +cumberland +stephanie! +altoids1 +280482 +dario1 +bigtruck1 +girls4 +200993 +chrysler1 +marcel123 +gizmo3 +071184 +27111988 +emmett1 +06031989 +pariss +010792 +basspro1 +26011993 +dylan7 +123123c +45683968 +kamille +climax +1marcus +jeffrey123 +380009 +qwerty98 +1aaliyah +poohbear08 +abaybay1 +doradora +solar1 +131078 +angel4ever +198413 +241179 +star89 +121266 +19021993 +15081982 +venus123 +babyruth +play12 +madurai +4815162342q +dunkin1 +400000 +09081986 +churchill1 +hola11 +05101984 +25101993 +hayden08 +radios +homestar +dakota4 +nightingale +01041982 +140692 +skillz1 +sys +minecraft1 +man1234 +sluts +skater16 +simplyme +111277 +nemanja +joselyn +may1990 +hakan +fraser1 +dicks +linkedin1234 +18121993 +rascal01 +poohbear15 +1panther +football97 +windows8 +laura22 +15061993 +codybear +shaun123 +genevieve1 +dehradun +compaq01 +010591 +cherry8 +198221 +karan +honda97 +lucila +fender01 +240494 +trinity01 +02121982 +danilov +041183 +moschino +22101981 +210993 +111111c +131093 +waylon1 +8rlb9l1squ +579395571 +charlie18 +eatpussy1 +lovehim2 +flubber1 +06051983 +280383 +mollie123 +198714 +deangelo1 +chatham +tommy01 +morita +25011983 +martinko +123123aaa +chanel2 +buffy2 +autumn11 +england2 +redfox1 +polar +04011990 +drumnbass +isaiah123 +65432a +malakas1 +17051983 +knight12 +08041984 +guessthis1 +261280 +1420 +babyface12 +blanquita +casey7 +missthang1 +camila10 +150880 +lovesucks! +shah123 +legenda1 +faith13 +14041983 +gin +penguin11 +alex2011 +tombstone1 +suzuki600 +shippuuden +jackson9 +godknows +emily14 +231078 +15031992 +raster +020281 +270682 +metallica5 +charlie05 +vlad2000 +meditation +09031989 +robert88 +19011993 +vanechka +560027 +heaven +korn12 +020580 +199316 +eminem21 +vfr800 +marlena1 +pussy9 +portugal7 +27011984 +marzipan +dirk +army12 +15041994 +codename47 +hooligan1 +hajduk +penney +postman1 +redsox21 +110894 +queen13 +moon1234 +jeremiah2911 +777222 +mann +apple24 +chapulin +asus +kokos +frankfurt1 +opportunity +zepplin +tristram +smiley7 +fedorova +kjv1611 +bill12 +250879 +777123 +03041983 +anitas +vegeta12 +nigerian +1teddybear +samuel7 +2100 +18121981 +23031995 +junior. +bosshog1 +20011982 +16091984 +rebecca3 +methodist +nine +mariarosa +pretoria +ribery +199514 +qwerty76 +thomas1 +smith12 +lluvia +darshana +cicero1324 +nick17 +lemonhead +jeferson +anna14 +smokey23 +asdfghjklz +badass13 +dragon007 +andrea! +shaila +170482 +11061993 +jacob09 +lifeboat +1q2345 +turkey12 +03111986 +lupin3 +alicia13 +vasquez1 +gocubs1 +toenail1 +danielle23 +lumpy1 +welcome2 +aaaaaaaaaaa +virgil1 +111122223333 +224224 +moonman +victor3 +25111984 +06091984 +100395 +010387 +death5 +marieke +bmw316 +23081992 +boogaloo +lou123 +07081992 +291280 +090191 +josh101 +616263 +2612 +lancers +lucky25 +muffin22 +javier2 +04021988 +alexis17 +jojo21 +loveyou23 +smoothie1 +pirelli +160393 +0305 +nintendo +lyrics +saints123 +fenerbahce1907 +braces +21011993 +stephen7 +kyleigh +dallas81 +gamestar +xi345bjfvp +edgewood +18051993 +groningen +13111992 +moonlight2 +chienne +iloveubaby +2muchfun +frechdachs +251986 +newera1 +jenny21 +forever27 +12011982 +anyway +15031993 +10031003 +chato1 +150481 +crazy09 +baguio +iloveyou29 +saddie1 +merlin13 +nexus6 +chapis +199018 +230493 +282930 +permata +16041983 +sandy7 +198616 +220679 +dddddd +tam123 +bugmenot +banshee350 +doggy7 +djkrjdf +lovemenot +juandiego +letmein11 +678876 +sexygirl69 +03011988 +seekbang1 +040592 +198328 +alevtina +sarah17 +160984 +babydog1 +bobdog +030191 +deb123 +password54 +08051992 +horses10 +1hotchick +sudoku +porsche9 +01091981 +090589 +09041988 +johndoe1 +07101985 +2sexy4you +06021984 +nanonano +12345678ab +1z1z1z +332332 +24061983 +27061983 +midnight01 +sommer08 +asda +s55555 +06091983 +010985 +prabhakar +yourmom13 +rockstar15 +serrano1 +baphomet +blackie2 +30091990 +iceman11 +fred22 +2541435 +13121981 +305305 +190186 +24051992 +rafa +vitali +adinda +03111988 +happycat +kjgfnf +vista +lala21 +janka +21041983 +lovepeace +1234567892 +dayana1 +aqua +samantha15 +bondage1 +14021994 +deerhunt +050390 +040409 +06071983 +92631043 +linkedin10 +14011990 +ultima1 +loser8 +021191 +daytona500 +198916 +21091993 +kk +000420 +leopold1 +250880 +spiderpig +peach123 +080588 +04101987 +8888881 +svetlana1 +albany1 +15021982 +casimiro +tahoe +07051983 +ihave3kids +greenman1 +macherie +231093 +babyboi +playboy16 +payday1 +juicy2 +ivette1 +010482 +socialbook +doggone +coheed +05081990 +04021985 +morgan09 +124536 +240580 +antonio23 +branch +560064 +old +malysh +monster99 +kazbek +cooper7 +pasodeblas +10011982 +ganda1 +tomkaulitz +weezy +timofei +gbaby1 +coupons1 +gokhan +1cutiepie +070987 +blessed12 +roleplay1 +100193 +gemini123 +johnson3 +hellomate + +shopaholic +1726354 +pineapple3 +stressed +11051994 +denver15 +0214 +scorpio +max2010 +1iffqb66tw +foufoune +24071980 +bungie +golfball1 +freedom6 +lild12 +00001234 +anna1991 +150380 +takeover1 +kailee +carmen13 +12051982 +m55555 +060984 +jonas13 +crusty1 +ramstein +honey07 +kir +170993 +nick09 +vfvekbxrf +eminem22 +bozkurt +gordis +04041981 +tetsuo +ness +jerome +04081985 +030892 +220392 +220793 +sorento +567 +270292 +f0lhvbok +23081993 +2muchmoney +dududu +nightowl +greygoose1 +castaneda +scopare +billy11 +nayara +280982 +190383 +qqqq1234 +вконтакте +bestie1 +02071981 +tunnel +hellobaby +rockhard1 +25061982 +teddyb +140993 +spike3 +dumass +casper7 +economist +therock2 +green27 +stylist1 +pokemon14 +leonel1 +1921 +091292 +11122233 +02121990 +lennart +exbntkm +spartak1 +29121983 +james. +ankush +hood +charge +caramelle +160691 +13641364 +12071994 +best12 +613613 +magazine1 +27121992 +cristel +1qazxsw23edcvfr4 +baby96 +stitch626 +xiaofeng +telekom +xavier07 +krishan +dipstick1 +141093 +199600 +danilo1 +bhabie +241079 +lena12 +mudar123 +fpna23aas1 +animals2 +jesus001 +chloe06 +221992 +jerk +29041993 +reseau +cody22 +280583 +honey16 +penguin! +160382 +13061982 +lioness1 +400056 +2401 +29021992 +kabayo +biscoito +moonpie1 +jordan23 +210481 +dreamer7 +dark13 +pensacola +hoffmann +amber4 +301291 +02121984 +roach1 +cabeza +roberto +in +lawman +ashoka +17081993 +wolf1234 +princess30 +mughal +noynoy +17091989 +080986 +18111983 +04101989 +cute18 +asm +05041984 +yahoo. +cheyenne +donald +joshua1234 +050883 +slave +vampire6 +piercing +05061982 +cas123 +121212z +brittany17 +sophie5 +chayank +251278 +100695 +02101982 +1608 +brother12 +sports5 +araujo +jasmine101 +sanrio +double2 +131985 +sammy8 +198403 +100678 +laulau +camille22 +toyota12 +book12 +salsa123 +123456dm +198503 +avokado +booger11 +14091984 +44554455 +02051992 +linkedin13 +eagle12 +miangel +sheshe1 +dabest +andrea17 +brooke5 +02031980 +polipoli +scruff +happy +x15piq8snj +200992 +m7777777 +loveme88 +tatenda +caboose1 +00007 +25011982 +ilovesean1 +151291 +asd111 +archie123 +7123456 +singlelady +relientk +tink10 +mama14 +mexico16 +malfoy +fdhjhf +manutd07 +slick50 +karin1 +22102210 +03101985 +240592 +establish +anahi1 +hanibal +030292 +random2 +passwordnew +domino123 +lovemoney +bonnechance +191082 +kumars +whatever9 +google10 +qwerty92 +pookie69 +010392 +tdws011286 +pigeon1 +misspiggy1 +madison02 +1ranger +bobita +ashley95 +61616161 +22081980 +09041984 +ladyjane +22031993 +iwillwin +avellino +021091 +microwave +heart5 +happy24 +newmoney1 +07031989 +charles01 +piglet123 +ilove8 +051091 +chiboy +monina +26081983 +02091990 +sept30 +zkmxbrbcbkf +bailey04 +catfish2 +kayla16 +pimpin14 +2705 +financial123 +nicholas9 +latina13 +q1w2e3r4 +iloveit1 +130992 +patitofeo +1single +zamora1 +04101983 +chester01 +080192 +crispy1 +030395 +jemjem +summer33 +hancock1 +aaron07 +disney11 +nadira +04111988 +fuckit. +petros +151178 +24121980 +1denise +snakeeyes +120795 +020792 +box123 +251984 +cheese14 +emmanuel +01091980 +paarden +ethan07 +matthew02 +table1 +nectar +jammie +alexander! +198125 +joplin +love789 +duval904 +1stephanie +18061993 +02101980 +numb3rs +080689 +badass3 +samsung9 +198223 +200900 +gladstone +28101982 +ashland +1801 +150679 +123456xxx +16011988 +sk8123 +printesa +cavolo +myloves +818283 +apokalipsis +121297 +spencer7 +sophie08 +plankton +emma2007 +mexico07 +ilovej +121203 +d1d2d3 +040584 +112233445 +ranma12 +flip123 +141280 +panda7 +natali1 +badshah +11121982 +emily05 +280283 +sexygirl11 +zse4rfv +mj2323 +casper3 +210193 +quack +rennie +chocho1 +hiphop3 +blondie +281093 +lorna +sampath +teach1 +bully +400077 +bonny +softtail +06061980 +280384 +180893 +shithead12 +zxc456 +poopy5 +sundown +niccolo +06101991 +091085 +patrick15 +27121982 +221293 +eloise1 +qweqweqwe1 +biquette +280878 +desperado1 +kika +080391 +161986 +220394 +j3nnif3r +vbitymrf +tooshort1 +pimp88 +popkorn +vfieyz +bettina1 +olivia05 +zarate +billy13 +03011992 +beerman1 +mickey17 +240282 +myspace94 +24061984 +110101 +volcan +summer1234 +060484 +dallas8 +santiago12 +allstar12 +logitech2 +azn4life +cristianor +fordranger +toasty +girl101 +hockey87 +140880 +1245789 +031191 +iloveemily +011190 +asawakoh +30071983 +steve13 +ravipass +ktybyuhfl +winter5 +17081985 +198715 +150579 +res +11041993 +abcdefg! +28041994 +isabelita +201294 +29111983 +raghavendra +iamking +maranda +doo +pepper6 +shorty9 +swe +desktop1 +qq +prisma +direct1 +nicole0 +090190 +porque +kokomo1 +puzzola +millie2 +topdevice +ashish123 +truckdriver +dan1234 +kalvin +pattaya +336633 +djghjc +jason25 +omfg123 +05101983 +t5e1q9shfd +tracteur +mickey24 +07041985 +snowman12 +cornerstone +cdznjckfd +abgos999 +countylib +allison3 +198608 +protozoa +010883 +01051993 +120876 +yoda123 +040991 +marshmellow +thebomb1 +rafale +30081984 +foggia +efb +02051980 +single07 +alikhan +120378 +andrea4 +11051105 +119110 +gutter +vlada +harley88 +171989 +die123 +bobber +talent1 +teamojesus +machines1 +leboss +09031985 +yamini +yu-gi-oh +197910 +bigdog13 +198127 +311080 +johncena5 +bigdick12 +060884 +cthuttdbx +nathan16 +101274 +230893 +pimpin9 +11061980 +070189 +y123456789 +21012101 +01081993 +johnathon1 +santos10 +1monique +celia1 +chickadee +crawfish +iloveme09 +201292 +02091981 +rawr1234 +yahoo22 +nice12 +tiffany5 +bailey1 +qwertyuiop1 +290189 +190883 +19111983 +homer2 +rootroot +abcdef3 +barry123 +230277 +peugeot1 +harmonia +napoletano +vladut +15061982 +chonchon +detective1 +kayla6 +memoria +vfrcbvjdf +nicholas8 +pw898klkag +devon12 +231279 +mummydaddy +280881 +loka13 +180187 +gunit2 +141141 +240593 +alfaomega +tishka +lex123 +hunter20 +dope +hailee1 +2402 +светлана +lizzard1 +anarchy666 +112233z +myspace32 +pussy1234 +1slipknot +11119999 +innova +15111982 +peinture +imperio +anna1993 +stapler +120695 +300483 +13021983 +hotdog7 +230181 +lauren08 +sexybeast2 +broken12 +21061994 +james27 +200491 +88keys +metalman +nikole1 +backyard +ask123 +08071992 +09051988 +sillygirl1 +fktrcttdf +19121993 +528528 +700029 +23101981 +cecille +dav123 +17111983 +chupamela +alaska2 +superpuper +05021984 +gabriel07 +12345671234567 +sweet8 +annies +deepa +gusanito +paspass1234 +devil2 +adriano10 +soulreaver +albator +poopoo! +eightball8 +liverpool! +bigboy9 +snoopy14 +210579 +08071990 +lovefamily +batman00 +j123123 +1iloveme +junglist +4monkeys +070288 +021182 +tevion +mm +20061980 +corona12 +14091992 +ilovemen1 +maximilian +151279 +16061994 +16071993 +manis +domenic +2356 +lufthansa +01111986 +arizona2 +buthead1 +lindros88 +extra +29101983 +rfpfyjdf +28021983 +beautiful6 +infirmiere +ferrero +030484 +kiekeboe +floris +07011987 +06051992 +marcelo123 +gitano +100595 +vandam +04031992 +smiles123 +worldofwarcraft +youtube12 +020280 +01101982 +rose16 +hammarby +09011990 +30111986 +120505 +rudy102 +sharlene +anthony04 +maravilha +nhfnfnf +chloe10 +bella05 +16021985 +peaches22 +sandiego13 +198917 +02071980 +snickers! +daisy +leona1 +megan10 +genial +girija +chloe07 +romantica +shopping2 +dewa19 +741000 +010201 +monique7 +230995 +moriah +el1zabeth +couture +warcraft3 +jerk77 +ladybug11 +20111981 +oceanside1 +nursultan +linkedout +polkadots1 +mak123 +07091985 +560011 +terry12 +mixtape1 +tacobell2 +avrillavig +egyptian +marlowe +xavier13 +aventure +04041982 +1bubba +080488 +mishka1 +sexyako +050594 +paco12 +frog11 +dawn12 +02081993 +050791 +160391 +02041981 +160184 +110181 +dorothea +redsox3 +ostrov +15051995 +20011994 +fordgt +ganesh1 +24051984 +08011991 +13091983 +london2010 +bassett +falcon16 +14021980 +fuck15 +198513 +emma2006 +harley00 +vitaly +01101993 +xdxdxd +qn4kbwv559 +bourne +050784 +ben12345 +nene13 +angeldust +facebook2 +98765432100 +jackson23 +sandy13 +askimaskim +kaitlyn2 +pogo +p1mp1n +pokemon. +0510 +bulldog13 +balikpapan +leo1234 +sociology +090786 +122188 +marshall2 +a456123 +marine2 +ellipsis +310783 +07091986 +friends23 +200682 +1brandy +rabbit11 +country123 +mosaic +05031993 +100793 +lollipops +17091984 +noneya +27051985 +shyann1 +gizmo11 +bonita123 +mike44 +thegame2 +06111990 +ilovedylan +laure +23061982 +gerasim +290292 +hijoputa +ambot +zodiac1 +sarojini +doc123 +20101980 +scotty123 +godhelp +daquan1 +whore12 +invasion +dem +myname2 +catalog +hearts! +140707 +luke11 +stanley2 +260380 +04111991 +ikarus +06101985 +02111984 +bigtoe +azertyuiop1 +tinytim1 +100percent +power4 +noone +200283 +topmodel1 +qwerty1234567890 +02111991 +dolphin11 +mikey01 +umpire +lilbitch1 +poipoipoi +longjohn +090486 +rugger +trust123 +johnny08 +140206 +rjntyjxtr +poohbear23 +3838 +michi1 +tony16 +gotyou1 +greeneyes2 +06041986 +bigjim +adriana12 +201061 +earthquake +pitbulls1 +guitar10 +kri +baboshka +qwaszxerdfcv +240381 +peanut24 +060189 +02051982 +071087 +andrew27 +100878 +msn123 +jason! +07021984 +somalia +cassy +280485 +260606 +26011992 +zuzanka +01031981 +ilikeu +fidele +josh09 +jt1234 +pepsi5 +06031983 +banner1 +mum123 +110278 +gizmo01 +ooooo1 +dd +azerty13 +antonius +legion1 +051192 +kumaran +mark14 +14031983 +boogieman +012511n +natedogg1 +rere123 +bubba21 +instinct +bar123 +hockey55 +jokerjoker +bella2009 +jackass11 +motherof5 +bella! +fallen13 +thehulk1 +pearljam10 +taylor1234 +unicorn2 +pretinha ++ +190982 +boknoy +200280 +190381 +02040204 +180182 +nicole29 +joseph19 +110060 +shepherd1 +111234 +happy88 +friendsfor +17031983 +170594 +0104 +bagger +310781 +196400 +trick +advertising +frazier1 +260581 +caritas +newtown +buster1234 +martinek +corsa +blacky123 +chilango +tanveer +hammy +karabas +barnett +green. +shitbag1 +aaron22 +2hot2handl +2605 +love345 +hello25 +080190 +30081992 +anna1992 +10051995 +marecek +holder +jamari1 +widzew1910 +red555 +110777 +killer12 +231984 +03031982 +strings +sabrina7 +marcus21 +latisha1 +angella +magnetic +050389 +berlin123 +b8ca6yz1nj +hollywood5 +woods +05011988 +darknight1 +freebies +yyyyyyy +1lovee +alexandra +sverige1 +spotlight +johnny10 +jadore +dragon95 +logan10 +57575757 +yyyyy +fylh.irf +ralphy1 +nazarova +franchise +kambing1 +180394 +19071982 +gabriel4 +taylor101 +031283 +tommy22 +dubstep +homeschool +corleone1 +march07 +07021988 +4g3uvrxn7w +rainforest +kohinoor +robert1 +michalek +24121993 +king17 +101072 +1234567890d +trinity12 +10081994 +freemail +kyle22 +171293 +l0ll0l +200879 +chloe08 +angel333 +frankie! +pepper9 +17031984 +hhhhhhhhh +lada +wingnut1 +27101982 +sweeney1 +imhere +memyself&i +messi1 +scarab +12901290 +brandon101 +smackthat1 +senators +banana10 +jakejake1 +06031992 +roblox +copper01 +persephone +paulette1 +a1b2c3d +spiritual +19081984 +lovers08 +black +iloveyou1 +200678 +310391 +230193 +72727272 +blackass1 +290781 +623623 +galata +hvqjvxvb76 +servis +farhat +guitar101 +redsox09 +samarkand +artem1 +0112358 +alexis98 +271984 +fuckyou25 +cameron! +191091 +cathleen +123abcde +mariaeduarda +jesse14 +160582 +laurent1 +madiha +220193 +260982 +jones12 +05021993 +bubbles +ktyecz +marie1234 +pink95 +120194 +23041983 +030681 +slutbag1 +29081989 +friends21 +cha123 +03091990 +211192 +230380 +chase01 +46and2 +hx28o9e646 +070592 +trinity4 +pretty9 +rtrtrt +31101983 +erdbeere +twokids2 +icare123 +jason09 +day +eggplant1 +fit4life +1butter +13631363 +cristo7 +19861212 +joker15 +bartolomeo +0304 +1500 +glock45 +landon08 +poussy +vanilla2 +protein +28071984 +duke21 +blonde2 +whyme123 +020781 +maison1 +1314258 +alabala +eric21 +secret. +adidas23 +17121981 +iubita +honey15 +apple15 +nelly12 +babygurl19 +bibi123 +271091 +221179 +inuyasha3 +anthem +quintin1 +bigman123 +zaq1qaz +pitbull7 +3103 +sunkanmi +illini1 +sasukeuchiha +maharot +7sfqc8zi5d +22011983 +holden05 +bmw320d +faithless +alexandr +natalie01 +01234560 +18101982 +rui100 +123fuckyou +cavalli +22061994 +jeremiah29 +fremont1 +noonie +freddy +soccerboy1 +290484 +sebastian7 +genesis12 +161987 +parking +ilikegirls +fietsbel +godrules1 +1loverboy +montreal +donegal +sample1234 +ilovepizza +06081989 +123123456456 +ibrahima +091191 +cutie17 +123456zzz +28121982 +dustin +magoo +16061982 +1602 +2486 +300184 +tabasco1 +staystrong +armonia +16071989 +260381 +neisha1 +hateu2 +novell123 +laralara +drewdrew +198121 +050285 +230294 +montague +congress +b43m6xhiee +19821983 +griffey24 +denied +paloma123 +starling +capoeira1 +ryan05 +alyssa14 +170777 +mybabe1 +mustang93 +airman +celtic7 +21071981 +gasoline +marleen +031092 +seraph +money34 +maddie13 +asshole10 +tigger00 +collier +galatasaray1905 +060289 +pooh21 +epson1 +140381 +password36 +liberation +mariner1 +danni +ammukutty +08051988 +sebring1 +kirstin +dsdsds +lilpimp +godlove1 +chevy07 +190683 +andrea18 +06051985 +ninjutsu +falcon123 +sweet09 +mausi1 +514514 +11031982 +rocko +emma2005 +30031983 +170593 +220993 +290192 +triste +26111989 +olivia22 +adrian7 +sorokina +ficelle +dwade03 +emmalee +130381 +chevy3 +blondy1 +asdasd12313d +grenada +guard1 +mamamary +oladele +mario22 +nemezida +hondacr125 +jaguar +imbored +max111 +142142 +lolipop2 +pamela +willie01 +marcus10 +fatty12 +castaway +08121992 +mithun +smiley! +020681 +09061984 +spider +twinkle2 +stratos +251251 +friend5 +manzano +071183 +finlandia +loulou2 +198907 +recon +17041984 +14081983 +brian14 +091284 +cutie1234 +dragonfly7 +natalie11 +04081984 +12051981 +121075 +hounds +bigboy6 +090592 +19051994 +10041994 +260992 +emmanuel +123qwe +654321l +footy1 +mello1 +400006 +nikki10 +210479 +091184 +shake1 +pangeran +rockers1 +kurakura +rawiswar +av8ygj1f2u +rfrfirf1 +miguel14 +iloveboys2 +india1234 +drum +1travis +21312131 +claudia2 +trill1 +260781 +lkjhg +peanuts5 +autumn123 +four4444 +killa7 +07101984 +vbhjyjdf +30051982 +199118 +abdul1 +saskia1 +dragstar +111969 +07061986 +prashanth +10041993 +magnum44 +mim +fire666 +210980 +jonathan15 +123700 +123sss +monkey100 +10021995 +kiki10 +231194 +emachine1 +brooke22 +guineapig +071090 +scholes +soltero +ramramram +25121993 +111194 +fairmont +190185 +mimi14 +lithuania +p12345678 +198019 +++++++++++++++ +riley01 +bassist1 +dakota08 +reflection +3500sucks +operator1 +bluedevil1 +tktyf +050983 +02091980 +tekiero1 +jeanmarie +090683 +password72 +abbie123 +love79 +020882 +25051980 +060590 +jesus007 +harley1 +titi123 +hh123456 +stetson1 +burgundy +creative123 +gangsta14 +apokalipsa +faiths +claudia +hoover6 +greenbean1 +1realnigga +euro2012 +ghostface +0405 +malone1 +sharon01 +diva13 +valparaiso +cute1234 +25041993 +whopper1 +godislove +231195 +12031994 +magnat +07111984 +130380 +mustang87 +raven666 +050984 +24031981 +home11 +19851010 +420bud +19041992 +makeme +green20 +london13 +080492 +090485 +connor3 +hottie911 +pisang +princesa12 +cigar +gembird +07061989 +10141014 +brenda01 +franchesca +anu123 +18021994 +shadow92 +130493 +stanton1 +kool11 +nena15 +redeye1 +shepard +renee3 +newyork9 +da123456 +horsey1 +harlan +will1234 +abcdefg7 +direngrey +251177 +asdfghjklzxcvbnm +sexyme2 +cuba123 +tamuna +backspace2 +haleluya +katya1 +14061982 +carlo123 +11041994 +chopchop +19041993 +021280 +newspaper1 +21051983 +sexylady2 +macbeth1 +ilovejeff1 +mandy2 +eatme123 +biarritz +ronny1 +116688 +18011986 +lollipop7 +schule1 +08011987 +ostrich +abhilash +15071993 +girassol +280580 +25021982 +adeyinka +2223 +maquina +iloveanime +290481 +qaz123wsx456 +iloveyou1 +tyler04 +123123as +sektor +pascaline +johny1 +357 +shannon5 +love37 +natanata +8899 +03121984 +serial +watcher +adidas +14121994 +lalakers24 +shorty24 +jonathan6 +040286 +finland1 +william15 +ilovejustin +chanelle1 +muhamad +amanda99 +benjamin01 +ciccio1 +jason15 +cindy2 +fanta123 +trailer1 +strongman +talon +houston13 +echo123 +030286 +shilpi +newfie +casper10 +linares +15121512 +14071993 +061083 +23071983 +swords1 +shodan +cjkysirj +270494 +vfhnby +tennis22 +dustin01 +211277 +maint +291281 +sexisgood1 +allycat1 +roksana +newmoney +anna12345 +07101988 +wwwwww +julia11 +luntik +costel +5225 +thegame123 +3friends +081092 +honda94 +aaaa0000 +marcus5 +orlando7 +salesman +147258369q +iloveme14 +26021984 +qwerty27 +juicey1 +freedom22 +031083 +scorpio8 +puzzle1 +luckylady +kenton +mynumber1 +innocence +pimper1 +dancer07 +29121981 +dancer15 +dragon777 +280785 +stup1d +deer123 +nitin +021985 +21031994 +bonnie11 +arabian +interpol1 +aaaaaa7 +07051989 +horus +bayley +08071991 +booger! +230879 +apple101 +lklklk +iloveluke +eagleeye +antonio9 +19041983 +sulochana +160681 +max2008 +stephanie +amor1234 +london1 +asdasd +mantas +redred123 +ashton2 +101197 +130578 +122009 +adrian22 +ukflbfnjh12345 +golosa69 +070284 +elenberg +040480 +25051981 +cutie18 +rasmus1 +rahayu +gattone +jonathan22 +sophie07 +bear21 +jadejade +vineet +cavite +everafter +slawek +005500 +dragon90 +itsme2 +compras +pinky11 +30111984 +eduardo13 +08091984 +monaro +momoko +09011985 +anna1986 +qazwsx +chocolate1 +christos +pot +savannah7 +180492 +slideshow +753dfx +021987 +fuckme7 +24011988 +were +dakota06 +110895 +douglas +cloudstrife +evicka +valladolid +file +31081984 +we +yahoo23 +austria1 +08041992 +centauro +stink1 +210194 +260481 +lollol11 +naz123 +11081993 +sommer +531531 +isabel +get2work +jose20 +181987 +turtle69 +pepsi101 +051181 +250394 +billys +solsol +fallen2 +friends14 +squire +831011 +hotstuff! +28zxrpvnfa +240391 +killer19 +camel123 +mujahid +140193 +vanity1 +ice-cream +julio13 +opera1 +19121994 +210495 +30111991 +steven8 +031082 +lisa22 +10061982 +30011983 +bul +159987 +shit666 +53535353 +11041104 +jesuslove1 +corpse +pa22word +:tytxrf +11111993 +221278 +majesty1 +198628 +formel1 +orbit +travis! +mati +fuck00 +dante666 +tickle1 +ilovelisa +irving1 +091183 +nigga. +richard69 +abdelkader +03061983 +nikusha +sec +060587 +tink22 +191281 +tacotaco +031280 +boarder1 +22031994 +supermann +220678 +200600 +aerospace +aissatou +fratello +popapopa +mortal1 +hilda1 +mylink +abc124 +400028 +chris28 +ewelina1 +topmodel +198716 +06031984 +dumbass! +17021994 +abcdefghijkl +xiaolong +farts +stress1 +loveyou14 +thomas77 +1freak +14091993 +060191 +sandor +saratoga1 +ryan99 +alberto12 +199700 +#1babygirl +thestrokes +pomona909 +aj123456 +scorpio13 +gethigh +su224466 +1806 +us7860loans +bently1 +hippy1 +kubota +060986 +faggot. +food11 +gentry +#1player +miketyson +rajaram +130594 +tippmann +tommygun +manish123 +tigger27 +witches +beast23 +123456s +12051995 +ozzy12 +noriko +dudette +shante +kamkam +babygril1 +investor +fifa06 +hunting2 +mexico +291080 +nirvana. +walter34 +21081983 +racers +tweety24 +24111982 +050682 +boss429 +torque +jessica0 +2flowers +080882 +caca11 +twins12 +070388 +yessenia +pink02 +24031983 +30121983 +rangers2 +jazzy15 +jaeger +neverguess +190782 +070587 +danny4 +minnie +pantyhose1 +25061983 +doroga +bubbles1 +schooner +skate1234 +wipeout +111093 +tamayo +brandi2 +ratbag +coolwater +chris4ever +050286 +aceace1 +190183 +caroline +11eleven +jack14 +sum41 +penguin13 +rice +04061989 +1580 +forever6 +adam10 +novasenha +420666 +06101992 +lgkp500 +a147852 +arthur12 +20032004 +16011984 +orville +david26 +30051983 +160581 +sasha_007 +fucku23 +saranghe +pimpin420 +olugbenga +753951a +buckingham +2603 +silvermoon +jessie22 +klop +tranmere +110087 +janell +grillz1 +alvina +211093 +wayne23 +30101980 +bayonne +091084 +asdfghjkl +familyof6 +heather23 +221193 +saqartvelo +v647947 +27111992 +oceanside +080386 +260192 +armagedon1 +danielle +snakeman +13021982 +kenny7 +izzy12 +shuffle1 +master2006 +1arsenal +22121980 +grandprix1 +cosette +vista1 +031292 +gulshan +456456a +chang +teste +summer55 +cleveland2 +dfkmrbhbz +darkblue +back +second2 +blackwhite +zoubida +shiznit1 +090993 +lover4life +vik +buckmaster +honor1 +270882 +pops +sana +dima1990 +faith22 +jojo07 +palito +14071983 +kenyatta +hitech +armaan +uzumaki1 +gallardo1 +latinking1 +nikprommet +kibbles1 +michael101 +crispin +020581 +denver303 +asdfghjkl4 +070591 +17101994 +adrian5 +lingerie +delia1 +kayla23 +jump123 +cnthdjxrf +vascodagama +buburuza +150183 +monica69 +jandi +darkone +vfr750 +iloveyou96 +timothy12 +aidan123 +10091993 +81726354 +123poop +02021977 +9696 +kekeke +matematicas +fallen12 +myspace78 +tr1n1ty +bigboy01 +fresas +euro2008 +15011982 +rabbit69 +203203 +15421542 +multan +luna11 +060491 +26041984 +05011985 +tweeling +12021994 +cupid1 +nash +171991 +edward1901 +07041991 +florecita +193728 +ilovemen +sickboy +scratchy +nasty123 +04021989 +glock9 +06061982 +300792 +08121990 +munch1 +333555777 +071182 +31051983 +bean123 +calling +15041982 +080308 +13651365 +america4 +doubled1 +26011984 +060190 +474849 +abiodun1 +05071992 +q12345q +august88 +happy15 +hello44 +2808 +neogeo +120993 +poopoopoo +shower1 +butts +ninjasaga +06031991 +16101983 +geneve +tylerjames +shadrach +26051983 +lovely24 +sarah6 +01081982 +zxcvbnm1234567 +graceland1 +lebedev +05081983 +snooks +kangta +macdre +courtney10 +198509 +maneater +tomodachi +13121993 +bleeding +moritz +cherry9 +twist +venom123 +steve69 +salome1 +123angel +inlove08 +pheobe +emo1234 +25121981 +supercat +munchy +416416 +tunde12345 +020393 +laguna2 +030683 +13071982 +290382 +grandma6 +mossimo +180183 +198609 +140593 +sabino +speedster +gumption +hemicuda +citizen1 +kurapika +qwe123456789 +bloodmoney +kiana +linda01 +1234589 +19011984 +gardner1 +6dnwch275049 +charisma1 +130793 +aqwaqw +211278 +15241524 +think123 +170184 +loveing +beyonce123 +giant +248655 +29061992 +numerouno +fable2 +honda100 +youngman +weg63tt243 +elvis12 +180579 +west1234 +toulon +tosser +shithole +whitesnake +viktoria +breezer +tomiwa +lorena123 +superstar4 +030187 +animals123 +110478 +zaq123edc +13121994 +07031988 +gkfytnf +tucker22 +120177 +jacob23 +061085 +gopinath +blessing12 +011083 +angel4life +24081985 +splintercell +cassia +hershey +karina2 +transalp +tony24 +tigger1234 +yfcnfcmz +krystle1 +bambam3 +config +220280 +jordan27 +ani123 +010284 +mascha +12332145 +05121983 +correo +thuglife7 +amorosa +lulu13 +killer33 +01111985 +100777 +david2008 +246812 +indeed +iamalone +lollies1 +controle +bonobo +050184 +sixflags +racine +canada +199413 +anthony27 +86868686 +28021995 +301194 +rollin20 +cutie45 +harry6 +dominik123 +candygurl1 +jesus4u +11031981 +akshaya +motoguzzi +potatoe1 +success12 +quack1 +231077 +happy25 +04121988 +modernwarf +bossbitch1 +96385274 +210393 +patrick69 +jovita +sketch +buddy +ishita +070586 +dabaddest1 +heather16 +010983 +boggie +mrniceguy +coco21 +twins02 +pumas123 +kenguru +01111991 +040187 +sumathi +befree +tea +lonelygirl +scholar +kaushal +aztec1 +951753a +270981 +mama15 +evamaria +farley1 +bootie1 +carmen11 +schiller +19041994 +23121981 +torsten +harshit +mysore +04111987 +02081980 +spectra +miguel7 +jason8 +12345tt +baybee +shakeel +eldorado1 +money666 +4568520 +140793 +my4sons +dominic3 +waheed +elephant3 +sabrina11 +wanshuai198202 +03091992 +lola22 +mika123 +gabby11 +tommygirl +chrome1 +venecia +041284 +07101989 +rowland +crafty1 +03121992 +12345688 +20111982 +102000 +carver1 +jennifer20 +20091993 +qpalzm1 +batman07 +devonte +300984 +alright1 +yankee12 +face123 +vimala +august05 +icebaby +ubvyfpbz +longisland +21061982 +bautista1 +disaster1 +04081991 +290681 +jack03 +jayjay3 +1927 +jackdog1 +310580 +misiu +happy2010 +peace09 +asdfasdf123 +010491 +dontcare1 +flopsy +stonewall1 +16101993 +27041983 +honda06 +23031981 +2804 +wentworth1 +tombrady +hugo12 +hobo +complete1 +feathers1 +310595 +130280 +stoopid +lilmike +lover17 +cygnus +edward15 +1qaz2ws +pa33word +crystal! +120202 +kel +joey101 +orange17 +pioneers +dortmund1 +warrior123 +emma08 +drama101 +fucklove3 +boyfriend2 +09071984 +impulse1 +carlos9 +maxi123 +london23 +06011991 +030481 +30041983 +051081 +aaliyah123 +iamwhatiam +looploop +210395 +la1234 +070387 +jochen +slipknot0 +1234rt +230894 +scamp1 +puppy13 +kikka +170480 +22091993 +jesusgod +lauren07 +101977 +12101980 +bendover +pikachu12 +amelie1 +jaimito +josh19 +bijou +katara +human +southside7 +stupid13 +11291129 +04101992 +fede +lovekills +miroku +1courtney +20112012 +alskeo +breanne1 +noemi1 +alicia11 +07121988 +ecapsym1 +asmita +midnight1 +500013 +230594 +11051981 +198604 +23061983 +mickie1 +summer01 +bettie +040582 +benelli +andrzej1 +maxdog1 +05011984 +purple06 +samsung10 +iloveamber +280784 +ryu750103 +1united +8765432 +patrick17 +hfpdjl +2904 +071092 +joseph24 +120708 +fucker666 +renee13 +sandstorm +sayang88 +bhakti +28041993 +gitarre +may1995 +19081993 +libido +251293 +0811 +basic1 +201178 +illidan +64646464 +miaumiau +tekken6 +04111986 +191092 +fizzle +lasalle1 +jazz1234 +maikel +08091983 +06081992 +wiktoria1 +123qwerty123 +197712 +19091993 +15051980 +blue100 +jojo99 +041087 +jenson +021181 +060192 +franklin2 +198703 +g76t94prm4 +25051994 +bella15 +199812 +perugia +050982 +diosmeama +hermie +chris2008 +diamond07 +rudy12 +22tt22 +19421942 +doggy69 +08101988 +quarter +vaz2101 +sid +mar +rembrandt +destiny1 +breaking +gbljhfc +161079 +dance4ever +hollywood +1daisy +juan15 +pink90 +hbw +211279 +redskins89 +09101988 +21032103 +wine +04121989 +industry +courtney5 +skater21 +180181 +1907fb +030188 +hello17 +cuenca +gtagta +28111984 +ecology +hockey08 +jackie! +devil69 +sensual +lovelife! +080879 +061082 +omarion2 +198825 +qwertyy +luvluv +makena +playa2 +muhkuh +13091993 +198823 +lorin +tarantul +hor +3011 +11071993 +mol +fatcat2 +renoir +thunder8 +bryce123 +280481 +eminem01 +shroom +charlies +22071982 +power10 +030693 +sasha1993 +iloveboobi +texas09 +laurinha +aaliyah7 +nicole97 +nirvana94 +110053 +harley6 +boogie12 +191282 +brigitte1 +6262 +07101983 +1maria +family21 +198028 +mardan +flower1234 +werder1 +160981 +mogul +140184 +09081992 +160047 +wal-mart +25111980 +06111986 +thomas03 +timeline +030783 +narasimha +121997 +maria24 +debbie01 +ashley92 +210678 +swedru +pierino +220694 +dusty2 +playa12 +rudolph1 +gardens +violon +pasaway1 +specialist +real12 +piggys +ktyf +leonessa +aaron23 +123456852 +mother. +froggy69 +mecanica +girl10 +godloveme +ilovesara1 +pumpkin5 +shawty10 +ashley87 +weird +130779 +16021993 +03051983 +katja +fishing +polikloh00000 +1husband +diegos +240783 +hottstuff1 +anna1989 +valhalla1 +jayden03 +rfn. +vonnie +www777 +070986 +bandit1200 +dummy123 +13101981 +alyssa22 +100779 +311081 +120496 +slunce +2121212121 +aaron21 +060792 +ballin14 +12031982 +purnima +holy +breana +bananas12 +sembilan +ginny +jack15 +dreams123 +150879 +emma10 +ashton12 +winner01 +dauren +jackson09 +ruby11 +1qazqaz +ou8125150 +02121983 +chloe13 +13221322 +jakub1 +azerty31 +081290 +smile10 +0103 +ghbdtn12 +122448 +jack06 +myspace420 +operations +chivas99 +06051990 +nicole30 +198709 +smoochie +230579 +coolio2 +maria69 +corpus +241984 +diva01 +michel +greenlight +qwertyuiop123456789 +28041985 +08031984 +stepup2 +24111981 +14031972 +brianna6 +1silver +justdance +frog1234 +151093 +apples7 +cunt666 +kol +fagget +ilovehim4 +sevendust +sammy15 +noregrets +zamira +candy08 +denisdenis +9yqss2h9ub +melody123 +charlize +slipknot +01071980 +18071983 +rosella +oksanka +2boys1girl +pluto123 +2pac4ever +mambo +banana +150991 +caonima123 +cronin +redblue1 +chileno +1chrisbrow +diego2 +lyrical1 +nokia6700 +verdes +05031984 +01021995 +bipolar1 +30081983 +20061981 +kanyewest1 +aida +freedom06 +arnel +2236 +29121993 +monika12 +matrix7 +04041980 +100593 +flyfishing +ferrari430 +dinero1 +america14 +ashtray1 +centro +08101985 +rintintin +198999 +writing +09071985 +barbie101 +040680 +n0vember +b1x7qn2tug +rocker2 +stephie1 +090389 +21222324 +born2run +tony07 +qaz2wsx +babygirl34 +29051993 +fuckit3 +16121994 +iluvher1 +251178 +colorguard +calinou +25172517 +24051983 +citation +444444a +victor22 +soulman +abeille +raymond12 +stussy +230793 +dubai123 +infected +twilight21 +simpsons +87654321q. +190292 +broodwar +09031990 +cleocleo +me123 +smile. +cobra2 +05071982 +270593 +07091984 +23111993 +030581 +handball +playboy101 +funky123 +crystal21 +imation1 +200494 +281181 +05051978 +dreamteam1 +meiyoumima +bobthebuilder +09051991 +lindros +honda21 +121207 +181990 +18111993 +19051981 +190289 +150493 +18041982 +121196 +juno +guapo +yamaha +ireland1 +halloween3 +sinterklaas +smiley01 +30061981 +jayjay7 +xena +motmot +manu1234 +09101984 +code123 +pheasant +abdoul +12111993 +september11 +brewers +london5 +angela3 +stevevai +2234562 +warehouse1 +hiya +laser123 +ama123 +babyface2 +jordan26 +010282 +vfrfhjd +sarah4 +hotdog! +bubba14 +101000 +jennylyn +09061991 +1917 +mariette +21111992 +women1 +mozart +05031986 +buddy123 +88mustang +197919 +050487 +19833891 +pretty16 +princess101 +plasma1 +nascar14 +02468 +spike01 +lisalisa1 +marti +marina01 +italy123 +boston01 +johncena3 +butkus +199410 +l0nd0n +cooley +456rty +franta +agent007 +newyork08 +gfgf +bandit5 +katrine +11101982 +595490067ua1 +pipeline1 +geniusnet +gator123 +starscream +sasquatch1 +chilidog +2806 +nigger666 +cyjdsvujljv +300693 +assa +nyquist +timoxa +dodge01 +treacle1 +tennis! +antiflag +160993 +exploited +gbljhfcs +buffet +ranking21 +steele1 +nabeel +envision1 +pantalon +pferde +122133 +honeybaby +brooklyn23 +starwars4 +martijn +cody15 +2704 +180384 +sammer +herobrine +only4you +411052 +kettle +francky +as123456789 +200677 +100594 +simbas +carly123 +199215 +arsenal9 +gfnhbr +mikee +railway +181991 +joey10 +sonu123 +deathangel +23242324 +14101981 +bantam +170680 +110378 +kennedy2 +16081992 +nokia +jessie21 +maegan +slankers +03021991 +600091 +560005 +penis3 +vianney +15011993 +0321 +1357910 +masterone +060187 +halo03 +241177 +asdqwezxc +196868 +pirates2 +sexxy6 +06011990 +250779 +leonardo +riptide +230693 +sexy2010 +17051982 +petrik +blonda +godlike1 +171985 +w45bj9upkz +may2009 +lolalola1 +asshole666 +wyvern +chopsuey +kiffen +love001 +ilovekim1 +pakistan123 +37gudoplfs45 +retard2 +search123 +maxwell3 +12332 +vedant +vince123 +04091992 +ilovebeer +newcar +10031980 +tight1 +liberty7 +060292 +30031982 +gangsta69 +martha +graywolf +ballin15 +23051994 +26101982 +adriana2 +playboys +020682 +20012002 +wobuzhidao +280392 +030983 +pinoy +1234789 +cajun1 +lilsis +salgado +170381 +181988 +22061981 +kelly22 +270180 +051282 +batman17 +richard23 +buster101 +playas +11021981 +nitrogen +101976 +heavens +lh6rjx44qb +1580welcamino +mnbvc +honda07 +lacrosse22 +theman11 +baby002 +vovan +yoyoyo12 +duster1 +burton13 +michelle06 +14121981 +mamichula1 +trace1 +boozer1 +yeehaw +biteme01 +115511 +borussia +bacardi151 +10051994 +baldur +310782 +19051980 +kieron +sexygurl12 +pookie! +chupachups +danielle15 +squirtle +condor1 +lovinlife +bandera +291192 +brick +rhbcnbyf +kimball +17021993 +198119 +260880 +scooby23 +26111983 +super4 +porky +honey18 +holstein +р»сћр±рѕрісњ +221983 +mathematic +john20 +johncena9 +davidlee +strangle +oladapo +sunny11 +steelers08 +cheyenne3 +storage +faker +babyjay1 +dinamit +170291 +julian10 +abcabc123 +slut101 +963147 +trixie +christine7 +29091983 +kitty07 +17081983 +sicily +chocha +mustanggt1 +110978 +mirasol +nina01 +wallis +princess31 +www.com +03051982 +05041983 +goethe +custer +robert0 +faith09 +pandemonium +gembel +pinto1 +basket123 +fire69 +peter01 +galaktika +canuck +kawasaki12 +123456286 +hondacr250 +05101992 +crunchy +18111984 +070984 +qebefcz3yx +sheryl1 +single22 +saiful +britt13 +190884 +stayfly1 +asdzxc12 +220281 +suesue +198407 +nurse123 +star66 +fade2black +12345678qw +01121983 +janaina +broken13 +oblivion +ilovehim11 +110037 +minstrel +mineral +run4life +waterfalls +password76 +madhatter1 +walter2 +27011993 +1122334455667788 +resource +zachary01 +benjamin11 +102030405060708090 +love81 +romantico +handy1 +081183 +austine +kairos +11051979 +braydon1 +buttons +olushola +dickie1 +160182 +vampyre +yahoo9 +piolin1 +221010 +squeaker +str8edge +ronald123 +emocore +kingtut1 +warzone +senior11 +070884 +1192 +vball12 +whatsup2 +28031983 +2288 +170880 +peaches13 +700016 +aa123321 +monica3 +techdeck1 +190184 +damsel +nemtudom +chicken1 +03111983 +jennings1 +04031993 +gotham +regina123 +stavros +12991299 +adam69 +filipino1 +jeepcj7 +consult +080987 +lalala99 +3101 +marina2 +wkgmkjh623 +vaz21093 +040692 +shereen +tmobile +lollipop123 +010907 +jordana +victoria8 +alex86 +woaiwoziji +bobby18 +iglesias +minute +13111982 +funeral1 +freedom21 +joseph17 +31051994 +portis26 +polisi +231294 +226226 +290583 +200281 +beef +mana +kevin06 +amalia1 +shangrila +bigpapi34 +22091994 +casey01 +06041984 +031281 +20031982 +hunter. +doomed +kaykay2 +nightrider +aw96b6 +kisha1 +ame +borisova +1gateway +26061980 +f76t93nqk3 +mexico6 +antonella1 +graceful +beretta1 +angela10 +matysek +networks +barrister +061092 +youare +121076 +lakeshore +03071983 +barbie23 +150180 +ganapathy +rfnz123 +coupon1 +pedrosa +rusty01 +hamid +kiska123 +poiupoiu +buzzbuzz +198617 +king05 +195555 +080288 +16061993 +19091982 +060883 +03121989 +cold +hearts3 +t666666 +kimberly +poseidon1 +14121980 +symbol +ballers +12051980 +lollol2 +chapin +09021985 +fuck18 +burberry1 +ceaser1 +bob666 +147001 +123321asd +maeteamo +081284 +110076 +connexion +convict1 +lemondrop +010581 +steinbock +08061985 +pretty22 +20121980 +sh123456 +allison +271281 +28071992 +spank +20041980 +hangman +12171217 +marianela +010682 +d11111 +10121979 +125634 +sammy16 +bill1234 +people4 +16101982 +180192 +drumer +040881 +bite +doctorwho1 +saidov12345 +5555551 +monica22 +100477 +thisismine +zigazaga +17021983 +logan7 +mexico19 +malini +200481 +161193 +wangyang +09091993 +pepper88 +creampie +juan01 +snowman123 +dove +ablegod +sugar5 +0205 +weddings +29071983 +aria +tiger25 +oreoluwa +balrog +rutherford +08121985 +rockies1 +edwige +pucca +hopehope +24061993 +scooby21 +rebecca11 +31031993 +500035 +sweets123 +311293 +10071980 +please! +jesus69 +you&me +yogyakarta +joanna123 +wonderwoma +03021982 +matthew25 +teddybear5 +gayness1 +starboy +shortstop1 +sweet +31011983 +lifeislife +laddie1 +gemini7 +ghjcnjrdfibyj +xt: +doodle2 +amor14 +stryker1 +08061991 +101974 +theodor +june1988 +20041994 +10121996 +060385 +05041992 +198404 +141293 +liaisons +04091985 +nana15 +180581 +approved +17091983 +pindakaas +05091983 +25061993 +alohamora +homebase +michael29 +anewlife +196300 +lover07 +09011989 +bonfire +198808 +stanislas +lovee +240780 +momma3 +tom1234 +stephanie5 +devotion +lokomotiva +sonrisa +warner1 +tonton1 +ataman +dimas +puppy6 +1478965 +clooney +1snowball +sallydog +poohbear09 +sceptre +03081983 +ilovedance +522522 +nooneknows +gloria12 +megaman123 +22091982 +pascal +dead12 +121412 +29101993 +dollarking5 +master14 +auguste +1314159 +edu +south123 +dignity +04011992 +250893 +kunkle70 +260780 +dixie01 +rangers12 +sisters4 +bebe10 +garena +pippa1 +trixie123 +lar +09091981 +savatage +abhilasha +nokia1234 +290792 +31051993 +hanter +rosiedog +sexyness +snowbunny +razorback1 +04051981 +bree06 +261986 +03011984 +joselin +530530 +nikiniki +gingerbread +robot123 +fleetwood1 +answer3 +nani17 +drummer123 +kingfish11 +shithead! +maritime +fordman1 +harry +blackgirl1 +sweetheart1 +ahmedabad +06041992 +190682 +chance13 +987654321b +yondaime +p@ssword1 +praxis +convict +edward69 +morgan15 +dillon12 +puddle +anna1984 +garrett +janjan1 +badboy +ashlie1 +monkey91 +cardinals2 +grandkids2 +mets86 +081285 +bloom1 +dillon123 +sweetpea3 +31123112 +dragon86 +poohbear16 +09041989 +baby34 +120196 +patrick. +cabrera1 +gingging +amidala +050579 +silver88 +110677 +12345rewq +01121984 +chika +keluarga +romantik +gonefishing +oasis123 +neruda +201307 +hurricane2 +198126 +alex +time4me +210282 +tink23 +caleb12 +160980 +28111983 +sextoy +betrayed +061091 +jessie +09071992 +777aaa +booboo8 +200777 + +heather +llama123 +02021976 +utahjazz +sdfghj +applejack +andros +holidays1 +fffff1 +azerty0 +250575 +skye +melville +bunny101 +sex4life +toenail +antonio21 +blooming +trinity06 +197999 +180381 +17061984 +148148 +010380 +firefire1 +spinach +pedagogia +harley8 +14101980 +pumpkins1 +199213 +11031980 +godspeed1 +mamere +02111986 +deerhunt1 +cantona1 +1texas +coolman2 +danielle1 +disney +sexymamma1 +nightfall +197312 +021081 +beast2 +nargiza +290883 +faraway +161180 +love47 +domino12 +h0ckey +yummy2 +gordo13 +razor123 +271178 +ishola +naruto89 +dreamer123 +666444 +120178 +gangster3 +11091982 +league +250577 +maria4 +toyota01 +jordan2323 +july2008 +kevin9 +30011984 +bambi123 +04081983 +smoker420 +doodle12 +hateme2 +fhifdby +mangalore +maddie +easyspiro +123434 +anika +james89 +jazz11 +221195 +love46 +macleod +samuel3 +linkmein +lala15 +smartie1 +louise22 +stanley +travis7 +03121983 +010880 +jerome2 +1penny +single23 +galloway +310581 +reyhan +280491 +14061993 +honeylove +kari +13601360 +sakura2 +kocham1 +kasparov +270291 +jones2 +glider +280193 +081291 +120778 +3001 +isuck1 +141278 +080289 +21071993 +practice +vita +nevaeh2 +pescara +plastics +17121980 +mikela +blue03 +23041996 +messier11 +materazzi +sunshine27 +connor07 +pilou +milaya +metallica +23041980 +071986 +partizan1 +sublime2 +tony09 +financial +african1 +220495 +050488 +060387 +emma06 +01021994 +mikasa +golfer01 +bullshit12 +baldrick +19061993 +robbins +kingdomhea +harry3 +thunders +mexicali +jonas2 +8787 +198201 +ivory1 +cronic1 +enfield +manali +ledesma +brad12 +259421 +calavera +rebecca01 +manwhore1 +p@55w0rd +gingersnap +elnegro +200578 +riorio +rockbottom +monette +lemonhead1 +assaassa +qavcx411 +14061995 +natalia2 +february19 +oneblood +outlawz1 +boston23 +230979 +dayday12 +270492 +270692 +197346825 +tink15 +nana09 +sports7 +shantanu +131277 +vfvihss591 +killer95 +summer78 +170681 +jojo69 +120277 +animation1 +qwerty123456 +030185 +gina12 +2703 +17101981 +iloveash1 +katalin +gasper +seesaw +29041994 +thesexy1 +paintball7 +elsie +eagle7 +il0veme +relentless +beaubeau +kreator +seniors +linda13 +636322 +june1990 +ufkfrnbrf +sasikala +251095 +ghfplybr +delta9 +daidai +mayflower1 +absolut1 +evgeny +onfire +040183 +tatum1 +white12 +cassandre +parents1 +28091993 +somerset1 +1122qqww +spam123 +1010220 +rjyjgkz +hunter33 +israel123 +linked11 +chapel +sansone +gr +sugar7 +rocafella +210694 +peugeot306 +13201320 +08121988 +30091983 +momma123 +tiffany1 +11111d +baller09 +patrick16 +swanson +sharon2 +12343412 +dardar +061292 +198409 +fridge +chelsea69 +angel85 +natalka1 +hartman +16021983 +tyler17 +flame123 +thurston +may1987 +woodson +andrea08 +03111989 +14071981 +050681 +ellen123 +pepper09 +templar1 +muhamed +230779 +dolfin +29091993 +seawolf +may1989 +nikki09 +chomper +aeiouy +easy12 +murthy +samuel22 +locked1 +01111989 +problem1 +cameron +dalton12 +riddler +jane12 +sdf +10071982 +aaron15 +23031994 +020483 +qazwsx741 +281081 +olympia1 +nana08 +mahalaxmi +chicka +coca +windows12 +hatchet +pizza23 +030784 +14011983 +tweeter +11021980 +faith4 +surprise1 +swing +171279 +kickass2 +honda450r +beto +pak123 +hussain1 +claire12 +highway61 +muscat +dolphin4 +natalie13 +198302 +itunes1 +quilts +100778 +1angela +mb1234 +andrew33 +seanpaul1 +dakota05 +16091989 +fast123 +kiki23 +privado +31121993 +130993 +savina +02121980 +cubano1 +spot123 +sabine +kalhonaho +1corvette +happyme1 +pegase +whatever0 +orione +vol +28081983 +198726 +pilots +nanayaw +steven08 +eric69 +11111m +singsing +sanmartin +nokia11 +termite1 +joemar +bitchplease +weed23 +buttman +apple25 +smiley11 +harley23 +tiffany21 +041987 +blue72 +100300 +thuglife13 +21021994 +070686 +backoff +bisola +powerrangers +omotola +090885 +dragon91 +050709 +198901 +thewho1 +17071993 +09081987 +cobalt1 +negra +suns13 +djkrjlfd +bariloche +jeepers1 +140579 +tissue +fender11 +spiderman12 +hannah24 +04061981 +123456ww +vfnhtirf +blackwell +looper +pollita +squid1 +already1 +bellota +challenge1 +analuiza +staff123 +121206 +faulkner +gears1 +milk12 +polosport +skate22 +delta5 +tattoos1 +sexygirl3 +cartoons1 +mike143 +kurama1 +oioioi0 +199210 +24021984 +booman +seabee +0220 +nestle1 +bigal1 +tuxedo1 +speckles +24111983 +morningstar +aaron14 +hounddog1 +folder +bobina +broncos2 +wwjd +elpapi +adidas22 +chu +camille +lle1234 +ijfrnhf7yhcy54bhy0cd +sandiego61 +twentytwo +july03 +rfkmrekznjh +shutdown +modest +kuba12 +killer20 +iloveu08 +swastika +11071981 +nicholas22 +monkey67 +11061982 +irocz28 +paranormal +payaso1 +bluegreen1 +heydude1 +booper +240993 +nano +babyboy9 +aaaaaaaaaaaaaaa +23021982 +colores +addiction +engel1 +manu12 +hans123 +270779 +millers +23101982 +150994 +170581 +240382 +cthlwt +sarah18 +monkey29 +owen123 +number1fan +mau +16071983 +mango12 +07121983 +smilesmile +frannie +24081993 +030186 +141989 +56chevy +sometimes1 +king18 +onelife +241985 +johngalt +jennifer15 +05091992 +dakota! +afireinside +fucking2 +23031982 +07111986 +260293 +1807 +nivedita +dagreat1 +montana12 +rosedale +demon2 +mexican3 +yazmin1 +sandy3 +ilovedick +100278 +james26 +cool45 +adamson +herbal +dominos +withgod +magician1 +ryan2008 +bill89 +aaliyah12 +sloppy +chester +flutterby +linda10 +barron1 +stevo1 +150379 +231989 +superstar6 +pookie22 +banker1 +122007 +angels27 +cntgfirf +100378 +jolanta +reset +d654321 +myspace? +rachel5 +tosin1 +10102000 +gayassfagpastebinleaks +mostar +cfvehfq +12071207 +yeahbaby1 +123poi +chris95 +asher1 +shubhangi +240281 +qazwsxqazwsx +chris +01041981 +dezember +1qa1qa +omega2 +rac +schalke +nigga14 +harley14 +cocoa2 +200182 +alyssa03 +25091983 +sveta1 +07011985 +090692 +crip +jobs123 +03091989 +181094 +lily1234 +190580 +d-block +uthvfy +13101995 +220181 +redeemed1 +120476 +06021985 +willian +jude +ybrbnbyf +quepasa +falcon2 +cutie24 +010693 +daniel90 +121209 +puebla +zephyr1 +210696 +dtlmvf +justin26 +cris12 +03091983 +afterlife +michaela +266469 +johnny99 +elvina +yummy! +fatcat123 +06061981 +salsero +eagles! +xthtgfirf +property1 +kitty09 +222333444 +katie6 +chevy08 +22051980 +04071982 +100979 +w1956a +honda08 +anu +malakai +abpbrf +0809 +yankee23 +19051982 +18031983 +tiger18 +1177 +22041981 +15031995 +kacperek +070285 +ronin +16121993 +monica7 +juice123 +kaboom1 +jameel +cute101 +141985 +barbara +99mustang +submission +17081986 +210879 +thomas33 +darren123 +angel2005 +pink12345 +395009 +290791 +links234 +jujubee +sara22 +300791 +egoist +dodo12 +08081994 +cinema1 +winter77 +billgeitslox +pic +maggiemae1 +cookies13 +hindustani +140140 +assistant +literatura +avengedsev +tt1234 +99bottles +07031984 +evertonfc1 +october +abbigail +kevin8 +soviet +030582 +jihoo +gibsonsg1 +12031995 +tata1234 +minnie13 +270581 +25111982 +251277 +mimi10 +bibby10 +14071982 +121972 +nigger6 +09011988 +260494 +pod-fif +wrxsti +needle +220695 +matches +hunter1 +dragoste123 +sunshine00 +love75 +380054 +05111990 +warcraft +230279 +bandana +ferdinand1 +kdwcnpa362 +031183 +20052007 +willow +fuckme5 +barbarella +hai123 +4242564 +maimuta +12345ty +061281 +29061983 +666222 +242628 +disney365 +abelardo +limited2 +maryjane12 +ryleigh1 +mercedes1 +ttttt1 +110023 +run +bicicletta +alyssa05 +myname12 +123489 +sara01 +081192 +wizard12 +emily15 +maryjane7 +dylan06 +070584 +hummer12 +pridurok +1941-1945 +14091983 +070983 +09021991 +malik12 +masmas +240283 +04071983 +mubarak +28091983 +bitchpleas +sabrina3 +kakashi123 +union +050292 +stacey123 +richard8 +170579 +fener +11041995 +bowie +m1ckey +008800 +sruthi +tutu +baywatch +punk4life +haveaniceday +160693 +bignose +1benjamin +andrew98 +hunter45 +240479 +08041991 +dances +awesome13 +donkey69 +peewee13 +admin123456 +chelsea16 +thirty +gun123 +booger3 +march09 +070490 +310394 +140279 +twins22 +23101995 +carlee +mickey9 +moondog1 +nicholas! +1tigers +0852 +20011995 +10081981 +chef +amor69 +145 +alpha06 +25012501 +19841020 +bailey02 +killme123 +iloveme21 +venom666 +aslan1 +finley1 +200379 +jose19 +lalo13 +eduardo +1twothree +jacob05 +superboy1 +.: +pimpin10 +200479 +orlando3 +wilson01 +docteur +sandie1 +nad +monoxide17 +090889 +14111992 +joshie1 +koikoi +whitewolf1 +garion +master17 +stoned420 +020187 +080685 +snoops +bugsbunny2 +manutd01 +010808 +23562356 +william17 +chippie +gracie07 +ljhjuf +daisy101 +babynames +appleton +yaseen +vanshika +pussy14 +jose69 +ranger22 +hello07 +kayode1 +jack05 +sexbomb1 +198518 +diana11 +keith12 +sandys +brandon20 +26031983 +therapist +bismillah +goldengirl +blahh1 +xfqybr +upgrade +3155530 +jacob8 +06121984 +bingo2 +sum +21011994 +020883 +040285 +05061993 +15081981 +allahswt +edgar12 +21041981 +01081981 +kissme22 +dylan14 +22091981 +123ewqasd +monstr +severino +maria08 +bitchface +qnxe66l7or +747400 +delete123 +castrol +pineapples +nicol3 +buffer +elmo14 +01121980 +nikki15 +reaction +thinkbig +060678 +wanita +benny2 +18121980 +290183 +110493 +02021978 +w12345678 +26081982 +heather8 +cyberonline +thisisit1 +taxi +whitney2 +301292 +040681 +0258 +041182 +gracee +bartek123 +cutiepie01 +castelo +180981 +lars +18051982 +2905 +iloverock +number25 +110877 +willie3 +tamara123 +fastcars1 +animator +pretty08 +130678 +bear14 +23051993 +stormie +789456123m +15091993 +john77 +maria8 +15031980 +password@1 +040185 +18011993 +naruto00 +526526 +vieira +16121980 +020481 +carter11 +swimming2 +angel001 +gotcha2 +gangster5 +30071984 +tonka +eusebio +lovelost +aryan +141279 +eric23 +300892 +rosarosa +10071981 +farting1 +452010 +tomasko +eagles24 +agamemnon +jhoncena +chris420 +leelee123 +fucku6 +12121996 +chrisi +vitor123 +16101981 +markymark +sexpot +ohio +27011983 +calvin2 +cooper24 +cookbook +230395 +fordmondeo +password111 +christina0 +butternut +pyramide +160793 +nick99 +pimppimp1 +kwiatek1 +maggie69 +seifer +rockstar9 +cbcntvf +samsung21 +thomas00 +10661066 +081292 +charlie0 +140980 +erlinda +brittany4 +bailee1 +montessori +alcala +god4me +hesloheslo +kinglove +michael87 +16081984 +tomoko +buster1 +forgotit +dragon93 +elektrik +cassidy2 +devin11 +arowana +060286 +macintosh1 +smokey4 +pumpkin13 +310182 +251078 +qwerty098 +granada1 +130879 +fatal1ty +bugsy +rockabilly +lilgirl +corazon12 +090491 +leeanne +lovecraft +0208 +eduardo2 +danzig1 +p7678287 +chiken1 +17011701 +777555666 +1й2ц3у4к5е +saravana +26041993 +1472 +08111987 +220477 +13041983 +start123 +swarna +tallinn +030682 +300880 +20071994 +18031984 +francis +samsonite +lilmomma +ranger69 +ace101 +spartan2 +chika1 +081084 +qaz111 +dudes1 +0408 +swordfish +809 +081184 +rod +dreamcatcher +rawr11 +081191 +sapana +nick24 +petruha +smulan +07121991 +011185 +karateka +080490 +13021993 +120376 +turkey123 +michele +23121994 +02121989 +moveme +04011986 +qazwsx123 +toulouse1 +johndeere2 +chen123 +040880 +creosote +jackson! +lucy10 +albion1 +27051983 +15101981 +gaara123 +popcorn13 +number69 +070779 +dima2000 +290284 +1234126 +050693 +greatone1 +greenday. +qazsedc +saputra +shikamaru1 +jimboy123 +bitter1 +0508 +040784 +shadow12 +09021986 +zaqwerty +muscles1 +amor11 +sumatra +140480 +3005 +booby1 +bajskorv1 +grandma +10101975 +jaspreet +cum +spongebob123 +789654321 +695847 +09021992 +assinantes +transform +piligrim +04031985 +jessica89 +08011992 +admin@123 +33223322 +smack +february2 +26021993 +061293 +130293 +figure8 +boricua2 +jamel1 +basketball11 +110377 +20121993 +paul13 +extra1 +100379 +09031986 +hfrtnf +00233 +pooper2 +fender +cfymrf +24051994 +freiheit89 +030287 +050880 +whatever23 +crabtree +boots2 +top123 +290993 +fab123 +chester! +magnum357 +mike05 +vaishu +ben1234 +senegal1 +08051984 +oscar1234 +babydoll13 +juggalette +bionic +190393 +deepspace9 +cuthbert +mee +199510 +oldham +0506 +butter4 +junior1234 +19231923 +29011989 +270892 +defense1 +cheesey +180982 +wang123456 +gnocca +kalash +01061981 +isaiah3 +zse4xdr5 +dad1234 +brianna9 +catracho +sexosexo +260379 +richard4 +david2010 +hollywood9 +bruno2 +www222 +fruitloops +brittany6 +010105 +shadow05 +steven6 +1qazxsw@ +270181 +100977 +gorges +matita +propaganda +circus1 +sean01 +mylove5 +northstar1 +slider1 +cesar12 +goober123 +boby +letlet +password50 +morgan05 +simpsons12 +chris00 +vince10 +antonio01 +10011994 +alteclansing +paulin +number1 +prostreet +hotmom1 +060682 +frolov +27121980 +jahjah1 +tucson1 +985632 +050679 +enterprise1 +ankit +eszter +chivas17 +petpet +eastcoast +brittany21 +160479 +211280 +reallove1 +ediz27v1kq +dominate +260193 +sweetlady +161078 +lamination +12261226 +huahua +microsoft +zaheer +schneider1 +lilromeo +ilovehim09 +solotu +casio1 +nguyen123 +charlie101 +eindhoven +qwertyuiopasdfg +211180 +mpower +040287 +pogoda +moomoo11 +ojitos +plop +23121980 +radha +247365 +9ac9hb7vvx +kelsey7 +danielle19 +fj5tx19hit +raven11 +jimmy23 +59fifty +oscarito +tigre1 +1church +falcon01 +abigail7 +681774 +dsk4r9bskh +21101982 +stormie1 +check +tweety17 +198727 +nextage +nagel +jeremy5 +righteous +marokko +bitches. +081185 +anna2009 +qwer0987 +password10 +120179 +chicken101 +stinky2 +030882 +12021996 +frankzappa +shadow27 +090484 +martin14 +09121983 +spring10 +211988 +mumdad1 +0lhhnw3v +haters12 +pakpak +batterie +tonto1 +sunshine06 +bike123 +snickers7 +24091993 +06011984 +idiot123 +89moocows +prada +vfiekmrf +12031980 +fhbirf +guruguru +deluge +acapulco1 +stern +akshat +hellodolly +qetuo +bnfkbz +andzia +1sarah +023023 +persija +blackfire +chicano +francesc +number32 +daddy15 +olayiwola +casper21 +111195 +famous23 +hatfield +090784 +mickymouse +samir1 +eitaeita +poppin +09051989 +hayward1 +barbra +syl +austin95 +060591 +undertaker +songoku1 +bliss1 ++ +helper1 +snakebite +220478 +algarve +37213721 +dell23 +fucku11 +hoodrat1 +101102 +r4evc8d8vs +newlove1 +080894 +freetime +121212qw +xsplit123 +smother +mario1234 +nichelle +botany +johnrey +perry123 +100295 +peterbuilt +senna1 +hawaii50 +toyota +181080 +flavor +alejandro9 +ctvtyjdf +myles +jackie69 +precious1 +30033003 +cameron05 +texas713 +newyork01 +mama2009 +2522 +pacheco1 +mybirthday +death7 +160580 +290780 +torrie +shopgirl +mustang90 +charlotte +powerstroke +windy +westgate +horses22 +150181 +teatime +vincenza +daniel94 +welcome9 +02101992 +02051981 +horny123 +bella17 +banan123 +billybob2 +31031984 +ssssss +pinky22 +310593 +04091984 +reliable +080586 +18081993 +08041989 +benhur +ball4life +161985 +guapo1 +jamesbond7 +soccer31 +ingres +honda92 +update +gracey1 +godgod1 +ilovecock1 +number19 +theboys2 +281278 +jacob21 +055001984 +vanquish +22111993 +0122 +198516 +kenshiro +24041994 +loveboat +princess* +210379 +monica23 +penis. +loveland +240293 +powerrange +vinograd +pearson1 +toyboy +linked4me +201077 +snowboarding +bhabykoh +omgwtfbbq +dudu +raja1234 +31415926535 +school22 +shaggy12 +sexie1 +stroke +19461946 +271179 +landon07 +babygurl20 +iluvme123 +sophia11 +hollywood! +sidonie +lanie +1juggalo +199800 +blender +030184 +nazarov +june2005 +kurwamac1 +sparky10 +il0vehim +sexy87 +torrie1 +karolek +gepard +150494 +daisyduke1 +gamegame +198456 +29051981 +shadow20 +looking2 +alkohol +14love +casey3 +400018 +methos +15091982 +07041984 +07071981 +chopper123 +sexylove2 +lipgloss12 +191984 +30111993 +esperanto +ville666 +blessed5 +moncheri +kjyljy +shivaji +011283 +070386 +senior05 +cuevas +789632147 +1mercedes +kumara +114411 +200382 +gummy1 +jazzy14 +12111980 +27091993 +vampire3 +blue30 +manfred1 +johncarlo +147895 +booboo09 +190892 +actros +we1234 +aston1 +marthe +paul69 +qwerty456 +141991 +sunny13 +lax123 +110195 +richard21 +apple12345 +11071994 +240181 +casillas1 +lauren69 +tiger16 +654321k +astronaut +113 +08011988 +250379 +pimppimp +loveheart +110779 +198614 +brian +pokemon123 +spider5 +honda23 +rjcnzy +eager +280581 +bodrum +196565 +nintendods +david33 +09051992 +alekseeva +reina +elijah06 +mothers1 +andrew77 +deere1 +hawthorne1 +rc95kzbj1v +19011983 +landscape1 +braindead +121098 +darien1 +maria25 +james123 +198415 +boulogne +saya123 +24101995 +chynna +nascar29 +lauren17 +tigers15 +winston12 +bhumika +bailey8 +crunchie +chris55 +pimp90 +durian +mandarine +shade1 +lantern +070391 +focused1 +patti +gfkmvf +070286 +diamond69 +071091 +wakefield +imgay69 +04101985 +volleyball1 +kitty17 +1adam12 +111294 +210978 +molly07 +281294 +forgetme +brian7 +shandy1 +13111983 +11223456 +22224444 +realnigga +fquekm +runescape123 +oliver4 +150280 +vanessa22 +nico12 +stepup +02111985 +znt,zk.,k. +021095 +198023 +easymoney +kookoo1 +131178 +alex1978 +portishead +whateva1 +wildone1 +brooke4 +1woman +fastrack +tur +b654321 +010580 +beth12 +240291 +gbolahan +kropka +ilovekayla +henley +sunshine0 +modesto209 +solita +ilove21 +crystal1 +schnulli +01041994 +justin27 +nikolai1 +mustang97 +198307 +dragonmaster +santo +kpkp1ee9w +basia1 +cornelia1 +coconut123 +love57 +frontier1 +040389 +aishah +haha13 +hell00 +kingdavid +farmers1 +lalala7 +dragon06 +ramses2 +111111r +seneca1 +verunka +123456789qqq +mets1986 +unlock1 +2n66xg2ziu +15021995 +thechamp +140693 +lazarus1 +30071989 +daniel87 +pendulum +lillo +oyekunle +elfenlied +babi +mishutka +13051994 +speedy13 +14051984 +snowsnow +marymary1 +moneytalks +styles1 +nicole98 +clarity +buster88 +bodyguard +yozgat66 +sweet08 +020482 +tommy6 +remix1 +arthas +suspects20 +sally2 +dbyjuhfl +jerseygirl +alterego1 +260980 +cutiepie7 +danielle16 +albert01 +mania +08101983 +31031983 +bros4life +030285 +010293 +scrubs1 +winter2011 +texas214 +a00000000 +jaimee +giants11 +asdfghjkl! +davido +kimberly3 +11081994 +defiance +mizio970 +wee123 +011191 +justin33 +whites +freddy13 +rdfhnbhfyy +anthony0 +krypton1 +anto +froggy7 +rubberducky +molko24bog +28071982 +genoa1893 +060485 +freddo +08101989 +clusters +newyorker +24041982 +boston33 +011292 +joey69 +husqvarna +mamabear1 +chevy12 +020894 +luchito +staind1 +jaylon +santarosa +phone2 +crazy18 +121270 +dana12 +01071981 +kev +spagetti +bella18 +118218 +honduras12 +hotty2 +02111992 +b55555 +krystyna +18021982 +198303 +precious +bigsis +luckystar1 +help1234 +purple00 +jujuju1 +babygirl30 +andy22 +16121981 +29041983 +tazzie +eu +vvvvv +kingme +alloallo +buster24 +magic101 +28121993 +131294 +brunswick +kelsey! +golf69 +aston +todd123 +shannon! +ville +partner1 +billy01 +mo1234 +ayesha1 +comcom +14081993 +raymond3 +tattoo13 +autumn01 +united01 +oliver21 +3215987 +globe1 +brian3 +nissan350 +aq123456 +blessed01 +01091993 +22011982 +23061994 +peace420 +dogs1234 +icecream4 +dil +janica +peterburg +040289 +21031995 +190500 +smukke +callie12 +bluebirds +dance08 +jonas! +290580 +22051993 +jose25 +london06 +09061989 +080691 +malgosia +1chicago +pinkerton +urmom2 +123iloveme +051280 +rangers +hayley123 +10111994 +wester +lombardi +theresia +eastside21 +married08 +mj123456 +lasers +3012 +darkfire +220677 +hungary +meemee1 +thuglife12 +obiwan1 +peanut9 +gladiador +snowboard2 +caillou +critters +souvenir +king33 +21021983 +jiejie +extensa +preschool +peruano +121211 +pa55wrd1 +design123 +adoption +phatty +17011993 +13621362 +13111981 +skanky1 +vbvbvb +030792 +cheese +sweethoney +frankie4 +181092 +alternativ +201295 +1rebecca +cookie77 +1house +fairies1 +cayang +100grand +motocross2 +peabody1 +123456789qwertyuio +bebe15 +lostsoul1 +death +olasunkanmi +091291 +040493 +toolman1 +jamie69 +skateboard1 +avadakedavra +26061982 +rainbow21 +l1o2v3e4 +pink26 +220494 +isabel2 +anemone +safeway1 +other1 +free23 +shrikant +112300 +25041980 +240694 +fourtwenty +platini +198817 +sagarika +green +adrian07 +190979 +spiderman1 +000000j +cojones +ford69 +lockhart +welcome99 +anthony26 +portillo +jarek +123wee +sandro1 +laura5 +daddy9 +landcruiser +virtual1 +21021993 +pirouette +p.i.m.p +chelsea25 +edmundo +090999 +pretty18 +jose123456 +aneczka +germany +christine +grunt +greatwhite +wachtwoord1 +081186 +berta +28011984 +260594 +mickey06 +parsley +iamcool123 +abby13 +17021995 +tubby +06041985 +ilovezach1 +streets1 +pickle3 +moonstar1 +10061981 +270781 +070291 +blackbox +blue +cuckoo +alfaromeo1 +sarah07 +dereck +negrito1 +zack1234 +100577 +parana +boss11 +09121984 +tigger55 +10021994 +040781 +011080 +17051994 +newhouse1 +sierra +080687 +09081991 +15051982 +500009 +cartouche +lthgfhjkm +onion1 +carthage +hana +17081982 +251983 +power1234 +steven09 +merry +lenard +jamesm +lyalya +waheguru1 +260881 +mike26 +britt2 +zachariah +stanly +mvick7 +scorpio +13021995 +rainbow10 +john25 +microbiology +220295 +115569 +bratz11 +chili +101998 +17101982 +hulkster +100494 +010393 +asdfgzxcvb +alison123 +ridebmx1 +dimond1 +1601 +crystal10 +31121981 +alexalex1 +spicy1 +may1991 +chase11 +090386 +211178 +boston22 +bench +19201920 +124001 +redrobin +23021995 +daniel93 +gigante +reverend +27101983 +lagoon +heehee +midnight! +skippy2 +yagmur +mantle7 +29101982 +161293 +111971 +090781 +italiano1 +sweet24 +270283 +197171 +adarsh +07011989 +bruninha +julias +261093 +asylum +laundry +sialkot +shade +francisca1 +summer25 +08121984 +fernando123 +28071993 +1london +enter2 +hugues +mibebe1 +slasher1 +070708 +ava +boomer7 +sportsman +moneymike1 +sexymomma +021193 +061181 +13461346 +08061983 +loveel +aaliyah22 +2doggies +devan1 +03111984 +lothlorien +linkedin22 +xinxin +jordan77 +20041981 +maxime1 +nogard +iloveyou90 +07011990 +198909 +010982 +1qazxsw@ +again +дмитрий +orpheus +231980 +240579 +alibek +jackson07 +barbie4 +chaucer +dreams2 +warszawa1 +09031983 +shingo +198416 +robbie +26121994 +dragon78 +310881 +240581 +chomper1 +080587 +fourkids4 +stephanie4 +yupyup1 +element! +lolade +575859 +bwfqjpf +encyclopedia +lucas13 +jacob1234 +08031993 +swagga +godtime +dodgers12 +290482 +hebrides +bob123456 +my6kids +putita +frankie5 +lovely15 +dilemma +curtis12 +16041982 +earnhardt8 +tot +maricela1 +261987 +trouble123 +star00 +198305 +maconha +valverde +sexo +hyphy101 +azizah +blader +06111987 +berlitz +mayara +jamesjames +mexico20 +sadiedog1 +everton1878 +150893 +steven07 +sabrina13 +mike34 +bebe23 +angela69 +chupacabra +emily8 +cute08 +jamaican1 +380007 +makulet +gearsofwar2 +080383 +888333 +donthate +azerty69 +brahma +lafamilia +290784 +lunetta +03101992 +angie13 +ladybug8 +catdog7 +070883 +eric14 +07101990 +bartsimpson +cuteako1 +twinky1 +mitchell12 +flower15 +merkur +honda90 +akoito +vfhufhbnrf +gothica +cre8tive +310382 +lolo11 +121271 +morgoth +vitalya +hollydog1 +friedrich +3sa8xk4xdz +28zxrpunfa +167167 +danijela +021065 +zayzay1 +iluvjesus1 +dance5678 +7676 +241988 +denise23 +pichon +cowboys69 +hagrid +columbo +29011982 +bugbug1 +1597534682 +oriane +arnaldo +bob420 +technics12 +boo1234 +dani13 +senior2011 +david27 +29011984 +250493 +fyfnjkmtdyf +wolf69 +carlos09 +dis +030881 +birds1 +valentina2 +dianochka +131094 +051180 +070482 +kolya +antonio. +09091980 +punks +0123123 +snow11 +milord +mama20 +chicana1 +killa6 +linkedin123 +09061983 +2608 +alex29 +missey +apples. +ilovehorses +sharpe +15111980 +050191 +getit1 +go1234 +arturito +diesel12 +antalya07 +09061985 +99999a +itiswell +081082 +photo123 +hajime +151293 +sugar13 +kokopelli +300993 +29121982 +24081982 +125000 +261278 +35793579 +blue82 +310780 +loca +archived +love52 +numark +joey21 +goodstuff +rowan1 +061080 +peterson28 +matthardy1 +198527 +sammy09 +061985 +051985 +chris111 +chelsea6 +080790 +maggie24 +uthvfybz +26081984 +rowell +dicksucker +12091981 +310381 +felix2 +flicker +290880 +volker +sully +213243 +jadzia +031081 +commodore1 +esther123 +123asd88 +montana7 +tenerife1 +1rachel +seaworld +1oliver +bigbro +yourm0m +megmeg +anderson2 +swordfish7 +jojo01 +100600 +101975 +oldskool1 +casandra1 +16031983 +010593 +fuckya1 +marie33 +honey09 +newhope1 +hermanos +258046 +batman007 +26031982 +shivangi +samantha18 +tink07 +miley2 +30081982 +driven +lucky20 +mercado1 +753951852456 +mallorca1 +papaslexzy +toscane +antilles +02011980 +jess22 +travel123 +11331133 +unitedstates +homers1 +290981 +azucar +kamara +29091995 +roxy14 +relax +210979 +wiosna +westend +max666 +13081981 +whyme2 +123321abc +cathedral +021080 +buffie +roots +d1i2m3a4 +scoop1 +cherry18 +sunday2 +suicidal +coldfire +steffen1 +021293 +300581 +11071995 +091282 +karlee +berries1 +crystal +milestone +pangit1 +11011982 +14071995 +jesus247 +love1984 +423456 +110296 +danny08 +imback +rafaella +charlotte1 +middleton +bmw323 +fatman2 +600044 +mexic0 +m3tallica +faith101 +prisoner +13031980 +gabriel8 +7758991 +enters +300392 +sandra23 +198708 +06121982 +12111981 +vasilev +13081982 +123mnb +26071992 +6031769 +munch +200579 +160193 +outlander +okay123 +waller +19011992 +cocoa12 +axeman +1609 +pacman123 +ripken8 +342001 +angell1 +luckyboy1 +010209 +alysha1 +arevalo +310380 +briones +1234567890k +mamanjtm + +sexygirls1 +g1nger +jesus2007 +rhfcysq +oreooreo +27021984 +01081980 +03021983 +281094 +jaspyb1990 +jake06 +300481 +passion12 +aa11aa +30031995 +280893 +kc1234 +411016 +jabulani +20061995 +rainb0w +281293 +11081981 +iwantsex +5101520 +robert123 +prestigio +carlos07 +996699 +justice12 +maxtor +ufhhbgjnnth +angel32 +2409 +dickens1 +colombia2 +namibia +011082 +1155 +houston12 +42069 +181195 +apple33 +bobby10 +pinoy1 +jake5253 +12041981 +sobriety +190392 +beasty1 +vale123 +beebop +fenice +parool +year2009 +29031993 +destiny22 +30624700 +nesrine +625625 +joemalyn15 +170592 +050391 +charlie88 +peter3 +olivia99 +easyrider +susi +190482 +1234567887654321 +ashley94 +deadline +201278 +hunter44 +love76 +letters1 +zxcvbnma +060880 +10021981 +clavier +741369 +wambui +xfiles1 +fucker6 +loveyou21 +280281 +forever01 +dayday123 +tsv1860 +11november +131076 +nfbcbz +independiente +200793 +whatever6 +alexa12 +nastya1997 +jagr68 +jp123456 +toupie +cute22 +devante1 +hahaha7 +trafalgar +humaira +butterfly12 +firehawk +02111989 +nayeli1 +01051981 +zepplin1 +f12345678 +180808 +felicitas +190881 +bayer04 +cats11 +konfeta +hjvfynbrf +mystical1 +batista2 +booty12 +trece13 +sweetie11 +banger1 +broken123 +forget123 +beautiful. +boober +soldiers +13041981 +under +usher123 +william18 +sunsh1n3 +nokiax6 +5647382910 +phatfarm +investment +123321k +01121991 +hamzah +rfvxfnrf +gizmo7 +nikki9 +love4love +texastech1 +trueno +chick123 +hotrod2 +penguin5 +pootie1 +29071984 +030993 +sempurna +080686 +210477 +nissan12 +12300123 +brandy7 +pooh17 +090808 +199711 +271987 +kaylee01 +samantha20 +14071994 +skyhigh +26011983 +farfar +andorra +trinity1 +marko123 +6cs2huaulf +oliver08 +vanessa23 +151179 +babycakes3 +nifemi +kjkjkj +petete +100794 +123456hh +johnson7 +winner2 +100279 +gangsta21 +creative2 +yellow09 +year3000 +111094 +nigger13 +mcqueen +bonjours +burunduk +babe69 +dochka +iloveyou66 +kirkland1 +fuckyou20 +daedalus +master123 +brooke08 +happy +sponge123 +himera +280680 +pimpin8 +degree +kansascity +taylor93 +123test +rosalinda1 +abdul123 +shippo1 +190182 +campione +shellie +arseniy +langlang +chris45 +newlife123 +070795 +papa11 +lovely07 +teamjacob +sexyblack +theboys1 ++ +310880 +060693 +luckygirl1 +081180 +15061981 +riley3 +18111982 +teresa +230994 +kon +01061995 +040386 +frank11 +screen1 +raiders08 +12071995 +tanman +ihateboys +222223 +bianca01 +280381 +khongco +hotdog22 +kot123 +kiki14 +27031993 +21011982 +black77 +121970 +15031994 +booman1 +doom123 +sweeties +navneet +beans123 +logan06 +090489 +too +060982 +allah786 +020480 +chigozie +sherrie1 +lanegra +270493 +drink +michell1 +worldpeace +04021983 +malick +20302030 +nam123 +junito1 +copperhead +denise22 +ctht +kiwi12 +101073 +soccer100 +vball +10121995 +scooby! +241989 +mickey99 +ginger8 +cupcake21 +1800 +monkeys11 +danger12 +122008 +woodwork +charles11 +306306 +150281 +03051993 +gfhjkm1998 +iloveu16 +ilovejon1 +17031995 +sasha2000 +gallery1 +111079 +joker777 +290391 +bigbass1 +dagwood +holla12 +popcorn4 +irish2 +110180 +hawaii07 +mahoney +sameer123 +packers1 +14051993 +070685 +heather10 +marquette +troubles1 +ethel +fatima12 +qwerty85 +wedding08 +dolphin9 +fuck77 +borneo +snookums +iloveyou45 +050392 +serduszko +crystal4 +grey +isotta +mcflurry! +270992 +mama09 +coastal +kelsey01 +lingling1 +200679 +peanut05 +imissu1 +zxcvbnm. +270980 +070186 +raptors1 +hakeem1 +billygoat +717717 +18071994 +hopefull +number41 +aaabbb1 +nigga6 +09021982 +pepper08 +cory12 +maxwell7 +280593 +110696 +debra +speedy11 +asd222 +zouyong +single21 +death! +123star +19861122 +160680 +capitals +elessar +cherry09 +samrat +13101980 +kiss22 +babygirl55 +family14 +23111994 +theking2 +01121982 +football37 +gia +yankees01 +goodbullet +lasagne +tujhjdf +38gjgeuftd +number44 +forever24 +awesome1 +reno +201078 +bmw328 +snaiper +skinhead69 +101297 +1chester +as123456 +fucker22 +glassjaw +acting1 +income +enemy +12031981 +sexylove12 +orange55 +210494 +199017 +corrado1 +ball11 +babygirl29 +joseph99 +governor +poppin5 +45674567 +delta2 +lov3m3 +03021993 +ruffryder +3108 +serval +provider +kipelov +naruto97 +sillygirl +logan08 +imrankhan +marty123 +raptor22 +davidg +198802 +titty +partyone +mira123 +asshole0 +loulou12 +120676 +ferrari7 +liberty +lovelife12 +030592 +77585210 +odunayo +1lovemom +brilliant1 +padova +iloveshoes +summer09 +rosered +sonic5 +bolbol +mobile123 +0011 +23111982 +220595 +28051981 +kings10 +556699 +charmin +snappy1 +mary23 +199110 +rubies +komarova +09011984 +crystal9 +06071993 +19021982 +maravilla1 +160579 +papacito +taytay11 +romeo7 +archery1 +alex45 +23011993 +02031994 +free2rhyme +ellaine +letmein +f00tball +larry33 +06101990 +12q12q12q +shumaher +explore1 +skrillex +091182 +10041981 +allstate1 +180595 +calvin01 +tammy2 +wasup1 +loveme4eve +sassy6 +13031981 +whoareyou1 +drew1234 +chelito +19992000 +spook +seaweed1 +delima +evangelina +200981 +panther123 +bimba +fatkid1 +linkedin7 +sanders20 +26041994 +fuck12345 +connor13 +saitek +tulips1 +fuck09 +silent13 +123056 +13031994 +25071980 +midnight5 +789456321 +29011993 +gaypride1 +jimmy22 +210679 +kawasaki +gregory +steamboat +120278 +lilsexy +061280 +andysixx +smile1234 +130494 +all4jesus +240495 +warriors12 +kukareku +280692 +28081993 +mazdamx3 +07061983 +emma2008 +justin77 +jesse101 +serina +pookie23 +awdrgyjilp +210180 +roberto12 +reggaeton +entrance +bigdog3 +tripoli +120475 +basketball +lildude1 +business12 +honey! +#1sexy +821128 +myspace197 +nandita +killerboy +1shelby +wilton +holycross +micros +fatman123 +qw +wuchun +omega13 +christian. +gerard! +yfcntyrf +winnie01 +030982 +01011968 +dopeman1 +713713 +saiyuki +loomis +broker1 +molly08 +holyghost1 +sebastian123 +bradley12 +harryp1 +secret23 +suleyman +cooper08 +250181 +smile21 +cronic420 +wat +270393 +131988 +221277 +vfvekmrf +shelly12 +dick1234 +160280 +02081981 +craiova +panthers11 +nascar09 +jarell +krishna +23101980 +17111981 +090906 +zadnica +050780 +may2005 +karina +odin +abacaxi +mellie +13101994 +gibbons +29061993 +886886 +browneyes2 +160594 +080788 +beauty01 +240979 +milky +110794 +televisione +o +eatmenow +1country +natawa +verity +kitten +miller69 +001907 +puppyluv +hecate +28041983 +07011986 +gintonic +280395 +sexybitch0 +alonso14 +instrument +raimundo +#1angel +hillcrest1 +240879 +11281128 +leonardo123 +051080 +legolego +rico12 +denise +morangos +visions +boston24 +280693 +19841025 +190283 +m3lissa +reindeer +030893 +dustin13 +ethan08 +serafima +myspace87 +197311 +08091993 +hund +hwriwxwc76 +billionaire +123q456 +1death +moondance +mimi23 +richard10 +katie69 +seznam +tiger17 +4077mash +legia +201987 +christian123 +elvisp1 +25892589 +maria9 +12091995 +flowers +musicislife +tekken3 +100877 +01051979 +element8 +198027 +lovelylady +millan +christin1 +12071981 +050680 +peewee11 +munira +alex78 +holiday1 +brigitta +11011993 +moneyman12 +crip12 +1hater +always2 +02021973 +iloveyouda +success11 +lea123 +methodman1 +vergine +141988 +verto00q +uliana +151078 +packers2 +190692 +froilan +antrax +wonka1 +bella16 +pimpshit +tbaby1 +080189 +dressage +kelly10 +fuckfuckfuck +danny16 +080387 +000000p +30061993 +04041993 +mama69 +nono123 +kitten22 +rockman1 +ami123 +qwertyuiop123456 +301078 +jason33 +mega123 +twilight22 +dundee1 +rattlesnake +getaway +qwer56 +220878 +kasimir +sepultura1 +140294 +qwerty1! +apples4 +realtalk1 +zebra12 +boombox +wanjiru +281180 +15121995 +040292 +21091994 +fenris +23011981 +blaze12 +moppie +sonne123 +brianna8 +ganteng1 +26101980 +renault5 +dominic12 +20011980 +2801 +6point +121194 +xxx000 +alexandru1 +09111990 +moscow1 +chris93 +syndicate +joker101 +191982 +pilgrim1 +22031982 +samoa1 +myspace02 +june1994 +??????????? +vampira +08081982 +starwars10 +ilayda +yflt;lf +shopping! +hutch1 +070589 +18021980 +zcfvfzkexifz +slaughter +gandolf +18041980 +antonio22 +max2007 +ladder1 +080984 +sweetlips +vantage +iloveyoutoo +lucky33 +10121978 +felix12 +buster06 +spacebar +26041992 +wewe +erreway +books123 +haseeb +hunt3r +jenna2 +noaccess99 +treetops +119900 +wonton +841029 +killerman1 +vermillion +03031979 +aggroberlin +4password +260393 +13579q +majmun +huggybear +999991 +as12as12 +291093 +doordie +quagmire +ilovetaylo +luciole +lame +mossyoak1 +260678 +keesha1 +diplom +america22 +dakota21 +yousuck12 +tatarstan +400102 +q777777 +blackdevil +guitar +hercules +12qwert +lacrosse3 +mydogs +13051980 +01091994 +ratrat +draconis +blue94 +lisa +nittany1 +25031994 +01011966 +bizkit1 +300681 +elvis1977 +navyblue +30011993 +alan1234 +knuffel +chanel123 +prank1 +godrocks1 +ilovebilly +210378 +birdcage +not2day +010694 +191081 +sasuke +klmklm +1809 +killas +jessica05 +162636 +300180 +divorce2 +oscarwilde +400025 +600094 + +shameless +ganggang +madison23 +200505 +kan +saysay +221969 +020185 +123181 +p@$$word +crystal8 +ryan101 +prov356 +aachen +bhargavi +neymar +dream12 +ginuwine1 +091092 +231095 +wanglei +290193 +morgan8 +davidh +06111985 +1sayang +baller6 +09121990 +151278 +19091979 +suckadick1 +15081979 +211986 +05052005 +kiss69 +nerissa +littlestar +demi +jacks +18091982 +shedevil +kaylyn +1justice +bootleg +theedge +redtube +sasuke10 +kartoshka +charizard1 +backflip +meltdown +johnny +170580 +milenka +9999991 +meat +01061979 +12280202 +little3 +xavier08 +020295 +baby +ouk29q6666 +wtpmjg +ihatehim1 +robbie01 +08121982 +sasha7 +matt18 +1sweety +290692 +killaz +ccccc1 +gibson12 +aabbcc1 +giggles13 +123411 +111996 +fynjybj +190281 +danny101 +14121979 +12347890 +13091994 +123mama +anders1 +jitterbug1 +canito +27011991 +blue95 +1qaz2wsx3 +skate23 +raf +fakebitch1 +tramp1 +softball27 +151177 +bentong +brunette1 +hahabitch1 +base +nathan18 +children6 +bubba6 +tristar +12345tgb +wcdd93h9pq +moonraker +rhfcyjlfh +0070 +poohbear19 +111111t +svadba +pratham +danielle08 +1929 +21021981 +24011984 +080592 +10071993 +sexy78 +butterfly1 +lolita12 +m0t0r0la +rockyboy +adrian14 +murcia +zelda2 +klizma +thebest2 +monisha +fernando10 +20011981 +bomb +katastrofa +loquito +827ccb0eea8a706c4c +thunder! +honey25 +04031990 +0708 +24101980 +faget1 +198320 +happynewyear +070991 +luka +chance3 +19101910 +poltava +iceman +elanor +the69eyes +verify +twilight. +02091993 +lazarev +whatever21 +crack123 +july1987 +060983 +59635963 +ifycjyhekbn +captiva +nubian +utjuhfabz +nascar123 +600083 +0105 +hasan1 +irish7 +thehulk +gioia +mustang91 +123qwe4r +13021980 +081083 +icebox +jahoda +001969 +bobby23 +kirana +spanish2 +freedom23 +135791113 +220978 +jokerman +manitoba +hilda +271293 +16071982 +frank22 +linda11 +kimani +131095 +10041980 +0507 +j000000 +110108 +dairymilk +pepper8 +02021996 +mandalay +boy1234 +zenaida +29091994 +timebomb +happy777 +poopy3 +040683 +1child +qwezxc123 +shaggy2dop +050183 +07071980 +connor05 +steffy +cocacola0 +446688 +19980621 +kalashnikov +eryyv588 +honolulu1 +forbidden1 +060405 +6868 +0611 +purple45 +kurwa123 +jason17 +200380 +291178 +alabama123 +adeniran +881988 +rich1234 +vanessa4 +scheisse1 +harvey12 +esposito +19372846 +110596 +455445 +parkview +william24 +18011983 +markel +09021984 +kingswood +werdna1 +elguapo +15021994 +hiroyuki +vegeta123 +271292 +grant123 +ivan1990 +33334444 +120896 +041280 +300783 +12041995 +311279 +secret21 +198418 +bayern +rana +delonge +jesus88 +sp00ky +jackal1 +198306 +moon11 +alyssa99 +pippa +df +karaman +031987 +caocao +ilovecock +rayray13 +1fish2fish +10061977 +flyfish1 +pohekale +penfold +love2002 +nevaeh08 +emily09 +donkey11 +hothead +08121991 +florida07 +13031303 +10101974 +198801 +duc +papi12 +30111992 +reuben1 +sriganesh +clermont +jazzy3 +sw0rdf1sh +pjkeirf +maryjane3 +ceasar1 +lineman +turbos +mishmish +sydney10 +28061993 +11011980 +pp123456 +jamess1 +baudelaire +people! +123passwor +pornostar +angelina12 +reo +myfuture +password79 +nokiae51 +bigblack +labella +lfif +fender7 +050575 +jayjay23 +alena123 +clelia +carter +osho +1love4u +leo123456 +emily9 +creepy1 +elijah11 +070797 +17021982 +samisami +24021994 +080693 +laszlo +deeter_1 +160480 +ch33se +squalo +classics +01111988 +candra +boniface +nigga22 +zak123 +18011994 +meline +july1990 +30061994 +butter! +giggles2 +040893 +terrace +fcbarca +alize1 +eminem10 +1olivia +adnan +fluffy7 +imaslut1 +julia13 +farming +jessica101 +senerity +223qwe +rigger +maria20 +sandy5 +13081983 +2smooth +kevin24 +qwepoiasdlkj +iceman22 +350350 +insecure +011284 +080785 +260280 +070487 +coolman12 +arsenal08 +pippone +pinky101 +cheer15 +carabinieri +timetime +natalia +280480 +peace69 +keys +valente +m1dn1ght +candido +1357902468 +carmella1 +luna1234 +pumas10 +140694 +barney5 +amanda00 +lexa +090682 +timon +784512963 +matthew03 +v12345b +11114444 +191990 +ranger00 +woshizhu +juan22 +meandu2 +merritt +remark +enjoi1 +hallo2 +said +просто +555555555555 +lethal +georgia3 +eternel +20111993 +salcedo +0112 +050882 +030709 +jayson +vera123 +13681368 +samples +olivejuice +rabbit01 +03041982 +leo12345 +deville +23061981 +221199 +123boy +cooper5 +130995 +1346 +mason3 +198528 +22031995 +140893 +jennifer18 +justin96 +melissa15 +20021996 +cjkjdtq +internet1 +black! +cfhfnjd +everyday1 +jeremiah12 +rocky1 +loveu4 +checking1 +playboy +16051994 +allahoakbar +giddyup +hotboy3 +saurav +120101 +25031982 +12061981 +daking +decode +050289 +peachtree +loreta +ronaldo2 +2q87xi3vfx +jasmine05 +palmetto +rosebuds +oswaldo1 +soccermom +121232 +qwertyui +sandee +chloe4 +19851216 +farts1 +190700 +lordshiva +volcom69 +06071982 +eraser1 +211094 +07101992 +24101994 +sheppard +gemeni +220979 +asdfghjkl7 +ashley27 + +mounia +080188 +louanne +11031994 +paramount1 +cristy1 +100795 +avm6ubdunj +kesha1 +02031979 +bing +player24 +delrosario +yellowdog +3008 +mazda323f +alfaro +alberto +021986 +21051981 +manila1 +gamecock1 +goheels +deaddead +soccer87 +byabybnb +bonjour123 +iloveme18 +tools +19841007 +123645 +money27 +kahraman +15071981 +yandex.ru +mammoth1 +29111982 +08091982 +poops1 +17031982 +starwars13 +awawaw +fkbyf +cutiepie5 +blackie +springbok +pocoyo +john123456 +asante +papamummy +jack101 +pumpkin! +millioner +311092 +chrisbrow1 +060882 +13561356 +raindrop1 +060695 +william99 +24hours +hayden07 +hoang123 +ad +1926 +stinky123 +repsol +21041982 +08121993 +020396 +cerberus1 +ilovejack1 +159654 +tanushka +11081108 +panda10 +deerpark1 +qqqqqqqq1 +jamal12 +firstborn +redd +28011980 +mama777 +homedepot +josh24 +23081980 +spider22 +franklin +ethel1 +11301130 +mohsen +kigali +26051982 +smellycat1 +ignition +naruto666 +scooter! +coccodrillo +teapot1 +040391 +199811 +fuckthisshit +29091982 +jack09 +123001 +1516 +mytime1 +tigers24 +zippy123 +200606 +brittany22 +hollowman +matveeva +juarez1 +15101510 +jolie1 +13041994 +19061982 +arsenal8 +11101994 +11091109 +monkeys5 +020394 +141421 +plm123 +090584 +fantasy8 +transit1 +14021978 +sparda +peace14 +17041983 +02061979 +vipvip +051987 +station2 +400079 +mahmut +ryleigh +midland1 +sutton1 +yourmomma1 +050385 +aaaa12 +18041981 +andrea09 +bond0007 +140181 +ashley98 +school. +retail +dragon123 +matt24 +hotel1 +03061993 +2500 +boquita +khurram +mehmet123 +valdez1 +tyghbn +071082 +redsox22 +struggle +fgh +dakota14 +mckinney +13041982 +dcshoes1 +tinman1 +12091982 +ninja5 +anabel1 +180679 +manuel23 +26011994 +010382 +ireland7 +prayers +28101981 +beach12 +130794 +iloveme69 +youngbuck1 +bigbitch1 +shelby14 +31031995 +daisy6 +25242524 +librarian +20071981 +helder +nitesh +klavier +250280 +1amber +poop14 +160183 +205205 +jada12 +051193 +iloveu01 +thug123 +solace +flash3 +punksnotdead +bananaman +452452 +nikoleta +honey24 +060291 +haylie1 +kamina +frisbee1 +curtis2 +08021993 +12061982 +100895 +smallfry +cruz +1kimberly +2523 +charles4 +27091983 +rambler1 +gvqjvxvb76 +400099 +oddball1 +dakota04 +261279 +jarred1 +220893 +2609 +premium1 +01071994 +05011986 +07121992 +09041992 +tarragona +kondor +1bastard +tickles +fucktard +03061982 +21051982 +030579 +cradle1 +jacob99 +15935700 +nandhini +lialia +15121979 +powerup +0011223344 +198508 +dunno +cnhjqrf +080385 +madinina972 +libellule +keshia +041282 +timothy7 +eusitu +331331 +olympics +s00000 +050485 +wizkid +1935 +skittles11 +policja +fragile1 +gznybwf13 +sergey1 +selma +mmmmmmmmm +161279 +jonathan20 +23051995 +ortiz1 +sexybitch3 +140879 +nikita1997 +220777 +tomasa +globe +maddie10 +hph2n89qif +elijah7 +110395 +nichole12 +21101981 +imgay2 +genetics +budlite1 +amber! +sexme69 +sweetass +151077 +lauren09 +15243 +x72jhhu3za +09123456 +takeiteasy +sweety7 +31081982 +britton +3578951 +830830 +01021978 +slim123 +loveyou10 +24122412 +090391 +ilovenick! +23081982 +16021994 +lupe12 +er2sizo241 +231277 +kaylah +majka +290782 +clinique +221982 +29091980 +lexie123 +nike14 +zacefron12 +mypassword1 +soc +shitass1 +2425 +lover25 +31103110 +june1980 +rachel18 +lildee +150978 +frederick +1a2b3c4d +270780 +america09 +shit22 +199416 +18street +13091980 +janeway +jackblack +cassie22 +dragon28 +221194 +technician +roro +bryan13 +26041982 +10191019 +070982 +rachel16 +holly7 +090791 +momentum +babygurl17 +mayfair1 +270680 +interest +29081983 +linkbuild + +tokyo +121415 +angels21 +030992 +280679 +miguel15 +18031982 +560048 +281279 +38383838 +france123 +edgar13 +112008 +madison99 +21071982 +19041995 +jacob15 +20011993 +17041993 +school6 +cameron09 +cakes +octavio1 +bebert +bulldogs11 +06041983 +1hollywood +optiquest +250895 +rocky8 +rockout +2326 +17061982 +ilove10 +nijmegen +bosshog +volodia +sing +23021981 +subaru555 +laverne1 +071181 +19041980 +kisa +041082 +praisehim +bhavesh +bienchen +22041980 +lombard +150293 +cowboy3 +11091993 +apollo123 +pooch1 +h80lsa +littledog +dog111 +poiuytrew1 +vanessa21 +sasuke3 +gopack +flowerpowe +kevin101 +class2006 +020982 +minecraft12 +teamodios +02071993 +08101984 +181180 +runner12 +a66666 +haylie +ilikeyou1 +topman +sanderson +270383 +sp1der +260693 +anthony28 +110778 +261079 +241277 +171988 +15091983 +nopass1 +516516 +hotboyz1 +198215 +punkpunk +kate11 +17081994 +polo11 +060482 +bellagio +0907 +asas1122 +cherrybomb +love2003 +fujitsu1 +198504 +mommasboy1 +1snickers +edvard +sommer09 +270193 +tyler24 +1234ss +181279 +brigitte +28071983 +ferec +babygirl04 +27091992 +irene123 +richard22 +skooter1 +boring1 +davidbowie +270793 +alexandros +kenny13 +babajide +lovebirds1 +lucygirl +070185 +ginger07 +strummer +25101981 +iloveme8 +sutenm123456 +qq123123 +nosferatu1 +teamwork1 +080491 +ars +fuckoff8 +mohammed123 +beauty7 +jake17 +190284 +am +buffalo66 +babe1234 +camryn1 +mommy14 +master09 +sometime +201277 +andreika +16051982 +190681 +omsakthi +juventino +lavina +imaloser1 +240194 +honda88 +edward101 +kurtis1 +asdf45 +25081982 +offline +heinlein +docinho +iluvmyself +rincon +plplpl +black20 +quasimodo +pickles3 +snoopy4 +136666 +okinawa1 +javajava +harrystyles +missy101 +quintero +sports10 +gadget1 +king +cachondo +01031978 +eightball1 +14111982 +ring +colorado +11111979 +nana07 +bella69 +11011981 +duffman +cle +loveme20 +ponyboy1 +040884 +060782 +12011995 +hated1 +09011992 +mangal +demetria +vtufajy +kuchen +kaduna +samantha08 +siddhi +ch3rry +school08 +jamie5 +isaiah01 +300595 +omaromar +130978 +tartan +quigley +041084 +bambam13 +171193 +chelsi +07031992 +090978 +ebay +pepper. +osvaldo1 +defleppard +160777 +gotmilk2 +pablos +vampire7 +barnes1 +02011992 +haiti1 +missmolly +05111985 +hottie92 +jlbyjxrf +thomas27 +151989 +fasttrack +2369 +120798 +feuerwehr +chris87 +iloveyoual +jackass4 +021984 +kittykat12 +23041981 +makcim +lero4ka +rufino +dartmouth +pissedoff1 +19071981 +babygirl31 +02081979 +pattycake +19101981 +buster8 +cacatua +kangar00 +mamanjetaime +775577 +250978 +jordan1 +lilylily +raven7 +alecia +141008 +230195 +shelby69 +nicenice +ybrjkftdf +claudita +mason01 +babe22 +240894 +hooch +05111988 +310592 +maria19 +lawrence +moneyboy +anna15 +mistigri +phiphi +barbie21 +bhutan +munkey +26111982 +201094 +shelby5 +silviu +200779 +qqwwqq +160381 +norwood1 +smokey6 +zamorano +090188 +acdcacdc +tina01 +taters +breanna12 +041279 +shreeji +098098098 +fordford +falcon11 +budweiser8 +shelby22 +rianna +mistery +fine +goodlooking +anna69 +mkomko +pe +granit +july123 +coqueta +victor21 +18031981 +superman27 +joshua1 +curtains +ocean12 +isabel01 +plaster +1penguin +lena1234 +291181 +123itsme +kings5 +fuckoff0 +151983 +fruitloop +29011983 +segreta +sexy4ever +andres13 +05081993 +cheeseball +marcial +parkway1 +041283 +20021995 +morgan69 +mc123456 +veneno +qwertyqaz +loser55 +09121992 +aggies12 +pecora +laposte +ilovebob +sweetsweet +girl23 +camello +jayden23 +270893 +supergirl2 +160893 +f1f2f3f4f5 +selamanya +geelong1 +panthers09 +230877 +bernabe +pennys +dheeraj +261985 +sinclair1 +160379 +lizzie2 +justforyou +twilight5 +17071982 +looklook +xh246aigun +98765a +queen3 +1290 +mathieu1 +bball8 +ribbon +dallas +panatha +player9 +abc123321 +noncapa09 +21021995 +pamela +filthy +hiroshima +maslo +codeblue +131278 +stars13 +13579000 +oakwood1 +angelica2 +nirvana3 +852456852456 +spooky2 +333123 +display +888222 +police +kenneth +football59 +pet123 +jennys +pizda +02071979 +barley1 +030508 +kitty24 +vbnmrf +empress1 +08081981 +060694 +050185 +221078 +260878 +lena2010 +198807 +ell +bears2 +poontang1 +baller07 +police9 +240380 +luqman +devildriver +emergency1 +babyjane +spears1 +realmadrid1 +vermilion +sparky3 +09081982 +pimentel +joshua77 +sweetie5 +paperboy +22021995 +cheat +rose24 +skeeter2 +antwan +06111984 +kangkang +rosenrot +mariposa11 +230694 +tyrone2 +games12 +234234234 +141178 +music88 +figment +zimbabwe1 +douglass +krzysztof +dylan4 +301179 +robert33 +101996 +joelle1 +carrie12 +precious01 +lool +school8 +170693 +arthur +martha12 +ryan1 +briana12 +21111981 +198124 +troll1 +honeydog +texastech +arschloch +popcorn22 +katita +ponies1 +temitope1 +160293 +25021994 +audrey2 +familia4 +sq8hm7l4 +enter12 +180693 +terrie +04061993 +ylenia +britty +1237890 +nightmare6 +touareg +7734 +$hex[687474703a2f2f616473] +mhinekoh +admin1213 +gastone +28011993 +john99 +231176 +splodge +maruthi +06121983 +00070007 +manikandan +qwerty65 +600096 +21021980 +salinger +tinker4 +sam111 +seth12 +godrocks +master1 +guitar21 +24081983 +190480 +beckie +help12 +1234567890v +13121979 +lollipop3 +monkeybut1 +scotty12 +minako +jinkazama +asian123 +020892 +mystere +zaqzaqzaq +alyssa04 +elnumero1 +29061981 +240677 +wiley1 +28121994 +jess21 +jonbonjovi +nicole84 +sesese +nolwenn +090185 +garth1 +180380 +moskow +31051995 +one111 +ercole +linda +999999999a +081280 +texas07 +hoho +112311 +gaston1 +cocoon +271093 +fynjy +06101984 +artistic +marie92 +21091981 +17071981 +rocket11 +matrix13 +janosch +brussels +jesus19 +mistrz +lex +luis22 +blomma +gabrielle2 +22081981 +hen +mark18 +gangster10 +cookie25 +harlee +110994 +0741020 +19021983 +tiberium +royroy +19121980 +doriane +4xeaxr653e +monster101 +180482 +activate +pussy8 +011081 +crazzy +alex44 +acissej +170493 +baloo +cowboys07 +mamang +dragons +aimee123 +deeper +nonoy +snoopy6 +ghjghjghj +drama123 +blake7 +11121994 +killer187 +45 +king45 +halo3 +pooh18 +180479 +pangetka +hotboy23 +24102410 +1granny +andy21 +1zxcvb +vinoth +nicholas6 +decatur1 +8181 +199214 +230578 +deamon +29041982 +090886 +dri +spring2 +31071983 +270381 +kovalev +29051983 +291293 +141179 +fuck08 +joecool1 +foxfire1 +ginger09 +salento +tane4ka +kabuki +poser1 +tinker14 +secured +10011981 +aaaaaaa7 +130677 +marine123 +harika +jackie14 +therock123 +blackpower +011093 +jennifer09 +henri +miller22 +c0l0rad0 +eggroll +alex1975 +neutron +nathan9 +aleluya +123zxcvbnm +020993 +260480 +habeeb +gangsta. +nevaeh07 +1706 +lenin +doom666 +spider +jonathan18 +joker6 +naruto25 +lilypad +ramani +080291 +240877 +16021995 +050792 +robin12 +cricket12 +110808 +alina1998 +140382 +mahesh123 +lagartija +051986 +sexy04 +thunder01 +bubbles0 +060586 +cyclops1 +diana15 +panic123 +ilovematt! +star56 +schweiz +101993 +112009 +bochum +mikki +tony18 +clarinha +120176 +nikki16 +michael30 +fuckstick1 +estrelas +mack12 +0306 +pen123 +celestial1 +leon1234 +onelove! +160881 +nicknick1 +sweet20 +090187 +mateusz123 +beach2 +state +rockit +159159p +30111983 +rockstar8 +pissedoff +131990 +fatso1 +mirtillo +1234566543 +jasper3 +7410258 +09011986 +mnbvcx1 +faceb00k +apologize +pamela2 +500047 +kometa +08041990 +hornet600 +500073 +dollarbill +access12 +killa187 +ruger +brittany19 +24051982 +z11111 +130195 +13051982 +444222 +270281 +crossbow +ahmet123 +sonicboom +26011982 +jackie +271271 +28031993 +love900 +400074 +luis17 +jacket025 +2titties +helene1 +200979 +december07 +music +sparkle2 +pookie10 +13031982 +party69 +victor23 +friday2 +chloe7 +prdelka +sagopa +golfpro1 +matematik +kara123 +liberia +10021980 +botswana +boob123 +randal +tomfelton +23111980 +qwerty80 +vito +gangster7 +loveme +10111995 +22121995 +vengeance1 +2pac2pac +handicap +198417 +nikesb1 +734992 +070190 +loveya123 +yellow1234 +30041982 +159753258456 +gilmour +shinee +misaki +bigpimpin2 +270883 +edward. +winter11 +csillag +hondaaccord +poopoo11 +doggy3 +dinky +snowball3 +bigpun +iloveandy1 +0101010101 +159369 +141195 +manu4life +143baby +darby +isabella +fredo +maluco +humboldt +30061982 +seema +steelers01 +17031994 +arsene +050893 +biotechnology +deleted1 +frankie13 +230978 +london77 +tigers14 +julian08 +28101993 +julian3 +weed14 +chalupa1 +june1993 +101994 +260580 +alyssa02 +malaki +teddybear4 +bungalow +surf4life +sagara +bonethug +dejavu1 +010992 +qaz12wsx +rhenjq +songohan +baster +skills1 +iloveyou91 +bluecar +alyssa09 +04111989 +sweetwater +maffia +1vagina +holiday2 +moulinrouge +combat18 +711101 +gioconda +rousseau +christina8 +05031983 +200393 +marina10 +dixon1 +carrera1 +piaggio +goldie +1cecream +030981 +180780 +260181 +pass@word1 +mentari +nissan +banana +haritha +h2oh2o +291177 +891011 +grace13 +speedy01 +extension +andrea07 +bhebheko +thc420 +nike24 +panthere +250993 +scampy +paulo1 +london3 +vampire69 +xyj44pe3gv +woody2 +111199 +buddy06 +baldeagle +belova +andrian +70707070 +carolina10 +cambodia1 +boarder +chris34 +cherry08 +hung123 +akash +scary1 +nelly2 +15061994 +fishing1 +130979 +pene +gloria2 +ortega1 +bnbnbn +fiddler +budlite +sasha22 +libertine +dominus +37373737 +negative1 +niallhoran +hottub +seattle206 +kingdom12 +091180 +highlands +011184 +matt07 +220202 +werty12345 +23081994 +man123456 +eminem88 +11223344556677 +281193 +shamar1 +anissa1 +tinker22 +101071 +edhardy +valerie +03041980 +radiator +thando +aastha +fastlane +bettyboop3 +drink1 +thejoker1 +balls12 +060487 +bob1 +butter7 +amber17 +theresa +201177 +rainfall +200010 +1butthead +assmonkey +bellamia +01111987 +marcell1 +йфяцыч +coolpix +beezy1 +10091980 +031180 +120408 +pussypussy +goliat +oldtrafford +tel +jza90supra +roland +tippy2 +130695 +omgwtf1 +huggies1 +lidiya +090583 +fuckyou +160281 +2030 +20042008 +19031980 +beaner12 +14051982 +beasley1 +planb123 +01477410 +wilkins +08101992 +hammer69 +27051981 +bricksquad +fabian +nokia6280 +brutus12 +500036 +mariami +181293 +311277 +tumbleweed +130194 +2602 +cherrie +29031983 +topmost +198101 +20152015 ++. +19101994 +cassie7 +shanks +1hateu +080992 +1kingdom +070691 +yanks +funhouse +england12 +mamaia +wethebest +nsync1 +laurita1 +probation1 +922i4deebm +hiphop13 +aaa999 +061081 +shabba1 +01051994 +280791 +videogame +04081993 +200181 +lovechild1 +sivakumar +macbookpro +11041981 +03111982 +pass4me +avril123 +oficinag3 +938271 +parker3 +050879 +270282 +blue98 +friend3 +145236987 +peaches21 +demond +55555r +hyperlite +summer12 +prettyboi1 +naruto92 +260676 +09061992 +fdfdfd +01061978 +smooch1 +wolf666 +danny17 +ibrahim123 +stinky12 +bigred2 +ambiente +two +miami2 +piggy12 +1hiphop +bizzy1 +rocking1 +willie11 +happy111 +hammer11 +ajay123 +brutis1 +123chris +230595 +tee123 +151980 +mumumu +mariah01 +140380 +patches01 +password2011 +03091993 +butterfl +fifa11 +jazzy01 +lisa23 +131077 +2580852 +did +liverpool1892 +uni +sandra7 +maxthedog +bruninho +220995 +23101979 +gf +jonathan. +ancuta +123qwaszx +ourson +rap4life +261179 +19121982 +jerica +pancho13 +maria. +270993 +charle +05071993 +180594 +yankees08 +121998 +ionutz +whatever +panic +050384 +pumpkin11 +dfdbkjy +18031980 +daisy! +kinderen +nobita +28091982 +fatcat12 +cassie4 +05061981 +211985 +jerome12 +141078 +3kitties +cs1234 +290181 +cabriolet +jason16 +school101 +08081978 +philomena +weezybaby1 +lyric1 +mrcool +destiny21 +goldwing1 +11111111111111 +print +fantik +jakers1 +football#1 +flashman +19861020 +dallas99 +lthtdyz +fishka +saab95 +27051982 +kirill123 +viorica +maggie15 +playaz +daisy14 +secret007 +larrybird +simone01 +nitin123 +201279 +battleon +allezlom +24041983 +worker1 +coolbreeze +9yue27ri +04121982 +dannys +290680 +230295 +evil13 +654321t +goodison +16061981 +kungen +brandi12 +ghjhjr +lordjesus1 +tinkerbe11 +brown3 +21081982 +06041982 +frank01 +inlove3 +april2009 +kemper +ihateu123 +recherche +eugenia1 +ephraim +030482 +ninja9 +adebisi +1lovelove +forest +chains +mouse13 +bricks1 +208001 +connor06 +261294 +ivan1980 +050483 +pantera +09091994 +280181 +19851212 +joschi +pepsi7 +friends4li +nascar9 +04111992 +cassie! +24091983 +tiger123 +thereisnospoon +islandgirl +giacomino +03061994 +09101989 +guntis +charles1 +malamute +mooseman +161095 +gilligan1 +naruto77 +edition +lukaluka +lamer +curry1 +meme13 +vivamexico +gracie13 +dipo01 +efrain1 +cowboy +vitesse +abc987 +crf150 +krishna +tamie +thuggin +kerrigan +taffy123 +victor5 +260479 +527527 +040392 +300380 +150477 +24081994 +21121980 +leipzig +dispatch +27041982 +carlos8 +luigi123 +180294 +cmoney +tylerb +noggin +1password +as12df34 +rafal1 +517517 +09111988 +301177 +jesika +max2009 +lutscher +cjrjkjd +sushila +010582 +16881688 +552233 +hakuna +180393 +reception +kl1234 +denhaag +zorglub +7070 +201095 +angel78 +25031980 +maryjane4 +220180 +sheva7 +muddy1 +machin +scorpio3 +sawdust +joseph05 +keroppi +lynsey +mollymolly +messages +150979 +cassiopeia +fgdfgdfg +700017 +suman +ak47 +01021996 +twenty7 +barnie +pippo123 +lisichka +liberty123 +wise +kanpur +08031980 +050486 +levani +sardor +kawaii1 +mercedes123 +sallyann +250194 +stefani1 +viktoriy +1488ss +asha +nick18 +23061980 +borris +shadow94 +our3kids +partsites +1911a1 +mama08 +yankees9 +pupp!e +kyle10 +dogmeat +pepsimax1 +fuck_off +25081983 +steelers! +24021983 +daniel33 +bitch44 +porsha1 +matthew04 +three11 +iluvhim2 +emmalee1 +4043vd +300679 +200400 +021988 +jose24 +123786 +24041981 +sonoma1 +tumtum +84848484 +hotstuff69 +martinez13 +ciaooo +loveline +123456hi +orbit1 +lover4ever +23051980 +198728 +20092008 +8wwh19duyj +ilovepaul1 +050393 +q112233 +kira12 +seo21saafd23 +28011983 +progamer +courtney14 +hailey3 +14041981 +pianist +mustang64 +louise13 +zaharova +mississippi1 +cyclones1 +14021981 +temidayo +miniclip1 +projects +22091980 +ladeda +jak +sexy +gangsta01 +amor23 +walker2 +18011982 +moncho +pizza1234 +yoyo1234 +lady22 +cnjvfnjkju +marie +playboy4 +prettypink +170695 +natalie4 +casa1234 +shorty +bling123 +pavel1 +diesel01 +13521352 +andrew26 +chomik +crazy9 +mike89 +1982111 +09031992 +galaxy123 +lorenzo +mario15 +112500 +rachel23 +duncan +june1985 +barcelona0 +lenny123 +1sandra +asdf321 +uis9zdgysn +190777 +258013 +djkujuhfl +1188 +tevez32 +061987 +zaxscdvfbg +yoteamo +pinkpanthe +pawel123 +shannon +schmetterling +sergey123 +arabia +puppylover +alexandra7 +travis21 +050992 +jkzjkz +littlered +latinlover +090685 +vfkmxbr +lollipop11 +mypass123 +surabhi +danny07 +lucie1 +pisser +jimmy10 +loll +psycho13 +220577 +october06 +babyg +zeus123 +bebe14 +charger21 +bubblegum7 +11071107 +17061980 +thanos +divers +06011985 +buddy111 +pineapple7 +171179 +wenger +redneck13 +210596 +morgan02 +teddy10 +08011986 +summer10 +frogs123 +poopers1 +19851225 +280681 +11111994 +paola12 +minimoto +11051995 +251176 +200707 +8i9o0p +peperoni +hiphop11 +112112112 +310579 +journalist +ghb +gangster! +175175 +sweet1234 +m2ydegkdws +110000 +04051982 +candy18 +carambola +kimberly11 +amor01 +narcisse +sasuke22 +rayyan +lechuga +24031993 +jacek1 + +dkflbdjcnjr +usnavy1 +260180 +ramone1 +craven +254254 +fish13 +pathetic +god1234 +25111981 +vsevolod +floare +04071984 +anaelle +kis +nordic +october07 +seppel +shredder1 +between121 +victoria4 +dashboard1 +romeo13 +sloboda +canyon1 +gunit12 +winter2010 +241293 +081282 +030780 +brainstorm +05mustang +abbygail +silky1 +mother21 +bloodline1 +27111983 +1982gonzo +gollum1 +paul22 +211294 +rezeda +lilmama23 +toto1234 +miercoles +198428 +blond +baby32 +130295 +4949 +10051980 +wawa +777jesus +spike7 +fashion12 +z1122334455 +higher1 +disney411 +gjikbyf +221294 +1samsung +ballin09 +chicken +22021980 +bulldogs10 +babys +wahaha +jayman1 +getfucked1 +angel1995 +ladybug! +derek12 +amber6 +jenny16 +harerama +add123 +02111983 +kittykat2 +brindle +tiffany22 +secret6 +04051993 +fluffy3 +sarumi101 +nd2ia8v8az +nelson2 +02061995 +197222 +3009 +24101993 +hyrule +timothy1 +eliana1 +24101982 +06051993 +folk74 +crossword +3366 +192939 +naruto08 +domi +sims +20031995 +lovepeace1 +zach11 +040792 +26051981 +12011981 +10051005 +amber18 +belize1 +heart3 +121074 +180792 +punk11 +goldie123 +2xtreme +otherside +198816 +0000011111 +240678 +deerpark +fldjrfn +ateneo123 +babyluv1 +500044 +190193 +kaydence +greenie +121205 +grace4me +emeralds +james420 +200577 +lyndsay +06091992 +booboo16 +333eee +david28 +fbobh_ +chivas18 +eagles81 +111175 +alma123 +danger2 +150993 +lucky19 +17061981 +blackblack +semperf1 +kanwal +27021993 +nabil +jasper7 +1320 +likemike +kallie1 +apollo +br00tal +batista12 +gnu +nikki08 +sosodef +1323456789 +192000 +0o0o0o0o +20462046 +04031982 +dagestan05 +andrea6 +mcgregor +050981 +753214 +witspass1234 +1lovelife +ilovemaria +041092 +leumas +batman25 +040477 +spiffy1 +11071982 +mikimaus +zxcdsaqwe +iceman01 +prueba +swimming12 +15041980 +jayne1 +car1234 +jamila1 +rdxyd43hca +kitesurf +2706 +nathan17 +shadow93 +dethklok1 +rahrah1 +121176 +toy +lawless +playboy18 +bigboy15 +061093 +051281 +chummy +25091981 +03091982 +rbrbvjhf +boscoe +jorden23 +05111992 +19091980 +maitai +eric15 +napoleon +mybaby! +twitch1 +kalinin +aishat +pou +14051981 +060780 +210707 +helives +mars123 +alejandro0 +inlove09 +10041979 +volvov40 +370000 +spiker1 +happy4ever +brandon25 +220794 +020780 +naruto88 +rupesh +25091993 +123456789az +goldenboy1 +lynn01 +666666d +qwaszxedc +deer12 +nirvana +151193 +mentiroso +hunters1 +zkexifz +vlasova +george14 +040393 +masterplan +666777888 +gri +love2001 +ja8yc7txs8 +31031982 +mariah11 +maggie00 +notrust +getlaid +mario14 +1samuel +43434343 +princess86 +ilovejay1 +amitkumar +chicken14 +cutiepie14 +huseyin +010480 +198923 +memek +yesica +1001001 +vicvic +5251410 +050793 +080985 +raiders22 +120295 +trixie12 +theboy1 +jezebel1 +diversity +160160 +sexygirl14 +ascona +050782 +coffee3 +trouble +doctor123 +03041995 +bowman1 +korokozabr +vfvf12 +neversayne +812812 +8282 +roberto2 +30071993 +jessie14 +28081982 +michael92 ++ +110331rahili +cloudy1 +leeds123 +25101994 +bullet12 +jazzy11 +131995 +katkat1 +06011992 +physio +farah1 +darker +bitch66 +030781 +02051994 +lucka +shearer1 +flower101 +199314 +otters +wildcats2 +281280 +jaylyn +redsox23 +151984 +alina1997 +cheekymonkey +warrior3 +maria12345 +ilovedanie +usuario +guwapo +sp +sti +sebas1 +huawei +luis16 +271279 +passing +ricardo +dancer8 +adadadad +godloves1 +mobster +amor21 +21031982 +27121994 +seagull1 +n1rvana +travis22 +free22 +jerrys +22121978 +honda05 +zach1234 +lemming +charly +chayanne +wasabi1 +lindsey12 +louise3 +29071993 +cambria +05061980 +gecko +2909 +070287 +11121980 +jackie4 +tomtom2 +lover55 +05021983 +danie +250281 +cheering1 +skin +noproblem +1234anna +5121472 +18041994 +grace08 +norman +24021982 +011282 +reed +shadow91 +arianna2 +libra123 +1softball +08081993 +junior20 +17041980 +13091982 +k.,k.nt,z +080286 +barbie14 +290994 +020893 +zarema +hlubkoj1 +alicia3 +fabian12 +ugly12 +malina1 +neslihan +cupcake23 +username1 +14031980 +janssen +0610 +wrestlemania +sombrero +bigdaddy01 +belial +springsteen +brenton1 +anita12 +marylou1 +good123456 +180000 +13qeadzc +141980 +gixxer +chiva1 +jes123 +saad123 +cheese1234 +14011993 +camels1 +15091980 +tylers1 +100195 +25041994 +gmail123 +linux123 +280994 +hfytnrf +110996 +hydro +peppie +anvils +200593 +forensic +valentin +skates1 +ludmilla +060608 +sledge +daughter2 +04200420 +mary10 +mahalkita +cvcvcv +avocat +miller3 +161179 +faggot69 +denisse1 +alex85 +arsalan +vanessa15 +weed21 +nigga21 +michelle0 +komltptfcorp +r2d2 +filipina +19121995 +karens +220875 +shenlong +69qd5cgxhu +daddysboy1 +15071980 +180193 +sexi12 +godzilla2 +collect +161984 +teamo3 +artwork +lakeview1 +gilang +muffin69 +040992 +260679 +cypher +140677 +sex69 +pepsi13 +cute01 +harmony2 +super23 +kushal +loklok +chris32 +brebre12 +mawmaw1 +doors1 +thatcher +261177 +biteme3 +81818181 +postcard +010309 +21111980 +curtis123 +greater1 +060781 +babie +250979 +jabroni1 +15071994 +jack00 +1myspace1 +lakers5 +fenton +hannah69 +nicusor +120996 +jump23 +d666666 +prince5 +annamarie1 +annea +99990000 +happy16 +peanut. +mommy06 +28021993 +renae1 +vinter +gamma1 +230678 +inuyasha123 +logcabin +manuel22 +lab +athina +dave69 +220994 +vinod +blacky +031181 +titouan +karabo +junejune +ilovehim14 +17121994 +020679 +050884 +1934 +198128 +glock +hayward510 +prateek +divino +flyleaf1 +147896325a +smoke14 +22051994 +monkey12345 +kayak1 +garnet1 +nathaly +blbyf[eq +20021994 +discipline +910910 +may1994 +fredy +thunder69 +++ +ilovejosh! +a321321 +playing1 +prerna +12091993 +peter1234 +25111993 +westbrom1 +greatgod +chula +800020 +denver3 +17061993 +harley98 +brat12 +bigdog01 +11021995 +tanner10 +zack11 +1jessie +161093 +milo1234 +walton1 +070492 +cola123 +nathan00 +chewey +cinderela +smasher +brebre123 +chiquitita +branson1 +hippos1 +12340 +1night +25121995 +010579 +lamejor1 +shimmer1 +babyboo13 +24101981 +lensois +050578 +rfktylfhm +181989 +rising +190992 +sophie99 +291180 +maxim123 +400007 +110793 +10071995 +qwerty4321 +turtle21 +201193 +02051978 +lebesgue +johnathon +ялюблютебя +301178 +20031981 +erine! +16051993 +290579 +121204 +corinthian +05031981 +wolfgang +johncena13 +shaka1 +swiss1 +mindy123 +197412 +lauryn1 +daria1 +120800 +koko1234 +savannah01 +shilo1 +blabla2 +08041983 +getmoney! +authentic +slipknot1 +starwars +230477 +1325 +brayden2 +amber07 +bakers +robina +white2 +sakic19 +argento +03061980 +farthead +cerebro +mariana +240393 +150894 +kaspersky +tweety9 +a444444 +repbyf +hammer +jughead1 +free13 +140477 +250578 +gemelos +130279 +point1 +petike +mary15 +southpole2 +10261026 +mike27 +fy +sealord +10071994 +030583 +grinch1 +hbk169 +20000000 +sponge2 +03101983 +cannibal1 +dragon2000 +081295 +130596 +3.14159 +semen +tony17 +omglol +maramara +seafood1 +kickit +crapper +ginger. +pepe1234 +doggys1 +lkjhgfds +coco15 +tryme +nicole90 +eggnog +moneyman2 +kevine +wexford +130595 +25091982 +188188 +ross123 +marvin01 +chester13 +pockets1 +riley08 +champ12 +carneiro +kamal1 +bigred12 +denilson +040984 +bullet2 +190492 +candy17 +hollywood0 +14121995 +joey14 +pass_rrr +worcester +bernard +frantic +november07 +ras +mmmmmm6 +171983 +pimpdaddy2 +michael200 +plato +19031994 +love888 +rani +stephon1 +diosteamo +250178 +20022003 +spirit7 +bebe1234 +azure +elefante1 +pumpkin +blue1 +fanny123 +angel321 +987654321l +141177 +2912 +110179 +tigers05 +091987 +busdriver1 +boludo +elephant! +2021 +lily11 +111968 +290182 +jonas11 +sekolah +ooooo0 +07081982 +barton1 +nikki07 +bit +bella8 +1eagles +yoohoo1 +matias123 +sd123456 +wisdom123 +fenix1 +bcgfybz +1523 +080786 +cool90 +fangfang +26021982 +bebe22 +111176 +13081994 +alex1979 +26081993 +19081982 +bbb111 +azbuka +irfan +county1 +paris13 +150278 +14701470 +toots1 +oluwaseun1 +123w123 +inlove13 +dakota +197610 +recoba +mariomario +fatema +july2801! +vologda +interesting +biteme11 +boluwatife +batman33 +rfvbrflpt +iceland1 +29081982 +love2004 +kyle21 +blueangel1 +bvgthfnjh +pac +9632587410 +chelsea26 +cinders1 +insomniac +05021981 +140979 +ninja3 +hollywood4 +19411941 +041181 +aristide +flapjack1 +301079 +nokia73 +220778 +полина +lillypad +06081983 +roger12 +102080 +adriane +margit +qwerty34 +090387 +loveme143 +nintendo12 +14091994 +20051993 +141079 +sukkel +270382 +07101962 +mellisa +huguette +19031982 +pattie +19831984 +ckflrbq +vjkjltw +kanchana +july2006 +200780 +creative +naruto98 +05101981 +cookie33 +merced +sparky22 +scott13 +831220 +mollie12 +mari13 +torrents +hotdog5 +incomplete +evh5150 +0712 +chip123 +280879 +armyman1 +fabric +press +groucho1 +woo +121273 +141077 +phil123 +universitario +parker9 +nita +hooters69 +generallee +damien666 +pentax +release +ironman123 +611611 +winky1 +choice1 +080683 +180481 +playboy10 +artemisa +child1 +anna1999 +gesundheit +shop123 +gothic123 +goodgame +prestige1 +bubbles07 +thug101 +pooka1 +25041982 +harleyd +panthers10 +270480 +bhagwan +feuerwehr1 +jake05 +lilo +boyz2men +p0kemon +09121991 +families +gfhjkm13 +102090 +colts123 +daisy07 +june1991 +101110 +the1ring +sexydiva1 +12345678910a +150478 +15081980 +jamie7 +27071993 +smurfette +199202 +karlita1 +8thgrade +supersexy +thunder6 +darinka +designdeal +david2009 +scooter22 +bigbucks1 +nyyankees1 +strauss +frighten +magic8 +gumdrop +dreambig1 +922i4ceebk +poop33 +danny18 +04071994 +poopstain1 +homedepot1 +padmini +greg1234 +7777777m +271983 +jasper22 +cowabunga +sayang12 +hello2you +kisses4 +198828 +archimede +240779 +niceguy1 +superstar0 +he +feedme +16091982 +daryl1 +19921993 +nala123 +catsdogs +k123123 +24121994 +baby2005 +student2 +19861987 +08091994 +jeremy14 +031293 +buddy99 +innocuous +magic23 +drinking +020981 +111111e +jinky +sillygoose +billyjoe1 +cutiepie4 +brandy +27101980 +edi +hatred1 +ravenclaw +marijana +thanhtung +scooter10 +summer18 +240578 +010991 +010794 +031985 +fallenange +jeannot +020694 +garrison1 +240180 +runescape5 +saltwater +damn123 +24041993 +valerie2 +sasha3 +090892 +roma1234 +emily21 +daedae +sweets2 +lovebaby1 +purple95 +19071980 +spider23 +1521 +223856 +loki123 +210478 +mother13 +snoogans +heather9 +198301 +marmaduke +pregnant1 +christmas! +diediedie +patti1 +minemine1 +lilly01 +tumble +1357924 +geranium +07111991 +31051982 +anna16 +30121993 +sweetone +qwertyui9 +trupti +shakir +madcow1 +dude14 +jeeper +mamamama1 +anthony77 +spongbob +lovebug7 +canddcard1 +01101981 +kingfish1 +zahra +darth1 +abd123 +june1995 +miller5 +horse3 +tinka1 +rolly +stargate +nokia7210 +180878 +freedom77 +malcom1 +hailey06 +moh123 +120806 +765765 +perfect7 +seahawk +123456da +papaji +amauri +king20 +jamie23 +brittany9 +negro123 +deangelo +love65 +3kids4me +booger5 +hanahana +123321l +vishenka +sasa12 +quetzal +6060 +251988 +redsox15 +sanane1 +07031983 +marinero +kiklop +remy +baby321 +ventana +27061992 +070182 +020493 +colacola +david1 +holly11 +010394 +0666 +66668888 +sl1pkn0t +skater. +231990 +kayla21 +16111993 +05031982 +170879 +302021 +060793 +angel420 +allstar123 +070880 +brianna1 +17021981 +ara +akucantik +25021981 +florinda +191983 +20091981 +advent1 +clara123 +brittney12 +rusty11 +robertson1 +sissy12 +sayangmama +010882 +belle2 +anjinho +kevin20 +route666 +baker12 +09081983 +13061995 +melissa6 +030483 +090684 +eric10 +caneta +171990 +taras +purple66 +22011981 +619619619 +240793 +191280 +cindrella +mugwell15 +260493 +1casper +071084 +tangtang +fisica +knight +frog13 +sanchez123 +katushka +august04 +uandme +woshiwo +angel84 +pavani +kajtek +amelia123 +tamiya +fifi123 +ghislaine +19822891 +titanic12 +melissa16 +stardoll1 +riders1 +050507 +miguel22 +fktirf +toy123 +layout2 +190882 +elendil +20081980 +nikki18 +mate1.com +03101981 +jay12345 +blackass +sports23 +notice +sugar01 +molly +sayang89 +07021983 +zcfvfzrhfcbdfz +xxxyyy +logic +shireen +alb +lilmama08 +fouzia +victoria21 +gooner1 +07011991 +address1 +fines +65432100 +vladivostok +foodfood +17071980 +01011969 +plonker +chile1 +0307 +261094 +0406 +junior03 +thiago123 +zxcvbnm123456 +shearwater +210677 +anastasiy +dreamer12 +aaaaaaaaaa +yorkshire1 +1joker +jacaranda +courtney01 +saxman +060679 +26111981 +140180 +130977 +player6 +18051980 +miko +fandome1 +180280 +199610 +keke11 +manorama +burgers +forest123 +favola +04021984 +loser08 +21071980 +satya +17041982 +andy1999 +god12345 +200477 +qwerty1991 +heyhey! +sammyboy1 +goonie1 +aa1122 +cjymrf +020408 +skater17 +master! +dylan05 +morocha +bum +199122 +12304560 +qaswed +moonie1 +fernando13 +caren +darling123 +21121981 +310879 +berkley +19061995 +379379 +catwalk +lorena12 +panther11 +shorty19 +killa11 +monkey86 +buenavista +010280 +swim123 +091192 +cuddle +pounds +mantap +orangejuice +010174 +08021983 +25052505 +albert5 +yomoma1 +491001 +121099 +12091980 +acer1234 +22101994 +vangogh1 +28061982 +danilova +fubu05 +110977 +mirjam +sugarray +mountain2 +helium +angioletto +090284 +alaska12 +2607 +051279 +s1lver +toyota +singer123 +amruta +nurul +pancho12 +dominguez1 +belinea1 +20101979 +fantacy +sabrina1 +01031995 +chrissy2 +140393 +020881 +enculer +coquelicot +060285 +anthony200 +199219 +1607 +rvd420 +117711 +zion +280781 +020381 +mk123456 +290380 +annie3 +assmonkey1 +jessie5 +pink87 +20101978 +bpvtyf +zhangjian +anjing123 +samreen +miranda +george99 +phoenix5 +chucks +240404 +leonidas1 +121969 +22111981 +scarface69 +15051994 +santos14 +daisy8 +samatron +nigger22 +112123 +missy22 +ethernet +karpov +caramelito +oscar23 +isaiah07 +141978 +15251525 +02111982 +andy23 +traxxas +karate12 +biggy +viktoria1 +cheeba +09111983 +bball101 +orchestra +mazda123 +allmine2 +05081982 +112277 +beerpong1 +justin89 +bohemian +classof2010 +nantes44 +yaya12 +teresa2 +03071993 +22041994 +assault +pusher +alaska123 +wright5 +acer12 +1979pool +vulture +070187 +0206 +stjohn +210779 +azerty00 +caridad +millenium1 +cookie45 +cheesehead +raiders8 +211177 +124421 +evan11 +whatever01 +keri +23081981 +13071981 +mortadelo +150793 +treehugger +tink09 +260478 +black19 +random! +peace4me +meme1234 +daulet +12011980 +20081994 +1318 +170793 +determination +tripod1 +2803 +galinka +siete7 +teamedward +rashawn1 +30011980 +daniel30 +10fingers +20111980 +adam14 +azeqsdwxc +jordy +kak +monimoni +08081979 +redmoon +football48 +zaharov +kenneth3 +newyork1 +keagan +198925 +timeless1 +18061980 +020278 +paige3 +boston13 +anytime1 +02022002 +jacoby1 +060593 +yourock1 +numbnuts +030782 +198629 +yatra +a1234b +stanley123 +marshall12 +twista +2roh8tl433 +greenday4 +gfhfyjz +loveyou6 +machete +220296 +bootcamp +150677 +solcito +jalen +12121975 +140493 +14031993 +shasha123 +sk8erdude +011985 +jaychou +bigdog23 +100476 +caballero1 +srisri +leah12 +june1989 +luciana1 +lorenzo2 +streets +universum +7171 +eagles4 +beatles +luckyy +140203 +gabby10 +oxymoron +9uzp9jek3f +dolphins +160178z +31011994 +babyboy16 +ranch1 +230593 +freepass +godzila +041081 +pilipino +brent123 +081293 +mikejones2 +1357913 +18091993 +vfnehsv +spartan300 +bubby123 +15231523 +barbie8 +walkers +brina1 +26101981 +jackass23 +17101995 +milos +09110911 +xavier23 +060185 +160394 +21051994 +playboy09 +syncmaster +buttermilk +lawnmower +wertyui +blast1 +290493 +goncalo +killas1 +evan12 +sweet07 +02101995 +driftking +marc12 +dolce1 +27081993 +traveler1 +matthew19 +flower16 +fenrir +sumitra +ll123456 +katharine +tiffany8 +261077 +p00pp00p +cdtnkfyf +konichiwa +0207 +198204 +bubba1234 +100196 +sweetness3 +28051980 +maverick1 +besties +basta +burlington +dro +220396 +hater12 +michae1 +02081977 +lowlow +lightblue +26071993 +niceass +moosehead +081283 +kenny3 +fungible +130696 +elixir +totoche +dimaraja +199022 +19071996 +buddy16 +mishanya +vaz2110 +james03 +18101994 +games2 +teaser +kanishka +jake16 +fuckingshit +alayna1 +darkness7 +150394 +mul +casino123 +mother10 +101200 +valentines +2587758 +babyjack +dreamer8 +sexme +dal +mate123 +b123123 +pappa +honda91 +june1982 +lola01 +sleeper1 +zabava +harvey01 +lover33 +sunnyside1 +12051978 +13061981 +tomass +141277 +2thick +bebegim +manjusha +adrian15 +vanessa! +sonic10 +salas831 +dank +xzsawq +james02 +cabaret +froggy5 +frenchfry1 +lovehurts! +joshjosh +triple7 +solomon123 +sandeep1 +mini12 +compaq6720 +djamel +1love1life +champion12 +kingdom123 +abu123 +19031981 +stacy123 +hotti3 +01061994 +02051979 +060584 +olololo +klaipeda +gangsta9 +angels10 +dragonite +sergio +101275 +80808 +bazuka +karla12 +030479 +jaguares +geoff +140679 +dateme +poipoi1 +eadgbe +buddylove1 +musicas +260978 +25041995 +banana. +0302 +papoose1 +tonio1 +roza +sigmachi +mariah13 +myspace91 +281988 +196600 +10271027 +198408 +020980 +blackdeath +utrecht +271177 +kristina12 +220279 +david02 +polochon +04061980 +kx250f +091988 +marie26 +hayden11 +raju123 +fisch +bobby21 +aladino +0p9o8i7u6y +mario01 +farmers +252 +thunderbir +sportster1 +usman123 +010780 +topography +shanda +elmo22 +napolean +05011993 +sidewalk +promise2 +valiente +marcel12 +steffie +sravani +shanker +d2xyw89sxj +bahamut0 +joker10 +swed420 +vagner +01111990 +miranda13 +caspar +honeyhoney +denver +18081980 +16091994 +sonyericson +grocery +marimba +merlot1 +smalls1 +chris2007 +ohsnap1 +john19 +gamestop +redneck101 +like123 +kimberly13 +z1x2c3v4b5n6m7 +marinochka +160292 +05011983 +1yahoo +kolo +furious1 +13051977 +rosey +coondog +aman123 +04081982 +426426 +1248 +madsen +080792 +patrick09 +luansantana +552211 +lecturer +cindylou +kamel +antonio4 +gigi12 +joker420 +1animal +flash2 +stratton +jayjay10 +cardona +190192 +spiderman. +jumanji1 +coolme +30031981 +gemini5 +xiaoqiang +mickey101 +touch1 +reese123 +magistr +yesiam +151294 +jason06 +mama33 +lost4815162342 +nasigoreng +bogey +katie16 +17051980 +december09 +sonic11 +annaliza +281194 +987654321p +161992 +kimberly7 +27101994 +781028 +329210b +kevin19 +sp0ngeb0b +adolfo1 +slipknot10 +300980 +jumeaux +mission2 +cardio +sebast +564564 +08031982 +pass2244 +fuckstick +pumpkin8 +300879 +mark15 +missy10 +surinder +celebrity1 +samsung. +jackie21 +canadiens +kisses13 +070582 +240182 +hubby +jazzmine1 +comet123 +sexi +shadow66 +meatwad +190880 +hell12 +medvedeva +666aaa +25011995 +healing1 +starbucks2 +876543210 +lovinlife1 +12e456 +metallica666 +thunder22 +charmedp3 +fadila +785412 +290392 +08011993 +puppy9 +k1k2k3 +gouranga +griffey1 +serser +03111991 +xpr4bf29ux +dima1987 +adela +padmaja +21071994 +150678 +a1z2e3 +29071982 +1924 +bear2327 +mamateamo +123451234 +31415 +swiss +02051993 +da1234 +a123789 +period +kamilek1 +justice3 +000000l +qwerty1 +froggy3 +sss333 +montez1 +iloveboys! +jeremy07 +ricardo +juliya +texas817 +newboyz +ghzybr +coracao +firewall1 +skate15 +medusa1 +12345678999 +jordie +katerine +sexygirl5 +jenny +1029384756q +210594 +04111985 +28011981 +june2003 +rjgo7we138 +18121995 +calgary1 +801018 +uyqlvip773 +huy123 +joyous +valeria123 +nirvana13 +brooklyn10 +casper23 +lissa1 +30031994 +jeremy08 +shoe +020579 +mykids123 +01011967 +halfpint1 +261292 +max1992 +tomislav +sunglasses +cali22 +timelord +08061984 +sassy69 +naynay12 +toonarmy1 +270191 +nowayjose +guru1234 +1savage +housing +ilovejen1 +kickass123 +140297 +cocky1 +28011994 +kayla06 +balerina +081080 +gardening +killa21 +bigdave +hello08 +040882 +rebekka +dsmvssq955 +life1234 +cuddles123 +elijah05 +computer0 +200978 +1234aaa +eeyore123 +brooklyn4 +moon13 +kristen123 +cubbie +gaysex +25081993 +loveyou69 +bunker1 +gunner01 +safiya +271986 +george08 +seba +renee11 +25632563 +burn +dnflwlq +kal-el +steelers13 +audiq7 +05121981 +25052005 +woshishei +250479 +271295 +smelly123 +handy +198313 +311079 +jess14 +yellow18 +19081980 +gordo12 +11111w +veronica13 +e6pz84qfcj +pinoyako +playboy8 +bffl123 +061294 +cubanito +040983 +15031982 +fofinho +love74 +cameltoe1 +030306 +100177 +14041980 +198688 +azert123 +mur +31121994 +maximus2 +aen: +alpha12 +fucku666 +tomcat14 +star27 +070283 +440022 +steph11 +chelly +mandie1 +teleport +bluebear1 +bassbass +bluejeans +music16 +spaceship +pookiebear +sanchita +godblessus +1234567890. +link11 +02031978 +boricua12 +ranger13 +pachuca1 +070687 +240679 +cdexswzaq +08011985 +791028 +198308 +cutie06 +drummer7 +enzyme +sloneczko1 +12021995 +seashell1 +59595959 +nusrat +js123456 +maxwell11 +danielle09 +600006 +min123 +100377 +purple34 +nino123 +unfaithful +lalo12 +27121993 +040693 +shannon69 +killer56 +14785 +2525775 +crazyfrog1 +13121995 +neville1 +050186 +03111990 +zamboni +cunt12 +060392 +krasavchik +babymomma1 +cutie +041184 +vander +fatboy5 +hello89 +centrino1 +081182 +3stars +ss23081937 +dragonbal1 +beccaboo +amazing! +24252425 +angeline1 +dravid +310893 +12345678a +16041981 +jennifer08 +norfolk1 +candycandy +20071995 +mimi15 +hotmails +14031981 +130180 +251077 +11001001 +mathew123 +w1lliam +icanfly +tempus +colgate1 +ohyeah! +170979 +031080 +apple16 +17101980 +kamari +royal123 +asher +rodolphe +21061995 +23121996 +060386 +amylynn +130877 +aggie +scareface +babyblue3 +stillwater +15021981 +diamond16 +john88 +281990 +20121981 +louann +mememe! +16031982 +icecream10 +31101982 +scubadiver +baobei +patches3 +huckleberry +kbpfdtnf +happy18 +buster00 +meow11 +090384 +edward09 +aniya1 +270380 +mouse3 +111111prof_root3.sql.txt:, +monolith +qwerty000 +tattoo69 +markanthon +feefee1 +junior99 +habib +danny! +phantom +leoncino +anarchia +amazing123 +laura21 +prieto77 +adelina1 +france +abcd11 +seychelles +redhead2 +270280 +emily99 +trustgod1 +guayaquil +firman +bulgaria1 +q8a74ippxd +23111981 +230878 +monster88 +1289 +coolchick +250495 +30111982 +cat111 +zxcvbbvcxz +lucerito +schwanz +kokoloko +pink03 +22111980 +02011993 +robert27 +hartford1 +robbie2 +rascal11 +gianmarco +price +fencing +130694 +what11 +cuban1 +fairfax +hortense +katie8 +112001 +straight1 +25362536 +brenda11 +squeeze +14091982 +vipera +cardiac +qawsedr +pass99 +28031981 +hellya +07081983 +virgola +411030 +toolbox1 +141094 +norcal14 +170395 +david007 +menthol1 +luscious1 +mansfield1 +040780 +secret4 +nikita01 +herminia +221295 +werthvfy +kubus1 +huhu +mallrats +020378 +jack2008 +300480 +emirhan +czarek +henry5 +theater1 +bqktqqn844 +touchme +asdfghjkl;' +bitch05 +dragon32 +champ2 +09111986 +lilly07 +530016 +120474 +petrol +delano1 +1element +170181 +tamarindo +sur1313 +081187 +050980 +drumandbass +oskar123 +67chevelle +teresina +match1 +kokowawa +points +anna2008 +marhaba +devilboy +mylove10 +dirty69 +198213 +040608 +040387 +diamond15 +volvofh12 +2234 +kaligula +290393 +dylans +marvin2 +patrick18 +psycho666 +garret1 +budwiser +antonio8 +sasha1999 +110196 +hgxnewx11 +india@123 +matheus1 +jazzbass +david777 +13081980 +georgia7 +shoaib +june1992 +310194 +checking +rock21 +peugeot307 +amin +daddy24 +imfake1 +1runner +ivanko +number16 +godsgirl +070383 +199121 +31081993 +pizza4 +daydream1 +dillion +concert +270681 +tigger03 +23071980 +samvel +110295 +ast +19061980 +230896 +courtney4 +mai123 +trollface +veterok +xswzaq +tucker10 +310195 +chamber1 +227722 +04121983 +mcfly123 +brooke14 +665566 +100178 +yfnecz +gabby7 +caroline1 +oilers1 +silk +isaac2 +gemini3 +323 +purple0 +diva10 +06121993 +seduction +400400 +dogdogdog +12041996 +vincent1 +barbie09 +12071980 +06041993 +grad09 +wheelchair +0910 +jackson21 +12061996 +salvador13 +righton +miguel3 +09876543210 +amaral +orbita +mylove12345 +hottie33 +lucylou1 +katyakatya +040479 +damir +1211123a +varvar +mk1234 +13051305 +sandara +09031984 +law +080991 +fkkjxrf +anastasija3010 +ridley +samantha09 +pussy24 +nika135 +24051995 +doggydog1 +froggy! +21031981 +redsox18 +271094 +inmaculada +iloveu09 +061278 +mynameiskhan +pulsar150 +04051995 +09121982 +sunshine89 +tyler +chase3 +pippi +alexis18 +sydney99 +mollymoo1 +200101 +23051982 +080489 +cancan1 +valent +130693 +vincent3 +selassie1 +sakura +kyle14 +poooop +281179 +sadie7 +matej +trewq +211179 +jeck23 +071083 +iloveshane +cannonball +marvin +gemma123 +18041993 +asdf1 +clare1 +julieta1 +freewilly +allstar7 +sucker123 +010680 +kaname +kaycee1 +19841012 +dcshoes +3e4r5t +ceramics +183183 +271985 +06061979 +150381 +brian10 +25101980 +tibia123 +goyj2010 +fff111 +salina1 +swamiji + +22051981 +meena +woof +tabaluga +beanhead +sexsex123 +bauer +persempre +elcamino1 +buddy24 +shadi +baxter11 +yvonne +scoobie1 +130179 +070483 +janina1 +matrix22 +passwort123 +09091979 +super9 +ferfer +asdf22 +ppp111 +simple23 +jewell1 +cacaca1 +mychildren +spices +28031994 +janek +sleeping1 +040390 +savage123 +cassie14 +ichiban +madhavan +party! +fake22 +14111411 +sweetp1 +verde1 +louna +newme1 +rattler +sneaker1 +0609 +05021982 +bos +katrina123 +111174 +211295 +280579 +03031977 +monica21 +denise10 +mortis +dodge2500 +chivas19 +pinkstar +maggie33 +mybaby08 +jamaica12 +kaydence1 +alexis24 +domina +12011994 +icehouse1 +amor18 +sucka1 +timileyin +angelidis +241077 +buster55 +oliver23 +29031995 +joedirt1 +laura7 +jayden5 +stacey12 +fuckyou92 +keren +fishies +matrix99 +070882 +joseph06 +eazy-e +peace21 +bitches4 +21101980 +2910 +200908 +money32 +400070 +daniell +261178 +9009 +missyou2 +banana23 +jasmine99 +14071980 +227227 +g-money +jh1234 +a4s5d6 +08071989 +jennifer17 +kexifz +merveille +capricorn2 +jayden4 +10011995 +iiiii +guadalupe2 +123 +aishiteru1 +0407 +27041994 +220377 +joseangel +120375 +cupcake14 +juniors +lalelu +paul +peanut16 +salimata +321789 +mother02 +bluesea +150505 +16031981 +omowunmi +obama2008 +llewellyn +hello666 +1472583691 +nikita13 +mariah3 +otter1 +gato12 +derrick12 +andrew101 +30091994 +joesph +chola13 +khmer1 +travis23 +nikita1996 +alisa123 +bratty1 +babeth +ac123456 +larisa +rocket2 +gage +20121204 +bakekang +bringit +12345ta +woodchuck +15101994 +arsen +pepper07 +angelfish +28111980 +110807 +jordan92 +september21 +2loves +shenmue +cowman +nicholson +ellison +iwonka +ghbrjkbcn +2521 +270579 +07111985 +sizzla +01081995 +michael93 +nonlaso +dog4life +sorokin +seeker1 +trouble12 +marcin123 +15031981 +090292 +weed4me +numlock1 +ramzan +donomar +22021996 +16031994 +sexymama13 +boncuk +frenchfries +aigerim +eyecandy +120576 +meghna +tomate1 +atharva +08111986 +freak101 +cooool +reggie01 +01091982 +230179 +dumbass123 +natalina +ballin69 +rebecca13 +260579 +laura15 +batangas +lj +aurinko +belfast1 +yayaya1 +snoopy8 +samuelito +phoenix11 +lorene +rfvbkf +122100 +vikings11 +omari1 +candybar1 +argentum +orange25 +zebedee +hatter +skate. +dream7 +audrey12 +frqnj0zf5p +hawaii5 +deedee3 +ulysse31 +181093 +hector13 +naruto69 +lydia123 +180493 +610610 +111211 +070485 +babyboy06 +moonspell +hellbound +kayla69 +010809 +3825 +197410 +starshine1 +debby +taylor20 +dodgers2 +560070 +sprocket1 +booboo15 +tino +script +kikito +dragon05 +dkflbvbh +albert11 +aaaaa +ed123456 +omshantiom +qqqaaa +matt101 +3odi14ngxb +251195 +friendofearning$1 +has +pickles7 +faggot2 +gracie06 +170380 +666666666666 +zucker +carlos08 +biskit +iloveme08 +matrix69 +peaches8 +imcool! +123231 +22081994 +orangutan +100994 +090385 +bulletproof +lucas11 +thirty30 +huang +pilar +booo +olimpia1 +sole +10091981 +trewq1 +allstar3 +7things +chaos2 +daisy21 +131992 +alicia +salamsalam +windows95 +blood59 +27101993 +filthy1 +schuyler +strela +stiffy +princesse1 +devon2 +parovoz +telemark +agriculture +31071982 +180480 +anamarie +chilango1 +peapod +party101 +210377 +anacarolina +casey13 +kolovrat +010894 +glory123 +god +shadow44 +monique13 +proute +queen11 +petrenko +jack12345 +asas12 +katie101 +cogito +micorazon +flower99 +travis69 +06111983 +29041980 +megan22 +369123 +fgntrf +total +02041979 +12gage +april02 +blackgirl +crjnbyf +barbie15 +mylove07 +iloveallman +281986 +buster33 +1345 +idon +080706 +bulldog10 +cradle666 +cashmoney3 +przemek1 +ernie123 +bluejays1 +280294 +co2006 +bree +novosibirsk +mike2008 +jason9 +bartok +maggie1 +356356 +fucku8 +20011979 +ilovechad +kupa +14021996 +16031995 +michigan2 +ilovegod12 +i4ifbinfyu +10161016 +beatrice +katrina2 +jennifer16 +tanmay +philip123 +deadspace +30081994 +170195 +surfer12 +iloveyou34 +chivas4 +a99999 +darkdark +sanmarcos +sadako +wipro@123 +falcon +suzy +5times +vacaciones +19861120 +fuckaduck +wallace3 +ihatemylif +ethan04 +tigers8 +coolboy123 +blade3 +holaquetal +dimdim +ajnjuhfabz +137955 +scrapbook +ftrcvh5732 +06111992 +tirupati +interface +mina123 +june1984 +151988 +asad123 +pearls1 +09071989 +alyssa23 +ranger5 +tennis23 +pinkys +11121995 +aenima +paolina +pinklover1 +maggie02 +nafanya +sage123 +captain2 +goonsquad1 +pimp32 +apples13 +verona1 +44 +071281 +rostislav +cancro +nokiae63 +amos +mercedes3 +jesuslord +ksyusha +bermudez +123@abc +sundrop1 +misato +cdtnf +051292 +chris94 +ashok123 +january01 +jose12345 +071985 +wendy12 +granville +diana10 +леночка +281178 +dummies +11091981 +loveme89 +400610 +pilsner +holybible1 +domini +afdjhbn +arnie +biglove +yaorqw12334 +m0ther +1930 +puppy4 +rainey +180782 +disturbed2 +tipsy1 +mosdef +likehouse +030809 +narkoman +gypsy123 +050809 +marcus07 +:lol +capri +27121981 +lelele +gibson2 +29101994 +trevor +tracks +master24 +400026 +deathstar1 +171992 +lorikeet +darkdragon +papers1 +megan14 +storm12 +catracho1 +221077 +denis1998 +pacers31 +jazzer +wewewe1 +ohmygosh +forum1 +1adrian +23071981 +alemanha +coffeecup +12021979 +17031981 +lucia123 +qwer5678 +pinheiro +500017 +principe1 +greenday21 +zebra3 +neelima +brittany. +chelito19 +13061993 +14081981 +020380 +milford1 +ploplo +vlada1206 +181179 +gabriel9 +elrond +03071982 +whiteangel +01081978 +exi +sprint01 +guitarist1 +svetochka +messier +cheer16 +howard +stephanie6 +peace15 +220977 +mermer +monster24 +7777777d +151194 +250195 +30031980 +kasiunia +19111993 +getreal +aol1234 +151276 +091280 +fred13 +fish01 +yfl.irf +wiggins +star1 +12061995 +jimjam +maggie9 +guinness +iloveme10 +yellowbird +booba +managua +130394 +miguel21 +12121997 +godsgift1 +13061980 +soccer56 +bitches7 +281177 +198915 +poolpool +mustang86 +qureshi +tooltime +chatty +411013 +010695 +perritos +loser0 +isabella7 +frankie11 +love213 +mickey77 +1hotmail +yelena +chile +lilmama14 +1q3e5t +cherry17 +rickross +shootingstar +1234567890abc +boomer22 +bintang1 +bubblegum! +220479 +330033 +rebirth1 +puschel +fortytwo +123123t +protected +cable1 +jetski1 +17101993 +arjun +brandonlee +tretre1 +colby123 +14101994 +kittens123 +pollard +giovanni123 +popo1234 +300391 +nikki101 +mirjana +000023 +initiald +viktory +24071983 +hailie +crawling +skater1234 +polaco +makarenko +sunny3 +ambers1 +myemail +061180 +24051980 +astaroth +ace1234 +03071980 +laughing1 +160894 +ghost666 +shovelhead +dirtbikes +nascar17 +steph3 +18071981 +jeffrey12 +21081980 +coolcat12 +thenewozer +gatubela +gladiolus +198517 +29121994 +munchies1 +borrego +anatol +chris91 +boondocks +$hex[687474703a2f2f777777] +17111993 +070583 +computer6 +alex4ever +blinkme +whatnow1 +shotgun2 +konfetina-kis +meesha +nokia12345 +geujdrf +qazwsx3 +barracuda1 +fester1 +79641777070 +nothing7 +xavier10 +lulita +198001 +ferrari1 +15041981 +musicislif +sillyme +110279 +dasher1 +cyecvevhbr +natala +060193 +love121 +killer94 +pus +ganesha1 +nintendo2 +chandler12 +duisburg +scott23 +hunter19 +v00d00 +01071977 +pukimak +sukabumi +bashiru +guitar23 +1a2345 +potato123 +anna1985 +february13 +barbie16 +tralala1 +010409 +pixies1 +juicey +010578 +jack77 +fannie1 +270794 +conner12 +151277 +omgomgomg +mullen1 +professor1 +22111979 +pollos +crowley +daddysgurl +26121980 +mikki1 +pepper101 +afbic +tafadzwa +afreen +050894 +iloveyou87 +madden11 +001971 +pigs +qweasdzxc12 +holdon +iloveashle +070993 +03011983 +wales1 +brandt +quan123 +elsie1 +crapule +birdy +17091981 +judyann +317317 +molly14 +iamsocool1 +washington1 +nnenna +himawari +money4life +surfer2 +654321r +izmir35 +murder187 +21091980 +manojkumar +nadroj +03121982 +mustang200 +mariana12 +230394 +mama1 +k654321 +radiology +com123 +mangos1 +3107 +loveyou +122017 +woaini1 +01011961 +qsefth +thailand +margarita +jimmyboy +221076 +flores123 +jealous1 +12041978 +dragon94 +victoria19 +leet1337 +120796 +pantat +javito +250179 +dannie1 +270693 +jordan28 +papoose +123eee +enrica +summer2012 +maverick2 +fam +desertrose +uruguay1 +121315 +amalie +laura23 +hammer01 +612612 +manuel21 +legaspi +maggie16 +torrance +proutprout +martel +orange20 +delicia +41563445 +sexton +120573 +grandchildren +spencer5 +delacruz1 +500060 +redlion +060583 +nika123 +theanswer +samantha69 +villanova +h4ck3r +killaz1 +21102110 +jesse10 +qwerty26 +fountain1 +130177 +!@#$%^&* +basketba +ru4real +skullcandy +110120130 +1sophie +humanoid +14725 + +140277 +happy2day +unclesam +090891 +qwas +fresh13 +vatoloco13 +pookie5 +05101982 +lover19 +9xx7c8gseb +110699 +rangers01 +ibookg4 +angie01 +jessica27 +tiffany6 +198903 +candy24 +boutique +june2010 +qwerty2009 +tony08 +heccrbq +meerkat +triforce1 +efsane +321478965 +130878 +250478 +armyman +rockstar6 +fordfocus1 +2517 +lablab +070807 +070992 +duke3d +chips123 +122016 +kitty99 +junkmail1 +140878 +soccerboy +omsainath +820919 +hardcore88 +eulalia +26011980 +popov +1q3e5t7u9o +197211 +lakehouse +untitled +pimp89 +tawanda +199321 +spaceship1 +forfun1 +cherise +zxcvbn2m +191193 +bella24 +ghghghgh +whiterabbit +19021994 +orange1234 +21011980 +althea1 +14011982 +stuntman +baseball45 +qwedsa123 +driver8 +imposible +dance07 +180295 +dotdot +cobaka +ladybugs1 +julia +pillar +mikey23 +gabbana +vfrcbv123 +longlegs +06091993 +140577 +mckayla1 +bouba +michael94 +160395 +3007 +ready123 +080187 +14011981 +smokey14 +bunny22 +pussy08 +sur +pouetpouet +rey +assassin +boriska +babaloo +qwerty83 +astra123 +rushmore +01101980 +tranny +bandit600 +hea +161989 +241095 +09111989 +050283 +haynes +gotmilk? +adewale1 +auggie1 +010104 +myfriends1 +02091978 +regency +amitabh +buttplug +rastus +barret +mcintosh +354354 +28031982 +020877 +saphira1 +17011983 +sakura13 +chicklet +101100 +vyjujnjxbt +leoleoleo +112567 +needles +04031983 +ashley91 +211078 +johncena7 +260194 +candycane2 +sheltie +jupiter7 +27051980 +260281 +movement1 +1golfer +411045 +220877 +slapshot1 +angela23 +carinho +myhoney1 +shadow123 +30081993 +petrovna +20051997 +roxy21 +mester +samsung23 +231983 +musa123 +koketka +198209 +scissors1 +surx13 +october09 +richboy +hammie +heaven! +amanda89 +lily01 +pete12 +applemac +taylor94 +giggity +lkjhgfd +cocopuffs1 +150881 +29031982 +rodman91 +dragon85 +supported +lax4life +bloodbath +dfymrf +233391 +tiffany23 +philips123 +123qwezxc +king123456 +jack2007 +fowler1 +manuel3 +yesican +198913 +balzac +babyboy8 +ratfink +remi +melanie3 +21081993 +fantastico +mes +zmodem +classof13 +shrooms +210396 +stars7 +boner69 +31101981 +iluvhim +230777 +hophop +q654321 +beatbox +joanna2 +yeayea +butter22 +march06 +fatjoe1 +blues123 +badgirls +calvin23 +maruja +fgtkmcbyrf +031986 +080487 +ashley96 +06051984 +123321r +17111994 +asdfghjkl3 +misia +scotty2 +trista1 +9000 +y3p32ftrqj +0308 +shrestha +sarahi +ksenya +26101994 +190380 +170182 +starship1 +quinten +130994 +mommy02 +pookie21 +hipolito +supersexy1 +zhangjie +quatro +100277 +010893 +trailblazer +nastya1998 +1willie +19011995 +wee +kulot +mulligan1 +060384 +jeeves +massilia +bootymeat1 +robin2 +vvv +zapata1 +bubba15 +sarahj +1233215 +brooklyn +jman123 +13021996 +shorty06 +121268 +10111979 +30041980 +ggunit1 +justin28 +doherty +011987 +okmijnuhb +dickhead12 +200693 +selfish +2legit +fnaf +v1ctoria +mondeo1 +16061980 +rose18 +160181 +billabong7 +playboy07 +fyfrjylf +liverpool08 +!!!!!! +wicked2 +alvarado1 +testaccount +michelle27 +dell13 +azxcvbnm +234wer +iloveyou1234 +bigbig1 +darrin1 +sexymama3 +cole1234 +dctvghbdtn +337337 +ladybug01 +070692 +wannadupe +serega1 +myspace1! +28111992 +asterisk +somewhere +boubou1 +perpignan +241094 +28041982 +lovely17 +fernando +belladog +killer92 +20052008 +thirty3 +fhntv +11021978 +fuckya +dan12345 +siesta +05081981 +katie23 +010995 +papa01 +bubble! +tina13 +041180 +dakota09 +smile6 +primavara +linkin123 +22031980 +5tgbnhy6 +burbank +ddd111 +loving12 +martin16 +sayank +uk7860loans +140695 +qazws1 +081985 +03081982 +maratik +fuck33 +abhi123 +070385 +06061994 +187211 +a1z2e3r4 +michelle33 +marsbar +melanie1 +15101996 +katie07 +170394 +reanna +31081983 +110576 +qwertys +rjpkjdf +compton13 +fred69 +jazz13 +270395 +leprechaun +150377 +power123 +tolik +lorrie +allalone1 +jumping1 +water! +skeleton1 +halcon +everquest2 +azert1 +hotboys +22061980 +123451234512345 +giorgio1 +08111984 +20051995 +27081983 +190493 +farah123 +111111prof_root2.sql.txt:, +26021983 +260793 +081281 +dewey +vorobey +182blink +plokij1 +22071981 +h0ttie +regret +kristen12 +07860786 +chardonnay +silencer +q12we3 +purple94 +cookies22 +cristhian +gotmoney1 +twister2 +calvin +scoot1 +cabbage95 +32503250 +gemini01 +kobra +esperanca +sprite123 +passworld +dawidek1 +12101976 +16031980 +/.: +arrahman +cabral +isreal +500020 +rianne +05111982 +21041980 +stylist +legal1 +kenji +lauriane +030283 +21061981 +vanita +lemon2 +251096 +nathan69 +280293 +ma123123123 +014014 +payatot +lucky123 +schoolsucks +821016 +021179 +youcef +widder +0607 +haohao +vacuum +muffie +05091994 +++ +123454321a +daniel91 +bluenote +buthead +theband +bogus +dthjybxrf +07111983 +mare +butchy +bigcat1 +teamo18 +shoot1 +mavs41 +mm12345 +071292 +afi123 +juan21 +lovelyn +conker1 +katie21 +jenny6 +terminal1 +angel56 +27071982 +kyle23 +fighting1 +ghblehrb +bsd +edward16 +russ +31071994 +powered +rooster2 +publicidad +chopper12 +k111111 +dfktyjr +080980 +bonilla +17091994 +adam1 +fuckyou +dooley1 +garrett12 +genoveva +770770 +011182 +redboy +121255 +rockyou1 +debbie2 +dany123 +happy55 +second1 +kazakov +dolphin1 +network +blue93 +bigdaddy7 +good11 +chaman +sparky +14411441 +mironov +07121982 +goldie12 +westham123 +240594 +123654z +26011981 +bunny10 +silverfish +01051978 +rehjxrf +punk69 +buffalo +apolo13 +valerka +170280 +bianca13 +leszek +jiggy1 +22221111 +chris30 +hayley12 +ihateher1 +faith23 +19061983 +samhain +mahatma +101068 +cupidon +micky123 +blue2000 +19851120 +jasmine24 +gofuckyourself +ooicu812 +hg +andrea20 +howie +070292 +selfish1 +qwerty84 +200595 +joke123 +babyboy18 +200180 +05101993 +corn +tolani +pillows +sasuke7 +slava123 +minakshi +120908 +10111978 +mmmmmm +playboi1 +16081993 +051984 +170780 +iceman21 +351351 +fazer600 +nj9st4ye3f +fatma +robbin +swati +master33 +vega +jmfxl78phe +13011995 +198029 +cm1234 +denise21 +fukyou +hola123456 +carnell +snoopy101 +womanizer +110976 +elmo23 +naruto07 +chablis +yjdsq +aaliyah01 +14111980 +vodolei +1234567qq +gandakoh +alivia1 +concerto +151990 +micheal23 +201303 +joanna12 +rocky07 +20061993 +4shizzle +hershey123 +mp3mp3 +kiki09 +flute +cheer05 +14081982 +120296 +mamani +linda5 +060383 +andrea88 +matrix007 +hall +eastside02 +babykitty +19041981 +brooklyn71 +24041980 +15011980 +kevin12345 +240295 +andy69 +baby78 +bombay1 +envelope +comment +footie +year2008 +glaiza +130379 +tormoz +mariza +fagg0t +aprils +master. +290480 +kasturi +a111222 +dani11 +04061982 +master08 +fish23 +19091994 +shortys1 +28031992 +squad1 +parish +15101979 +february23 +flower24 +belgrano +miyaka +060284 +mullins +asssss +saviour1 +drizzt1 +30091980 +15161718 +suppandi +alegna +cmpunk1 ++ +king4life +nbvehrf +butterfinger +edward18 +fan123 +rfnfcnhjaf +12041977 +applepie2 +cooldude2 +210994 +solidworks +popo00 +cassie5 +idk1234 +040186 +locomotive +rainbow. +1472583 +110119120 +camila +darren12 +24692469 +peewee3 +joejoe2 +maria09 +020695 +anatomia +0000aaaa +printemps +06061995 +platypus1 +kingdom7 +peter13 +rooney123 +4forever +barcelona1 +mediterraneo +090884 +frasier +07011992 +adam2326 +schlampe1 +esercito +rockstar09 +daniel123 +eddie01 +30061980 +martin18 +deadwood +minimo +13011981 +sexy321 +0liver +bigger1 +bobbi1 +23012301 +1418 +kill1234 +shanny1 +marwin +javier10 +dylan22 +keyword +18081994 +11101980 +000000d +100202 +tty +heaven17 +10101970 +tribunal +gladis +schoolboy1 +14201420 +123kdd +123456789abcde +rafinha +135790a +dessert +ilovekelly +livewire1 +09021993 +sheep123 +08061993 +091984 +letmein. +banana99 +jadawera +monster09 +200994 +turtle10 +flavius +chicago11 +20091995 +fatboyslim +marifer +jarek1 +bonita2 +imabeast +1savannah +mybaby01 +bubbagump +cheetah2 +court123 +footloose +220808 +1internet +kitty77 +skank +policeman1 +commrades +bradley7 +nikka1 +life11 +erik12 +kaliman +change09 +19871010 +7thgrade +westbrook +liljohn1 +flashpoint +calderon1 +pornos +lauren88 +lilly7 +09041983 +13061994 +w2w2w2 +spacey +mark16 +boromir +group1 +trigger2 +280793 +keeley1 +talavera +london1234 +mylove. +1111117 +haddock +1um83z +011186 +javier01 +rachel6 +rundmc +12061994 +21021982 +buster77 +tiffany +restinpeace +vikas +cessna1 +doomdoom +197888 +kotopes +teamo16 +270479 +maryam1 +sevilla1 +ivonne1 +harry13 +shawshank +crystal23 +password100 +tarasov +michi123 +blackjack21 +091082 +noah01 +alice2 +latvia +toots +zoom123 +amber101 +wade123 +fuckoff21 +26061996 +forever07 +1932 +552200 +dancer18 +hallihallo +computer23 +kayla9 +briana123 +14091995 +pimenta +28061994 +trinket +eminem14 +hipopotamo +211079 +blacklight +7fxf3jaa7u +eggs +chocol8 +sonic7 +baller44 +coneja +dianadiana +karadeniz +familylove +takayuki +beaufort +tiger44 +livia +serbia +desirae1 +180781 +planta +snickers1 +кирилл +qwerty1987 +ursula1 +vanness +james111 +felix +leoncito +killer123 +hayate +cnhfyybr +j55555 +518888 +see123 +bonnie10 +joesph1 +28051983 +guessit1 +adebayor +neopets10 +141200 +olarewaju +favourite +mama88 +broomfield +manuel14 +patrick08 +holden01 +04081981 +babydoll69 +daboss +babygirls +lampung +thespian +mecca1 +tami +miguel +5633634 +islam123 +ja8xb7txr8 +brunito +28051982 +justme12 +malinda +050881 +bigtimerus +riverview +lizzy12 +champion2 +wisteria +bangla +lovesyou +lilacs +siddhartha +thechamp1 +superman32 +snook1 +master25 +qwerty7890 +essential +girl1234 +coconuts1 +erikas +zoezoe1 +12041979 +lucatoni +arwen +zaq147 +26121993 +may2000 +denise7 +coolie1 +ass666 +iphone4s +paris10 +22091995 +240880 +booboo08 +stiffler +rajinder +andrea99 +shell123 +jaykay +number88 +triplet +131991 +shamar +credit1 +maganda +31011995 +farmall +frontline1 +balla12 +daffy +papercut1 +280479 +150279 +166166 +mondieu +vasanth +2bfree +15111994 +20041995 +180793 +sonumonu +password75 +olaide +31011981 +nomercy1 +25061980 +2night +scooter8 +24031982 +titanic1912 +mango2 +rayan +derrick123 +220278 +spider10 +nutter1 +241278 +11041979 +slimer +albertina +brenda10 +210893 +erica2 +040495 +plants1 +esteem +kittiwake +chula13 +jake24 +yogita +tintin +turtles2 +reinhard +okmnji +luda +wowowee +victory +ncstate1 +03051980 +titititi +joojoo +198906 +coolkid2 +porsiempre +master8 +pink28 +xingxing +tucker13 +02031977 +100976 +dallas4 +lm292979 +butthead12 +080981 +210878 +jonathan9 +abc-123 +dorotka +totito +rusty7 +racecars +airmax95 +golfr32 +parkway +14051405 +johnwayne1 +05011992 +jessica87 +yakamoz +hope22 +09071983 +////// +hulkhogan +minister1 +leslie01 +ja123456 +obvious1 +compaq3 +18031994 +retype +canucks1 +080285 +696 +lambchop1 +291986 +natanael +080908 +tigger20 +sorcerer +3211 +leomessi10 +mike007 +redsky +matt08 +barclays +goaway! +emma2004 +080682 +lal +nana21 +daddie +600015 +thug12 +06031994 +silly12 +vishal123 +sunder +badboy08 +fillmore +chalet +paintball9 +josh06 +sabre +keneth +tiffany14 +longwood +12271227 +vaz2114 +longlive +210578 +versatile +bakabaka +superman89 +schnauzer +keith2 +gracie7 +010103 +sarahm +1horses +kelsey3 +grisette +blueman1 +biteme13 +mamka +cupcake8 +jackster +maldita1 +rick12 +31071981 +15021980 +jessica02 +301279 +123454321q +blood15 +waterman1 +197070 +lovelove +filles +diggler +auto123 +nana16 +scooby +squeak1 +05121982 +giovanny +cody17 +bridgett +fvcnthlfv +lalala5 +arsenal23 +31011982 +masterman +lacrosse7 +crf450r +celtic01 +18061982 +tigger44 +kostroma +14101996 +dutches1 +elijah +doodle123 +15061980 +060580 +cancer12 +o0o0o0o0 +05091981 +090383 +nacional10 +cheese99 +200995 +270881 +church12 +19841024 +manson6 +roxy23 +joshua26 +olivia04 +sasiska +chris96 +fucklove7 +homer12 +dvd123 +21111982 +february21 +555aaa +renato1 +angel1994 +123698745a +060481 +q1a1z1 +jamest +jenya +whale1 +22061995 +february22 +scooter9 +n2deep +playa13 +snapshot +wer234 +love123 +amigas1 +protector +hampster1 +makarena +tulane +237237 +protoss1 +danser +batman89 +airmax1 +loser07 +kendra12 +011001 +daisy08 +princy +speranta +031983 +lindalinda +carol12 +montero1 +29061982 +nar +yanis +bitches5 +06081993 +2134 +masakra +patr1ck +john55 +potter2 +stthomas +scammer +hunter95 +guest1 +kelly23 +pedro13 +09101992 +ben101 +march123 +qwerty79 +balbes +08071982 +150977 +july1989 +sasha21 +lacrimosa1 +08111985 +wqwqwq +intrigue +1597532 +street2 +oogabooga +nathan24 +icecream. +lakshmi1 +devastator +graveyard +chris007 +austin17 +55555m +23041994 +061193 +04011984 +010169 +09123456789 +giulia1 +travis10 +030284 +toggle +spooner1 +drumset +himitsu +bnm +071280 +16091993 +lookingforlove +nunu123 +abella +praisegod1 +christina9 +1080 +electrician +11041996 +gunit5 +yusuf123 +pussyy +socom1 +yesman +taytay3 +taylor25 +24061981 +1441 +gatt +martin15 +metal69 +30051980 +toymachine +pennies +molly1 +cattle1 +founder +zulu +23021979 +1dipset +ou812ou812 +181985 +tigger19 +theking23 +goodie1 +30051994 +trezeguet +19021980 +sydney13 +marie94 +demond1 +gazeta +040684 +campion +08101993 +german123 +2481632 +121195 +kissy1 +mokong +panache +biscotto +perfume1 +bassam +u +storm2 +arnie1 +198905 +120976 +casey5 +snickers5 +08121983 +mima123 +123456: +08051983 +21081995 +caboverde +26121981 +1a1a1a1a1a +motorrad +dominga +hello100 +bradley1 +ra66it +whiteman +oscar14 +maryana +220179 +stjude +123rty +123456asdfgh +capsule +ltybc +handbag +asdqwe12 +fresca +amistad1 +treble99 +cute21 +speedo1 +dave11 +28121981 +thompson +master45 +251989 +271195 +170294 +langston +pwd +indiglo +cologne +050193 +love72 +pretty101 +codydog1 +queen5 +lastchance +360modena +22071980 +hockey29 +123you +keepit100 +sequoia1 +cnhjbntkm +manny2 +cs123456 +yumiko +vivemoi +mckinley1 +cracovia +110477 +070580 +murdock1 +12345678bj +cheerful +1199 +rohan123 +fuckme23 +50cent50 +06061993 +madisyn1 +people. +091281 +01041978 +kathie +fackyou +142 +evilone +connor08 +sassy22 +m00nlight +viking +ginger77 +8484 +07021980 +080684 + + +pigdog +babybird +150594 +lowes48 +221002 +dolphin22 +30091981 +bumhole +jujitsu +empty +bobbyjoe +nigger23 +31071980 +dbnzyxbr +10041995 +lynn21 +131993 +saints2 +250977 +sanket +kristall +profit1 +kaczka +bigdad +zsxdcfvg +daniel86 +muhaha +married07 +251992 +zero0000 +02041994 +05051975 +190981 +karena +famous7 +realdeal1 +villamor +nigga9 +nyasha +tanner3 +blowjobs +babydoll3 +16041994 +1234500 +iloveyoufo +sakura11 +stupidbitc +molly8 +305miami +crunchy1 +090483 +bellydance +07101993 +04041979 +16081982 +190781 +1lovebug +goodguy1 +09031993 +1234567812345678 +20121207 +covenant1 +downunder +bball30 +03111985 +200594 +cashcash +dustin11 +truelove12 +breitling +kamini +221275 +brewer1 +monster15 +snickers11 +160180 +ximena1 +wonders +lkjhgf1 +411018 +e65r82mnj2 +111078 +toosweet +coco101 +snowfall +landon12 +bonzo1 +funtimes1 +327327 +21041995 +orlando! +123abc. +23051981 +render +chachou +chapter1 +cyprus1 +westside10 +07111989 +lakers#1 +13111980 +200396 +07081993 +123456789zxcvbnm +houria +james28 +bailarina +190595 +michelle05 +121212121212 +cr250r +060879 +151991 +golf01 +081108 +destiny05 +26031981 +16081980 +ilovemicha +nano123 +burak123 +chante1 +lun +198429 +dazzle1 +ghbjhbntn +zachary4 +sierra7 +annalyn +19121978 +baranova +19111982 +28041980 +isaiah06 +goomba +banana4 +1scorpio +rafael +angel1996 +bukkake +junior! +09031981 +joker01 +panathinaikos +alouette +lupita123 +160595 +domino +261984 +06062006 +chivas8 +orange18 +fkm +mesha1 +psalm119 +swaminarayan +jamesc +242242 +12191219 +600100 +obama2009 +chosenone +vanessa1 +da1andonly +200193 +280695 +password80 +masood +julia10 +popcorn23 +molly9 +conair +saints09 +mylastfm +consuelo1 +k.ljxrf +wicked12 +nephew +mexico101 +18071982 +dixie12 +spoons1 +xt +misterx +241990 +joint +tamtam1 +knitter +koolaid2 +evgeniy +rinoceronte +overtime +200877 +4554 +tamila +christ2 +fuckyou27 +marie03 +brice +ilove... +nfnmzyrf +abbydog +chester4 +dethklok +141994 +mastiff +star06 +071081 +198827 +sandy4 +desiderio +thunder10 +canibal +papasmurf1 +mahusay +140478 +catherine +27081984 +wabbit +grad2008 +hommer +010395 +davide1 +onspeed +15091981 +11071980 +pandapanda +prajakta +omar11 +dr4g0n +happy17 +15081993 +slovenija +angel911 +рїсђрёрірµс‚ +wumeiyun123 +jag123 +comanche1 +060184 +210778 +aliona +saltlake +210280 +xray +asshole1 +fender5 +09051982 +levi123 +lilman13 +ritchie1 +playboy08 +akinto +purple92 +18071980 +ch1234 +daisy23 +fishing3 +jesse21 +0102030 +grace17 +brooke23 +141295 +261989 +bby123 +22041996 +15091994 +31071993 +ashes +3l3phant +18061981 +ginger88 +ujkjdf +220379 +ruslan009 +samantha07 +makavelli +neznam +biabia +bitch100 +72chevelle +muhtar +021093 +fuckyou55 +imafag1 +17081981 +231196 +mitchell2 +1american +bvb1909 +linette +farmboy1 +scrappy123 +jamajka +090186 +tiana +555151asd +ilove15 +passwd1 +angelika +091989 +nightfire +martinha +ravi1234 +198806 +sasha15 +dennis10 +06081980 +taryn1 +wethebest1 +rollercoaster +260694 +danielle18 +super! +17041981 +tink21 +vaz2108 +poptart2 +playboi +muschi1 +promo1 +snowball11 +md2020 +elaine123 +131193 +040593 +anthrax1 +08011989 +tomtom12 +09041980 +private2 +sigaretta +linkedin1 +dharma1 +okiedokie +walter01 +cancer22 +wolfteam +090994 +culo +070907 +asdfghjkl5 +febuary +karencita +steve11 +turntable +16101995 +sexxi1 +040581 +andrew89 +011187 +16051995 +qazw21123 +isabella5 +19121981 +zahara +broncos07 +29021980 +stringer +080692 +1greenday +jake09 +guitar666 +zzxxccvv +290793 +victoria9 +mataji +iloveme9 +hifive +drums123 +091181 +scooter69 +raksha +30031979 +steelers06 +getpaid +hello777 +qwas123 +andrew28 +ferrari355 +bigdaddy +ghjuhtcc +1437 +09041993 +300777 +playboy9 +myspace29 +xbox3600 +290595 +sab123 +leonhart +maiale +anna2002 +asdert +samba1 +algernon +pimp19 +27061982 +werty7 +bunny23 +260896 +5bhc2v875z +flashy1 +pieisgood +saibaba123 +qwertytrewq +pilot123 +120399 +oldtimer +090995 +lochness +shanae1 +rea +veracruz1 +avanesov +spanky01 +69bitch +asdf +cretino +scrumpy +weed22 +17011995 +dylan08 +24061994 +8x2h4eddan +iloveporn +270595 +bulldog69 +28051993 +libellula +america08 +crystal22 +600002 +411015 +123456zxcvbn +jupiter +johnny14 +240394 +gohabsgo +invu4uraqt +1thing +302017 +martina +jamezerazz +murtaza +mary14 +27081982 +238238 +nixon +mustang5.0 +nightjar +lindsey123 +prowler1 +morgan16 +jacob04 +welcome8 +mommy33 +in2deep +xyz789 +rayray11 +beachboy +finest +michael98 +deuce +nerd123 +hershey12 +max2006 +newlife3 +160676 +jabba1 +underwood1 +palacio +20212021 +140794 +kubicek +19831010 +opeyemi1 +aa12345678 +see +ihatemylife +181986 +bay123 +garnett5 +garcia +juan18 +johncena23 +bobby1234 +140278 +monkey007 +philippa +cowgirl2 +lulubell +felton +qwertyz +linwood +654321c +karlson +vanessa9 +gabby3 +01111983 +14561456 +thornton1 +narcis +scotts +romantika +0174426 +080893 +palma +28101994 +sarajane +nurbek +alyssa6 +19888891 +super22 +69dude +selfmade +knuddel +linden1 +media123 +jogabonito +femme +bonny1 +130478 +carlinha +echoes +bubble5 +syyrrqbe70 +cultura +15081995 +10081995 +300183 +jasonlee +lauren06 +arsenal07 +090285 +lindau +unicorn123 +defcon1 +julietta +savitri +myspace#1 +voodoo2 +150294 +juicebox1 +rajini +lindona +myspace199 +lockheed +liv +13551355 +abcdef. +198026 +vodka123 +dude21 +fuck-off +gulmira +240294 +tree1234 +639374 +airbus380 +0810 +damian2 +271294 +gloria +masseffect +favoured +tigercat1 +pizza22 +sasha1992 +kursant +020594 +bagel1 +vixen1 +qwe058058a +ragini +sandeep123 +snake3 +fatboy7 +29061994 +111119 +raylewis52 +pokemon100 +003003 +jasper5 +babi12 +sexii123 +marinette +bonus +1234 +140777 +3pointer +1470 +grandkids7 +masana +breana1 +fortunate +010895 +anusia +210795 +foxy12 +0321654987 +erikerik +111222333444555 +manga123 +ioana +fishing101 +rayban +perfect123 +akhtar +19091981 +celular1 +231096 +loveumom +15081994 +albacete +energystar +199797 +renee22 +28011982 +luvya2 +26071994 +070684 +26021981 +ilovejessi +sergio2 +lastborn +moritz1 +131292 +24091982 +stevenash1 +7142128 +cheeze1 +babygal +barbarossa +us4ever +23091980 +22132213 +rafael10 +genius +alanalan +cody23 +blahkg321 +tyty123 +199417 +chris31 +cinque +26111993 +orwell1984 +g12345678 +zk.,k.nt,z +livelove +bdfyjdbx +babycute +281991 +babys1 +160694 +fuckbitch1 +tassadar +171094 +secret99 +250694 +klondike1 +melanie +psalm121 +09011983 +isabella01 +holly01 +zombie69 +11051980 +69pussy +mark08 +james04 +198020 +dulce123 +diesel +bethann +myprincess +31101995 +berry12 +jojo16 +19111911 +monkey90 +020277 +noumea +140200 +080983 +pimp05 +letitia +missionary +madison21 +summer1 +mets123 +toocute +olivia09 +12345678x +hannes1 +281078 +1phoenix +3579 +11101981 +machupichu +freetown +198788 +blue31 +eating +27091982 +alamierda +ivan2010 +goodwoman +bulldogs3 +13031995 +famous5 +kelly6 +gangstah +honey17 +23021996 +19861225 +voices +16101980 +anjelika +231094 +mickey88 +models1 +major123 +15261526 +kaila1 +kenzie11 +380006 +27021983 +molly23 +301001 +l1v3rp00l +boss23 +sydney7 +19841016 +19101995 +omg1234 +09051981 +080582 +seabass1 +susieq1 +softball06 +2r97xj3xex +connor04 +19051979 +sunshine66 +billybob12 +ajtajt +consulting +meme22 +25071982 +music +170180 +030580 +eoce59cl9u +dragon98 +brooke07 +111967 +834002 +190680 +2702 +broken! +thatsit +teacher123 +21011981 +usman +27031982 +3345678 +200279 +depression +25212521 +chancho +tecumseh +dance09 +jag +horse11 +dekalb +cybernet +edu123 +250377 +carter10 +tracie1 +abs123 +sophie06 +bird12 +100696 +herbie53 +123jkl +03071981 +stephany1 +givenchy +bobsmith +naruto100 +khan786 +sym_cskill1 +sydney2000 +hotpink2 +smiles12 +corazon123 +lilwayne11 +180001 +dakota02 +sue +hailey05 +melendez +samsung8 +vane123 +babilon +150895 +q1w2e3r4t5y6u7i8o9 +eduardo10 +cj123456 +devilman1 +bogdan1 +oralsex +serenity12 +thurman +raven5 +sex123456 +jordi +candygirl2 +computer21 +kosher +montana3 +23011983 +informatique +agent0 +magicaroma +1250 +jamari +vitamin1 +19011994 +bodyboard +06111989 +hailey07 +judson +hunter97 +2809 +ilovematt2 +dodgers99 +redouane +ilovejess +topnotch +hollywood6 +salmo91 +covert +usa1776 +grapeape +how +jak123 +qqqqq11111 +freddie2 +ricardo13 +alina2010 +121010 +grandmaster +tommy23 +1590753 +1986123 +qwerty888 +arcenciel +dance14 +yamaha7 +manuel15 +27041995 +23121995 +alexsandra +190792 +santiago2 +babygurl6 +schatz +21051996 +dasha1998 +15051979 +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +flanagan +my +chance7 +cameron22 +elaine12 +909 +sasha1991 +oooo0000 +boyzone +28101980 +brandy69 +karkar +88888a +fluffy22 +219219 +411044 +198704 +170495 +198902 +sorry123 +240395 +stapler1 +miska +gr8one +ranran +moocow2 +hello1234 +lakshya +time2play +chevy03 +chikis +sb1234 +4f51eijvif +hennie +claire01 +daddycool +evelyn12 +spade1 +iop123 +pakistan2 +stars11 +225577 +22081993 +05091993 +azkaban +aprilfool +victor14 +latasha +20121995 +andrea06 +whatever +13051981 +layouts. +28071981 +article456 +11091979 +556556 +west23 +jenny4 +100800 +luv2sing +191080 +300780 +char +salade +charlie77 +hotline1 +gandalf1 +kalani1 +sh1thead +080282 +080392 +090492 +snitch +26061994 +playball1 +zerkalo +dawgs +soloman +mario21 +270880 +browny1 +euamojesus +130477 +27101981 +katharina +maharaj +freitas +flatron +kasey123 +mikes1 +ortiz +spooks +221171 +1brenda +123456po +lineman1 +vika1998 +061279 +lainey +147456 +090582 +16071981 +total1 +eclipse3 +2709 +020593 +spo +07081980 +200293 +teamo5 +thelord1 +sheree1 +silver4 +batman16 +gtivr6 +buzzy1 +030378 +leroy123 +shah +juanluis +strokes1 +1chopper +jamais +rudenko +barbie9 +limonade +19977991 +051278 +phones1 +21061980 +bennet +kaylee3 +kianna1 +030593 +1doggy +silver8 +rockstar08 +hotshots +190578 +20121978 +040580 +3113 +sarah09 +austin512 +lawliet +ranger21 +stratovarius +pappa1 +dindon +spania +asdewq123 +150179 + +tambok +molly21 +010481 +tiger100 +bacolod +091986 +freya +moe +sweett +goodpussy1 +261078 +hellgate +reiner +121968 +logans +ruby01 +flyaway1 +030192 +turtle23 +perros1 +bella2008 +blacksun +17061994 +loveme19 +18111981 +roofing +baritone1 +jaycee1 +310894 +14091981 +partyof5 +srinivasan +videogame1 +kitty88 +222222222222 +030694 +justinlove +tia +123pink +gone +richard9 +antonio15 +student +07071995 +070881 +086421 +love1god +zenith1 +03121980 +airbus320 +pax123 +sweater +love80 +140779 +hades +14041995 +654987321 +sticker +michiko +wii123 +barney +hallombn001 +1patches +01092007 +vergil +lbvekmrf +campana +idspispopd +231295 +candice123 +franklin12 +300793 +060881 +microlad +legend12 +minkia +charlie25 +meangirls1 +160979 +26071982 +18091983 +401105 +10081978 +denver123 +sierra10 +11111j +levent +littled1 +sarasa +1232580 +1bella +rossonero +230378 +ulises1 +1bigfish +4097870 +black45 +green12345 +india1947 +april03 +hannah19 +03051995 +rhtdtlrj +cjdthitycndj +goodmother +blackfoot +stocazzo +assmunch +bruno10 +cute09 +korolev +murano +0309 +fresh5 +251295 +4evermore +music24 +roslyn +191180 +090887 +grahm +dallas33 +bibiana +dfasnewa +bigboy09 +1natalie +andreyka +123211 +123045 +sunset123 +mary21 +joseph02 +kalle1 +04101982 +bikers1 +jessem +165432 +100402 +007james +michelle28 +141990 +asdfgh5 +keke13 +260893 +16081994 +sexy96 +takeda +under0ath +studly1 +sugar10 +1597532684 +capricho +biochem +ramesh123 +nicotine +cimbombom +302015 +121110 +brandy22 +obituary +segura +1821 +dragonheart +gunner +jasper! +emmanuel2 +roxydog1 +reynaldo1 +power9 +30091993 +01111984 +takataka +010993 +sopranos1 +regis +schastie +02121994 +tiffany69 +julian07 +gabriel06 +mikes +neguinha +mvp123 +joshy +roadstar +spots +sarala +14031982 +proverka +scott01 +brittany69 +19841023 +12342234 +barrios +eagles14 +pollution +bleble +pete379 +ixrhx2xc87 +quovadis +toomuch1 +151992 +gunner2 +5959 +ingenieria +10121997 +1234567qwerty +19851230 +500049 +wildlife1 +vikings +03061981 +tilley +gthtcnhjqrf +wilcox +serdce +123312 +19841021 +pankaj123 +westpoint +windowsxp1 +nike15 +260578 +02061977 +07111990 +phone12 +20091980 +popcorn9 +stars3 +cb123456 +camilo123 +justine +surrey +oli123 +160380 +11081980 +taylor19 +060809 +awesome4 +21052105 +peterpeter +25091980 +twocats +jelly12 +levente +ronaldo11 +jamesh +airbusa380 +200478 +241194 +sat123 +casada +florentino +af123456 +13111311 +focus123 +superdog1 +280594 +sladkaya +cdj: +sexy!! +bolinhas +12081995 +elvislives +fukyou1 +devante +010980 +mason11 +swanlake +tootie2 +1knight +stuttgart1 +raymonde +jesse4 +tab123 +microsoft2 +icecream123 +charlie04 +lagrange +171980 +lisa21 +jollyroger +121100 +trompette +shaney +candy07 +290882 +dranzer +jamshedpur +kumar1989 +300781 +150578 +1525 +30091982 +phenom +windowsvista +annarella +slniecko +toothpick +grapevine +11081995 +kendall2 +wedding07 +cheng +pit +skate08 +pats12 +stefancelmare +sarah9 +240577 +bff4eva +280779 +zsxdcfv +browncow +dresden1 +fishfish1 +louise! +lauren9 +28021982 +alexsander +190593 +haihai +101003 +jaramillo +03051981 +sempron +230977 +200695 +winter13 +lexusis300 +kickboxer +makayla3 +122333444455555 +nenalinda +speedtouch +disney08 +71717171 +199021 +010879 +peter7 +stockings +corvette2 +blazing +carolina7 +flo123 +13121996 +ildiko +karen11 +1stclass +hehe12 +sossina +sharona +hay123 +robots1 +laruku +portocala +2babygirls +sparky! +cooki3 +girls5 +goodnight1 +tarnay1 +noah1234 +240193 +ahojky +tardis1 +trompete +210777 +simone +gallegos +081986 +aa3030316 +sahil +130777 +gracie10 +lampara +06101993 +airedale +222www +140379 +rodel +offroad1 +mannie1 +04031994 +filbert +121245 +toratora +retard12 +aa12345 +drachen +041985 +jerkin +loveme25 +natalie! +soufiane +25031981 +goon4life +chicken0 +pinkey1 +rangers94 +08011984 +09120912 +heroine +ford99 +t1ffany +11031995 +vijaykumar +pramila +srirama +1q2w3e4r5t6y7u8 +squash1 +marek123 +110276 +honeys1 +dreamer3 +puppyluv1 +241195 +nesakysiu +jenica +augustus1 +chevy06 +booboo99 +280382 +170980 +daisy1234 +230478 +040595 +goldsmith +rigoberto +warior +700020 +96impala +abricot +lorelai +iluvu4eva +04011983 +felicidad1 +kisses5 +borntowin +070778 +sexgod1 +100475 +manutd12 +andres10 +040981 +superdude1 +grandma8 +bitchez1 +00000000001 +06021983 +frankie01 +100575 +thrash +plover +cristina12 +dare123 +slippers1 +25232523 +ricochet +matthew20 +011293 +261990 +1122333 +slowpoke +rfvtgbyhn +oops +041982 +xyq7xcewqk +161983 +261988 +denver12 +10point +chunk1 +28041981 +nissan2 +1234567890o +25091995 +nikita2000 +blessed123 +jamilah +juancito +chronos +july1991 +bourbon1 +deuseamor +job314 +casa12 +cerf +030880 +211989 +iamsam +160593 +sammy06 +ilovelisa1 +marlou +hockey91 +masamasa +kuku +ilovemegan +sofie +freak13 +parisparis +251076 +061984 +orleans1 +michelle26 +08021982 +wasd +08101982 +bigdick123 +020879 +gramma1 +19441944 +06111991 +2520 +714714 +l0v3m3 +amiga1 +987654q +1ballin +nerd +110054 +lucretia +cocoloco1 +misty11 +shannon4 +pugsly +bubbie1 +raymon +071080 +flames12 +becky2 +xiaowei +baby30 +password74 +041080 +oneluv1 +hockey07 +colony +music000 +jb12345 +porsha +199615 +cockroach +400008 +140977 +121500 +klo123 +maggie03 +hassan12 +mysp@ce +chloe05 +30101981 +jackbauer +101007 +raven3 +volcom22 +cuteness +ariel12 +brethart +halcyon +171982 +03041981 +gabbiano +222233 +070683 +25111994 +merlin69 +tunde +isaac12 +jasonx +abc234 +loverman1 +120012 +1478963258 +gaby13 +apples23 +sweetie13 +truelove! +slonce +jessie4 +sweety11 +sweetie4 +290576 +vulcan1 +naufal +090792 +relationship +vfvecz +dope123 +whistle +18211821 +c0mput3r +yeayea1 +december06 +colours +ashly +tampan +jenny17 +020305 +301294 +july1993 +livelaughlove +newshoes +300678 +qwaszx11 +madlen +fizzle1 +100294 +veverka +m3xico +sammie11 +5555555tl +050678 +penny01 +110396 +290980 +motion1 +090883 +forget2 +basil123 +05091980 +pazeamor +bell12 +homesweethome +2442 +ray1234 +250894 +brittany08 +180979 +ds1234 +rhyzza +ferrara +recruitment +hooker2 +purple32 +alyssa +192837465a +gabby01 +daniel29 +broncos +newlife12 +poypoy +gladbach +cagiva +cleo12 +190980 +09061993 +mateo123 +melly +gumdrop1 +oviedo +28041995 +090291 +dublin16 +penthouse +04031984 +jacob101 +cortex +08071984 +wrestling3 +rachel4 +manmanman +liu123456 +lonely2 +ike02banaa +kamikazee +austin18 +thomson1 +080484 +social12 +020184 +senior2009 +omegas +lala09 +09121989 +sasuke14 +travon1 +140678 +18021981 +benjamin5 +12345678as +24021995 +mykids02 +041986 +cross123 +coquin +re-enter +picchio +bulldawg +yfdbufnjh +emily +arbeit +ginger15 +brandi123 +musa123456 +cshrc +school23 +redskins2 +100900 +roofer1 +818818 +10051979 +connie123 +lickit1 +tucker3 +118720 +lilmama10 +250494 +cheer21 +codycody +09071981 +poohbear22 +08081995 +11071979 +chelsea17 +junior04 +ltr450 +summer20 +jgordon24 +sourav +888444 +owned123 +21002100 +27071980 +mahal +bushido +honda02 +caliban +uraura +400089 +fischer1 +128 +z1x2c3v4b5n6 +saprissa +wife +tennis5 +samm +danielle9 +liberal +090580 +buckethead +30041994 +010781 +google01 +londoner +21051979 +nose123 +tevin1 +slayer! +070184 +198414 +alyssa21 +blythe +05111989 +zsexdr +rocker13 +26061981 +dorine +ertyui +soloyo1 +annie01 +pimp34 +nikolaevna +15011981 +walther +palawan +112233s +98766789 +pooch +shadow95 +heather6 +17101979 +poopey1 +kayla8 +kanabis +hellogoodbye +animale +mama25 +tiger20 +tender1 +lovemenow +1victor +dragon56 +worthy +bradly +aiden07 +reaper12 +bilal123 +ilovehim08 +dorsey +sheraton +shaine +marlboro20 +16021980 +2wsx +giants12 +ventilador +beautiful +michelle89 +ginger16 +goodgood1 +aim123 +felony +301277 +cruzazul10 +ivan1991 +252252 +db1234 +holla! +montella +callie2 +savannah11 +demeter +211200 +decembrie +ilove24 +perras +221175 +chinatown1 +a999999999 +pebbles3 +atelier +genius12 +michael95 +sonnyboy1 +peace08 +babyjay +050383 +gudrun +251991 +080791 +19821010 +monkey76 +rednaxela +roulette +tanzen +fam1ly +dennis13 +herring +marseille +travieso1 +fartman +06121992 +1spider +razorblade +kimora1 +18091980 +z23456 +ruby22 +m123098 +emma05 +marcus7 +03031978 +outdoors +greener +javi123 +shorty25 +isabel +31031994 +semsenha +teacup1 +sexybitch9 +holley1 +samiksha +gateway1 +ktnj2010 +.kmxbr +123212321 +lakilaki +genesis01 +newyork +neighbor +140395 +20021979 +ghislain +06091982 +140000 +125412 +211077 +100875 +samantha17 +larded +callie01 +01031977 +kaya +monkmonk +gracie4 +gabriele1 +lucas22 +careful +k11111 +emiliana +alexito +amber09 +benedetto +02061994 +27121995 +travelpack1 +malakai1 +03110311 +111111p +tkachenko +score +brosb4hoes +gucci12 +gamboa +nocturne +teacher3 +759123asd +sing12 +andy10 +kinglove1 +jesica1 +cooler12 +ilovesara +vida +fupyuxta66 +bailey03 +flint +blackops1 +aikman8 +joseph20 +carolina13 +redheads +cookies101 +mazatlan +complex1 +bunny! +13011994 +aaron08 +14011994 +tyler18 +teentitans +israel12 +simbad +meltem +301077 +maryellen +brittany09 +sandrina +loser24 +claudi +jesus99 +456852a +santiago +16081981 +31101994 +05041994 +banjaluka +alessio1 +ovechkin +smalll +silver25 +freelife +hoosiers1 +matth3w +twilight23 +desi +nastya1996 +corrine1 +znirpnl744 +080185 +adana01 +nissan01 +bun +monica14 +kattie +031279 +19011981 +25121978 +444111 +charles13 +02071977 +arshavin23 +130795 +asdf1234 +zombie12 +hope13 +cr +jesaispas +amber1234 +rajan +240595 +lovely25 +080485 +xavier +240179 +291987 +detroit2 +карина +dpetrucco2 +1qaz2wsx +roflrofl +star2000 +h12345678 +daisy1 +rocky9 +1gemini +laureen +marcoantonio +500600 +single7 +sexy35 +loveyou09 +lol1 +aliya +girls101 +jeremiah3 +blackadder +kinshasa +abdoulaye +tuesday2 +1qaz2wsx3edc4rfv5tgb +flight23 +kleenex1 +asmodeus +123.456 +147963258 +020994 +280980 +120600 +iiiiiiii +10091009 +tecate +130395 +april2007 +310594 +160978 +briana2 +09071982 +maksat +britney123 +marcello1 +bubbles24 +simon01 +lucky06 +011291 +erenity +monster0 +villalobos +03111992 +28121995 +190181 +11091980 +141194 +0123698745 +2701 +vanitha +phoenix +morocco1 +ricky11 +animax +myschool +monkey321 +fedex1 +148814 +karina10 +120108 +babou +150794 +03041994 +18051995 +wiseman1 +crazylady +y6p68ftrqj +pumpkin01 +samanta1 +blondie13 +trustingod +flowers11 +truffles1 +awesome. +apoorva +ff123456 +8933959 +natasha7 +123321as +weedhead +thumbs +troll123 +050577 +52xmax +ramayana +bailey15 +199015 +vision123 +amp123 +marley +rosine +lucky111 +aikido1 +vulcano +1jacob +061986 +doug123 +08061982 +cinghiale +nickjonas2 +love214 +dipset7 +merlin2 +deonte1 +tunes +lolo99 +trader1 +random11 +holdem +jimmyd +170881 +600037 +arfarf +lesbian2 +rabbit +korina +06061996 +fuerte +honest3 +johnnyboy1 +mozilla1 +annie11 +njhyflj +14051980 +101196 +0502 +hello!! +i98xb7sxr7 +jetbalance +snoopy88 +17121995 +nathen1 +boobs12 +lucylu1 +100496 +020809 +flavor1 +666666k +scooby6 +180580 +160780 +25282528 +x2x2x2 +volvoxc90 +kartoffel +slavia +thrice1 +19081994 +110695 +020793 +200977 +welcome10 +ping +beagles +jakey +e65r82mpj2 +delosreyes +doeboy1 +charlotte7 +chrystal1 +sean13 +docent +pink91 +moneybag +19811982 +chinonso +lokaloka +17121979 +topina +zxcvbnmasd +rugby15 +george07 +10711071 +180494 +lovekids +noahsark +babyblue7 +watup1 +maggie. +people22 +23061995 +lera123 +passward1 +botbot +lianna +1515151515 +19861025 +6feetunder +eeeee1 +4xebxr653d +121967 +newgame9 +isabella10 +arsenal13 +hahalol +pickwick +klimenko +pokemon15 +sla +james32 +correa +cheating +breton +bonzo +tiger1 +deerslayer +skate666 +henson +money89 +animales +dicky +29111993 +zoology +260995 +americas +puto123 +joker4 +xpeygeh934 +meme23 +hocuspocus +150479 +socute +summer66 +blubber1 +020479 +nigga101 +banana9 +1love4ever +flor123 +picaso +ancient +520521 +25081981 +катюша +13467982 +02041977 +joseph25 +lilweezy1 +bajs123 +john06 +softball. +molly! +redrum187 +deutschlan +shakuntala +karlie +ford11 +sedona1 +newyork09 +130894 +h87va5rtp6 +granat +cane +141983 +faith10 +34416912 +omar10 +alpha7 +slapnuts +010406 +tornade +emolover +nepal +stephen3 +300182 +spirit12 +aku +rebecca! +25081980 +170194 +pincopallino +gratis123 +rachel15 +fresh3 +chevy99 +english12 +gro +barbie. +hello007 +program1 +tingtong +kadence1 +070192 +090783 +beegees +23011995 +hellokitty123 +310379 +hansi +adorable1 +jasonm +prince99 +18071993 +ecko72 +dallas06 +sports22 +yh3hnr4869 +09051980 +britt11 +010594 +nonpayment +190594 +anne +x +170678 +08011983 +sslazio1900 +retlaw +101103 +1322 +2238qwer +alejandra. +symantec +paul23 +same +231991 +19900991 +prospect1 +fatboy23 +villarreal +160678 +rbhgbx +astrology +sam007 +07091983 +311278 +200011 +daniel84 +katelyn2 +hj +love64 +pidoras +anime13 +guns +ns +safe +060980 +20071980 +arm +fraggle1 +teddybear9 +woodlawn +fripon +1qweasd +edward6 +david123 +300578 +sunnydays +scorpions1 +marcus14 +remember! +04111990 +27111981 +aviation1 +310179 +t654321 +dionis +15111993 +3182 +avignon +andrea8 +colt +1unicorn +raiders09 +sergio10 +leslie13 +icehockey +ladyinred +100675 +fernanda12 +kontol1 +tlc123 +010793 +grange +mama16 +lemieux66 +valami +rocky14 +one1one +160808 +woodie1 +190293 +church123 +beanbag +baksik +chevy22 +srisai +141003 +19431943 +brunomars +heather08 +563214789 +kytfy2xd98 +leelee2 +hood123 +pinky09 +220277 +jabari +110178 +jimmyb +gettysburg +hampster +haruna +dinozavr +eybdthcbntn +16candles +anna18 +joel1234 +060582 +loves123 +arcane +0000000001 +hawaii08 +12345qwert +ayyappa +tight +050506 +lombardo +yulia +040182 +syafiq +util +abkbvjy +silverback +brentford +goeagles +24031995 +hollister. +090392 +pounce +04021993 +homeworld +456838 +bannana1 +iuytrewq +654321987 +dragonking +05071981 +564738 +qwerty94 +forsberg +230494 +emily69 +class2013 +buster05 +hood12 +militar +fifty5 +rainbow01 +iloveu17 +cherry +13456 +hichem +misty01 +211984 +550550 +petasse +akinom +panther13 +kittycat3 +askim1 +0608 +voitures +080191 +rajraj +030594 +09121981 +pumpkin1 +papagal +boulevard +mickey28 +hairdresser +dothedew1 +lilwayne7 +250678 +kingofpop +14021975 +privs +280380 +dudinha +01021979 +060981 +antonio14 +210294 +aldo +iloveian +guinea +10101997 +291193 +141984 +250677 +twilight15 +raymond7 +2gether4ev +ypfu2vl856 +jenelyn +bill1989 +roberto +haunted +199898 +dar123 +jellybaby +casper5 +dark11 +08021980 +chrisb2 +3141 +element9 +ashley0 +death11 +x7bktntlez +marche +280495 +aliali1 +a012345 +james55 +1z2x3c4v5b6n +riverdale +291984 +salon1 +babylon5 +201111 +margot1 +goodwife +homegirl +supertramp +kangourou +val353nxhc +serenella +patato +newyork07 +loser44 +199116 +penis7 +070191 +nnn +rayray3 +mariposita +gokussj4 +03081981 +3651118xun +english +sm1234 +zxc123456789 +31101980 +apaaja +123456789zz +aybaybay1 +321321q +metal2 +capetown1 +steelers3 +ybrjkftd +eliezer +darkangel2 +11991199 +25121979 +cool +basket2 +bank +09041981 +hibees +otter +qazwsx23 +forgiveme +renton +chelsea99 +robaczek +bemine1 +football47 +07051982 +197819 +titova +22041995 +sistem +owahodarea +29011994 +27031983 +cooper09 +090192 +21081981 +bassguitar +newport69 +miranda +sokol +19861021 +lovelife7 +vladimirovna +09111985 +281987 +goon12 +steven. +160036 +17051996 +260477 +250293 +master18 +xexeylhf +simsalabim +131295 +jennifer24 +srh420 +kswiss +callie123 +wordpass2 +edd +calais +090184 +yellow07 +12asdf +east1999 +kkkkkkkkk +7373 +simba01 +ilovelove +jennyt +server123 +connect2 +goonie +24031980 +alex66 +jujube +atlanta3 +22111995 +butchie1 +040184 +120597 +516888 +240978 +saufen +daniel85 +perola +poohbear07 +03210321 +trebla +141975 +wqer1314 +scoobydoo3 +bismillah123 +marie27 +toosexy +boomerang1 +happytime +angels23 +toobad +emilys +omsrisairam +oreo22 +allstar5 +091083 +spank1 +coolguy123 +paspas +elijah5 +14011980 +1qwaszx +mardigras +dogma1 +123joe +198805 +asdfgh! +bubbles17 +1234rfv +07051981 +01101979 +191279 +tiggy1 +changa1 +hung +suchitra +rhbcnb +life22 +jaimaa +a456456 +savannah10 +131994 +mojo12 +medellin1 +tunde123 +jeep4x4 +101995 +sis +wicked123 +water1234 +530017 +maver1ck +shalom123 +090680 +18021995 +mindgame +pdiddy1 +carter08 +matisse1 +olivares +ranjith +dancer24 +david03 +johnny8 +grendel1 +clarkson +josesito +product +beckham07 +jaden2 +423423 +image1 +tomdelonge +pepere +231275 +webber1 +19061981 +redriver +sonnensche +alex31 +carolina11 +angelfire1 +rasberry +alligator3 +karina11 +030291 +poppers +aleks1 +harding1 +impreza1 +070484 +alex30 +momanddad2 +blackrock +fuckof +mexico619 +123456er +class12 +aa12345678 +tigger89 +290578 +050284 +198908 +12345656 +vit +charissa +dolphin +240195 +198729 +toby22 +daniel007 +hiphop +001990 +megan69 +biochemistry +210293 +421202 +18121994 +nagesh +freddy01 +hippy +carajo1 +22111994 +angelz1 +kenny11 +joshua28 +asshat +marie. +talia +hayes1 +were123 +babacar +the1nonly +brittany23 +guyssuck +roxy69 +041983 +silly2 +dancer6 +lancers1 +pinky6 +elantra +159263487 +glassman +pink90 +198208 +01012005 +dilshod +showme1 +brescia +290280 +ironman12 +280981 +88552200 +monica5 +21071995 +08051982 +3939 +emily1234 +spacejam +laska1 +atlantis +forever1 +f75s83nqk3 +necaxa +19861001 +duramax +floresta +luv2luv +19071979 +siddhant +190793 +13121978 +06091995 +parvati +lahore1 +rosie01 +140778 +honda93 +0709 +11041982 +lizard12 +250177 +bigd +goldy1 +gold44 +sports13 +texmex +qwas1234 +04111983 +200700 +frog22 +eiffel65 +dolphin6 +413413 +25071981 +130576 +suresh123 +rocky08 +hannah96 +wwd100 +trixie2 +jayant +freshman09 +guevarra +kidman +caitlin123 +liefie +kenny5 +04111984 +03021994 +beatka +alyssa8 +sagitaire +29091981 +elmo69 +erlan +morgan04 +jamesp +yukon +anthon +260179 +jamesbrown +ajtgjm +teabag1 +novanova +1camaro +logan05 +t-mac1 +guster +14031994 +021180 +251982 +antoxa +181079 +260260 +positano +987654321123456789 +savannah1 +weener +27111994 +simo +matthew88 +27031981 +puppy01 +sakartvelo +stickman1 +151982 +chivas1234 +16061995 +08041993 +guessit22 +tima +tiger06 +oscar21 +sop +guimaraes +wulandari +annelies +blackwood +usher8701 +markus123 +chino12 +gideon1 +11121979 +pinetree1 +100606 +010679 +whoopwhoop +ponytail +piedmont +03081994 +allison7 +260979 +mayberry +desirae +texass +wicked69 +clumsy +hubbard1 +01121993 +josue123 +020895 +10171017 +jake2000 +753 +dylan6 +030366 +victoria6 +141992 +capa2008 +tellme1 +051095 +300579 +19941995 +231982 +christop +wocao5201314 +goldmember +kb1234 +jaylon1 +111296 +26061995 +ironfist +jellybean3 +02061978 +jack88 +hosanna +sophia07 +bledsoe +hjcnbckfd +manuel7 +sh1234 +260792 +bqlk8kx79u +159357000 +element69 +aguilas10 +poesia +201989 +champy +becky12 +17111980 +mayann +windsong +raisa +220177 +1winter +littleguy +zxcvbnmasdfghjkl +nasrat +kylee +shree +170281 +nugent +bananas3 +elsalvador +11061994 +020296 +venugopal +punch1 +green777 +400606 +bangor +hotone1 +moneyboy1 +wtfwtf +polpolpol +huxley +dalton123 +101066 +getpaid1 +newborn1 +06081981 +peludo +last123 +careless +larina +funnyguy +mimi09 +021279 +files +07061992 +dragonballgt +swearer +753421 +mjmjmj +baker2 +090393 +harlow +marcy1 +pepperdog +cooper07 +18041995 +23091995 +an123456 +juliajulia +lynnie +zgmfx10a +xenogears +taytay13 +poohbear6 +hemi426 +250395 +knopo4ka +florida10 +gygypyfyyyposhy +houston1 +goosebumps +yanira +ihave4kids +12ab34 +stephen1 +podstava +mikail +2903 +jeffrey7 +28121980 +hejhejhej +28081980 +dalton2 +al1916w +618618 +omglol1 +28091981 +ph0enix +06101983 +munster1 +ab7f23rsv +cavaliers1 +welcome12345 +caitlin12 +250794 +javier +sarah1 +08041982 +friendss +robert05 +yourmom4 +159635741 +love1982 +calvary1 +eminemd12 +stampy +60crip +black. +bigjohn1 +mike28 +prankster1 +qazqaz12 +bassey +gabriel. +muppets +florida! +caitlin2 +080393 +020509 +max100 +roisin +9512357 +tamara12 +firedog +bridie +84131421 +july1988 +limonada +121314a +030793 +111995 +27071995 +bigboy4 +coolkid12 +030282 +brownsuga1 +radish +230695 +1champ +chococat +dinmamma1 +12081996 +lucas3 +pattinson +120776 +2901 +lmnop123 +290180 +nederland1 +chance10 +co2007 +gestapo +041193 +goldleaf +150878 +08091981 +181177 +66chevy +100978 +emoney1 +lillian2 +02041978 +maddie08 +06111988 +barabashka +love1983 +14022008 +dogtown1 +chris2009 +andrew87 +katie17 +ppppppppp +300400 +passion69 +bundy +мамуля +thomas87 +lizzie +pokesmot +strand +remont +brian07 +21051980 +vanessa. +cod +nancydrew +ilovemike2 +project86 +brown23 +031193 +rock14 +110202 +cooper21 +tangos +baxter2 +jenny8 +121175 +gjlfhjr +197328 +bebo12 +20091982 +egipto +maus +311077 +chevelle69 +121971 +farewell +02021974 +geetanjali +1000000000 +400103 +toottoot +199115 +senior12 +mnbvcxz1 +happie +explode +kissarmy +200778 +teamo7 +86248624 +canvas +pimp77 +dragon02 +l0vey0u +clothes1 +adrian18 +sanjar +taylor88 +kobe12 +dawood +califas1 +starlite1 +141296 +21041979 +05121980 +gomez123 +morgan9 +shantell +forever25 +crip60 +01051995 +312 +011279 +angels6 +gracie05 +legioner +q123456 +moiettoi +1888 +scotty +bella123 +050482 +braves11 +qwerty96 +1q3e5t7u +laputa +070491 +warrior13 +131982 +iloveu4eva +generale +angelia +padawan +25051979 +08111988 +130495 +boing747 +branca +q1w2e3 +zzz333 +jesuisla +viva +willy2 +noidea +090481 +imabeast1 +itsover1 +15021979 +nicolette1 +zz123456 +gnomes +kazakhstan +080584 +46466452 +socal1 +jake1 +pelicano +americo +asdfghj12 +sarinka +12041961 +daimler +serginho +jazzy5 +aznpride1 +superman06 +blackice1 +wanda123 +maddie! +element. +gandako1 +power99 +jimmy! +chaise +gtnheirf +opennow1 +03081980 +slim1970 +21091995 +mayra123 +phatty1 +nimitz +pepper00 +legrand +trasher +450450 +l111111 +romeo3 +05111983 +kerry123 +rfpfym +kalamata +27111980 +nascar11 +work4me +14051994 +crazy07 +mainstream +windows7 +nelson11 +777771 +300677 +281984 +temper +gjujlf +24071993 +newmoon2 +dembel +madhu123 +mamana +1skate +inspire1 +080907 +micmac +thomas04 +z000000 +scott3 +01081979 +silverstone +05051979 +sunanda +jasmin13 +3700 +emperador +111111f +brooklyn08 +waikiki +danny8 +pimpin06 +lover +000000o +profesora +moonlite +ladyblue +18091981 +bholenath +awesome5 +170894 +pamela01 +aditya123 +lilchris +c1c2c3 +24011994 +elaina +cherry +lucky#7 +sara10 +fish69 +310793 +football02 +bigmouth +laura3 +ruckus +schatten +robert55 +saraha +chouquette +atkbrc +andrea24 +youare1 +alexsandr +twinss +shay13 +shutter +19841001 +02091979 +jimmy4 +katze1 +panda22 +lovemybaby +skate6 +star05 +buzz123 +060186 +12345678qwe +kanyewest +maciek123 +021194 +money66 +allysa +lucifer6 +depressed1 +june1996 +188888 +katieb +werderbremen +wakacje +tigrotto +160879 +230895 +monkey42 +pipino +siouxsie +22101979 +2times +09071993 +insignia +taterbug1 +tabaco +mylove14 +bia123 +buford1 +1bubble +06011983 +murphy13 +public1 +babygirl87 +gengen +doremon +emmy +booby +19831985 +cintaku1 +420love +02121993 +fire23 +anna2001 +42684268 +150694 +aicha +joseph88 +freaky2 +joyride +03091981 +redhawk +1400 +carson12 +badgirl123 +090681 +031095 +cantik +zsxdcf +passw3rd +michael91 +12qazwsx +fleming1 +gaypride +300594 +02101979 +fuckher2 +likeyou +cbvjyf +yonkers +261261 +daybreak +texas69 +homeland +pink66 +kathryn +cool88 +210281 +337799 +202010 +solar +bronwyn +black +asasas12 +21042104 +jaydon1 +cheryl +rosebud +george9 +berkeley1 +may1996 +emily16 +112233112233 +azerty123 +mallow +030894 +chris29 +moni123 +13051996 +600061 +demolay +teamo22 +canadien +24031994 +nicholas21 +mustang302 +ranger10 +happybirth +15011994 +vanya +pinklove1 +missy6 +jessi123 +29071981 +198824 +020395 +patches1 +++ +frazer +09061994 +1nothing +211001 +issac1 +kaka11 +quidditch +bmw745 +z1x1c1v1 +keynbr +andrew92 +190479 +paragon1 +221991 +licorice1 +erasure +spartacus1 +0805 +03121994 +31031981 +melton +25800 +120675 +lifesucks! +carambar +07091994 +010807 +01021976 +fuckers! +150896 +040478 +ppppp0 +ford1234 +07091993 +hinder +narayanan +hk +16011993 +23011980 +jeremy18 +7753191a +cool16 +amar +tonito +100proof +francisco +031179 +sergik +050695 +8en3dwdxpi +201276 +abi123 +serenity +17021980 +midway1 +sexyboo1 +191277 +jasmine19 +141002 +121073 +24111993 +1nirvana +littleangel +tavolo +slipknot4 +dopey +sanek +4everurs +vanessa18 +1jimmy +richierich +1flowers +dimple1 +ranger +lipgloss2 +coral +050781 +r9e8w7q6 +smith +c0nn0r +10inches +pypsik +chris666 +frenchfry +mine11 +damian13 +135711 +haitian1 +sashaa +fantasy2 +2nqw7a1517 +aitana +charmed12 +andrade1 +panthers08 +18051959 +iamcute +w1w1w1 +198103 +olddog +hotwater +stormy12 +rtyrty +dragonlance +brandy3 +babydaddy +sophie09 +barros +aldrich +ballin8 +300493 +europa1 +chibuike +250477 +nazaret +26031994 +240778 +198021 +nazira +hom +danielle69 +freddy11 +zacarias +4myfamily +diadora +radek1 +01091979 +18111994 +my2cats +1molly +521 +chello +09021983 +haha69 +alisha123 +b11111 +hehehaha +iloveluis1 +there +rosales1 +050484 +1love! +shamus1 +softball44 +altagracia +manofgod +sophia10 +holla2 +bball42 +001992 +19871026 +william05 +150995 +070895 +08081976 +spike22 +80000 +bozena +billy22 +030509 +michel123 +reggie +100896 +198813 +sharada +ilovesex2 +phoebe +purnama +kaylah1 +newengland +bikes1 +198304 +sevens7 +250378 +latina12 +19031996 +gtasanandreas +marie101 +100596 +ummagumma +221166 +nikki! +221094 +jacob02 +cozumel +karime +verochka +fussel +290693 +fktrcfylh1 +1955chevy +herpderp +123boo +ivan1996 +appaloosa +ciccino +noonie1 +001968 +09061980 +superm +010101a +jeremy4 +jenelle +05041980 +stuff123 +feet +24071982 +rockyroad +rutgers1 +hanspeter +mona12 +hoboken +060493 +upyours2 +butterflys +single15 +valentine +chutney +020496 +qq11qq +martin1234 +savitha +12011978 +951 +lmao12 +xkhnmki633 +selmer +police01 +dakotah +mountains1 +bitch26 +020103 +marley13 +goon123 +1590 +lover99 +marine +122015 +cacique +wiggle1 +16091980 +19841123 +marin1 +wawa123 +040509 +1sabrina +lam123 +22121979 +hawkwind +volunteer1 +money1000 +angellove1 +anghel +e12345678 +jackson05 +jomarie +midnight10 +ehlb3c18tw +julianne1 +foreplay +22022202 +winter7 +09061981 +04071993 +270679 +281079 +smile69 +221980 +1985123 +jillybean +ruby13 +english123 +030480 +hashem +babygurl06 +bergamo +willow13 +duece2 +25071995 +198927 +faith21 +tigger04 +aleluia +tomjones +020209 +jesus2011 +jesse22 +2327 +coumba +07111982 +291179 +sunny01 +d-money +attilio +purple420 +delta3 +espejo +090977 +urban +rjhjnrb1 +123rock +jeanine1 +paokara4 +aloalo +dogpound1 +beatit +rfgtkmrf +chris2006 +08071993 +atakan +buick1 +spinoza +margaritka +abidemi +kimbo +dragon84 +140895 +bobble +allin1 +crazygirl2 +carmen22 +2524 +losenord +yyy +101009 +clicker +googly +rangel +acm1pt +beyblade1 +22021978 +jeremy17 +cool25 +rangersfc1 +brandon04 +britt14 +minnie7 +sosa21 +12121976 +oaktree1 +marley7 +nomames +sadiegirl1 +scott22 +rocky99 +arinka +q +17041994 +tiffanie +30051981 +ashley90 +torres10 +sm0key +gobble +anneanne +poprocks +fr1ends +elementary +gfhfpbn +10031978 +0120 +kartina +totoy +vegas702 +amarnath +socool1 +050194 +martynka +joepie +baboon1 +dillon01 +charlie19 +hacienda +dbrnjhjdbx +halo02 +greenday6 +anakaren +080979 +uruguay +parris +love48 +princess78 +sjiecj1a9x +оксана +classroom +sadie13 +jesus00 +19841018 +123443211 +455455 +panacea +juicebox +kissme4 +connor99 +calhoun +050192 +avrill +523698741 +thelegend +rooroo1 +brandon02 +bball31 +woofer1 +proline +sheyla +bosnia +karman +pirulito +merganser +27061994 +badboy14 +pwnage +boxing123 +snowball +iluvgod +vfhbz +231276 +jimmy21 +antwon1 +muchlove +fergus1 +spammer +mygame +volcom! +clarke1 +tiffany4 +landon01 +cfdtkbq +fishing4 +1raymond +mommy03 +dexter13 +rosetta1 +060979 +mary69 +110975 +29051980 +shivji +silver9 +badboy6 +holliday +animefreak +1234567asd +trolls +obama +asdf23 +esoteric +paris01 +831005 +adesola +eat +210179 +family15 +totalwar +care +daddyyankee +music=life +cutiepie9 +laura69 +52hoover +goncalves +tribes +kimak1 +jumpstart +14101995 +annoying +101973 +batman20 +pothead2 +police11 +siempre1 +farter1 +070682 +tonight1 +katie15 +chica12 +lucario +senator1 +virgie +6cctbbk516 +myspace30 +wetpussy69 +bateman +simone2 +benny12 +dakota23 +29011980 +hideki +alba +daniel2008 +david2007 +bubba9 +1sparky +sorrow1 +070384 +olympus1 +nico1234 +1234567890qwer +vidanueva +dutches +kitsune1 +sweetie01 +ponderosa +michael90 +imcool12 +010405 +servant1 +graciela1 +trivial +08071983 +171278 +quackers +011280 +salma1 +230177 +myspace76 +chelsea18 +misamisa +200820082 +yamuna +porshe911 +1stplace +12111994 +marlon123 +blondie101 +sexylegs +gfhjkm777 +noodles2 +ghetto123 +22101996 +lazyboy +whistler1 +p0kem0n +misbah +gravedigger +brennen +madisyn +13324124 +vanna1 +polonia1 +sarina1 +waddle +eagleone +forgot2 +austin101 +dbrfdbrf +zrjdktdf +leelee12 +belle12 +24011983 +monsoon1 +killer93 +cindy13 +545545 +bowwow13 +harley101 +chanel05 +12051979 +huligan +198102 +rfhbyrf +artichoke +shannon8 +02101978 +golfer11 +deadend +amber8 +14111995 +241276 +faithfull +june2000 +sunshine26 +biboune +puta69 +sweeter +01121994 +benzin +busterbrown +angela5 +pirates3 +slipknot01 +nochance +transport1 +martyna1 +kissme7 +122412 +260894 +3tb9xm42xi +edward08 +09101983 +27021981 +maxou +franek +251276 +mark12345 +ktitymrf +mama2000 +tiffany10 +160877 +200576 +vanila +060486 +munnabhai +human1 +love1980 +10061978 +070893 +mutual +230794 +mychemicalromance +rf +flamengo10 +aerdna +ahfywbz +199423 +dalton01 +ambulance1 +patoche +white23 +jenny20 +freckle +melanie7 +odie +ginger06 +london20 +sunset12 +hai +150575 +iloveyou78 +021078 +boomer3 +renee5 +collector +rent +password71 +kimmer +astigako +380013 +vika1995 +lctstens +kakdela +thousand +infierno +121512 +yeswecan +honda6 +work1234 +03091994 +redrum666 +shitface2 +popcorn8 +gangster6 +22081982 +251990 +finnigan +07101981 +panthers3 +liljohn +05041993 +841025 +arihant +kacey1 +d123123 +sivas58 +120200 +gambino +5zgc2t764b +1qaz2wsx +cody101 +jimmy1234 +dance01 +mamatha +duran1 +spooky12 +08111991 +fucker9 +200910 +haywood +26051995 +gjitkyf +kate1234 +fulmine +zerocool1 +bagdad +mustang. +carrick +cats101 +bethesda +tiger! +161277 +181984 +walmart2 +shorty88 +gateway11 +bellsouth1 +morgan. +fantasy +ballsdeep +62626262 +realest1 +040471 +secret101 +oyatayo +numero +rose99 +myspace96 +luiscarlos +sophie4 +125800 +telecom1 +jess01 +031194 +techno123 +screwed +12101995 +06031982 +pantufa +demonhunter +contest +45654565 +boilers +lila123 +bleeding1 +annette +melissa18 +saadia +hartmann +aaron17 +badboyz1 +dancer. +nicole83 +newyear09 +crjhjcnm +19011982 +010577 +261277 +rizal +26101995 +bobert1 +vladislava +teacher +muffin5 +fresh11 +19111980 +nandan +111113 +anja +orca +vergessen1 +djibouti +26121995 +25021978 +199317 +1christina +frederic1 +wwwwwwwww +jayden22 +198106 +fuck89 +vadim123 +anindita +11441144 +randi +iloveyou31 +abigail01 +steaua1 +tina22 +22love +kaliningrad +070392 +cayank +jesse! +120608 +fishhead1 +king06 +killa14 +silverfox1 +tonio +sharon +brenda +wasser123 +santos13 +824553435ss +dildil +august03 +insane2 +100576 +ronald12 +melusine +arancione +riley11 +charliedog +blacky12 +precious11 +republic1 +laksjd +jojoba +tinashe +05011982 +1monica +c0ffee +mooooo +qwqw12 +lollip0p +ravioli +tigger45 +changer +user1234 +24041995 +ronnie3 +110876 +101175 +1donkey +giraffa +munson +shit13 +cvfqkbr +andypandy +160695 +16011981 +sexygal +290494 +6161 +jeremy16 +sammy1 +161278 +1cracker +sunny5 +april1990 +theworld1 +hailey11 +s123456s +herald +stubbs +2131 +vortex1 +irock11 +ballbag +123-456 +polo99 +12101977 +dam123 +cc +capello +omalley +04021981 +1300 +greek +mexico24 +risc +jar +alfredo123 +nannan +water13 +781006 +mickey25 +personale +210195 +howareyou1 +alexandra3 +060676 +caiden +04021982 +050609 +brasileiro +070382 +steph69 +ziggy2 +30041981 +821026 +081980 +annecy +honda500 +jasper99 +hiking +deano +1551 +jesusmary +sweet25 +hamilton +mari1234 +pablo12 +twilight6 +01081994 +proverbs35 +carmelina +allstar23 +7stars +yankees07 +yankees15 +pimp12345 +ionut +zhenyu2012 +06081982 +misericordia +icecream13 +floortje +05021980 +31011993 +123098q +wertyuio +anulka +198024 +fai +221196 +04071980 +unity + +march05 +proverbs1 +240280 +abcdef7 +lovers07 +sabrina01 +19121979 +xavier06 +br00ke +pasuma12 +tillie1 +oceans1 +nenita1 +cheating1 +091983 +ashley86 +1234567123 +4488 +optout +dockers +britt08 +charles22 +lakers +shane11 +lordik +dwayne3 +chris2010 +nelson +shakademous +romeos +300994 +festival1 +m696969 +music25 +love777321777 +vlad1999 +bingo12 +lfytxrf +neverever1 +020808 +hair123 +kicsim +katie08 +chevy11 +159753654 +samsung6 +tinker! +piupiu +ivan11 +2nipples +dick22 +4294967296 +213546 +blood21 +071193 +dangelo +defcon +jaymar +buttbutt1 +560097 +sunshine44 +valerie123 +27071981 +spooky123 +supermax +vfif123 +baby111 +22021979 +success +england1 +general123 +419 +220895 +06121994 +cabana +sherbert1 +marmot +11091994 +feride51 +logan4 +4evermine +figure +fucker01 +michelle99 +181077 +060581 +blade12 +0804 +caldwell1 +012012012 +purple05 +elviss +qazwsx321 +poknat +123pormi +.... +pharaon +georgia1 +zap +helga +18051978 +listen1 +shithole1 +07111988 +fififi +burnside +196767 +071989 +name123 +coolgirl12 +290593 +anakku +010377 +maggie88 +060182 +cancer123 +popcorn10 +krzysiek1 +qscwdv +laffytaffy +school14 +01041979 +210895 +honour +honey9 +03121981 +single14 +iceman3 +15301530 +nick06 +270778 +081278 +reece123 +0password +14061981 +161178 +karina01 +kakaka1 +motorolla +210178 +icecream8 +dancehall +saxofon +frankiero1 +homero1 +cool77 +sexyb1 +janiya1 +starkiller +ryan04 +12091979 +199001 +moustapha +cesar13 +gabriel21 +meli123 +ladyluck1 +cash11 +micro123 +campeon1 +pinky23 +sandrock +010494 +blah13 +blondin +ben123456 +blue04 +051093 +020494 +pinky01 +nokia5320 +sander1 +hahalol1 +masterpiece +ilovemysis +090603 +ronald +vuitton +pisellino +sexygirl15 +ayurveda +rasputin1 +lemieux +d1d2d3d4 +24081981 +28031980 +30121994 +metalika +lilo123 +11111978 +3iverson +famous3 +orlando13 +angel1 +junkjunk +elijah4 +creampuff +199016 +watson831 +frankie1 +monkey85 +yjdbrjd +fh1hm1wl +sidorova +kamryn1 +090286 +191992 +dina123 +05061994 +lady23 +cashman +doll +bignose1 +gorodok +dowitcher +051293 +rangers10 +450000 +nataxa +evaristo +music17 +snowey +smiles! +17041978 +281077 +overkill1 +sexonthebeach +07021994 +baklan +australia1 +michigan +08061981 +masterblaster +link4me +vivek123 +joel13 +foodie +silverio +281985 +080877 +shakira123 +omegared +fltkbyf +robert89 +221990 +198216 +ar123456 +turbine +241982 +040385 +sandesh +bettyboop7 +110897 +241296 +07041982 +fdfd +homie13 +lupetto +011281 +polkovnik +divagirl +ghjcnjkjk +pentium2 +9111 +redgreen +osorio +ed +saunders1 +1compaq +demarcus1 +marlboro2 +scooter23 +cachorra +chris123 +rajeshwari +naruto20 +archimedes +icequeen +lover44 +gayfag1 +duke10 +titanium1 +zul123 +nelson01 +ghostrecon +wanwan +nicholas123 +eastside14 +041094 +hightimes1 +booking +hamtaro1 +1yamaha +asd123 +hayden +51525354 +20031979 +scrooge +mcguire +dale08 +gustav1 +031276 +1234abcd +september12 +triple1 +sundae +andre3 +randymoss1 +qwertyasdfg +william20 +thisismypassword +040382 +chloe22 +31051980 +a252525 +shawty2 +07011983 +frank3 +council +030779 +grad07 +110035 +jenny101 +10081980 +hariharan +tiger86 +14101979 +girl14 +jeremy6 +02051977 +ass111 +marinel +sugar22 +gisella +241093 +963321 +cemetery +autism +intouch +isabella08 +dietrich +110476 +gates +aiman123 +ronnie01 +missme +upiter +01091995 +300394 +papasito1 +courtney8 +pok +hockey31 +gibbon +180578 +cadbury1 +tiger777 +oriyomi +xiaoxin +fifa2005 +milka1 +neopets22 +hitler666 +carlos27 +satan666 +elvis01 +adios +brooklyn21 +0710 +cutiepie09 +20111994 +branko +11121978 +7539510 +1aaron +edwards99 +110177 +lovegirl1 +hihihi12 +120797 +galatea +borracho +ignazio +gsxr1300 +porche911 +180281 +12101979 +camille +19841015 +030493 +fluffy5 +cornflake +manwhore +ccc333 +1916 +dillinger +isabelle +rose17 +07121993 +bhatti +localoca +159357z +holidaysecure123 +qwer13 +ihatey0u +220596 +buddylee +mono123 +1maxwell +181277 +220496 +ghandi +140378 +ability +mcfly +gbjyth +dude10 +07051993 +madeinchina +fuckyou66 +04091983 +31415927 +pelotudo +brittany1 +abcdef6 +scarface5 +arsenio +evgeni +olaolaola +bobsaget +270879 +mazinger +akasha1 +whitecat +korsar +baby100 +bubbly1 +price1 +mariem +301193 +pussy15 +8point +camacho1 +stas123 +lk123456 +sd1234 +access01 +winnie +babe21 +engelchen1 +gogiants +oldspice1 +somebody1 +malmal +welcome1234 +babygurl9 +pas123 +miley15 +slingshot +marie77 +army1234 +020301 +bigdave1 +ricardo7 +annalee +becker1 +210576 +faheem +omoyah1 +hawaii01 +felicidades +fuckthemall +p@ssword1 +birthday12 +elite123 +gutter1 +fuckyou78 +12345699 +volvic +onelove420 +pink45 +drugs1 +12071979 +17011982 +198926 +pirates! +password666 +starts +fumanchu +011183 +shithead69 +moonshadow +080284 +fokker +lachen +qwertya +lol123 +gerard123 +redrock1 +220795 +fermat +toyplanet +couture1 +apfelbaum +newlife2010 +buddy17 +a1b2c3d4 +25202520 +mutley1 +crazy17 +mariajose1 +130778 +fake69 +23081995 +250576 +trouble! +21111994 +26021994 +honeygirl +kontol123 +geometry +beauregard +24051981 +secret1234 +reveal +hallo! +jasmin2 +02061976 +231456 +13051995 +23262326 +luismi +vikings2 +020678 +24071981 +09111982 +90 +120397 +22101995 +scarface11 +juicy12 +teddie1 +kazakova +fluff +coffee! +199113 +280494 +shawn11 +asakapa123 +kinga1 +breakers +number27 +iloveryan! +10021978 +99009900 +118811 +mm744m1 +mittens2 +jkl789 +811010 +amy1234 +anna2007 +300494 +nichols1 +monkeyball +paradise2 +hole +05091982 +hockey28 +miller30 +280993 +pointe +akon12 +zaynmalik +fuck +volvo123 +melody12 +120276 +poopdick1 +250777 +faramir +198815 +07011993 +julia01 +120975 +angelino +dusty12 +bones2 +stella13 +rebenok +120606 +03011993 +hannah77 +1legend +peaches23 +valdivia +tulipa +14081994 +12345678y +pepper24 +reject +kor +sexymom +voldemort1 +25cent +suriname +elbarto +philipp +russia11 +chicken44 +estela1 +199226 +pintura +otis123 +chanel12 +torcida +lucky4me +allstar11 +manuel. +dragon67 +11111r +shine123 +151076 +nikita99 +31101996 +lastpass +dukedog +danielle6 +flower08 +cristofer +capri1 +myself2 +pathology +1234567890w +manny13 +kayak +02021975 +23032303 +269269 +charlotte3 +michael85 +luvya1 +golddigger +gabriel14 +pitbull5 +mixtape +tochukwu +300381 +hailey04 +lesbo1 +elijah09 +voland +120674 +blume +sucks1 +natnat1 +kaulitz89 +taller +jason19 +gohogs +ciara12 +thomas92 +451451 +evelyn123 +whales1 +fergis +041093 +montauk +05111984 +yomama3 +iloverob1 +161991 +stonehenge +05051977 +22081995 +booboobear +ne +nemo11 +02081995 +13111994 +110220 +mememe12 +read +friend11 +99889988 +kevin +goodwill1 +kravchenko +sonika +glorytogod +lynn14 +dmitrij +allison11 +2p76xg2yhv +210977 +arena +lzudz2xe98 +230974 +19021981 +794613258 +altec1 +dedmoroz +fuckoff01 +maracuja +becca12 +superman55 +600092 +cheese24 +789551 +shanon +aprilia1 +1315 +16071994 +symmetry +zzz000 +houston7 +tabbycat1 +fibonacci +puppy8 +morbid1 +tanner13 +60606060 +dottore +toby10 +130776 +warfreak +welding1 +dance8 +imperia +19841212 +swallow1 +victoria22 +beauty +111965 +dogtown +140795 +21121995 +lifesgood +cookie19 +30121980 +josema +srbija1 +moody +123456й +160994 +jeff22 +a212121 +eng +manson69 +280979 +lad +russia123 +pimp55 +drake12 +grad2009 +scarface10 +07041980 +3322 +fastback +spongebob12 ++ +400602 +espana1 +getrdone1 +hate2love +trever +christine0 +060483 +woopwoop +babyjames +1loved +cenicienta +mygod1 +caronte +6uldv8 +201175 +30061995 +youaregay1 +mickey05 +220641 +ashley26 +jazzy7 +jamie14 +iloveyu +softball99 +chingching +filudskou +qpalzm123 +hate13 +wesley2 +monae1 +fdfyufhl +230178 +123456789qwert +25061994 +28021980 +02071996 +wilmington +06091994 +111095 +18101981 +333444555 +stupid6 +magdalene +140994 +221222 +13011982 +18061994 +qazplm123 +230196 +12031996 +imsorry +economic +nelinka +dingbat1 +bombon1 +cazzoduro +steroids +carlisle1 +lazy +shake +senior2008 +17071995 +050677 +miller21 +alexzander +akunamatata +faustina +artem1994 +one2three4 +020309 +londonboy +music99 +72nova +jacob16 +barbie18 +saladin +021980 +bubbles18 +pepper77 +favre04 +joshua27 +pantera69 +playboy. +skittles5 +slaughter1 +angel82 +777vlad +20041996 +lindaa +091985 +alex84 +natasha1 +616616 +922i4ddebm +glen +adrian17 +cheer23 +gujunpyo +08111983 +katarzyna1 +damien12 +maggie1234 +purple96 +yellow45 +040192 +yunusemre +braeden +urmine +2807 +15511551 +honden +italia06 +311078 +070183 +chevys1 +kjhgfdsa +jordan55 +mengmeng +ranger7 +vaquero +trent123 +22031981 +02101993 +darko +coral1 +plague +241983 +19861011 +mikola +100995 +honda10 +rapala +babyboy17 +balderdash +myhero +milamila +kr6sjhs412 +lolsmileyf +toad +010609 +kokolo +101005 +gtnhjczy +01041977 +03021981 +258036 +rem +drinks +baller9 +brandon0 +19932009 +1zachary +seventy +051989 +mamipapi +ca1234 +christopher1 +lettuce1 +fatbastard +1q2w3e4r5t6z +fuckaduck1 +20111995 +@123456 +selassie +24061980 +1toyota +fishface1 +sasha14 +111111g +31081994 +qaz123456789 +cheerio1 +scotland1 +pass_rrewq +christ777 +13091981 +carmen10 +23252325 +17081995 +piter +godisgood +300881 +agness +bandit! +010379 +monique +13041980 +mackdaddy1 +karen01 +superpippo +121264 +emily03 +shane13 +maggie77 +2loveyou +emery1 +12291229 +dannielle +heaven08 +220896 +daniel12 +gotcha! +10041996 +pangitka +trinity6 +chocobo1 +catdaddy1 +babygurl8 +13061978 +180194 +blessme1 +20081981 +buttercup9 +282001 +200395 +peanut88 +santos +genesis +290679 +moskau +123456z +hardware1 +latrell1 +petanque +lacrosse11 +musica2 +sofresh1 +tokunbo +197719 +170779 +hghghg +sabiha +snacks +sasha111 +198318 +winslow1 +hf: +sophie14 +youtube2 +19011980 +louise7 +1bullet +hiphop23 +27071994 +isaiah08 +pf: +sammy17 +happy2011 +powerranger +25051975 +halo21 +tbird1 +larenga +etienne1 +2blueeyes +ronald2 +2hdq6c9azv +pandora +asdf;lkj +jesusrules +fidel +10091994 +hubble +08031981 +dorky1 +vlad1234 +010777 +240878 +031277 +bushman +akeem1 +120203 +pituca +20031994 +penguin8 +abbeyroad +aracely1 +wazup +140495 +maria07 +hotspot +charlie27 +success09 +dinadina +poohbear +isabella11 +perez123 +smiley14 +tolits +florcita +1frankie +satguru +esenin +lollipop13 +pepper06 +aubree +jonson +22101978 +lugnut +zachary13 +050596 +nectar2011 +beyonce12 +barbie6 +david111 +soukaina +050708 +santi1 +love000 +26081980 +cameron99 +4040782as +placement +mexico2010 +vavava +010294 +420high +little11 +2213 +dorita +natalja +toothpick1 +cms123 +sternchen +fire01 +valeria +patou +kerberos +15111978 +skittles4 +michigan12 +nbalive +reddwarf1 +shane3 +29101981 +bubba08 +king666 +06021993 +131983 +pimpin24 +farmgirl +rawr13 +julian +rf: +230278 +asdfghjkl12345 +01121981 +1carmen +olivia03 +reaper2 +1918 +180680 +pupetta +robert26 +adidas21 +dimmuborgir +olympique +pimp100 +boater +090509 +gosling +retsam +annita +gravy1 +mollie01 +sexboy +joe101 +jkmxbr +nexus1 +290396 +mojehaslo +130178 +august02 +botas76 +shipra +23101996 +spencer01 +catdog5 +123456789101 +satan123 +macondo +agostina +starmoon +blackandwhite +ewan +evolve +omega12 +junior00 +elephant5 +18101995 +ilovesos +02081978 +pipetka +brookside +simple11 +matt09 +warrior11 +khattak +011079 +19851012 +drevil +foghorn +gerard2 +ferdinando +master0 +faisal123 +12wq12wq +301195 +1fuckme +rediffmail +appaamma +swampy +gangsta10 +pop101 +cassey1 +redboy1 +snowdog +pinky10 +unloved1 +richard14 +east +26091982 +salami1 +password420 +loader +sadies +miahamm9 +200999 +080384 +260695 +poppop123 +pintoo +19861210 +copeland1 +1a2b3c +26021980 +24081980 +h1h1h1 +1913 +kinjal +ibiza1 +рѕр°с‚р°с€р° +06041994 +19851025 +idonthave1 +08111992 +emma04 +210176 +iloveboobs +brooklyn22 +htlbcrf +mancini +140296 +mexican7 +shawn3 +gohome1 +560084 +heyyou2 +myboo2 +160101 +290381 +destiny14 +urthe1 +taktak +billiejean +94mustang +saints11 +liberty1 +setsuna +121212s +yanayana +hakima +blinky1 +21011995 +gunner11 +shelby500 +solovey +jasper21 +terminator +michelle77 +shiner1 +15951 +03121993 +jaded1 +02041996 +sister5 +jesuschrist +ariana12 +7children +firecracker +sdsadee23 +gman +93mustang +lincoln2 +aiden08 +1234zx +godhelpme1 +jessica77 +q1w2e3r4t +northeast1 +09041994 +dubois +kluivert +wrong1 +m0nst3r +eatshit! +090809 +79ford +132132132 +789012 +jazzy10 +anneliese +14021979 +amin123 +pink86 +daniela13 +naruto55 +honeycoh +silvina +04011982 +dancer88 +ba +chelita +197510 +0109 +limelight +sukanya +coolio! +elfriede +fatman12 +honda +131996 +140594 +angel555 +1miguel +26091995 +molly123 +red222 +1234545 +dolphin! +gjyjxrf +rene12 +13501350 +karatekid1 +040283 +123456787 +sativa1 +love68 +12061979 +freerider +231076 +tubgtn +parazit +jamie22 +krokus +paladin +allgood1 +17031980 +030182 +kelsey10 +frank +25081995 +morgana1 +1326 +player16 +29051982 +ela +powwow +gamers1 +bas123 +manuelita +coondog1 +ulyana +ghghgh1 +jessie23 +krysta +wer138 +alina1995 +raymond +squires +ellabella1 +freedom. +bubbadog +steph22 +010396 +150295 +fresh101 +136479 +bradley3 +071180 +buckie +sandra3 +nemonemo +31101978 +frostbite +donjuan1 +13021994 +thuglove1 +sharkey +success01 +lola10 +dreams12 +++ +fall2008 +baloch +29061995 +cooldog +cocobean +pussy666 +bassline +blastoff +patsy +andra +wasalak +281295 +200694 +billy6 +25302530 +12481248 +chloedog +230778 +777777q +sunnyd1 +caffeine +steve0 +220294 +taitai +lagata +liverpool01 +nokia8210 +0409 +31122009 +010678 +puppies4 +30071982 +06021980 +djtiesto +rivendell +mark09 +198699 +10021996 +pnufsci218 +laura14 +dodgers123 +floricienta +515051 +136900 +wildwest +02061975 +210995 +severina +angel1992 +gogreen1 +tristan3 +nicky12 +family03 +thunder21 +princesa2 +284655 +201986 +jawa350 +300695 +basketball22 +glenn123 +noadmin +n.kmgfy +ashly1 +bosna1 +bitchass2 +29031994 +050509 +hackme +nermin +30051995 +4201 +pass00 +vicky12 +151295 +demonyo +justin97 +babebabe +megaman12 +112007 +ole +sosweet +indya123d +anteater +star100 +234589 +queen7 +gtnhjdyf +vinny123 +sunburst +784533 +cool33 +will23 +housewife +illegal +carson123 +rhfcyjzhcr +grandslam +maxito +killie +sreedevi +dallas14 +md1234 +breakfast1 +threegirls +janela +phillip +jacob03 +tacobell12 +puppup +boonie +gor +04081979 +lewis12 +13111993 +030980 +nympho +201308 +gwadada +password41 +123456789asdf +3q2w3e4r3t +102288 +purple29 +stratocast +ichbin +anal69 +jason05 +2016 +account123 +dani3l +061079 +walkitout1 +tango2 +waterlily +milla +corona2 +diesel2 +gangster11 +amoree +3odi55ngxb +carolina5 +twins08 +kaden +111275 +2gangsta +hannan +29101980 +adam07 +06031993 +lavidaloca +sniper2 +riley7 +16111981 +money007 +yukiko +odysseus +frankenstein +harsh +g123098 +fitter +ninja101 +bubbl3s +parade +minty1 +noah11 +myzoosk +alec +hotmail3 +kytfy2xd97 +19031995 +libra10 +021989 +spiderweb +suleiman +12031997 +waiting4u +deusex +repent +alabama3 +110496 +tennis4 +iceicebaby +alyssia +27041981 +lizeth1 +123456jk +150577 +08061994 +konstantin +rose69 +1outlaw +amelia12 +callan +luk +lee1993 +buttons123 +jack2006 +110999 +happy. +111076 +darvin +189189 +lotus7 +kovaleva +25121994 +chevron +120775 +google9 +kenzie123 +marina22 +180993 +bitch27 +mama07 +badass23 +pumpum +merced209 +green28 +160679 +dogstar +04051994 +123qwe4 +emmie1 +02111981 +gena +bhabycoh +montez +20051977 +123456rr +111111a +loveyou143 +wwe4life +pornporn +13151315 +dane +benedict1 +martin07 +sweetpie +bunny4 +nene15 +6grandkids +princess85 +123456am +19821984 +discreet +pink96 +cholo +carter4 +sidney +sender +villeneuve +applejacks +zoedog +3355 +niclas +bigdick9 +030495 +eugene2 +mahaveer +11081978 +14061980 +shisha +23111979 +brandon88 +click123 +brianna! +050281 +crabby1 +jelly2 +davenport1 +chocolate11 +arc +martins1 +ram2500 +221993 +kelvin123 +1snowman +grace4 +bananarama +florida01 +everlastin +blakey +020192 +wol +jayasree +oliver14 +11341134 +hermes1 +pavlenko +010277 +lovesexy +to +19841011 +lovehurts3 +peanut03 +31081981 +payaso13 +joseph03 +spongebob +angely +renesmee +aaron09 +loser00 +16051996 +aristo +volley12 +montydog +thierry1 +monkey12 +bulldog +101298 +1358 +ashu +ayushi +norman123 +theone12 +201007 +priceless1 +loco22 +030595 +ceres +20021978 +090493 +1bigpimp +tijger3417 +banana6 +dream5 +punk01 +rachel9 +giants123 +120673 +dbrf +180195 +bighead2 +280898 +1qw21qw2 +halfmoon +taylor33 +130296 +badoo.com +richard. +double7 +yay123 +laketahoe +cookie55 +29031981 +mayotte +vivivi +woodward1 +2bananas +northwood +gemgem +suzuki1000 +4yfb2s753d +19051977 +ayman2008 +121201 +hecfkrf +lotusnotes +abril +czz000000 +hazard1 +198002 +mightymouse +010173 +05111981 +10021977 +playstation1 +jedidiah +simone11 +199614 +soufeliz +georgiy +mooney1 +jumpstyle +kerri1 +darknes +fylhttdf +layouts123 +g76u94prm4 +13031996 +surfboard1 +270379 +12121974 +230396 +silva123 +balla3 +qq112233 +katinas +16061978 +260496 +cowboy5 +pinklover +19021996 +ch123456 +ghgh +wicca1 +friend +18031995 +martin88 +deedeedee1 +01031976 +07101982 +ricky7 +trustno2 +poop55 +notime +gg1234 +25111978 +secret10 +18101980 +malia1 +shinedown +10051978 +11081976 +13541354 +123258789 +king360 +knight2 +darius12 +love2sing +15041978 +3password +houston +preston123 +vball11 +assass2 +25041981 +02041995 +daniel0 +funkymonkey +kaylynn1 +salamon +kelsey +55555d +ghjcnjqgfhjkm +14111993 +bungee +04081994 +jebise +outcast1 +1cheyenne +killed +shadow87 +03101993 +payroll +zxcv1234 +hppavilion +bongos +2907 +gigino +gohard1 +november05 +coyotes +5monkeys +qwertyuio9 +barrie +brooklyn1 +qq000000 +fantasy12 +flint1 +1momma +hotboy5 +t4_us3r +fordham +290894 +dean12 +12inches +07061982 +chakkara +1010110 +23091981 +adivina +gamess +fishbone1 +angel1990 +lovebug22 +a1sauce +king007 +090880 +lokote13 +153045 +genie +wapwap +bloemen +12345ss +suzuki125 +260794 +princesa +sandgrouse +joints +jeremy15 +isabella4 +010607 +warface +2babyboys +bipolar +alltel1 +yellow44 +041178 +141196 +twilight16 +love1999 +socorro1 +fktdnbyf +viktori +trinity07 +yogurt1 +cupcake9 +linda3 +paris3 +sisi +19861012 +america6 +motita +porcodio1 +100876 +a12344321 +stgeorge +haterz +tetete +seba123 +1fireman +trinity11 +sony11 +mama2008 +889977 +cody16 +music77 +rodney2 +101205 +12891289 +vollyball1 +brown11 +elemental1 +afridi +110057 +zodiak +eleazar +noodles123 +1s2s3s +daili123com +effect +regina12 +victoria14 +red007 +keshia1 +trying +polymer +virtus +milind +jewel123 +poohbear8 +brianna07 +paramore! +amani1 +dani10 +16101994 +wolfenstein +jenny18 +bernardino +anarchist +13021978 +270894 +solitaria +kanye1 +britt09 +martin4 +bubbles88 +literature +wizkhalifa +aceraspire +sherin +ginger00 +insomnia1 +23011994 +pieface +081093 +ghetto12 +freeuser +198107 +brett4 +14111978 +nosoup4u +12e3e456 +andrew97 +monsieur +treeman +larrys +cool18 +sunshine28 +chewy2 +love831 +guero1 +an +ciara2 +evgenij +crips6 +45124512 +inform +disciple1 +kelly14 +112111 +15161516 +04091981 +112911 +olubunmi +yukiyuki +523 +180894 +sexyboy13 +11111977 +antara +babajaga +elvin +nokian80 +honda04 +120598 +261194 +09041982 +popeye123 +31011980 +hutchins +palestina +kikou +jin123 +791010 +gal220 +sunnys +w2e3r4 +19841026 +hammy123 +marsh1 +theonlyone +sexual69 +rosanna1 +030895 +soleil12 +kingarthur +andyouone +19031979 +coolcats +wanjiku +macey1 +lloyd123 +16111980 +600053 +19841986 +bobby! +skate01 +gagoako +210877 +13041995 +hector2 +teller +samsung4 +anna17 +niger1 +strikers ++ +564321 +daddyyanke +tinamarie +azalia +260779 +bonaparte +resident4 +nascar01 +110026 +ukulele +lost4ever +green321 +jeff13 +17041995 +texaco +norcal +jukebox1 +gfhjkmrf +richard6 +kisses7 +thumper123 +sussex +dirty30 +181194 +01111982 +400012 +polilla +199105 +mineonly +maintenance +star87 +hardcore. +3bears +ty123456 +24021980 +so +jayden02 +hanako +volimte1 +partridge +cloud99 +ball1n +141982 +starlet1 +bulldog22 +dylan03 +nhoemnhieu +micha3l +051277 +tennis09 +apples +cynthia12 +120699 +290978 +26041980 +iluvyou! +muaythai1 +dupadupa1 +huracan +yummie +01011964 +jonathan08 +polska2 +911007 +05071994 +buknoy +urchin +oconnor +peaches1 +11112011 +janiyah1 +birdbird +bigshot +takishima +vlasov +xuanxuan +interiors +truelove7 +raven6 +anshuman +000021 +knight11 +faith06 +qwe123rty456 +marita1 +promotion1 +life13 +bible123 +thundercats +megan21 +bigtits69 +1235689 +rubicon1 +trudy1 +14121978 +shadmoss1 +bundeswehr +040579 +sarah8 +crazygurl1 +pussycat2 +141095 +cantona07 +08111989 +clones +sarah +oliver07 +conflict +thales +luna01 +danyelle +george. +prudence1 +samuel21 +lilmama11 +050293 +bonneville +260895 +usharani +barrington +668668 +28081981 +131177 +michelle30 +woohoo! +thisisgay +alexis1234 +13666 +28071994 +c0urtney +r5gnqyrr +wembley +peanut17 +dreamworld +01091978 +change08 +123king +260279 +sarah88 +saralee +18121996 +kelantan +beerme +sexii12 +dogboy1 +horace1 +christine8 +acmilan1899 +sandy10 +harley24 +xk45xdxcyr +danny09 +patrick07 +master07 +braceface1 +boylover1 +28051994 +mistydog +krish +27011982 +douglas12 +091081 +cupcakes12 +fucku21 +amanda101 +killer98 +july1985 +16121979 +08121981 +kitkat11 +flor +studentka +dennys +myspace85 +zayzay +sherzod +appelsap +pooping1 +bentley2 +7001850 +200220 +031195 +yahoo12345 +riley07 +hakkinen +braves12 +love1234 +green32 +singer2 +lovelove3 +wildcats14 +diva23 +17071977 +080895 +struppi +alejandra +12081979 +sister4 +dustin3 +ihateyou22 +thomas98 +freitag +010172 +g86u94psn5 +159753159 +021295 +lupita13 +fun4all +carlos! +11101978 +werock! +1236987450 +mo +kondom +0902 +prince14 +fevral +blackveilb +1422 +nadiya ++ +19881010 +cycling +lovehurt +6323463 +hacked123 +hunting123 +230808 +bella9 +1wifey +trieste +angel1993 +galindo +220194 +lissette1 +baseball04 +redneck7 +ilove18 +sca +080380 +111197 +tom12345 +ilovelee +qazwsx! +justice4 +raccoon1 +gunot1 +010208 +gfhjkm11 +notengo +cacaboudin +rke: +vika1997 +teddybear! +hip +kel123 +lynn10 +ginger17 +minnie10 +flavour +ferarri +millie11 +lala16 +mmmmmmm1 +snoopy77 +vampire! +sundrop +loveme77 +7896 +punkrock10 +alternativa +democrat +xxx007 +13071995 +1212345 +allen13 +people7 +bear1 +july1983 +marco13 +cessna152 +clarkkent1 +x100pre +18081981 +samuel100 +truskawka +ysabel +hardhead +190893 +heather. +2527 +10002000 +260577 +corona69 +161177 +barfield13 +ashlee12 +12111979 +slainte +check12 +vallejo1 +troubled1 +adam06 +09051993 +fosho1 +199310 +misiu1 +nursery +boyz +butter01 +harimau +kabuto +pepper15 +lmao +basketball123 +zardoz +beast13 +060293 +23031980 +trustno1 +alekseev +pepite +140978 +july1984 +iseeyou2 +stanger +080283 +rachel99 +dr1234 +february20 +marvellous +vitor +victoria123 +12wqasxz +12101978 +121224 +18011980 +space1999 +ninja6 +sinsin +fakename +castanha1 +kancil +111096 +martinez2 +benjamin4 +akamaru +1tattoo +leeroy1 +mario6 +dreams. +170595 +papino +mexican14 +sundaram +trustno +atljhjdf +rosso +meetme +221095 +jackass22 +victor15 +finn +poilkjmnb +matamata +19861028 +hello18 +160578 +ferris1 +tony88 +04021994 +15101978 +16021996 +missy69 +homegrown +eatpussy69 +15081977 +evildead1 +acb123 +diogenes +talented +nirvana69 +cheeko +gotenks1 +chapin1 +aaliyah5 +deagle +121212m +dragon34 +cracker123 +sugarpie1 +greenday14 +brooklyn07 +qweasd +commerce1 +pastry +dobber +cows123 +06091980 +chihiro +tati123 +brillo +gary1234 +huanhuan +aaron18 +bronx718 +southside0 +flower88 +naynay123 +hawaii7 +jasmine02 +12071996 +2325 +tuwo4u9 +1piece +143iloveyo +280794 +cabrones +monkey31 +jhonny1 +mondragon +unicorn12 +sunflower5 +123456789zzz +chunchun +sj811212 +bananna +0402 +sexisfun +allaha +aikman08 +segura88 +101108 +hanifa +magelang +cena619 +jess23 +050493 +08051993 +190695 +eltoro +joking1 +tampon +tecnologia +winkle +6666666666empulgara +180495 +mario9 +alo123 +anime4ever +smriti +wow12345 +fuckoff23 +aurelie +mikesch +alive +25121977 +bmxbmx +280194 +199710 +150277 +japorms +07091981 +kasper123 +faye +010295 +qweqwe11 +brayan1 +1234567897 +space3 ++ +119 +xiaoyao +19911992 +sassafras +nurudeen +26111994 +valeron +2bon2b +160279 +redsox! +baby98 +camera12 +diosteama +blink1234 +brianna14 +garth +1christmas +maricon1 +skins1 +welcome@123 +27021982 +101972 +chivas22 +0704 +player! +sallie1 +kool1234 +carolina3 +172737 +eminem6 +chan123 +memememe1 +angels. +fakepage1 +lineup1 +farkas +walid +25101978 +angel83 +kapoor +himani +26081994 +170895 +surfer123 +swordfis +aksaray +freewill +dancer +120303 +cool00 +0077 +grace +varela +keparat +trade +rtyuio +fisioterapia +bullets1 +smile8 +elshadai +vika1994 +gameboy2 +hundred +poop77 +gas +my4babies +slayer11 +liver1 +win2000 +goodluck123 +301278 +parkside1 +abdulaziz +balaton +comandante +loveme99 +11031996 +lucio +trompeta +19851218 +stefania1 +sasuke23 +071987 + +198809 +friend7 +magnet1 +mikey22 +161294 +29071980 +playful +15121978 +arthur01 +garry1 +tester12 +changa +020208 +badboy9 +banana8 +ind +bluered +homosexual +garcia2 +05091979 +alihan +giveme +rebelde6 +klasse +shannon10 +n00dles +02081974 +carbone +winner +198826 +slick123 +22022002 +canada10 +little +bigsister1 +maybach +hunter28 +guera1 +mandar +midnight4 +010677 +sandra21 +19899891 +singer12 +joven +britty1 +mikolaj1 +fifa2007 +orange09 +laurab +sierra3 +clo +ybyjxrf +fuckme21 +bagong +judy123 +jason101 +blake01 +freefree1 +mahalkita2 +corsa1 +230373 +mike32 +love123 +14081980 +16021981 +husain +190579 +19861111 +canada99 +12monkey +stupidgirl +010495 +cooper4 +jojo09 +coochie +katydid +cupcake01 +qwertzu1 +301093 +dallastx +andrea19 +cateyes +bubba16 +maremare +beauty11 +432432 +630630 +frusciante +w2e3r4t5 +sailaja +20011978 +augsburg +1213456 +atenea +sacha1 +lama +rootbeer2 +blackmoon +football38 +1234321a +427cobra +diva22 +030409 +271988 +020595 +angels8 +moomoo3 +nichole3 +1428 +miramira +19081981 +bball9 +prometeo +958506 +sandra15 +metal13 +dolphine +sumner +riddhi +dash +ytrhjvfyn +kisses11 +0509 +rip123 +amc123 +174174 +hotmail +qwert55 +kitten10 +ashley33 +lizard123 +kisses22 +26031996 +mudkip +040293 +280780 +130277 +mobila +mylife3 +y0mama +suka +chucky123 +alleniverson +joker18 +steve-o +23021978 +09061995 +trippy +pussy07 +06061978 +nova123 +lfplhfgthvf +snowflakes +19101980 +towanda +s000000 +diva14 +tw1l1ght +050995 +24021981 +chuy123 +170478 +260178 +alex100 +lancome +maribeth +2monkey +happy2be +srilanka1 +eybdth +patrick24 +3zibuvmrx6 +finch +grace777 +wwe1234 +abracadabr +230377 +fauzan +131275 +240379 +07121981 +cristina +081179 +oleg1995 +watermelon1 +ellamae +rellik +littlebit2 +mateuszek +bitchnigga +connor5 +multipla +asdflkj +anarquia +190577 +michael96 +04111980 +18061979 +checker1 +teddy22 +fuckthissh +suburban1 +rocknroll2 +iloveanna1 +casper14 +hardy123 +poohbear9 +100700 +841023 +catchme +gonoles +tou +vote4pedro +backoff1 +osman123 +1goodgirl +vencedor +311095 +131176 +ashford +06101994 +gatonegro +pookie14 +salvaje +avelino +orchard1 +paterson1 +cholo123 +bodyshop +11111l +willi1 +redbull2 +terorist +07081981 +july1994 +181295 +10121977 +15061979 +--+ +magic01 +171178 +199102 +040806 +emily18 +burton12 +280279 +trell1 +missy23 +boopie +gznybwf +harddick +080596 +monique5 +1234678 +102103 +261295 +12340000 +2simple +spawn666 +johnson1 +headstrong +cuppycake1 +21111993 +reborn1 +algebra2 +080193 +icecream22 +cowboys4 +maluca +chris98 +12345665 +010204 +vulkan +888889 +lia123 +grind1 +16121612 +cathie +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +parrotlet +dinosaurs +harrypotter +271989 +slickrick +010595 +liu123 +hunnie1 +animals12 +maples +16041980 +determined +ранетки +dokken +020379 +7550055 +lkj123 +superbike +katie1234 +password52 +05031980 +258123 +ichbincool +jesse23 +buffy12 +240478 +sonnenblume +flaquito +searcher +mahindra +dupa666 +lol123456789 +deep123 +sophie21 +26031980 +angrybirds +lesbo +cobras1 +angela15 +200805 +kimberly10 +skate21 +dan1elle +darkshadow +drago1 +allison1 +123456789lol +steinway +07011982 +271079 +simba7 +100908 +25061981 +carolina01 +bianca11 +ryan25 +261293 +impression +170707 +rose08 +060992 +4123 +lll123 +lovestar +miguel18 +400094 +malditah +16051981 +180694 +daddio +crazy24 +dakota03 +maxie123 +250396 +nancy2 +sofija +19861214 +qwerty95 +ihateme +19221922 +carrie123 +titanic123 +13091995 +010795 +070878 +qwertasd +aq1234 +jeff23 +08021995 +airwalk1 +adidas +jgthfnjh +tyler98 +1californi +damian01 +krysta1 +13245 +199505 +kraftwerk +291194 +vissen +fatdog1 +basbas +pascua +2bfiy28byl +uzbekistan + +disney! +houston5 +tigger68 +mizpah +dmband +4horses +nok +pixiedust1 +246855 +bears12 +draken +golosa +020507 +iceman7 +199323 +brandon03 +orange08 +charlie33 +corvette +zzz777 +lesbiana +230496 +89chevy +16111994 +santana2 +olinda +mama77 +pepsi01 +07041994 +shotta1 +15041979 +12589 +drift +190505 +12071977 +raiders07 +lolote +25082508 +jazzy08 +120707 +andrew95 +0301 +paxton1 +password.. +bigcountry +skull123 +270695 +lehman +rjrfrjkf +modern1 +19861026 +seetha +2580123 +kelly21 +24112411 +13thirteen +tristan1 +captain +harleyd1 +dolphin69 +michael1 +kitten6 +281277 +shaner +tristan12 +renee01 +puttputt +parker09 +fuckoff +baller! +tampico +260394 +cpt310 +alisia +anil123 +05041982 +celine +230677 +nagasaki +carl0s +legoman1 +prince08 +aleksik +hernando +07021995 +roddick +murena +motorsport +gogetter +germany2 +0906 +google21 +120404 +mygirl2 +montego +anthony33 +10101976 +tenchu +jackandjill +25071993 +babygirls2 +1rocky +alexis. +karavan +2a2a2a +persian1 +!qazzaq1 +harpoon +27061980 +amonra +zadrot +270194 +zipzip +hfccdtn +190180 +german +230876 +angels77 +131276 +mark24 +198877 +crazylady1 +chinwe +020577 +01031979 +salvador12 +080480 +yankee123 +peppy +221174 +taylor1 +remrem +04091982 +09071994 +thomas95 +23051996 +198719871987 +gabe12 +balou +muffdiver +lilita +731731 +batmonh +198217 +aiden2 +smokey08 +bhuvana +peanut02 +ahjkjdf +cheyenne7 +1strawberr +10011979 +040594 +damage1 +airborne82 +tgtgtg +29071994 +poop88 +romo09 +10102008 +toystory2 +i<:3you +shirley +password35 +14041977 +24011981 +23071979 +вероника +09061982 +irule123 +chris44 +260595 +maya1234 +alex1976 +aquinas +130697 +shorty. +america17 +saved +regan1 +chuchi1 +nedved11 +tinka +nathan. +elizabeth12 +trabajo1 +silvana1 +mailme +292513 +jill123 +lz110110 +ilovejen +natalie10 +160606 +963741852 +delta7 +569874123 +money56 +walhalla +020180 +250277 +solecito +mambo1 +1kayla +asdfjkl123 +interdit +abbaabba +polkadots +calvin11 +flowers +enfermagem +160478 +esponja +markov +pikmin +kikiki1 +500011 +12021977 +fullerton +rebel9 +621621 +safrane +airforce1 +dontae1 +morgan00 +04031980 +231075 +habitat1 +spencer11 +mnbmnb +vincent5 +emi123 +horse5 +tree11 +shadow03 +mati123 +andrew96 +steph01 +juvenile1 +lemonlime1 +fifty +20062009 +181193 +23212321 +loveyou01 +sammi123 +02091977 +olivia23 +2500hd +idon'tknow +daniela. +missy4 +shawn13 +180576 +bryan11 +fucker23 +maverick7 +love411 +lynn23 +obi4amte +langer +04091980 +andy14 +override +brittany20 +angeldevil +19831120 +170295 +susie123 +24011993 +kristen7 +dancers1 +relation +abby07 +ajedrez +david30 +26051980 +pavlina +cherry07 +bucks +bunny8 +clutch1 +040496 +default05 +andy15 +fanatik +toohot1 +elephant +ilovejim +salma123 +increase +260993 +theron +newyork6 +brooke09 +23041979 +paradise +cricket +turkish1 +b43n6whifd +alejandro5 +tahira +sweety3 +21121979 +essendon1 +sydney3 +snowman3 +t111111 +193755 +tiny13 +hpotter +198914 +200666 +31133113 +carton +sexygirl7 +akira123 +shitass +macca1 +badtrip +kevin25 +13021981 +270195 +play4fun +6flags +gendarme +whatitdo +offthewall +motherfucker1 +iloveme15 +vegetable +500007 +paracetamol +cutie4life +bobbi +jovan1 +redblood +14081996 +krishnaa +h00ters +140578 +powermax +sammie3 +010306 +nevergiveu +hoping +shitter +babycakes! +charles23 +vixen +120809 +biteme22 +chicago13 +dave01 +grace10 +tits69 +toogood +hack123 +peanut18 +pagan1 +polkaudio1 +2125 +270478 +scorpian +ilovejimmy +qwe098 +bigears +karen10 +yes90125 +karito +fight123 +fever +nanny123 + +derbeder +creature1 +vinay +131619 +1234546 +ujkjdjkjvrf +brian1234 +dodgers5 +connie12 +161990 +557733 +mykonos +crocodile1 +200794 +280995 +gordie +01071979 +167349 +theking12 +qwerty1989 +hamza1 +darkwing +ferrum +pookie4 +ladybug10 +aj12345 +flyers88 +191179 +ricky3 +ilovewill1 +marie87 +salocin +200495 +cutey +ruffus +sniper13 +garcia10 +sabiduria +oscar15 +austin1234 +quarter1 +bullock +joana1 +sarahg +000000aa +21121977 +naruto45 +mariposa7 +success08 +600088 +marcos13 +pussy18 +mcleod +151994 +fuckem1 +samuel99 +123asdfg +chacha2 +lilly11 +boston21 +fashion7 +lulu10 +rainbow14 +lunatik +040782 +16011980 +051294 +chitti +fuck24 +hazmat +meinschatz +ds123456 +lovely101 +020794 +fatboi1 +player8 +marshmello +coco07 +131981 +alannah1 +01200120 +nutcracker +112006 +lplplp +shelbie1 +150696 +matrix21 +010981 +loser4life +912912 +13091996 +ilovemycat +031079 +fashionista +mybabies1 +301293 +kar123 +080186 +100676 +power6 +vanessa8 +bbc123 +katie9 +mexican5 +tupac96 +19861988 +tiger111 +actor1 +03041978 +23love +120297 +801122 +h1xp2z2duk +010205 +emma99 +kyle15 +moonflower +monkeyballs +qazokm +betsie +ktrcec +ybhdfyf +qaywsx123 +latinking5 +cars1234 +terrell2 +k.,bvsq +prapor +iluvmom1 +030181 +isaiah11 +zeratul +199422 +aaron4 +coocoo1 +renee14 +220779 +sandra69 +contender +300893 +ivory +251259a +1vincent +240795 +hadoken +10041997 +samia +honey06 +astro123 +abbas +190780 +lateralus1 +bobbyboy +heart7 +sissie +rossoneri +881122 +puto +demarco +04021980 +asdfzxcv1 +bitch34 +max +zane +seedsnipe +meadows1 +peanut77 +ryan02 +myword +mike2009 +5324 +worldwar +260495 +manchester123 +03071994 +nrfxtyrj +dublin22 +college08 +brownbear +cbr1100xx +lilwayne10 +land +babyb1 +29051995 +monaco1 +sabian1 +12string +257257 +rawhide +muthoni +bocman +merlin +darjeeling +deception +inspired +wakeup1 +01031996 +220196 +hendrix69 +ska123 +111196 +sasha23 +251001 +riley06 +stamper +ranma1 +afganistan +071093 +kaydee +09021994 +30101993 +ytrewq321 +e5fhxkqibw +heather14 +1234567890l +goldilocks +nokia6610 +110111 +dylan! +digimon123 +bonnie +teddybear0 +mister123 +bebop +molly06 +040879 +ironhead +kimi +300181 +sikander +badgirl12 +passwordko +hirsch +jackfrost +dontworry +peterpan2 +sunstar +vladka +30081980 +sos +marie28 +monkey111 +curling +dgaf420 +parola33 +googie +2princess +111299 +badboy4 +phish420 +yo123456 +160577 +budda +erikson +honda96 +19851024 +sherry123 +jackman1 +mybabyboy1 +peggy123 +snow1234 +160278 +boss01 +16011995 +teddyboy +king1 +idontknow3 +120500 +242 +31121978 +got +051177 +050180 +coco99 +08051980 +elijah10 +tramp +courier +cthuttdf +lovers9 +123125 +23011982 +1597532468 +13611361 +chidera +ikaa4kr257 +02071978 +sanju123 +olive123 +081984 +140204 +08111993 +narutofan1 +k1k2k3k4 +kooldude +qwerty1995 +020203 +starbright +samone +hero12 +121966 +shithappen +joejoe123 +fuckbitches +qqqqwwww +disney3 +chevyman1 +yakubu +myspace79 +tupelo +yhj34: +polopo +bailey00 +165165 +hidayat +paper2 +azimut +26071981 +30041979 +0201 +03021995 +pongpong +08031994 +xavier5 +103185 +sonic13 +240496 +maharashtra +decatur +lindsey7 +ethan11 +dolphin01 +barbara12 +nirvana6 +rascal +thomas01 +winniethep +junkfood +rambo3 +amigo123 +110497 +otrebor +pato123 +08041980 +01031972 +freemoney +tractors +recycle1 +zachary10 +11031979 +lady10 +wewewewe +jalapeno +renee21 +baby +230194 +iceman13 +ballen1 +4ever21 +lovespell +wilson +rockybalboa +coke11 +planner1 +nine11 +28021981 +141193 +73jagtk4q +061095 +repair +nascar18 +200277 +ramjet +cuteness1 +abc12345678 +thomas26 +onetwo1 +sassy4 +1520 +emelia +sexyback2 +antwerpen +cookies. +warrior5 +cute17 +peligro +henry3 +boogieman1 +19111981 +bigdaddy5 +fafa +samuel23 +0676135313 +angel2011 +lacrosse5 +edhardy1 +abacab +cassanova +abcdefg5 +ashash1 +assmaster +sugarlips +andres2 +040578 +istvan +04081978 +bandit08 +irfan123 +simple +201200 +rohan1 +25031995 +27101995 +gracie5 +forces +physical +creative1 +rebus13 +270270 +flash12 +1drpepper +drew13 +grandtheft +kandy +29051979 +kikakika +48151623 +theman69 +iluvsum1 +560002 +557755 +ascension +lilika +011986 +chata1 +lovers6 +cool09 +dalmatian +voldemar +390007 +martin09 +aaliyah4 +10021979 +ittybitty +171294 +sav +cf: +chaching +liver +hannah25 +aaryan +sharpei +eddie11 +velocity1 +28111982 +annabella1 +club +красотка +romeo11 +070594 +3e4r5t6y +10061995 +kikinou +30121981 +ihateschool +07031980 +igromania +090109 +legalize +shannon22 +ilovesteph +crapaud +twotwo +saulito +821126 +dakota00 +11131113 +scooby4 +williams3 +synyster +wow101 +shinoda1 +300593 +andrea77 +sonia12 +thanku +55555b +j3r3my +31081980 +estupida +1cricket +197310 +punyeta +lebronjames23 +16011983 +mikomiko +heloisa +dashawn +anaisabel +lokoporti +bmw530 +sunshine55 +lilac +270795 +gracie! +841010 + +supersport +sex111 +america18 +bubu123 +mossyoak +221276 +strawberri +kahlua1 +godblessu +onelove. +jesus05 +chick12 +yoruba +chris86 +ward +westminster +4000 +hester1 +eggroll1 +ktyfktyf +19931994 +janis +phoebe123 +shiver +241241 +123468 +22011980 +myindia +dmitriev +14111994 +050381 +zxcvbnm3 +gnaget +golf72 +18081995 +lfiflfif +omnislash +cartman2 +liyana +4gotten +счастье +lanier +cacat123 +seedorf +28081995 +findjob +iro4ka +gothic13 +2wwerty1 +bigdicks +781007 +badboy09 +brasov +28091994 +rfpzdrf +hailey +cnhfcnm +19861016 +pikolo +alexandra9 +mistero +04101994 +021294 +nomoney +brooklyn13 +p4ssword +scruffy2 +sammy99 +14061994 +disney07 +030877 +0108 +070770 +sammy18 +player07 +060109 +07081994 +14041404 +medrano +cheese33 +33333a +starbaby +gabriel09 +lame123 +11051978 +mechelle +aekara +347347 +lisbon +inuyasha1 +aa1234567 +michelle00 +pogime +daddy33 +youth +devious +balmoral +yuki +ciclismo +glitter2 +matilda +170778 +kessler +07071997 +mama24 +stripped +kenney +sub +brandy10 +flores13 +051295 +highwind +misty7 +justin94 +havefaith1 +socc3r +061295 +lubasha +14031996 +missy21 +saba +17061995 +brooke21 +jackass9 +ineedlove +marinamarina +vinvin +fluffy10 +171077 +northeast +danette +020276 +vball10 +sushant +shadow45 +herohero +carebear3 +ally12 +isabella07 +emma2003 +15021502 +123.abc +millionair +scroll1 +181208q +lionking2 +1234hi +lumber1 +cycle +1doggie +kevinm +unlucky +unlucky1 +baumhaus +abcde5 +baseball35 +tati +meisha +alices +apple88 +wanted123 +thering +scott5 +kaylynn +motorola12 +fishie +heartbeat1 +innovision +280295 +unodostres +281276 +paciencia +2inlove +gang +999990 +ssj4goku +02011979 +050480 +sphere +forzaitalia +dingo123 +kelsea +eminem4 +250877 +direction +09111984 +hayleigh +coaster1 +zacefron14 +thecool1 +macchia +danielle20 +jaguar123 +080793 +miracle2 +24091981 +guevara1 +italia2006 +james2008 +arsenal09 +02041976 +712712 +raine +cagney +080287 +bulldogs7 +x1234567 +kinder ++ +313 +07021993 +73737373 +knopochka +acdc1234 +26111979 +5841314521 +azulazul +west11 +noneya1 +takoyaki +liana1 +welkom1 +killer911 +ipod13 +666425 +pino +chance +051983 +babybash1 +greyson +adaada +rahul1 +audio +sex247 +blockbuster +sb123456 +permanent +redarmy +djembe +metal12 +jasmine69 +spicey1 +sasha1988 +263263 +kongkong +lexis1 +smeghead1 +kissme13 +master16 +12d8a377 +dragonlady +anastasya +luckyduck +pass4word +321654a +ashton01 +ganjubas +lovebug11 +141995 +southend1 +purple93 +20041976 +razors +clayton2 +loverlover +ewelinka +campioni +hannie +dnangel +25091979 +lasvegas12 +boston08 +120574 +slifer +redzone +butterfing +estrella7 +wolf22 +rfrfrf +789456m +nessa12 +red789 +gourmet +290478 +mason07 +sergant +1236951 +eloelo +210595 +fireandice +03101980 +paris7 +ionel23 +benjie1 +mellon1 +malboro1 +telaviv +jess69 +nobiles +buster. +fiamma +12021997 +happyman1 +21121996 +sonics1 +freedom101 +miami23 +bethany +sairam1 +hermana +nick1 +johndavid +110066 +busted! +che123 +dolphin23 +summer44 +150779 +2fine4u +14051979 +223456789 +stonecold3 +63impala +babigurl +cintasejat +dexter +what1234 +jessica26 +1rocker +260994 +joker1234 +zoosk.com +dome +brianna08 +rosinha +vir +jackjill +010477 +pennylane1 +190394 +shitbag +281989 +hunter27 +omega5 +02011978 +maggie101 +shay11 +babyboo7 +sonnie +miguel5 +dakota69 +clyde123 +gizmo10 +nyknicks +11021997 +macario +glock21 +220395 +jonas15 +cubanita +01011963 +???????????? +saipan670 +050979 +mynigga +norman12 +gangsta15 +niners49 +slammer1 +sveto4ka +171093 +tink69 +310196 +bubba8 +15081978 +element0 +inchallah +quilmes +oficina +pimboli +peaches09 +dakota8 +fuck123456 +ptktysq +isidore +mobius +gman123 +mirabella +goosey +pimps +joshua97 +52105210 +dhtlbyf +noodle2 +zhanghao +marika1 +poopy6 +k7777777 +andersson +lovers101 +270694 +070493 +matilde1 +14091980 +mizzou1 +qazzaq123 +401202 +21031978 +12031979 +kayla05 +scarface21 +bingoo +123ewqasdcxz +goodsex +dragons7 +loveandhate +cutey1 +13101979 +ass123456 +dallas31 +farrah1 +willie +081193 +mystuff1 +17011994 +091080 +marcus09 +1931 +steve3 +joseph1234 +sanosuke +diandra +30111994 +toucan +walking1 +gabriel05 +stink +sabinka +apple45 +diarra +mike1985 +timtam +119955 +kitten4 +031177 +puppy! +dolemite +reyna +crazyme +171276 +040982 +anduril +gabriela +131978 +ricardo10 +fashionist +mahalakshmi +july1992 +rocky15 +poohbaby1 +nigga15 +17101996 +joey16 +cock12 +drywall1 +31031980 +damnit! +vannessa +muzik1 +pressure1 +banana21 +010308 +28081978 +zola25 +surfing123 +1winston +yourself +zakopane +kimberly01 +insider +aust1n +13031979 +mathew12 +william25 +112011 +qweiop +07091995 +205gti +avmpwd +199125 +outsiders +hollis1 +ktm450 +ecgt +24011982 +straw1 +weyfvb +2kisses +suka123 +marmara +589589 +polonez +061277 +jaishreeram +buddy05 +blacksabbath +goodbye2 +27031994 +emmylou +yinyang1 +777778 +987654321r +1promise +danika1 +angelitos +omg +160294 +law123 +080595 +200111 +a741852963 +mustang24 +softball03 +18051981 +nameless1 +hitachi1 +pisellone +cameron03 +03071978 +0803 +bratty +sparkle123 +arsch1 +pensacola1 +123monkey +230495 +happy33 +redick4 +290881 +030978 +firewood +280694 +lover12345 +151200 +brittany +2224 +stevenash +teamo11 +pirate13 +aruba1 +ziggy12 +121999 +dollbaby +304304 +qdxzc43gba +vanguard1 +200394 +linwood1 +09021981 +vilnius +291077 +barrio13 +01021977 +hogehoge +yannick1 +18071995 +arsenal3 +james44 +14181418 +gg123456 +tagheuer +25272527 +199229 +crystal6 +nikita1995 +gwapo123 +mymyspace +smile99 +170379 +muffin4 +dauphins +pinklove +yahoo0 +gfhfdjp +snoopy15 +fivestar1 +raiden1 +081987 +25041979 +wilfredo1 +tyler00 +620620 +tyson01 +trumpet2 +warhammer4 +dixiedog1 +danielle17 +ilovemax1 +nono12 +racquel +purpose1 +r00tbeer +bandit21 +asphalt +warhol +2314 +prince69 +555555q +cliffy +zz +demetra +popcorn6 +colton12 +09031982 +newmexico1 +diamond. +amanda02 +kiss1947 +199810 +suvarna +msnmsn +happyhour +rayne1 +gitara1 +killacam +krazy +15091979 +200506 +010281 +07011984 +samuel07 +november09 +romans116 +jason77 +bigdog5 +barbapapa +carmen3 +cap123 +eagles15 +3kids +josh1 +parfait +megan23 +cassidy123 +05121993 +26091980 +gators11 +199525 +denise08 +11081977 +tetley +winter3 +lucas1234 +duane +carnegie +xavier05 +220476 +browndog1 +214dallas +wordpass12 +123apple +14111981 +andrea25 +radhakrishna +viper69 +23041977 +joeblack +federer1 +nikka +smilee +spelling +redskins26 +rad123 +abc123# +beats1 +071207 +christo1 +12081977 +24111980 +13145200 +jazmyn1 +online2 +laika1 +demo123 +jesusmeama +hayden06 +15031979 +armando123 +ioanna +carmen7 +smith2 +mariana2 +19841029 +nightmare +bulldogs09 +27091995 +folletto +tinkerbell12 +w1954a +120697 +grad2007 +keroro +5432 +stephanie. +hopewell +lizardking +lynnette1 +piggy3 +hoodrich1 +loveindia +06021981 +thirdeye +tuntun +100years +benson123 +11081979 +potenza +papier +ryslan +pooper12 +nene14 +ilovehim22 +flaka1 +010196 +120874 +holdenv8 +010478 +needwork +jack666 +love102 +22002200 +satanic666 +lildude +m987654321 +reunion1 +paula12 +swamphen +01011999 +seriously +azul13 +2qefx7t3sy +alina12 +9900 +mickey19 +ramchandra +playgirl69 +think456 +09091995 +vienna1 +не +jawbreaker +crayons +197319 +w9998999 +3452 +smiley101 +nikita2010 +bringiton1 +kiara12 +1vampire +dragonfly3 +selfmade1 +hawaii05 +cookies23 +280478 +12348878 +iloveme01 +runescape3 +190478 +guess2 +sexybaby2 +m1m2m3m4m5 +latin +chaos13 +17071994 +82airborne +memito +kiki00 +tiffany18 +311001 +ducky2 +babyboys +james30 +gail +lolita +10071978 +qianqian +verizon2 +lily13 +bandaid +ayodeji1 +290379 +031178 +ilikepie! +drift1 +pom +myspace31 +margareth +medeiros +nbanba +machoman1 +mahnoor +shadow98 +20091996 +divx +01092008 +nikola123 +amirkhan +cal123 +cubbie1 +maggie17 +william88 +141294 +stefan12 +851010 +abdula +django1 +beauty3 +aurelie1 +selena13 +ltz400 +1alabama +sexythang +1011111 +morgan03 +clover123 +ohshit! +chemicals +poohbear18 +garrett123 +rockwell1 +ringostar +vehvfycr +cradleoffilth +jane1234 +0802 +gameplay +star26 +sexygirl01 +needletail +wewe123 +eric07 +1234!@#$ +kailyn +140207 +miranda7 +arnold123 +rover123 +fuzzball1 +hildegard +winter04 +23111978 +pacman2 +restore +815815 +10041978 +shakal +120907 +justme! +maddog12 +bigdog7 +061982 +vfhvtkflrf +novgorod +jesse. +romance! +mylife08 +alejandra7 +limabean +198529 +queen01 +incognito1 +peyton01 +ihateyou5 +lovespell1 +pharrell +battleship +leolion +freya1 +rafita +keineahnung +beatles2 +florzinha +budapest1 +marilynmanson +joaovitor +04071981 +generals1 +08111982 +ngocanh +244001 +alex83 +shooters +loirinha +zif1313 +sweet88 +29111992 +bluetooth1 +12061978 +1atlanta +fulcrum +tigers69 +lildaddy1 +friends15 +sieben7 +231993 +jason20 +11061995 +franchise1 +r26nnxjx7n +single101 +alana123 +121303 +28061981 +tupac7 +bambucha +current1 +bobbyb +16011994 +t1gg3r +2black +chance22 +wave125 +310180 +jesus27 +goofy13 +ruth123 +291989 +110796 +hola22 +ashland1 +silvia +rrr123 +lizette1 +360001 +dreamon1 +papaya1 +brille +greenway +156324 +malena1 +farthead1 +archuleta +bamaboy1 +jhkjdf +jopajopa +11031978 +doremifa +250876 +indian +090581 +momof6 +yahoo6 +1april +childcare +marlee1 +f00bar +jacqui1 +billard +sin666 +adr +deleon1 +1903bjk +edge +zxc123 +clairebear +ursulet +lkjh +11071996 +loquillo +africa123 +sanchez13 +hyperlite1 +buddy77 +27072007 +20042006 +sneha +301095 +fierce +042108 +epa650 +oscar69 +eumesma +55555t +sorciere +pizzapie1 +chichi11 +24071994 +fkg7h4f3v6 +170878 +julieanne +spider4 +zero000 +crackerjack +skully +jyoti +ludhiana +gabriel23 +hannah95 +rtyfghvbn +nose +bighouse +vader123 +packers123 +blessedbe +shonda +obelisk +booger69 +696969j +qwerty28 +monica15 +271278 +holidaysecure123$ +27021980 +14021977 +145353 +simpleman +divina1 +megan15 +sicherheit +s0ftball +49494949 +skittles14 +vertex +failure +charmin1 +shinedown1 +04041978 +slayer7 +031984 +postoffice +notyou +longfellow +310395 +03071995 +112005 +mike666 +05071980 +jemoeder1 +198588 +gomets +mercury7 +oreo10 +casado +600087 +madonna +jehovah +kandi1 +197922 +campos1 +catherine3 +lilmama01 +bert123 +scream123 +siciliano +smokepot +25061978 +killa22 +090482 +224 +fuckem +081181 +abc123456 +homestead1 +winston3 +weevil +314 +tomlinson +030183 +healthcare +julinha +18091994 +allie12 +emre123 +philly2 +gangsta22 +pumper +hay +bearshare1 +rakesh123 +1veronica +dat123 +parrish +123456al +pegleg +backpack1 +cherry24 +adriana13 +1peewee +lachula1 +awsome12 +101111 +steves +giants08 +080382 +ladyred +11091996 +aero123 +bigdaddy23 +bang123 +window123 +eastcoast1 +reggie11 +310378 +eiffel +friday11 +10031979 +padisco +03021980 +tina15 +123456jr +25121996 +19841028 +dauphine +hanhphuc +lolliepop +110505 +m1cha3l +elmo01 +130278 +password777 +jose09 +along +zxcvbn7 +19851123 +bajsbajs +morgan17 +150576 +jamuna +310779 +adam15 +27021995 +ilovecake +198316 +ytyfdb;e +hybrid1 +northside4 +di +chevy57 +0703 +maddux +funnyman1 +viper7 +dominique +lovely1234 +logan22 +gemini77 +friend4 +smiley5 +sluts1 +0503 +dc123456 +om +kitty18 +backlash +indya123d +gayman +280895 +cytujdbr +jimmy8 +ashley77 +zachary6 +dgkallday1 +robert03 +10081979 +11111b +08061995 +chelsea06 +forevermor +password0 +lala69 +colombia10 +roland7859 +slava1 +russell123 +cassie21 +blazeit +gwendolyn1 +volcom5 +valera +5525 +irock101 +putanginamo +220378 +levi12 +nathen +lukeluke +199101 +susanna1 +420stoner +seahawk1 +darkness0 +jobelle +pizza9 +hagakure +iloveme6 +201014 +iloveshawn +cena +brave +00000m +rabbit13 +rocky09 +titania +168168168 +roland123 +spongebob +10111977 +1danny +roosje +mama99 +jessjess +united10 +gbrfxe +soccer2010 +666420 +cocker1 +hailey08 +061194 +romanroman +greeny1 +tippmann98 +magnifico +shimmy1 +akusayangkamu +quake4 +lilboy +zhimakaimen +linde +heffer +chicago10 +rain12 +december01 +abby10 +68charger +jeremi +021982 +diana5 +arkangel +cutegurl +741085209630 +sadiemae1 +19841022 +bailey9 +sk8terboi +146146 +dirtbike7 +ladygaga12 +15031996 +heather18 +366366 +angelboy +asterlam +dadsgirl +050380 +baby79 +imtheone +august +drumset1 +betrayed1 +b696969 +yohana +04081980 +ala123 +lucozade +mymama +1montana +maximus123 +tippy123 +stupid69 +p@55word +siddhu +moose13 +jeremy09 +05051996 +cooling +lover88 +backstreetboys +dun +miley11 +carhartt +bluem00n +091278 +lizards +fritzy +ryan03 +kitties2 +198814 +emily04 +crip66 +16031978 +197930 +jaimataki +wsadwsad +159487263 +best1234 +bigsky +kool13 +club2030 +roxy15 +ringring +jamming +fear +12435687 +reaper69 +caught1 +excal007 +yasmin12 +natacion +ilovedave1 +josh88 +1397 +borat1 +thanh +srisairam +bakura +griffen +bk.irf +no1cares +2519 +211002 +wjsswj +lotte +scooty +chacha12 +hookem1 +102100 +vladislav +060794 +010508 +apple. +purple30 +15201520 +chucky13 +0125 +travis16 +lovemedo +jarell1 +church2 +kashyap +600032 +poisonivy +republica +300976 +bushido7 +dalmata +23081996 +mitali +130876 +march2009 +notyours1 +sean22 +piss +p1mpin +231175 +crime1 +676869 +271194 +mmmnnn +nausicaa +biondo +20111978 +inventor +yearbook +timmy7 +21314151 +dell22 +lemon12 +060183 +21121978 +linking +din123 +17746052 +210794 +bubba07 +20031978 +17011981 +elmoelmo +baylor1 +kfc123 +151195 +amanda87 +jeff01 +zxcvbnmm +bball08 +perempuan +iceice1 +loli +16091981 +120473 +monster17 +040809 +08111990 +sabrina10 +paintball4 +weedweed1 +blckd_sa_unpaidfee_oct06 +kittens3 + +lucette +060893 +27041980 +lenora +170479 +22051979 +4r5t6y7u +smile14 +justin87 +5ahc2v875z +rocky123 +bryony +juan16 +ewqewq +lion1234 +xavier7 +larryboy +mercedes01 +palangga +09031995 +1mouse +melissa09 +massacre1 +baseball42 +bronzewing +foxmulder +pesciolino +maddog123 +sadiya +hebrew +nuttertool +amanda77 +rottie +bugatti1 +violet123 +drumnbass1 +art131313 +050501 +311094 +30303 +batman19 +198220 +asdasd2 +brown5 +030979 +10051977 +simcity4 +27081980 +deshaun1 +touche +sabato +lilbear +06051980 +izabel +february18 +happy2007 +bluebaby +iverson23 +coco24 +chipchip +black33 +031294 +raider13 +pappy +carlos26 +emilien +300379 +0604 +201195 +volleybal1 +bijou1 +crystal14 +booooo +fuck16 +panda01 +daman +kellogg +194 +bogosse +titans12 +trouble7 +freakazoid +pimp44 +super1234 +shanghai1 +astoria1 +140595 +cello1 +morgan24 +111111111q +pretty17 +miamor2 +byyjxrf +american12 +171079 +hellyea1 +daniel55 +tennyson +27031995 +1sexyboy +felipe01 +marcus08 +20091979 +delight1 +27031980 +italia +adidas5 +figvam +inline +smith89 +shane01 +latrell +14021976 +101203 +duffbeer +090691 +james34 +kazumi +windows1 +parabellum +198105 +t55555 +1spencer +515000 +sexy777 +theory +terminator2 +25021980 +midtown +050696 +06011994 +040383 +primavera1 +271078 +laboratorio +joedirt +261195 +400088 +zdenek +gangsters +urmom12 +alfaalfa +wapiti +06101982 +mad1son +14011995 +honey101 +football03 +february12 +maurice +evropa +tucker5 +bigd123 +blaziken +110798 +silver17 +savannah5 +05061979 +poodles1 +mark1 +31121979 +jasm1ne +sunflower4 +linda22 +mama111 +flower33 +29041995 +851212 +kingman1 +catriona +galactica +dang +fenway1 +cab +gerome +lilnigga1 +bennyboy1 +02051975 +abstract1 +chicago21 +280177 +star92 +kilgore +blumentopf +sweetthang +199418 +nonudity! +nuo0725nuo +poppins +11061996 +291079 +mitchy +manman3 +03120312 +maddy2 +020979 +101174 +yfcn. +spider99 +getbent +actlg728 +pedro2 +armitage +15995123 +pebbles01 +getcrunk1 +821028 +putra +dewdrop +minnette +santeria +20051979 +tower +kostia +cherif +sprite12 +angpogiko +811025 +love7777 +depeche101 +scott7 +wass123 +110708 +power23 +kassy1 +240977 +141993 +hat +wahoo1 +natalie07 +maddog2 +dtown214 +martin! +bankai1 +200376 +virgo123 +pachuca +redwarbike +400060 +031093 +7e9lnk3fc01 +211095 +18121979 +160295 +09091999 +sylvania +deimos +24071995 +moksha +nagendra +angel1997 +armand1 +121300 +28101977 +radiance +k3zedhmexs +badman123 +cowboy23 +sadgirl1 +181095 +adrian09 +tyler95 +wsxwsx +198214 +pljhjdmt +monkeys4 +irish13 +20081977 +aradhana +aaron16 +sameena +nagamani +ricardo07 +july1986 +drilling +findlove +pho +air123 +04051980 +120909 +30121978 +shoot +qazwsxed1 +111111aaa +napoli10 +chris0 +louise21 +jack2010 +11121997 +10061006 +700006 +zach13 +nikol +devin7 +170578 +230596 +yx12345678 +ishaan +evette +may1986 +robinson +superman26 +sus +lakers4 +macho123 +151196 +friends0 +050805 +xxx12345 +priya1 +missydog +suc +hottie0 +billy1234 +123green +sashadog +kiska +ibarra +hapiness +expresso +sexy456 +06121980 +28111981 +181078 +5element +cenation +tfzwf44idb +tommy21 +aqwzsx123 +bc1234 +101060 +0504 +ohmnamah23 +playplay +alaska +maggie04 +1593572468 +cubby +jasmin01 +husan0890 +wethepeople +vardan +panocha +bigdad1 +atkins +210177 +canelita +16081995 +pinki +zarazara +laila123 +15101977 +gabrielito +jabberwocky +trapstar +12421242 +qwert +bigsister +123123p +swagg123 +blood9 +babyjoker1 +henry7 +pearce +poseinfopass +learning1 +jasmine04 +happyness1 +b00mb00m +daddy06 +vania +alpha01 +mercurial +82828282 +100400 +sereno +191194 +solidus +singleton +sonny2 +1carolina +jasonjason +jamesw +ska +c44n6vijfc +farheen +slayer01 +duck11 +haunted1 +myspace56 +ladysman1 +javier23 +pedro10 +iluvu13 +spanky11 +teresa01 +david04 +joel11 +03011982 +198329 +mateus123 +bandit23 +290394 +rererere +nate11 +04101980 +ella12 +applepie12 +brayden08 +bellezza +shakila +catdog22 +trujillo1 +27091980 +visa +1mariah +1hockey +impalass +jerome +arlingtonp +novartis +mohan123 +03111981 +jeshua +080508 +251275 +loudog +pokemon69 +5qwerty67890 +291985 +qazxcvb +801010 +3boys1girl +administrator +shaylee +paige13 +blue87 +821021 +210976 +swimming! +azerty11 +castel +ilovedogs2 +chopper69 +shelby8 +cheat1 +tension +hotrod123 +pacsun1 +godchild +peaches08 +1qazxsw23e +madelaine +kala +rayden +minotaur +scouser +indie1 +010296 +140377 +beachbabe +jackass. +dragon42 +251980 +piscina +ziomek1 +lisette1 +peregrine +mortimer1 +001991 +inuyasha5 +yahoo4 +dont +eleven1 +sanpedro1 +22011994 +caleb01 +050877 +katrin +25011981 +110797 +hostel +lamont2 +zitrone +blood11 +brooklyn6 +jacks0n +eclipse99 +blue90 +kangaroos +150777 +0501 +bigdog22 +pra +merry1 +boobs! +libran +rebecca5 +darla +jack2005 +unbreakable +250279 +goldy +spanky +anuoluwapo +getmein +261095 +fuckyou06 +alicia7 +markova +richgirl +24422442 +chris100 +amelia +brutus +pele +osipova +lexicon +23061979 +tommy1234 +stason +170577 +waqas123 +010979 +051990 +071178 +030879 +beaumont1 +19851987 +icebox1 +mhine1 +adam18 +skeet +olivia6 +greenday123 +rockrock1 +290678 +phoenix9 +debtfree +hitman23 +romanson +db +pharaoh +elephant +magic22 +jesusloveme +george6 +26041978 +290194 +booger01 +171177 +030679 +argentina2 +110676 +danil123 +password5 +jackie15 +uzumakinaruto +021178 +20041977 +launch +yellow20 +que-veux-tu +4u2nvme +playa23 +jarda +50505 +anna2011 +batista619 +thi +engenharia +dukenukem +amojesus +judaspriest +music4u +bballer +steven19 +fresh09 +troy14 +moon22 +louie2 +hooker69 +fortuna95 +801212 +007008009 +krystal2 +101107 +081294 +sexyman2 +23101994 +050608 +160179 +dong +rams28 +1manarmy +030496 +tanner22 +zhang +money26 +carman1 +hardcore +equitydev +lolo13 +260879 +14themoney +1inuyasha +theone11 +oldlady +bianca +estella1 +andover +black12345 +2589 +rachel17 +bulldogs08 +250778 +brazil123 +bigballer +22061996 +boucher +ryan2007 +yankee7 +16121995 +mrmagoo +florida13 +anchor1 +10101972 +overcome +96mustang +196363 +sims2 +bubble11 +220696 +taylor92 +200876 +friday01 +quercus +19851126 +movingon1 +hullcity1 +speeds +123qwe1 +kaitlyn12 +minimax +16061977 +zuzia1 +190195 +rabbit7 +foothill +741456963 +f246865h +09051979 +kamelia +beechwood +halloduda +pathan +blasco +sangria +snitch1 +lost12 +bigdaddy10 +francheska +godman +crappie +231992 +nicole32 +0107 +201076 +january08 +198829 +marypoppins +barcelon +17101978 +blessed07 +chaz +ovation1 +0901 +rangga +booga1 +newlife201 +120671 +18101979 +abbydog1 +boy123456 +lynn69 +pocket12 +13071980 +neuken +tinker23 +190794 +05041981 +stars! +t-money +sniper01 +paul21 +010779 +lindy1 +chase10 +jeffrey +cuteboy1 +blue222 +100999 +leopards +paints +ghjrehjh +171095 +070282 +ss12345 +viernes13 +moimoi1 +mambo5 +050895 +changepass +checkitout +notmine +23071994 +hello34 +deviljin +goodfella1 +baronn +gocards1 +bailey16 +28081994 +19072007 +13011301 +050282 +bella04 +15051978 +coconut2 +malcolmx +allen23 +300193 +smo +zyltrc +02120212 +killer321 +demain +melanie13 +keebler1 +25121975 +asshole14 +100808 +070981 +bethany2 +iloveluke1 +inlove4 +amouna +tequiero12 +070581 +nascar +dolphins7 +963852741a +girl22 +legolas2 +jeep123 +haseena +c654321 +221096 +murphy3 +travis5 +02101977 +rats +e-mail +yamaha46 +blowfish1 +1721k1721 +aphrodite1 +ameera +jerry13 +140202 +justme3 +123690 +monkeys101 +080994 +enterprise +teddybear8 +kenny01 +balloons1 +geroin +busted2 +maria88 +blackmore +browne +ridebmx +hisgrace +country12 +dogma +florida +lukino +anhhung +noobnoob +fairfield1 +130996 +adam08 +021077 +bambam69 +1isabella +lauram +fuck17 +130294 +kizzie +291295 +minato +katia1 +821023 +20111979 +davidka +19861121 +cotton12 +dziubek +titimi +27091981 +27061981 +120607 +teen +miamibeach +marina2010 +happiness +chevy09 +katty +sweety13 +scooby14 +space11 +ferrarif40 +basketbal2 +090976 +ilovealex! +250294 +281195 +williams +lightimes +781022 +210197 +roger2 +start12 +wallflower +happy00 +23011996 +loverboy +suffer +ghjrehfnehf +alex34 +structure +scotia +141010 +murphy +android1 +120898 +310193 +qazwsx7 +20121977 +tigers6 +16081978 +francis3 +302012 +triplet3 +hottie34 +789456123z +000999888 +amrutha +anthony89 +jessee +punkista +corinna1 +farhan123 +mascot +pokemon00 +lust +advanced1 +vlasta +tootles +jane22 +michael31 +25071994 +radharani +04041977 +amaretto +03101978 +salut123 +valkiria +nightcrawler +word12 +erin11 +maxamillion +herbalife1 +qaz4532 +anatole +henrys +10091979 +superman87 +achiever +101172 +11011979 +carter5 +kippen +fritzi +lover34 +fuckyou32 +emma21 +puggy1 +marley3 +cardenas1 +persimmon +lizzy2 +141075 +rachel. +161993 +dumbdumb +twinkletoes +reallife +janedoe +rootbeer12 +pendragon1 +nicholas14 +scimitar +001905 +533533 +50cent123 +cammy1 +plumeria +schach +panther4 +lebron6 +harley66 +trotter1 +dick101 +bakker +11223366 +fyz +pieman1 +november06 +okcomputer +sebastian9 +blockhead +trythis +1234567890r +elaine2 +01100110 +020495 +pennydog +qwe123zxc +636234 +local1 +lanalana +artem1996 +mason08 +11091995 +shumaila +purple02 +dallas! +osama +fdcnhfkbz +1qaz2wsx +coco09 +coolhand +narutokun +jobros1 +asas123 +19871120 +jessica92 +hello20 +hotbox +080483 +1emily +bass1234 +flyhigh1 +191079 +anjani +experiment +leg +misia1 +mark17 +lasher +killme666 +shagufta +892892 +jazzy09 +1255 +amande +peanuts2 +football49 +sa12345 +020607 +landser +universita +raven01 +2908 +claret +carter23 +linkedinlinkedin +14021997 +giangi +200575 +star94 +100796 +goddey +bb12345 +isaiah05 +251274 +transform1 +08021994 +02101976 +781024 +dossantos +dupablada +gabriel15 +down +13111978 +pimaout +телефон +aaa111aaa +monkey777 +060897 +30111981 +19861023 +20041978 +greentree1 +29111980 +marialuiza +14061979 +justin31 +198218 +26011995 +jupiter5 +poczta +spider8 +199322 +maman123 +nov1988 +181278 +05011980 +miguel17 +22882288 +pink04 +rickross1 +08011982 +monkeys13 +cat666 +gallo +1cooldude +daniel101 +itachi123 +jakubko +1688 +inuyasha10 +not4me +sandy22 +aaron! +anhyeu +boston07 +jarjar1 +jesuschrist +080783 +310895 +gwapo1 +190679 +rose101 +coolkids +070481 +200178 +302016 +maverick12 +sg +rainbow24 +angel79 +jason99 +151993 +271277 +pogi123 +bach +jasons1 +dickinson +mommy69 +06021982 +maitre +figueroa1 +libertas +220594 +ballball +nautical +502502 +30051993 +gizmo5 +lovergurl +buster16 +jamrock1 +modeling +peaches +luchino +boricua123 +haha23 +riccardo1 +blue78 +051079 +jamesa +600014 +beanbean +modified +keane16 +scorpio21 +jesus2000 +angelyn +palmier +diplomats1 +redrider +theblock +passwort! +sarinha +medic +mydog +redneck! +090283 +tab +brennen1 +ichich +billions +15021978 +babygirl78 +zanzibar1 +diana14 +sorella +pooh06 +202030 +190707 +lightyear +sanchez12 +280577 +begonia +bloodrayne +playhard +pointer1 +george15 +noknok +sexxx +cyrielle +121518 +30111980 +carrie +211193 +disney10 +199225 +17051981 +maddy12 +darragh +meninblack +271990 +261982 +kelly +killer87 +291983 +twoboys2 +13041978 +theflash +alejandro8 +95959595 +buttcrack1 +shawn23 +sambuka +pikachu +blume1 +wilson3 +mathews1 +hoilamgi +multipass +04011981 +lolo90 +nodrog +1kisses +musico +smokey09 +jason88 +01121995 +penang +matr1x +johnston1 +correia +161094 +muckel +lurdes +191177 +03101994 +theman23 +4eternity +porkypig +hi123 +ali110 +jenny08 +jasmine03 +1278 +xxxpass +poochy +mommy30 +n1n2n3 +180676 +11011995 +sn1ckers +armada1 +newport123 +28071995 +wwweee +pratiksha +6699 +harry1234 +191294 +joshua96 +sofly1 +336336 +peaches9 +luzifer +211194 +dotty1 +sixflags1 +sebastia +2q2q2q +desiree2 +0403 +bebita1 +117 +shelby67 +cuoricino +duality +kyokushin +austin20 +marco2 +ronin1 +niggaplz1 +201985 +flower09 +anna99 +201009 +101204 +220178 +surenox3 +fuckth1s +040282 +09091978 +aur +170994 +ilovegreen +outlaw2 +230976 +loveangel1 +tommy4 +daddygurl1 +12021978 +asd1234567 +111276 +lavigne1 +dancingqueen +cassie16 +1lovemusic +nappy1 +eltigre +mrkitty +baller4lif +esther12 +mc9ad9w2ux +cancer +23051978 +mark07 +blazed1 +ballin01 +04071995 +monique11 + +swag123 +june1983 +258963147 +mohana +portfolio +ghjcnjz +160878 +newport12 +hardcore13 +miniman1 +chris1 +bigben07 +lfc4life +thebigboss +831010 +alenushka +samson +pocoloco +beck +kopretina +heart13 +juster +ivana1 +machina +20061979 +olawunmi +17081980 +jabalpur +040284 +040281 +golden7 +ladiesman2 +ilovemywif +140178 +nick12345 +gohawks +220576 +07061994 +05011981 +15031978 +claire +1boston +music18 +alukard +anushree +bluewater1 +nurse2 +helloma +jessie16 +staticx +200177 +1bigman +jojo08 +gldfzpy +peckerwood +22051978 +rewq1234 +1fluffy +zz1234 +dizzy123 +asusasus +moron +0721 +matthew98 +melkor +111077 +wzq8xcfxqm +shukla +itsover +dick23 +saumya +susann +ryangiggs +tebogo +0209 +dolphin21 +javier11 +241176 +39393939 +230101 +sexy420 +pothead69 +rusty5 +babyblue13 +buffys +magodeoz1 +180777 +040384 +ikbengek +kasandra1 +020878 +cool100 +zandra +mercedes7 +matlock +poopy11 +pooop +murphy10 +steven06 +renee16 +harmonica +dustydog1 +20111996 +jake2008 +kristen +sammie +080784 +micha1 +woshishen +kodak +200278 +vans13 +160895 +colorado2 +nicole31 +rangers1873 +nich0las +xbox360 +claudia7 +alastair +777555333 +wildcat2 +googles +sassari +lucius +bufalo +angel67 +florida4 +19861216 +angel81 +040895 +warren123 +crazychick +11021996 +internet. +fate +mario69 ++++++++++++++++ +praktikum +28111993 +jessie15 +joseph04 +ptybnxtvgbjy +211276 +12011996 +laflaca +screwu +david29 +koolsavas +imogen1 +analsex69 +lilboosie +aaron69 +driftwood +sami12 +hearts7 +single4 +asad +hotwings +erwin1 +warped +jack55 +prince1999 +federation +bulacan +muhammad +198514 +19942009 +aquario +09051995 +06071981 +00123456789 +angers +sarah06 +xh248zhhtm +matt00 +batman45 +20121979 +29091979 +sunset2 +euronics +171194 +120506 +170494 +sydnee +17121977 +lilflip1 +ruchika +sparky99 +eragon123 +cameron21 +babyko1 +!q +riley5 +guarana +170694 +dragon96 +aaaddd +bulldog9 +passrett222 +getsilly1 +29121980 +courtney6 +201275 +forever0 +scholes18 +informatika +197822 +youngbuck +199120 +panthers7 +fukoff +promote1 +redbull12 +230675 +tapper +ganondorf +nutsack1 +coco16 +19401940 +wolverine +grove1 +steven24 +blbjnrf +joshua95 +02031976 +12101996 +olivia02 +pepsis +211983 +panthera +kennedy123 +turtle6 +minnow +romanenko +pfqwtdf +111108 +aga +sabita +petewentz +arizona +whatever1 +14031995 +1cooper +aiden06 +ivan1994 +031094 +lovelife3 +clover12 +snoopy24 +dominos1 +2229 +wwwooo1234 +martell +01071978 +4vdaxp542g +freshmen +22021981 +coolchick1 +27011994 +olimpo +toocute1 +bennington +santa12 +autumn13 +68chevy +deus +050382 +amanda27 +jimmypage +jettavr6 +1eastside +midnight6 +qwert12345 +cooper23 +116 +sandy1234 +06041995 +1beast +km1234 +23021977 +badass21 +konnichiwa +1jesus1 +kuning +allegro1 +bmw328i +toro +20061996 +1blondie +261991 +kisses01 +honda300 +junito +nickjonas! +pimpc1 +cody69 +jonas14 +cppzfrc933 ++ +250795 +291294 +toyota11 +fifa2002 +drumstick +mariah7 +julie13 +connor03 +25051976 +giggles123 +shorts +101208 +omnamahshivay +mila123 +kitkat13 +dance23 +rambo12 +terenaam +barrow +240876 +cali14 +snipes +060281 +hamradio +020676 +halo10 +23091979 +240994 +sexmeup +110776 +flaming +liline +letmein0 +vangelis +100975 +mrs.brown +vjzgjxnf +chava1 +southsid3 +030377 +dustin! +njdevils +1miller +coco08 +dimabilan +123456go +accenture +171195 +111997 +080583 +30111995 +050182 +27011995 +191278 +250196 +travel2 +miller23 +lorna1 +verbal +pinnacle1 +barbora +241075 +james92 +linkedinpw +noodle123 +business +mystikal +skyler2 +kucingku +june1981 +100497 +wezzy1 +george27 +cooldog1 +tiger2000 +zozozo +victory2 +yonkers1 +sanson +220894 +king00 +natty +kofola +akril2442 +gfccdjhl +intimate +alwaysandf +ecureuil +and125 +nnanna +55555z +judge1 +partha +devera +rikki1 +111966 +01111992 +prasanth +skyking +x123456x +03011980 +bcrich +4422 +123iloveu +evenflow +24091980 +anna07 +jianjian +batteries +080993 +28021978 +qwertyu1 +teagan1 +161980 +gg +02071994 +carolina. +16011982 +nichelle1 +171078 +melissa07 +112004 +210999 +jun123 +ololade +kaleb123 +vlad1994 +120897 +110043 +omarion21 +001967 +anna1983 +hansen1 +a7ckuntldy +denis1997 +berserk1 +arizona123 +regal1 +134 +china13 +angel1991 +411019 +123789852 +mike02 +181992 +marcus +28031979 +emma2009 +lazyboy1 +201202 +dx1234 +billygoat1 +parekoy +giovanni +estrella +crickett +all123 +sargento +peace1234 +canguro +mr1234 +jayne +mimi08 +rockon11 +20081979 +chijioke123 +miracle7 +wy1000000 +supercar +blind123 +sparhawk +torben +casting +ancient1 +ruicosta +pumba1 +mapleleaf +mybaby09 +susmita +lilj123 +britain +25031996 +121071 +molly09 +ilovejosh2 +21101995 +serfeliz +claire2 +johnnycash +portugal +james45 +gerard12 +020977 +marajade +blocked +268268 +++ +nfyznfyz +271077 +13579135 +vojta +dfcz +02011975 +pdbdfby2xx +180379 +isaiah7 +phuket +800008 +anna08 +buttonquail +20101997 +marietta1 +000webhost.com +lawnmower1 +july1982 +stooges +151176 +preety1 +charli3 +111295 +qwerty82 +furby1 +333777333 +argentine +bigbad +emmagrace1 +160494 +maxwell5 +101006 +220475 +l0veyou +rocksteady +lop123 +florida8 +19861123 +suzette1 +dima1999 +котенок +110297 +311093 +casper4 +021409 +sactown916 +peter22 +budala +rollie1 +19871988 +060494 +28031995 +31101993 +timbaland +candy25 +lisa10 +babe15 +oscar4 +bai +max2005 +paintball5 +13101978 +audrey123 +katherine3 +01011997 +repytxbr +nishizhu +110299 +10051996 +bobrik +july1997 +packman +falcon69 +10091995 +billy4 +28121978 +monkey30 +tmac01 +291094 +gem +tigers9 +123123g +cvbn +123456www +101206 +121097 +gavroche +martha2 +olivera +imkool1 +q1234q +821025 +199128 +bastille +makemyday +denpasar +12356790 +03101982 +goduke +25051978 +masaka +blue96 +peluso +rebecca10 +euzinha +andrei +197801 +laura16 +sparrows +abc123456! +5588 +pendeja1 +gfh +20022004 +190280 +cuatro +03071979 +bhabyq +muttley1 +ricardito +latitude1 +sayang90 +schoolbus1 +01041995 +oakridge +07031995 +gay4life +zero666 +alanya +justintime +foosball +musica. +okay12 +forzatoro +cooler123 +18121978 +jenny1234 +hazzard +raiders99 +section1 +matthew0 +honeydip1 +chiquito1 +300479 +board1 +prince4 +learn +deadmeat +061179 +eueueu +23081979 +ancona +06091981 +dragonman +tgzvf55idb +19841027 +austin94 +marissa3 +sakamoto +speeder +malvern +pierluigi +vallejo707 +payment +2708 +hiroko +lunanueva +sdfg +070593 +momsgirl1 +gfhjkm2 +fuckface2 +olayinka1 +asas1212 +raiders +pimpman1 +xfhkbr +blossoms +catty +done +wobble +aurevoir +fuckmyass +ptcruiser +19850101 +gracie22 +karnataka +panda101 +05031994 +chowchow1 +cvbnm +crying +anatoli +133001 +victory123 +24091994 +girly123 +yfcmrf +music2010 +antonio18 +melon123 +karate2 +alex1977 +05011994 +mokona +coaching +tomwelling +reddy123 +dishant +mikey69 +apolon +140479 +momndad +17051995 +powerman1 +alabama +firedog1 +jeremy06 +sonu1234 +290378 +270995 +121108 +tekken1 +jazzmin +secret77 +natureza +030577 +london123 +executor +bulldog23 +nokia1600 +22031978 +04041996 +081194 +ar1234 +ca123456 +zxzxzx1 +kurczak +putas +smiling1 +061988 +2514 +angel1987 +asdf00 +bella2007 +rotterdam1 +miguelange +jimmy9 +trouble13 +gators2 +hugoboss1 +samone1 +mybusiness +17151715 +121198 +23051979 +freedoms +ilham +puma12 +satchel +april2006 +burgess1 +yellow00 +veronica7 +080293 +livelife2 +spartak1922 +lilly13 +petruska +steven9 +caca13 +assman69 +365214 +@@@@@@@@@@ +chr1st1an +donald01 +ap1234 +1239875 +1234567889 +cookies8 +cece12 +juanpablo1 +asdfghjkl1 +gabriel6 +tiger34 +redshoes +rodnik +deloitte +bandit6 +bahadur +macias +holly5 +walker01 ++ +140995 +victoria. +4649 +14081979 +skank123 +qwerewq +stasia +soloman1 +angels02 +baranov +780504 +luver1 +zzzzzzz1 +alicia10 +vasilina +number99 +bananas7 +mariahcarey +graduate08 +clear1 +samir21 +neronero +stocking +boylover +vikas123 +franklyn +951951951 +kazuma +nephilim +clements +peaceman +thatha +friskie +den1ska +lynn15 +030578 +lesego +kisulya +dakota15 +26091993 +peanut33 +aaron6 +123456zxcv +sereda +jayden7 +weight +goldflake +black0 +220976 +angela! +wigger1 +bluegill +14031978 +12121973 +a134679 +1bobby +london44 +diablo6 +kenny23 +boggle +puffdaddy +sharkboy +robertina +imaloser +nini12 +scamp +cleaning1 +180279 +58565254 +ranma +hottest1 +jhane +ivan1989 +25222522 +colchester +barborka +jamie10 +12122008 +jewelry1 +tammy12 +727727 +090782 +tyshawn1 +nessie1 +130575 +25101995 +pollen +25011980 +jay-jay +`````` +20041979 +shianne1 +nate23 +madden12 +cocodog +chimchim +forreal1 +phillies08 +gfdkeif +jackson. +bigdaddy13 +kaskad +123654789q +cristian +110475 +loco69 +andre11 +papapa1 +ashley97 +161295 +bonsai1 +nana06 +lj: +pretty07 +cheer8 +master89 +enomis +010608 +2mylove +lindsey3 +al1716 +alicia22 +stomper +mummy2 +0213 +savana1 +250994 +pakistan47 +totoybato +george8 +toyota99 +29081994 +12345654 +8686 +rom828 +clover4 +allyssa1 +24685 +hottie25 +scout2 +loveit2 +charlie03 +nokiax2 +stank1 +singsong +tiger321 +julius123 +miriana +30011982 +inlove07 +red123 +minotauro +19101979 +luis123456 +robert93 +eatshit69 +pirata1 +shaddy +290694 +01051976 +19001570 +allthat +0106 +dima1986 +anything2 +ryan +oioioi1 +1469 +йцукенг +horses +131195 +100375 +ненавижу +poiu1234 +1235678 +27091994 +memorial1 +ads123 +honda03 +pavel123 +15091978 +140394 +mala +jack16 +270278 +silentium +121199 +710710 +fuckyou111 +adrian06 +davidr +flower77 +badass11 +felino +221978 +primary +211075 +3310 +060994 +bulldog4 +210296 +qwe123! +678900 +dollie1 +197619 +0921 +newyear08 +molly99 +dios777 +musicrocks +timoshka +askim123 +dunamis +15051975 +guillaume1 +general2 +payton12 +diva21 +25101979 +rawalpindi +ihateyou4 +300694 +458458 +mikey6 +03061979 +king19 +dartagnan +240277 +jessica03 +sebastian5 +dodge2 +forlife1 +199419 +flower18 +2662 +benjamin! +ariana123 +beemer1 +12051996 +791127 +jamesr +behappy2 +winter2011 +150476 +south12 +24051996 +vika1996 +2244668800 +2people +jolly123 +051982 +barmaley +basketcase +060282 +myspace86 +comp +hottie19 +pusssy +madison200 +holly13 +198007 +cocacola7 +skyline12 +1q2w3 +guyver1 +doorbell + +040794 +cayman1 +ernestine +gerber1 +150495 +bunny14 +211991 +jelena1 +tink16 +imsohood1 +560103 +030396 +softball32 +dudu123 +redneck21 +03061995 +180478 +poopoo0 +balla123 +golfer69 +yeller +bailey98 +karim1 +logan6 +200596 +21062106 +mnbv +02081976 +21021996 +lidia1 +amour100 +sasha007 +deliver +danecook1 +call +kitty55 +snoopy07 +roxas1 +00990099 +red234 +georgy +rfybreks +smiley +whitefang +may1985 +sniffy +yilmaz +19851011 +diamond24 +charles21 +09121993 +xfk3bxezqj +mickey1234 +newyourk +honda89 +011980 +loser12345 +18021978 +johnson +ares +chris85 +phoenix01 +sarasota1 +181994 +lulu01 +2906 +malachi2 +gold11 +floripa +casetta +winnie11 +oguzhan +mama1970 +04061994 +number34 +beograd1 +fuller1 +michele2 +creatine +p000000 +nimisha +weymouth +polo00 +granger1 +27091979 +03031996 +qweewq1 +201983 +all4god +sooty123 +120772 +eagles9 +amor16 +hotbaby1 +jack007 +040894 +lilly3 +abbygirl1 +superstars +oliver09 +samboy +joinme +qazxdr +041177 +15041995 +lev +donna12 +cagnolino +polita +1police +frank69 +22081996 +040877 +redder +bball6 +gangster4 +8123 +1967gto +19861218 +240178 +12081978 +011094 +bigworm1 +1hotrod +ted123 +2hot4tv +blood69 +falcao +mustang92 +jordan29 +37217086 +070393 +beto13 +ball22 +thumper12 +3377 +soccer35 +08081996 +07081978 +foofighter +jeff69 +yummy69 +wilderness +1indian +cfkfdfn +iceage1 +100775 +rhbcnz +henry11 +pineapple! +080896 +michael55 +2333 +barca123 +hotpants1 +pequena +lasvegas2 +bro123 +brody123 +rooter +bradipo +silversurfer +kiki99 +loveyou15 +lilman23 +miamore +meandme +1819 +celery +rofl +sizzle1 +280195 +diciembre2 +1inlove +1138 +crafter +killer91 +rayados +hawaii! +cestlavie +alyssa16 +maddie5 +jacque1 +surrender1 +hugo1234 +james2010 +280379 +06031981 +brutus123 +bella88 +austin88 +1357911q +rfkbybyf +fcbayern1 +longhorns3 +cherrys1 +03091980 +romel +070494 +haselko +serpent1 +mama1960 +myspace* +11111975 +789789a +confused2 +babs +wonderful2 +charmed +icecream9 +stadium +redstorm +51535759 +180179 +29061980 +03111980 +j666666 +vazquez1 +zahira +dear +140896 +compaq13 +sys64738 +baby86 +robert02 +venkata +24041979 +saraba +pickle7 +120873 +ladybug9 +ellehcim +197555 +malta +28071980 +richard07 +delta4 +mattman1 +andruha +lilolilo +bonefish +23071996 +babygirl44 +balthazar +blood101 +marvin11 +franks1 +callas +080493 +claudia13 +george24 +imahoe1 +3ub9xm53xi +super14 +27081981 +megryan +ataris +sir +haha101 +iloveu18 +02031974 +erika13 +dhananjay +internet11 +grande1 +peace9 +15121977 +confirmed +singlelife +smetana +250496 +a246810 +1718 +septembe +joejoejoe +jujujuju +mamaypapa +091979 +cedar1 +bandit4 +dollhouse +197830 +ilovemom! +pepper16 +jonasbros1 +jacklyn +yamaha69 +senhasenha +22031979 +perroloco +skyline7 +lilwayne4 +pokemon98 +vincenzo1 +17021977 +101273 +sophie23 +27011981 +golfman +197212 +1424 +maurice3 +precious5 +15021996 +hellboy666 +acevedo +frufru +dickhead69 +steven20 +mario +ghbdtn +199129 +asesino +26091981 +fynjyjdf +eric09 +mama1964 +zhangyu +06021994 +daddy#1 +iloved1 +steelers#1 +111075 +kisumu +291278 +triada +iamtheone1 +thesun +17011980 +inuyasha15 +199911 +ploppy +412 +cneltynrf +dakota98 +cancer2 +27111978 +neger123 +x1x1x1 +mostaganem +040609 +757757 +jake00 +iloveblue +141176 +01234561 +chubby123 +splender +jayboy +maveric +adg123 +redskins +luxeon +3horses +050777 +10101968 +1lovechris +christina! +wibsh56kec +letras +asdfvcxz +jesse15 +dayang +wildcats11 +petroleum +lilmamma1 +solaris1 +11101995 +tony25 +071984 +010207 +lawton +robert28 +scorpio123 +abdellah +maxwell +letmein9 +15935728 +adebayo1 +super15 +tragedy +askimbenim +anneso +1771 +14121977 +sarah99 +rand0m +bumhole1 +jkjk +surbhi +shoes2 +070980 +chinedu1 +juggal0 +elijah04 +110875 +greggy +nissan300 +holiday +ibadan +holiday123 +qwerty1993 +pinkness +carter22 +diddlina +24011980 +loserface +matrix10 +821015 +aldana +masloboinikova1987 +1november +jellybean7 +hahaha5 +guitar15 +tina69 +remilekun +sammyjo +741230 +31011979 +princess81 +godzilla +050694 +ilove1234 +100398 +19871024 +bashful +gregory3 +twins3 +cats22 +serenity3 +zxc098 +120300 +spike1234 +epsilon1 +iloveu88 +00000000000000000000 +tailor +18031996 +1asdfghj +woodbine +aaa888 +gonzalez12 +36912 +100396 +220195 +33443344 +aaprintbb +santaclara +maggy1 +customs +patapouf +dread1 +samual +22111978 +predator2 +dcltabih01 +060894 +cricket7 +4rfvbgt5 +jaja12 +tooth1 +mamapapa +888111 +cupoftea +250295 +anthony00 +319319 +0602 +humans +mara123 +jess10 +sanchez2 +nenene +310877 +1turkey +coach123 +010696 +wolves2 +bellatrix +092 +classof99 +mooses1 +030478 +poepen +chimera1 +kleine +51286700 +160779 +123123123123123 +25051977 +mylove15 +badboy15 +westside11 +liverpool05 +1q2w3e +goodwin1 +billy23 +tropicana1 +lovecats +rosewood1 +suave1 +tyrone79 +24061978 +sarafina +nicholas. +alitalia +431001 +cookie06 +ueptkm +020409 +anais1 +aslan123 +camp +stairway +rowley +scoobyd00 +071293 +19851030 +161982 +05081994 +tvinktvink +kyle16 +diva08 +06011993 +heybabe +ziomek123 +monument +portugal17 +191980 +17121996 +queeny1 +050878 +culinary1 +alison12 +bassie +jumpman1 +manola +020206 +21101979 +pierre123 +bailey77 +sensesfail +faith77 +rio123 +kartal1903 +kimora +wood123 +140396 +falcons07 +03051979 +781003 +sixkids +panino +worms +121102 +fallen3 +kevins1 +referee1 +barry20 +pw1234 +ginger101 +rko123 +password47 +runner2 +audis3 +shanae +codyboy +priyaa +trek +210295 +nicklas +master12345 +passion3 +babi1234 +password_1 +bailey17 +whittier +19051978 +150877 +barrel +blood22 +240377 +asd123321 +shadow04 +south3 +france2 +kissable +athlete +navyseals +snuggles2 +24101978 +noviembre2 +peugeot406 +deadeye +080580 +bmwe30 +light12 +bitchbitch +submit123 +cdtnkzxjr +chelsea88 +ronald +killroy +bronze1 +18111980 +jesse69 +sqdwfe +050492 +tha +90107142a +danielle07 +drugs +john05 +zagadka +zxc123123 +seniors06 +svoloch +norwegen +twin12 +gallo1 +billy10 +shemale1 +010408 +loser16 +080807 +show +dementor +kobena +ballard1 +jea +qqqaaazzz +kollol +231981 +pa44word +surgery1 +dixon +college09 +heaven22 +kirstie1 +02051995 +bigpun1 +1cassie +qwest123 +sammy +counter123 +benbenben +140575 +maryj420 +frances2 +25352535 +manner +020608 +02041974 +blazed +101270 +blubb +lbyjpfdh +061989 +coolbaby +denise14 +jacob +200894 +midnight22 +060283 +121197 +5678dance +260294 +180477 +bas3ball +lolnoob +shorty20 +06121981 +231978 +gazprom +nupe1911 +violet12 +bigworm +051094 +vivian123 +pussy6969 +will22 +final123 +bear07 +bloodgang +1rooster +999999999999 +110376 +19061979 +julia7 +hottie94 +panther10 +151094 +money +sassy14 +solutions1 +600005 +abcdef5 +5starbitch +chois777 +mike123456 +preppy +deuce22 +puccini +02051976 +19021995 +jeffrey3 +sylwia1 +12091978 +199025 +kukuruku +livinglife +morenita1 +14081995 +oneshot +271991 +rocker101 +10011978 +120305 +skate9 +californication +plant1 +iloveu0 +cody21 +tribe1 +freddie +samuel5 +07041981 +spagna +wedding09 +19081978 +dima1989 +mittal +player17 +3128 +26111980 +felony1 +badcat +leon13 +chipper2 +shelby07 +godisgood! +michael86 +goodboy123 +cat123456 +victoria08 +18011995 +vqz6qyo294 +duhduh +171277 +britney +august123 +domain123 +ak1234 +whatsup123 +5522 +vfuflfy +rockstar. +jon101 +dragon30 +american2 +abcdefgh12 +040193 +camila01 +waldorf +milani +cassie23 +spit +mementomori +280678 +solitario1 +soup +qwerty112233 +hadiza +thissucks2 +213546879 +abarth +080482 +071179 +15091995 +bondar +tobeornottobe +9090909090 +r654321 +dayday2 +elijah03 +michelle03 +qweasd11 +22091996 +zak +laney1 +011295 +deidre +chris90 +rollingstones +crochet +asdfzxc +27071977 +crap12 +rekbrjdf +25021977 +05091978 +jacquie +29081993 +musicbox +bigdogs +261076 +eyeliner1 +watitdo1 +09101981 +polo13 +lady21 +asians +qqqqqqqqqqqq +050181 +bubba101 +blueline +password43 +cocacola! +24111994 +lagbaja +treytrey +werwer1 +billy! +k.,k. +architetto +090595 +pershing +drunk +gshock +31051979 +djibril +brandi +kalifornia +coffee22 +ain123 +10041977 +jongjong +tears +friendofyoucanmake$200- +kevin99 +whitley1 +paige11 +198929 +marines1 +sexymama10 +paloalto +gustavo12 +honda00 +olivia21 +bills +brentwood1 +piccione +sk8mafia +eltonjohn +071983 +rowan +christiano +050900 +malyshka +dakota6 +alfa123 +jazz01 +diplomat1 +sunshine05 +150396 +jazmine2 +olivia8 +14371437 +lovebites +123132 +020709 +february16 +bigballs2 +qqq123456 +paulwall1 +ash101 +marykate1 +codigo +yellow08 +10121975 +jeancarlos +matt06 +qwerfv +1q21q2 +jade23 +bulldog6 +pivoine +grzesiek +estudio +666667 +kagandahan +060382 +tbs13 +09111992 +bachata +kk12345 +pfhbyf +25412541 +loverz1 +kayaking +010479 +panthers! +121210 +zachary8 +rothmans +spicy +honor +21081979 +muskie +vikingo +22041978 +19881212 +bobby +pelusita +14031403 +sandals +14071407 +26051994 +doggy11 +ithaca +04101993 +30041978 +271982 +catsmeow +oyindamola +121262 +castellano +ipodtouch1 +12345zzz +twingirls +newlove12 +lp123456 +loco11 +closer1 +gemini06 +miami12 +boulet +031995 +surfing2 +190693 +shivan +cgtwyfp +2528 +mpc2000 +zinzin +kiley1 +allochka +c123123 +morgan98 +555566 +308308 +dookie2 +joycee +overcomer +199023 +paige01 +megan4 +010307 +sexygirl23 +harley55 +peyton12 +jdq4j8lu3a +iloveanna +06051982 +141070 +7891011 +vickey +jordin +iheartu2 +dragonage +champion +rowena1 +live12 +monkeyman2 +201194 +2515 +25021995 +susanne +thecrew1 +metropol +cosmo2 +chloe09 +180577 +shines +160178 +120499 +rocket01 +caiden1 +gandaako +sebastian8 +chrissy123 +filip123 +22021997 +240378 +171994 +c111111 +bobby14 +elloco1 +dfktynbyrf +25081979 +lovesloves +childofgod +180476 +luis69 +nfhfcjdf +hoopla +cameron23 +11011978 +teddybear6 +29081980 +49ersrule +bitch02 +110275 +2q3w4e5r +moonriver +0523213511 +220676 +payne1 +1288 +sexygirl9 +gucci2 +2518 +readme +ser123456 +reymond +shantell1 +310578 +postal2 +jessica93 +15061978 +untouchable +caden +zx12cv34 +galileo1 +along1 +maulwurf +andrea1234 +that +edward8 +456abc +110675 +funkytown1 +jayden21 +09021995 +771177 +21061978 +vaches +080982 +alegria1 +noname123 +sdsdsdsd +chester22 +callum01 +howard2 +scared +armenia1 +mireia +532532 +120400 +mark25 +clarinette +kokotko +ghostface1 +060677 +isaiah5 +fatouma +palmtrees +happening +200878 +anna2003 +iloveu07 +1524 +teejay1 +cdjkjxb +showbiz +124589 +subwoofer1 +diaper +sweets12 +3219993xx +040696 +21061996 +redfire +iamme +leonie +200608 +myspace001 +iloveme101 +1two3four +purity1 +valleyforge +06071995 +250793 +bigbob1 +cac +23142314 +191095 +16121976 +030293 +lovehina1 +antonio6 +sexycani +051383 +shelby08 +chicago6 +carey1 +tweety19 +197929 +drummer12 +lovie1 +17091995 +68chevelle +espinoza1 +betmen +drink7up +kurdistan1 +getmoney11 +chidinma +196464 +bianca10 +201208 +muffin +jorge10 +jamieson +funk +hater2 +octave +kangen +webbie1 +carlee1 +haribo1 +katika +dolphin10 +ily101 +08071980 +etoiles +record10 +love1010 +schnecke1 +420420a +dominic7 +taliesin +passion +martin99 +georg +qazplm1 +davinchi +28101995 +06101980 +79camaro +hometown1 +walter11 +23041978 +20021997 +cora +olaolu +ender1 +marocain +010279 +vj +eleonor +kiki21 +jabbar +ilovenick2 +winter2009 +firewater +cin +tony19 +040381 +iniesta +hgf4h3fhf +13271327 +gamer12 +granny12 +fisher2 +robroy +silverwolf +master66 +5544 +07061981 +ilovejorda +jd123456 +rosebud123 +o1234567 +123_123 +999998 +antoine +831013 +allison5 +co2008 +lipton1 +cabelo +coolkids1 +13051978 +fuckoff88 +30101995 +hitler123 +110028 +karina15 +17012003 +vanessa6 +020575 +dagmara +jiang520 +colima1 +24kobe +nepal1 +jhajha +kiesha +grumpy13 +20101977 +cristiane +devin3 +260195 +dasdasdas +fahbrf +09111991 +vigilante +pontus +030307 +edw +11aa22bb +harrydog +unlucky13 +mgoblue +gillespie +barcode +778866 +abdullahi +olga2010 +24021996 +study +19951996 +montana1 +geoff1 +musashi1 +restart1 +didi123 +boomer10 +worksucks +sandra5 +160977 +gloves +dork12 +04071979 +ktyecmrf +amamam +270293 +frankreich +my1stlove +1905gs +040474 +chick3n +sex +090893 +ladybug6 +sinead1 +ujhjljr +pokemon88 +tinker9 +141096 +kirstin1 +fiftycent +hardcore7 +reserved +redneck08 +robert30 +++++++++++++++++++++ +ye123456 +hotie1 +1530 +oct +moose3 +151515a +samsung69 +michelle02 +ihateyou11 +brian08 +juggalo123 +060698 +pierpaolo +nick92 +040294 +babykitty1 +q000000 +maryna +240895 +erica13 +8marta +dakota9 +150808 +chouchou +n2xcfgjcvr +sexybitch7 +meomeo +bro3886 +genesis3 +apple17 +johncena! +hantu123 +mygodisgood +ninja69 +flblfc +2manykids +lakers88 +wingwing +rocket22 +countdown +babiigurl1 +271196 +123456r +dan +charger06 +01081977 +cheese44 +27101979 +ensenada +p8ntball +gertie1 +steve22 +papyrus +300577 +muffin10 +270179 +01021997 +schoolgirl +041195 +ddd333 +olajumoke +wondergirl +altec +27121979 +brooklyn09 +josephine +pontiacg6 +camile +bono +skippy11 +diable +stoffel +hitokiri +neopet +wichita +marten +nikitosik +dancer17 +capitaine +chrischris +antwerp +123e123e +raiders9 +juggalo6 +040695 +1421 +theman22 +excite +password64 +martin24 +ameena +judas +linkedpass +lovinit +vanessa16 +jonathan17 +silmaril +55255525 +741852963q +bailey69 +shelby4 +blessed! +tropic +custodio +198928 +usg242 +240279 +150676 +ballin6 +1toomany +123456pa +motherwell +antigua1 +winter2008 +lovemonkey +19851015 +201075 +marruecos +myspace84 +always123 +311294 +ghjcnjghjcnj +1359 +akucintakamu +64chevy +acrobat +rayray7 +gaara12 +5262499 +171295 +a123654789 +jujubean +reynald +poop111 +kristin +gamlet +kamari1 +666666g +melissa24 +justin95 +viridiana1 +juggalo13 +27051994 +heybabe1 +yahoo99 +27111979 +asdasda +molly69 +blinker +chokolate +berry2 +littlered1 +vasili +snoop2 +tdutybq +ilovebryan +lucifero +johnson4 +dinner1 +xiaozhu +myjobs +08081977 +88488848 +841028 +network123 +martin17 +samdog1 +villas +bronte1 +pauljohn +12041976 +february17 +phelps +bobby9 +123killer +mabait +020795 +sucker2 +19831020 +ginagina +rancher +qwerty987 +65impala +blake3 +ghostman +0331 +chicano13 +bandit77 +laptop12 +allister +021079 +daddy16 +200496 +jack04 +vfhbyf123 +loveu! +abi +mexico06 +adrian4 +buggie1 +wiktor1 +090193 +eddie23 +beckham +privet123 +198803 +spalding1 +melanie! +29121979 +allblacks1 +tdubdub05 +mexico25 +040679 +helena123 +111106 +ass101 +whyme? +05021994 +boys2men +yeahboy1 +smoke12 +cagada +555666a +harlie +gratis1 +deadlock +smokey99 +olivia14 +precious13 +redsox8 +tutifruti +esmeralda2 +lightfoot +199228 +buddha +magic6 +lola23 +cinthya +081279 +170795 +201102 +marybeth1 +120100 +kim12345 +lol100 +26061978 +3bitches +panda23 +creole +07101994 +sundin +happyfeet2 +dragon52 +091193 +142434 +secret00 +091293 +3fozaqb33q +bigbang123 +180778 +radmila +djerba +rajawali +oran31 +lfieyz +escapethef +gavilan +hannah88 +wolfy1 +cousins1 +loveisgod +jennifer07 +mafalda1 +hotaru +2dragons +121069 +19861015 +04091979 +iamlucky +ksenija +kayla17 +alucard666 +street123 +welcome22 +280394 +qwerty1986 +easyeasy +srivastava +strongbad +rotciv +ulster +school07 +xavier21 +babylove3 +charmer +jr1234567 +p0k3m0n +dimo4ka +dylan04 +noel12 +daisy15 +w8agc47kla +may1988 +05061978 +hummerh1 +040576 +heather07 +animal11 +della1 +diana22 +mollygirl1 +oracle123 +kevinb +270994 +04111982 +79137913 +021983 +kirsche +bhabyqoh +ema +130396 +220272 +040180 +smi +tanja1 +elena12 +mariac +19851020 +toshiba2 +sexydiva +ana123456 +webkinz12 +gotrice +yunita +280707 +pizza6 +jayjay01 +170278 +123456ff +zebra2 +system2 +035690 +number55 +pookie +cameron14 +jade10 +bebop1 +nastusha +051980 +toughguy +denis1994 +omonoia +chris82 +jeopardy +198586 +portugal12 +partyhard1 +110974 +08031979 +1loveher +121265 +toyosi +maha +jovan +qqqqqq11 +landon123 +210175 +shawty123 +black55 +071277 +fuckit7 +mkvdari +littleman3 +madeline +surround +0903 +fabric1 +alltheway +doom12 +chargers13 +scouting +gay1234 +bandit99 +1stoner +tennis21 +specnaz +13031978 +1xxxxxx +hanka +bart12 +jorge2 +poop45 +16121978 +scooter6 +britany +dome69 +travis199 +katelin +flocke +holland +@yahoo +1lovebaby +forty2 +biggay1 +212224236 +ammaamma +redman2 +fktrcf +lilly5 +trousers +allegria +strongbow1 +mamuka +tenor1 +matt633 +estudante +calilove1 +06051994 +citroen1 +estrella10 +brenda14 +jade08 +27081994 +tay-tay +sea123 +jiji +210575 +122123 +r1r2r3 +stuffy +sunshine32 +08011981 +damian11 +soldier2 +honey +disney5 +def +191981 +28081996 +ticotico +leighann1 +cjhjrf +webcode1 +angle12 +icp666 +wwe.com +111007 +smurfy +katy12 +nitram1 +action123 +andre23 +jenn5366 +qwerasdf1234 +makimaki +monkey68 +mirka +mackdaddy +store +olalekan1 +nasrin +200001 +190379 +chechen +rugbyman +salvacion +180695 +123741 +031077 +erica11 +mylove24 +13771377 +sandra14 +031078 +120974 +24111979 +rockstar16 +vegeta2 +beauty! +andre10 +virgen +magda123 +elenaelena +penny7 +momo10 +calender +drumming +gago +tope123 +hobiecat +doggies2 +310178 +masons +pickle! +dodgers11 +fyfnjkbq777 +overseas +skittles10 +bocephus1 +katyusha +28972323 +rocky12345 +quinto +denise09 +22031996 +120603 +226622 +chevy98 +bombom1 +ismail1 +pietra +furniture1 +lolcats +rollins1 +sunday7 +poplar +meatman +factory1 +211195 +30071980 +fishing7 +281076 +b1teme +jazmin123 +password65 +metoo +300977 +ilovenikki +23071977 +emma2000 +jimmorrison +030677 +pageup +sexybeast! +suhasini +redlight1 +++ +goldengate +010896 +dates +290479 +kalbo +dude15 +tomasz1 +902860 +6shooter +rishi +rebel4life +lolada +pakalolo +chivas16 +youngluwe +02031975 +pes2010 +dreday +fyyf +balling +evette1 +29041981 +raver1 +425425 +rankin +alluser +morris123 +lolek11 +nd4spd +jobert +siopao +ryan2006 +nanna +devilz +212121q +rapstar1 +oluseun +jktu +lilmama15 +sarah19 +young23 +113114 +84728472 +ezequiel1 +gromit1 +yahooid +lollie1 +iloveu101 +nate1234 +18041996 +1618 +28061980 +aelita +212321 +adithya +prezident +143000 +mitchie +1kelly +disney7 +babubabu +hawker +sodomie +grandpa2 +fuck +p3anut +ronaldo77 +buster25 +06071994 +08041981 +060993 +kailua +ivan1992 +marijo +jay101 +poopey +cherep +rusty3 +shutup12 +iloveu24 +snoopy17 +asdf13 +240177 +115 +nicky2 +portman +230708 +rockstar123 +june2002 +textile +goobers +pimpette +nokia6020 +myspace03 +sunlight1 +imsexy2 +darkn3ss +sorina +19861024 +290895 +shona +pippy1 +martin08 +november01 +montano +allahhoo +myl0ve +041984 +13061306 +30011978 +helenka +loveyou +motdepasse1 +25051996 +140876 +duran +shakthi +monica. +ilovealex2 +lauren05 +taxidriver +666665 +password001 +12121313 +08021981 +22121977 +queensland +bratz9 +lov3ly +youyouyou +killer100 +classof2011 +ashu1992 +13121977 +corey11 +shelia +swisher1 +camaro2 +houston23 +chicken24 +100275 +anastas +prince07 +vb[fbk +251294 +carranza +loverboy7 +maddog69 +god101 +loris +vojykgi959 +145623 +281983 +07101980 +seo123 +070193 +lovelove123 +bigguns +snoopy16 +willow3 +19861226 +02111993 +fresco +whitesox05 +061983 +bball09 +harry10 +hotmail11 +buddy18 +1jasper +bambam01 +aragorn +angelheart +stryper +04061996 +31121995 +ambre +titties2 +foxglove +phobos +bogie +1234tt +hartnett +777777s +1fucku +tallman +greatday1 +teamoo +100176 +chevy04 +tiffany15 +1fender +1coolguy +miyavi +sashimi +6655321 +220975 +pass55 +batman666 +computer20 +guthrie +19851111 +josh20 +saxaphone +pitbull69 +dolphins3 +19851125 +sweettea +lamalama +hailey5 +angie11 +patty12 +krystel +19871023 +1balla +elisa123 +19011996 +aga123 +sharma123 +scorpion12 +gabby5 +221075 +080408 +310878 +08091980 +001007 +jamie21 +gonefishin +sandman2 +shrooms1 +ilove16 +pakkness +fredom +onion +110400 +cleaner1 +100776 +sanjay1 +becool1 +280894 +060309 +barchetta +1q23456 +h0llyw00d +17111979 +malade +041293 +tobacco +cdbymz +180895 +gisselle +ida123 +080494 +cerveja +pepsi69 +misty13 +05071979 +281176 +197710 +14101978 +qwerty1994 +shahnaz +michael97 +kayla18 +flatland +warrior +05111993 +kiki15 +swat +grace22 +olga1987 +lips +720720 +1xavier +230303 +tosca +refillmotives +ruslan123 +lovely19 +stiletto +anjaneya +index +06111982 +angel999 +kissme5 +growth +19841017 +qwerty1988 +emily02 +eeyore12 +nigga10 +210894 +masala +lorena +apple +animal69 +011294 +111274 +spirits +friendofeveryemailyouproc +booda1 +021981 +slipper1 +yodayoda +peugeot106 +armin +danny9 +311276 +famous11 +janganlupa +snowstorm +31071995 +qw1212 +mistake1 +deano1 +alberto13 +google6 +luna22 +underpants +pouncer +m121212 +26071995 +joshua89 +kikumaru +grigri +kaikai1 +loveyou08 +sexy36 +highbury1 +snooper +18081977 +sephiroth +ashley1 +brandon98 +henry01 +cancer13 +hottness1 +angel1989 +free4ever +fakespace1 +131413 +090282 +powerfull +16041978 +821018 +password57 +march2008 +app +180278 +cubs1908 +444455 +private123 +141981 +stupid101 +lovebug13 +david00 +julie +dukedog1 +4561 +celebration +dukester +furman +hunter96 +peekab00 +sparky5 +forsberg21 +741852963z +stressed1 +1239 +1lilman +andrusha +ficken666 +03041979 +28111994 +milady +pickle11 +cinco +606606 +tugboat1 +120507 +dick13 +player09 +qwerty11 +simpsons2 +pooping +260877 +07031993 +dementia +1boomer +hellhound +blowme! +iloveyoujo +needmoney +xavier09 +southport +babygirl56 +labirint +615615 +07081979 +version +marley22 +nando123 +cd1234 +turandot +creep +200809 +oso123 +alexandra0 +1236987456 +jayjay22 +practical +lalala22 +30111979 +mommy16 +tennis07 +iloveyou42 +fuck07 +fucker8 +tito13 +qqqqqqqqq1 +legal +spiderma +unhappy1 +welkom123 +290879 +ilovehim5 +sonicx1 +010908 +221074 +master20 +naynay2 +orange19 +jab123 +lucas23 +111169 +choose1 +playgurl +wesley01 +kimmy12 +guapa +room101 +dukes1 +tete +chantell +23011997 +rebound +ssssssssssss +15061977 +fullerton1 +morris12 +060594 +komodo1 +17011996 +luiza +cookie00 +110896 +parent1 +0421 +sac123 +iloveliz1 +cowgirlup +050993 +pietje +college123 +cipollina +martin. +paintball0 +massari +fenerli +suck1t +compaq +30101979 +vtx1800 +guitar9 +croatia1 +11061979 +12121970 +159357258456 +dragonfable +sunshine02 +gonzo123 +031988 +yggdrasil +melimelo +kmdtyjr +morgan18 +p1ssword +preview1 +cocacola3 +lyts123 +19021979 +051981 +141312 +horse7 +matt88 +anna09 +159874123 +colocolo1 +momo22 +mnbvcxz +carota +bharat123 +346100 +02121979 +sunflower8 +shafiq +1jayden +03011981 +21091979 +fuckit420 +290395 +080780 +angler +jasond +07071979 +camara1 +sara23 +tyty12 +400020 +funny5 +mexico88 +muse +051179 +tomoyo +bac +artem1995 +lilmama5 +lichking +11061106 +100874 +sean23 +northside2 +akbar +naruto19 +rinrin +bethany123 +keisuke +deedee11 +25091996 +townsend1 +0908 +gillou +123466 +sowjanya +198315 +laural +stakan +stayaway +29091978 +lazaro1 +linked1n +07051994 +ficken69 +160995 +sana123 +valeria2 +741456 +243243 +shadow28 +krayzie +sandra18 +pussycat69 +ontheroad +hoover74 +1234432 +hellohi1 +colten +fucknut1 +qpwoeiru +adaaja +wilson23 +shawn22 +wilbert1 +denise5 +ट: +masato +gershwin +heartland +03051994 +equilibrium +lonley +23031978 +loo +adam16 +sasha1987 +george06 +camille2 +nargis +jaguar +ride +wu-tang +jessica94 +123music +07011981 +199523 +mutter1 +apa123 +kundan +wzr8ycfxrm +virginia2 +darion1 +eugene +7732844 +francis12 +december05 +pot123 +fishbowl +chivas07 +rwanda +24121979 +307307 +310778 +159258 +soleil123 +bellavista +florentin +0024657 +29111981 +cupcake15 +andrew94 +5555566666 +sara7272 +19952009 +friends06 +bigmoney2 +wyatt123 +radhekrishna +orion2 +fas +04011993 +153 +0987612345 +198006 +1qweqwe +warriors2 +07031982 +marlen1 +080782 +kurt123 +jamie4 +rostov8888 +james29 +101199 +cello +spicer +geordie1 +harley96 +rbceyz +g-unit1 +060194 +ololo123 +james00 +210676 +041988 +radiant +tiffy +paparazi +196200 +david2000 +tayla1 +spawn123 +july1980 +billups1 +03101995 +thetwins +oioi00 +kyle69 +florida22 +nitro123 +nofx +tweetie1 +broken3 +020596 +bass11 +781020 +7777777c +1949101 +231994 +030803 +panther1 +chrono1 +frank5 +jh5thrwgefsdfs +talleres +pacman12 +jayden +hulagirl +1change +123kkk +tata11 +emmajean +bootleg1 +darkone1 +qwerty02 +cocacola +scales +020609 +window2 +megan16 +february15 +260777 +agatha1 +keira +beowulf1 +100dollars +wenyin12 +19851228 +drugfree +victoria23 +dancer9 +prieto +07021981 +05041995 +monkey123 +fifa2011 +shahrukhkhan +fireball2 +orochi +01061977 +christ11 +kingdomhearts2 +maryjan3 +198008 +020477 +sugarfoot +heaven13 +nbibyf +87chevy +travis15 +anatomy1 +05051997 +george77 +peaches6 +julio10 +h0ller +lashae +trusting +vitinho +080593 +boondock +football101 +single16 +motoko +edmonton1 +sexybitch4 +reaper123 +wanderers +taruna +bmwe36 +951753852456 +curry +ryanjames +20051976 +24041996 +skeletor +anna2005 +131400 +alaska11 +maximus1 +legend2 +loco1234 +29051994 +chucky12 +saracen +blond1 +vball7 +081277 +shanda1 +imsohot1 +link123456 +yousuck3 +000000k +lala101 +198104 +291991 +richie123 +aotearoa +ianuarie +cleopatra +vagina12 +bonita13 +mish777 +asd654 +gemini88 +mycats +30031977 +incorrect1 +rustik +flower17 +250776 +travis09 +stroker1 +smudge123 +clock123 +oddworld +oxygen1 +010506 +brian4 +04031981 +2bitch +k55555 +ms +100299 +rosendo +240896 +r00tb33r +26101996 +july1995 +badcompany +cbhtym +teach +123asdzxc +271095 +brandy23 +mypassphrase +26041995 +szymon1 +1q1a1z +shetland +renren15 +713houston +reload1 +eatmyshorts +boragud02 +nanay +lynn16 +ste123 +zwinky1 +14061996 +13511351 +allen11 +imcute1 +abcd2244 +tassie +0124 +chulita +muff1n +160000 +dynomite +07041993 +rabbit3 +mex123 +ccc111 +monkey79 +gearhead +texas06 +inferno666 +forzalecce +potter ++ +nikki06 +2gether4ever +zaqwert +nascar38 +arista +040694 +livelove1 +alyssa9 +no1234 +010909 +woody12 +waverly +lover56 +aaron8 +13795 +iluv +raducu +291988 +01041996 +jasper23 +junker +fdsfds +181993 +305001 +valeria12 +jaredleto1 +15011995 +sexygirl09 +jimmy14 +0702 +04051979 +guilty1 +21011997 +freedom2010 +qwertasdf +jessica28 +aranha +261983 +030878 +nastya1995 +mamula +janita +ryder +sandberg +hotdog01 +maguire +bobmarley2 +andrew01 +michael32 +pelon123 +iamlegend1 +mee123 +123kat +dvddvd +fender3 +co2010 +smashing1 +azizbek +theone123 +280778 +shadmoss +concept1 +200194 +general +bahalana +tyutyu +parsons1 +lolliepop1 +02011977 +shorty#1 +241076 +slimthug1 +199223 +guitar14 +money05 +embassy1 +tal +sniper11 +lcv7bry1cf +starwars9 +laura18 +fernand0 +fallout3 +hottie99 +giovanni +panther21 +17031978 +carolina22 +jaguar12 +159159a +stacey +ilovechad1 +маруся +gala +lucy07 +poopoo3 +151096 +radford +19851215 +071278 +z1z2z3z4z5 +maddie7 +201984 +lilmama07 +coronado1 +darlin1 +teamo23 +jazzy101 +mascota +ninja250 +motorola2 +simplegirl +kitty06 +elise123 +zakzak +julian7 +tazz123 +wilson10 +1793 +dino1234 +bogdanova +fluturas +mother03 +buttercup0 +piggie1 +0603 +billiards +ven +sadie5 +acdcrocks1 +bastion +valentinorossi +idriss +redskins1 +linda15 +nene16 +madison14 +zhangyan +compusa +soso123 +kotova +821212 +400701 +mavipies +180978 +skylark1 +moneyy1 +abigail4 +fybcbvjdf +jonny12 +paris2010 +bgt56yhn +400095 +010978 +westend1 +jordan0 +31121977 +mata +delta12 +monique23 +petula +mohit +006900 +fuck55 +brains1 +tomi +skipper123 +191979 +young5 +brianna23 +10401040 +zonnebloem +joey15 +godislove2 +ford2000 +anchorage +pussylips +girlss +23071995 +santo1 +jeremiah +antonio1 +sunshine29 +pimp2006 +slickrick1 +lucilla +star777 +izzit +nikki4 +dsa123 +audirs6 +righteous1 +limegreen2 +191078 +45678910 +avatar +sims123 +mimi16 +justine123 +paprika1 +05101994 +bebe21 +112003 +12011979 +gay101 +16071979 +eric16 +carlos05 +280877 +billy27 +casio123 +05081995 +logan09 +lihenan +jhgfdsa +nettie1 +deborah +roanne +september23 +gocards +pumapuma +mustang77 +22061978 +110374 +jamie! +mama1995 +oceans12 +tits123 +babby +summerland +heather09 +352352 +carlene +011235813 +040109 +february10 +fredperry +199106 +oreste +0330 +mimi07 +beto12 +hello2me +291279 +dollar123 +1ilove +290495 +bailey33 +elephant11 +dexter10 +horse4 +05071995 +gizmo22 +prenses +iceage2 +myloveone +1blessing +mybaby07 +recife +tarragon +1elijah +22091978 +amylou +180377 +bethel1 +ghost5 +poesje +mareike +02071976 +rover75 +logos +barbi +hotchicks +07051995 +01092009 +archie12 +ecaterina +inmortal +sexy007 +darrius1 +121263 +seb123 +forest12 +manuel18 +hotcakes +01092006 +yasmeen1 +voronin +eagles33 +desi123 +080977 +allblack +pumpkin4 +blue75 +cowboys14 +fresh08 +071988 +lokita13 +16081979 +balbina +thenewme +123ddd +201296 +junior28 +zoosk2010 +++ +20031996 +ghjcnjrdfif +180378 +121174 +troyboy1 +spacer +199713 +boone +monkey84 +mandy13 +1mountain +rachel8 +melissa08 +ethan5 +kalambur +patryk123 +paper12 +spruce +sandler +alan11 +sparten117 +flemming +kawasaki7 +4569 +230296 +290377 +197909 +120374 +shakeit1 +08121980 +jackson06 +kbkbxrf +020193 +rose09 +diabetes1 +formation +velazquez +280477 +merda1 +751001 +0401 +troll0 +mysp4ce +071294 +malenka +рјр°рєсѓрёрј +20081995 +120997 +04121980 +sassy08 +cole11 +nath +konvict +mama2011 +nia123 +diana1998 +23041997 +winston7 +sprite2 +sep +trinity08 +three33 +112233d +rabbit5 +55558888 +54565456 +dedede1 +antone +princess84 +haley01 +blackknight +christine9 +181294 +only +1620 +59blood +231123 +kamenrider +jeanna +ch3ls3a +charlie20 +123456mn +jonathan09 +197825 +270578 +wishing +13021979 +follar +abundance1 +24101977 +vikings12 +061177 +0522 +liferocks +220470 +199109 +090293 +sixty +05071977 +malaria +30071981 +iloveausti +080694 +060280 +08041994 +ad1das +yahoo21 +181276 +bigred123 +peace77 +16101978 +ellie12 +benton1 +newme09 +1430 +weed01 +oliver1 +purple03 +ternopil +shawn01 +19851022 +230676 +brutus01 +08121995 +foxyroxy1 +blonde123 +nicko +dragon82 +500005 +steamer +timmer +89631139 +radmir +chennai123 +131979 +anabelen +newguy +151214 +carlos06 +extrem +safety1st +thatguy1 +metatron +ironman3 +hitsugaya +03041976 +steven1234 +spirit2 +sergent +13801380 +jennifer88 +track123 +197011 +davila +suzuki123 +150778 +suhani +elgordo +smokeyjoe +27061995 +jack02 +baby31 +1215225 +gangrel +martin8 +dick01 +fedcba +animal6 +rojo123 +021278 +laredo1 +iluvu22 +playgames +dragon100 +patanahi +poke +lollipop69 +hellhell +angelica13 +coeur +10061976 +280896 +oliver06 +ghj123 +mommy#1 +sebastian. +sexymama! +1hotstuff +dead13 +austen1 +604604 +khalid123 +walgreens1 +160477 +sk8r4life +990990 +771122 +23101978 +jojo24 +lacrosse13 +220575 +lifeless +finster +dylan8 +batman55 +soda +damien2 +bmw750 +pepete +shitter1 +28091979 +redneck09 +loaded1 +junior27 +ikickass +cieloazul +12071976 +smooches1 +gateway5 +hayden05 +78910 +birba +rockstar24 +07061995 +whitman +jose07 +26071980 +091101 +jess15 +rahrah +hotstuff10 +crazy666 +mauro1 +soumia +cicciolina +mine4ever +natsume +12071978 +030407 +temppass1 +forlove +love2013 +spuddy +ihateboys1 +mo123456 +joshua01 +puffpuff +parvathy +bernard2 +natasha11 +jannis +rachell +mchammer +thesame +kiki88 +hockey. +blacktiger +charles10 +104 +monkey80 +honey1234 +conner2 +lamina +181096 +121267 +qazpl +martello +16051979 +280178 +knulla +weed666 +hiromi +858877108aop +asadasad +pooooo +headphones +102300 +kottayam +bebe16 +fishing69 +mydad1 +alexa2 +matt1 +29101979 +retina +stella22 +sydney07 +160696 +hershey3 +jayden13 +iron666 +yjwfn73j +corporal +estrela1 +shadow90 +ekbnrf +191093 +300377 +gbemisola +231297 +vball13 +wakaflocka +250995 +sangohan +31011996 +mikie1 +nikki17 +133333 +cisneros +saregama +august89 +tackle +260395 +bestfriend +freinds +lover77 +gophers +13041979 +821012 +011181 +quan12 +travis07 +16041997 +albert13 +cbr929 +softball05 +301276 +221981 +101400 +kundera +lovin1 +hapkido +28091995 +doggie3 +roxy07 +dkflbckfdf +fuckyouass +legia1916 +neversaydie +saints10 +lovely77 +lucky05 +dolphins! +tiffany16 +gundamseed +bumblebee2 +432100 +membership +chevy89 +sunny6 +jinx +flower0 +010596 +123453 +piratas +surfergirl +pioneer +goody2shoe +gfghbrf +ronnie10 +starchild1 +199516 +maria27 +ultraviolet +1nikki +sesshoumaru +donotenter +loriann +25061977 +godjesus +orange07 +tramonto +abramova +skyler12 +conner123 +pika +rach123 +stephon +1norte4 +victim +sunnyboy1 +130378 +1vision +111008 +gizzie +anuska +escalante +antioch +lulubelle +ginger24 +tristan7 +1kittycat +steven88 +jaylynn1 +1472580369 +notrust1 +cinthia1 +mike2000 +crunk +09081994 +kelly4 +fucklove21 +palani +william19 +198005 +sandy +thewall1 +123456789789 +sentry +catgirl1 +raman +suckmyass69 +solito +foreman1 +b123098 +ifiksr +abab1122 +ace12345 +210975 +220376 +001964 +veronica3 +dig +seventeen17 +trans +teflon +aspen123 +tutu123 +fender. +cece +carlinhos +batman0 +nene10 +081096 +310596 +schweini +123aaa123 +tapioca +yamaha13 +1040 +dumpster +04051978 +19091978 +joey666 +july2004 +angelina3 +cinta +rooney08 +12031978 +natalie08 +sheila123 +blackie123 +1hotmom +backyard1 +crosby1 +madman123 +horizons +mamasgirl1 +damian666 +160194 +greenfrog1 +mommy77 +george1234 +171981 +000010 +crhbgrf +bartbart +denis1995 +02101994 +stacks1 +anniedog +159000 +cricketer +teamomuxo +hope4me +sk123456 +mb123456 +poli +ricola +february11 +nena14 +0315 +skizzo +300779 +bullet13 +fiction1 +masquerade +nene11 +yoselin +leticia123 +1324354657687980 +20032006 +marissa7 +jeanie1 +z00sk +stang1 +020178 +david89 +230776 +31101977 +look12 +smokey77 +initiald09 +lkjhg1 +iwashere +20042007 +serg123 +311200 +asbestos +climber1 +danyel +080502 +smokey07 +q55555 +lethal1 +mike04 +playstation3 +sabrina5 +tpxerxjmp +110206 +11234 +paleta +sing123 +31101979 +741023 +requiem1 +john101 +miranda9 +1brooke +180879 +dg123456 +moh +edward1234 +alive1 +taylor77 +lala24 +19831212 +moron1 +26102610 +flappy +king32 +section +jennifer25 +born2die +bycnbnen +vbif +yegbpltw2012lol +louise14 +marijuana420 +danielle123 +moeder +cheyenne11 +marine13 +06051995 +vikusya +19861018 +ghj100 +suckit. +16071980 +oliver88 +thanksgod +fen +evolution7 +nothing3 +main +310577 +sascha +jaqueline1 +edward9 +marcus4 +makati +predator +20032005 +asshol3 +shrink +78951230 +11051977 +amo-te +rclens +giratina +14061406 +gavin2 +210279 +987654321c +300395 +wanksta +0415 +ninja666 +cabowabo +tanjiang999 +blue97 +63256632 +geogeo +3223 +mam123 +27011980 +foresight +benson12 +rayallen +1starwars +kenzie12 +emmarose1 +140404 +shoebox +justice +tigers +xlf65b6666 +010378 +polgara +myplace +mw0720 +starwars22 +blitzen +elpaso1 +aaron1234 +rancho1 +makeit +clocks1 +barbie17 +high123 +1234567890qwert +boloto +chicago9 +rrrrr1 +melissa17 +trecool1 +05071996 +bigpenis +prettyinpink +821125 +tigger26 +pappa123 +chevy05 +maxwell01 +260177 +030778 +13061979 +ranger3 +19861220 +199221 +mah +golden01 +eric +040980 +rooney9 +actarus +120698 +jemma1 +angel1985 +leslie11 +08071981 +prima +lthmvj +crosscountry +071279 +azteca13 +07111980 +santosh123 +justicia +freund +28121979 +199108 +perfect12 +passover +andrea9 +tiger74 +br5490 +fbi11213 +bassin +gopal +goofy12 +keke14 +kendra2 +converse12 +usa777 +mandarino +ykdpj67mgd +muffin21 +112233m +fulham1 +olateju +nina22 +090381 +squish +yildiz +09121980 +qwertz1234 +ruthann +banjo123 +crapper1 +jade22 +aus +1364 +yamaha85 +aggarwal +114455 +uzbjnei451 +starlight2 +plumbing1 +21041978 +pinky! +flamme +09101982 +17081977 +brooke15 +feelmylove +boobooboo +willows +nikita10 +page +130896 +070380 +sadman +5blood +1artist +staff +luckylucky +marcos10 +julie01 +austin. +mama17 +081988 +samuel14 +22071995 +phialpha +maddie07 +suhail +09011982 +disorder +161194 +190909 +marijke +bib +dana1234 +290995 +traxxas1 +lena11 +sargodha +andris +assfucker +55555k +kevin05 +010507 +!@#$%^&*( +dennis22 +19121977 +10021976 +everclear1 +221173 +kswiss1 +just12 +fk +hotmom +400019 +amanda1 +mumu +justynka +a33333 +090579 +teamo17 +cityhunter +22011979 +20121996 +11101976 +leon11 +mm123123 +green100 +star95 +docdoc +bay +evasion +14001400 +camaro95 +290777 +sweety23 +estonia +06051981 +19841124 +19061996 +fkmabz +alpaca +nicholas16 +elyssa +the1ilove +270979 +powerball +heynow1 +ohiostate2 +beautifulg +vfyxtcnth +alpha5 +sublime69 +kacper123 +mangesh +jeric +aaasss1 +blondie69 +monique21 +13061996 +hello999 +dingus +herbal +matthardy +marisela1 +blazer12 +181275 +simon3 +icp420 +10071979 +ryan88 +030995 +05101980 +maneater1 +kulet +the2ofus +option1 +141888 +alexandrea +0801 +010878 +likeme1 +bambam7 +201204 +princess66 +wolfdog +darkness5 +shithead3 +domino2 +kenyan +denis12 +15love +yourmom8 +fishing5 +hunter66 +hummingbir +jorgito1 +caddy +k. +dance21 +170794 +vitamine +`12345 +nicodemus +daxter1 +monday +hotmail7 +candy77 +reb +melodi +lovesit1 +haley11 +36903690 +monaghan +111111v +280595 +dickey +nikky1 +brownie3 +johnny18 +hesoyam +kerstin +hpg2n89qif +herve +19861022 +aaaa123 +huguito +steve7 +anjelik +081208 +april69 +150795 +jehovah7 +16041995 +jenny09 +cookie0 +kaydenlee +2232 +billyb +102589 +179324865 +mrkitty1 +amazing2 +bluesky2 +abhimanyu +2124 +randomness +kos +sebastiao +21051995 +eagle11 +andrew91 +matt99 +baker4 +sexy2006 +bradly1 +z123321 +inteligente +tocool +12345az +missingu +230000 +peace8 +stasstas +newlife1 +kakashi12 +montre +harbour +whitney12 +xanadu1 +terrific +ehlbctw +070709 +02021970 +69lover +pbyfblf +06061976 +brenner +0701 +lovely88 +shadow01 +rajneesh +misio +qwezxcasd +rose88 +planete +10111975 +italia10 +edgardo1 +dak0ta +tranny1 +dressup +milanello +helpme11 +znt: +190378 +rubydog +adnan123 +frontech +havoc1 +.adgjmpt +funnygirl1 +tobias12 +13751375 +godfrey1 +destiny15 +lastchaos +lovestruck +020478 +tiffany09 +arjona +tambov +dewitt +hornet01 +sierra5 +worm +wilson22 +youkofa569 +090882 +guerra1 +1122330 +197901 +max1997 +rukhsana +estrella5 +poop44 +grace +cirilo +197803 +horst +saturn01 +regiment +sexesexe +03121979 +clark123 +811028 +darion +110046 +woodside1 +p2wcffjcvr +2muchlove +project123 +kris1234 +mike2010 +contrasea +kelsey14 +14211421 +02031996 +abcde3 +green26 +12061977 +21092109 +martas +carlson1 +jeremiah7 +hase +sixpack1 +miller13 +jasmin11 +30051979 +mike2007 +angcuteko +billkaulit +199126 +123qwe456asd +021979 +pitchou +xt97794xt +saints01 +55555l +ayamgoreng +07031981 +grace07 +voltron1 +warlords +buick +silver00 +eclipse7 +jason26 +office123 +sassy21 +la123456 +nena11 +ashwani +buterfly1 +marcie1 +bedtime +harry22 +otilia +125478963 +joanne123 +travis4 +02121978 +santillan +mama45 +30101994 +fordf100 +qayxsw +010709 +adegoke +santi123 +pintail +maggie18 +iloveyou30 +dripik +affection +nate13 +cj12345 +987654321n +1alicia +31051981 +anything12 +sarah101 +faggot6 +xterra +24011995 +jamaica7 +123321b +212325 +osipov +220874 +skater24 +jaquan +vampiro1 +firstlove1 +sycamore1 +rjhjyf +090900 +yagjecc816 +300477 +texas254 +phantoms +akademia +djkxbwf +h4hgaipgzu +reanimator +angelica +shrikrishna +mifamilia1 +lobo123 +joiner +spaces1 +overit1 +holyshit! +170377 +134625 +reyes7 +19801981 +jason27 +lilli1 +041294 +exotic1 +24011996 +16101979 +hardhead1 +darkness1 +danny +baruch +170797 +30101978 +pup +bilabong +witchy1 +june2004 +020978 +lilbear1 +041095 +whysoserious +loveisreal +qwerty777888 +talula +sexyman123 +firstlady +amber9 +09101993 +mskitty +petra123 +enjoy1 +23091978 +far123 +001200 +021978 +brenda3 +schatz123 +dogeatdog +vjhjpjd +oneblood1 +jew123 +241294 +123as123 +191993 +iluvu3 +512 +050978 +truelove3 +qwerty123456 +jurassic5 +102800 +mother69 +bullhead +davidp +band101 +159753s +ika123 +tinker21 +february24 +vegeta11 +abcde6 +korn1234 +070293 +12345qwertasdfg +getjob +jg1234 +111964 +30061978 +1478963a +internet7 +mybaby13 +winner +linkedin69 +alexis25 +kimikimi +popstar123 +zhangqiang +pinky8 +030180 +tyskie +jjjjj5 +penny11 +billyray +laurens +jordan91 +shana123 +fatpussy +bigdog10 +anna1 +19861223 +bluenose1 +wsky0o0o0o +man2man +20102007 +assassinscreed +mhaldita +11113333 +20121976 +selma1 +nick25 +cowboy! +chris1990 +654321123456 +gondon +hanicka +folashade +xtkjdtrgfer +bradley01 +rollsroyce +manchester1 +pipers +romawka +bumfluff +qwerty333 +steph14 +everytime +poodie +saw7139 +1317 +pedrito1 +rana123 +costa1 +7inches +anna2006 +311296 +monique +mustang14 +rj1234 +anywhere +280393 +ilovesocce +warrock +789456qwe +0316 +123god +01081996 +travis14 +karla13 +reymysteri +firestar1 +ingenieur +christina5 +stepashka +120275 +lukinhas +hellion +bulldozer1 +080910 +blacklab1 +chickie1 +240196 +j123098 +abc123@ +110077 +daisygirl +canton1 +petronas +satchmo1 +sexyboi1 +radius +yahoo01 +199227 +19841014 +220796 +lilwayne09 +302019 +namnam +huyhuy +flamenco1 +19821212 +jimi +lime +147258963 +golftdi +andrea05 +120899 +susannah +wolf1 +varitek33 +ticket1 +sexytime69 +power01 +angusyoung +psycho69 +110575 +angela14 +hilary +cjxb2014 +golfer +22061979 +qwerty12345678 +future12 +22021977 +19871212 +james2007 +saucisse +amina123 +chevy24 +notagain1 +stupidass +charlie02 +hepburn +07041995 +sexymama69 +010877 +barb +cheater123 +torres12 +myking +hanshans +jessica04 +mahalko +alex1974 +bloodred +jenalyn +ducados +310575 +gaia +lol +ou171423 +verite +3puppies +daisy9 +lenicka +chandler2 +250996 +barbie08 +24051978 +adriana +33663366 +emilly +newyork14 +21081994 +spencer4 +marley10 +casper99 +zzzzxxxx +aretha +havingfun +crystal18 +thekiller1 +rjdfkmxer +realtime +500045 +mono +adeshina +knicks33 +camelo +190477 +nimbus2000 +germany123 +pleaseme +19381938 +pissant +timo +slippy +maksim123 +drummers +091981 +12021976 +power22 +andrew93 +goodtime1 +300676 +xxxxx6 +240576 +021177 +goahead +mushka +19871012 +191293 +cocktail1 +caserta +рјр°сђрёрѕр° +diva1234 +kiss23 +20071977 +030795 +mainstreet +sasha99 +20021976 +leigha +665665 +stooge +cb +ambition1 +blueprint1 +dennis23 +swimmer2 +erick12 +july1996 +280576 +february27 +09101980 +podarok +order +17021978 +140194 +lynn1234 +arbonne +asshole24 +24111995 +puck +falcons12 +venganza +jordan89 +02091974 +walker +devina +chickenbutt +199009 +cable +riverrat1 +lopez2 +benjamin13 +babyboo3 +131075 +loveisblin +qw123456 +neophyte +romina1 +mommy25 +tommy9 +marilin +gloucester +destiny. +101272 +jetlee +h3llokitty +198924 +kyle18 +bloger01 +0564335 +buttsex69 +elpapi1 +rugged +sunfish +ondine +teddy23 +cabbages +127 +060393 +17711771 +171993 +locker1 +pseudo +feliz +dog100 +calendar1 +251978 +1bambam +22012201 +10061979 +babygurl24 +pinina +d7777777 +winnipeg2612 +05041977 +700075 +cableguy +030294 +tribute +simon +dayanara +waheguruji +secretaria +schwimmen +marlies +jerry01 +24101979 +010203q +lapierre +boricua7 +nan123 +steak1 +natalie9 +23111995 +yahoo8 +millencolin +moorea +anaheim714 +1love4life +pompino +brindisi +adrianita +locutus +sommer07 +bitch87 +261096 +zxcvbnm5 +miguel. +100599 +070181 +paris07 +bestmom1 +22032203 +calibra1 +london05 +tiffany08 +knight01 +03061996 +maryjean +owned +nirvana9 +yojimbo +.kbz123 +february28 +njhnbr +common123 +23061978 +010778 +carebears2 +lilith1 +supremo +hiphop4 +takeme +always12 +balboa1 +runescape! +18101977 +20052009 +linda7 +240474 +002233 +apples6 +dustin69 +290179 +stjoseph +dima007 +160495 +sweety01 +101002 +jason143 +pinky21 +theanswer3 +ffffffffffff +kaycie1 +lolli +winters1 +2022 + +27021994 +29011981 +surf12 +grazie +180395 +cornelio +19101977 +13101977 +cthuttd +ftw666 +lhbjkjubz2957704 +usmarines +290676 +fatass13 +synyster1 +200795 +192 +july2009 +tape +friends16 +daddygirl2 +class04 +005005 +catcat123 +u2u2u2 +yoyo22 +malice1 +muchacha +06021996 +gee123 +raqdc4ml +tigger1 +babu123 +rats12 +3388 +scorpion2 +davidk +19870111 +iamgood +415 +buster02 +831004 +19881989 +piscine +raiders34 +cowbell +14071979 +gregory7 +sammy77 +shannon9 +pimpollo +eiknon11 +7777777j +bigdogg +passenger +boy12345 +augustine1 +bread123 +qaz789 +freeport1 +manoka +overlook +blaze13 +polina1 +walters1 +srinivasa +rocket3 +010994 +aderonke +synapse +yv3bcdaq +giveit2me +tyrone12 +theresa2 +270377 +mybaby7 +01011998 +081982 +1rosebud +laracroft1 +stephen +21031977 +friends4me +asdfghjkl456 +mayhem666 +connor +jerry3 +shianne +ray-ray +harmony7 +mythreesons +bayarea510 +1williams +02101996 +hidalgo1 +chibuzor +april92 +10071977 +screwed1 +bienvenu +lorenzo123 +24081979 +jasmyn +111998 +19871029 +luv4me +everton11 +produce +6453 +patches7 +riley13 +iamme1 +pinkpig +horse13 +335335 +cowpie +freebee +895 +bunga +27061993 +neumann +l00ser +monsta +tigger66 +011989 +020896 +godswill1 +residentevil4 +riyadh +happiness! +thisis +vjcrdbx +speedy7 +7414 +thereds +liljoe +ilovemyspa +666666z +playa5 +180994 +031982 +811118 +cammie1 +061178 +pokemon09 +michael44 +ededed +oleg1992 +frdfvfhby +mavrick1 +manuel5 +1001wdst +05081980 +200179 +fresh21 +wilmar +wrinkle1 +lovemy +140696 +03041975 +indianajones +decent +cocopuffs +230975 +fidel1 +23022302 +svetasveta +bibou +still +11021979 +goodwood +tucker7 +nutsack +isabel13 +belmar +sportsmen +nastya12 +10031977 +rascal13 +250278 +bandung1 +281196 +31081995 +tamia1 +labebe +w123456789w +32113211 +drunken +larson1 +valeria +21031979 +redbirds +faith6 +011982 +zumzum +dum +kerwin +841226 +varghese +141618 +shalom7 +palencia +stephanie1 + +anna24 +brian6 +02021972 +rs2000 +phoenix! +animals3 +newport7 +moviestar +leverkusen +florida9 +mistic +twojastara +summoner +wisdom12 +29071995 +4sunshine +060380 +dantist +zaqxswcdevfr +olvido +azerbaijan +blowme123 +squeek +elena2010 +mille +cokecoke +ghjuhfvvbcn +230897 +fireball12 +11111c +lisbon67 +akash123 +123123zz +m123456m +d41d8cd98f00b204e980 +blackbear1 +cartoon123 +samsung! +lwxlwx +811811 +97979797 +lala18 +poolshark +chumchum +rouges +198003 +beatiful +bitch2009 +vondutch +coldwater +bouddha +090382 +paulina123 +theiige4x2 +preston3 +luckyone1 +baptist1 +barunka +frytol +atleti +1jehovah +555550 +051077 +bruins77 +grasshoppe +170193 +08011994 +ruffryders +holly3 +shaker1 +05021995 +160296 +april1991 +english3 +20051978 +leafar +jeffrey1 +brandy5 +250696 +090182 +minidisc +gloria +011984 +fluffy69 +gotribe +0.0.0. +black00 +pinkflower +tromba +mariann +withyou +ciao1234 +starwars01 +raptor350 +adaeze +041079 +nul +imsosexy +scorpio9 +giadina +assass123 +shadow32 +blue4u +19861224 +000789 +19861017 +bigfoot2 +oigres +letmein22 +getmoney21 +shanta1 +imalone +ilovebobby +anna1982 +beijing2008 +ewankosayo +swetik +bqktrqn844 +carl12 +mistie +magic9 +bacchus1 +270177 +091982 +cupcake6 +nylons +#1stunner +love1004 +love112 +bear99 +renee7 +131196 +boobies12 +bull123 +carmen23 +may1984 +200896 +williams11 +lover20 +santiago123 +2fuckyou +bedrock1 +2qwerty +snoopy99 +mimamima +240695 +catcat12 +babies123 +spokane +juice2 +greeneggs +yz450f +superman34 +142356 +golden +timmy3 +summerfun +popokatepetl +10121976 +anastacia1 +what2do +fener1 +dylan99 +junkyard1 +tony77 +chadreed22 +emmanuella +17091979 +jodeci +plummer +vasco1 +majeczka +071295 +li +speedy3 +23051997 +andreea1 +angela18 +buheirf +ninja! +dudule +1manuel +death3 +30011981 +19861013 +060381 +horosho +251208 +davidl +08031978 +sinful +samsung0 +ashley85 +corona123 +52013140 +alejandro123 +mahina +jessie69 +enterme +bonner1 +unique123 +090693 +minniemous +boomer5 +possible1 +moonman1 +bentley1 +462016 +120472 +bhagya +artemida +diana01 +20051996 +maraton +caregiver +kristina2 +560072 +heaven5 +12345zz +charcoal1 +rambutan +vandread +superman28 +020677 +nikola +24041978 +03101979 +lynnlynn +lamar2 +army11 +taipei +150496 +fake13 +a123123a +arsenal5 +notnot +samsung09 +14051977 +elijah13 +samogon +mango5 +210874 +bornfree +twostep +210876 +bookitty +getrdone +091294 +270678 +april2010 +sammy111 +12051977 +cookie44 +09111993 +super21 +nicole82 +101299 +vasilenko +miraflores +34563456 +nagano +rjgtqrf +zachary9 +ankit123 +krish123 +lovemebaby +kasabian +freedom0 +doris123 +nike01 +177777 +rachel08 +underscore +revenge! +19861126 +040795 +amooti +iamthebest1 +classof2012 +mizuki +270396 +111963 +courtney9 +19851220 +travis08 +enrique123 +65stang +waltdisney +denise69 +fktyf +timon1 +03061978 +251196 +hank123 +reference +manolete +rere12 +pokers +holsten +schmidt1 +1356 +post +london00 +fqi3p8arjg +vonvon +841020 +17051979 +21ainiyan +courtney +super007 +philippe1 +tbird +a9999999 +nasdaq +pinuccio +gangster14 +jackass01 +babygril +ladykiller +brooklyn01 +liverp00l +gangsta8 +lori123 +myman1 +cubs12 +moriarty +fattie +nicolas10 +280795 +pikachu25 +faraday +841012 +myspace83 +katie18 +qwaszx1234 +jayjay5 +bubble7 +anna2004 +love2me +roses12 +pfqxtyjr +bloodgang5 +guo150 +260677 +basspro +19861124 +110375 +austin25 +zenit +jamil +pumas12 +davina1 +pumpk1n +mimita +gigant +niceboy +28031996 +400003 +25091994 +marriott1 +poohbear20 +leothelion +lollypop! +120398 +140275 +toriamos1 +45874587 +luisa123 +sherlyn +ghjcgtrn +passw0rd! +gogetit +march01 +350chevy +ina123 +11021977 +smiles4u +04121981 +summer19 +fuckoff +birthvillage +240477 +1azerty +suleman +uekmyfp +olympic1 +fff123 +cancerian +redblack +missy1234 +151981 +190994 +som +1cheer +jakester1 +extremo +mypassw0rd +sofia12 +razvod +morientes +jordan34 +diana7 +music2008 +uyjvbr +sexlover +rock77 +26101978 +krishana +realman +baller45 +aggro1 +13701370 +getlow +170477 +29111994 +654321p +100996 +quicksilve +paolo123 +153486 +lolo22 +kopytko +198531 +david2006 +ricky01 +cooper14 +checho +140505 +24121978 +june1997 +diebitch1 +practice1 +passion4 +royston +pierina +bowwow11 +aud +30003000 +eurogunz +utvols +andres +activa +15051505 +rangers7 +my_komp_777 +j00000 +breebree1 +elvis11 +faktor +seductive +chiquitin +09071980 +ag1234 +basket10 +houghton +hottie44 +cheese15 +daddy'sgir +bibibibi +211096 +akinsanmi +gorman +my3dogs +creator1 +deadman8 +bmw325is +23031977 +saulute +jessica00 +55554444 +vball3 +ghostdog +zbyszek +230276 +concorde1 +2113 +bookbook +evybwf +198904 +getmoney22 +551976ms +tony06 +050794 +carlos28 +841024 +diedie1 +bowers +polo90 +02081975 +vincent13 +olivier +199302 +christiaan +t11111 +mg1234 +jambon +150296 +raul12 +mylove18 +anhmaiyeuem +1september +nou +theduke1 +please11 +stefy +shippuden1 +240575 +197928 +462001 +sasha17 +money2007 +cosmos0901 +kolejorz +dearmama +valerian +020796 +chameau +dashing +01121979 +20081975 +moejoe +maddie09 +reyes123 +2530 +dylan09 +oneway1 +bonghits +lilies +01051977 +laspalmas +khongnho +mendel +enrico1 +cameron02 +19733791 +james666 +xuliang +philly123 +leyla +breanna123 +123dima +bomba1 +10081976 +camera123 +02091994 +kleiner +cutie95 +jeff21 +nyuszi +nick19 +rhodes1 +scott +excaliber +minimum1 +destiny99 +fang2008 +lewis2 +19734682 +bignasty +lovekills1 +downhill1 +030994 +shannon6 +821020 +110707 +hottie93 +26121979 +lakers15 +00000q +tiff12 +qazqaz11 +251995 +anna25 +06081994 +thatbitch1 +zxasqw123 +allsaints +chuleta +angelo2 +22101997 +fish10 +1buttercup +101201 +punkie1 +truckin +battlefield2 +qqq333 +reddog123 +tinkabell1 +anarkia +rafter +181982 +hiphop10 +pillow123 +7891235 +hotmama123 +110775 +fartman1 +080695 +samuel12345 +23121997 +791111 +tiktok +zara123 +28021996 +bengal1 +emreemre +gerbil1 +melchior +011111 +bolleke +050795 +180779 +gabriel17 +26041981 +moomoo! +attorney1 +markjoseph +lollipop. +25292529 +blake11 +198229 +mallari +19791980 +donavan +28071976 +anagha +logitech1 +blizzard +winter98 +water21 +kyle07 +smiley69 +linkedin8 +sarahjane1 +amberlynn +fatkid +shabby +200296 +628628 +jean1234 +guitar77 +onelove4 +171977 +24081996 +eyeshield +aguacate +12345610 +math12 +14041979 +willy12 +wolfy +1tennis +310777 +driftking1 +babygirl1 +victor69 +findme1 +norcal1 +darkness66 +199421 +ramrod1 +nicolle1 +egshm1 +barcelona8 +duckhunter +groupd1 +megadeath +steelman +test99 +567567567 +flyer1 +gabrielle +v3uriah1 +dreams +twat +karan123 +wildcats10 +love209 +198109 +ledzeppeli +panda14 +krizia +lalala4 +22081979 +realsim07 +killer96 +flower45 +020578 +darkorbit +vanessa17 +torana +autumn +lefthand +oliver8 +america16 +sarmat +joejoe12 +130875 +suckit3 +adc123 +ahovbipw +95civic +matthew77 +1436 +1052 +cobra12 +qwerty911 +102500 +the1andonly +mewtwo1 +warcraft4 +060878 +femi +30011979 +2321 +mainman +198129 +united2 +rahima +halo3rules +26081995 +color123 +shifty1 +888888881 +daddad1 +pelle +boulou +123123123z +homey1 +05051976 +sasha2011 +manika +charl0tte +vlad12345 +yahoos1 +bubba99 +7nc4lqw7to +03031998 +80959002443 +asdfqwer123 +aqualung +asd098 +dirty12 +myfamily5 +mikey10 +s696969 +shelly2 +duran2 +jamboree +tony101 +anillo +041179 +julien +13111979 +contra1 +vaseline1 +123456ru +06011981 +wi11iam +chantilly +assmunch1 +130676 +52255225 +skater88 +tuan123 +140576 +scorpion7 +210496 +chloe6 +197210 +linton +dell10 +fktrcfylhf +240596 +duke33 +iiiiiii +21love +06071980 +041078 +copain +kailee1 +alabaster +charlotte0 +kornelia +270976 +agapito +savannah4 +czz224466 +po +heyhey11 +fidelio1 +phoenix8 +alyssa15 +1adgjmptw +21061979 +andrik +granny5 +forsale +tippie +landon05 +16051978 +borland +dorota1 +1minnie +addison2 +nuages +jaymie +13081979 +peanut101 +111156 +qwerty0987 +fuckyou321 +040779 +1jamaica +rand +heaven4 +020696 +boobie2 +fuckyou187 +chickboy +blue54 +vt +rammstein6 +jekjek +090679 +shane69 +surfer69 +02041973 +beaner2 +sorpresa +lions123 +nji90okm +klingon1 +emotion1 +borderline +121070 +060479 +mexican4li +annarose +sarah24 +mommy34 +040777 +23121978 +111111n +strawb3rry +dfy.if +wsxcde +kitty. +limestone +kuuipo +fefefe +victoria20 +ninjaman +23042304 +1google +rol +280578 +earth123 +red911 +7jokx7b9du +oliver77 +jersey2 +jhjhjh +hailey03 +gokil +butter13 +marina23 +matveev +righton1 +shade45 +slobodan +fatal1 +niewiem1 +bigjake +199519 +ipod11 +199224 +asking +251296 +coolcat2 +abby08 +chimie +12111978 +jessica90 +rajababu +2426 +onelove69 +katrina12 +shambala +482001 +fgh123 +mobius1 +jodie123 +++ +single2010 +igetmoney2 +disney13 +kennedy +buster44 +jjjjjj6 +jellytots +20091977 +s1mple +cheezy +120304 +nissan +05061995 +26121977 +979899 +azerty10 +486255 +weezy12 +09081981 +ilove9 +050576 +alessandro +199555 +45544554 +14061977 +d55555 +08101980 +fuckyou100 +110597 +banda1 +811225 +lauren02 +tristian +zero01 +frenchkiss +nownow +filemon +sierra117 +gilbert2 +debbie +bansal +01101994 +rayman1 +831024 +paresh +abhi1234 +24121996 +chris97 +eduardito +180396 +198317 +123321qaz +06021979 +08061980 +peanut00 +pinky4 +24081977 +eagles8 +asdfg +ybrjkm +florida06 +bayview +sexylexy +23121979 +spotlight1 +lagnaf +winston +yfl.if +madhumita +orange27 +dancing123 +pudge +jaelyn +naruto91 +101968 +lindsay123 +160195 +mine69 +delbert1 +230376 +baller16 +x870624x +170596 +05061996 +xxxxxxxxxxxx +inglewood +123568 +paperboy1 +rebelde3 +monster08 +19861030 +shelbie +rikardo +lordvader +amor25 +tatiana +2money +bhopal +mafille +jesusito +hope01 +iubireamea +beast3 +13071307 +smokey15 +frends +nokia3200 +woodman1 +amanda05 +weezyfbaby +random13 +xthysq +55555j +musa +060697 +spongecola +nasaud +alliyah +dru +thomas55 +060181 +122221 +10011975 +snowball7 +chloes +gateway200 +112800 +mko0nji9 +leandro123 +peace4all +ufptkm +finale +9191 +eagles69 +bowwow5 +140877 +drugsty +time12 +780405 +teddy101 +mckayla +wildcats7 +65432 +pimpin15 +model123 +fuckme420 +ihatemyself +lorella +familia10 +sharkbait +jacinta1 +star34 +freedom88 +010200 +bypass +callie11 +music2009 +meeeee +bobo22 +gators123 +lalala6 +jackblack1 +barney13 +basketball10 +realbetis +house3 +airline +0069 +yomom1 +starwars +malathi +191094 +asshat1 +21101978 +781025 +cheezit1 +anton1996 +allmeu112 +pas100 +angel2004 +pink100 +a951753 +penguin4 +jenn12 +1poopoo +132639 +zxcvb6 +mommie2 +copper22 +cool17 +melodie1 +elbert +dingle1 +02041975 +19871225 +angelina +danielito1 +webmaster123 +southside8 +44gatti +cristin +snails +amenamen +hjcnjd +deathcore +ghost7 +290178 +sophia08 +tygferrfddss +lakers33 +success4me +socialwork +10011997 +244 +chances +palesa +111166 +simply1 +megamega +capella +17091980 +internet! +mike66 +iloveemma +apple55 +131977 +valentinka +happiness7 +290878 +booty5 +114 +1477 +rockstar18 +chaplain +nirvana11 +rekha +ana12345 +poop15 +richy1 +harsh123 +puss +blackhole1 +ddzj49nb3 +pur +katie09 +01011962 +avengedsevenfold +trouble69 +12081976 +drinking1 +whiskas +jaimie1 +password37 +rjycnbnewbz +creat1ve +soundwave +junior26 +daftpunk1 +roxas13 +02111980 +bella99 +brainiac +evermore +aline123 +stormy123 +javier3 +time2die +wiener +0905 +nayarit1 +sanandres +bruder +chase13 +broke1 +yasin +199303 +geppetto +midas1 +nicole44 +reymisteri +130496 +0904 +catherin +kaitlyn123 +nikolay +crystalsaga +291078 +081178 +freccia +muggsy +bryan01 +jackson14 +honda85 +snoopy25 +costantino +kimura +rockstar17 +balazs +theghost +fatboy21 +icewater +theway +jade07 +artem1997 +freunde1 +0425 +sakura7 +11031977 +justincase +30041996 +preston12 +dragon83 +lokillo +freak! +bloomfield +hhhhhh7 +diddy +westside! +bunty +1truck +judgement +aleksandra1 +rushhour +tomino +patrizio +elvis69 +watchout +yxcvbnm123 +kritika +billings +shorty +shea +akuganteng +gerald123 +260795 +raymart +2p76xh2xhv +p1p2p3 +123a +lollipop10 +1350 +mixmaster +puffin1 +mcnabb +nad123 +yeuemnhieu +intan +beata1 +fatboy10 +tara1234 +hubertus +contractor +moliere +gordon24 +18031979 +sammyd +marino4ka +cheese88 +sodium +lindsay7 +lib +porfavor +nichol +gigglez1 +lunette +1593572486 +210476 +mainz05 +greenlantern +ilove17 +vbnvbn +jamielynn +15081996 +redsox4 +kitty +9797183185 +giggsy +purelove +junior420 +hazeleyes +manman11 +ragdoll1 +19216801 +flowers22 +irish12 +ponorogo +dalia +newport01 +denis1991 +charles! +bella25 +barby +9788960 +gfyt63gd +tigereye +021195 +sunset7 +190300 +30103010 +bekasi +harleydog +chico11 +nick +zxcvbasdfg +love1981 +anorexia +dima1988 +ryan20 +tink3rb3ll +amor17 +westfield1 +0525 +zuzia +celeste2 +uglybitch1 +oscardog1 +james87 +sasuke01 +liuyang +jenny07 +account2 +dragon79 +007911 +ponce +d1bd6bc58c1d74df41a957489c9942f5 +memphis2 +030373 +dmx123 +yousuck. +22081978 +1360 +plenty +cachorro1 +joker88 +123haha +emporio +fucker21 +kocicka +11111974 +thu +chinois +01101978 +cfvfzkexifz +bitchplz1 +phillip123 +lilla +iloveyouf +bitch111 +james2009 +rocky24 +sweetpea7 +farmhouse +edmund1 +290677 +261993 +sanluis1 +gingerale +roma1927 +199005 +2120 +010199 +1281 +151095 +password99 +sparkplug +772324 +grace23 +schoko +rosie11 +themis +afghan1 +140474 +hockey +easier +55555555555 +montesa +7546 +4545454545 +yellow27 +boogie01 +15051977 +davidt +alison +chyna +kayla1234 +chicago22 +dirty123 +21111995 +124365 +2357 +vance1 +armine +nastya2010 +giorgina +ilikepie123 +skater09 +massi +121214 +potapova +amanda92 +cassie69 +lesbians1 +kelly17 +ravenna +050494 +190993 +babyg123 +17111995 +19851023 +25081978 +chi-town +26061979 +dumbfuck1 +pooh24 +newport20 +thaddeus1 +2536 +hulk12 +paska123 +oluwadare +others +misty5 +beautifu +071177 +nallepuh +261276 +586586 +virendra +cellphone3 +dad101 +126 +intruder1 +dvorak +youbye1231 +donkey7 +samsam12 +19051996 +228228228 +colorado12 +thistle1 +murat123 +sketch1 +12101974 +showdown +19851217 +s0mething +090280 +ashton3 +197926 +199420 +86026403 +honda80 +calvert +ranger75 +060978 +220474 +17071996 +13041304 +tanning +polniypizdec0211 +123abc123abc +krystian1 +280677 +biker123 +cholito +volcom23 +beauty21 +bigdogg1 +gang123 +elmo15 +puspita +110674 +rock15 +7v8bv5teow +pebbles7 +kiki07 +1business +jamie08 +19971998 +adrian05 +nutcase +1344 +rfrfitxrf +imani +30121996 +w0rdpass +1237 +denis1996 +rfn +naiara +20021977 +jason28 +pandita +66chevelle +07061993 +molley +131072 +paris5 +andrea89 +sebastian12 +06041981 +040408 +12091996 +kaylee06 +14121996 +diva07 +050280 +chris1991 +15101975 +1teddy +lele12 +vlad777 +120199 +eclair +falcon5 +mjordan +alexandra1 +horsepower +301094 +02071995 +concours +number1son +ping123 +080183 +jessie08 +211296 +24021976 +chhaya +12781278 +gabriela2 +210277 +cassiopea +26031979 +shanky +coolbuddy +winthrop +domino11 +170378 +boxerdog +turtle8 +spence1 +123456gh +1hotbitch +160378 +elieli +12 +sugar69 +030695 +homegirl1 +amoeba +savage23 +conard +pekmabz +1oscar +angelo01 +crapola +madness7 +kondrat +260396 +050508 +111222333q +linsey +abigail +carrie2 +110200 +wowowo +jana123 +190194 +bilgisayar +toby13 +uuuuu +mistycat +barbara1 +11122 +221108 +angry1 +03031976 +nhf +sloeber +13577531 +rockwood +rihana +penny3 +011077 +mister2 +080294 +11071978 +oliver15 +diamonds +sexy86 +25021979 +ordinary +h0td0g +199626 +1234567896 +22052205 +helado +160794 +tiago123 +wedding65 +19861125 +06031978 +sureno1 +whatever09 +pumbaa +coastal1 +osasuna +wildhorses +wahyu +24111978 +devon11 +19861213 +sc1234 +howhigh +ammulu +pantera12 +fishing +bailey01 +joeboy +147159 +tomwaits +pueblo +stupido +dragon75 +poroto +denzil +bubblegum9 +38253825 +290893 +080281 +081983 +presto1 +here +chicony +connolly +newport3 +azules +12345 +carita +ilovejenny +ladida +pow +salah +ivy123 +champa +leonardo2 +sugarbabe +ff +bracelet +shannon21 +160022 +do +olawale1 +10061996 +if6was9 +fairy123 +07021982 +15101995 +savannah13 +cebucity +dragon31 +19091995 +quijote +04081995 +020272 +blissful +19851016 +17011977 +0313 +hello98 +miriam123 +horton1 +browser +060180 +juancamilo +delapan +a12345b +petro +030308 +suckers1 +oranges2 +antonio17 +adekunle1 +eyecandy1 +xavier04 +pokora +arthur2 +wifey +20101996 +ashton11 +austin19 +compac +453 +beatle1 +pizzeria +logan21 +01091977 +florence +141977 +16021978 +020377 +cass +kyla +751010 +bea123 +123456dj +linkedin77 +jamie15 +090181 +amanda26 +241992 +271980 +hope23 +050977 +170296 +ac3sg728 +bestie +dalibor +casey10 +carlos88 +04061995 +bartosz +519519 +pokemon1234 +beegee +151275 +13101976 +qwe12qwe +vampire11 +24101996 +tomaszek +freedom200 +myfamily4 +lilbro1 +199305 +airjordan23 +1bigcock +tee +melvin123 +tamara2 +25041977 +boulanger +amanaman +000099 +130796 +hitchcock +060709 +19021977 +lacrosse9 +skippy01 +dct: ++ +hardcore4 +psp71835 +cangrejo +woofie +silver16 +nokiae65 +mike31 +c7777777 +peter69 +ilovegreg +tangerang +clown123 +260377 +cth +chen +boyz123 +200195 +02061974 +130895 +dalmation1 +idontknow. +monterey1 +adm +.. +123012301230 +lauren24 +161077 +mylove16 +theman3 +xh247ahgum +getmoney24 +xxxxxxx1 +isabella09 +doraemon1 +travis. +busterdog +mari15 +trixie01 +iso9001 +schmoo +700084 +snake13 +backbone +07121980 +test2 +nowitzki41 +winxp +jambo +thequeen1 +fucklove23 +nascar6 +123dan +vanish +michelino +happy321 +120274 +13011977 +letmeout +handle +qwe987 +15081976 +080280 +silvia123 +;tytxrf +egitto +17041977 +091277 +latinos +sierra +bulilit +illusions +steph23 +babyboom +mohamed +perdana +hellosimon +091179 +bruce2 +daniel2007 +alternate +mis3amores +mike2006 +5string +jerkface +200895 +twins07 +casale +050409 +timbuktu +santoshi +m123456 +kevina +1brown +salut1 +doctor12 +700059 +vaz2112 +vanilla123 +hannibal +hutchinson +invent +dus +mirana +gotti +ladybug08 +jonathan07 +sk +lucky26 +aceshigh +cntgfyjd +tytyty1 +080680 +elephant123 +case +jamaica +300808 +31337 +emmalouise +scorpio12 +bdfyeirf +030295 +revenge2 +atienza +krusty1 +happylove +velosiped +приветик +031275 +wayne13 +gxtkrf +27021996 +081989 +ghtdtl123 +goducks1 +samaya +tanner7 +patates +rjhjdf777 +brutus11 +azsxdcf +puppies5 +beastly1 +1sabella +jasper08 +doit +24091979 +iloveme16 +katica +microwave1 +jackel +120906 +shields +52545658 +221272 +199319 +babyboo! +hansol1 +loyal1 +04091993 +yyyyy6 +thunder23 +hawthorn1 +30091995 +bobby101 +lucious1 +dragons3 +2loveu +joker9 +1122qq +lilliput +karolcia +nazar +qwaszxqwaszx +canuto +liverpoolf +061296 +maddie22 +maggy +swisher +hohohoho +mysterio619 +08091979 +jessie07 +a420420 +qavcx411 ++ +zxcv12345 +dimples2 +men123 +a753951 +green34 +erika2 +det313 +131194 +kobold +pepsi22 +sdf123 +19851210 +07061980 +102088 +aeiou12345 +sophia13 +shelia1 +mini14 +dashit1 +rina +0121 +brian! +duval1 +farrell1 +konakona +halibut +wigwam +oscars1 +251993 +140596 +nutty +270294 +841026 +danzig666 +eee333 +jonas10 +03111993 +010496 +motorola +vacance +basketball13 +smolensk +gn9gu44s +incase322 +slovan +cocacola11 +201030 +kolton +della +flyleaf +cbvcbv +richbitch1 +oneday1 +marie02 +bitchass12 +789456123b +241980 +q12345 +limoges +myface +blue47 +23111977 +dangermouse +111297 +08051981 +brice1 +chloe +13671367 +denise07 +sasuke15 +sinaloa13 +plastik +zeenat +alex82 +profissional +bikini1 +13081308 +jack33 +dj4life +divagirl1 +y3llow +300378 +291992 +iminlove2 +love38 +nounoune +anime2 +12123456 +milkshake2 +dungeon1 +miley10 +dododo1 +boys101 +23091977 +1915 +tweety20 +melvin12 +regan +charlo +tarelka +sk8tergirl +rocket21 +yyyyyyyyyy +minous +kthfkthf +ingrid +26111978 +2kids4me +killall1 +poohbear69 +190779 +17081978 +20061978 +lvbnhbtdf +eastpak +marduk666 +athena +121072 +istina +grad2006 +muffin23 +cesarin +danny06 +vikings1 +runescape9 +mammas +tahlia +sunshine87 +23031979 +150177 +ahmed12345 +wicked! +topspin +softail1 +samoan +335533 +duluth +nogueira +skyline +tootall +19861119 +guild +movado +krypto +backhoe +zukunft +blake13 +gregory123 +11011996 +786allah +110599 +caledonia +0325 +green66 +helikopter +import1 +17101710 +secret0 +stokecity1 +mercedez1 +callofduty2 +macho01 +lana123 +sixsix1 +wassa12345 +sallad +elo +56 +philly3 +weldon +muratti +280475 +11071977 +18041978 +hannah20 +060977 +espanha +esther +00114477 +manda123 +821011 +jerryg +perico1 +tweety25 +29081995 +081990 +201176 +21072107 +poohbear17 +choucroute +asdfghj +friends33 +october05 +godwin1 +pimpim +240995 +annieb +fengfeng +1299 +01101995 +sexyangel1 +traci1 +pimp02 +kharen +06061975 +588588 +kayley1 +19831015 +02081996 +mama1963 +lilbitch +15111979 +boston69 +honda8 +bonanza1 +wakana +queen4life +270496 +extasy +petardo +010601 +16021979 +babypink1 +cameron15 +040993 +pi31415 +cute07 +freemind +110274 +rose25 +120872 +987654321g +mark06 +raider11 +spanky13 +ismail123 +111555999 +bunnyhop +themoon +19851121 +jamie6 +mommy18 +hezekiah +lisaann +uuuuuuuu +monkeyass1 +13579246810 +mary +promise123 +louis12 +rose77 +060395 +030678 +vallarta +winfixer +18041979 +julian22 +241096 +051194 +281175 +sudarshan +propel1 +aswang +haley3 +death2u +smile09 +08090809 +thepassword +rinat +patriots2 +19271927 +elunico +fluff1 +nikita98 +jembut +roar +ryan19 +spider! +yellow19 +snipper +sm123456 +longhair1 +051078 +721721 +micron1 +ronnie +eddies +loh123 +090281 +lilboo1 +29121978 +spider6 +091279 +1marley +020201 +thankful1 +4beatles +11041976 +shorty1234 +minka +amazinggrace +040807 +10021997 +236589 +199406 +123456789ma +rosa1234 +dron +karina14 +mivida1 +bye123 +kiler +spike10 +03091979 +badboi1 +emily2005 +willie22 +robertito +150875 +199006 +natalie8 +2121321e +kennys +102489 +swordsman +eazye1 +p0pcorn +13071978 +14151617 +repmvbyf +besiktas1903 +letmesee +honeycomb +hihihi3 +pinecone1 +rocky111 +ilusion +yousmell +latina123 +marine11 +25091978 +iamcool! +focused +123156 +10toes +edward24 +jabari1 +kingsway +258456a +11041978 +isabel11 +hellboy123 +precious! +elizabeth123 +shubha +drexel +iris123 +cezar +trustme2 +lady14 +purple78 +jeep95 +sunshine45 +tintin123 +09091977 +renaldo +crazy8s +070596 +atlas123 +dfg123 +120805 +200008 +moneyme56 +060778 +citroenc4 +linkin12 +17041979 +cassie09 +daniel2000 +skater18 +sasha1990 +723723 +barata +toast123 +purple04 +271296 +angel4u +71chevelle +grace05 +danelle +123456abc +23132313 +19061978 +aaa444 +yuiyui +sweethart +magic69 +636332 +broncos1 +djhvbrc +09031994 +25071978 +01031975 +patria +the1man +02091976 +251075 +mindanao +kaylyn1 +minoucha +hotchicks1 +april1994 +brianna06 +pooper123 +a22j5bffci +540000 +tarifa +has202020 +mama18 +211174 +barreto +jaydog +lacrosse21 +whitley +10081975 +19021902 +cereza +198631 +babar +losers2 +240278 +fucklove10 +cali11 +091177 +vrushali +654321w +vanilla12 +wildcats3 +zverev +chelsy +redskins12 +191178 +victoria07 +14111979 +03081977 +roach +hotmamma1 +diana3 +aniani +100499 +igot5onit +maddie06 +clover7 +company123 +muzaffar +opus +girly12 +20032008 +indianer +ethan03 +1wilson +1godisgood +gentle1 +barnaby1 +cassie08 +jl1234 +killer27 +meriam +charles69 +minime123 +wayne11 +echelon +4everluv +smoky +wehttam +031278 +211994 +1december +06081979 +123spill +07011980 +loller +durham1 +loko12 +supercross +riogrande +hotboi1 +blue2222 +250676 +1qwerty2 +moose11 +asshole420 +221296 +denisov +pelota1 +airbag +energy123 +110105 +fatbitch +25101977 +magic10 +myprince +berlusconi +aaaaaaaaaaaaaaaa +acinom +professionaltools +hanover1 +slime +glover1 +putaputa +emily101 +100397 +101067 +jor23dan +123456mama +help4me +gracie09 +misael1 +ashokkumar +226012 +free2beme +faggot12 +poop24 +sweeti +biblioteka +kok +fizika +midnight9 +021102 +condorito +neha123 +sandpiper +babycakes7 +987654321t +sunilkumar +response +mercedes11 +jaydee1 +qwerty123321 +123321v +sprinter1 +luckyluke +hottstuff +skyline3 +bella77 +140676 +ariel2 +thegreatone +bubamara +208208 +slalom +taugammaph +albino1 +123210 +ilovejuan1 +fotograf +corey8 +ilovedj +brigida +reynold +fuckemall +joanna +123456 +07071978 +crypto +bandits1 +bigboy8 +811024 +assumption +1wayne +mehran +123mike +x8axspumez +mayfield1 +vinicio +lovers14 +macy +100175 +1340 +01092000 +05091995 +linda23 +577191 +suman123 +london4 +ineedu +joeboxer +mysterio61 +chode1 +adam12345 +sophia3 +encounter +14051995 +23052305 +07051980 +flameboy1 +brazzers +tophat1 +rodney123 +alicia23 +01111980 +monique4 +batch +123103 +rossie +11051996 +solange1 +olivia15 +david55 +playboy17 +meshmesh +edwardo +baby2004 +dst1913 +marmelade +heat32 +66996699 +outsider1 +mischa1 +darkmanx +180977 +july2005 +valerie ++ +cupcake09 +lynn09 +sydney22 +hemanth +jojo101 +lj352d1ib31 +celtic12 +14221422 +daryll +xi345bifvn +hanna12 +600089 +asdfg11 +20041889 +kittens12 +051178 +xyxy159753 +сашенька +amherst +badmus +encarta +troopers +руслан +elliemae1 +julian14 +4weaxq642e +1adgjm +step +10011977 +basket5 +betterdays +311275 +single18 +buba +15091977 +kenzie14 +aa123456 +22011995 +300878 +nolase +kadence +11121976 +loulou22 +testme +130276 +ha1234 +tennisball +rudi +26021979 +32143214 +debbie69 +jenner +cindy01 +jairus +puntacana +eqes606898 +3e3e3e +password73 +year2007 +customer1 +singapur +mary18 +natasha13 +dillon2 +190279 +woodbury +876876 +desdes +1katie +19091977 +sd1904 +bubba09 +comander +140195 +tasnim +880505 +admin2 +ginger33 +water10 +828828 +porridge +bigmama2 +ford88 +sam +snoopy. +09011993 +awesome8 +asscrack1 +alenka +abby22 +gerlinde +moto123 +6435 +03kids +mary16 +fairydust1 +andre13 +0919 +kotik +bubba24 +dipika +lastfmpass +sheba2 +beerbeer1 +nina10 +pointbreak +rjktcj +ashlee123 +bloodbath1 +misbebes +hawaii09 +skorpion +deathwish1 +venividivici +orlando5 +houston281 +121171 +4454708 +barber24 +jessica91 +090907 +06101981 +03051996 +hahaha6 +420024 +100109 +sandra. +lauris +trystan +theboys3 +198030 +twiglet +jakeman +19871989 +damien +crazy4life +mater1 +dodge99 +sloane +steve5 +massena00 +30041997 +freaky12 +robby123 +maravilhosa +viking123 +megusta +teardrop1 +211275 +west49 +eddie7 +hallow +greenday9 +dispatch1 +achraf +130775 +sayang87 +allinone +buster17 +06071996 +monkey83 +sexybabe12 +1sugar +monster33 +ciera1 +p1p2p3p4 +emopunk1 +irland +friendz1 +jndfkb +dorotea +dhiraj +blacklist +tiffany9 +211076 +28051995 +01041975 +zxcv0987 +marshall3 +smallboy +673kobby +bosshogg +0314 +prince09 +100296 +120102 +toma +morado1 +886688 +schultz1 +martinez +bubbagump1 +never2 +twinturbo +171296 +19841013 +yuri +slayer66 +sms123 +alpha3 +impretty +ernest97 +antihero +w1ll1ams +coolwhip +touch +355355 +saliva +diablo01 +julian5 +789512357 +nognog +nicolas01 +goodfriend +monkey911 +132313 +redred12 +18121977 +130303 +ivan1993 +norma123 +sasusaku +voyager +120471 +kalafior +mommy15 +161195 +21071978 +les123 +nomads +weasley +time2fly +chikis1 +diamond06 +justinbibe +roofing1 +03081995 +mexican10 +panganiban +270677 +560052 +hummer69 +jake2006 +16181618 +moonlight7 +shoes +221994 +nora123 +composer +060196 +28121976 +troy11 +17051978 +1gracie +kosmos1 +axe123 +mommygirl1 +sammie13 +rhtfnbd +21021978 +050478 +duke08 +15061995 +150196 +l33tsupah4x0r +basketball3 +20081996 +300778 +ittybitty1 +1433 +19841019 +02121977 +20031976 +kayla +pinky14 +faisal1 +pampers1 +sasha2001 +redzone1 +cooper! +piper2 +shawn21 +asdfg456 +trees123 +angel1988 +11101979 +1sebastian +gvqzvxub76 +kiki16 +bunda +thedark1 +101271 +ybrbnf +100574 +tiger98 +bella03 +jetson +cherry25 +18811938 +05121994 +122005 +reserve +ashely +080181 +290794 +albachiara +free4life +nehemiah1 +kader +opium +pierrick +25452545 +lorie +198677 +524524 +pepper02 +1password2 +rachel88 +allstar13 +meghan12 +sosososo +130897 +party5 +mc +axel123 +shay14 +greats +sabastian +0705 +hand +heatwave +mama00 +chase5 +a123321a +wrestling7 +mentiras +daisy06 +youness +serena12 ++ +030676 +10011996 +softball02 +199522 +rosie3 +weener1 +tinktink +1linda +elrey1 +gabgab +04051977 +rossi1 +staple +monkey82 +chopper3 +younger +05111980 +poopoo9 +ilovethisgame +dctdjkjl +kickass! +230176 +samtheman +morris +renan123 +snowshoe +jasper09 +040793 +334433 +motorka +golf22 +23101977 +dime10 +04011994 +mangala +labas123 +lasvegas7 +1434 +artemisia +mummum +getoff +myspace81 +160596 +born2kill +821228 +teresa11 +opelastra123 +mandee +telefonino +denden1 +wetwilly +himom1 +marcus99 +hamdan +lol1lol +xoxo12 +14031979 +gorillas +pengpeng +joejonas2 +414414 +jackie08 +brooklin +malgorzata +bowbow +life21 +nigga01 +tonitoni +29031980 +mahimahi +brad1234 +303132 +gopnik +flatout +solara +lukaszek +angie3 +superbee +abigail5 +micione +mwangi +henry +vasara +canaan +197519 +jaejoong +sone4ko +hokej +tpain1 +jktctymrf +i1234567 +020779 +108 +aa5201314 +sister11 +sexii +rtyuiop +7grandkids +271992 +dodges +taurus +shelby15 +lincon +07071998 +iloveumummy +xdl65b6666 +13121976 +lemondrop1 +feranmi +pazzainter +779977 +tosha1 +crazyass1 +crazykid1 +ashley28 +mimi21 +lynn08 +06121979 +daniel2009 +noble +heygirl +guacamole +1dennis +bmw540 +hayden09 +31081979 +thegame12 +golgo13 +biscuit2 +12347 +auction1 +24061995 +im2cute +tatianna +bizzle1 +booboo07 +fucku9 +autumn08 +tommy +morena13 +cxzcxz +bobbys1 +040577 +fister +120208 +gwiazda +crumpet +qwerty1981 +30051978 +iwantyou1 +21082108 +linked01 +ginger02 +15011996 +louis14 +andres01 +lovebug! +flamengo1 +manchester +minnie4 +carter13 +291990 +ellarose +190678 +12031977 +freak666 +hjlbntkb +heroes5 +divadiva +pumpkin9 +secretos +zzzzzzzzzx +starr123 +13011979 +1257 +minhamae +070994 +madrid10 +r111111 +torchwood1 +cookies10 +eric18 +tucker! +01071995 +iamrich +precious10 +zinnia +love73 +tess123 +firenze1 +jason +capricorni +tupac12 +gunshot +babyblu3 +crownvic1 +takedown +charmed! +inuyasha. +milligan +l654321 +piggies1 +suckmyballs +558855 +26031995 +qingqing +22031976 +fishing! + +downloads +gatogato +goodpussy +12qw34as +missy14 +14071977 +300979 +1234! +soccerman1 +19912009 +westside69 +kaylee07 +molly15 +fattie1 +fruitbat +120672 +19871028 +102345 +hotchick12 +brazilia +cricket11 +jackie09 +10121972 +cerveza1 +xxxx1234 +bambam23 +zoey11 +gage123 +bear08 +wizard01 +streetfighter +060295 +1122aa +callista +anglais +041992 +blackness +jasmine29 +teddy14 +fatamorgana +bente6 +rubberband +neviem +050481 +nathan19 +grammar +yoyoyoyo1 +isaiah4 +181178 +tipperary +moocow123 +postit +210375 +200377 +kurnia +cali1234 +melissa19 +luke13 +ainara +lsu123 +c11111 +lynda1 +liyah1 +u8u8 +7008 +renee15 +29041996 +super01 +bear101 +020405 +niyah1 +alysia +tennis08 +hotpocket1 +erzurum +19071978 +wizard +261173 +aaa147 +dean11 +anika1 +4mygirls +220876 +qoxrzwfr +070381 +texas4 +gypsie +230996 +300476 +2grandkids +nay123 +dylan02 +211176 +21081978 +notforyou +prettyme1 +gammaray +22071977 +291195 +baby420 +4pussy +lilrob +trusty +maria26 +king44 +flowerpot1 +121965 +111171 +080995 +lesedi +uiop +london2009 +harley33 +180794 +loveme0 +plombier +tracer1 +esp +180795 +longview1 +05121995 +cheeseman +lovelyday +seguro +greatday +sofie1 +dima2009 +211990 +wwwwwww1 +darkness3 +cheri +stone5 +christmas3 +babe16 +06111981 +bitch93 +angel72 +kfx400 +blb +piston1 +yellow66 +110899 +hunterx +21101976 +elgato1 +tinchen +super17 +27031978 +brooke06 +emerald7 +garfield7 +infinity +durand +doolittle +jacob17 +baseline +31071979 +01111981 +nikita2001 +george18 +chiqui1 +boricua21 +lovelyboy +colorful +jafjkshf7y6w34rjd +bluemonkey +smiley22 +scouse +catrina1 +fishboy +volcom8 +def123 +nathan1234 +badass! +irenka +avondale1 +cookie20 +anupriya +ghjcnj123 +pword +1029384756a +aj +fairlady +260977 +jellybean! +blue789 +connor4 +ilove$ +brooklyn! +banking1 +tumble1 +pashtet +yahoo.com1 +alexx +marines12 +oldies +020995 +kimberly1 +peeps +040678 +tiggers +marie90 +opanka +music12345 +manju123 +kaelyn +199013 +markjohn +19111979 +smiley23 +140476 +mmm333 +sandbox +kenjie +fuckthis12 +260778 +st1234 +eman +india321 +spliff1 +skills12 +harley9 +sub-zero +brianna09 +09021980 +acosta1 +schatzie +kaley1 +keshawn1 +5angels +rip2pac +sex777 +210278 +122805 +alumni +11061978 +tony1 +11051976 +20011977 +cellular +cassie +13451345 +m1space +qazwer +twilight8 +dance15 +alexis97 +ivor631996 +leafs +105 +270895 +cheer6 +icecream6 +raymond5 +email123 +greendog +yankees +grandma! +highheels +101064 +futsal +vbkkbjyth +sucette +monkeyz +070608 +fiatuno +29101995 +15101976 +vfktymrbq +08091995 +girafa +homie3 +aaron24 +babyboss +malik2 +romani +380008 +crystal08 +paradise7 +honey19 +sierra99 +stiven +scranton +rachel07 +001970 +adidass +besiktas1 +kittygirl +busola +20071979 +poiuy123 +goats +wan +sprinkle +albita +123987a +copyright1 +blessed11 +james31 +poetic1 +336688 +flip12 +11121975 +njqjnf +alexis20 +vjs9zdgyrn +playb0y +marvin13 +sammy24 +blackeye +goal +01041976 +junebug2 +30011994 +friend! +hahahehe +159630 +331133 +shrek3 +omolade +xxx123xxx +kenneth7 +199107 +numbers123 +diapers +enteng +199424 +veleno +19052005 +hayden3 +seasea +220674 +889889 +integer +160597 +weapons +luvme +britt16 +thuglife3 +12345hi +nkechi12 +px6gcr51 +burns +fernie +1water +fatcow1 +110697 +love4him +05081979 +sanasana +1linkedin +wade23 +beast11 +nothing11 +tierney +1x2x3x +rockers123 +harrison12 +stupid22 +18111995 +annamaria1 +razorbacks +winter23 +021196 +miller7 +leslie3 +puerta +quita1 +cheena +170576 +w1952a +cookies9 +08041978 +aaron +bball07 +imapimp +celestin +matrix00 +futbol7 +18091979 +ownage123 +sugarcane +wooden +inception +siemens123 +iphone123 +corrie1 +16899168 +010901 +london24 +1albert +101269 +torres +fritz123 +13011980 +diamonds12 +salford +summer67 +player18 +280277 +120508 +yfgjktjy +lunch +donvito1 +innov8510 +mascotte +loner1 +migrationsandeep +titanic +great8 +27111993 +hdfcbank +1boricua +31031978 +thunderstorm +rodzina +skylight +france +boriss +18081978 +oliver69 +erwann +vagarsh +11061976 +210101 +stephane1 +kathleen12 +torrey +sonyvaio1 +hershey7 +89 +3323 +simple01 +tulpan +dalailama +towtruck +schranz +jaxson1 +nefertari +teddy4 +allme1 +1qweasdzxc +vegemite +kucing123 +schizzo +fenwick +vainilla +whatthehel +rayray23 +fiddle1 +gonoles1 +jazzmin1 +102400 +youaremine +house11 +luis19 +inspector1 +sexi101 +sexygirl16 +spencer! +sublime7 +reptiles +nagato +170977 +leblanc +12061997 +jimmyjimmy +britt07 +dylan15 +30063006 +beba12 +pink321 +patrik1 +khushbu +03031997 +bambam! +270978 +busterboy +160377 +elmwood +madi +whatever14 +ilove! +101173 +090793 +seabreeze +p455w0rd +slyfox +chigger +110806 +matt77 +ftbfrvlg17 +422422 +ernestina +burnout3 +mercy123 +kyle08 +moxie1 +regina +2n6ezl7xhp +200295 +ikke +1q1q1q1 +torment +eminem313 +carrillo1 +snickers13 +panico +william03 +241275 +abucanda +130196 +??????????????? +lee12345 +schuster +vfvfif +hardman +250375 +babyboy24 +24061979 +yahoo69 +fuckme6 +080108 +shelly +cangri1 +belmonte +allie2 +autobots +hottie55 +110872 +as0000 +210674 +ranger6 +caca22 +s39jwbw5ia +kaczor +sora123 +anggun +566556 +9021090210 +141996 +space5 +luisalberto +newbie1 +daniil +cheese +badass22 +1824 +blessing123 +augusto1 +crusade +beetlejuice +raiders15 +tiger2010 +chopin1 +cirillo +300600 +123789abc +hardwork1 +yummy12 +summer96 +sideshow +090678 +1cor13 +maimaiyeuem +runner11 +28051979 +viki +asswhole +duncan12 +zoey1234 +27051977 +boriqua +a42904290 +christmas7 +nopasaran +ivan1995 +batman27 +joker007 +teamoamor +041194 +eminem15 +301176 +grade6 +caddie +marie86 +donita +romnick +frank21 +cintaq +25011979 +bs1234 +fernando. +coolguy2 +27011978 +125001 +juicy69 +whitewater +buddycat +231072 +medion123 +madoka +lovedetoi +toshka +fernande +sureboy +strawberr1 +young3 +091194 +rach86 +password40 +zxcv123456 +amb123 +satriani1 +150375 +555555555555555 +london12 +1388 +patient +270295 +niania +19871025 +collect1 +123951 +85207410 +love1313 +funny3 +090309 +fresh14 +booboo18 +usuck123 +fred1994 +felix13 +ronnie11 +iloveyou98 +rmz250 +04101981 +abel +clubber +colombiano +arun123 +pawelek1 +vicenza +fairplay +menmenmen +milkbone +18061996 +200378 +carter09 +wkgmmjh623 +myhumps1 +noah06 +cheese0 +alamo1 +011278 +kelly1234 +poopstain +santodomingo +tara11 +lop1346781 +kepompong +loveu7 +perro12 +19081977 +21021979 +15051996 +bonnie3 +bettis +garfield1 +treats +090694 +030608 +peanut1234 +cassidy12 +210376 +killa4 +london! +erection +69camero +melanie01 +lollipop8 +07091980 +kikelomo +cheer9 +penguin1 +loneliness +casper! +dorothy2 +28121977 +132456789 +darklight1 +lakers! +2266 +nichole123 +bunnies2 +hillview +john27 +yourgay2 +kiakia +841022 +password1. +24031979 +loveyu +blanchard +sexybum +april89 +110303 +mattew +zebras1 +150876 +198488 +chargers2 +03021977 +twenty5 +nostress +joelito +dirtbiker1 +timothy5 +golfer2 +198731 +foshizzle1 +11111995 +09041977 +love1love +score1 +renee09 +johnny16 +covergirl +195900 +studman +raymond1 +gothic12 +john26 +qeadzc +steelers +getatme1 +26091994 +gfhjkm12345 +samana +callum12 +bullshit3 +sportage +16111978 +daniel2010 +johnmayer +ora +southside9 +romans828 +manu4eva +blonde12 +5demayo +onemoretime +chicago8 +adrian16 +bubbles99 +250695 +sona +pink32 +delvalle +plato1 +fuckuall1 +mamie +hunter01 +abcdefgh +snoopy08 +priest1 +070194 +football04 +minty +acqwah +crystal09 +walker11 +bluerose1 +cheater! +иришка +mario4 +13071979 +j121212 +jeep99 +sexyblack2 +anycall123 +bella19 +greygoose +11091978 +corkey +justin1 +ranger88 +newlife2011 +scooby08 +hash +soccer10 +rose07 +bodensee +spaceballs +london55 +020777 +801225 +children7 +happines +afghan123 +230874 +new +dude77 +diksha +babyt1 +submarine1 +hevhk43n9j +a7758521 +070694 +crazy111 +180596 +20021975 +120272 +15031503 +gampang +emma09 +tyler. +1234567890a +01121978 +beirut +chicken99 +magic21 +george17 +20031997 +1234567891234 +chopper7 +maddi1 +149149 +06121995 +13051979 +19061994 +821210 +filippo1 +phantom7 +potters +spellbound +mama1961 +frosty12 +bruno01 +neymar11 +w1953a +justin91 +ellie2 +hokuto +alquimia +pallas +922j5cefcj +040498 +tyler97 +india12 +peaches10 +costas +macduff +greshnik +raiders20 +140298 +414200 +9119 +091295 +gege +523252 +lolman123 +thebible +1brian +oleg1998 +zxcvb1234 +doughnut1 +amoah2010 +65 +qwertyuiop789 +jamesy +mykids04 +swab123 +ladybug22 +magdalo +angel1998 +hannah1 +shanes +kaylee11 +howard123 +minger +alexander11 +32 +orgazm +kristina +14121976 +801123 +caitlin +george1 +303 +dawkins +balanar +12345678963 +admin01 +messy1 +sagopakajmer +imissyou! +mmouse +sadness1 +231296 +cavaliere +261275 +12051976 +toasty1 +saintseiya +fairytale1 +090409 +grissom +129 +nigger420 +belgarion +phalanx +20011996 +lac +061979 +vegeta +hunter666 +lafrance +240996 +thuylinh +tem +fishfood1 +azerazer +flowers. +bruxinha +030503 +05021978 +mattmatt1 +123abc1 +babybash +1potato +nikki24 +bookmark1 +hedimaptfcorp +8x2h4fccap +karen15 +penguin22 +19111996 +lucy08 +marley08 +wmtmufc1 +catseye +fall2007 +skater99 +v123098 +16021977 +19841121 +06071979 +camry1 +01051996 +29101978 +234649 +ferndale +bubububu +21212 +grunge1 +louise23 +muffin14 +bk4life +09021978 +cowboyz1 +021296 +dalila1 +mandy11 +boomer +codybear1 +viking12 +orange66 +130377 +ha123456 +181983 +boredom +cowboy9 +hunter94 +suplada +buxton +21051997 +anthony29 +20081978 +massey1 +kmdbwf +oreo01 +boss22 +02071975 +281095 +djkrjd +dragrace +tema +hamster3 +atown1 +backdraft +elzbieta +deltas +babyfat1 +patricio1 +210505 +house5 +05021996 +automotive +noworries +thatguy +kenny69 +sexygirl! +fireboy +250476 +0923 +donkey3 +memere +camisa +hotmama12 +kenz4u +fuckyou90 +198013 +hotmail5 +music06 +jackie6 +oreo14 +pimpette1 +riding +zaira +fourier +160376 +cookie02 +britt15 +bigboy08 +lucas +toni12 +galatasara +28082008 +fire10 +210574 +pirates12 +atlanta123 +iloveyou.. +lovebug10 +27051995 +sumeet +notme1 +2bhappy +26101979 +kkk999 +murphy7 +211006 +1alejandro +sarahann +reject1 +longhorns7 +140299 +06061977 +030477 +snow22 +kissme23 +masha1998 +carrera4 +timmy01 +102001 +eros +buttercup5 +falcon13 +homeslice1 +bunny21 +rimbaud +mickey27 +redtruck1 +badazz2 +polinochka +sssaaa +cuddle1 +k1mberly +katie +useruser +19861110 +ilovehim10 +steph21 +cutiepie23 +fishing01 +panthers5 +spike69 +crayons1 +ps2ps2 +damien123 +olga12 +deaddog +snowman7 +smartone +ghjcnbvtyz +brunswick1 +pepsi23 +princess1 +gazebo +thorpe +asd147 +2513 +source1 +25111995 +kekette +thommy +andrey1996 +latifah +faithy +linger +mason5 +redsox14 +awesome101 +booya +gonavy1 +manomano +23031996 +orlando11 +pejsek +ohmygod! +jackson24 +antiflag1 +080681 +jenny24 +dr.dre +ingegnere +cowboys33 +11121977 +161994 +ego +slipknot22 +ricardo22 +kroger +hulkhogan1 +25031978 +kisskiss2 +11031975 +getit +killer777 +maddux31 +bettylou +400091 +green00 +31051977 +boarding +fire21 +welcome0 +30081995 +260278 +atenas +digger +daddy25 +dreads +kobra11 +310794 +potter13 +jess16 +turnip1 +19851223 +mushrooms1 +abcdefg3 +7399 +kingdom +jamie07 +monkey81 +bf1942 +slipknot14 +powerplay +snowbird1 +07111992 +markovka +alex76 +caleb3 +janine +stormers +170496 +ramboo +19860214 +2joints +sharron +bidadari +mari10 +liberate +281980 +fhbyjxrf +010166 +honda1234 +dascha +spike5 +2q2w3e +ilovesoccer +pw123 +200609 +1barbara +030281 +nadine123 +tommyg +scrappy13 +251175 +beverley1 +17091976 +101510 +jameslee +2jab4x2c +jbaby1 +institute +yygjmy333 +sss777 +080182 +heinz +28101978 +victoria15 +29121995 +larissa123 +zenobia +sodiq1 +1313131 +keanu +c0c0nut +harvey2 +02091975 +tete123 +emma14 +whi +poligon +confident1 +16081977 +dub +freefood +123car +hug +money888 +1234567ab +beast5 +scoobydoo7 +mike92 +050572 +110573 +backflip1 +120700 +qaz147 +diamond18 +1617 +kandi +1christine +10101973 +joselyn1 +linkedin23 +pragati +protege +mentira1 +america07 +517501 +fuck1 +wacker +savannah08 +samuel09 +george16 +warrington +jesse18 +gipper +line +ch1ck3n +kakka1 +helloall +fatass3 +jordan90 +carmen69 +jessie09 +080394 +longdick +310576 +fuckyoutoo +der123 +hola12345 +eliza123 +power8 +p00000 +chevy2500 +1orlando +brn521 +truffle1 +diversion +jayme1 +070309 +1qazxsw23 +kurgan +dmedcn23sd +manunited7 +hunter89 +hodges +innainna +bab123 +smile4ever +natalee +raj12345 +kolesnik +berkshire +fandango1 +computer69 +200275 +131296 +diletta +simon13 +aaliyah08 +7412 +quiero +193746 +08081973 +barney10 +serafino +xhh787qpcd +7117 +foxxy1 +hopscotch +ketrin +password7 +3tb8xl42bj +poekie +marissa13 +abcdef4 +821024 +cheetah12 +poiuyt123 +headbanger +102578 +fuck66 +913913 +c6djvmskcx +jalaram +lilly08 +kobayashi +marco11 +fender! +xochitl +130373 +joker45 +goldie2 +001966 +090593 +lwf1681688 +koalabear +polinesia +lambo +11223345 +john0316 +spaceball1 +p1assword1 +dallas05 +#1nigga +hockey89 +417417 +10071996 +daughters3 +alicia21 +19032003 +corrina +329329 +angie23 +bilal1 +stpaul +111198 +021992 +theone01 +nanner +kissm3 +gummy +20032007 +19831022 +jourdan +jc12345 +system +prince! +rebecca4 +ramada +whitegirl +15041996 +11121996 +3311 +821225 +uhbujhmtdf +7355608 +kelly15 +superman30 +whoami1 +matt25 +micael +mistyblue +190895 +27071978 +kupa123 +brandy21 +g00dluck +11041997 +150475 +110574 +04071996 +2214 +crusaders1 +ras123 +remember7 +soccermom1 +0601 +dylan +raider2 +bovine +roxyroxy +16011996 +1244 +cream123 +werewere +jonathan69 +abcde2 +charlyn +andrew86 +life09 +hadassah +ricky4 +jake +wo123456 +blue91 +find1234 +alejandro +luis20 +821022 +munkey1 +alejandra3 +lovesex69 +hjlbjy +poirot +061078 +1cocacola +333aaa +120107 +n00dle +1patricia +hossam +panda! +repeat +gemelas +brenda15 +66 +south2 +melo +att123 +myspace.1 +11794591 +sadie07 +idinahui +010597 +dandan123 +genuine1 +parker13 +ilovebritt +things1 +toto22 +310775 +qwaszx +tipsy +muzica +sliders +emmanuel123 +marge1 +autumn3 +angelo +emily17 +070280 +prince33 +october01 +crazyone +awdrgy +120569 +85chevy +poke123 +mojo69 +sunray +kahuna1 +123456sd +silver18 +skripka +rock88 +fucknut +gegege +hap +280377 +wasdqe +metall1ca +25011978 +daisy09 +071982 +guru123 +princess82 +locos1 +tigers84 +terter +504boyz +september22 +airplanes +jilipollas +valval +rocks123 +19870101 +199124 +norita +jirafa +allison13 +fuckl0v3 +january09 +deadfish +alex32 +faisalabad +090183 +verynice +gurl123 +asdfasdf2 +krasava +wilson5 +barabas +neisha +121261 +jigglypuff +setting +qazxswed +300877 +201100 +landon3 +fuckyou45 +froggies1 +thing +110197 +emoney +sommer123 +2345678z +warthog1 +tigger67 +13121975 +z7895123 +sharon11 +sereja +demented +rocknroll! +papang +bogdana +cvbcvb +new-york +sofias +pooh69 +hotdamn +paradigma +almita +198630 +natasha3 +tiger27 +eddie5 +ferrari01 +lafamilia1 +27051978 +eddie4 +phoebe01 +alejo +selvam +nidhi +123m456 +mirabel +biking1 +19051997 +5point +shahida +monster16 +justice01 +garrett3 +fire101 +sampson2 +tanktank +smokey8 +310197 +junior33 +33221100 +inlovewith +пїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕпїѕ +yelhsa +babydoll7 +041296 +february26 +09081980 +lounge +22041997 +pragya +14241424 +tysons +boomer4 +120774 +vanpersie +allen21 +cocacola13 +080581 +athena12 +espero +smile24 +ripped +galahad +behemoth1 +guntur +rafferty +1corona +cfdxtyrj +brijesh +02091995 +270279 +7777777n +15031977 +120198 +chronic2 +emachines2 +kenny6 +myspace82 +desiree12 +20111976 +twilight9 +green111 +010165 +robert44 +190694 +15092007 +frank7 +115533 +alican +ams123 +230796 +motherhood +crystal16 +2020202020 +index0088 +angela. +1147 +khan12 +040979 +031990 +golf4fun +jackaroo +nikki1234 +hallodu1 +lovelove! +050403 +00123 +alley +halo12345 +samuel4 +omar23 +22071979 +bookert +coop +nichola +milo11 +4thofjuly +asshole99 +lala07 +trippin +zafiro +z19721226 +parkur +25071977 +silas +19011977 +28041979 +500 +fourfour +cooper06 +sliver1 +25132513 +denizli +qwaszxqw +poczta1 +monika11 +09051994 +amiramir +kisame +detroit7 +021202 +money321 +montel +apolonia +190179 +muggle +money1 +joker8 +bella02 +kandice1 +mason06 +sunny1234 +zachary! +ybrbnby +pinarello +damon123 +coco1 +821013 +091093 +197219 +sweety22 +pollo12 +190278 +241994 +zizou10 +bitch56 +makeme1 +pollop +nokian81 +nigger8 +200696 +deniska +mundial +gate13 +piglet01 +bulaklak +ilovewill +hello456 +honey27 +110474 +jdnazp972x +munchen + +tobby1 +loverboy3 +210275 +22031975 +peyton08 +parker10 +special1 +13111995 +rosebud7 +sercan +lindsay12 +mooo +pickle13 +descent +041278 +09111981 +300596 +myhope +dabulls +jake18 +julio11 +23082308 +westbrook1 +connie2 +332 +tequiero2 +finestra +cntkkf +shammi +chancey +loveme4ever +twilight123 +teamomiamor +yosemite1 +marcus15 +vfvfvbz +lover06 +java123 +pirate12 +120497 +ryan2005 +sanyika +summer45 +140276 +sports21 +c54p7uikgb +nivram +sandydog1 +boo1boo +25142514 +heaven10 +bobs +0000aa +redsoxs1 +21041996 +231074 +sonson1 +98chevy +christine5 +04121994 +brandon00 +attila1 +bask3tball +tyler12345 +deadman2 +bikerboy1 +simon7 +money2011 +doctor +pebdfcz3yx +delatorre +lillies +acid +maryjane. +opopopop +30101996 +813813 +luvya +athletics1 +tinker8 +fuckyou44 +hs16andi3z +19851203 +golden22 +ilovemike! +20101975 +brittney2 +camaleonte +kulikova +15935789 +mayito +adele1 +020476 +password51 +chad1234 +benji12 +maksmaks +01101977 +hotels +qq123000 +fucku. +warhead +16041977 +francesco +cr125r +rebelde10 +acc123 +110100 +namaskar +homestar1 +29061996 +lapine +excel +chuck2 +kingme1 +david87 +121068 +waterwater +aziza +emma +flipper2 +abigael +197722 +ballen +brigadeiro +brandee +lamar123 +1kenneth +blondie01 +salad +circuit +were12 +180898 +29081981 +454 +lambretta1 +pink!! +199325 +tallyho +indian12 +sarkis +julian23 +kirankumar +horse10 +uranium +marcus06 +bigboy! +sheckler +team123 +21252125 +deepsea +apple08 +sun2shine +iloveyou56 +200009 +goons1 +macie1 +199405 +kari123 +urmomma1 +pa88word +sarvesh +eee123 +fcinter +funkytown +bernie +unitedkingdom +141979 +19101978 +fishy2 +malaguti +7777777k +onlyyou1 +1213141516171819 +nemesis +watch1 +16121977 +22051996 +doublej +dic +nancy13 +cruz123 +madremia +goggles +811020 +ravshan +lilmama4 +199014 +klaus1 +19932008 +house4 +keyshawn +glenwood1 +27121978 +040709 +190879 +pacute +henry13 +010168 +5550666 +nicki123 +mohitb123 +020307 +135qet +fredy1 +connor02 +icefire +beepbeep1 +95camaro +superman45 +angel2001 +sammy05 +jack25 +drifting +absinthe +teeth1 +16121996 +maggiedog +061980 +canarino +ghjgecr +pasta123 +17071978 +18031978 +suck123 +bitch321 +558899 +love63 +minime2 +kesha +14jesus +mexico90 +newfoundland +q2w3e4r5t +justus3 +ou812345 +blessings7 +karibu +b-ball1 +yo12345 +010278 +garance +nunu12 +oleg1996 +arbiter +200406 +lerolero +bicth1 +loveydovey +diva4life +lisa15 +16101610 +sexybitch5 +dfhtybr +wunderbar +19861215 +ilovezac1 +bitch90 +bljs2v85pt +nirvana1 +mima +hjvfyjd +dontask +master12 +saturn12 +lovebug69 +alberto10 +kirill1998 +cheyenne13 +21031996 +cheyenne01 +myself123 +kristo +ch3cooh +papucho +07111981 +dallas15 +deion21 +140675 +198018 +girl69 +luluzinha +0807 +tampa813 +adgjmptw +851125 +star93 +claremont +131980 +joseph00 +kocka +killa9 +lammas +instructor +phatboy1 +cars11 +kenneth1 +ncabeax2vx +schaefer +290779 +petshop +sudha +19841224 +angels69 +midnight69 +568568 +290477 +star28 +amor20 +outlaw69 +rodney12 +123david +braeden1 +princess83 +hmfan1 +heavy +singleagain +articuno +sylvan +mantis1 +290695 +78917891 +031076 +sixtynine6 +rocky25 +seronoser +gamaliel +500076 +tylerd +insect +olivia16 +storm11 ++ +12101975 +carson2 +wolf01 +maremma +franka +eyeballs +stupid0 +donnelly +chester8 +241097 +alexie +veczhec +rattle +diana +170696 +надежда +alone4ever +742617000027 +harold123 +mariapaula +251981 +170976 +slippery1 +29091977 +2turtles +231200 +100374 +1corazon +dantdm +1sexygurl +robert66 +hellyea +gallito +internet3 +05051971 +miranda11 +dildo69 +wilson13 +lolomg +alf123 +27121977 +1tucker +04041974 +dibble +famous21 +lemons123 +240675 +britton1 +02061972 +zaneta +steelseries +0246813579 +hfcgbplzq +swami +11121974 +julia3 +superduty +08101981 +stming4 +ghazal +making +compaq +mexican15 +fred20 +21081996 +elektra1 +edward25 +vincent01 +060195 +2letmein +919919 +dlnvhvu492 +chem +coolblue +pebefcz3yx +ethan09 +19111994 +limanlly +hunting12 +froggy01 +121600 +vin123 +navara ++++ +panther9 +trener +28101979 +roby +251979 +renee23 +eastside23 +imbecil +willwill +omarbravo9 +level +rebelle +10091978 +tweetypie +jack17 +bulldogs13 +slim12 +nokia5 +winter02 +louis12345 +wolves +hardbody1 +221022 +cortland +albano +bunny9 +sumit +mathers +ahmedahmed +mali +060506 +camaro01 +matrixx +educate +f76t94prm4 +ricky5 +wendy2 +irock13 +trouducul +singlemom +ethan10 +suzuki250 +821017 +030494 +woainia +fishlips +ransom1 +chris84 +chitchat +250397 +27041977 +rdfhnfk1 +darya +bobster +bebep2x +bobcat12 +bubulle +m123321 +leopard2 +121256 +silver14 +cooper +monchi +nirvana5 +jujubee1 +l123123 +pegasus +411 +modeling1 +cirebon +brayden3 +pizzaboy +elton1 +kelly! +allegra1 +030696 +rayallen20 +24081978 +87651234 +thtajehzsp +199991 +sabrine +010708 +anniversary +grandma11 +qwsxzas +21011979 +teepee +croquette +escargot +cartoon10 +nikkisixx +bear15 +mikala +eljefe +1peter +ireland3 +jeremy8 +gosiaczek +huntress +wizard13 +jkz123 +shadow26 +nigg3r +03011995 +billou +prasad123 +bombshell1 +felix11 +chris1993 +711 +090594 +lalla +nuncamas +jysgy2yd87 +gig +132123 +toosexy1 +satheesh +512345 +thong +jess18 +denis1992 +babicka +121388 +ट +westwind +toothfairy +datuna +julian05 +asskicker1 +iamcrazy +02011995 +lfc1892 +tiger66 +kentavr +lifestyle1 +bluecat1 +linux1 +makanan +cracker12 +tkfkdgo0 +231274 +12051997 +flexible1 +angel76 +teamare +cipher +hunter26 +jyotsna +sahhas1221 +chris4life +1sucker +ruby10 +dare +cheerbabe1 +chula12 +burton123 +sasuke101 +boateng +ermakova +thomas44 +barnyard +sonusonu +outdoor +18011981 +oakcliff1 +joseph77 +pamela11 +03121996 +sidorenko +vagina. +09081993 +guitare1 +horseshit +sweetman +nata12 +mcr666 +jordan44 +3369 +twentysix +02051972 +alessandro +christine! +pingu +19391939 +silver24 +marmeladka +only14me +balto1 +renee08 +pilchard +hello2u2 +redneck5 +16051997 +ninenine +desiree123 +blarney +nugget12 +19871020 +sudden +retriever +821226 +282002 +jackass101 +skate420 +fred10 +equity +johana1 +1316 +heart14 +tinker15 +rusty13 +12111995 +verdao +yodude +12091977 +landon09 +stormy2 +sweet90 +jesusis1 +indian +alyanna +191295 +199007 +teamomama +lucy23 +19801982 +horny4u +sumsung +eddy12 +gennadiy +jhonjhon +papermate +tippmann1 +stepup1 +juli123 +june1979 +d0023500 +omg12345 +werken +170196 +michelle29 +england10 +arnold +linked1 +bul5tacumi +flipside1 +199621 +bibigon +chris83 +bayarea +loka12 +18021996 +corgan +sherwin1 +123.com +grinder1 +balla2 +06041979 +foxracing2 +hiphop! +chato +le_den_ec +aron +fashion! +yourmom6 +carolin1 +bitch92 +230476 +ihatemen1 +apples10 +meme10 +wanker123 +120871 +try123 +mathilde +220776 +meloman +861229 +19901991 +lolazo +matthew26 +hanger18 +colts21 +fallou +smores +195000 +szgd4ey287 +weeds1 +taburetka +bachir +cashmoney5 +19021978 +79transam +teacher5 +lilflip +superdave +eminem1234 +cleocat +060995 +handel +06041980 +22091979 +flatline +amber06 +oleg1997 +300478 +liljoe1 +icecream23 +mamimami +tiwari +18081979 +14041978 +300500 +18071979 +maddie05 +cry +chica13 +october03 +redneck16 +0806 +dhillon +michaels1 +hello56 +alessandro1 +963123 +400009 +fhtylf +000022 +01011910 +198118 +mistico +incoming +michal12 +merrick1 +310795 +18031997 +owner@hr.com +rocket69 +cordova1 +campanile +максимка +marist +1366 +biggie2 +hotdog23 +bestbuds +az123456789 +hashish +32615948worms +multik +loveisall +663366 +1remember +joselito1 +thomas97 +layne1 +mailliw +marijuana2 +simple7 +forza +shaniqua +s987654321 +2222ww +amerikanblend +r11111 +211003 +20091975 +20012003 +fuck50 +janet12 +natalie06 +john5646 +techno2009 +vaughan1 +22101977 +rafael01 +secret08 +naruto123 +chelly1 +ash12345 +04120412 +z223856 +bananas11 +simon11 +jablko +artem2010 +daniyar +june1998 +perkele1 +indore +karpova +210896 +p@55word +kool23 +sweetie8 +12521252 +17021997 +281978 +andreu +arabian1 +141276 +310377 +augie1 +2300 +29091976 +ivanovich +xavier4 +25011996 +samuel15 +donkeys +1738 +kyllian +ha +dimepiece1 +fishpond +purple87 +k.,bvfz +iloveluis +qecegda3zx +bluesman1 +280378 +agency +hailey7 +hotmale +26021996 +breanna3 +jack2009 +robertpatt +zaqxswcde123 +nfvthkfy +19021975 +student12 +21011977 +070680 +danville +24121995 +tinydancer +doggy4 +261980 +swastik +moosey1 +west14 +chuck12 +zxcv4321 +castor1 +wer123456 +251994 +roma2010 +damian +ws123456 +hellya1 +141000 +batman44 +ninochka +bluegirl1 +loveu13 +pontianak +kamogelo +london2008 +281992 +bryan5 +24031977 +peach12 +statistics +miranda5 +earnest +nick05 +19861115 +felix01 +pelayo +050909 +110102 +vova1997 +ihateu12 +heather17 +racecar2 +logic1 +thomas28 +tidbit +789523 +gamestop1 +zimmerman1 +qazxcdews +pink143 +juan17 +vtkmybr +galvez +doggy6 +842655 +120469 +qwerty1985 +abc123def456 +maadurga +pp +division1 +bitch!! +b1b1b1 +jeanlouis +dcba4321 +redbul +tegan1 +mantha +gateway2000 +kj1234 +freedom55 +totenkopf +201212 +7thward +mandy01 +ranchero +uloveme +kisses69 +richard18 +rasta420 +thomas91 +martes +19041978 +felixthecat +197925 +monster18 +timothy01 +sephiroth7 +bepositive +fatcow +yxp7wbewpk +050778 +destiny69 +sepatu +minnie5 +angga +godsson1 +no1butme +medtech +yomomma! +nitrous1 +oceanic +smile9 +harris123 +megaman3 +qazwsx13 +mayo +harley. +chinenye +tyler2000 +beaner13 +mona1234 +05101978 +tatita +georgia01 +darkdevil +socom +berto +19041979 +lotto +lord1234 +bloodymary +cole13 +daisy123 +freddy! +reymark +stalin1 +devin13 +rebell +1cowgirl +l11111 +060675 +stayout! +ytrewq123 +elijah23 +toontown1 +hardaway +melvin2 +lawlaw +motorola +s123456 +197419 +azerty77 +fuck111 +dominator1 +sean14 +asdzxcqwe +seanjohn1 +kissit +11021998 +life23 +3three +noah07 +aubree1 +070195 +amoremiotiamo +28091980 +murphy22 +dedication +jayjay6 +littlelady +r1r2r3r4 +singel +lacrosse4 +259758 +brown22 +scrappy12 +roro123 +train123 + +130013 +hiphop5 +jumpoff1 +new2me +payton01 +imsofly1 +fucklove09 +loveable2 +171995 +silver! +1surfer +hotboy7 +jannet +bulldog1 +thug13 +pinky69 +trabzonspor +dune2000 +kzktxrf +cameron04 +16081996 +klausi +tantan1 +1jenny +21011978 +801020 +aa111111 +29041979 +195700 +fancypants +stella! +fellini +300575 +rencontres +100871 +malhotra +mauri +oneman +fresh10 +120498 +peanut04 +mj12345 +merino +chester10 +charles8 +big +xavier +097531 +mickey00 +booger13 +difficult +22061977 +0zero0 +19851001 +27061979 +bigdick7 +oliver9 +special123 +arusha +12sexy +1louise +funny7 +rdfpbvjlj +asdfgh3 +110506 +badalona +peppone +menmen +dasha1996 +gillingham +pirates123 +831022 +yendor +girl15 +mitsou +13091309 +ladonna +19861103 +fuckyou02 +emma23 +mama19 +110309 +200675 +purplelove +oliver6 +dinesh123 +black26 +140894 +revathy +brenda69 +jackie18 +ctvtyjd +241098 +cutie69 +sweetstuff +tinotenda +march1993 +040280 +punjab1 +cuddles12 +malala +duhast +kittycat! +cby +bossss +antonio69 +france12 +kathy2 +chiquis1 +mama1997 +theused2 +hailie1 +bojana +surfin +voltage1 +celine +gurunanak +juana +pieface1 +romano1 +ethan4 +mackay +hustlin1 +panocha1 +14011401 +16101977 +bluelight +fractal +hello66 +xiaobai +7890uiop +manuela +0912345678 +18041977 +112369 +lilone13 +papako +lynn07 +gil123 +joel23 +0xzryx +260196 +kitty25 +melena +janay1 +southgate +230795 +811228 +tobi123 +kisses23 +diamond17 +05101979 +iloveyouja +dragonballz1 +belen1 +texasmade1 +pussy. +downey +soulfood +hotbabes +tootsie +181995 +steph15 +dylan23 +nathan98 +811018 +sara15 +grandma01 +olioli +deanna12 +track12 +bigal +skittlez1 +04011980 +whatif +cyt +midnight8 +30061979 +luisteamo +kriska +209209 +150276 +taniya +jax123 +duhduh1 +dachshund +eeyore2 +stella10 +wanderlust +loveworld +stayoff1 +1277 +261174 +scrapper1 +carlotta1 +porcinet +271172 +th +mexico00 +080194 +fatty5 +nabilah +asilas +wonder123 +12381238 +surfen +terriers +ginger18 +hitman11 +fuckit5 +jason420 +zombie2 +sensation1 +daniel83 +matylda +sophie1 +coconut12 +851123 +teeth +crissangel +s112233 +dinamita +231000 +debora1 +15121975 +12457896 +tomahawk1 +hearts11 +sugarsugar +bobbyd +getdown +liza12 +bandit14 +sn0wball +patman +poet +mysoul +gallant +hardcore3 +7895123z +kingss +sabertooth +beauty101 +ilovezack1 +relax1 +dalia1 +bribri123 +rjhjkmbien +mildseven +twins06 +love210 +gizmo69 +08121994 +shotta +omg999 +180196 +torpedo1 +rubyrose +lincoln8187 +joker99 +newlook +larisa1 +iggy +sawsaw1212 +reminder +0521 +digger12 +anna06 +parrish1 +frenchfrie +aqq997 +shanell1 +26061977 +andrey1997 +sassydog +ytq9bkr +deicide666 +thesame1 +banana14 +ballas +shayshay12 +bassfish +margarette +faygo1 +henkie +190495 +anatolii +benoit1 +22121996 +ra1ders +jalisco13 +andrew55 +senior04 +christ3 +cocacola10 +myspace999 +1580@welca +200404 +sidekick08 +sergserg +frosty +phat +priyanka1 +199428 +meeka1 +bengbeng +13031977 +johncena8 +zermatt +251975 +000911 +balla22 +surface +041989 +go49ers +jenna3 +stephen11 +lamar12 +eric08 +maxmax123 +muggins +buffalo2 +dianaa +221172 +mia1234 +lisa25 +azerty78 +842001 +101970 +jeetkunedo +624624 +justin92 +suspect +7samurai +volley11 +jepoy +safety123 +060480 +2882 +javier7 +jeanny +yourgay! +0423 +natalie23 +110298 +testes +pavlin +04061977 +01021974 +katena +sparticus +pulguita +11111118 +130574 +olumide1 +kolakola +pekanbaru +24021978 +judge +karebear1 +apple111 +220775 +151175 +ratona +alfa33 +12081975 +cocomero +together2 +ich123 +jamesl +jmc123 +viruss +married06 +26071979 +wlafica +cowboy8 +hobie1 +070894 +gabriela7 +tecate1 +yousuck69 +050109 +ryan2000 +abuela1 +nokia3120 +dragster1 +240000 +23081978 +300179 +karim123 +alejandra9 +jake77 +0822 +myband1 +qxvbgfibuq +frank1234 +antonanton +wales +916916 +chess123 +boxter +16041979 +reset12345 +nicolas7 +beth11 +perlas +guesswhat1 +030197 +3630000 +woogie1 +17121978 +sonofabitch +mousetrap +alarcon +dakoda1 +011095 +tester! +sydney! +kissa123 +291175 +brown7 +tanner5 +ronja +station3 +wroclaw +031296 +jairam +bigboi2 +christine1 +070693 +gator12 +197906 +280978 +hendrix2 +666666j +571632 +011983 +pointjor +551155 +darkness11 +potter11 +pheobe1 +cowgirlup1 +ilovemary1 +charles9 +270178 +060795 +borntorun +011078 +dora11 +080309 +loveandpeace +anna19 +lavelle +se +q1w1e1 +25041996 +rockland +21121976 +1babylove +17071979 +cc12345 +witcher +020306 +170000 +r00ster +281274 +ginger1234 +luis24 +status1 +khanna +aubergine +444422 +snickers4 +meteora1 +nikita2 +tink1234 +246789 +12121972 +duncan123 +marinho +sabrina! +0000000000o +gretta1 +152436 +dancing2 +cass123 +fou +bebe18 +rachel09 +oluwa +relientk1 +harley95 +17021996 +fiat +martina123 +sevenseven +chicago08 +skynyrd +112511 +14071997 +chumley +wet +mustang500 +cody07 +hottie05 +1wordpass +1derrick +rocky17 +astonvilla1 +akinsola +cro +freddurst +281296 +159753m +080876 +eagle01 +delphine1 +puppy22 +maimuna +03cobra +luv2fish +chabela +netwerk +malibu2 +douglas1 +18wheeler +30111978 +199619 +victor4 +lauren19 +drpepper7 +teamo100 +lightning +kilo123 +chipmunks +ihatehim +nirvana8 +ferrarif430 +twinkie2 +icross +whorebag1 +246891 +gangster23 +rock99 +rocky007 +021977 +wilfred1 +gaspare +homo12 +131096 +reset1 +brigade +hatelife +160677 +jerry11 +chaochao +srilatha +kevin27 +daniel82 +21222122 +karenina +snake7 +mygirls4 +120599 +091276 +lajolla +horny2 +sable123 +081275 +240976 +kjkszpj1 +creations +myspace121 +primetime2 +gungrave +19841125 +454545a +k3zechmext +dance16 +231995 +220675 +09031980 +lasttime +465465 +pingouin +18101810 +78 +hailey13 +121588 +harvick +varshini +goodrich +mario18 +iluvmymom1 +thegr81 +highspeed +angels07 +hd764nw5d7e1vb1 +toohot4u +frog69 +adgjmptw0 +09111980 +sugarfree +happy06 +useless1 +evelyn2 +nikita2002 +xavier22 +654321abc +manuelito1 +bodega +marsmars +26121996 +hottie88 +kimberly5 +redman123 +1721 +lollipop5 +060179 +snowangel +usmarine +mahmoud1 +rebel3 +pinkrose1 +yamazaki +hottie95 +jared2 +241993 +startup +turntable1 +3.141592654 +sk1234 +jefferson2 +poepie +270797 +suki +110698 +260675 +199425 +080897 +chaitu +070480 +010381 +carlos99 +03041996 +051176 +04121993 +13531353 +collie1 +missthang +budweiser2 +______ +22031977 +011192 +melnikova +punk1234 +andre5 +lorenzo +566566 +fatime +romeo01 +06111980 +spokane1 +gfyfcjybr +0605 +91919191 +bratwurst +noregrets1 +luckys1 +dandandan +fernandotorres +avalon +success8 +kevinn +outreach +lowlife +01061975 +eminem17 +al3xand3r +921921 +busted123 +timber2 +020207 +sehnsucht +jennjenn +imanuel +staycool +26091979 +lollipop00 +021096 +250976 +stars4 +prairie +290976 +ceylan +satsuma +041295 +123qwe,./ +dream13 +199114 +myyolo +16091995 +honey20 +12011977 +derfderf +110472 +23692369 +primrose1 +mohanlal +teenie +2heaven +ilovemary +cordero1 +rhino123 +brittany07 +cvbn123 +dreamweaver +peeps1 +whitney7 +23081977 +ilovebrad1 +mapache +archie +jiushiaini +stern1 +shahbaz +hj: +mike87 +titty1 +guitar8 +200211 +felipe13 +24121977 +kingston12 +aurelia1 +231979 +27021978 +tisha +berta1 +23041995 +sutter +shellie1 +cody08 +produce1 +198804 +klubnichka +0987654321z +shesthe1 +040977 +ghbdtngjrf +meriva +ilovelaura +jessica95 +london88 +280977 +m1i2k3e4 +roxy08 +adrian28 +cityboy1 +070495 +090695 +metal! +snoopy9 +naples1 +050396 +killers2 +101198 +220597 +star2006 +alcatraz1 +kwame1 +coffee4me +boston4 +e7yvsskj +123_abc +killer78 +yvonne123 +m1911a1 +soraya1 +197826 +tampon1 +110673 +fall2011 +pohoda +23121977 +vishakha +redapple1 +1sexy1 +darius123 +zoidberg +settle +samuel08 +retard! +buddy88 +robrob +19821028 +connecting +boss13 +poprocks1 +sibelius +chenjian +patricia3 +nokia6210 +325 +kleber +hubba1 +goodtogo +mylife11 +220497 +195800 +jesusislove +qwqwqwqwqw +elenas +121800 +hotdog6 +grandmom1 +lupe13 +passwordd1 +bradley4 +beaner123 +chubby2 +capitol +memphis901 +teacher12 +entrada +3321 +jake88 +viv +profeta +kimera +leandra1 +lovebunny +31011997 +rock24 +49erss +19860101 +ronan +thelaw +fastball1 +190778 +beauty08 +blessyou +hoppy1 +br123456 +05071978 +21051978 +monsta1 +northshore +xavier14 +laoboi. +window12 +31051996 +panda4 +sukisuki +220673 +pr1nce +an1234 +oakdale +kakka123 +09041979 +skate88 +iheartyou2 +destiny04 +oliwka +06011995 +herbst +110372 +harris +holden123 +410000 +19821209 +smartest1 +190277 +amanda03 +black89 +sk8ter1 +ma12345 +71310615 +231977 +253253 +hiphop01 +30123012 +r0b3rt +pepper1234 +thesecret1 +110973 +karpenko +rainbow15 +05121978 +merve +honeybabe +12122000 +18051979 +elmatador +anwar +ndubuisi +tyrone123 +teddy +mireya1 +watchtower +210996 +26121978 +package +060996 +tester2 +numero10 +martin25 +hottie00 +honey88 +passerotto +vitamina +vonnie1 +spookie1 +flutes +241175 +vesna +johnny55 +anoushka +iluvgod1 +candela1 +sexyt1 +qweasdqweasd +thisis1 +280196 +02051974 +connect123 +7cr2gubvmg +unnamed +qtpie1 +trademark +20071996 +mike29 +carmen5 +spartak +17101975 +1missy +pimpin16 +emmalou1 +14101976 +061981 +10051976 +tendai +abc666 +boavista +matarani +hermann1 +lilman11 +mike4ever +skaterboy2 +pusspuss1 +aaronc +cdflm: +kurenai +stage1 +136913 +11011977 +emerica2 +2qaz2wsx +ginger1 +voting +vbitkm +iloveny1 +280696 +frogs2 +21111978 +isiah1 +23011978 +02081973 +darkness! +11551155 +6thgrade +0323 +maryanne1 +hrenota1 +15041977 +wankers +locksmith +hockey35 +william02 +181176 +zzzaaa +ervin +alma12 +play69 +nbuhbwf +l00000 +vtufgjkbc +ilikeeggs +bratva +012589 +idlewild +a520520 +recipe +chaney +zack13 +16051977 +071194 +ariella +yorktown +kakaska +03091977 +holyholy +010906 +jesus89 +god111 +akindele +21051977 +banana88 +daniel31 +lindsey! +08051994 +19851211 +mermaid2 +jaya +bitch32 +aline1 +07051979 +100203 +alice +lonley1 +hockey00 +food1234 +aramis1 +smoochie1 +robert101 +porker +blessing2 +chevy10 +roflmao123 +theo123 +diego11 +alfred123 +3333331 +kendra123 +bryan22 +ananth +5963 +louis2 +dave22 +ambrosio +02041971 +bytheway +jchrist +15011979 +joebob1 +nicegirl1 +papusa +19851018 +gemini17 +poznan +kamil12 +tiatia +elie3173 +199103 +gordon123 +drummer3 +saddle1 +czekolada1 +bosox1 +missy08 +hotmamma +hawaii06 +70000 +max1994 +bobbin +flavien +p2ssword +lucky44 +b43m6xhife +trytry +selvaggia +iverson3 +deathnote2 +swamisamarth +getsmart +sexyma +22081977 +123456789ok +sangha +semaj +freddie123 +courtney1 +5005 +panthers23 +20061997 +150178 +daisy69 +madrid +americanpie +wayne5 +ded +nur +10121974 +mamasha +daquan +johnny. +dajana +koko11 +riccio +020876 +cagayan +swanny +kaitlyn3 +jake02 +ohio123 +azul12 +usausa1 +fedor +sunshine30 +adam88 +teddy6 +scooby8 +turtle14 +hochzeit +hotrod12 +26021995 +pulsar180 +mariquita +chanel11 +sanika +freeman2 +adelle +shavon1 +guatemala2 +nastasia +flash5 +friendship1 +oliver16 +francisco +details +disney22 +2516 +070180 +april1987 +instant1 +230575 +291979 +bonnie13 +lucycat +02030203 +broncos12 +280596 +bobbob12 +ringer1 +211981 +tinker09 +17071997 +candide +xandra +summer2005 +skopje +ricorico +197333 +pumas13 +matthew95 +allison! +tool123 +mattingly +ribena +4wdaxp642f +bogota1 +nazanin +grad06 +waynerooney +fregna +sidharth +dillon11 +g0ldfish +ilovey +o67l2xzfvn +66667777 +sophie05 +sweeet +jorge23 +560050 +pokemon12345 +corazon +100272 +sanfran49 +45214521 +whitehead +janeth1 +mike03 +starz123 +14131413 +mickey20 +211112 +shane22 +chito1 +777777777777 +chiamaka +federica1 +william77 +jess08 +cochise1 +alianza1 +fucku09 +moumita +chocha1 +myspace67 +pakistan12345 +fuckyou86 +monisia +basketbol +120369 +09121994 +020802 +george25 +jammers +sheepy +javi +1stephen +kiss100 +shameless1 +lineika +suganya +frodon +james143 +roma12 +marie99 +endlesslove +risingsun +12021974 +08061977 +peter10 +shakeit +giacomo1 +442244 +110397 +chibi +jealous +jacoba +regulator +101004 +drowssap12 +1raider +090295 +septembrie +031989 +single5 +020708 +ratata +19841002 +lester123 +131200 +jesse1234 +andrew29 +audrey01 +trecool +lame12 +toto90 +sweet92 +musiclove1 +sdfsdfsd +denver2 +firewire +08081974 +ciaociaociao +mybitch +soda123 +lfybkjdf +dragon97 +mazsola +130675 +19902000ttt +loser99 +vball14 +121172 +123344 +123... +asdfgh1234 +shawty13 +florida6 +pokerstar +leelou +london66 +kennedi1 +lacie1 +150976 +251174 +april +xchange +pooo +killers123 +140179 +kelly16 +kookai +jesus2006 +linkedin2012 +kiran1 +car0line +lorraine +sora12 +123123n +njkmrjz +kickball +fairbanks +vwjetta +giuseppe +lora +hernan1 +aksaray68 +loco23 +blaze3 +bubuka +oriente +825825 +diesel69 +angels9 +10091977 +phoenix69 +beibei +060595 +29111978 +camaro123 +hfvd3425f +3rdeye +veronica10 +boggie1 +aerial +momndad1 +conan123 +020968 +capitan1 +sara14 +jazmin12 +musica10 +tanglewood +20101976 +enter7 +abababab +lowlife1 +callofduty1 +rockon7 +thought1 +jussi69 +kuningan +050779 +cracka1 +savithri +tigerboy +55225522 +nicole34 +julia5 +guilherme1 +ajalaa +god12345 +ottoman +badlands +011193 +041978 +gorams +laura! +mickey02 +bowwow4 +bobbob123 +poiuyt12 +29011996 +penshoppe +haha12345 +harrison2 +zdenka +fuckbuddy +danang +bulldogs +adgjmp +blister +benni +32123212 +dasha2010 +byakugan +rassvet +fuckall1 +lenina +may1998 +30051996 +knockknock +talented1 +golfer123 +rayray14 +d00kie +281982 +020308 +dominic1 +whatever08 +06101979 +vflbyf +121964 +06091979 +29101996 +azsxdcfv1 +africa12 +085213 +abramov +120298 +madonna +102008 +salad1 +facial +03011994 +tigger87 +pepsi21 +kashmoney1 +realist1 +lutheran +1natasha +cardigan +andre22 +salim123 +howdy123 +monkie +vincent11 +noddy1 +cassidy3 +booty3 +v12345678 +fusion12 +longboard1 +781012 +ema123 +chasseur +david45 +pollack1 +elinor +jumpjump +19041977 +0531 +241981 +01091976 +abkbgg +camer0n +its +zapatero +drowssap2 +261196 +110031 +stickers +isaiah +jaylee +mariaisabel +ihave2kids +1435 +jasmine20 +mysons +cherrys +doodah +sydney08 +j1j2j3 +991199 +21041977 +15061996 +charlotte9 +hackthis1 +mnbvc1 +adrian24 +200976 +necro666 +apple09 +hulaanmo +slurpee1 +bball! +1233321 +myplace1 +daffodil1 +04091994 +martin20 +204204 +lalala +catarina1 +030375 +821014 +ihateyou6 +etravelmoleoptin +serega777 +jersey12 +555555s +mikey21 +04051996 +suhana +barbarita +lynda +breonna1 +#1chick +bella1 +130874 +mexico77 +1238 +octagon +030596 +none12 +gavgav +wayne22 +nikos +10101998 +vivalafica +dgkallday +4079 +18021977 +bursaspor +051978 +225500 +01071976 +romeo22 +brian15 +allens +nanito +241196 +140776 +julio2 +lavern +froggy101 +char123 +tanuja +johnny15 +cambria1 +bienvenido +20012007 +player08 +janjanjan +999123 +amor2009 +130476 +batman66 +max1998 +minority +corvette69 +2813308004 +angles1 +hahaha +penis666 +marge +suffolk +queen10 +innamorata +245678 +grindcore +10011976 +april88 +dcwdcw +07121979 +mohamed12 +viewsonic +121223 +karolinka1 +charles. +murdoch +realty +dude55 +201206 +arjun123 +emma03 +160496 +campbell +charlie123 +mamapapa123 +nagaraju +lovepussy1 +2221 +justblaze1 +101055 +120470 +marla1 +06031996 +skincare +auburn12 +brook123 +butter8 +mast3r +sasha16 +290877 +david666 +201196 +darius2 +241295 +greg11 +27041978 +robbie11 +frank10 +nbvjityrj +bushido123 +lastname +internet5 +jmjmjm +animal13 +kmg365 +avantika +cupcake. +iiiiiiiiii +asdfghjk12 +frijolito +naruto33 +willow +propane +martin77 +logan23 +1georgia +alskdjfhg1 +maureen ++ +bryan3 +bryan23 +phoebe12 +killa69 +blahblah123 +waterh20 +kristen3 +120670 +gamble1 +snowflake3 +13091979 +321654987a +blinkblink +andras +j3ss1ca +19121996 +nurses1 +112002 +mariah10 +playful1 +notreal +koala123 +111170 +charlie200 +jakeyboy +forum123 +12091976 +skunk2 +03101996 +25312531 +gringa +seashells +estrella13 +3u7wrkaa8j +12111977 +reddog12 +505 +daylight1 +eman123 +fake08 +anna777 +star2010 +make +meli +sports101 +ilovejc +pumpkin22 +realmadrid7 +0099887766 +aminlove +lintang +iscool +20031975 +boots12 +535535 +bitches01 +madhukar +booboo1234 +fagboy1 +120998 +30011995 +280179 +wolverine7 +baby777 +logan04 +khuljasimsim +mariarita +signup1 +zsazsa1 +frannie1 +stmarys +powerslave +smile07 +hottness +thor123 +zw5a1u5evw +yousuf +whale +01061976 +229229 +19871021 +071195 +demarcus +allen20 +2mndonaaa +748748 +game11 +7777777v +13021977 +fatboy99 +retraite +rolland +facebook11 +accident +prince1234 +15021977 +super100 +mouse11 +quatre +sniper +scruffy123 +001965 +454454 +sassy07 +qazxswe +richa +jadensmith +canabis1 +meow1234 +tigers33 +nastik +pipi1000 +sweetpea! +redsun +lovesu +treats1 +dctulf +mybaby4 +joelmadden +310876 +pr +billy21 +roseann1 +161276 +peachie +kenzie2 +lover89 +tamilan +autobot +050479 +20091978 +sergio01 +trevor13 +filsdepute +270878 +number1dad +001995 +privet1 +birdies +1monday +pazyamor +pup123 +190294 +cool56 +91mustang +hamsters1 +rockstar19 +1860 +karelia +nikito +sirocco +plovdiv +19821020 +alexdelpiero +091298 +mammam +zabuza +hearts5 +jess5377 +antonio16 +pagani +maddie4 +anhthu +grafton +grunt1 +010161 +man111 +soltera +baller17 +campari +483483 +deyanira +ewqdsacxz +hanakimi +sassy09 +291277 +1foryou +ble +ljxehrf +320000 +hawaii99 +lucifer +gavrik +ilovecheese +rosebud12 +villareal +140274 +gizmos1 +llama2 +mommy32 +varun +asiamarketing +leon01 +bertone +chris1989 +redsox05 +wardog +dozer123 +raven69 +ert +guerreiro +jayde1 +misspriss1 +rocky06 +brandon27 +jimmy +marsha11 +farcry2 +gonzaga1 +jos123 +doremi123 +dimon1 +pwisdiwhs +little5 +09051978 +matt19 +081200 +morenike +bluearmy +pulsar1 +tommygirl1 +dumbshit1 +runfast +2225 +21101977 +kisslove +bulldog +30031978 +karlee1 +abigail11 +katter +pusinka +kokanee +mistica +loveme4eva +221200 +people9 +060777 +sivasiva +mercer1 +maslo123 +janajana +04121977 +dianita1 +560058 +wingzero1 +121316 +2539 +28061979 +jenni123 +06121978 +marlboro12 +connor7 +farted +tanika +derf +manofsteel +090881 +marie91 +020274 +100102 +jacob18 +unilever +1jellybean +marius123 +trickster1 +crocus +12021975 +18031977 +sarah. +sidney12 +justin0 +081991 +cubs123 +051991 +tasha01 +peter23 +1johncena +5254 +1327 +vtkmybrjdf +j54321 +masini +5566778899 +shorty77 +270378 +barcelona5 +iloveaj +amanda95 +220574 +monkeypoo +gaurav123 +claudie +brasilien +kingmaker +marina88 +islander1 +duckduck1 +0159753 +185185 +daniel1994 +vitoria1 +appels +denise15 +helmet1 +123wert +potential +iloveyouu1 +zgmfx20a +18191819 +nanda123 +danny20 +ilovebeer1 +coffee7 +patriots +16071978 +124680 +depressed +melanie11 +1froggy +manita +123asdqwe +chicken15 +foobar1 +casey21 +jamal2 +kaylas +luvu4eva +inuyasha6 +aseret +20061977 +311208 +sammyjo1 +02051996 +scoala +223300 +jkz +190295 +antibes +021990 +antifa +katrinka +solana +15071977 +16011978 +catdog13 +flipmode1 +abacabb +401101 +penny5 +littled +archie01 +noodle12 +cinta123 +smokey101 +08031977 +dominic5 +kayla03 +08031996 +kylekyle +123456** +nick88 +kill11 +101207 +23061996 +bashful1 +200276 +topless +bulldog21 +kisskiss12 +please3 +materia +allison4 +enamorada1 +chrisc +hotlove +432 +howareyou123 +schecter1 +ford2001 +0813 +26011979 +oskarek +neopets13 +milan22 +ensemble +eugene12 +tuncay +akucinta +sureshot +sucram +noobie +mylove6 +cl +crippin1 +nokia3650 +motocros +111105 +sancarlos +lalala13 +lovers8 +19851122 +041980 +120900 +motown1 +nick33 +warhawk +wayne21 +15071996 +bitch2008 +wtf +drpepper3 +popop +gumbo1 +watergate +cicciona +janice123 +cashmere1 +buttercup! +110176 +120807 +100276 +sevillafc +charger2 +disco123 +ryan12345 +bonghit +ramsay +primo +chico3 +8383 +bubluk +endeavour +richard08 +1bradley +don12345 +june88 +miriam +schaap +123321e +gd4life +30071994 +black27 +lilmoney1 +myparents +258012 +lxgiwyl +lovers10 +161096 +3dognight +scott10 +laur3n +sexyangel +ilusha +franz1 +guwahati +project8 +blake10 +qwedcxz +dixie3 +15081508 +pimp92 +bol +kaylan +makaroni +johncena01 +wassila +harshini +kool101 +181981 +edgard +nada123 +kathrina +robvandam +rantanplan +nn +valmont +izumrud +hola10 +luke22 +lucy14 +dogfight +eddie69 +110300 +noah2007 +22041976 +blue4ever +11235 +britt5 +gofuckyour +hulkster1 +1725 +affinity +barnaul +nastygirl +maslova +armyof2 +11111976 +25111979 +14301430 +florencio +missy8 +22051977 +azerty59 +kiesha1 +takamine1 +jaffa1 +chaka +seller +1retard +chelsea05 +armando2 +i5stwf1rcx +yamaha135 +joeyboy +05041979 +22041979 +makana +robert00 +060896 +dm1234 +06081977 +140603 +250596 +orthodox +isabella13 +spiegel +mika12 +123456jb +lilly09 +230576 +197505 +chance5 +95279527 +sie +londyn +aa456852 +09021977 +darth +joanne +viking11 +cougar12 +bhabyko +pleasant1 +appleseed1 +180995 +5200 +meiling +johnny77 +lilypad1 +bouvier +hadouken +13041996 +sonyericss +alan13 +warcraft1 +piknik +berkley1 +brother4 +hotbitch +sansiro +060908 +bebe17 +marissa5 +skyliner +chander +designs +1light +fatass69 +28051978 +16111979 +hellokitty +04061978 +reena +annie13 +eric24 +asda123 +cognita +aurora +marvelous1 +fiorello +199527 +bubba! +zoegirl +cindys +czarna +p2xcfgjcvr +meonly1 +5455 +1bighead +090480 +060279 +nastygirl1 +javier15 +170177 +ranger23 +fisher12 +0111 +georgia11 +santas +narusegawa +banana77 +garcia +fluffy +freaky123 +pepsie +bigwill1 +amorino +katherine0 +19871111 +lixiang +260876 +201274 +mario8 +25032503 +turtle9 +йфяцычувс +azbest777 +madonna2 +220011 +vivera +wolverine3 +shabbir +cassie15 +andrey1995 +madura +vorobei +t090571 +95chevy +marylin +braves95 +michael50 +chatter1 +eagles25 +luzmaria +sensei1 +bizzle +collin12 +pepsi10 +gasparin +ultimatum +magdeburg +kopilka +lovers4eve +hottie27 +laura1234 +board +sunflower +rally +5577 +301987 +811029 +10111976 +m2g7u6o397 +anima +pendeja +25002500 +frosty123 +700040 +lolitas +20012005 +jerkface1 +benji2 +1192296 +texas14 +lovesick1 +clemente21 +kismat +7344555 +36987 +1q2w3easd +kopernik +28061977 +21031997 +120372 +jojo18 +savage3 +blondie11 +yannou +haley6 +vfvfxrf +snickers22 +william0 +morenito +tranquil +lovebug101 +happyfamily +heriberto +taco11 +pastorius +chase4 +waynes +hggih +qweewq123 +trans1 +pearl2 +dreday1 +panget +050994 +milkdud1 +faithingod +dude33 +rafael13 +bunnyrabbit +sasuke1234 +lucky02 +kenny10 +181175 +1212qq +charlieb +cookies6 +robert87 +munchy1 +tanner4 +threesome3 +shepard1 +821224 +micheal3 +future123 +22011996 +windows2000 +3830182 +tristan01 +964123 +chrisp +0825 +445566a +witchy +thickness +020181 +polk +sexyback12 +ihateyou9 +nate01 +vivayo +alex1972 +mimi88 +jenny +01071975 +235 +akoako +zztop +courtney22 +01011959 +punk14 +loser17 +applejack1 +18111976 +spencer13 +841015 +meeko +becca2 +rockhopper +skyliner33 +amanda86 +071198 +iloveyou97 +bullshit7 +homie12 +djeter +chick2 +gupta +cowboy88 +22041977 +mxyzptlk +arsch123 +dsadsadsa +11111p +chinaman1 +sparky101 +holly22 +panthers13 +michael84 +arcticcat +mcbride +poopdick +200375 +170876 +richman1 +acuario1 +jayann +30091978 +nguyen4 +cowboys +ttt111 +milan7 +bigbutts +loveday +tinkerbell +utythfk +15011977 +kieran123 +bike4life +3690 +lisa14 +nicolina +duke07 +199308 +internet01 +851210 +usher2 +burnley1 +170376 +akmaral +811023 +charing +nene23 +jesus03 +252526 +parker22 +nirankar +saving +hawaii3 +dhanya +evolution2 +maksimov +a741852 +verdun +uiuiui +000321 +miley16 +shrek123 +motivated +felisa +bulgakov +muthafucka +christina4 +160277 +fireman12 +bigdaddy11 +kristyn +pokemon90 +mossberg +03081979 +panther6 +foshizzle +momma12 +leonardo10 +shay16 +131313q +rfhlbyfk +koller +061196 +merlin7 +boss74 +louisvuitton +james94 +honey05 +fierce1 +240777 +qwert67 +199205 +anisoara +misiek123 +modernwarfare +20022007 +poodie1 +18021979 +shock +0blivion +trtrtr +alex123 +diana23 +capricorn7 +lili1234 +newsletter +business123 +puff +lilcutie1 +071421 +541788 +luna10 +070605 +060906 +angel2003 +cool20 +australia0 +beatbox1 +lover#1 +ricky23 +sexymama11 +shoelace1 +nininini +13081996 +artem1998 +control2 +snickers01 +kyuubi +logical1 +iforgot! +father +chrissy +200676 +rosegarden +heather15 +horseshoe1 +willyou +andi123 +zavala +cegthvty +diva16 +yeager +pantera3 +080874 +adidas777 +19851127 +hondacr +070701 +victor16 +210875 +ab12345678 +amazonia +fuckyou26 +nena23 +123aye +301070 +1lesbian +calhoun1 +851023 +biggdogg +marley09 +bitch +haze420 +kulkarni +7000 +millsberry +3l3m3nt +leyton +paintball8 +bassoon1 +smiley10 +looser123 +sergei ++ +aka +kaila +czarny +kiss01 +angeldog +chicago4 +8657 +22011997 +04111993 +tomtom11 +hairball1 +samsung14 +ocean13 +monique01 +kenyatta1 +goddamn1 +culture1 +flowers8 +020302 +amaya +463395727 +piotrus +april1988 +letmein99 +bandit07 +woaimama +170277 +jkl456 +mickey33 +petey123 +monomono +volcom9 +121170 +19851224 +070979 +denver07 +22051997 +soccer11 +omgomg123 +88chevy +gothika +fifafifa +dupeczka +831018 +cowgirls +bellisima +milonga +pritam +rocky! +070775 +jhon +14061976 +20031977 +sasha98 +north123 +naima +passer1 +buddy12345 +1pebbles +laura17 +300894 +fraud +naruhina +blacky2 +firestone1 +750750 +perumal +100772 +richelle1 +040677 +purple76 +patata1 +pappas +gfhjk123 +leafs1 +casey22 +01091996 +hafida +lily07 +britneys +cupcake69 +14theroad +queen14 +regenboog +102030q +21111977 +james007 +12401240 +julian09 +overflow +bitch2010 +track2 +hihihihi1 +purple90 +arriba +tiddles1 +fhutynbyf +bernie01 +shadow420 +14051996 +khadija1 +shakey1 +imortal +ctht:f +11031997 +julian15 +200206 +bonethug1 +maddog11 +20011975 +bear16 +gundam123 +sarrah +ski123 +bootylicious +19861002 +210775 +aviator1 +marquette1 +miller10 +cyberman +may1980 +0.123456 +froglegs1 +143256 +thomas0 +shane7 +121314z +shravani +040475 +15051976 +bubblegum5 +lawless1 +family#1 +delmar1 +kozlik +thomas30 +giggity1 +sweetie22 +wildcats! +121009 +june1999 +197805 +bellsouth +taylor27 +781021 +20022006 +0908070605 +wilkinson1 +686686 +fatfuck1 +cubs23 +green123 +falcon10 +1bigred +160476 +pointers +vendredi13 +green42 +eagles +snoopy09 +q3538004 +imgay12 +aluminum +pepsi24 +draper +italia +jesus4me +madison. +viernes +80baby +1234rr +pigman +4always +yyyyyy1 +qwewq +money1 +infante +forget12 +bulldog8 +google8 +sabrina22 +nonnie1 +zolushka +spy123 +rjn`yjr +killer12345 +recruiter1 +27041979 +freddy7 +heidi2 +suckit5 +harekrsna +qazwsxedc2 +pa +170679 +jjjjjjjjj +johnny07 +barcelona3 +dragon81 +sword123 +201003 +30121979 +ivancito +afshan +dugong +melodia +tadashi +emanon +onelove13 +loco10 +cappy1 +madalyn +jackie16 +abrikos +isolde +romaine +east12 +blonde! +109 +edmond1 +hottie20 +dexter22 +25121976 +energizer1 +190894 +poppop12 +quake1 +ric123 +culiacan1 +cascada1 +aa3030316 +19851028 +841027 +23071978 +21342134 +space01 +christian12 +16101976 +lilsaint +spider21 +cracker12 +taufik +lucky100 +jumpin +#1diva +tigger28 +detroit3 +barbie1234 +q1q1q1q1q1 +london9 +wipro +moomoo7 +chinchin1 +escondido +joey07 +elettra +15071979 +p0rnstar +21011996 +sealteam6 +banned +161275 +03071996 +tinker +brasil12 +gohard +2215 +zsolti +goldcoast +mrbear +anna89 +197806 +12345sex +0000oooo +justice11 +xfactor1 +trevor10 +fitch1 +1234567890f +1theman +lady08 +1lilwayne +gemini18 +5609867 +trinity8 +milan4ever +mccormick +sassy1234 +29081979 +football46 +bodie1 +120609 +eritrea +power12345 +trindade +king34 +211995 +qwedcxza +aldwin +a7xrocks +cossie +hickey +siegheil88 +king420 +apples +mateusz12 +vova1998 +qwerty31 +fulvio +199622 +24262426 +qwerty06 +123695 +happy2bme +lizard2 +thumper3 +suntan +07041978 +080395 +260296 +yourmom22 +brucewayne +tyler2006 +lexy123 +megan6 +adidas01 +13021997 +stang +sonny12 +198283 +jai123 +rebel10 +101171 +bigtits2 +cookies01 +anadolu +rose19 +monster77 +newyork. +hemi +barbie07 +poppoppop +190178 +philip12 +dc +famous! +q1w2e3 +06011980 +2n76xg2yiu +kenmore +199427 +papermate1 +choosen1 +071077 +freeland +100674 +shaniya1 +haller +komarov +equinox1 +sophie15 +diego01 +raiders6 +jeremy24 +canada13 +will11 +patches11 +080184 +saibot +lilmama7 +123401 +12steps +21091977 +mangusta +noranora +sanguine +*star* +andre01 +playas1 +devilish1 +dexter5 +badger123 +chipster +120572 +sara21 +pirate123 +2ofakind +a88888 +hassen +chico01 +flyer +skidrow1 +150796 +31031979 +001996 +carlino +13171317 +ficker +180575 +popcorn. +giresun28 +succeed +darkangel6 +kappa1911 +1.2.3. +davidbeckham +28071977 +murder666 +mafiawars +maria05 +cutes +madhura +toot +john44 +nounette +w3lc0m3 +the +18101996 +timurka +sixteen1 +21011974 +sugarlips1 +truelove13 +echoecho +55555lvl +kamron +sachiko +dragons5 +25071979 +04041997 +yellow02 +g00gl3 +050309 +agrawal +ewunia +dipali +capcom1 +jayar +9595 +122800 +pitagoras +peddler +orellana +icarly1 +hehehe123 +adeoye +020906 +aa1234567 +12345678qwertyui +061077 +tyler25 +080781 +ahmed12 +granny3 +meanie1 +buthole1 +lalito1 +nfyz123 +sadie! +dima2002 +pantera6 +perseus +lynwood1 +marysia1 +yankee11 +aaaa +14051997 +musick +190377 +02061996 +mom4life +fargo1 +sixela +noshit +270996 +elvis13 +fucker +chatnoir +cupcake24 +dragons13 +s123321 +1ninja +zniqpnk733 +detroit12 +durant35 +steelhead1 +wilhelmina +pies +26041979 +muffin6 +gfhjkmm +lovelove7 +grandmom ++ +rawrrawr +twisted2 +element14 +float +734001 +myspace98 +didou +1187 +juanmiguel +ilovericky +angeleyes2 +boomboom2 +30081981 +september13 +minnie22 +guardians +yfdctulf +minh123 +papaye +22312231 +7770777 +monkfish +shailendra +alex1973 +tyrone3 +kociak +glo +manboy +olga1234 +grinding +millard +black92 +asd159 +google69 +12play +29031979 +03121976 +29111979 +grady +mayita +amanda0 +voodoo13 +31081977 +alexandre +yamaha6 +kodabear +expensive +121345 +silverado2 +cena11 +joseph89 +del123 +19841120 +maloney +may1982 +241074 +piggy5 +5million +priyam +15031975 +snoppy1 +sideways +urbano +dominion1 +apple44 +24081995 +dante12 +johnnyb +redred2 +chappy1 +buster01 +20111977 +150376 +ayomide1 +verdade +joaopaulo +07061978 +202002 +asd777 +cowboy24 +memyselfi +trevor3 +801124 +1lollipop +nudist +shay15 +apple18 +iloveyou4ever +say +dog123456 +jacksonville +diogo123 +imran1 +19861211 +nikita1999 +13051976 +08121979 +top100 +cutie19 +werule1 +shadowman1 +zxcasd1 +gatsby1 +buenos +26061997 +666beast +3698 +bitches13 +290496 +taylor56 +charles6 +solveig +102102102 +glass123 +141076 +music45 +green89 +07101995 +dave23 +239239 +dadang +heyjude1 +trinity05 +jose27 +11223344556677889900 +sunnepa1 +impulse101 +princess56 +anton1995 +kings2 +batgirl1 +master777 +munna +chloe23 +ricky10 +1907fener +lilman07 +851120 +koston +pluisje +520999 +katie06 +jerbear +mybabyboy +emma02 +donavan1 +tamagotchi +14041997 +polki +200776 +20102000 +tatung +kata +fylhttdyf +borabora1 +adidas88 +piesek1 +broucek +nodnarb1 +bobo13 +selena11 +123456qa +opossum +260378 +ceilidh +peniss +1417 +royalflush +carol2 +awesome22 +110898 +19851213 +dumbbitch +chamois +03071977 +cuttiepie1 +valdes +201203 +kaylee08 +froggy22 +c9p5au8naa +tonkpils +amilcar +kayla101 +redrover1 +buddyholly +starsky1 +920920 +simbacat +asdfqwer1 +200796 +mafia13 +punkrock! +1234mm +100199 +210774 +2bigballs +maxime +warranty +cowboy09 +shanika +waffles2 +3663 +maria2010 +galaxia +kangaroo2 +laura +zzr1100 +060895 +28071979 +honey28 +cbcmrf +abc777 +manu11 +751002 +ferien +jamestown +spanky7 +morenaza +kittyy +400098 +linda69 +nomorerack +go4itnow +roses2 +pakistani1 +2q87xi3wgw +destiny02 +ford351 +bassboat +05021979 +intuition +samuel1234 +toybox +197828 +roxy18 +floyd123 +saxena +jesse16 +123698547 +vball2 +freight +kehinde1 +kennwort +belka +dfg +purple97 +falcon3 +babe10 +1truluv +samadhi +dolly12 +2dollars +kakka +951753654 +mz.sexy +corner1 +77779999 +speed12 +vishwa +1mnbvcxz +zxcxz +08091977 +050305 +novice +nisse +moustic +110598 +tyson11 +266266 +babyoneone +trinacria +261296 +encule +harley17 +hunting101 +volcom14 +plumes +15021976 +31031977 +eatadick +1dance +matt20 +1w2e3r4t +blue420 +applebees1 +guyssuck1 +hannah01 +chris1988 +sammy123 +freak11 +199624 +albert3 +klk123 +samosa +26011996 +gougou +sweet77 +wildcat7 +tumelo +amanda93 +fghfghfgh +ardian +htt//members.cumfiesta.com/ +gaffer +samuel02 +nana18 +nx74205 +301275 +elway07 +liljj1 +stevenson1 +147890 +kokito +28051996 +1sunday +flex ++ +poiuyt5 +sniper69 +gracie03 +250574 +wilson21 +asd123zxc +hiphop. +hearts13 +manjit +butta1 +sorellina +drm199019902323 +daisuke1 +actionman +002211 +buddy02 +adalberto +wolves11 +dur +junior77 +nicole1 +latina2 +giggles12 +qwerty30 +280777 +bryant08 +kasablanka +nokian90 +lesnik +cokacola +bowwow7 +hospice +ilovebill +250376 +feb +watts1 +05101995 +110911 +07121994 +2455 +kelly101 +jaleel +wrexham +watchdog +britni +intense1 +725725 +markis +100376 +songs1 +100866 +06071978 +shradha +2040 +terezinha +0714 +desmond123 +28041977 +247001 +821121 +821218 +teamo! +19081995 +tiffany17 +1zyybyt82a +25041997 +1little +ginogino +bulldogs5 +elnegro1 +pfuflrf +pes2009 +jayjay14 +antares1 +123456jc +maggie55 +rayhan +cornhole +insight1 +playmaker +beyond1 +makayla5 +040596 +smokey88 +pimpin0 +success! +shaka +mollie2 +squadup1 +21111979 +alinuta +18061978 +buster18 +painislove +soboleva +fresh22 +saloma +fyzfyz +zxasqw1 +green06 +16111995 +bellavita +onyebuchi +rocky77 +pipe +hellsing +oliver00 +061206 +141175 +lawrence2 +alabama1 +ask +desiderata +250807 +popcorn101 +lovebug5 +300995 +050898 +jonas7 +09091088 +condition +lucky888 +george09 +stop12 +refresh1 +megabyte +roper1 +micheal7 +scorpion13 +151174 +keksik +01021973 +julian06 +standup +o8lhe2z7bo +ycei62p395 +psytrance +taco1234 +king66 +grace06 +sparky23 +starla1 +fifnfy +super88 +27101977 +vwpassat +++ +aol +gizzy +hotgurl +angelle +18111978 +latinoheat +donald356 +andriana +cadeau +07111993 +gjkzrjdf +sh0pping +mother8 +yankee3 +sangam +un4given +tanya12 +220907 +spartan7 +251206 +azertyuio +newgirl +dani22 +alcool +benjamin22 +jackryan +jones +1abcdefgh +300496 +skikda +hermitage +freddy3 +heaven09 +05031996 +skyler123 +nichole7 +badfish +johnson11 +godgrace +matter1 +dessie +brenda7 +lucas5 +bear24 +lofasz +brian18 +keanu1 +badoo2012 +chinacat +kkkkkk6 +mcafee +rafael2 +040778 +shyamala +unleashed1 +951753123 +usasf1234 +081094 +15111995 +aisha123 +slk230 +11vote +angela4 +gfdkjd +addie +flores12 +nevaeh06 +101268 +emma1 +cash23 +270776 +sophie6 +251106 +20121975 +sexyguy1 +lilman08 +noah08 +ilmiocane +lilliana +jk +dustin23 +carolina15 +adeade +joker17 +13281328 +kupukupu +irish3 +qwert! +dodgers3 +puddy1 +fafnir +lazareva +anthony1 +charlie01 +21051976 +1212aa +james93 +estetica +cacahuate +/.,mnb +papa10 +sexygurl2 +japierdole +newyork69 +199203 +oldfart1 +donnas +bribri12 +100273 +ilovesam! +fidelidade +decade +chaparro1 +231097 +luisluis +mini1234 +samantha06 +alain1 +haley13 +dogbreath1 +17021979 +azsxdc12 +07071976 +dragons11 +140976 +leonard +maxine123 +timmy5 +chase22 +joselo +calore +salvador2 +little4 +verizon123 +201070 +5152535455 +britbrat1 +sarath +nick2000 +millhouse +jackie17 +sadie10 +penguin9 +17061978 +kissmebaby +01061996 +101169 +ra1234 +1234kids +12061976 +1estrella +bobik +1sassy +200476 +bandito1 +diller +chesca +tedesco +31081978 +outubro +eight88 +91camaro +eagles99 +pizza21 +199207 +18101978 +homie2 +25061996 +choupinou +170877 +hawk12 +griselda1 +1grandpa +arabella1 +hacker2 +mari11 +hasina +tuning1 +jaimatadi1 +vbvjpf +shokoladka +789741 +robert04 +tiamotanto +psppsp +010475 +aiaiai +milamber +120173 +mugwump +zxcqwe123 +courtney16 +sn0wman +03081978 +080875 +mister12 +jasmina1 +z7777777 +emma2010 +w1950a +wonderboy1 +210196 +brutus2 +punkers +piapia +199404 +811026 +licker1 +123bnm +agung +chicana +miami11 +resist +150907 +dustin7 +19961997 +campinas +mikaella +jamesk +z1z1z1z1 +thrash1 +210675 +142753869 +niklas1 +251273 +vegas2 +021076 +000000b +azazello +ilovezach +14041976 +smoove1 +lampada +bigdog +basket13 +thermo +angie21 +harley15 +ak +16031977 +eastside4 +kiki89 +necronomicon +mommy27 +h36js3ggof +03121995 +07041979 +liar +thelast1 +030794 +suger1 +crazzy1 +199327 +virginia12 +102498 +starfleet +040181 +01021975 +oddjob +310176 +kennedy12 +legend01 +naledi +qazwsxedc12345 +gordo2 +dannyb +rc. +198113 +suicidal1 +rainbow16 +iloveyew +chinky1 +10041974 +pappagallo +qwerty121 +07011994 +19871016 +01011900 +deedee13 +doozer +230475 +yourspace1 +devin23 +tiffany. +150596 +levski1914 +cowboy +waiting1 +dolina +mcgrath +alfred +popcorn1 +niki12 +manchitas +corazoncito +841018 +talitha +hirondelle +18091978 +hutch +chaddy +3syqo15hil +soinlove +kingjames23 +hottie4u +bunky1 +tennis14 +maplewood +nevets1 +rushrush +love444 +smile08 +daniela10 +qwerty97 +creek1 +ferda +father12345 +29061979 +030194 +saturnus +fishing11 +hari123 +95123 +joejonas! +1231235 +smokey16 +emokid123 +fffjjj +alex1234 +13071977 +imback1 +maggie25 +lululu1 +compound +candy55 +consumer +001212 +601601 +dinosaurus +ratten +tarasenko +blue74 +cool98 +754321 +y6p67ftrqj +vfkzdrf +brittni +12031976 +kush +rosa11 +star03 +banana33 +shawn69 +dustin14 +salento12 +killerbee1 +03111976 +sweet33 +samson10 +ctcnhtyrf +230597 +19861106 +woodduck +13081977 +maltese1 +jiujitsu1 +08071994 +l0vel0ve +ilove143 +donna2 +prdel +100472 +willpower +ilovekate +19821023 +sasha1989 +handoi +caprisun1 +sexy40 +naty123 +199407 +27021979 +cherry88 +197802 +130808 +harley97 +alania +march2007 +pirate2 +30071979 +rochdale +january +21071977 +timmy9 +bethany12 +whodat1 +pizarro +anita2 +dedicated +roma1996 +021277 +corsica1 +april1992 +slipknot21 +25061979 +jessica33 +qwaser +fupyuxtb66 +1w2q3r4e +ishika +winwinwin +miyamoto +20051975 +cornelis +london2011 +annoying1 +retamozo +blazer01 +canes +lizzie01 +nagrom +fucklove4 +robert45 +garant +amanda33 +blue62 +rainbow08 +jimjones +lafleur +taylor26 +666666t +youknowit +eric17 +120604 +super99 +animal3 +campeones +stockholm1 +harbor1 +sergio11 +moments +apurva +061990 +exitos +amoreco +coke45 +gaygaygay +08061979 +sapato +050209 +penis22 +zacky1 +lucy101 +bluebird2 +stokrotka1 +truelove08 +gogetta +987654321w +poochie2 +trinity +bomberos +111298 +katelyn12 +molly24 +coco77 +102201 +camomilla +18001800 +14031977 +butthole2 +337733 +purple67 +kfkfkf +7419635 +lf +ayanda +c0raplok +193193 +0424 +123456ms +luthien +lovedad +andy16 +kiki101 +jerry5 +123456ass +docker +svitlana +paramon +mounika +lifehouse1 +mexico2009 +johnny9 +25041978 +donttouch +20021967 +rosy +shelby99 +190876 +22772277 +madhouse1 +shelter1 +sasha2002 +monmouth +15011978 +star7827 +ancora +22101976 +xxx555 +dunno1 +skittles69 +gibson01 +lo +030777 +baghera +savannah07 +19031997 +jaymark +katherine7 +090477 +chanel +06101978 +uuuuuuu +budlight3 +hampshire +gator2 +fuckoff09 +adrian1234 +qwe123321 +pookie08 +inl0ve +iluvhim! +manina +bigwill +020183 +161995 +110498 +rednose +fuckit11 +1337ness +420blaze +lytdybr +198655 +mimimi1 +codyboy1 +1365 +star02 +melissa25 +groceries +2315 +chicco1 +jessie. +248624 +besitos +marco +22061976 +123fake +christen1 +hareram +tooter1 +151976 +pablo10 +280875 +angela08 +michael34 +koenig +jason30 +hastalavista +1christoph +rooster +nonna +kalpesh +timmy11 +ilovemyboo +sambuca1 +lovebug4 +braves25 +700027 +chicago01 +jansport1 +barney! +pannekoek +kidskids +deathtoall +lovely20 +lunar +pass23 +120571 +elaine01 +terra123 +nursing08 +gordon12 +hott123 +261978 +gthdsq +misspriss +yabloko +23061976 +20252025 +glacier1 +vilma +261992 +timmy69 +alsace +ivan10 +mommy143 +92camaro +1wildcat +kaitlyn7 +12011976 +berlin12 +chupala +2341 +deputy1 +198566 +1freeman +29051978 +hangman1 +19821012 +thepower +wheeling +03041977 +197904 +04041975 +deardear +east123 +fritzie +7fperlangel +thegreat12 +hijack +yvonne12 +lacroix +panda21 +bradley11 +theforce1 +16041976 +arsenal22 +oksana1 +denise18 +mike30 +1234jk +over +shelby06 +scrap +viper13 +pass420 +almaz +valerie12 +21071979 +crawfish1 +316 +zazaza1 +130375 +1carter +manmohan +holly23 +147852369q +altamira +greengirl +brontolo +potato12 +baller03 +yuriko +keke09 +vans +hockey97 +dana11 +music666 +pookie +superman78 +091178 +1131 +rolyat +billy07 +19841225 +nokia95 +lauraa +xzibit1 +chevy55 +pavankumar +24121976 +tyler2008 +dima1984 +pitbull23 +bulldogs! +sydney00 +sapfir +41234123 +alexis96 +karen22 +1nurse +nickle +jerrod +lolo00 +caroli +thomas94 +boston04 +telkom +gefccgag +noxious +secret24 +chevere +emmanuel7 +adidas14 +120869 +ilovehim23 +cherrytree +camaro99 +volcom21 +panda6 +indiana +181296 +myspace75 +zanessa1 +asdfqwer1234 +scania1 +october02 +keely1 +blackpanther +27011979 +lonsdale1 +fishy12 +dmwdmw +mariz +sun1shine +folks6 +optiplex1 +maksim1 +jeans +april420 +pierre +redneck11 +honeygirl1 +netscape1 +trudy +060178 +shadow007 +diesel11 +071094 +scotty01 +puppies7 +fergie12 +my3loves +bradley5 +anubhav +nopasswo +password@123 +freefall1 +winston01 +ilovepat +p00per +12345me +shadow777 +ferrary +blue43 +meneses +08081998 +beb +myfriend1 +czesio +ker +sabrina9 +789987789 +10081977 +glorious1 +tigers. +fefe +0000123 +parker08 +contour +1wetpussy +kevin123 +18011979 +finite +kubus +optical1 +dino11 +ber217an +123one +calimero1 +lauren00 +choctaw +tina10 +mickey. +keke10 +richard15 +7700 +ganja123 +180277 +crossroad \ No newline at end of file diff --git a/crates/core/database/assets/revolt_source_list.txt b/crates/core/database/assets/revolt_source_list.txt new file mode 100644 index 000000000..9b715d24a --- /dev/null +++ b/crates/core/database/assets/revolt_source_list.txt @@ -0,0 +1,555 @@ +this is an assorted list of known disposable email providers + +#region nobody will ever have an email @example.com so we can safely block it +---- +example.com + +#region list provided by michenriksen at https://gist.github.com/michenriksen/8710649 +---- +0815.ru +0wnd.net +0wnd.org +10minutemail.co.za +10minutemail.com +123-m.com +1fsdfdsfsdf.tk +1pad.de +20minutemail.com +21cn.com +2fdgdfgdfgdf.tk +2prong.com +30minutemail.com +33mail.com +3trtretgfrfe.tk +4gfdsgfdgfd.tk +4warding.com +5ghgfhfghfgh.tk +6hjgjhgkilkj.tk +6paq.com +7tags.com +9ox.net +a-bc.net +agedmail.com +ama-trade.de +amilegit.com +amiri.net +amiriindustries.com +anonmails.de +anonymbox.com +antichef.com +antichef.net +antireg.ru +antispam.de +antispammail.de +armyspy.com +artman-conception.com +azmeil.tk +baxomale.ht.cx +beefmilk.com +bigstring.com +binkmail.com +bio-muesli.net +bobmail.info +bodhi.lawlita.com +bofthew.com +bootybay.de +boun.cr +bouncr.com +breakthru.com +brefmail.com +bsnow.net +bspamfree.org +bugmenot.com +bund.us +burstmail.info +buymoreplays.com +byom.de +c2.hu +casualdx.com +cek.pm +centermail.com +centermail.net +chammy.info +childsavetrust.org +chogmail.com +choicemail1.com +clixser.com +cmail.net +cmail.org +coldemail.info +cool.fr.nf +courriel.fr.nf +courrieltemporaire.com +crapmail.org +cust.in +cuvox.de +d3p.dk +dacoolest.com +dandikmail.com +dayrep.com +dcemail.com +deadaddress.com +deadspam.com +delikkt.de +despam.it +despammed.com +devnullmail.com +dfgh.net +digitalsanctuary.com +dingbone.com +disposableaddress.com +disposableemailaddresses.com +disposableinbox.com +dispose.it +dispostable.com +dodgeit.com +dodgit.com +donemail.ru +dontreg.com +dontsendmespam.de +drdrb.net +dump-email.info +dumpandjunk.com +dumpyemail.com +e-mail.com +e-mail.org +e4ward.com +easytrashmail.com +einmalmail.de +einrot.com +eintagsmail.de +emailgo.de +emailias.com +emaillime.com +emailsensei.com +emailtemporanea.com +emailtemporanea.net +emailtemporar.ro +emailtemporario.com.br +emailthe.net +emailtmp.com +emailwarden.com +emailx.at.hm +emailxfer.com +emeil.in +emeil.ir +emz.net +ero-tube.org +evopo.com +explodemail.com +eyepaste.com +fakeinbox.com +fakeinformation.com +fansworldwide.de +fantasymail.de +fightallspam.com +filzmail.com +fivemail.de +fleckens.hu +frapmail.com +friendlymail.co.uk +fuckingduh.com +fudgerub.com +fyii.de +garliclife.com +gehensiemirnichtaufdensack.de +get2mail.fr +getairmail.com +getmails.eu +getonemail.com +giantmail.de +girlsundertheinfluence.com +gishpuppy.com +gmial.com +goemailgo.com +gotmail.net +gotmail.org +gotti.otherinbox.com +great-host.in +greensloth.com +grr.la +gsrv.co.uk +guerillamail.biz +guerillamail.com +guerrillamail.biz +guerrillamail.com +guerrillamail.de +guerrillamail.info +guerrillamail.net +guerrillamail.org +guerrillamailblock.com +gustr.com +harakirimail.com +hat-geld.de +hatespam.org +herp.in +hidemail.de +hidzz.com +hmamail.com +hopemail.biz +ieh-mail.de +ikbenspamvrij.nl +imails.info +inbax.tk +inbox.si +inboxalias.com +inboxclean.com +inboxclean.org +instant-mail.de +ip6.li +irish2me.com +iwi.net +jetable.com +jetable.fr.nf +jetable.net +jetable.org +jnxjn.com +jourrapide.com +jsrsolutions.com +kasmail.com +kaspop.com +killmail.com +killmail.net +klassmaster.com +klzlk.com +koszmail.pl +kurzepost.de +lawlita.com +letthemeatspam.com +lhsdv.com +lifebyfood.com +link2mail.net +litedrop.com +lol.ovpn.to +lolfreak.net +lookugly.com +lortemail.dk +lr78.com +lroid.com +lukop.dk +m21.cc +mail-filter.com +mail-temporaire.fr +mail.mezimages.net +mail1a.de +mail21.cc +mail2rss.org +mail333.com +mailbidon.com +mailbiz.biz +mailblocks.com +mailbucket.org +mailcat.biz +mailcatch.com +mailde.de +mailde.info +maildrop.cc +maileimer.de +mailexpire.com +mailfa.tk +mailforspam.com +mailfreeonline.com +mailguard.me +mailin8r.com +mailinater.com +mailinator.com +mailinator.net +mailinator.org +mailinator2.com +mailincubator.com +mailismagic.com +mailme.lv +mailme24.com +mailmetrash.com +mailmoat.com +mailms.com +mailnesia.com +mailnull.com +mailorg.org +mailpick.biz +mailrock.biz +mailscrap.com +mailshell.com +mailsiphon.com +mailtemp.info +mailtome.de +mailtothis.com +mailtrash.net +mailtv.net +mailtv.tv +mailzilla.com +makemetheking.com +manybrain.com +mbx.cc +mega.zik.dj +meinspamschutz.de +meltmail.com +messagebeamer.de +mezimages.net +ministry-of-silly-walks.de +mintemail.com +misterpinball.de +moncourrier.fr.nf +monemail.fr.nf +monmail.fr.nf +monumentmail.com +mt2009.com +mt2014.com +mycleaninbox.net +mymail-in.net +mypacks.net +mypartyclip.de +myphantomemail.com +mysamp.de +mytempemail.com +mytempmail.com +mytrashmail.com +nabuma.com +neomailbox.com +nepwk.com +nervmich.net +nervtmich.net +netmails.com +netmails.net +neverbox.com +nice-4u.com +nincsmail.hu +nnh.com +no-spam.ws +noblepioneer.com +nomail.pw +nomail.xl.cx +nomail2me.com +nomorespamemails.com +nospam.ze.tc +nospam4.us +nospamfor.us +nospammail.net +notmailinator.com +nowhere.org +nowmymail.com +nurfuerspam.de +nus.edu.sg +objectmail.com +obobbo.com +odnorazovoe.ru +oneoffemail.com +onewaymail.com +onlatedotcom.info +online.ms +ordinaryamerican.net +otherinbox.com +ovpn.to +owlpic.com +pancakemail.com +pcusers.otherinbox.com +pjjkp.com +plexolan.de +poczta.onet.pl +politikerclub.de +poofy.org +pookmail.com +privacy.net +privatdemail.net +proxymail.eu +prtnx.com +putthisinyourspamdatabase.com +putthisinyourspamdatabase.com +quickinbox.com +rcpt.at +reallymymail.com +realtyalerts.ca +recode.me +recursor.net +reliable-mail.com +rhyta.com +rmqkr.net +royal.net +rtrtr.com +s0ny.net +safersignup.de +safetymail.info +safetypost.de +saynotospams.com +schafmail.de +schrott-email.de +secretemail.de +secure-mail.biz +senseless-entertainment.com +services391.com +sharklasers.com +shieldemail.com +shiftmail.com +shitmail.me +shitware.nl +shmeriously.com +shortmail.net +sinnlos-mail.de +slapsfromlastnight.com +slaskpost.se +smashmail.de +smellfear.com +snakemail.com +sneakemail.com +sneakmail.de +snkmail.com +sofimail.com +solvemail.info +sogetthis.com +soodonims.com +spam4.me +spamail.de +spamarrest.com +spambob.net +spambog.ru +spambox.us +spamcannon.com +spamcannon.net +spamcon.org +spamcorptastic.com +spamcowboy.com +spamcowboy.net +spamcowboy.org +spamday.com +spamex.com +spamfree.eu +spamfree24.com +spamfree24.de +spamfree24.org +spamgoes.in +spamgourmet.com +spamgourmet.net +spamgourmet.org +spamherelots.com +spamherelots.com +spamhereplease.com +spamhereplease.com +spamhole.com +spamify.com +spaml.de +spammotel.com +spamobox.com +spamslicer.com +spamspot.com +spamthis.co.uk +spamtroll.net +speed.1s.fr +spoofmail.de +stuffmail.de +super-auswahl.de +supergreatmail.com +supermailer.jp +superrito.com +superstachel.de +suremail.info +talkinator.com +teewars.org +teleworm.com +teleworm.us +temp-mail.org +temp-mail.ru +tempe-mail.com +tempemail.co.za +tempemail.com +tempemail.net +tempemail.net +tempinbox.co.uk +tempinbox.com +tempmail.eu +tempmaildemo.com +tempmailer.com +tempmailer.de +tempomail.fr +temporaryemail.net +temporaryforwarding.com +temporaryinbox.com +temporarymailaddress.com +tempthe.net +thankyou2010.com +thc.st +thelimestones.com +thisisnotmyrealemail.com +thismail.net +throwawayemailaddress.com +tilien.com +tittbit.in +tizi.com +tmailinator.com +toomail.biz +topranklist.de +tradermail.info +trash-mail.at +trash-mail.com +trash-mail.de +trash2009.com +trashdevil.com +trashemail.de +trashmail.at +trashmail.com +trashmail.de +trashmail.me +trashmail.net +trashmail.org +trashymail.com +trialmail.de +trillianpro.com +twinmail.de +tyldd.com +uggsrock.com +umail.net +uroid.com +us.af +venompen.com +veryrealemail.com +viditag.com +viralplays.com +vpn.st +vsimcard.com +vubby.com +wasteland.rfc822.org +webemail.me +weg-werf-email.de +wegwerf-emails.de +wegwerfadresse.de +wegwerfemail.com +wegwerfemail.de +wegwerfmail.de +wegwerfmail.info +wegwerfmail.net +wegwerfmail.org +wh4f.org +whyspam.me +willhackforfood.biz +willselfdestruct.com +winemaven.info +wronghead.com +www.e4ward.com +www.mailinator.com +wwwnew.eu +x.ip6.li +xagloo.com +xemaps.com +xents.com +xmaily.com +xoxy.net +yep.it +yogamaven.com +yopmail.com +yopmail.fr +yopmail.net +yourdomain.com +yuurok.com +z1p.biz +za.com +zehnminuten.de +zehnminutenmail.de +zippymail.info +zoemail.net +zomg.info + +#region public emails provided by mail.tm +---- +trythe.net +leadwizzer.com +metalunits.com +scpulse.com diff --git a/crates/core/database/fixtures/server_with_roles.json b/crates/core/database/fixtures/server_with_roles.json index 0a76489dd..21ea5656e 100644 --- a/crates/core/database/fixtures/server_with_roles.json +++ b/crates/core/database/fixtures/server_with_roles.json @@ -47,6 +47,7 @@ ], "roles": { "__ID:5__": { + "_id": "__ID:5__", "name": "Moderator", "permissions": { "a": 545270208, @@ -55,6 +56,7 @@ "rank": 1 }, "__ID:6__": { + "_id": "__ID:6__", "name": "Owner", "permissions": { "a": 0, diff --git a/crates/core/database/src/amqp/amqp.rs b/crates/core/database/src/amqp/amqp.rs index b567c7f7c..b0e5e1750 100644 --- a/crates/core/database/src/amqp/amqp.rs +++ b/crates/core/database/src/amqp/amqp.rs @@ -1,30 +1,79 @@ use std::collections::HashSet; +use std::sync::Arc; use crate::events::rabbit::*; use crate::User; -use amqprs::channel::BasicPublishArguments; -use amqprs::{channel::Channel, connection::Connection, error::Error as AMQPError}; -use amqprs::{BasicProperties, FieldTable}; +use lapin::{ + options::BasicPublishOptions, + protocol::basic::AMQPProperties, + types::{AMQPValue, FieldTable}, + Channel, Connection, ConnectionProperties, Error as AMQPError, +}; use revolt_models::v0::PushNotification; use revolt_presence::filter_online; +use revolt_result::Result; use serde_json::to_string; #[derive(Clone)] pub struct AMQP { + friend_request_accepted: Arc, + friend_request_received: Arc, + generic_message: Arc, + message_sent: Arc, + mass_mention_message_sent: Arc, + ack_notification_message: Arc, + dm_call_updated: Arc, + process_ack: Arc, #[allow(unused)] - connection: Connection, - channel: Channel, + connection: Arc, } impl AMQP { - pub fn new(connection: Connection, channel: Channel) -> AMQP { - AMQP { + pub async fn new(connection: Arc) -> Self { + Self { + friend_request_accepted: Self::create_channel(&connection).await, + friend_request_received: Self::create_channel(&connection).await, + generic_message: Self::create_channel(&connection).await, + message_sent: Self::create_channel(&connection).await, + mass_mention_message_sent: Self::create_channel(&connection).await, + ack_notification_message: Self::create_channel(&connection).await, + dm_call_updated: Self::create_channel(&connection).await, + process_ack: Self::create_channel(&connection).await, connection, - channel, } } + pub async fn new_auto() -> Self { + let config = revolt_config::config().await; + + let connection = Arc::new( + Connection::connect( + &format!( + "amqp://{}:{}@{}:{}", + &config.rabbit.username, + &config.rabbit.password, + &config.rabbit.host, + &config.rabbit.port, + ), + ConnectionProperties::default(), + ) + .await + .expect("Failed to connect to RabbitMQ"), + ); + + Self::new(connection).await + } + + async fn create_channel(connection: &Connection) -> Arc { + Arc::new( + connection + .create_channel() + .await + .expect("Failed to create channel"), + ) + } + pub async fn friend_request_accepted( &self, accepted_request_user: &User, @@ -42,19 +91,20 @@ impl AMQP { config.pushd.get_fr_accepted_routing_key(), payload ); - self.channel + + self.friend_request_accepted .basic_publish( - BasicProperties::default() - .with_content_type("application/json") - .with_persistence(true) - .finish(), - payload.into(), - BasicPublishArguments::new( - &config.pushd.exchange, - &config.pushd.get_fr_accepted_routing_key(), - ), + config.pushd.exchange.clone().into(), + config.pushd.get_fr_accepted_routing_key().into(), + BasicPublishOptions::default(), + payload.as_bytes(), + AMQPProperties::default() + .with_content_type("application/json".into()) + .with_delivery_mode(2), ) - .await + .await?; + + Ok(()) } pub async fn friend_request_received( @@ -75,19 +125,19 @@ impl AMQP { payload ); - self.channel + self.friend_request_received .basic_publish( - BasicProperties::default() - .with_content_type("application/json") - .with_persistence(true) - .finish(), - payload.into(), - BasicPublishArguments::new( - &config.pushd.exchange, - &config.pushd.get_fr_received_routing_key(), - ), + config.pushd.exchange.clone().into(), + config.pushd.get_fr_received_routing_key().into(), + BasicPublishOptions::default(), + payload.as_bytes(), + AMQPProperties::default() + .with_content_type("application/json".into()) + .with_delivery_mode(2), ) - .await + .await?; + + Ok(()) } pub async fn generic_message( @@ -112,19 +162,19 @@ impl AMQP { payload ); - self.channel + self.generic_message .basic_publish( - BasicProperties::default() - .with_content_type("application/json") - .with_persistence(true) - .finish(), - payload.into(), - BasicPublishArguments::new( - &config.pushd.exchange, - &config.pushd.get_generic_routing_key(), - ), + config.pushd.exchange.clone().into(), + config.pushd.get_generic_routing_key().into(), + BasicPublishOptions::default(), + payload.as_bytes(), + AMQPProperties::default() + .with_content_type("application/json".into()) + .with_delivery_mode(2), ) - .await + .await?; + + Ok(()) } pub async fn message_sent( @@ -155,19 +205,19 @@ impl AMQP { payload ); - self.channel + self.message_sent .basic_publish( - BasicProperties::default() - .with_content_type("application/json") - .with_persistence(true) - .finish(), - payload.into(), - BasicPublishArguments::new( - &config.pushd.exchange, - &config.pushd.get_message_routing_key(), - ), + config.pushd.exchange.clone().into(), + config.pushd.get_message_routing_key().into(), + BasicPublishOptions::default(), + payload.as_bytes(), + AMQPProperties::default() + .with_content_type("application/json".into()) + .with_delivery_mode(2), ) - .await + .await?; + + Ok(()) } pub async fn mass_mention_message_sent( @@ -190,19 +240,24 @@ impl AMQP { routing_key, payload ); - self.channel + self.mass_mention_message_sent .basic_publish( - BasicProperties::default() - .with_content_type("application/json") - .with_persistence(true) - .finish(), - payload.into(), - BasicPublishArguments::new(&config.pushd.exchange, routing_key.as_str()), + config.pushd.exchange.clone().into(), + routing_key.into(), + BasicPublishOptions::default(), + payload.as_bytes(), + AMQPProperties::default() + .with_content_type("application/json".into()) + .with_delivery_mode(2), ) - .await + .await?; + + Ok(()) } - pub async fn ack_message( + /// # Sends an ack to pushd to update badges on iPhones. + /// Not to be confused with the process_ack function, which handles sending all acks to crond for processing. + pub async fn ack_notification_message( &self, user_id: String, channel_id: String, @@ -222,22 +277,106 @@ impl AMQP { config.pushd.ack_queue, payload ); - let mut headers = FieldTable::new(); + let mut headers = FieldTable::default(); headers.insert( - "x-deduplication-header".try_into().unwrap(), - format!("{}-{}", &user_id, &channel_id).into(), + "x-deduplication-header".into(), + AMQPValue::LongString(format!("{}-{}", &user_id, &channel_id).into()), ); - self.channel + self.ack_notification_message .basic_publish( - BasicProperties::default() - .with_content_type("application/json") - .with_persistence(true) - //.with_headers(headers) - .finish(), - payload.into(), - BasicPublishArguments::new(&config.pushd.exchange, &config.pushd.ack_queue), + config.pushd.exchange.clone().into(), + config.pushd.ack_queue.into(), + BasicPublishOptions::default(), + payload.as_bytes(), + AMQPProperties::default() + .with_content_type("application/json".into()) + .with_delivery_mode(2), ) - .await + .await?; + + Ok(()) + } + + /// # DM Call Update + /// Used to send an update about a DM call, eg. start or end of a call. + /// Recipients can be used to narrow the scope of recipients, otherwise all recipients will be notified. + /// `ended` refers to the ringing period, not necessarily the call itself. + pub async fn dm_call_updated( + &self, + initiator_id: &str, + channel_id: &str, + started_at: Option<&str>, + ended: bool, + recipients: Option>, + ) -> Result<(), AMQPError> { + let config = revolt_config::config().await; + + let payload = InternalDmCallPayload { + payload: DmCallPayload { + initiator_id: initiator_id.to_string(), + channel_id: channel_id.to_string(), + started_at: started_at.map(|f| f.to_string()), + ended, + }, + recipients, + }; + let payload = to_string(&payload).unwrap(); + + debug!( + "Sending dm call update payload on channel {}: {}", + config.pushd.get_dm_call_routing_key(), + payload + ); + + self.dm_call_updated + .basic_publish( + config.pushd.exchange.clone().into(), + config.pushd.get_dm_call_routing_key().into(), + BasicPublishOptions::default(), + payload.as_bytes(), + AMQPProperties::default() + .with_content_type("application/json".into()) + .with_delivery_mode(2), + ) + .await?; + + Ok(()) + } + + /// # Send an ack to crond for processing + pub async fn process_ack( + &self, + user_id: &str, + channel_id: Option<&str>, + server_id: Option<&str>, + ) -> Result<(), AMQPError> { + let config = revolt_config::config().await; + + let payload = AckEventPayload { + user_id: user_id.to_string(), + channel_id: channel_id.map(|value| value.to_string()), + server_id: server_id.map(|value| value.to_string()), + }; + let payload = to_string(&payload).unwrap(); + + info!( + "Sending ack processor event on exchange {}, channel {}: {}", + config.rabbit.default_exchange, config.rabbit.queues.acks, payload + ); + + self.process_ack + .basic_publish( + config.rabbit.default_exchange.clone().into(), + config.rabbit.queues.acks.into(), + BasicPublishOptions::default(), + payload.as_bytes(), + AMQPProperties::default() + .with_content_type("application/json".into()) + .with_delivery_mode(2), + ) + .await?; + + Ok(()) } } diff --git a/crates/core/database/src/drivers/mod.rs b/crates/core/database/src/drivers/mod.rs index 2a2c7b851..8b3591023 100644 --- a/crates/core/database/src/drivers/mod.rs +++ b/crates/core/database/src/drivers/mod.rs @@ -2,15 +2,7 @@ mod mongodb; mod reference; -use authifier::config::Captcha; -use authifier::config::EmailVerificationConfig; -use authifier::config::PasswordScanning; -use authifier::config::ResolveIp; -use authifier::config::SMTPSettings; -use authifier::config::Shield; -use authifier::config::Template; -use authifier::config::Templates; -use authifier::Authifier; + use rand::Rng; use revolt_config::config; @@ -35,7 +27,7 @@ pub enum DatabaseInfo { } /// Database -#[derive(Clone)] +#[derive(Clone, Debug)] pub enum Database { /// Mock database Reference(ReferenceDb), @@ -69,7 +61,7 @@ impl DatabaseInfo { .await; #[cfg(not(feature = "mongodb"))] - return Err("MongoDB not enabled.".to_string()) + return Err("MongoDB not enabled.".to_string()); } else { DatabaseInfo::Reference.connect().await } @@ -90,7 +82,7 @@ impl DatabaseInfo { .await; #[cfg(not(feature = "mongodb"))] - return Err("MongoDB not enabled.".to_string()) + return Err("MongoDB not enabled.".to_string()); } _ => unreachable!("must specify REFERENCE or MONGODB"), } @@ -111,139 +103,3 @@ impl DatabaseInfo { } } } - -impl Database { - /// Create an Authifier reference - pub async fn to_authifier(self) -> Authifier { - let config = config().await; - - let mut auth_config = authifier::Config { - password_scanning: if config.api.security.easypwned.is_empty() { - Default::default() - } else { - PasswordScanning::EasyPwned { - endpoint: config.api.security.easypwned, - } - }, - email_verification: if !config.api.smtp.host.is_empty() { - EmailVerificationConfig::Enabled { - smtp: SMTPSettings { - from: config.api.smtp.from_address, - host: config.api.smtp.host, - username: config.api.smtp.username, - password: config.api.smtp.password, - reply_to: Some( - config - .api - .smtp - .reply_to - .unwrap_or("support@revolt.chat".into()), - ), - port: config.api.smtp.port, - use_tls: config.api.smtp.use_tls, - use_starttls: config.api.smtp.use_starttls, - }, - expiry: Default::default(), - templates: if config.production { - Templates { - verify: Template { - title: "Verify your Revolt account.".into(), - text: include_str!("../../templates/verify.txt").into(), - url: format!("{}/login/verify/", config.hosts.app), - html: Some(include_str!("../../templates/verify.html").into()), - }, - reset: Template { - title: "Reset your Revolt password.".into(), - text: include_str!("../../templates/reset.txt").into(), - url: format!("{}/login/reset/", config.hosts.app), - html: Some(include_str!("../../templates/reset.html").into()), - }, - reset_existing: Template { - title: "You already have a Revolt account, reset your password." - .into(), - text: include_str!("../../templates/reset-existing.txt").into(), - url: format!("{}/login/reset/", config.hosts.app), - html: Some( - include_str!("../../templates/reset-existing.html").into(), - ), - }, - deletion: Template { - title: "Confirm account deletion.".into(), - text: include_str!("../../templates/deletion.txt").into(), - url: format!("{}/delete/", config.hosts.app), - html: Some(include_str!("../../templates/deletion.html").into()), - }, - welcome: None, - } - } else { - Templates { - verify: Template { - title: "Verify your account.".into(), - text: include_str!("../../templates/verify.whitelabel.txt").into(), - url: format!("{}/login/verify/", config.hosts.app), - html: None, - }, - reset: Template { - title: "Reset your password.".into(), - text: include_str!("../../templates/reset.whitelabel.txt").into(), - url: format!("{}/login/reset/", config.hosts.app), - html: None, - }, - reset_existing: Template { - title: "Reset your password.".into(), - text: include_str!("../../templates/reset.whitelabel.txt").into(), - url: format!("{}/login/reset/", config.hosts.app), - html: None, - }, - deletion: Template { - title: "Confirm account deletion.".into(), - text: include_str!("../../templates/deletion.whitelabel.txt") - .into(), - url: format!("{}/delete/", config.hosts.app), - html: None, - }, - welcome: None, - } - }, - } - } else { - EmailVerificationConfig::Disabled - }, - ..Default::default() - }; - - auth_config.invite_only = config.api.registration.invite_only; - - if !config.api.security.captcha.hcaptcha_key.is_empty() { - auth_config.captcha = Captcha::HCaptcha { - secret: config.api.security.captcha.hcaptcha_key, - }; - } - - if !config.api.security.authifier_shield_key.is_empty() { - auth_config.shield = Shield::Enabled { - api_key: config.api.security.authifier_shield_key, - strict: false, - }; - } - - if config.api.security.trust_cloudflare { - auth_config.resolve_ip = ResolveIp::Cloudflare; - } - - Authifier { - database: match self { - Database::Reference(_) => Default::default(), - #[cfg(feature = "mongodb")] - Database::MongoDb(MongoDb(client, _)) => authifier::Database::MongoDb( - authifier::database::MongoDb(client.database("revolt")), - ), - }, - config: auth_config, - #[cfg(feature = "tasks")] - event_channel: Some(crate::tasks::authifier_relay::sender()), - #[cfg(not(feature = "tasks"))] - event_channel: None, - } - } -} diff --git a/crates/core/database/src/drivers/mongodb.rs b/crates/core/database/src/drivers/mongodb.rs index fc5dbe3c2..baeddb1da 100644 --- a/crates/core/database/src/drivers/mongodb.rs +++ b/crates/core/database/src/drivers/mongodb.rs @@ -11,6 +11,7 @@ use serde::Serialize; database_derived!( /// MongoDB implementation + #[derive(Debug)] pub struct MongoDb(pub ::mongodb::Client, pub String); ); diff --git a/crates/core/database/src/drivers/reference.rs b/crates/core/database/src/drivers/reference.rs index ff18f2533..66c9e9b6f 100644 --- a/crates/core/database/src/drivers/reference.rs +++ b/crates/core/database/src/drivers/reference.rs @@ -5,12 +5,12 @@ use futures::lock::Mutex; use crate::{ Bot, Channel, ChannelCompositeKey, ChannelUnread, Emoji, File, FileHash, Invite, Member, MemberCompositeKey, Message, PolicyChange, RatelimitEvent, Report, Server, ServerBan, Snapshot, - User, UserSettings, Webhook, + User, UserSettings, Webhook, Account, AccountInvite, Session, MFATicket }; database_derived!( /// Reference implementation - #[derive(Default)] + #[derive(Default, Debug)] pub struct ReferenceDb { pub bots: Arc>>, pub channels: Arc>>, @@ -30,5 +30,9 @@ database_derived!( pub servers: Arc>>, pub safety_reports: Arc>>, pub safety_snapshots: Arc>>, + pub accounts: Arc>>, + pub account_invites: Arc>>, + pub sessions: Arc>>, + pub tickets: Arc>>, } ); diff --git a/crates/core/database/src/events/client.rs b/crates/core/database/src/events/client.rs index aa9fb0b9f..a55e7171a 100644 --- a/crates/core/database/src/events/client.rs +++ b/crates/core/database/src/events/client.rs @@ -1,15 +1,16 @@ -use authifier::AuthifierEvent; use revolt_result::Error; use serde::{Deserialize, Serialize}; use revolt_models::v0::{ - AppendMessage, Channel, ChannelUnread, Emoji, FieldsChannel, FieldsMember, FieldsMessage, - FieldsRole, FieldsServer, FieldsUser, FieldsWebhook, Member, MemberCompositeKey, Message, - PartialChannel, PartialMember, PartialMessage, PartialRole, PartialServer, PartialUser, - PartialWebhook, PolicyChange, RemovalIntention, Report, Server, User, UserSettings, Webhook, + AppendMessage, Channel, ChannelSlowmode, ChannelUnread, ChannelVoiceState, Emoji, + FieldsChannel, FieldsMember, FieldsMessage, FieldsRole, FieldsServer, FieldsUser, + FieldsWebhook, Member, MemberCompositeKey, Message, PartialChannel, PartialEmoji, + PartialMember, PartialMessage, PartialRole, PartialServer, PartialUser, PartialUserVoiceState, + PartialWebhook, PolicyChange, RemovalIntention, Report, Server, User, UserSettings, + UserVoiceState, Webhook, }; -use crate::Database; +use crate::{Account, Database, Session}; /// Ping Packet #[derive(Serialize, Deserialize, Debug, Clone)] @@ -20,16 +21,33 @@ pub enum Ping { } /// Fields provided in Ready payload -#[derive(PartialEq)] -pub enum ReadyPayloadFields { - Users, - Servers, - Channels, - Members, - Emoji, - - UserSettings(Vec), - ChannelUnreads, +#[derive(PartialEq, Debug, Clone, Deserialize)] +pub struct ReadyPayloadFields { + pub users: bool, + pub servers: bool, + pub channels: bool, + pub members: bool, + pub emojis: bool, + pub voice_states: bool, + pub user_settings: Vec, + pub channel_unreads: bool, + pub policy_changes: bool, +} + +impl Default for ReadyPayloadFields { + fn default() -> Self { + Self { + users: true, + servers: true, + channels: true, + members: true, + emojis: true, + voice_states: true, + user_settings: Vec::new(), + channel_unreads: false, + policy_changes: true, + } + } } /// Protocol Events @@ -37,9 +55,13 @@ pub enum ReadyPayloadFields { #[serde(tag = "type")] pub enum EventV1 { /// Multiple events - Bulk { v: Vec }, + Bulk { + v: Vec, + }, /// Error event - Error { data: Error }, + Error { + data: Error, + }, /// Successfully authenticated Authenticated, @@ -57,17 +79,22 @@ pub enum EventV1 { members: Option>, #[serde(skip_serializing_if = "Option::is_none")] emojis: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + voice_states: Option>, #[serde(skip_serializing_if = "Option::is_none")] user_settings: Option, #[serde(skip_serializing_if = "Option::is_none")] channel_unreads: Option>, - policy_changes: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + policy_changes: Option>, }, /// Ping response - Pong { data: Ping }, + Pong { + data: Ping, + }, /// New message Message(Message), @@ -88,7 +115,10 @@ pub enum EventV1 { }, /// Delete message - MessageDelete { id: String, channel: String }, + MessageDelete { + id: String, + channel: String, + }, /// New reaction to a message MessageReact { @@ -114,7 +144,10 @@ pub enum EventV1 { }, /// Bulk delete messages - BulkMessageDelete { channel: String, ids: Vec }, + BulkMessageDelete { + channel: String, + ids: Vec, + }, /// New server ServerCreate { @@ -122,6 +155,7 @@ pub enum EventV1 { server: Server, channels: Vec, emojis: Vec, + voice_states: Vec, }, /// Update existing server @@ -133,7 +167,9 @@ pub enum EventV1 { }, /// Delete server - ServerDelete { id: String }, + ServerDelete { + id: String, + }, /// Update existing server member ServerMemberUpdate { @@ -169,10 +205,16 @@ pub enum EventV1 { }, /// Server role deleted - ServerRoleDelete { id: String, role_id: String }, + ServerRoleDelete { + id: String, + role_id: String, + }, /// Server roles ranks updated - ServerRoleRanksUpdate { id: String, ranks: Vec }, + ServerRoleRanksUpdate { + id: String, + ranks: Vec, + }, /// Update existing user UserUpdate { @@ -184,9 +226,15 @@ pub enum EventV1 { }, /// Relationship with another user changed - UserRelationship { id: String, user: User }, + UserRelationship { + id: String, + user: User, + }, /// Settings updated remotely - UserSettingsUpdate { id: String, update: UserSettings }, + UserSettingsUpdate { + id: String, + update: UserSettings, + }, /// User has been platform banned or deleted their account /// @@ -197,12 +245,23 @@ pub enum EventV1 { /// - Server Memberships /// /// User flags are specified to explain why a wipe is occurring though not all reasons will necessarily ever appear. - UserPlatformWipe { user_id: String, flags: i32 }, + UserPlatformWipe { + user_id: String, + flags: i32, + }, /// New emoji EmojiCreate(Emoji), + /// Update existing emoji + EmojiUpdate { + id: String, + data: PartialEmoji, + }, + /// Delete emoji - EmojiDelete { id: String }, + EmojiDelete { + id: String, + }, /// New report ReportCreate(Report), @@ -218,19 +277,33 @@ pub enum EventV1 { }, /// Delete channel - ChannelDelete { id: String }, + ChannelDelete { + id: String, + }, /// User joins a group - ChannelGroupJoin { id: String, user: String }, + ChannelGroupJoin { + id: String, + user: String, + }, /// User leaves a group - ChannelGroupLeave { id: String, user: String }, + ChannelGroupLeave { + id: String, + user: String, + }, /// User started typing in a channel - ChannelStartTyping { id: String, user: String }, + ChannelStartTyping { + id: String, + user: String, + }, /// User stopped typing in a channel - ChannelStopTyping { id: String, user: String }, + ChannelStopTyping { + id: String, + user: String, + }, /// User acknowledged message in channel ChannelAck { @@ -250,10 +323,56 @@ pub enum EventV1 { }, /// Delete webhook - WebhookDelete { id: String }, + WebhookDelete { + id: String, + }, /// Auth events - Auth(AuthifierEvent), + CreateAccount { + account: Account, + }, + CreateSession { + session: Session, + }, + DeleteSession { + user_id: String, + session_id: String, + }, + DeleteAllSessions { + user_id: String, + exclude_session_id: Option, + }, + + /// Voice events + VoiceChannelJoin { + id: String, + state: UserVoiceState, + }, + VoiceChannelLeave { + id: String, + user: String, + }, + VoiceChannelMove { + user: String, + from: String, + to: String, + state: UserVoiceState, + }, + UserVoiceStateUpdate { + id: String, + channel_id: String, + data: PartialUserVoiceState, + }, + UserMoveVoiceChannel { + node: String, + from: String, + to: String, + token: String, + }, + /// User's active slowmodes + UserSlowmodes { + slowmodes: Vec, + }, } impl EventV1 { diff --git a/crates/core/database/src/events/rabbit.rs b/crates/core/database/src/events/rabbit.rs index 0ae91be11..1673f4a45 100644 --- a/crates/core/database/src/events/rabbit.rs +++ b/crates/core/database/src/events/rabbit.rs @@ -37,6 +37,20 @@ pub struct GenericPayload { pub user: User, } +#[derive(Serialize, Deserialize, Clone)] +pub struct DmCallPayload { + pub initiator_id: String, + pub channel_id: String, + pub started_at: Option, + pub ended: bool, +} + +#[derive(Serialize, Deserialize, Clone)] +pub struct InternalDmCallPayload { + pub payload: DmCallPayload, + pub recipients: Option>, +} + #[derive(Serialize, Deserialize)] #[serde(tag = "type", content = "data")] #[allow(clippy::large_enum_variant)] @@ -46,6 +60,7 @@ pub enum PayloadKind { FRReceived(FRReceivedPayload), BadgeUpdate(usize), Generic(GenericPayload), + DmCallStartEnd(DmCallPayload), } #[derive(Serialize, Deserialize)] @@ -63,3 +78,11 @@ pub struct AckPayload { pub channel_id: String, pub message_id: String, } + +/// This is not the same as the AckPayload above, as the state for this event is stored in redis to allow for state updates while the event is queued. +#[derive(Serialize, Deserialize, Debug)] +pub struct AckEventPayload { + pub user_id: String, + pub channel_id: Option, + pub server_id: Option, +} diff --git a/crates/core/database/src/lib.rs b/crates/core/database/src/lib.rs index f9827d03c..0ab9b6ce9 100644 --- a/crates/core/database/src/lib.rs +++ b/crates/core/database/src/lib.rs @@ -25,8 +25,8 @@ pub use mongodb; #[macro_use] extern crate bson; -#[cfg(not(feature = "async-std-runtime"))] -compile_error!("async-std-runtime feature must be enabled."); +#[cfg(not(feature = "tokio-runtime"))] +compile_error!("tokio-runtime feature must be enabled."); #[macro_export] #[cfg(debug_assertions)] @@ -112,6 +112,10 @@ pub mod tasks; mod amqp; pub use amqp::amqp::AMQP; +#[cfg(feature = "voice")] +pub mod voice; + + /// Utility function to check if a boolean value is false pub fn if_false(t: &bool) -> bool { !t diff --git a/crates/core/database/src/models/account_invites/mod.rs b/crates/core/database/src/models/account_invites/mod.rs new file mode 100644 index 000000000..4d801b73e --- /dev/null +++ b/crates/core/database/src/models/account_invites/mod.rs @@ -0,0 +1,5 @@ +mod model; +mod ops; + +pub use model::*; +pub use ops::*; diff --git a/crates/core/database/src/models/account_invites/model.rs b/crates/core/database/src/models/account_invites/model.rs new file mode 100644 index 000000000..88ec7f14d --- /dev/null +++ b/crates/core/database/src/models/account_invites/model.rs @@ -0,0 +1,25 @@ +use crate::{if_false, Database}; +use revolt_result::Result; + +auto_derived_partial!( + /// Account invite ticket + pub struct AccountInvite { + /// Invite code + #[serde(rename = "_id")] + pub id: String, + /// Whether this invite ticket has been used + #[serde(skip_serializing_if = "if_false", default)] + pub used: bool, + /// User ID that this invite was claimed by + #[serde(skip_serializing_if = "Option::is_none")] + pub claimed_by: Option, + }, + "PartialAccountInvite" +); + +impl AccountInvite { + /// Save model + pub async fn save(&self, db: &Database) -> Result<()> { + db.save_account_invite(self).await + } +} diff --git a/crates/core/database/src/models/account_invites/ops.rs b/crates/core/database/src/models/account_invites/ops.rs new file mode 100644 index 000000000..c17c995a5 --- /dev/null +++ b/crates/core/database/src/models/account_invites/ops.rs @@ -0,0 +1,16 @@ +use revolt_result::Result; + +use crate::AccountInvite; + +#[cfg(feature = "mongodb")] +mod mongodb; +mod reference; + +#[async_trait] +pub trait AbstractAccountInvites: Sync + Send { + /// Find invite by id + async fn fetch_account_invite(&self, id: &str) -> Result; + + /// Save invite + async fn save_account_invite(&self, invite: &AccountInvite) -> Result<()>; +} diff --git a/crates/core/database/src/models/account_invites/ops/mongodb.rs b/crates/core/database/src/models/account_invites/ops/mongodb.rs new file mode 100644 index 000000000..f9c71e684 --- /dev/null +++ b/crates/core/database/src/models/account_invites/ops/mongodb.rs @@ -0,0 +1,31 @@ +use crate::{AbstractAccountInvites, AccountInvite, MongoDb}; +use bson::to_document; +use mongodb::options::UpdateOptions; +use revolt_result::Result; + +const COL: &str = "account_invites"; + +#[async_trait] +impl AbstractAccountInvites for MongoDb { + /// Find invite by id + async fn fetch_account_invite(&self, id: &str) -> Result { + query!(self, find_one_by_id, COL, id)?.ok_or_else(|| create_error!(InvalidInvite)) + } + + /// Save invite + async fn save_account_invite(&self, invite: &AccountInvite) -> Result<()> { + self.col::(COL) + .update_one( + doc! { + "_id": &invite.id + }, + doc! { + "$set": to_document(invite).map_err(|_| create_database_error!("to_document", COL))?, + }, + ) + .with_options(UpdateOptions::builder().upsert(true).build()) + .await + .map_err(|_| create_database_error!("upsert_one", COL)) + .map(|_| ()) + } +} diff --git a/crates/core/database/src/models/account_invites/ops/reference.rs b/crates/core/database/src/models/account_invites/ops/reference.rs new file mode 100644 index 000000000..9003400dc --- /dev/null +++ b/crates/core/database/src/models/account_invites/ops/reference.rs @@ -0,0 +1,21 @@ +use crate::{AbstractAccountInvites, AccountInvite, ReferenceDb}; +use revolt_result::Result; + +#[async_trait] +impl AbstractAccountInvites for ReferenceDb { + /// Find invite by id + async fn fetch_account_invite(&self, id: &str) -> Result { + let invites = self.account_invites.lock().await; + invites + .get(id) + .cloned() + .ok_or_else(|| create_error!(InvalidInvite)) + } + + /// Save invite + async fn save_account_invite(&self, invite: &AccountInvite) -> Result<()> { + let mut invites = self.account_invites.lock().await; + invites.insert(invite.id.to_string(), invite.clone()); + Ok(()) + } +} diff --git a/crates/core/database/src/models/accounts/axum.rs b/crates/core/database/src/models/accounts/axum.rs new file mode 100644 index 000000000..5ac9dc617 --- /dev/null +++ b/crates/core/database/src/models/accounts/axum.rs @@ -0,0 +1,22 @@ +use axum::{extract::{FromRef, FromRequestParts}, http::request::Parts}; + +use revolt_result::{Error, Result}; + +use crate::{Account, Database, Session}; + +#[async_trait] +impl FromRequestParts for Account +where + Database: FromRef, + S: Send + Sync +{ + type Rejection = Error; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let db = Database::from_ref(state); + + let session = Session::from_request_parts(parts, state).await?; + + db.fetch_account(&session.user_id).await + } +} diff --git a/crates/core/database/src/models/accounts/mod.rs b/crates/core/database/src/models/accounts/mod.rs new file mode 100644 index 000000000..4e58da725 --- /dev/null +++ b/crates/core/database/src/models/accounts/mod.rs @@ -0,0 +1,11 @@ +#[cfg(feature = "axum-impl")] +mod axum; +mod model; +mod ops; +#[cfg(feature = "rocket-impl")] +mod rocket; +#[cfg(feature = "rocket-impl")] +mod schema; + +pub use model::*; +pub use ops::*; diff --git a/crates/core/database/src/models/accounts/model.rs b/crates/core/database/src/models/accounts/model.rs new file mode 100644 index 000000000..5608ecfce --- /dev/null +++ b/crates/core/database/src/models/accounts/model.rs @@ -0,0 +1,656 @@ +use iso8601_timestamp::{Duration, Timestamp}; + +use nanoid::nanoid; +use revolt_config::config; +use revolt_result::Result; +use serde_json::json; + +use crate::{ + events::client::EventV1, + util::{ + email::{email_templates, normalise_email, send_email}, + password::hash_password, + }, + Database, MFATicket, Session, +}; +use revolt_models::v0; + +auto_derived_partial!( + /// Account model + pub struct Account { + /// Unique Id + #[serde(rename = "_id")] + pub id: String, + + /// User's email + pub email: String, + + /// Normalised email + /// + /// (see https://github.com/insertish/authifier/#how-does-authifier-work) + pub email_normalised: String, + + /// Argon2 hashed password + pub password: String, + + /// Whether the account is disabled + #[serde(default)] + pub disabled: bool, + + /// Email verification status + pub verification: EmailVerification, + + /// Password reset information + pub password_reset: Option, + + /// Account deletion information + pub deletion: Option, + + /// Account lockout + pub lockout: Option, + + /// Multi-factor authentication information + pub mfa: MultiFactorAuthentication, + }, + "PartialAccount" +); + +auto_derived!( + /// Email verification status + #[serde(tag = "status")] + pub enum EmailVerification { + /// Account is verified + Verified, + /// Pending email verification + Pending { token: String, expiry: Timestamp }, + /// Moving to a new email + Moving { + new_email: String, + token: String, + expiry: Timestamp, + }, + } + + /// Password reset information + pub struct PasswordReset { + /// Token required to change password + pub token: String, + /// Time at which this token expires + pub expiry: Timestamp, + } + + /// Account deletion information + #[serde(tag = "status")] + pub enum DeletionInfo { + /// The user must confirm deletion by email + WaitingForVerification { token: String, expiry: Timestamp }, + /// The account is scheduled for deletion + Scheduled { after: Timestamp }, + /// This account was deleted + Deleted, + } + + /// Lockout information + pub struct Lockout { + /// Attempt counter + pub attempts: i32, + /// Time at which this lockout expires + pub expiry: Option, + } + + /// MFA configuration + #[derive(Default)] + pub struct MultiFactorAuthentication { + /// Allow password-less email OTP login + /// (1-Factor) + // #[serde(skip_serializing_if = "is_false", default)] + // pub enable_email_otp: bool, + + /// Allow trusted handover + /// (1-Factor) + // #[serde(skip_serializing_if = "is_false", default)] + // pub enable_trusted_handover: bool, + + /// Allow email MFA + /// (2-Factor) + // #[serde(skip_serializing_if = "is_false", default)] + // pub enable_email_mfa: bool, + + /// TOTP MFA token, enabled if present + /// (2-Factor) + #[serde(skip_serializing_if = "Totp::is_empty", default)] + pub totp_token: Totp, + + /// Security Key MFA token, enabled if present + /// (2-Factor) + // #[serde(skip_serializing_if = "Option::is_none")] + // pub security_key_token: Option, + + /// Recovery codes + #[serde(skip_serializing_if = "Vec::is_empty", default)] + pub recovery_codes: Vec, + } + + /// MFA method + #[derive(Hash)] + pub enum MFAMethod { + Password, + Recovery, + Totp, + } + + #[derive(Default)] + #[serde(tag = "status")] + pub enum Totp { + /// Disabled + #[default] + Disabled, + /// Waiting for user activation + Pending { secret: String }, + /// Required on account + Enabled { secret: String }, + } +); + +impl MultiFactorAuthentication { + // Check whether MFA is in-use + pub fn is_active(&self) -> bool { + matches!(self.totp_token, Totp::Enabled { .. }) + } + + // Check whether there are still usable recovery codes + pub fn has_recovery(&self) -> bool { + !self.recovery_codes.is_empty() + } + + // Get available MFA methods + pub fn get_methods(&self) -> Vec { + if let Totp::Enabled { .. } = self.totp_token { + let mut methods = vec![MFAMethod::Totp]; + + if self.has_recovery() { + methods.push(MFAMethod::Recovery); + } + + methods + } else { + vec![MFAMethod::Password] + } + } + + // Generate new recovery codes + pub fn generate_recovery_codes(&mut self) { + static ALPHABET: [char; 32] = [ + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z', + ]; + + let mut codes = vec![]; + for _ in 1..=10 { + codes.push(format!( + "{}-{}", + nanoid!(5, &ALPHABET), + nanoid!(5, &ALPHABET) + )); + } + + self.recovery_codes = codes; + } + + // Generate new TOTP secret + pub fn generate_new_totp_secret(&mut self) -> Result { + if let Totp::Enabled { .. } = self.totp_token { + return Err(create_error!(OperationFailed)); + } + + let secret: [u8; 10] = rand::random(); + let secret = base32::encode(base32::Alphabet::RFC4648 { padding: false }, &secret); + + self.totp_token = Totp::Pending { + secret: secret.clone(), + }; + + Ok(secret) + } + + /// Enable TOTP using a given MFA response + pub fn enable_totp(&mut self, response: v0::MFAResponse) -> Result<()> { + if let v0::MFAResponse::Totp { totp_code } = response { + let code = self.totp_token.generate_code()?; + + if code == totp_code { + let mut totp = Totp::Disabled; + std::mem::swap(&mut totp, &mut self.totp_token); + + if let Totp::Pending { secret } = totp { + self.totp_token = Totp::Enabled { secret }; + + Ok(()) + } else { + Err(create_error!(OperationFailed)) + } + } else { + Err(create_error!(InvalidToken)) + } + } else { + Err(create_error!(InvalidToken)) + } + } +} + +impl Totp { + /// Whether TOTP information is empty + pub fn is_empty(&self) -> bool { + matches!(self, Totp::Disabled) + } + + /// Whether TOTP is disabled + pub fn is_disabled(&self) -> bool { + !matches!(self, Totp::Enabled { .. }) + } + + // Generate a TOTP code from secret + pub fn generate_code(&self) -> Result { + if let Totp::Enabled { secret } | Totp::Pending { secret } = &self { + let seconds: u64 = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs(); + + Ok(totp_lite::totp_custom::( + totp_lite::DEFAULT_STEP, + 6, + &base32::decode(base32::Alphabet::RFC4648 { padding: false }, secret) + .expect("valid base32 secret"), + seconds, + )) + } else { + Err(create_error!(OperationFailed)) + } + } +} + +impl Account { + /// Save model + pub async fn save(&self, db: &Database) -> Result<()> { + db.save_account(self).await + } + + /// Create a new account + pub async fn new( + db: &Database, + email: String, + plaintext_password: String, + verify_email: bool, + ) -> Result { + // Get a normalised representation of the user's email + let email_normalised = normalise_email(email.clone()); + + // Try to find an existing account + if let Some(mut account) = db + .fetch_account_by_normalised_email(&email_normalised) + .await? + { + // Resend account verification or send password reset + if let EmailVerification::Pending { .. } = &account.verification { + account.start_email_verification(db).await?; + } else { + account.start_password_reset(db, true).await?; + } + + Ok(account) + } else { + // Hash the user's password + let password = hash_password(plaintext_password)?; + + // Create a new account + let mut account = Account { + id: ulid::Ulid::new().to_string(), + + email, + email_normalised, + password, + + disabled: false, + verification: EmailVerification::Verified, + password_reset: None, + deletion: None, + lockout: None, + + mfa: Default::default(), + }; + + // Send email verification + if verify_email { + account.start_email_verification(db).await?; + } else { + account.save(db).await?; + } + + // Create and push event + EventV1::CreateAccount { + account: account.clone(), + } + .global() + .await; + + Ok(account) + } + } + + /// Create a new session + pub async fn create_session(&self, db: &Database, name: String) -> Result { + let config = config().await; + + let session = Session { + id: ulid::Ulid::new().to_string(), + token: nanoid!(64), + + user_id: self.id.clone(), + name, + + last_seen: Timestamp::now_utc(), + + origin: Some(config.environment), + subscription: None, + }; + + // Save to database + db.save_session(&session).await?; + + // Create and push event + EventV1::CreateSession { + session: session.clone(), + } + .global() + .await; + + Ok(session) + } + + /// Send account verification email + pub async fn start_email_verification(&mut self, db: &Database) -> Result<()> { + let config = config().await; + + if !config.api.smtp.host.is_empty() { + let templates = email_templates().await; + + let token = nanoid!(32); + let url = format!("{}{}", templates.verify.url, token); + + send_email( + &config.api.smtp, + self.email.clone(), + &templates.verify, + json!({ + "email": self.email.clone(), + "url": url + }), + )?; + + self.verification = EmailVerification::Pending { + token, + expiry: Timestamp::now_utc() + .checked_add(Duration::seconds( + config.api.smtp.expiry.expire_verification, + )) + .unwrap(), + }; + } else { + self.verification = EmailVerification::Verified; + } + + self.save(db).await + } + + /// Send account verification to new email + pub async fn start_email_move(&mut self, db: &Database, new_email: String) -> Result<()> { + // This method should and will never be called on an unverified account, + // but just validate this just in case. + if let EmailVerification::Pending { .. } = self.verification { + return Err(create_error!(UnverifiedAccount)); + } + + let config = config().await; + + if !config.api.smtp.host.is_empty() { + let templates = email_templates().await; + + let token = nanoid!(32); + let url = format!("{}{}", templates.verify.url, token); + + send_email( + &config.api.smtp, + new_email.clone(), + &templates.verify, + json!({ + "email": self.email.clone(), + "url": url + }), + )?; + + self.verification = EmailVerification::Moving { + new_email, + token, + expiry: Timestamp::now_utc() + .checked_add(Duration::seconds( + config.api.smtp.expiry.expire_verification, + )) + .unwrap(), + }; + } else { + self.email_normalised = normalise_email(new_email.clone()); + self.email = new_email; + } + + self.save(db).await + } + + /// Send password reset email + pub async fn start_password_reset( + &mut self, + db: &Database, + existing_account: bool, + ) -> Result<()> { + let config = config().await; + + if !config.api.smtp.host.is_empty() { + let templates = email_templates().await; + + let template = if existing_account { + &templates.reset_existing + } else { + &templates.reset + }; + + let token = nanoid!(32); + let url = format!("{}{}", template.url, token); + + send_email( + &config.api.smtp, + self.email.clone(), + template, + json!({ + "email": self.email.clone(), + "url": url + }), + )?; + + self.password_reset = Some(PasswordReset { + token, + expiry: Timestamp::now_utc() + .checked_add(Duration::seconds( + config.api.smtp.expiry.expire_password_reset, + )) + .unwrap(), + }); + } else { + return Err(create_error!(OperationFailed)); + } + + self.save(db).await + } + + /// Begin account deletion process by sending confirmation email + /// + /// If email verification is not on, the account will be marked for deletion instantly + pub async fn start_account_deletion(&mut self, db: &Database) -> Result<()> { + let config = config().await; + + if !config.api.smtp.host.is_empty() { + let templates = email_templates().await; + + let token = nanoid!(32); + let url = format!("{}{}", templates.deletion.url, token); + + send_email( + &config.api.smtp, + self.email.clone(), + &templates.deletion, + json!({ + "email": self.email.clone(), + "url": url + }), + )?; + + self.deletion = Some(DeletionInfo::WaitingForVerification { + token, + expiry: Timestamp::now_utc() + .checked_add(Duration::seconds( + config.api.smtp.expiry.expire_password_reset, + )) + .unwrap(), + }); + + self.save(db).await + } else { + self.schedule_deletion(db).await + } + } + + /// Verify a user's password is correct + pub fn verify_password(&self, plaintext_password: &str) -> Result<()> { + argon2::verify_encoded(&self.password, plaintext_password.as_bytes()) + .map(|v| { + if v { + Ok(()) + } else { + Err(create_error!(InvalidCredentials)) + } + }) + // To prevent user enumeration, we should ignore + // the error and pretend the password is wrong. + .map_err(|_| create_error!(InvalidCredentials))? + } + + /// Validate an MFA response + pub async fn consume_mfa_response( + &mut self, + db: &Database, + response: v0::MFAResponse, + ticket: Option, + ) -> Result<()> { + let allowed_methods = self.mfa.get_methods(); + + match response { + v0::MFAResponse::Password { password } => { + if allowed_methods.contains(&MFAMethod::Password) { + self.verify_password(&password) + } else { + Err(create_error!(DisallowedMFAMethod)) + } + } + v0::MFAResponse::Totp { totp_code } => { + if allowed_methods.contains(&MFAMethod::Totp) { + if let Totp::Enabled { .. } = &self.mfa.totp_token { + // Use TOTP code at generation if applicable + if let Some(ticket) = ticket { + if let Some(code) = ticket.last_totp_code { + if code == totp_code { + return Ok(()); + } + } + } + + // Otherwise read current TOTP token + if self.mfa.totp_token.generate_code()? == totp_code { + Ok(()) + } else { + Err(create_error!(InvalidToken)) + } + } else { + unreachable!() + } + } else { + Err(create_error!(DisallowedMFAMethod)) + } + } + v0::MFAResponse::Recovery { recovery_code } => { + if allowed_methods.contains(&MFAMethod::Recovery) { + if let Some(index) = self + .mfa + .recovery_codes + .iter() + .position(|x| x == &recovery_code) + { + self.mfa.recovery_codes.remove(index); + self.save(db).await + } else { + Err(create_error!(InvalidToken)) + } + } else { + Err(create_error!(DisallowedMFAMethod)) + } + } + } + } + + /// Delete all sessions for an account + pub async fn delete_all_sessions( + &self, + db: &Database, + exclude_session_id: Option, + ) -> Result<()> { + db.delete_all_sessions(&self.id, exclude_session_id.clone()) + .await?; + + // Create and push event + EventV1::DeleteAllSessions { + user_id: self.id.clone(), + exclude_session_id, + } + .private(self.id.clone()) + .await; + + Ok(()) + } + + /// Disable an account + pub async fn disable(&mut self, db: &Database) -> Result<()> { + self.disabled = true; + self.delete_all_sessions(db, None).await?; + self.save(db).await + } + + /// Schedule an account for deletion + pub async fn schedule_deletion(&mut self, db: &Database) -> Result<()> { + self.deletion = Some(DeletionInfo::Scheduled { + after: Timestamp::now_utc() + .checked_add(Duration::weeks(1)) + .unwrap(), + }); + + self.disable(db).await + } + + /// Removes all information from the account and marks it as fully deleted + pub async fn mark_deleted(&mut self, db: &Database) -> Result<()> { + self.email = format!("Deleted User {}", &self.id); + self.email_normalised = format!("Deleted User {}", &self.id); + self.deletion = Some(DeletionInfo::Deleted); + + self.save(db).await?; + + Ok(()) + } +} diff --git a/crates/core/database/src/models/accounts/ops.rs b/crates/core/database/src/models/accounts/ops.rs new file mode 100644 index 000000000..912593912 --- /dev/null +++ b/crates/core/database/src/models/accounts/ops.rs @@ -0,0 +1,34 @@ +use revolt_result::Result; + +use crate::Account; + +#[cfg(feature = "mongodb")] +mod mongodb; +mod reference; + +#[async_trait] +pub trait AbstractAccounts: Sync + Send { + /// Find account by id + async fn fetch_account(&self, id: &str) -> Result; + + /// Find account by normalised email + async fn fetch_account_by_normalised_email( + &self, + normalised_email: &str, + ) -> Result>; + + /// Find account with active pending email verification + async fn fetch_account_with_email_verification(&self, token: &str) -> Result; + + /// Find account with active password reset + async fn fetch_account_with_password_reset(&self, token: &str) -> Result; + + /// Find account with active deletion token + async fn fetch_account_with_deletion_token(&self, token: &str) -> Result; + + /// Find accounts which are due to be deleted + async fn fetch_accounts_due_for_deletion(&self) -> Result>; + + // Save account + async fn save_account(&self, account: &Account) -> Result<()>; +} diff --git a/crates/core/database/src/models/accounts/ops/mongodb.rs b/crates/core/database/src/models/accounts/ops/mongodb.rs new file mode 100644 index 000000000..3c5ce3db2 --- /dev/null +++ b/crates/core/database/src/models/accounts/ops/mongodb.rs @@ -0,0 +1,118 @@ +use crate::{AbstractAccounts, Account, MongoDb}; +use bson::{to_bson, to_document}; +use iso8601_timestamp::Timestamp; +use mongodb::options::{Collation, CollationStrength, FindOneOptions, UpdateOptions}; +use revolt_result::Result; + +const COL: &str = "accounts"; + +#[async_trait] +impl AbstractAccounts for MongoDb { + /// Find account by id + async fn fetch_account(&self, id: &str) -> Result { + query!(self, find_one_by_id, COL, id)?.ok_or_else(|| create_error!(UnknownUser)) + } + + /// Find account by normalised email + async fn fetch_account_by_normalised_email( + &self, + normalised_email: &str, + ) -> Result> { + query!( + self, + find_one_with_options, + COL, + doc! { + "email_normalised": normalised_email + }, + FindOneOptions::builder() + .collation( + Collation::builder() + .locale("en") + .strength(CollationStrength::Secondary) + .build(), + ) + .build() + ) + } + + /// Find account with active pending email verification + async fn fetch_account_with_email_verification(&self, token: &str) -> Result { + query!( + self, + find_one, + COL, + doc! { + "verification.token": token, + "verification.expiry": { + "$gte": to_bson(&Timestamp::now_utc()).unwrap() + } + } + )? + .ok_or_else(|| create_error!(InvalidToken)) + } + + /// Find account with active password reset + async fn fetch_account_with_password_reset(&self, token: &str) -> Result { + query!( + self, + find_one, + COL, + doc! { + "password_reset.token": token, + "password_reset.expiry": { + "$gte": to_bson(&Timestamp::now_utc()).unwrap() + } + } + )? + .ok_or_else(|| create_error!(InvalidToken)) + } + + /// Find account with active deletion token + async fn fetch_account_with_deletion_token(&self, token: &str) -> Result { + query!( + self, + find_one, + COL, + doc! { + "deletion.token": token, + "deletion.expiry": { + "$gte": to_bson(&Timestamp::now_utc()).unwrap() + } + } + )? + .ok_or_else(|| create_error!(InvalidToken)) + } + + /// Find accounts which are due to be deleted + async fn fetch_accounts_due_for_deletion(&self) -> Result> { + query!( + self, + find, + COL, + doc! { + "deletion.status": "Scheduled", + "deletion.after": { + "$lte": to_bson(&Timestamp::now_utc()).unwrap() + } + } + ) + } + + // Save account + async fn save_account(&self, account: &Account) -> Result<()> { + self.col::(COL) + .update_one( + doc! { + "_id": &account.id + }, + doc! { + "$set": to_document(account).map_err(|_| create_database_error!("to_document", COL))? + }, + ) + .with_options(UpdateOptions::builder().upsert(true).build()) + .await + .map_err(|_| create_database_error!("find_one", COL)) + .map(|_| ()) + } +} diff --git a/crates/core/database/src/models/accounts/ops/reference.rs b/crates/core/database/src/models/accounts/ops/reference.rs new file mode 100644 index 000000000..d30a374c8 --- /dev/null +++ b/crates/core/database/src/models/accounts/ops/reference.rs @@ -0,0 +1,99 @@ +use crate::{AbstractAccounts, Account, DeletionInfo, EmailVerification, ReferenceDb}; +use iso8601_timestamp::Timestamp; +use revolt_result::Result; + +#[async_trait] +impl AbstractAccounts for ReferenceDb { + /// Find account by id + async fn fetch_account(&self, id: &str) -> Result { + let accounts = self.accounts.lock().await; + accounts + .get(id) + .cloned() + .ok_or_else(|| create_error!(UnknownUser)) + } + + /// Find account by normalised email + async fn fetch_account_by_normalised_email( + &self, + normalised_email: &str, + ) -> Result> { + let accounts = self.accounts.lock().await; + Ok(accounts + .values() + .find(|account| account.email_normalised == normalised_email) + .cloned()) + } + + /// Find account with active pending email verification + async fn fetch_account_with_email_verification(&self, token_to_match: &str) -> Result { + let accounts = self.accounts.lock().await; + accounts + .values() + .find(|account| match &account.verification { + EmailVerification::Pending { token, .. } + | EmailVerification::Moving { token, .. } => token == token_to_match, + _ => false, + }) + .cloned() + .ok_or_else(|| create_error!(InvalidToken)) + } + + /// Find account with active password reset + async fn fetch_account_with_password_reset(&self, token: &str) -> Result { + let accounts = self.accounts.lock().await; + accounts + .values() + .find(|account| { + if let Some(reset) = &account.password_reset { + reset.token == token + } else { + false + } + }) + .cloned() + .ok_or_else(|| create_error!(InvalidToken)) + } + + /// Find account with active deletion token + async fn fetch_account_with_deletion_token(&self, token_to_match: &str) -> Result { + let accounts = self.accounts.lock().await; + accounts + .values() + .find(|account| { + if let Some(DeletionInfo::WaitingForVerification { token, .. }) = &account.deletion + { + token == token_to_match + } else { + false + } + }) + .cloned() + .ok_or_else(|| create_error!(InvalidToken)) + } + + /// Find accounts which are due to be deleted + async fn fetch_accounts_due_for_deletion(&self) -> Result> { + let now = Timestamp::now_utc(); + let accounts = self.accounts.lock().await; + + Ok(accounts + .values() + .filter(|account| { + if let Some(DeletionInfo::Scheduled { after }) = &account.deletion { + after <= &now + } else { + false + } + }) + .cloned() + .collect()) + } + + // Save account + async fn save_account(&self, account: &Account) -> Result<()> { + let mut accounts = self.accounts.lock().await; + accounts.insert(account.id.to_string(), account.clone()); + Ok(()) + } +} diff --git a/crates/core/database/src/models/accounts/rocket.rs b/crates/core/database/src/models/accounts/rocket.rs new file mode 100644 index 000000000..a78ddde7e --- /dev/null +++ b/crates/core/database/src/models/accounts/rocket.rs @@ -0,0 +1,32 @@ +use crate::{Account, Database, Session}; +use revolt_result::Error; +use rocket::{ + http::Status, + request::{FromRequest, Outcome}, + Request, +}; + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for Account { + type Error = Error; + + async fn from_request(request: &'r Request<'_>) -> Outcome { + match request.guard::().await { + Outcome::Success(session) => { + if let Ok(account) = request + .rocket() + .state::() + .expect("`Database`") + .fetch_account(&session.user_id) + .await + { + Outcome::Success(account) + } else { + Outcome::Error((Status::InternalServerError, create_error!(InternalError))) + } + } + Outcome::Forward(_) => unreachable!(), + Outcome::Error(err) => Outcome::Error(err), + } + } +} diff --git a/crates/core/database/src/models/accounts/schema.rs b/crates/core/database/src/models/accounts/schema.rs new file mode 100644 index 000000000..a1d863ebd --- /dev/null +++ b/crates/core/database/src/models/accounts/schema.rs @@ -0,0 +1,32 @@ +use revolt_okapi::openapi3::{SecurityScheme, SecuritySchemeData}; +use revolt_rocket_okapi::{ + gen::OpenApiGenerator, + request::{OpenApiFromRequest, RequestHeaderInput}, +}; + +use crate::Account; + + +impl<'r> OpenApiFromRequest<'r> for Account { + fn from_request_input( + _gen: &mut OpenApiGenerator, + _name: String, + _required: bool, + ) -> revolt_rocket_okapi::Result { + let mut requirements = schemars::Map::new(); + requirements.insert("Session Token".to_owned(), vec![]); + + Ok(RequestHeaderInput::Security( + "Session Token".to_owned(), + SecurityScheme { + data: SecuritySchemeData::ApiKey { + name: "x-session-token".to_owned(), + location: "header".to_owned(), + }, + description: Some("Used to authenticate as a user.".to_owned()), + extensions: schemars::Map::new(), + }, + requirements, + )) + } +} \ No newline at end of file diff --git a/crates/core/database/src/models/admin_migrations/model.rs b/crates/core/database/src/models/admin_migrations/model.rs index 2c65c8116..5d113b1fa 100644 --- a/crates/core/database/src/models/admin_migrations/model.rs +++ b/crates/core/database/src/models/admin_migrations/model.rs @@ -11,7 +11,7 @@ auto_derived!( #[cfg(test)] mod tests { - #[async_std::test] + #[tokio::test] async fn migrate() { database_test!(|db| async move { // Initialise the database diff --git a/crates/core/database/src/models/admin_migrations/ops/mongodb/init.rs b/crates/core/database/src/models/admin_migrations/ops/mongodb/init.rs index 4a422cbba..c3bfc5a8f 100644 --- a/crates/core/database/src/models/admin_migrations/ops/mongodb/init.rs +++ b/crates/core/database/src/models/admin_migrations/ops/mongodb/init.rs @@ -98,6 +98,18 @@ pub async fn create_database(db: &MongoDb) { .await .expect("Failed to create pubsub collection."); + db.create_collection("sessions") + .await + .expect("Failed to create sessions collection."); + + db.create_collection("account_invites") + .await + .expect("Failed to create account_invites collection."); + + db.create_collection("mfa_tickets") + .await + .expect("Failed to create mfa_tickets collection."); + db.run_command(doc! { "createIndexes": "users", "indexes": [ @@ -263,5 +275,89 @@ pub async fn create_database(db: &MongoDb) { .await .expect("Failed to create ratelimit_events index."); + db.run_command(doc! { + "createIndexes": "accounts", + "indexes": [ + { + "key": { + "email": 1 + }, + "name": "email", + "unique": true, + "collation": { + "locale": "en", + "strength": 2 + } + }, + { + "key": { + "email_normalised": 1 + }, + "name": "email_normalised", + "unique": true, + "collation": { + "locale": "en", + "strength": 2 + } + }, + { + "key": { + "verification.token": 1 + }, + "name": "email_verification" + }, + { + "key": { + "password_reset.token": 1 + }, + "name": "password_reset" + }, + { + "key": { + "deletion.token": 1 + }, + "name": "account_deletion" + } + ] + }) + .await + .unwrap(); + + db.run_command(doc! { + "createIndexes": "sessions", + "indexes": [ + { + "key": { + "token": 1 + }, + "name": "token", + "unique": true + }, + { + "key": { + "user_id": 1 + }, + "name": "user_id" + } + ] + }) + .await + .unwrap(); + + db.run_command(doc! { + "createIndexes": "mfa_tickets", + "indexes": [ + { + "key": { + "token": 1 + }, + "name": "token", + "unique": true + } + ] + }) + .await + .unwrap(); + info!("Created database."); } diff --git a/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs b/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs index d164cab10..ab3053f5a 100644 --- a/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs +++ b/crates/core/database/src/models/admin_migrations/ops/mongodb/scripts.rs @@ -9,15 +9,15 @@ use crate::{ bson::{doc, from_bson, from_document, to_document, Bson, DateTime, Document}, options::FindOptions, }, - AbstractChannels, AbstractServers, Channel, Invite, MongoDb, User, DISCRIMINATOR_SEARCH_SPACE, + AbstractServers, Invite, MongoDb, User, DISCRIMINATOR_SEARCH_SPACE, }; use bson::{oid::ObjectId, to_bson}; use futures::StreamExt; use iso8601_timestamp::Timestamp; use rand::seq::SliceRandom; -use revolt_permissions::DEFAULT_WEBHOOK_PERMISSIONS; -use revolt_result::{Error, ErrorType}; +use revolt_permissions::{ChannelPermission, DEFAULT_WEBHOOK_PERMISSIONS}; use serde::{Deserialize, Serialize}; +use ulid::Ulid; use unicode_segmentation::UnicodeSegmentation; #[derive(Serialize, Deserialize)] @@ -26,7 +26,7 @@ struct MigrationInfo { revision: i32, } -pub const LATEST_REVISION: i32 = 42; // MUST BE +1 to last migration +pub const LATEST_REVISION: i32 = 51; // MUST BE +1 to last migration pub async fn migrate_database(db: &MongoDb) { let migrations = db.col::("migrations"); @@ -452,7 +452,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { warn!("This is a destructive operation and will wipe existing permission data (excl. defaults for SendMessage)."); warn!("Taking a backup is advised."); warn!("Continuing in 10 seconds..."); - async_std::task::sleep(Duration::from_secs(10)).await; + tokio::time::sleep(Duration::from_secs(10)).await; let servers = db.col::("servers"); let mut cursor = servers.find(doc! {}).await.unwrap(); @@ -574,20 +574,145 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { if revision <= 15 { info!("Running migration [revision 15 / 04-06-2022]: Migrate Authifier to latest version."); - let db = authifier::Database::MongoDb(authifier::database::MongoDb(db.db())); - db.run_migration(authifier::Migration::M2022_06_03EnsureUpToSpec) + if !db + .db() + .collection::("mfa_tickets") + .list_index_names() .await - .unwrap(); + .unwrap_or_default() + .contains(&"token".to_owned()) + { + // Make sure all collections exist + let list = db.db().list_collection_names().await.unwrap(); + let collections = ["accounts", "sessions", "invites", "mfa_tickets"]; + + for name in collections { + if !list.contains(&name.to_string()) { + db.db().create_collection(name).await.unwrap(); + } + } + + // Setup index for `accounts` + let col = db.db().collection::("accounts"); + col.drop_indexes().await.unwrap(); + + db.db() + .run_command(doc! { + "createIndexes": "accounts", + "indexes": [ + { + "key": { + "email": 1 + }, + "name": "email", + "unique": true, + "collation": { + "locale": "en", + "strength": 2 + } + }, + { + "key": { + "email_normalised": 1 + }, + "name": "email_normalised", + "unique": true, + "collation": { + "locale": "en", + "strength": 2 + } + }, + { + "key": { + "verification.token": 1 + }, + "name": "email_verification" + }, + { + "key": { + "password_reset.token": 1 + }, + "name": "password_reset" + } + ] + }) + .await + .unwrap(); + + // Setup index for `sessions` + let col = db.db().collection::("sessions"); + col.drop_indexes().await.unwrap(); + + db.db() + .run_command(doc! { + "createIndexes": "sessions", + "indexes": [ + { + "key": { + "token": 1 + }, + "name": "token", + "unique": true + }, + { + "key": { + "user_id": 1 + }, + "name": "user_id" + } + ] + }) + .await + .unwrap(); + + // Setup index for `mfa_tickets` + let col = db.db().collection::("mfa_tickets"); + col.drop_indexes().await.unwrap(); + + db.db() + .run_command(doc! { + "createIndexes": "mfa_tickets", + "indexes": [ + { + "key": { + "token": 1 + }, + "name": "token", + "unique": true + } + ] + }) + .await + .unwrap(); + } } if revision <= 16 { info!("Running migration [revision 16 / 07-07-2022]: Add `emojis` collection and Authifier migration."); - let authifier_db = authifier::Database::MongoDb(authifier::database::MongoDb(db.db())); - authifier_db - .run_migration(authifier::Migration::M2022_06_09AddIndexForDeletion) + if !db + .db() + .collection::("accounts") + .list_index_names() .await - .unwrap(); + .expect("list of index names") + .contains(&"account_deletion".to_owned()) + { + db.db() + .run_command(doc! { + "createIndexes": "accounts", + "indexes": [ + { + "key": { + "deletion.token": 1 + }, + "name": "account_deletion" + } + ] + }) + .await + .unwrap(); + } db.db() .create_collection("emojis") @@ -914,6 +1039,7 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } if revision <= 26 { + // Need to migrate fields on attachments, change `user_id`, `object_id`, etc to `parent`. info!("Running migration [revision 26 / 15-05-2024]: fix invites being incorrectly serialized with wrong enum tagging."); auto_derived!( @@ -1080,6 +1206,14 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { channel_id: String, } + #[allow(clippy::enum_variant_names)] + #[derive(serde::Serialize, serde::Deserialize)] + enum Channel { + Group { owner: String }, + TextChannel { server: String }, + VoiceChannel { server: String }, + } + let webhooks = db .db() .collection::("channel_webhooks") @@ -1091,8 +1225,13 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .await; for webhook in webhooks { - match db.fetch_channel(&webhook.channel_id).await { - Ok(channel) => { + match db + .col::("channels") + .find_one(doc! { "_id": &webhook.channel_id }) + .await + .unwrap() + { + Some(channel) => { let creator_id = match channel { Channel::Group { owner, .. } => owner, Channel::TextChannel { server, .. } @@ -1100,7 +1239,6 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { let server = db.fetch_server(&server).await.expect("server"); server.owner } - _ => unreachable!("not server or group channel!"), }; db.db() @@ -1118,17 +1256,13 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .await .expect("update webhook"); } - Err(Error { - error_type: ErrorType::NotFound, - .. - }) => { + None => { db.db() .collection::("channel_webhooks") .delete_one(doc! { "_id": webhook._id }) .await .expect("failed to delete invalid webhook"); } - Err(err) => panic!("{err:?}"), } } } @@ -1138,10 +1272,51 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { "Running migration [revision 32 / 12-05-2025]: (Authifier) Add last_seen to sessions." ); - let db = authifier::Database::MongoDb(authifier::database::MongoDb(db.db())); - db.run_migration(authifier::Migration::M2025_02_20AddLastSeenToSession) - .await - .unwrap(); + loop { + #[derive(Deserialize)] + struct SessionId { + _id: String, + } + + let sessions: Vec = db + .db() + .collection("sessions") + .find(doc! { + "$or": [ + { "last_seen": { "$exists": false } }, + { "last_seen": "1970-01-01T00:00:00.000Z" } + ] + }) + .limit(50_000) // about 400 batches for 2 million + .await + .expect("Failed to create cursor for sessions!") + .map(|doc| doc.expect("id and username")) + .collect() + .await; + + if sessions.is_empty() { + break; + } + + for session in sessions { + let timestamp = iso8601_timestamp::Timestamp::from(Ulid::from_string(&session._id).unwrap().datetime()); + + db.db() + .collection::("sessions") + .update_one( + doc! { + "_id": &session._id.to_string(), + }, + doc! { + "$set": { + "last_seen": timestamp.format().to_string() + } + }, + ) + .await + .expect("Failed to update a session."); + } + } } if revision <= 40 { @@ -1169,9 +1344,9 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { .expect("failed to update users"); } - if revision <= 41 { + if revision <= 43 { info!( - "Running migration [revision 41 / 05-06-2025]: convert role ranks to uniform numbers." + "Running migration [revision 43 / 05-06-2025]: convert role ranks to uniform numbers." ); #[derive(Serialize, Deserialize, Clone)] @@ -1226,6 +1401,95 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 { } } + if revision <= 46 { + info!("Running migration [revision 46 / 29-04-2025]: Convert all `VoiceChannel`'s into `TextChannel`"); + + db.col::("channels") + .update_many( + doc! { "channel_type": "VoiceChannel" }, + doc! { + "$set": { + "channel_type": "TextChannel", + "voice": {} + } + }, + ) + .await + .expect("Failed to update voice channels"); + }; + + if revision <= 48 { + info!("Running migration [revision 48 / 22-10-2025]: Add Video + Listen to default permissions"); + + db.col::("servers") + .update_many( + doc! { }, + doc! { + "$bit": { + "default_permissions": { + "or": (ChannelPermission::Video + ChannelPermission::Speak + ChannelPermission::Listen) as i64 + }, + } + } + ) + .await + .expect("Failed to update default_permissions"); + }; + + if revision <= 49 { + info!("Running migration [revision 49 / 12-12-2025]: Add _id key to roles"); + + #[derive(Serialize, Deserialize, Clone)] + struct Server { + #[serde(rename = "_id")] + pub id: String, + #[serde(default = "HashMap::::new")] + pub roles: HashMap, + } + + let mut servers = db + .db() + .collection::("servers") + .find(doc! { + "roles": { + "$exists": true, + "$ne": {} + } + }) + .await + .unwrap() + .map(|res| res.expect("Failed to decode Server { id, roles }")); + + while let Some(server) = servers.next().await { + let mut doc = doc! {}; + + for id in server.roles.keys() { + doc.insert(format!("roles.{id}._id"), id); + } + + db.db() + .collection::("servers") + .update_one(doc! { "_id": &server.id }, doc! { "$set": doc }) + .await + .unwrap(); + } + }; + + if revision <= 50 { + info!("Running migration [revision 50 / 13-04-2026]: Rename invites collection to account_invites"); + + db.db() + .client() + .database("admin") + .run_command(doc! { + "renameCollection": "revolt.invites", + "to": "revolt.account_invites", + "dropTarget": true + }) + .await + .unwrap(); + } + // Reminder to update LATEST_REVISION when adding new migrations. LATEST_REVISION.max(revision) } diff --git a/crates/core/database/src/models/bots/model.rs b/crates/core/database/src/models/bots/model.rs index 24c56bb1b..8d7a8d3df 100644 --- a/crates/core/database/src/models/bots/model.rs +++ b/crates/core/database/src/models/bots/model.rs @@ -164,7 +164,7 @@ impl Bot { mod tests { use crate::{Bot, FieldsBot, PartialBot, User}; - #[async_std::test] + #[tokio::test] async fn crud() { database_test!(|db| async move { let owner = User::create(&db, "Owner".to_string(), None, None) diff --git a/crates/core/database/src/models/channel_invites/model.rs b/crates/core/database/src/models/channel_invites/model.rs index e3af921ab..a5d877fee 100644 --- a/crates/core/database/src/models/channel_invites/model.rs +++ b/crates/core/database/src/models/channel_invites/model.rs @@ -69,7 +69,7 @@ impl Invite { creator: creator.id.clone(), channel: id.clone(), }), - Channel::TextChannel { id, server, .. } | Channel::VoiceChannel { id, server, .. } => { + Channel::TextChannel { id, server, .. } => { Ok(Invite::Server { code, creator: creator.id.clone(), diff --git a/crates/core/database/src/models/channel_webhooks/model.rs b/crates/core/database/src/models/channel_webhooks/model.rs index cdf94db43..c13895528 100644 --- a/crates/core/database/src/models/channel_webhooks/model.rs +++ b/crates/core/database/src/models/channel_webhooks/model.rs @@ -128,7 +128,7 @@ impl Webhook { mod tests { use crate::{FieldsWebhook, PartialWebhook, Webhook}; - #[async_std::test] + #[tokio::test] async fn crud() { database_test!(|db| async move { let webhook_id = "webhook"; diff --git a/crates/core/database/src/models/channels/model.rs b/crates/core/database/src/models/channels/model.rs index 673e5e508..9712f5aae 100644 --- a/crates/core/database/src/models/channels/model.rs +++ b/crates/core/database/src/models/channels/model.rs @@ -1,5 +1,7 @@ -use std::collections::HashMap; +#![allow(deprecated)] +use std::{borrow::Cow, collections::HashMap}; +use redis_kiss::get_connection; use revolt_config::config; use revolt_models::v0::{self, MessageAuthor}; use revolt_permissions::OverrideField; @@ -8,8 +10,7 @@ use serde::{Deserialize, Serialize}; use ulid::Ulid; use crate::{ - events::client::EventV1, Database, File, PartialServer, - Server, SystemMessage, User, AMQP, + events::client::EventV1, Database, File, PartialServer, Server, SystemMessage, User, AMQP, }; #[cfg(feature = "mongodb")] @@ -106,39 +107,23 @@ auto_derived!( /// Whether this channel is marked as not safe for work #[serde(skip_serializing_if = "crate::if_false", default)] nsfw: bool, - }, - /// Voice channel belonging to a server - VoiceChannel { - /// Unique Id - #[serde(rename = "_id")] - id: String, - /// Id of the server this channel belongs to - server: String, - /// Display name of the channel - name: String, - #[serde(skip_serializing_if = "Option::is_none")] - /// Channel description - description: Option, - /// Custom icon attachment + /// Voice Information for when this channel is also a voice channel #[serde(skip_serializing_if = "Option::is_none")] - icon: Option, + voice: Option, - /// Default permissions assigned to users in this channel + /// The channel's slowmode delay in seconds #[serde(skip_serializing_if = "Option::is_none")] - default_permissions: Option, - /// Permissions assigned based on role to this channel - #[serde( - default = "HashMap::::new", - skip_serializing_if = "HashMap::::is_empty" - )] - role_permissions: HashMap, - - /// Whether this channel is marked as not safe for work - #[serde(skip_serializing_if = "crate::if_false", default)] - nsfw: bool, + slowmode: Option, }, } + + #[derive(Default)] + pub struct VoiceInformation { + /// Maximium amount of users allowed in the voice channel at once + #[serde(skip_serializing_if = "Option::is_none")] + pub max_users: Option, + } ); auto_derived!( @@ -164,6 +149,10 @@ auto_derived!( pub default_permissions: Option, #[serde(skip_serializing_if = "Option::is_none")] pub last_message_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub voice: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub slowmode: Option, } /// Optional fields on channel object @@ -171,6 +160,7 @@ auto_derived!( Description, Icon, DefaultPermissions, + Voice, } ); @@ -222,16 +212,21 @@ impl Channel { default_permissions: None, role_permissions: HashMap::new(), nsfw: data.nsfw.unwrap_or(false), + voice: data.voice.map(|voice| voice.into()), + slowmode: None, }, - v0::LegacyServerChannelType::Voice => Channel::VoiceChannel { + v0::LegacyServerChannelType::Voice => Channel::TextChannel { id: id.clone(), server: server.id.to_owned(), name: data.name, description: data.description, icon: None, + last_message_id: None, default_permissions: None, role_permissions: HashMap::new(), nsfw: data.nsfw.unwrap_or(false), + voice: Some(data.voice.unwrap_or_default().into()), + slowmode: None, }, }; @@ -413,7 +408,10 @@ impl Channel { /// Check whether has a user as a recipient pub fn contains_user(&self, user_id: &str) -> bool { match self { - Channel::Group { recipients, .. } => recipients.contains(&String::from(user_id)), + Channel::Group { recipients, .. } | Channel::DirectMessage { recipients, .. } => { + recipients.iter().any(|recipient| recipient == user_id) + } + Channel::SavedMessages { user, .. } => user == user_id, _ => false, } } @@ -421,7 +419,9 @@ impl Channel { /// Get list of recipients pub fn users(&self) -> Result> { match self { - Channel::Group { recipients, .. } => Ok(recipients.to_owned()), + Channel::Group { recipients, .. } | Channel::DirectMessage { recipients, .. } => { + Ok(recipients.to_owned()) + } _ => Err(create_error!(NotFound)), } } @@ -432,8 +432,28 @@ impl Channel { Channel::DirectMessage { id, .. } | Channel::Group { id, .. } | Channel::SavedMessages { id, .. } - | Channel::TextChannel { id, .. } - | Channel::VoiceChannel { id, .. } => id, + | Channel::TextChannel { id, .. } => id, + } + } + + /// Clone this channel's server id + pub fn server(&self) -> Option<&str> { + match self { + Channel::TextChannel { server, .. } => Some(server), + _ => None, + } + } + + /// Gets this channel's voice information + pub fn voice(&self) -> Option> { + match self { + Self::DirectMessage { .. } | Self::Group { .. } => { + Some(Cow::Owned(VoiceInformation::default())) + } + Self::TextChannel { + voice: Some(voice), .. + } => Some(Cow::Borrowed(voice)), + _ => None, } } @@ -450,12 +470,6 @@ impl Channel { server, role_permissions, .. - } - | Channel::VoiceChannel { - id, - server, - role_permissions, - .. } => { db.set_channel_role_permission(id, role_id, permissions) .await?; @@ -502,7 +516,7 @@ impl Channel { clear: remove.into_iter().map(|v| v.into()).collect(), } .p(match self { - Self::TextChannel { server, .. } | Self::VoiceChannel { server, .. } => server.clone(), + Self::TextChannel { server, .. } => server.clone(), _ => id, }) .await; @@ -514,17 +528,13 @@ impl Channel { pub fn remove_field(&mut self, field: &FieldsChannel) { match field { FieldsChannel::Description => match self { - Self::Group { description, .. } - | Self::TextChannel { description, .. } - | Self::VoiceChannel { description, .. } => { + Self::Group { description, .. } | Self::TextChannel { description, .. } => { description.take(); } _ => {} }, FieldsChannel::Icon => match self { - Self::Group { icon, .. } - | Self::TextChannel { icon, .. } - | Self::VoiceChannel { icon, .. } => { + Self::Group { icon, .. } | Self::TextChannel { icon, .. } => { icon.take(); } _ => {} @@ -533,15 +543,17 @@ impl Channel { Self::TextChannel { default_permissions, .. - } - | Self::VoiceChannel { - default_permissions, - .. } => { default_permissions.take(); } _ => {} }, + FieldsChannel::Voice => match self { + Self::TextChannel { voice, .. } => { + voice.take(); + } + _ => {} + }, } } @@ -553,6 +565,7 @@ impl Channel { } /// Apply partial channel to channel + #[allow(deprecated)] pub fn apply_options(&mut self, partial: PartialChannel) { match self { Self::SavedMessages { .. } => {} @@ -601,15 +614,7 @@ impl Channel { nsfw, default_permissions, role_permissions, - .. - } - | Self::VoiceChannel { - name, - description, - icon, - nsfw, - default_permissions, - role_permissions, + voice, .. } => { if let Some(v) = partial.name { @@ -635,12 +640,16 @@ impl Channel { if let Some(v) = partial.default_permissions { default_permissions.replace(v); } + + if let Some(v) = partial.voice { + voice.replace(v); + } } } } /// Acknowledge a message - pub async fn ack(&self, user: &str, message: &str) -> Result<()> { + pub async fn ack(&self, user: &str, message: &str, amqp: &AMQP) -> Result<()> { EventV1::ChannelAck { id: self.id().to_string(), user: user.to_string(), @@ -649,17 +658,7 @@ impl Channel { .private(user.to_string()) .await; - #[cfg(feature = "tasks")] - crate::tasks::ack::queue_ack( - self.id().to_string(), - user.to_string(), - crate::tasks::ack::AckEvent::AckMessage { - id: message.to_string(), - }, - ) - .await; - - Ok(()) + crate::util::acker::ack_channel(user, self.id(), message, amqp).await } /// Remove user from a group @@ -777,6 +776,7 @@ impl IntoDocumentPath for FieldsChannel { FieldsChannel::Description => "description", FieldsChannel::Icon => "icon", FieldsChannel::DefaultPermissions => "default_permissions", + FieldsChannel::Voice => "voice", }) } } @@ -787,7 +787,7 @@ mod tests { use crate::{fixture, util::permissions::DatabasePermissionQuery}; - #[async_std::test] + #[tokio::test] async fn permissions_group_channel() { database_test!(|db| async move { fixture!(db, "group_with_members", @@ -813,7 +813,7 @@ mod tests { }); } - #[async_std::test] + #[tokio::test] async fn permissions_text_channel() { database_test!(|db| async move { fixture!(db, "server_with_roles", diff --git a/crates/core/database/src/models/channels/ops.rs b/crates/core/database/src/models/channels/ops.rs index 3ee90d543..ddd29b869 100644 --- a/crates/core/database/src/models/channels/ops.rs +++ b/crates/core/database/src/models/channels/ops.rs @@ -1,4 +1,4 @@ -use crate::{revolt_result::Result, Channel, FieldsChannel, PartialChannel}; +use crate::{Channel, FieldsChannel, PartialChannel, revolt_result::Result, util::ChunkedDatabaseGenerator}; use revolt_permissions::OverrideField; #[cfg(feature = "mongodb")] @@ -19,6 +19,9 @@ pub trait AbstractChannels: Sync + Send { /// Fetch all direct messages for a user async fn find_direct_messages(&self, user_id: &str) -> Result>; + // Fetch all group dms for a user + async fn find_group_message_channels(&self, user_id: &str) -> Result>; + // Fetch saved messages channel async fn find_saved_messages_channel(&self, user_id: &str) -> Result; @@ -47,6 +50,9 @@ pub trait AbstractChannels: Sync + Send { // Remove a user from a group async fn remove_user_from_group(&self, channel_id: &str, user_id: &str) -> Result<()>; + // Remove a user from all specified groups + async fn remove_user_from_groups(&self, channel_ids: Vec, user_id: &str) -> Result<()>; + // Delete a channel async fn delete_channel(&self, channel_id: &Channel) -> Result<()>; } diff --git a/crates/core/database/src/models/channels/ops/mongodb.rs b/crates/core/database/src/models/channels/ops/mongodb.rs index b247a6834..8986e58aa 100644 --- a/crates/core/database/src/models/channels/ops/mongodb.rs +++ b/crates/core/database/src/models/channels/ops/mongodb.rs @@ -1,7 +1,8 @@ use super::AbstractChannels; -use crate::{AbstractServers, Channel, FieldsChannel, IntoDocumentPath, MongoDb, PartialChannel}; +use crate::{AbstractServers, Channel, FieldsChannel, IntoDocumentPath, MongoDb, PartialChannel, util::ChunkedDatabaseGenerator}; use bson::{Bson, Document}; use futures::StreamExt; +use mongodb::options::ReadConcern; use revolt_permissions::OverrideField; use revolt_result::Result; @@ -69,6 +70,32 @@ impl AbstractChannels for MongoDb { ) } + // Fetch all group dms for a user + async fn find_group_message_channels(&self, user_id: &str) -> Result> { + let mut session = self + .start_session() + .await + .map_err(|_| create_database_error!("start_session", COL))?; + + session + .start_transaction() + .read_concern(ReadConcern::snapshot()) + .await + .map_err(|_| create_database_error!("start_transaction", COL))?; + + let cursor = self.col(COL) + .find(doc! { + "channel_type": "Group", + "recipients": user_id + }) + .session(&mut session) + .batch_size(100) + .await + .map_err(|_| create_database_error!("find", COL))?; + + Ok(ChunkedDatabaseGenerator::new_mongo(session, cursor)) + } + // Fetch saved messages channel async fn find_saved_messages_channel(&self, user_id: &str) -> Result { query!( @@ -180,13 +207,29 @@ impl AbstractChannels for MongoDb { .map_err(|_| create_database_error!("update_one", "channels")) } + // Remove a user from all specified groups + async fn remove_user_from_groups(&self, channel_ids: Vec, user_id: &str) -> Result<()> { + self.col::(COL) + .update_many( + doc! { + "_id": { "$in": channel_ids }, + }, + doc! { + "$pull": { + "recipients": user_id + } + }, + ) + .await + .map(|_| ()) + .map_err(|_| create_database_error!("update_many", COL)) + } + // Delete a channel async fn delete_channel(&self, channel: &Channel) -> Result<()> { let id = channel.id().to_string(); let server_id = match channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { - Some(server) - } + Channel::TextChannel { server, .. } => Some(server), _ => None, }; diff --git a/crates/core/database/src/models/channels/ops/reference.rs b/crates/core/database/src/models/channels/ops/reference.rs index 7d5c9a59f..3bbd858a0 100644 --- a/crates/core/database/src/models/channels/ops/reference.rs +++ b/crates/core/database/src/models/channels/ops/reference.rs @@ -2,6 +2,7 @@ use std::collections::hash_map::Entry; use super::AbstractChannels; use crate::ReferenceDb; +use crate::util::ChunkedDatabaseGenerator; use crate::{Channel, FieldsChannel, PartialChannel}; use revolt_permissions::OverrideField; use revolt_result::Result; @@ -51,6 +52,23 @@ impl AbstractChannels for ReferenceDb { .collect()) } + // Fetch all group dms for a user + async fn find_group_message_channels(&self, user_id: &str) -> Result> { + let channels = self.channels.lock().await; + let groups = channels + .values() + .filter(|channel| match channel { + Channel::Group { recipients, .. } => { + recipients.iter().any(|recipient| recipient == user_id) + } + _ => false, + }) + .cloned() + .collect(); + + Ok(ChunkedDatabaseGenerator::new_reference(groups)) + } + // Fetch saved messages channel async fn find_saved_messages_channel(&self, user_id: &str) -> Result { let channels = self.channels.lock().await; @@ -94,9 +112,6 @@ impl AbstractChannels for ReferenceDb { match &mut channel { Channel::TextChannel { role_permissions, .. - } - | Channel::VoiceChannel { - role_permissions, .. } => { if role_permissions.get(role_id).is_some() { role_permissions.remove(role_id); @@ -134,9 +149,9 @@ impl AbstractChannels for ReferenceDb { // Remove a user from a group async fn remove_user_from_group(&self, channel: &str, user: &str) -> Result<()> { let mut channels = self.channels.lock().await; - if let Some(channel_data) = channels.get_mut(channel) { - if channel_data.users()?.contains(&String::from(user)) { - channel_data.users()?.retain(|x| x != user); + if let Some(Channel::Group { recipients, .. }) = channels.get_mut(channel) { + if let Some(index) = recipients.iter().position(|recipient| recipient == user) { + recipients.remove(index); return Ok(()); } else { return Err(create_error!(NotFound)); @@ -145,6 +160,19 @@ impl AbstractChannels for ReferenceDb { Err(create_error!(NotFound)) } + // Remove a user from all specified groups + async fn remove_user_from_groups(&self, channel_ids: Vec, user_id: &str) -> Result<()> { + let mut channels = self.channels.lock().await; + + for channel_id in channel_ids { + if let Some(Channel::Group { recipients, .. }) = channels.get_mut(&channel_id) { + recipients.retain(|recipient| recipient != user_id); + } + }; + + Ok(()) + } + // Delete a channel async fn delete_channel(&self, channel: &Channel) -> Result<()> { let mut channels = self.channels.lock().await; diff --git a/crates/core/database/src/models/emojis/model.rs b/crates/core/database/src/models/emojis/model.rs index 8294d7c72..55d13e8c3 100644 --- a/crates/core/database/src/models/emojis/model.rs +++ b/crates/core/database/src/models/emojis/model.rs @@ -2,6 +2,7 @@ use std::collections::HashSet; use std::str::FromStr; use once_cell::sync::Lazy; +use revolt_models::v0; use revolt_result::Result; use ulid::Ulid; @@ -11,7 +12,7 @@ use crate::Database; static PERMISSIBLE_EMOJIS: Lazy> = Lazy::new(|| { include_str!("unicode_emoji.txt") .split('\n') - .map(|x| x.into()) + .map(|x| x.replace('\u{FE0F}', "")) .collect() }); @@ -41,6 +42,12 @@ auto_derived!( Server { id: String }, Detached, } + + /// Partial representation of an emoji + pub struct PartialEmoji { + #[serde(skip_serializing_if = "Option::is_none")] + pub name: Option, + } ); #[allow(clippy::disallowed_methods)] @@ -75,13 +82,34 @@ impl Emoji { db.detach_emoji(&self).await } + /// Update an emoji + pub async fn update(&mut self, db: &Database, partial: PartialEmoji) -> Result<()> { + if let Some(name) = partial.name.clone() { + self.name = name; + } + + db.update_emoji(&self.id, &partial).await?; + + EventV1::EmojiUpdate { + id: self.id.clone(), + data: v0::PartialEmoji { + name: partial.name.clone(), + }, + } + .p(self.parent().to_string()) + .await; + + Ok(()) + } + /// Check whether we can use a given emoji pub async fn can_use(db: &Database, emoji: &str) -> Result { if Ulid::from_str(emoji).is_ok() { db.fetch_emoji(emoji).await?; Ok(true) } else { - Ok(PERMISSIBLE_EMOJIS.contains(emoji)) + let sanitized_emoji = emoji.replace('\u{FE0F}', ""); + Ok(PERMISSIBLE_EMOJIS.contains(&sanitized_emoji)) } } } diff --git a/crates/core/database/src/models/emojis/ops.rs b/crates/core/database/src/models/emojis/ops.rs index 26e23acaf..d28f30d4e 100644 --- a/crates/core/database/src/models/emojis/ops.rs +++ b/crates/core/database/src/models/emojis/ops.rs @@ -1,6 +1,6 @@ use revolt_result::Result; -use crate::Emoji; +use crate::{Emoji, PartialEmoji}; #[cfg(feature = "mongodb")] mod mongodb; @@ -20,6 +20,9 @@ pub trait AbstractEmojis: Sync + Send { /// Fetch emoji by their parent ids async fn fetch_emoji_by_parent_ids(&self, parent_ids: &[String]) -> Result>; + /// Update emoji with new information + async fn update_emoji(&self, emoji_id: &str, partial: &PartialEmoji) -> Result<()>; + /// Detach an emoji by its id async fn detach_emoji(&self, emoji: &Emoji) -> Result<()>; } diff --git a/crates/core/database/src/models/emojis/ops/mongodb.rs b/crates/core/database/src/models/emojis/ops/mongodb.rs index 6dd3137b7..ad7b557ca 100644 --- a/crates/core/database/src/models/emojis/ops/mongodb.rs +++ b/crates/core/database/src/models/emojis/ops/mongodb.rs @@ -1,7 +1,7 @@ use bson::Document; use revolt_result::Result; -use crate::Emoji; +use crate::{Emoji, PartialEmoji}; use crate::MongoDb; use super::AbstractEmojis; @@ -46,6 +46,11 @@ impl AbstractEmojis for MongoDb { ) } + /// Update emoji with new information + async fn update_emoji(&self, emoji_id: &str, partial: &PartialEmoji) -> Result<()> { + query!(self, update_one_by_id, COL, emoji_id, partial, vec![], None).map(|_| ()) + } + /// Detach an emoji by its id async fn detach_emoji(&self, emoji: &Emoji) -> Result<()> { self.col::(COL) diff --git a/crates/core/database/src/models/emojis/ops/reference.rs b/crates/core/database/src/models/emojis/ops/reference.rs index 2f0c2a2df..2f9be4352 100644 --- a/crates/core/database/src/models/emojis/ops/reference.rs +++ b/crates/core/database/src/models/emojis/ops/reference.rs @@ -1,6 +1,6 @@ use revolt_result::Result; -use crate::Emoji; +use crate::{Emoji, PartialEmoji}; use crate::EmojiParent; use crate::ReferenceDb; @@ -54,6 +54,19 @@ impl AbstractEmojis for ReferenceDb { .collect()) } + /// Update emoji with new information + async fn update_emoji(&self, emoji_id: &str, partial: &PartialEmoji) -> Result<()> { + let mut emojis = self.emojis.lock().await; + if let Some(emoji) = emojis.get_mut(emoji_id) { + if let Some(name) = partial.name.clone() { + emoji.name = name; + } + Ok(()) + } else { + Err(create_error!(NotFound)) + } + } + /// Detach an emoji by its id async fn detach_emoji(&self, emoji: &Emoji) -> Result<()> { let mut emojis = self.emojis.lock().await; diff --git a/crates/core/database/src/models/emojis/unicode_emoji.txt b/crates/core/database/src/models/emojis/unicode_emoji.txt index bc8036e38..1b08dbe0b 100644 --- a/crates/core/database/src/models/emojis/unicode_emoji.txt +++ b/crates/core/database/src/models/emojis/unicode_emoji.txt @@ -1,1590 +1,247 @@ -💯 -🔢 -😀 -😃 -😄 -😁 -😆 -😆 -😅 -🤣 -😂 -🙂 -🙃 -😉 -😊 -😇 -🥰 -😍 -🤩 -😘 -😗 -☺️ -😚 -😙 -🥲 -😋 -😛 -😜 -🤪 -😝 -🤑 -🤗 -🤭 -🤫 -🤔 -🤐 -🤨 -😐 -😑 -😶 -😏 -😒 -🙄 -😬 -🤥 -😌 -😔 -😪 -🤤 -😴 -😷 -🤒 -🤕 -🤢 -🤮 -🤧 -🥵 -🥶 -🥴 -😵 -🤯 -🤠 -🥳 -🥸 -😎 -🤓 -🧐 -😕 -😟 -🙁 -☹️ -😮 -😯 -😲 -😳 -🥺 -😦 -😧 -😨 -😰 -😥 -😢 -😭 -😱 -😖 -😣 -😞 -😓 -😩 -😫 -🥱 -😤 -😡 -😡 -😠 -🤬 -😈 -👿 -💀 -☠️ -💩 -💩 -💩 -🤡 -👹 -👺 -👻 -👽 -👾 -🤖 -😺 -😸 -😹 -😻 -😼 -😽 -🙀 -😿 -😾 -🙈 -🙉 -🙊 -💋 -💌 -💘 -💝 -💖 -💗 -💓 -💞 -💕 -💟 -❣️ -💔 -❤️ -🧡 -💛 -💚 -💙 -💜 -🤎 -🖤 -🤍 -💢 -💥 -💥 -💫 -💦 -💨 -🕳️ -💣 -💬 -👁️‍🗨️ -🗨️ -🗯️ -💭 -💤 -👋 -🤚 -🖐️ -✋ -✋ -🖖 -👌 -🤌 -🤏 -✌️ -🤞 -🤟 -🤘 -🤙 -👈 -👉 -👆 -🖕 -🖕 -👇 +*️⃣ +0️⃣ +1️⃣ +2️⃣ +3️⃣ +4️⃣ +5️⃣ +6️⃣ +7️⃣ +8️⃣ +9️⃣ +©️ +®️ +‼️ +⁉️ +™️ +ℹ️ +↔️ +↕️ +↖️ +↗️ +↘️ +↙️ +↩️ +↪️ +⌚ +⌛ +⌨️ +⏏️ +⏩ +⏪ +⏫ +⏬ +⏭️ +⏮️ +⏯️ +⏰ +⏱️ +⏲️ +⏳ +⏸️ +⏹️ +⏺️ +Ⓜ️ +▪️ +▫️ +▶️ +◀️ +◻️ +◼️ +◽ +◾ +☀️ +☁️ +☂️ +☃️ +☄️ +☎️ +☑️ +☔ +☕ +☘️ ☝️ -👍 -👍 -👎 -👎 -✊ -✊ -👊 -👊 -👊 -🤛 -🤜 -👏 -🙌 -👐 -🤲 -🤝 -🙏 +☝🏻 +☝🏼 +☝🏽 +☝🏾 +☝🏿 +☠️ +☢️ +☣️ +☦️ +☪️ +☮️ +☯️ +☸️ +☹️ +☺️ +♀️ +♂️ +♈ +♉ +♊ +♋ +♌ +♍ +♎ +♏ +♐ +♑ +♒ +♓ +♟️ +♠️ +♣️ +♥️ +♦️ +♨️ +♻️ +♾️ +♿ +⚒️ +⚓ +⚔️ +⚕️ +⚖️ +⚗️ +⚙️ +⚛️ +⚜️ +⚠️ +⚡ +⚧️ +⚪ +⚫ +⚰️ +⚱️ +⚽ +⚾ +⛄ +⛅ +⛈️ +⛎ +⛏️ +⛑️ +⛓️ +⛓️‍💥 +⛔ +⛩️ +⛪ +⛰️ +⛱️ +⛲ +⛳ +⛴️ +⛵ +⛷️ +⛸️ +⛹️ +⛹️‍♀️ +⛹️‍♂️ +⛹🏻 +⛹🏻‍♀️ +⛹🏻‍♂️ +⛹🏼 +⛹🏼‍♀️ +⛹🏼‍♂️ +⛹🏽 +⛹🏽‍♀️ +⛹🏽‍♂️ +⛹🏾 +⛹🏾‍♀️ +⛹🏾‍♂️ +⛹🏿 +⛹🏿‍♀️ +⛹🏿‍♂️ +⛺ +⛽ +✂️ +✅ +✈️ +✉️ +✊ +✊🏻 +✊🏼 +✊🏽 +✊🏾 +✊🏿 +✋ +✋🏻 +✋🏼 +✋🏽 +✋🏾 +✋🏿 +✌️ +✌🏻 +✌🏼 +✌🏽 +✌🏾 +✌🏿 ✍️ -💅 -🤳 -💪 -🦾 -🦿 -🦵 -🦶 -👂 -🦻 -👃 -🧠 -🫀 -🫁 -🦷 -🦴 -👀 -👁️ -👅 -👄 -👶 -🧒 -👦 -👧 -🧑 -👱 -👨 -🧔 -👨‍🦰 -👨‍🦱 -👨‍🦳 -👨‍🦲 -👩 -👩‍🦰 -🧑‍🦰 -👩‍🦱 -🧑‍🦱 -👩‍🦳 -🧑‍🦳 -👩‍🦲 -🧑‍🦲 -👱‍♀️ -👱‍♀️ -👱‍♂️ -🧓 -👴 -👵 -🙍 -🙍‍♂️ -🙍‍♀️ -🙎 -🙎‍♂️ -🙎‍♀️ -🙅 -🙅‍♂️ -🙅‍♂️ -🙅‍♀️ -🙅‍♀️ -🙆 -🙆‍♂️ -🙆‍♀️ -💁 -💁 -💁‍♂️ -💁‍♂️ -💁‍♀️ -💁‍♀️ -🙋 -🙋‍♂️ -🙋‍♀️ -🧏 -🧏‍♂️ -🧏‍♀️ -🙇 -🙇‍♂️ -🙇‍♀️ -🤦 -🤦‍♂️ -🤦‍♀️ -🤷 -🤷‍♂️ -🤷‍♀️ -🧑‍⚕️ -👨‍⚕️ -👩‍⚕️ -🧑‍🎓 -👨‍🎓 -👩‍🎓 -🧑‍🏫 -👨‍🏫 -👩‍🏫 -🧑‍⚖️ -👨‍⚖️ -👩‍⚖️ -🧑‍🌾 -👨‍🌾 -👩‍🌾 -🧑‍🍳 -👨‍🍳 -👩‍🍳 -🧑‍🔧 -👨‍🔧 -👩‍🔧 -🧑‍🏭 -👨‍🏭 -👩‍🏭 -🧑‍💼 -👨‍💼 -👩‍💼 -🧑‍🔬 -👨‍🔬 -👩‍🔬 -🧑‍💻 -👨‍💻 -👩‍💻 -🧑‍🎤 -👨‍🎤 -👩‍🎤 -🧑‍🎨 -👨‍🎨 -👩‍🎨 -🧑‍✈️ -👨‍✈️ -👩‍✈️ -🧑‍🚀 -👨‍🚀 -👩‍🚀 -🧑‍🚒 -👨‍🚒 -👩‍🚒 -👮 -👮 -👮‍♂️ -👮‍♀️ -🕵️ -🕵️‍♂️ -🕵️‍♀️ -💂 -💂‍♂️ -💂‍♀️ -🥷 -👷 -👷‍♂️ -👷‍♀️ -🤴 -👸 -👳 -👳‍♂️ -👳‍♀️ -👲 -🧕 -🤵 -🤵‍♂️ -🤵‍♀️ -👰 -👰‍♂️ -👰‍♀️ -👰‍♀️ -🤰 -🤱 -👩‍🍼 -👨‍🍼 -🧑‍🍼 -👼 -🎅 -🤶 -🧑‍🎄 -🦸 -🦸‍♂️ -🦸‍♀️ -🦹 -🦹‍♂️ -🦹‍♀️ -🧙 -🧙‍♂️ -🧙‍♀️ -🧚 -🧚‍♂️ -🧚‍♀️ -🧛 -🧛‍♂️ -🧛‍♀️ -🧜 -🧜‍♂️ -🧜‍♀️ -🧝 -🧝‍♂️ -🧝‍♀️ -🧞 -🧞‍♂️ -🧞‍♀️ -🧟 -🧟‍♂️ -🧟‍♀️ -💆 -💆‍♂️ -💆‍♀️ -💇 -💇‍♂️ -💇‍♀️ -🚶 -🚶‍♂️ -🚶‍♀️ -🧍 -🧍‍♂️ -🧍‍♀️ -🧎 -🧎‍♂️ -🧎‍♀️ -🧑‍🦯 -👨‍🦯 -👩‍🦯 -🧑‍🦼 -👨‍🦼 -👩‍🦼 -🧑‍🦽 -👨‍🦽 -👩‍🦽 -🏃 -🏃 -🏃‍♂️ -🏃‍♀️ -💃 -💃 -🕺 -🕴️ -👯 -👯‍♂️ -👯‍♀️ -🧖 -🧖‍♂️ -🧖‍♀️ -🧗 -🧗‍♂️ -🧗‍♀️ -🤺 -🏇 -⛷️ -🏂 -🏌️ -🏌️‍♂️ -🏌️‍♀️ -🏄 -🏄‍♂️ -🏄‍♀️ -🚣 -🚣‍♂️ -🚣‍♀️ -🏊 -🏊‍♂️ -🏊‍♀️ -⛹️ -⛹️‍♂️ -⛹️‍♂️ -⛹️‍♀️ -⛹️‍♀️ -🏋️ -🏋️‍♂️ -🏋️‍♀️ -🚴 -🚴‍♂️ -🚴‍♀️ -🚵 -🚵‍♂️ -🚵‍♀️ -🤸 -🤸‍♂️ -🤸‍♀️ -🤼 -🤼‍♂️ -🤼‍♀️ -🤽 -🤽‍♂️ -🤽‍♀️ -🤾 -🤾‍♂️ -🤾‍♀️ -🤹 -🤹‍♂️ -🤹‍♀️ -🧘 -🧘‍♂️ -🧘‍♀️ -🛀 -🛌 -🧑‍🤝‍🧑 -👭 -👫 -👬 -💏 -👩‍❤️‍💋‍👨 -👨‍❤️‍💋‍👨 -👩‍❤️‍💋‍👩 -💑 -👩‍❤️‍👨 -👨‍❤️‍👨 -👩‍❤️‍👩 -👪 -👨‍👩‍👦 -👨‍👩‍👧 -👨‍👩‍👧‍👦 -👨‍👩‍👦‍👦 -👨‍👩‍👧‍👧 -👨‍👨‍👦 -👨‍👨‍👧 -👨‍👨‍👧‍👦 -👨‍👨‍👦‍👦 -👨‍👨‍👧‍👧 -👩‍👩‍👦 -👩‍👩‍👧 -👩‍👩‍👧‍👦 -👩‍👩‍👦‍👦 -👩‍👩‍👧‍👧 -👨‍👦 -👨‍👦‍👦 -👨‍👧 -👨‍👧‍👦 -👨‍👧‍👧 -👩‍👦 -👩‍👦‍👦 -👩‍👧 -👩‍👧‍👦 -👩‍👧‍👧 -🗣️ -👤 -👥 -🫂 -👣 -🐵 -🐒 -🦍 -🦧 -🐶 -🐕 -🦮 -🐕‍🦺 -🐩 -🐺 -🦊 -🦝 -🐱 -🐈 -🐈‍⬛ -🦁 -🐯 -🐅 -🐆 -🐴 -🐎 -🦄 -🦓 -🦌 -🦬 -🐮 -🐂 -🐃 -🐄 -🐷 -🐖 -🐗 -🐽 -🐏 -🐑 -🐐 -🐪 -🐫 -🦙 -🦒 -🐘 -🦣 -🦏 -🦛 -🐭 -🐁 -🐀 -🐹 -🐰 -🐇 -🐿️ -🦫 -🦔 -🦇 -🐻 -🐻‍❄️ -🐨 -🐼 -🦥 -🦦 -🦨 -🦘 -🦡 -🐾 -🐾 -🦃 -🐔 -🐓 -🐣 -🐤 -🐥 -🐦 -🐧 -🕊️ -🦅 -🦆 -🦢 -🦉 -🦤 -🪶 -🦩 -🦚 -🦜 -🐸 -🐊 -🐢 -🦎 -🐍 -🐲 -🐉 -🦕 -🦖 -🐳 -🐋 -🐬 -🐬 -🦭 -🐟 -🐠 -🐡 -🦈 -🐙 -🐚 -🐌 -🦋 -🐛 -🐜 -🐝 -🐝 -🪲 -🐞 -🦗 -🪳 -🕷️ -🕸️ -🦂 -🦟 -🪰 -🪱 -🦠 -💐 -🌸 -💮 -🏵️ -🌹 -🥀 -🌺 -🌻 -🌼 -🌷 -🌱 -🪴 -🌲 -🌳 -🌴 -🌵 -🌾 -🌿 -☘️ -🍀 -🍁 -🍂 -🍃 -🍇 -🍈 -🍉 -🍊 -🍊 -🍊 -🍋 -🍌 -🍌 -🍍 -🥭 -🍎 -🍏 -🍐 -🍑 -🍒 -🍓 -🫐 -🥝 -🍅 -🫒 -🥥 -🥑 -🍆 -🥔 -🥕 -🌽 -🌶️ -🫑 -🥒 -🥬 -🥦 -🧄 -🧅 -🍄 -🥜 -🌰 -🍞 -🥐 -🥖 -🫓 -🥨 -🥯 -🥞 -🧇 -🧀 -🍖 -🍗 -🥩 -🥓 -🍔 -🍟 -🍕 -🌭 -🥪 -🌮 -🌯 -🫔 -🥙 -🧆 -🥚 -🍳 -🥘 -🍲 -🫕 -🥣 -🥗 -🍿 -🧈 -🧂 -🥫 -🍱 -🍘 -🍙 -🍚 -🍛 -🍜 -🍝 -🍠 -🍢 -🍣 -🍤 -🍥 -🥮 -🍡 -🥟 -🥠 -🥡 -🦀 -🦞 -🦐 -🦑 -🦪 -🍦 -🍧 -🍨 -🍩 -🍪 -🎂 -🍰 -🧁 -🥧 -🍫 -🍬 -🍭 -🍮 -🍯 -🍼 -🥛 -☕ -🫖 -🍵 -🍶 -🍾 -🍷 -🍸 -🍹 -🍺 -🍻 -🥂 -🥃 -🥤 -🧋 -🧃 -🧉 -🧊 -🥢 -🍽️ -🍴 -🥄 -🔪 -🔪 -🏺 -🌍 -🌎 -🌏 -🌐 -🗺️ -🗾 -🧭 -🏔️ -⛰️ -🌋 -🗻 -🏕️ -🏖️ -🏜️ -🏝️ -🏞️ -🏟️ -🏛️ -🏗️ -🧱 -🪨 -🪵 -🛖 -🏘️ -🏚️ -🏠 -🏡 -🏢 -🏣 -🏤 -🏥 -🏦 -🏨 -🏩 -🏪 -🏫 -🏬 -🏭 -🏯 -🏰 -💒 -🗼 -🗽 -⛪ -🕌 -🛕 -🕍 -⛩️ -🕋 -⛲ -⛺ -🌁 -🌃 -🏙️ -🌄 -🌅 -🌆 -🌇 -🌉 -♨️ -🎠 -🎡 -🎢 -💈 -🎪 -🚂 -🚃 -🚄 -🚅 -🚆 -🚇 -🚈 -🚉 -🚊 -🚝 -🚞 -🚋 -🚌 -🚍 -🚎 -🚎 -🚐 -🚑 -🚒 -🚓 -🚔 -🚕 -🚖 -🚗 -🚗 -🚘 -🚙 -🛻 -🚚 -🚛 -🚜 -🏎️ -🏍️ -🛵 -🦽 -🦼 -🛺 -🚲 -🛴 -🛹 -🛼 -🚏 -🛣️ -🛤️ -🛢️ -⛽ -🚨 -🚥 -🚦 -🛑 -🚧 -⚓ -⛵ -⛵ -🛶 -🚤 -🛳️ -⛴️ -🛥️ -🚢 -✈️ -🛩️ -🛫 -🛬 -🪂 -💺 -🚁 -🚟 -🚠 -🚡 -🛰️ -🚀 -🛸 -🛎️ -🧳 -⌛ -⏳ -⌚ -⏰ -⏱️ -⏲️ -🕰️ -🕛 -🕧 -🕐 -🕜 -🕑 -🕝 -🕒 -🕞 -🕓 -🕟 -🕔 -🕠 -🕕 -🕡 -🕖 -🕢 -🕗 -🕣 -🕘 -🕤 -🕙 -🕥 -🕚 -🕦 -🌑 -🌒 -🌓 -🌔 -🌔 -🌕 -🌖 -🌗 -🌘 -🌙 -🌚 -🌛 -🌜 -🌡️ -☀️ -🌝 -🌞 -🪐 -⭐ -🌟 -🌠 -🌌 -☁️ -⛅ -⛈️ -🌤️ -🌥️ -🌦️ -🌧️ -🌨️ -🌩️ -🌪️ -🌫️ -🌬️ -🌀 -🌈 -🌂 -☂️ -☔ -⛱️ -⚡ -❄️ -☃️ -⛄ -☄️ -🔥 -💧 -🌊 -🎃 -🎄 -🎆 -🎇 -🧨 -✨ -🎈 -🎉 -🎊 -🎋 -🎍 -🎎 -🎏 -🎐 -🎑 -🧧 -🎀 -🎁 -🎗️ -🎟️ -🎫 -🎖️ -🏆 -🏅 -🥇 -🥈 -🥉 -⚽ -⚾ -🥎 -🏀 -🏐 -🏈 -🏉 -🎾 -🥏 -🎳 -🏏 -🏑 -🏒 -🥍 -🏓 -🏸 -🥊 -🥋 -🥅 -⛳ -⛸️ -🎣 -🤿 -🎽 -🎿 -🛷 -🥌 -🎯 -🪀 -🪁 -🎱 -🔮 -🪄 -🧿 -🎮 -🕹️ -🎰 -🎲 -🧩 -🧸 -🪅 -🪆 -♠️ -♥️ -♦️ -♣️ -♟️ -🃏 -🀄 -🎴 -🎭 -🖼️ -🎨 -🧵 -🪡 -🧶 -🪢 -👓 -🕶️ -🥽 -🥼 -🦺 -👔 -👕 -👕 -👖 -🧣 -🧤 -🧥 -🧦 -👗 -👘 -🥻 -🩱 -🩲 -🩳 -👙 -👚 -👛 -👜 -👝 -🛍️ -🎒 -🩴 -👞 -👞 -👟 -🥾 -🥿 -👠 -👡 -🩰 -👢 -👑 -👒 -🎩 -🎓 -🧢 -🪖 -⛑️ -📿 -💄 -💍 -💎 -🔇 -🔈 -🔉 -🔊 -📢 -📣 -📯 -🔔 -🔕 -🎼 -🎵 -🎶 -🎙️ -🎚️ -🎛️ -🎤 -🎧 -📻 -🎷 -🪗 -🎸 -🎹 -🎺 -🎻 -🪕 -🥁 -🪘 -📱 -📲 -☎️ -☎️ -📞 -📟 -📠 -🔋 -🔌 -💻 -🖥️ -🖨️ -⌨️ -🖱️ -🖲️ -💽 -💾 -💿 -📀 -🧮 -🎥 -🎞️ -📽️ -🎬 -📺 -📷 -📸 -📹 -📼 -🔍 -🔎 -🕯️ -💡 -🔦 -🏮 -🏮 -🪔 -📔 -📕 -📖 -📖 -📗 -📘 -📙 -📚 -📓 -📒 -📃 -📜 -📄 -📰 -🗞️ -📑 -🔖 -🏷️ -💰 -🪙 -💴 -💵 -💶 -💷 -💸 -💳 -🧾 -💹 -✉️ -📧 -📧 -📨 -📩 -📤 -📥 -📦 -📫 -📪 -📬 -📭 -📮 -🗳️ -✏️ -✒️ -🖋️ -🖊️ -🖌️ -🖍️ -📝 -📝 -💼 -📁 -📂 -🗂️ -📅 -📆 -🗒️ -🗓️ -📇 -📈 -📉 -📊 -📋 -📌 -📍 -📎 -🖇️ -📏 -📐 -✂️ -🗃️ -🗄️ -🗑️ -🔒 -🔓 -🔏 -🔐 -🔑 -🗝️ -🔨 -🪓 -⛏️ -⚒️ -🛠️ -🗡️ -⚔️ -🔫 -🪃 -🏹 -🛡️ -🪚 -🔧 -🪛 -🔩 -⚙️ -🗜️ -⚖️ -🦯 -🔗 -⛓️ -🪝 -🧰 -🧲 -🪜 -⚗️ -🧪 -🧫 -🧬 -🔬 -🔭 -📡 -💉 -🩸 -💊 -🩹 -🩺 -🚪 -🛗 -🪞 -🪟 -🛏️ -🛋️ -🪑 -🚽 -🪠 -🚿 -🛁 -🪤 -🪒 -🧴 -🧷 -🧹 -🧺 -🧻 -🪣 -🧼 -🪥 -🧽 -🧯 -🛒 -🚬 -⚰️ -🪦 -⚱️ -🗿 -🪧 -🏧 -🚮 -🚰 -♿ -🚹 -🚺 -🚻 -🚼 -🚾 -🛂 -🛃 -🛄 -🛅 -⚠️ -🚸 -⛔ -🚫 -🚳 -🚭 -🚯 -🚱 -🚷 -📵 -🔞 -☢️ -☣️ -⬆️ -↗️ -➡️ -↘️ -⬇️ -↙️ -⬅️ -↖️ -↕️ -↔️ -↩️ -↪️ -⤴️ -⤵️ -🔃 -🔄 -🔙 -🔚 -🔛 -🔜 -🔝 -🛐 -⚛️ -🕉️ -✡️ -☸️ -☯️ -✝️ -☦️ -☪️ -☮️ -🕎 -🔯 -♈ -♉ -♊ -♋ -♌ -♍ -♎ -♏ -♐ -♑ -♒ -♓ -⛎ -🔀 -🔁 -🔂 -▶️ -⏩ -⏭️ -⏯️ -◀️ -⏪ -⏮️ -🔼 -⏫ -🔽 -⏬ -⏸️ -⏹️ -⏺️ -⏏️ -🎦 -🔅 -🔆 -📶 -📳 -📴 -♀️ -♂️ -⚧️ +✍🏻 +✍🏼 +✍🏽 +✍🏾 +✍🏿 +✏️ +✒️ +✔️ ✖️ -➕ -➖ -➗ -♾️ -‼️ -⁉️ +✝️ +✡️ +✨ +✳️ +✴️ +❄️ +❇️ +❌ +❎ ❓ ❔ ❕ ❗ -❗ -〰️ -💱 -💲 -⚕️ -♻️ -⚜️ -🔱 -📛 -🔰 -⭕ -✅ -☑️ -✔️ -❌ -❎ +❣️ +❤️ +❤️‍🔥 +❤️‍🩹 +➕ +➖ +➗ +➡️ ➰ ➿ +⤴️ +⤵️ +⬅️ +⬆️ +⬇️ +⬛ +⬜ +⭐ +⭕ +〰️ 〽️ -✳️ -✴️ -❇️ -©️ -®️ -™️ -#️⃣ -*️⃣ -0️⃣ -1️⃣ -2️⃣ -3️⃣ -4️⃣ -5️⃣ -6️⃣ -7️⃣ -8️⃣ -9️⃣ -🔟 -🔠 -🔡 -🔣 -🔤 +㊗️ +㊙️ +🀄 +🃏 🅰️ -🆎 🅱️ +🅾️ +🅿️ +🆎 🆑 🆒 🆓 -ℹ️ 🆔 -Ⓜ️ 🆕 🆖 -🅾️ 🆗 -🅿️ 🆘 🆙 🆚 -🈁 -🈂️ -🈷️ -🈶 -🈯 -🉐 -🈹 -🈚 -🈲 -🉑 -🈸 -🈴 -🈳 -㊗️ -㊙️ -🈺 -🈵 -🔴 -🟠 -🟡 -🟢 -🔵 -🟣 -🟤 -⚫ -⚪ -🟥 -🟧 -🟨 -🟩 -🟦 -🟪 -🟫 -⬛ -⬜ -◼️ -◻️ -◾ -◽ -▪️ -▫️ -🔶 -🔷 -🔸 -🔹 -🔺 -🔻 -💠 -🔘 -🔳 -🔲 -🏁 -🚩 -🎌 -🏴 -🏳️ -🏳️‍🌈 -🏳️‍⚧️ -🏴‍☠️ +🇦 🇦🇨 🇦🇩 🇦🇪 @@ -1602,6 +259,7 @@ 🇦🇼 🇦🇽 🇦🇿 +🇧 🇧🇦 🇧🇧 🇧🇩 @@ -1623,6 +281,7 @@ 🇧🇼 🇧🇾 🇧🇿 +🇨 🇨🇦 🇨🇨 🇨🇩 @@ -1636,6 +295,7 @@ 🇨🇳 🇨🇴 🇨🇵 +🇨🇶 🇨🇷 🇨🇺 🇨🇻 @@ -1643,6 +303,7 @@ 🇨🇽 🇨🇾 🇨🇿 +🇩 🇩🇪 🇩🇬 🇩🇯 @@ -1650,6 +311,7 @@ 🇩🇲 🇩🇴 🇩🇿 +🇪 🇪🇦 🇪🇨 🇪🇪 @@ -1659,16 +321,16 @@ 🇪🇸 🇪🇹 🇪🇺 -🇪🇺 +🇫 🇫🇮 🇫🇯 🇫🇰 🇫🇲 🇫🇴 🇫🇷 +🇬 🇬🇦 🇬🇧 -🇬🇧 🇬🇩 🇬🇪 🇬🇫 @@ -1686,12 +348,14 @@ 🇬🇺 🇬🇼 🇬🇾 +🇭 🇭🇰 🇭🇲 🇭🇳 🇭🇷 🇭🇹 🇭🇺 +🇮 🇮🇨 🇮🇩 🇮🇪 @@ -1703,10 +367,12 @@ 🇮🇷 🇮🇸 🇮🇹 +🇯 🇯🇪 🇯🇲 🇯🇴 🇯🇵 +🇰 🇰🇪 🇰🇬 🇰🇭 @@ -1718,6 +384,7 @@ 🇰🇼 🇰🇾 🇰🇿 +🇱 🇱🇦 🇱🇧 🇱🇨 @@ -1729,6 +396,7 @@ 🇱🇺 🇱🇻 🇱🇾 +🇲 🇲🇦 🇲🇨 🇲🇩 @@ -1752,6 +420,7 @@ 🇲🇽 🇲🇾 🇲🇿 +🇳 🇳🇦 🇳🇨 🇳🇪 @@ -1764,7 +433,9 @@ 🇳🇷 🇳🇺 🇳🇿 +🇴 🇴🇲 +🇵 🇵🇦 🇵🇪 🇵🇫 @@ -1779,12 +450,15 @@ 🇵🇹 🇵🇼 🇵🇾 +🇶 🇶🇦 +🇷 🇷🇪 🇷🇴 🇷🇸 🇷🇺 🇷🇼 +🇸 🇸🇦 🇸🇧 🇸🇨 @@ -1806,6 +480,7 @@ 🇸🇽 🇸🇾 🇸🇿 +🇹 🇹🇦 🇹🇨 🇹🇩 @@ -1823,6 +498,7 @@ 🇹🇻 🇹🇼 🇹🇿 +🇺 🇺🇦 🇺🇬 🇺🇲 @@ -1830,6 +506,7 @@ 🇺🇸 🇺🇾 🇺🇿 +🇻 🇻🇦 🇻🇨 🇻🇪 @@ -1837,14 +514,3456 @@ 🇻🇮 🇻🇳 🇻🇺 +🇼 🇼🇫 🇼🇸 +🇽 🇽🇰 +🇾 🇾🇪 🇾🇹 +🇿 🇿🇦 🇿🇲 🇿🇼 +🈁 +🈂️ +🈚 +🈯 +🈲 +🈳 +🈴 +🈵 +🈶 +🈷️ +🈸 +🈹 +🈺 +🉐 +🉑 +🌀 +🌁 +🌂 +🌃 +🌄 +🌅 +🌆 +🌇 +🌈 +🌉 +🌊 +🌋 +🌌 +🌍 +🌎 +🌏 +🌐 +🌑 +🌒 +🌓 +🌔 +🌕 +🌖 +🌗 +🌘 +🌙 +🌚 +🌛 +🌜 +🌝 +🌞 +🌟 +🌠 +🌡️ +🌤️ +🌥️ +🌦️ +🌧️ +🌨️ +🌩️ +🌪️ +🌫️ +🌬️ +🌭 +🌮 +🌯 +🌰 +🌱 +🌲 +🌳 +🌴 +🌵 +🌶️ +🌷 +🌸 +🌹 +🌺 +🌻 +🌼 +🌽 +🌾 +🌿 +🍀 +🍁 +🍂 +🍃 +🍄 +🍄‍🟫 +🍅 +🍆 +🍇 +🍈 +🍉 +🍊 +🍋 +🍋‍🟩 +🍌 +🍍 +🍎 +🍏 +🍐 +🍑 +🍒 +🍓 +🍔 +🍕 +🍖 +🍗 +🍘 +🍙 +🍚 +🍛 +🍜 +🍝 +🍞 +🍟 +🍠 +🍡 +🍢 +🍣 +🍤 +🍥 +🍦 +🍧 +🍨 +🍩 +🍪 +🍫 +🍬 +🍭 +🍮 +🍯 +🍰 +🍱 +🍲 +🍳 +🍴 +🍵 +🍶 +🍷 +🍸 +🍹 +🍺 +🍻 +🍼 +🍽️ +🍾 +🍿 +🎀 +🎁 +🎂 +🎃 +🎄 +🎅 +🎅🏻 +🎅🏼 +🎅🏽 +🎅🏾 +🎅🏿 +🎆 +🎇 +🎈 +🎉 +🎊 +🎋 +🎌 +🎍 +🎎 +🎏 +🎐 +🎑 +🎒 +🎓 +🎖️ +🎗️ +🎙️ +🎚️ +🎛️ +🎞️ +🎟️ +🎠 +🎡 +🎢 +🎣 +🎤 +🎥 +🎦 +🎧 +🎨 +🎩 +🎪 +🎫 +🎬 +🎭 +🎮 +🎯 +🎰 +🎱 +🎲 +🎳 +🎴 +🎵 +🎶 +🎷 +🎸 +🎹 +🎺 +🎻 +🎼 +🎽 +🎾 +🎿 +🏀 +🏁 +🏂 +🏂🏻 +🏂🏼 +🏂🏽 +🏂🏾 +🏂🏿 +🏃 +🏃‍♀️ +🏃‍♀️‍➡️ +🏃‍♂️ +🏃‍♂️‍➡️ +🏃‍➡️ +🏃🏻 +🏃🏻‍♀️ +🏃🏻‍♀️‍➡️ +🏃🏻‍♂️ +🏃🏻‍♂️‍➡️ +🏃🏻‍➡️ +🏃🏼 +🏃🏼‍♀️ +🏃🏼‍♀️‍➡️ +🏃🏼‍♂️ +🏃🏼‍♂️‍➡️ +🏃🏼‍➡️ +🏃🏽 +🏃🏽‍♀️ +🏃🏽‍♀️‍➡️ +🏃🏽‍♂️ +🏃🏽‍♂️‍➡️ +🏃🏽‍➡️ +🏃🏾 +🏃🏾‍♀️ +🏃🏾‍♀️‍➡️ +🏃🏾‍♂️ +🏃🏾‍♂️‍➡️ +🏃🏾‍➡️ +🏃🏿 +🏃🏿‍♀️ +🏃🏿‍♀️‍➡️ +🏃🏿‍♂️ +🏃🏿‍♂️‍➡️ +🏃🏿‍➡️ +🏄 +🏄‍♀️ +🏄‍♂️ +🏄🏻 +🏄🏻‍♀️ +🏄🏻‍♂️ +🏄🏼 +🏄🏼‍♀️ +🏄🏼‍♂️ +🏄🏽 +🏄🏽‍♀️ +🏄🏽‍♂️ +🏄🏾 +🏄🏾‍♀️ +🏄🏾‍♂️ +🏄🏿 +🏄🏿‍♀️ +🏄🏿‍♂️ +🏅 +🏆 +🏇 +🏇🏻 +🏇🏼 +🏇🏽 +🏇🏾 +🏇🏿 +🏈 +🏉 +🏊 +🏊‍♀️ +🏊‍♂️ +🏊🏻 +🏊🏻‍♀️ +🏊🏻‍♂️ +🏊🏼 +🏊🏼‍♀️ +🏊🏼‍♂️ +🏊🏽 +🏊🏽‍♀️ +🏊🏽‍♂️ +🏊🏾 +🏊🏾‍♀️ +🏊🏾‍♂️ +🏊🏿 +🏊🏿‍♀️ +🏊🏿‍♂️ +🏋️ +🏋️‍♀️ +🏋️‍♂️ +🏋🏻 +🏋🏻‍♀️ +🏋🏻‍♂️ +🏋🏼 +🏋🏼‍♀️ +🏋🏼‍♂️ +🏋🏽 +🏋🏽‍♀️ +🏋🏽‍♂️ +🏋🏾 +🏋🏾‍♀️ +🏋🏾‍♂️ +🏋🏿 +🏋🏿‍♀️ +🏋🏿‍♂️ +🏌️ +🏌️‍♀️ +🏌️‍♂️ +🏌🏻 +🏌🏻‍♀️ +🏌🏻‍♂️ +🏌🏼 +🏌🏼‍♀️ +🏌🏼‍♂️ +🏌🏽 +🏌🏽‍♀️ +🏌🏽‍♂️ +🏌🏾 +🏌🏾‍♀️ +🏌🏾‍♂️ +🏌🏿 +🏌🏿‍♀️ +🏌🏿‍♂️ +🏍️ +🏎️ +🏏 +🏐 +🏑 +🏒 +🏓 +🏔️ +🏕️ +🏖️ +🏗️ +🏘️ +🏙️ +🏚️ +🏛️ +🏜️ +🏝️ +🏞️ +🏟️ +🏠 +🏡 +🏢 +🏣 +🏤 +🏥 +🏦 +🏧 +🏨 +🏩 +🏪 +🏫 +🏬 +🏭 +🏮 +🏯 +🏰 +🏳️ +🏳️‍⚧️ +🏳️‍🌈 +🏴 +🏴‍☠️ 🏴󠁧󠁢󠁥󠁮󠁧󠁿 🏴󠁧󠁢󠁳󠁣󠁴󠁿 -🏴󠁧󠁢󠁷󠁬󠁳󠁿 \ No newline at end of file +🏴󠁧󠁢󠁷󠁬󠁳󠁿 +🏵️ +🏷️ +🏸 +🏹 +🏺 +🐀 +🐁 +🐂 +🐃 +🐄 +🐅 +🐆 +🐇 +🐈 +🐈‍⬛ +🐉 +🐊 +🐋 +🐌 +🐍 +🐎 +🐏 +🐐 +🐑 +🐒 +🐓 +🐔 +🐕 +🐕‍🦺 +🐖 +🐗 +🐘 +🐙 +🐚 +🐛 +🐜 +🐝 +🐞 +🐟 +🐠 +🐡 +🐢 +🐣 +🐤 +🐥 +🐦 +🐦‍⬛ +🐦‍🔥 +🐧 +🐨 +🐩 +🐪 +🐫 +🐬 +🐭 +🐮 +🐯 +🐰 +🐱 +🐲 +🐳 +🐴 +🐵 +🐶 +🐷 +🐸 +🐹 +🐺 +🐻 +🐻‍❄️ +🐼 +🐽 +🐾 +🐿️ +👀 +👁️ +👁️‍🗨️ +👂 +👂🏻 +👂🏼 +👂🏽 +👂🏾 +👂🏿 +👃 +👃🏻 +👃🏼 +👃🏽 +👃🏾 +👃🏿 +👄 +👅 +👆 +👆🏻 +👆🏼 +👆🏽 +👆🏾 +👆🏿 +👇 +👇🏻 +👇🏼 +👇🏽 +👇🏾 +👇🏿 +👈 +👈🏻 +👈🏼 +👈🏽 +👈🏾 +👈🏿 +👉 +👉🏻 +👉🏼 +👉🏽 +👉🏾 +👉🏿 +👊 +👊🏻 +👊🏼 +👊🏽 +👊🏾 +👊🏿 +👋 +👋🏻 +👋🏼 +👋🏽 +👋🏾 +👋🏿 +👌 +👌🏻 +👌🏼 +👌🏽 +👌🏾 +👌🏿 +👍 +👍🏻 +👍🏼 +👍🏽 +👍🏾 +👍🏿 +👎 +👎🏻 +👎🏼 +👎🏽 +👎🏾 +👎🏿 +👏 +👏🏻 +👏🏼 +👏🏽 +👏🏾 +👏🏿 +👐 +👐🏻 +👐🏼 +👐🏽 +👐🏾 +👐🏿 +👑 +👒 +👓 +👔 +👕 +👖 +👗 +👘 +👙 +👚 +👛 +👜 +👝 +👞 +👟 +👠 +👡 +👢 +👣 +👤 +👥 +👦 +👦🏻 +👦🏼 +👦🏽 +👦🏾 +👦🏿 +👧 +👧🏻 +👧🏼 +👧🏽 +👧🏾 +👧🏿 +👨 +👨‍⚕️ +👨‍⚖️ +👨‍✈️ +👨‍❤️‍👨 +👨‍❤️‍💋‍👨 +👨‍🌾 +👨‍🍳 +👨‍🍼 +👨‍🎓 +👨‍🎤 +👨‍🎨 +👨‍🏫 +👨‍🏭 +👨‍👦 +👨‍👦‍👦 +👨‍👧 +👨‍👧‍👦 +👨‍👧‍👧 +👨‍👨‍👦 +👨‍👨‍👦‍👦 +👨‍👨‍👧 +👨‍👨‍👧‍👦 +👨‍👨‍👧‍👧 +👨‍👩‍👦 +👨‍👩‍👦‍👦 +👨‍👩‍👧 +👨‍👩‍👧‍👦 +👨‍👩‍👧‍👧 +👨‍💻 +👨‍💼 +👨‍🔧 +👨‍🔬 +👨‍🚀 +👨‍🚒 +👨‍🦯 +👨‍🦯‍➡️ +👨‍🦰 +👨‍🦱 +👨‍🦲 +👨‍🦳 +👨‍🦼 +👨‍🦼‍➡️ +👨‍🦽 +👨‍🦽‍➡️ +👨🏻 +👨🏻‍⚕️ +👨🏻‍⚖️ +👨🏻‍✈️ +👨🏻‍❤️‍👨🏻 +👨🏻‍❤️‍👨🏼 +👨🏻‍❤️‍👨🏽 +👨🏻‍❤️‍👨🏾 +👨🏻‍❤️‍👨🏿 +👨🏻‍❤️‍💋‍👨🏻 +👨🏻‍❤️‍💋‍👨🏼 +👨🏻‍❤️‍💋‍👨🏽 +👨🏻‍❤️‍💋‍👨🏾 +👨🏻‍❤️‍💋‍👨🏿 +👨🏻‍🌾 +👨🏻‍🍳 +👨🏻‍🍼 +👨🏻‍🎓 +👨🏻‍🎤 +👨🏻‍🎨 +👨🏻‍🏫 +👨🏻‍🏭 +👨🏻‍🐰‍👨🏼 +👨🏻‍🐰‍👨🏽 +👨🏻‍🐰‍👨🏾 +👨🏻‍🐰‍👨🏿 +👨🏻‍💻 +👨🏻‍💼 +👨🏻‍🔧 +👨🏻‍🔬 +👨🏻‍🚀 +👨🏻‍🚒 +👨🏻‍🤝‍👨🏼 +👨🏻‍🤝‍👨🏽 +👨🏻‍🤝‍👨🏾 +👨🏻‍🤝‍👨🏿 +👨🏻‍🦯 +👨🏻‍🦯‍➡️ +👨🏻‍🦰 +👨🏻‍🦱 +👨🏻‍🦲 +👨🏻‍🦳 +👨🏻‍🦼 +👨🏻‍🦼‍➡️ +👨🏻‍🦽 +👨🏻‍🦽‍➡️ +👨🏻‍🫯‍👨🏼 +👨🏻‍🫯‍👨🏽 +👨🏻‍🫯‍👨🏾 +👨🏻‍🫯‍👨🏿 +👨🏼 +👨🏼‍⚕️ +👨🏼‍⚖️ +👨🏼‍✈️ +👨🏼‍❤️‍👨🏻 +👨🏼‍❤️‍👨🏼 +👨🏼‍❤️‍👨🏽 +👨🏼‍❤️‍👨🏾 +👨🏼‍❤️‍👨🏿 +👨🏼‍❤️‍💋‍👨🏻 +👨🏼‍❤️‍💋‍👨🏼 +👨🏼‍❤️‍💋‍👨🏽 +👨🏼‍❤️‍💋‍👨🏾 +👨🏼‍❤️‍💋‍👨🏿 +👨🏼‍🌾 +👨🏼‍🍳 +👨🏼‍🍼 +👨🏼‍🎓 +👨🏼‍🎤 +👨🏼‍🎨 +👨🏼‍🏫 +👨🏼‍🏭 +👨🏼‍🐰‍👨🏻 +👨🏼‍🐰‍👨🏽 +👨🏼‍🐰‍👨🏾 +👨🏼‍🐰‍👨🏿 +👨🏼‍💻 +👨🏼‍💼 +👨🏼‍🔧 +👨🏼‍🔬 +👨🏼‍🚀 +👨🏼‍🚒 +👨🏼‍🤝‍👨🏻 +👨🏼‍🤝‍👨🏽 +👨🏼‍🤝‍👨🏾 +👨🏼‍🤝‍👨🏿 +👨🏼‍🦯 +👨🏼‍🦯‍➡️ +👨🏼‍🦰 +👨🏼‍🦱 +👨🏼‍🦲 +👨🏼‍🦳 +👨🏼‍🦼 +👨🏼‍🦼‍➡️ +👨🏼‍🦽 +👨🏼‍🦽‍➡️ +👨🏼‍🫯‍👨🏻 +👨🏼‍🫯‍👨🏽 +👨🏼‍🫯‍👨🏾 +👨🏼‍🫯‍👨🏿 +👨🏽 +👨🏽‍⚕️ +👨🏽‍⚖️ +👨🏽‍✈️ +👨🏽‍❤️‍👨🏻 +👨🏽‍❤️‍👨🏼 +👨🏽‍❤️‍👨🏽 +👨🏽‍❤️‍👨🏾 +👨🏽‍❤️‍👨🏿 +👨🏽‍❤️‍💋‍👨🏻 +👨🏽‍❤️‍💋‍👨🏼 +👨🏽‍❤️‍💋‍👨🏽 +👨🏽‍❤️‍💋‍👨🏾 +👨🏽‍❤️‍💋‍👨🏿 +👨🏽‍🌾 +👨🏽‍🍳 +👨🏽‍🍼 +👨🏽‍🎓 +👨🏽‍🎤 +👨🏽‍🎨 +👨🏽‍🏫 +👨🏽‍🏭 +👨🏽‍🐰‍👨🏻 +👨🏽‍🐰‍👨🏼 +👨🏽‍🐰‍👨🏾 +👨🏽‍🐰‍👨🏿 +👨🏽‍💻 +👨🏽‍💼 +👨🏽‍🔧 +👨🏽‍🔬 +👨🏽‍🚀 +👨🏽‍🚒 +👨🏽‍🤝‍👨🏻 +👨🏽‍🤝‍👨🏼 +👨🏽‍🤝‍👨🏾 +👨🏽‍🤝‍👨🏿 +👨🏽‍🦯 +👨🏽‍🦯‍➡️ +👨🏽‍🦰 +👨🏽‍🦱 +👨🏽‍🦲 +👨🏽‍🦳 +👨🏽‍🦼 +👨🏽‍🦼‍➡️ +👨🏽‍🦽 +👨🏽‍🦽‍➡️ +👨🏽‍🫯‍👨🏻 +👨🏽‍🫯‍👨🏼 +👨🏽‍🫯‍👨🏾 +👨🏽‍🫯‍👨🏿 +👨🏾 +👨🏾‍⚕️ +👨🏾‍⚖️ +👨🏾‍✈️ +👨🏾‍❤️‍👨🏻 +👨🏾‍❤️‍👨🏼 +👨🏾‍❤️‍👨🏽 +👨🏾‍❤️‍👨🏾 +👨🏾‍❤️‍👨🏿 +👨🏾‍❤️‍💋‍👨🏻 +👨🏾‍❤️‍💋‍👨🏼 +👨🏾‍❤️‍💋‍👨🏽 +👨🏾‍❤️‍💋‍👨🏾 +👨🏾‍❤️‍💋‍👨🏿 +👨🏾‍🌾 +👨🏾‍🍳 +👨🏾‍🍼 +👨🏾‍🎓 +👨🏾‍🎤 +👨🏾‍🎨 +👨🏾‍🏫 +👨🏾‍🏭 +👨🏾‍🐰‍👨🏻 +👨🏾‍🐰‍👨🏼 +👨🏾‍🐰‍👨🏽 +👨🏾‍🐰‍👨🏿 +👨🏾‍💻 +👨🏾‍💼 +👨🏾‍🔧 +👨🏾‍🔬 +👨🏾‍🚀 +👨🏾‍🚒 +👨🏾‍🤝‍👨🏻 +👨🏾‍🤝‍👨🏼 +👨🏾‍🤝‍👨🏽 +👨🏾‍🤝‍👨🏿 +👨🏾‍🦯 +👨🏾‍🦯‍➡️ +👨🏾‍🦰 +👨🏾‍🦱 +👨🏾‍🦲 +👨🏾‍🦳 +👨🏾‍🦼 +👨🏾‍🦼‍➡️ +👨🏾‍🦽 +👨🏾‍🦽‍➡️ +👨🏾‍🫯‍👨🏻 +👨🏾‍🫯‍👨🏼 +👨🏾‍🫯‍👨🏽 +👨🏾‍🫯‍👨🏿 +👨🏿 +👨🏿‍⚕️ +👨🏿‍⚖️ +👨🏿‍✈️ +👨🏿‍❤️‍👨🏻 +👨🏿‍❤️‍👨🏼 +👨🏿‍❤️‍👨🏽 +👨🏿‍❤️‍👨🏾 +👨🏿‍❤️‍👨🏿 +👨🏿‍❤️‍💋‍👨🏻 +👨🏿‍❤️‍💋‍👨🏼 +👨🏿‍❤️‍💋‍👨🏽 +👨🏿‍❤️‍💋‍👨🏾 +👨🏿‍❤️‍💋‍👨🏿 +👨🏿‍🌾 +👨🏿‍🍳 +👨🏿‍🍼 +👨🏿‍🎓 +👨🏿‍🎤 +👨🏿‍🎨 +👨🏿‍🏫 +👨🏿‍🏭 +👨🏿‍🐰‍👨🏻 +👨🏿‍🐰‍👨🏼 +👨🏿‍🐰‍👨🏽 +👨🏿‍🐰‍👨🏾 +👨🏿‍💻 +👨🏿‍💼 +👨🏿‍🔧 +👨🏿‍🔬 +👨🏿‍🚀 +👨🏿‍🚒 +👨🏿‍🤝‍👨🏻 +👨🏿‍🤝‍👨🏼 +👨🏿‍🤝‍👨🏽 +👨🏿‍🤝‍👨🏾 +👨🏿‍🦯 +👨🏿‍🦯‍➡️ +👨🏿‍🦰 +👨🏿‍🦱 +👨🏿‍🦲 +👨🏿‍🦳 +👨🏿‍🦼 +👨🏿‍🦼‍➡️ +👨🏿‍🦽 +👨🏿‍🦽‍➡️ +👨🏿‍🫯‍👨🏻 +👨🏿‍🫯‍👨🏼 +👨🏿‍🫯‍👨🏽 +👨🏿‍🫯‍👨🏾 +👩 +👩‍⚕️ +👩‍⚖️ +👩‍✈️ +👩‍❤️‍👨 +👩‍❤️‍👩 +👩‍❤️‍💋‍👨 +👩‍❤️‍💋‍👩 +👩‍🌾 +👩‍🍳 +👩‍🍼 +👩‍🎓 +👩‍🎤 +👩‍🎨 +👩‍🏫 +👩‍🏭 +👩‍👦 +👩‍👦‍👦 +👩‍👧 +👩‍👧‍👦 +👩‍👧‍👧 +👩‍👩‍👦 +👩‍👩‍👦‍👦 +👩‍👩‍👧 +👩‍👩‍👧‍👦 +👩‍👩‍👧‍👧 +👩‍💻 +👩‍💼 +👩‍🔧 +👩‍🔬 +👩‍🚀 +👩‍🚒 +👩‍🦯 +👩‍🦯‍➡️ +👩‍🦰 +👩‍🦱 +👩‍🦲 +👩‍🦳 +👩‍🦼 +👩‍🦼‍➡️ +👩‍🦽 +👩‍🦽‍➡️ +👩🏻 +👩🏻‍⚕️ +👩🏻‍⚖️ +👩🏻‍✈️ +👩🏻‍❤️‍👨🏻 +👩🏻‍❤️‍👨🏼 +👩🏻‍❤️‍👨🏽 +👩🏻‍❤️‍👨🏾 +👩🏻‍❤️‍👨🏿 +👩🏻‍❤️‍👩🏻 +👩🏻‍❤️‍👩🏼 +👩🏻‍❤️‍👩🏽 +👩🏻‍❤️‍👩🏾 +👩🏻‍❤️‍👩🏿 +👩🏻‍❤️‍💋‍👨🏻 +👩🏻‍❤️‍💋‍👨🏼 +👩🏻‍❤️‍💋‍👨🏽 +👩🏻‍❤️‍💋‍👨🏾 +👩🏻‍❤️‍💋‍👨🏿 +👩🏻‍❤️‍💋‍👩🏻 +👩🏻‍❤️‍💋‍👩🏼 +👩🏻‍❤️‍💋‍👩🏽 +👩🏻‍❤️‍💋‍👩🏾 +👩🏻‍❤️‍💋‍👩🏿 +👩🏻‍🌾 +👩🏻‍🍳 +👩🏻‍🍼 +👩🏻‍🎓 +👩🏻‍🎤 +👩🏻‍🎨 +👩🏻‍🏫 +👩🏻‍🏭 +👩🏻‍🐰‍👩🏼 +👩🏻‍🐰‍👩🏽 +👩🏻‍🐰‍👩🏾 +👩🏻‍🐰‍👩🏿 +👩🏻‍💻 +👩🏻‍💼 +👩🏻‍🔧 +👩🏻‍🔬 +👩🏻‍🚀 +👩🏻‍🚒 +👩🏻‍🤝‍👨🏼 +👩🏻‍🤝‍👨🏽 +👩🏻‍🤝‍👨🏾 +👩🏻‍🤝‍👨🏿 +👩🏻‍🤝‍👩🏼 +👩🏻‍🤝‍👩🏽 +👩🏻‍🤝‍👩🏾 +👩🏻‍🤝‍👩🏿 +👩🏻‍🦯 +👩🏻‍🦯‍➡️ +👩🏻‍🦰 +👩🏻‍🦱 +👩🏻‍🦲 +👩🏻‍🦳 +👩🏻‍🦼 +👩🏻‍🦼‍➡️ +👩🏻‍🦽 +👩🏻‍🦽‍➡️ +👩🏻‍🫯‍👩🏼 +👩🏻‍🫯‍👩🏽 +👩🏻‍🫯‍👩🏾 +👩🏻‍🫯‍👩🏿 +👩🏼 +👩🏼‍⚕️ +👩🏼‍⚖️ +👩🏼‍✈️ +👩🏼‍❤️‍👨🏻 +👩🏼‍❤️‍👨🏼 +👩🏼‍❤️‍👨🏽 +👩🏼‍❤️‍👨🏾 +👩🏼‍❤️‍👨🏿 +👩🏼‍❤️‍👩🏻 +👩🏼‍❤️‍👩🏼 +👩🏼‍❤️‍👩🏽 +👩🏼‍❤️‍👩🏾 +👩🏼‍❤️‍👩🏿 +👩🏼‍❤️‍💋‍👨🏻 +👩🏼‍❤️‍💋‍👨🏼 +👩🏼‍❤️‍💋‍👨🏽 +👩🏼‍❤️‍💋‍👨🏾 +👩🏼‍❤️‍💋‍👨🏿 +👩🏼‍❤️‍💋‍👩🏻 +👩🏼‍❤️‍💋‍👩🏼 +👩🏼‍❤️‍💋‍👩🏽 +👩🏼‍❤️‍💋‍👩🏾 +👩🏼‍❤️‍💋‍👩🏿 +👩🏼‍🌾 +👩🏼‍🍳 +👩🏼‍🍼 +👩🏼‍🎓 +👩🏼‍🎤 +👩🏼‍🎨 +👩🏼‍🏫 +👩🏼‍🏭 +👩🏼‍🐰‍👩🏻 +👩🏼‍🐰‍👩🏽 +👩🏼‍🐰‍👩🏾 +👩🏼‍🐰‍👩🏿 +👩🏼‍💻 +👩🏼‍💼 +👩🏼‍🔧 +👩🏼‍🔬 +👩🏼‍🚀 +👩🏼‍🚒 +👩🏼‍🤝‍👨🏻 +👩🏼‍🤝‍👨🏽 +👩🏼‍🤝‍👨🏾 +👩🏼‍🤝‍👨🏿 +👩🏼‍🤝‍👩🏻 +👩🏼‍🤝‍👩🏽 +👩🏼‍🤝‍👩🏾 +👩🏼‍🤝‍👩🏿 +👩🏼‍🦯 +👩🏼‍🦯‍➡️ +👩🏼‍🦰 +👩🏼‍🦱 +👩🏼‍🦲 +👩🏼‍🦳 +👩🏼‍🦼 +👩🏼‍🦼‍➡️ +👩🏼‍🦽 +👩🏼‍🦽‍➡️ +👩🏼‍🫯‍👩🏻 +👩🏼‍🫯‍👩🏽 +👩🏼‍🫯‍👩🏾 +👩🏼‍🫯‍👩🏿 +👩🏽 +👩🏽‍⚕️ +👩🏽‍⚖️ +👩🏽‍✈️ +👩🏽‍❤️‍👨🏻 +👩🏽‍❤️‍👨🏼 +👩🏽‍❤️‍👨🏽 +👩🏽‍❤️‍👨🏾 +👩🏽‍❤️‍👨🏿 +👩🏽‍❤️‍👩🏻 +👩🏽‍❤️‍👩🏼 +👩🏽‍❤️‍👩🏽 +👩🏽‍❤️‍👩🏾 +👩🏽‍❤️‍👩🏿 +👩🏽‍❤️‍💋‍👨🏻 +👩🏽‍❤️‍💋‍👨🏼 +👩🏽‍❤️‍💋‍👨🏽 +👩🏽‍❤️‍💋‍👨🏾 +👩🏽‍❤️‍💋‍👨🏿 +👩🏽‍❤️‍💋‍👩🏻 +👩🏽‍❤️‍💋‍👩🏼 +👩🏽‍❤️‍💋‍👩🏽 +👩🏽‍❤️‍💋‍👩🏾 +👩🏽‍❤️‍💋‍👩🏿 +👩🏽‍🌾 +👩🏽‍🍳 +👩🏽‍🍼 +👩🏽‍🎓 +👩🏽‍🎤 +👩🏽‍🎨 +👩🏽‍🏫 +👩🏽‍🏭 +👩🏽‍🐰‍👩🏻 +👩🏽‍🐰‍👩🏼 +👩🏽‍🐰‍👩🏾 +👩🏽‍🐰‍👩🏿 +👩🏽‍💻 +👩🏽‍💼 +👩🏽‍🔧 +👩🏽‍🔬 +👩🏽‍🚀 +👩🏽‍🚒 +👩🏽‍🤝‍👨🏻 +👩🏽‍🤝‍👨🏼 +👩🏽‍🤝‍👨🏾 +👩🏽‍🤝‍👨🏿 +👩🏽‍🤝‍👩🏻 +👩🏽‍🤝‍👩🏼 +👩🏽‍🤝‍👩🏾 +👩🏽‍🤝‍👩🏿 +👩🏽‍🦯 +👩🏽‍🦯‍➡️ +👩🏽‍🦰 +👩🏽‍🦱 +👩🏽‍🦲 +👩🏽‍🦳 +👩🏽‍🦼 +👩🏽‍🦼‍➡️ +👩🏽‍🦽 +👩🏽‍🦽‍➡️ +👩🏽‍🫯‍👩🏻 +👩🏽‍🫯‍👩🏼 +👩🏽‍🫯‍👩🏾 +👩🏽‍🫯‍👩🏿 +👩🏾 +👩🏾‍⚕️ +👩🏾‍⚖️ +👩🏾‍✈️ +👩🏾‍❤️‍👨🏻 +👩🏾‍❤️‍👨🏼 +👩🏾‍❤️‍👨🏽 +👩🏾‍❤️‍👨🏾 +👩🏾‍❤️‍👨🏿 +👩🏾‍❤️‍👩🏻 +👩🏾‍❤️‍👩🏼 +👩🏾‍❤️‍👩🏽 +👩🏾‍❤️‍👩🏾 +👩🏾‍❤️‍👩🏿 +👩🏾‍❤️‍💋‍👨🏻 +👩🏾‍❤️‍💋‍👨🏼 +👩🏾‍❤️‍💋‍👨🏽 +👩🏾‍❤️‍💋‍👨🏾 +👩🏾‍❤️‍💋‍👨🏿 +👩🏾‍❤️‍💋‍👩🏻 +👩🏾‍❤️‍💋‍👩🏼 +👩🏾‍❤️‍💋‍👩🏽 +👩🏾‍❤️‍💋‍👩🏾 +👩🏾‍❤️‍💋‍👩🏿 +👩🏾‍🌾 +👩🏾‍🍳 +👩🏾‍🍼 +👩🏾‍🎓 +👩🏾‍🎤 +👩🏾‍🎨 +👩🏾‍🏫 +👩🏾‍🏭 +👩🏾‍🐰‍👩🏻 +👩🏾‍🐰‍👩🏼 +👩🏾‍🐰‍👩🏽 +👩🏾‍🐰‍👩🏿 +👩🏾‍💻 +👩🏾‍💼 +👩🏾‍🔧 +👩🏾‍🔬 +👩🏾‍🚀 +👩🏾‍🚒 +👩🏾‍🤝‍👨🏻 +👩🏾‍🤝‍👨🏼 +👩🏾‍🤝‍👨🏽 +👩🏾‍🤝‍👨🏿 +👩🏾‍🤝‍👩🏻 +👩🏾‍🤝‍👩🏼 +👩🏾‍🤝‍👩🏽 +👩🏾‍🤝‍👩🏿 +👩🏾‍🦯 +👩🏾‍🦯‍➡️ +👩🏾‍🦰 +👩🏾‍🦱 +👩🏾‍🦲 +👩🏾‍🦳 +👩🏾‍🦼 +👩🏾‍🦼‍➡️ +👩🏾‍🦽 +👩🏾‍🦽‍➡️ +👩🏾‍🫯‍👩🏻 +👩🏾‍🫯‍👩🏼 +👩🏾‍🫯‍👩🏽 +👩🏾‍🫯‍👩🏿 +👩🏿 +👩🏿‍⚕️ +👩🏿‍⚖️ +👩🏿‍✈️ +👩🏿‍❤️‍👨🏻 +👩🏿‍❤️‍👨🏼 +👩🏿‍❤️‍👨🏽 +👩🏿‍❤️‍👨🏾 +👩🏿‍❤️‍👨🏿 +👩🏿‍❤️‍👩🏻 +👩🏿‍❤️‍👩🏼 +👩🏿‍❤️‍👩🏽 +👩🏿‍❤️‍👩🏾 +👩🏿‍❤️‍👩🏿 +👩🏿‍❤️‍💋‍👨🏻 +👩🏿‍❤️‍💋‍👨🏼 +👩🏿‍❤️‍💋‍👨🏽 +👩🏿‍❤️‍💋‍👨🏾 +👩🏿‍❤️‍💋‍👨🏿 +👩🏿‍❤️‍💋‍👩🏻 +👩🏿‍❤️‍💋‍👩🏼 +👩🏿‍❤️‍💋‍👩🏽 +👩🏿‍❤️‍💋‍👩🏾 +👩🏿‍❤️‍💋‍👩🏿 +👩🏿‍🌾 +👩🏿‍🍳 +👩🏿‍🍼 +👩🏿‍🎓 +👩🏿‍🎤 +👩🏿‍🎨 +👩🏿‍🏫 +👩🏿‍🏭 +👩🏿‍🐰‍👩🏻 +👩🏿‍🐰‍👩🏼 +👩🏿‍🐰‍👩🏽 +👩🏿‍🐰‍👩🏾 +👩🏿‍💻 +👩🏿‍💼 +👩🏿‍🔧 +👩🏿‍🔬 +👩🏿‍🚀 +👩🏿‍🚒 +👩🏿‍🤝‍👨🏻 +👩🏿‍🤝‍👨🏼 +👩🏿‍🤝‍👨🏽 +👩🏿‍🤝‍👨🏾 +👩🏿‍🤝‍👩🏻 +👩🏿‍🤝‍👩🏼 +👩🏿‍🤝‍👩🏽 +👩🏿‍🤝‍👩🏾 +👩🏿‍🦯 +👩🏿‍🦯‍➡️ +👩🏿‍🦰 +👩🏿‍🦱 +👩🏿‍🦲 +👩🏿‍🦳 +👩🏿‍🦼 +👩🏿‍🦼‍➡️ +👩🏿‍🦽 +👩🏿‍🦽‍➡️ +👩🏿‍🫯‍👩🏻 +👩🏿‍🫯‍👩🏼 +👩🏿‍🫯‍👩🏽 +👩🏿‍🫯‍👩🏾 +👪 +👫 +👫🏻 +👫🏼 +👫🏽 +👫🏾 +👫🏿 +👬 +👬🏻 +👬🏼 +👬🏽 +👬🏾 +👬🏿 +👭 +👭🏻 +👭🏼 +👭🏽 +👭🏾 +👭🏿 +👮 +👮‍♀️ +👮‍♂️ +👮🏻 +👮🏻‍♀️ +👮🏻‍♂️ +👮🏼 +👮🏼‍♀️ +👮🏼‍♂️ +👮🏽 +👮🏽‍♀️ +👮🏽‍♂️ +👮🏾 +👮🏾‍♀️ +👮🏾‍♂️ +👮🏿 +👮🏿‍♀️ +👮🏿‍♂️ +👯 +👯‍♀️ +👯‍♂️ +👯🏻 +👯🏻‍♀️ +👯🏻‍♂️ +👯🏼 +👯🏼‍♀️ +👯🏼‍♂️ +👯🏽 +👯🏽‍♀️ +👯🏽‍♂️ +👯🏾 +👯🏾‍♀️ +👯🏾‍♂️ +👯🏿 +👯🏿‍♀️ +👯🏿‍♂️ +👰 +👰‍♀️ +👰‍♂️ +👰🏻 +👰🏻‍♀️ +👰🏻‍♂️ +👰🏼 +👰🏼‍♀️ +👰🏼‍♂️ +👰🏽 +👰🏽‍♀️ +👰🏽‍♂️ +👰🏾 +👰🏾‍♀️ +👰🏾‍♂️ +👰🏿 +👰🏿‍♀️ +👰🏿‍♂️ +👱 +👱‍♀️ +👱‍♂️ +👱🏻 +👱🏻‍♀️ +👱🏻‍♂️ +👱🏼 +👱🏼‍♀️ +👱🏼‍♂️ +👱🏽 +👱🏽‍♀️ +👱🏽‍♂️ +👱🏾 +👱🏾‍♀️ +👱🏾‍♂️ +👱🏿 +👱🏿‍♀️ +👱🏿‍♂️ +👲 +👲🏻 +👲🏼 +👲🏽 +👲🏾 +👲🏿 +👳 +👳‍♀️ +👳‍♂️ +👳🏻 +👳🏻‍♀️ +👳🏻‍♂️ +👳🏼 +👳🏼‍♀️ +👳🏼‍♂️ +👳🏽 +👳🏽‍♀️ +👳🏽‍♂️ +👳🏾 +👳🏾‍♀️ +👳🏾‍♂️ +👳🏿 +👳🏿‍♀️ +👳🏿‍♂️ +👴 +👴🏻 +👴🏼 +👴🏽 +👴🏾 +👴🏿 +👵 +👵🏻 +👵🏼 +👵🏽 +👵🏾 +👵🏿 +👶 +👶🏻 +👶🏼 +👶🏽 +👶🏾 +👶🏿 +👷 +👷‍♀️ +👷‍♂️ +👷🏻 +👷🏻‍♀️ +👷🏻‍♂️ +👷🏼 +👷🏼‍♀️ +👷🏼‍♂️ +👷🏽 +👷🏽‍♀️ +👷🏽‍♂️ +👷🏾 +👷🏾‍♀️ +👷🏾‍♂️ +👷🏿 +👷🏿‍♀️ +👷🏿‍♂️ +👸 +👸🏻 +👸🏼 +👸🏽 +👸🏾 +👸🏿 +👹 +👺 +👻 +👼 +👼🏻 +👼🏼 +👼🏽 +👼🏾 +👼🏿 +👽 +👾 +👿 +💀 +💁 +💁‍♀️ +💁‍♂️ +💁🏻 +💁🏻‍♀️ +💁🏻‍♂️ +💁🏼 +💁🏼‍♀️ +💁🏼‍♂️ +💁🏽 +💁🏽‍♀️ +💁🏽‍♂️ +💁🏾 +💁🏾‍♀️ +💁🏾‍♂️ +💁🏿 +💁🏿‍♀️ +💁🏿‍♂️ +💂 +💂‍♀️ +💂‍♂️ +💂🏻 +💂🏻‍♀️ +💂🏻‍♂️ +💂🏼 +💂🏼‍♀️ +💂🏼‍♂️ +💂🏽 +💂🏽‍♀️ +💂🏽‍♂️ +💂🏾 +💂🏾‍♀️ +💂🏾‍♂️ +💂🏿 +💂🏿‍♀️ +💂🏿‍♂️ +💃 +💃🏻 +💃🏼 +💃🏽 +💃🏾 +💃🏿 +💄 +💅 +💅🏻 +💅🏼 +💅🏽 +💅🏾 +💅🏿 +💆 +💆‍♀️ +💆‍♂️ +💆🏻 +💆🏻‍♀️ +💆🏻‍♂️ +💆🏼 +💆🏼‍♀️ +💆🏼‍♂️ +💆🏽 +💆🏽‍♀️ +💆🏽‍♂️ +💆🏾 +💆🏾‍♀️ +💆🏾‍♂️ +💆🏿 +💆🏿‍♀️ +💆🏿‍♂️ +💇 +💇‍♀️ +💇‍♂️ +💇🏻 +💇🏻‍♀️ +💇🏻‍♂️ +💇🏼 +💇🏼‍♀️ +💇🏼‍♂️ +💇🏽 +💇🏽‍♀️ +💇🏽‍♂️ +💇🏾 +💇🏾‍♀️ +💇🏾‍♂️ +💇🏿 +💇🏿‍♀️ +💇🏿‍♂️ +💈 +💉 +💊 +💋 +💌 +💍 +💎 +💏 +💏🏻 +💏🏼 +💏🏽 +💏🏾 +💏🏿 +💐 +💑 +💑🏻 +💑🏼 +💑🏽 +💑🏾 +💑🏿 +💒 +💓 +💔 +💕 +💖 +💗 +💘 +💙 +💚 +💛 +💜 +💝 +💞 +💟 +💠 +💡 +💢 +💣 +💤 +💥 +💦 +💧 +💨 +💩 +💪 +💪🏻 +💪🏼 +💪🏽 +💪🏾 +💪🏿 +💫 +💬 +💭 +💮 +💯 +💰 +💱 +💲 +💳 +💴 +💵 +💶 +💷 +💸 +💹 +💺 +💻 +💼 +💽 +💾 +💿 +📀 +📁 +📂 +📃 +📄 +📅 +📆 +📇 +📈 +📉 +📊 +📋 +📌 +📍 +📎 +📏 +📐 +📑 +📒 +📓 +📔 +📕 +📖 +📗 +📘 +📙 +📚 +📛 +📜 +📝 +📞 +📟 +📠 +📡 +📢 +📣 +📤 +📥 +📦 +📧 +📨 +📩 +📪 +📫 +📬 +📭 +📮 +📯 +📰 +📱 +📲 +📳 +📴 +📵 +📶 +📷 +📸 +📹 +📺 +📻 +📼 +📽️ +📿 +🔀 +🔁 +🔂 +🔃 +🔄 +🔅 +🔆 +🔇 +🔈 +🔉 +🔊 +🔋 +🔌 +🔍 +🔎 +🔏 +🔐 +🔑 +🔒 +🔓 +🔔 +🔕 +🔖 +🔗 +🔘 +🔙 +🔚 +🔛 +🔜 +🔝 +🔞 +🔟 +🔠 +🔡 +🔢 +🔣 +🔤 +🔥 +🔦 +🔧 +🔨 +🔩 +🔪 +🔫 +🔬 +🔭 +🔮 +🔯 +🔰 +🔱 +🔲 +🔳 +🔴 +🔵 +🔶 +🔷 +🔸 +🔹 +🔺 +🔻 +🔼 +🔽 +🕉️ +🕊️ +🕋 +🕌 +🕍 +🕎 +🕐 +🕑 +🕒 +🕓 +🕔 +🕕 +🕖 +🕗 +🕘 +🕙 +🕚 +🕛 +🕜 +🕝 +🕞 +🕟 +🕠 +🕡 +🕢 +🕣 +🕤 +🕥 +🕦 +🕧 +🕯️ +🕰️ +🕳️ +🕴️ +🕴🏻 +🕴🏼 +🕴🏽 +🕴🏾 +🕴🏿 +🕵️ +🕵️‍♀️ +🕵️‍♂️ +🕵🏻 +🕵🏻‍♀️ +🕵🏻‍♂️ +🕵🏼 +🕵🏼‍♀️ +🕵🏼‍♂️ +🕵🏽 +🕵🏽‍♀️ +🕵🏽‍♂️ +🕵🏾 +🕵🏾‍♀️ +🕵🏾‍♂️ +🕵🏿 +🕵🏿‍♀️ +🕵🏿‍♂️ +🕶️ +🕷️ +🕸️ +🕹️ +🕺 +🕺🏻 +🕺🏼 +🕺🏽 +🕺🏾 +🕺🏿 +🖇️ +🖊️ +🖋️ +🖌️ +🖍️ +🖐️ +🖐🏻 +🖐🏼 +🖐🏽 +🖐🏾 +🖐🏿 +🖕 +🖕🏻 +🖕🏼 +🖕🏽 +🖕🏾 +🖕🏿 +🖖 +🖖🏻 +🖖🏼 +🖖🏽 +🖖🏾 +🖖🏿 +🖤 +🖥️ +🖨️ +🖱️ +🖲️ +🖼️ +🗂️ +🗃️ +🗄️ +🗑️ +🗒️ +🗓️ +🗜️ +🗝️ +🗞️ +🗡️ +🗣️ +🗨️ +🗯️ +🗳️ +🗺️ +🗻 +🗼 +🗽 +🗾 +🗿 +😀 +😁 +😂 +😃 +😄 +😅 +😆 +😇 +😈 +😉 +😊 +😋 +😌 +😍 +😎 +😏 +😐 +😑 +😒 +😓 +😔 +😕 +😖 +😗 +😘 +😙 +😚 +😛 +😜 +😝 +😞 +😟 +😠 +😡 +😢 +😣 +😤 +😥 +😦 +😧 +😨 +😩 +😪 +😫 +😬 +😭 +😮 +😮‍💨 +😯 +😰 +😱 +😲 +😳 +😴 +😵 +😵‍💫 +😶 +😶‍🌫️ +😷 +😸 +😹 +😺 +😻 +😼 +😽 +😾 +😿 +🙀 +🙁 +🙂 +🙂‍↔️ +🙂‍↕️ +🙃 +🙄 +🙅 +🙅‍♀️ +🙅‍♂️ +🙅🏻 +🙅🏻‍♀️ +🙅🏻‍♂️ +🙅🏼 +🙅🏼‍♀️ +🙅🏼‍♂️ +🙅🏽 +🙅🏽‍♀️ +🙅🏽‍♂️ +🙅🏾 +🙅🏾‍♀️ +🙅🏾‍♂️ +🙅🏿 +🙅🏿‍♀️ +🙅🏿‍♂️ +🙆 +🙆‍♀️ +🙆‍♂️ +🙆🏻 +🙆🏻‍♀️ +🙆🏻‍♂️ +🙆🏼 +🙆🏼‍♀️ +🙆🏼‍♂️ +🙆🏽 +🙆🏽‍♀️ +🙆🏽‍♂️ +🙆🏾 +🙆🏾‍♀️ +🙆🏾‍♂️ +🙆🏿 +🙆🏿‍♀️ +🙆🏿‍♂️ +🙇 +🙇‍♀️ +🙇‍♂️ +🙇🏻 +🙇🏻‍♀️ +🙇🏻‍♂️ +🙇🏼 +🙇🏼‍♀️ +🙇🏼‍♂️ +🙇🏽 +🙇🏽‍♀️ +🙇🏽‍♂️ +🙇🏾 +🙇🏾‍♀️ +🙇🏾‍♂️ +🙇🏿 +🙇🏿‍♀️ +🙇🏿‍♂️ +🙈 +🙉 +🙊 +🙋 +🙋‍♀️ +🙋‍♂️ +🙋🏻 +🙋🏻‍♀️ +🙋🏻‍♂️ +🙋🏼 +🙋🏼‍♀️ +🙋🏼‍♂️ +🙋🏽 +🙋🏽‍♀️ +🙋🏽‍♂️ +🙋🏾 +🙋🏾‍♀️ +🙋🏾‍♂️ +🙋🏿 +🙋🏿‍♀️ +🙋🏿‍♂️ +🙌 +🙌🏻 +🙌🏼 +🙌🏽 +🙌🏾 +🙌🏿 +🙍 +🙍‍♀️ +🙍‍♂️ +🙍🏻 +🙍🏻‍♀️ +🙍🏻‍♂️ +🙍🏼 +🙍🏼‍♀️ +🙍🏼‍♂️ +🙍🏽 +🙍🏽‍♀️ +🙍🏽‍♂️ +🙍🏾 +🙍🏾‍♀️ +🙍🏾‍♂️ +🙍🏿 +🙍🏿‍♀️ +🙍🏿‍♂️ +🙎 +🙎‍♀️ +🙎‍♂️ +🙎🏻 +🙎🏻‍♀️ +🙎🏻‍♂️ +🙎🏼 +🙎🏼‍♀️ +🙎🏼‍♂️ +🙎🏽 +🙎🏽‍♀️ +🙎🏽‍♂️ +🙎🏾 +🙎🏾‍♀️ +🙎🏾‍♂️ +🙎🏿 +🙎🏿‍♀️ +🙎🏿‍♂️ +🙏 +🙏🏻 +🙏🏼 +🙏🏽 +🙏🏾 +🙏🏿 +🚀 +🚁 +🚂 +🚃 +🚄 +🚅 +🚆 +🚇 +🚈 +🚉 +🚊 +🚋 +🚌 +🚍 +🚎 +🚏 +🚐 +🚑 +🚒 +🚓 +🚔 +🚕 +🚖 +🚗 +🚘 +🚙 +🚚 +🚛 +🚜 +🚝 +🚞 +🚟 +🚠 +🚡 +🚢 +🚣 +🚣‍♀️ +🚣‍♂️ +🚣🏻 +🚣🏻‍♀️ +🚣🏻‍♂️ +🚣🏼 +🚣🏼‍♀️ +🚣🏼‍♂️ +🚣🏽 +🚣🏽‍♀️ +🚣🏽‍♂️ +🚣🏾 +🚣🏾‍♀️ +🚣🏾‍♂️ +🚣🏿 +🚣🏿‍♀️ +🚣🏿‍♂️ +🚤 +🚥 +🚦 +🚧 +🚨 +🚩 +🚪 +🚫 +🚬 +🚭 +🚮 +🚯 +🚰 +🚱 +🚲 +🚳 +🚴 +🚴‍♀️ +🚴‍♂️ +🚴🏻 +🚴🏻‍♀️ +🚴🏻‍♂️ +🚴🏼 +🚴🏼‍♀️ +🚴🏼‍♂️ +🚴🏽 +🚴🏽‍♀️ +🚴🏽‍♂️ +🚴🏾 +🚴🏾‍♀️ +🚴🏾‍♂️ +🚴🏿 +🚴🏿‍♀️ +🚴🏿‍♂️ +🚵 +🚵‍♀️ +🚵‍♂️ +🚵🏻 +🚵🏻‍♀️ +🚵🏻‍♂️ +🚵🏼 +🚵🏼‍♀️ +🚵🏼‍♂️ +🚵🏽 +🚵🏽‍♀️ +🚵🏽‍♂️ +🚵🏾 +🚵🏾‍♀️ +🚵🏾‍♂️ +🚵🏿 +🚵🏿‍♀️ +🚵🏿‍♂️ +🚶 +🚶‍♀️ +🚶‍♀️‍➡️ +🚶‍♂️ +🚶‍♂️‍➡️ +🚶‍➡️ +🚶🏻 +🚶🏻‍♀️ +🚶🏻‍♀️‍➡️ +🚶🏻‍♂️ +🚶🏻‍♂️‍➡️ +🚶🏻‍➡️ +🚶🏼 +🚶🏼‍♀️ +🚶🏼‍♀️‍➡️ +🚶🏼‍♂️ +🚶🏼‍♂️‍➡️ +🚶🏼‍➡️ +🚶🏽 +🚶🏽‍♀️ +🚶🏽‍♀️‍➡️ +🚶🏽‍♂️ +🚶🏽‍♂️‍➡️ +🚶🏽‍➡️ +🚶🏾 +🚶🏾‍♀️ +🚶🏾‍♀️‍➡️ +🚶🏾‍♂️ +🚶🏾‍♂️‍➡️ +🚶🏾‍➡️ +🚶🏿 +🚶🏿‍♀️ +🚶🏿‍♀️‍➡️ +🚶🏿‍♂️ +🚶🏿‍♂️‍➡️ +🚶🏿‍➡️ +🚷 +🚸 +🚹 +🚺 +🚻 +🚼 +🚽 +🚾 +🚿 +🛀 +🛀🏻 +🛀🏼 +🛀🏽 +🛀🏾 +🛀🏿 +🛁 +🛂 +🛃 +🛄 +🛅 +🛋️ +🛌 +🛌🏻 +🛌🏼 +🛌🏽 +🛌🏾 +🛌🏿 +🛍️ +🛎️ +🛏️ +🛐 +🛑 +🛒 +🛕 +🛖 +🛗 +🛘 +🛜 +🛝 +🛞 +🛟 +🛠️ +🛡️ +🛢️ +🛣️ +🛤️ +🛥️ +🛩️ +🛫 +🛬 +🛰️ +🛳️ +🛴 +🛵 +🛶 +🛷 +🛸 +🛹 +🛺 +🛻 +🛼 +🟠 +🟡 +🟢 +🟣 +🟤 +🟥 +🟦 +🟧 +🟨 +🟩 +🟪 +🟫 +🟰 +🤌 +🤌🏻 +🤌🏼 +🤌🏽 +🤌🏾 +🤌🏿 +🤍 +🤎 +🤏 +🤏🏻 +🤏🏼 +🤏🏽 +🤏🏾 +🤏🏿 +🤐 +🤑 +🤒 +🤓 +🤔 +🤕 +🤖 +🤗 +🤘 +🤘🏻 +🤘🏼 +🤘🏽 +🤘🏾 +🤘🏿 +🤙 +🤙🏻 +🤙🏼 +🤙🏽 +🤙🏾 +🤙🏿 +🤚 +🤚🏻 +🤚🏼 +🤚🏽 +🤚🏾 +🤚🏿 +🤛 +🤛🏻 +🤛🏼 +🤛🏽 +🤛🏾 +🤛🏿 +🤜 +🤜🏻 +🤜🏼 +🤜🏽 +🤜🏾 +🤜🏿 +🤝 +🤝🏻 +🤝🏼 +🤝🏽 +🤝🏾 +🤝🏿 +🤞 +🤞🏻 +🤞🏼 +🤞🏽 +🤞🏾 +🤞🏿 +🤟 +🤟🏻 +🤟🏼 +🤟🏽 +🤟🏾 +🤟🏿 +🤠 +🤡 +🤢 +🤣 +🤤 +🤥 +🤦 +🤦‍♀️ +🤦‍♂️ +🤦🏻 +🤦🏻‍♀️ +🤦🏻‍♂️ +🤦🏼 +🤦🏼‍♀️ +🤦🏼‍♂️ +🤦🏽 +🤦🏽‍♀️ +🤦🏽‍♂️ +🤦🏾 +🤦🏾‍♀️ +🤦🏾‍♂️ +🤦🏿 +🤦🏿‍♀️ +🤦🏿‍♂️ +🤧 +🤨 +🤩 +🤪 +🤫 +🤬 +🤭 +🤮 +🤯 +🤰 +🤰🏻 +🤰🏼 +🤰🏽 +🤰🏾 +🤰🏿 +🤱 +🤱🏻 +🤱🏼 +🤱🏽 +🤱🏾 +🤱🏿 +🤲 +🤲🏻 +🤲🏼 +🤲🏽 +🤲🏾 +🤲🏿 +🤳 +🤳🏻 +🤳🏼 +🤳🏽 +🤳🏾 +🤳🏿 +🤴 +🤴🏻 +🤴🏼 +🤴🏽 +🤴🏾 +🤴🏿 +🤵 +🤵‍♀️ +🤵‍♂️ +🤵🏻 +🤵🏻‍♀️ +🤵🏻‍♂️ +🤵🏼 +🤵🏼‍♀️ +🤵🏼‍♂️ +🤵🏽 +🤵🏽‍♀️ +🤵🏽‍♂️ +🤵🏾 +🤵🏾‍♀️ +🤵🏾‍♂️ +🤵🏿 +🤵🏿‍♀️ +🤵🏿‍♂️ +🤶 +🤶🏻 +🤶🏼 +🤶🏽 +🤶🏾 +🤶🏿 +🤷 +🤷‍♀️ +🤷‍♂️ +🤷🏻 +🤷🏻‍♀️ +🤷🏻‍♂️ +🤷🏼 +🤷🏼‍♀️ +🤷🏼‍♂️ +🤷🏽 +🤷🏽‍♀️ +🤷🏽‍♂️ +🤷🏾 +🤷🏾‍♀️ +🤷🏾‍♂️ +🤷🏿 +🤷🏿‍♀️ +🤷🏿‍♂️ +🤸 +🤸‍♀️ +🤸‍♂️ +🤸🏻 +🤸🏻‍♀️ +🤸🏻‍♂️ +🤸🏼 +🤸🏼‍♀️ +🤸🏼‍♂️ +🤸🏽 +🤸🏽‍♀️ +🤸🏽‍♂️ +🤸🏾 +🤸🏾‍♀️ +🤸🏾‍♂️ +🤸🏿 +🤸🏿‍♀️ +🤸🏿‍♂️ +🤹 +🤹‍♀️ +🤹‍♂️ +🤹🏻 +🤹🏻‍♀️ +🤹🏻‍♂️ +🤹🏼 +🤹🏼‍♀️ +🤹🏼‍♂️ +🤹🏽 +🤹🏽‍♀️ +🤹🏽‍♂️ +🤹🏾 +🤹🏾‍♀️ +🤹🏾‍♂️ +🤹🏿 +🤹🏿‍♀️ +🤹🏿‍♂️ +🤺 +🤼 +🤼‍♀️ +🤼‍♂️ +🤼🏻 +🤼🏻‍♀️ +🤼🏻‍♂️ +🤼🏼 +🤼🏼‍♀️ +🤼🏼‍♂️ +🤼🏽 +🤼🏽‍♀️ +🤼🏽‍♂️ +🤼🏾 +🤼🏾‍♀️ +🤼🏾‍♂️ +🤼🏿 +🤼🏿‍♀️ +🤼🏿‍♂️ +🤽 +🤽‍♀️ +🤽‍♂️ +🤽🏻 +🤽🏻‍♀️ +🤽🏻‍♂️ +🤽🏼 +🤽🏼‍♀️ +🤽🏼‍♂️ +🤽🏽 +🤽🏽‍♀️ +🤽🏽‍♂️ +🤽🏾 +🤽🏾‍♀️ +🤽🏾‍♂️ +🤽🏿 +🤽🏿‍♀️ +🤽🏿‍♂️ +🤾 +🤾‍♀️ +🤾‍♂️ +🤾🏻 +🤾🏻‍♀️ +🤾🏻‍♂️ +🤾🏼 +🤾🏼‍♀️ +🤾🏼‍♂️ +🤾🏽 +🤾🏽‍♀️ +🤾🏽‍♂️ +🤾🏾 +🤾🏾‍♀️ +🤾🏾‍♂️ +🤾🏿 +🤾🏿‍♀️ +🤾🏿‍♂️ +🤿 +🥀 +🥁 +🥂 +🥃 +🥄 +🥅 +🥇 +🥈 +🥉 +🥊 +🥋 +🥌 +🥍 +🥎 +🥏 +🥐 +🥑 +🥒 +🥓 +🥔 +🥕 +🥖 +🥗 +🥘 +🥙 +🥚 +🥛 +🥜 +🥝 +🥞 +🥟 +🥠 +🥡 +🥢 +🥣 +🥤 +🥥 +🥦 +🥧 +🥨 +🥩 +🥪 +🥫 +🥬 +🥭 +🥮 +🥯 +🥰 +🥱 +🥲 +🥳 +🥴 +🥵 +🥶 +🥷 +🥷🏻 +🥷🏼 +🥷🏽 +🥷🏾 +🥷🏿 +🥸 +🥹 +🥺 +🥻 +🥼 +🥽 +🥾 +🥿 +🦀 +🦁 +🦂 +🦃 +🦄 +🦅 +🦆 +🦇 +🦈 +🦉 +🦊 +🦋 +🦌 +🦍 +🦎 +🦏 +🦐 +🦑 +🦒 +🦓 +🦔 +🦕 +🦖 +🦗 +🦘 +🦙 +🦚 +🦛 +🦜 +🦝 +🦞 +🦟 +🦠 +🦡 +🦢 +🦣 +🦤 +🦥 +🦦 +🦧 +🦨 +🦩 +🦪 +🦫 +🦬 +🦭 +🦮 +🦯 +🦴 +🦵 +🦵🏻 +🦵🏼 +🦵🏽 +🦵🏾 +🦵🏿 +🦶 +🦶🏻 +🦶🏼 +🦶🏽 +🦶🏾 +🦶🏿 +🦷 +🦸 +🦸‍♀️ +🦸‍♂️ +🦸🏻 +🦸🏻‍♀️ +🦸🏻‍♂️ +🦸🏼 +🦸🏼‍♀️ +🦸🏼‍♂️ +🦸🏽 +🦸🏽‍♀️ +🦸🏽‍♂️ +🦸🏾 +🦸🏾‍♀️ +🦸🏾‍♂️ +🦸🏿 +🦸🏿‍♀️ +🦸🏿‍♂️ +🦹 +🦹‍♀️ +🦹‍♂️ +🦹🏻 +🦹🏻‍♀️ +🦹🏻‍♂️ +🦹🏼 +🦹🏼‍♀️ +🦹🏼‍♂️ +🦹🏽 +🦹🏽‍♀️ +🦹🏽‍♂️ +🦹🏾 +🦹🏾‍♀️ +🦹🏾‍♂️ +🦹🏿 +🦹🏿‍♀️ +🦹🏿‍♂️ +🦺 +🦻 +🦻🏻 +🦻🏼 +🦻🏽 +🦻🏾 +🦻🏿 +🦼 +🦽 +🦾 +🦿 +🧀 +🧁 +🧂 +🧃 +🧄 +🧅 +🧆 +🧇 +🧈 +🧉 +🧊 +🧋 +🧌 +🧍 +🧍‍♀️ +🧍‍♂️ +🧍🏻 +🧍🏻‍♀️ +🧍🏻‍♂️ +🧍🏼 +🧍🏼‍♀️ +🧍🏼‍♂️ +🧍🏽 +🧍🏽‍♀️ +🧍🏽‍♂️ +🧍🏾 +🧍🏾‍♀️ +🧍🏾‍♂️ +🧍🏿 +🧍🏿‍♀️ +🧍🏿‍♂️ +🧎 +🧎‍♀️ +🧎‍♀️‍➡️ +🧎‍♂️ +🧎‍♂️‍➡️ +🧎‍➡️ +🧎🏻 +🧎🏻‍♀️ +🧎🏻‍♀️‍➡️ +🧎🏻‍♂️ +🧎🏻‍♂️‍➡️ +🧎🏻‍➡️ +🧎🏼 +🧎🏼‍♀️ +🧎🏼‍♀️‍➡️ +🧎🏼‍♂️ +🧎🏼‍♂️‍➡️ +🧎🏼‍➡️ +🧎🏽 +🧎🏽‍♀️ +🧎🏽‍♀️‍➡️ +🧎🏽‍♂️ +🧎🏽‍♂️‍➡️ +🧎🏽‍➡️ +🧎🏾 +🧎🏾‍♀️ +🧎🏾‍♀️‍➡️ +🧎🏾‍♂️ +🧎🏾‍♂️‍➡️ +🧎🏾‍➡️ +🧎🏿 +🧎🏿‍♀️ +🧎🏿‍♀️‍➡️ +🧎🏿‍♂️ +🧎🏿‍♂️‍➡️ +🧎🏿‍➡️ +🧏 +🧏‍♀️ +🧏‍♂️ +🧏🏻 +🧏🏻‍♀️ +🧏🏻‍♂️ +🧏🏼 +🧏🏼‍♀️ +🧏🏼‍♂️ +🧏🏽 +🧏🏽‍♀️ +🧏🏽‍♂️ +🧏🏾 +🧏🏾‍♀️ +🧏🏾‍♂️ +🧏🏿 +🧏🏿‍♀️ +🧏🏿‍♂️ +🧐 +🧑 +🧑‍⚕️ +🧑‍⚖️ +🧑‍✈️ +🧑‍🌾 +🧑‍🍳 +🧑‍🍼 +🧑‍🎄 +🧑‍🎓 +🧑‍🎤 +🧑‍🎨 +🧑‍🏫 +🧑‍🏭 +🧑‍💻 +🧑‍💼 +🧑‍🔧 +🧑‍🔬 +🧑‍🚀 +🧑‍🚒 +🧑‍🤝‍🧑 +🧑‍🦯 +🧑‍🦯‍➡️ +🧑‍🦰 +🧑‍🦱 +🧑‍🦲 +🧑‍🦳 +🧑‍🦼 +🧑‍🦼‍➡️ +🧑‍🦽 +🧑‍🦽‍➡️ +🧑‍🧑‍🧒 +🧑‍🧑‍🧒‍🧒 +🧑‍🧒 +🧑‍🧒‍🧒 +🧑‍🩰 +🧑🏻 +🧑🏻‍⚕️ +🧑🏻‍⚖️ +🧑🏻‍✈️ +🧑🏻‍❤️‍💋‍🧑🏼 +🧑🏻‍❤️‍💋‍🧑🏽 +🧑🏻‍❤️‍💋‍🧑🏾 +🧑🏻‍❤️‍💋‍🧑🏿 +🧑🏻‍❤️‍🧑🏼 +🧑🏻‍❤️‍🧑🏽 +🧑🏻‍❤️‍🧑🏾 +🧑🏻‍❤️‍🧑🏿 +🧑🏻‍🌾 +🧑🏻‍🍳 +🧑🏻‍🍼 +🧑🏻‍🎄 +🧑🏻‍🎓 +🧑🏻‍🎤 +🧑🏻‍🎨 +🧑🏻‍🏫 +🧑🏻‍🏭 +🧑🏻‍🐰‍🧑🏼 +🧑🏻‍🐰‍🧑🏽 +🧑🏻‍🐰‍🧑🏾 +🧑🏻‍🐰‍🧑🏿 +🧑🏻‍💻 +🧑🏻‍💼 +🧑🏻‍🔧 +🧑🏻‍🔬 +🧑🏻‍🚀 +🧑🏻‍🚒 +🧑🏻‍🤝‍🧑🏻 +🧑🏻‍🤝‍🧑🏼 +🧑🏻‍🤝‍🧑🏽 +🧑🏻‍🤝‍🧑🏾 +🧑🏻‍🤝‍🧑🏿 +🧑🏻‍🦯 +🧑🏻‍🦯‍➡️ +🧑🏻‍🦰 +🧑🏻‍🦱 +🧑🏻‍🦲 +🧑🏻‍🦳 +🧑🏻‍🦼 +🧑🏻‍🦼‍➡️ +🧑🏻‍🦽 +🧑🏻‍🦽‍➡️ +🧑🏻‍🩰 +🧑🏻‍🫯‍🧑🏼 +🧑🏻‍🫯‍🧑🏽 +🧑🏻‍🫯‍🧑🏾 +🧑🏻‍🫯‍🧑🏿 +🧑🏼 +🧑🏼‍⚕️ +🧑🏼‍⚖️ +🧑🏼‍✈️ +🧑🏼‍❤️‍💋‍🧑🏻 +🧑🏼‍❤️‍💋‍🧑🏽 +🧑🏼‍❤️‍💋‍🧑🏾 +🧑🏼‍❤️‍💋‍🧑🏿 +🧑🏼‍❤️‍🧑🏻 +🧑🏼‍❤️‍🧑🏽 +🧑🏼‍❤️‍🧑🏾 +🧑🏼‍❤️‍🧑🏿 +🧑🏼‍🌾 +🧑🏼‍🍳 +🧑🏼‍🍼 +🧑🏼‍🎄 +🧑🏼‍🎓 +🧑🏼‍🎤 +🧑🏼‍🎨 +🧑🏼‍🏫 +🧑🏼‍🏭 +🧑🏼‍🐰‍🧑🏻 +🧑🏼‍🐰‍🧑🏽 +🧑🏼‍🐰‍🧑🏾 +🧑🏼‍🐰‍🧑🏿 +🧑🏼‍💻 +🧑🏼‍💼 +🧑🏼‍🔧 +🧑🏼‍🔬 +🧑🏼‍🚀 +🧑🏼‍🚒 +🧑🏼‍🤝‍🧑🏻 +🧑🏼‍🤝‍🧑🏼 +🧑🏼‍🤝‍🧑🏽 +🧑🏼‍🤝‍🧑🏾 +🧑🏼‍🤝‍🧑🏿 +🧑🏼‍🦯 +🧑🏼‍🦯‍➡️ +🧑🏼‍🦰 +🧑🏼‍🦱 +🧑🏼‍🦲 +🧑🏼‍🦳 +🧑🏼‍🦼 +🧑🏼‍🦼‍➡️ +🧑🏼‍🦽 +🧑🏼‍🦽‍➡️ +🧑🏼‍🩰 +🧑🏼‍🫯‍🧑🏻 +🧑🏼‍🫯‍🧑🏽 +🧑🏼‍🫯‍🧑🏾 +🧑🏼‍🫯‍🧑🏿 +🧑🏽 +🧑🏽‍⚕️ +🧑🏽‍⚖️ +🧑🏽‍✈️ +🧑🏽‍❤️‍💋‍🧑🏻 +🧑🏽‍❤️‍💋‍🧑🏼 +🧑🏽‍❤️‍💋‍🧑🏾 +🧑🏽‍❤️‍💋‍🧑🏿 +🧑🏽‍❤️‍🧑🏻 +🧑🏽‍❤️‍🧑🏼 +🧑🏽‍❤️‍🧑🏾 +🧑🏽‍❤️‍🧑🏿 +🧑🏽‍🌾 +🧑🏽‍🍳 +🧑🏽‍🍼 +🧑🏽‍🎄 +🧑🏽‍🎓 +🧑🏽‍🎤 +🧑🏽‍🎨 +🧑🏽‍🏫 +🧑🏽‍🏭 +🧑🏽‍🐰‍🧑🏻 +🧑🏽‍🐰‍🧑🏼 +🧑🏽‍🐰‍🧑🏾 +🧑🏽‍🐰‍🧑🏿 +🧑🏽‍💻 +🧑🏽‍💼 +🧑🏽‍🔧 +🧑🏽‍🔬 +🧑🏽‍🚀 +🧑🏽‍🚒 +🧑🏽‍🤝‍🧑🏻 +🧑🏽‍🤝‍🧑🏼 +🧑🏽‍🤝‍🧑🏽 +🧑🏽‍🤝‍🧑🏾 +🧑🏽‍🤝‍🧑🏿 +🧑🏽‍🦯 +🧑🏽‍🦯‍➡️ +🧑🏽‍🦰 +🧑🏽‍🦱 +🧑🏽‍🦲 +🧑🏽‍🦳 +🧑🏽‍🦼 +🧑🏽‍🦼‍➡️ +🧑🏽‍🦽 +🧑🏽‍🦽‍➡️ +🧑🏽‍🩰 +🧑🏽‍🫯‍🧑🏻 +🧑🏽‍🫯‍🧑🏼 +🧑🏽‍🫯‍🧑🏾 +🧑🏽‍🫯‍🧑🏿 +🧑🏾 +🧑🏾‍⚕️ +🧑🏾‍⚖️ +🧑🏾‍✈️ +🧑🏾‍❤️‍💋‍🧑🏻 +🧑🏾‍❤️‍💋‍🧑🏼 +🧑🏾‍❤️‍💋‍🧑🏽 +🧑🏾‍❤️‍💋‍🧑🏿 +🧑🏾‍❤️‍🧑🏻 +🧑🏾‍❤️‍🧑🏼 +🧑🏾‍❤️‍🧑🏽 +🧑🏾‍❤️‍🧑🏿 +🧑🏾‍🌾 +🧑🏾‍🍳 +🧑🏾‍🍼 +🧑🏾‍🎄 +🧑🏾‍🎓 +🧑🏾‍🎤 +🧑🏾‍🎨 +🧑🏾‍🏫 +🧑🏾‍🏭 +🧑🏾‍🐰‍🧑🏻 +🧑🏾‍🐰‍🧑🏼 +🧑🏾‍🐰‍🧑🏽 +🧑🏾‍🐰‍🧑🏿 +🧑🏾‍💻 +🧑🏾‍💼 +🧑🏾‍🔧 +🧑🏾‍🔬 +🧑🏾‍🚀 +🧑🏾‍🚒 +🧑🏾‍🤝‍🧑🏻 +🧑🏾‍🤝‍🧑🏼 +🧑🏾‍🤝‍🧑🏽 +🧑🏾‍🤝‍🧑🏾 +🧑🏾‍🤝‍🧑🏿 +🧑🏾‍🦯 +🧑🏾‍🦯‍➡️ +🧑🏾‍🦰 +🧑🏾‍🦱 +🧑🏾‍🦲 +🧑🏾‍🦳 +🧑🏾‍🦼 +🧑🏾‍🦼‍➡️ +🧑🏾‍🦽 +🧑🏾‍🦽‍➡️ +🧑🏾‍🩰 +🧑🏾‍🫯‍🧑🏻 +🧑🏾‍🫯‍🧑🏼 +🧑🏾‍🫯‍🧑🏽 +🧑🏾‍🫯‍🧑🏿 +🧑🏿 +🧑🏿‍⚕️ +🧑🏿‍⚖️ +🧑🏿‍✈️ +🧑🏿‍❤️‍💋‍🧑🏻 +🧑🏿‍❤️‍💋‍🧑🏼 +🧑🏿‍❤️‍💋‍🧑🏽 +🧑🏿‍❤️‍💋‍🧑🏾 +🧑🏿‍❤️‍🧑🏻 +🧑🏿‍❤️‍🧑🏼 +🧑🏿‍❤️‍🧑🏽 +🧑🏿‍❤️‍🧑🏾 +🧑🏿‍🌾 +🧑🏿‍🍳 +🧑🏿‍🍼 +🧑🏿‍🎄 +🧑🏿‍🎓 +🧑🏿‍🎤 +🧑🏿‍🎨 +🧑🏿‍🏫 +🧑🏿‍🏭 +🧑🏿‍🐰‍🧑🏻 +🧑🏿‍🐰‍🧑🏼 +🧑🏿‍🐰‍🧑🏽 +🧑🏿‍🐰‍🧑🏾 +🧑🏿‍💻 +🧑🏿‍💼 +🧑🏿‍🔧 +🧑🏿‍🔬 +🧑🏿‍🚀 +🧑🏿‍🚒 +🧑🏿‍🤝‍🧑🏻 +🧑🏿‍🤝‍🧑🏼 +🧑🏿‍🤝‍🧑🏽 +🧑🏿‍🤝‍🧑🏾 +🧑🏿‍🤝‍🧑🏿 +🧑🏿‍🦯 +🧑🏿‍🦯‍➡️ +🧑🏿‍🦰 +🧑🏿‍🦱 +🧑🏿‍🦲 +🧑🏿‍🦳 +🧑🏿‍🦼 +🧑🏿‍🦼‍➡️ +🧑🏿‍🦽 +🧑🏿‍🦽‍➡️ +🧑🏿‍🩰 +🧑🏿‍🫯‍🧑🏻 +🧑🏿‍🫯‍🧑🏼 +🧑🏿‍🫯‍🧑🏽 +🧑🏿‍🫯‍🧑🏾 +🧒 +🧒🏻 +🧒🏼 +🧒🏽 +🧒🏾 +🧒🏿 +🧓 +🧓🏻 +🧓🏼 +🧓🏽 +🧓🏾 +🧓🏿 +🧔 +🧔‍♀️ +🧔‍♂️ +🧔🏻 +🧔🏻‍♀️ +🧔🏻‍♂️ +🧔🏼 +🧔🏼‍♀️ +🧔🏼‍♂️ +🧔🏽 +🧔🏽‍♀️ +🧔🏽‍♂️ +🧔🏾 +🧔🏾‍♀️ +🧔🏾‍♂️ +🧔🏿 +🧔🏿‍♀️ +🧔🏿‍♂️ +🧕 +🧕🏻 +🧕🏼 +🧕🏽 +🧕🏾 +🧕🏿 +🧖 +🧖‍♀️ +🧖‍♂️ +🧖🏻 +🧖🏻‍♀️ +🧖🏻‍♂️ +🧖🏼 +🧖🏼‍♀️ +🧖🏼‍♂️ +🧖🏽 +🧖🏽‍♀️ +🧖🏽‍♂️ +🧖🏾 +🧖🏾‍♀️ +🧖🏾‍♂️ +🧖🏿 +🧖🏿‍♀️ +🧖🏿‍♂️ +🧗 +🧗‍♀️ +🧗‍♂️ +🧗🏻 +🧗🏻‍♀️ +🧗🏻‍♂️ +🧗🏼 +🧗🏼‍♀️ +🧗🏼‍♂️ +🧗🏽 +🧗🏽‍♀️ +🧗🏽‍♂️ +🧗🏾 +🧗🏾‍♀️ +🧗🏾‍♂️ +🧗🏿 +🧗🏿‍♀️ +🧗🏿‍♂️ +🧘 +🧘‍♀️ +🧘‍♂️ +🧘🏻 +🧘🏻‍♀️ +🧘🏻‍♂️ +🧘🏼 +🧘🏼‍♀️ +🧘🏼‍♂️ +🧘🏽 +🧘🏽‍♀️ +🧘🏽‍♂️ +🧘🏾 +🧘🏾‍♀️ +🧘🏾‍♂️ +🧘🏿 +🧘🏿‍♀️ +🧘🏿‍♂️ +🧙 +🧙‍♀️ +🧙‍♂️ +🧙🏻 +🧙🏻‍♀️ +🧙🏻‍♂️ +🧙🏼 +🧙🏼‍♀️ +🧙🏼‍♂️ +🧙🏽 +🧙🏽‍♀️ +🧙🏽‍♂️ +🧙🏾 +🧙🏾‍♀️ +🧙🏾‍♂️ +🧙🏿 +🧙🏿‍♀️ +🧙🏿‍♂️ +🧚 +🧚‍♀️ +🧚‍♂️ +🧚🏻 +🧚🏻‍♀️ +🧚🏻‍♂️ +🧚🏼 +🧚🏼‍♀️ +🧚🏼‍♂️ +🧚🏽 +🧚🏽‍♀️ +🧚🏽‍♂️ +🧚🏾 +🧚🏾‍♀️ +🧚🏾‍♂️ +🧚🏿 +🧚🏿‍♀️ +🧚🏿‍♂️ +🧛 +🧛‍♀️ +🧛‍♂️ +🧛🏻 +🧛🏻‍♀️ +🧛🏻‍♂️ +🧛🏼 +🧛🏼‍♀️ +🧛🏼‍♂️ +🧛🏽 +🧛🏽‍♀️ +🧛🏽‍♂️ +🧛🏾 +🧛🏾‍♀️ +🧛🏾‍♂️ +🧛🏿 +🧛🏿‍♀️ +🧛🏿‍♂️ +🧜 +🧜‍♀️ +🧜‍♂️ +🧜🏻 +🧜🏻‍♀️ +🧜🏻‍♂️ +🧜🏼 +🧜🏼‍♀️ +🧜🏼‍♂️ +🧜🏽 +🧜🏽‍♀️ +🧜🏽‍♂️ +🧜🏾 +🧜🏾‍♀️ +🧜🏾‍♂️ +🧜🏿 +🧜🏿‍♀️ +🧜🏿‍♂️ +🧝 +🧝‍♀️ +🧝‍♂️ +🧝🏻 +🧝🏻‍♀️ +🧝🏻‍♂️ +🧝🏼 +🧝🏼‍♀️ +🧝🏼‍♂️ +🧝🏽 +🧝🏽‍♀️ +🧝🏽‍♂️ +🧝🏾 +🧝🏾‍♀️ +🧝🏾‍♂️ +🧝🏿 +🧝🏿‍♀️ +🧝🏿‍♂️ +🧞 +🧞‍♀️ +🧞‍♂️ +🧟 +🧟‍♀️ +🧟‍♂️ +🧠 +🧡 +🧢 +🧣 +🧤 +🧥 +🧦 +🧧 +🧨 +🧩 +🧪 +🧫 +🧬 +🧭 +🧮 +🧯 +🧰 +🧱 +🧲 +🧳 +🧴 +🧵 +🧶 +🧷 +🧸 +🧹 +🧺 +🧻 +🧼 +🧽 +🧾 +🧿 +🩰 +🩱 +🩲 +🩳 +🩴 +🩵 +🩶 +🩷 +🩸 +🩹 +🩺 +🩻 +🩼 +🪀 +🪁 +🪂 +🪃 +🪄 +🪅 +🪆 +🪇 +🪈 +🪉 +🪊 +🪎 +🪏 +🪐 +🪑 +🪒 +🪓 +🪔 +🪕 +🪖 +🪗 +🪘 +🪙 +🪚 +🪛 +🪜 +🪝 +🪞 +🪟 +🪠 +🪡 +🪢 +🪣 +🪤 +🪥 +🪦 +🪧 +🪨 +🪩 +🪪 +🪫 +🪬 +🪭 +🪮 +🪯 +🪰 +🪱 +🪲 +🪳 +🪴 +🪵 +🪶 +🪷 +🪸 +🪹 +🪺 +🪻 +🪼 +🪽 +🪾 +🪿 +🫀 +🫁 +🫂 +🫃 +🫃🏻 +🫃🏼 +🫃🏽 +🫃🏾 +🫃🏿 +🫄 +🫄🏻 +🫄🏼 +🫄🏽 +🫄🏾 +🫄🏿 +🫅 +🫅🏻 +🫅🏼 +🫅🏽 +🫅🏾 +🫅🏿 +🫆 +🫈 +🫍 +🫎 +🫏 +🫐 +🫑 +🫒 +🫓 +🫔 +🫕 +🫖 +🫗 +🫘 +🫙 +🫚 +🫛 +🫜 +🫟 +🫠 +🫡 +🫢 +🫣 +🫤 +🫥 +🫦 +🫧 +🫨 +🫩 +🫪 +🫯 +🫰 +🫰🏻 +🫰🏼 +🫰🏽 +🫰🏾 +🫰🏿 +🫱 +🫱🏻 +🫱🏻‍🫲🏼 +🫱🏻‍🫲🏽 +🫱🏻‍🫲🏾 +🫱🏻‍🫲🏿 +🫱🏼 +🫱🏼‍🫲🏻 +🫱🏼‍🫲🏽 +🫱🏼‍🫲🏾 +🫱🏼‍🫲🏿 +🫱🏽 +🫱🏽‍🫲🏻 +🫱🏽‍🫲🏼 +🫱🏽‍🫲🏾 +🫱🏽‍🫲🏿 +🫱🏾 +🫱🏾‍🫲🏻 +🫱🏾‍🫲🏼 +🫱🏾‍🫲🏽 +🫱🏾‍🫲🏿 +🫱🏿 +🫱🏿‍🫲🏻 +🫱🏿‍🫲🏼 +🫱🏿‍🫲🏽 +🫱🏿‍🫲🏾 +🫲 +🫲🏻 +🫲🏼 +🫲🏽 +🫲🏾 +🫲🏿 +🫳 +🫳🏻 +🫳🏼 +🫳🏽 +🫳🏾 +🫳🏿 +🫴 +🫴🏻 +🫴🏼 +🫴🏽 +🫴🏾 +🫴🏿 +🫵 +🫵🏻 +🫵🏼 +🫵🏽 +🫵🏾 +🫵🏿 +🫶 +🫶🏻 +🫶🏼 +🫶🏽 +🫶🏾 +🫶🏿 +🫷 +🫷🏻 +🫷🏼 +🫷🏽 +🫷🏾 +🫷🏿 +🫸 +🫸🏻 +🫸🏼 +🫸🏽 +🫸🏾 +🫸🏿 \ No newline at end of file diff --git a/crates/core/database/src/models/file_hashes/model.rs b/crates/core/database/src/models/file_hashes/model.rs index cec7a39db..dfc9b96e5 100644 --- a/crates/core/database/src/models/file_hashes/model.rs +++ b/crates/core/database/src/models/file_hashes/model.rs @@ -45,7 +45,8 @@ auto_derived!( Image { width: isize, height: isize, - // animated: bool // TODO: https://docs.rs/image/latest/image/trait.AnimationDecoder.html for APNG support + thumbhash: Option>, + animated: Option, }, /// File is a video with specific dimensions Video { width: isize, height: isize }, diff --git a/crates/core/database/src/models/file_hashes/ops.rs b/crates/core/database/src/models/file_hashes/ops.rs index 4b249e4cb..cdd6c936e 100644 --- a/crates/core/database/src/models/file_hashes/ops.rs +++ b/crates/core/database/src/models/file_hashes/ops.rs @@ -17,6 +17,12 @@ pub trait AbstractAttachmentHashes: Sync + Send { /// Update an attachment hash nonce value. async fn set_attachment_hash_nonce(&self, hash: &str, nonce: &str) -> Result<()>; + /// Updates the attachments animated metadata value. + /// + /// The primary use for this is to update the metadata for existing uploaded files, this + /// can only be used for images. + async fn set_attachment_hash_animated(&self, hash: &str, animated: bool) -> Result<()>; + /// Delete attachment hash by id. async fn delete_attachment_hash(&self, id: &str) -> Result<()>; } diff --git a/crates/core/database/src/models/file_hashes/ops/mongodb.rs b/crates/core/database/src/models/file_hashes/ops/mongodb.rs index e2f06067d..9e67a0a56 100644 --- a/crates/core/database/src/models/file_hashes/ops/mongodb.rs +++ b/crates/core/database/src/models/file_hashes/ops/mongodb.rs @@ -48,6 +48,29 @@ impl AbstractAttachmentHashes for MongoDb { .map_err(|_| create_database_error!("update_one", COL)) } + /// Updates the attachments animated metadata value. + /// + /// The primary use for this is to update the metadata for existing uploaded files, this + /// can only be used for images. + async fn set_attachment_hash_animated(&self, hash: &str, animated: bool) -> Result<()> { + self.col::(COL) + .update_one( + doc! { + "_id": hash, + "metadata.type": "Image", + "metadata.animated": { "$exists": false }, + }, + doc! { + "$set": { + "metadata.animated": animated + } + }, + ) + .await + .map(|_| ()) + .map_err(|_| create_database_error!("update_one", COL)) + } + /// Delete attachment hash by id. async fn delete_attachment_hash(&self, id: &str) -> Result<()> { query!(self, delete_one_by_id, COL, id).map(|_| ()) diff --git a/crates/core/database/src/models/file_hashes/ops/reference.rs b/crates/core/database/src/models/file_hashes/ops/reference.rs index 7733523e3..3c54d9e2d 100644 --- a/crates/core/database/src/models/file_hashes/ops/reference.rs +++ b/crates/core/database/src/models/file_hashes/ops/reference.rs @@ -1,7 +1,6 @@ use revolt_result::Result; -use crate::FileHash; -use crate::ReferenceDb; +use crate::{FileHash, Metadata, ReferenceDb}; use super::AbstractAttachmentHashes; @@ -39,6 +38,29 @@ impl AbstractAttachmentHashes for ReferenceDb { } } + /// Updates the attachments animated metadata value. + /// + /// The primary use for this is to update the metadata for existing uploaded files, this + /// can only be used for images. + async fn set_attachment_hash_animated(&self, hash: &str, animated: bool) -> Result<()> { + let mut hashes = self.file_hashes.lock().await; + if let Some(FileHash { + metadata: + Metadata::Image { + animated: Some(animated_metadata), + .. + }, + .. + }) = hashes.get_mut(hash) + { + *animated_metadata = animated; + + Ok(()) + } else { + Err(create_error!(NotFound)) + } + } + /// Delete attachment hash by id. async fn delete_attachment_hash(&self, id: &str) -> Result<()> { let mut file_hashes = self.file_hashes.lock().await; diff --git a/crates/core/database/src/models/files/model.rs b/crates/core/database/src/models/files/model.rs index 5ea78f9b2..1aaf8b824 100644 --- a/crates/core/database/src/models/files/model.rs +++ b/crates/core/database/src/models/files/model.rs @@ -70,6 +70,7 @@ auto_derived!( LegacyGroupIcon, ChannelIcon, ServerIcon, + RoleIcon, } /// Information about what the file was used for @@ -239,4 +240,23 @@ impl File { ) .await } + + /// Use a file for a role icon + pub async fn use_role_icon( + db: &Database, + id: &str, + parent: &str, + uploader_id: &str, + ) -> Result { + db.find_and_use_attachment( + id, + "icons", + FileUsedFor { + id: parent.to_owned(), + object_type: FileUsedForType::RoleIcon, + }, + uploader_id.to_owned(), + ) + .await + } } diff --git a/crates/core/database/src/models/messages/model.rs b/crates/core/database/src/models/messages/model.rs index 53d380122..bacb3c53f 100644 --- a/crates/core/database/src/models/messages/model.rs +++ b/crates/core/database/src/models/messages/model.rs @@ -1,5 +1,3 @@ -use std::{collections::HashSet, hash::RandomState}; - use indexmap::{IndexMap, IndexSet}; use iso8601_timestamp::Timestamp; use revolt_config::{config, FeaturesLimits}; @@ -9,6 +7,8 @@ use revolt_models::v0::{ }; use revolt_permissions::{calculate_channel_permissions, ChannelPermission, PermissionValue}; use revolt_result::{ErrorType, Result}; +use std::time::SystemTime; +use std::{collections::HashSet, hash::RandomState}; use ulid::Ulid; use validator::Validate; @@ -114,6 +114,11 @@ auto_derived!( MessagePinned { id: String, by: String }, #[serde(rename = "message_unpinned")] MessageUnpinned { id: String, by: String }, + #[serde(rename = "call_started")] + CallStarted { + by: String, + finished_at: Option, + }, } /// Name and / or avatar override information @@ -326,9 +331,7 @@ impl Message { } let server_id = match channel { - Channel::TextChannel { ref server, .. } | Channel::VoiceChannel { ref server, .. } => { - Some(server.clone()) - } + Channel::TextChannel { ref server, .. } => Some(server.clone()), _ => None, }; @@ -385,6 +388,7 @@ impl Message { mut role_mentions, mut mentions_everyone, mut mentions_online, + .. } = message_mentions; if allow_mass_mentions && server_id.is_some() && !role_mentions.is_empty() { @@ -440,7 +444,8 @@ impl Message { } // Verify replies are valid. - let mut replies = HashSet::new(); + let mut replies = Vec::new(); + if let Some(entries) = data.replies { if entries.len() > config.features.limits.global.message_replies { return Err(create_error!(TooManyReplies { @@ -448,6 +453,8 @@ impl Message { })); } + replies.reserve(entries.len()); + for ReplyIntent { id, mention, @@ -461,7 +468,12 @@ impl Message { user_mentions.insert(message.author.to_owned()); } - replies.insert(message.id); + // This is O(n^2), but this is faster than a HashSet + // when n < 20; as long as the message_replies limit + // is reasonable, this will be fast. + if !replies.contains(&message.id) { + replies.push(message.id); + } } // If the referenced message doesn't exist and fail_if_not_exists // is set to false, send the message without the reply. @@ -478,6 +490,7 @@ impl Message { // Validate the mentions go to users in the channel/server if !user_mentions.is_empty() { + #[allow(deprecated)] match channel { Channel::DirectMessage { ref recipients, .. } | Channel::Group { ref recipients, .. } => { @@ -485,8 +498,7 @@ impl Message { user_mentions.retain(|m| recipients_hash.contains(m)); role_mentions.clear(); } - Channel::TextChannel { ref server, .. } - | Channel::VoiceChannel { ref server, .. } => { + Channel::TextChannel { ref server, .. } => { let mentions_vec = Vec::from_iter(user_mentions.iter().cloned()); let valid_members = db.fetch_members(server.as_str(), &mentions_vec[..]).await; @@ -534,9 +546,7 @@ impl Message { } if !replies.is_empty() { - message - .replies - .replace(replies.into_iter().collect::>()); + message.replies.replace(replies); } // Calculate final message flags @@ -678,9 +688,13 @@ impl Message { ) .await?; + let is_dm_or_group = matches!( + channel, + Channel::DirectMessage { .. } | Channel::Group { .. } + ); if !self.has_suppressed_notifications() - && (self.mentions.is_some() || self.contains_mass_push_mention()) + && (is_dm_or_group || self.mentions.is_some() || self.contains_mass_push_mention()) { // send Push notifications #[cfg(feature = "tasks")] @@ -691,7 +705,7 @@ impl Message { Some( PushNotification::from( self.clone().into_model(user, member), - Some(author), + Some(author.clone()), channel.to_owned().into(), ) .await, @@ -699,7 +713,11 @@ impl Message { self.clone(), match channel { Channel::DirectMessage { recipients, .. } - | Channel::Group { recipients, .. } => recipients.clone(), + | Channel::Group { recipients, .. } => recipients + .iter() + .filter(|uid| *uid != author.id()) + .cloned() + .collect(), Channel::TextChannel { .. } => { self.mentions.clone().unwrap_or_default() } @@ -794,7 +812,7 @@ impl Message { query: MessageQuery, perspective: &User, include_users: Option, - server_id: Option, + server_id: Option<&str>, ) -> Result { let messages: Vec = db .fetch_messages(query) @@ -837,6 +855,7 @@ impl Message { v0::SystemMessage::MessageUnpinned { by, .. } => { users.push(by.clone()); } + v0::SystemMessage::CallStarted { by, .. } => users.push(by.clone()), } } users @@ -851,7 +870,7 @@ impl Message { users, members: if let Some(server_id) = server_id { Some( - db.fetch_members(&server_id, &user_ids) + db.fetch_members(server_id, &user_ids) .await? .into_iter() .map(Into::into) @@ -1020,6 +1039,31 @@ impl Message { Ok(()) } + /// Bulk delete messages by an author since a given time + pub async fn bulk_delete_by_author_since( + db: &Database, + channels: &[String], + author: &str, + since: SystemTime, + ) -> Result<()> { + let deleted_groups = db + .delete_messages_by_author_since(channels, author, since) + .await?; + + for (channel_id, message_ids) in deleted_groups { + if !message_ids.is_empty() { + EventV1::BulkMessageDelete { + channel: channel_id.clone(), + ids: message_ids, + } + .p(channel_id) + .await; + } + } + + Ok(()) + } + /// Remove a reaction from a message pub async fn remove_reaction(&self, db: &Database, user: &str, emoji: &str) -> Result<()> { // Check if it actually exists diff --git a/crates/core/database/src/models/messages/ops.rs b/crates/core/database/src/models/messages/ops.rs index 4d54e83cb..8bb538886 100644 --- a/crates/core/database/src/models/messages/ops.rs +++ b/crates/core/database/src/models/messages/ops.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; +use std::time::SystemTime; use revolt_result::Result; use crate::{AppendMessage, FieldsMessage, Message, MessageQuery, PartialMessage}; @@ -40,4 +42,14 @@ pub trait AbstractMessages: Sync + Send { /// Delete messages from a channel by their ids and corresponding channel id async fn delete_messages(&self, channel: &str, ids: &[String]) -> Result<()>; + + /// Delete all messages from a specific author in a server from a certain ULID onwards + async fn delete_messages_by_author_since( + &self, + channels: &[String], + author: &str, + since: SystemTime + ) -> Result>>; + + async fn delete_messages_by_user(&self, user_id: &str) -> Result<()>; } diff --git a/crates/core/database/src/models/messages/ops/mongodb.rs b/crates/core/database/src/models/messages/ops/mongodb.rs index 449e71efd..03a2d84a4 100644 --- a/crates/core/database/src/models/messages/ops/mongodb.rs +++ b/crates/core/database/src/models/messages/ops/mongodb.rs @@ -1,8 +1,12 @@ use bson::{to_bson, Document}; use futures::try_join; +use futures::StreamExt; use mongodb::options::FindOptions; use revolt_models::v0::MessageSort; use revolt_result::Result; +use std::collections::{HashMap, HashSet}; +use std::time::SystemTime; +use ulid::Ulid; use crate::{ AppendMessage, DocumentId, FieldsMessage, IntoDocumentPath, Message, MessageQuery, @@ -306,6 +310,118 @@ impl AbstractMessages for MongoDb { .map(|_| ()) .map_err(|_| create_database_error!("delete_many", COL)) } + + /// Delete all messages from a specific author in a server from a certain ULID onwards + async fn delete_messages_by_author_since( + &self, + channels: &[String], + author: &str, + since: SystemTime, + ) -> Result>> { + let threshold_ulid = Ulid::from_datetime(since).to_string(); + + let filter = doc! { + "author": author, + "channel": { "$in": channels }, + "_id": { "$gte": &threshold_ulid } + }; + + let pipeline = vec![ + doc! { "$match": filter.clone() }, + doc! { + "$project": { + "channel": 1_i32, + "message_id": "$_id", + "attachment_ids": { + "$map": { + "input": { "$ifNull": ["$attachments", Vec::::new()] }, + "as": "a", + "in": "$$a._id" + } + } + } + }, + doc! { + "$group": { + "_id": "$channel", + "message_ids": { "$push": "$message_id" }, + "attachment_ids_nested": { "$push": "$attachment_ids" } + } + }, + doc! { + "$project": { + "message_ids": 1_i32, + "attachment_ids": { + "$reduce": { + "input": "$attachment_ids_nested", + "initialValue": Vec::::new(), + "in": { "$setUnion": ["$$value", "$$this"] } + } + } + } + }, + ]; + + #[derive(serde::Deserialize)] + struct AggregatedChannel { + #[serde(rename = "_id")] + channel: String, + message_ids: Vec, + #[serde(default)] + attachment_ids: Vec, + } + + let mut cursor = self + .col::(COL) + .aggregate(pipeline) + .await + .map_err(|_| create_database_error!("aggregate", COL))? + .with_type::(); + + let mut deleted_messages: HashMap> = HashMap::new(); + let mut attachment_ids: HashSet = HashSet::new(); + + while let Some(result) = cursor.next().await { + if let Ok(item) = result { + for id in item.attachment_ids { + attachment_ids.insert(id); + } + deleted_messages.insert(item.channel, item.message_ids); + } + } + + // Mark attachments as deleted before deleting messages + if !attachment_ids.is_empty() { + self.col::("attachments") + .update_many( + doc! { + "_id": { + "$in": attachment_ids.into_iter().collect::>() + } + }, + doc! { + "$set": { + "deleted": true + } + }, + ) + .await + .map_err(|_| create_database_error!("update_many", "attachments"))?; + } + + self.col::(COL) + .delete_many(filter) + .await + .map_err(|_| create_database_error!("delete_many", COL))?; + + Ok(deleted_messages) + } + + async fn delete_messages_by_user(&self, user_id: &str) -> Result<()> { + self.delete_bulk_messages(doc! { + "author": user_id, + }).await + } } impl IntoDocumentPath for FieldsMessage { diff --git a/crates/core/database/src/models/messages/ops/reference.rs b/crates/core/database/src/models/messages/ops/reference.rs index ae5b43f03..e1eab8434 100644 --- a/crates/core/database/src/models/messages/ops/reference.rs +++ b/crates/core/database/src/models/messages/ops/reference.rs @@ -1,8 +1,13 @@ +use crate::{ + AppendMessage, FieldsMessage, Message, MessageQuery, + PartialMessage, ReferenceDb, +}; use futures::future::try_join_all; use indexmap::IndexSet; use revolt_result::Result; - -use crate::{AppendMessage, FieldsMessage, Message, MessageQuery, PartialMessage, ReferenceDb}; +use std::collections::HashMap; +use std::time::SystemTime; +use ulid::Ulid; use super::AbstractMessages; @@ -58,7 +63,7 @@ impl AbstractMessages for ReferenceDb { if let Some(pinned) = query.filter.pinned { if message.pinned.unwrap_or_default() == pinned { - return false + return false; } } @@ -189,7 +194,12 @@ impl AbstractMessages for ReferenceDb { } /// Update a given message with new information - async fn update_message(&self, id: &str, message: &PartialMessage, remove: Vec) -> Result<()> { + async fn update_message( + &self, + id: &str, + message: &PartialMessage, + remove: Vec, + ) -> Result<()> { let mut messages = self.messages.lock().await; if let Some(message_data) = messages.get_mut(id) { message_data.apply_options(message.to_owned()); @@ -247,7 +257,7 @@ impl AbstractMessages for ReferenceDb { let mut messages = self.messages.lock().await; if let Some(message) = messages.get_mut(id) { if let Some(users) = message.reactions.get_mut(emoji) { - users.remove(&user.to_string()); + users.swap_remove(&user.to_string()); } Ok(()) @@ -260,7 +270,7 @@ impl AbstractMessages for ReferenceDb { async fn clear_reaction(&self, id: &str, emoji: &str) -> Result<()> { let mut messages = self.messages.lock().await; if let Some(message) = messages.get_mut(id) { - message.reactions.remove(emoji); + message.reactions.swap_remove(emoji); Ok(()) } else { Err(create_error!(NotFound)) @@ -286,4 +296,70 @@ impl AbstractMessages for ReferenceDb { Ok(()) } + + /// Delete all messages from a specific author in a list of channels from a certain ULID onwards + async fn delete_messages_by_author_since( + &self, + channels: &[String], + author: &str, + since: SystemTime, + ) -> Result>> { + let threshold_ulid = Ulid::from_datetime(since).to_string(); + let mut deleted_messages: HashMap> = HashMap::new(); + let mut attachment_ids: Vec = Vec::new(); + + let messages = self.messages.lock().await; + + // First pass: collect attachment IDs and message IDs to delete + for (id, message) in messages.iter() { + let should_delete = message.author == author + && channels.contains(&message.channel) + && id.as_str() >= threshold_ulid.as_str(); + + if should_delete { + // Collect attachment IDs + if let Some(attachments) = &message.attachments { + for attachment in attachments { + attachment_ids.push(attachment.id.clone()); + } + } + + deleted_messages + .entry(message.channel.clone()) + .or_default() + .push(id.clone()); + } + } + drop(messages); + + // Mark attachments as deleted + if !attachment_ids.is_empty() { + let mut files = self.files.lock().await; + for attachment_id in attachment_ids { + if let Some(file) = files.get_mut(&attachment_id) { + file.deleted = Some(true); + } + } + } + + // Delete the messages + self.messages.lock().await.retain(|id, message| { + let should_keep = !(message.author == author + && channels.contains(&message.channel) + && id.as_str() >= threshold_ulid.as_str()); + should_keep + }); + + Ok(deleted_messages) + } + + async fn delete_messages_by_user(&self, user_id: &str) -> Result<()> { + let mut messages = self.messages.lock().await; + + messages.retain(|_, message| message.author != user_id); + + // TODO: remove attachments as well + + Ok(()) + } } diff --git a/crates/core/database/src/models/mfa_tickets/axum.rs b/crates/core/database/src/models/mfa_tickets/axum.rs new file mode 100644 index 000000000..4eaf3be0e --- /dev/null +++ b/crates/core/database/src/models/mfa_tickets/axum.rs @@ -0,0 +1,67 @@ +use axum::{ + extract::{FromRef, FromRequestParts}, + http::request::Parts, +}; + +use revolt_result::{Error, Result}; + +use crate::{Database, MFATicket, UnvalidatedTicket, ValidatedTicket}; + +#[async_trait] +impl FromRequestParts for MFATicket +where + Database: FromRef, + S: Send + Sync, +{ + type Rejection = Error; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let db = Database::from_ref(state); + + if let Some(Ok(token)) = parts.headers.get("x-mfa-ticket").map(|v| v.to_str()) { + db.fetch_ticket_by_token(token).await + } else { + Err(create_error!(MissingHeaders)) + } + } +} + +#[async_trait] +impl FromRequestParts for ValidatedTicket +where + Database: FromRef, + S: Send + Sync, +{ + type Rejection = Error; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let db = Database::from_ref(state); + + let ticket = MFATicket::from_request_parts(parts, state).await?; + + if ticket.validated && ticket.claim(&db).await.is_ok() { + Ok(ValidatedTicket(ticket)) + } else { + Err(create_error!(InvalidToken)) + } + } +} + +#[async_trait] +impl FromRequestParts for UnvalidatedTicket +where + Database: FromRef, + S: Send + Sync, +{ + type Rejection = Error; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let ticket = MFATicket::from_request_parts(parts, state).await?; + + if !ticket.validated { + Ok(UnvalidatedTicket(ticket)) + } else { + Err(create_error!(InvalidToken)) + } + } +} diff --git a/crates/core/database/src/models/mfa_tickets/mod.rs b/crates/core/database/src/models/mfa_tickets/mod.rs new file mode 100644 index 000000000..4e58da725 --- /dev/null +++ b/crates/core/database/src/models/mfa_tickets/mod.rs @@ -0,0 +1,11 @@ +#[cfg(feature = "axum-impl")] +mod axum; +mod model; +mod ops; +#[cfg(feature = "rocket-impl")] +mod rocket; +#[cfg(feature = "rocket-impl")] +mod schema; + +pub use model::*; +pub use ops::*; diff --git a/crates/core/database/src/models/mfa_tickets/model.rs b/crates/core/database/src/models/mfa_tickets/model.rs new file mode 100644 index 000000000..c9063efdd --- /dev/null +++ b/crates/core/database/src/models/mfa_tickets/model.rs @@ -0,0 +1,105 @@ +use iso8601_timestamp::{Duration, Timestamp}; +use std::ops::Deref; + +use nanoid::nanoid; +use revolt_result::Result; + +use crate::{Database, MultiFactorAuthentication}; + +auto_derived_partial!( + /// Multi-factor auth ticket + pub struct MFATicket { + /// Unique Id + #[serde(rename = "_id")] + pub id: String, + + /// Account Id + pub account_id: String, + + /// Unique Token + pub token: String, + + /// Whether this ticket has been validated + /// (can be used for account actions) + pub validated: bool, + + /// Whether this ticket is authorised + /// (can be used to log a user in) + pub authorised: bool, + + /// TOTP code at time of ticket creation + pub last_totp_code: Option, + }, + "PartialMFATicket" +); + +/// Ticket which is guaranteed to be valid for use +/// +/// If used in a Rocket guard, it will be consumed on match +#[derive(Debug, Serialize, Deserialize)] +pub struct ValidatedTicket(pub MFATicket); + +/// Ticket which is guaranteed to not be valid for use +#[derive(Debug, Serialize, Deserialize)] +pub struct UnvalidatedTicket(pub MFATicket); + +impl MFATicket { + /// Create a new MFA ticket + pub fn new(account_id: String, validated: bool) -> MFATicket { + MFATicket { + id: ulid::Ulid::new().to_string(), + account_id, + token: nanoid!(64), + validated, + authorised: false, + last_totp_code: None, + } + } + + /// Populate an MFA ticket with valid MFA codes + pub async fn populate(&mut self, mfa: &MultiFactorAuthentication) { + self.last_totp_code = mfa.totp_token.generate_code().ok(); + } + + /// Save model + pub async fn save(&self, db: &Database) -> Result<()> { + db.save_ticket(self).await + } + + /// Check if this MFA ticket has expired + pub fn is_expired(&self) -> bool { + let now = Timestamp::now_utc(); + + let datetime: Timestamp = ulid::Ulid::from_string(&self.id) + .expect("Valid `ulid`") + .datetime() + .into(); + + now > (datetime.checked_add(Duration::minutes(5)).unwrap()) + } + + /// Claim and remove this MFA ticket + pub async fn claim(&self, db: &Database) -> Result<()> { + if self.is_expired() { + return Err(create_error!(InvalidToken)); + } + + db.delete_ticket(&self.id).await + } +} + +impl Deref for ValidatedTicket { + type Target = MFATicket; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl Deref for UnvalidatedTicket { + type Target = MFATicket; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} diff --git a/crates/core/database/src/models/mfa_tickets/ops.rs b/crates/core/database/src/models/mfa_tickets/ops.rs new file mode 100644 index 000000000..0024400bf --- /dev/null +++ b/crates/core/database/src/models/mfa_tickets/ops.rs @@ -0,0 +1,22 @@ +use revolt_result::Result; + +use crate::MFATicket; + +#[cfg(feature = "mongodb")] +mod mongodb; +mod reference; + +#[async_trait] +pub trait AbstractMFATickets: Sync + Send { + /// Find ticket by token + async fn fetch_ticket_by_token(&self, token: &str) -> Result; + + /// Save ticket + async fn save_ticket(&self, ticket: &MFATicket) -> Result<()>; + + /// Delete ticket + async fn delete_ticket(&self, id: &str) -> Result<()>; + + /// Delete all expired tickets + async fn delete_expired_tickets(&self) -> Result; +} diff --git a/crates/core/database/src/models/mfa_tickets/ops/mongodb.rs b/crates/core/database/src/models/mfa_tickets/ops/mongodb.rs new file mode 100644 index 000000000..feb869f36 --- /dev/null +++ b/crates/core/database/src/models/mfa_tickets/ops/mongodb.rs @@ -0,0 +1,67 @@ +use std::time::{Duration, SystemTime}; + +use crate::{AbstractMFATickets, MFATicket, MongoDb}; +use bson::{to_document, Document}; +use iso8601_timestamp::Timestamp; +use mongodb::options::UpdateOptions; +use revolt_result::Result; +use ulid::Ulid; + +const COL: &str = "mfa_tickets"; + +#[async_trait] +impl AbstractMFATickets for MongoDb { + /// Find ticket by token + /// + /// Ticket is only valid for 5 minute + async fn fetch_ticket_by_token(&self, token: &str) -> Result { + let ticket: MFATicket = query!(self, find_one, COL, doc! { "token": token })? + .ok_or_else(|| create_error!(InvalidToken))?; + + if let Ok(ulid) = Ulid::from_string(&ticket.id) { + if Timestamp::from(ulid.datetime() + Duration::from_mins(5)) > Timestamp::now_utc() { + Ok(ticket) + } else { + Err(create_error!(InvalidToken)) + } + } else { + Err(create_error!(InvalidToken)) + } + } + + /// Save ticket + async fn save_ticket(&self, ticket: &MFATicket) -> Result<()> { + self.col::(COL) + .update_one( + doc! { + "_id": &ticket.id + }, + doc! { + "$set": to_document(ticket).map_err(|_| create_database_error!("to_document", COL))?, + }, + ) + .with_options(UpdateOptions::builder().upsert(true).build()) + .await + .map_err(|_| create_database_error!("upsert_one", COL)) + .map(|_| ()) + } + + /// Delete ticket + async fn delete_ticket(&self, id: &str) -> Result<()> { + query!(self, delete_one_by_id, COL, id).map(|_| ()) + } + + /// Delete all expired tickets + async fn delete_expired_tickets(&self) -> Result { + let threshhold = + Ulid::from_datetime(SystemTime::now() - Duration::from_mins(5)).to_string(); + + self.col::(COL) + .delete_many(doc! { + "_id": { "$lt": threshhold } + }) + .await + .map_err(|_| create_database_error!("delete_many", COL)) + .map(|result| result.deleted_count as usize) + } +} diff --git a/crates/core/database/src/models/mfa_tickets/ops/reference.rs b/crates/core/database/src/models/mfa_tickets/ops/reference.rs new file mode 100644 index 000000000..a5e2ce5ea --- /dev/null +++ b/crates/core/database/src/models/mfa_tickets/ops/reference.rs @@ -0,0 +1,57 @@ +use std::time::{Duration, SystemTime}; + +use crate::{AbstractMFATickets, MFATicket, ReferenceDb}; +use iso8601_timestamp::Timestamp; +use revolt_result::Result; +use ulid::Ulid; + +#[async_trait] +impl AbstractMFATickets for ReferenceDb { + /// Find ticket by token + async fn fetch_ticket_by_token(&self, token: &str) -> Result { + let tickets = self.tickets.lock().await; + let ticket = tickets + .values() + .find(|ticket| ticket.token == token) + .ok_or_else(|| create_error!(InvalidToken))?; + + if let Ok(ulid) = Ulid::from_string(&ticket.id) { + if Timestamp::from(ulid.datetime() + Duration::from_mins(5)) > Timestamp::now_utc() { + Ok(ticket.clone()) + } else { + Err(create_error!(InvalidToken)) + } + } else { + Err(create_error!(InvalidToken)) + } + } + + /// Save ticket + async fn save_ticket(&self, ticket: &MFATicket) -> Result<()> { + let mut tickets = self.tickets.lock().await; + tickets.insert(ticket.id.to_string(), ticket.clone()); + Ok(()) + } + + /// Delete ticket + async fn delete_ticket(&self, id: &str) -> Result<()> { + let mut tickets = self.tickets.lock().await; + if tickets.remove(id).is_some() { + Ok(()) + } else { + Err(create_error!(InvalidToken)) + } + } + + /// Delete all expired tickets + async fn delete_expired_tickets(&self) -> Result { + let threshhold = + Ulid::from_datetime(SystemTime::now() - Duration::from_mins(5)).to_string(); + let mut tickets = self.tickets.lock().await; + + let before = tickets.len(); + tickets.retain(|_, ticket| ticket.id >= threshhold); + + Ok(before - tickets.len()) + } +} diff --git a/crates/core/database/src/models/mfa_tickets/rocket.rs b/crates/core/database/src/models/mfa_tickets/rocket.rs new file mode 100644 index 000000000..f8b714638 --- /dev/null +++ b/crates/core/database/src/models/mfa_tickets/rocket.rs @@ -0,0 +1,81 @@ +use crate::{Database, MFATicket, UnvalidatedTicket, ValidatedTicket}; +use revolt_result::Error; +use rocket::{ + http::Status, + outcome::Outcome, + request::{self, FromRequest}, + Request, +}; + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for MFATicket { + type Error = Error; + + #[allow(clippy::collapsible_match)] + async fn from_request(request: &'r Request<'_>) -> request::Outcome { + if let Some(header_mfa_ticket) = request.headers().get("x-mfa-ticket").next() { + if let Ok(ticket) = request + .rocket() + .state::() + .expect("`Database`") + .fetch_ticket_by_token(header_mfa_ticket) + .await + { + Outcome::Success(ticket) + } else { + Outcome::Error((Status::Unauthorized, create_error!(InvalidToken))) + } + } else { + Outcome::Error((Status::Unauthorized, create_error!(MissingHeaders))) + } + } +} + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for ValidatedTicket { + type Error = Error; + + #[allow(clippy::collapsible_match)] + async fn from_request(request: &'r Request<'_>) -> request::Outcome { + match request.guard::().await { + Outcome::Success(ticket) => { + if ticket.validated { + let db = request + .rocket() + .state::() + .expect("`Database`"); + + if ticket.claim(db).await.is_ok() { + Outcome::Success(ValidatedTicket(ticket)) + } else { + Outcome::Error((Status::Forbidden, create_error!(InvalidToken))) + } + } else { + Outcome::Error((Status::Forbidden, create_error!(InvalidToken))) + } + } + Outcome::Forward(f) => Outcome::Forward(f), + Outcome::Error(err) => Outcome::Error(err), + } + } +} + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for UnvalidatedTicket { + type Error = Error; + + #[allow(clippy::collapsible_match)] + async fn from_request(request: &'r Request<'_>) -> request::Outcome { + match request.guard::().await { + Outcome::Success(ticket) => { + if !ticket.validated { + Outcome::Success(UnvalidatedTicket(ticket)) + } else { + Outcome::Error((Status::Forbidden, create_error!(InvalidToken))) + } + } + Outcome::Forward(f) => Outcome::Forward(f), + Outcome::Error(err) => Outcome::Error(err), + } + } +} diff --git a/crates/core/database/src/models/mfa_tickets/schema.rs b/crates/core/database/src/models/mfa_tickets/schema.rs new file mode 100644 index 000000000..b85841292 --- /dev/null +++ b/crates/core/database/src/models/mfa_tickets/schema.rs @@ -0,0 +1,80 @@ +use revolt_okapi::openapi3::{SecurityScheme, SecuritySchemeData}; +use revolt_rocket_okapi::{ + gen::OpenApiGenerator, + request::{OpenApiFromRequest, RequestHeaderInput}, +}; + +use crate::{MFATicket, ValidatedTicket, UnvalidatedTicket}; + + +impl<'r> OpenApiFromRequest<'r> for MFATicket { + fn from_request_input( + _gen: &mut OpenApiGenerator, + _name: String, + _required: bool, + ) -> revolt_rocket_okapi::Result { + let mut requirements = schemars::Map::new(); + requirements.insert("MFA Ticket".to_owned(), vec![]); + + Ok(RequestHeaderInput::Security( + "MFA Ticket".to_owned(), + SecurityScheme { + data: SecuritySchemeData::ApiKey { + name: "x-mfa-ticket".to_owned(), + location: "header".to_owned(), + }, + description: Some("Used to authorise a request.".to_owned()), + extensions: schemars::Map::new(), + }, + requirements, + )) + } +} + +impl<'r> OpenApiFromRequest<'r> for ValidatedTicket { + fn from_request_input( + _gen: &mut OpenApiGenerator, + _name: String, + _required: bool, + ) -> revolt_rocket_okapi::Result { + let mut requirements = schemars::Map::new(); + requirements.insert("Valid MFA Ticket".to_owned(), vec![]); + + Ok(RequestHeaderInput::Security( + "Valid MFA Ticket".to_owned(), + SecurityScheme { + data: SecuritySchemeData::ApiKey { + name: "x-mfa-ticket".to_owned(), + location: "header".to_owned(), + }, + description: Some("Used to authorise a request.".to_owned()), + extensions: schemars::Map::new(), + }, + requirements, + )) + } +} + +impl<'r> OpenApiFromRequest<'r> for UnvalidatedTicket { + fn from_request_input( + _gen: &mut OpenApiGenerator, + _name: String, + _required: bool, + ) -> revolt_rocket_okapi::Result { + let mut requirements = schemars::Map::new(); + requirements.insert("Unvalidated MFA Ticket".to_owned(), vec![]); + + Ok(RequestHeaderInput::Security( + "Unvalidated MFA Ticket".to_owned(), + SecurityScheme { + data: SecuritySchemeData::ApiKey { + name: "x-mfa-ticket".to_owned(), + location: "header".to_owned(), + }, + description: Some("Used to authorise a request.".to_owned()), + extensions: schemars::Map::new(), + }, + requirements, + )) + } +} \ No newline at end of file diff --git a/crates/core/database/src/models/mod.rs b/crates/core/database/src/models/mod.rs index 93bd556c8..0852adfc4 100644 --- a/crates/core/database/src/models/mod.rs +++ b/crates/core/database/src/models/mod.rs @@ -17,6 +17,10 @@ mod server_members; mod servers; mod user_settings; mod users; +mod accounts; +mod account_invites; +mod sessions; +mod mfa_tickets; pub use admin_migrations::*; pub use bots::*; @@ -37,6 +41,10 @@ pub use server_members::*; pub use servers::*; pub use user_settings::*; pub use users::*; +pub use accounts::*; +pub use account_invites::*; +pub use sessions::*; +pub use mfa_tickets::*; use crate::{Database, ReferenceDb}; @@ -65,6 +73,10 @@ pub trait AbstractDatabase: + servers::AbstractServers + user_settings::AbstractUserSettings + users::AbstractUsers + + accounts::AbstractAccounts + + account_invites::AbstractAccountInvites + + sessions::AbstractSessions + + mfa_tickets::AbstractMFATickets { } diff --git a/crates/core/database/src/models/server_members/model.rs b/crates/core/database/src/models/server_members/model.rs index ee5e354bc..18db53963 100644 --- a/crates/core/database/src/models/server_members/model.rs +++ b/crates/core/database/src/models/server_members/model.rs @@ -7,6 +7,14 @@ use crate::{ Server, SystemMessage, User, }; +fn default_true() -> bool { + true +} + +fn is_true(x: &bool) -> bool { + *x +} + auto_derived_partial!( /// Server Member pub struct Member { @@ -20,6 +28,9 @@ auto_derived_partial!( /// Member's nickname #[serde(skip_serializing_if = "Option::is_none")] pub nickname: Option, + /// Member's pronouns + #[serde(skip_serializing_if = "Option::is_none")] + pub pronouns: Option, /// Avatar attachment #[serde(skip_serializing_if = "Option::is_none")] pub avatar: Option, @@ -30,6 +41,13 @@ auto_derived_partial!( /// Timestamp this member is timed out until #[serde(skip_serializing_if = "Option::is_none")] pub timeout: Option, + + /// Whether the member is server-wide voice muted + #[serde(skip_serializing_if = "is_true", default = "default_true")] + pub can_publish: bool, + /// Whether the member is server-wide voice deafened + #[serde(skip_serializing_if = "is_true", default = "default_true")] + pub can_receive: bool, // This value only exists in the database, not the models. // If it is not-None, the database layer should return None to member fetching queries. // pub pending_deletion_at: Option @@ -50,10 +68,14 @@ auto_derived!( /// Optional fields on server member object pub enum FieldsMember { Nickname, + Pronouns, Avatar, Roles, Timeout, + CanReceive, + CanPublish, JoinedAt, + VoiceChannel, } /// Member removal intention @@ -70,9 +92,12 @@ impl Default for Member { id: Default::default(), joined_at: Timestamp::now_utc(), nickname: None, + pronouns: None, avatar: None, roles: vec![], timeout: None, + can_publish: true, + can_receive: true, } } } @@ -127,6 +152,20 @@ impl Member { let emojis = db.fetch_emoji_by_parent_id(&server.id).await?; + #[allow(unused_mut)] + let mut voice_states = Vec::new(); + + #[cfg(feature = "voice")] + for channel in &channels { + if let Ok(Some(voice_state)) = crate::voice::get_channel_voice_state( + &crate::voice::UserVoiceChannel::from_channel(channel), + ) + .await + { + voice_states.push(voice_state) + } + } + EventV1::ServerMemberJoin { id: server.id.clone(), user: user.id.clone(), @@ -144,6 +183,7 @@ impl Member { .map(|channel| channel.into()) .collect(), emojis: emojis.into_iter().map(|emoji| emoji.into()).collect(), + voice_states, } .private(user.id.clone()) .await; @@ -193,11 +233,15 @@ impl Member { pub fn remove_field(&mut self, field: &FieldsMember) { match field { - FieldsMember::JoinedAt => (), + FieldsMember::JoinedAt => {} FieldsMember::Avatar => self.avatar = None, FieldsMember::Nickname => self.nickname = None, + FieldsMember::Pronouns => self.pronouns = None, FieldsMember::Roles => self.roles.clear(), FieldsMember::Timeout => self.timeout = None, + FieldsMember::CanReceive => self.can_receive = true, + FieldsMember::CanPublish => self.can_publish = true, + FieldsMember::VoiceChannel => {} } } @@ -276,7 +320,7 @@ mod tests { use crate::{Member, PartialMember, RemovalIntention, Server, User}; - #[async_std::test] + #[tokio::test] async fn muted_member_rejoin() { database_test!(|db| async move { match db { diff --git a/crates/core/database/src/models/server_members/ops.rs b/crates/core/database/src/models/server_members/ops.rs index 1c59bf0fc..73918b0b4 100644 --- a/crates/core/database/src/models/server_members/ops.rs +++ b/crates/core/database/src/models/server_members/ops.rs @@ -129,4 +129,7 @@ pub trait AbstractServerMembers: Sync + Send { /// Fetch all members who have been marked for deletion. async fn remove_dangling_members(&self) -> Result<()>; + + /// Removes a user from every server they are in + async fn clear_memberships(&self, user_id: &str) -> Result<()>; } diff --git a/crates/core/database/src/models/server_members/ops/mongodb.rs b/crates/core/database/src/models/server_members/ops/mongodb.rs index cd9c50954..f9db0d350 100644 --- a/crates/core/database/src/models/server_members/ops/mongodb.rs +++ b/crates/core/database/src/models/server_members/ops/mongodb.rs @@ -326,16 +326,31 @@ impl AbstractServerMembers for MongoDb { .map(|_| ()) .map_err(|_| create_database_error!("count_documents", COL)) } + + /// Removes a user from every server they are in + /// + /// **This should only be used for account deletion.** + async fn clear_memberships(&self, user_id: &str) -> Result<()> { + self.col::(COL) + .delete_many(doc! { "_id.user": user_id }) + .await + .map(|_| ()) + .map_err(|_| create_database_error!("delete_many", COL)) + } } impl IntoDocumentPath for FieldsMember { fn as_path(&self) -> Option<&'static str> { - Some(match self { - FieldsMember::JoinedAt => "joined_at", - FieldsMember::Avatar => "avatar", - FieldsMember::Nickname => "nickname", - FieldsMember::Roles => "roles", - FieldsMember::Timeout => "timeout", - }) + match self { + FieldsMember::JoinedAt => Some("joined_at"), + FieldsMember::Avatar => Some("avatar"), + FieldsMember::Nickname => Some("nickname"), + FieldsMember::Pronouns => Some("pronouns"), + FieldsMember::Roles => Some("roles"), + FieldsMember::Timeout => Some("timeout"), + FieldsMember::CanPublish => Some("can_publish"), + FieldsMember::CanReceive => Some("can_receive"), + FieldsMember::VoiceChannel => None, + } } } diff --git a/crates/core/database/src/models/server_members/ops/reference.rs b/crates/core/database/src/models/server_members/ops/reference.rs index 3238edbb1..32d8f64ea 100644 --- a/crates/core/database/src/models/server_members/ops/reference.rs +++ b/crates/core/database/src/models/server_members/ops/reference.rs @@ -200,4 +200,13 @@ impl AbstractServerMembers for ReferenceDb { async fn remove_dangling_members(&self) -> Result<()> { todo!() } + + /// Removes a user from every server they are in + async fn clear_memberships(&self, user_id: &str) -> Result<()> { + let mut server_members = self.server_members.lock().await; + + server_members.retain(|_, v| v.id.user != user_id); + + Ok(()) + } } diff --git a/crates/core/database/src/models/servers/model.rs b/crates/core/database/src/models/servers/model.rs index eea8f3922..bf74c4102 100644 --- a/crates/core/database/src/models/servers/model.rs +++ b/crates/core/database/src/models/servers/model.rs @@ -68,6 +68,9 @@ auto_derived_partial!( auto_derived_partial!( /// Role pub struct Role { + /// Unique Id + #[serde(rename = "_id")] + pub id: String, /// Role name pub name: String, /// Permissions available to this role @@ -83,6 +86,9 @@ auto_derived_partial!( /// Ranking of this role #[serde(default)] pub rank: i64, + /// Custom icon attachment + #[serde(skip_serializing_if = "Option::is_none")] + pub icon: Option, }, "PartialRole" ); @@ -126,6 +132,7 @@ auto_derived!( /// Optional fields on server object pub enum FieldsRole { Colour, + Icon, } ); @@ -246,7 +253,6 @@ impl Server { role.update( db, &self.id, - role_id, PartialRole { permissions: Some(permissions), ..Default::default() @@ -297,29 +303,41 @@ impl Role { /// Into optional struct pub fn into_optional(self) -> PartialRole { PartialRole { + id: Some(self.id), name: Some(self.name), permissions: Some(self.permissions), colour: self.colour, hoist: Some(self.hoist), rank: Some(self.rank), + icon: self.icon, } } /// Create a role - pub async fn create(&self, db: &Database, server_id: &str) -> Result { - let role_id = Ulid::new().to_string(); - db.insert_role(server_id, &role_id, self).await?; + pub async fn create(db: &Database, server: &Server, name: String) -> Result { + let role = Role { + id: Ulid::new().to_string(), + name, + // Rank of the new role should be below the lowest role + rank: server.roles.len() as i64, + colour: None, + hoist: false, + permissions: Default::default(), + icon: None, + }; + + db.insert_role(&server.id, &role).await?; EventV1::ServerRoleUpdate { - id: server_id.to_string(), - role_id: role_id.to_string(), - data: self.clone().into_optional().into(), + id: server.id.clone(), + role_id: role.id.clone(), + data: role.clone().into_optional().into(), clear: vec![], } - .p(server_id.to_string()) + .p(server.id.clone()) .await; - Ok(role_id) + Ok(role) } /// Update server data @@ -327,7 +345,6 @@ impl Role { &mut self, db: &Database, server_id: &str, - role_id: &str, partial: PartialRole, remove: Vec, ) -> Result<()> { @@ -337,14 +354,14 @@ impl Role { self.apply_options(partial.clone()); - db.update_role(server_id, role_id, &partial, remove.clone()) + db.update_role(server_id, &self.id, &partial, remove.clone()) .await?; EventV1::ServerRoleUpdate { id: server_id.to_string(), - role_id: role_id.to_string(), + role_id: self.id.clone(), data: partial.into(), - clear: vec![], + clear: remove.into_iter().map(Into::into).collect(), } .p(server_id.to_string()) .await; @@ -356,19 +373,20 @@ impl Role { pub fn remove_field(&mut self, field: &FieldsRole) { match field { FieldsRole::Colour => self.colour = None, + FieldsRole::Icon => self.icon = None, } } /// Delete a role - pub async fn delete(self, db: &Database, server_id: &str, role_id: &str) -> Result<()> { + pub async fn delete(self, db: &Database, server_id: &str) -> Result<()> { EventV1::ServerRoleDelete { id: server_id.to_string(), - role_id: role_id.to_string(), + role_id: self.id.clone(), } .p(server_id.to_string()) .await; - db.delete_role(server_id, role_id).await + db.delete_role(server_id, &self.id).await } } @@ -402,7 +420,7 @@ mod tests { use crate::{fixture, util::permissions::DatabasePermissionQuery}; - #[async_std::test] + #[tokio::test] async fn permissions() { database_test!(|db| async move { fixture!(db, "server_with_roles", diff --git a/crates/core/database/src/models/servers/ops.rs b/crates/core/database/src/models/servers/ops.rs index ee07ba8ff..89d12beaf 100644 --- a/crates/core/database/src/models/servers/ops.rs +++ b/crates/core/database/src/models/servers/ops.rs @@ -17,6 +17,8 @@ pub trait AbstractServers: Sync + Send { /// Fetch a servers by their ids async fn fetch_servers<'a>(&self, ids: &'a [String]) -> Result>; + async fn fetch_owned_servers(&self, user_id: &str) -> Result>; + /// Update a server with new information async fn update_server( &self, @@ -29,7 +31,7 @@ pub trait AbstractServers: Sync + Send { async fn delete_server(&self, id: &str) -> Result<()>; /// Insert a new role into server object - async fn insert_role(&self, server_id: &str, role_id: &str, role: &Role) -> Result<()>; + async fn insert_role(&self, server_id: &str, role: &Role) -> Result<()>; /// Update an existing role on a server async fn update_role( diff --git a/crates/core/database/src/models/servers/ops/mongodb.rs b/crates/core/database/src/models/servers/ops/mongodb.rs index 958963c9c..21183d3f4 100644 --- a/crates/core/database/src/models/servers/ops/mongodb.rs +++ b/crates/core/database/src/models/servers/ops/mongodb.rs @@ -43,6 +43,17 @@ impl AbstractServers for MongoDb { .await) } + async fn fetch_owned_servers(&self, user_id: &str) -> Result> { + query!( + self, + find, + COL, + doc! { + "owner": user_id + } + ) + } + /// Update a server with new information async fn update_server( &self, @@ -69,7 +80,7 @@ impl AbstractServers for MongoDb { } /// Insert a new role into server object - async fn insert_role(&self, server_id: &str, role_id: &str, role: &Role) -> Result<()> { + async fn insert_role(&self, server_id: &str, role: &Role) -> Result<()> { self.col::(COL) .update_one( doc! { @@ -77,7 +88,7 @@ impl AbstractServers for MongoDb { }, doc! { "$set": { - "roles.".to_owned() + role_id: to_document(role) + "roles.".to_owned() + role.id.as_str(): to_document(role) .map_err(|_| create_database_error!("to_document", "role"))? } }, @@ -172,6 +183,7 @@ impl IntoDocumentPath for FieldsRole { fn as_path(&self) -> Option<&'static str> { Some(match self { FieldsRole::Colour => "colour", + FieldsRole::Icon => "icon", }) } } diff --git a/crates/core/database/src/models/servers/ops/reference.rs b/crates/core/database/src/models/servers/ops/reference.rs index 18ee1b384..0af6ad26c 100644 --- a/crates/core/database/src/models/servers/ops/reference.rs +++ b/crates/core/database/src/models/servers/ops/reference.rs @@ -40,6 +40,16 @@ impl AbstractServers for ReferenceDb { .collect() } + async fn fetch_owned_servers(&self, user_id: &str) -> Result> { + let servers = self.servers.lock().await; + + Ok(servers + .values() + .filter(|server| server.owner == user_id) + .cloned() + .collect()) + } + /// Update a server with new information async fn update_server( &self, @@ -72,10 +82,10 @@ impl AbstractServers for ReferenceDb { } /// Insert a new role into server object - async fn insert_role(&self, server_id: &str, role_id: &str, role: &Role) -> Result<()> { + async fn insert_role(&self, server_id: &str, role: &Role) -> Result<()> { let mut servers = self.servers.lock().await; if let Some(server) = servers.get_mut(server_id) { - server.roles.insert(role_id.to_string(), role.clone()); + server.roles.insert(role.id.clone(), role.clone()); Ok(()) } else { Err(create_error!(NotFound)) diff --git a/crates/core/database/src/models/sessions/axum.rs b/crates/core/database/src/models/sessions/axum.rs new file mode 100644 index 000000000..57357aa92 --- /dev/null +++ b/crates/core/database/src/models/sessions/axum.rs @@ -0,0 +1,24 @@ +use axum::{extract::{FromRef, FromRequestParts}, http::request::Parts}; + +use revolt_result::{create_error, Error, Result}; + +use crate::{Database, Session}; + +#[async_trait] +impl FromRequestParts for Session +where + Database: FromRef, + S: Send + Sync +{ + type Rejection = Error; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let db = Database::from_ref(state); + + if let Some(Ok(token)) = parts.headers.get("x-session-token").map(|v| v.to_str()) { + db.fetch_session_by_token(token).await + } else { + Err(create_error!(MissingHeaders)) + } + } +} diff --git a/crates/core/database/src/models/sessions/mod.rs b/crates/core/database/src/models/sessions/mod.rs new file mode 100644 index 000000000..4e58da725 --- /dev/null +++ b/crates/core/database/src/models/sessions/mod.rs @@ -0,0 +1,11 @@ +#[cfg(feature = "axum-impl")] +mod axum; +mod model; +mod ops; +#[cfg(feature = "rocket-impl")] +mod rocket; +#[cfg(feature = "rocket-impl")] +mod schema; + +pub use model::*; +pub use ops::*; diff --git a/crates/core/database/src/models/sessions/model.rs b/crates/core/database/src/models/sessions/model.rs new file mode 100644 index 000000000..0be0246b3 --- /dev/null +++ b/crates/core/database/src/models/sessions/model.rs @@ -0,0 +1,68 @@ +use iso8601_timestamp::Timestamp; + +use crate::{events::client::EventV1, Database}; +use revolt_result::Result; + +auto_derived_partial!( + /// Session information + pub struct Session { + /// Unique Id + #[serde(rename = "_id")] + pub id: String, + + /// User Id + pub user_id: String, + + /// Session token + pub token: String, + + /// Display name + pub name: String, + + /// When the session was last logged in + pub last_seen: Timestamp, + + /// Where the session originated from + /// + /// This could be used to differentiate sessions that come from staging/test vs prod, etc. + #[serde(skip_serializing_if = "Option::is_none")] + pub origin: Option, + + /// Web Push subscription + #[serde(skip_serializing_if = "Option::is_none")] + pub subscription: Option, + }, + "PartialSession" +); + +auto_derived!( + /// Web Push subscription + pub struct WebPushSubscription { + pub endpoint: String, + pub p256dh: String, + pub auth: String, + } +); + +impl Session { + /// Save model + pub async fn save(&self, db: &Database) -> Result<()> { + db.save_session(self).await + } + + /// Delete session + pub async fn delete(self, db: &Database) -> Result<()> { + // Delete from database + db.delete_session(&self.id).await?; + + // Create and push event + EventV1::DeleteSession { + user_id: self.user_id.clone(), + session_id: self.id, + } + .private(self.user_id) + .await; + + Ok(()) + } +} diff --git a/crates/core/database/src/models/sessions/ops.rs b/crates/core/database/src/models/sessions/ops.rs new file mode 100644 index 000000000..17993411c --- /dev/null +++ b/crates/core/database/src/models/sessions/ops.rs @@ -0,0 +1,37 @@ +use iso8601_timestamp::Timestamp; +use revolt_result::Result; + +use crate::Session; + +#[cfg(feature = "mongodb")] +mod mongodb; +mod reference; + +#[async_trait] +pub trait AbstractSessions: Sync + Send { + /// Find session by id + async fn fetch_session(&self, id: &str) -> Result; + + /// Find sessions by user id + async fn fetch_sessions(&self, user_id: &str) -> Result>; + + /// Find sessions by user ids + async fn fetch_sessions_with_subscription(&self, user_ids: &[String]) -> Result>; + + /// Find session by token + async fn fetch_session_by_token(&self, token: &str) -> Result; + + /// Save session + async fn save_session(&self, session: &Session) -> Result<()>; + + /// Delete session + async fn delete_session(&self, id: &str) -> Result<()>; + + /// Delete session + async fn delete_all_sessions(&self, user_id: &str, ignore: Option) -> Result<()>; + + /// Remove push subscription for a session by session id + async fn remove_push_subscription_by_session_id(&self, session_id: &str) -> Result<()>; + + async fn update_session_last_seen(&self, session_id: &str, when: Timestamp) -> Result<()>; +} diff --git a/crates/core/database/src/models/sessions/ops/mongodb.rs b/crates/core/database/src/models/sessions/ops/mongodb.rs new file mode 100644 index 000000000..33ba933b4 --- /dev/null +++ b/crates/core/database/src/models/sessions/ops/mongodb.rs @@ -0,0 +1,142 @@ +use crate::{AbstractSessions, MongoDb, Session}; +use bson::{to_bson, to_document}; +use iso8601_timestamp::Timestamp; +use mongodb::options::UpdateOptions; +use revolt_result::Result; + +const COL: &str = "sessions"; + +#[async_trait] +impl AbstractSessions for MongoDb { + /// Find session by id + async fn fetch_session(&self, id: &str) -> Result { + query!(self, find_one_by_id, COL, id)?.ok_or_else(|| create_error!(UnknownUser)) + } + + /// Find sessions by user id + async fn fetch_sessions(&self, user_id: &str) -> Result> { + query!( + self, + find, + COL, + doc! { + "user_id": user_id + } + ) + } + + /// Find sessions by user ids + async fn fetch_sessions_with_subscription(&self, user_ids: &[String]) -> Result> { + query!( + self, + find, + COL, + doc! { + "user_id": { + "$in": user_ids + }, + "subscription": { + "$exists": true + } + } + ) + } + + /// Fetch a session from the database by token + async fn fetch_session_by_token(&self, token: &str) -> Result { + query!( + self, + find_one, + COL, + doc! { + "token": token + } + )? + .ok_or_else(|| create_error!(InvalidSession)) + } + + /// Save session + async fn save_session(&self, session: &Session) -> Result<()> { + self.col::(COL) + .update_one( + doc! { + "_id": &session.id + }, + doc! { + "$set": to_document(session).map_err(|_| create_database_error!("to_document", COL))?, + }, + ) + .with_options(UpdateOptions::builder().upsert(true).build()) + .await + .map_err(|_| create_database_error!("upsert_one", COL)) + .map(|_| ()) + } + + /// Delete session + async fn delete_session(&self, id: &str) -> Result<()> { + self.col::(COL) + .delete_one(doc! { + "_id": id + }) + .await + .map_err(|_| create_database_error!("delete_one", COL)) + .map(|_| ()) + } + + /// Delete session + async fn delete_all_sessions(&self, user_id: &str, ignore: Option) -> Result<()> { + let mut query = doc! { + "user_id": user_id + }; + + if let Some(id) = ignore { + query.insert( + "_id", + doc! { + "$ne": id + }, + ); + } + + self.col::(COL) + .delete_many(query) + .await + .map_err(|_| create_database_error!("delete_one", COL)) + .map(|_| ()) + } + + /// Remove push subscription for a session by session id + async fn remove_push_subscription_by_session_id(&self, session_id: &str) -> Result<()> { + self.col::(COL) + .update_one( + doc! { + "_id": session_id + }, + doc! { + "$unset": { + "subscription": 1 + } + }, + ) + .await + .map(|_| ()) + .map_err(|_| create_database_error!("update_one", COL)) + } + + async fn update_session_last_seen(&self, session_id: &str, when: Timestamp) -> Result<()> { + self.col::(COL) + .update_one( + doc! { + "_id": session_id + }, + doc! { + "$set": { + "last_seen": to_bson(&when).unwrap() + } + }, + ) + .await + .map(|_| ()) + .map_err(|_| create_database_error!("update_one", COL)) + } +} diff --git a/crates/core/database/src/models/sessions/ops/reference.rs b/crates/core/database/src/models/sessions/ops/reference.rs new file mode 100644 index 000000000..4b7ffab8c --- /dev/null +++ b/crates/core/database/src/models/sessions/ops/reference.rs @@ -0,0 +1,101 @@ +use crate::{AbstractSessions, ReferenceDb, Session}; +use iso8601_timestamp::Timestamp; +use revolt_result::Result; + +#[async_trait] +impl AbstractSessions for ReferenceDb { + /// Find session by id + async fn fetch_session(&self, id: &str) -> Result { + let sessions = self.sessions.lock().await; + sessions + .get(id) + .cloned() + .ok_or_else(|| create_error!(UnknownUser)) + } + + /// Find sessions by user id + async fn fetch_sessions(&self, user_id: &str) -> Result> { + let sessions = self.sessions.lock().await; + Ok(sessions + .values() + .filter(|session| session.user_id == user_id) + .cloned() + .collect()) + } + + /// Find sessions by user ids + async fn fetch_sessions_with_subscription(&self, user_ids: &[String]) -> Result> { + let sessions = self.sessions.lock().await; + Ok(sessions + .values() + .filter(|session| session.subscription.is_some() && user_ids.contains(&session.user_id)) + .cloned() + .collect()) + } + + /// Find session by token + async fn fetch_session_by_token(&self, token: &str) -> Result { + let sessions = self.sessions.lock().await; + sessions + .values() + .find(|session| session.token == token) + .cloned() + .ok_or_else(|| create_error!(InvalidSession)) + } + + /// Save session + async fn save_session(&self, session: &Session) -> Result<()> { + let mut sessions = self.sessions.lock().await; + sessions.insert(session.id.to_string(), session.clone()); + Ok(()) + } + + /// Delete session + async fn delete_session(&self, id: &str) -> Result<()> { + let mut sessions = self.sessions.lock().await; + if sessions.remove(id).is_some() { + Ok(()) + } else { + Err(create_error!(InvalidSession)) + } + } + + /// Delete session + async fn delete_all_sessions(&self, user_id: &str, ignore: Option) -> Result<()> { + let mut sessions = self.sessions.lock().await; + sessions.retain(|_, session| { + if session.user_id == user_id { + if let Some(ignore) = &ignore { + ignore == &session.id + } else { + false + } + } else { + true + } + }); + + Ok(()) + } + + /// Remove push subscription for a session by session id + async fn remove_push_subscription_by_session_id(&self, session_id: &str) -> Result<()> { + let mut sessions = self.sessions.lock().await; + + if let Some(session) = sessions.get_mut(session_id) { + session.subscription = None; + }; + + Ok(()) + } + + async fn update_session_last_seen(&self, session_id: &str, when: Timestamp) -> Result<()> { + let mut sessions = self.sessions.lock().await; + + if let Some(session) = sessions.get_mut(session_id) { + session.last_seen = when; + }; + + Ok(()) + } +} diff --git a/crates/core/database/src/models/sessions/rocket.rs b/crates/core/database/src/models/sessions/rocket.rs new file mode 100644 index 000000000..6b1f5421d --- /dev/null +++ b/crates/core/database/src/models/sessions/rocket.rs @@ -0,0 +1,30 @@ +use crate::{Database, Session}; +use revolt_result::Error; +use rocket::{ + http::Status, + request::{FromRequest, Outcome}, + Request, +}; + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for Session { + type Error = Error; + + async fn from_request(request: &'r Request<'_>) -> Outcome { + if let Some(token) = request.headers().get("x-session-token").next() { + if let Ok(session) = request + .rocket() + .state::() + .expect("`Database`") + .fetch_session_by_token(token) + .await + { + Outcome::Success(session) + } else { + Outcome::Error((Status::Unauthorized, create_error!(InvalidSession))) + } + } else { + Outcome::Error((Status::Unauthorized, create_error!(MissingHeaders))) + } + } +} diff --git a/crates/core/database/src/models/sessions/schema.rs b/crates/core/database/src/models/sessions/schema.rs new file mode 100644 index 000000000..ec428f23a --- /dev/null +++ b/crates/core/database/src/models/sessions/schema.rs @@ -0,0 +1,32 @@ +use revolt_okapi::openapi3::{SecurityScheme, SecuritySchemeData}; +use revolt_rocket_okapi::{ + gen::OpenApiGenerator, + request::{OpenApiFromRequest, RequestHeaderInput}, +}; + +use crate::Session; + + +impl<'r> OpenApiFromRequest<'r> for Session { + fn from_request_input( + _gen: &mut OpenApiGenerator, + _name: String, + _required: bool, + ) -> revolt_rocket_okapi::Result { + let mut requirements = schemars::Map::new(); + requirements.insert("Session Token".to_owned(), vec![]); + + Ok(RequestHeaderInput::Security( + "Session Token".to_owned(), + SecurityScheme { + data: SecuritySchemeData::ApiKey { + name: "x-session-token".to_owned(), + location: "header".to_owned(), + }, + description: Some("Used to authenticate as a user.".to_owned()), + extensions: schemars::Map::new(), + }, + requirements, + )) + } +} \ No newline at end of file diff --git a/crates/core/database/src/models/users/axum.rs b/crates/core/database/src/models/users/axum.rs index da83c5b13..6b1f2f322 100644 --- a/crates/core/database/src/models/users/axum.rs +++ b/crates/core/database/src/models/users/axum.rs @@ -1,14 +1,20 @@ -use axum::{extract::FromRequestParts, http::request::Parts}; +use axum::{extract::{FromRef, FromRequestParts}, http::request::Parts}; use revolt_result::{create_error, Error, Result}; use crate::{Database, User}; #[async_trait::async_trait] -impl FromRequestParts for User { +impl FromRequestParts for User +where + Database: FromRef, + S: Send + Sync +{ type Rejection = Error; - async fn from_request_parts(parts: &mut Parts, db: &Database) -> Result { + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + let db = Database::from_ref(state); + if let Some(Ok(bot_token)) = parts.headers.get("x-bot-token").map(|v| v.to_str()) { let bot = db.fetch_bot_by_token(bot_token).await?; db.fetch_user(&bot.id).await diff --git a/crates/core/database/src/models/users/model.rs b/crates/core/database/src/models/users/model.rs index 0c2b6cee8..a279e094d 100644 --- a/crates/core/database/src/models/users/model.rs +++ b/crates/core/database/src/models/users/model.rs @@ -1,12 +1,16 @@ use std::{collections::HashSet, str::FromStr, time::Duration}; -use crate::{events::client::EventV1, Database, File, RatelimitEvent, AMQP}; +use crate::{ + events::client::EventV1, + util::email::{email_templates, send_email}, + Database, File, RatelimitEvent, AMQP, +}; -use authifier::config::{EmailVerificationConfig, Template}; use futures::future::join_all; use iso8601_timestamp::Timestamp; use once_cell::sync::Lazy; use rand::seq::SliceRandom; +use regex::{Regex, RegexBuilder}; use revolt_config::{config, FeaturesLimits}; use revolt_models::v0::{self, UserBadges, UserFlags}; use revolt_presence::filter_online; @@ -27,6 +31,9 @@ auto_derived_partial!( /// Display name #[serde(skip_serializing_if = "Option::is_none")] pub display_name: Option, + /// User's pronouns + #[serde(skip_serializing_if = "Option::is_none", default)] + pub pronouns: Option, #[serde(skip_serializing_if = "Option::is_none")] /// Avatar attachment pub avatar: Option, @@ -72,6 +79,7 @@ auto_derived!( ProfileContent, ProfileBackground, DisplayName, + Pronouns, // internal fields Suspension, @@ -163,6 +171,13 @@ pub static DISCRIMINATOR_SEARCH_SPACE: Lazy> = Lazy::new(|| { set.into_iter().collect() }); +static BLOCKED_USERNAME_PATTERNS: Lazy = Lazy::new(|| { + RegexBuilder::new("`{3}|(discord|rvlt|guilded|stt)\\.gg|(revolt|stoat)\\.chat|https?:\\/\\/") + .case_insensitive(true) + .build() + .unwrap() +}); + #[allow(clippy::derivable_impls)] impl Default for User { fn default() -> Self { @@ -171,6 +186,7 @@ impl Default for User { username: Default::default(), discriminator: Default::default(), display_name: Default::default(), + pronouns: Default::default(), avatar: Default::default(), relations: Default::default(), badges: Default::default(), @@ -198,11 +214,13 @@ impl User { I: Into>, D: Into>, { - let username = User::validate_username(username)?; + let new_username = User::sanitise_username(&username).await?; + User::validate_username(&new_username)?; + let mut user = User { id: account_id.into().unwrap_or_else(|| Ulid::new().to_string()), - discriminator: User::find_discriminator(db, &username, None).await?, - username, + discriminator: User::find_discriminator(db, &new_username, None).await?, + username: new_username.clone(), last_acknowledged_policy_change: Timestamp::now_utc(), ..Default::default() }; @@ -278,39 +296,40 @@ impl User { } } - /// Sanitise and validate a username can be used - pub fn validate_username(username: String) -> Result { - // Copy the username for validation + /// Validate a username + /// + /// This will check if the username is a blocked name or contains a blocked pattern. + fn validate_username(username: &str) -> Result<()> { let username_lowercase = username.to_lowercase(); - // Block homoglyphs - if decancer::cure(&username_lowercase).into_str() != username_lowercase { + const BLOCKED_USERNAMES: &[&str] = &["admin", "revolt", "stoat"]; + + if BLOCKED_USERNAMES.contains(&username_lowercase.as_str()) + || BLOCKED_USERNAME_PATTERNS.is_match(username) + { return Err(create_error!(InvalidUsername)); } - // Ensure the username itself isn't blocked - const BLOCKED_USERNAMES: &[&str] = &["admin", "revolt"]; - - for username in BLOCKED_USERNAMES { - if username_lowercase == *username { - return Err(create_error!(InvalidUsername)); - } - } + Ok(()) + } - // Ensure none of the following substrings show up in the username - const BLOCKED_SUBSTRINGS: &[&str] = &[ - "```", - "discord.gg", - "rvlt.gg", - "guilded.gg", - "https://", - "http://", - ]; - - for substr in BLOCKED_SUBSTRINGS { - if username_lowercase.contains(substr) { - return Err(create_error!(InvalidUsername)); - } + /// Sanitise a username + /// + /// This will clean up Unicode homoglyphs and pad to the min username length with underscores. + async fn sanitise_username(username: &str) -> Result { + let options = decancer::Options::default().retain_capitalization(); + let mut username = decancer::cure(username, options) + .map_err(|_| create_error!(InvalidUsername))? + .to_string(); + + let config = revolt_config::config().await; + let username_length_diff = config + .api + .users + .min_username_length + .saturating_sub(username.len()); + if username_length_diff > 0 { + username.push_str(&"_".repeat(username_length_diff)) } Ok(username) @@ -416,12 +435,14 @@ impl User { /// Update a user's username pub async fn update_username(&mut self, db: &Database, username: String) -> Result<()> { - let username = User::validate_username(username)?; - if self.username.to_lowercase() == username.to_lowercase() { + let new_username = User::sanitise_username(&username).await?; + User::validate_username(&new_username)?; + + if self.username.to_lowercase() == new_username.to_lowercase() { self.update( db, PartialUser { - username: Some(username), + username: Some(new_username), ..Default::default() }, vec![], @@ -434,12 +455,12 @@ impl User { discriminator: Some( User::find_discriminator( db, - &username, + &new_username, Some((self.discriminator.to_string(), self.id.clone())), ) .await?, ), - username: Some(username), + username: Some(new_username), ..Default::default() }, vec![], @@ -690,6 +711,7 @@ impl User { } } FieldsUser::DisplayName => self.display_name = None, + FieldsUser::Pronouns => self.pronouns = None, FieldsUser::Suspension => self.suspended_until = None, FieldsUser::None => {} } @@ -705,22 +727,11 @@ impl User { duration_days: Option, reason: Option>, ) -> Result<()> { - let authifier = db.clone().to_authifier().await; - let mut account = authifier - .database - .find_account(&self.id) - .await - .map_err(|_| create_error!(InternalError))?; + let mut account = db.fetch_account(&self.id).await?; - account - .disable(&authifier) - .await - .map_err(|_| create_error!(InternalError))?; + account.disable(db).await?; - account - .delete_all_sessions(&authifier, None) - .await - .map_err(|_| create_error!(InternalError))?; + account.delete_all_sessions(db, None).await?; self.update( db, @@ -736,18 +747,15 @@ impl User { .await?; if let Some(reason) = reason { - if let EmailVerificationConfig::Enabled { smtp, .. } = - authifier.config.email_verification - { - smtp.send_email( + let config = config().await; + + if !config.api.smtp.host.is_empty() { + let templates = email_templates().await; + + send_email( + &config.api.smtp, account.email.clone(), - // maybe move this to common area? - &Template { - title: "Account Suspension".to_string(), - html: Some(include_str!("../../../templates/suspension.html").to_owned()), - text: include_str!("../../../templates/suspension.txt").to_owned(), - url: Default::default(), - }, + &templates.suspension, json!({ "email": account.email, "list": reason.join(", "), @@ -796,7 +804,9 @@ impl User { db, PartialUser { username: Some(format!("Deleted User {}", self.id)), + discriminator: Some("0000".to_string()), flags: Some(2), + relations: Some(Vec::new()), ..Default::default() }, vec![ @@ -824,4 +834,160 @@ impl User { badges } + + /// Removes all relationships which include the user + pub async fn clear_relationships(&self, db: &Database) -> Result<()> { + let user_ids = self + .relations + .iter() + .flatten() + .map(|relation| relation.id.clone()) + .collect(); + + db.clear_user_relationships(&self.id, user_ids).await + } + + /// Removes user from all joined groups + pub async fn remove_from_all_groups(&self, db: &Database) -> Result<()> { + let mut generator = db.find_group_message_channels(&self.id).await?; + + while let Some(groups) = generator.next_n(100).await? { + let ids = groups + .into_iter() + .map(|channel| channel.id().to_string()) + .collect(); + + db.remove_user_from_groups(ids, &self.id).await?; + } + + Ok(()) + } + + /// Deletes the user along with: + /// - deletes owned bots, servers and messages + /// - removes user from all groups + /// - clears relationships + pub async fn delete(&mut self, db: &Database) -> Result<()> { + for bot in db.fetch_bots_by_user(&self.id).await? { + bot.delete(db).await?; + } + + for server in db.fetch_owned_servers(&self.id).await? { + server.delete(db).await?; + } + + self.remove_from_all_groups(db).await?; + db.clear_memberships(&self.id).await?; + self.clear_relationships(db).await?; + db.delete_messages_by_user(&self.id).await?; + self.mark_deleted(db).await?; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use crate::User; + + #[test] + fn username_validation_blocked_names() { + let username_admin = "Admin"; + let username_revolt = "Revolt"; + let username_stoat = "Stoat"; + let username_allowed = "Allowed"; + + assert!(User::validate_username(username_admin).is_err()); + assert!(User::validate_username(username_revolt).is_err()); + assert!(User::validate_username(username_stoat).is_err()); + assert!(User::validate_username(username_allowed).is_ok()); + } + + #[test] + fn username_validation_blocked_patterns() { + let username_grave = "```_test"; + let username_discord = "discord.gg_test"; + let username_rvlt = "rvlt.gg_test"; + let username_guilded = "guilded.gg_test"; + let username_stt = "stt.gg_test"; + let username_revolt = "revolt.chat_test"; + let username_stoat = "stoat.chat_test"; + let username_http = "http://_test"; + let username_https = "https://_test"; + + assert!(User::validate_username(username_grave).is_err()); + assert!(User::validate_username(username_discord).is_err()); + assert!(User::validate_username(username_rvlt).is_err()); + assert!(User::validate_username(username_guilded).is_err()); + assert!(User::validate_username(username_stt).is_err()); + assert!(User::validate_username(username_revolt).is_err()); + assert!(User::validate_username(username_stoat).is_err()); + assert!(User::validate_username(username_http).is_err()); + assert!(User::validate_username(username_https).is_err()); + } + + #[tokio::test] + async fn username_sanitisation_clean() { + let username_clean = "Test"; + + let username_clean_sanitised = User::sanitise_username(username_clean).await; + + assert!(username_clean_sanitised.is_ok()); + assert_eq!(username_clean, username_clean_sanitised.unwrap()); + } + + #[tokio::test] + async fn username_sanitisation_homoglyphs() { + let username_homoglyphs = "𝔽𝕌Ňℕy"; + + let username_homoglyphs_sanitised = + User::sanitise_username(username_homoglyphs).await.unwrap(); + + assert_ne!(username_homoglyphs, username_homoglyphs_sanitised); + assert_eq!("funny", username_homoglyphs_sanitised); + } + + #[tokio::test] + async fn username_sanitisation_padding() { + let username_padding = "a"; + + let username = User::sanitise_username(username_padding).await.unwrap(); + + assert_eq!("a_", username); + } + + #[tokio::test] + async fn create_user() { + use revolt_result::Result; + + database_test!(|db| async move { + let mut created_clean = User::create(&db, "Test".to_string(), None, None) + .await + .unwrap(); + + assert_eq!("Test", created_clean.username); + + created_clean + .update_username(&db, "Test2".to_string()) + .await + .unwrap(); + + assert_eq!("Test2", created_clean.username); + + let created_invalid_result: Result<_> = + User::create(&db, "stoat.chat".to_string(), None, None).await; + + assert!(created_invalid_result.is_err()); + + let mut updated_invalid = User::create(&db, "Test".to_string(), None, None) + .await + .unwrap(); + + let updated_invalid_update_result = updated_invalid + .update_username(&db, "http://test".to_string()) + .await; + + assert!(updated_invalid_update_result.is_err()); + }); + } } diff --git a/crates/core/database/src/models/users/ops.rs b/crates/core/database/src/models/users/ops.rs index d7586641c..185846d89 100644 --- a/crates/core/database/src/models/users/ops.rs +++ b/crates/core/database/src/models/users/ops.rs @@ -1,5 +1,3 @@ -use authifier::models::Session; -use iso8601_timestamp::Timestamp; use revolt_result::Result; use crate::{FieldsUser, PartialUser, RelationshipStatus, User}; @@ -19,9 +17,6 @@ pub trait AbstractUsers: Sync + Send { /// Fetch a user from the database by their username async fn fetch_user_by_username(&self, username: &str, discriminator: &str) -> Result; - /// Fetch a session from the database by token - async fn fetch_session_by_token(&self, token: &str) -> Result; - /// Fetch multiple users by their ids async fn fetch_users<'a>(&self, ids: &'a [String]) -> Result>; @@ -61,8 +56,6 @@ pub trait AbstractUsers: Sync + Send { /// Delete a user by their id async fn delete_user(&self, id: &str) -> Result<()>; - /// Remove push subscription for a session by session id (TODO: remove) - async fn remove_push_subscription_by_session_id(&self, session_id: &str) -> Result<()>; - - async fn update_session_last_seen(&self, session_id: &str, when: Timestamp) -> Result<()>; + /// Removes all relationships with the user from the list of users + async fn clear_user_relationships(&self, target_id: &str, user_ids: Vec) -> Result<()>; } diff --git a/crates/core/database/src/models/users/ops/mongodb.rs b/crates/core/database/src/models/users/ops/mongodb.rs index 66de248ec..b2a8eb1df 100644 --- a/crates/core/database/src/models/users/ops/mongodb.rs +++ b/crates/core/database/src/models/users/ops/mongodb.rs @@ -1,7 +1,5 @@ use ::mongodb::options::{Collation, CollationStrength, FindOneOptions, FindOptions}; -use authifier::models::Session; use futures::StreamExt; -use iso8601_timestamp::Timestamp; use revolt_result::Result; use crate::DocumentId; @@ -47,17 +45,6 @@ impl AbstractUsers for MongoDb { .ok_or_else(|| create_error!(NotFound)) } - /// Fetch a session from the database by token - async fn fetch_session_by_token(&self, token: &str) -> Result { - self.col::("sessions") - .find_one(doc! { - "token": token - }) - .await - .map_err(|_| create_database_error!("find_one", "sessions"))? - .ok_or_else(|| create_error!(InvalidSession)) - } - /// Fetch multiple users by their ids async fn fetch_users<'a>(&self, ids: &'a [String]) -> Result> { Ok(self @@ -321,41 +308,22 @@ impl AbstractUsers for MongoDb { query!(self, delete_one_by_id, COL, id).map(|_| ()) } - /// Remove push subscription for a session by session id (TODO: remove) - async fn remove_push_subscription_by_session_id(&self, session_id: &str) -> Result<()> { - self.col::("sessions") - .update_one( - doc! { - "_id": session_id - }, - doc! { - "$unset": { - "subscription": 1 - } - }, - ) - .await - .map(|_| ()) - .map_err(|_| create_database_error!("update_one", "sessions")) - } - - async fn update_session_last_seen(&self, session_id: &str, when: Timestamp) -> Result<()> { - let formatted: &str = &when.format(); - - self.col::("sessions") - .update_one( - doc! { - "_id": session_id - }, + /// Removes all relationships with the user from the list of users + async fn clear_user_relationships(&self, target_id: &str, user_ids: Vec) -> Result<()> { + self.col::(COL) + .update_many( + doc! { "_id": { "$in": user_ids } }, doc! { - "$set": { - "last_seen": formatted + "$pull": { + "relations": { + "_id": target_id.to_string() + } } }, ) .await .map(|_| ()) - .map_err(|_| create_database_error!("update_one", "sessions")) + .map_err(|_| create_database_error!("bulk_write", COL)) } } @@ -368,6 +336,7 @@ impl IntoDocumentPath for FieldsUser { FieldsUser::StatusPresence => "status.presence", FieldsUser::StatusText => "status.text", FieldsUser::DisplayName => "display_name", + FieldsUser::Pronouns => "pronouns", FieldsUser::Suspension => "suspended_until", FieldsUser::None => "none", }) diff --git a/crates/core/database/src/models/users/ops/reference.rs b/crates/core/database/src/models/users/ops/reference.rs index 4817f97e4..e9c18b672 100644 --- a/crates/core/database/src/models/users/ops/reference.rs +++ b/crates/core/database/src/models/users/ops/reference.rs @@ -1,5 +1,3 @@ -use authifier::models::Session; -use iso8601_timestamp::Timestamp; use revolt_result::Result; use crate::{FieldsUser, PartialUser, RelationshipStatus, User}; @@ -42,11 +40,6 @@ impl AbstractUsers for ReferenceDb { .ok_or_else(|| create_error!(NotFound)) } - /// Fetch a session from the database by token - async fn fetch_session_by_token(&self, _token: &str) -> Result { - todo!() - } - /// Fetch multiple users by their ids async fn fetch_users<'a>(&self, ids: &'a [String]) -> Result> { let users = self.users.lock().await; @@ -165,12 +158,22 @@ impl AbstractUsers for ReferenceDb { } } - /// Remove push subscription for a session by session id (TODO: remove) - async fn remove_push_subscription_by_session_id(&self, _session_id: &str) -> Result<()> { - todo!() - } + /// Removes all relationships with the user from the list of users + async fn clear_user_relationships( + &self, + target_id: &str, + user_ids: Vec, + ) -> Result<()> { + let mut users = self.users.lock().await; - async fn update_session_last_seen(&self, _session_id: &str, _when: Timestamp) -> Result<()> { - todo!() + for user_id in user_ids { + if let Some(user) = users.get_mut(&user_id) { + if let Some(relations) = &mut user.relations { + relations.retain(|relation| relation.id != target_id); + } + } + } + + Ok(()) } } diff --git a/crates/core/database/src/models/users/rocket.rs b/crates/core/database/src/models/users/rocket.rs index 57b634b15..8729bf748 100644 --- a/crates/core/database/src/models/users/rocket.rs +++ b/crates/core/database/src/models/users/rocket.rs @@ -1,12 +1,12 @@ -use authifier::models::Session; use rocket::http::Status; use rocket::request::{self, FromRequest, Outcome, Request}; +use revolt_result::Error; -use crate::{Database, User}; +use crate::{Database, Session, User}; #[rocket::async_trait] impl<'r> FromRequest<'r> for User { - type Error = authifier::Error; + type Error = Error; async fn from_request(request: &'r Request<'_>) -> request::Outcome { let user: &Option = request @@ -38,7 +38,7 @@ impl<'r> FromRequest<'r> for User { if let Some(user) = user { Outcome::Success(user.clone()) } else { - Outcome::Error((Status::Unauthorized, authifier::Error::InvalidSession)) + Outcome::Error((Status::Unauthorized, create_error!(InvalidSession))) } } } diff --git a/crates/core/database/src/tasks/ack.rs b/crates/core/database/src/tasks/ack.rs index c12e41f3c..558da47f7 100644 --- a/crates/core/database/src/tasks/ack.rs +++ b/crates/core/database/src/tasks/ack.rs @@ -14,7 +14,7 @@ use validator::HasLen; use revolt_result::Result; use super::DelayedTask; -use crate::Channel::{TextChannel, VoiceChannel}; +use crate::Channel::TextChannel; /// Enumeration of possible events #[derive(Debug, Eq, PartialEq)] @@ -105,7 +105,11 @@ pub async fn handle_ack_event( if mentions_acked > 0 { if let Err(err) = amqp - .ack_message(user.to_string(), channel.to_string(), id.to_owned()) + .ack_notification_message( + user.to_string(), + channel.to_string(), + id.to_owned(), + ) .await { revolt_config::capture_error(&err); @@ -191,17 +195,12 @@ pub async fn handle_ack_event( .await .expect("Failed to fetch channel from db"); - match channel { - TextChannel { server, .. } | VoiceChannel { server, .. } => { - if let Err(err) = - amqp.mass_mention_message_sent(server, mass_mentions).await - { - revolt_config::capture_error(&err); - } - } - _ => { - panic!("Unknown channel type when sending mass mention event"); + if let TextChannel { server, .. } = channel { + if let Err(err) = amqp.mass_mention_message_sent(server, mass_mentions).await { + revolt_config::capture_error(&err); } + } else { + panic!("Unknown channel type when sending mass mention event"); } } } @@ -306,6 +305,6 @@ pub async fn worker(db: Database, amqp: AMQP) { } // Sleep for an arbitrary amount of time. - async_std::task::sleep(Duration::from_secs(1)).await; + tokio::time::sleep(Duration::from_secs(1)).await; } } diff --git a/crates/core/database/src/tasks/authifier_relay.rs b/crates/core/database/src/tasks/authifier_relay.rs deleted file mode 100644 index 14bcb692d..000000000 --- a/crates/core/database/src/tasks/authifier_relay.rs +++ /dev/null @@ -1,29 +0,0 @@ -use async_std::channel::{unbounded, Receiver, Sender}; -use authifier::AuthifierEvent; -use once_cell::sync::Lazy; - -use crate::events::client::EventV1; - -static Q: Lazy<(Sender, Receiver)> = Lazy::new(unbounded); - -/// Get sender -pub fn sender() -> Sender { - Q.0.clone() -} - -/// Start a new worker -pub async fn worker() { - loop { - let event = Q.1.recv().await.unwrap(); - match &event { - AuthifierEvent::CreateSession { .. } | AuthifierEvent::CreateAccount { .. } => { - EventV1::Auth(event).global().await - } - AuthifierEvent::DeleteSession { user_id, .. } - | AuthifierEvent::DeleteAllSessions { user_id, .. } => { - let id = user_id.to_string(); - EventV1::Auth(event).private(id).await - } - } - } -} diff --git a/crates/core/database/src/tasks/last_message_id.rs b/crates/core/database/src/tasks/last_message_id.rs index 94c14c171..7314c2d0a 100644 --- a/crates/core/database/src/tasks/last_message_id.rs +++ b/crates/core/database/src/tasks/last_message_id.rs @@ -82,6 +82,6 @@ pub async fn worker(db: Database) { } // Sleep for an arbitrary amount of time. - async_std::task::sleep(Duration::from_secs(1)).await; + tokio::time::sleep(Duration::from_secs(1)).await; } } diff --git a/crates/core/database/src/tasks/mod.rs b/crates/core/database/src/tasks/mod.rs index 111d51068..69f57792d 100644 --- a/crates/core/database/src/tasks/mod.rs +++ b/crates/core/database/src/tasks/mod.rs @@ -2,20 +2,17 @@ use crate::{Database, AMQP}; -use async_std::task; +use tokio::task; use std::time::Instant; const WORKER_COUNT: usize = 5; pub mod ack; -pub mod authifier_relay; pub mod last_message_id; pub mod process_embeds; /// Spawn background workers pub fn start_workers(db: Database, amqp: AMQP) { - task::spawn(authifier_relay::worker()); - for _ in 0..WORKER_COUNT { task::spawn(ack::worker(db.clone(), amqp.clone())); task::spawn(last_message_id::worker(db.clone())); diff --git a/crates/core/database/src/tasks/process_embeds.rs b/crates/core/database/src/tasks/process_embeds.rs index d9d61d75a..35b519546 100644 --- a/crates/core/database/src/tasks/process_embeds.rs +++ b/crates/core/database/src/tasks/process_embeds.rs @@ -7,11 +7,11 @@ use revolt_config::config; use revolt_result::Result; use async_lock::Semaphore; -use async_std::task::spawn; use deadqueue::limited::Queue; use once_cell::sync::Lazy; use revolt_models::v0::Embed; use std::{collections::HashSet, sync::Arc}; +use tokio::task::spawn; use isahc::prelude::*; @@ -159,6 +159,7 @@ pub async fn generate( .await .into_iter() .flatten() + .flatten() .collect::>(); // Prevent database update when no embeds are found. diff --git a/crates/core/database/src/util/acker.rs b/crates/core/database/src/util/acker.rs new file mode 100644 index 000000000..8cc104c57 --- /dev/null +++ b/crates/core/database/src/util/acker.rs @@ -0,0 +1,77 @@ +use redis_kiss::{get_connection, AsyncCommands}; +use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; +use revolt_result::{Result, ToRevoltError}; + +use crate::{events::client::EventV1, Channel, Database, Server, User, AMQP}; + +pub async fn ack_channel(user: &str, channel: &str, message: &str, amqp: &AMQP) -> Result<()> { + let mut redis = get_connection() + .await + .map_err(|_| create_error!(InternalError))?; + + let old: Option = redis + .getset(format!("acker:{user}+{channel}"), message) + .await + .to_internal_error()?; + + if old.is_none() || old.unwrap() == message { + amqp.process_ack(user, Some(channel), None) + .await + .to_internal_error()?; + } + + Ok(()) +} + +pub async fn ack_server(user: &User, server: &Server, db: &Database, amqp: &AMQP) -> Result<()> { + let mut redis = get_connection() + .await + .map_err(|_| create_error!(InternalError))?; + + let channels = db.fetch_channels(&server.channels).await?; + let query = crate::util::permissions::DatabasePermissionQuery::new(db, user).server(server); + + for channel in channels { + let channel_id = channel.id(); + let mut q = query.clone().channel(&channel); + + if calculate_channel_permissions(&mut q) + .await + .has_channel_permission(ChannelPermission::ViewChannel) + { + let channel_last_msg = match &channel { + Channel::TextChannel { + last_message_id, .. + } => last_message_id, + _ => unreachable!(), + } + .clone(); + + if let Some(channel_last_msg) = channel_last_msg { + let old: Option = redis + .getset( + format!("acker:{}+{}", user.id, channel_id), + &channel_last_msg, + ) + .await + .to_internal_error()?; + + if old.is_none() || old.unwrap() == channel_last_msg { + amqp.process_ack(&user.id, Some(channel_id), Some(&server.id)) + .await + .to_internal_error()?; + + EventV1::ChannelAck { + id: channel_id.to_string(), + user: user.id.clone(), + message_id: channel_last_msg, + } + .private(user.id.clone()) + .await; + } + } + } + } + + Ok(()) +} diff --git a/crates/core/database/src/util/bridge/v0.rs b/crates/core/database/src/util/bridge/v0.rs index de64a4bf2..2cce67999 100644 --- a/crates/core/database/src/util/bridge/v0.rs +++ b/crates/core/database/src/util/bridge/v0.rs @@ -143,6 +143,7 @@ impl From for FieldsWebhook { } impl From for Channel { + #[allow(deprecated)] fn from(value: crate::Channel) -> Self { match value { crate::Channel::SavedMessages { id, user } => Channel::SavedMessages { id, user }, @@ -188,6 +189,8 @@ impl From for Channel { default_permissions, role_permissions, nsfw, + voice, + slowmode, } => Channel::TextChannel { id, server, @@ -198,31 +201,15 @@ impl From for Channel { default_permissions, role_permissions, nsfw, - }, - crate::Channel::VoiceChannel { - id, - server, - name, - description, - icon, - default_permissions, - role_permissions, - nsfw, - } => Channel::VoiceChannel { - id, - server, - name, - description, - icon: icon.map(|file| file.into()), - default_permissions, - role_permissions, - nsfw, + voice: voice.map(|voice| voice.into()), + slowmode, }, } } } impl From for crate::Channel { + #[allow(deprecated)] fn from(value: Channel) -> crate::Channel { match value { Channel::SavedMessages { id, user } => crate::Channel::SavedMessages { id, user }, @@ -268,6 +255,8 @@ impl From for crate::Channel { default_permissions, role_permissions, nsfw, + voice, + slowmode, } => crate::Channel::TextChannel { id, server, @@ -278,25 +267,8 @@ impl From for crate::Channel { default_permissions, role_permissions, nsfw, - }, - Channel::VoiceChannel { - id, - server, - name, - description, - icon, - default_permissions, - role_permissions, - nsfw, - } => crate::Channel::VoiceChannel { - id, - server, - name, - description, - icon: icon.map(|file| file.into()), - default_permissions, - role_permissions, - nsfw, + voice: voice.map(|voice| voice.into()), + slowmode, }, } } @@ -315,6 +287,8 @@ impl From for PartialChannel { role_permissions: value.role_permissions, default_permissions: value.default_permissions, last_message_id: value.last_message_id, + voice: value.voice.map(|voice| voice.into()), + slowmode: value.slowmode, } } } @@ -332,6 +306,8 @@ impl From for crate::PartialChannel { role_permissions: value.role_permissions, default_permissions: value.default_permissions, last_message_id: value.last_message_id, + voice: value.voice.map(|voice| voice.into()), + slowmode: value.slowmode, } } } @@ -342,6 +318,7 @@ impl From for crate::FieldsChannel { FieldsChannel::Description => crate::FieldsChannel::Description, FieldsChannel::Icon => crate::FieldsChannel::Icon, FieldsChannel::DefaultPermissions => crate::FieldsChannel::DefaultPermissions, + FieldsChannel::Voice => crate::FieldsChannel::Voice, } } } @@ -352,6 +329,7 @@ impl From for FieldsChannel { crate::FieldsChannel::Description => FieldsChannel::Description, crate::FieldsChannel::Icon => FieldsChannel::Icon, crate::FieldsChannel::DefaultPermissions => FieldsChannel::DefaultPermissions, + crate::FieldsChannel::Voice => FieldsChannel::Voice, } } } @@ -434,9 +412,16 @@ impl From for Metadata { match value { crate::Metadata::File => Metadata::File, crate::Metadata::Text => Metadata::Text, - crate::Metadata::Image { width, height } => Metadata::Image { + crate::Metadata::Image { + width, + height, + thumbhash, + animated, + } => Metadata::Image { width: width as usize, height: height as usize, + thumbhash, + animated, }, crate::Metadata::Video { width, height } => Metadata::Video { width: width as usize, @@ -452,9 +437,16 @@ impl From for crate::Metadata { match value { Metadata::File => crate::Metadata::File, Metadata::Text => crate::Metadata::Text, - Metadata::Image { width, height } => crate::Metadata::Image { + Metadata::Image { + width, + height, + thumbhash, + animated, + } => crate::Metadata::Image { width: width as isize, height: height as isize, + thumbhash, + animated, }, Metadata::Video { width, height } => crate::Metadata::Video { width: width as isize, @@ -543,6 +535,9 @@ impl From for SystemMessage { crate::SystemMessage::UserRemove { id, by } => Self::UserRemove { id, by }, crate::SystemMessage::MessagePinned { id, by } => Self::MessagePinned { id, by }, crate::SystemMessage::MessageUnpinned { id, by } => Self::MessageUnpinned { id, by }, + crate::SystemMessage::CallStarted { by, finished_at } => { + Self::CallStarted { by, finished_at } + } } } } @@ -636,9 +631,12 @@ impl From for Member { id: value.id.into(), joined_at: value.joined_at, nickname: value.nickname, + pronouns: value.pronouns, avatar: value.avatar.map(|f| f.into()), roles: value.roles, timeout: value.timeout, + can_publish: value.can_publish, + can_receive: value.can_receive, } } } @@ -649,9 +647,12 @@ impl From for crate::Member { id: value.id.into(), joined_at: value.joined_at, nickname: value.nickname, + pronouns: value.pronouns, avatar: value.avatar.map(|f| f.into()), roles: value.roles, timeout: value.timeout, + can_publish: value.can_publish, + can_receive: value.can_receive, } } } @@ -662,9 +663,12 @@ impl From for PartialMember { id: value.id.map(|id| id.into()), joined_at: value.joined_at, nickname: value.nickname, + pronouns: value.pronouns, avatar: value.avatar.map(|f| f.into()), roles: value.roles, timeout: value.timeout, + can_publish: value.can_publish, + can_receive: value.can_receive, } } } @@ -675,9 +679,12 @@ impl From for crate::PartialMember { id: value.id.map(|id| id.into()), joined_at: value.joined_at, nickname: value.nickname, + pronouns: value.pronouns, avatar: value.avatar.map(|f| f.into()), roles: value.roles, timeout: value.timeout, + can_publish: value.can_publish, + can_receive: value.can_receive, } } } @@ -705,9 +712,13 @@ impl From for FieldsMember { match value { crate::FieldsMember::Avatar => FieldsMember::Avatar, crate::FieldsMember::Nickname => FieldsMember::Nickname, + crate::FieldsMember::Pronouns => FieldsMember::Pronouns, crate::FieldsMember::Roles => FieldsMember::Roles, crate::FieldsMember::Timeout => FieldsMember::Timeout, + crate::FieldsMember::CanReceive => FieldsMember::CanReceive, + crate::FieldsMember::CanPublish => FieldsMember::CanPublish, crate::FieldsMember::JoinedAt => FieldsMember::JoinedAt, + crate::FieldsMember::VoiceChannel => FieldsMember::VoiceChannel, } } } @@ -717,9 +728,13 @@ impl From for crate::FieldsMember { match value { FieldsMember::Avatar => crate::FieldsMember::Avatar, FieldsMember::Nickname => crate::FieldsMember::Nickname, + FieldsMember::Pronouns => crate::FieldsMember::Pronouns, FieldsMember::Roles => crate::FieldsMember::Roles, FieldsMember::Timeout => crate::FieldsMember::Timeout, + FieldsMember::CanReceive => crate::FieldsMember::CanReceive, + FieldsMember::CanPublish => crate::FieldsMember::CanPublish, FieldsMember::JoinedAt => crate::FieldsMember::JoinedAt, + FieldsMember::VoiceChannel => crate::FieldsMember::VoiceChannel, } } } @@ -911,11 +926,13 @@ impl From for crate::SystemMessageChannels { impl From for Role { fn from(value: crate::Role) -> Self { Role { + id: value.id, name: value.name, permissions: value.permissions, colour: value.colour, hoist: value.hoist, rank: value.rank, + icon: value.icon.map(|f| f.into()), } } } @@ -923,11 +940,13 @@ impl From for Role { impl From for crate::Role { fn from(value: Role) -> crate::Role { crate::Role { + id: value.id, name: value.name, permissions: value.permissions, colour: value.colour, hoist: value.hoist, rank: value.rank, + icon: value.icon.map(|f| f.into()), } } } @@ -935,11 +954,13 @@ impl From for crate::Role { impl From for PartialRole { fn from(value: crate::PartialRole) -> Self { PartialRole { + id: value.id, name: value.name, permissions: value.permissions, colour: value.colour, hoist: value.hoist, rank: value.rank, + icon: value.icon.map(|f| f.into()), } } } @@ -947,11 +968,13 @@ impl From for PartialRole { impl From for crate::PartialRole { fn from(value: PartialRole) -> crate::PartialRole { crate::PartialRole { + id: value.id, name: value.name, permissions: value.permissions, colour: value.colour, hoist: value.hoist, rank: value.rank, + icon: value.icon.map(|f| f.into()), } } } @@ -960,6 +983,7 @@ impl From for FieldsRole { fn from(value: crate::FieldsRole) -> Self { match value { crate::FieldsRole::Colour => FieldsRole::Colour, + crate::FieldsRole::Icon => FieldsRole::Icon, } } } @@ -968,6 +992,7 @@ impl From for crate::FieldsRole { fn from(value: FieldsRole) -> Self { match value { FieldsRole::Colour => crate::FieldsRole::Colour, + FieldsRole::Icon => crate::FieldsRole::Icon, } } } @@ -1013,6 +1038,7 @@ impl crate::User { username: self.username, discriminator: self.discriminator, display_name: self.display_name, + pronouns: self.pronouns, avatar: self.avatar.map(|file| file.into()), relations: if let Some(crate::User { id, .. }) = perspective { if id == &self.id { @@ -1089,6 +1115,7 @@ impl crate::User { username: self.username, discriminator: self.discriminator, display_name: self.display_name, + pronouns: self.pronouns, avatar: self.avatar.map(|file| file.into()), relations: vec![], badges, @@ -1122,6 +1149,7 @@ impl crate::User { username: self.username, discriminator: self.discriminator, display_name: self.display_name, + pronouns: self.pronouns, avatar: self.avatar.map(|file| file.into()), relations: vec![], badges, @@ -1149,6 +1177,7 @@ impl crate::User { username: self.username, discriminator: self.discriminator, display_name: self.display_name, + pronouns: self.pronouns, avatar: self.avatar.map(|file| file.into()), relations: self .relations @@ -1192,6 +1221,7 @@ impl From for crate::User { username: value.username, discriminator: value.discriminator, display_name: value.display_name, + pronouns: value.pronouns, avatar: value.avatar.map(Into::into), relations: None, badges: Some(value.badges as i32), @@ -1212,6 +1242,7 @@ impl From for PartialUser { username: value.username, discriminator: value.discriminator, display_name: value.display_name, + pronouns: value.pronouns, avatar: value.avatar.map(|file| file.into()), relations: value.relations.map(|relationships| { relationships @@ -1240,6 +1271,7 @@ impl From for crate::FieldsUser { FieldsUser::StatusPresence => crate::FieldsUser::StatusPresence, FieldsUser::StatusText => crate::FieldsUser::StatusText, FieldsUser::DisplayName => crate::FieldsUser::DisplayName, + FieldsUser::Pronouns => crate::FieldsUser::Pronouns, FieldsUser::Internal => crate::FieldsUser::None, } @@ -1255,6 +1287,7 @@ impl From for FieldsUser { crate::FieldsUser::StatusPresence => FieldsUser::StatusPresence, crate::FieldsUser::StatusText => FieldsUser::StatusText, crate::FieldsUser::DisplayName => FieldsUser::DisplayName, + crate::FieldsUser::Pronouns => FieldsUser::Pronouns, crate::FieldsUser::Suspension => FieldsUser::Internal, crate::FieldsUser::None => FieldsUser::Internal, @@ -1387,3 +1420,108 @@ impl From for crate::FieldsMessage { } } } + +impl From for crate::VoiceInformation { + fn from(value: VoiceInformation) -> Self { + crate::VoiceInformation { + max_users: value.max_users, + } + } +} + +impl From for VoiceInformation { + fn from(value: crate::VoiceInformation) -> Self { + VoiceInformation { + max_users: value.max_users, + } + } +} + +impl From for AccountInfo { + fn from(item: crate::Account) -> Self { + AccountInfo { + id: item.id, + email: item.email, + } + } +} + +impl From for MFATicket { + fn from(value: crate::MFATicket) -> Self { + MFATicket { + id: value.id, + account_id: value.account_id, + token: value.token, + validated: value.validated, + authorised: value.authorised, + last_totp_code: value.last_totp_code, + } + } +} + +impl From for MultiFactorStatus { + fn from(item: crate::MultiFactorAuthentication) -> Self { + MultiFactorStatus { + // email_otp: item.enable_email_otp, + // trusted_handover: item.enable_trusted_handover, + // email_mfa: item.enable_email_mfa, + totp_mfa: !item.totp_token.is_disabled(), + // security_key_mfa: item.security_key_token.is_some(), + recovery_active: !item.recovery_codes.is_empty(), + ..Default::default() + } + } +} + +impl From for MFAMethod { + fn from(value: crate::MFAMethod) -> Self { + match value { + crate::MFAMethod::Password => MFAMethod::Password, + crate::MFAMethod::Recovery => MFAMethod::Recovery, + crate::MFAMethod::Totp => MFAMethod::Totp, + } + } +} + +impl From for SessionInfo { + fn from(item: crate::Session) -> Self { + SessionInfo { + id: item.id, + name: item.name, + } + } +} + +impl From for Session { + fn from(value: crate::Session) -> Self { + Session { + id: value.id, + user_id: value.user_id, + token: value.token, + name: value.name, + last_seen: value.last_seen, + origin: value.origin, + subscription: value.subscription.map(Into::into), + } + } +} + +impl From for WebPushSubscription { + fn from(value: crate::WebPushSubscription) -> Self { + WebPushSubscription { + endpoint: value.endpoint, + p256dh: value.p256dh, + auth: value.auth, + } + } +} + +impl From for crate::WebPushSubscription { + fn from(value: WebPushSubscription) -> Self { + crate::WebPushSubscription { + endpoint: value.endpoint, + p256dh: value.p256dh, + auth: value.auth, + } + } +} diff --git a/crates/core/database/src/util/bulk_permissions.rs b/crates/core/database/src/util/bulk_permissions.rs index 9e7a1f7a1..976b0d692 100644 --- a/crates/core/database/src/util/bulk_permissions.rs +++ b/crates/core/database/src/util/bulk_permissions.rs @@ -144,10 +144,6 @@ impl<'z> BulkDatabasePermissionQuery<'z> { Channel::TextChannel { default_permissions, .. - } - | Channel::VoiceChannel { - default_permissions, - .. } => default_permissions.unwrap_or_default().into(), _ => Default::default(), } @@ -156,16 +152,14 @@ impl<'z> BulkDatabasePermissionQuery<'z> { } } - #[allow(dead_code)] + #[allow(dead_code, deprecated)] fn get_channel_type(&mut self) -> ChannelType { if let Some(channel) = &self.channel { match channel { Channel::DirectMessage { .. } => ChannelType::DirectMessage, Channel::Group { .. } => ChannelType::Group, Channel::SavedMessages { .. } => ChannelType::SavedMessages, - Channel::TextChannel { .. } | Channel::VoiceChannel { .. } => { - ChannelType::ServerChannel - } + Channel::TextChannel { .. } => ChannelType::ServerChannel, } } else { ChannelType::Unknown @@ -179,9 +173,6 @@ impl<'z> BulkDatabasePermissionQuery<'z> { match channel { Channel::TextChannel { role_permissions, .. - } - | Channel::VoiceChannel { - role_permissions, .. } => role_permissions, _ => panic!("Not supported for non-server channels"), } @@ -208,12 +199,6 @@ async fn calculate_members_permissions<'a>( role_permissions, default_permissions, .. - } - | Channel::VoiceChannel { - id, - role_permissions, - default_permissions, - .. } => (id, role_permissions, default_permissions), _ => panic!("Calculation of member permissions must be done on a server channel"), }; diff --git a/crates/core/database/src/util/captcha.rs b/crates/core/database/src/util/captcha.rs new file mode 100644 index 000000000..73e7d87d9 --- /dev/null +++ b/crates/core/database/src/util/captcha.rs @@ -0,0 +1,42 @@ +use reqwest::Client; +use revolt_config::config; +use revolt_result::Result; +use std::sync::LazyLock; + +static CLIENT: LazyLock = LazyLock::new(Client::new); + +#[derive(Serialize, Deserialize)] +struct CaptchaResponse { + success: bool, +} + +pub async fn check_captcha(token: Option<&str>) -> Result<()> { + let config = config().await; + + if !config.api.security.captcha.hcaptcha_key.is_empty() { + let Some(token) = token else { + return Err(create_error!(CaptchaFailed)); + }; + + let response = CLIENT + .post("https://hcaptcha.com/siteverify") + .form(&[ + ("secret", config.api.security.captcha.hcaptcha_key.as_str()), + ("response", token), + ]) + .send() + .await + .map_err(|_| create_error!(CaptchaFailed))? + .json::() + .await + .map_err(|_| create_error!(CaptchaFailed))?; + + if response.success { + Ok(()) + } else { + Err(create_error!(CaptchaFailed)) + } + } else { + Ok(()) + } +} diff --git a/crates/core/database/src/util/chunked.rs b/crates/core/database/src/util/chunked.rs new file mode 100644 index 000000000..16ac15825 --- /dev/null +++ b/crates/core/database/src/util/chunked.rs @@ -0,0 +1,63 @@ +#[cfg(feature = "mongodb")] +use ::mongodb::{ClientSession, SessionCursor}; +use revolt_result::{Result, ToRevoltError}; +use serde::Deserialize; + +#[derive(Debug)] +#[allow(clippy::large_enum_variant)] +pub enum ChunkedDatabaseGenerator { + #[cfg(feature = "mongodb")] + MongoDb { + session: ClientSession, + cursor: SessionCursor, + }, + + Reference { + offset: usize, + data: Vec, + }, +} + +impl Deserialize<'d> + Clone> ChunkedDatabaseGenerator { + #[cfg(feature = "mongodb")] + pub fn new_mongo(session: ClientSession, cursor: SessionCursor) -> Self { + Self::MongoDb { session, cursor } + } + + pub fn new_reference(data: Vec) -> Self { + Self::Reference { offset: 0, data } + } + + pub async fn next(&mut self) -> Result> { + match self { + #[cfg(feature = "mongodb")] + Self::MongoDb { session, cursor } => { + cursor.next(session).await.transpose().to_internal_error() + } + Self::Reference { offset, data } => { + if let Some(value) = data.get(*offset) { + *offset += 1; + Ok(Some(value.clone())) + } else { + Ok(None) + } + } + } + } + + pub async fn next_n(&mut self, n: usize) -> Result>> { + let mut docs = Vec::new(); + + while docs.len() < n { + if let Some(doc) = self.next().await? { + docs.push(doc); + } else if docs.is_empty() { + return Ok(None); + } else { + break; + } + } + + Ok(Some(docs)) + } +} diff --git a/crates/core/database/src/util/email.rs b/crates/core/database/src/util/email.rs new file mode 100644 index 000000000..8a993a0a4 --- /dev/null +++ b/crates/core/database/src/util/email.rs @@ -0,0 +1,271 @@ +use std::{collections::HashSet, sync::LazyLock}; + +use lettre::{ + transport::smtp::{authentication::Credentials, client::Tls}, + SmtpTransport, +}; +use regex::Regex; +use revolt_config::{config, ApiSmtp}; +use revolt_result::Result; + +static SPLIT: LazyLock = LazyLock::new(|| Regex::new("([^@]+)(@.+)").unwrap()); +static SYMBOL_RE: LazyLock = LazyLock::new(|| Regex::new("\\+.+|\\.").unwrap()); +static HANDLEBARS: LazyLock> = + LazyLock::new(handlebars::Handlebars::new); +static REVOLT_SOURCE_LIST: LazyLock> = LazyLock::new(|| { + include_str!("../../assets/revolt_source_list.txt") + .split('\n') + .map(|x| x.into()) + .collect() +}); + +/// Strip special characters and aliases from emails +pub fn normalise_email(original: String) -> String { + let split = SPLIT.captures(&original).unwrap(); + let mut clean = SYMBOL_RE + .replace_all(split.get(1).unwrap().as_str(), "") + .to_string(); + + clean.push_str(split.get(2).unwrap().as_str()); + clean.to_lowercase() +} + +/// Email template +#[derive(Clone)] +pub struct Template { + /// Title of the email + pub title: String, + /// Plain text version of this email + pub text: String, + /// HTML version of this email + pub html: Option, + /// URL to redirect people to from the email + /// + /// Use `{{url}}` to fill this field. + /// + /// Any given URL will be suffixed with a unique token if applicable. + /// + /// e.g. `https://example.com?t=` becomes `https://example.com?t=UNIQUE_CODE` + pub url: String, +} + +/// Email templates +#[derive(Clone)] +pub struct Templates { + /// Template for email verification + pub verify: Template, + /// Template for password reset + pub reset: Template, + /// Template for password reset when the account already exists on creation + pub reset_existing: Template, + /// Template for account deletion + pub deletion: Template, + /// Template for suspention + pub suspension: Template, +} + +pub async fn email_templates() -> Templates { + let config = config().await; + + if std::env::var("TEST_DB").is_ok() { + Templates { + verify: Template { + title: "verify".into(), + text: "[[{{url}}]]".into(), + url: "".into(), + html: None, + }, + reset: Template { + title: "reset".into(), + text: "[[{{url}}]]".into(), + url: "".into(), + html: None, + }, + reset_existing: Template { + title: "reset_existing".into(), + text: "[[{{url}}]]".into(), + url: "".into(), + html: None, + }, + deletion: Template { + title: "deletion".into(), + text: "[[{{url}}]]".into(), + url: "".into(), + html: None, + }, + suspension: Template { + title: "suspension".into(), + text: "[[dummy]]".into(), + url: "".into(), + html: None, + }, + } + } else if config.production { + Templates { + verify: Template { + title: "Verify your Stoat account.".into(), + text: include_str!("../../templates/verify.txt").into(), + url: format!("{}/login/verify/", config.hosts.app), + html: Some(include_str!("../../templates/verify.html").into()), + }, + reset: Template { + title: "Reset your Stoat password.".into(), + text: include_str!("../../templates/reset.txt").into(), + url: format!("{}/login/reset/", config.hosts.app), + html: Some(include_str!("../../templates/reset.html").into()), + }, + reset_existing: Template { + title: "You already have a Stoat account, reset your password.".into(), + text: include_str!("../../templates/reset-existing.txt").into(), + url: format!("{}/login/reset/", config.hosts.app), + html: Some(include_str!("../../templates/reset-existing.html").into()), + }, + deletion: Template { + title: "Confirm account deletion.".into(), + text: include_str!("../../templates/deletion.txt").into(), + url: format!("{}/delete/", config.hosts.app), + html: Some(include_str!("../../templates/deletion.html").into()), + }, + suspension: Template { + title: "Account Suspension".to_string(), + html: Some(include_str!("../../templates/suspension.html").to_owned()), + text: include_str!("../../templates/suspension.txt").to_owned(), + url: Default::default(), + }, + } + } else { + Templates { + verify: Template { + title: "Verify your account.".into(), + text: include_str!("../../templates/verify.whitelabel.txt").into(), + url: format!("{}/login/verify/", config.hosts.app), + html: None, + }, + reset: Template { + title: "Reset your password.".into(), + text: include_str!("../../templates/reset.whitelabel.txt").into(), + url: format!("{}/login/reset/", config.hosts.app), + html: None, + }, + reset_existing: Template { + title: "Reset your password.".into(), + text: include_str!("../../templates/reset.whitelabel.txt").into(), + url: format!("{}/login/reset/", config.hosts.app), + html: None, + }, + deletion: Template { + title: "Confirm account deletion.".into(), + text: include_str!("../../templates/deletion.whitelabel.txt").into(), + url: format!("{}/delete/", config.hosts.app), + html: None, + }, + suspension: Template { + title: "Account Suspension".to_string(), + text: include_str!("../../templates/suspension.whitelabel.txt").to_owned(), + url: Default::default(), + html: None, + }, + } + } +} + +/// Create SMTP transport +pub fn create_transport(smtp: &ApiSmtp) -> SmtpTransport { + let relay = if smtp.use_starttls == Some(true) { + SmtpTransport::starttls_relay(&smtp.host).unwrap() + } else { + SmtpTransport::relay(&smtp.host).unwrap() + }; + + let relay = if let Some(port) = smtp.port { + relay.port(port.try_into().unwrap()) + } else { + relay + }; + + let relay = if smtp.use_tls == Some(false) { + relay.tls(Tls::None) + } else { + relay + }; + + relay + .credentials(Credentials::new( + smtp.username.clone(), + smtp.password.clone(), + )) + .build() +} + +/// Render an email template +fn render_template(text: &str, variables: &handlebars::JsonValue) -> Result { + HANDLEBARS + .render_template(text, variables) + .map_err(|_| create_error!(RenderFail)) +} + +/// Send an email +pub fn send_email( + smtp: &ApiSmtp, + address: String, + template: &Template, + variables: handlebars::JsonValue, +) -> Result<()> { + let m = lettre::Message::builder() + .from(smtp.from_address.parse().expect("valid `smtp_from`")) + .to(address.parse().expect("valid `smtp_to`")) + .subject(template.title.clone()); + + let m = if let Some(reply_to) = &smtp.reply_to { + m.reply_to(reply_to.parse().expect("valid `smtp_reply_to`")) + } else { + m + }; + + let text = render_template(&template.text, &variables).expect("valid `template`"); + + let m = if let Some(html) = &template.html { + m.multipart(lettre::message::MultiPart::alternative_plain_html( + text, + render_template(html, &variables).expect("valid `template`"), + )) + } else { + m.body(text) + } + .expect("valid `message`"); + + use lettre::Transport; + let sender = create_transport(smtp); + + match sender.send(&m) { + Ok(_) => Ok(()), + Err(error) => { + error!( + "Failed to send email to {}!\nlettre error: {}", + address, error + ); + + revolt_config::capture_error(&error); + + Err(create_error!(EmailFailed)) + } + } +} + +pub fn validate_email(email: &str) -> Result<()> { + // Make sure this is an actual email + if !validator::validate_email(email) { + return Err(create_error!(IncorrectData { + with: "email".to_string() + })); + } + + // Check if the email is blacklisted + if let Some(domain) = email.split('@').next_back() { + if REVOLT_SOURCE_LIST.contains(&domain.to_string()) { + return Err(create_error!(Blacklisted)); + } + } + + Ok(()) +} diff --git a/crates/core/database/src/util/funcs.rs b/crates/core/database/src/util/funcs.rs new file mode 100644 index 000000000..24f9906d4 --- /dev/null +++ b/crates/core/database/src/util/funcs.rs @@ -0,0 +1,24 @@ +use crate::Database; +use revolt_result::Result; + +/// Formats a user's name depending on their optional features and location. +/// Factors in server display names and user display names before falling back to username#discriminator. +/// Passing a server in which the user is not a member will result in an Err. +pub async fn format_display_name( + db: &Database, + user_id: &str, + server_id: Option<&str>, +) -> Result { + if let Some(server_id) = server_id { + let member = db.fetch_member(server_id, user_id).await?; + if let Some(nick) = member.nickname { + return Ok(nick); + } + } + + let user = db.fetch_user(user_id).await?; + if let Some(display) = user.display_name { + return Ok(display); + } + Ok(format!("{}#{}", user.username, user.discriminator)) +} diff --git a/crates/core/database/src/util/idempotency.rs b/crates/core/database/src/util/idempotency.rs index 769dc1dd8..2de8ff158 100644 --- a/crates/core/database/src/util/idempotency.rs +++ b/crates/core/database/src/util/idempotency.rs @@ -5,7 +5,7 @@ use revolt_result::{create_error, Result}; #[cfg(feature = "rocket-impl")] use revolt_result::Error; -use async_std::sync::Mutex; +use tokio::sync::Mutex; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; diff --git a/crates/core/database/src/util/ip.rs b/crates/core/database/src/util/ip.rs new file mode 100644 index 000000000..e357b76a1 --- /dev/null +++ b/crates/core/database/src/util/ip.rs @@ -0,0 +1,56 @@ +#[cfg(feature = "rocket-impl")] +pub mod rocket { + use revolt_config::config; + use rocket::Request; + + pub fn to_ip(request: &'_ Request<'_>) -> String { + request + .client_ip() + .map(|x| x.to_string()) + .unwrap_or_default() + } + + /// Find the actual IP of the client + pub async fn to_real_ip(request: &'_ Request<'_>) -> String { + if config().await.api.security.trust_cloudflare { + request + .headers() + .get_one("CF-Connecting-IP") + .map(|x| x.to_string()) + .unwrap_or_else(|| to_ip(request)) + } else { + to_ip(request) + } + } +} + +#[cfg(feature = "axum-impl")] +pub mod axum { + use axum::{ + extract::ConnectInfo, + http::request::Parts, + }; + use revolt_config::config; + use std::net::SocketAddr; + + pub fn to_ip(parts: &Parts) -> String { + parts + .extensions + .get::>() + .map(|info| info.ip().to_string()) + .unwrap_or_default() + } + + /// Find the actual IP of the client + pub async fn to_real_ip(parts: &Parts) -> String { + if config().await.api.security.trust_cloudflare { + parts + .headers + .get("CF-Connecting-IP") + .map(|x| x.to_str().unwrap().to_string()) + .unwrap_or_else(|| to_ip(parts)) + } else { + to_ip(parts) + } + } +} diff --git a/crates/core/database/src/util/mod.rs b/crates/core/database/src/util/mod.rs index 1baf7d8ba..54cc4300f 100644 --- a/crates/core/database/src/util/mod.rs +++ b/crates/core/database/src/util/mod.rs @@ -1,6 +1,17 @@ +pub mod acker; pub mod bridge; pub mod bulk_permissions; +pub mod captcha; +pub mod chunked; +pub mod email; +mod funcs; pub mod idempotency; +pub mod ip; +pub mod password; pub mod permissions; pub mod reference; +pub mod shield; pub mod test_fixtures; + +pub use funcs::*; +pub use chunked::ChunkedDatabaseGenerator; \ No newline at end of file diff --git a/crates/core/database/src/util/password.rs b/crates/core/database/src/util/password.rs new file mode 100644 index 000000000..4f8297cb6 --- /dev/null +++ b/crates/core/database/src/util/password.rs @@ -0,0 +1,72 @@ +use reqwest::Client; +use sha1::Digest; +use std::{collections::HashSet, sync::LazyLock}; + +use revolt_config::config; +use revolt_result::{Result, ToRevoltError}; + +static CLIENT: LazyLock = LazyLock::new(Client::new); +static ARGON_CONFIG: LazyLock> = LazyLock::new(argon2::Config::default); +static TOP_100K_COMPROMISED: LazyLock> = LazyLock::new(|| { + include_str!("../../assets/pwned100k.txt") + .split('\n') + .map(|x| x.into()) + .collect() +}); + +#[derive(Deserialize)] +struct EasyPwnedResult { + secure: bool, +} + +/// Hash a password using argon2 +pub fn hash_password(plaintext_password: String) -> Result { + argon2::hash_encoded( + plaintext_password.as_bytes(), + nanoid::nanoid!(24).as_bytes(), + &ARGON_CONFIG, + ) + .to_internal_error() +} + +pub async fn assert_safe(password: &str) -> Result<()> { + // Make sure the password is long enough. + if password.len() < 8 { + return Err(create_error!(ShortPassword)); + } + + let config = config().await; + + if !config.api.security.easypwned.is_empty() { + let mut hasher = sha1::Sha1::new(); + hasher.update(password); + let pwd_hash = hasher.finalize(); + + let result = match CLIENT + .get(format!( + "{}/hash/{pwd_hash:#02x}", + &config.api.security.easypwned + )) + .send() + .await + { + Ok(response) => match response.json::().await { + Ok(result) => Ok(result.secure), + Err(e) => Err(e), + }, + Err(e) => Err(e), + }; + + if let Err(e) = &result { + revolt_config::capture_error(e); + } else if result.is_ok_and(|b| b) { + return Ok(()); + } + }; + + if TOP_100K_COMPROMISED.contains(password) { + return Err(create_error!(CompromisedPassword)); + }; + + Ok(()) +} diff --git a/crates/core/database/src/util/permissions.rs b/crates/core/database/src/util/permissions.rs index e592988eb..85db48267 100644 --- a/crates/core/database/src/util/permissions.rs +++ b/crates/core/database/src/util/permissions.rs @@ -185,9 +185,26 @@ impl PermissionQuery for DatabasePermissionQuery<'_> { } } + async fn do_we_have_publish_overwrites(&mut self) -> bool { + if let Some(member) = &self.member { + member.can_publish + } else { + true + } + } + + async fn do_we_have_receive_overwrites(&mut self) -> bool { + if let Some(member) = &self.member { + member.can_receive + } else { + true + } + } + // * For calculating channel permission /// Get the type of the channel + #[allow(deprecated)] async fn get_channel_type(&mut self) -> ChannelType { if let Some(channel) = &self.channel { match channel { @@ -199,9 +216,7 @@ impl PermissionQuery for DatabasePermissionQuery<'_> { Cow::Borrowed(Channel::SavedMessages { .. }) | Cow::Owned(Channel::SavedMessages { .. }) => ChannelType::SavedMessages, Cow::Borrowed(Channel::TextChannel { .. }) - | Cow::Owned(Channel::TextChannel { .. }) - | Cow::Borrowed(Channel::VoiceChannel { .. }) - | Cow::Owned(Channel::VoiceChannel { .. }) => ChannelType::ServerChannel, + | Cow::Owned(Channel::TextChannel { .. }) => ChannelType::ServerChannel, } } else { ChannelType::Unknown @@ -225,14 +240,6 @@ impl PermissionQuery for DatabasePermissionQuery<'_> { | Cow::Owned(Channel::TextChannel { default_permissions, .. - }) - | Cow::Borrowed(Channel::VoiceChannel { - default_permissions, - .. - }) - | Cow::Owned(Channel::VoiceChannel { - default_permissions, - .. }) => default_permissions.unwrap_or_default().into(), _ => Default::default(), } @@ -250,12 +257,6 @@ impl PermissionQuery for DatabasePermissionQuery<'_> { }) | Cow::Owned(Channel::TextChannel { role_permissions, .. - }) - | Cow::Borrowed(Channel::VoiceChannel { - role_permissions, .. - }) - | Cow::Owned(Channel::VoiceChannel { - role_permissions, .. }) => { if let Some(server) = &self.server { let member_roles = self @@ -343,11 +344,10 @@ impl PermissionQuery for DatabasePermissionQuery<'_> { /// (this will only ever be called for server channels, use unimplemented!() for other code paths) async fn set_server_from_channel(&mut self) { if let Some(channel) = &self.channel { + #[allow(deprecated)] match channel { Cow::Borrowed(Channel::TextChannel { server, .. }) - | Cow::Owned(Channel::TextChannel { server, .. }) - | Cow::Borrowed(Channel::VoiceChannel { server, .. }) - | Cow::Owned(Channel::VoiceChannel { server, .. }) => { + | Cow::Owned(Channel::TextChannel { server, .. }) => { if let Some(known_server) = // I'm not sure why I can't just pattern match both at once here? // It throws some weird error and the provided fix doesn't work :/ diff --git a/crates/core/database/src/util/shield.rs b/crates/core/database/src/util/shield.rs new file mode 100644 index 000000000..4c6a79eba --- /dev/null +++ b/crates/core/database/src/util/shield.rs @@ -0,0 +1,118 @@ +use reqwest::Client; +use revolt_config::config; +use revolt_result::Result; +use serde::{Deserialize, Serialize}; +use std::{collections::HashMap, sync::LazyLock}; +use crate::util::ip; + +static CLIENT: LazyLock = LazyLock::new(Client::new); + +#[derive(Serialize, Deserialize, Default, Debug)] +pub struct ShieldValidationInput { + /// Remote user IP + pub ip: Option, + + /// User provided email + pub email: Option, + + /// Request headers + pub headers: Option>, + + /// Skip alerts and monitoring for this request + pub dry_run: bool, +} + +#[derive(Serialize, Deserialize)] +pub struct ValidationResult { + /// Whether this request was blocked + blocked: bool, + + /// Reasons for the request being blocked + reasons: Vec, +} + +pub async fn validate_shield(input: ShieldValidationInput) -> Result<()> { + let shield = config().await.api.security.shield; + + if !shield.host.is_empty() { + if let Ok(response) = CLIENT + .post(format!("{}/validate", &shield.host)) + .json(&input) + .header("Authorization", &shield.key) + .send() + .await + { + let result = response + .json::() + .await + .map_err(|_| create_error!(InternalError))?; + + if result.blocked { + return Err(create_error!(BlockedByShield)); + } + } + } + + Ok(()) +} + +#[cfg(feature = "rocket-impl")] +#[async_trait] +impl<'r> rocket::request::FromRequest<'r> for ShieldValidationInput { + type Error = revolt_result::Error; + + #[allow(clippy::collapsible_match)] + async fn from_request( + request: &'r rocket::Request<'_>, + ) -> rocket::request::Outcome { + rocket::request::Outcome::Success(ShieldValidationInput { + ip: Some(ip::rocket::to_real_ip(request).await), + headers: Some( + request + .headers() + .iter() + .map(|entry| (entry.name.to_string(), entry.value.to_string())) + .collect(), + ), + ..Default::default() + }) + } +} + +#[cfg(feature = "rocket-impl")] +impl<'r> revolt_rocket_okapi::request::OpenApiFromRequest<'r> for ShieldValidationInput { + fn from_request_input( + _gen: &mut revolt_rocket_okapi::r#gen::OpenApiGenerator, + _name: String, + _required: bool, + ) -> revolt_rocket_okapi::Result { + Ok(revolt_rocket_okapi::request::RequestHeaderInput::None) + } +} +#[cfg(feature = "axum-impl")] +#[async_trait] +impl axum::extract::FromRequestParts for ShieldValidationInput { + type Rejection = axum::Json ; + + async fn from_request_parts( + parts: &mut axum::http::request::Parts, + _state: &S, + ) -> Result { + Ok(ShieldValidationInput { + ip: Some(ip::axum::to_real_ip(parts).await), + headers: Some( + parts + .headers + .iter() + .map(|(name, value)| { + ( + name.to_string(), + value.to_str().map(|s| s.to_string()).unwrap_or_default(), + ) + }) + .collect(), + ), + ..Default::default() + }) + } +} diff --git a/crates/core/database/src/voice/mod.rs b/crates/core/database/src/voice/mod.rs new file mode 100644 index 000000000..836de92ad --- /dev/null +++ b/crates/core/database/src/voice/mod.rs @@ -0,0 +1,696 @@ +use std::fmt::{Display, Write}; + +use crate::{ + events::client::EventV1, + models::{Channel, User}, + util::{permissions::DatabasePermissionQuery, reference::Reference}, + Database, Server, +}; +use iso8601_timestamp::{Duration, Timestamp}; +use livekit_protocol::ParticipantPermission; +use redis_kiss::{ + get_connection as _get_connection, + redis::{FromRedisValue, Pipeline, RedisError, RedisWrite, ToRedisArgs, Value}, + AsyncCommands, Conn, +}; +use revolt_config::FeaturesLimits; +use revolt_models::v0::{self, PartialUserVoiceState, UserVoiceState}; +use revolt_permissions::{calculate_channel_permissions, ChannelPermission, PermissionValue}; +use revolt_result::{create_error, Result, ToRevoltError}; + +mod voice_client; +pub use voice_client::VoiceClient; + +async fn get_connection() -> Result { + _get_connection() + .await + .map_err(|_| create_error!(InternalError)) +} + +pub async fn raise_if_in_voice(user: &User, channel: &UserVoiceChannel) -> Result<()> { + let mut conn = get_connection().await?; + + if user.bot.is_some() { + // bots can be in as many voice channels as it wants so we just check if its already connected to the one its trying to connect to + if conn + .sismember(format!("vc:{}", &user.id), channel) + .await + .to_internal_error()? + { + return Err(create_error!(AlreadyConnected)); + }; + } else if conn + .scard::<_, u32>(format!("vc:{}", &user.id)) // check if the current vc set is empty + .await + .to_internal_error()? + > 0 + { + return Err(create_error!(AlreadyConnected)); + }; + + Ok(()) +} + +pub async fn set_channel_node(channel_id: &str, node: &str) -> Result<()> { + get_connection() + .await? + .set(format!("node:{channel_id}"), node) + .await + .to_internal_error() +} + +pub async fn get_channel_node(channel_id: &str) -> Result> { + get_connection() + .await? + .get(format!("node:{channel_id}")) + .await + .to_internal_error() +} + +pub async fn delete_channel_node(channel_id: &str) -> Result<()> { + get_connection() + .await? + .del(format!("node:{channel_id}")) + .await + .to_internal_error() +} + +pub async fn get_user_voice_channels(user_id: &str) -> Result> { + get_connection() + .await? + .smembers(format!("vc:{user_id}")) + .await + .to_internal_error() +} + +pub async fn set_user_moved_from_voice( + old_channel_id: &str, + new_channel: &UserVoiceChannel, + user_id: &str, +) -> Result<()> { + get_connection() + .await? + .set_ex( + format!("moved_from:{user_id}:{old_channel_id}"), + new_channel, + 10, + ) + .await + .to_internal_error() +} + +pub async fn get_user_moved_from_voice(channel_id: &str, user_id: &str) -> Result> { + get_connection() + .await? + .get_del(format!("moved_from:{user_id}:{channel_id}")) + .await + .to_internal_error() +} + +pub async fn set_user_moved_to_voice( + new_channel_id: &str, + old_channel: &UserVoiceChannel, + user_id: &str, +) -> Result<()> { + get_connection() + .await? + .set_ex( + format!("moved_to:{user_id}:{new_channel_id}"), + old_channel, + 10, + ) + .await + .to_internal_error() +} + +pub async fn get_user_moved_to_voice( + channel_id: &str, + user_id: &str, +) -> Result> { + get_connection() + .await? + .get_del(format!("moved_to:{user_id}:{channel_id}")) + .await + .to_internal_error() +} + +pub async fn is_in_voice_channel(user_id: &str, channel: &UserVoiceChannel) -> Result { + get_connection() + .await? + .sismember(format!("vc:{user_id}"), channel) + .await + .to_internal_error() +} + +pub async fn get_user_voice_channel_in_server( + user_id: &str, + server_id: &str, +) -> Result> { + let mut conn = get_connection().await?; + + let unique_key = format!("{user_id}:{server_id}"); + + conn.get(&unique_key).await.to_internal_error() +} + +pub fn get_allowed_sources( + limits: &FeaturesLimits, + permissions: PermissionValue, +) -> Vec<&'static str> { + let mut allowed_sources = Vec::new(); + + if permissions.has(ChannelPermission::Speak as u64) { + allowed_sources.push("microphone") + }; + + if permissions.has(ChannelPermission::Video as u64) && limits.video { + allowed_sources.extend(["camera", "screen_share", "screen_share_audio"]); + }; + + allowed_sources +} + +pub async fn create_voice_state( + channel: &UserVoiceChannel, + user_id: &str, + joined_at: Timestamp, +) -> Result { + let unique_key = format!( + "{}:{}", + &user_id, + channel.server_id.as_ref().unwrap_or(&channel.id) + ); + + let voice_state = UserVoiceState { + joined_at, + id: user_id.to_string(), + is_receiving: true, + is_publishing: false, + screensharing: false, + camera: false, + }; + + Pipeline::new() + .sadd(format!("vc_members:{}", &channel.id), user_id) + .sadd(format!("vc:{user_id}"), channel) + .set(&unique_key, &channel.id) + .set( + format!("joined_at:{unique_key}"), + joined_at + .duration_since(Timestamp::UNIX_EPOCH) + .whole_milliseconds() as i64, + ) + .set( + format!("is_publishing:{unique_key}"), + voice_state.is_publishing, + ) + .set( + format!("is_receiving:{unique_key}"), + voice_state.is_receiving, + ) + .set( + format!("screensharing:{unique_key}"), + voice_state.screensharing, + ) + .set(format!("camera:{unique_key}"), voice_state.camera) + .query_async::<_, ()>(&mut get_connection().await?.into_inner()) + .await + .to_internal_error()?; + + Ok(voice_state) +} + +pub async fn delete_voice_state(channel: &UserVoiceChannel, user_id: &str) -> Result<()> { + let unique_key = format!( + "{}:{}", + &user_id, + channel.server_id.as_ref().unwrap_or(&channel.id) + ); + + Pipeline::new() + .srem(format!("vc_members:{}", &channel.id), user_id) + .srem(format!("vc:{user_id}"), channel) + .del(&[ + format!("joined_at:{unique_key}"), + format!("is_publishing:{unique_key}"), + format!("is_receiving:{unique_key}"), + format!("screensharing:{unique_key}"), + format!("camera:{unique_key}"), + unique_key.clone(), + ]) + .query_async(&mut get_connection().await?.into_inner()) + .await + .to_internal_error() +} + +pub async fn delete_channel_voice_state( + channel: &UserVoiceChannel, + user_ids: &[String], +) -> Result<()> { + let parent_id = channel.server_id.as_ref().unwrap_or(&channel.id); + + let mut pipeline = Pipeline::new(); + pipeline.del(format!("vc_members:{}", &channel.id)); + pipeline.del(format!("node:{}", &channel.id)); + + for user_id in user_ids { + let unique_key = format!("{user_id}:{parent_id}"); + + pipeline.srem(format!("vc:{user_id}"), channel).del(&[ + format!("joined_at:{unique_key}"), + format!("is_publishing:{unique_key}"), + format!("is_receiving:{unique_key}"), + format!("screensharing:{unique_key}"), + format!("camera:{unique_key}"), + unique_key.clone(), + ]); + } + + pipeline + .query_async(&mut get_connection().await?.into_inner()) + .await + .to_internal_error() +} + +pub async fn update_voice_state_tracks( + channel: &UserVoiceChannel, + user_id: &str, + added: bool, + track: i32, +) -> Result { + let partial = match track { + /* TrackSource::Unknown */ 0 => PartialUserVoiceState::default(), + /* TrackSource::Camera */ + 1 => PartialUserVoiceState { + camera: Some(added), + ..Default::default() + }, + /* TrackSource::Microphone */ + 2 => PartialUserVoiceState { + is_publishing: Some(added), + ..Default::default() + }, + /* TrackSource::ScreenShare | TrackSource::ScreenShareAudio */ + 3 | 4 => PartialUserVoiceState { + screensharing: Some(added), + ..Default::default() + }, + _ => unreachable!(), + }; + + update_voice_state(channel, user_id, &partial).await?; + + Ok(partial) +} + +pub async fn update_voice_state( + channel: &UserVoiceChannel, + user_id: &str, + partial: &PartialUserVoiceState, +) -> Result<()> { + let unique_key = format!( + "{}:{}", + &user_id, + channel.server_id.as_ref().unwrap_or(&channel.id) + ); + + let mut pipeline = Pipeline::new(); + + if let Some(camera) = &partial.camera { + pipeline.set(format!("camera:{unique_key}"), camera); + }; + + if let Some(is_publishing) = &partial.is_publishing { + pipeline.set(format!("is_publishing:{unique_key}"), is_publishing); + } + + if let Some(is_receiving) = &partial.is_receiving { + pipeline.set(format!("is_receiving:{unique_key}"), is_receiving); + } + + if let Some(screensharing) = &partial.screensharing { + pipeline.set(format!("screensharing:{unique_key}"), screensharing); + } + + pipeline + .query_async(&mut get_connection().await?.into_inner()) + .await + .to_internal_error() +} + +pub async fn get_voice_channel_members(channel: &UserVoiceChannel) -> Result>> { + get_connection() + .await? + .smembers::<_, Option>>(format!("vc_members:{}", &channel.id)) + .await + .to_internal_error() + .map(|opt| opt.and_then(|v| if v.is_empty() { None } else { Some(v) })) +} + +pub async fn get_voice_state( + channel: &UserVoiceChannel, + user_id: &str, +) -> Result> { + let unique_key = format!( + "{}:{}", + &user_id, + channel.server_id.as_ref().unwrap_or(&channel.id) + ); + + let (joined_at, is_publishing, is_receiving, screensharing, camera) = get_connection() + .await? + .mget(&[ + format!("joined_at:{unique_key}"), + format!("is_publishing:{unique_key}"), + format!("is_receiving:{unique_key}"), + format!("screensharing:{unique_key}"), + format!("camera:{unique_key}"), + ]) + .await + .to_internal_error()?; + + match ( + joined_at, + is_publishing, + is_receiving, + screensharing, + camera, + ) { + ( + Some(joined_at), + Some(is_publishing), + Some(is_receiving), + Some(screensharing), + Some(camera), + ) => Ok(Some(v0::UserVoiceState { + joined_at: Timestamp::UNIX_EPOCH + .checked_add(Duration::milliseconds(joined_at)) + .unwrap(), + id: user_id.to_string(), + is_receiving, + is_publishing, + screensharing, + camera, + })), + _ => Ok(None), + } +} + +pub async fn get_channel_voice_state( + channel: &UserVoiceChannel, +) -> Result> { + let members = get_voice_channel_members(channel).await?; + + if let Some(members) = members { + let mut participants = Vec::with_capacity(members.len()); + + for user_id in members { + if let Some(voice_state) = get_voice_state(channel, &user_id).await? { + participants.push(voice_state); + } else { + log::info!("Voice state not found but member in voice channel members, removing."); + + delete_voice_state(channel, &user_id).await?; + } + } + + // In case a user voice state failed to be fetched, the vec's capacity will be larger than the length, shrink it + participants.shrink_to_fit(); + + Ok(Some(v0::ChannelVoiceState { + id: channel.id.clone(), + participants, + })) + } else { + Ok(None) + } +} + +pub async fn move_user(user: &str, from_channel_id: &str, to_channel_id: &str) -> Result<()> { + get_connection() + .await? + .smove( + format!("vc_members:{from_channel_id}"), + format!("vc_members:{to_channel_id}"), + user, + ) + .await + .to_internal_error() +} + +pub async fn sync_voice_permissions( + db: &Database, + voice_client: &VoiceClient, + channel: &Channel, + server: Option<&Server>, + role_id: Option<&str>, +) -> Result<()> { + let user_voice_channel = UserVoiceChannel::from_channel(channel); + + let Some(node) = get_channel_node(channel.id()).await? else { + return Ok(()); + }; + + for user_id in get_voice_channel_members(&user_voice_channel) + .await? + .iter() + .flatten() + { + let user = Reference::from_unchecked(user_id).as_user(db).await?; + + sync_user_voice_permissions(db, voice_client, &node, &user, channel, server, role_id) + .await?; + } + + Ok(()) +} + +pub async fn sync_user_voice_permissions( + db: &Database, + voice_client: &VoiceClient, + node: &str, + user: &User, + channel: &Channel, + server: Option<&Server>, + role_id: Option<&str>, +) -> Result<()> { + let channel_id = channel.id(); + let server_id = server.as_ref().map(|s| s.id.as_str()); + + let member = match server_id { + Some(server_id) => Some( + Reference::from_unchecked(&user.id) + .as_member(db, server_id) + .await?, + ), + None => None, + }; + + if role_id.is_none_or(|role_id| { + member + .as_ref() + .is_none_or(|member| member.roles.iter().any(|r| r == role_id)) + }) { + let user_voice_channel = UserVoiceChannel::from_channel(channel); + + let Some(voice_state) = get_voice_state(&user_voice_channel, &user.id).await? else { + return Ok(()); + }; + + let mut query = DatabasePermissionQuery::new(db, user) + .channel(channel) + .user(user); + + if let (Some(server), Some(member)) = (server, member.as_ref()) { + query = query.member(member).server(server) + } + + let permissions = calculate_channel_permissions(&mut query).await; + let limits = user.limits().await; + + let mut update_event = PartialUserVoiceState { + id: Some(user.id.clone()), + ..Default::default() + }; + + let before = update_event.clone(); + + let can_video = + limits.video && permissions.has_channel_permission(ChannelPermission::Video); + let can_speak = permissions.has_channel_permission(ChannelPermission::Speak); + let can_listen = permissions.has_channel_permission(ChannelPermission::Listen); + + update_event.camera = voice_state.camera.then_some(can_video); + update_event.screensharing = voice_state.screensharing.then_some(can_video); + update_event.is_publishing = voice_state.is_publishing.then_some(can_speak); + + update_voice_state(&user_voice_channel, &user.id, &update_event).await?; + + voice_client + .update_permissions( + node, + user, + channel_id, + ParticipantPermission { + can_subscribe: can_listen, + can_publish: can_speak, + can_publish_data: can_speak, + ..Default::default() + }, + ) + .await?; + + if update_event != before { + EventV1::UserVoiceStateUpdate { + id: user.id.clone(), + channel_id: channel_id.to_string(), + data: update_event, + } + .p(channel_id.to_string()) + .await; + }; + }; + + Ok(()) +} + +pub async fn set_channel_call_started_system_message( + channel_id: &str, + message_id: &str, +) -> Result<()> { + get_connection() + .await? + .set(format!("call_started_message:{channel_id}"), message_id) + .await + .to_internal_error() +} + +pub async fn take_channel_call_started_system_message(channel_id: &str) -> Result> { + get_connection() + .await? + .get_del(format!("call_started_message:{channel_id}")) + .await + .to_internal_error() +} + +pub async fn set_call_notification_recipients( + channel_id: &str, + user_id: &str, + recipients: &[String], +) -> Result<()> { + get_connection() + .await? + .set_ex( + format!("call_notification_recipients:{channel_id}-{user_id}"), + recipients, + 10, + ) + .await + .to_internal_error() +} + +pub async fn get_call_notification_recipients( + channel_id: &str, + user_id: &str, +) -> Result>> { + get_connection() + .await? + .get_del(format!( + "call_notification_recipients:{channel_id}-{user_id}" + )) + .await + .to_internal_error() +} + +pub async fn remove_user_from_voice_channels( + voice_client: &VoiceClient, + user_id: &str, +) -> Result<()> { + for channel in get_user_voice_channels(user_id).await? { + remove_user_from_voice_channel(voice_client, &channel, user_id).await?; + } + + Ok(()) +} + +pub async fn remove_user_from_voice_channel( + voice_client: &VoiceClient, + channel: &UserVoiceChannel, + user_id: &str, +) -> Result<()> { + if let Some(node) = get_channel_node(&channel.id).await? { + let _ = voice_client.remove_user(&node, user_id, &channel.id).await; + } + + delete_voice_state(channel, user_id).await?; + + Ok(()) +} + +pub async fn delete_voice_channel( + voice_client: &VoiceClient, + channel: &UserVoiceChannel, +) -> Result<()> { + if let Some(users) = get_voice_channel_members(channel).await? { + let node = get_channel_node(&channel.id).await?.unwrap(); + voice_client.delete_room(&node, &channel.id).await?; + + delete_channel_voice_state(channel, &users).await?; + }; + + Ok(()) +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct RoomMetadata { + pub server: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct UserVoiceChannel { + pub id: String, + pub server_id: Option, +} + +impl UserVoiceChannel { + pub fn from_string(input: String) -> Self { + let mut parts = input.splitn(2, '-'); + + Self { + id: parts.next().unwrap().to_string(), + server_id: parts.next().map(ToString::to_string), + } + } + + pub fn from_channel(channel: &Channel) -> Self { + Self { + id: channel.id().to_string(), + server_id: channel.server().map(ToString::to_string), + } + } +} + +impl Display for UserVoiceChannel { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&self.id)?; + + if let Some(server_id) = &self.server_id { + f.write_char('-')?; + f.write_str(server_id)? + }; + + Ok(()) + } +} + +impl ToRedisArgs for UserVoiceChannel { + fn write_redis_args(&self, out: &mut W) { + out.write_arg_fmt(self); + } +} + +impl FromRedisValue for UserVoiceChannel { + fn from_redis_value(v: &Value) -> Result { + String::from_redis_value(v).map(UserVoiceChannel::from_string) + } +} diff --git a/crates/core/database/src/voice/voice_client.rs b/crates/core/database/src/voice/voice_client.rs new file mode 100644 index 000000000..94d1f22bb --- /dev/null +++ b/crates/core/database/src/voice/voice_client.rs @@ -0,0 +1,162 @@ +use crate::{ + models::{Channel, User}, + voice::RoomMetadata, + Database, +}; +use livekit_api::{ + access_token::{AccessToken, VideoGrants}, + services::room::{CreateRoomOptions, RoomClient as InnerRoomClient, UpdateParticipantOptions}, +}; +use livekit_protocol::{ParticipantInfo, ParticipantPermission, Room}; +use revolt_config::{config, LiveKitNode}; +use revolt_permissions::{ChannelPermission, PermissionValue}; +use revolt_result::{create_error, Result, ToRevoltError}; +use std::{collections::HashMap, time::Duration}; + +use super::get_allowed_sources; + +#[derive(Debug)] +pub struct RoomClient { + pub client: InnerRoomClient, + pub node: LiveKitNode, +} + +#[derive(Debug)] +pub struct VoiceClient { + pub rooms: HashMap, +} + +impl VoiceClient { + pub fn new(nodes: HashMap) -> Self { + Self { + rooms: nodes + .into_iter() + .map(|(name, node)| { + ( + name, + RoomClient { + client: InnerRoomClient::with_api_key( + &node.url, + &node.key, + &node.secret, + ), + node, + }, + ) + }) + .collect(), + } + } + + pub fn is_enabled(&self) -> bool { + !self.rooms.is_empty() + } + + pub async fn from_revolt_config() -> Self { + let config = config().await; + + Self::new(config.api.livekit.nodes.clone()) + } + + pub fn get_node(&self, name: &str) -> Result<&RoomClient> { + self.rooms + .get(name) + .ok_or_else(|| create_error!(UnknownNode)) + } + + pub async fn create_token( + &self, + node: &str, + db: &Database, + user: &User, + permissions: PermissionValue, + channel: &Channel, + ) -> Result { + let room = self.get_node(node)?; + + let limits = user.limits().await; + let allowed_sources = get_allowed_sources(&limits, permissions); + + AccessToken::with_api_key(&room.node.key, &room.node.secret) + .with_name(&format!("{}#{}", user.username, user.discriminator)) + .with_identity(&user.id) + .with_metadata( + &serde_json::to_string(&user.clone().into(db, None).await).to_internal_error()?, + ) + .with_ttl(Duration::from_secs(10)) + .with_grants(VideoGrants { + room_join: true, + can_publish: true, + can_publish_data: false, + can_publish_sources: allowed_sources + .into_iter() + .map(ToString::to_string) + .collect(), + can_subscribe: permissions.has_channel_permission(ChannelPermission::Listen), + room: channel.id().to_string(), + ..Default::default() + }) + .to_jwt() + .to_internal_error() + } + + pub async fn create_room(&self, node: &str, channel: &Channel) -> Result { + let room = self.get_node(node)?; + + let metadata = RoomMetadata { + server: channel.server().map(|id| id.to_string()), + }; + + room.client + .create_room( + channel.id(), + CreateRoomOptions { + empty_timeout: 5 * 60, // 5 minutes, + metadata: serde_json::to_string(&metadata).to_internal_error()?, + ..Default::default() + }, + ) + .await + .to_internal_error() + } + + pub async fn update_permissions( + &self, + node: &str, + user: &User, + channel_id: &str, + new_permissions: ParticipantPermission, + ) -> Result { + let room = self.get_node(node)?; + + room.client + .update_participant( + channel_id, + &user.id, + UpdateParticipantOptions { + permission: Some(new_permissions), + ..Default::default() + }, + ) + .await + .to_internal_error() + } + + pub async fn remove_user(&self, node: &str, user_id: &str, channel_id: &str) -> Result<()> { + let room = self.get_node(node)?; + + room.client + .remove_participant(channel_id, user_id) + .await + .to_internal_error() + } + + pub async fn delete_room(&self, node: &str, channel_id: &str) -> Result<()> { + let room = self.get_node(node)?; + + room.client + .delete_room(channel_id) + .await + .to_internal_error() + } +} diff --git a/crates/core/database/templates/deletion.html b/crates/core/database/templates/deletion.html index d25138838..c733a2861 100644 --- a/crates/core/database/templates/deletion.html +++ b/crates/core/database/templates/deletion.html @@ -1,7 +1,7 @@ - + @@ -42,7 +42,7 @@ - Revolt Logo + Stoat Logo @@ -107,7 +107,7 @@

This email is intended for {{email}}
- Sent from Revolt
+ Sent from Stoat
Made in Europe

diff --git a/crates/core/database/templates/deletion.original.html b/crates/core/database/templates/deletion.original.html index 0da330eac..53d89d3ee 100644 --- a/crates/core/database/templates/deletion.original.html +++ b/crates/core/database/templates/deletion.original.html @@ -1,38 +1,37 @@ - - - - - -
- Revolt Logo -
-

Account Deletion

-

- You requested to have your account deleted, if you did not perform - this action please take measures to secure your account immediately. -

- Confirm -
-
- This email is intended for {{email}}
- Sent from Revolt
- Made in Europe -
-
- Revolt Platforms Ltd. is a company incorporated and registered under the - laws of England and Wales.
- Registered Company Number: 16260658
- Registered Office:
- Suite 5703 Unit 3A, 34-35 Hatton Garden,
- Holborn, United Kingdom, EC1N 8DX -
+ + + + + + + +
+ Stoat Logo +
+

Account Deletion

+

+ You requested to have your account deleted, if you did not perform + this action please take measures to secure your account immediately. +

+ Confirm
- - +
+ This email is intended for {{email}}
+ Sent from Stoat
+ Made in Europe +
+
+ Revolt Platforms Ltd. is a company incorporated and registered under the + laws of England and Wales.
+ Registered Company Number: 16260658
+ Registered Office:
+ Suite 5703 Unit 3A, 34-35 Hatton Garden,
+ Holborn, United Kingdom, EC1N 8DX +
+
+ + + \ No newline at end of file diff --git a/crates/core/database/templates/deletion.txt b/crates/core/database/templates/deletion.txt index b6c2871b0..648059a17 100644 --- a/crates/core/database/templates/deletion.txt +++ b/crates/core/database/templates/deletion.txt @@ -3,7 +3,7 @@ You requested to have your account deleted, if you did not perform this action p Please navigate to: {{url}} This email is intended for {{email}} -Sent by Revolt +Sent by Stoat Made in Europe Revolt Platforms Ltd. is a company incorporated and registered under the laws of England and Wales. diff --git a/crates/core/database/templates/deletion.whitelabel.txt b/crates/core/database/templates/deletion.whitelabel.txt index 491280aac..b040a51ed 100644 --- a/crates/core/database/templates/deletion.whitelabel.txt +++ b/crates/core/database/templates/deletion.whitelabel.txt @@ -4,6 +4,6 @@ Please navigate to: {{url}} This email is intended for {{email}} -This email has no association with Revolt or Revolt Platforms Ltd. +This email has no association with Stoat or Revolt Platforms Ltd. Learn more about third party instances here: -https://developers.revolt.chat/faq.html +https://developers.stoat.chat/faq/ diff --git a/crates/core/database/templates/reset-existing.html b/crates/core/database/templates/reset-existing.html index 00ef782b6..51052966c 100644 --- a/crates/core/database/templates/reset-existing.html +++ b/crates/core/database/templates/reset-existing.html @@ -1,7 +1,7 @@ - + @@ -42,7 +42,7 @@
@@ -120,7 +120,7 @@

This email is intended for {{email}}
- Sent from Revolt
+ Sent from Stoat
Made in Europe

diff --git a/crates/core/database/templates/reset-existing.original.html b/crates/core/database/templates/reset-existing.original.html index 1273a69c4..a76f1099c 100644 --- a/crates/core/database/templates/reset-existing.original.html +++ b/crates/core/database/templates/reset-existing.original.html @@ -9,7 +9,8 @@
Stoat Logo

Password Reset

@@ -25,7 +26,7 @@

Password Reset

This email is intended for {{email}}
- Sent from Revolt
+ Sent from Stoat
Made in Europe
diff --git a/crates/core/database/templates/reset-existing.txt b/crates/core/database/templates/reset-existing.txt index 8c8fc9edc..6637f9086 100644 --- a/crates/core/database/templates/reset-existing.txt +++ b/crates/core/database/templates/reset-existing.txt @@ -8,7 +8,7 @@ password on it, click below to continue. Please navigate to: {{url}} This email is intended for {{email}} -Sent by Revolt +Sent by Stoat Made in Europe Revolt Platforms Ltd. is a company incorporated and registered under the laws of England and Wales. diff --git a/crates/core/database/templates/reset.html b/crates/core/database/templates/reset.html index 9b938f7a4..647d2d1f2 100644 --- a/crates/core/database/templates/reset.html +++ b/crates/core/database/templates/reset.html @@ -1,7 +1,7 @@ - + @@ -42,7 +42,7 @@
@@ -104,7 +104,7 @@

This email is intended for {{email}}
- Sent from Revolt
+ Sent from Stoat
Made in Europe

diff --git a/crates/core/database/templates/reset.original.html b/crates/core/database/templates/reset.original.html index f15d03289..e93286e67 100644 --- a/crates/core/database/templates/reset.original.html +++ b/crates/core/database/templates/reset.original.html @@ -1,34 +1,34 @@ - - - - - -
- -
-

Password Reset

-

You requested a password reset, click below to continue.

- Reset -
-
- This email is intended for {{email}}
- Sent from Revolt
- Made in Europe -
-
- Revolt Platforms Ltd. is a company incorporated and registered under the - laws of England and Wales.
- Registered Company Number: 16260658
- Registered Office:
- Suite 5703 Unit 3A, 34-35 Hatton Garden,
- Holborn, United Kingdom, EC1N 8DX -
+ + + + + + + +
+ Stoat Logo +
+

Password Reset

+

You requested a password reset, click below to continue.

+ Reset
- - +
+ This email is intended for {{email}}
+ Sent from Stoat
+ Made in Europe +
+
+ Revolt Platforms Ltd. is a company incorporated and registered under the + laws of England and Wales.
+ Registered Company Number: 16260658
+ Registered Office:
+ Suite 5703 Unit 3A, 34-35 Hatton Garden,
+ Holborn, United Kingdom, EC1N 8DX +
+
+ + + \ No newline at end of file diff --git a/crates/core/database/templates/reset.txt b/crates/core/database/templates/reset.txt index 020032c71..266a3e2ed 100644 --- a/crates/core/database/templates/reset.txt +++ b/crates/core/database/templates/reset.txt @@ -3,7 +3,7 @@ You requested a password reset, if you did not perform this action you can safel Please navigate to: {{url}} This email is intended for {{email}} -Sent by Revolt +Sent by Stoat Made in Europe Revolt Platforms Ltd. is a company incorporated and registered under the laws of England and Wales. diff --git a/crates/core/database/templates/reset.whitelabel.txt b/crates/core/database/templates/reset.whitelabel.txt index 9ac5028fc..10e8ca2d2 100644 --- a/crates/core/database/templates/reset.whitelabel.txt +++ b/crates/core/database/templates/reset.whitelabel.txt @@ -4,6 +4,6 @@ Please navigate to: {{url}} This email is intended for {{email}} -This email has no association with Revolt or Revolt Platforms Ltd. +This email has no association with Stoat or Revolt Platforms Ltd. Learn more about third party instances here: -https://developers.revolt.chat/faq.html +https://developers.stoat.chat/faq/ diff --git a/crates/core/database/templates/suspension.html b/crates/core/database/templates/suspension.html index 5002c2580..b9995a6ef 100644 --- a/crates/core/database/templates/suspension.html +++ b/crates/core/database/templates/suspension.html @@ -1,7 +1,7 @@ - + @@ -42,7 +42,7 @@
@@ -107,7 +107,7 @@

Further violations may result in a permanent ban depending on severity, please abide by the - Acceptable Usage Policy. + Community Guidelines.

@@ -134,7 +134,7 @@

This email is intended for {{email}}
- Sent from Revolt
+ Sent from Stoat
Made in Europe

diff --git a/crates/core/database/templates/suspension.original.html b/crates/core/database/templates/suspension.original.html index fbbbb4168..e5980613e 100644 --- a/crates/core/database/templates/suspension.original.html +++ b/crates/core/database/templates/suspension.original.html @@ -1,46 +1,45 @@ - - - - - -
- Revolt Logo -
-

Account Suspended

-

Your account has been suspended, for one or more reasons:

-
    - {{list}} -
-

- You will be able to use your account again in {{duration}} days. -

-

- Further violations may result in a permanent ban depending on - severity, please abide by the - Acceptable Usage Policy. -

-

Ban evasion is prohibited and will be dealt with accordingly.

-
-
- This email is intended for {{email}}
- Sent from Revolt
- Made in Europe -
-
- Revolt Platforms Ltd. is a company incorporated and registered under the - laws of England and Wales.
- Registered Company Number: 16260658
- Registered Office:
- Suite 5703 Unit 3A, 34-35 Hatton Garden,
- Holborn, United Kingdom, EC1N 8DX -
+ + + + + + + +
+ Stoat Logo +
+

Account Suspended

+

Your account has been suspended, for one or more reasons:

+
    + {{list}} +
+

+ You will be able to use your account again in {{duration}} days. +

+

+ Further violations may result in a permanent ban depending on + severity, please abide by the + Acceptable Usage Policy. +

+

Ban evasion is prohibited and will be dealt with accordingly.

- - +
+ This email is intended for {{email}}
+ Sent from Stoat
+ Made in Europe +
+
+ Revolt Platforms Ltd. is a company incorporated and registered under the + laws of England and Wales.
+ Registered Company Number: 16260658
+ Registered Office:
+ Suite 5703 Unit 3A, 34-35 Hatton Garden,
+ Holborn, United Kingdom, EC1N 8DX +
+
+ + + \ No newline at end of file diff --git a/crates/core/database/templates/suspension.txt b/crates/core/database/templates/suspension.txt index 30d48d846..293f8a0c2 100644 --- a/crates/core/database/templates/suspension.txt +++ b/crates/core/database/templates/suspension.txt @@ -3,12 +3,12 @@ Your account has been suspended, for one or more reasons: You will be able to use your account again in {{duration}} days. -Further violations may result in a permanent ban depending on severity, please abide by the Acceptable Usage Policy (https://revolt.chat/aup). +Further violations may result in a permanent ban depending on severity, please abide by the Community Guidelines (https://stoat.chat/legal/community-guidelines). Ban evasion is prohibited and will be dealt with accordingly. This email is intended for {{email}} -Sent by Revolt +Sent by Stoat Made in Europe Revolt Platforms Ltd. is a company incorporated and registered under the laws of England and Wales. diff --git a/crates/core/database/templates/suspension.whitelabel.txt b/crates/core/database/templates/suspension.whitelabel.txt index 45d9aa560..bd82145d4 100644 --- a/crates/core/database/templates/suspension.whitelabel.txt +++ b/crates/core/database/templates/suspension.whitelabel.txt @@ -3,6 +3,6 @@ Your account has been suspended, for one or more reasons: This email is intended for {{email}} -This email has no association with Revolt or Revolt Platforms Ltd. +This email has no association with Stoat or Revolt Platforms Ltd. Learn more about third party instances here: -https://developers.revolt.chat/faq.html +https://developers.stoat.chat/faq/ diff --git a/crates/core/database/templates/verify.html b/crates/core/database/templates/verify.html index 8ab9713d0..363e38de2 100644 --- a/crates/core/database/templates/verify.html +++ b/crates/core/database/templates/verify.html @@ -1,7 +1,7 @@ - + @@ -42,7 +42,7 @@
@@ -104,7 +104,7 @@

This email is intended for {{email}}
- Sent from Revolt
+ Sent from Stoat
Made in Europe

diff --git a/crates/core/database/templates/verify.original.html b/crates/core/database/templates/verify.original.html index 75ae25cea..21da66a7c 100644 --- a/crates/core/database/templates/verify.original.html +++ b/crates/core/database/templates/verify.original.html @@ -1,35 +1,34 @@ - - - - - -
- Revolt Logo -
-

Almost there!

-

To complete your sign up, we just need to verify your email.

- Confirm -
-
- This email is intended for {{email}}
- Sent from Revolt
- Made in Europe -
-
- Revolt Platforms Ltd. is a company incorporated and registered under the - laws of England and Wales.
- Registered Company Number: 16260658
- Registered Office:
- Suite 5703 Unit 3A, 34-35 Hatton Garden,
- Holborn, United Kingdom, EC1N 8DX -
+ + + + + + + +
+ Stoat Logo +
+

Almost there!

+

To complete your sign up, we just need to verify your email.

+ Confirm
- - +
+ This email is intended for {{email}}
+ Sent from Stoat
+ Made in Europe +
+
+ Revolt Platforms Ltd. is a company incorporated and registered under the + laws of England and Wales.
+ Registered Company Number: 16260658
+ Registered Office:
+ Suite 5703 Unit 3A, 34-35 Hatton Garden,
+ Holborn, United Kingdom, EC1N 8DX +
+
+ + + \ No newline at end of file diff --git a/crates/core/database/templates/verify.txt b/crates/core/database/templates/verify.txt index 7fa871eef..cafd09d41 100644 --- a/crates/core/database/templates/verify.txt +++ b/crates/core/database/templates/verify.txt @@ -4,7 +4,7 @@ To complete your sign up, we just need to verify your email. Please navigate to: {{url}} This email is intended for {{email}} -Sent by Revolt +Sent by Stoat Made in Europe Revolt Platforms Ltd. is a company incorporated and registered under the laws of England and Wales. diff --git a/crates/core/database/templates/verify.whitelabel.txt b/crates/core/database/templates/verify.whitelabel.txt index fb54088df..16f1c4b13 100644 --- a/crates/core/database/templates/verify.whitelabel.txt +++ b/crates/core/database/templates/verify.whitelabel.txt @@ -5,6 +5,6 @@ Please navigate to: {{url}} This email is intended for {{email}} -This email has no association with Revolt or Revolt Platforms Ltd. +This email has no association with Stoat or Revolt Platforms Ltd. Learn more about third party instances here: -https://developers.revolt.chat/faq.html +https://developers.stoat.chat/faq/ diff --git a/crates/core/files/Cargo.toml b/crates/core/files/Cargo.toml index 7cc219f1c..c60bf678e 100644 --- a/crates/core/files/Cargo.toml +++ b/crates/core/files/Cargo.toml @@ -1,38 +1,48 @@ [package] name = "revolt-files" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "AGPL-3.0-or-later" authors = ["Paul Makles "] description = "Revolt Backend: S3 and encryption subroutines" +repository = "https://github.com/stoatchat/stoatchat" [dependencies] -tracing = "0.1" +anyhow = { workspace = true } +thiserror = { workspace = true } -ffprobe = "0.4.0" -imagesize = "0.13.0" -tempfile = "3.12.0" +tracing = { workspace = true } -base64 = "0.22.1" -aes-gcm = "0.10.3" -typenum = "1.17.0" +tokio = { workspace = true } +async-trait = { workspace = true } -aws-config = "1.5.5" -aws-sdk-s3 = { version = "1.46.0", features = ["behavior-version-latest"] } +ffprobe = { workspace = true } +imagesize = { workspace = true } +tempfile = { workspace = true } -revolt-config = { version = "0.8.8", path = "../config", features = [ +base64 = { workspace = true } +aes-gcm = { workspace = true } +typenum = { workspace = true } + +aws-config = { workspace = true } +aws-sdk-s3 = { workspace = true, features = ["behavior-version-latest"] } + +revolt-config = { workspace = true, features = [ "report-macros", ] } -revolt-result = { version = "0.8.8", path = "../result" } +revolt-result = { workspace = true } # image processing -jxl-oxide = "0.8.1" -image = { version = "0.25.2" } +jxl-oxide = { workspace = true, features = ["image"] } +image = { workspace = true } # svg rendering -usvg = "0.44.0" -resvg = "0.44.0" -tiny-skia = "0.11.4" +usvg = { workspace = true } +resvg = { workspace = true } +tiny-skia = { workspace = true } # encoding -webp = "0.3.0" +webp = { workspace = true } + +[dev-dependencies] +uuid = { workspace = true, features = ["v4"] } diff --git a/crates/core/files/src/implementation/encryption_impl.rs b/crates/core/files/src/implementation/encryption_impl.rs new file mode 100644 index 000000000..25da9cfd4 --- /dev/null +++ b/crates/core/files/src/implementation/encryption_impl.rs @@ -0,0 +1,75 @@ +use aes_gcm::{ + aead::{Aead, AeadCore, AeadMutInPlace, OsRng}, + Aes256Gcm, Key, KeyInit, Nonce, +}; +use base64::{prelude::BASE64_STANDARD, Engine}; + +use crate::EncryptionRepository; + +pub struct EncryptionKey { + key: String, +} + +impl EncryptionKey { + pub async fn from_config() -> EncryptionKey { + EncryptionKey::new(revolt_config::config().await.files.encryption_key) + } + + pub fn new(key: String) -> EncryptionKey { + EncryptionKey { key } + } + + fn create_cipher(&self) -> Aes256Gcm { + let key = &BASE64_STANDARD + .decode(self.key.clone()) + .expect("valid base64 string")[..]; + let key: &Key = key.into(); + Aes256Gcm::new(key) + } +} + +impl EncryptionRepository for EncryptionKey { + fn decrypt_buffer(&self, mut buf: Vec, iv: &str) -> anyhow::Result> { + let iv = &BASE64_STANDARD.decode(iv).unwrap()[..]; + let iv: &Nonce = iv.into(); + + self.create_cipher() + .decrypt_in_place(iv, b"", &mut buf) + .map_err(|error| { + tracing::error!("{}", error); + anyhow::anyhow!("EncryptionRepository: decryption failed") + })?; + + Ok(buf) + } + + fn encrypt_buffer(&self, buf: &[u8]) -> anyhow::Result<(Vec, String)> { + let iv = Aes256Gcm::generate_nonce(&mut OsRng); + + let buf = self.create_cipher().encrypt(&iv, buf).map_err(|error| { + tracing::error!("{}", error); + anyhow::anyhow!("EncryptionRepository: encryption failed") + })?; + + Ok((buf, BASE64_STANDARD.encode(iv))) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_encrypt_and_decrypt() { + let encryption = + EncryptionKey::new("XkbJ8gBzrouQ+15Ri23xCC81+aZE26Z6+gXzglFxOD4=".to_string()); + + let buf: Vec = vec![67]; + let (ciphertext, iv) = encryption.encrypt_buffer(&buf[..]).unwrap(); + assert_eq!(ciphertext.len(), 17); + + let plaintext = encryption.decrypt_buffer(ciphertext, &iv).unwrap(); + assert_eq!(plaintext.len(), 1); + assert_eq!(plaintext[0], 67); + } +} diff --git a/crates/core/files/src/implementation/media_impl.rs b/crates/core/files/src/implementation/media_impl.rs new file mode 100644 index 000000000..7a7fad848 --- /dev/null +++ b/crates/core/files/src/implementation/media_impl.rs @@ -0,0 +1,395 @@ +use anyhow::Result; +use image::{AnimationDecoder, DynamicImage, ImageBuffer, ImageReader}; +use jxl_oxide::integration::JxlDecoder; +use revolt_config::report_internal_error; +use std::io::{BufRead, Read, Seek}; +use tempfile::NamedTempFile; +use tiny_skia::Pixmap; + +use crate::{MediaError, MediaRepository}; + +pub struct MediaImpl { + config: revolt_config::Files, +} + +impl MediaImpl { + pub async fn from_config() -> MediaImpl { + MediaImpl { + config: revolt_config::config().await.files, + } + } + + pub fn new(config: revolt_config::Files) -> MediaImpl { + MediaImpl { config } + } +} + +impl MediaRepository for MediaImpl { + fn image_size(&self, f: &NamedTempFile) -> Option<(usize, usize)> { + if let Ok(size) = imagesize::size(f.path()) + .inspect_err(|err| tracing::error!("Failed to generate image size! {err:?}")) + { + Some((size.width, size.height)) + } else { + None + } + } + + fn is_animated(&self, f: &NamedTempFile, mime: &str) -> Option { + match mime { + // Current behaviour is to assume GIFs are animated, this checks for at least 2 frames + "image/gif" => { + let file = std::fs::File::open(f.path()).ok()?; + let reader = std::io::BufReader::new(file); + let decoder = image::codecs::gif::GifDecoder::new(reader).ok()?; + Some(decoder.into_frames().take(2).count() > 1) + } + "image/png" => { + let file = std::fs::File::open(f.path()).ok()?; + let reader = std::io::BufReader::new(file); + let decoder = image::codecs::png::PngDecoder::new(reader).ok()?; + decoder.is_apng().ok() + } + "image/webp" => { + let file = std::fs::File::open(f.path()).ok()?; + let reader = std::io::BufReader::new(file); + let decoder = image::codecs::webp::WebPDecoder::new(reader).ok()?; + Some(decoder.has_animation()) + } + _ => Some(false), + } + } + + fn image_size_vec(&self, v: &[u8], mime: &str) -> Option<(usize, usize)> { + match mime { + "image/svg+xml" => { + let tree = + report_internal_error!(usvg::Tree::from_data(v, &Default::default())).ok()?; + + let size = tree.size(); + Some((size.width() as usize, size.height() as usize)) + } + _ => { + if let Ok(size) = imagesize::blob_size(v) + .inspect_err(|err| tracing::error!("Failed to generate image size! {err:?}")) + { + Some((size.width, size.height)) + } else { + None + } + } + } + } + + fn decode_image( + &self, + reader: &mut R, + mime: &str, + ) -> Result { + match mime { + "image/jxl" => { + let decoder = + JxlDecoder::new(reader).map_err(|e| MediaError::from(anyhow::anyhow!(e)))?; + + DynamicImage::from_decoder(decoder) + .map_err(|e| MediaError::from(anyhow::anyhow!(e))) + } + "image/svg+xml" => { + let mut buf = Vec::new(); + reader + .read_to_end(&mut buf) + .map_err(|e| MediaError::from(anyhow::anyhow!(e)))?; + + let tree: usvg::Tree = usvg::Tree::from_data(&buf, &Default::default()) + .map_err(|e| MediaError::from(anyhow::anyhow!(e)))?; + + let size = tree.size(); + let mut pixmap = Pixmap::new(size.width() as u32, size.height() as u32) + .ok_or_else(|| MediaError::ImageProcessingFailed { + cause: "failed to create Pixmap, likely zero sized".to_string(), + })?; + + let mut pixmap_mut = pixmap.as_mut(); + resvg::render(&tree, Default::default(), &mut pixmap_mut); + + Ok(DynamicImage::ImageRgba8( + ImageBuffer::from_vec( + size.width() as u32, + size.height() as u32, + pixmap.data().to_vec(), + ) + .ok_or_else(|| MediaError::ImageProcessingFailed { + cause: "buffer is not big enough".to_string(), + })?, + )) + } + _ => { + let image: ImageReader<&mut R> = image::ImageReader::new(reader) + .with_guessed_format() + .map_err(|e| MediaError::from(anyhow::anyhow!(e)))?; + + let image: Result = image + .decode() + .map_err(|e| MediaError::from(anyhow::anyhow!(e))); + + image + } + } + } + + fn is_valid_image(&self, reader: &mut R, mime: &str) -> bool { + match mime { + "image/jxl" => jxl_oxide::JxlImage::builder() + .read(reader) + .inspect_err(|err| tracing::error!("Failed to read JXL! {err:?}")) + .is_ok(), + _ => !matches!( + image::ImageReader::new(reader) + .with_guessed_format() + .inspect_err(|err| tracing::error!("Failed to read image! {err:?}")) + .map(|f| f.decode()), + Err(_) | Ok(Err(_)) + ), + } + } + + fn create_thumbnail(&self, image: DynamicImage, tag: &str) -> Vec { + let [w, h] = self.config.preview.get(tag).unwrap(); + + let image = image.thumbnail(image.width().min(*w as u32), image.height().min(*h as u32)); + let image = match image { + DynamicImage::ImageRgb8(_) => image, + DynamicImage::ImageRgba8(_) => image, + _ => { + if image.has_alpha() { + image.to_rgba8().into() + } else { + image.to_rgb8().into() + } + } + }; + + let encoder = webp::Encoder::from_image(&image).expect("Could not create encoder."); + if self.config.webp_quality != 100.0 { + encoder.encode(self.config.webp_quality).to_vec() + } else { + encoder.encode_lossless().to_vec() + } + } + + fn video_size(&self, f: &NamedTempFile) -> Option<(i64, i64)> { + if let Ok(data) = ffprobe::ffprobe(f.path()) + .inspect_err(|err| tracing::error!("Failed to ffprobe file! {err:?}")) + { + for stream in data.streams { + if let (Some(w), Some(h)) = (stream.width, stream.height) { + return Some((w, h)); + } + } + + None + } else { + None + } + } +} + +#[cfg(test)] +mod tests { + use crate::{MediaImpl, MediaRepository}; + use std::io::{Cursor, Write}; + use tempfile::NamedTempFile; + + #[tokio::test] + async fn asset_test_jpeg() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/test.jpeg"); + assert_eq!(media.image_size_vec(buf, "image/jpeg"), Some((655, 582))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/jpeg").unwrap(); + media.create_thumbnail(image, "attachments"); + } + + #[tokio::test] + async fn asset_test_jpeg_is_not_animated() { + let media = MediaImpl::from_config().await; + let mut f = NamedTempFile::new().unwrap(); + f.write_all(include_bytes!("../../tests/assets/test.jpeg")) + .unwrap(); + assert_eq!(media.is_animated(&f, "image/jpeg"), Some(false)); + } + + #[tokio::test] + async fn asset_test_jpeg_extra_bytes() { + let media = MediaImpl::from_config().await; + let buf = [ + &include_bytes!("../../tests/assets/test.jpeg")[..], + &[0u8; 16], + ] + .concat(); + assert_eq!(media.image_size_vec(&buf, "image/jpeg"), Some((655, 582))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/jpeg").unwrap(); + media.create_thumbnail(image, "emojis"); + } + + #[tokio::test] + async fn asset_test_png() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/test.png"); + assert_eq!(media.image_size_vec(buf, "image/png"), Some((900, 900))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/png").unwrap(); + media.create_thumbnail(image, "emojis"); + } + + #[tokio::test] + async fn asset_test_png_is_not_animated() { + let media = MediaImpl::from_config().await; + let mut f = NamedTempFile::new().unwrap(); + f.write_all(include_bytes!("../../tests/assets/test.png")) + .unwrap(); + assert_eq!(media.is_animated(&f, "image/png"), Some(false)); + } + + #[tokio::test] + async fn asset_test_png_extra_bytes() { + let media = MediaImpl::from_config().await; + let buf = [ + &include_bytes!("../../tests/assets/test.png")[..], + &[0u8; 16], + ] + .concat(); + assert_eq!(media.image_size_vec(&buf, "image/png"), Some((900, 900))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/png").unwrap(); + media.create_thumbnail(image, "emojis"); + } + + #[tokio::test] + async fn asset_test_floating_point_png() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/test-float.png"); + assert_eq!(media.image_size_vec(buf, "image/png"), Some((300, 300))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/png").unwrap(); + media.create_thumbnail(image, "avatars"); + } + + #[tokio::test] + async fn asset_test_corrupted_png() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/corrupted.png"); + assert_eq!(media.image_size_vec(buf, "image/png"), Some((900, 900))); + + let mut reader = Cursor::new(buf); + media.decode_image(&mut reader, "image/png").unwrap_err(); + } + + #[tokio::test] + async fn asset_test_animated_png() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/anim-icos.apng"); + assert_eq!(media.image_size_vec(buf, "image/png"), Some((128, 128))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/png").unwrap(); + media.create_thumbnail(image, "attachments"); + } + + #[tokio::test] + async fn asset_test_animated_png_is_animated() { + let media = MediaImpl::from_config().await; + let mut f = NamedTempFile::new().unwrap(); + f.write_all(include_bytes!("../../tests/assets/anim-icos.apng")) + .unwrap(); + assert_eq!(media.is_animated(&f, "image/png"), Some(true)); + } + + #[tokio::test] + async fn asset_test_jxl() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/dice.jxl"); + assert_eq!(media.image_size_vec(buf, "image/jxl"), Some((800, 600))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/jxl").unwrap(); + media.create_thumbnail(image, "attachments"); + } + + #[tokio::test] + async fn asset_test_animated_jxl() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/anim-icos.jxl"); + assert_eq!(media.image_size_vec(buf, "image/jxl"), Some((128, 128))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/jxl").unwrap(); + media.create_thumbnail(image, "attachments"); + } + + #[tokio::test] + async fn asset_test_webp() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/dice.webp"); + assert_eq!(media.image_size_vec(buf, "image/webp"), Some((800, 600))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/webp").unwrap(); + media.create_thumbnail(image, "attachments"); + } + + #[tokio::test] + async fn asset_test_webp_is_not_animated() { + let media = MediaImpl::from_config().await; + let mut f = NamedTempFile::new().unwrap(); + f.write_all(include_bytes!("../../tests/assets/dice.webp")) + .unwrap(); + assert_eq!(media.is_animated(&f, "image/webp"), Some(false)); + } + + #[tokio::test] + async fn asset_test_animated_webp() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/anim-icos.webp"); + assert_eq!(media.image_size_vec(buf, "image/webp"), Some((128, 128))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/webp").unwrap(); + media.create_thumbnail(image, "attachments"); + } + + #[tokio::test] + async fn asset_test_animated_webp_is_animated() { + let media = MediaImpl::from_config().await; + let mut f = NamedTempFile::new().unwrap(); + f.write_all(include_bytes!("../../tests/assets/anim-icos.webp")) + .unwrap(); + assert_eq!(media.is_animated(&f, "image/webp"), Some(true)); + } + + #[tokio::test] + async fn asset_test_animated_gif() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/anim-icos.gif"); + assert_eq!(media.image_size_vec(buf, "image/gif"), Some((128, 128))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/gif").unwrap(); + media.create_thumbnail(image, "attachments"); + } + + #[tokio::test] + async fn asset_test_animated_gif_is_animated() { + let media = MediaImpl::from_config().await; + let mut f = NamedTempFile::new().unwrap(); + f.write_all(include_bytes!("../../tests/assets/anim-icos.gif")) + .unwrap(); + assert_eq!(media.is_animated(&f, "image/gif"), Some(true)); + } +} diff --git a/crates/core/files/src/implementation/mod.rs b/crates/core/files/src/implementation/mod.rs new file mode 100644 index 000000000..fa96ac22d --- /dev/null +++ b/crates/core/files/src/implementation/mod.rs @@ -0,0 +1,7 @@ +mod encryption_impl; +mod media_impl; +mod s3_impl; + +pub use encryption_impl::EncryptionKey; +pub use media_impl::MediaImpl; +pub use s3_impl::S3Storage; diff --git a/crates/core/files/src/implementation/s3_impl.rs b/crates/core/files/src/implementation/s3_impl.rs new file mode 100644 index 000000000..c27d62012 --- /dev/null +++ b/crates/core/files/src/implementation/s3_impl.rs @@ -0,0 +1,118 @@ +use std::io::Write; + +use anyhow::Context; +use aws_sdk_s3::{ + config::{Credentials, Region}, + Client, Config, +}; +use revolt_config::FilesS3; + +use crate::{EncryptionRepository, FileStorageRepository}; + +pub struct S3Storage { + client: Client, + encryption: ER, +} + +impl S3Storage { + pub async fn from_config(encryption: ER) -> S3Storage { + S3Storage::new(encryption, revolt_config::config().await.files.s3) + } + + pub fn new(encryption: ER, s3_config: FilesS3) -> S3Storage { + let provider_name = "my-creds"; + let creds = Credentials::new( + s3_config.access_key_id, + s3_config.secret_access_key, + None, + None, + provider_name, + ); + + let config = Config::builder() + .region(Region::new(s3_config.region)) + .endpoint_url(s3_config.endpoint) + .force_path_style(s3_config.path_style_buckets) + .credentials_provider(creds) + .build(); + + S3Storage { + client: Client::from_conf(config), + encryption, + } + } +} + +#[async_trait::async_trait] +impl FileStorageRepository for S3Storage { + async fn create_bucket(&self, bucket_id: &str) -> anyhow::Result<()> { + self.client + .create_bucket() + .bucket(bucket_id) + .send() + .await + .with_context(|| format!("failed to create bucket {bucket_id}"))?; + + Ok(()) + } + + async fn fetch_and_decrypt_file( + &self, + bucket_id: &str, + path: &str, + iv: &str, + ) -> anyhow::Result> { + let mut object = self + .client + .get_object() + .bucket(bucket_id) + .key(path) + .send() + .await + .with_context(|| format!("failed to get object at {path} in {bucket_id}"))?; + + let mut buf = vec![]; + while let Some(bytes) = object.body.next().await { + let data = bytes?; + buf.write_all(&data)?; + } + + if iv.is_empty() { + Ok(buf) + } else { + self.encryption.decrypt_buffer(buf, iv) + } + } + + async fn encrypt_and_upload_file( + &self, + bucket_id: &str, + path: &str, + buf: &[u8], + ) -> anyhow::Result { + let (buf, iv) = self.encryption.encrypt_buffer(buf)?; + + self.client + .put_object() + .bucket(bucket_id) + .key(path) + .body(buf.into()) + .send() + .await + .with_context(|| format!("failed to put object at {path} in {bucket_id}"))?; + + Ok(iv) + } + + async fn delete_file(&self, bucket_id: &str, path: &str) -> anyhow::Result<()> { + self.client + .delete_object() + .bucket(bucket_id) + .key(path) + .send() + .await + .with_context(|| format!("failed to delete object at {path} in {bucket_id}"))?; + + Ok(()) + } +} diff --git a/crates/core/files/src/lib.rs b/crates/core/files/src/lib.rs index dacc988e5..0f71f095c 100644 --- a/crates/core/files/src/lib.rs +++ b/crates/core/files/src/lib.rs @@ -1,290 +1,210 @@ -use std::io::{BufRead, Read, Seek, Write}; +mod implementation; +mod repositories; -use aes_gcm::{ - aead::{AeadCore, AeadMutInPlace, OsRng}, - Aes256Gcm, Key, KeyInit, Nonce, -}; -use image::{DynamicImage, ImageBuffer}; -use revolt_config::{config, report_internal_error, FilesS3}; -use revolt_result::{create_error, Result}; +pub use implementation::*; +pub use repositories::*; -use aws_sdk_s3::{ - config::{Credentials, Region}, - Client, Config, -}; +use std::io::{BufRead, Read, Seek}; + +use image::DynamicImage; +use revolt_config::{report_internal_error, Files, FilesLimit, FilesS3}; +use revolt_result::Result; -use base64::prelude::*; use tempfile::NamedTempFile; -use tiny_skia::Pixmap; -/// Size of the authentication tag in the buffer pub const AUTHENTICATION_TAG_SIZE_BYTES: usize = 16; -/// Create an S3 client -pub fn create_client(s3_config: FilesS3) -> Client { - let provider_name = "my-creds"; - let creds = Credentials::new( - s3_config.access_key_id, - s3_config.secret_access_key, - None, - None, - provider_name, - ); - - let config = Config::builder() - .region(Region::new(s3_config.region)) - .endpoint_url(s3_config.endpoint) - .force_path_style(s3_config.path_style_buckets) - .credentials_provider(creds) - .build(); - - Client::from_conf(config) -} - -/// Create an AES-256-GCM cipher -pub fn create_cipher(key: &str) -> Aes256Gcm { - let key = &BASE64_STANDARD.decode(key).expect("valid base64 string")[..]; - let key: &Key = key.into(); - Aes256Gcm::new(key) -} - /// Fetch a file from S3 (and decrypt it) -pub async fn fetch_from_s3(bucket_id: &str, path: &str, nonce: &str) -> Result> { - let config = config().await; - let client = create_client(config.files.s3); - - // Send a request for the file - let mut obj = - report_internal_error!(client.get_object().bucket(bucket_id).key(path).send().await)?; - - // Read the file from remote - let mut buf = vec![]; - while let Some(bytes) = obj.body.next().await { - let data = report_internal_error!(bytes)?; - report_internal_error!(buf.write_all(&data))?; - // is there a more efficient way to do this? - // we just want the Vec - } - - // File is not encrypted - if nonce.is_empty() { - return Ok(buf); - } - - // Recover nonce as bytes - let nonce = &BASE64_STANDARD.decode(nonce).unwrap()[..]; - let nonce: &Nonce = nonce.into(); - - // Decrypt the file - create_cipher(&config.files.encryption_key) - .decrypt_in_place(nonce, b"", &mut buf) - .map_err(|_| create_error!(InternalError))?; - - Ok(buf) +pub async fn fetch_from_s3(bucket_id: &str, path: &str, iv: &str) -> Result> { + let encryption = implementation::EncryptionKey::from_config().await; + let storage = implementation::S3Storage::from_config(encryption).await; + report_internal_error!(storage.fetch_and_decrypt_file(bucket_id, path, iv).await) } /// Encrypt and upload a file to S3 (returning its nonce/IV) pub async fn upload_to_s3(bucket_id: &str, path: &str, buf: &[u8]) -> Result { - let config = config().await; - let client = create_client(config.files.s3); - - // Generate a nonce - let nonce = Aes256Gcm::generate_nonce(&mut OsRng); - - // Extend the buffer for in-place encryption - let mut buf = [buf, &[0; AUTHENTICATION_TAG_SIZE_BYTES]].concat(); - - // Encrypt the file in place - create_cipher(&config.files.encryption_key) - .encrypt_in_place(&nonce, b"", &mut buf) - .map_err(|_| create_error!(InternalError))?; - - // Upload the file to remote - report_internal_error!( - client - .put_object() - .bucket(bucket_id) - .key(path) - .body(buf.into()) - .send() - .await - )?; - - Ok(BASE64_STANDARD.encode(nonce)) + let encryption = implementation::EncryptionKey::from_config().await; + let storage = implementation::S3Storage::from_config(encryption).await; + report_internal_error!(storage.encrypt_and_upload_file(bucket_id, path, buf).await) } /// Delete a file from S3 by path pub async fn delete_from_s3(bucket_id: &str, path: &str) -> Result<()> { - let config = config().await; - let client = create_client(config.files.s3); - - report_internal_error!( - client - .delete_object() - .bucket(bucket_id) - .key(path) - .send() - .await - )?; - - Ok(()) + let encryption = implementation::EncryptionKey::from_config().await; + let storage = implementation::S3Storage::from_config(encryption).await; + report_internal_error!(storage.delete_file(bucket_id, path).await) } /// Determine size of image at temp file pub fn image_size(f: &NamedTempFile) -> Option<(usize, usize)> { - if let Ok(size) = imagesize::size(f.path()) - .inspect_err(|err| tracing::error!("Failed to generate image size! {err:?}")) - { - Some((size.width, size.height)) - } else { - None - } + let media = MediaImpl::new(Files { + blocked_mime_types: Default::default(), + clamd_host: Default::default(), + encryption_key: Default::default(), + limit: FilesLimit { + max_mega_pixels: 0, + max_pixel_side: 0, + min_file_size: 0, + min_resolution: [0, 0], + }, + preview: Default::default(), + s3: FilesS3 { + access_key_id: Default::default(), + default_bucket: Default::default(), + endpoint: Default::default(), + path_style_buckets: Default::default(), + region: Default::default(), + secret_access_key: Default::default(), + }, + scan_mime_types: Default::default(), + webp_quality: Default::default(), + }); + + media.image_size(f) } /// Determine size of image with buffer pub fn image_size_vec(v: &[u8], mime: &str) -> Option<(usize, usize)> { - match mime { - "image/svg+xml" => { - let tree = - report_internal_error!(usvg::Tree::from_data(v, &Default::default())).ok()?; + let media = MediaImpl::new(Files { + blocked_mime_types: Default::default(), + clamd_host: Default::default(), + encryption_key: Default::default(), + limit: FilesLimit { + max_mega_pixels: 0, + max_pixel_side: 0, + min_file_size: 0, + min_resolution: [0, 0], + }, + preview: Default::default(), + s3: FilesS3 { + access_key_id: Default::default(), + default_bucket: Default::default(), + endpoint: Default::default(), + path_style_buckets: Default::default(), + region: Default::default(), + secret_access_key: Default::default(), + }, + scan_mime_types: Default::default(), + webp_quality: Default::default(), + }); + + media.image_size_vec(v, mime) +} - let size = tree.size(); - Some((size.width() as usize, size.height() as usize)) - } - _ => { - if let Ok(size) = imagesize::blob_size(v) - .inspect_err(|err| tracing::error!("Failed to generate image size! {err:?}")) - { - Some((size.width, size.height)) - } else { - None - } - } - } +/// Check whether an image file contains animation data +pub fn is_animated(f: &NamedTempFile, mime: &str) -> Option { + let media = MediaImpl::new(Files { + blocked_mime_types: Default::default(), + clamd_host: Default::default(), + encryption_key: Default::default(), + limit: FilesLimit { + max_mega_pixels: 0, + max_pixel_side: 0, + min_file_size: 0, + min_resolution: [0, 0], + }, + preview: Default::default(), + s3: FilesS3 { + access_key_id: Default::default(), + default_bucket: Default::default(), + endpoint: Default::default(), + path_style_buckets: Default::default(), + region: Default::default(), + secret_access_key: Default::default(), + }, + scan_mime_types: Default::default(), + webp_quality: Default::default(), + }); + + media.is_animated(f, mime) } /// Determine size of video at temp file pub fn video_size(f: &NamedTempFile) -> Option<(i64, i64)> { - if let Ok(data) = ffprobe::ffprobe(f.path()) - .inspect_err(|err| tracing::error!("Failed to ffprobe file! {err:?}")) - { - // Use first valid stream - for stream in data.streams { - if let (Some(w), Some(h)) = (stream.width, stream.height) { - return Some((w, h)); - } - } - - None - } else { - None - } + let media = MediaImpl::new(Files { + blocked_mime_types: Default::default(), + clamd_host: Default::default(), + encryption_key: Default::default(), + limit: FilesLimit { + max_mega_pixels: 0, + max_pixel_side: 0, + min_file_size: 0, + min_resolution: [0, 0], + }, + preview: Default::default(), + s3: FilesS3 { + access_key_id: Default::default(), + default_bucket: Default::default(), + endpoint: Default::default(), + path_style_buckets: Default::default(), + region: Default::default(), + secret_access_key: Default::default(), + }, + scan_mime_types: Default::default(), + webp_quality: Default::default(), + }); + + media.video_size(f) } /// Decode image from reader pub fn decode_image(reader: &mut R, mime: &str) -> Result { - match mime { - // Read image using jxl-oxide crate - "image/jxl" => { - let jxl_image = report_internal_error!(jxl_oxide::JxlImage::builder().read(reader))?; - if let Ok(frame) = jxl_image.render_frame(0) { - match frame.color_channels().len() { - 3 => Ok(DynamicImage::ImageRgb8( - DynamicImage::ImageRgb32F( - ImageBuffer::from_vec( - jxl_image.width(), - jxl_image.height(), - frame.image().buf().to_vec(), - ) - .ok_or_else(|| create_error!(ImageProcessingFailed))?, - ) - .to_rgb8(), - )), - 4 => Ok(DynamicImage::ImageRgba8( - DynamicImage::ImageRgba32F( - ImageBuffer::from_vec( - jxl_image.width(), - jxl_image.height(), - frame.image().buf().to_vec(), - ) - .ok_or_else(|| create_error!(ImageProcessingFailed))?, - ) - .to_rgba8(), - )), - _ => Err(create_error!(ImageProcessingFailed)), - } - } else { - Err(create_error!(ImageProcessingFailed)) - } - } - // Read image using resvg - "image/svg+xml" => { - // usvg doesn't support Read trait so copy to buffer - let mut buf = Vec::new(); - report_internal_error!(reader.read_to_end(&mut buf))?; - - let tree = report_internal_error!(usvg::Tree::from_data(&buf, &Default::default()))?; - let size = tree.size(); - let mut pixmap = Pixmap::new(size.width() as u32, size.height() as u32) - .ok_or_else(|| create_error!(ImageProcessingFailed))?; - - let mut pixmap_mut = pixmap.as_mut(); - resvg::render(&tree, Default::default(), &mut pixmap_mut); - - Ok(DynamicImage::ImageRgba8( - ImageBuffer::from_vec( - size.width() as u32, - size.height() as u32, - pixmap.data().to_vec(), - ) - .ok_or_else(|| create_error!(ImageProcessingFailed))?, - )) - } - // Check if we can read using image-rs crate - _ => report_internal_error!(report_internal_error!( - image::ImageReader::new(reader).with_guessed_format() - )? - .decode()), - } + let media = MediaImpl::new(Files { + blocked_mime_types: Default::default(), + clamd_host: Default::default(), + encryption_key: Default::default(), + limit: FilesLimit { + max_mega_pixels: 0, + max_pixel_side: 0, + min_file_size: 0, + min_resolution: [0, 0], + }, + preview: Default::default(), + s3: FilesS3 { + access_key_id: Default::default(), + default_bucket: Default::default(), + endpoint: Default::default(), + path_style_buckets: Default::default(), + region: Default::default(), + secret_access_key: Default::default(), + }, + scan_mime_types: Default::default(), + webp_quality: Default::default(), + }); + + report_internal_error!(media.decode_image(reader, mime)) } /// Check whether given reader has a valid image pub fn is_valid_image(reader: &mut R, mime: &str) -> bool { - match mime { - // Check if we can read using jxl-oxide crate - "image/jxl" => jxl_oxide::JxlImage::builder() - .read(reader) - .inspect_err(|err| tracing::error!("Failed to read JXL! {err:?}")) - .is_ok(), - // Check if we can read using image-rs crate - _ => !matches!( - image::ImageReader::new(reader) - .with_guessed_format() - .inspect_err(|err| tracing::error!("Failed to read image! {err:?}")) - .map(|f| f.decode()), - Err(_) | Ok(Err(_)) - ), - } + let media = MediaImpl::new(Files { + blocked_mime_types: Default::default(), + clamd_host: Default::default(), + encryption_key: Default::default(), + limit: FilesLimit { + max_mega_pixels: 0, + max_pixel_side: 0, + min_file_size: 0, + min_resolution: [0, 0], + }, + preview: Default::default(), + s3: FilesS3 { + access_key_id: Default::default(), + default_bucket: Default::default(), + endpoint: Default::default(), + path_style_buckets: Default::default(), + region: Default::default(), + secret_access_key: Default::default(), + }, + scan_mime_types: Default::default(), + webp_quality: Default::default(), + }); + + media.is_valid_image(reader, mime) } /// Create thumbnail from given image pub async fn create_thumbnail(image: DynamicImage, tag: &str) -> Vec { - // Load configuration - let config = config().await; - let [w, h] = config.files.preview.get(tag).unwrap(); - - // Create thumbnail - //.resize(width as u32, height as u32, image::imageops::FilterType::Gaussian) - // resize is about 2.5x slower, - // thumbnail doesn't have terrible quality - // so we use thumbnail - let image = image.thumbnail(image.width().min(*w as u32), image.height().min(*h as u32)); - - // Encode it into WEBP - let encoder = webp::Encoder::from_image(&image).expect("Could not create encoder."); - if config.files.webp_quality != 100.0 { - encoder.encode(config.files.webp_quality).to_vec() - } else { - encoder.encode_lossless().to_vec() - } + let media = MediaImpl::from_config().await; + media.create_thumbnail(image, tag) } diff --git a/crates/core/files/src/repositories/encryption_repository.rs b/crates/core/files/src/repositories/encryption_repository.rs new file mode 100644 index 000000000..98e2a4988 --- /dev/null +++ b/crates/core/files/src/repositories/encryption_repository.rs @@ -0,0 +1,6 @@ +use anyhow::Result; + +pub trait EncryptionRepository: Send + Sync + 'static { + fn decrypt_buffer(&self, buf: Vec, iv: &str) -> anyhow::Result>; + fn encrypt_buffer(&self, buf: &[u8]) -> Result<(Vec, String)>; +} diff --git a/crates/core/files/src/repositories/file_storage_repository.rs b/crates/core/files/src/repositories/file_storage_repository.rs new file mode 100644 index 000000000..af97be808 --- /dev/null +++ b/crates/core/files/src/repositories/file_storage_repository.rs @@ -0,0 +1,22 @@ +use anyhow::Result; + +#[async_trait::async_trait] +pub trait FileStorageRepository: Send + Sync + 'static { + async fn create_bucket(&self, bucket_id: &str) -> anyhow::Result<()>; + + async fn fetch_and_decrypt_file( + &self, + bucket_id: &str, + path: &str, + iv: &str, + ) -> Result>; + + async fn encrypt_and_upload_file( + &self, + bucket_id: &str, + path: &str, + buf: &[u8], + ) -> Result; + + async fn delete_file(&self, bucket_id: &str, path: &str) -> Result<()>; +} diff --git a/crates/core/files/src/repositories/media_repository.rs b/crates/core/files/src/repositories/media_repository.rs new file mode 100644 index 000000000..6c489d9b3 --- /dev/null +++ b/crates/core/files/src/repositories/media_repository.rs @@ -0,0 +1,33 @@ +use anyhow::Result; +use image::DynamicImage; +use std::io::{BufRead, Read, Seek}; +use tempfile::NamedTempFile; +use thiserror::Error; + +pub trait MediaRepository: Send + Sync + 'static { + fn image_size(&self, f: &NamedTempFile) -> Option<(usize, usize)>; + + fn is_animated(&self, f: &NamedTempFile, mime: &str) -> Option; + + fn image_size_vec(&self, v: &[u8], mime: &str) -> Option<(usize, usize)>; + + fn decode_image( + &self, + reader: &mut R, + mime: &str, + ) -> Result; + + fn is_valid_image(&self, reader: &mut R, mime: &str) -> bool; + + fn create_thumbnail(&self, image: DynamicImage, tag: &str) -> Vec; + + fn video_size(&self, f: &NamedTempFile) -> Option<(i64, i64)>; +} + +#[derive(Debug, Error)] +pub enum MediaError { + #[error("image processing failed because {cause}")] + ImageProcessingFailed { cause: String }, + #[error(transparent)] + Unknown(#[from] anyhow::Error), +} diff --git a/crates/core/files/src/repositories/mod.rs b/crates/core/files/src/repositories/mod.rs new file mode 100644 index 000000000..cb0749e72 --- /dev/null +++ b/crates/core/files/src/repositories/mod.rs @@ -0,0 +1,7 @@ +mod encryption_repository; +mod file_storage_repository; +mod media_repository; + +pub use encryption_repository::EncryptionRepository; +pub use file_storage_repository::FileStorageRepository; +pub use media_repository::{MediaError, MediaRepository}; diff --git a/crates/core/files/tests/assets/anim-icos.apng b/crates/core/files/tests/assets/anim-icos.apng new file mode 100644 index 000000000..b50cbe364 Binary files /dev/null and b/crates/core/files/tests/assets/anim-icos.apng differ diff --git a/crates/core/files/tests/assets/anim-icos.gif b/crates/core/files/tests/assets/anim-icos.gif new file mode 100644 index 000000000..5b81b05eb Binary files /dev/null and b/crates/core/files/tests/assets/anim-icos.gif differ diff --git a/crates/core/files/tests/assets/anim-icos.jxl b/crates/core/files/tests/assets/anim-icos.jxl new file mode 100644 index 000000000..bf3d1e445 Binary files /dev/null and b/crates/core/files/tests/assets/anim-icos.jxl differ diff --git a/crates/core/files/tests/assets/anim-icos.webp b/crates/core/files/tests/assets/anim-icos.webp new file mode 100644 index 000000000..ebf34e141 Binary files /dev/null and b/crates/core/files/tests/assets/anim-icos.webp differ diff --git a/crates/core/files/tests/assets/corrupted.png b/crates/core/files/tests/assets/corrupted.png new file mode 100644 index 000000000..f0fcce474 Binary files /dev/null and b/crates/core/files/tests/assets/corrupted.png differ diff --git a/crates/core/files/tests/assets/dice.jxl b/crates/core/files/tests/assets/dice.jxl new file mode 100644 index 000000000..d1a5a7d0d Binary files /dev/null and b/crates/core/files/tests/assets/dice.jxl differ diff --git a/crates/core/files/tests/assets/dice.webp b/crates/core/files/tests/assets/dice.webp new file mode 100644 index 000000000..ee3dfe535 Binary files /dev/null and b/crates/core/files/tests/assets/dice.webp differ diff --git a/crates/core/files/tests/assets/test-float.png b/crates/core/files/tests/assets/test-float.png new file mode 100644 index 000000000..036e9d4d4 Binary files /dev/null and b/crates/core/files/tests/assets/test-float.png differ diff --git a/crates/core/files/tests/assets/test.jpeg b/crates/core/files/tests/assets/test.jpeg new file mode 100644 index 000000000..504bd6bcf Binary files /dev/null and b/crates/core/files/tests/assets/test.jpeg differ diff --git a/crates/core/files/tests/assets/test.png b/crates/core/files/tests/assets/test.png new file mode 100644 index 000000000..9de075cdf Binary files /dev/null and b/crates/core/files/tests/assets/test.png differ diff --git a/crates/core/files/tests/integration_test.rs b/crates/core/files/tests/integration_test.rs new file mode 100644 index 000000000..1827a55a8 --- /dev/null +++ b/crates/core/files/tests/integration_test.rs @@ -0,0 +1,31 @@ +use std::io::Cursor; + +use revolt_files::{EncryptionKey, FileStorageRepository, MediaImpl, MediaRepository, S3Storage}; + +#[tokio::test] +async fn test_image_roundtrip_png() { + let media = MediaImpl::from_config().await; + let encryption = EncryptionKey::from_config().await; + let s3 = S3Storage::from_config(encryption).await; + + let buf = include_bytes!("./assets/test.png"); + let bucket_id = uuid::Uuid::new_v4().to_string(); + + s3.create_bucket(&bucket_id).await.unwrap(); + + let mut reader = Cursor::new(buf); + media.decode_image(&mut reader, "image/png").unwrap(); + + let iv = s3 + .encrypt_and_upload_file(&bucket_id, "/my-file", buf) + .await + .unwrap(); + + let buf = s3 + .fetch_and_decrypt_file(&bucket_id, "/my-file", &iv) + .await + .unwrap(); + + let mut reader = Cursor::new(buf); + media.decode_image(&mut reader, "image/png").unwrap(); +} diff --git a/crates/core/files/tests/s3_test.rs b/crates/core/files/tests/s3_test.rs new file mode 100644 index 000000000..95d1afcf1 --- /dev/null +++ b/crates/core/files/tests/s3_test.rs @@ -0,0 +1,42 @@ +use revolt_files::{EncryptionKey, FileStorageRepository, S3Storage}; + +#[tokio::test] +async fn test_upload_and_download() { + let encryption = EncryptionKey::from_config().await; + let s3 = S3Storage::from_config(encryption).await; + + let buf = [67]; + let bucket_id = uuid::Uuid::new_v4().to_string(); + + s3.create_bucket(&bucket_id).await.unwrap(); + + let iv = s3 + .encrypt_and_upload_file(&bucket_id, "/my-file", &buf) + .await + .unwrap(); + + let buf = s3 + .fetch_and_decrypt_file(&bucket_id, "/my-file", &iv) + .await + .unwrap(); + + assert_eq!(buf.len(), 1); + assert_eq!(buf[0], 67); +} + +#[tokio::test] +async fn test_upload_and_delete() { + let encryption = EncryptionKey::from_config().await; + let s3 = S3Storage::from_config(encryption).await; + + let buf = [67]; + let bucket_id = uuid::Uuid::new_v4().to_string(); + + s3.create_bucket(&bucket_id).await.unwrap(); + + s3.encrypt_and_upload_file(&bucket_id, "/my-file", &buf) + .await + .unwrap(); + + s3.delete_file(&bucket_id, "/my-file").await.unwrap(); +} diff --git a/crates/core/models/Cargo.toml b/crates/core/models/Cargo.toml index e232fd6cc..cf453ece8 100644 --- a/crates/core/models/Cargo.toml +++ b/crates/core/models/Cargo.toml @@ -1,10 +1,11 @@ [package] name = "revolt-models" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "MIT" authors = ["Paul Makles "] description = "Revolt Backend: API Models" +repository = "https://github.com/stoatchat/stoatchat" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -20,26 +21,27 @@ default = ["serde", "partials", "rocket"] [dependencies] # Core -revolt-config = { version = "0.8.8", path = "../config" } -revolt-permissions = { version = "0.8.8", path = "../permissions" } +revolt-config = { workspace = true } +revolt-permissions = { workspace = true } # Utility -regex = "1.11" -indexmap = "1.9.3" -once_cell = "1.17.1" -num_enum = "0.6.1" +regex = { workspace = true } +indexmap = { workspace = true } +once_cell = { workspace = true } +num_enum = { workspace = true } # Rocket -rocket = { optional = true, version = "0.5.0-rc.2", default-features = false } +rocket = { workspace = true, optional = true } # Serialisation -revolt_optional_struct = { version = "0.2.0", optional = true } -serde = { version = "1", features = ["derive"], optional = true } -iso8601-timestamp = { version = "0.2.11", features = ["schema", "bson"] } +revolt_optional_struct = { workspace = true, optional = true } +serde = { workspace = true, optional = true } +iso8601-timestamp = { workspace = true, features = ["schema", "bson"] } # Spec Generation -schemars = { version = "0.8.8", optional = true, features = ["indexmap1"] } -utoipa = { version = "4.2.3", optional = true } +schemars = { workspace = true, features = ["indexmap2"], optional = true } +utoipa = { workspace = true, optional = true } +serde_json = { workspace = true } # Validation -validator = { version = "0.16.0", optional = true, features = ["derive"] } +validator = { workspace = true, features = ["derive"], optional = true } diff --git a/crates/core/models/src/v0/accounts.rs b/crates/core/models/src/v0/accounts.rs new file mode 100644 index 000000000..ddf058650 --- /dev/null +++ b/crates/core/models/src/v0/accounts.rs @@ -0,0 +1,70 @@ +auto_derived!( + /// # Change Email Data + pub struct DataChangeEmail { + /// Valid email address + pub email: String, + /// Current password + pub current_password: String, + } + + /// # Change Data + pub struct DataChangePassword { + /// New password + pub password: String, + /// Current password + pub current_password: String, + } + + /// # Account Deletion Token + pub struct DataAccountDeletion { + /// Deletion token + pub token: String, + } + + /// # Account Data + pub struct DataCreateAccount { + /// Valid email address + pub email: String, + /// Password + pub password: String, + /// Invite code + pub invite: Option, + /// Captcha verification code + pub captcha: Option, + } + + pub struct AccountInfo { + #[serde(rename = "_id")] + pub id: String, + pub email: String, + } + + /// # Password Reset + pub struct DataPasswordReset { + /// Reset token + pub token: String, + + /// New password + pub password: String, + + /// Whether to logout all sessions + #[serde(default)] + pub remove_sessions: bool, + } + + /// # Resend Information + pub struct DataResendVerification { + /// Email associated with the account + pub email: String, + /// Captcha verification code + pub captcha: Option, + } + + /// # Reset Information + pub struct DataSendPasswordReset { + /// Email associated with the account + pub email: String, + /// Captcha verification code + pub captcha: Option, + } +); \ No newline at end of file diff --git a/crates/core/models/src/v0/channels.rs b/crates/core/models/src/v0/channels.rs index ec25257b8..faddee749 100644 --- a/crates/core/models/src/v0/channels.rs +++ b/crates/core/models/src/v0/channels.rs @@ -1,4 +1,5 @@ -use super::File; +#![allow(deprecated)] +use super::{File, UserVoiceState}; use revolt_permissions::{Override, OverrideField}; use std::collections::{HashMap, HashSet}; @@ -107,46 +108,27 @@ auto_derived!( serde(skip_serializing_if = "crate::if_false", default) )] nsfw: bool, - }, - /// Voice channel belonging to a server - VoiceChannel { - /// Unique Id - #[cfg_attr(feature = "serde", serde(rename = "_id"))] - id: String, - /// Id of the server this channel belongs to - server: String, - - /// Display name of the channel - name: String, - #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] - /// Channel description - description: Option, - /// Custom icon attachment - #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] - icon: Option, - /// Default permissions assigned to users in this channel + /// Voice Information for when this channel is also a voice channel #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] - default_permissions: Option, - /// Permissions assigned based on role to this channel - #[cfg_attr( - feature = "serde", - serde( - default = "HashMap::::new", - skip_serializing_if = "HashMap::::is_empty" - ) - )] - role_permissions: HashMap, + voice: Option, - /// Whether this channel is marked as not safe for work - #[cfg_attr( - feature = "serde", - serde(skip_serializing_if = "crate::if_false", default) - )] - nsfw: bool, + /// The channel's slowmode delay in seconds + #[serde(skip_serializing_if = "Option::is_none")] + slowmode: Option, }, } + /// Voice information for a channel + #[derive(Default)] + #[cfg_attr(feature = "validator", derive(validator::Validate))] + pub struct VoiceInformation { + /// Maximium amount of users allowed in the voice channel at once + #[cfg_attr(feature = "validator", validate(range(min = 1)))] + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub max_users: Option, + } + /// Partial representation of a channel #[derive(Default)] pub struct PartialChannel { @@ -170,6 +152,10 @@ auto_derived!( pub default_permissions: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub last_message_id: Option, + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub voice: Option, + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub slowmode: Option, } /// Optional fields on channel object @@ -177,6 +163,7 @@ auto_derived!( Description, Icon, DefaultPermissions, + Voice, } /// New webhook information @@ -205,6 +192,13 @@ auto_derived!( /// Whether this channel is archived pub archived: Option, + /// Voice Information for voice channels + pub voice: Option, + + /// The channel's slow mode delay in seconds, up to 6 hours + #[cfg_attr(feature = "validator", validate(range(min = 0, max = 21600)))] + pub slowmode: Option, + /// Fields to remove from channel #[cfg_attr(feature = "serde", serde(default))] pub remove: Vec, @@ -260,6 +254,10 @@ auto_derived!( /// Whether this channel is age restricted #[serde(skip_serializing_if = "Option::is_none")] pub nsfw: Option, + + /// Voice Information for when this channel is also a voice channel + #[serde(skip_serializing_if = "Option::is_none")] + pub voice: Option, } /// New default permissions @@ -270,7 +268,7 @@ auto_derived!( permissions: u64, }, Field { - /// Allow / deny values to set for members in this `TextChannel` or `VoiceChannel` + /// Allow / deny values to set for members in this server channel permissions: Override, }, } @@ -289,9 +287,38 @@ auto_derived!( } /// Voice server token response - pub struct LegacyCreateVoiceUserResponse { + pub struct CreateVoiceUserResponse { /// Token for authenticating with the voice server - token: String, + pub token: String, + /// Url of the livekit server to connect to + pub url: String, + } + + /// Voice state for a channel + pub struct ChannelVoiceState { + pub id: String, + /// The states of the users who are connected to the channel + pub participants: Vec, + } + + /// Join a voice channel + pub struct DataJoinCall { + /// Name of the node to join + pub node: Option, + /// Whether to force disconnect any other existing voice connections + /// + /// Useful for disconnecting on another device and joining on a new. + pub force_disconnect: Option, + /// Users which should be notified of the call starting + /// + /// Only used when the user is the first one connected. + pub recipients: Option>, + } + + pub struct ChannelSlowmode { + pub channel_id: String, + pub duration: u64, + pub retry_after: u64, } ); @@ -302,8 +329,7 @@ impl Channel { Channel::DirectMessage { id, .. } | Channel::Group { id, .. } | Channel::SavedMessages { id, .. } - | Channel::TextChannel { id, .. } - | Channel::VoiceChannel { id, .. } => id, + | Channel::TextChannel { id, .. } => id, } } @@ -315,9 +341,7 @@ impl Channel { match self { Channel::DirectMessage { .. } => None, Channel::SavedMessages { .. } => Some("Saved Messages"), - Channel::TextChannel { name, .. } - | Channel::Group { name, .. } - | Channel::VoiceChannel { name, .. } => Some(name), + Channel::TextChannel { name, .. } | Channel::Group { name, .. } => Some(name), } } } diff --git a/crates/core/models/src/v0/emojis.rs b/crates/core/models/src/v0/emojis.rs index 2d7c015e1..58d47429a 100644 --- a/crates/core/models/src/v0/emojis.rs +++ b/crates/core/models/src/v0/emojis.rs @@ -54,4 +54,22 @@ auto_derived!( #[serde(default)] pub nsfw: bool, } + + /// Partial emoji representation + #[derive(Default)] + pub struct PartialEmoji { + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub name: Option, + } + + /// Edit emoji information + #[cfg_attr(feature = "validator", derive(Validate))] + pub struct DataEditEmoji { + /// Emoji name + #[cfg_attr( + feature = "validator", + validate(length(min = 1, max = 32), regex = "RE_EMOJI") + )] + pub name: Option, + } ); diff --git a/crates/core/models/src/v0/files.rs b/crates/core/models/src/v0/files.rs index b996483cb..2d68b7f2b 100644 --- a/crates/core/models/src/v0/files.rs +++ b/crates/core/models/src/v0/files.rs @@ -46,8 +46,13 @@ auto_derived!( File, /// File contains textual data and should be displayed as such Text, - /// File is an image with specific dimensions - Image { width: usize, height: usize }, + /// File is an image with specific dimensions, and may be animated + Image { + width: usize, + height: usize, + thumbhash: Option>, + animated: Option, + }, /// File is a video with specific dimensions Video { width: usize, height: usize }, /// File is audio diff --git a/crates/core/models/src/v0/messages.rs b/crates/core/models/src/v0/messages.rs index 2116d98ba..cb8f3f246 100644 --- a/crates/core/models/src/v0/messages.rs +++ b/crates/core/models/src/v0/messages.rs @@ -132,6 +132,11 @@ auto_derived!( MessagePinned { id: String, by: String }, #[serde(rename = "message_unpinned")] MessageUnpinned { id: String, by: String }, + #[serde(rename = "call_started")] + CallStarted { + by: String, + finished_at: Option, + }, } /// Name and / or avatar override information @@ -199,6 +204,9 @@ auto_derived!( pub image: Option, /// Message content or system message information pub body: String, + /// The raw body, if the body has been rendered + #[serde(skip_serializing_if = "Option::is_none")] + pub raw_body: Option, /// Unique tag, usually the channel ID pub tag: String, /// Timestamp at which this notification was created @@ -253,7 +261,7 @@ auto_derived!( pub nonce: Option, /// Message content to send - #[cfg_attr(feature = "validator", validate(length(min = 0, max = 2000)))] + #[cfg_attr(feature = "validator", validate(length(min = 0)))] pub content: Option, /// Attachments to include in message pub attachments: Option>, @@ -337,7 +345,7 @@ auto_derived!( #[cfg_attr(feature = "validator", derive(Validate))] pub struct DataEditMessage { /// New message content - #[cfg_attr(feature = "validator", validate(length(min = 1, max = 2000)))] + #[cfg_attr(feature = "validator", validate(length(min = 1)))] pub content: Option, /// Embeds to include in the message #[cfg_attr(feature = "validator", validate(length(min = 0, max = 10)))] @@ -383,6 +391,7 @@ auto_derived!( ); /// Message Author Abstraction +#[derive(Clone)] pub enum MessageAuthor<'a> { User(&'a User), Webhook(&'a Webhook), @@ -445,6 +454,7 @@ impl From for String { } SystemMessage::MessagePinned { .. } => "Message pinned.".to_string(), SystemMessage::MessageUnpinned { .. } => "Message unpinned.".to_string(), + SystemMessage::CallStarted { .. } => "Call started.".to_string(), } } } @@ -505,6 +515,7 @@ impl PushNotification { icon, image, body, + raw_body: None, tag: channel.id().to_string(), timestamp, url: format!("{}/channel/{}/{}", config.hosts.app, channel.id(), msg.id), diff --git a/crates/core/models/src/v0/mfa_tickets.rs b/crates/core/models/src/v0/mfa_tickets.rs new file mode 100644 index 000000000..f11cf08f4 --- /dev/null +++ b/crates/core/models/src/v0/mfa_tickets.rs @@ -0,0 +1,68 @@ +auto_derived!( + pub struct MFATicket { + /// Unique Id + #[serde(rename = "_id")] + pub id: String, + + /// Account Id + pub account_id: String, + + /// Unique Token + pub token: String, + + /// Whether this ticket has been validated + /// (can be used for account actions) + pub validated: bool, + + /// Whether this ticket is authorised + /// (can be used to log a user in) + pub authorised: bool, + + /// TOTP code at time of ticket creation + pub last_totp_code: Option, + } + + #[serde(untagged)] + pub enum ResponseVerify { + NoTicket, + WithTicket { + /// Authorised MFA ticket, can be used to log in + ticket: MFATicket, + }, + } + + /// MFA response + #[serde(untagged)] + pub enum MFAResponse { + Password { password: String }, + Recovery { recovery_code: String }, + Totp { totp_code: String }, + } + + #[derive(Default)] + pub struct MultiFactorStatus { + #[serde(skip_serializing_if = "crate::if_false", default)] + pub email_otp: bool, + #[serde(skip_serializing_if = "crate::if_false", default)] + pub trusted_handover: bool, + #[serde(skip_serializing_if = "crate::if_false", default)] + pub email_mfa: bool, + #[serde(skip_serializing_if = "crate::if_false", default)] + pub totp_mfa: bool, + #[serde(skip_serializing_if = "crate::if_false", default)] + pub security_key_mfa: bool, + #[serde(skip_serializing_if = "crate::if_false", default)] + pub recovery_active: bool, + } + + pub enum MFAMethod { + Password, + Recovery, + Totp, + } + + /// # Totp Secret + pub struct ResponseTotpSecret { + pub secret: String, + } +); \ No newline at end of file diff --git a/crates/core/models/src/v0/mod.rs b/crates/core/models/src/v0/mod.rs index 0468493b8..47e705070 100644 --- a/crates/core/models/src/v0/mod.rs +++ b/crates/core/models/src/v0/mod.rs @@ -14,6 +14,9 @@ mod server_members; mod servers; mod user_settings; mod users; +mod accounts; +mod mfa_tickets; +mod sessions; pub use bots::*; pub use channel_invites::*; @@ -31,3 +34,6 @@ pub use server_members::*; pub use servers::*; pub use user_settings::*; pub use users::*; +pub use accounts::*; +pub use mfa_tickets::*; +pub use sessions::*; \ No newline at end of file diff --git a/crates/core/models/src/v0/server_bans.rs b/crates/core/models/src/v0/server_bans.rs index b6debfcdc..940a3738b 100644 --- a/crates/core/models/src/v0/server_bans.rs +++ b/crates/core/models/src/v0/server_bans.rs @@ -19,6 +19,9 @@ auto_derived!( /// Ban reason #[cfg_attr(feature = "validator", validate(length(min = 0, max = 1024)))] pub reason: Option, + /// Messages to delete in seconds + #[cfg_attr(feature = "validator", validate(range(min = 0, max = 604800)))] + pub delete_message_seconds: Option, } /// Just enough information to list a ban diff --git a/crates/core/models/src/v0/server_members.rs b/crates/core/models/src/v0/server_members.rs index 048f696bc..bcded0b08 100644 --- a/crates/core/models/src/v0/server_members.rs +++ b/crates/core/models/src/v0/server_members.rs @@ -31,6 +31,14 @@ pub static RE_COLOUR: Lazy = Lazy::new(|| { Regex::new(r"(?i)^(?:[a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+|(repeating-)?(linear|conic|radial)-gradient\(([a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+|\d+deg)([ ]+(\d{1,3}%|0))?(,[ ]*([a-z ]+|var\(--[a-z\d-]+\)|rgba?\([\d, ]+\)|#[a-f0-9]+)([ ]+(\d{1,3}%|0))?)+\))$").unwrap() }); +fn default_true() -> bool { + true +} + +fn is_true(x: &bool) -> bool { + *x +} + auto_derived_partial!( /// Server Member pub struct Member { @@ -44,6 +52,9 @@ auto_derived_partial!( /// Member's nickname #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub nickname: Option, + /// Member's pronouns + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub pronouns: Option, /// Avatar attachment #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub avatar: Option, @@ -57,6 +68,13 @@ auto_derived_partial!( /// Timestamp this member is timed out until #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub timeout: Option, + + /// Whether the member is server-wide voice muted + #[serde(skip_serializing_if = "is_true", default = "default_true")] + pub can_publish: bool, + /// Whether the member is server-wide voice deafened + #[serde(skip_serializing_if = "is_true", default = "default_true")] + pub can_receive: bool, }, "PartialMember" ); @@ -74,10 +92,14 @@ auto_derived!( /// Optional fields on server member object pub enum FieldsMember { Nickname, + Pronouns, Avatar, Roles, Timeout, + CanReceive, + CanPublish, JoinedAt, + VoiceChannel, } /// Member removal intention @@ -118,12 +140,21 @@ auto_derived!( /// Member nickname #[cfg_attr(feature = "validator", validate(length(min = 1, max = 32)))] pub nickname: Option, + /// Member pronouns + #[cfg_attr(feature = "validator", validate(length(min = 1, max = 24)))] + pub pronouns: Option, /// Attachment Id to set for avatar pub avatar: Option, /// Array of role ids pub roles: Option>, /// Timestamp this member is timed out until pub timeout: Option, + /// server-wide voice muted + pub can_publish: Option, + /// server-wide voice deafened + pub can_receive: Option, + /// voice channel to move to if already in a voice channel + pub voice_channel: Option, /// Fields to remove from channel object #[cfg_attr(feature = "serde", serde(default))] pub remove: Vec, diff --git a/crates/core/models/src/v0/servers.rs b/crates/core/models/src/v0/servers.rs index c3ed20a8b..2aab765e6 100644 --- a/crates/core/models/src/v0/servers.rs +++ b/crates/core/models/src/v0/servers.rs @@ -85,6 +85,9 @@ auto_derived_partial!( auto_derived_partial!( /// Role pub struct Role { + /// Unique Id + #[cfg_attr(feature = "serde", serde(rename = "_id"))] + pub id: String, /// Role name pub name: String, /// Permissions available to this role @@ -103,6 +106,9 @@ auto_derived_partial!( /// Ranking of this role #[cfg_attr(feature = "serde", serde(default))] pub rank: i64, + /// Role icon + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub icon: Option, }, "PartialRole" ); @@ -120,6 +126,7 @@ auto_derived!( /// Optional fields on server object pub enum FieldsRole { Colour, + Icon, } /// Channel category @@ -181,6 +188,7 @@ auto_derived!( } /// Response after creating new role + // TODO: remove this in favor of just Role pub struct NewRoleResponse { /// Id of the role pub id: String, @@ -248,6 +256,9 @@ auto_derived!( /// Must be enabled in order to show up on [Revolt Discover](https://rvlt.gg). pub analytics: Option, + /// User id of the new owner + pub owner: Option, + /// Fields to remove from server object #[cfg_attr(feature = "serde", serde(default))] pub remove: Vec, @@ -271,6 +282,11 @@ auto_derived!( /// /// **Removed** - no effect, use the edit server role positions route pub rank: Option, + /// Role icon + /// + /// Provide an Autumn attachment Id. + #[cfg_attr(feature = "validator", validate(length(min = 1, max = 128)))] + pub icon: Option, /// Fields to remove from role object #[cfg_attr(feature = "serde", serde(default))] pub remove: Vec, diff --git a/crates/core/models/src/v0/sessions.rs b/crates/core/models/src/v0/sessions.rs new file mode 100644 index 000000000..84ffc33a9 --- /dev/null +++ b/crates/core/models/src/v0/sessions.rs @@ -0,0 +1,88 @@ +use iso8601_timestamp::Timestamp; + +use crate::v0::{MFAMethod, MFAResponse}; + +auto_derived!( + pub struct Session { + /// Unique Id + #[serde(rename = "_id")] + pub id: String, + + /// User Id + pub user_id: String, + + /// Session token + pub token: String, + + /// Display name + pub name: String, + + /// When the session was last logged in + pub last_seen: Timestamp, + + /// Where the session is originating from + #[serde(skip_serializing_if = "Option::is_none")] + pub origin: Option, + + /// Web Push subscription + #[serde(skip_serializing_if = "Option::is_none")] + pub subscription: Option, + } + + /// Web Push subscription + pub struct WebPushSubscription { + pub endpoint: String, + pub p256dh: String, + pub auth: String, + } + + /// # Edit Data + pub struct DataEditSession { + /// Session friendly name + pub friendly_name: String, + } + + pub struct SessionInfo { + #[serde(rename = "_id")] + pub id: String, + pub name: String, + } + + /// # Login Data + #[serde(untagged)] + pub enum DataLogin { + Email { + /// Email + email: String, + /// Password + password: String, + /// Friendly name used for the session + friendly_name: Option, + }, + MFA { + /// Unvalidated or authorised MFA ticket + /// + /// Used to resolve the correct account + mfa_ticket: String, + /// Valid MFA response + /// + /// This will take precedence over the `password` field where applicable + mfa_response: Option, + /// Friendly name used for the session + friendly_name: Option, + }, + } + + #[serde(tag = "result")] + pub enum ResponseLogin { + Success(Session), + MFA { + ticket: String, + allowed_methods: Vec, + }, + Disabled { + user_id: String, + }, + } + +); \ No newline at end of file diff --git a/crates/core/models/src/v0/users.rs b/crates/core/models/src/v0/users.rs index fc681e003..217324c28 100644 --- a/crates/core/models/src/v0/users.rs +++ b/crates/core/models/src/v0/users.rs @@ -1,3 +1,4 @@ +use iso8601_timestamp::Timestamp; use once_cell::sync::Lazy; use regex::Regex; @@ -31,6 +32,9 @@ auto_derived_partial!( /// Display name #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] pub display_name: Option, + /// User's pronouns + #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] + pub pronouns: Option, #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))] /// Avatar attachment pub avatar: Option, @@ -88,6 +92,7 @@ auto_derived!( ProfileContent, ProfileBackground, DisplayName, + Pronouns, /// Internal field, ignore this. Internal, @@ -224,6 +229,9 @@ auto_derived!( validate(length(min = 2, max = 32), regex = "RE_DISPLAY_NAME") )] pub display_name: Option, + /// New pronouns + #[cfg_attr(feature = "validator", validate(length(min = 1, max = 24)))] + pub pronouns: Option, /// Attachment Id for avatar #[cfg_attr(feature = "validator", validate(length(min = 1, max = 128)))] pub avatar: Option, @@ -279,6 +287,19 @@ auto_derived!( } ); +auto_derived_partial!( + /// Voice State information for a user + pub struct UserVoiceState { + pub id: String, + pub joined_at: Timestamp, + pub is_receiving: bool, + pub is_publishing: bool, + pub screensharing: bool, + pub camera: bool, + }, + "PartialUserVoiceState" +); + pub trait CheckRelationship { fn with(&self, user: &str) -> RelationshipStatus; } diff --git a/crates/core/parser/Cargo.toml b/crates/core/parser/Cargo.toml index a6e1869b7..5bb079acf 100644 --- a/crates/core/parser/Cargo.toml +++ b/crates/core/parser/Cargo.toml @@ -1,10 +1,11 @@ [package] name = "revolt-parser" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "MIT" authors = ["Zomatree ", "Paul Makles "] description = "Revolt Backend: Message Parser" +repository = "https://github.com/stoatchat/stoatchat" [dependencies] -logos = { version = "0.15" } +logos = { workspace = true } diff --git a/crates/core/parser/src/lib.rs b/crates/core/parser/src/lib.rs index 4ebbac630..27211c1ba 100644 --- a/crates/core/parser/src/lib.rs +++ b/crates/core/parser/src/lib.rs @@ -16,23 +16,29 @@ pub enum MessageToken<'a> { UserMention(&'a str), #[regex("<%(?&id)>", |lex| &lex.slice()[2..lex.slice().len() - 1],)] RoleMention(&'a str), + #[regex("<#(?&id)>", |lex| &lex.slice()[2..lex.slice().len() - 1],)] + ChannelMention(&'a str), + #[regex(":(?&id):", |lex| &lex.slice()[1..lex.slice().len() - 1],)] + Emoji(&'a str), #[token("@everyone")] MentionEveryone, #[token("@online")] - MentionOnline + MentionOnline, } #[derive(Debug, Clone, PartialEq, Default)] pub struct MessageResults { pub user_mentions: HashSet, pub role_mentions: HashSet, + pub channel_mentions: HashSet, + pub emojis: HashSet, pub mentions_everyone: bool, - pub mentions_online: bool + pub mentions_online: bool, } struct MessageParserIterator<'a, I> { inner: I, - temp: VecDeque> + temp: VecDeque>, } impl<'a, I: Iterator>> Iterator for MessageParserIterator<'a, I> { @@ -55,11 +61,11 @@ impl<'a, I: Iterator>> Iterator for MessageParserIterato if next_token == Some(MessageToken::CodeblockMarker(ty)) { self.temp.clear(); self.temp.push_back(MessageToken::CodeblockMarker(ty)); - break next_token + break next_token; } else if let Some(token) = next_token { self.temp.push_back(token); } else { - break Some(MessageToken::CodeblockMarker(ty)) + break Some(MessageToken::CodeblockMarker(ty)); } } } else { @@ -69,10 +75,10 @@ impl<'a, I: Iterator>> Iterator for MessageParserIterato } } -pub fn parse_message_iter(text: &str) -> impl Iterator + '_ { +pub fn parse_message_iter(text: &str) -> impl Iterator> + '_ { MessageParserIterator { inner: MessageToken::lexer(text).flatten(), - temp: VecDeque::new() + temp: VecDeque::new(), } } @@ -82,13 +88,23 @@ pub fn parse_message(text: &str) -> MessageResults { for token in parse_message_iter(text) { match token { MessageToken::Escape => {} - MessageToken::CodeblockMarker(_) => {}, - MessageToken::UserMention(id) => { results.user_mentions.insert(id.to_string()); }, - MessageToken::RoleMention(id) => { results.role_mentions.insert(id.to_string()); }, + MessageToken::CodeblockMarker(_) => {} + MessageToken::UserMention(id) => { + results.user_mentions.insert(id.to_string()); + } + MessageToken::RoleMention(id) => { + results.role_mentions.insert(id.to_string()); + } + MessageToken::ChannelMention(id) => { + results.channel_mentions.insert(id.to_string()); + } + MessageToken::Emoji(id) => { + results.emojis.insert(id.to_string()); + } MessageToken::MentionEveryone => results.mentions_everyone = true, MessageToken::MentionOnline => results.mentions_online = true, }; - }; + } results } @@ -109,7 +125,10 @@ mod tests { let output = parse_message_iter("Hello <@01FD58YK5W7QRV5H3D64KTQYX3>.").collect::>(); assert_eq!(output.len(), 1); - assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!( + output[0], + MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); } #[test] @@ -117,7 +136,10 @@ mod tests { let output = parse_message_iter("Hello <%01FD58YK5W7QRV5H3D64KTQYX3>.").collect::>(); assert_eq!(output.len(), 1); - assert_eq!(output[0], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!( + output[0], + MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); } #[test] @@ -138,29 +160,57 @@ mod tests { #[test] fn test_everything() { - let output = parse_message_iter("Hello <@01FD58YK5W7QRV5H3D64KTQYX3>, <%01FD58YK5W7QRV5H3D64KTQYX3>, @everyone and @online.").collect::>(); - - assert_eq!(output.len(), 4); - assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); - assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); - assert_eq!(output[2], MessageToken::MentionEveryone); - assert_eq!(output[3], MessageToken::MentionOnline); + let output = parse_message_iter("Hello <@01FD58YK5W7QRV5H3D64KTQYX3>, <%01FD58YK5W7QRV5H3D64KTQYX3>, <#01FD58YK5W7QRV5H3D64KTQYX3> @everyone and @online. :01FD58YK5W7QRV5H3D64KTQYX3:").collect::>(); + + assert_eq!(output.len(), 6); + assert_eq!( + output[0], + MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!( + output[1], + MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!( + output[2], + MessageToken::ChannelMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!(output[3], MessageToken::MentionEveryone); + assert_eq!(output[4], MessageToken::MentionOnline); + assert_eq!(output[5], MessageToken::Emoji("01FD58YK5W7QRV5H3D64KTQYX3")); } #[test] fn test_everything_no_spaces() { - let output = parse_message_iter("<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online").collect::>(); - - assert_eq!(output.len(), 4); - assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); - assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); - assert_eq!(output[2], MessageToken::MentionEveryone); - assert_eq!(output[3], MessageToken::MentionOnline); + let output = parse_message_iter( + "<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3><#01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online:01FD58YK5W7QRV5H3D64KTQYX3:", + ) + .collect::>(); + + assert_eq!(output.len(), 6); + assert_eq!( + output[0], + MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!( + output[1], + MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!( + output[2], + MessageToken::ChannelMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!(output[3], MessageToken::MentionEveryone); + assert_eq!(output[4], MessageToken::MentionOnline); + assert_eq!(output[5], MessageToken::Emoji("01FD58YK5W7QRV5H3D64KTQYX3")); } #[test] fn test_codeblock_no_mentions() { - let output = parse_message_iter("```\n<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online\n```").collect::>(); + let output = parse_message_iter( + "```\n<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3><#01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online:01FD58YK5W7QRV5H3D64KTQYX3:\n```", + ) + .collect::>(); assert_eq!(output.len(), 2); assert_eq!(output[0], MessageToken::CodeblockMarker(3)); @@ -169,19 +219,36 @@ mod tests { #[test] fn test_uncontained_codeblock_should_mention() { - let output = parse_message_iter("```\n<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online").collect::>(); + let output = parse_message_iter( + "```\n<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3><#01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online:01FD58YK5W7QRV5H3D64KTQYX3:", + ) + .collect::>(); - assert_eq!(output.len(), 5); + assert_eq!(output.len(), 7); assert_eq!(output[0], MessageToken::CodeblockMarker(3)); - assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); - assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); - assert_eq!(output[3], MessageToken::MentionEveryone); - assert_eq!(output[4], MessageToken::MentionOnline); + assert_eq!( + output[1], + MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!( + output[2], + MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!( + output[3], + MessageToken::ChannelMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!(output[4], MessageToken::MentionEveryone); + assert_eq!(output[5], MessageToken::MentionOnline); + assert_eq!(output[6], MessageToken::Emoji("01FD58YK5W7QRV5H3D64KTQYX3")); } #[test] fn test_inline_codeblock_no_mentions() { - let output = parse_message_iter("`<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online`").collect::>(); + let output = parse_message_iter( + "`<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3><#01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online:01FD58YK5W7QRV5H3D64KTQYX3:`", + ) + .collect::>(); assert_eq!(output.len(), 2); assert_eq!(output[0], MessageToken::CodeblockMarker(1)); @@ -190,19 +257,33 @@ mod tests { #[test] fn test_uncontained_inline_codeblock_should_mention() { - let output = parse_message_iter("`<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online").collect::>(); + let output = parse_message_iter( + "`<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3><#01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online:01FD58YK5W7QRV5H3D64KTQYX3:", + ) + .collect::>(); - assert_eq!(output.len(), 5); + assert_eq!(output.len(), 7); assert_eq!(output[0], MessageToken::CodeblockMarker(1)); - assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); - assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); - assert_eq!(output[3], MessageToken::MentionEveryone); - assert_eq!(output[4], MessageToken::MentionOnline); + assert_eq!( + output[1], + MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!( + output[2], + MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!( + output[3], + MessageToken::ChannelMention("01FD58YK5W7QRV5H3D64KTQYX3") + ); + assert_eq!(output[4], MessageToken::MentionEveryone); + assert_eq!(output[5], MessageToken::MentionOnline); + assert_eq!(output[6], MessageToken::Emoji("01FD58YK5W7QRV5H3D64KTQYX3")); } #[test] fn test_codeblock_with_language_no_mentions() { - let output = parse_message_iter("```rust\n<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online```").collect::>(); + let output = parse_message_iter("```rust\n<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3><#01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online:01FD58YK5W7QRV5H3D64KTQYX3:```").collect::>(); assert_eq!(output.len(), 2); assert_eq!(output[0], MessageToken::CodeblockMarker(3)); @@ -220,7 +301,8 @@ mod tests { #[test] fn test_double_inline_codeblock_with_backticks_inside() { - let output = parse_message_iter("``this `should` not `ping` @everyone``").collect::>(); + let output = + parse_message_iter("``this `should` not `ping` @everyone``").collect::>(); assert_eq!(output.len(), 2); assert_eq!(output[0], MessageToken::CodeblockMarker(2)); @@ -238,7 +320,8 @@ mod tests { #[test] fn test_escaped_codeblock() { - let output = parse_message_iter("i am ~~not~~ pinging \\`@everyone` ok.").collect::>(); + let output = + parse_message_iter("i am ~~not~~ pinging \\`@everyone` ok.").collect::>(); assert_eq!(output.len(), 3); assert_eq!(output[0], MessageToken::Escape); @@ -253,4 +336,4 @@ mod tests { assert_eq!(output.len(), 1); assert_eq!(output[0], MessageToken::Escape); } -} \ No newline at end of file +} diff --git a/crates/core/permissions/Cargo.toml b/crates/core/permissions/Cargo.toml index d5ee32165..b9e4eb403 100644 --- a/crates/core/permissions/Cargo.toml +++ b/crates/core/permissions/Cargo.toml @@ -1,10 +1,11 @@ [package] name = "revolt-permissions" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "MIT" authors = ["Paul Makles "] description = "Revolt Backend: Permission Logic" +repository = "https://github.com/stoatchat/stoatchat" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -17,23 +18,23 @@ try-from-primitive = ["dep:num_enum"] [dev-dependencies] # Async -async-std = { version = "1.8.0", features = ["attributes"] } +tokio = { workspace = true } [dependencies] # Core -revolt-result = { version = "0.8.8", path = "../result" } +revolt-result = { workspace = true } # Utility -auto_ops = "0.3.0" -once_cell = "1.17" -num_enum = { version = "0.6.1", optional = true } +auto_ops = { workspace = true } +once_cell = { workspace = true } +num_enum = { workspace = true, optional = true } # Async -async-trait = "0.1.51" +async-trait = { workspace = true } # Serialisation -serde = { version = "1", features = ["derive"], optional = true } -bson = { version = "2.1.0", optional = true } +serde = { workspace = true, optional = true } +bson = { workspace = true, optional = true } # Spec Generation -schemars = { version = "0.8.8", optional = true } +schemars = { workspace = true, optional = true } diff --git a/crates/core/permissions/src/impl.rs b/crates/core/permissions/src/impl.rs index 9975eeda5..064fee3e6 100644 --- a/crates/core/permissions/src/impl.rs +++ b/crates/core/permissions/src/impl.rs @@ -61,6 +61,15 @@ pub async fn calculate_server_permissions(query: &mut P) -> permissions.apply(role_override); } + if !query.do_we_have_publish_overwrites().await { + permissions.revoke(ChannelPermission::Speak as u64); + permissions.revoke(ChannelPermission::Video as u64); + } + + if !query.do_we_have_receive_overwrites().await { + permissions.revoke(ChannelPermission::Listen as u64); + } + if query.are_we_timed_out().await { permissions.restrict(*ALLOW_IN_TIMEOUT); } diff --git a/crates/core/permissions/src/models/channel.rs b/crates/core/permissions/src/models/channel.rs index aca22b5c2..fc6fe49a0 100644 --- a/crates/core/permissions/src/models/channel.rs +++ b/crates/core/permissions/src/models/channel.rs @@ -75,6 +75,8 @@ pub enum ChannelPermission { Masquerade = 1 << 28, /// React to messages with emojis React = 1 << 29, + /// Bypass slowmode + BypassSlowmode = 1 << 39, // * Voice permissions /// Connect to a voice channel @@ -89,6 +91,8 @@ pub enum ChannelPermission { DeafenMembers = 1 << 34, /// Move members between voice channels MoveMembers = 1 << 35, + /// Listen to other users + Listen = 1 << 36, // * Channel permissions two electric boogaloo /// Mention everyone and online members @@ -97,7 +101,7 @@ pub enum ChannelPermission { MentionRoles = 1 << 38, // * Misc. permissions - // % Bits 38 to 52: free area + // % Bits 39 to 52: free area // % Bits 53 to 64: do not use // * Grant all permissions @@ -130,14 +134,16 @@ pub static DEFAULT_PERMISSION: Lazy = Lazy::new(|| { + ChannelPermission::SendEmbeds + ChannelPermission::UploadFiles + ChannelPermission::Connect - + ChannelPermission::Speak, + + ChannelPermission::Speak + + ChannelPermission::Listen + + ChannelPermission::Video ) }); pub static DEFAULT_PERMISSION_SAVED_MESSAGES: u64 = ChannelPermission::GrantAllSafe as u64; pub static DEFAULT_PERMISSION_DIRECT_MESSAGE: Lazy = Lazy::new(|| { - DEFAULT_PERMISSION.add(ChannelPermission::ManageChannel + ChannelPermission::React) + DEFAULT_PERMISSION.add(ChannelPermission::ManageChannel + ChannelPermission::React + ChannelPermission::Masquerade) }); pub static DEFAULT_PERMISSION_SERVER: Lazy = Lazy::new(|| { diff --git a/crates/core/permissions/src/models/server.rs b/crates/core/permissions/src/models/server.rs index e6355eedc..8391029a0 100644 --- a/crates/core/permissions/src/models/server.rs +++ b/crates/core/permissions/src/models/server.rs @@ -39,7 +39,7 @@ pub enum DataPermissionPoly { permissions: u64, }, Field { - /// Allow / deny values to set for members in this `TextChannel` or `VoiceChannel` + /// Allow / deny values to set for members in this server channel permissions: Override, }, } diff --git a/crates/core/permissions/src/test.rs b/crates/core/permissions/src/test.rs index e4dadd485..f9225b0c4 100644 --- a/crates/core/permissions/src/test.rs +++ b/crates/core/permissions/src/test.rs @@ -4,7 +4,7 @@ use crate::{ DEFAULT_PERMISSION_SERVER, DEFAULT_PERMISSION_VIEW_ONLY, }; -#[async_std::test] +#[tokio::test] async fn validate_user_permissions() { /// Scenario in which we are friends with a user /// and we have a DM channel open with them @@ -64,6 +64,14 @@ async fn validate_user_permissions() { unreachable!() } + async fn do_we_have_publish_overwrites(&mut self) -> bool { + true + } + + async fn do_we_have_receive_overwrites(&mut self) -> bool { + true + } + async fn get_channel_type(&mut self) -> ChannelType { ChannelType::DirectMessage } @@ -94,7 +102,7 @@ async fn validate_user_permissions() { } } -#[async_std::test] +#[tokio::test] async fn validate_group_permissions() { /// Scenario in which we are in a group channel with only talking permission struct Scenario {} @@ -153,6 +161,14 @@ async fn validate_group_permissions() { unreachable!() } + async fn do_we_have_publish_overwrites(&mut self) -> bool { + true + } + + async fn do_we_have_receive_overwrites(&mut self) -> bool { + true + } + async fn get_channel_type(&mut self) -> ChannelType { ChannelType::Group } @@ -186,7 +202,7 @@ async fn validate_group_permissions() { } } -#[async_std::test] +#[tokio::test] async fn validate_server_permissions() { /// Scenario in which we are in a server channel where: /// - the server grants reading history and sending messages by default @@ -254,6 +270,14 @@ async fn validate_server_permissions() { false } + async fn do_we_have_publish_overwrites(&mut self) -> bool { + true + } + + async fn do_we_have_receive_overwrites(&mut self) -> bool { + true + } + async fn get_channel_type(&mut self) -> ChannelType { ChannelType::ServerChannel } @@ -290,7 +314,7 @@ async fn validate_server_permissions() { } } -#[async_std::test] +#[tokio::test] async fn validate_timed_out_member() { /// Scenario in which we are in a server that we have been timed out from struct Scenario {} @@ -346,6 +370,14 @@ async fn validate_timed_out_member() { true } + async fn do_we_have_publish_overwrites(&mut self) -> bool { + true + } + + async fn do_we_have_receive_overwrites(&mut self) -> bool { + true + } + async fn get_channel_type(&mut self) -> ChannelType { ChannelType::ServerChannel } diff --git a/crates/core/permissions/src/trait.rs b/crates/core/permissions/src/trait.rs index d4a7c3d36..96b42caf8 100644 --- a/crates/core/permissions/src/trait.rs +++ b/crates/core/permissions/src/trait.rs @@ -39,6 +39,12 @@ pub trait PermissionQuery { /// Is our perspective user timed out on this server? async fn are_we_timed_out(&mut self) -> bool; + /// Is the member muted? + async fn do_we_have_publish_overwrites(&mut self) -> bool; + + /// Is the member deafend? + async fn do_we_have_receive_overwrites(&mut self) -> bool; + // * For calculating channel permission /// Get the type of the channel diff --git a/crates/core/presence/Cargo.toml b/crates/core/presence/Cargo.toml index 2e53c3e70..b0f7f1730 100644 --- a/crates/core/presence/Cargo.toml +++ b/crates/core/presence/Cargo.toml @@ -1,10 +1,11 @@ [package] name = "revolt-presence" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "AGPL-3.0-or-later" authors = ["Paul Makles "] description = "Revolt Backend: User Presence" +repository = "https://github.com/stoatchat/stoatchat" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -13,16 +14,16 @@ redis-is-patched = [] [dev-dependencies] # Async -async-std = { version = "1.8.0", features = ["attributes"] } +tokio = { workspace = true } # Config for loading Redis URI -revolt-config = { version = "0.8.8", path = "../config" } +revolt-config = { workspace = true } [dependencies] # Utility -log = "0.4.17" -rand = "0.8.5" -once_cell = "1.17.1" +log = { workspace = true } +rand = { workspace = true } +once_cell = { workspace = true } # Redis -redis-kiss = "0.1.4" +redis-kiss = { workspace = true, default-features = false, features = ["tokio-runtime"] } diff --git a/crates/core/presence/src/lib.rs b/crates/core/presence/src/lib.rs index 4c5ffda52..124eacc3a 100644 --- a/crates/core/presence/src/lib.rs +++ b/crates/core/presence/src/lib.rs @@ -195,7 +195,7 @@ mod tests { use crate::{clear_region, create_session, delete_session, filter_online, is_online}; use rand::Rng; - #[async_std::test] + #[tokio::test] async fn it_works() { revolt_config::config().await; diff --git a/crates/core/ratelimits/Cargo.toml b/crates/core/ratelimits/Cargo.toml new file mode 100644 index 000000000..440c3b8a4 --- /dev/null +++ b/crates/core/ratelimits/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "revolt-ratelimits" +version = "0.13.7" +edition = "2024" +license = "MIT" +authors = ["Zomatree ", "Paul Makles "] +description = "Revolt Backend: Ratelimit Handler" +repository = "https://github.com/stoatchat/stoatchat" + +[features] +rocket = [ + "dep:rocket", + "dep:revolt_rocket_okapi", + "revolt-database/rocket-impl", +] +axum = ["dep:axum", "revolt-database/axum-impl"] + +default = ["rocket", "axum"] + +[dependencies] +revolt-database = { workspace = true } +revolt-result = { workspace = true } +revolt-config = { workspace = true } + +rocket = { workspace = true, optional = true } +revolt_rocket_okapi = { workspace = true, optional = true } + +axum = { workspace = true, optional = true, features = ["macros"] } + +serde = { workspace = true } +dashmap = { workspace = true } +async-trait = { workspace = true } +log = { workspace = true } diff --git a/crates/core/ratelimits/src/axum.rs b/crates/core/ratelimits/src/axum.rs new file mode 100644 index 000000000..74556f25b --- /dev/null +++ b/crates/core/ratelimits/src/axum.rs @@ -0,0 +1,171 @@ +use async_trait::async_trait; +use axum::{ + Json, RequestPartsExt, Router, + body::Body, + extract::{FromRef, FromRequestParts, State}, + http::{HeaderValue, Request, StatusCode, request::Parts}, + middleware::Next, + response::{IntoResponse, Response}, + routing::get, +}; +use revolt_database::{Database, User, util::ip::axum::to_real_ip}; + +use crate::ratelimiter::{RatelimitInformation, Ratelimiter, RequestKind}; + +#[derive(Clone, Copy)] +pub struct AxumRequestKind; + +impl RequestKind for AxumRequestKind { + type R<'a> = Parts; +} + +pub type RatelimitStorage = crate::ratelimiter::RatelimitStorage; + +#[async_trait] +impl FromRequestParts for Ratelimiter +where + Database: FromRef, + RatelimitStorage: FromRef, +{ + type Rejection = Json; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + if parts + .extensions + .get::>>() + .is_none() + { + let storage = RatelimitStorage::from_ref(state); + + let identifier = if let Ok(user) = parts.extract_with_state::(state).await { + user.id + } else { + to_real_ip(parts).await + }; + + let (bucket, resource) = storage.resolver.resolve_bucket(parts); + let limit = storage.resolver.resolve_bucket_limit(bucket); + + let ratelimiter = + Ratelimiter::from(&storage.map, &identifier, limit, (bucket, resource)); + + parts.extensions.insert(ratelimiter.map_err(Json)); + }; + + *parts + .extensions + .get::>>() + .unwrap() + } +} + +#[async_trait] +impl FromRequestParts for RatelimitInformation +where + Database: FromRef, + RatelimitStorage: FromRef, +{ + type Rejection = Json; + + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { + if parts + .extensions + .get::>>() + .is_none() + { + let ratelimiter = parts.extract_with_state::(state).await; + + parts.extensions.insert(ratelimiter); + }; + + let ratelimiter = *parts + .extensions + .get::>>() + .unwrap(); + + match ratelimiter { + Ok(ratelimter) => Ok(RatelimitInformation::Success(ratelimter)), + Err(ratelimiter) => Err(Json(RatelimitInformation::Failure { + retry_after: ratelimiter.reset, + })), + } + } +} + +pub async fn ratelimit_middleware( + State(database): State, + State(ratelimit_storage): State, + request: Request, + next: Next, +) -> Response { + #[derive(axum::extract::FromRef)] + struct TempState { + database: Database, + ratelimit_storage: RatelimitStorage, + } + + let state = TempState { + database, + ratelimit_storage, + }; + + let (mut parts, body) = request.into_parts(); + + let res = Ratelimiter::from_request_parts(&mut parts, &state).await; + + let (Ok(ratelimiter) | Err(Json(ratelimiter))) = &res; + + let mut response = if res.is_ok() { + let request = Request::from_parts(parts, body); + + next.run(request).await + } else { + let ratelimit_info = RatelimitInformation::from_request_parts(&mut parts, &state).await; + + ratelimit_info.map(Json).into_response() + }; + + let Ratelimiter { + key, + limit, + remaining, + reset, + } = ratelimiter; + + let headers = response.headers_mut(); + + headers.insert( + "X-RateLimit-Limit", + HeaderValue::from_str(&limit.to_string()).unwrap(), + ); + headers.insert( + "X-RateLimit-Bucket", + HeaderValue::from_str(&key.to_string()).unwrap(), + ); + headers.insert( + "X-RateLimit-Remaining", + HeaderValue::from_str(&remaining.to_string()).unwrap(), + ); + headers.insert( + "X-RateLimit-Reset-After", + HeaderValue::from_str(&reset.to_string()).unwrap(), + ); + + if res.is_err() { + *response.status_mut() = StatusCode::TOO_MANY_REQUESTS; + }; + + response +} + +async fn ratelimit_info(info: RatelimitInformation) -> Json { + Json(info) +} + +pub fn routes() -> Router +where + Database: FromRef, + RatelimitStorage: FromRef, +{ + Router::new().route("/ratelimit", get(ratelimit_info)) +} diff --git a/crates/core/ratelimits/src/lib.rs b/crates/core/ratelimits/src/lib.rs new file mode 100644 index 000000000..5eaa81080 --- /dev/null +++ b/crates/core/ratelimits/src/lib.rs @@ -0,0 +1,7 @@ +pub mod ratelimiter; + +#[cfg(feature = "rocket")] +pub mod rocket; + +#[cfg(feature = "axum")] +pub mod axum; diff --git a/crates/core/ratelimits/src/ratelimiter.rs b/crates/core/ratelimits/src/ratelimiter.rs new file mode 100644 index 000000000..a232feb32 --- /dev/null +++ b/crates/core/ratelimits/src/ratelimiter.rs @@ -0,0 +1,145 @@ +use std::collections::hash_map::DefaultHasher; +use std::hash::Hasher; +use std::ops::Add; +use std::sync::Arc; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +use serde::Serialize; + +use dashmap::DashMap; + +pub trait RequestKind { + type R<'a>; +} + +pub trait RatelimitResolver: Send + Sync { + fn resolve_bucket<'a>(&self, request: &'a R) -> (&'a str, Option<&'a str>); + fn resolve_bucket_limit(&self, bucket: &str) -> u32; +} + +#[derive(Clone)] +pub struct RatelimitStorage { + pub resolver: Arc RatelimitResolver>>, + pub map: Arc>, +} + +impl RatelimitStorage { + pub fn new RatelimitResolver> + 'static>(resolver: R) -> Self { + Self { + resolver: Arc::new(resolver), + map: Arc::new(DashMap::new()), + } + } +} + +/// Ratelimit Bucket +#[derive(Clone, Copy, Debug)] +pub struct Entry { + used: u32, + reset: u128, +} + +/// Get the current time from Unix Epoch as a Duration +fn now() -> Duration { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Time went backwards...") +} + +impl Entry { + /// Find bucket by its key + pub fn from(map: &DashMap, key: u64) -> Entry { + map.get(&key).map(|x| *x).unwrap_or_else(|| Entry { + used: 0, + reset: now().add(Duration::from_secs(10)).as_millis(), + }) + } + + /// Deduct one unit from the bucket and save + pub fn deduct(&mut self) { + let current_time = now().as_millis(); + if current_time > self.reset { + self.used = 1; + self.reset = now().add(Duration::from_secs(10)).as_millis(); + } else { + self.used += 1; + } + } + + /// Save information + pub fn save(self, map: &DashMap, key: u64) { + map.insert(key, self); + } + + /// Get remaining units in the bucket + pub fn get_remaining(&self, limit: u32) -> u32 { + if now().as_millis() > self.reset { + limit + } else { + limit - self.used + } + } + + /// Get how long bucket has until reset + pub fn left_until_reset(&self) -> u128 { + let current_time = now().as_millis(); + self.reset.saturating_sub(current_time) + } +} + +/// Ratelimit Guard +#[derive(Serialize, Clone, Copy, Debug)] +#[allow(dead_code)] +pub struct Ratelimiter { + pub key: u64, + pub limit: u32, + pub remaining: u32, + pub reset: u128, +} + +impl Ratelimiter { + /// Generate guard from identifier and target bucket + pub fn from( + map: &DashMap, + identifier: &str, + limit: u32, + (bucket, resource): (&str, Option<&str>), + ) -> Result { + let mut key = DefaultHasher::new(); + key.write(identifier.as_bytes()); + key.write(bucket.as_bytes()); + + if let Some(id) = resource { + key.write(id.as_bytes()); + } + + let key = key.finish(); + let mut entry = Entry::from(map, key); + + let remaining = entry.get_remaining(limit); + let reset = entry.left_until_reset(); + let mut ratelimiter = Ratelimiter { + key, + limit, + remaining, + reset, + }; + if remaining == 0 { + return Err(ratelimiter); + } + + entry.deduct(); + entry.save(map, key); + ratelimiter.remaining -= 1; + ratelimiter.reset = entry.left_until_reset(); + + Ok(ratelimiter) + } +} + +#[derive(Serialize)] +#[serde(untagged)] +pub enum RatelimitInformation { + Success(Ratelimiter), + Failure { retry_after: u128 }, +} diff --git a/crates/core/ratelimits/src/rocket.rs b/crates/core/ratelimits/src/rocket.rs new file mode 100644 index 000000000..a006f3c20 --- /dev/null +++ b/crates/core/ratelimits/src/rocket.rs @@ -0,0 +1,140 @@ +use async_trait::async_trait; +use log::info; +use rocket::fairing::{Fairing, Info, Kind}; +use rocket::http::uri::Origin; +use rocket::http::{Method, Status}; +use rocket::request::{FromRequest, Outcome}; +use rocket::serde::json::Json; +use rocket::{Data, Request, Response, State}; + +use revolt_rocket_okapi::r#gen::OpenApiGenerator; +use revolt_rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput}; +use revolt_database::{Session, util::ip::rocket::to_real_ip}; + +use crate::ratelimiter::RequestKind; +use crate::ratelimiter::{RatelimitInformation, Ratelimiter}; + +#[derive(Clone, Copy)] +pub struct RocketRequestKind; + +impl RequestKind for RocketRequestKind { + type R<'a> = Request<'a>; +} + +pub type RatelimitStorage = crate::ratelimiter::RatelimitStorage; + +#[async_trait] +impl<'r> FromRequest<'r> for Ratelimiter { + type Error = Ratelimiter; + + async fn from_request<'a>(request: &'r rocket::Request<'a>) -> Outcome { + let ratelimiter = request + .local_cache_async(async { + use rocket::outcome::Outcome; + + let storage = request.guard::<&State>().await.unwrap(); + + let identifier = if let Outcome::Success(session) = request.guard::().await + { + session.id + } else { + to_real_ip(request).await + }; + + let (bucket, resource) = storage.resolver.resolve_bucket(request); + let limit = storage.resolver.resolve_bucket_limit(bucket); + + Ratelimiter::from(&storage.map, &identifier, limit, (bucket, resource)) + }) + .await; + + match ratelimiter { + Ok(ratelimiter) => Outcome::Success(*ratelimiter), + Err(ratelimiter) => Outcome::Error((Status::TooManyRequests, *ratelimiter)), + } + } +} + +impl OpenApiFromRequest<'_> for Ratelimiter { + fn from_request_input( + _gen: &mut OpenApiGenerator, + _name: String, + _required: bool, + ) -> revolt_rocket_okapi::Result { + Ok(RequestHeaderInput::None) + } +} + +/// Attach ratelimiter to the Rocket application +pub struct RatelimitFairing; + +#[async_trait] +impl Fairing for RatelimitFairing { + fn info(&self) -> Info { + Info { + name: "Ratelimiter", + kind: Kind::Request | Kind::Response, + } + } + + async fn on_request(&self, request: &mut Request<'_>, _: &mut Data<'_>) { + use rocket::outcome::Outcome; + if let Outcome::Error(_) = request.guard::().await { + info!( + "User rate-limited on route {}! (IP = {:?})", + request.uri(), + to_real_ip(request).await + ); + + request.set_method(Method::Get); + request.set_uri(Origin::parse("/ratelimit").unwrap()) + } + } + + async fn on_response<'r>(&self, request: &'r Request<'_>, response: &mut Response<'r>) { + let guard = request.guard::().await; + let (Outcome::Success(ratelimiter) | Outcome::Error((_, ratelimiter))) = guard else { + unreachable!() + }; + let Ratelimiter { + key, + limit, + remaining, + reset, + } = ratelimiter; + + response.set_raw_header("X-RateLimit-Limit", limit.to_string()); + response.set_raw_header("X-RateLimit-Bucket", key.to_string()); + response.set_raw_header("X-RateLimit-Remaining", remaining.to_string()); + response.set_raw_header("X-RateLimit-Reset-After", reset.to_string()); + + if guard.is_error() { + response.set_status(Status::TooManyRequests); + } + } +} + +#[async_trait] +impl<'r> FromRequest<'r> for RatelimitInformation { + type Error = u128; + + async fn from_request(request: &'r rocket::Request<'_>) -> Outcome { + let info = match request.guard::().await { + Outcome::Success(ratelimiter) => RatelimitInformation::Success(ratelimiter), + Outcome::Error((_, ratelimiter)) => RatelimitInformation::Failure { + retry_after: ratelimiter.reset, + }, + _ => unreachable!(), + }; + Outcome::Success(info) + } +} + +#[rocket::get("/ratelimit")] +fn ratelimit_info(info: RatelimitInformation) -> Json { + Json(info) +} + +pub fn routes() -> Vec { + rocket::routes![ratelimit_info] +} diff --git a/crates/core/result/Cargo.toml b/crates/core/result/Cargo.toml index 3a25d206f..9cc5db3f7 100644 --- a/crates/core/result/Cargo.toml +++ b/crates/core/result/Cargo.toml @@ -1,10 +1,11 @@ [package] name = "revolt-result" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "MIT" authors = ["Paul Makles "] description = "Revolt Backend: Result and Error types" +repository = "https://github.com/stoatchat/stoatchat" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -15,22 +16,27 @@ utoipa = ["dep:utoipa"] rocket = ["dep:rocket", "dep:serde_json"] axum = ["dep:axum", "dep:serde_json"] okapi = ["dep:revolt_rocket_okapi", "dep:revolt_okapi", "schemas"] +sentry = ["dep:sentry"] -default = ["serde"] +default = ["serde", "sentry"] [dependencies] # Serialisation -serde_json = { version = "1", optional = true } -serde = { version = "1", features = ["derive"], optional = true } +serde_json = { workspace = true, optional = true } +serde = { workspace = true, optional = true } # Spec Generation -schemars = { version = "0.8.8", optional = true } -utoipa = { version = "4.2.3", optional = true } +schemars = { workspace = true, optional = true } +utoipa = { workspace = true, optional = true } # Rocket -rocket = { optional = true, version = "0.5.0-rc.2", default-features = false } -revolt_rocket_okapi = { version = "0.10.0", optional = true } -revolt_okapi = { version = "0.9.1", optional = true } +rocket = { workspace = true, optional = true } +revolt_rocket_okapi = { workspace = true, optional = true } +revolt_okapi = { workspace = true, optional = true } +# utilities +log = { workspace = true } # Axum -axum = { version = "0.7.5", optional = true } +axum = { workspace = true, optional = true } + +sentry = { workspace = true, optional = true } diff --git a/crates/core/result/src/axum.rs b/crates/core/result/src/axum.rs index e4caf8183..50df61502 100644 --- a/crates/core/result/src/axum.rs +++ b/crates/core/result/src/axum.rs @@ -1,4 +1,8 @@ -use axum::{http::StatusCode, response::IntoResponse, Json}; +use axum::{ + http::{header, StatusCode}, + response::IntoResponse, + Json, +}; use crate::{Error, ErrorType}; @@ -24,6 +28,7 @@ impl IntoResponse for Error { ErrorType::UnknownChannel => StatusCode::NOT_FOUND, ErrorType::UnknownMessage => StatusCode::NOT_FOUND, ErrorType::UnknownAttachment => StatusCode::BAD_REQUEST, + ErrorType::CannotDeleteMessage => StatusCode::FORBIDDEN, ErrorType::CannotEditMessage => StatusCode::FORBIDDEN, ErrorType::CannotJoinCall => StatusCode::BAD_REQUEST, ErrorType::TooManyAttachments { .. } => StatusCode::BAD_REQUEST, @@ -36,7 +41,9 @@ impl IntoResponse for Error { ErrorType::NotInGroup => StatusCode::NOT_FOUND, ErrorType::AlreadyPinned => StatusCode::BAD_REQUEST, ErrorType::NotPinned => StatusCode::BAD_REQUEST, + ErrorType::InSlowmode { retry_after: _ } => StatusCode::TOO_MANY_REQUESTS, + ErrorType::CantCreateServers => StatusCode::FORBIDDEN, ErrorType::UnknownServer => StatusCode::NOT_FOUND, ErrorType::InvalidRole => StatusCode::NOT_FOUND, ErrorType::Banned => StatusCode::FORBIDDEN, @@ -62,6 +69,7 @@ impl IntoResponse for Error { ErrorType::NotPrivileged => StatusCode::FORBIDDEN, ErrorType::CannotGiveMissingPermissions => StatusCode::FORBIDDEN, ErrorType::NotOwner => StatusCode::FORBIDDEN, + ErrorType::IsElevated => StatusCode::FORBIDDEN, ErrorType::DatabaseError { .. } => StatusCode::INTERNAL_SERVER_ERROR, ErrorType::InternalError => StatusCode::INTERNAL_SERVER_ERROR, @@ -73,8 +81,13 @@ impl IntoResponse for Error { ErrorType::DuplicateNonce => StatusCode::CONFLICT, ErrorType::VosoUnavailable => StatusCode::BAD_REQUEST, ErrorType::NotFound => StatusCode::NOT_FOUND, - ErrorType::NoEffect => StatusCode::OK, + ErrorType::NoEffect => StatusCode::BAD_REQUEST, ErrorType::FailedValidation { .. } => StatusCode::BAD_REQUEST, + ErrorType::LiveKitUnavailable => StatusCode::BAD_REQUEST, + ErrorType::NotConnected => StatusCode::BAD_REQUEST, + ErrorType::NotAVoiceChannel => StatusCode::BAD_REQUEST, + ErrorType::AlreadyConnected => StatusCode::BAD_REQUEST, + ErrorType::UnknownNode => StatusCode::BAD_REQUEST, ErrorType::InvalidFlagValue => StatusCode::BAD_REQUEST, ErrorType::FeatureDisabled { .. } => StatusCode::BAD_REQUEST, @@ -84,6 +97,29 @@ impl IntoResponse for Error { ErrorType::FileTypeNotAllowed => StatusCode::BAD_REQUEST, ErrorType::ImageProcessingFailed => StatusCode::INTERNAL_SERVER_ERROR, ErrorType::NoEmbedData => StatusCode::BAD_REQUEST, + ErrorType::RenderFail => StatusCode::INTERNAL_SERVER_ERROR, + ErrorType::MissingHeaders => StatusCode::BAD_REQUEST, + ErrorType::CaptchaFailed => StatusCode::BAD_REQUEST, + ErrorType::BlockedByShield => StatusCode::BAD_REQUEST, + ErrorType::UnverifiedAccount => StatusCode::FORBIDDEN, + ErrorType::EmailFailed => StatusCode::INTERNAL_SERVER_ERROR, + ErrorType::InvalidToken => StatusCode::UNAUTHORIZED, + ErrorType::MissingInvite => StatusCode::BAD_REQUEST, + ErrorType::InvalidInvite => StatusCode::BAD_REQUEST, + ErrorType::CompromisedPassword => StatusCode::BAD_REQUEST, + ErrorType::ShortPassword => StatusCode::BAD_REQUEST, + ErrorType::Blacklisted => { + return ( + StatusCode::UNAUTHORIZED, + [(header::CONTENT_TYPE, "application/json")], + "{\"type\":\"DisallowedContactSupport\", \"note\":\"If you see this messages right here, you're probably doing something you shouldn't be.\"}" + ).into_response() + } + ErrorType::LockedOut => StatusCode::FORBIDDEN, + ErrorType::TotpAlreadyEnabled => StatusCode::BAD_REQUEST, + ErrorType::DisallowedMFAMethod => StatusCode::BAD_REQUEST, + ErrorType::OperationFailed => StatusCode::INTERNAL_SERVER_ERROR, + ErrorType::IncorrectData { .. } => StatusCode::BAD_REQUEST, }; (status, Json(&self)).into_response() diff --git a/crates/core/result/src/lib.rs b/crates/core/result/src/lib.rs index 10b56d5d4..abf829b28 100644 --- a/crates/core/result/src/lib.rs +++ b/crates/core/result/src/lib.rs @@ -1,4 +1,5 @@ use std::fmt::Display; +use std::panic::Location; #[cfg(feature = "serde")] #[macro_use] @@ -77,6 +78,7 @@ pub enum ErrorType { UnknownChannel, UnknownAttachment, UnknownMessage, + CannotDeleteMessage, CannotEditMessage, CannotJoinCall, TooManyAttachments { @@ -101,8 +103,12 @@ pub enum ErrorType { NotInGroup, AlreadyPinned, NotPinned, + InSlowmode { + retry_after: u64, + }, // ? Server related errors + CantCreateServers, UnknownServer, InvalidRole, Banned, @@ -138,6 +144,7 @@ pub enum ErrorType { NotPrivileged, CannotGiveMissingPermissions, NotOwner, + IsElevated, // ? General errors DatabaseError { @@ -157,7 +164,17 @@ pub enum ErrorType { FailedValidation { error: String, }, + OperationFailed, + IncorrectData { + with: String, + }, + // ? Voice errors + LiveKitUnavailable, + NotAVoiceChannel, + AlreadyConnected, + NotConnected, + UnknownNode, // ? Micro-service errors ProxyError, FileTooSmall, @@ -175,6 +192,25 @@ pub enum ErrorType { FeatureDisabled { feature: String, }, + + // ? Authentication + RenderFail, + MissingHeaders, + CaptchaFailed, + BlockedByShield, + UnverifiedAccount, + EmailFailed, + InvalidToken, + MissingInvite, + InvalidInvite, + + CompromisedPassword, + ShortPassword, + Blacklisted, + LockedOut, + + TotpAlreadyEnabled, + DisallowedMFAMethod, } #[macro_export] @@ -197,6 +233,58 @@ macro_rules! create_database_error { }; } +#[macro_export] +#[cfg(debug_assertions)] +macro_rules! query { + ( $self: ident, $type: ident, $collection: expr, $($rest:expr),+ ) => { + Ok($self.$type($collection, $($rest),+).await.unwrap()) + }; +} + +#[macro_export] +#[cfg(not(debug_assertions))] +macro_rules! query { + ( $self: ident, $type: ident, $collection: expr, $($rest:expr),+ ) => { + $self.$type($collection, $($rest),+).await + .map_err(|_| create_database_error!(stringify!($type), $collection)) + }; +} + +pub trait ToRevoltError { + #[track_caller] + fn to_internal_error(self) -> Result; +} + +impl ToRevoltError for Result { + #[track_caller] + fn to_internal_error(self) -> Result { + let loc = Location::caller(); + + self.map_err(|e| { + log::error!("{e:?}"); + #[cfg(feature = "sentry")] + sentry::capture_error(&e); + + Error { + error_type: ErrorType::InternalError, + location: format!("{}:{}:{}", loc.file(), loc.line(), loc.column()), + } + }) + } +} + +impl ToRevoltError for Option { + #[track_caller] + fn to_internal_error(self) -> Result { + let loc = Location::caller(); + + self.ok_or_else(|| Error { + error_type: ErrorType::InternalError, + location: format!("{}:{}:{}", loc.file(), loc.line(), loc.column()), + }) + } +} + #[cfg(test)] mod tests { use crate::ErrorType; diff --git a/crates/core/result/src/rocket.rs b/crates/core/result/src/rocket.rs index 1d996a173..796ae89df 100644 --- a/crates/core/result/src/rocket.rs +++ b/crates/core/result/src/rocket.rs @@ -30,6 +30,7 @@ impl<'r> Responder<'r, 'static> for Error { ErrorType::UnknownChannel => Status::NotFound, ErrorType::UnknownMessage => Status::NotFound, ErrorType::UnknownAttachment => Status::BadRequest, + ErrorType::CannotDeleteMessage => Status::Forbidden, ErrorType::CannotEditMessage => Status::Forbidden, ErrorType::CannotJoinCall => Status::BadRequest, ErrorType::TooManyAttachments { .. } => Status::BadRequest, @@ -42,8 +43,10 @@ impl<'r> Responder<'r, 'static> for Error { ErrorType::NotInGroup => Status::NotFound, ErrorType::AlreadyPinned => Status::BadRequest, ErrorType::NotPinned => Status::BadRequest, + ErrorType::InSlowmode { retry_after: _ } => Status::TooManyRequests, ErrorType::InvalidFlagValue => Status::BadRequest, + ErrorType::CantCreateServers => Status::Forbidden, ErrorType::UnknownServer => Status::NotFound, ErrorType::InvalidRole => Status::NotFound, ErrorType::Banned => Status::Forbidden, @@ -69,6 +72,7 @@ impl<'r> Responder<'r, 'static> for Error { ErrorType::NotPrivileged => Status::Forbidden, ErrorType::CannotGiveMissingPermissions => Status::Forbidden, ErrorType::NotOwner => Status::Forbidden, + ErrorType::IsElevated => Status::Forbidden, ErrorType::DatabaseError { .. } => Status::InternalServerError, ErrorType::InternalError => Status::InternalServerError, @@ -78,10 +82,14 @@ impl<'r> Responder<'r, 'static> for Error { ErrorType::InvalidSession => Status::Unauthorized, ErrorType::NotAuthenticated => Status::Unauthorized, ErrorType::DuplicateNonce => Status::Conflict, - ErrorType::VosoUnavailable => Status::BadRequest, ErrorType::NotFound => Status::NotFound, - ErrorType::NoEffect => Status::Ok, + ErrorType::NoEffect => Status::BadRequest, ErrorType::FailedValidation { .. } => Status::BadRequest, + ErrorType::LiveKitUnavailable => Status::BadRequest, + ErrorType::NotAVoiceChannel => Status::BadRequest, + ErrorType::AlreadyConnected => Status::BadRequest, + ErrorType::NotConnected => Status::BadRequest, + ErrorType::UnknownNode => Status::BadRequest, ErrorType::FeatureDisabled { .. } => Status::BadRequest, ErrorType::ProxyError => Status::BadRequest, @@ -90,6 +98,33 @@ impl<'r> Responder<'r, 'static> for Error { ErrorType::FileTypeNotAllowed => Status::BadRequest, ErrorType::ImageProcessingFailed => Status::InternalServerError, ErrorType::NoEmbedData => Status::BadRequest, + ErrorType::VosoUnavailable => Status::BadRequest, + + ErrorType::RenderFail => Status::InternalServerError, + ErrorType::MissingHeaders => Status::BadRequest, + ErrorType::CaptchaFailed => Status::BadRequest, + ErrorType::BlockedByShield => Status::BadRequest, + ErrorType::UnverifiedAccount => Status::Forbidden, + ErrorType::EmailFailed => Status::InternalServerError, + ErrorType::InvalidToken => Status::Unauthorized, + ErrorType::MissingInvite => Status::BadRequest, + ErrorType::InvalidInvite => Status::BadRequest, + ErrorType::CompromisedPassword => Status::BadRequest, + ErrorType::ShortPassword => Status::BadRequest, + ErrorType::Blacklisted => { + // Fail blacklisted email addresses. + const RESP: &str = "{\"type\":\"DisallowedContactSupport\", \"note\":\"If you see this messages right here, you're probably doing something you shouldn't be.\"}"; + + return Response::build() + .status(Status::Unauthorized) + .sized_body(RESP.len(), std::io::Cursor::new(RESP)) + .ok(); + } + ErrorType::LockedOut => Status::Forbidden, + ErrorType::TotpAlreadyEnabled => Status::BadRequest, + ErrorType::DisallowedMFAMethod => Status::BadRequest, + ErrorType::OperationFailed => Status::InternalServerError, + ErrorType::IncorrectData { .. } => Status::BadRequest, }; // Serialize the error data structure into JSON. diff --git a/crates/daemons/crond/Cargo.toml b/crates/daemons/crond/Cargo.toml index 2c55f2f76..75dc2c4e3 100644 --- a/crates/daemons/crond/Cargo.toml +++ b/crates/daemons/crond/Cargo.toml @@ -1,22 +1,38 @@ [package] name = "revolt-crond" -version = "0.8.8" +version = "0.13.7" license = "AGPL-3.0-or-later" authors = ["Paul Makles "] edition = "2021" description = "Revolt Daemon Service: Timed data clean up tasks" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] # Utility -log = "0.4" +log = { workspace = true } # Async -tokio = { version = "1" } +tokio = { workspace = true } +futures = { workspace = true } + +# Redis +redis-kiss = { workspace = true, default-features = false, features = ["tokio-runtime"] } + +# RabbitMQ +lapin = { workspace = true } +futures-lite = { workspace = true } + +# Processing +serde_json = { workspace = true } +revolt_optional_struct = { workspace = true } +serde = { workspace = true } +iso8601-timestamp = { workspace = true, features = ["serde", "bson"] } # Core -revolt-database = { version = "0.8.8", path = "../../core/database" } -revolt-result = { version = "0.8.8", path = "../../core/result" } -revolt-config = { version = "0.8.8", path = "../../core/config" } -revolt-files = { version = "0.8.8", path = "../../core/files" } +revolt-database = { workspace = true } +revolt-result = { workspace = true } +revolt-config = { workspace = true } +revolt-files = { workspace = true } +revolt-permissions = { workspace = true } diff --git a/crates/daemons/crond/Dockerfile b/crates/daemons/crond/Dockerfile index 8a4c915a9..f18524573 100644 --- a/crates/daemons/crond/Dockerfile +++ b/crates/daemons/crond/Dockerfile @@ -1,10 +1,11 @@ # Build Stage -FROM ghcr.io/revoltchat/base:latest AS builder +FROM ghcr.io/stoatchat/base:latest AS builder FROM debian:12 AS debian # Bundle Stage FROM gcr.io/distroless/cc-debian12:nonroot COPY --from=builder /home/rust/src/target/release/revolt-crond ./ +COPY --from=debian /usr/bin/uname /usr/bin/uname USER nonroot CMD ["./revolt-crond"] \ No newline at end of file diff --git a/crates/daemons/crond/src/main.rs b/crates/daemons/crond/src/main.rs index b232a10a6..af1ed7f2a 100644 --- a/crates/daemons/crond/src/main.rs +++ b/crates/daemons/crond/src/main.rs @@ -1,20 +1,51 @@ -use revolt_config::configure; -use revolt_database::DatabaseInfo; +use std::{future::Future, panic::AssertUnwindSafe, time::Duration}; + +use futures::FutureExt; +use revolt_config::{capture_error, configure}; +use revolt_database::{Database, DatabaseInfo, AMQP}; use revolt_result::Result; -use tasks::{file_deletion, prune_dangling_files, prune_members}; -use tokio::try_join; +use tasks::*; +use tokio::{join, time::sleep}; pub mod tasks; +pub async fn cron_task_wrapper>>( + func: fn(Database, AMQP) -> Fut, + db: Database, + amqp: AMQP, +) { + loop { + let wrapper = AssertUnwindSafe(func(db.clone(), amqp.clone())); + + match wrapper.catch_unwind().await { + Ok(Ok(())) => { + log::error!("cron unexpectedly finshed, Retrying after 60s"); + } + Ok(Err(error)) => { + log::error!("cron task failed unexpectedly: {error:?}\nRetrying after 60s"); + capture_error(&error); + } + _ => { + log::error!("cron task failed unexpectedly\nRetrying after 60s"); + } + } + + sleep(Duration::from_secs(60)).await; + } +} + #[tokio::main] -async fn main() -> Result<()> { +async fn main() { configure!(crond); let db = DatabaseInfo::Auto.connect().await.expect("database"); - try_join!( - file_deletion::task(db.clone()), - prune_dangling_files::task(db.clone()), - prune_members::task(db.clone()) - ) - .map(|_| ()) + let amqp = AMQP::new_auto().await; + + join!( + cron_task_wrapper(file_deletion::task, db.clone(), amqp.clone()), + cron_task_wrapper(prune_dangling_files::task, db.clone(), amqp.clone()), + cron_task_wrapper(prune_members::task, db.clone(), amqp.clone()), + cron_task_wrapper(delete_accounts::task, db.clone(), amqp.clone()), + cron_task_wrapper(acks::task, db.clone(), amqp.clone()), + ); } diff --git a/crates/daemons/crond/src/tasks/acks.rs b/crates/daemons/crond/src/tasks/acks.rs new file mode 100644 index 000000000..7576bac9b --- /dev/null +++ b/crates/daemons/crond/src/tasks/acks.rs @@ -0,0 +1,164 @@ +use futures_lite::stream::StreamExt; +use lapin::{ + options::*, + types::FieldTable, + uri::{AMQPAuthority, AMQPQueryString, AMQPUri, AMQPUserInfo}, + ConnectionBuilder, ConnectionProperties, ExchangeKind, +}; +use log::{debug, info}; +use redis_kiss::{get_connection, AsyncCommands, Conn as RedisConnection}; +use revolt_config::config; +use revolt_database::{events::rabbit::AckEventPayload, Database, AMQP}; +use revolt_result::{Result, ToRevoltError}; +use serde_json; + +pub async fn task(db: Database, amqp: AMQP) -> Result<()> { + let config = config().await; + + let mut redis = get_connection() + .await + .expect("Failed to get redis connection"); + + let uri = AMQPUri { + scheme: lapin::uri::AMQPScheme::AMQP, + authority: AMQPAuthority { + userinfo: AMQPUserInfo { + username: config.rabbit.username, + password: config.rabbit.password, + }, + host: config.rabbit.host, + port: config.rabbit.port, + }, + vhost: "/".to_string(), + query: AMQPQueryString::default(), + }; + + let connection = ConnectionBuilder::new() + .expect("Builder") + .with_uri(uri) + .with_properties(ConnectionProperties::default()) + .connect() + .await + .expect("Failed to connect to rabbitmq"); + + let reader_channel = connection + .create_channel() + .await + .expect("Failed to create channel"); + + reader_channel + .exchange_declare( + config.rabbit.default_exchange.clone().into(), + ExchangeKind::Topic, + ExchangeDeclareOptions { + durable: true, + ..Default::default() + }, + FieldTable::default(), + ) + .await + .expect("Failed to declare exchange"); + + reader_channel + .queue_declare( + config.rabbit.queues.acks.clone().into(), + QueueDeclareOptions { + durable: true, + ..Default::default() + }, + FieldTable::default(), + ) + .await + .expect("Failed to bind queue"); + + reader_channel + .queue_bind( + config.rabbit.queues.acks.clone().into(), + config.rabbit.default_exchange.into(), + config.rabbit.queues.acks.clone().into(), + QueueBindOptions::default(), + FieldTable::default(), + ) + .await + .expect("Failed to bind channel"); + + let mut consumer = reader_channel + .basic_consume( + config.rabbit.queues.acks.into(), + "crond-ack-consumer".into(), + BasicConsumeOptions::default(), + FieldTable::default(), + ) + .await + .expect("Failed to create consumer"); + + while let Some(delivery) = consumer.next().await { + if let Ok(delivery) = delivery { + let payload = serde_json::from_slice::(&delivery.data); + + if let Ok(payload) = payload { + debug!("Received ack event: {payload:?}"); + + if let Err(e) = process_channel_ack( + &db, + &amqp, + payload.user_id, + payload.channel_id.unwrap(), + &mut redis, + ) + .await + { + revolt_config::capture_error(&e); + _ = delivery.reject(BasicRejectOptions { requeue: false }).await; + } else { + _ = delivery.ack(BasicAckOptions { multiple: false }).await; + } + } else { + revolt_config::capture_message( + format!("Failed to decode ack data: {:?}", delivery.data).as_str(), + revolt_config::Level::Error, + ); + } + } + } + Ok(()) +} + +#[allow(clippy::disallowed_methods)] +async fn process_channel_ack( + db: &Database, + amqp: &AMQP, + user: String, + channel: String, + redis: &mut RedisConnection, +) -> Result<()> { + let message_id: Option = redis + .get_del(format!("acker:{user}+{channel}")) + .await + .to_internal_error()?; + + if let Some(message_id) = message_id { + let unread = db.fetch_unread(&user, &channel).await?; + let updated = db.acknowledge_message(&channel, &user, &message_id).await?; + + info!("Set new state for ack: {}:{}:{}", channel, user, message_id); + + if let (Some(before), Some(after)) = (unread, updated) { + let before_mentions = before.mentions.unwrap_or_default().len(); + let after_mentions = after.mentions.unwrap_or_default().len(); + + if after_mentions < before_mentions { + if let Err(err) = amqp + .ack_notification_message(user.to_string(), channel.to_string(), message_id) + .await + { + revolt_config::capture_error(&err); + } + }; + } + + Ok(()) + } else { + Err(message_id.to_internal_error().expect_err("no err")) + } +} diff --git a/crates/daemons/crond/src/tasks/delete_accounts.rs b/crates/daemons/crond/src/tasks/delete_accounts.rs new file mode 100644 index 000000000..78cd1810e --- /dev/null +++ b/crates/daemons/crond/src/tasks/delete_accounts.rs @@ -0,0 +1,23 @@ +use std::time::Duration; + +use revolt_database::Database; +use revolt_result::Result; +use tokio::time::sleep; + +pub async fn task(db: Database, _: revolt_database::AMQP) -> Result<()> { + loop { + let accounts = db.fetch_accounts_due_for_deletion().await?; + let count = accounts.len(); + + for mut account in accounts { + let mut user = db.fetch_user(&account.id).await?; + + user.delete(&db).await?; + account.mark_deleted(&db).await?; + } + + log::info!("Deleted {count} accounts."); + + sleep(Duration::from_hours(1)).await + } +} diff --git a/crates/daemons/crond/src/tasks/file_deletion.rs b/crates/daemons/crond/src/tasks/file_deletion.rs index 912173b3f..3629e1895 100644 --- a/crates/daemons/crond/src/tasks/file_deletion.rs +++ b/crates/daemons/crond/src/tasks/file_deletion.rs @@ -6,27 +6,25 @@ use revolt_files::delete_from_s3; use revolt_result::Result; use tokio::time::sleep; -pub async fn task(db: Database) -> Result<()> { +pub async fn task(db: Database, _: revolt_database::AMQP) -> Result<()> { loop { let files = db.fetch_deleted_attachments().await?; for file in files { - let count = db - .count_file_hash_references(file.hash.as_ref().expect("no `hash` present")) - .await?; - - // No other files reference this file on disk anymore - if count <= 1 { - let file_hash = db - .fetch_attachment_hash(file.hash.as_ref().expect("no `hash` present")) - .await?; - - // Delete from S3 - delete_from_s3(&file_hash.bucket_id, &file_hash.path).await?; - - // Delete the hash - db.delete_attachment_hash(&file_hash.id).await?; - info!("Deleted file hash {}", file_hash.id); + if let Some(hash) = &file.hash { + let count = db.count_file_hash_references(hash).await?; + + // No other files reference this file on disk anymore + if count <= 1 { + let file_hash = db.fetch_attachment_hash(hash).await?; + + // Delete from S3 + delete_from_s3(&file_hash.bucket_id, &file_hash.path).await?; + + // Delete the hash + db.delete_attachment_hash(&file_hash.id).await?; + info!("Deleted file hash {}", file_hash.id); + } } // Delete the file diff --git a/crates/daemons/crond/src/tasks/mod.rs b/crates/daemons/crond/src/tasks/mod.rs index 060f55d89..a1216d0c6 100644 --- a/crates/daemons/crond/src/tasks/mod.rs +++ b/crates/daemons/crond/src/tasks/mod.rs @@ -1,3 +1,6 @@ +pub mod delete_accounts; +pub mod acks; pub mod file_deletion; pub mod prune_dangling_files; pub mod prune_members; +pub mod prune_mfa_tickets; diff --git a/crates/daemons/crond/src/tasks/prune_dangling_files.rs b/crates/daemons/crond/src/tasks/prune_dangling_files.rs index be1eb6d6b..ad0fa56c1 100644 --- a/crates/daemons/crond/src/tasks/prune_dangling_files.rs +++ b/crates/daemons/crond/src/tasks/prune_dangling_files.rs @@ -6,7 +6,7 @@ use tokio::time::sleep; use log::info; -pub async fn task(db: Database) -> Result<()> { +pub async fn task(db: Database, _: revolt_database::AMQP) -> Result<()> { loop { // This could just be a single database query // ... but timestamps are inconsistently serialised diff --git a/crates/daemons/crond/src/tasks/prune_members.rs b/crates/daemons/crond/src/tasks/prune_members.rs index e21b7d732..658555672 100644 --- a/crates/daemons/crond/src/tasks/prune_members.rs +++ b/crates/daemons/crond/src/tasks/prune_members.rs @@ -5,7 +5,7 @@ use revolt_database::Database; use revolt_result::Result; use tokio::time::sleep; -pub async fn task(db: Database) -> Result<()> { +pub async fn task(db: Database, _: revolt_database::AMQP) -> Result<()> { loop { let success = db.remove_dangling_members().await; if let Err(s) = success { diff --git a/crates/daemons/crond/src/tasks/prune_mfa_tickets.rs b/crates/daemons/crond/src/tasks/prune_mfa_tickets.rs new file mode 100644 index 000000000..12dee62aa --- /dev/null +++ b/crates/daemons/crond/src/tasks/prune_mfa_tickets.rs @@ -0,0 +1,14 @@ +use std::time::Duration; + +use revolt_database::Database; +use revolt_result::Result; +use tokio::time::sleep; + +pub async fn task(db: Database) -> Result<()> { + loop { + let count = db.delete_expired_tickets().await?; + log::info!("Pruned {count} expired MFA tickets"); + + sleep(Duration::from_mins(5)).await + } +} diff --git a/crates/daemons/pushd/Cargo.toml b/crates/daemons/pushd/Cargo.toml index 40a280081..1942bfb90 100644 --- a/crates/daemons/pushd/Cargo.toml +++ b/crates/daemons/pushd/Cargo.toml @@ -1,42 +1,38 @@ [package] name = "revolt-pushd" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "AGPL-3.0-or-later" +publish = false [dependencies] -revolt-result = { version = "0.8.8", path = "../../core/result" } -revolt-config = { version = "0.8.8", path = "../../core/config", features = [ - "report-macros", - "anyhow" -] } -revolt-database = { version = "0.8.8", path = "../../core/database" } -revolt-models = { version = "0.8.8", path = "../../core/models", features = [ - "validator", -] } -revolt-presence = { version = "0.8.8", path = "../../core/presence", features = [ - "redis-is-patched", -] } +revolt-result = { workspace = true } +revolt-config = { workspace = true, features = ["report-macros", "anyhow"] } +revolt-database = { workspace = true } +revolt-models = { workspace = true, features = ["validator"] } +revolt-presence = { workspace = true, features = ["redis-is-patched"] } +revolt-parser = { workspace = true } -anyhow = { version = "1.0.98" } +anyhow = { workspace = true } -amqprs = { version = "1.7.0" } -fcm_v1 = "0.3.0" -web-push = "0.10.0" -isahc = { optional = true, version = "1.7", features = ["json"] } -revolt_a2 = { version = "0.10", default-features = false, features = ["ring"] } -tokio = "1.39.2" -async-trait = "0.1.81" -ulid = "1.0.0" +lapin = { workspace = true } +fcm_v1 = { workspace = true } +web-push = { workspace = true } +isahc = { workspace = true, features = ["json"], optional = true } +revolt_a2 = { workspace = true, features = ["ring"] } +redis-kiss = { workspace = true, default-features = false, features = ["tokio-runtime"] } +tokio = { workspace = true } +async-trait = { workspace = true } +ulid = { workspace = true } -authifier = "1.0.15" +log = { workspace = true } +pretty_env_logger = { workspace = true } -log = "0.4.11" -pretty_env_logger = "0.4.0" +regex = { workspace = true } #serialization -serde_json = "1" -revolt_optional_struct = "0.2.0" -serde = { version = "1", features = ["derive"] } -iso8601-timestamp = { version = "0.2.10", features = ["serde", "bson"] } -base64 = "0.22.1" +serde_json = { workspace = true } +revolt_optional_struct = { workspace = true } +serde = { workspace = true } +iso8601-timestamp = { workspace = true, features = ["serde", "bson"] } +base64 = { workspace = true } diff --git a/crates/daemons/pushd/Dockerfile b/crates/daemons/pushd/Dockerfile index 8123002a0..38bfbc0ee 100644 --- a/crates/daemons/pushd/Dockerfile +++ b/crates/daemons/pushd/Dockerfile @@ -1,5 +1,5 @@ # Build Stage -FROM ghcr.io/revoltchat/base:latest AS builder +FROM ghcr.io/stoatchat/base:latest AS builder FROM debian:12 AS debian # Bundle Stage diff --git a/crates/daemons/pushd/src/consumers/inbound/ack.rs b/crates/daemons/pushd/src/consumers/inbound/ack.rs index 77dd5d444..4c2730c7f 100644 --- a/crates/daemons/pushd/src/consumers/inbound/ack.rs +++ b/crates/daemons/pushd/src/consumers/inbound/ack.rs @@ -1,96 +1,66 @@ -use crate::consumers::inbound::internal::*; -use amqprs::{ - channel::{BasicPublishArguments, Channel}, - connection::Connection, - consumer::AsyncConsumer, - BasicProperties, Deliver, -}; +use std::sync::Arc; + +use crate::utils::Consumer; +use anyhow::Result; use async_trait::async_trait; +use lapin::{message::Delivery, Channel, Connection}; use revolt_database::{events::rabbit::*, Database}; +#[derive(Clone)] +#[allow(unused)] pub struct AckConsumer { - #[allow(dead_code)] db: Database, - authifier_db: authifier::Database, - conn: Option, - channel: Option, + connection: Arc, + channel: Arc, } -impl Channeled for AckConsumer { - fn get_connection(&self) -> Option<&Connection> { - if self.conn.is_none() { - None - } else { - Some(self.conn.as_ref().unwrap()) - } - } - - fn get_channel(&self) -> Option<&Channel> { - if self.channel.is_none() { - None - } else { - Some(self.channel.as_ref().unwrap()) +#[async_trait] +impl Consumer for AckConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { + Self { + db, + connection, + channel, } } - fn set_connection(&mut self, conn: Connection) { - self.conn = Some(conn); - } - - fn set_channel(&mut self, channel: Channel) { - self.channel = Some(channel) - } -} - -impl AckConsumer { - pub fn new(db: Database, authifier_db: authifier::Database) -> AckConsumer { - AckConsumer { - db, - authifier_db, - conn: None, - channel: None, - } + fn channel(&self) -> &Arc { + &self.channel } -} -#[allow(unused_variables)] -#[async_trait] -impl AsyncConsumer for AckConsumer { /// This consumer processes all acks the platform receives, and sends relevant badge updates to apple platforms. - async fn consume( - &mut self, - channel: &Channel, - deliver: Deliver, - basic_properties: BasicProperties, - content: Vec, - ) { - let content = String::from_utf8(content).unwrap(); - let payload: AckPayload = serde_json::from_str(content.as_str()).unwrap(); + async fn consume(&self, delivery: Delivery) -> Result<()> { + let payload: AckPayload = serde_json::from_slice(&delivery.data)?; // Step 1: fetch unreads and don't continue if there's no unreads - #[allow(clippy::disallowed_methods)] - let unreads = self.db.fetch_unread_mentions(&payload.user_id).await; + // #[allow(clippy::disallowed_methods)] debug!("Processing unreads for {:}", &payload.user_id); - if let Ok(u) = &unreads { + let unreads = if let Ok(u) = self.db.fetch_unread_mentions(&payload.user_id).await { if u.is_empty() { debug!( "Discarding unread task (no mentions found) for {:}", &payload.user_id ); - return; - } + return Ok(()); + }; + + u } else { - return; - } + return Ok(()); + }; - if let Ok(sessions) = self.authifier_db.find_sessions(&payload.user_id).await { + if let Ok(sessions) = self.db.fetch_sessions(&payload.user_id).await { let config = revolt_config::config().await; // Step 2: find any apple sessions, since we don't need to calculate this for anything else. // If there's no apple sessions, we can return early - let apple_sessions: Vec<&authifier::models::Session> = sessions - .iter() + let mut apple_sessions = sessions + .into_iter() .filter(|session| { if let Some(sub) = &session.subscription { sub.endpoint == "apn" @@ -98,19 +68,19 @@ impl AsyncConsumer for AckConsumer { false } }) - .collect(); + .peekable(); - if apple_sessions.is_empty() { + if apple_sessions.peek().is_none() { debug!( "Discarding unread task (no apn sessions found) for {:}", &payload.user_id ); - return; + return Ok(()); } // Step 3: calculate the actual mention count, since we have to send it out let mut mention_count = 0; - for u in &unreads.unwrap() { + for u in &unreads { mention_count += u.mentions.as_ref().unwrap().len() } @@ -123,26 +93,22 @@ impl AsyncConsumer for AckConsumer { token: session.subscription.as_ref().unwrap().auth.clone(), extras: Default::default(), }; - let raw_service_payload = serde_json::to_string(&service_payload); - - if let Ok(p) = raw_service_payload { - let args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.apn.queue.as_str(), - ) - .finish(); - - log::debug!( - "Publishing ack to apn session {}", - session.subscription.as_ref().unwrap().auth - ); - - publish_message(self, p.into(), args).await; - } else { - log::warn!("Failed to serialize ack badge update payload!"); - revolt_config::capture_error(&raw_service_payload.unwrap_err()); - } + let payload = serde_json::to_string(&service_payload)?; + + log::debug!( + "Publishing ack to apn session {}", + session.subscription.as_ref().unwrap().auth + ); + + self.publish_message( + payload.as_bytes(), + &config.pushd.exchange, + &config.pushd.apn.queue, + ) + .await?; } } + + Ok(()) } } diff --git a/crates/daemons/pushd/src/consumers/inbound/dm_call.rs b/crates/daemons/pushd/src/consumers/inbound/dm_call.rs new file mode 100644 index 000000000..d22e04435 --- /dev/null +++ b/crates/daemons/pushd/src/consumers/inbound/dm_call.rs @@ -0,0 +1,109 @@ +use std::{collections::HashMap, sync::Arc}; + +use crate::utils::Consumer; +use anyhow::Result; +use async_trait::async_trait; +use lapin::{message::Delivery, Channel, Connection}; +use log::debug; +use revolt_database::{events::rabbit::*, Database}; + +#[derive(Clone)] +#[allow(unused)] +pub struct DmCallConsumer { + db: Database, + connection: Arc, + channel: Arc, +} + +#[async_trait] +impl Consumer for DmCallConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { + Self { + db, + connection, + channel, + } + } + + fn channel(&self) -> &Arc { + &self.channel + } + + /// This consumer handles delegating messages into their respective platform queues. + async fn consume(&self, delivery: Delivery) -> Result<()> { + let _p: InternalDmCallPayload = serde_json::from_slice(&delivery.data)?; + let payload = _p.payload; + + debug!("Received dm call start/stop event"); + + let (revolt_database::Channel::DirectMessage { recipients, .. } + | revolt_database::Channel::Group { recipients, .. }) = + self.db.fetch_channel(&payload.channel_id).await? + else { + warn!( + "Discarding dm call start/stop event for non-dm/group channel {}", + payload.channel_id + ); + + return Ok(()); + }; + + let call_recipients = if let Some(user_recipients) = _p.recipients { + user_recipients + .into_iter() + .filter(|user_id| recipients.contains(user_id) && user_id != &payload.initiator_id) + .collect() + } else { + recipients + .into_iter() + .filter(|user_id| user_id != &payload.initiator_id) + .collect::>() + }; + + let config = revolt_config::config().await; + + for user_id in call_recipients { + if let Ok(sessions) = self.db.fetch_sessions(&user_id).await { + for session in sessions { + if let Some(sub) = session.subscription { + let mut sendable = PayloadToService { + notification: PayloadKind::DmCallStartEnd(payload.clone()), + token: sub.auth, + user_id: session.user_id, + session_id: session.id, + extras: HashMap::new(), + }; + + let routing_key = match sub.endpoint.as_str() { + "apn" => &config.pushd.apn.queue, + "fcm" => &config.pushd.fcm.queue, + endpoint => { + sendable.extras.insert("p256dh".to_string(), sub.p256dh); + sendable + .extras + .insert("endpoint".to_string(), endpoint.to_string()); + + &config.pushd.vapid.queue + } + }; + + let payload = serde_json::to_string(&sendable)?; + + self.publish_message( + payload.as_bytes(), + &config.pushd.exchange, + routing_key, + ) + .await?; + } + } + } + } + + Ok(()) + } +} diff --git a/crates/daemons/pushd/src/consumers/inbound/fr_accepted.rs b/crates/daemons/pushd/src/consumers/inbound/fr_accepted.rs index d525138c5..d98057e9d 100644 --- a/crates/daemons/pushd/src/consumers/inbound/fr_accepted.rs +++ b/crates/daemons/pushd/src/consumers/inbound/fr_accepted.rs @@ -1,74 +1,45 @@ -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; -use crate::consumers::inbound::internal::*; -use amqprs::{ - channel::{BasicPublishArguments, Channel}, - connection::Connection, - consumer::AsyncConsumer, - BasicProperties, Deliver, -}; +use crate::utils::Consumer; use anyhow::Result; use async_trait::async_trait; +use lapin::{message::Delivery, Channel, Connection}; use log::debug; use revolt_database::{events::rabbit::*, Database}; +#[derive(Clone)] +#[allow(unused)] pub struct FRAcceptedConsumer { - #[allow(dead_code)] db: Database, - authifier_db: authifier::Database, - conn: Option, - channel: Option, + connection: Arc, + channel: Arc, } -impl Channeled for FRAcceptedConsumer { - fn get_connection(&self) -> Option<&Connection> { - if self.conn.is_none() { - None - } else { - Some(self.conn.as_ref().unwrap()) - } - } - - fn get_channel(&self) -> Option<&Channel> { - if self.channel.is_none() { - None - } else { - Some(self.channel.as_ref().unwrap()) +#[async_trait] +impl Consumer for FRAcceptedConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { + Self { + db, + connection, + channel, } } - fn set_connection(&mut self, conn: Connection) { - self.conn = Some(conn); + fn channel(&self) -> &Arc { + &self.channel } - fn set_channel(&mut self, channel: Channel) { - self.channel = Some(channel) - } -} - -impl FRAcceptedConsumer { - pub fn new(db: Database, authifier_db: authifier::Database) -> FRAcceptedConsumer { - FRAcceptedConsumer { - db, - authifier_db, - conn: None, - channel: None, - } - } - - async fn consume_event( - &mut self, - _channel: &Channel, - _deliver: Deliver, - _basic_properties: BasicProperties, - content: Vec, - ) -> Result<()> { - let content = String::from_utf8(content)?; - let payload: FRAcceptedPayload = serde_json::from_str(content.as_str())?; + /// This consumer handles delegating messages into their respective platform queues. + async fn consume(&self, delivery: Delivery) -> Result<()> { + let payload: FRAcceptedPayload = serde_json::from_slice(&delivery.data)?; debug!("Received FR accept event"); - if let Ok(sessions) = self.authifier_db.find_sessions(&payload.user).await { + if let Ok(sessions) = self.db.fetch_sessions(&payload.user).await { let config = revolt_config::config().await; for session in sessions { if let Some(sub) = session.subscription { @@ -80,36 +51,23 @@ impl FRAcceptedConsumer { extras: HashMap::new(), }; - let args: BasicPublishArguments; - - if sub.endpoint == "apn" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.apn.queue.as_str(), - ) - .finish(); - } else if sub.endpoint == "fcm" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.fcm.queue.as_str(), - ) - .finish(); - } else { - // web push (vapid) - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.vapid.queue.as_str(), - ) - .finish(); - sendable.extras.insert("p265dh".to_string(), sub.p256dh); - sendable - .extras - .insert("endpoint".to_string(), sub.endpoint.clone()); - } + let routing_key = match sub.endpoint.as_str() { + "apn" => &config.pushd.apn.queue, + "fcm" => &config.pushd.fcm.queue, + endpoint => { + sendable.extras.insert("p256dh".to_string(), sub.p256dh); + sendable + .extras + .insert("endpoint".to_string(), endpoint.to_string()); + + &config.pushd.vapid.queue + } + }; let payload = serde_json::to_string(&sendable)?; - publish_message(self, payload.into(), args).await; + self.publish_message(payload.as_bytes(), &config.pushd.exchange, routing_key) + .await?; } } } @@ -117,24 +75,3 @@ impl FRAcceptedConsumer { Ok(()) } } - -#[allow(unused_variables)] -#[async_trait] -impl AsyncConsumer for FRAcceptedConsumer { - /// This consumer handles delegating messages into their respective platform queues. - async fn consume( - &mut self, - channel: &Channel, - deliver: Deliver, - basic_properties: BasicProperties, - content: Vec, - ) { - if let Err(err) = self - .consume_event(channel, deliver, basic_properties, content) - .await - { - revolt_config::capture_anyhow(&err); - eprintln!("Failed to process friend request accepted event: {err:?}"); - } - } -} diff --git a/crates/daemons/pushd/src/consumers/inbound/fr_received.rs b/crates/daemons/pushd/src/consumers/inbound/fr_received.rs index f64bc92b8..428aeb207 100644 --- a/crates/daemons/pushd/src/consumers/inbound/fr_received.rs +++ b/crates/daemons/pushd/src/consumers/inbound/fr_received.rs @@ -1,74 +1,45 @@ -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; -use crate::consumers::inbound::internal::*; -use amqprs::{ - channel::{BasicPublishArguments, Channel}, - connection::Connection, - consumer::AsyncConsumer, - BasicProperties, Deliver, -}; +use crate::utils::Consumer; use anyhow::Result; use async_trait::async_trait; +use lapin::{message::Delivery, Channel, Connection}; use log::debug; use revolt_database::{events::rabbit::*, Database}; +#[derive(Clone)] +#[allow(unused)] pub struct FRReceivedConsumer { - #[allow(dead_code)] db: Database, - authifier_db: authifier::Database, - conn: Option, - channel: Option, + connection: Arc, + channel: Arc, } -impl Channeled for FRReceivedConsumer { - fn get_connection(&self) -> Option<&Connection> { - if self.conn.is_none() { - None - } else { - Some(self.conn.as_ref().unwrap()) - } - } - - fn get_channel(&self) -> Option<&Channel> { - if self.channel.is_none() { - None - } else { - Some(self.channel.as_ref().unwrap()) +#[async_trait] +impl Consumer for FRReceivedConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { + Self { + db, + connection, + channel, } } - fn set_connection(&mut self, conn: Connection) { - self.conn = Some(conn); + fn channel(&self) -> &Arc { + &self.channel } - fn set_channel(&mut self, channel: Channel) { - self.channel = Some(channel) - } -} - -impl FRReceivedConsumer { - pub fn new(db: Database, authifier_db: authifier::Database) -> FRReceivedConsumer { - FRReceivedConsumer { - db, - authifier_db, - conn: None, - channel: None, - } - } - - async fn consume_event( - &mut self, - _channel: &Channel, - _deliver: Deliver, - _basic_properties: BasicProperties, - content: Vec, - ) -> Result<()> { - let content = String::from_utf8(content)?; - let payload: FRReceivedPayload = serde_json::from_str(content.as_str())?; + /// This consumer handles delegating messages into their respective platform queues. + async fn consume(&self, delivery: Delivery) -> Result<()> { + let payload: FRReceivedPayload = serde_json::from_slice(&delivery.data)?; debug!("Received FR received event"); - if let Ok(sessions) = self.authifier_db.find_sessions(&payload.user).await { + if let Ok(sessions) = self.db.fetch_sessions(&payload.user).await { let config = revolt_config::config().await; for session in sessions { if let Some(sub) = session.subscription { @@ -80,36 +51,23 @@ impl FRReceivedConsumer { extras: HashMap::new(), }; - let args: BasicPublishArguments; - - if sub.endpoint == "apn" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.apn.queue.as_str(), - ) - .finish(); - } else if sub.endpoint == "fcm" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.fcm.queue.as_str(), - ) - .finish(); - } else { - // web push (vapid) - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.vapid.queue.as_str(), - ) - .finish(); - sendable.extras.insert("p265dh".to_string(), sub.p256dh); - sendable - .extras - .insert("endpoint".to_string(), sub.endpoint.clone()); - } + let routing_key = match sub.endpoint.as_str() { + "apn" => &config.pushd.apn.queue, + "fcm" => &config.pushd.fcm.queue, + endpoint => { + sendable.extras.insert("p256dh".to_string(), sub.p256dh); + sendable + .extras + .insert("endpoint".to_string(), endpoint.to_string()); + + &config.pushd.vapid.queue + } + }; let payload = serde_json::to_string(&sendable)?; - publish_message(self, payload.into(), args).await; + self.publish_message(payload.as_bytes(), &config.pushd.exchange, routing_key) + .await?; } } } @@ -117,24 +75,3 @@ impl FRReceivedConsumer { Ok(()) } } - -#[allow(unused_variables)] -#[async_trait] -impl AsyncConsumer for FRReceivedConsumer { - /// This consumer handles delegating messages into their respective platform queues. - async fn consume( - &mut self, - channel: &Channel, - deliver: Deliver, - basic_properties: BasicProperties, - content: Vec, - ) { - if let Err(err) = self - .consume_event(channel, deliver, basic_properties, content) - .await - { - revolt_config::capture_anyhow(&err); - eprintln!("Failed to process friend request received event: {err:?}"); - } - } -} diff --git a/crates/daemons/pushd/src/consumers/inbound/generic.rs b/crates/daemons/pushd/src/consumers/inbound/generic.rs index aa3950d71..6a158c2a4 100644 --- a/crates/daemons/pushd/src/consumers/inbound/generic.rs +++ b/crates/daemons/pushd/src/consumers/inbound/generic.rs @@ -1,76 +1,47 @@ -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; -use crate::consumers::inbound::internal::*; -use amqprs::{ - channel::{BasicPublishArguments, Channel}, - connection::Connection, - consumer::AsyncConsumer, - BasicProperties, Deliver, -}; +use crate::utils::Consumer; use anyhow::Result; use async_trait::async_trait; +use lapin::{message::Delivery, Channel, Connection}; use log::debug; use revolt_database::{events::rabbit::*, Database}; +#[derive(Clone)] +#[allow(unused)] pub struct GenericConsumer { - #[allow(dead_code)] db: Database, - authifier_db: authifier::Database, - conn: Option, - channel: Option, + connection: Arc, + channel: Arc, } -impl Channeled for GenericConsumer { - fn get_connection(&self) -> Option<&Connection> { - if self.conn.is_none() { - None - } else { - Some(self.conn.as_ref().unwrap()) - } - } - - fn get_channel(&self) -> Option<&Channel> { - if self.channel.is_none() { - None - } else { - Some(self.channel.as_ref().unwrap()) +#[async_trait] +impl Consumer for GenericConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { + Self { + db, + connection, + channel, } } - fn set_connection(&mut self, conn: Connection) { - self.conn = Some(conn); - } - - fn set_channel(&mut self, channel: Channel) { - self.channel = Some(channel) - } -} - -impl GenericConsumer { - pub fn new(db: Database, authifier_db: authifier::Database) -> GenericConsumer { - GenericConsumer { - db, - authifier_db, - conn: None, - channel: None, - } + fn channel(&self) -> &Arc { + &self.channel } - async fn consume_event( - &mut self, - _channel: &Channel, - _deliver: Deliver, - _basic_properties: BasicProperties, - content: Vec, - ) -> Result<()> { - let content = String::from_utf8(content)?; - let payload: MessageSentPayload = serde_json::from_str(content.as_str())?; + /// This consumer handles delegating messages into their respective platform queues. + async fn consume(&self, delivery: Delivery) -> Result<()> { + let payload: MessageSentPayload = serde_json::from_slice(&delivery.data)?; debug!("Received message event on origin"); if let Ok(sessions) = self - .authifier_db - .find_sessions_with_subscription(&payload.users) + .db + .fetch_sessions_with_subscription(&payload.users) .await { let config = revolt_config::config().await; @@ -86,36 +57,23 @@ impl GenericConsumer { extras: HashMap::new(), }; - let args: BasicPublishArguments; - - if sub.endpoint == "apn" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.apn.queue.as_str(), - ) - .finish(); - } else if sub.endpoint == "fcm" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.fcm.queue.as_str(), - ) - .finish(); - } else { - // web push (vapid) - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.vapid.queue.as_str(), - ) - .finish(); - sendable.extras.insert("p265dh".to_string(), sub.p256dh); - sendable - .extras - .insert("endpoint".to_string(), sub.endpoint.clone()); - } + let routing_key = match sub.endpoint.as_str() { + "apn" => &config.pushd.apn.queue, + "fcm" => &config.pushd.fcm.queue, + endpoint => { + sendable.extras.insert("p256dh".to_string(), sub.p256dh); + sendable + .extras + .insert("endpoint".to_string(), endpoint.to_string()); + + &config.pushd.vapid.queue + } + }; let payload = serde_json::to_string(&sendable)?; - publish_message(self, payload.into(), args).await; + self.publish_message(payload.as_bytes(), &config.pushd.exchange, routing_key) + .await?; } } } @@ -123,24 +81,3 @@ impl GenericConsumer { Ok(()) } } - -#[allow(unused_variables)] -#[async_trait] -impl AsyncConsumer for GenericConsumer { - /// This consumer handles delegating messages into their respective platform queues. - async fn consume( - &mut self, - channel: &Channel, - deliver: Deliver, - basic_properties: BasicProperties, - content: Vec, - ) { - if let Err(err) = self - .consume_event(channel, deliver, basic_properties, content) - .await - { - revolt_config::capture_anyhow(&err); - eprintln!("Failed to process generic event: {err:?}"); - } - } -} diff --git a/crates/daemons/pushd/src/consumers/inbound/internal.rs b/crates/daemons/pushd/src/consumers/inbound/internal.rs deleted file mode 100644 index 387c08b52..000000000 --- a/crates/daemons/pushd/src/consumers/inbound/internal.rs +++ /dev/null @@ -1,53 +0,0 @@ -use amqprs::{ - channel::{BasicPublishArguments, Channel}, - connection::{Connection, OpenConnectionArguments}, - BasicProperties, -}; -use log::{debug, warn}; - -pub(crate) trait Channeled { - #[allow(unused)] - fn get_connection(&self) -> Option<&Connection>; - fn get_channel(&self) -> Option<&Channel>; - fn set_connection(&mut self, conn: Connection); - fn set_channel(&mut self, channel: Channel); -} - -pub(crate) async fn make_channel(consumer: &mut T) { - let config = revolt_config::config().await; - - let args = OpenConnectionArguments::new( - &config.rabbit.host, - config.rabbit.port, - &config.rabbit.username, - &config.rabbit.password, - ); - let conn = amqprs::connection::Connection::open(&args).await.unwrap(); - - let channel = conn.open_channel(None).await.unwrap(); - - consumer.set_connection(conn); - consumer.set_channel(channel); -} - -pub(crate) async fn publish_message( - consumer: &mut T, - payload: Vec, - args: BasicPublishArguments, -) { - let routing_key = &args.routing_key.clone(); - let mut channel = consumer.get_channel(); - if channel.is_none() { - make_channel(consumer).await; - channel = consumer.get_channel(); - } - - if let Some(chnl) = channel { - chnl.basic_publish(BasicProperties::default(), payload.clone(), args.clone()) - .await - .unwrap(); - debug!("Sent message to queue for target {}", routing_key); - } else { - warn!("Failed to unwrap channel (including attempt to make a channel)!") - } -} diff --git a/crates/daemons/pushd/src/consumers/inbound/mass_mention.rs b/crates/daemons/pushd/src/consumers/inbound/mass_mention.rs index bf5dd453a..e0c71d995 100644 --- a/crates/daemons/pushd/src/consumers/inbound/mass_mention.rs +++ b/crates/daemons/pushd/src/consumers/inbound/mass_mention.rs @@ -1,75 +1,37 @@ use std::{ collections::{HashMap, HashSet}, hash::RandomState, + sync::Arc, }; -use crate::consumers::inbound::internal::*; -use amqprs::{ - channel::{BasicPublishArguments, Channel}, - connection::Connection, - consumer::AsyncConsumer, - BasicProperties, Deliver, -}; +use crate::utils::{render_notification_content, Consumer}; use anyhow::Result; use async_trait::async_trait; +use lapin::{message::Delivery, Channel, Connection}; use revolt_database::{ events::rabbit::*, util::bulk_permissions::BulkDatabasePermissionQuery, Database, Member, MessageFlagsValue, }; use revolt_models::v0::{MessageFlags, PushNotification}; +use revolt_result::ToRevoltError; +#[derive(Clone)] +#[allow(unused)] pub struct MassMessageConsumer { - #[allow(dead_code)] db: Database, - authifier_db: authifier::Database, - conn: Option, - channel: Option, -} - -impl Channeled for MassMessageConsumer { - fn get_connection(&self) -> Option<&Connection> { - if self.conn.is_none() { - None - } else { - Some(self.conn.as_ref().unwrap()) - } - } - - fn get_channel(&self) -> Option<&Channel> { - if self.channel.is_none() { - None - } else { - Some(self.channel.as_ref().unwrap()) - } - } - - fn set_connection(&mut self, conn: Connection) { - self.conn = Some(conn); - } - - fn set_channel(&mut self, channel: Channel) { - self.channel = Some(channel) - } + connection: Arc, + channel: Arc, } impl MassMessageConsumer { - pub fn new(db: Database, authifier_db: authifier::Database) -> MassMessageConsumer { - MassMessageConsumer { - db, - authifier_db, - conn: None, - channel: None, - } - } - async fn fire_notification_for_users( - &mut self, + &self, push: &PushNotification, users: &[String], ) -> Result<()> { if let Ok(sessions) = self - .authifier_db - .find_sessions_with_subscription(users) + .db + .fetch_sessions_with_subscription(users) .await { let config = revolt_config::config().await; @@ -83,53 +45,63 @@ impl MassMessageConsumer { extras: HashMap::new(), }; - let args: BasicPublishArguments; - - if sub.endpoint == "apn" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.apn.queue.as_str(), - ) - .finish(); - } else if sub.endpoint == "fcm" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.fcm.queue.as_str(), - ) - .finish(); - } else { - // web push (vapid) - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.vapid.queue.as_str(), - ) - .finish(); - sendable.extras.insert("p265dh".to_string(), sub.p256dh); - sendable - .extras - .insert("endpoint".to_string(), sub.endpoint.clone()); - } + let routing_key = match sub.endpoint.as_str() { + "apn" => &config.pushd.apn.queue, + "fcm" => &config.pushd.fcm.queue, + endpoint => { + sendable.extras.insert("p256dh".to_string(), sub.p256dh); + sendable + .extras + .insert("endpoint".to_string(), endpoint.to_string()); + + &config.pushd.vapid.queue + } + }; let payload = serde_json::to_string(&sendable)?; - publish_message(self, payload.into(), args).await; + self.publish_message(payload.as_bytes(), &config.pushd.exchange, routing_key) + .await?; } } } Ok(()) } +} - async fn consume_event( - &mut self, - _channel: &Channel, - _deliver: Deliver, - _basic_properties: BasicProperties, - content: Vec, - ) -> Result<()> { +#[async_trait] +impl Consumer for MassMessageConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { + Self { + db, + connection, + channel, + } + } + + fn channel(&self) -> &Arc { + &self.channel + } + + /// This consumer handles adding mentions for all the users affected by a mass mention ping, and then sends out push notifications. + async fn consume(&self, delivery: Delivery) -> Result<()> { + let mut payload: MassMessageSentPayload = serde_json::from_slice(&delivery.data)?; let config = revolt_config::config().await; - let content = String::from_utf8(content)?; - let payload: MassMessageSentPayload = serde_json::from_str(content.as_str())?; + + for push in payload.notifications.iter_mut() { + if let Ok(body) = render_notification_content(push, &self.db) + .await + .to_internal_error() + { + push.raw_body = Some(push.body.clone()); + push.body = body; + } + } debug!("Received mass message event"); @@ -269,24 +241,3 @@ impl MassMessageConsumer { Ok(()) } } - -#[allow(unused_variables)] -#[async_trait] -impl AsyncConsumer for MassMessageConsumer { - /// This consumer handles adding mentions for all the users affected by a mass mention ping, and then sends out push notifications - async fn consume( - &mut self, - channel: &Channel, - deliver: Deliver, - basic_properties: BasicProperties, - content: Vec, - ) { - if let Err(err) = self - .consume_event(channel, deliver, basic_properties, content) - .await - { - revolt_config::capture_anyhow(&err); - eprintln!("Failed to process mass message event: {err:?}"); - } - } -} diff --git a/crates/daemons/pushd/src/consumers/inbound/message.rs b/crates/daemons/pushd/src/consumers/inbound/message.rs index 6b9d00fe3..494bfbe5c 100644 --- a/crates/daemons/pushd/src/consumers/inbound/message.rs +++ b/crates/daemons/pushd/src/consumers/inbound/message.rs @@ -1,76 +1,52 @@ -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; -use crate::consumers::inbound::internal::*; -use amqprs::{ - channel::{BasicPublishArguments, Channel}, - connection::Connection, - consumer::AsyncConsumer, - BasicProperties, Deliver, -}; +use crate::utils::{render_notification_content, Consumer}; use anyhow::Result; use async_trait::async_trait; +use lapin::{message::Delivery, Channel, Connection}; use log::debug; use revolt_database::{events::rabbit::*, Database}; +#[derive(Clone)] +#[allow(unused)] pub struct MessageConsumer { - #[allow(dead_code)] db: Database, - authifier_db: authifier::Database, - conn: Option, - channel: Option, + connection: Arc, + channel: Arc, } -impl Channeled for MessageConsumer { - fn get_connection(&self) -> Option<&Connection> { - if self.conn.is_none() { - None - } else { - Some(self.conn.as_ref().unwrap()) - } - } - - fn get_channel(&self) -> Option<&Channel> { - if self.channel.is_none() { - None - } else { - Some(self.channel.as_ref().unwrap()) +#[async_trait] +impl Consumer for MessageConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { + Self { + db, + connection, + channel, } } - fn set_connection(&mut self, conn: Connection) { - self.conn = Some(conn); + fn channel(&self) -> &Arc { + &self.channel } - fn set_channel(&mut self, channel: Channel) { - self.channel = Some(channel) - } -} + /// This consumer handles delegating messages into their respective platform queues. + async fn consume(&self, delivery: Delivery) -> Result<()> { + let mut payload: MessageSentPayload = serde_json::from_slice(&delivery.data)?; -impl MessageConsumer { - pub fn new(db: Database, authifier_db: authifier::Database) -> MessageConsumer { - MessageConsumer { - db, - authifier_db, - conn: None, - channel: None, + if let Ok(body) = render_notification_content(&payload.notification, &self.db).await { + payload.notification.raw_body = Some(payload.notification.body); + payload.notification.body = body; } - } - - async fn consume_event( - &mut self, - _channel: &Channel, - _deliver: Deliver, - _basic_properties: BasicProperties, - content: Vec, - ) -> Result<()> { - let content = String::from_utf8(content)?; - let payload: MessageSentPayload = serde_json::from_str(content.as_str())?; debug!("Received message event on origin"); if let Ok(sessions) = self - .authifier_db - .find_sessions_with_subscription(&payload.users) + .db + .fetch_sessions_with_subscription(&payload.users) .await { let config = revolt_config::config().await; @@ -86,36 +62,22 @@ impl MessageConsumer { extras: HashMap::new(), }; - let args: BasicPublishArguments; - - if sub.endpoint == "apn" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.apn.queue.as_str(), - ) - .finish(); - } else if sub.endpoint == "fcm" { - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.fcm.queue.as_str(), - ) - .finish(); - } else { - // web push (vapid) - args = BasicPublishArguments::new( - config.pushd.exchange.as_str(), - config.pushd.vapid.queue.as_str(), - ) - .finish(); - sendable.extras.insert("p265dh".to_string(), sub.p256dh); - sendable - .extras - .insert("endpoint".to_string(), sub.endpoint.clone()); - } + let routing_key = match sub.endpoint.as_str() { + "apn" => &config.pushd.apn.queue, + "fcm" => &config.pushd.fcm.queue, + endpoint => { + sendable.extras.insert("p256dh".to_string(), sub.p256dh); + sendable + .extras + .insert("endpoint".to_string(), endpoint.to_string()); + + &config.pushd.vapid.queue + } + }; let payload = serde_json::to_string(&sendable)?; - - publish_message(self, payload.into(), args).await; + self.publish_message(payload.as_bytes(), &config.pushd.exchange, routing_key) + .await?; } } } @@ -123,24 +85,3 @@ impl MessageConsumer { Ok(()) } } - -#[allow(unused_variables)] -#[async_trait] -impl AsyncConsumer for MessageConsumer { - /// This consumer handles delegating messages into their respective platform queues. - async fn consume( - &mut self, - channel: &Channel, - deliver: Deliver, - basic_properties: BasicProperties, - content: Vec, - ) { - if let Err(err) = self - .consume_event(channel, deliver, basic_properties, content) - .await - { - revolt_config::capture_anyhow(&err); - eprintln!("Failed to process message event: {err:?}"); - } - } -} diff --git a/crates/daemons/pushd/src/consumers/inbound/mod.rs b/crates/daemons/pushd/src/consumers/inbound/mod.rs index 9c3593367..7c93cdb64 100644 --- a/crates/daemons/pushd/src/consumers/inbound/mod.rs +++ b/crates/daemons/pushd/src/consumers/inbound/mod.rs @@ -1,7 +1,7 @@ pub mod ack; +pub mod dm_call; pub mod fr_accepted; pub mod fr_received; pub mod generic; -mod internal; pub mod mass_mention; pub mod message; diff --git a/crates/daemons/pushd/src/consumers/outbound/apn.rs b/crates/daemons/pushd/src/consumers/outbound/apn.rs index 7cc43c76a..bf46d5bc1 100644 --- a/crates/daemons/pushd/src/consumers/outbound/apn.rs +++ b/crates/daemons/pushd/src/consumers/outbound/apn.rs @@ -1,12 +1,13 @@ -use std::{borrow::Cow, collections::BTreeMap, io::Cursor}; +use std::{borrow::Cow, collections::BTreeMap, io::Cursor, sync::Arc}; -use amqprs::{channel::Channel as AmqpChannel, consumer::AsyncConsumer, BasicProperties, Deliver}; -use anyhow::{anyhow, Result}; +use crate::utils::Consumer; +use anyhow::Result; use async_trait::async_trait; use base64::{ engine::{self}, Engine as _, }; +use lapin::{message::Delivery, Channel as AMQPChannel, Connection}; use revolt_a2::{ request::{ notification::{DefaultAlert, NotificationOptions}, @@ -42,16 +43,45 @@ impl<'a> PayloadLike for MessagePayload<'a> { fn get_device_token(&self) -> &'a str { self.device_token } - fn get_options(&self) -> &NotificationOptions { + fn get_options(&self) -> &NotificationOptions<'a> { + &self.options + } +} + +#[derive(Serialize, Debug)] +struct CallStartStopPayload<'a> { + aps: APS<'a>, + #[serde(skip_serializing)] + options: NotificationOptions<'a>, + #[serde(skip_serializing)] + device_token: &'a str, + + initiator_id: &'a str, + #[serde(rename = "camelCase")] + channel_id: &'a str, + #[serde(rename = "camelCase")] + started_at: &'a str, + #[serde(rename = "camelCase")] + ended: bool, +} + +impl<'a> PayloadLike for CallStartStopPayload<'a> { + fn get_device_token(&self) -> &'a str { + self.device_token + } + fn get_options(&self) -> &NotificationOptions<'a> { &self.options } } // region: consumer +#[derive(Clone)] +#[allow(unused)] pub struct ApnsOutboundConsumer { - #[allow(dead_code)] db: Database, + connection: Arc, + channel: Arc, client: Client, } @@ -63,10 +93,11 @@ impl ApnsOutboundConsumer { // in a dm it should just be "Sendername". // not sure how feasible all those are given the PushNotification object as it currently stands. + #[allow(deprecated)] match ¬ification.channel { Channel::DirectMessage { .. } => notification.author.clone(), Channel::Group { name, .. } => format!("{}, #{}", notification.author, name), - Channel::TextChannel { name, .. } | Channel::VoiceChannel { name, .. } => { + Channel::TextChannel { name, .. } => { format!("{} in #{}", notification.author, name) } _ => "Unknown".to_string(), @@ -90,15 +121,20 @@ impl ApnsOutboundConsumer { } } -impl ApnsOutboundConsumer { - pub async fn new(db: Database) -> Result { +#[async_trait] +impl Consumer for ApnsOutboundConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { let config = revolt_config::config().await; if config.pushd.apn.pkcs8.is_empty() || config.pushd.apn.key_id.is_empty() || config.pushd.apn.team_id.is_empty() { - return Err("Missing APN keys."); + panic!("Missing APN keys."); } let endpoint = if config.pushd.apn.sandbox { @@ -121,18 +157,20 @@ impl ApnsOutboundConsumer { ) .expect("could not create APN client"); - Ok(ApnsOutboundConsumer { db, client }) + Self { + db, + connection, + channel, + client, + } + } + + fn channel(&self) -> &Arc { + &self.channel } - async fn consume_event( - &mut self, - _channel: &AmqpChannel, - _deliver: Deliver, - _basic_properties: BasicProperties, - content: Vec, - ) -> Result<()> { - let content = String::from_utf8(content)?; - let payload: PayloadToService = serde_json::from_str(content.as_str())?; + async fn consume(&self, delivery: Delivery) -> Result<()> { + let payload: PayloadToService = serde_json::from_slice(&delivery.data)?; let payload_options = NotificationOptions { apns_id: None, @@ -143,20 +181,15 @@ impl ApnsOutboundConsumer { apns_collapse_id: None, }; - let resp: Result; - - match payload.notification { + let resp = match payload.notification { PayloadKind::FRReceived(alert) => { let loc_args = vec![Cow::from( - alert - .from_user - .display_name - .or(Some(format!( + alert.from_user.display_name.clone().unwrap_or_else(|| { + format!( "{}#{}", alert.from_user.username, alert.from_user.discriminator - ))) - .clone() - .ok_or_else(|| anyhow!("missing name"))?, + ) + }), )]; let apn_payload = Payload { @@ -189,20 +222,17 @@ impl ApnsOutboundConsumer { "Sending friend request received for user: {:}", &payload.user_id ); - resp = self.client.send(apn_payload).await; + self.client.send(apn_payload).await } PayloadKind::FRAccepted(alert) => { let loc_args = vec![Cow::from( - alert - .accepted_user - .display_name - .or(Some(format!( + alert.accepted_user.display_name.clone().unwrap_or_else(|| { + format!( "{}#{}", alert.accepted_user.username, alert.accepted_user.discriminator - ))) - .clone() - .ok_or_else(|| anyhow!("missing name"))?, + ) + }), )]; let apn_payload = Payload { @@ -235,7 +265,7 @@ impl ApnsOutboundConsumer { "Sending friend request accept for user: {:}", &payload.user_id ); - resp = self.client.send(apn_payload).await; + self.client.send(apn_payload).await } PayloadKind::Generic(alert) => { let apn_payload = Payload { @@ -268,7 +298,7 @@ impl ApnsOutboundConsumer { "Sending generic notification for user: {:}", &payload.user_id ); - resp = self.client.send(apn_payload).await; + self.client.send(apn_payload).await } PayloadKind::MessageNotification(alert) => { @@ -307,8 +337,9 @@ impl ApnsOutboundConsumer { "Sending message notification for user: {:}", &payload.user_id ); - resp = self.client.send(apn_payload).await; + self.client.send(apn_payload).await } + PayloadKind::BadgeUpdate(badge) => { let apn_payload = Payload { aps: APS { @@ -321,58 +352,66 @@ impl ApnsOutboundConsumer { }; debug!("Sending badge update for user: {:}", &payload.user_id); - resp = self.client.send(apn_payload).await; + self.client.send(apn_payload).await } - } - if let Err(err) = resp { - match err { - Error::ResponseError(Response { - error: - Some(ErrorBody { - reason: ErrorReason::BadDeviceToken | ErrorReason::Unregistered, - .. - }), - .. - }) => { - info!( - "Removing APNS subscription id {:} (user: {:}) due to invalid token", - &payload.session_id, &payload.user_id - ); - if let Err(err) = self - .db - .remove_push_subscription_by_session_id(&payload.session_id) - .await - { - revolt_config::capture_error(&err); - } - } - err => { + PayloadKind::DmCallStartEnd(alert) => { + let started_at = alert.started_at.map_or(String::new(), |f| f.clone()); + + let apn_payload = CallStartStopPayload { + aps: APS { + alert: None, + badge: self.get_badge_count(&payload.user_id).await, + sound: None, + thread_id: None, + content_available: None, + category: None, + mutable_content: Some(1), + url_args: None, + }, + device_token: &payload.token, + options: payload_options.clone(), + initiator_id: &alert.initiator_id, + channel_id: &alert.channel_id, + started_at: &started_at, + ended: alert.ended, + }; + + debug!( + "Sending call start/stop notification for user: {:}", + &payload.user_id + ); + self.client.send(apn_payload).await + } + }; + + match resp { + Err(Error::ResponseError(Response { + error: + Some(ErrorBody { + reason: ErrorReason::BadDeviceToken | ErrorReason::Unregistered, + .. + }), + .. + })) => { + info!( + "Removing APNS subscription id {:} (user: {:}) due to invalid token", + &payload.session_id, &payload.user_id + ); + + if let Err(err) = self + .db + .remove_push_subscription_by_session_id(&payload.session_id) + .await + { revolt_config::capture_error(&err); } } - } + resp => { + resp?; + } + }; Ok(()) } } - -#[allow(unused_variables)] -#[async_trait] -impl AsyncConsumer for ApnsOutboundConsumer { - async fn consume( - &mut self, - channel: &AmqpChannel, - deliver: Deliver, - basic_properties: BasicProperties, - content: Vec, - ) { - if let Err(err) = self - .consume_event(channel, deliver, basic_properties, content) - .await - { - revolt_config::capture_anyhow(&err); - eprintln!("Failed to process APN event: {err:?}"); - } - } -} diff --git a/crates/daemons/pushd/src/consumers/outbound/fcm.rs b/crates/daemons/pushd/src/consumers/outbound/fcm.rs index 1e3f1d2ad..7d05a9db4 100644 --- a/crates/daemons/pushd/src/consumers/outbound/fcm.rs +++ b/crates/daemons/pushd/src/consumers/outbound/fcm.rs @@ -1,49 +1,142 @@ -use std::{collections::HashMap, time::Duration}; +use std::{collections::HashMap, sync::Arc, time::Duration}; -use amqprs::{channel::Channel as AmqpChannel, consumer::AsyncConsumer, BasicProperties, Deliver}; - -use anyhow::{anyhow, bail, Result}; +use crate::utils::Consumer; +use anyhow::{bail, Result}; use async_trait::async_trait; use fcm_v1::{ - android::AndroidConfig, auth::{Authenticator, ServiceAccountKey}, - message::{Message, Notification}, + message::Message, Client, Error as FcmError, }; +use lapin::{message::Delivery, Channel as AMQPChannel, Connection}; +use revolt_config::config; use revolt_database::{events::rabbit::*, Database}; -use revolt_models::v0::{Channel, PushNotification}; use serde_json::Value; -pub struct FcmOutboundConsumer { - db: Database, - client: Client, +/// Custom notification data +#[derive(Debug, Clone, PartialEq)] +pub enum NotificationData { + FRReceived { + id: String, + username: String, + }, + FRAccepted { + id: String, + username: String, + }, + Generic { + title: String, + body: String, + image: Option, + }, + Message { + message: String, + body: String, + image: String, + channel: String, + author: String, + author_name: String, + }, + DmCallStartEnd { + initiator_id: String, + channel_id: String, + started_at: String, + ended: bool, + duration: usize, + }, } -impl FcmOutboundConsumer { - fn format_title(&self, notification: &PushNotification) -> String { - // ideally this changes depending on context - // in a server, it would look like "Sendername, #channelname in servername" - // in a group, it would look like "Sendername in groupname" - // in a dm it should just be "Sendername". - // not sure how feasible all those are given the PushNotification object as it currently stands. - - match ¬ification.channel { - Channel::DirectMessage { .. } => notification.author.clone(), - Channel::Group { name, .. } => format!("{}, #{}", notification.author, name), - Channel::TextChannel { name, .. } | Channel::VoiceChannel { name, .. } => { - format!("{} in #{}", notification.author, name) +impl NotificationData { + pub fn get_type(&self) -> &str { + match self { + NotificationData::FRReceived { .. } => "push.fr.receive", + NotificationData::FRAccepted { .. } => "push.fr.accept", + NotificationData::Generic { .. } => "push.generic", + NotificationData::Message { .. } => "push.message", + NotificationData::DmCallStartEnd { .. } => "push.dm.call", + } + } + + pub fn into_payload(self) -> HashMap { + let mut data = HashMap::new(); + data.insert( + "type".to_string(), + Value::String(self.get_type().to_string()), + ); + + match self { + NotificationData::FRReceived { id, username } => { + data.insert("id".to_string(), Value::String(id)); + data.insert("username".to_string(), Value::String(username)); + } + NotificationData::FRAccepted { id, username } => { + data.insert("id".to_string(), Value::String(id)); + data.insert("username".to_string(), Value::String(username)); + } + NotificationData::Generic { title, body, image } => { + data.insert("title".to_string(), Value::String(title)); + data.insert("body".to_string(), Value::String(body)); + + if let Some(image) = image { + data.insert("image".to_string(), Value::String(image)); + } + } + NotificationData::Message { + message, + body, + image, + channel, + author, + author_name, + } => { + data.insert("message".to_string(), Value::String(message)); + data.insert("body".to_string(), Value::String(body)); + data.insert("image".to_string(), Value::String(image)); + data.insert("channel".to_string(), Value::String(channel)); + data.insert("author".to_string(), Value::String(author)); + data.insert("author_name".to_string(), Value::String(author_name)); + } + NotificationData::DmCallStartEnd { + initiator_id, + channel_id, + started_at, + ended, + duration, + } => { + data.insert("initiator_id".to_string(), Value::String(initiator_id)); + data.insert("channel_id".to_string(), Value::String(channel_id)); + data.insert("started_at".to_string(), Value::String(started_at)); + data.insert("ended".to_string(), Value::Bool(ended)); + data.insert("duration".to_string(), Value::Number(duration.into())); } - _ => "Unknown".to_string(), } + + data } } -impl FcmOutboundConsumer { - pub async fn new(db: Database) -> Result { +#[derive(Clone)] +#[allow(unused)] +pub struct FcmOutboundConsumer { + db: Database, + connection: Arc, + channel: Arc, + client: Client, +} + +#[async_trait] +impl Consumer for FcmOutboundConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { let config = revolt_config::config().await; - Ok(FcmOutboundConsumer { + Self { db, + connection, + channel, client: Client::new( Authenticator::service_account::<&str>(ServiceAccountKey { key_type: Some(config.pushd.fcm.key_type), @@ -63,45 +156,36 @@ impl FcmOutboundConsumer { false, Duration::from_secs(5), ), - }) + } } - async fn consume_event( - &mut self, - _channel: &AmqpChannel, - _deliver: Deliver, - _basic_properties: BasicProperties, - content: Vec, - ) -> Result<()> { - let content = String::from_utf8(content)?; - let payload: PayloadToService = serde_json::from_str(content.as_str())?; + fn channel(&self) -> &Arc { + &self.channel + } + + async fn consume(&self, delivery: Delivery) -> Result<()> { + let payload: PayloadToService = serde_json::from_slice(&delivery.data)?; #[allow(clippy::needless_late_init)] let resp: Result; match payload.notification { PayloadKind::FRReceived(alert) => { - let name = alert - .from_user - .display_name - .or(Some(format!( + let name = alert.from_user.display_name.clone().unwrap_or_else(|| { + format!( "{}#{}", alert.from_user.username, alert.from_user.discriminator - ))) - .clone() - .ok_or_else(|| anyhow!("missing name"))?; - - let mut data = HashMap::new(); - data.insert( - "type".to_string(), - Value::String("push.fr.receive".to_string()), - ); - data.insert("id".to_string(), Value::String(alert.from_user.id)); - data.insert("username".to_string(), Value::String(name)); + ) + }); + + let data = NotificationData::FRReceived { + id: alert.from_user.id, + username: name, + }; let msg = Message { token: Some(payload.token), - data: Some(data), + data: Some(data.into_payload()), ..Default::default() }; @@ -109,40 +193,36 @@ impl FcmOutboundConsumer { } PayloadKind::FRAccepted(alert) => { - let name = alert - .accepted_user - .display_name - .or(Some(format!( + let name = alert.accepted_user.display_name.clone().unwrap_or_else(|| { + format!( "{}#{}", alert.accepted_user.username, alert.accepted_user.discriminator - ))) - .clone() - .ok_or_else(|| anyhow!("missing name"))?; - - let mut data: HashMap = HashMap::new(); - data.insert( - "type".to_string(), - Value::String("push.fr.accept".to_string()), - ); - data.insert("id".to_string(), Value::String(alert.accepted_user.id)); - data.insert("username".to_string(), Value::String(name)); + ) + }); + + let data = NotificationData::FRAccepted { + id: alert.accepted_user.id, + username: name, + }; let msg = Message { token: Some(payload.token), - data: Some(data), + data: Some(data.into_payload()), ..Default::default() }; resp = self.client.send(&msg).await; } PayloadKind::Generic(alert) => { + let data = NotificationData::Generic { + title: alert.title, + body: alert.body, + image: alert.icon, + }; + let msg = Message { token: Some(payload.token), - notification: Some(Notification { - title: Some(alert.title), - body: Some(alert.body), - image: alert.icon, - }), + data: Some(data.into_payload()), ..Default::default() }; @@ -150,19 +230,36 @@ impl FcmOutboundConsumer { } PayloadKind::MessageNotification(alert) => { - let title = self.format_title(&alert); + let data = NotificationData::Message { + message: alert.message.id, + body: alert.body, + image: alert.icon, + channel: alert.message.channel, + author: alert.message.author, + author_name: alert.author, + }; + + let msg = Message { + token: Some(payload.token), + data: Some(data.into_payload()), + ..Default::default() + }; + + resp = self.client.send(&msg).await; + } + + PayloadKind::DmCallStartEnd(alert) => { + let data = NotificationData::DmCallStartEnd { + initiator_id: alert.initiator_id, + channel_id: alert.channel_id, + started_at: alert.started_at.unwrap_or_else(|| "".to_string()), + ended: alert.ended, + duration: config().await.api.livekit.call_ring_duration, + }; let msg = Message { token: Some(payload.token), - notification: Some(Notification { - title: Some(title), - body: Some(alert.body), - image: Some(alert.icon), - }), - android: Some(AndroidConfig { - collapse_key: Some(alert.tag), - ..Default::default() - }), + data: Some(data.into_payload()), ..Default::default() }; @@ -174,43 +271,21 @@ impl FcmOutboundConsumer { } } - if let Err(err) = resp { - match err { - FcmError::Auth => { - if let Err(err) = self - .db - .remove_push_subscription_by_session_id(&payload.session_id) - .await - { - revolt_config::capture_error(&err); - } - } - err => { + match resp { + Err(FcmError::Auth) => { + if let Err(err) = self + .db + .remove_push_subscription_by_session_id(&payload.session_id) + .await + { revolt_config::capture_error(&err); } } - } + res => { + res?; + } + }; Ok(()) } } - -#[allow(unused_variables)] -#[async_trait] -impl AsyncConsumer for FcmOutboundConsumer { - async fn consume( - &mut self, - channel: &AmqpChannel, - deliver: Deliver, - basic_properties: BasicProperties, - content: Vec, - ) { - if let Err(err) = self - .consume_event(channel, deliver, basic_properties, content) - .await - { - revolt_config::capture_anyhow(&err); - eprintln!("Failed to process FCM event: {err:?}"); - } - } -} diff --git a/crates/daemons/pushd/src/consumers/outbound/vapid.rs b/crates/daemons/pushd/src/consumers/outbound/vapid.rs index 92ce6e569..f91b995d6 100644 --- a/crates/daemons/pushd/src/consumers/outbound/vapid.rs +++ b/crates/daemons/pushd/src/consumers/outbound/vapid.rs @@ -1,6 +1,6 @@ -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; -use amqprs::{channel::Channel as AmqpChannel, consumer::AsyncConsumer, BasicProperties, Deliver}; +use crate::utils::Consumer; use anyhow::{anyhow, bail, Result}; use async_trait::async_trait; @@ -8,46 +8,57 @@ use base64::{ engine::{self}, Engine as _, }; -use revolt_database::{events::rabbit::*, Database}; +use lapin::{message::Delivery, Channel as AMQPChannel, Connection}; +use revolt_database::{events::rabbit::*, util::format_display_name, Database}; use web_push::{ ContentEncoding, IsahcWebPushClient, SubscriptionInfo, SubscriptionKeys, VapidSignatureBuilder, WebPushClient, WebPushError, WebPushMessageBuilder, }; +#[derive(Clone)] +#[allow(unused)] pub struct VapidOutboundConsumer { db: Database, + connection: Arc, + channel: Arc, client: IsahcWebPushClient, - pkey: Vec, + pkey: Arc>, } -impl VapidOutboundConsumer { - pub async fn new(db: Database) -> Result { +#[async_trait] +impl Consumer for VapidOutboundConsumer { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self { let config = revolt_config::config().await; - if config.pushd.vapid.private_key.is_empty() | config.pushd.vapid.public_key.is_empty() { - bail!("no Vapid keys present"); + if config.pushd.vapid.private_key.is_empty() || config.pushd.vapid.public_key.is_empty() { + panic!("no Vapid keys present"); } - let web_push_private_key = engine::general_purpose::URL_SAFE_NO_PAD - .decode(config.pushd.vapid.private_key) - .expect("valid `VAPID_PRIVATE_KEY`"); + let web_push_private_key = Arc::new( + engine::general_purpose::URL_SAFE_NO_PAD + .decode(config.pushd.vapid.private_key) + .expect("valid `VAPID_PRIVATE_KEY`"), + ); - Ok(VapidOutboundConsumer { + Self { db, + connection, + channel, client: IsahcWebPushClient::new().unwrap(), pkey: web_push_private_key, - }) + } + } + + fn channel(&self) -> &Arc { + &self.channel } - async fn consume_event( - &mut self, - _channel: &AmqpChannel, - _deliver: Deliver, - _basic_properties: BasicProperties, - content: Vec, - ) -> Result<()> { - let content = String::from_utf8(content)?; - let payload: PayloadToService = serde_json::from_str(content.as_str())?; + async fn consume(&self, delivery: Delivery) -> Result<()> { + let payload: PayloadToService = serde_json::from_slice(&delivery.data)?; let subscription = SubscriptionInfo { endpoint: payload @@ -65,10 +76,7 @@ impl VapidOutboundConsumer { }, }; - #[allow(clippy::needless_late_init)] - let payload_body: String; - - match payload.notification { + let payload_body = match payload.notification { PayloadKind::FRReceived(alert) => { let name = alert .from_user @@ -83,7 +91,7 @@ impl VapidOutboundConsumer { let mut body = HashMap::new(); body.insert("body", format!("{} sent you a friend request", name)); - payload_body = serde_json::to_string(&body)?; + serde_json::to_string(&body)? } PayloadKind::FRAccepted(alert) => { let name = alert @@ -99,65 +107,70 @@ impl VapidOutboundConsumer { let mut body = HashMap::new(); body.insert("body", format!("{} accepted your friend request", name)); - payload_body = serde_json::to_string(&body)?; - } - PayloadKind::Generic(alert) => { - payload_body = serde_json::to_string(&alert)?; + serde_json::to_string(&body)? } - PayloadKind::MessageNotification(alert) => { - payload_body = serde_json::to_string(&alert)?; + PayloadKind::Generic(alert) => serde_json::to_string(&alert)?, + PayloadKind::MessageNotification(alert) => serde_json::to_string(&alert)?, + PayloadKind::DmCallStartEnd(alert) => { + let initiator_name = if let Some(server_id) = + self.db.fetch_channel(&alert.channel_id).await?.server() + { + format_display_name(&self.db, &alert.initiator_id, Some(server_id)).await + } else { + format_display_name(&self.db, &alert.initiator_id, None).await + }?; + + let channel = self.db.fetch_channel(&alert.channel_id).await?; + let mut body = HashMap::new(); + + match channel { + revolt_database::Channel::DirectMessage { .. } => { + body.insert("body", format!("{} is calling you", initiator_name)); + } + revolt_database::Channel::Group { name, .. } => { + body.insert( + "body", + format!("{} is calling your group, {}", initiator_name, name), + ); + } + _ => bail!("Invalid DmCallStart/End channel type"), + } + + serde_json::to_string(&body)? } PayloadKind::BadgeUpdate(_) => { bail!("Vapid cannot handle badge updates and they should not be sent here."); } - } + }; - match VapidSignatureBuilder::from_pem(std::io::Cursor::new(&self.pkey), &subscription) { - Ok(sig_builder) => match sig_builder.build() { - Ok(signature) => { - let mut builder = WebPushMessageBuilder::new(&subscription); - builder.set_vapid_signature(signature); - - builder.set_payload(ContentEncoding::AesGcm, payload_body.as_bytes()); - - match builder.build() { - Ok(msg) => { - if let Err(err) = self.client.send(msg).await { - if err == WebPushError::Unauthorized { - self.db - .remove_push_subscription_by_session_id(&payload.session_id) - .await?; - } - } - - Ok(()) - } - Err(err) => Err(err.into()), - } + let signature = VapidSignatureBuilder::from_pem( + std::io::Cursor::new(self.pkey.as_ref()), + &subscription, + )? + .build()?; + + let mut builder = WebPushMessageBuilder::new(&subscription); + builder.set_vapid_signature(signature); + + builder.set_payload(ContentEncoding::AesGcm, payload_body.as_bytes()); + + let msg = builder.build()?; + + match self.client.send(msg).await { + Err(WebPushError::Unauthorized) => { + if let Err(err) = self + .db + .remove_push_subscription_by_session_id(&payload.session_id) + .await + { + revolt_config::capture_error(&err); } - Err(err) => Err(err.into()), - }, - Err(err) => Err(err.into()), - } - } -} + } + res => { + res?; + } + }; -#[allow(unused_variables)] -#[async_trait] -impl AsyncConsumer for VapidOutboundConsumer { - async fn consume( - &mut self, - channel: &AmqpChannel, - deliver: Deliver, - basic_properties: BasicProperties, - content: Vec, - ) { - if let Err(err) = self - .consume_event(channel, deliver, basic_properties, content) - .await - { - revolt_config::capture_anyhow(&err); - eprintln!("Failed to process Vapid event: {err:?}"); - } + Ok(()) } } diff --git a/crates/daemons/pushd/src/main.rs b/crates/daemons/pushd/src/main.rs index 78845a634..21d417a4b 100644 --- a/crates/daemons/pushd/src/main.rs +++ b/crates/daemons/pushd/src/main.rs @@ -1,27 +1,30 @@ #[macro_use] extern crate log; -use amqprs::{ - channel::{ - BasicConsumeArguments, Channel, ExchangeDeclareArguments, QueueBindArguments, - QueueDeclareArguments, - }, - connection::{Connection, OpenConnectionArguments}, - consumer::AsyncConsumer, - FieldTable, +use std::sync::Arc; + +use lapin::{ + options::{BasicConsumeOptions, ExchangeDeclareOptions, QueueBindOptions, QueueDeclareOptions}, + types::{AMQPValue, FieldTable}, + Channel, Connection, ConnectionProperties, }; use revolt_config::{config, Settings}; -use tokio::sync::Notify; +use revolt_database::Database; +use tokio::signal::ctrl_c; mod consumers; +mod utils; use consumers::{ inbound::{ - ack::AckConsumer, fr_accepted::FRAcceptedConsumer, fr_received::FRReceivedConsumer, - generic::GenericConsumer, mass_mention::MassMessageConsumer, message::MessageConsumer, + ack::AckConsumer, dm_call::DmCallConsumer, fr_accepted::FRAcceptedConsumer, + fr_received::FRReceivedConsumer, generic::GenericConsumer, + mass_mention::MassMessageConsumer, message::MessageConsumer, }, outbound::{apn::ApnsOutboundConsumer, fcm::FcmOutboundConsumer, vapid::VapidOutboundConsumer}, }; +use crate::utils::{Consumer, Delegate}; + #[tokio::main(flavor = "multi_thread", worker_threads = 2)] async fn main() { // Configure logging and environment @@ -29,19 +32,25 @@ async fn main() { // Setup database let db = revolt_database::DatabaseInfo::Auto.connect().await.unwrap(); - let authifier: authifier::Database; - - if let Some(client) = match &db { - revolt_database::Database::Reference(_) => None, - revolt_database::Database::MongoDb(mongo) => Some(mongo), - } { - authifier = - authifier::Database::MongoDb(authifier::database::MongoDb(client.database("revolt"))); - } else { - panic!("Mongo is not in use, can't connect via authifier!") - } - let mut connections: Vec<(Channel, Connection)> = Vec::new(); + let config = config().await; + + let connection = Arc::new( + Connection::connect( + &format!( + "amqp://{}:{}@{}:{}", + &config.rabbit.username, + &config.rabbit.password, + &config.rabbit.host, + &config.rabbit.port, + ), + ConnectionProperties::default(), + ) + .await + .expect("Failed to connect to RabbitMQ"), + ); + + let mut channels = Vec::new(); // An explainer of how this works: // The inbound connections are on separate routing keys, such that they only receive the proper payload @@ -52,158 +61,167 @@ async fn main() { // This'll require some interesting shimming if we need to add more events once this is in prod (different payloads between prod and test), // but that sounds like a problem for future us. - let config = config().await; - - // inbound: generic - connections.push( - make_queue_and_consume( + channels.push( + make_queue_and_consume::( + &db, + &connection, &config, &config.pushd.generic_queue, - config.pushd.get_generic_routing_key().as_str(), + &config.pushd.get_generic_routing_key(), None, - GenericConsumer::new(db.clone(), authifier.clone()), ) .await, ); - // inbound: messages - connections.push( - make_queue_and_consume( + channels.push( + make_queue_and_consume::( + &db, + &connection, &config, &config.pushd.message_queue, - config.pushd.get_message_routing_key().as_str(), + &config.pushd.get_message_routing_key(), None, - MessageConsumer::new(db.clone(), authifier.clone()), ) .await, ); - // inbound: FR received - connections.push( - make_queue_and_consume( + channels.push( + make_queue_and_consume::( + &db, + &connection, &config, &config.pushd.fr_received_queue, - config.pushd.get_fr_received_routing_key().as_str(), + &config.pushd.get_fr_received_routing_key(), None, - FRReceivedConsumer::new(db.clone(), authifier.clone()), ) .await, ); - // inbound: FR accepted - connections.push( - make_queue_and_consume( + channels.push( + make_queue_and_consume::( + &db, + &connection, &config, &config.pushd.fr_accepted_queue, - config.pushd.get_fr_accepted_routing_key().as_str(), + &config.pushd.get_fr_accepted_routing_key(), None, - FRAcceptedConsumer::new(db.clone(), authifier.clone()), ) .await, ); - connections.push( - make_queue_and_consume( + channels.push( + make_queue_and_consume::( + &db, + &connection, &config, &config.pushd.mass_mention_queue, - config.pushd.get_mass_mention_routing_key().as_str(), + &config.pushd.get_mass_mention_routing_key(), + None, + ) + .await, + ); + + channels.push( + make_queue_and_consume::( + &db, + &connection, + &config, + &config.pushd.dm_call_queue, + &config.pushd.get_dm_call_routing_key(), None, - MassMessageConsumer::new(db.clone(), authifier.clone()), ) .await, ); if !config.pushd.apn.pkcs8.is_empty() { - connections.push( - make_queue_and_consume( + channels.push( + make_queue_and_consume::( + &db, + &connection, &config, &config.pushd.apn.queue, &config.pushd.apn.queue, None, - ApnsOutboundConsumer::new(db.clone()).await.unwrap(), ) .await, ); - let mut table = FieldTable::new(); - table.insert("x-message-deduplication".try_into().unwrap(), "true".into()); + let mut table = FieldTable::default(); + table.insert("x-message-deduplication".into(), AMQPValue::Boolean(true)); - connections.push( - make_queue_and_consume( + channels.push( + make_queue_and_consume::( + &db, + &connection, &config, &config.pushd.ack_queue, &config.pushd.ack_queue, Some(table), - AckConsumer::new(db.clone(), authifier.clone()), ) .await, ); } if !config.pushd.fcm.auth_uri.is_empty() { - connections.push( - make_queue_and_consume( + channels.push( + make_queue_and_consume::( + &db, + &connection, &config, &config.pushd.fcm.queue, &config.pushd.fcm.queue, None, - FcmOutboundConsumer::new(db.clone()).await.unwrap(), ) .await, - ) + ); } if !config.pushd.vapid.public_key.is_empty() { - connections.push( - make_queue_and_consume( + channels.push( + make_queue_and_consume::( + &db, + &connection, &config, &config.pushd.vapid.queue, &config.pushd.vapid.queue, None, - VapidOutboundConsumer::new(db.clone()).await.unwrap(), ) .await, - ) + ); } - let guard = Notify::new(); - guard.notified().await; + ctrl_c().await.unwrap(); - for (channel, conn) in connections { - channel.close().await.expect("Unable to close channel"); - conn.close().await.expect("Unable to close connection"); + for channel in channels { + let _ = channel.close(0, "close".into()).await; } } async fn make_queue_and_consume( + db: &Database, + connection: &Arc, config: &Settings, queue_name: &str, routing_key: &str, queue_args: Option, - consumer: F, -) -> (Channel, Connection) +) -> Arc where - F: AsyncConsumer + Send + 'static, + F: Consumer, { - let connection = Connection::open(&OpenConnectionArguments::new( - &config.rabbit.host, - config.rabbit.port, - &config.rabbit.username, - &config.rabbit.password, - )) - .await - .unwrap(); - - let channel = connection.open_channel(None).await.unwrap(); + let channel = Arc::new(connection.create_channel().await.unwrap()); channel .exchange_declare( - ExchangeDeclareArguments::new(&config.pushd.exchange, "direct") - .durable(true) - .finish(), + config.pushd.exchange.clone().into(), + lapin::ExchangeKind::Direct, + ExchangeDeclareOptions { + durable: true, + ..Default::default() + }, + FieldTable::default(), ) .await - .expect("Failed to declare pushd exchange"); + .expect("Failed to declare exchange"); let mut queue_name = queue_name.to_string(); @@ -215,35 +233,58 @@ where let queue_name = queue_name.as_str(); - let mut args = QueueDeclareArguments::new(queue_name); - args.durable(true); - - if let Some(arg) = queue_args { - args.arguments(arg); - } + let args = QueueDeclareOptions { + durable: true, + ..Default::default() + }; - let args = args.finish(); - _ = channel.queue_declare(args).await.unwrap().unwrap(); + channel + .queue_declare(queue_name.into(), args, queue_args.unwrap_or_default()) + .await + .unwrap(); channel - .queue_bind(QueueBindArguments::new( - queue_name, - &config.pushd.exchange, - routing_key, - )) + .queue_bind( + queue_name.into(), + config.pushd.exchange.clone().into(), + routing_key.into(), + QueueBindOptions::default(), + FieldTable::default(), + ) .await .expect( "This probably means the revolt.notifications exchange does not exist in rabbitmq!", ); - let args = BasicConsumeArguments::new(queue_name, "") - .manual_ack(false) - .finish(); - - let routing_key = channel.basic_consume(consumer, args).await.unwrap(); + let consumer = channel + .basic_consume( + queue_name.into(), + "".into(), + BasicConsumeOptions { + no_ack: true, + ..Default::default() + }, + FieldTable::default(), + ) + .await + .unwrap(); info!( "Consuming routing key {} as queue {}, tag {}", - routing_key, queue_name, routing_key + routing_key, + queue_name, + consumer.tag() ); - (channel, connection) + + let delegate = Delegate( + F::create( + db.clone(), + connection.clone(), + channel.clone(), + ) + .await, + ); + + consumer.set_delegate(delegate); + + channel } diff --git a/crates/daemons/pushd/src/utils/consumer.rs b/crates/daemons/pushd/src/utils/consumer.rs new file mode 100644 index 000000000..88f782c6f --- /dev/null +++ b/crates/daemons/pushd/src/utils/consumer.rs @@ -0,0 +1,90 @@ +use std::{ + future::{ready, Future}, + pin::Pin, + sync::Arc, +}; + +use anyhow::Result; +use async_trait::async_trait; +use lapin::{ + message::{Delivery, DeliveryResult}, + options::BasicPublishOptions, + BasicProperties, Channel, Connection, ConsumerDelegate, Error as AMQPError, +}; +use log::debug; +use revolt_database::Database; + +#[async_trait] +pub trait Consumer: Clone + Send + Sync + 'static { + async fn create( + db: Database, + connection: Arc, + channel: Arc, + ) -> Self; + fn channel(&self) -> &Arc; + async fn consume(&self, delivery: Delivery) -> Result<()>; + + async fn publish_message_with_options( + &self, + payload: &[u8], + exchange: &str, + routing_key: &str, + options: BasicPublishOptions, + properties: BasicProperties, + ) -> Result<(), AMQPError> { + let channel = self.channel(); + + channel + .basic_publish( + exchange.into(), + routing_key.into(), + options, + payload, + properties, + ) + .await?; + debug!("Sent message to queue for target {}", routing_key); + + Ok(()) + } + + async fn publish_message( + &self, + payload: &[u8], + exchange: &str, + routing_key: &str, + ) -> Result<(), AMQPError> { + self.publish_message_with_options( + payload, + exchange, + routing_key, + BasicPublishOptions::default(), + BasicProperties::default(), + ) + .await + } +} + +pub struct Delegate(pub C); + +impl ConsumerDelegate for Delegate { + fn on_new_delivery( + &self, + delivery: DeliveryResult, + ) -> Pin + Send>> { + match delivery { + Ok(Some(delivery)) => { + let consumer = self.0.clone(); + + Box::pin(async move { + if let Err(e) = consumer.consume(delivery).await { + revolt_config::capture_anyhow(&e); + log::error!("{e:?}"); + }; + }) + } + Ok(None) => Box::pin(ready(())), + Err(e) => Box::pin(async move { log::error!("Received bad delivery: {e:?}") }), + } + } +} diff --git a/crates/daemons/pushd/src/utils/mod.rs b/crates/daemons/pushd/src/utils/mod.rs new file mode 100644 index 000000000..2a6866e0f --- /dev/null +++ b/crates/daemons/pushd/src/utils/mod.rs @@ -0,0 +1,5 @@ +mod renderer; +mod consumer; + +pub use renderer::render_notification_content; +pub use consumer::{Consumer, Delegate}; \ No newline at end of file diff --git a/crates/daemons/pushd/src/utils/renderer.rs b/crates/daemons/pushd/src/utils/renderer.rs new file mode 100644 index 000000000..ef16c9d8f --- /dev/null +++ b/crates/daemons/pushd/src/utils/renderer.rs @@ -0,0 +1,272 @@ +use redis_kiss::{get_connection as _get_conn, AsyncCommands, Conn}; +use regex::Regex; +use revolt_config::config; +use revolt_database::{Channel, Database}; +use revolt_models::v0::PushNotification; +use revolt_parser::parse_message; +use revolt_result::{create_error, Result, ToRevoltError}; +use std::{ + borrow::Cow, + collections::{HashMap, HashSet}, +}; +use tokio::join; + +async fn get_connection() -> Result { + _get_conn().await.map_err(|_| create_error!(InternalError)) +} + +pub async fn render_notification_content( + notification: &PushNotification, + db: &Database, +) -> Result { + let parsed = parse_message(¬ification.body); + + let user_mentions: HashMap; + let channel_mentions: HashMap; + let emojis: HashMap; + let roles: HashMap; + + let server_id: Option = get_channel_server_id(notification.channel.id(), db) + .await + .map(Some) + .or(Ok(None))?; + + if server_id.is_some() { + (user_mentions, channel_mentions, emojis, roles) = join!( + get_items( + parsed.user_mentions, + server_id.as_deref(), + db, + get_user_display_name, + "Unknown User".to_string() + ), + get_items( + parsed.channel_mentions, + server_id.as_deref(), + db, + get_channel_name, + "Unknown Channel".to_string() + ), + get_items( + parsed.emojis, + server_id.as_deref(), + db, + get_emoji_name, + "Unknown Emoji".to_string() + ), + get_items( + parsed.role_mentions, + server_id.as_deref(), + db, + get_role_name, + "Unknown Role".to_string() + ), + ); + } else { + roles = HashMap::default(); + + (user_mentions, channel_mentions, emojis) = join!( + get_items( + parsed.user_mentions, + server_id.as_deref(), + db, + get_user_display_name, + "Unknown User".to_string() + ), + get_items( + parsed.channel_mentions, + server_id.as_deref(), + db, + get_channel_name, + "Unknown Channel".to_string() + ), + get_items( + parsed.emojis, + server_id.as_deref(), + db, + get_emoji_name, + "Unknown Emoji".to_string() + ), + ); + } + + let mut body = Cow::Borrowed(notification.body.as_str()); + + for (uid, name) in user_mentions { + replace_all_in_place( + Regex::new(format!("<@{uid}>").as_str()).unwrap(), + &mut body, + format!("@{name}").as_str(), + ); + } + + for (uid, name) in channel_mentions { + replace_all_in_place( + Regex::new(format!("<#{uid}>").as_str()).unwrap(), + &mut body, + format!("#{name}").as_str(), + ); + } + + for (uid, name) in roles { + replace_all_in_place( + Regex::new(format!("<%{uid}>").as_str()).unwrap(), + &mut body, + format!("%{name}").as_str(), + ); + } + + for (uid, name) in emojis { + replace_all_in_place( + Regex::new(format!(":{uid}:").as_str()).unwrap(), + &mut body, + format!(":{name}:").as_str(), + ); + } + + Ok(body.to_string()) +} + +async fn get_items( + items: HashSet, + server_id: Option<&str>, + db: &Database, + getter: F, + invalid_string: String, +) -> HashMap +where + F: AsyncFn(&str, Option<&str>, &Database) -> Result, +{ + let mut resp = HashMap::default(); + + for obj_id in items { + resp.insert( + obj_id.clone(), + getter(&obj_id, server_id, db) + .await + .unwrap_or(invalid_string.clone()), + ); + } + + resp +} + +// Getters + +async fn get_user_display_name(id: &str, server: Option<&str>, db: &Database) -> Result { + let config = config().await; + + let mut conn = get_connection().await?; + let key = format!("pushd-user-cache:{}:{id}", server.unwrap_or("GLOBAL")); + + if let Ok(name) = conn.get(key.clone()).await { + return Ok(name); + } + + if let Some(server) = server { + let member = db.fetch_member(server, id).await?; + if let Some(nickname) = member.nickname { + conn.set_ex::<_, _, ()>(key, nickname.clone(), config.pushd.render_cache_time) + .await + .to_internal_error()?; + return Ok(nickname); + } + } + + let user = db.fetch_user(id).await?; + let name = user.display_name.unwrap_or(user.username); + + conn.set_ex::<_, _, ()>(key, name.clone(), config.pushd.render_cache_time) + .await + .to_internal_error()?; + + Ok(name) +} + +async fn get_channel_name(id: &str, _server: Option<&str>, db: &Database) -> Result { + let config = config().await; + + let mut conn = get_connection().await?; + let key = format!("pushd-channel-cache:{id}"); + + if let Ok(name) = conn.get(key.clone()).await { + return Ok(name); + } + + let channel = db.fetch_channel(id).await?; + let name = match channel { + Channel::DirectMessage { .. } => "DM Channel".to_string(), + Channel::Group { name, .. } | Channel::TextChannel { name, .. } => name, + Channel::SavedMessages { .. } => "Err".to_string(), + }; + + conn.set_ex::<_, _, ()>(key, name.clone(), config.pushd.render_cache_time) + .await + .to_internal_error()?; + + Ok(name) +} + +async fn get_role_name(id: &str, server: Option<&str>, db: &Database) -> Result { + let server = server.unwrap(); // Must be passed, but the interface must stay the same as the other getters + let config: revolt_config::Settings = config().await; + + let mut conn = get_connection().await?; + let key = format!("pushd-role-cache:{server}:{id}"); + + if let Ok(name) = conn.get(key.clone()).await { + return Ok(name); + } + + let server = db.fetch_server(server).await?; + let name = server + .roles + .get(id) + .ok_or_else(|| create_error!(NotFound))? + .name + .clone(); + + conn.set_ex::<_, _, ()>(key, name.clone(), config.pushd.render_cache_time) + .await + .to_internal_error()?; + + Ok(name) +} + +async fn get_emoji_name(id: &str, _server: Option<&str>, db: &Database) -> Result { + let config: revolt_config::Settings = config().await; + + let mut conn = get_connection().await?; + let key = format!("pushd-emoji-cache:{id}"); + + if let Ok(name) = conn.get(key.clone()).await { + return Ok(name); + } + + let emoji = db.fetch_emoji(id).await?; + let name = emoji.name; + + conn.set_ex::<_, _, ()>(key, name.clone(), config.pushd.render_cache_time) + .await + .to_internal_error()?; + + Ok(name) +} + +// utility + +async fn get_channel_server_id(channel_id: &str, db: &Database) -> Result { + match db.fetch_channel(channel_id).await? { + Channel::DirectMessage { .. } | Channel::Group { .. } | Channel::SavedMessages { .. } => { + Err(create_error!(NotFound)) + } + Channel::TextChannel { server, .. } => Ok(server), + } +} + +fn replace_all_in_place(regex: Regex, s: &mut Cow<'_, str>, replacer: R) { + let new = regex.replace_all(s, replacer); + if let Cow::Owned(o) = new { + *s = Cow::Owned(o); + } +} diff --git a/crates/daemons/voice-ingress/.gitignore b/crates/daemons/voice-ingress/.gitignore new file mode 100644 index 000000000..c41cc9e35 --- /dev/null +++ b/crates/daemons/voice-ingress/.gitignore @@ -0,0 +1 @@ +/target \ No newline at end of file diff --git a/crates/daemons/voice-ingress/Cargo.toml b/crates/daemons/voice-ingress/Cargo.toml new file mode 100644 index 000000000..2c554b1fb --- /dev/null +++ b/crates/daemons/voice-ingress/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "revolt-voice-ingress" +version = "0.13.7" +license = "AGPL-3.0-or-later" +edition = "2021" +publish = false + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +# util +log = { workspace = true } +sentry = { workspace = true } +lru = { workspace = true } +ulid = { workspace = true } +redis-kiss = { workspace = true, default-features = false, features = ["tokio-runtime"] } +chrono = { workspace = true } + +# Serde +serde_json = { workspace = true } +rmp-serde = { workspace = true } +serde = { workspace = true } + +# Http +rocket = { workspace = true, features = ["json"] } +rocket_empty = { workspace = true } + +# Async +futures = { workspace = true } + +# Core +revolt-result = { workspace = true, features = ["rocket"] } +revolt-models = { workspace = true } +revolt-config = { workspace = true } +revolt-database = { workspace = true, features = ["voice"] } +revolt-permissions = { workspace = true } + +# Voice +livekit-api = { workspace = true } +livekit-protocol = { workspace = true } +livekit-runtime = { workspace = true, features = ["tokio"] } diff --git a/crates/daemons/voice-ingress/Dockerfile b/crates/daemons/voice-ingress/Dockerfile new file mode 100644 index 000000000..18d82e4b4 --- /dev/null +++ b/crates/daemons/voice-ingress/Dockerfile @@ -0,0 +1,11 @@ +# Build Stage +FROM ghcr.io/stoatchat/base:latest AS builder +FROM debian:12 AS debian + +# Bundle Stage +FROM gcr.io/distroless/cc-debian12:nonroot +COPY --from=builder /home/rust/src/target/release/revolt-voice-ingress ./ +COPY --from=debian /usr/bin/uname /usr/bin/uname + +USER nonroot +CMD ["./revolt-voice-ingress"] \ No newline at end of file diff --git a/crates/daemons/voice-ingress/src/api.rs b/crates/daemons/voice-ingress/src/api.rs new file mode 100644 index 000000000..dbe8934e6 --- /dev/null +++ b/crates/daemons/voice-ingress/src/api.rs @@ -0,0 +1,296 @@ +use livekit_api::{access_token::TokenVerifier, webhooks::WebhookReceiver}; +use livekit_protocol::TrackType; +use revolt_database::{ + events::client::EventV1, + iso8601_timestamp::{Duration, Timestamp}, + util::reference::Reference, + voice::{ + create_voice_state, delete_channel_voice_state, delete_voice_state, + get_user_moved_from_voice, get_user_moved_to_voice, update_voice_state_tracks, + RoomMetadata, UserVoiceChannel, VoiceClient, + }, + Database, AMQP, +}; +use revolt_result::{Result, ToRevoltError}; +use rocket::{post, State}; +use rocket_empty::EmptyResponse; + +use crate::guard::AuthHeader; + +#[post("/", data = "")] +pub async fn ingress( + db: &State, + voice_client: &State, + _amqp: &State, + node: &str, + auth_header: AuthHeader<'_>, + body: &str, +) -> Result { + log::debug!("received event: {body:?}"); + + let config = revolt_config::config().await; + + let node_info = config + .api + .livekit + .nodes + .get(node) + .to_internal_error() + .inspect_err(|_| { + log::error!("Unknown node {node}, make sure livekit has the correct node name set and matches `hosts.livekit` and `api.livekit.nodes` in the Revolt config.") + })?; + + let webhook_receiver = WebhookReceiver::new(TokenVerifier::with_api_key( + &node_info.key, + &node_info.secret, + )); + + let event = webhook_receiver + .receive(body, &auth_header) + .to_internal_error()?; + + let channel_id = event.room.as_ref().map(|r| &r.name); + let user_id = event.participant.as_ref().map(|r| &r.identity); + let room_metadata = if let Some(room) = event.room.as_ref() { + Some(serde_json::from_str::(&room.metadata).to_internal_error()?) + } else { + None + }; + + match event.event.as_str() { + // User joined a channel + "participant_joined" => { + let channel_id = channel_id.to_internal_error()?; + let user_id = user_id.to_internal_error()?; + let server_id = room_metadata.to_internal_error()?.server; + let channel = UserVoiceChannel { + id: channel_id.clone(), + server_id: server_id.clone(), + }; + + let joined_at = Timestamp::UNIX_EPOCH + .checked_add(Duration::seconds(event.created_at)) + .unwrap(); + + let voice_state = create_voice_state(&channel, user_id, joined_at).await?; + + // Only publish one event when a user is moved from one channel to another. + if let Some(moved_from) = get_user_moved_to_voice(channel_id, user_id).await? { + EventV1::VoiceChannelMove { + user: user_id.to_string(), + from: moved_from.id, + to: channel_id.to_string(), + state: voice_state, + } + .p(channel_id.to_string()) + .await; + } else { + EventV1::VoiceChannelJoin { + id: channel_id.to_string(), + state: voice_state, + } + .p(channel_id.to_string()) + .await; + }; + + // TODO: fix `num_participants` being incorrect sometimes see (#457) + // First user who joined - send call started system message. + // if event.room.as_ref().unwrap().num_participants == 1 { + // let user = Reference::from_unchecked(user_id).as_user(db).await?; + + // let message_id = + // Ulid::from_datetime(DateTime::from_timestamp_secs(event.created_at).unwrap()) + // .to_string(); + + // let mut call_started_message = SystemMessage::CallStarted { + // by: user_id.to_string(), + // finished_at: None, + // } + // .into_message(channel.id().to_string()); + + // call_started_message.id = message_id; + + // set_channel_call_started_system_message(channel.id(), &call_started_message.id) + // .await?; + + // call_started_message + // .send( + // db, + // Some(amqp), + // v0::MessageAuthor::System { + // username: &user.username, + // avatar: user.avatar.as_ref().map(|file| file.id.as_ref()), + // }, + // None, + // None, + // &channel, + // false, + // ) + // .await?; + + // let recipients = get_call_notification_recipients(&channel_id, &user_id).await?; + // let now = joined_at.format_short().to_string(); + + // if let Err(e) = amqp + // .dm_call_updated(&user.id, channel.id(), Some(&now), false, recipients) + // .await + // { + // revolt_config::capture_error(&e); + // } + // } + } + // User left a channel + "participant_left" => { + let channel_id = channel_id.to_internal_error()?; + let user_id = user_id.to_internal_error()?; + let server_id = room_metadata.to_internal_error()?.server; + let channel = UserVoiceChannel { + id: channel_id.clone(), + server_id: server_id.clone(), + }; + + delete_voice_state(&channel, user_id).await?; + + // Dont send leave event when a user is moved + if get_user_moved_from_voice(channel_id, user_id) + .await? + .is_none() + { + EventV1::VoiceChannelLeave { + id: channel_id.clone(), + user: user_id.clone(), + } + .p(channel_id.clone()) + .await; + }; + + // See above for why this is commented out + + // // Update CallStarted system message if everyone has left with the end time + // let members = get_voice_channel_members(channel_id).await?; + + // if members.is_none_or(|m| m.is_empty()) { + // // The channel is empty so send out an "end" message for ringing + // if let Err(e) = amqp + // .dm_call_updated(user_id, channel_id, None, true, None) + // .await + // { + // revolt_config::capture_internal_error!(&e); + // } + + // if let Some(system_message_id) = + // take_channel_call_started_system_message(channel_id).await? + // { + // // Could have been deleted + // if let Ok(mut message) = Reference::from_unchecked(&system_message_id) + // .as_message(db) + // .await + // { + // if let Some(SystemMessage::CallStarted { finished_at, .. }) = + // &mut message.system + // { + // *finished_at = Some(Timestamp::now_utc()); + + // message + // .update( + // db, + // PartialMessage { + // system: message.system.clone(), + // ..Default::default() + // }, + // Vec::new(), + // ) + // .await?; + // } else { + // log::error!("Broken State: Call started message ID ({}) does not contain a CallStarted system message.", &message.id) + // } + // }; + // }; + // } + } + // Audio/video track was started/stopped/unmuted/muted + "track_published" | "track_unpublished" | "track_unmuted" | "track_muted" => { + let channel_id = channel_id.to_internal_error()?; + let user_id = user_id.to_internal_error()?; + let track = event.track.as_ref().to_internal_error()?; + let server_id = room_metadata.to_internal_error()?.server; + let channel = UserVoiceChannel { + id: channel_id.clone(), + server_id: server_id.clone(), + }; + + let user = Reference::from_unchecked(user_id).as_user(db).await?; + + let user_limits = user.limits().await; + + // forbid any size which goes over the limit and also limit the aspect ratio to stop people from making too tall or too wide and bypassing the limit. + // TODO: figure out how to track audio stream quality + + if event.event == "track_published" { + let mut disconnect = false; + + if track.r#type == TrackType::Data as i32 { + log::debug!("User published data"); + disconnect = true; + }; + + if track.r#type == TrackType::Video as i32 { + if user_limits.video_resolution[0] != 0 + && user_limits.video_resolution[1] != 0 + && track.width * track.height + > user_limits.video_resolution[0] * user_limits.video_resolution[1] + { + log::debug!("User published video with out of bounds resolution"); + disconnect = true; + }; + + if user_limits.video_aspect_ratio[0] != user_limits.video_aspect_ratio[1] + && !(user_limits.video_aspect_ratio[0]..=user_limits.video_aspect_ratio[1]) + .contains(&(track.width as f32 / track.height as f32)) + { + log::debug!("User published video with out of bounds aspect ratio"); + disconnect = true; + }; + }; + + if disconnect { + log::debug!("Removing user {user_id} from channel {channel_id} {event:?} due to forbidden track."); + + let _ = voice_client.remove_user(node, user_id, channel_id).await; + delete_voice_state(&channel, user_id).await?; + + return Ok(EmptyResponse); + }; + }; + + let partial = update_voice_state_tracks( + &channel, + user_id, + event.event == "track_published" || event.event == "track_unmuted", // to avoid duplicating this entire case twice + track.source, + ) + .await?; + + EventV1::UserVoiceStateUpdate { + id: user_id.clone(), + channel_id: channel_id.clone(), + data: partial, + } + .p(channel_id.clone()) + .await; + } + "room_finished" => { + let channel_id = channel_id.to_internal_error()?; + let server_id = room_metadata.to_internal_error()?.server; + let channel = UserVoiceChannel { + id: channel_id.clone(), + server_id: server_id.clone(), + }; + + delete_channel_voice_state(&channel, &[]).await?; + } + _ => {} + }; + + Ok(EmptyResponse) +} diff --git a/crates/daemons/voice-ingress/src/guard.rs b/crates/daemons/voice-ingress/src/guard.rs new file mode 100644 index 000000000..f6ce11ddb --- /dev/null +++ b/crates/daemons/voice-ingress/src/guard.rs @@ -0,0 +1,28 @@ +use revolt_result::{create_error, Error}; +use rocket::{ + http::Status, + request::{FromRequest, Outcome}, + Request, +}; + +pub struct AuthHeader<'a>(&'a str); + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for AuthHeader<'r> { + type Error = Error; + + async fn from_request(request: &'r Request<'_>) -> Outcome { + match request.headers().get("Authorization").next() { + Some(token) => Outcome::Success(Self(token)), + None => Outcome::Error((Status::Unauthorized, create_error!(NotAuthenticated))), + } + } +} + +impl std::ops::Deref for AuthHeader<'_> { + type Target = str; + + fn deref(&self) -> &Self::Target { + self.0 + } +} diff --git a/crates/daemons/voice-ingress/src/main.rs b/crates/daemons/voice-ingress/src/main.rs new file mode 100644 index 000000000..45191c2c5 --- /dev/null +++ b/crates/daemons/voice-ingress/src/main.rs @@ -0,0 +1,37 @@ +use std::env; + +use revolt_database::DatabaseInfo; +use revolt_database::{voice::VoiceClient, AMQP}; +use revolt_result::Result; +use rocket::{build, routes, Config}; +use std::net::Ipv4Addr; + +mod api; +mod guard; + +#[rocket::main] +async fn main() -> Result<(), rocket::Error> { + revolt_config::configure!(voice_ingress); + + let amqp = AMQP::new_auto().await; + + let database = DatabaseInfo::Auto.connect().await.unwrap(); + let voice_client = VoiceClient::from_revolt_config().await; + + let _rocket = build() + .manage(database) + .manage(voice_client) + .manage(amqp) + .mount("/", routes![api::ingress]) + .configure(Config { + port: 8500, + address: Ipv4Addr::new(0, 0, 0, 0).into(), + ..Default::default() + }) + .ignite() + .await? + .launch() + .await?; + + Ok(()) +} diff --git a/crates/delta/Cargo.toml b/crates/delta/Cargo.toml index d07b44bb9..d9adb9837 100644 --- a/crates/delta/Cargo.toml +++ b/crates/delta/Cargo.toml @@ -1,86 +1,89 @@ [package] name = "revolt-delta" -version = "0.8.8" +version = "0.13.7" license = "AGPL-3.0-or-later" authors = ["Paul Makles "] edition = "2018" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] # Test -rand = "0.8.5" -redis-kiss = "0.1.4" +rand = { workspace = true } +redis-kiss = { workspace = true, default-features = false, features = ["tokio-runtime"] } # Utility -lru = "0.7.0" -url = "2.2.2" -log = "0.4.11" -dashmap = "5.2.0" -linkify = "0.6.0" -once_cell = "1.17.1" -env_logger = "0.7.1" +lru = { workspace = true } +url = { workspace = true } +log = { workspace = true } +dashmap = { workspace = true } +linkify = { workspace = true } +once_cell = { workspace = true } # Lang. Utilities -regex = "1" -num_enum = "0.5.1" -impl_ops = "0.1.1" -bitfield = "0.13.2" +regex = { workspace = true } +num_enum = { workspace = true } +impl_ops = { workspace = true } +bitfield = { workspace = true } # ID / key generation -ulid = "0.4.1" -nanoid = "0.4.0" +ulid = { workspace = true } +nanoid = { workspace = true } # serde -serde_json = "1.0.57" -serde = { version = "1.0.115", features = ["derive"] } -validator = { version = "0.16", features = ["derive"] } -iso8601-timestamp = { version = "0.2.11", features = [] } +serde_json = { workspace = true } +serde = { workspace = true } +validator = { workspace = true, features = ["derive"] } +iso8601-timestamp = { workspace = true } # async -futures = "0.3.8" -chrono = "0.4.15" -async-channel = "1.6.1" -reqwest = { version = "0.11.4", features = ["json"] } -async-std = { version = "1.8.0", features = [ - "tokio1", - "tokio02", - "attributes", -] } +futures = { workspace = true } +chrono = { workspace = true } +async-channel = { workspace = true } +reqwest = { workspace = true, features = ["json"] } +tokio = { workspace = true } # internal util -lettre = "0.10.0-alpha.4" +lettre = { workspace = true } # web -rocket = { version = "0.5.1", default-features = false, features = ["json"] } -rocket_cors = { git = "https://github.com/lawliet89/rocket_cors", rev = "072d90359b23e9b291df6b672c07c93de9c46011" } -rocket_empty = { version = "0.1.1", features = ["schema"] } -rocket_authifier = { version = "1.0.15" } -rocket_prometheus = "0.10.0-rc.3" +rocket = { workspace = true, features = ["json"] } +rocket_cors = { workspace = true } +rocket_empty = { workspace = true, features = ["schema"] } +rocket_prometheus = { workspace = true } # spec generation -schemars = "0.8.8" -revolt_rocket_okapi = { version = "0.10.0", features = ["swagger"] } +schemars = { workspace = true } +revolt_rocket_okapi = { workspace = true, features = ["swagger"] } # rabbit -amqprs = { version = "1.7.0" } +lapin = { workspace = true, features = ["tokio"] } # core -authifier = "1.0.15" -revolt-config = { path = "../core/config" } -revolt-database = { path = "../core/database", features = [ +revolt-config = { workspace = true } +revolt-database = { workspace = true, features = [ "rocket-impl", "redis-is-patched", + "voice", ] } -revolt-models = { path = "../core/models", features = [ +revolt-models = { workspace = true, features = [ "schemas", "validator", "rocket", ] } -revolt-presence = { path = "../core/presence" } -revolt-result = { path = "../core/result", features = ["rocket", "okapi"] } -revolt-permissions = { path = "../core/permissions", features = ["schemas"] } +revolt-presence = { workspace = true } +revolt-result = { workspace = true, features = ["rocket", "okapi"] } +revolt-permissions = { workspace = true, features = ["schemas"] } +revolt-ratelimits = { workspace = true, features = ["rocket"] } + +# voice +livekit-api = { workspace = true } +livekit-protocol = { workspace = true } + +[dev-dependencies] +revolt-config = { workspace = true, features = ["test"] } [build-dependencies] -vergen = "7.5.0" +vergen = { workspace = true } diff --git a/crates/delta/Dockerfile b/crates/delta/Dockerfile index 79d41cf27..7537ec510 100644 --- a/crates/delta/Dockerfile +++ b/crates/delta/Dockerfile @@ -1,5 +1,5 @@ # Build Stage -FROM ghcr.io/revoltchat/base:latest AS builder +FROM ghcr.io/stoatchat/base:latest AS builder FROM debian:12 AS debian # Bundle Stage diff --git a/crates/delta/fixtures/server_with_many_roles.json b/crates/delta/fixtures/server_with_many_roles.json index 49cfe276c..c32529a51 100644 --- a/crates/delta/fixtures/server_with_many_roles.json +++ b/crates/delta/fixtures/server_with_many_roles.json @@ -47,6 +47,7 @@ ], "roles": { "__ID:5__": { + "_id": "__ID:5__", "name": "Moderator", "permissions": { "a": 545270216, @@ -55,6 +56,7 @@ "rank": 1 }, "__ID:6__": { + "_id": "__ID:6__", "name": "Owner", "permissions": { "a": 0, @@ -63,6 +65,7 @@ "rank": 0 }, "__ID:7__": { + "_id": "__ID:7__", "name": "Lower Rank 1", "permissions": { "a": 0, @@ -71,6 +74,7 @@ "rank": 2 }, "__ID:8__": { + "_id": "__ID:8__", "name": "Lower Rank 2", "permissions": { "a": 0, diff --git a/crates/delta/src/main.rs b/crates/delta/src/main.rs index 9cce39ce4..4ebe941a0 100644 --- a/crates/delta/src/main.rs +++ b/crates/delta/src/main.rs @@ -9,20 +9,15 @@ pub mod routes; pub mod util; use revolt_config::config; -use revolt_database::events::client::EventV1; use revolt_database::AMQP; +use revolt_ratelimits::rocket as ratelimiter; use rocket::{Build, Rocket}; use rocket_cors::{AllowedOrigins, CorsOptions}; use rocket_prometheus::PrometheusMetrics; use std::net::Ipv4Addr; use std::str::FromStr; -use amqprs::{ - channel::ExchangeDeclareArguments, - connection::{Connection, OpenConnectionArguments}, -}; -use async_std::channel::unbounded; -use authifier::AuthifierEvent; +use revolt_database::voice::VoiceClient; use rocket::data::ToByteUnit; pub async fn web() -> Rocket { @@ -36,28 +31,6 @@ pub async fn web() -> Rocket { let db = revolt_database::DatabaseInfo::Auto.connect().await.unwrap(); db.migrate_database().await.unwrap(); - // Setup Authifier event channel - let (_, receiver) = unbounded(); - - // Setup Authifier - let authifier = db.clone().to_authifier().await; - - // Launch a listener for Authifier events - async_std::task::spawn(async move { - while let Ok(event) = receiver.recv().await { - match &event { - AuthifierEvent::CreateSession { .. } | AuthifierEvent::CreateAccount { .. } => { - EventV1::Auth(event).global().await - } - AuthifierEvent::DeleteSession { user_id, .. } - | AuthifierEvent::DeleteAllSessions { user_id, .. } => { - let id = user_id.to_string(); - EventV1::Auth(event).private(id).await - } - } - } - }); - // Configure CORS let cors = CorsOptions { allowed_origins: AllowedOrigins::All, @@ -67,6 +40,15 @@ pub async fn web() -> Rocket { .iter() .map(|s| FromStr::from_str(s).unwrap()) .collect(), + expose_headers: [ + "X-Ratelimit-Limit", + "X-Ratelimit-Bucket", + "X-Ratelimit-Remaining", + "X-Ratelimit-Reset-After", + ] + .iter() + .map(|s| s.to_string()) + .collect(), ..Default::default() } .to_cors() @@ -81,39 +63,11 @@ pub async fn web() -> Rocket { ) .into(); - let swagger_0_8 = revolt_rocket_okapi::swagger_ui::make_swagger_ui( - &revolt_rocket_okapi::swagger_ui::SwaggerUIConfig { - url: "/0.8/openapi.json".to_owned(), - ..Default::default() - }, - ) - .into(); - + // Voice handler + let voice_client = VoiceClient::new(config.api.livekit.nodes.clone()); // Configure Rabbit - let connection = Connection::open(&OpenConnectionArguments::new( - &config.rabbit.host, - config.rabbit.port, - &config.rabbit.username, - &config.rabbit.password, - )) - .await - .expect("Failed to connect to RabbitMQ"); - - let channel = connection - .open_channel(None) - .await - .expect("Failed to open RabbitMQ channel"); - - channel - .exchange_declare( - ExchangeDeclareArguments::new(&config.pushd.exchange, "direct") - .durable(true) - .finish(), - ) - .await - .expect("Failed to declare exchange"); - - let amqp = AMQP::new(connection, channel); + + let amqp = AMQP::new_auto().await; // Launch background task workers revolt_database::tasks::start_workers(db.clone(), amqp.clone()); @@ -122,23 +76,27 @@ pub async fn web() -> Rocket { let rocket = rocket::build(); let prometheus = PrometheusMetrics::new(); + // Ratelimits + let ratelimits = ratelimiter::RatelimitStorage::new(util::ratelimits::DeltaRatelimits); + routes::mount(config, rocket) .attach(prometheus.clone()) .mount("/metrics", prometheus) .mount("/", rocket_cors::catch_all_options_routes()) - .mount("/", util::ratelimiter::routes()) + .mount("/", ratelimiter::routes()) .mount("/swagger/", swagger) - .mount("/0.8/swagger/", swagger_0_8) - .manage(authifier) .manage(db) .manage(amqp) .manage(cors.clone()) - .attach(util::ratelimiter::RatelimitFairing) + .manage(voice_client) + .manage(ratelimits) + .attach(ratelimiter::RatelimitFairing) .attach(cors) .configure(rocket::Config { limits: rocket::data::Limits::default().limit("string", 5.megabytes()), address: Ipv4Addr::new(0, 0, 0, 0).into(), port: 14702, + ip_header: Some("X-Forwarded-For".into()), ..Default::default() }) } diff --git a/crates/delta/src/routes/account/change_email.rs b/crates/delta/src/routes/account/change_email.rs new file mode 100644 index 000000000..88a310b69 --- /dev/null +++ b/crates/delta/src/routes/account/change_email.rs @@ -0,0 +1,187 @@ +//! Change account email. +//! PATCH /account/change/email +use revolt_database::util::email::validate_email; +use revolt_database::{Account, Database, ValidatedTicket}; +use revolt_models::v0; +use rocket::serde::json::Json; +use rocket::State; +use rocket_empty::EmptyResponse; +use revolt_result::{Result, create_error}; + +/// # Change Email +/// +/// Change the associated account email. +#[openapi(tag = "Account")] +#[patch("/change/email", data = "")] +pub async fn change_email( + db: &State, + validated_ticket: Option, + mut account: Account, + data: Json, +) -> Result { + let data = data.into_inner(); + + validate_email(&data.email)?; + + if account.mfa.is_active() && validated_ticket.is_none() { + return Err(create_error!(InvalidCredentials)); + } + + // Ensure given password is correct + account.verify_password(&data.current_password)?; + + // Send email verification for new email + account + .start_email_move(db, data.email) + .await + .map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_config::overwrite_config; + use revolt_database::{MFATicket, Totp}; + use revolt_models::v0; + use rocket::http::{ContentType, Header, Status}; + + #[rocket::async_test] + async fn success() { + overwrite_config(|config| config.api.smtp.host = "".to_string()).await; + + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let res = harness.client + .patch("/auth/account/change/email") + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token.clone())) + .body( + json!({ + "email": "validexample@valid.com", + "current_password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let account = harness.db.fetch_account(&account.id).await.unwrap(); + + assert_eq!(account.email, "validexample@valid.com"); + } + + #[rocket::async_test] + async fn success_smtp() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let res = harness.client + .patch("/auth/account/change/email") + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token.clone())) + .body( + json!({ + "email": "change_email@smtp.test", + "current_password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let account = harness.db.fetch_account(&account.id).await.unwrap(); + + let (_, code) = harness.assert_email("change_email@smtp.test").await; + let res = harness.client + .post(format!("/auth/account/verify/{}", code)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + + let account = harness.db.fetch_account(&account.id).await.unwrap(); + + assert_eq!(account.email, "change_email@smtp.test"); + + // Ensure that we did not receive a ticket + assert_eq!( + v0::ResponseVerify::NoTicket, + res.into_json().await.expect("`ResponseVerify") + ) + } + + #[rocket::async_test] + async fn success_mfa() { + overwrite_config(|config| config.api.smtp.host = "".to_string()).await; + + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .patch("/auth/account/change/email") + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token.clone())) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .body( + json!({ + "email": "validexample@valid.com", + "current_password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let account = harness.db.fetch_account(&account.id).await.unwrap(); + + assert_eq!(account.email, "validexample@valid.com"); + } + + #[rocket::async_test] + async fn fail_mfa() { + overwrite_config(|config| config.api.smtp.host = "".to_string()).await; + + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .patch("/auth/account/change/email") + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token.clone())) + .body( + json!({ + "email": "validexample@valid.com", + "current_password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + } +} diff --git a/crates/delta/src/routes/account/change_password.rs b/crates/delta/src/routes/account/change_password.rs new file mode 100644 index 000000000..f963347e0 --- /dev/null +++ b/crates/delta/src/routes/account/change_password.rs @@ -0,0 +1,187 @@ +//! Change account password. +//! PATCH /account/change/password +use revolt_database::{ + util::password::{assert_safe, hash_password}, + Account, Database, ValidatedTicket, +}; +use revolt_models::v0; +use revolt_result::{create_error, Result}; +use rocket::serde::json::Json; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Change Password +/// +/// Change the current account password. +#[openapi(tag = "Account")] +#[patch("/change/password", data = "")] +pub async fn change_password( + db: &State, + validated_ticket: Option, + mut account: Account, + data: Json, +) -> Result { + let data = data.into_inner(); + + if account.mfa.is_active() && validated_ticket.is_none() { + return Err(create_error!(InvalidCredentials)); + } + + // Verify password can be used + assert_safe(&data.password).await?; + + // Ensure given password is correct + account.verify_password(&data.current_password)?; + + // Hash and replace password + account.password = hash_password(data.password)?; + + // Commit to database + account.save(db).await.map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::{MFATicket, Totp}; + use rocket::http::{ContentType, Header, Status}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (_, session, _) = harness.new_user().await; + + let res = harness + .client + .patch("/auth/account/change/password") + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token.clone())) + .body( + json!({ + "password": "new password", + "current_password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let res = harness + .client + .patch("/auth/account/change/password") + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token)) + .body( + json!({ + "password": "sussy password", + "current_password": "new password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + } + + #[rocket::async_test] + async fn success_mfa() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness + .client + .patch("/auth/account/change/password") + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token.clone())) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .body( + json!({ + "password": "new password", + "current_password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + } + + #[rocket::async_test] + async fn fail_mfa_no_ticket() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let res = harness + .client + .patch("/auth/account/change/password") + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token.clone())) + .body( + json!({ + "password": "new password", + "current_password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + } + + #[rocket::async_test] + async fn fail_mfa_invalid_password() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let mut ticket = MFATicket::new(account.id.to_string(), true); + ticket.last_totp_code = Some("token from earlier".into()); + ticket.save(&harness.db).await.unwrap(); + + let res = harness + .client + .patch("/auth/account/change/password") + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token.clone())) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .body( + json!({ + "password": "new password", + "current_password": "incorrect password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + } +} diff --git a/crates/delta/src/routes/account/confirm_deletion.rs b/crates/delta/src/routes/account/confirm_deletion.rs new file mode 100644 index 000000000..5d5304844 --- /dev/null +++ b/crates/delta/src/routes/account/confirm_deletion.rs @@ -0,0 +1,59 @@ +//! Confirm an account deletion. +//! PUT /account/delete +use revolt_database::Database; +use revolt_models::v0; +use revolt_result::Result; +use rocket::serde::json::Json; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Confirm Account Deletion +/// +/// Schedule an account for deletion by confirming the received token. +#[openapi(tag = "Account")] +#[put("/delete", data = "")] +pub async fn confirm_deletion( + db: &State, + data: Json, +) -> Result { + let data = data.into_inner(); + + // Find the relevant account + let mut account = db.fetch_account_with_deletion_token(&data.token).await?; + + // Schedule the account for deletion + account.schedule_deletion(db).await.map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use iso8601_timestamp::{Duration, Timestamp}; + use revolt_database::DeletionInfo; + use revolt_models::v0; + use rocket::http::Status; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (mut account, _, _) = harness.new_user().await; + + account.deletion = Some(DeletionInfo::WaitingForVerification { + token: "token".to_string(), + expiry: Timestamp::now_utc() + Duration::seconds(100), + }); + + account.save(&harness.db).await.unwrap(); + + let res = harness + .client + .put("/auth/account/delete") + .json(&v0::DataAccountDeletion { + token: "token".to_string(), + }) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + } +} diff --git a/crates/delta/src/routes/account/create_account.rs b/crates/delta/src/routes/account/create_account.rs new file mode 100644 index 000000000..90f3f9d44 --- /dev/null +++ b/crates/delta/src/routes/account/create_account.rs @@ -0,0 +1,347 @@ +//! Create a new account +//! POST /account/create +use std::time::Duration; + +use tokio::time::sleep; +use revolt_config::config; +use revolt_database::{ + util::{ + captcha::check_captcha, + email::validate_email, + password::assert_safe, + shield::{validate_shield, ShieldValidationInput}, + }, + Account, Database, +}; +use revolt_models::v0; +use revolt_result::{create_error, Result}; +use rocket::serde::json::Json; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Create Account +/// +/// Create a new account. +#[openapi(tag = "Account")] +#[post("/create", data = "")] +pub async fn create_account( + db: &State, + data: Json, + mut shield: ShieldValidationInput, +) -> Result { + let data = data.into_inner(); + + // Random jitter from 0-1000ms + sleep(Duration::from_millis((rand::random::() * 1000.) as u64)).await; + + // Check Captcha token + check_captcha(data.captcha.as_deref()).await?; + + // Validate the request + shield.email = Some(data.email.to_string()); + validate_shield(shield).await?; + + // Make sure email is valid and not blocked + validate_email(&data.email)?; + + // Ensure password is safe to use + assert_safe(&data.password).await?; + + // If required, fetch valid invite + let invite = if config().await.api.registration.invite_only { + if let Some(invite) = data.invite { + Some(db.fetch_account_invite(&invite).await?) + } else { + return Err(create_error!(MissingInvite)); + } + } else { + None + }; + + // Create account + let account = Account::new(db, data.email, data.password, true).await?; + + // Use up the invite + if let Some(mut invite) = invite { + invite.claimed_by = Some(account.id); + invite.used = true; + + db.save_account_invite(&invite).await?; + } + + Ok(EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_config::overwrite_config; + use revolt_database::{events::client::EventV1, AccountInvite}; + use revolt_result::{Error, ErrorType}; + use rocket::http::{ContentType, Status}; + + #[rocket::async_test] + async fn success() { + let mut harness = TestHarness::new().await; + + let res = harness + .client + .post("/auth/account/create") + .header(ContentType::JSON) + .body( + json!({ + "email": "success@validemail.com", + "password": "valid password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + drop(res); + + harness + .wait_for_event("global", |e| matches!(e, EventV1::CreateAccount { .. })) + .await; + } + + #[rocket::async_test] + async fn fail_invalid_email() { + let harness = TestHarness::new().await; + + let res = harness + .client + .post("/auth/account/create") + .header(ContentType::JSON) + .body( + json!({ + "email": "invalid", + "password": "valid password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::BadRequest); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::IncorrectData { .. }, + )); + } + + #[rocket::async_test] + async fn fail_invalid_password() { + let harness = TestHarness::new().await; + + let res = harness + .client + .post("/auth/account/create") + .header(ContentType::JSON) + .body( + json!({ + "email": "fail_invalid_password@validemail.com", + "password": "password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::BadRequest); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::CompromisedPassword, + )); + } + + #[rocket::async_test] + async fn fail_invalid_invite() { + overwrite_config(|config| config.api.registration.invite_only = true).await; + + let harness = TestHarness::new().await; + + let res = harness + .client + .post("/auth/account/create") + .header(ContentType::JSON) + .body( + json!({ + "email": "fail_invalid_invite@validemail.com", + "password": "valid password", + "invite": "invalid" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::BadRequest); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::InvalidInvite, + )); + } + + #[rocket::async_test] + async fn success_valid_invite() { + overwrite_config(|config| config.api.registration.invite_only = true).await; + + let harness = TestHarness::new().await; + + let invite = AccountInvite { + id: "invite".to_string(), + used: false, + claimed_by: None, + }; + + invite.save(&harness.db).await.unwrap(); + + let res = harness + .client + .post("/auth/account/create") + .header(ContentType::JSON) + .body( + json!({ + "email": "success_valid_invite@validemail.com", + "password": "valid password", + "invite": "invite" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let invite = harness + .db + .fetch_account_invite("invite") + .await + .expect("`Invite`"); + + assert!(invite.used); + } + + #[rocket::async_test] + async fn fail_missing_captcha() { + overwrite_config(|config| { + config.api.security.captcha.hcaptcha_key = + "0x0000000000000000000000000000000000000000".to_string() + }) + .await; + + let harness = TestHarness::new().await; + + let res = harness + .client + .post("/auth/account/create") + .header(ContentType::JSON) + .body( + json!({ + "email": "fail_missing_captcha@validemail.com", + "password": "valid password", + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::BadRequest); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::CaptchaFailed, + )); + } + + #[rocket::async_test] + async fn fail_captcha_invalid() { + overwrite_config(|config| { + config.api.security.captcha.hcaptcha_key = + "0x0000000000000000000000000000000000000000".to_string() + }) + .await; + + let harness = TestHarness::new().await; + + let res = harness + .client + .post("/auth/account/create") + .header(ContentType::JSON) + .body( + json!({ + "email": "fail_captcha_invalid@validemail.com", + "password": "valid password", + "captcha": "00000000-aaaa-bbbb-cccc-000000000000" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::BadRequest); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::CaptchaFailed, + )); + } + + #[rocket::async_test] + async fn success_captcha_valid() { + overwrite_config(|config| { + config.api.security.captcha.hcaptcha_key = + "0x0000000000000000000000000000000000000000".to_string() + }) + .await; + + let harness = TestHarness::new().await; + + let res = harness + .client + .post("/auth/account/create") + .header(ContentType::JSON) + .body( + json!({ + "email": "success_captcha_valid@validemail.com", + "password": "valid password", + "captcha": "20000000-aaaa-bbbb-cccc-000000000002" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + } + + #[rocket::async_test] + async fn success_smtp_sent() { + let harness = TestHarness::new().await; + + let res = harness + .client + .post("/auth/account/create") + .header(ContentType::JSON) + .body( + json!({ + "email": "success_smtp_sent@smtp.test", + "password": "valid password", + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let (_, code) = harness.assert_email("success_smtp_sent@smtp.test").await; + let res = harness + .client + .post(format!("/auth/account/verify/{code}")) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + } +} diff --git a/crates/delta/src/routes/account/delete_account.rs b/crates/delta/src/routes/account/delete_account.rs new file mode 100644 index 000000000..755f60fbf --- /dev/null +++ b/crates/delta/src/routes/account/delete_account.rs @@ -0,0 +1,64 @@ +//! Delete an account. +//! POST /account/delete +use rocket::State; +use rocket_empty::EmptyResponse; +use revolt_result::Result; +use revolt_database::{Database, Account, ValidatedTicket}; +/// # Delete Account +/// +/// Request to have an account deleted. +#[openapi(tag = "Account")] +#[post("/delete")] +pub async fn delete_account( + db: &State, + mut account: Account, + _ticket: ValidatedTicket, +) -> Result { + account + .start_account_deletion(db) + .await + .map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::MFATicket; + use rocket::http::{ContentType, Header, Status}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + account.email = "delete_account@smtp.test".to_string(); + account.save(&harness.db).await.unwrap(); + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/account/delete") + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let (_, code) = harness.assert_email("delete_account@smtp.test").await; + let res = harness.client + .put("/auth/account/delete") + .header(ContentType::JSON) + .body( + json!({ + "token": code + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + } +} diff --git a/crates/delta/src/routes/account/disable_account.rs b/crates/delta/src/routes/account/disable_account.rs new file mode 100644 index 000000000..d8a5eff7b --- /dev/null +++ b/crates/delta/src/routes/account/disable_account.rs @@ -0,0 +1,67 @@ +//! Disable an account. +//! POST /account/disable +use revolt_result::Result; +use revolt_database::{Database, Account, ValidatedTicket}; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Disable Account +/// +/// Disable an account. +#[openapi(tag = "Account")] +#[post("/disable")] +pub async fn disable_account( + db: &State, + mut account: Account, + _ticket: ValidatedTicket, +) -> Result { + account.disable(db).await.map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::{MFATicket, events::client::EventV1}; + use revolt_result::ErrorType; + use rocket::http::{Header, Status}; + + #[rocket::async_test] + async fn success() { + let mut harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/account/disable") + .header(Header::new("X-Session-Token", session.token.clone())) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + drop(res); + assert!( + harness.db + .fetch_account(&account.id) + .await + .unwrap() + .disabled + ); + + assert!(matches!( + harness.db + .fetch_session(&session.id) + .await + .unwrap_err().error_type, + ErrorType::UnknownUser + )); + + harness.wait_for_event(&format!("{}!", &account.id), |e| if let EventV1::DeleteAllSessions { user_id, .. } = e { + user_id == &account.id + } else { + false + }).await; + } +} diff --git a/crates/delta/src/routes/account/fetch_account.rs b/crates/delta/src/routes/account/fetch_account.rs new file mode 100644 index 000000000..41c51ec7b --- /dev/null +++ b/crates/delta/src/routes/account/fetch_account.rs @@ -0,0 +1,40 @@ +//! Fetch your account +//! GET /account +use revolt_database::Account; +use rocket::serde::json::Json; +use revolt_models::v0; +use revolt_result::Result; + +/// # Fetch Account +/// +/// Fetch account information from the current session. +#[openapi(tag = "Account")] +#[get("/")] +pub async fn fetch_account(account: Account) -> Result> { + Ok(Json(account.into())) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_models::v0; + use rocket::http::{Header, Status}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let res = harness.client + .get("/auth/account") + .header(Header::new("X-Session-Token", session.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert_eq!( + &res.into_json::().await.unwrap().id, + &account.id + ); + } +} diff --git a/crates/delta/src/routes/account/mod.rs b/crates/delta/src/routes/account/mod.rs new file mode 100644 index 000000000..19d108727 --- /dev/null +++ b/crates/delta/src/routes/account/mod.rs @@ -0,0 +1,30 @@ +use rocket::Route; +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; + +pub mod change_email; +pub mod change_password; +pub mod confirm_deletion; +pub mod create_account; +pub mod delete_account; +pub mod disable_account; +pub mod fetch_account; +pub mod password_reset; +pub mod resend_verification; +pub mod send_password_reset; +pub mod verify_email; + +pub fn routes() -> (Vec, OpenApi) { + openapi_get_routes_spec![ + create_account::create_account, + resend_verification::resend_verification, + confirm_deletion::confirm_deletion, + fetch_account::fetch_account, + delete_account::delete_account, + disable_account::disable_account, + change_password::change_password, + change_email::change_email, + verify_email::verify_email, + password_reset::password_reset, + send_password_reset::send_password_reset + ] +} diff --git a/crates/delta/src/routes/account/password_reset.rs b/crates/delta/src/routes/account/password_reset.rs new file mode 100644 index 000000000..6ad981537 --- /dev/null +++ b/crates/delta/src/routes/account/password_reset.rs @@ -0,0 +1,140 @@ +//! Confirm a password reset. +//! PATCH /account/reset_password +use rocket::serde::json::Json; +use rocket::State; +use rocket_empty::EmptyResponse; +use revolt_database::util::password::{hash_password, assert_safe}; +use revolt_database::{Database}; +use revolt_models::v0; +use revolt_result::Result; + +/// # Password Reset +/// +/// Confirm password reset and change the password. +#[openapi(tag = "Account")] +#[patch("/reset_password", data = "")] +pub async fn password_reset( + db: &State, + data: Json, +) -> Result { + let data = data.into_inner(); + + // Find the relevant account + let mut account = db + .fetch_account_with_password_reset(&data.token) + .await?; + + // Verify password can be used + assert_safe(&data.password) + .await?; + + // Update the account + account.password = hash_password(data.password)?; + account.password_reset = None; + account.lockout = None; + + // Commit to database + account.save(db).await?; + + // Delete all sessions if required + if data.remove_sessions { + account.delete_all_sessions(db, None).await?; + } + + Ok(EmptyResponse) +} + +#[cfg(test)] +mod tests { + use iso8601_timestamp::{Timestamp, Duration}; + use revolt_database::PasswordReset; + use revolt_models::v0; + use revolt_result::{ErrorType, Error}; + use crate::{rocket, util::test::TestHarness}; + use rocket::http::{ContentType, Status}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + account.password_reset = Some(PasswordReset { + token: "token".into(), + expiry: Timestamp::now_utc() + Duration::seconds(100), + }); + + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .patch("/auth/account/reset_password") + .header(ContentType::JSON) + .body( + json!({ + "token": "token", + "password": "valid-password", + "remove_sessions": true + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + // Make sure it was used and can't be used again + assert!(harness.db + .fetch_account_with_password_reset("token") + .await + .is_err()); + + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": account.email.clone(), + "password": "valid-password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(res.into_json::().await.is_some()); + + // Ensure sessions were deleted + assert!(matches!( + harness + .db + .fetch_session(&session.id) + .await + .unwrap_err().error_type, + ErrorType::UnknownUser + )); + } + + #[rocket::async_test] + async fn fail_invalid_token() { + let harness = TestHarness::new().await; + + let res = harness.client + .patch("/auth/account/reset_password") + .header(ContentType::JSON) + .body( + json!({ + "token": "invalid", + "password": "valid password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::InvalidToken + )); + } +} diff --git a/crates/delta/src/routes/account/resend_verification.rs b/crates/delta/src/routes/account/resend_verification.rs new file mode 100644 index 000000000..008407a37 --- /dev/null +++ b/crates/delta/src/routes/account/resend_verification.rs @@ -0,0 +1,155 @@ +//! Resend account verification email +//! POST /account/reverify +use std::time::Duration; + +use tokio::time::sleep; +use rocket::{serde::json::Json, State}; +use rocket_empty::EmptyResponse; +use revolt_result::Result; +use revolt_database::{Database, util::{email::{normalise_email, validate_email}, captcha::check_captcha}, EmailVerification}; +use revolt_models::v0; + +/// # Resend Verification +/// +/// Resend account creation verification email. +#[openapi(tag = "Account")] +#[post("/reverify", data = "")] +pub async fn resend_verification( + db: &State, + data: Json, +) -> Result { + let data = data.into_inner(); + + // Random jitter from 0-1000ms + sleep(Duration::from_millis((rand::random::() * 1000.) as u64)).await; + + // Check Captcha token + check_captcha(data.captcha.as_deref()).await?; + + // Make sure email is valid and not blocked + validate_email(&data.email)?; + + // From this point on, do not report failure to the + // remote client, as this will open us up to user enumeration. + + // Normalise the email + let email_normalised = normalise_email(data.email); + + // Try to find the relevant account + if let Ok(Some(mut account)) = db + .fetch_account_by_normalised_email(&email_normalised) + .await + { + match account.verification { + EmailVerification::Verified => { + // Send password reset if already verified + account.start_password_reset(db, true).await?; + } + EmailVerification::Pending { .. } => { + // Resend if not verified yet + account.start_email_verification(db).await?; + } + // Ignore if pending for another email, + // this should be re-initiated from settings. + EmailVerification::Moving { .. } => {} + } + } + + // Never fail this route, + // You may open the application to email enumeration otherwise. + Ok(EmptyResponse) +} + +#[cfg(test)] +mod tests { + use iso8601_timestamp::Timestamp; + use revolt_database::{Account, EmailVerification}; + use crate::{rocket, util::test::TestHarness}; + use rocket::http::{ContentType, Status}; + use revolt_result::{Error, ErrorType}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + + let mut account = Account::new( + &harness.db, + "resend_verification@smtp.test".into(), + "password".into(), + false, + ) + .await + .unwrap(); + + account.verification = EmailVerification::Pending { + token: "".into(), + expiry: Timestamp::now_utc(), + }; + + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/account/reverify") + .header(ContentType::JSON) + .body( + json!({ + "email": "resend_verification@smtp.test", + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let (_, code) = harness.assert_email("resend_verification@smtp.test").await; + let res = harness.client + .post(format!("/auth/account/verify/{code}")) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + } + + #[rocket::async_test] + async fn success_unknown() { + let harness = TestHarness::new().await; + + let res = harness.client + .post("/auth/account/reverify") + .header(ContentType::JSON) + .body( + json!({ + "email": "smtptest1@insrt.uk", + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + } + + #[rocket::async_test] + async fn fail_bad_email() { + let harness = TestHarness::new().await; + + let res = harness.client + .post("/auth/account/reverify") + .header(ContentType::JSON) + .body( + json!({ + "email": "invalid", + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::BadRequest); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::IncorrectData { .. }, + )); + } +} diff --git a/crates/delta/src/routes/account/send_password_reset.rs b/crates/delta/src/routes/account/send_password_reset.rs new file mode 100644 index 000000000..86a6fd218 --- /dev/null +++ b/crates/delta/src/routes/account/send_password_reset.rs @@ -0,0 +1,122 @@ +//! Send a password reset email +//! POST /account/reset_password +use std::time::Duration; + +use tokio::time::sleep; +use rocket::serde::json::Json; +use rocket::State; +use rocket_empty::EmptyResponse; +use revolt_result::Result; +use revolt_database::{Database, EmailVerification, util::{email::{normalise_email, validate_email}, captcha::check_captcha}}; +use revolt_models::v0; + +/// # Send Password Reset +/// +/// Send an email to reset account password. +#[openapi(tag = "Account")] +#[post("/reset_password", data = "")] +pub async fn send_password_reset( + db: &State, + data: Json, +) -> Result { + let data = data.into_inner(); + + // Random jitter from 0-1000ms + sleep(Duration::from_millis((rand::random::() * 1000.) as u64)).await; + + // Check Captcha token + check_captcha(data.captcha.as_deref()).await?; + + // Make sure email is valid and not blocked + validate_email(&data.email)?; + + // From this point on, do not report failure to the + // remote client, as this will open us up to user enumeration. + + // Normalise the email + let email_normalised = normalise_email(data.email); + + // Try to find the relevant account + if let Ok(Some(mut account)) = db + .fetch_account_by_normalised_email(&email_normalised) + .await + { + if !matches!(account.verification, EmailVerification::Pending { .. }) { + if let Err(e) = account.start_password_reset(db, false).await { + revolt_config::capture_error(&e); + } + } + } + + // Never fail this route, (except for db error) + // You may open the application to email enumeration otherwise. + Ok(EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::Account; + use revolt_models::v0; + use rocket::http::{ContentType, Status}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + + Account::new( + &harness.db, + "password_reset@smtp.test".into(), + "password".into(), + false, + ) + .await + .unwrap(); + + let res = harness.client + .post("/auth/account/reset_password") + .header(ContentType::JSON) + .body( + json!({ + "email": "password_reset@smtp.test", + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let (_, code) = harness.assert_email("password_reset@smtp.test").await; + let res = harness.client + .patch("/auth/account/reset_password") + .header(ContentType::JSON) + .body( + json!({ + "token": code, + "password": "valid password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": "password_reset@smtp.test", + "password": "valid password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(serde_json::from_str::(&res.into_string().await.unwrap()).is_ok()); + } +} diff --git a/crates/delta/src/routes/account/verify_email.rs b/crates/delta/src/routes/account/verify_email.rs new file mode 100644 index 000000000..104e504b8 --- /dev/null +++ b/crates/delta/src/routes/account/verify_email.rs @@ -0,0 +1,104 @@ +//! Verify an account +//! POST /verify/ +use rocket::{serde::json::Json, State}; +use revolt_database::{Database, EmailVerification, MFATicket, util::email::normalise_email}; +use revolt_result::Result; +use revolt_models::v0; + +/// # Verify Email +/// +/// Verify an email address. +#[openapi(tag = "Account")] +#[post("/verify/")] +pub async fn verify_email( + db: &State, + code: String, +) -> Result> { + // Find the account + let mut account = db + .fetch_account_with_email_verification(&code) + .await?; + + // Update account email + let response = if let EmailVerification::Moving { new_email, .. } = &account.verification { + account.email = new_email.clone(); + account.email_normalised = normalise_email(new_email.clone()); + v0::ResponseVerify::NoTicket + } else { + let mut ticket = MFATicket::new(account.id.to_string(), false); + ticket.authorised = true; + ticket.save(db).await?; + v0::ResponseVerify::WithTicket { ticket: ticket.into() } + }; + + // Mark as verified + account.verification = EmailVerification::Verified; + + // Save to database + account.save(db).await?; + Ok(Json(response)) +} + +#[cfg(test)] +mod tests { + use iso8601_timestamp::{Timestamp, Duration}; + use revolt_database::EmailVerification; + use crate::{rocket, util::test::TestHarness}; + use rocket::http::{ContentType, Status}; + use revolt_models::v0; + use revolt_result::{Error, ErrorType}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (mut account, _, _) = harness.new_user().await; + + account.verification = EmailVerification::Pending { + token: "token".into(), + expiry: Timestamp::now_utc() + Duration::seconds(100), + }; + + account.save(&harness.db).await.unwrap(); + + let res = harness.client.post("/auth/account/verify/token").dispatch().await; + + assert_eq!(res.status(), Status::Ok); + + // Make sure it was used and can't be used again + assert!(harness.db + .fetch_account_with_email_verification("token") + .await + .is_err()); + + // Check that we can login using the received MFA ticket + let response = res.into_json::().await + .expect("`ResponseVerify`"); + + if let v0::ResponseVerify::WithTicket { ticket } = response { + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body(json!({ "mfa_ticket": ticket.token }).to_string()) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(res.into_json::().await.is_some()); + } else { + panic!("Expected `ResponseVerify::WithTicket`"); + } + } + + #[rocket::async_test] + async fn fail_invalid_token() { + let harness = TestHarness::new().await; + + let res = harness.client.post("/auth/account/verify/token").dispatch().await; + + assert_eq!(res.status(), Status::Unauthorized); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::InvalidToken, + )); + } +} diff --git a/crates/delta/src/routes/bots/delete.rs b/crates/delta/src/routes/bots/delete.rs index 4d4daefbe..c3c89fcc5 100644 --- a/crates/delta/src/routes/bots/delete.rs +++ b/crates/delta/src/routes/bots/delete.rs @@ -1,4 +1,8 @@ -use revolt_database::{util::reference::Reference, Database, User}; +use revolt_database::{ + util::reference::Reference, + voice::{remove_user_from_voice_channels, VoiceClient}, + Database, User, +}; use revolt_result::{create_error, Result}; use rocket::State; use rocket_empty::EmptyResponse; @@ -7,18 +11,23 @@ use rocket_empty::EmptyResponse; /// /// Delete a bot by its id. #[openapi(tag = "Bots")] -#[delete("/")] +#[delete("/")] pub async fn delete_bot( db: &State, + voice_client: &State, user: User, - target: Reference<'_>, + bot_id: Reference<'_>, ) -> Result { - let bot = target.as_bot(db).await?; + let bot = bot_id.as_bot(db).await?; if bot.owner != user.id { return Err(create_error!(NotFound)); } - bot.delete(db).await.map(|_| EmptyResponse) + bot.delete(db).await?; + + remove_user_from_voice_channels(voice_client, &bot.id).await?; + + Ok(EmptyResponse) } #[cfg(test)] diff --git a/crates/delta/src/routes/bots/edit.rs b/crates/delta/src/routes/bots/edit.rs index 6c454e135..a142ba462 100644 --- a/crates/delta/src/routes/bots/edit.rs +++ b/crates/delta/src/routes/bots/edit.rs @@ -10,11 +10,11 @@ use validator::Validate; /// /// Edit bot details by its id. #[openapi(tag = "Bots")] -#[patch("/", data = "")] +#[patch("/", data = "")] pub async fn edit_bot( db: &State, user: User, - target: Reference<'_>, + bot_id: Reference<'_>, data: Json, ) -> Result> { let data = data.into_inner(); @@ -24,7 +24,7 @@ pub async fn edit_bot( }) })?; - let mut bot = target.as_bot(db).await?; + let mut bot = bot_id.as_bot(db).await?; if bot.owner != user.id { return Err(create_error!(NotFound)); } diff --git a/crates/delta/src/routes/bots/fetch.rs b/crates/delta/src/routes/bots/fetch.rs index 586ce124e..344620cf5 100644 --- a/crates/delta/src/routes/bots/fetch.rs +++ b/crates/delta/src/routes/bots/fetch.rs @@ -7,17 +7,17 @@ use rocket::{serde::json::Json, State}; /// /// Fetch details of a bot you own by its id. #[openapi(tag = "Bots")] -#[get("/")] +#[get("/")] pub async fn fetch_bot( db: &State, user: User, - bot: Reference<'_>, + bot_id: Reference<'_>, ) -> Result> { if user.bot.is_some() { return Err(create_error!(IsBot)); } - let bot = bot.as_bot(db).await?; + let bot = bot_id.as_bot(db).await?; if bot.owner != user.id { return Err(create_error!(NotFound)); } diff --git a/crates/delta/src/routes/channels/channel_ack.rs b/crates/delta/src/routes/channels/channel_ack.rs index 2ae0d3b08..e20da642c 100644 --- a/crates/delta/src/routes/channels/channel_ack.rs +++ b/crates/delta/src/routes/channels/channel_ack.rs @@ -1,6 +1,6 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, - Database, User, + Database, User, AMQP, }; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; @@ -14,6 +14,7 @@ use rocket_empty::EmptyResponse; #[put("//ack/")] pub async fn ack( db: &State, + amqp: &State, user: User, target: Reference<'_>, message: Reference<'_>, @@ -29,7 +30,7 @@ pub async fn ack( .throw_if_lacking_channel_permission(ChannelPermission::ViewChannel)?; channel - .ack(&user.id, message.id) + .ack(&user.id, message.id, amqp) .await .map(|_| EmptyResponse) } diff --git a/crates/delta/src/routes/channels/channel_delete.rs b/crates/delta/src/routes/channels/channel_delete.rs index 9d2b37b82..82ed41373 100644 --- a/crates/delta/src/routes/channels/channel_delete.rs +++ b/crates/delta/src/routes/channels/channel_delete.rs @@ -1,5 +1,9 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, + voice::{ + delete_voice_channel, is_in_voice_channel, remove_user_from_voice_channel, + UserVoiceChannel, VoiceClient, + }, Channel, Database, PartialChannel, User, AMQP, }; use revolt_models::v0; @@ -15,6 +19,7 @@ use rocket_empty::EmptyResponse; #[delete("/?")] pub async fn delete( db: &State, + voice_client: &State, amqp: &State, user: User, target: Reference<'_>, @@ -26,34 +31,47 @@ pub async fn delete( permissions.throw_if_lacking_channel_permission(ChannelPermission::ViewChannel)?; + #[allow(deprecated)] match &channel { - Channel::SavedMessages { .. } => Err(create_error!(NoEffect)), - Channel::DirectMessage { .. } => channel - .update( - db, - PartialChannel { - active: Some(false), - ..Default::default() - }, - vec![], - ) - .await - .map(|_| EmptyResponse), - Channel::Group { .. } => channel - .remove_user_from_group( - db, - amqp, - &user, - None, - options.leave_silently.unwrap_or_default(), - ) - .await - .map(|_| EmptyResponse), - Channel::TextChannel { .. } | Channel::VoiceChannel { .. } => { + Channel::SavedMessages { .. } => Err(create_error!(NoEffect))?, + Channel::DirectMessage { .. } => { + channel + .update( + db, + PartialChannel { + active: Some(false), + ..Default::default() + }, + vec![], + ) + .await? + } + Channel::Group { .. } => { + channel + .remove_user_from_group( + db, + amqp, + &user, + None, + options.leave_silently.unwrap_or_default(), + ) + .await?; + + let user_voice_channel = UserVoiceChannel::from_channel(&channel); + + if is_in_voice_channel(&user.id, &user_voice_channel).await? { + remove_user_from_voice_channel(voice_client, &user_voice_channel, &user.id).await?; + }; + } + Channel::TextChannel { .. } => { permissions.throw_if_lacking_channel_permission(ChannelPermission::ManageChannel)?; - channel.delete(db).await.map(|_| EmptyResponse) + channel.delete(db).await?; + + delete_voice_channel(voice_client, &UserVoiceChannel::from_channel(&channel)).await?; } - } + }; + + Ok(EmptyResponse) } #[cfg(test)] diff --git a/crates/delta/src/routes/channels/channel_edit.rs b/crates/delta/src/routes/channels/channel_edit.rs index 881656f60..25ead30b5 100644 --- a/crates/delta/src/routes/channels/channel_edit.rs +++ b/crates/delta/src/routes/channels/channel_edit.rs @@ -1,5 +1,6 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, + voice::{delete_voice_channel, UserVoiceChannel, VoiceClient}, Channel, Database, File, PartialChannel, SystemMessage, User, AMQP, }; use revolt_models::v0; @@ -15,6 +16,7 @@ use validator::Validate; #[patch("/", data = "")] pub async fn edit( db: &State, + voice_client: &State, amqp: &State, user: User, target: Reference<'_>, @@ -38,6 +40,8 @@ pub async fn edit( && data.icon.is_none() && data.nsfw.is_none() && data.owner.is_none() + && data.voice.is_none() + && data.slowmode.is_none() && data.remove.is_empty() { return Ok(Json(channel.into())); @@ -95,22 +99,6 @@ pub async fn edit( icon, nsfw, .. - } - | Channel::TextChannel { - id, - name, - description, - icon, - nsfw, - .. - } - | Channel::VoiceChannel { - id, - name, - description, - icon, - nsfw, - .. } => { if data.remove.contains(&v0::FieldsChannel::Icon) { if let Some(icon) = &icon { @@ -151,73 +139,136 @@ pub async fn edit( } // Send out mutation system messages. - if let Channel::Group { .. } = &channel { - if let Some(name) = &partial.name { - SystemMessage::ChannelRenamed { - name: name.to_string(), - by: user.id.clone(), - } - .into_message(channel.id().to_string()) - .send( - db, - Some(amqp), - user.as_author_for_system(), - None, - None, - &channel, - false, - ) - .await - .ok(); + if let Some(name) = &partial.name { + SystemMessage::ChannelRenamed { + name: name.to_string(), + by: user.id.clone(), } + .into_message(channel.id().to_string()) + .send( + db, + Some(amqp), + user.as_author_for_system(), + None, + None, + &channel, + false, + ) + .await + .ok(); + } - if partial.description.is_some() { - SystemMessage::ChannelDescriptionChanged { - by: user.id.clone(), - } - .into_message(channel.id().to_string()) - .send( - db, - Some(amqp), - user.as_author_for_system(), - None, - None, - &channel, - false, - ) - .await - .ok(); + if partial.description.is_some() { + SystemMessage::ChannelDescriptionChanged { + by: user.id.clone(), + } + .into_message(channel.id().to_string()) + .send( + db, + Some(amqp), + user.as_author_for_system(), + None, + None, + &channel, + false, + ) + .await + .ok(); + } + + if partial.icon.is_some() { + SystemMessage::ChannelIconChanged { + by: user.id.clone(), + } + .into_message(channel.id().to_string()) + .send( + db, + Some(amqp), + user.as_author_for_system(), + None, + None, + &channel, + false, + ) + .await + .ok(); + } + } + Channel::TextChannel { + id, + name, + description, + icon, + nsfw, + voice, + slowmode, + .. + } => { + if data.remove.contains(&v0::FieldsChannel::Icon) { + if let Some(icon) = &icon { + db.mark_attachment_as_deleted(&icon.id).await?; } + } - if partial.icon.is_some() { - SystemMessage::ChannelIconChanged { - by: user.id.clone(), + for field in &data.remove { + match field { + v0::FieldsChannel::Description => { + description.take(); + } + v0::FieldsChannel::Icon => { + icon.take(); + } + v0::FieldsChannel::Voice => { + voice.take(); } - .into_message(channel.id().to_string()) - .send( - db, - Some(amqp), - user.as_author_for_system(), - None, - None, - &channel, - false, - ) - .await - .ok(); + _ => {} } } - channel - .update( - db, - partial, - data.remove.into_iter().map(|f| f.into()).collect(), - ) - .await?; + if let Some(icon_id) = data.icon { + partial.icon = Some(File::use_channel_icon(db, &icon_id, id, &user.id).await?); + *icon = partial.icon.clone(); + } + + if let Some(new_name) = data.name { + *name = new_name.clone(); + partial.name = Some(new_name); + } + + if let Some(new_description) = data.description { + partial.description = Some(new_description); + *description = partial.description.clone(); + } + + if let Some(new_nsfw) = data.nsfw { + *nsfw = new_nsfw; + partial.nsfw = Some(new_nsfw); + } + + if let Some(new_voice) = data.voice { + *voice = Some(new_voice.clone().into()); + partial.voice = Some(new_voice.into()); + } + + if let Some(new_slowmode) = data.slowmode { + *slowmode = Some(new_slowmode); + partial.slowmode = Some(new_slowmode); + } } _ => return Err(create_error!(InvalidOperation)), }; + channel + .update( + db, + partial, + data.remove.into_iter().map(|f| f.into()).collect(), + ) + .await?; + + if channel.voice().is_none() { + delete_voice_channel(voice_client, &UserVoiceChannel::from_channel(&channel)).await?; + } + Ok(Json(channel.into())) } diff --git a/crates/delta/src/routes/channels/group_remove_member.rs b/crates/delta/src/routes/channels/group_remove_member.rs index 467168bac..052216294 100644 --- a/crates/delta/src/routes/channels/group_remove_member.rs +++ b/crates/delta/src/routes/channels/group_remove_member.rs @@ -1,4 +1,6 @@ -use revolt_database::{util::reference::Reference, Channel, Database, User, AMQP}; +use revolt_database::{ + AMQP, Channel, Database, User, util::reference::Reference, voice::{UserVoiceChannel, VoiceClient, is_in_voice_channel, remove_user_from_voice_channel} +}; use revolt_permissions::ChannelPermission; use revolt_result::{create_error, Result}; @@ -9,46 +11,54 @@ use rocket_empty::EmptyResponse; /// /// Removes a user from the group. #[openapi(tag = "Groups")] -#[delete("//recipients/")] +#[delete("//recipients/")] pub async fn remove_member( db: &State, + voice_client: &State, amqp: &State, user: User, - target: Reference<'_>, - member: Reference<'_>, + group_id: Reference<'_>, + member_id: Reference<'_>, ) -> Result { if user.bot.is_some() { return Err(create_error!(IsBot)); } - let channel = target.as_channel(db).await?; - - match &channel { - Channel::Group { - owner, recipients, .. - } => { - if &user.id != owner { - return Err(create_error!(MissingPermission { - permission: ChannelPermission::ManageChannel.to_string() - })); - } - - let member = member.as_user(db).await?; - if user.id == member.id { - return Err(create_error!(CannotRemoveYourself)); - } - - if !recipients.iter().any(|x| *x == member.id) { - return Err(create_error!(NotInGroup)); - } - - channel - .remove_user_from_group(db, amqp, &member, Some(&user.id), false) - .await - .map(|_| EmptyResponse) + let channel = group_id.as_channel(db).await?; + + if let Channel::Group { + owner, recipients, .. + } = &channel + { + if &user.id != owner { + return Err(create_error!(MissingPermission { + permission: ChannelPermission::ManageChannel.to_string() + })); } - _ => Err(create_error!(InvalidOperation)), - } + + let member = member_id.as_user(db).await?; + if user.id == member.id { + return Err(create_error!(CannotRemoveYourself)); + } + + if !recipients.contains(&member.id) { + return Err(create_error!(NotInGroup)); + } + + channel + .remove_user_from_group(db, amqp, &member, Some(&user.id), false) + .await?; + } else { + return Err(create_error!(InvalidOperation)); + }; + + let user_voice_channel = UserVoiceChannel::from_channel(&channel); + + if is_in_voice_channel(member_id.id, &user_voice_channel).await? { + remove_user_from_voice_channel(voice_client, &user_voice_channel, member_id.id).await?; + }; + + Ok(EmptyResponse) } #[cfg(test)] diff --git a/crates/delta/src/routes/channels/message_bulk_delete.rs b/crates/delta/src/routes/channels/message_bulk_delete.rs index fdd538ff9..72578ee47 100644 --- a/crates/delta/src/routes/channels/message_bulk_delete.rs +++ b/crates/delta/src/routes/channels/message_bulk_delete.rs @@ -1,4 +1,5 @@ -use chrono::Utc; +use std::time::Duration; + use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, Database, Message, User, @@ -36,10 +37,9 @@ pub async fn bulk_delete_messages( if ulid::Ulid::from_string(id) .map_err(|_| create_error!(InvalidOperation))? .datetime() - .signed_duration_since(Utc::now()) - .num_days() - .abs() - > 7 + .elapsed() + .expect("Time went backwards") + > Duration::from_hours(7 * 24) // 7 days { return Err(create_error!(InvalidOperation)); } diff --git a/crates/delta/src/routes/channels/message_query.rs b/crates/delta/src/routes/channels/message_query.rs index 27df85e42..ff66e3757 100644 --- a/crates/delta/src/routes/channels/message_query.rs +++ b/crates/delta/src/routes/channels/message_query.rs @@ -1,6 +1,6 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, - Channel, Database, Message, MessageFilter, MessageQuery, MessageTimePeriod, User, + Database, Message, MessageFilter, MessageQuery, MessageTimePeriod, User, }; use revolt_models::v0::{self, MessageSort}; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; @@ -65,12 +65,7 @@ pub async fn query( }, &user, include_users, - match channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { - Some(server) - } - _ => None, - }, + channel.server(), ) .await .map(Json) diff --git a/crates/delta/src/routes/channels/message_search.rs b/crates/delta/src/routes/channels/message_search.rs index 85676823d..74bc20171 100644 --- a/crates/delta/src/routes/channels/message_search.rs +++ b/crates/delta/src/routes/channels/message_search.rs @@ -1,6 +1,6 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, - Channel, Database, Message, MessageFilter, MessageQuery, MessageTimePeriod, User, + Database, Message, MessageFilter, MessageQuery, MessageTimePeriod, User, }; use revolt_models::v0; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; @@ -31,7 +31,7 @@ pub async fn search( })?; if options.query.is_some() && options.pinned.is_some() { - return Err(create_error!(InvalidOperation)) + return Err(create_error!(InvalidOperation)); } let channel = target.as_channel(db).await?; @@ -69,12 +69,7 @@ pub async fn search( }, &user, include_users, - match channel { - Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { - Some(server) - } - _ => None, - }, + channel.server(), ) .await .map(Json) diff --git a/crates/delta/src/routes/channels/message_send.rs b/crates/delta/src/routes/channels/message_send.rs index cb05f94bc..a809df0c1 100644 --- a/crates/delta/src/routes/channels/message_send.rs +++ b/crates/delta/src/routes/channels/message_send.rs @@ -1,10 +1,14 @@ -use chrono::{Duration, Utc}; +use std::time::Duration; + +use redis_kiss::{get_connection, redis, AsyncCommands}; +use revolt_database::events::client::EventV1; use revolt_database::util::permissions::DatabasePermissionQuery; use revolt_database::{ util::idempotency::IdempotencyKey, util::reference::Reference, Database, User, }; -use revolt_database::{Interactions, Message, AMQP}; +use revolt_database::{Channel, Interactions, Message, AMQP}; use revolt_models::v0; +use revolt_models::v0::ChannelSlowmode; use revolt_permissions::PermissionQuery; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; @@ -57,6 +61,79 @@ pub async fn message_send( permissions.throw_if_lacking_channel_permission(ChannelPermission::UploadFiles)?; } + if !permissions.has_channel_permission(ChannelPermission::BypassSlowmode) { + if let Channel::TextChannel { + slowmode: Some(channel_slowmode), + id: channel_id, + .. + } = &channel + { + if *channel_slowmode > 0 { + if let Ok(conn) = get_connection().await { + let mut conn = conn.into_inner(); + + let slowmode_key = format!("slowmode:{}:{}", user.id, channel_id); + + // Atomic check-and-set: only set if absent and apply expiry in one command. + let set_result: Option = conn + .set_options( + &slowmode_key, + "1", // The value doesn't matter, only the key's existence + redis::SetOptions::default() + .conditional_set(redis::ExistenceCheck::NX) + .with_expiration(redis::SetExpiry::EX(*channel_slowmode as usize)), + ) + .await + .unwrap_or(None); + + if set_result.is_some() { + let idx_key = format!("slowmode_idx:{}", user.id); + conn.sadd::<_, _, ()>(&idx_key, channel_id.as_str()) + .await + .ok(); + conn.expire::<_, ()>(&idx_key, *channel_slowmode as usize) + .await + .ok(); + } + + // If `set_result` is None, the `NX` condition failed because the key already exists. + // This means the user is currently in slowmode. + if set_result.is_none() { + // Fetch the remaining TTL to accurately populate the retry_after field + let ttl: i64 = conn.ttl(&slowmode_key).await.unwrap_or(0); + + // Redis returns positive integers for valid TTLs + if ttl > 0 { + EventV1::UserSlowmodes { + slowmodes: vec![ChannelSlowmode { + channel_id: channel_id.to_string(), + duration: *channel_slowmode, + retry_after: ttl as u64, + }], + } + .private(user.id.clone()) + .await; + return Err(create_error!(InSlowmode { + retry_after: ttl as u64 + })); + } + } else { + EventV1::UserSlowmodes { + slowmodes: vec![ChannelSlowmode { + channel_id: channel_id.to_string(), + duration: *channel_slowmode, + retry_after: *channel_slowmode, + }], + } + .private(user.id.clone()) + .await; + } + } + // If Redis connection fails, just skip the slowmode check + } + } + } + // Ensure interactions information is correct if let Some(interactions) = &data.interactions { let interactions: Interactions = interactions.clone().into(); @@ -66,8 +143,12 @@ pub async fn message_send( // Disallow mentions for new users (TRUST-0: <12 hours age) in public servers let allow_mentions = if let Some(server) = query.server_ref() { if server.discoverable { - (Utc::now() - ulid::Ulid::from_string(&user.id).unwrap().datetime()) - >= Duration::hours(12) + (ulid::Ulid::from_string(&user.id) + .unwrap() + .datetime() + .elapsed() + .expect("Time went backwards")) + >= Duration::from_hours(12) } else { true } @@ -151,28 +232,20 @@ mod test { name: "Hidden Channel".to_string(), description: None, nsfw: Some(false), + voice: None, }, true, ) .await .expect("Failed to make new channel"); - let role = Role { - name: "Show Hidden Channel".to_string(), - permissions: OverrideField { a: 0, d: 0 }, - colour: None, - hoist: false, - rank: 5, - }; - - let role_id = role - .create(&harness.db, &server.id) + let role = Role::create(&harness.db, &server, "Show Hidden Channel".to_string()) .await .expect("Failed to create the role"); let mut overrides = HashMap::new(); overrides.insert( - role_id.clone(), + role.id.clone(), OverrideField { a: (ChannelPermission::ViewChannel) as i64, d: 0, @@ -193,6 +266,8 @@ mod test { d: ChannelPermission::ViewChannel as i64, }), last_message_id: None, + voice: None, + slowmode: None, }; locked_channel .update(&harness.db, partial, vec![]) @@ -279,14 +354,17 @@ mod test { "Mention failed to be scrubbed when the user cannot see the channel" ); - let second_member_roles = vec![role_id.clone()]; + let second_member_roles = vec![role.id.clone()]; let partial = PartialMember { id: None, joined_at: None, nickname: None, + pronouns: None, avatar: None, timeout: None, roles: Some(second_member_roles), + can_publish: None, + can_receive: None, }; second_member .update(&harness.db, partial, vec![]) @@ -492,7 +570,7 @@ mod test { let (_, _, other_user) = harness.new_user().await; let (server, _) = harness.new_server(&user).await; let channel = harness.new_channel(&server).await; - let (role_id, _role) = harness + let role = harness .new_role( &server, 1, @@ -514,7 +592,7 @@ mod test { Some(&harness.amqp), channel.clone(), v0::DataMessageSend { - content: Some(format!("Mentioning @everyone and role <%{}>", &role_id)), + content: Some(format!("Mentioning @everyone and role <%{}>", &role.id)), nonce: None, attachments: None, replies: None, @@ -559,7 +637,7 @@ mod test { Some(&harness.amqp), channel.clone(), v0::DataMessageSend { - content: Some(format!("Mentioning `@everyone` and role `<%{}>`", &role_id)), + content: Some(format!("Mentioning `@everyone` and role `<%{}>`", &role.id)), nonce: None, attachments: None, replies: None, @@ -601,7 +679,7 @@ mod test { "Role mentions detected when inside codeblock" ); - other_member.roles.push(role_id.clone()); + other_member.roles.push(role.id.clone()); harness .db .update_member( @@ -611,8 +689,11 @@ mod test { id: None, joined_at: None, nickname: None, - roles: Some(vec![role_id.clone()]), + pronouns: None, + roles: Some(vec![role.id.clone()]), timeout: None, + can_publish: None, + can_receive: None, }, vec![], ) @@ -626,7 +707,7 @@ mod test { Some(&harness.amqp), channel.clone(), v0::DataMessageSend { - content: Some(format!("Mentioning @everyone and role <%{}>", &role_id)), + content: Some(format!("Mentioning @everyone and role <%{}>", &role.id)), nonce: None, attachments: None, replies: None, diff --git a/crates/delta/src/routes/channels/message_unpin.rs b/crates/delta/src/routes/channels/message_unpin.rs index 3770606da..421848953 100644 --- a/crates/delta/src/routes/channels/message_unpin.rs +++ b/crates/delta/src/routes/channels/message_unpin.rs @@ -1,4 +1,7 @@ -use revolt_database::{util::{permissions::DatabasePermissionQuery, reference::Reference}, Channel, Database, FieldsMessage, PartialMessage, SystemMessage, User, AMQP}; +use revolt_database::{ + util::{permissions::DatabasePermissionQuery, reference::Reference}, + Channel, Database, FieldsMessage, PartialMessage, SystemMessage, User, AMQP, +}; use revolt_models::v0::MessageAuthor; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; diff --git a/crates/delta/src/routes/channels/mod.rs b/crates/delta/src/routes/channels/mod.rs index c57fbaa88..5d3fbc850 100644 --- a/crates/delta/src/routes/channels/mod.rs +++ b/crates/delta/src/routes/channels/mod.rs @@ -25,6 +25,7 @@ mod message_unreact; mod permissions_set; mod permissions_set_default; mod voice_join; +mod voice_stop_ring; mod webhook_create; mod webhook_fetch_all; @@ -49,6 +50,7 @@ pub fn routes() -> (Vec, OpenApi) { group_add_member::add_member, group_remove_member::remove_member, voice_join::call, + voice_stop_ring::stop_ring, permissions_set::set_role_permissions, permissions_set_default::set_default_channel_permissions, message_react::react_message, diff --git a/crates/delta/src/routes/channels/permissions_set.rs b/crates/delta/src/routes/channels/permissions_set.rs index ee42e403d..c0d89f11c 100644 --- a/crates/delta/src/routes/channels/permissions_set.rs +++ b/crates/delta/src/routes/channels/permissions_set.rs @@ -1,9 +1,8 @@ use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, - Database, User, + util::{permissions::DatabasePermissionQuery, reference::Reference}, voice::{sync_voice_permissions, VoiceClient}, Database, User }; use revolt_models::v0; -use revolt_permissions::{calculate_channel_permissions, ChannelPermission, Override}; +use revolt_permissions::{calculate_channel_permissions, ChannelPermission, Override, PermissionQuery}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; @@ -11,25 +10,30 @@ use rocket::{serde::json::Json, State}; /// /// Sets permissions for the specified role in this channel. /// -/// Channel must be a `TextChannel` or `VoiceChannel`. +/// Channel must be a `TextChannel`. #[openapi(tag = "Channel Permissions")] #[put("//permissions/", data = "", rank = 2)] pub async fn set_role_permissions( db: &State, + voice_client: &State, user: User, target: Reference<'_>, role_id: String, data: Json, ) -> Result> { - let mut channel = target.as_channel(db).await?; + let channel = target.as_channel(db).await?; let mut query = DatabasePermissionQuery::new(db, &user).channel(&channel); - let permissions = calculate_channel_permissions(&mut query).await; + let permissions: revolt_permissions::PermissionValue = calculate_channel_permissions(&mut query).await; + + query.set_server_from_channel().await; permissions.throw_if_lacking_channel_permission(ChannelPermission::ManagePermissions)?; if let Some(server) = query.server_ref() { if let Some(role) = server.roles.get(&role_id) { - if role.rank <= query.get_member_rank().unwrap_or(i64::MIN) { + if server.owner != user.id + && role.rank <= query.get_member_rank().unwrap_or(i64::MIN) + { return Err(create_error!(NotElevated)); } @@ -38,11 +42,15 @@ pub async fn set_role_permissions( .throw_permission_override(current_value, &data.permissions) .await?; - channel + let mut new_channel = channel.clone(); + + new_channel .set_role_permission(db, &role_id, data.permissions.clone().into()) .await?; - Ok(Json(channel.into())) + sync_voice_permissions(db, voice_client, &new_channel, Some(server), Some(&role_id)).await?; + + Ok(Json(new_channel.into())) } else { Err(create_error!(NotFound)) } diff --git a/crates/delta/src/routes/channels/permissions_set_default.rs b/crates/delta/src/routes/channels/permissions_set_default.rs index 700b29e42..ad14a88ea 100644 --- a/crates/delta/src/routes/channels/permissions_set_default.rs +++ b/crates/delta/src/routes/channels/permissions_set_default.rs @@ -1,6 +1,5 @@ use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, - Channel, Database, PartialChannel, User, + util::{permissions::DatabasePermissionQuery, reference::Reference}, voice::{sync_voice_permissions, VoiceClient}, Channel, Database, PartialChannel, User }; use revolt_models::v0::{self, DataDefaultChannelPermissions}; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; @@ -11,11 +10,12 @@ use rocket::{serde::json::Json, State}; /// /// Sets permissions for the default role in this channel. /// -/// Channel must be a `Group`, `TextChannel` or `VoiceChannel`. +/// Channel must be a `Group` or `TextChannel`. #[openapi(tag = "Channel Permissions")] #[put("//permissions/default", data = "", rank = 1)] pub async fn set_default_channel_permissions( db: &State, + voice_client: &State, user: User, target: Reference<'_>, data: Json, @@ -48,10 +48,6 @@ pub async fn set_default_channel_permissions( Channel::TextChannel { default_permissions, .. - } - | Channel::VoiceChannel { - default_permissions, - .. } => { if let DataDefaultChannelPermissions::Field { permissions: field } = data { permissions @@ -75,5 +71,12 @@ pub async fn set_default_channel_permissions( _ => return Err(create_error!(InvalidOperation)), } + let server = match channel.server() { + Some(server_id) => Some(Reference::from_unchecked(server_id).as_server(db).await?), + None => None + }; + + sync_voice_permissions(db, voice_client, &channel, server.as_ref(), None).await?; + Ok(Json(channel.into())) } diff --git a/crates/delta/src/routes/channels/voice_join.rs b/crates/delta/src/routes/channels/voice_join.rs index c04e00118..0d8aecddd 100644 --- a/crates/delta/src/routes/channels/voice_join.rs +++ b/crates/delta/src/routes/channels/voice_join.rs @@ -1,105 +1,121 @@ use revolt_config::config; use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, - Channel, Database, User, + util::{permissions::perms, reference::Reference}, + voice::{ + delete_voice_state, get_channel_node, get_user_voice_channels, get_voice_channel_members, + raise_if_in_voice, set_call_notification_recipients, set_channel_node, UserVoiceChannel, + VoiceClient, + }, + Database, User, }; use revolt_models::v0; use revolt_permissions::{calculate_channel_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; + use rocket::{serde::json::Json, State}; /// # Join Call /// /// Asks the voice server for a token to join the call. #[openapi(tag = "Voice")] -#[post("//join_call")] +#[post("//join_call", data = "")] pub async fn call( db: &State, + voice_client: &State, user: User, target: Reference<'_>, -) -> Result> { + data: Json, +) -> Result> { + if !voice_client.is_enabled() { + return Err(create_error!(LiveKitUnavailable)); + } + + let v0::DataJoinCall { + node, + force_disconnect, + recipients, + } = data.into_inner(); + + if user.bot.is_some() && force_disconnect == Some(true) { + return Err(create_error!(IsBot)); + } + let channel = target.as_channel(db).await?; - let mut query = DatabasePermissionQuery::new(db, &user).channel(&channel); - calculate_channel_permissions(&mut query) - .await - .throw_if_lacking_channel_permission(ChannelPermission::Connect)?; - let config = config().await; - if config.api.security.voso_legacy_token.is_empty() { - return Err(create_error!(VosoUnavailable)); + let Some(voice_info) = channel.voice() else { + return Err(create_error!(NotAVoiceChannel)); + }; + + let mut permissions = perms(db, &user).channel(&channel); + + let current_permissions = calculate_channel_permissions(&mut permissions).await; + current_permissions.throw_if_lacking_channel_permission(ChannelPermission::Connect)?; + + let user_voice_channel = UserVoiceChannel::from_channel(&channel); + + if get_voice_channel_members(&user_voice_channel) + .await? + .zip(voice_info.max_users) + .is_some_and(|(ms, max_users)| ms.len() >= max_users) + && !current_permissions.has(ChannelPermission::ManageChannel as u64) + { + return Err(create_error!(CannotJoinCall)); } - match channel { - Channel::SavedMessages { .. } | Channel::TextChannel { .. } => { - return Err(create_error!(CannotJoinCall)) + let existing_node = get_channel_node(channel.id()).await?; + let has_existing_node = existing_node.is_some(); // we move existing_node in the next statement so this is the quickest way to know if we need to set it. + + let node = existing_node + .or(node) + .ok_or_else(|| create_error!(UnknownNode))?; + + let config = config().await; + + let node_host = config + .hosts + .livekit + .get(&node) + .ok_or_else(|| create_error!(UnknownNode))? + .clone(); + + if force_disconnect == Some(true) { + // Finds and disconnects any existing voice connections by the user, + // should only ever loop once but just to cover our backs. + + for previous_channel in get_user_voice_channels(&user.id).await? { + if let Some(node) = get_channel_node(&previous_channel.id).await? { + // if this errors its just a mismatching state - ignore and proceed to still delete our state + let _ = voice_client + .remove_user(&node, &user.id, &previous_channel.id) + .await; + }; + + delete_voice_state(&previous_channel, &user.id).await?; } - _ => {} + } else { + raise_if_in_voice(&user, &user_voice_channel).await?; } - // To join a call: - // - Check if the room exists. - // - If not, create it. - let client = reqwest::Client::new(); - let result = client - .get(format!( - "{}/room/{}", - config.hosts.voso_legacy, - channel.id() - )) - .header( - reqwest::header::AUTHORIZATION, - config.api.security.voso_legacy_token.clone(), - ) - .send() - .await; - - match result { - Err(_) => return Err(create_error!(VosoUnavailable)), - Ok(result) => match result.status() { - reqwest::StatusCode::OK => (), - reqwest::StatusCode::NOT_FOUND => { - if (client - .post(format!( - "{}/room/{}", - config.hosts.voso_legacy, - channel.id() - )) - .header( - reqwest::header::AUTHORIZATION, - config.api.security.voso_legacy_token.clone(), - ) - .send() - .await) - .is_err() - { - return Err(create_error!(VosoUnavailable)); - } - } - _ => return Err(create_error!(VosoUnavailable)), - }, + let token = voice_client + .create_token(&node, db, &user, current_permissions, &channel) + .await?; + + let room = voice_client.create_room(&node, &channel).await?; + + if !has_existing_node { + set_channel_node(channel.id(), &node).await?; } - // Then create a user for the room. - if let Ok(response) = client - .post(format!( - "{}/room/{}/user/{}", - config.hosts.voso_legacy, - channel.id(), - user.id - )) - .header( - reqwest::header::AUTHORIZATION, - config.api.security.voso_legacy_token, - ) - .send() - .await - { - response - .json() - .await - .map_err(|_| create_error!(InvalidOperation)) - .map(Json) - } else { - Err(create_error!(VosoUnavailable)) + log::debug!("Created room {}", room.name); + + if let Some(recipients) = recipients { + if room.num_participants == 0 && !recipients.is_empty() { + set_call_notification_recipients(channel.id(), &user.id, &recipients).await?; + } } + + Ok(Json(v0::CreateVoiceUserResponse { + token, + url: node_host.clone(), + })) } diff --git a/crates/delta/src/routes/channels/voice_stop_ring.rs b/crates/delta/src/routes/channels/voice_stop_ring.rs new file mode 100644 index 000000000..768b861a3 --- /dev/null +++ b/crates/delta/src/routes/channels/voice_stop_ring.rs @@ -0,0 +1,75 @@ +use revolt_database::{ + util::reference::Reference, + voice::{get_voice_state, UserVoiceChannel, VoiceClient}, + Channel, Database, User, AMQP, +}; +use revolt_result::{create_error, Result, ToRevoltError}; + +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Stop Ring +/// Stops ringing a specific user in a dm call. +/// You must be in the call to use this endpoint, returns NotConnected otherwise. +/// Only valid in DM/Group channels, will return NoEffect in servers. +/// Returns NotFound if the user is not in the dm/group channel +#[openapi(tag = "Voice")] +#[put("//end_ring/")] +pub async fn stop_ring( + db: &State, + amqp: &State, + voice: &State, + user: User, + target: Reference<'_>, + target_user: Reference<'_>, +) -> Result { + if !voice.is_enabled() { + return Err(create_error!(LiveKitUnavailable)); + } + + let channel = target.as_channel(db).await?; + if channel.server().is_some() { + return Err(create_error!(NoEffect)); + } + + if get_voice_state( + &UserVoiceChannel { + id: channel.id().to_string(), + server_id: None, + }, + &user.id, + ) + .await? + .is_none() + { + return Err(create_error!(NotConnected)); + } + + let members = match channel { + Channel::DirectMessage { ref recipients, .. } | Channel::Group { ref recipients, .. } => { + recipients + } + _ => return Err(create_error!(NoEffect)), + }; + + if members.iter().any(|m| target_user.id == m) { + if let Err(e) = amqp + .dm_call_updated( + &user.id, + channel.id(), + None, + true, + Some(vec![target_user.id.to_string()]), + ) + .await + .to_internal_error() + { + revolt_config::capture_internal_error!(&e); + return Err(e); + } + + Ok(EmptyResponse) + } else { + Err(create_error!(NotFound)) + } +} diff --git a/crates/delta/src/routes/channels/webhook_create.rs b/crates/delta/src/routes/channels/webhook_create.rs index 71f8e8dee..dc8cad64d 100644 --- a/crates/delta/src/routes/channels/webhook_create.rs +++ b/crates/delta/src/routes/channels/webhook_create.rs @@ -15,11 +15,11 @@ use validator::Validate; /// /// Creates a webhook which 3rd party platforms can use to send messages #[openapi(tag = "Webhooks")] -#[post("//webhooks", data = "")] +#[post("//webhooks", data = "")] pub async fn create_webhook( db: &State, user: User, - target: Reference<'_>, + channel_id: Reference<'_>, data: Json, ) -> Result> { let data = data.into_inner(); @@ -29,7 +29,7 @@ pub async fn create_webhook( }) })?; - let channel = target.as_channel(db).await?; + let channel = channel_id.as_channel(db).await?; if !matches!(channel, Channel::TextChannel { .. } | Channel::Group { .. }) { return Err(create_error!(InvalidOperation)); diff --git a/crates/delta/src/routes/customisation/emoji_create.rs b/crates/delta/src/routes/customisation/emoji_create.rs index d8288dae7..52b5c9043 100644 --- a/crates/delta/src/routes/customisation/emoji_create.rs +++ b/crates/delta/src/routes/customisation/emoji_create.rs @@ -11,11 +11,11 @@ use rocket::{serde::json::Json, State}; /// /// Create an emoji by its Autumn upload id. #[openapi(tag = "Emojis")] -#[put("/emoji/", data = "")] +#[put("/emoji/", data = "")] pub async fn create_emoji( db: &State, user: User, - id: String, + emoji_id: String, data: Json, ) -> Result> { let config = config().await; @@ -50,11 +50,11 @@ pub async fn create_emoji( }; // Find the relevant attachment - let attachment = File::use_emoji(db, &id, &id, &user.id).await?; + let attachment = File::use_emoji(db, &emoji_id, &emoji_id, &user.id).await?; // Create the emoji object let emoji = Emoji { - id, + id: emoji_id, parent: data.parent.into(), creator_id: user.id, name: data.name, diff --git a/crates/delta/src/routes/customisation/emoji_edit.rs b/crates/delta/src/routes/customisation/emoji_edit.rs new file mode 100644 index 000000000..72e99e341 --- /dev/null +++ b/crates/delta/src/routes/customisation/emoji_edit.rs @@ -0,0 +1,212 @@ +use revolt_database::{ + util::{permissions::DatabasePermissionQuery, reference::Reference}, + Database, EmojiParent, PartialEmoji, User, +}; +use revolt_models::v0; +use revolt_permissions::{calculate_server_permissions, ChannelPermission}; +use revolt_result::{create_error, Result}; +use rocket::{serde::json::Json, State}; +use validator::Validate; + +/// # Edit Emoji +/// +/// Edit an emoji by its id. +#[openapi(tag = "Emojis")] +#[patch("/emoji/", data = "")] +pub async fn edit_emoji( + db: &State, + user: User, + emoji_id: Reference<'_>, + data: Json, +) -> Result> { + let data = data.into_inner(); + data.validate().map_err(|error| { + create_error!(FailedValidation { + error: error.to_string() + }) + })?; + + let mut emoji = emoji_id.as_emoji(db).await?; + + match &emoji.parent { + EmojiParent::Server { id } => { + let server = db.fetch_server(id.as_str()).await?; + + let mut query = DatabasePermissionQuery::new(db, &user).server(&server); + calculate_server_permissions(&mut query) + .await + .throw_if_lacking_channel_permission(ChannelPermission::ManageCustomisation)?; + } + EmojiParent::Detached => return Err(create_error!(NotAuthenticated)), + } + + if data.name.is_none() { + return Ok(Json(emoji.into())); + } + + let partial = PartialEmoji { name: data.name }; + emoji.update(db, partial).await?; + + Ok(Json(emoji.into())) +} + +#[cfg(test)] +mod test { + use crate::util::test::TestHarness; + use revolt_database::{Emoji, EmojiParent, Member}; + use revolt_models::v0; + use rocket::http::{ContentType, Header, Status}; + use ulid::Ulid; + + #[rocket::async_test] + async fn edit_emoji_name_as_creator() { + let harness = TestHarness::new().await; + let (_, session, user) = harness.new_user().await; + let (server, _) = harness.new_server(&user).await; + + let emoji_id = Ulid::new().to_string(); + let emoji = Emoji { + id: emoji_id.clone(), + parent: EmojiParent::Server { + id: server.id.clone(), + }, + creator_id: user.id.clone(), + name: "initial_name".to_string(), + animated: false, + nsfw: false, + }; + emoji.create(&harness.db).await.expect("`Emoji` created"); + + let response = harness + .client + .patch(format!("/custom/emoji/{emoji_id}")) + .header(Header::new("x-session-token", session.token.to_string())) + .header(ContentType::JSON) + .body( + json!(v0::DataEditEmoji { + name: Some("renamed_emoji".to_string()), + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(response.status(), Status::Ok); + + let edited: v0::Emoji = response.into_json().await.expect("`Emoji`"); + assert_eq!(edited.name, "renamed_emoji"); + } + + #[rocket::async_test] + async fn reject_invalid_emoji_name() { + let harness = TestHarness::new().await; + let (_, session, user) = harness.new_user().await; + let (server, _) = harness.new_server(&user).await; + + let emoji_id = Ulid::new().to_string(); + let emoji = Emoji { + id: emoji_id.clone(), + parent: EmojiParent::Server { + id: server.id.clone(), + }, + creator_id: user.id.clone(), + name: "valid_name".to_string(), + animated: false, + nsfw: false, + }; + emoji.create(&harness.db).await.expect("`Emoji` created"); + + let response = harness + .client + .patch(format!("/custom/emoji/{emoji_id}")) + .header(Header::new("x-session-token", session.token.to_string())) + .header(ContentType::JSON) + .body( + json!(v0::DataEditEmoji { + name: Some("Invalid Name".to_string()), + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(response.status(), Status::BadRequest); + } + + #[rocket::async_test] + async fn reject_edit_for_detached_emoji() { + let harness = TestHarness::new().await; + let (_, session, user) = harness.new_user().await; + + let emoji_id = Ulid::new().to_string(); + let emoji = Emoji { + id: emoji_id.clone(), + parent: EmojiParent::Detached, + creator_id: user.id.clone(), + name: "detached_name".to_string(), + animated: false, + nsfw: false, + }; + emoji.create(&harness.db).await.expect("`Emoji` created"); + + let response = harness + .client + .patch(format!("/custom/emoji/{emoji_id}")) + .header(Header::new("x-session-token", session.token.to_string())) + .header(ContentType::JSON) + .body( + json!(v0::DataEditEmoji { + name: Some("should_not_apply".to_string()), + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(response.status(), Status::Unauthorized); + } + + #[rocket::async_test] + async fn reject_edit_for_creator_without_manage_customisation() { + let harness = TestHarness::new().await; + let (_, _, owner) = harness.new_user().await; + let (_, creator_session, creator) = harness.new_user().await; + let (server, _) = harness.new_server(&owner).await; + + Member::create(&harness.db, &server, &creator, None) + .await + .expect("`Member` created"); + + let emoji_id = Ulid::new().to_string(); + let emoji = Emoji { + id: emoji_id.clone(), + parent: EmojiParent::Server { + id: server.id.clone(), + }, + creator_id: creator.id.clone(), + name: "member_uploaded_name".to_string(), + animated: false, + nsfw: false, + }; + emoji.create(&harness.db).await.expect("`Emoji` created"); + + let response = harness + .client + .patch(format!("/custom/emoji/{emoji_id}")) + .header(Header::new( + "x-session-token", + creator_session.token.to_string(), + )) + .header(ContentType::JSON) + .body( + json!(v0::DataEditEmoji { + name: Some("renamed_without_permission".to_string()), + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(response.status(), Status::Forbidden); + } +} diff --git a/crates/delta/src/routes/customisation/mod.rs b/crates/delta/src/routes/customisation/mod.rs index 56d40995d..5ff6f6992 100644 --- a/crates/delta/src/routes/customisation/mod.rs +++ b/crates/delta/src/routes/customisation/mod.rs @@ -3,12 +3,14 @@ use rocket::Route; mod emoji_create; mod emoji_delete; +mod emoji_edit; mod emoji_fetch; pub fn routes() -> (Vec, OpenApi) { openapi_get_routes_spec![ emoji_create::create_emoji, emoji_delete::delete_emoji, + emoji_edit::edit_emoji, emoji_fetch::fetch_emoji ] } diff --git a/crates/delta/src/routes/invites/invite_fetch.rs b/crates/delta/src/routes/invites/invite_fetch.rs index 7c44d4ae6..7c1b7550c 100644 --- a/crates/delta/src/routes/invites/invite_fetch.rs +++ b/crates/delta/src/routes/invites/invite_fetch.rs @@ -23,13 +23,6 @@ pub async fn fetch(db: &State, target: Reference<'_>) -> Result { let server = db.fetch_server(&server).await?; @@ -202,6 +195,7 @@ mod test { name: "Voice Channel".to_string(), description: None, nsfw: Some(false), + voice: None }, true, ) diff --git a/crates/delta/src/routes/mfa/create_ticket.rs b/crates/delta/src/routes/mfa/create_ticket.rs new file mode 100644 index 000000000..aa3f00f31 --- /dev/null +++ b/crates/delta/src/routes/mfa/create_ticket.rs @@ -0,0 +1,157 @@ +//! Create a new MFA ticket or validate an existing one. +//! PUT /mfa/ticket +use revolt_result::{Result, create_error}; +use revolt_database::{Account, Database, MFATicket, UnvalidatedTicket}; +use revolt_models::v0; +use rocket::serde::json::Json; +use rocket::State; + + +/// # Create MFA ticket +/// +/// Create a new MFA ticket or validate an existing one. +#[openapi(tag = "MFA")] +#[put("/ticket", data = "")] +pub async fn create_ticket( + db: &State, + account: Option, + existing_ticket: Option, + data: Json, +) -> Result> { + // Find the relevant account + let mut account = match (account, existing_ticket) { + (Some(_), Some(_)) => return Err(create_error!(OperationFailed)), + (Some(account), _) => account, + (_, Some(ticket)) => { + db.delete_ticket(&ticket.id).await?; + db.fetch_account(&ticket.account_id).await? + } + _ => return Err(create_error!(InvalidToken)), + }; + + // Validate the MFA response + account + .consume_mfa_response(db, data.into_inner(), None) + .await?; + + // Create a new ticket for this account + let ticket = MFATicket::new(account.id, true); + ticket.save(db).await?; + Ok(Json(ticket.into())) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::Totp; + use rocket::http::{Header, Status}; + use revolt_models::v0; + use revolt_result::{Error, ErrorType}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (_, session, _) = harness.new_user().await; + + let res = harness.client + .put("/auth/mfa/ticket") + .header(Header::new("X-Session-Token", session.token.clone())) + .body( + json!({ + "password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(res.into_json::().await.unwrap().validated); + } + + #[rocket::async_test] + async fn success_totp() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + account.mfa.totp_token = Totp::Enabled { + secret: "secret".to_string(), + }; + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .put("/auth/mfa/ticket") + .header(Header::new("X-Session-Token", session.token.clone())) + .body( + json!({ + "totp_code": Totp::Enabled { + secret: "secret".to_string(), + }.generate_code().unwrap() + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(res.into_json::().await.is_some()); + } + + #[rocket::async_test] + async fn failure_totp() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + account.mfa.totp_token = Totp::Enabled { + secret: "secret".to_string(), + }; + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .put("/auth/mfa/ticket") + .header(Header::new("X-Session-Token", session.token.clone())) + .body( + json!({ + "totp_code": "000000" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::InvalidToken, + )); + } + + #[rocket::async_test] + async fn failure_no_totp() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + account.mfa.totp_token = Totp::Enabled { + secret: "secret".to_string(), + }; + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .put("/auth/mfa/ticket") + .header(Header::new("X-Session-Token", session.token.clone())) + .body( + json!({ + "password": "this is the wrong mfa method" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::BadRequest); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::DisallowedMFAMethod, + )); + } +} diff --git a/crates/delta/src/routes/mfa/fetch_recovery.rs b/crates/delta/src/routes/mfa/fetch_recovery.rs new file mode 100644 index 000000000..65a20a1d6 --- /dev/null +++ b/crates/delta/src/routes/mfa/fetch_recovery.rs @@ -0,0 +1,45 @@ +//! Fetch recovery codes for an account. +//! POST /mfa/recovery +use rocket::serde::json::Json; +use revolt_database::{Account, ValidatedTicket}; +use revolt_result::Result; + +/// # Fetch Recovery Codes +/// +/// Fetch recovery codes for an account. +#[openapi(tag = "MFA")] +#[post("/recovery")] +pub async fn fetch_recovery( + account: Account, + _ticket: ValidatedTicket, +) -> Result>> { + Ok(Json(account.mfa.recovery_codes)) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::MFATicket; + use rocket::http::{ContentType, Header, Status}; + + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let ticket = MFATicket::new(account.id, true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/mfa/recovery") + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .header(ContentType::JSON) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(res.into_json::>().await.unwrap().is_empty()); + } +} diff --git a/crates/delta/src/routes/mfa/fetch_status.rs b/crates/delta/src/routes/mfa/fetch_status.rs new file mode 100644 index 000000000..0c138b05e --- /dev/null +++ b/crates/delta/src/routes/mfa/fetch_status.rs @@ -0,0 +1,37 @@ +//! Fetch MFA status of an account. +//! GET /mfa +use revolt_database::Account; +use revolt_result::Result; +use revolt_models::v0; +use rocket::serde::json::Json; + +/// # MFA Status +/// +/// Fetch MFA status of an account. +#[openapi(tag = "MFA")] +#[get("/")] +pub async fn fetch_status(account: Account) -> Result> { + Ok(Json(account.mfa.into())) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use rocket::http::{Header, Status}; + use revolt_models::v0; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (_, session, _) = harness.new_user().await; + + let res = harness.client + .get("/auth/mfa") + .header(Header::new("X-Session-Token", session.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(res.into_json::().await.is_some()); + } +} diff --git a/crates/delta/src/routes/mfa/generate_recovery.rs b/crates/delta/src/routes/mfa/generate_recovery.rs new file mode 100644 index 000000000..37edac9a9 --- /dev/null +++ b/crates/delta/src/routes/mfa/generate_recovery.rs @@ -0,0 +1,66 @@ +//! Re-generate recovery codes for an account. +//! PATCH /mfa/recovery +use revolt_database::{Account, ValidatedTicket, Database}; +use revolt_result::Result; +use rocket::serde::json::Json; +use rocket::State; + +/// # Generate Recovery Codes +/// +/// Re-generate recovery codes for an account. +#[openapi(tag = "MFA")] +#[patch("/recovery")] +pub async fn generate_recovery( + db: &State, + mut account: Account, + _ticket: ValidatedTicket, +) -> Result>> { + // Generate new codes + account.mfa.generate_recovery_codes(); + + // Save account model + account.save(db).await?; + + // Return them to the user + Ok(Json(account.mfa.recovery_codes)) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::MFATicket; + use rocket::http::{ContentType, Header, Status}; + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let ticket1 = MFATicket::new(account.id.to_string(), true); + ticket1.save(&harness.db).await.unwrap(); + + let ticket2 = MFATicket::new(account.id, true); + ticket2.save(&harness.db).await.unwrap(); + + let res = harness.client + .patch("/auth/mfa/recovery") + .header(Header::new("X-Session-Token", session.token.clone())) + .header(Header::new("X-MFA-Ticket", ticket1.token)) + .header(ContentType::JSON) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(res.into_json::>().await.is_some()); + + let res = harness.client + .post("/auth/mfa/recovery") + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket2.token)) + .header(ContentType::JSON) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert_eq!(res.into_json::>().await.unwrap().len(), 10); + } +} diff --git a/crates/delta/src/routes/mfa/get_mfa_methods.rs b/crates/delta/src/routes/mfa/get_mfa_methods.rs new file mode 100644 index 000000000..9f13e8e9c --- /dev/null +++ b/crates/delta/src/routes/mfa/get_mfa_methods.rs @@ -0,0 +1,71 @@ +//! Fetch available MFA methods. +//! GET /mfa/methods +use revolt_database::Account; +use revolt_models::v0; +use rocket::serde::json::Json; + +/// # Get MFA Methods +/// +/// Fetch available MFA methods. +#[openapi(tag = "MFA")] +#[get("/methods")] +pub async fn get_mfa_methods(account: Account) -> Json> { + Json( + account + .mfa + .get_methods() + .into_iter() + .map(Into::into) + .collect(), + ) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::Totp; + use rocket::http::{Header, Status}; + use revolt_models::v0; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (_, session, _) = harness.new_user().await; + + let res = harness.client + .get("/auth/mfa/methods") + .header(Header::new("X-Session-Token", session.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert_eq!( + res.into_json::>().await.unwrap(), + vec![v0::MFAMethod::Password] + ); + } + + #[rocket::async_test] + async fn success_has_recovery_and_totp() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + account.mfa.totp_token = Totp::Enabled { + secret: "some".to_string(), + }; + account.mfa.generate_recovery_codes(); + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .get("/auth/mfa/methods") + .header(Header::new("X-Session-Token", session.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert_eq!( + res.into_json::>().await.unwrap(), + vec![v0::MFAMethod::Totp, v0::MFAMethod::Recovery] + ); + } +} diff --git a/crates/delta/src/routes/mfa/mod.rs b/crates/delta/src/routes/mfa/mod.rs new file mode 100644 index 000000000..1b7c9e9b4 --- /dev/null +++ b/crates/delta/src/routes/mfa/mod.rs @@ -0,0 +1,24 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; +use rocket::Route; + +pub mod create_ticket; +pub mod fetch_recovery; +pub mod fetch_status; +pub mod generate_recovery; +pub mod get_mfa_methods; +pub mod totp_disable; +pub mod totp_enable; +pub mod totp_generate_secret; + +pub fn routes() -> (Vec, OpenApi) { + openapi_get_routes_spec![ + create_ticket::create_ticket, + fetch_status::fetch_status, + fetch_recovery::fetch_recovery, + generate_recovery::generate_recovery, + get_mfa_methods::get_mfa_methods, + totp_disable::totp_disable, + totp_enable::totp_enable, + totp_generate_secret::totp_generate_secret, + ] +} diff --git a/crates/delta/src/routes/mfa/totp_disable.rs b/crates/delta/src/routes/mfa/totp_disable.rs new file mode 100644 index 000000000..283483155 --- /dev/null +++ b/crates/delta/src/routes/mfa/totp_disable.rs @@ -0,0 +1,49 @@ +//! Disable TOTP 2FA. +//! DELETE /mfa/totp +use revolt_database::{Database, Account, ValidatedTicket, Totp}; +use revolt_result::Result; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Disable TOTP 2FA +/// +/// Disable TOTP 2FA for an account. +#[openapi(tag = "MFA")] +#[delete("/totp")] +pub async fn totp_disable( + db: &State, + mut account: Account, + _ticket: ValidatedTicket, +) -> Result { + // Disable TOTP + account.mfa.totp_token = Totp::Disabled; + + // Save model to database + account.save(db).await.map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::MFATicket; + use rocket::http::{Header, Status}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let ticket = MFATicket::new(account.id, true); + ticket.save(&harness.db).await.unwrap(); + + + let res = harness.client + .delete("/auth/mfa/totp") + .header(Header::new("X-Session-Token", session.token.clone())) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + } +} diff --git a/crates/delta/src/routes/mfa/totp_enable.rs b/crates/delta/src/routes/mfa/totp_enable.rs new file mode 100644 index 000000000..ca06e4613 --- /dev/null +++ b/crates/delta/src/routes/mfa/totp_enable.rs @@ -0,0 +1,102 @@ +//! Generate a new secret for TOTP. +//! POST /mfa/totp +use revolt_database::{Database, Account}; +use revolt_models::v0; +use revolt_result::Result; +use rocket::serde::json::Json; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Enable TOTP 2FA +/// +/// Generate a new secret for TOTP. +#[openapi(tag = "MFA")] +#[put("/totp", data = "")] +pub async fn totp_enable( + db: &State, + mut account: Account, + data: Json, +) -> Result { + // Enable TOTP 2FA + account.mfa.enable_totp(data.into_inner())?; + + // Save model to database + account.save(db).await.map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::{MFATicket, Totp}; + use rocket::http::{ContentType, Header, Status}; + use revolt_models::v0; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/mfa/totp") + .header(Header::new("X-Session-Token", session.token.clone())) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + + let secret = res.into_json::().await.unwrap().secret; + + let code = Totp::Enabled { secret }.generate_code().unwrap(); + + let res = harness.client + .put("/auth/mfa/totp") + .header(Header::new("X-Session-Token", session.token)) + .header(ContentType::JSON) + .body(json!({ "totp_code": code }).to_string()) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": account.email.clone(), + "password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + let response = res.into_json::().await.unwrap(); + + if let v0::ResponseLogin::MFA { ticket, .. } = response { + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "mfa_ticket": ticket, + "mfa_response": { + "totp_code": code + } + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + } else { + unreachable!("Did not receive MFA challenge!"); + } + } +} diff --git a/crates/delta/src/routes/mfa/totp_generate_secret.rs b/crates/delta/src/routes/mfa/totp_generate_secret.rs new file mode 100644 index 000000000..86c2e0a58 --- /dev/null +++ b/crates/delta/src/routes/mfa/totp_generate_secret.rs @@ -0,0 +1,59 @@ +//! Generate a new secret for TOTP. +//! POST /mfa/totp +use revolt_result::Result; +use revolt_models::v0; +use revolt_database::{Database, Account, ValidatedTicket}; +use rocket::serde::json::Json; +use rocket::State; + + +/// # Generate TOTP Secret +/// +/// Generate a new secret for TOTP. +#[openapi(tag = "MFA")] +#[post("/totp")] +pub async fn totp_generate_secret( + db: &State, + mut account: Account, + _ticket: ValidatedTicket, +) -> Result> { + // Generate a new secret + let secret = account.mfa.generate_new_totp_secret()?; + + // Save model to database + account.save(db).await?; + + // Send secret to user + Ok(Json(v0::ResponseTotpSecret { secret })) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::{MFATicket, Totp}; + use rocket::http::{Header, Status}; + use revolt_models::v0; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/mfa/totp") + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + + let secret = res.into_json::().await.unwrap().secret; + + let account = harness.db.fetch_account(&account.id).await.unwrap(); + assert_eq!(account.mfa.totp_token, Totp::Pending { secret }); + } +} diff --git a/crates/delta/src/routes/mod.rs b/crates/delta/src/routes/mod.rs index 9643a3657..ad12c2c31 100644 --- a/crates/delta/src/routes/mod.rs +++ b/crates/delta/src/routes/mod.rs @@ -17,6 +17,9 @@ mod servers; mod sync; mod users; mod webhooks; +mod account; +mod session; +mod mfa; pub fn mount(config: Settings, mut rocket: Rocket) -> Rocket { let settings = OpenApiSettings::default(); @@ -33,9 +36,9 @@ pub fn mount(config: Settings, mut rocket: Rocket) -> Rocket { "/invites" => invites::routes(), "/custom" => customisation::routes(), "/safety" => safety::routes(), - "/auth/account" => rocket_authifier::routes::account::routes(), - "/auth/session" => rocket_authifier::routes::session::routes(), - "/auth/mfa" => rocket_authifier::routes::mfa::routes(), + "/auth/account" => account::routes(), + "/auth/session" => session::routes(), + "/auth/mfa" => mfa::routes(), "/onboard" => onboard::routes(), "/policy" => policy::routes(), "/push" => push::routes(), @@ -54,9 +57,9 @@ pub fn mount(config: Settings, mut rocket: Rocket) -> Rocket { "/invites" => invites::routes(), "/custom" => customisation::routes(), "/safety" => safety::routes(), - "/auth/account" => rocket_authifier::routes::account::routes(), - "/auth/session" => rocket_authifier::routes::session::routes(), - "/auth/mfa" => rocket_authifier::routes::mfa::routes(), + "/auth/account" => account::routes(), + "/auth/session" => session::routes(), + "/auth/mfa" => mfa::routes(), "/onboard" => onboard::routes(), "/policy" => policy::routes(), "/push" => push::routes(), @@ -64,47 +67,6 @@ pub fn mount(config: Settings, mut rocket: Rocket) -> Rocket { }; } - if config.features.webhooks_enabled { - mount_endpoints_and_merged_docs! { - rocket, "/0.8".to_owned(), settings, - "/" => (vec![], custom_openapi_spec()), - "" => openapi_get_routes_spec![root::root], - "/users" => users::routes(), - "/bots" => bots::routes(), - "/channels" => channels::routes(), - "/servers" => servers::routes(), - "/invites" => invites::routes(), - "/custom" => customisation::routes(), - "/safety" => safety::routes(), - "/auth/account" => rocket_authifier::routes::account::routes(), - "/auth/session" => rocket_authifier::routes::session::routes(), - "/auth/mfa" => rocket_authifier::routes::mfa::routes(), - "/onboard" => onboard::routes(), - "/push" => push::routes(), - "/sync" => sync::routes(), - "/webhooks" => webhooks::routes() - }; - } else { - mount_endpoints_and_merged_docs! { - rocket, "/0.8".to_owned(), settings, - "/" => (vec![], custom_openapi_spec()), - "" => openapi_get_routes_spec![root::root], - "/users" => users::routes(), - "/bots" => bots::routes(), - "/channels" => channels::routes(), - "/servers" => servers::routes(), - "/invites" => invites::routes(), - "/custom" => customisation::routes(), - "/safety" => safety::routes(), - "/auth/account" => rocket_authifier::routes::account::routes(), - "/auth/session" => rocket_authifier::routes::session::routes(), - "/auth/mfa" => rocket_authifier::routes::mfa::routes(), - "/onboard" => onboard::routes(), - "/push" => push::routes(), - "/sync" => sync::routes() - }; - } - rocket } @@ -115,8 +77,8 @@ fn custom_openapi_spec() -> OpenApi { extensions.insert( "x-logo".to_owned(), json!({ - "url": "https://revolt.chat/header.png", - "altText": "Revolt Header" + "url": "https://stoat.chat/header.png", + "altText": "Stoat Header" }), ); @@ -124,7 +86,7 @@ fn custom_openapi_spec() -> OpenApi { "x-tagGroups".to_owned(), json!([ { - "name": "Revolt", + "name": "Stoat", "tags": [ "Core" ] @@ -205,18 +167,21 @@ fn custom_openapi_spec() -> OpenApi { OpenApi { openapi: OpenApi::default_version(), info: Info { - title: "Revolt API".to_owned(), + title: "Stoat API".to_owned(), description: Some("Open source user-first chat platform.".to_owned()), - terms_of_service: Some("https://revolt.chat/terms".to_owned()), + terms_of_service: Some("https://stoat.chat/terms".to_owned()), contact: Some(Contact { - name: Some("Revolt Support".to_owned()), - url: Some("https://revolt.chat".to_owned()), - email: Some("contact@revolt.chat".to_owned()), + name: Some("Stoat".to_owned()), + url: Some("https://stoat.chat".to_owned()), + email: Some("contact@stoat.chat".to_owned()), ..Default::default() }), license: Some(License { name: "AGPLv3".to_owned(), - url: Some("https://github.com/revoltchat/delta/blob/master/LICENSE".to_owned()), + url: Some( + "https://github.com/stoatchat/stoatchat/blob/main/crates/delta/LICENSE" + .to_owned(), + ), ..Default::default() }), version: env!("CARGO_PKG_VERSION").to_string(), @@ -224,29 +189,19 @@ fn custom_openapi_spec() -> OpenApi { }, servers: vec![ Server { - url: "https://api.revolt.chat".to_owned(), - description: Some("Revolt Production".to_owned()), - ..Default::default() - }, - Server { - url: "https://revolt.chat/api".to_owned(), - description: Some("Revolt Staging".to_owned()), - ..Default::default() - }, - Server { - url: "http://local.revolt.chat:14702".to_owned(), - description: Some("Local Revolt Environment".to_owned()), + url: "https://api.stoat.chat".to_owned(), + description: Some("Stoat Production".to_owned()), ..Default::default() }, Server { - url: "http://local.revolt.chat:14702/0.8".to_owned(), - description: Some("Local Revolt Environment (v0.8)".to_owned()), + url: "https://beta.stoat.chat/api".to_owned(), + description: Some("Stoat Beta".to_owned()), ..Default::default() }, ], external_docs: Some(ExternalDocs { - url: "https://developers.revolt.chat".to_owned(), - description: Some("Revolt Developer Documentation".to_owned()), + url: "https://developers.stoat.chat".to_owned(), + description: Some("Stoat Developer Documentation".to_owned()), ..Default::default() }), extensions, @@ -254,19 +209,19 @@ fn custom_openapi_spec() -> OpenApi { Tag { name: "Core".to_owned(), description: Some( - "Use in your applications to determine information about the Revolt node" + "Use in your applications to determine information about the Stoat node" .to_owned(), ), ..Default::default() }, Tag { name: "User Information".to_owned(), - description: Some("Query and fetch users on Revolt".to_owned()), + description: Some("Query and fetch users on Stoat".to_owned()), ..Default::default() }, Tag { name: "Direct Messaging".to_owned(), - description: Some("Direct message other users on Revolt".to_owned()), + description: Some("Direct message other users on Stoat".to_owned()), ..Default::default() }, Tag { @@ -283,7 +238,7 @@ fn custom_openapi_spec() -> OpenApi { }, Tag { name: "Channel Information".to_owned(), - description: Some("Query and fetch channels on Revolt".to_owned()), + description: Some("Query and fetch channels on Stoat".to_owned()), ..Default::default() }, Tag { @@ -313,7 +268,7 @@ fn custom_openapi_spec() -> OpenApi { }, Tag { name: "Server Information".to_owned(), - description: Some("Query and fetch servers on Revolt".to_owned()), + description: Some("Query and fetch servers on Stoat".to_owned()), ..Default::default() }, Tag { @@ -349,7 +304,7 @@ fn custom_openapi_spec() -> OpenApi { Tag { name: "Onboarding".to_owned(), description: Some( - "After signing up to Revolt, users must pick a unique username".to_owned(), + "After signing up to Stoat, users must pick a unique username".to_owned(), ), ..Default::default() }, @@ -361,7 +316,7 @@ fn custom_openapi_spec() -> OpenApi { Tag { name: "Web Push".to_owned(), description: Some( - "Subscribe to and receive Revolt push notifications while offline".to_owned(), + "Subscribe to and receive Stoat push notifications while offline".to_owned(), ), ..Default::default() }, diff --git a/crates/delta/src/routes/onboard/complete.rs b/crates/delta/src/routes/onboard/complete.rs index e3621a192..eae1b787f 100644 --- a/crates/delta/src/routes/onboard/complete.rs +++ b/crates/delta/src/routes/onboard/complete.rs @@ -1,7 +1,6 @@ -use authifier::models::Session; use once_cell::sync::Lazy; use regex::Regex; -use revolt_database::{Database, User}; +use revolt_database::{Database, User, Session}; use revolt_models::v0; use revolt_result::{create_error, Result}; diff --git a/crates/delta/src/routes/onboard/hello.rs b/crates/delta/src/routes/onboard/hello.rs index 92a0a8ddd..9559c8fdb 100644 --- a/crates/delta/src/routes/onboard/hello.rs +++ b/crates/delta/src/routes/onboard/hello.rs @@ -1,5 +1,4 @@ -use authifier::models::Session; -use revolt_database::User; +use revolt_database::{Session, User}; use rocket::serde::json::Json; use serde::Serialize; diff --git a/crates/delta/src/routes/policy/acknowledge_policy_changes.rs b/crates/delta/src/routes/policy/acknowledge_policy_changes.rs index 8b69efda1..9002d8900 100644 --- a/crates/delta/src/routes/policy/acknowledge_policy_changes.rs +++ b/crates/delta/src/routes/policy/acknowledge_policy_changes.rs @@ -2,12 +2,14 @@ use revolt_database::{Database, User}; use revolt_result::Result; use rocket::State; +use rocket_empty::EmptyResponse; /// # Acknowledge Policy Changes /// /// Accept/acknowledge changes to platform policy. #[openapi(tag = "Policy")] #[post("/acknowledge")] -pub async fn acknowledge_policy_changes(db: &State, user: User) -> Result<()> { - db.acknowledge_policy_changes(&user.id).await +pub async fn acknowledge_policy_changes(db: &State, user: User) -> Result { + db.acknowledge_policy_changes(&user.id).await?; + Ok(EmptyResponse) } diff --git a/crates/delta/src/routes/push/subscribe.rs b/crates/delta/src/routes/push/subscribe.rs index 0d3d09e46..0a69f7cff 100644 --- a/crates/delta/src/routes/push/subscribe.rs +++ b/crates/delta/src/routes/push/subscribe.rs @@ -1,7 +1,5 @@ -use authifier::{ - models::{Session, WebPushSubscription}, - Authifier, -}; +use revolt_database::{Database, Session}; +use revolt_models::v0; use revolt_result::{create_database_error, Result}; use rocket::{serde::json::Json, State}; use rocket_empty::EmptyResponse; @@ -14,13 +12,13 @@ use rocket_empty::EmptyResponse; #[openapi(tag = "Web Push")] #[post("/subscribe", data = "")] pub async fn subscribe( - authifier: &State, + db: &State, mut session: Session, - data: Json, + data: Json, ) -> Result { - session.subscription = Some(data.into_inner()); + session.subscription = Some(data.into_inner().into()); session - .save(authifier) + .save(db) .await .map(|_| EmptyResponse) .map_err(|_| create_database_error!("save", "session")) diff --git a/crates/delta/src/routes/push/unsubscribe.rs b/crates/delta/src/routes/push/unsubscribe.rs index dcc9179f3..c5a65a32c 100644 --- a/crates/delta/src/routes/push/unsubscribe.rs +++ b/crates/delta/src/routes/push/unsubscribe.rs @@ -1,5 +1,4 @@ -use authifier::{models::Session, Authifier}; - +use revolt_database::{Database, Session}; use revolt_result::{create_database_error, Result}; use rocket_empty::EmptyResponse; @@ -10,13 +9,10 @@ use rocket::State; /// Remove the Web Push subscription associated with the current session. #[openapi(tag = "Web Push")] #[post("/unsubscribe")] -pub async fn unsubscribe( - authifier: &State, - mut session: Session, -) -> Result { +pub async fn unsubscribe(db: &State, mut session: Session) -> Result { session.subscription = None; session - .save(authifier) + .save(db) .await .map(|_| EmptyResponse) .map_err(|_| create_database_error!("save", "session")) diff --git a/crates/delta/src/routes/root.rs b/crates/delta/src/routes/root.rs index c90c53c0b..c0fb4faeb 100644 --- a/crates/delta/src/routes/root.rs +++ b/crates/delta/src/routes/root.rs @@ -2,6 +2,7 @@ use revolt_config::config; use revolt_result::Result; use rocket::serde::json::Json; use serde::Serialize; +use std::collections::HashMap; /// # hCaptcha Configuration #[derive(Serialize, JsonSchema, Debug)] @@ -21,15 +22,22 @@ pub struct Feature { pub url: String, } +/// # Information about a livekit node +#[derive(Serialize, JsonSchema, Debug)] +pub struct VoiceNode { + pub name: String, + pub lat: f64, + pub lon: f64, + pub public_url: String, +} + /// # Voice Server Configuration #[derive(Serialize, JsonSchema, Debug)] pub struct VoiceFeature { /// Whether voice is enabled pub enabled: bool, - /// URL pointing to the voice API - pub url: String, - /// URL pointing to the voice WebSocket server - pub ws: String, + /// All livekit nodes + pub nodes: Vec, } /// # Feature Configuration @@ -46,7 +54,103 @@ pub struct RevoltFeatures { /// Proxy service configuration pub january: Feature, /// Voice server configuration - pub voso: VoiceFeature, + pub livekit: VoiceFeature, + /// Limits + pub limits: LimitsConfig, + /// Legal links + pub legal_links: LegalLinks, +} + +/// # Limits For Users +#[derive(Serialize, JsonSchema, Debug)] +pub struct LimitsConfig { + /// Global Limits + pub global: GlobalLimits, + /// New User Limits + pub new_user: UserLimits, + /// Default User Limits + pub default: UserLimits, +} + +/// # Legal links +#[derive(Serialize, JsonSchema, Debug)] +pub struct LegalLinks { + /// Terms of Service URL + pub terms_of_service: String, + /// Privacy Policy URL + pub privacy_policy: String, + /// Guidelines URL + pub guidelines: String, +} + +/// # Global limits +#[derive(Serialize, JsonSchema, Debug)] +pub struct GlobalLimits { + /// max group size + group_size: i64, + /// max message embeds + message_embeds: i64, + /// max replies + message_replies: i64, + /// max reactions per message + message_reactions: i64, + /// max server emoji + server_emoji: i64, + /// max server roles + server_roles: i64, + /// max server channels + server_channels: i64, + body_limit_size: i64, + + /// restrict server creation to these users. + /// if blank, all users can create servers + pub restrict_server_creation: Vec, + /// New user hours + new_user_hours: i64, +} + +/// # User Limits +#[derive(Serialize, JsonSchema, Debug)] +pub struct UserLimits { + /// Max Outgoing Friend Requests + pub outgoing_friend_requests: i64, + /// Max Owned Bots + pub bots: i64, + /// Max message content length + pub message_length: i64, + /// max message attachments + pub message_attachments: i64, + /// max servers + pub servers: i64, + /// max audio quality + pub voice_quality: i64, + /// video streaming enabled + pub video: bool, + /// max video resolution (vertical, horizontal) + pub video_resolution: [i64; 2], + /// min/max aspect ratios + pub video_aspect_ratio: [f64; 2], + pub file_upload_size_limits: HashMap, +} + +impl UserLimits { + fn from_feature_limits(fl: revolt_config::FeaturesLimits) -> UserLimits { + UserLimits { + outgoing_friend_requests: fl.outgoing_friend_requests as i64, + bots: fl.bots as i64, + message_length: fl.message_length as i64, + message_attachments: fl.message_attachments as i64, + servers: fl.servers as i64, + voice_quality: fl.voice_quality as i64, + video: fl.video, + video_resolution: [fl.video_resolution[0] as i64, fl.video_resolution[1] as i64], + video_aspect_ratio: [ + fl.video_aspect_ratio[0] as f64, + fl.video_aspect_ratio[1] as f64, + ], + file_upload_size_limits: fl.file_upload_size_limit, + } + } } /// # Build Information @@ -94,22 +198,63 @@ pub async fn root() -> Result> { features: RevoltFeatures { captcha: CaptchaFeature { enabled: !config.api.security.captcha.hcaptcha_key.is_empty(), - key: config.api.security.captcha.hcaptcha_sitekey, + key: config.api.security.captcha.hcaptcha_sitekey.clone(), }, email: !config.api.smtp.host.is_empty(), invite_only: config.api.registration.invite_only, autumn: Feature { enabled: !config.hosts.autumn.is_empty(), - url: config.hosts.autumn, + url: config.hosts.autumn.clone(), }, january: Feature { enabled: !config.hosts.january.is_empty(), - url: config.hosts.january, + url: config.hosts.january.clone(), + }, + livekit: VoiceFeature { + enabled: !config.hosts.livekit.is_empty(), + nodes: config + .api + .livekit + .nodes + .iter() + .filter(|(_, node)| !node.private) + .map(|(name, value)| VoiceNode { + name: name.clone(), + lat: value.lat, + lon: value.lon, + public_url: config + .hosts + .livekit + .get(name) + .expect("Missing corresponding host for voice node") + .clone(), + }) + .collect(), + }, + limits: LimitsConfig { + global: GlobalLimits { + group_size: config.features.limits.global.group_size as i64, + message_embeds: config.features.limits.global.message_embeds as i64, + message_replies: config.features.limits.global.message_replies as i64, + message_reactions: config.features.limits.global.message_reactions as i64, + server_emoji: config.features.limits.global.server_emoji as i64, + server_roles: config.features.limits.global.server_roles as i64, + server_channels: config.features.limits.global.server_channels as i64, + body_limit_size: config.features.limits.global.body_limit_size as i64, + restrict_server_creation: config + .features + .limits + .global + .restrict_server_creation, + new_user_hours: config.features.limits.global.new_user_hours as i64, + }, + new_user: UserLimits::from_feature_limits(config.features.limits.new_user), + default: UserLimits::from_feature_limits(config.features.limits.default), }, - voso: VoiceFeature { - enabled: !config.hosts.voso_legacy.is_empty(), - url: config.hosts.voso_legacy, - ws: config.hosts.voso_legacy_ws, + legal_links: LegalLinks { + terms_of_service: config.features.legal_links.terms_of_service, + privacy_policy: config.features.legal_links.privacy_policy, + guidelines: config.features.legal_links.guidelines, }, }, ws: config.hosts.events, diff --git a/crates/delta/src/routes/safety/report_content.rs b/crates/delta/src/routes/safety/report_content.rs index 1d5c23560..8d52ceefc 100644 --- a/crates/delta/src/routes/safety/report_content.rs +++ b/crates/delta/src/routes/safety/report_content.rs @@ -1,6 +1,7 @@ use revolt_database::{events::client::EventV1, Database, Report, Snapshot, SnapshotContent, User}; use revolt_models::v0::{ReportStatus, ReportedContent}; use revolt_result::{create_error, Result}; +use rocket_empty::EmptyResponse; use serde::Deserialize; use ulid::Ulid; use validator::Validate; @@ -27,7 +28,7 @@ pub async fn report_content( db: &State, user: User, data: Json, -) -> Result<()> { +) -> Result { let data = data.into_inner(); data.validate().map_err(|error| { create_error!(FailedValidation { @@ -129,5 +130,5 @@ pub async fn report_content( EventV1::ReportCreate(report.into()).global().await; - Ok(()) + Ok(EmptyResponse) } diff --git a/crates/delta/src/routes/servers/ban_create.rs b/crates/delta/src/routes/servers/ban_create.rs index 13c0ef3b3..a29b4300c 100644 --- a/crates/delta/src/routes/servers/ban_create.rs +++ b/crates/delta/src/routes/servers/ban_create.rs @@ -1,12 +1,19 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, - Database, RemovalIntention, ServerBan, User, + voice::{ + get_user_voice_channel_in_server, remove_user_from_voice_channel, UserVoiceChannel, + VoiceClient, + }, + Database, Message, RemovalIntention, ServerBan, User, }; use revolt_models::v0; +use std::time::{Duration, SystemTime}; +use revolt_database::events::client::EventV1; use revolt_permissions::{calculate_server_permissions, ChannelPermission}; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; +use ulid::Ulid; use validator::Validate; /// # Ban User @@ -16,6 +23,7 @@ use validator::Validate; #[put("//bans/", data = "")] pub async fn ban( db: &State, + voice_client: &State, user: User, server: Reference<'_>, target: Reference<'_>, @@ -54,8 +62,29 @@ pub async fn ban( member .remove(db, &server, RemovalIntention::Ban, false) .await?; + + // If the member is in a voice channel while banned kick them from the voice channel + if let Some(channel_id) = get_user_voice_channel_in_server(target.id, &server.id).await? { + remove_user_from_voice_channel( + voice_client, + &UserVoiceChannel { + id: channel_id, + server_id: Some(server.id.clone()), + }, + target.id, + ) + .await?; + } } + // We do this outside the member check so we can sweep hit-and-run spammers who already left. + if let Some(seconds) = data.delete_message_seconds { + if seconds > 0 { + let threshold_time = SystemTime::now() - Duration::from_secs(seconds as u64); + Message::bulk_delete_by_author_since(db, &server.channels, target.id, threshold_time) + .await?; + } + } ServerBan::create(db, &server, target.id, data.reason) .await .map(Into::into) diff --git a/crates/delta/src/routes/servers/member_edit.rs b/crates/delta/src/routes/servers/member_edit.rs index e33935e86..848e776f7 100644 --- a/crates/delta/src/routes/servers/member_edit.rs +++ b/crates/delta/src/routes/servers/member_edit.rs @@ -1,26 +1,36 @@ use std::collections::HashSet; use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, + events::client::EventV1, + util::{ + permissions::{perms, DatabasePermissionQuery}, + reference::Reference, + }, + voice::{ + get_channel_node, get_user_voice_channel_in_server, set_channel_node, + set_user_moved_from_voice, set_user_moved_to_voice, sync_user_voice_permissions, + UserVoiceChannel, VoiceClient, + }, Database, File, PartialMember, User, }; -use revolt_models::v0; +use revolt_models::v0::{self, FieldsMember}; -use revolt_permissions::{calculate_server_permissions, ChannelPermission}; +use revolt_permissions::{calculate_channel_permissions, calculate_server_permissions, ChannelPermission, UserPermission}; use revolt_result::{create_error, Result}; -use rocket::{serde::json::Json, State}; +use rocket::{form::validate::Contains, serde::json::Json, State}; use validator::Validate; /// # Edit Member /// /// Edit a member by their id. #[openapi(tag = "Server Members")] -#[patch("//members/", data = "")] +#[patch("//members/", data = "")] pub async fn edit( db: &State, + voice_client: &State, user: User, - server: Reference<'_>, - member: Reference<'_>, + server_id: Reference<'_>, + member_id: Reference<'_>, data: Json, ) -> Result> { let data = data.into_inner(); @@ -31,13 +41,20 @@ pub async fn edit( })?; // Fetch server and member - let mut server = server.as_server(db).await?; - let mut member = member.as_member(db, &server.id).await?; + let mut server = server_id.as_server(db).await?; + let target_user = member_id.as_user(db).await?; + let mut member = member_id.as_member(db, &server.id).await?; // Fetch our currrent permissions let mut query = DatabasePermissionQuery::new(db, &user).server(&server); let permissions = calculate_server_permissions(&mut query).await; + // Fetch target permissions + let mut target_query = DatabasePermissionQuery::new(db, &target_user) + .server(&server) + .member(&member); + let target_permissions = calculate_server_permissions(&mut target_query).await; + // Check permissions in server if data.nickname.is_some() || data.remove.contains(&v0::FieldsMember::Nickname) { if user.id == member.id.user { @@ -47,11 +64,19 @@ pub async fn edit( } } + if data.pronouns.is_some() || data.remove.contains(&v0::FieldsMember::Pronouns) { + if user.id != member.id.user { + return Err(create_error!(InvalidOperation)) + } + } + if data.avatar.is_some() || data.remove.contains(&v0::FieldsMember::Avatar) { if user.id == member.id.user { permissions.throw_if_lacking_channel_permission(ChannelPermission::ChangeAvatar)?; + } else if data.remove.contains(&v0::FieldsMember::Avatar) { + permissions.throw_if_lacking_channel_permission(ChannelPermission::RemoveAvatars)?; } else { - return Err(create_error!(InvalidOperation)); + return Err(create_error!(InvalidOperation)) } } @@ -60,13 +85,68 @@ pub async fn edit( } if data.timeout.is_some() || data.remove.contains(&v0::FieldsMember::Timeout) { - if data.timeout.is_some() && member.id.user == user.id { - return Err(create_error!(CannotTimeoutYourself)); + if data.timeout.is_some() { + if member.id.user == user.id { + return Err(create_error!(CannotTimeoutYourself)); + } + + if target_permissions.has_channel_permission(ChannelPermission::TimeoutMembers) { + return Err(create_error!(IsElevated)); + } } permissions.throw_if_lacking_channel_permission(ChannelPermission::TimeoutMembers)?; } + if data.can_publish.is_some() { + permissions.throw_if_lacking_channel_permission(ChannelPermission::MuteMembers)?; + } + + if data.can_receive.is_some() { + permissions.throw_if_lacking_channel_permission(ChannelPermission::DeafenMembers)?; + } + + if data.voice_channel.is_some() && data.remove.contains(&FieldsMember::VoiceChannel) { + return Err(create_error!(InvalidOperation)); + } + + if data.voice_channel.is_some() || data.remove.contains(&FieldsMember::VoiceChannel) { + if !voice_client.is_enabled() { + return Err(create_error!(LiveKitUnavailable)); + }; + + if member.id.user != user.id { + permissions.throw_if_lacking_channel_permission(ChannelPermission::MoveMembers)?; + } + } + + let new_voice_channel = if let Some(new_channel) = &data.voice_channel { + // ensure the channel we are moving them to is in the server and is a voice channel + + let channel = Reference::from_unchecked(new_channel) + .as_channel(db) + .await + .map_err(|_| create_error!(UnknownChannel))?; + + if channel.server().is_none_or(|v| v != member.id.server) { + Err(create_error!(UnknownChannel))? + } + + let channel_permissions = calculate_channel_permissions(&mut query.clone().channel(&channel)).await; + channel_permissions.throw_if_lacking_channel_permission(ChannelPermission::Connect)?; + + if get_user_voice_channel_in_server(&target_user.id, &server.id) + .await? + .is_none() + { + Err(create_error!(NotConnected))? + }; + + Some(channel) + } else { + None + }; + // Resolve our ranking let our_ranking = query.get_member_rank().unwrap_or(i64::MIN); @@ -98,16 +178,23 @@ pub async fn edit( // Apply edits to the member object let v0::DataMemberEdit { nickname, + pronouns, avatar, roles, timeout, remove, + can_publish, + can_receive, + voice_channel: _, } = data; let mut partial = PartialMember { nickname, + pronouns, roles, timeout, + can_publish, + can_receive, ..Default::default() }; @@ -124,8 +211,86 @@ pub async fn edit( } member - .update(db, partial, remove.into_iter().map(Into::into).collect()) + .update(db, partial, remove.clone().into_iter().map(Into::into).collect()) .await?; + if let Some(new_voice_channel) = new_voice_channel { + if let Some(channel) = get_user_voice_channel_in_server(&target_user.id, &server.id).await? + { + let old_node = get_channel_node(&channel).await?.unwrap(); + + let new_node = match get_channel_node(new_voice_channel.id()).await? { + Some(node) => node, + None => { + set_channel_node(new_voice_channel.id(), &old_node).await?; + old_node.clone() + } + }; + + let new_user_voice_channel = UserVoiceChannel::from_channel(&new_voice_channel); + let old_user_voice_channel = UserVoiceChannel { + id: channel.clone(), + server_id: new_user_voice_channel.server_id.clone(), + }; + + set_user_moved_from_voice(&channel, &new_user_voice_channel, &target_user.id).await?; + set_user_moved_to_voice( + new_voice_channel.id(), + &old_user_voice_channel, + &target_user.id, + ) + .await?; + + let mut query = perms(db, &target_user).channel(&new_voice_channel); + let permissions = calculate_channel_permissions(&mut query).await; + + voice_client + .create_room(&new_node, &new_voice_channel) + .await?; + let token = voice_client + .create_token(&new_node, db, &target_user, permissions, &new_voice_channel) + .await?; + + voice_client + .remove_user(&old_node, &target_user.id, &channel) + .await?; + + EventV1::UserMoveVoiceChannel { + node: new_node, + from: channel, + to: new_voice_channel.id().to_string(), + token, + } + .private(target_user.id.clone()) + .await; + }; + } else if can_publish.is_some() || can_receive.is_some() || remove.contains(FieldsMember::CanPublish) || remove.contains(FieldsMember::CanReceive) { + if let Some(channel) = get_user_voice_channel_in_server(&target_user.id, &server.id).await? + { + let node = get_channel_node(&channel).await?.unwrap(); + let channel = Reference::from_unchecked(&channel).as_channel(db).await?; + + sync_user_voice_permissions( + db, + voice_client, + &node, + &user, + &channel, + Some(&server), + None, + ) + .await?; + }; + }; + + if remove.contains(&FieldsMember::VoiceChannel) { + if let Some(channel) = get_user_voice_channel_in_server(&target_user.id, &server.id).await? + { + let node = get_channel_node(&channel).await?.unwrap(); + + voice_client.remove_user(&node, &user.id, &channel).await?; + }; + } + Ok(Json(member.into())) } diff --git a/crates/delta/src/routes/servers/member_fetch.rs b/crates/delta/src/routes/servers/member_fetch.rs index c05935be3..967f98140 100644 --- a/crates/delta/src/routes/servers/member_fetch.rs +++ b/crates/delta/src/routes/servers/member_fetch.rs @@ -11,21 +11,21 @@ use rocket::{serde::json::Json, State}; /// /// Retrieve a member. #[openapi(tag = "Server Members")] -#[get("//members/?")] +#[get("//members/?")] pub async fn fetch( db: &State, user: User, - target: Reference<'_>, - member: Reference<'_>, + server_id: Reference<'_>, + member_id: Reference<'_>, roles: Option, ) -> Result> { - let server = target.as_server(db).await?; + let server = server_id.as_server(db).await?; let mut query = DatabasePermissionQuery::new(db, &user).server(&server); if !query.are_we_a_member().await { return Err(create_error!(NotFound)); } - let member = member.as_member(db, &server.id).await?; + let member = member_id.as_member(db, &server.id).await?; if let Some(true) = roles { Ok(Json(v0::MemberResponse::MemberWithRoles { roles: server diff --git a/crates/delta/src/routes/servers/member_remove.rs b/crates/delta/src/routes/servers/member_remove.rs index 230042671..1885c5bac 100644 --- a/crates/delta/src/routes/servers/member_remove.rs +++ b/crates/delta/src/routes/servers/member_remove.rs @@ -1,5 +1,9 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, + voice::{ + get_user_voice_channel_in_server, remove_user_from_voice_channel, UserVoiceChannel, + VoiceClient, + }, Database, RemovalIntention, User, }; use revolt_permissions::{calculate_server_permissions, ChannelPermission}; @@ -11,20 +15,21 @@ use rocket_empty::EmptyResponse; /// /// Removes a member from the server. #[openapi(tag = "Server Members")] -#[delete("//members/")] +#[delete("//members/")] pub async fn kick( db: &State, + voice_client: &State, user: User, - target: Reference<'_>, - member: Reference<'_>, + server_id: Reference<'_>, + member_id: Reference<'_>, ) -> Result { - let server = target.as_server(db).await?; + let server = server_id.as_server(db).await?; - if member.id == user.id { + if member_id.id == user.id { return Err(create_error!(CannotRemoveYourself)); } - if member.id == server.owner { + if member_id.id == server.owner { return Err(create_error!(InvalidOperation)); } @@ -33,7 +38,7 @@ pub async fn kick( .await .throw_if_lacking_channel_permission(ChannelPermission::KickMembers)?; - let member = member.as_member(db, &server.id).await?; + let member = member_id.as_member(db, &server.id).await?; if member.get_ranking(query.server_ref().as_ref().unwrap()) <= query.get_member_rank().unwrap_or(i64::MIN) { @@ -42,6 +47,19 @@ pub async fn kick( member .remove(db, &server, RemovalIntention::Kick, false) - .await - .map(|_| EmptyResponse) + .await?; + + if let Some(channel_id) = get_user_voice_channel_in_server(member_id.id, &server.id).await? { + remove_user_from_voice_channel( + voice_client, + &UserVoiceChannel { + id: channel_id, + server_id: Some(server.id.clone()), + }, + member_id.id, + ) + .await?; + }; + + Ok(EmptyResponse) } diff --git a/crates/delta/src/routes/servers/permissions_set.rs b/crates/delta/src/routes/servers/permissions_set.rs index f0d8099fd..41979a61b 100644 --- a/crates/delta/src/routes/servers/permissions_set.rs +++ b/crates/delta/src/routes/servers/permissions_set.rs @@ -1,5 +1,6 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, + voice::{sync_voice_permissions, VoiceClient}, Database, User, }; use revolt_models::v0; @@ -14,6 +15,7 @@ use rocket::{serde::json::Json, State}; #[put("//permissions/", data = "", rank = 2)] pub async fn set_role_permission( db: &State, + voice_client: &State, user: User, target: Reference<'_>, role_id: String, @@ -22,30 +24,38 @@ pub async fn set_role_permission( let data = data.into_inner(); let mut server = target.as_server(db).await?; - if let Some((current_value, rank)) = server.roles.get(&role_id).map(|x| (x.permissions, x.rank)) - { - let mut query = DatabasePermissionQuery::new(db, &user).server(&server); - let permissions = calculate_server_permissions(&mut query).await; - - permissions.throw_if_lacking_channel_permission(ChannelPermission::ManagePermissions)?; - - // Prevent us from editing roles above us - if rank <= query.get_member_rank().unwrap_or(i64::MIN) { - return Err(create_error!(NotElevated)); - } - - // Ensure we have access to grant these permissions forwards - let current_value: Override = current_value.into(); - permissions - .throw_permission_override(current_value, &data.permissions) - .await?; - - server - .set_role_permission(db, &role_id, data.permissions.into()) - .await?; - - Ok(Json(server.into())) - } else { - Err(create_error!(NotFound)) + + let (current_value, rank) = server + .roles + .get(&role_id) + .map(|x| (x.permissions, x.rank)) + .ok_or_else(|| create_error!(NotFound))?; + + let mut query = DatabasePermissionQuery::new(db, &user).server(&server); + let permissions = calculate_server_permissions(&mut query).await; + + permissions.throw_if_lacking_channel_permission(ChannelPermission::ManagePermissions)?; + + // Prevent us from editing roles above us + if rank <= query.get_member_rank().unwrap_or(i64::MIN) { + return Err(create_error!(NotElevated)); } + + // Ensure we have access to grant these permissions forwards + let current_value: Override = current_value.into(); + permissions + .throw_permission_override(current_value, &data.permissions) + .await?; + + server + .set_role_permission(db, &role_id, data.permissions.into()) + .await?; + + for channel_id in &server.channels { + let channel = Reference::from_unchecked(channel_id).as_channel(db).await?; + + sync_voice_permissions(db, voice_client, &channel, Some(&server), Some(&role_id)).await?; + }; + + Ok(Json(server.into())) } diff --git a/crates/delta/src/routes/servers/permissions_set_default.rs b/crates/delta/src/routes/servers/permissions_set_default.rs index 6ee5b8135..bf9dd3048 100644 --- a/crates/delta/src/routes/servers/permissions_set_default.rs +++ b/crates/delta/src/routes/servers/permissions_set_default.rs @@ -1,6 +1,5 @@ use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, - Database, PartialServer, User, + util::{permissions::DatabasePermissionQuery, reference::Reference}, voice::{sync_voice_permissions, VoiceClient}, Database, PartialServer, User }; use revolt_models::v0; use revolt_permissions::{ @@ -16,6 +15,7 @@ use rocket::{serde::json::Json, State}; #[put("//permissions/default", data = "", rank = 1)] pub async fn set_default_server_permissions( db: &State, + voice_client: &State, user: User, target: Reference<'_>, data: Json, @@ -50,5 +50,11 @@ pub async fn set_default_server_permissions( ) .await?; + for channel_id in &server.channels { + let channel = Reference::from_unchecked(channel_id).as_channel(db).await?; + + sync_voice_permissions(db, voice_client, &channel, Some(&server), None).await?; + }; + Ok(Json(server.into())) } diff --git a/crates/delta/src/routes/servers/roles_create.rs b/crates/delta/src/routes/servers/roles_create.rs index e68d5ea6a..20a3c94ba 100644 --- a/crates/delta/src/routes/servers/roles_create.rs +++ b/crates/delta/src/routes/servers/roles_create.rs @@ -40,17 +40,10 @@ pub async fn create( })); }; - let role = Role { - name: data.name, - // Rank of the new role should be below the lowest role - rank: server.roles.len() as i64, - colour: None, - hoist: false, - permissions: Default::default(), - }; + let role = Role::create(db, &server, data.name).await?; Ok(Json(v0::NewRoleResponse { - id: role.create(db, &server.id).await?, + id: role.id.clone(), role: role.into(), })) } diff --git a/crates/delta/src/routes/servers/roles_delete.rs b/crates/delta/src/routes/servers/roles_delete.rs index 6867b647f..232ae92ef 100644 --- a/crates/delta/src/routes/servers/roles_delete.rs +++ b/crates/delta/src/routes/servers/roles_delete.rs @@ -1,5 +1,6 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, + voice::{sync_voice_permissions, VoiceClient}, Database, User, }; use revolt_permissions::{calculate_server_permissions, ChannelPermission}; @@ -17,6 +18,7 @@ pub async fn delete( user: User, target: Reference<'_>, role_id: String, + voice_client: &State, ) -> Result { let mut server = target.as_server(db).await?; let mut query = DatabasePermissionQuery::new(db, &user).server(&server); @@ -26,15 +28,22 @@ pub async fn delete( let member_rank = query.get_member_rank().unwrap_or(i64::MIN); - if let Some(role) = server.roles.remove(&role_id) { - if role.rank <= member_rank { - return Err(create_error!(NotElevated)); - } + let role = server + .roles + .remove(&role_id) + .ok_or_else(|| create_error!(NotFound))?; - role.delete(db, &server.id, &role_id) - .await - .map(|_| EmptyResponse) - } else { - Err(create_error!(NotFound)) + if role.rank <= member_rank { + return Err(create_error!(NotElevated)); } + + role.delete(db, &server.id).await?; + + for channel_id in &server.channels { + let channel = Reference::from_unchecked(channel_id).as_channel(db).await?; + + sync_voice_permissions(db, voice_client, &channel, Some(&server), Some(&role_id)).await?; + } + + Ok(EmptyResponse) } diff --git a/crates/delta/src/routes/servers/roles_edit.rs b/crates/delta/src/routes/servers/roles_edit.rs index f18bd7d33..e46932ef3 100644 --- a/crates/delta/src/routes/servers/roles_edit.rs +++ b/crates/delta/src/routes/servers/roles_edit.rs @@ -1,6 +1,7 @@ use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, - Database, PartialRole, User, + voice::{sync_voice_permissions, VoiceClient}, + Database, File, PartialRole, User, }; use revolt_models::v0; use revolt_permissions::{calculate_server_permissions, ChannelPermission}; @@ -15,6 +16,7 @@ use validator::Validate; #[patch("//roles/", data = "", rank = 1)] pub async fn edit( db: &State, + voice_client: &State, user: User, target: Reference<'_>, role_id: String, @@ -45,26 +47,45 @@ pub async fn edit( name, colour, hoist, + icon, remove, .. } = data; + if remove.contains(&v0::FieldsRole::Icon) { + if let Some(existing_icon) = &role.icon { + db.mark_attachment_as_deleted(&existing_icon.id).await?; + } + } + + let mut final_icon = None; + if let Some(icon_id) = icon { + final_icon = Some(File::use_role_icon(db, &icon_id, &role_id, &user.id).await?); + } + let partial = PartialRole { name, colour, hoist, + icon: final_icon, ..Default::default() }; role.update( db, &server.id, - &role_id, partial, remove.into_iter().map(Into::into).collect(), ) .await?; + for channel_id in &server.channels { + let channel = Reference::from_unchecked(channel_id).as_channel(db).await?; + + sync_voice_permissions(db, voice_client, &channel, Some(&server), Some(&role_id)) + .await?; + } + Ok(Json(role.into())) } else { Err(create_error!(NotFound)) diff --git a/crates/delta/src/routes/servers/roles_edit_positions.rs b/crates/delta/src/routes/servers/roles_edit_positions.rs index d27259e5b..4b55e95af 100644 --- a/crates/delta/src/routes/servers/roles_edit_positions.rs +++ b/crates/delta/src/routes/servers/roles_edit_positions.rs @@ -1,6 +1,5 @@ use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, - Database, User, + util::{permissions::DatabasePermissionQuery, reference::Reference}, voice::{sync_voice_permissions, VoiceClient}, Database, User }; use revolt_models::v0; use revolt_permissions::{calculate_server_permissions, ChannelPermission}; @@ -14,6 +13,7 @@ use rocket::{serde::json::Json, State}; #[patch("//roles/ranks", data = "")] pub async fn edit_role_ranks( db: &State, + voice_client: &State, user: User, target: Reference<'_>, data: Json, @@ -70,6 +70,12 @@ pub async fn edit_role_ranks( server.set_role_ordering(db, new_order).await?; + for channel_id in &server.channels { + let channel = Reference::from_unchecked(channel_id).as_channel(db).await?; + + sync_voice_permissions(db, voice_client, &channel, Some(&server), None).await?; + }; + Ok(Json(server.into())) } diff --git a/crates/delta/src/routes/servers/server_ack.rs b/crates/delta/src/routes/servers/server_ack.rs index 789617e11..81ae683e0 100644 --- a/crates/delta/src/routes/servers/server_ack.rs +++ b/crates/delta/src/routes/servers/server_ack.rs @@ -1,6 +1,6 @@ use revolt_database::{ - util::{permissions::DatabasePermissionQuery, reference::Reference}, - Database, User, + util::{acker, permissions::DatabasePermissionQuery, reference::Reference}, + Database, User, AMQP, }; use revolt_permissions::PermissionQuery; use revolt_result::{create_error, Result}; @@ -12,7 +12,12 @@ use rocket_empty::EmptyResponse; /// Mark all channels in a server as read. #[openapi(tag = "Server Information")] #[put("//ack")] -pub async fn ack(db: &State, user: User, target: Reference<'_>) -> Result { +pub async fn ack( + db: &State, + amqp: &State, + user: User, + target: Reference<'_>, +) -> Result { if user.bot.is_some() { return Err(create_error!(IsBot)); } @@ -23,7 +28,6 @@ pub async fn ack(db: &State, user: User, target: Reference<'_>) -> Res return Err(create_error!(NotFound)); } - db.acknowledge_channels(&user.id, &server.channels) - .await - .map(|_| EmptyResponse) + acker::ack_server(&user, &server, db, amqp).await?; + Ok(EmptyResponse) } diff --git a/crates/delta/src/routes/servers/server_create.rs b/crates/delta/src/routes/servers/server_create.rs index 82f0a8aaf..5b9aa0101 100644 --- a/crates/delta/src/routes/servers/server_create.rs +++ b/crates/delta/src/routes/servers/server_create.rs @@ -1,3 +1,4 @@ +use revolt_config::config; use revolt_database::{Database, Member, Server, User}; use revolt_models::v0; use revolt_result::{create_error, Result}; @@ -20,6 +21,24 @@ pub async fn create_server( return Err(create_error!(IsBot)); } + let config = config().await; + + if !config + .features + .limits + .global + .restrict_server_creation + .is_empty() + && !config + .features + .limits + .global + .restrict_server_creation + .contains(&user.id) + { + return Err(create_error!(CantCreateServers)); + } + let data = data.into_inner(); data.validate().map_err(|error| { create_error!(FailedValidation { diff --git a/crates/delta/src/routes/servers/server_delete.rs b/crates/delta/src/routes/servers/server_delete.rs index 1302db5b5..b99f172bf 100644 --- a/crates/delta/src/routes/servers/server_delete.rs +++ b/crates/delta/src/routes/servers/server_delete.rs @@ -1,4 +1,11 @@ -use revolt_database::{util::reference::Reference, Database, RemovalIntention, User}; +use revolt_database::{ + util::reference::Reference, + voice::{ + delete_voice_channel, get_user_voice_channel_in_server, remove_user_from_voice_channel, + UserVoiceChannel, VoiceClient, + }, + Database, RemovalIntention, User, +}; use revolt_models::v0; use revolt_result::Result; use rocket::State; @@ -12,6 +19,7 @@ use rocket_empty::EmptyResponse; #[delete("/?")] pub async fn delete( db: &State, + voice_client: &State, user: User, target: Reference<'_>, options: v0::OptionsServerDelete, @@ -20,8 +28,31 @@ pub async fn delete( let member = db.fetch_member(target.id, &user.id).await?; if server.owner == user.id { + for channel_id in &server.channels { + delete_voice_channel( + voice_client, + &UserVoiceChannel { + id: channel_id.clone(), + server_id: Some(server.id.clone()), + }, + ) + .await?; + } + server.delete(db).await } else { + if let Some(channel_id) = get_user_voice_channel_in_server(&user.id, &server.id).await? { + remove_user_from_voice_channel( + voice_client, + &UserVoiceChannel { + id: channel_id, + server_id: Some(server.id.clone()), + }, + &user.id, + ) + .await?; + }; + member .remove( db, diff --git a/crates/delta/src/routes/servers/server_edit.rs b/crates/delta/src/routes/servers/server_edit.rs index 23d79c344..c27bf72eb 100644 --- a/crates/delta/src/routes/servers/server_edit.rs +++ b/crates/delta/src/routes/servers/server_edit.rs @@ -2,7 +2,7 @@ use std::collections::HashSet; use revolt_database::{ util::{permissions::DatabasePermissionQuery, reference::Reference}, - Database, File, PartialServer, User, + Database, File, PartialServer, User, ValidatedTicket, }; use revolt_models::v0; use revolt_permissions::{calculate_server_permissions, ChannelPermission}; @@ -20,6 +20,7 @@ pub async fn edit( user: User, target: Reference<'_>, data: Json, + validated_ticket: Option, ) -> Result> { let data = data.into_inner(); data.validate().map_err(|error| { @@ -43,6 +44,7 @@ pub async fn edit( && data.flags.is_none() && data.analytics.is_none() && data.discoverable.is_none() + && data.owner.is_none() && data.remove.is_empty() { return Ok(Json(server.into())); @@ -57,6 +59,17 @@ pub async fn edit( permissions.throw_if_lacking_channel_permission(ChannelPermission::ManageServer)?; } + // Check we are the server owner or privileged if changing sensitive fields + if data.owner.is_some() { + if user.id != server.owner && !user.privileged { + return Err(create_error!(NotOwner)); + } + + if validated_ticket.is_none() { + return Err(create_error!(InvalidCredentials)); + } + } + // Check we are privileged if changing sensitive fields if (data.flags.is_some() /*|| data.nsfw.is_some()*/ || data.discoverable.is_some()) && !user.privileged @@ -80,6 +93,7 @@ pub async fn edit( // nsfw, discoverable, analytics, + owner, remove, } = data; @@ -92,6 +106,7 @@ pub async fn edit( // nsfw, discoverable, analytics, + owner: owner.clone(), ..Default::default() }; @@ -146,6 +161,21 @@ pub async fn edit( server.banner = partial.banner.clone(); } + // 5. Transfer ownership + if let Some(owner) = owner { + let owner_reference = Reference::from_unchecked(&owner); + // Check if member exists + owner_reference.as_member(db, &server.id).await?; + let owner_user = owner_reference.as_user(db).await?; + + if owner_user.bot.is_some() { + return Err(create_error!(InvalidOperation)); + } + + server.owner = owner; + partial.owner = Some(server.owner.clone()); + } + server .update(db, partial, remove.into_iter().map(Into::into).collect()) .await?; diff --git a/crates/delta/src/routes/session/edit.rs b/crates/delta/src/routes/session/edit.rs new file mode 100644 index 000000000..df59b8786 --- /dev/null +++ b/crates/delta/src/routes/session/edit.rs @@ -0,0 +1,67 @@ +//! Edit a session +//! PATCH /session/:id +use revolt_database::{Database, Session}; +use revolt_models::v0; +use revolt_result::{Result, create_error}; +use rocket::serde::json::Json; +use rocket::State; + + +/// # Edit Session +/// +/// Edit current session information. +#[openapi(tag = "Session")] +#[patch("/", data = "")] +pub async fn edit( + db: &State, + user: Session, + id: String, + data: Json, +) -> Result> { + let mut session = db.fetch_session(&id).await?; + + // Make sure we own this session + if user.user_id != session.user_id { + return Err(create_error!(InvalidSession)); + } + + // Rename the session + session.name = data.into_inner().friendly_name; + + // Save session + session.save(db).await?; + + Ok(Json(session.into())) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use rocket::http::{ContentType, Status}; + use revolt_models::v0; + + #[rocket::async_test] + async fn success() { + use rocket::http::Header; + + let harness = TestHarness::new().await; + let (_, session, _) = harness.new_user().await; + + let res = harness.client + .patch(format!("/auth/session/{}", session.id)) + .header(ContentType::JSON) + .header(Header::new("X-Session-Token", session.token)) + .body( + json!({ + "friendly_name": "test name" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + + assert_eq!(res.into_json::().await.unwrap().name, "test name"); + } +} diff --git a/crates/delta/src/routes/session/fetch_all.rs b/crates/delta/src/routes/session/fetch_all.rs new file mode 100644 index 000000000..4808e4077 --- /dev/null +++ b/crates/delta/src/routes/session/fetch_all.rs @@ -0,0 +1,52 @@ +//! Fetch all sessions +//! GET /session/all +use revolt_result::Result; +use revolt_database::{Database, Session}; +use revolt_models::v0; +use rocket::serde::json::Json; +use rocket::State; + +/// # Fetch Sessions +/// +/// Fetch all sessions associated with this account. +#[openapi(tag = "Session")] +#[get("/all")] +pub async fn fetch_all( + db: &State, + session: Session, +) -> Result>> { + db + .fetch_sessions(&session.user_id) + .await + .map(|ok| ok.into_iter().map(|session| session.into()).collect()) + .map(Json) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use rocket::http::{Header, Status}; + use revolt_models::v0; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + for i in 1..=3 { + account + .create_session(&harness.db, format!("session{}", i)) + .await + .unwrap(); + } + + let res = harness.client + .get("/auth/session/all") + .header(Header::new("X-Session-Token", session.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert_eq!(res.into_json::>().await.unwrap().len(), 4); + } +} diff --git a/crates/delta/src/routes/session/login.rs b/crates/delta/src/routes/session/login.rs new file mode 100644 index 000000000..46fca91ed --- /dev/null +++ b/crates/delta/src/routes/session/login.rs @@ -0,0 +1,588 @@ +//! Login to an account +//! POST /session/login +use std::ops::Add; +use std::time::Duration; + +use tokio::time::sleep; +use iso8601_timestamp::Timestamp; +use revolt_database::{ + util::{email::normalise_email, password::assert_safe}, + Database, EmailVerification, Lockout, MFATicket, +}; +use revolt_models::v0; +use revolt_result::{create_error, Result}; +use rocket::serde::json::Json; +use rocket::State; + +/// # Login +/// +/// Login to an account. +#[openapi(tag = "Session")] +#[post("/login", data = "")] +pub async fn login( + db: &State, + data: Json, +) -> Result> { + // Random jitter from 0-1000ms + sleep(Duration::from_millis((rand::random::() * 1000.) as u64)).await; + + let (account, name) = match data.into_inner() { + v0::DataLogin::Email { + email, + password, + friendly_name, + } => { + // Try to find the account we want + let email_normalised = normalise_email(email); + + // Lookup the email in database + if let Some(mut account) = db + .fetch_account_by_normalised_email(&email_normalised) + .await? + { + // Make sure the account has been verified + if let EmailVerification::Pending { .. } = account.verification { + return Err(create_error!(UnverifiedAccount)); + } + + // Make sure password has not been compromised + assert_safe(&password).await?; + + // Check for account lockout + if let Some(lockout) = &account.lockout { + if let Some(expiry) = lockout.expiry { + if expiry > Timestamp::now_utc() { + return Err(create_error!(LockedOut)); + } + } + } + + // Verify the password is correct. + if let Err(err) = account.verify_password(&password) { + // Lock out account if attempts are too high + if let Some(lockout) = &mut account.lockout { + lockout.attempts += 1; + + // Allow 3 attempts + // + // Lockout for 1 minute on 3rd attempt + // Lockout for 5 minutes on 4th attempt + // Lockout for 1 hour on each subsequent attempt + if lockout.attempts >= 3 { + lockout.expiry = Some(Timestamp::now_utc().add(Duration::from_secs( + if lockout.attempts >= 5 { + 3600 + } else if lockout.attempts == 4 { + 300 + } else { + 60 + }, + ))); + } + } else { + account.lockout = Some(Lockout { + attempts: 1, + expiry: None, + }); + } + + account.save(db).await?; + return Err(err); + } + + // Clear lockout information if present + if account.lockout.is_some() { + account.lockout = None; + account.save(db).await?; + } + + // Check whether an MFA step is required + if account.mfa.is_active() { + // Create a new ticket + let mut ticket = MFATicket::new(account.id, false); + ticket.populate(&account.mfa).await; + ticket.save(db).await?; + + // Return applicable methods + return Ok(Json(v0::ResponseLogin::MFA { + ticket: ticket.token, + allowed_methods: account + .mfa + .get_methods() + .into_iter() + .map(Into::into) + .collect(), + })); + } + + (account, friendly_name) + } else { + return Err(create_error!(InvalidCredentials)); + } + } + v0::DataLogin::MFA { + mfa_ticket, + mfa_response, + friendly_name, + } => { + // Resolve the MFA ticket + let ticket = db + .fetch_ticket_by_token(&mfa_ticket) + .await?; + + // Find the corresponding account + let mut account = db.fetch_account(&ticket.account_id).await?; + + // Verify the MFA response + if let Some(mfa_response) = mfa_response { + account + .consume_mfa_response(db, mfa_response, Some(ticket)) + .await?; + } else if !ticket.authorised { + return Err(create_error!(InvalidToken)); + } + + (account, friendly_name) + } + }; + + // Generate a session name + let name = name.unwrap_or_else(|| "Unknown".to_string()); + + // Prevent disabled accounts from logging in + if account.disabled { + return Ok(Json(v0::ResponseLogin::Disabled { + user_id: account.id, + })); + } + + // Create and return a new session + Ok(Json(v0::ResponseLogin::Success( + account.create_session(db, name).await?.into(), + ))) +} + +#[cfg(test)] +mod tests { + use iso8601_timestamp::Timestamp; + use revolt_database::{Account, EmailVerification, Lockout, MFATicket, Totp, events::client::EventV1}; + use crate::{rocket, util::test::TestHarness}; + use rocket::http::{ContentType, Status}; + use revolt_models::v0; + use revolt_result::{Error, ErrorType}; + + #[rocket::async_test] + async fn success() { + let mut harness = TestHarness::new().await; + + Account::new( + &harness.db, + "example@validemail.com".into(), + "password_insecure".into(), + false, + ) + .await + .unwrap(); + + harness.wait_for_event("global", |_| true).await; + + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": "EXAMPLE@validemail.com", + "password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(res.into_json::().await.is_some()); + + let event = harness.wait_for_event("global", |_| true).await; + if !matches!(event, EventV1::CreateSession { .. }) { + panic!("Received incorrect event type. {:?}", event); + } + } + + #[rocket::async_test] + async fn success_totp_mfa() { + let harness = TestHarness::new().await; + let (mut account, _, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": &account.email, + "password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + let response = serde_json::from_str::( + &res.into_string().await.unwrap(), + ) + .expect("`ResponseLogin`"); + + if let v0::ResponseLogin::MFA { + ticket, + allowed_methods, + } = response + { + assert!(allowed_methods.contains(&v0::MFAMethod::Totp)); + + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "mfa_ticket": ticket, + "mfa_response": { + "totp_code": totp.generate_code().expect("totp code") + } + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(serde_json::from_str::(&res.into_string().await.unwrap()).is_ok()); + } else { + panic!("expected `ResponseLogin::MFA`") + } + } + + #[rocket::async_test] + async fn success_totp_stored_mfa() { + let harness = TestHarness::new().await; + let (mut account, _, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let mut ticket = MFATicket::new(account.id.to_string(), true); + ticket.last_totp_code = Some("token from earlier".into()); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "mfa_ticket": ticket.token, + "mfa_response": { + "totp_code": "token from earlier" + } + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(serde_json::from_str::(&res.into_string().await.unwrap()).is_ok()); + } + + #[rocket::async_test] + async fn fail_totp_invalid_mfa() { + let harness = TestHarness::new().await; + let (mut account, _, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/session/login") + .json( + &json!({ + "email": account.email.clone(), + "password": "password_insecure" + }) + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + let response = serde_json::from_str::( + &res.into_string().await.unwrap(), + ) + .expect("`ResponseLogin`"); + + if let v0::ResponseLogin::MFA { + ticket, + allowed_methods, + } = response + { + assert!(allowed_methods.contains(&v0::MFAMethod::Totp)); + + let res = harness.client + .post("/auth/session/login") + .json( + &json!({ + "mfa_ticket": ticket, + "mfa_response": { + "totp_code": "some random data" + } + }) + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::InvalidToken, + )); + } else { + panic!("expected `ResponseLogin::MFA`") + } + } + + #[rocket::async_test] + async fn fail_invalid_user() { + let harness = TestHarness::new().await; + + let res = harness.client + .post("/auth/session/login") + .json( + &json!({ + "email": "example@validemail.com", + "password": "password_insecure" + }) + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::InvalidCredentials, + )); + } + + #[rocket::async_test] + async fn fail_disabled_account() { + let harness = TestHarness::new().await; + + let mut account = Account::new( + &harness.db, + "example@validemail.com".into(), + "password_insecure".into(), + false, + ) + .await + .unwrap(); + + account.disabled = true; + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": "example@validemail.com", + "password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + let response = serde_json::from_str::( + &res.into_string().await.unwrap(), + ) + .expect("`ResponseLogin`"); + + assert!(matches!( + response, + v0::ResponseLogin::Disabled { .. } + )); + } + + #[rocket::async_test] + async fn fail_unverified_account() { + let harness = TestHarness::new().await; + + let mut account = Account::new( + &harness.db, + "example@validemail.com".into(), + "password_insecure".into(), + false, + ) + .await + .unwrap(); + + account.verification = EmailVerification::Pending { + token: "".to_string(), + expiry: Timestamp::now_utc(), + }; + + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": "example@validemail.com", + "password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Forbidden); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::UnverifiedAccount, + )); + } + + #[rocket::async_test] + async fn fail_locked_account() { + let harness = TestHarness::new().await; + + let mut account = Account::new( + &harness.db, + "example@validemail.com".into(), + "password_insecure".into(), + false, + ) + .await + .unwrap(); + + account.save(&harness.db).await.unwrap(); + + + // Attempt 1 + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": "example@validemail.com", + "password": "wrong_password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::InvalidCredentials, + )); + + // Attempt 2 + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": "example@validemail.com", + "password": "wrong_password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::InvalidCredentials, + )); + + // Attempt 3 + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": "example@validemail.com", + "password": "wrong_password" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::InvalidCredentials, + )); + + // Attempt 4: Locked Out + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": "example@validemail.com", + "password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Forbidden); + assert!(matches!( + res.into_json::().await.unwrap().error_type, + ErrorType::LockedOut, + )); + // Pretend it expired + account.lockout = Some(Lockout { + attempts: 9001, + expiry: Some(Timestamp::now_utc()), + }); + + account.save(&harness.db).await.unwrap(); + + // Once it expires, we can log in. + let res = harness.client + .post("/auth/session/login") + .header(ContentType::JSON) + .body( + json!({ + "email": "example@validemail.com", + "password": "password_insecure" + }) + .to_string(), + ) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Ok); + assert!(serde_json::from_str::(&res.into_string().await.unwrap()).is_ok()); + } +} diff --git a/crates/delta/src/routes/session/logout.rs b/crates/delta/src/routes/session/logout.rs new file mode 100644 index 000000000..c442a5793 --- /dev/null +++ b/crates/delta/src/routes/session/logout.rs @@ -0,0 +1,79 @@ +//! Logout of current session +//! POST /session/logout +use revolt_database::{Database, Session}; +use revolt_result::Result; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Logout +/// +/// Delete current session. +#[openapi(tag = "Session")] +#[post("/logout")] +pub async fn logout(db: &State, session: Session) -> Result { + session.delete(db).await.map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::events::client::EventV1; + use revolt_result::ErrorType; + use rocket::http::{Header, Status}; + + #[rocket::async_test] + async fn success() { + let mut harness = TestHarness::new().await; + let (_, session, _) = harness.new_user().await; + + let res = harness.client + .post("/auth/session/logout") + .header(Header::new("X-Session-Token", session.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + drop(res); + assert!(matches!( + harness.db + .fetch_session(&session.id) + .await + .unwrap_err().error_type, + ErrorType::UnknownUser + )); + + let event = harness.wait_for_event(&format!("{}!", &session.user_id), |evt| matches!(evt, EventV1::DeleteSession { .. })).await; + if let EventV1::DeleteSession { + user_id, + session_id, + } = event + { + assert_eq!(user_id, session.user_id); + assert_eq!(session_id, session.id); + } else { + panic!("Received incorrect event type. {:?}", event); + } + } + + #[rocket::async_test] + async fn fail_invalid_session() { + let harness = TestHarness::new().await; + + let res = harness.client + .post("/auth/session/logout") + .header(Header::new("X-Session-Token", "invalid")) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + } + + #[rocket::async_test] + async fn fail_no_session() { + let harness = TestHarness::new().await; + + let res = harness.client.post("/auth/session/logout").dispatch().await; + + assert_eq!(res.status(), Status::Unauthorized); + } +} diff --git a/crates/delta/src/routes/session/mod.rs b/crates/delta/src/routes/session/mod.rs new file mode 100644 index 000000000..9e1156122 --- /dev/null +++ b/crates/delta/src/routes/session/mod.rs @@ -0,0 +1,20 @@ +use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; +use rocket::Route; + +pub mod edit; +pub mod fetch_all; +pub mod login; +pub mod logout; +pub mod revoke; +pub mod revoke_all; + +pub fn routes() -> (Vec, OpenApi) { + openapi_get_routes_spec![ + login::login, + logout::logout, + fetch_all::fetch_all, + revoke::revoke, + revoke_all::revoke_all, + edit::edit + ] +} diff --git a/crates/delta/src/routes/session/revoke.rs b/crates/delta/src/routes/session/revoke.rs new file mode 100644 index 000000000..3b3ffe283 --- /dev/null +++ b/crates/delta/src/routes/session/revoke.rs @@ -0,0 +1,114 @@ +//! Revoke an active session +//! DELETE /session/:id +use revolt_database::{Database, Session, ValidatedTicket}; +use revolt_result::{Result, create_error}; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Revoke Session +/// +/// Delete a specific active session. +#[openapi(tag = "Session")] +#[delete("/")] +pub async fn revoke( + db: &State, + _ticket: ValidatedTicket, + user: Session, + id: String, +) -> Result { + let session = db.fetch_session(&id).await?; + + if session.user_id != user.user_id { + return Err(create_error!(InvalidToken)); + } + + session.delete(db).await.map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::{MFATicket, Totp}; + use revolt_result::ErrorType; + use rocket::http::{Header, Status}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .delete(format!("/auth/session/{}", session.id)) + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + assert!(matches!( + harness.db + .fetch_session(&session.id) + .await + .unwrap_err() + .error_type, + ErrorType::UnknownUser + )); + } + + #[rocket::async_test] + async fn success_mfa() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .delete(format!("/auth/session/{}", session.id)) + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + assert!(matches!( + harness.db + .fetch_session(&session.id) + .await + .unwrap_err() + .error_type, + ErrorType::UnknownUser + )); + } + + #[rocket::async_test] + async fn fail_mfa() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .delete(format!("/auth/session/{}", session.id)) + .header(Header::new("X-Session-Token", session.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + } +} diff --git a/crates/delta/src/routes/session/revoke_all.rs b/crates/delta/src/routes/session/revoke_all.rs new file mode 100644 index 000000000..6e1b6f880 --- /dev/null +++ b/crates/delta/src/routes/session/revoke_all.rs @@ -0,0 +1,196 @@ +//! Revoke all sessions +//! DELETE /session/all +use revolt_database::{Account, Database, Session, ValidatedTicket}; +use revolt_result::Result; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Delete All Sessions +/// +/// Delete all active sessions, optionally including current one. +#[openapi(tag = "Session")] +#[delete("/all?")] +pub async fn revoke_all( + db: &State, + _ticket: ValidatedTicket, + session: Session, + account: Account, + revoke_self: Option, +) -> Result { + let ignore = if revoke_self.unwrap_or(false) { + None + } else { + Some(session.id) + }; + + account + .delete_all_sessions(db, ignore) + .await + .map(|_| EmptyResponse) +} + +#[cfg(test)] +mod tests { + use crate::{rocket, util::test::TestHarness}; + use revolt_database::{MFATicket, Totp}; + use rocket::http::{Header, Status}; + + #[rocket::async_test] + async fn success() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + for i in 1..=3 { + account + .create_session(&harness.db, format!("session{}", i)) + .await + .unwrap(); + } + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .delete("/auth/session/all?revoke_self=true") + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + assert!(harness.db + .fetch_sessions(&session.user_id) + .await + .unwrap() + .is_empty()); + } + + #[rocket::async_test] + async fn success_not_including_self() { + let harness = TestHarness::new().await; + let (account, session, _) = harness.new_user().await; + + for i in 1..=3 { + account + .create_session(&harness.db, format!("session{}", i)) + .await + .unwrap(); + } + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .delete("/auth/session/all?revoke_self=false") + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + let sessions = harness.db + .fetch_sessions(&session.user_id) + .await + .unwrap(); + + assert_eq!(sessions.len(), 1); + assert_eq!(sessions[0].id, session.id); + } + + #[rocket::async_test] + async fn success_mfa() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + for i in 1..=3 { + account + .create_session(&harness.db, format!("session{}", i)) + .await + .unwrap(); + } + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .delete("/auth/session/all?revoke_self=true") + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + assert!(harness.db + .fetch_sessions(&session.user_id) + .await + .unwrap() + .is_empty()); + } + + #[rocket::async_test] + async fn success_not_including_self_mfa() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + for i in 1..=3 { + account + .create_session(&harness.db, format!("session{}", i)) + .await + .unwrap(); + } + + let ticket = MFATicket::new(account.id.to_string(), true); + ticket.save(&harness.db).await.unwrap(); + + let res = harness.client + .delete("/auth/session/all?revoke_self=false") + .header(Header::new("X-Session-Token", session.token)) + .header(Header::new("X-MFA-Ticket", ticket.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::NoContent); + let sessions = harness.db + .fetch_sessions(&session.user_id) + .await + .unwrap(); + + assert_eq!(sessions.len(), 1); + assert_eq!(sessions[0].id, session.id); + } + + #[rocket::async_test] + async fn fail_mfa() { + let harness = TestHarness::new().await; + let (mut account, session, _) = harness.new_user().await; + + let totp = Totp::Enabled { + secret: "secret".to_string(), + }; + + account.mfa.totp_token = totp.clone(); + account.save(&harness.db).await.unwrap(); + + let res = harness.client + .delete("/auth/session/all") + .header(Header::new("X-Session-Token", session.token)) + .dispatch() + .await; + + assert_eq!(res.status(), Status::Unauthorized); + } +} diff --git a/crates/delta/src/routes/users/change_username.rs b/crates/delta/src/routes/users/change_username.rs index 7c3f98c97..ba097b695 100644 --- a/crates/delta/src/routes/users/change_username.rs +++ b/crates/delta/src/routes/users/change_username.rs @@ -1,7 +1,6 @@ -use authifier::models::Account; use once_cell::sync::Lazy; use regex::Regex; -use revolt_database::{Database, User}; +use revolt_database::{Database, User, Account}; use revolt_models::v0; use revolt_result::{create_error, Result}; use rocket::{serde::json::Json, State}; diff --git a/crates/delta/src/routes/users/edit_user.rs b/crates/delta/src/routes/users/edit_user.rs index 535fc05c9..1334909f1 100644 --- a/crates/delta/src/routes/users/edit_user.rs +++ b/crates/delta/src/routes/users/edit_user.rs @@ -48,6 +48,7 @@ pub async fn edit( // Exit out early if nothing is changed if data.display_name.is_none() + && data.pronouns.is_none() && data.status.is_none() && data.profile.is_none() && data.avatar.is_none() @@ -80,6 +81,7 @@ pub async fn edit( let mut partial: PartialUser = PartialUser { display_name: data.display_name, + pronouns: data.pronouns, badges: data.badges, flags: data.flags, ..Default::default() diff --git a/crates/delta/src/routes/webhooks/mod.rs b/crates/delta/src/routes/webhooks/mod.rs index 6b0ef448f..1aec16f40 100644 --- a/crates/delta/src/routes/webhooks/mod.rs +++ b/crates/delta/src/routes/webhooks/mod.rs @@ -1,19 +1,23 @@ -use rocket::Route; use revolt_rocket_okapi::revolt_okapi::openapi3::OpenApi; +use rocket::Route; mod webhook_delete; +mod webhook_delete_message; mod webhook_delete_token; mod webhook_edit; +mod webhook_edit_message; mod webhook_edit_token; mod webhook_execute; -mod webhook_fetch_token; -mod webhook_fetch; mod webhook_execute_github; +mod webhook_fetch; +mod webhook_fetch_token; pub fn routes() -> (Vec, OpenApi) { openapi_get_routes_spec![ + webhook_delete_message::webhook_delete_message, webhook_delete_token::webhook_delete_token, webhook_delete::webhook_delete, + webhook_edit_message::webhook_edit_message, webhook_edit_token::webhook_edit_token, webhook_edit::webhook_edit, webhook_execute_github::webhook_execute_github, diff --git a/crates/delta/src/routes/webhooks/webhook_delete_message.rs b/crates/delta/src/routes/webhooks/webhook_delete_message.rs new file mode 100644 index 000000000..be4cb63b9 --- /dev/null +++ b/crates/delta/src/routes/webhooks/webhook_delete_message.rs @@ -0,0 +1,27 @@ +use revolt_database::{util::reference::Reference, Database}; +use revolt_result::{create_error, Result}; +use rocket::State; +use rocket_empty::EmptyResponse; + +/// # Deletes a webhook message +/// +/// Deletes a message sent by a webhook +#[openapi(tag = "Webhooks")] +#[delete("///")] +pub async fn webhook_delete_message( + db: &State, + webhook_id: Reference<'_>, + token: String, + message_id: Reference<'_>, +) -> Result { + let webhook = webhook_id.as_webhook(db).await?; + webhook.assert_token(&token)?; + + let message = message_id.as_message(db).await?; + + if message.author != webhook.id { + return Err(create_error!(CannotDeleteMessage)); + } + + message.delete(db).await.map(|_| EmptyResponse) +} diff --git a/crates/delta/src/routes/webhooks/webhook_edit_message.rs b/crates/delta/src/routes/webhooks/webhook_edit_message.rs new file mode 100644 index 000000000..a6e4036f3 --- /dev/null +++ b/crates/delta/src/routes/webhooks/webhook_edit_message.rs @@ -0,0 +1,84 @@ +use iso8601_timestamp::Timestamp; +use revolt_config::config; +use revolt_database::{ + tasks::process_embeds::queue, util::reference::Reference, Database, Message, PartialMessage, +}; +use revolt_models::v0::{self, DataEditMessage, Embed}; +use revolt_models::validator::Validate; +use revolt_result::{create_error, Result}; +use rocket::{serde::json::Json, State}; + +/// # Edits a webhook message +/// +/// Edits a message sent by a webhook +#[openapi(tag = "Webhooks")] +#[patch("///", data = "")] +pub async fn webhook_edit_message( + db: &State, + webhook_id: Reference<'_>, + token: String, + message_id: Reference<'_>, + data: Json, +) -> Result> { + let edit = data.into_inner(); + edit.validate().map_err(|error| { + create_error!(FailedValidation { + error: error.to_string() + }) + })?; + + Message::validate_sum( + &edit.content, + edit.embeds.as_deref().unwrap_or_default(), + config().await.features.limits.default.message_length, + )?; + + let webhook = webhook_id.as_webhook(db).await?; + webhook.assert_token(&token)?; + + let mut message = message_id.as_message(db).await?; + if message.author != webhook.id { + return Err(create_error!(CannotEditMessage)); + } + + message.edited = Some(Timestamp::now_utc()); + let mut partial = PartialMessage { + edited: message.edited, + ..Default::default() + }; + + // 1. Handle content update + if let Some(content) = &edit.content { + partial.content = Some(content.clone()); + } + + // 2. Clear any auto generated embeds + let mut new_embeds = vec![]; + if let Some(embeds) = &message.embeds { + for embed in embeds { + if let Embed::Text(embed) = embed { + new_embeds.push(Embed::Text(embed.clone())) + } + } + } + + // 3. Replace if we are given new embeds + if let Some(embeds) = edit.embeds { + new_embeds.clear(); + + for embed in embeds { + new_embeds.push(message.create_embed(db, embed).await?); + } + } + + partial.embeds = Some(new_embeds); + + message.update(db, partial, vec![]).await?; + + // Queue up a task for processing embeds + if let Some(content) = edit.content { + queue(message.channel.to_string(), message.id.to_string(), content).await; + } + + Ok(Json(message.into_model(None, None))) +} diff --git a/crates/delta/src/routes/webhooks/webhook_execute_github.rs b/crates/delta/src/routes/webhooks/webhook_execute_github.rs index f84ecc634..049392d2d 100644 --- a/crates/delta/src/routes/webhooks/webhook_execute_github.rs +++ b/crates/delta/src/routes/webhooks/webhook_execute_github.rs @@ -217,7 +217,6 @@ pub struct GithubComment { position: Option, reactions: Option, updated_at: Value, - url: String, user: GithubUser, } @@ -689,11 +688,23 @@ const LIGHT_ORANGE: &str = "#d9916d"; // for future use // const WHITE: &str = "#c3e1c3"; -fn shorten_text(text: &str, length: usize) -> String { - if text.len() < length { +fn shorten_single_line_text(text: &str, length: usize) -> String { + if text.contains('\n') { + let text = text.split('\n').next().unwrap(); + + format!("{}...", &text[..text.len().min(length) - 3]) + } else if text.len() > length { + format!("{}...", &text[..length - 3]) + } else { text.to_string() + } +} + +fn shorten_text(text: &str, length: usize) -> String { + if text.len() >= length { + format!("{}...", &text[..length - 3]) } else { - format!("{}...", &text[0..length]) + text.to_string() } } @@ -701,7 +712,7 @@ fn safe_from_str Deserialize<'de>>(data: &str) -> Result { match serde_json::from_str(data) { Ok(output) => Ok(output), Err(err) => { - log::error!("{err:?}"); + revolt_config::capture_internal_error!(err); Err(create_error!(InvalidOperation)) } } @@ -753,12 +764,12 @@ pub async fn webhook_execute_github( db: &State, amqp: &State, webhook_id: Reference<'_>, - token: String, + token: &str, event: EventHeader<'_>, data: String, ) -> Result<()> { let webhook = webhook_id.as_webhook(db).await?; - webhook.assert_token(&token)?; + webhook.assert_token(token)?; let channel = db.fetch_channel(&webhook.channel_id).await?; let event = convert_event(&data, &event)?; @@ -824,7 +835,7 @@ pub async fn webhook_execute_github( "[`{}`]({}) {} - {}", &commit.id[0..=7], commit.url, - shorten_text(&commit.message, 50), + shorten_single_line_text(&commit.message, 50), commit.author.name ) }) @@ -897,10 +908,11 @@ pub async fn webhook_execute_github( url: Some(event.sender.html_url), title: Some(event.sender.login), description: Some(format!( - "#### [{}] New discussion #{}: {}\n{}", + "#### [[{}] New discussion #{}: {}]({})\n{}", event.repository.full_name, discussion.number, discussion.title, + discussion.html_url, shorten_text(&discussion.body, 450) )), colour: Some(LIGHT_ORANGE.to_string()), @@ -911,10 +923,11 @@ pub async fn webhook_execute_github( url: Some(answer.comment.user.html_url), title: Some(answer.comment.user.login), description: Some(format!( - "#### [{}] discussion #{} marked answered: {}\n{}", + "#### [[{}] Discussion #{} marked answered: {}]({})\n{}", event.repository.full_name, discussion.number, discussion.title, + answer.comment.html_url, shorten_text(&answer.comment.body, 450) )), colour: Some(LIGHT_ORANGE.to_string()), @@ -930,10 +943,11 @@ pub async fn webhook_execute_github( url: Some(comment.comment.user.html_url), title: Some(comment.comment.user.login), description: Some(format!( - "[{}] New comment on discussion #{}: {}\n{}", + "#### [[{}] New comment on discussion #{}: {}]({})\n{}", event.repository.full_name, discussion.number, discussion.title, + comment.comment.html_url, shorten_text(&comment.comment.body, 450) )), colour: Some(LIGHT_ORANGE.to_string()), @@ -1002,7 +1016,7 @@ pub async fn webhook_execute_github( event.repository.full_name, issue.number, issue.title, - issue.html_url, + comment.html_url, shorten_text(&comment.body, 450) )), colour: Some(LIGHT_ORANGE.to_string()), diff --git a/crates/delta/src/util/mod.rs b/crates/delta/src/util/mod.rs index 6ee3a7f68..1c32be841 100644 --- a/crates/delta/src/util/mod.rs +++ b/crates/delta/src/util/mod.rs @@ -1,2 +1,4 @@ -pub mod ratelimiter; +pub mod ratelimits; + +#[cfg(test)] pub mod test; diff --git a/crates/delta/src/util/ratelimiter.rs b/crates/delta/src/util/ratelimiter.rs deleted file mode 100644 index 7d00e96dc..000000000 --- a/crates/delta/src/util/ratelimiter.rs +++ /dev/null @@ -1,347 +0,0 @@ -use std::collections::hash_map::DefaultHasher; -use std::hash::Hasher; -use std::ops::Add; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; - -use authifier::models::Session; -use rocket::fairing::{Fairing, Info, Kind}; -use rocket::http::uri::Origin; -use rocket::http::{Method, Status}; -use rocket::request::{FromRequest, Outcome}; -use rocket::serde::json::Json; -use rocket::{Data, Request, Response}; - -use revolt_rocket_okapi::gen::OpenApiGenerator; -use revolt_rocket_okapi::request::{OpenApiFromRequest, RequestHeaderInput}; - -use serde::Serialize; - -use dashmap::DashMap; -use once_cell::sync::Lazy; - -/// Ratelimit Bucket -#[derive(Clone, Copy, Debug)] -struct Entry { - used: u8, - reset: u128, -} - -static MAP: Lazy> = Lazy::new(DashMap::new); - -/// Get the current time from Unix Epoch as a Duration -fn now() -> Duration { - SystemTime::now() - .duration_since(UNIX_EPOCH) - .expect("Time went backwards...") -} - -impl Entry { - /// Find bucket by its key - pub fn from(key: u64) -> Entry { - MAP.get(&key).map(|x| *x).unwrap_or_else(|| Entry { - used: 0, - reset: now().add(Duration::from_secs(10)).as_millis(), - }) - } - - /// Deduct one unit from the bucket and save - pub fn deduct(&mut self) { - let current_time = now().as_millis(); - if current_time > self.reset { - self.used = 1; - self.reset = now().add(Duration::from_secs(10)).as_millis(); - } else { - self.used += 1; - } - } - - /// Save information - pub fn save(self, key: u64) { - MAP.insert(key, self); - } - - /// Get remaining units in the bucket - pub fn get_remaining(&self, limit: u8) -> u8 { - if now().as_millis() > self.reset { - limit - } else { - limit - self.used - } - } - - /// Get how long bucket has until reset - pub fn left_until_reset(&self) -> u128 { - let current_time = now().as_millis(); - if current_time > self.reset { - 0 - } else { - self.reset - current_time - } - } -} - -/// Ratelimit Guard -#[derive(Serialize, Clone, Copy, Debug)] -#[allow(dead_code)] -pub struct Ratelimiter { - key: u64, - limit: u8, - remaining: u8, - reset: u128, -} - -/// Find bucket from given request -/// -/// Optionally, include a resource id to hash against. -fn resolve_bucket<'r>(request: &'r rocket::Request<'_>) -> (&'r str, Option<&'r str>) { - let (segment, resource, extra) = if matches!(request.routed_segment(0), Some("0.8")) { - ( - request.routed_segment(1), - request.routed_segment(2), - request.routed_segment(3), - ) - } else { - ( - request.routed_segment(0), - request.routed_segment(1), - request.routed_segment(2), - ) - }; - - if let Some(segment) = segment { - #[allow(clippy::redundant_locals)] - let resource = resource; - - let method = request.method(); - match (segment, resource, method) { - ("users", target, Method::Patch) => ("user_edit", target), - ("users", _, _) => { - if let Some("default_avatar") = extra { - return ("default_avatar", None); - } - - ("users", None) - } - ("bots", _, _) => ("bots", None), - ("channels", Some(id), _) => { - if request.method() == Method::Post { - if let Some("messages") = extra { - return ("messaging", Some(id)); - } - } - - ("channels", Some(id)) - } - ("servers", Some(id), _) => ("servers", Some(id)), - ("auth", _, _) => { - if request.method() == Method::Delete { - ("auth_delete", None) - } else { - ("auth", None) - } - } - ("swagger", _, _) => ("swagger", None), - ("safety", Some("report"), _) => ("safety_report", Some("report")), - ("safety", _, _) => ("safety", None), - _ => ("any", None), - } - } else { - ("any", None) - } -} - -/// Resolve per-bucket limits -fn resolve_bucket_limit(bucket: &str) -> u8 { - match bucket { - "user_edit" => 2, - "users" => 20, - "bots" => 10, - "messaging" => 10, - "channels" => 15, - "servers" => 5, - "auth" => 15, - "auth_delete" => 255, - "default_avatar" => 255, - "swagger" => 100, - "safety" => 15, - "safety_report" => 3, - _ => 20, - } -} - -/// Find the remote IP of the client -fn to_ip(request: &'_ rocket::Request<'_>) -> String { - request - .remote() - .map(|x| x.ip().to_string()) - .unwrap_or_default() -} - -/// Find the actual IP of the client -fn to_real_ip(request: &'_ rocket::Request<'_>) -> String { - if let Ok(true) = std::env::var("TRUST_CLOUDFLARE").map(|x| x == "1") { - request - .headers() - .get_one("CF-Connecting-IP") - .map(|x| x.to_string()) - .unwrap_or_else(|| to_ip(request)) - } else { - to_ip(request) - } -} - -impl Ratelimiter { - /// Generate guard from identifier and target bucket - pub fn from( - identifier: &str, - (bucket, resource): (&str, Option<&str>), - ) -> Result { - let mut key = DefaultHasher::new(); - key.write(identifier.as_bytes()); - key.write(bucket.as_bytes()); - - if let Some(id) = resource { - key.write(id.as_bytes()); - } - - let key = key.finish(); - let limit = resolve_bucket_limit(bucket); - let mut entry = Entry::from(key); - - let remaining = entry.get_remaining(limit); - let reset = entry.left_until_reset(); - let mut ratelimiter = Ratelimiter { - key, - limit, - remaining, - reset, - }; - if remaining == 0 { - return Err(ratelimiter); - } - - entry.deduct(); - entry.save(key); - ratelimiter.remaining -= 1; - ratelimiter.reset = entry.left_until_reset(); - - Ok(ratelimiter) - } -} - -#[async_trait] -impl<'r> FromRequest<'r> for Ratelimiter { - type Error = Ratelimiter; - - async fn from_request(request: &'r rocket::Request<'_>) -> Outcome { - let ratelimiter = request - .local_cache_async(async { - use rocket::outcome::Outcome; - let identifier = if let Outcome::Success(session) = request.guard::().await - { - session.id - } else { - to_real_ip(request) - }; - - Ratelimiter::from(&identifier, resolve_bucket(request)) - }) - .await; - - match ratelimiter { - Ok(ratelimiter) => Outcome::Success(*ratelimiter), - Err(ratelimiter) => Outcome::Error((Status::TooManyRequests, *ratelimiter)), - } - } -} - -impl OpenApiFromRequest<'_> for Ratelimiter { - fn from_request_input( - _gen: &mut OpenApiGenerator, - _name: String, - _required: bool, - ) -> revolt_rocket_okapi::Result { - Ok(RequestHeaderInput::None) - } -} - -/// Attach ratelimiter to the Rocket application -pub struct RatelimitFairing; - -#[rocket::async_trait] -impl Fairing for RatelimitFairing { - fn info(&self) -> Info { - Info { - name: "Ratelimiter", - kind: Kind::Request | Kind::Response, - } - } - - async fn on_request(&self, request: &mut Request<'_>, _: &mut Data<'_>) { - use rocket::outcome::Outcome; - if let Outcome::Error(_) = request.guard::().await { - info!( - "User rate-limited on route {}! (IP = {:?})", - request.uri(), - to_real_ip(request) - ); - - request.set_method(Method::Get); - request.set_uri(Origin::parse("/ratelimit").unwrap()) - } - } - - async fn on_response<'r>(&self, request: &'r Request<'_>, response: &mut Response<'r>) { - let guard = request.guard::().await; - let (Outcome::Success(ratelimiter) | Outcome::Error((_, ratelimiter))) = guard else { - unreachable!() - }; - let Ratelimiter { - key, - limit, - remaining, - reset, - } = ratelimiter; - - response.set_raw_header("X-RateLimit-Limit", limit.to_string()); - response.set_raw_header("X-RateLimit-Bucket", key.to_string()); - response.set_raw_header("X-RateLimit-Remaining", remaining.to_string()); - response.set_raw_header("X-RateLimit-Reset-After", reset.to_string()); - - if guard.is_error() { - response.set_status(Status::TooManyRequests); - } - } -} - -#[derive(Serialize)] -#[serde(untagged)] -pub enum RatelimitInformation { - Success(Ratelimiter), - Failure { retry_after: u128 }, -} - -#[async_trait] -impl<'r> FromRequest<'r> for RatelimitInformation { - type Error = u128; - - async fn from_request(request: &'r rocket::Request<'_>) -> Outcome { - let info = match request.guard::().await { - Outcome::Success(ratelimiter) => RatelimitInformation::Success(ratelimiter), - Outcome::Error((_, ratelimiter)) => RatelimitInformation::Failure { - retry_after: ratelimiter.reset, - }, - _ => unreachable!(), - }; - Outcome::Success(info) - } -} - -#[rocket::get("/ratelimit")] -fn ratelimit_info(info: RatelimitInformation) -> Json { - Json(info) -} - -pub fn routes() -> Vec { - rocket::routes![ratelimit_info] -} diff --git a/crates/delta/src/util/ratelimits.rs b/crates/delta/src/util/ratelimits.rs new file mode 100644 index 000000000..178d15d23 --- /dev/null +++ b/crates/delta/src/util/ratelimits.rs @@ -0,0 +1,81 @@ +use revolt_ratelimits::ratelimiter::RatelimitResolver; +use rocket::{http::Method, Request}; + +pub struct DeltaRatelimits; + +impl<'a> RatelimitResolver> for DeltaRatelimits { + fn resolve_bucket<'r>(&self, request: &'r Request<'_>) -> (&'r str, Option<&'r str>) { + let (segment, resource, extra) = if request.routed_segment(0) == Some("0.8") { + ( + request.routed_segment(1), + request.routed_segment(2), + request.routed_segment(3), + ) + } else { + ( + request.routed_segment(0), + request.routed_segment(1), + request.routed_segment(2), + ) + }; + + if let Some(segment) = segment { + #[allow(clippy::redundant_locals)] + let resource = resource; + + let method = request.method(); + match (segment, resource, method) { + ("users", target, Method::Patch) => ("user_edit", target), + ("users", _, _) => { + if let Some("default_avatar") = extra { + return ("default_avatar", None); + } + + ("users", None) + } + ("bots", _, _) => ("bots", None), + ("channels", Some(id), _) => { + if request.method() == Method::Post { + if let Some("messages") = extra { + return ("messaging", Some(id)); + } + } + + ("channels", Some(id)) + } + ("servers", Some(id), _) => ("servers", Some(id)), + ("auth", _, _) => { + if request.method() == Method::Delete { + ("auth_delete", None) + } else { + ("auth", None) + } + } + ("swagger", _, _) => ("swagger", None), + ("safety", Some("report"), _) => ("safety_report", Some("report")), + ("safety", _, _) => ("safety", None), + _ => ("any", None), + } + } else { + ("any", None) + } + } + + fn resolve_bucket_limit(&self, bucket: &str) -> u32 { + match bucket { + "user_edit" => 2, + "users" => 20, + "bots" => 10, + "messaging" => 10, + "channels" => 15, + "servers" => 5, + "auth" => 15, + "auth_delete" => 255, + "default_avatar" => 255, + "swagger" => 100, + "safety" => 15, + "safety_report" => 3, + _ => 20, + } + } +} diff --git a/crates/delta/src/util/test.rs b/crates/delta/src/util/test.rs index 067f8bd0a..731129a70 100644 --- a/crates/delta/src/util/test.rs +++ b/crates/delta/src/util/test.rs @@ -1,22 +1,24 @@ -use authifier::{ - models::{Account, EmailVerification, Session}, - Authifier, -}; +use std::time::Duration; + use futures::StreamExt; use rand::Rng; use redis_kiss::redis::aio::PubSub; +use revolt_database::util::email::normalise_email; +use revolt_database::util::password::hash_password; use revolt_database::{ - events::client::EventV1, Channel, Database, Member, Message, Server, User, AMQP, + events::client::EventV1, Channel, Database, Member, Message, PartialRole, Server, User, AMQP, }; use revolt_database::{util::idempotency::IdempotencyKey, Role}; +use revolt_database::{Account, EmailVerification, Session}; use revolt_models::v0; use revolt_permissions::OverrideField; use rocket::http::Header; use rocket::local::asynchronous::{Client, LocalRequest, LocalResponse}; +use rocket::tokio; +use serde::{Deserialize, Serialize}; pub struct TestHarness { pub client: Client, - authifier: Authifier, pub db: Database, pub amqp: AMQP, sub: PubSub, @@ -25,8 +27,6 @@ pub struct TestHarness { impl TestHarness { pub async fn new() -> TestHarness { - let config = revolt_config::config().await; - let client = Client::tracked(crate::web().await) .await .expect("valid rocket instance"); @@ -43,29 +43,10 @@ impl TestHarness { .expect("`Database`") .clone(); - let authifier = client - .rocket() - .state::() - .expect("`Authifier`") - .clone(); - - let connection = amqprs::connection::Connection::open( - &amqprs::connection::OpenConnectionArguments::new( - &config.rabbit.host, - config.rabbit.port, - &config.rabbit.username, - &config.rabbit.password, - ), - ) - .await - .unwrap(); - let channel = connection.open_channel(None).await.unwrap(); - - let amqp = AMQP::new(connection, channel); + let amqp = AMQP::new_auto().await; TestHarness { client, - authifier, db, amqp, sub, @@ -93,11 +74,12 @@ impl TestHarness { } pub async fn account_from_user(&self, id: String) -> (Account, Session) { + let email = format!("{}@stoat.chat", TestHarness::rand_string()); let account = Account { id, - email: format!("{}@revolt.chat", TestHarness::rand_string()), - password: Default::default(), - email_normalised: Default::default(), + email: email.clone(), + password: hash_password("password_insecure".to_string()).unwrap(), + email_normalised: normalise_email(email), deletion: None, disabled: false, lockout: None, @@ -106,14 +88,10 @@ impl TestHarness { verification: EmailVerification::Verified, }; - self.authifier - .database - .save_account(&account) - .await - .expect("`Account`"); + self.db.save_account(&account).await.expect("`Account`"); let session = account - .create_session(&self.authifier, String::new()) + .create_session(&self.db, String::new()) .await .expect("`Session`"); @@ -139,21 +117,26 @@ impl TestHarness { server: &Server, rank: i64, overrides: Option, - ) -> (String, Role) { - let role = Role { - name: TestHarness::rand_string(), - permissions: overrides.unwrap_or(OverrideField { a: 0, d: 0 }), - rank, - colour: None, - hoist: false, - }; - - let id = role - .create(&self.db, &server.id) + ) -> Role { + let mut role = Role::create(&self.db, &server, TestHarness::rand_string()) .await .expect("Failed to create test role"); - (id, role) + if let Some(overrides) = overrides { + role.update( + &self.db, + &server.id, + PartialRole { + permissions: Some(overrides), + ..Default::default() + }, + Vec::new(), + ) + .await + .expect("Failed to set test role overrides"); + }; + + role } pub async fn new_channel(&self, server: &Server) -> Channel { @@ -165,6 +148,7 @@ impl TestHarness { name: "Test Channel".to_string(), description: None, nsfw: Some(false), + voice: None, }, true, ) @@ -245,6 +229,40 @@ impl TestHarness { unreachable!() } + pub async fn assert_email(&self, mailbox: &str) -> (Mail, String) { + // Wait a moment for maildev to catch the email + + tokio::time::sleep(Duration::from_secs(1)).await; + + let client = reqwest::Client::new(); + let results = client + .get("http://localhost:14080/email") + .send() + .await + .unwrap() + .json::>() + .await + .unwrap(); + + let re = regex::Regex::new(r"\[\[([A-Za-z0-9_-]*)\]\]").unwrap(); + + for entry in results.into_iter().rev() { + if entry.envelope.to[0].address == mailbox { + client + .delete(format!("http://localhost:14080/delete/{}", &entry.id)) + .send() + .await + .unwrap(); + + let code = re.captures_iter(&entry.text).next().unwrap()[1].to_string(); + + return (entry, code); + } + } + + panic!("Email not found.") + } + pub async fn wait_for_message(&mut self, channel_id: &str) -> v0::Message { dbg!(&self.event_buffer); @@ -260,3 +278,22 @@ impl TestHarness { } } } + +#[derive(Debug, Serialize, Deserialize)] +pub struct Mail { + pub id: String, + pub envelope: MailEnvelope, + pub subject: String, + pub text: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct MailEnvelope { + pub from: MailAddress, + pub to: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct MailAddress { + pub address: String, +} diff --git a/crates/services/autumn/Cargo.toml b/crates/services/autumn/Cargo.toml index 464da056f..7c134170a 100644 --- a/crates/services/autumn/Cargo.toml +++ b/crates/services/autumn/Cargo.toml @@ -1,65 +1,64 @@ [package] name = "revolt-autumn" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "AGPL-3.0-or-later" +publish = false [dependencies] # ID generation -ulid = "1.1.3" -nanoid = "0.4.0" +ulid = { workspace = true } +nanoid = { workspace = true } # Media processing -webp = "0.3.0" -sha2 = "0.10.8" -jxl-oxide = "0.8.1" -kamadak-exif = "0.5.4" +webp = { workspace = true } +sha2 = { workspace = true } +jxl-oxide = { workspace = true } +kamadak-exif = { workspace = true } # revolt_little_exif = "0.5.1" -image = { version = "0.25.2" } # avif encode requires dav1d system library: features = ["avif-native"] +image = { workspace = true } +thumbhash = { workspace = true } +lcms2 = { workspace = true } # File processing -revolt_clamav-client = { version = "0.1.5" } -simdutf8 = { version = "0.1.4", features = ["aarch64_neon"] } +revolt_clamav-client = { workspace = true } +simdutf8 = { workspace = true, features = ["aarch64_neon"] } # Content type processing -infer = "0.16.0" -ffprobe = "0.4.0" -imagesize = "0.13.0" +infer = { workspace = true } +ffprobe = { workspace = true } +imagesize = { workspace = true } # Utility -lazy_static = "1.5.0" -moka = { version = "0.12.8", features = ["future"] } - +lazy_static = { workspace = true } +moka = { workspace = true, features = ["future"] } +url-escape = { workspace = true } # Serialisation -strum_macros = "0.26.4" -serde_json = "1.0.68" -serde = { version = "1.0", features = ["derive"] } +strum_macros = { workspace = true } +serde_json = { workspace = true } +serde = { workspace = true } # Async runtime -tokio = { version = "1.0", features = ["full"] } +tokio = { workspace = true, features = ["full"] } # Logging -tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } # Core crates -revolt-files = { version = "0.8.8", path = "../../core/files" } -revolt-config = { version = "0.8.8", path = "../../core/config" } -revolt-database = { version = "0.8.8", path = "../../core/database", features = [ - "axum-impl", -] } -revolt-result = { version = "0.8.8", path = "../../core/result", features = [ - "utoipa", - "axum", -] } +revolt-files = { workspace = true } +revolt-config = { workspace = true } +revolt-database = { workspace = true, features = ["axum-impl"] } +revolt-result = { workspace = true, features = ["utoipa", "axum"] } +revolt-ratelimits = { workspace = true, features = ["axum"] } # Axum / web server -tempfile = "3.12.0" -axum-macros = "0.4.1" -axum_typed_multipart = "0.12.1" -axum = { version = "0.7.5", features = ["multipart"] } -tower-http = { version = "0.5.2", features = ["cors"] } +tempfile = { workspace = true } +axum-macros = { workspace = true } +axum_typed_multipart = { workspace = true } +axum = { workspace = true, features = ["multipart"] } +tower-http = { workspace = true, features = ["cors"] } # OpenAPI & documentation generation -utoipa-scalar = { version = "0.1.0", features = ["axum"] } -utoipa = { version = "4.2.3", features = ["axum_extras", "ulid"] } +utoipa-scalar = { workspace = true, features = ["axum"] } +utoipa = { workspace = true, features = ["axum_extras", "ulid"] } diff --git a/crates/services/autumn/Dockerfile b/crates/services/autumn/Dockerfile index 40548e2c1..940703fed 100644 --- a/crates/services/autumn/Dockerfile +++ b/crates/services/autumn/Dockerfile @@ -1,12 +1,12 @@ # Build Stage -FROM ghcr.io/revoltchat/base:latest AS builder +FROM ghcr.io/stoatchat/base:latest AS builder FROM debian:12 AS debian # Bundle Stage FROM gcr.io/distroless/cc-debian12:nonroot COPY --from=builder /home/rust/src/target/release/revolt-autumn ./ -COPY --from=mwader/static-ffmpeg:7.0.2 /ffmpeg /usr/local/bin/ -COPY --from=mwader/static-ffmpeg:7.0.2 /ffprobe /usr/local/bin/ +COPY --from=mwader/static-ffmpeg:7.1.1 /ffmpeg /usr/local/bin/ +COPY --from=mwader/static-ffmpeg:7.1.1 /ffprobe /usr/local/bin/ COPY --from=debian /usr/bin/uname /usr/bin/uname EXPOSE 14704 diff --git a/crates/services/autumn/src/api.rs b/crates/services/autumn/src/api.rs index d068c2dcd..c0e45d72b 100644 --- a/crates/services/autumn/src/api.rs +++ b/crates/services/autumn/src/api.rs @@ -1,5 +1,5 @@ use std::{ - io::{Cursor, Read}, + io::{Cursor, Read, Write}, time::Duration, }; @@ -15,25 +15,35 @@ use lazy_static::lazy_static; use revolt_config::{config, report_internal_error}; use revolt_database::{iso8601_timestamp::Timestamp, Database, FileHash, Metadata, User}; use revolt_files::{ - create_thumbnail, decode_image, fetch_from_s3, upload_to_s3, AUTHENTICATION_TAG_SIZE_BYTES, + create_thumbnail, decode_image, fetch_from_s3, is_animated, upload_to_s3, + AUTHENTICATION_TAG_SIZE_BYTES, }; -use revolt_result::{create_error, Error, Result}; +use revolt_result::{create_error, Error, Result, ToRevoltError}; use serde::{Deserialize, Serialize}; use sha2::Digest; use tempfile::NamedTempFile; use tokio::time::Instant; use tower_http::cors::{AllowHeaders, Any, CorsLayer}; +use url_escape::encode_component; use utoipa::ToSchema; -use crate::{exif::strip_metadata, metadata::generate_metadata, mime_type::determine_mime_type}; +use crate::{ + exif::strip_metadata, metadata::generate_metadata, mime_type::determine_mime_type, AppState, +}; /// Build the API router -pub async fn router() -> Router { +pub async fn router() -> Router { let config = config().await; let cors = CorsLayer::new() .allow_methods([Method::POST]) .allow_headers(AllowHeaders::mirror_request()) + .expose_headers(vec![ + "X-RateLimit-Limit".try_into().unwrap(), + "X-RateLimit-Bucket".try_into().unwrap(), + "X-RateLimit-Remaining".try_into().unwrap(), + "X-RateLimit-Reset-After".try_into().unwrap(), + ]) .allow_origin(Any); Router::new() @@ -374,7 +384,30 @@ async fn fetch_preview( let hash = file.as_hash(&db).await?; - let is_animated = hash.content_type == "image/gif"; // TODO: extract this data from files + let mut data = None; + + // If animated is unset, check the file contents to see if it is animated and update the filehash + let is_animated = match &hash.metadata { + Metadata::Image { + animated: Some(value), + .. + } => *value, + Metadata::Image { animated: None, .. } => { + let file_data = retrieve_file_by_hash(&hash).await?; + + let mut named_file = NamedTempFile::new().to_internal_error()?; + named_file.write(&file_data).to_internal_error()?; + + data = Some(file_data); + + // If it fails for some reason, set it to not be animated + let animated = is_animated(&named_file, &hash.content_type).unwrap_or(false); + db.set_attachment_hash_animated(&hash.id, animated).await?; + + animated + } + _ => false, + }; // Only process image files and don't process GIFs if not avatar or icon if !matches!(hash.metadata, Metadata::Image { .. }) @@ -386,7 +419,11 @@ async fn fetch_preview( } // Original image data - let data = retrieve_file_by_hash(&hash).await?; + let data = if let Some(data) = data { + data + } else { + retrieve_file_by_hash(&hash).await? + }; // Read image and create thumbnail let data = create_thumbnail( @@ -443,8 +480,10 @@ async fn fetch_file( // Ensure filename is correct if file_name != file.filename { if file_name == "original" { + let safe_filename = encode_component(&file.filename); + return Ok( - Redirect::permanent(&format!("/{tag}/{file_id}/{}", file.filename)).into_response(), + Redirect::permanent(&format!("/{tag}/{file_id}/{}", safe_filename)).into_response(), ); } diff --git a/crates/services/autumn/src/exif.rs b/crates/services/autumn/src/exif.rs index 23be9ac7f..be8e61508 100644 --- a/crates/services/autumn/src/exif.rs +++ b/crates/services/autumn/src/exif.rs @@ -1,13 +1,24 @@ use std::io::{Cursor, Read}; +use crate::utils::apply_icc_profile; use exif::Reader; -use image::{ImageFormat, ImageReader}; +use image::{ImageEncoder, ImageReader}; use revolt_config::report_internal_error; use revolt_database::Metadata; use revolt_result::{create_error, Result}; use tempfile::NamedTempFile; use tokio::process::Command; +macro_rules! encode_with_icc { + ($encoder:expr, $icc:expr, $image:expr, $width:expr, $height:expr, $color:expr) => {{ + let mut encoder = $encoder; + if let Some(icc) = $icc { + let _ = encoder.set_icc_profile(icc.clone()); + } + encoder.write_image($image, $width, $height, $color) + }}; +} + /// Strip EXIF data from given file and produce new file and metadata pub async fn strip_metadata( file: NamedTempFile, @@ -16,7 +27,12 @@ pub async fn strip_metadata( mime: &str, ) -> Result<(Vec, Metadata)> { match &metadata { - Metadata::Image { width, height } => match mime { + Metadata::Image { + width: _, + height: _, + thumbhash, + animated, + } => match mime { // // little_exif does not appear to parse JPEGs correctly? had 2/2 files fail // "image/jpeg" | "image/png" => { // // use little_exif to strip metadata except for orientation and colour profile @@ -41,11 +57,12 @@ pub async fn strip_metadata( let mut cursor = Cursor::new(buf); // Decode the image - let image = report_internal_error!(report_internal_error!(ImageReader::new( - &mut cursor - ) - .with_guessed_format())? - .decode()); + let reader = + report_internal_error!(ImageReader::new(&mut cursor).with_guessed_format())?; + let mut decoder = report_internal_error!(reader.into_decoder())?; + let mut icc_profile = + report_internal_error!(image::ImageDecoder::icc_profile(&mut decoder))?; + let mut image = report_internal_error!(image::DynamicImage::from_decoder(decoder))?; // Reset read position cursor.set_position(0); @@ -66,34 +83,72 @@ pub async fn strip_metadata( // Apply the EXIF rotation // See https://jdhao.github.io/2019/07/31/image_rotation_exif_info/ - report_internal_error!(match &rotation { - 2 => image?.fliph(), - 3 => image?.rotate180(), - 4 => image?.rotate180().fliph(), - 5 => image?.rotate90().fliph(), - 6 => image?.rotate90(), - 7 => image?.rotate270().fliph(), - 8 => image?.rotate270(), - _ => image?, + image = match &rotation { + 2 => image.fliph(), + 3 => image.rotate180(), + 4 => image.rotate180().fliph(), + 5 => image.rotate90().fliph(), + 6 => image.rotate90(), + 7 => image.rotate270().fliph(), + 8 => image.rotate270(), + _ => image, + }; + + if let Some(icc) = &icc_profile { + image = apply_icc_profile(image, icc); + icc_profile = None; } - .write_to( - &mut writer, - match mime { - "image/jpeg" => ImageFormat::Jpeg, - "image/png" => ImageFormat::Png, - "image/avif" => ImageFormat::Avif, - "image/tiff" => ImageFormat::Tiff, - _ => todo!(), - }, - ))?; - // Calculate dimensions after rotation. - let (width, height) = match &rotation { - 2 | 4 | 5 | 7 => (*height, *width), - _ => (*width, *height), - }; + let color_type = image.color(); + let width = image.width(); + let height = image.height(); + + report_internal_error!(match mime { + "image/jpeg" => encode_with_icc!( + image::codecs::jpeg::JpegEncoder::new(&mut writer), + &icc_profile, + image.as_bytes(), + width, + height, + color_type.into() + ), + "image/png" => encode_with_icc!( + image::codecs::png::PngEncoder::new(&mut writer), + &icc_profile, + image.as_bytes(), + width, + height, + color_type.into() + ), + "image/avif" => { + // avif encoder doesn't implement set_icc_profile currently + image::codecs::avif::AvifEncoder::new(&mut writer).write_image( + image.as_bytes(), + width, + height, + color_type.into(), + ) + } + "image/tiff" => encode_with_icc!( + image::codecs::tiff::TiffEncoder::new(&mut writer), + &icc_profile, + image.as_bytes(), + width, + height, + color_type.into() + ), + _ => unreachable!(), + })?; - Ok((bytes, Metadata::Image { width, height })) + Ok(( + bytes, + Metadata::Image { + width: width as isize, + height: height as isize, + thumbhash: thumbhash.clone(), + animated: *animated, + }, + )) } // JXLs store EXIF data but we don't have the ability to write them "image/jxl" => Ok((buf, metadata)), diff --git a/crates/services/autumn/src/main.rs b/crates/services/autumn/src/main.rs index ff29b2e3d..e62343186 100644 --- a/crates/services/autumn/src/main.rs +++ b/crates/services/autumn/src/main.rs @@ -1,8 +1,10 @@ use std::net::{Ipv4Addr, SocketAddr}; -use axum::Router; +use axum::{middleware::from_fn_with_state, Router}; -use revolt_database::DatabaseInfo; +use axum_macros::FromRef; +use revolt_database::{Database, DatabaseInfo}; +use revolt_ratelimits::axum as ratelimiter; use tokio::net::TcpListener; use utoipa::{ openapi::security::{ApiKey, ApiKeyValue, SecurityScheme}, @@ -15,6 +17,14 @@ pub mod clamav; pub mod exif; pub mod metadata; pub mod mime_type; +mod ratelimits; +mod utils; + +#[derive(FromRef, Clone)] +struct AppState { + database: Database, + ratelimit_storage: ratelimiter::RatelimitStorage, +} #[tokio::main] async fn main() -> Result<(), std::io::Error> { @@ -69,12 +79,23 @@ async fn main() -> Result<(), std::io::Error> { // Connect to the database let db = DatabaseInfo::Auto.connect().await.unwrap(); + let ratelimits = ratelimiter::RatelimitStorage::new(ratelimits::AutumnRatelimits); + + let state = AppState { + database: db, + ratelimit_storage: ratelimits, + }; // Configure Axum and router let app = Router::new() .merge(Scalar::with_url("/scalar", ApiDoc::openapi())) .nest("/", api::router().await) - .with_state(db); + .nest("/", ratelimiter::routes()) + .layer(from_fn_with_state( + state.clone(), + ratelimiter::ratelimit_middleware, + )) + .with_state(state); // Configure TCP listener and bind let address = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 14704)); diff --git a/crates/services/autumn/src/metadata.rs b/crates/services/autumn/src/metadata.rs index 72b610e90..c476eac46 100644 --- a/crates/services/autumn/src/metadata.rs +++ b/crates/services/autumn/src/metadata.rs @@ -1,7 +1,9 @@ use std::io::Cursor; +use crate::utils::apply_icc_profile; +use image::{GenericImageView, ImageError, ImageReader}; use revolt_database::Metadata; -use revolt_files::{image_size, video_size}; +use revolt_files::{image_size, is_animated, video_size}; use tempfile::NamedTempFile; /// Intersection of what infer can detect and what image-rs supports @@ -26,6 +28,27 @@ pub fn generate_metadata(f: &NamedTempFile, mime_type: &str) -> Metadata { .map(|(width, height)| Metadata::Image { width: width as isize, height: height as isize, + thumbhash: (|| { + let reader = ImageReader::open(f).ok()?.with_guessed_format().ok()?; + let mut decoder = reader.into_decoder().ok()?; + let icc_profile = image::ImageDecoder::icc_profile(&mut decoder) + .ok() + .flatten(); + let mut img = image::DynamicImage::from_decoder(decoder).ok()?; + + if let Some(icc) = icc_profile { + img = apply_icc_profile(img, &icc); + } + + let img = img.thumbnail(100, 100); + let (width, height) = img.dimensions(); + Some(thumbhash::rgba_to_thumb_hash( + width as usize, + height as usize, + &img.into_rgba8().into_raw(), + )) + })(), + animated: is_animated(f, mime_type).or(Some(false)), }) .unwrap_or_default() } else if mime_type.starts_with("video/") { diff --git a/crates/services/autumn/src/ratelimits.rs b/crates/services/autumn/src/ratelimits.rs new file mode 100644 index 000000000..609d8e1ec --- /dev/null +++ b/crates/services/autumn/src/ratelimits.rs @@ -0,0 +1,28 @@ +use axum::http::{request::Parts, Method}; +use revolt_ratelimits::ratelimiter::RatelimitResolver; + +pub struct AutumnRatelimits; + +impl RatelimitResolver for AutumnRatelimits { + fn resolve_bucket<'a>(&self, parts: &'a Parts) -> (&'a str, Option<&'a str>) { + let path = parts + .uri + .path() + .trim_matches('/') + .split_terminator("/") + .collect::>(); + + match (&parts.method, path.as_slice()) { + (&Method::POST, &[tag]) => ("upload", Some(tag)), + _ => ("any", None), + } + } + + fn resolve_bucket_limit(&self, bucket: &str) -> u32 { + match bucket { + "upload" => 10, + "any" => u32::MAX, + _ => unreachable!("Bucket defined but no limit set"), + } + } +} diff --git a/crates/services/autumn/src/utils.rs b/crates/services/autumn/src/utils.rs new file mode 100644 index 000000000..5e2fbfb8b --- /dev/null +++ b/crates/services/autumn/src/utils.rs @@ -0,0 +1,31 @@ +/// Convert image to sRGB using the provided ICC profile. +/// Returns the converted image, or the original if conversion fails. +pub fn apply_icc_profile(image: image::DynamicImage, icc: &[u8]) -> image::DynamicImage { + let Ok(src_profile) = lcms2::Profile::new_icc(icc) else { + return image; + }; + let dst_profile = lcms2::Profile::new_srgb(); + let format = if image.color().has_alpha() { + lcms2::PixelFormat::RGBA_8 + } else { + lcms2::PixelFormat::RGB_8 + }; + let Ok(t) = lcms2::Transform::new( + &src_profile, + format, + &dst_profile, + format, + lcms2::Intent::Perceptual, + ) else { + return image; + }; + if image.color().has_alpha() { + let mut rgba_image = image.into_rgba8(); + t.transform_in_place(rgba_image.as_mut()); + image::DynamicImage::ImageRgba8(rgba_image) + } else { + let mut rgb_image = image.into_rgb8(); + t.transform_in_place(rgb_image.as_mut()); + image::DynamicImage::ImageRgb8(rgb_image) + } +} diff --git a/crates/services/gifbox/Cargo.toml b/crates/services/gifbox/Cargo.toml new file mode 100644 index 000000000..a569b2cd9 --- /dev/null +++ b/crates/services/gifbox/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "revolt-gifbox" +version = "0.13.7" +edition = "2021" +license = "AGPL-3.0-or-later" +publish = false + +[dependencies] +# Serialisation +serde = { workspace = true, features = ["rc"] } +serde_json = { workspace = true } + +# Async runtime +tokio = { workspace = true, features = [] } + +# Web requests +reqwest = { workspace = true, features = ["json", "query"] } + +# Core crates +revolt-config = { workspace = true } +revolt-models = { workspace = true } +revolt-result = { workspace = true, features = ["utoipa", "axum"] } +revolt-coalesced = { workspace = true, features = ["queue"] } +revolt-database = { workspace = true, features = ["axum-impl"] } +revolt-ratelimits = { workspace = true, features = ["axum"] } + +# Axum / web server +axum = { workspace = true } +axum-extra = { workspace = true, features = ["typed-header"] } +tower-http = { workspace = true, features = ["cors"] } + +# OpenAPI & documentation generation +utoipa-scalar = { workspace = true, features = ["axum"] } +utoipa = { workspace = true, features = ["axum_extras", "ulid"] } + +# Logging +tracing = { workspace = true } + +# Utils +lru_time_cache = { workspace = true } diff --git a/crates/services/gifbox/Dockerfile b/crates/services/gifbox/Dockerfile new file mode 100644 index 000000000..a6af49ee6 --- /dev/null +++ b/crates/services/gifbox/Dockerfile @@ -0,0 +1,10 @@ +# Build Stage +FROM ghcr.io/stoatchat/base:latest AS builder + +# Bundle Stage +FROM gcr.io/distroless/cc-debian12:nonroot +COPY --from=builder /home/rust/src/target/release/revolt-gifbox ./ + +EXPOSE 14706 +USER nonroot +CMD ["./revolt-gifbox"] diff --git a/crates/services/gifbox/src/main.rs b/crates/services/gifbox/src/main.rs new file mode 100644 index 000000000..059cb22f1 --- /dev/null +++ b/crates/services/gifbox/src/main.rs @@ -0,0 +1,112 @@ +use std::net::{Ipv4Addr, SocketAddr}; + +use axum::{extract::FromRef, middleware::from_fn_with_state, Router}; + +use revolt_config::config; +use revolt_database::{Database, DatabaseInfo}; +use revolt_ratelimits::axum as ratelimiter; +use tokio::net::TcpListener; +use utoipa::{ + openapi::security::{ApiKey, ApiKeyValue, SecurityScheme}, + Modify, OpenApi, +}; +use utoipa_scalar::{Scalar, Servable as ScalarServable}; + +use crate::tenor::Tenor; + +mod ratelimits; +mod routes; +mod tenor; +mod types; + +#[derive(Clone, FromRef)] +struct AppState { + pub database: Database, + pub tenor: Tenor, + pub ratelimit_storage: ratelimiter::RatelimitStorage, +} + +struct SecurityAddon; + +impl Modify for SecurityAddon { + fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) { + let components = openapi.components.get_or_insert_default(); + + components.add_security_scheme( + "User Token", + SecurityScheme::ApiKey(ApiKey::Header(ApiKeyValue::new( + "X-Session-Token".to_string(), + ))), + ); + + components.add_security_scheme( + "Bot Token", + SecurityScheme::ApiKey(ApiKey::Header(ApiKeyValue::new("X-Bot-Token".to_string()))), + ); + } +} + +#[tokio::main] +async fn main() -> Result<(), std::io::Error> { + // Configure logging and environment + revolt_config::configure!(gifbox); + + // Configure API schema + #[derive(OpenApi)] + #[openapi( + modifiers(&SecurityAddon), + paths( + routes::categories::categories, + routes::root::root, + routes::search::search, + routes::trending::trending, + ), + tags( + (name = "Misc", description = "Misc routes for microservice."), + (name = "GIFs", description = "All routes for requesting GIFs from tenor.") + ), + components( + schemas( + revolt_result::Error, + revolt_result::ErrorType, + types::MediaResult, + types::MediaObject, + ) + ), + )] + struct ApiDoc; + + let config = config().await; + + let database = DatabaseInfo::Auto + .connect() + .await + .expect("Unable to connect to database"); + + let tenor = tenor::Tenor::new(&config.api.security.tenor_key); + + let ratelimit_storage = ratelimiter::RatelimitStorage::new(ratelimits::GifboxRatelimits); + + let state = AppState { + database, + tenor, + ratelimit_storage, + }; + + // Configure Axum and router + let app = Router::new() + .merge(Scalar::with_url("/scalar", ApiDoc::openapi())) + .nest("/", routes::router()) + .layer(from_fn_with_state( + state.clone(), + ratelimiter::ratelimit_middleware, + )) + .with_state(state); + + // Configure TCP listener and bind + tracing::info!("Listening on 0.0.0.0:14706"); + tracing::info!("Play around with the API: http://localhost:14706/scalar"); + let address = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 14706)); + let listener = TcpListener::bind(&address).await?; + axum::serve(listener, app.into_make_service()).await +} diff --git a/crates/services/gifbox/src/ratelimits.rs b/crates/services/gifbox/src/ratelimits.rs new file mode 100644 index 000000000..10c904d4e --- /dev/null +++ b/crates/services/gifbox/src/ratelimits.rs @@ -0,0 +1,32 @@ +use axum::http::request::Parts; +use revolt_ratelimits::ratelimiter::RatelimitResolver; + +pub struct GifboxRatelimits; + +impl RatelimitResolver for GifboxRatelimits { + fn resolve_bucket<'a>(&self, parts: &'a Parts) -> (&'a str, Option<&'a str>) { + let path = parts + .uri + .path() + .trim_matches('/') + .split_terminator("/") + .next(); + + match path { + Some("categories") => ("categories", None), + Some("trending") => ("trending", None), + Some("search") => ("search", None), + _ => ("any", None), + } + } + + fn resolve_bucket_limit(&self, bucket: &str) -> u32 { + match bucket { + "categories" => 2, + "trending" => 5, + "search" => 10, + "any" => u32::MAX, + _ => unreachable!("Bucket defined but no limit set"), + } + } +} diff --git a/crates/services/gifbox/src/routes/categories.rs b/crates/services/gifbox/src/routes/categories.rs new file mode 100644 index 000000000..a79f03c0a --- /dev/null +++ b/crates/services/gifbox/src/routes/categories.rs @@ -0,0 +1,48 @@ +use axum::{ + extract::{Query, State}, + Json, +}; +use revolt_database::User; +use revolt_result::{create_error, Result}; +use serde::Deserialize; +use utoipa::IntoParams; + +use crate::{tenor, types}; + +#[derive(Deserialize, IntoParams)] +pub struct CategoriesQueryParams { + /// Users locale + #[param(example = "en_US")] + pub locale: String, +} + +/// Trending GIF categories +#[utoipa::path( + get, + path = "/categories", + tag = "GIFs", + security(("User Token" = []), ("Bot Token" = [])), + params(CategoriesQueryParams), + responses( + (status = 200, description = "Categories results", body = inline(Vec)) + ) +)] +pub async fn categories( + _user: User, + Query(params): Query, + State(tenor): State, +) -> Result>> { + tenor + .categories(¶ms.locale) + .await + .map_err(|_| create_error!(InternalError)) + .map(|results| { + (*results) + .clone() + .tags + .into_iter() + .map(|cat| cat.into()) + .collect() + }) + .map(Json) +} diff --git a/crates/services/gifbox/src/routes/mod.rs b/crates/services/gifbox/src/routes/mod.rs new file mode 100644 index 000000000..e47e19f0e --- /dev/null +++ b/crates/services/gifbox/src/routes/mod.rs @@ -0,0 +1,31 @@ +use crate::AppState; +use axum::{ + http::Method, + routing::{get, Router}, +}; +use tower_http::cors::{AllowHeaders, Any, CorsLayer}; + +pub mod categories; +pub mod root; +pub mod search; +pub mod trending; + +pub fn router() -> Router { + let cors = CorsLayer::new() + .allow_methods([Method::GET]) + .allow_headers(AllowHeaders::mirror_request()) + .expose_headers(vec![ + "X-RateLimit-Limit".try_into().unwrap(), + "X-RateLimit-Bucket".try_into().unwrap(), + "X-RateLimit-Remaining".try_into().unwrap(), + "X-RateLimit-Reset-After".try_into().unwrap(), + ]) + .allow_origin(Any); + + Router::new() + .route("/", get(root::root)) + .route("/categories", get(categories::categories)) + .route("/search", get(search::search)) + .route("/trending", get(trending::trending)) + .layer(cors) +} diff --git a/crates/services/gifbox/src/routes/root.rs b/crates/services/gifbox/src/routes/root.rs new file mode 100644 index 000000000..4bf3aed56 --- /dev/null +++ b/crates/services/gifbox/src/routes/root.rs @@ -0,0 +1,22 @@ +use axum::Json; + +use crate::types; + +/// Capture crate version from Cargo +static CRATE_VERSION: &str = env!("CARGO_PKG_VERSION"); + +/// Root response from service +#[utoipa::path( + get, + path = "/", + tag = "Misc", + responses( + (status = 200, description = "Root response", body = inline(types::RootResponse)) + ) +)] +pub async fn root() -> Json> { + Json(types::RootResponse { + message: "Gifbox lives on!", + version: CRATE_VERSION, + }) +} diff --git a/crates/services/gifbox/src/routes/search.rs b/crates/services/gifbox/src/routes/search.rs new file mode 100644 index 000000000..ac541dc2b --- /dev/null +++ b/crates/services/gifbox/src/routes/search.rs @@ -0,0 +1,56 @@ +use axum::{ + extract::{Query, State}, + Json, +}; +use revolt_database::User; +use revolt_result::{create_error, Result}; +use serde::Deserialize; +use utoipa::IntoParams; + +use crate::{tenor, types}; + +#[derive(Deserialize, IntoParams)] +pub struct SearchQueryParams { + /// Search query + #[param(example = "Wave")] + pub query: String, + /// Users locale + #[param(example = "en_US")] + pub locale: String, + /// Amount of results to respond with + pub limit: Option, + /// Flag for if searching in a gif category + pub is_category: Option, + /// Value of `next` for getting the next page of results with the current search query + pub position: Option, +} + +/// Searches for GIFs with a query +#[utoipa::path( + get, + path = "/search", + tag = "GIFs", + security(("User Token" = []), ("Bot Token" = [])), + params(SearchQueryParams), + responses( + (status = 200, description = "Search results", body = inline(types::PaginatedMediaResponse)) + ) +)] +pub async fn search( + _user: User, + Query(params): Query, + State(tenor): State, +) -> Result> { + tenor + .search( + ¶ms.query, + ¶ms.locale, + params.limit.unwrap_or(50), + params.is_category.unwrap_or_default(), + params.position.as_deref().unwrap_or_default(), + ) + .await + .map_err(|_| create_error!(InternalError)) + .map(|results| results.as_ref().clone().into()) + .map(Json) +} diff --git a/crates/services/gifbox/src/routes/trending.rs b/crates/services/gifbox/src/routes/trending.rs new file mode 100644 index 000000000..b81055242 --- /dev/null +++ b/crates/services/gifbox/src/routes/trending.rs @@ -0,0 +1,49 @@ +use axum::{ + extract::{Query, State}, + Json, +}; +use revolt_database::User; +use revolt_result::{create_error, Result}; +use serde::Deserialize; +use utoipa::IntoParams; + +use crate::{tenor, types}; + +#[derive(Deserialize, IntoParams)] +pub struct TrendingQueryParams { + #[param(example = "en_US")] + /// Users locale + pub locale: String, + /// Amount of results to respond with + pub limit: Option, + /// Value of `next` for getting the next page of results of featured gifs + pub position: Option, +} + +/// Trending GIFs +#[utoipa::path( + get, + path = "/featured", + tag = "GIFs", + security(("User Token" = []), ("Bot Token" = [])), + params(TrendingQueryParams), + responses( + (status = 200, description = "Trending results", body = inline(types::PaginatedMediaResponse)) + ) +)] +pub async fn trending( + _user: User, + Query(params): Query, + State(tenor): State, +) -> Result> { + tenor + .featured( + ¶ms.locale, + params.limit.unwrap_or(50), + params.position.as_deref().unwrap_or_default(), + ) + .await + .map_err(|_| create_error!(InternalError)) + .map(|results| results.as_ref().clone().into()) + .map(Json) +} diff --git a/crates/services/gifbox/src/tenor/mod.rs b/crates/services/gifbox/src/tenor/mod.rs new file mode 100644 index 000000000..a9971b17c --- /dev/null +++ b/crates/services/gifbox/src/tenor/mod.rs @@ -0,0 +1,199 @@ +//! Internal Tenor API wrapper + +use std::{sync::Arc, time::Duration}; + +use lru_time_cache::LruCache; +use reqwest::Client; +use revolt_coalesced::{CoalescionService, CoalescionServiceConfig}; +use serde::de::DeserializeOwned; +use tokio::sync::RwLock; + +pub mod types; + +const TENOR_API_BASE_URL: &str = "https://tenor.googleapis.com/v2"; + +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum TenorError { + HttpError, +} + +#[derive(Clone)] +pub struct Tenor { + pub key: Arc, + pub client: Client, + pub coalescion: CoalescionService, + pub cache: Arc>>>, + + pub categories: Arc>>>, + pub featured: Arc>>>, +} + +impl Tenor { + pub fn new(key: &str) -> Self { + Self { + key: Arc::from(key), + client: Client::new(), + coalescion: CoalescionService::from_config(CoalescionServiceConfig { + max_concurrent: Some(100), + queue_requests: true, + max_queue: None, + }), + + // 1 hour, 1k requests + cache: Arc::new(RwLock::new(LruCache::with_expiry_duration_and_capacity( + Duration::from_secs(60 * 60), + 1000, + ))), + + // 1 day, 1k requests + categories: Arc::new(RwLock::new(LruCache::with_expiry_duration_and_capacity( + Duration::from_secs(60 * 60 * 24), + 1000, + ))), + + // 1 day, 1k requests + featured: Arc::new(RwLock::new(LruCache::with_expiry_duration_and_capacity( + Duration::from_secs(60 * 60 * 24), + 1000, + ))), + } + } + + pub async fn request(&self, path: &str, query: &[Option<(&str, &str)>]) -> Result, TenorError> { + let response = self + .client + .get(format!("{TENOR_API_BASE_URL}{path}")) + .query(query) + .send() + .await + .inspect_err(|e| { + revolt_config::capture_error(e); + }) + .map_err(|_| TenorError::HttpError)?; + + let text = response.text().await.map_err(|e| { + revolt_config::capture_error(&e); + TenorError::HttpError + })?; + + Ok(Arc::new(serde_json::from_str(&text).unwrap())) + } + + pub async fn search( + &self, + query: &str, + locale: &str, + limit: u32, + is_category: bool, + position: &str, + ) -> Result, TenorError> { + let unique_key = format!("s:{query}:{locale}:{is_category}:{position}"); + + if self.cache.read().await.contains_key(&unique_key) { + if let Some(response) = self.cache.write().await.get(&unique_key) { + return Ok(response.clone()); + } + } + + let res = self.coalescion.execute(unique_key.clone(), || async move { + self.request::( + "/search", + &[ + Some(("key", &self.key)), + Some(("q", query)), + Some(("client_key", "Gifbox")), + Some(("media_filter", "webm,tinywebm")), + Some(("locale", locale)), + Some(("contentfilter", "high")), + Some(("limit", &limit.to_string())), + position.is_empty().then_some(("pos", position)), + is_category.then_some(("component", "categories")) + ] + ).await + }) + .await + .unwrap(); + + if let Ok(resp) = &*res { + self.cache.write().await.insert(unique_key, resp.clone()); + } + + (*res).clone() + } + + pub async fn categories( + &self, + locale: &str, + ) -> Result, TenorError> { + let unique_key = format!("c-{locale}"); + + if self.categories.read().await.contains_key(&unique_key) { + if let Some(response) = self.categories.write().await.get(&unique_key) { + return Ok(response.clone()); + } + } + + let res = self + .coalescion + .execute(unique_key.clone(), || async move { + self.request::( + "/categories", + &[ + Some(("key", &self.key)), + Some(("client_key", "Gifbox")), + Some(("locale", locale)), + Some(("contentfilter", "high")), + ] + ).await + }) + .await + .unwrap(); + + if let Ok(resp) = &*res { + self.categories + .write() + .await + .insert(unique_key, resp.clone()); + } + + (*res).clone() + } + + pub async fn featured( + &self, + locale: &str, + limit: u32, + position: &str, + ) -> Result, TenorError> { + let unique_key = format!("f-{locale}-{limit}-{position}"); + + if self.categories.read().await.contains_key(&unique_key) { + if let Some(response) = self.featured.write().await.get(&unique_key) { + return Ok(response.clone()); + } + } + + let res = self.coalescion.execute(unique_key.clone(), || async move { + self.request::( + "/featured", + &[ + Some(("key", &self.key)), + Some(("client_key", "Gifbox")), + Some(("media_filter", "webm,tinywebm")), + Some(("locale", locale)), + Some(("contentfilter", "high")), + Some(("limit", &limit.to_string())), + position.is_empty().then_some(("pos", position)), + ] + ).await + }) + .await + .unwrap(); + + if let Ok(resp) = &*res { + self.featured.write().await.insert(unique_key, resp.clone()); + } + + (*res).clone() + } +} diff --git a/crates/services/gifbox/src/tenor/types.rs b/crates/services/gifbox/src/tenor/types.rs new file mode 100644 index 000000000..15658252f --- /dev/null +++ b/crates/services/gifbox/src/tenor/types.rs @@ -0,0 +1,51 @@ +//! Tenor API models + +use std::collections::HashMap; + +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +pub struct PaginatedMediaResponse { + pub results: Vec, + pub next: String, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +pub struct MediaObject { + pub url: String, + pub dims: Vec, + pub duration: f64, + pub size: f64, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +pub struct MediaResponse { + pub created: f64, + #[serde(default)] + pub hasaudio: bool, + pub id: String, + pub media_formats: HashMap, + pub tags: Vec, + pub title: String, + pub content_description: String, + pub itemurl: String, + #[serde(default)] + pub hascaption: bool, + pub flags: Vec, + pub bg_color: Option, + pub url: String, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +pub struct CategoriesResponse { + pub locale: String, + pub tags: Vec, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +pub struct CategoryResponse { + pub searchterm: String, + pub path: String, + pub image: String, + pub name: String, +} diff --git a/crates/services/gifbox/src/types.rs b/crates/services/gifbox/src/types.rs new file mode 100644 index 000000000..1ee07e8a4 --- /dev/null +++ b/crates/services/gifbox/src/types.rs @@ -0,0 +1,101 @@ +use std::collections::HashMap; + +use serde::{Deserialize, Serialize}; +use utoipa::ToSchema; + +use crate::tenor::types; + +/// Successful root response +#[derive(Serialize, Debug, ToSchema)] +pub struct RootResponse<'a> { + pub message: &'a str, + pub version: &'a str, +} + +/// Response containing the current results and the id of the next result for pagination. +#[derive(Serialize, Deserialize, ToSchema, Clone, Debug, PartialEq)] +pub struct PaginatedMediaResponse { + /// Current gif results. + pub results: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + /// Id of the next result. + pub next: Option, +} + +/// Indivual gif result. +#[derive(Serialize, Deserialize, ToSchema, Clone, Debug, PartialEq)] +pub struct MediaResult { + /// Unique Tenor id. + pub id: String, + /// Mapping of each file format and url of the file. + pub media_formats: HashMap, + /// Public Tenor web url for the gif. + pub url: String, +} + +/// Represents the gif in a certain file format. +#[derive(Serialize, Deserialize, ToSchema, Clone, Debug, PartialEq)] +pub struct MediaObject { + /// File url of the gif in a certain format. + pub url: String, + /// Width and height of the file in px. + pub dimensions: Vec, +} + +/// Represents a GIF category +#[derive(Serialize, Deserialize, ToSchema, Clone, Debug, PartialEq)] +pub struct CategoryResponse { + /// Category title + pub title: String, + /// Category image + pub image: String, +} + +impl From for PaginatedMediaResponse { + fn from(value: types::PaginatedMediaResponse) -> Self { + Self { + results: value + .results + .into_iter() + .map(|result| result.into()) + .collect(), + next: if value.next.is_empty() { + None + } else { + Some(value.next) + }, + } + } +} + +impl From for MediaResult { + fn from(value: types::MediaResponse) -> Self { + Self { + id: value.id, + media_formats: value + .media_formats + .into_iter() + .map(|(k, v)| (k, v.into())) + .collect(), + url: value.url, + } + } +} + +impl From for MediaObject { + fn from(value: types::MediaObject) -> Self { + Self { + url: value.url, + dimensions: value.dims, + } + } +} + +impl From for CategoryResponse { + fn from(value: types::CategoryResponse) -> Self { + Self { + title: value.searchterm, + image: value.image, + } + } +} diff --git a/crates/services/january/Cargo.toml b/crates/services/january/Cargo.toml index 80b5e5228..f72f6572d 100644 --- a/crates/services/january/Cargo.toml +++ b/crates/services/january/Cargo.toml @@ -1,49 +1,49 @@ [package] name = "revolt-january" -version = "0.8.8" +version = "0.13.7" edition = "2021" license = "AGPL-3.0-or-later" +publish = false [dependencies] # Utility -mime = "0.3.17" -regex = "1.11.0" -tempfile = "3.13.0" -lazy_static = "1.5.0" -moka = { version = "0.12.8", features = ["future"] } +mime = { workspace = true } +regex = { workspace = true } +tempfile = { workspace = true } +lazy_static = { workspace = true } +moka = { workspace = true, features = ["future"] } # Web scraping -scraper = "0.20.0" -encoding_rs = "0.8.34" +scraper = { workspace = true } +encoding_rs = { workspace = true } # Serialisation -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.68" +serde = { workspace = true } +serde_json = { workspace = true } # Async runtime -async-recursion = "1.1.1" -tokio = { version = "1.0", features = ["full"] } +async-recursion = { workspace = true } +tokio = { workspace = true, features = [] } # Web requests -reqwest = { version = "0.12", features = ["json"] } +reqwest = { workspace = true, features = ["json"] } +pdk-ip-filter-lib = "1.8.0" +url = { workspace = true } # Logging -tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } +tracing = { workspace = true } +tracing-subscriber = { workspace = true, features = ["env-filter"] } # Core crates -revolt-config = { version = "0.8.8", path = "../../core/config" } -revolt-models = { version = "0.8.8", path = "../../core/models" } -revolt-result = { version = "0.8.8", path = "../../core/result", features = [ - "utoipa", - "axum", -] } -revolt-files = { version = "0.8.8", path = "../../core/files" } +revolt-config = { workspace = true } +revolt-models = { workspace = true } +revolt-result = { workspace = true, features = ["utoipa", "axum"] } +revolt-files = { workspace = true } # Axum / web server -axum = { version = "0.7.5" } -axum-extra = { version = "0.9", features = ["typed-header"] } +axum = { workspace = true } +axum-extra = { workspace = true, features = ["typed-header"] } # OpenAPI & documentation generation -utoipa-scalar = { version = "0.1.0", features = ["axum"] } -utoipa = { version = "4.2.3", features = ["axum_extras", "ulid"] } +utoipa-scalar = { workspace = true, features = ["axum"] } +utoipa = { workspace = true, features = ["axum_extras", "ulid"] } diff --git a/crates/services/january/Dockerfile b/crates/services/january/Dockerfile index 0848291a9..35d812ea9 100644 --- a/crates/services/january/Dockerfile +++ b/crates/services/january/Dockerfile @@ -1,12 +1,12 @@ # Build Stage -FROM ghcr.io/revoltchat/base:latest AS builder +FROM ghcr.io/stoatchat/base:latest AS builder FROM debian:12 AS debian # Bundle Stage FROM gcr.io/distroless/cc-debian12:nonroot COPY --from=builder /home/rust/src/target/release/revolt-january ./ -COPY --from=mwader/static-ffmpeg:7.0.2 /ffmpeg /usr/local/bin/ -COPY --from=mwader/static-ffmpeg:7.0.2 /ffprobe /usr/local/bin/ +COPY --from=mwader/static-ffmpeg:7.1.1 /ffmpeg /usr/local/bin/ +COPY --from=mwader/static-ffmpeg:7.1.1 /ffprobe /usr/local/bin/ COPY --from=debian /usr/bin/uname /usr/bin/uname EXPOSE 14705 diff --git a/crates/services/january/src/main.rs b/crates/services/january/src/main.rs index b905b87d8..e203ce286 100644 --- a/crates/services/january/src/main.rs +++ b/crates/services/january/src/main.rs @@ -21,32 +21,26 @@ async fn main() -> Result<(), std::io::Error> { // Configure API schema #[derive(OpenApi)] #[openapi( - modifiers(&SecurityAddon), - paths( - api::root, - api::proxy, - api::embed - ), - components( - schemas( - api::RootResponse, - revolt_result::Error, - revolt_result::ErrorType, - revolt_models::v0::ImageSize, - revolt_models::v0::Image, - revolt_models::v0::Video, - revolt_models::v0::TwitchType, - revolt_models::v0::LightspeedType, - revolt_models::v0::BandcampType, - revolt_models::v0::Special, - revolt_models::v0::WebsiteMetadata, - revolt_models::v0::Text, - revolt_models::v0::Embed - ) - ) + paths(api::root, api::proxy, api::embed), + components(schemas( + api::RootResponse, + revolt_result::Error, + revolt_result::ErrorType, + revolt_models::v0::ImageSize, + revolt_models::v0::Image, + revolt_models::v0::Video, + revolt_models::v0::TwitchType, + revolt_models::v0::LightspeedType, + revolt_models::v0::BandcampType, + revolt_models::v0::Special, + revolt_models::v0::WebsiteMetadata, + revolt_models::v0::Text, + revolt_models::v0::Embed + )) )] struct ApiDoc; + #[allow(dead_code)] struct SecurityAddon; impl Modify for SecurityAddon { diff --git a/crates/services/january/src/requests.rs b/crates/services/january/src/requests.rs index cf681171a..c818619b7 100644 --- a/crates/services/january/src/requests.rs +++ b/crates/services/january/src/requests.rs @@ -1,42 +1,43 @@ use encoding_rs::{Encoding, UTF_8_INIT}; use lazy_static::lazy_static; use mime::Mime; +use pdk_ip_filter_lib::IpFilter; use regex::Regex; use reqwest::{ + dns::{Addrs, Name, Resolve}, header::{self, CONTENT_TYPE}, redirect, Client, Response, }; -use revolt_config::report_internal_error; +use revolt_config::{config, report_internal_error}; use revolt_files::{create_thumbnail, decode_image, image_size_vec, is_valid_image, video_size}; use revolt_models::v0::{Embed, Image, ImageSize, Video}; -use revolt_result::{create_error, Error, Result}; +use revolt_result::{create_error, Error, Result, ToRevoltError}; +use std::net::{IpAddr, SocketAddr}; use std::{ io::{Cursor, Write}, + str::FromStr, time::Duration, }; +use url::{Host, Url}; lazy_static! { /// Request client static ref CLIENT: Client = reqwest::Client::builder() + .dns_resolver(CachedDnsResolver {}) .timeout(Duration::from_secs(10)) // TODO config .connect_timeout(Duration::from_secs(5)) // TODO config - .redirect(redirect::Policy::custom(|attempt| { - if attempt.previous().len() > 5 { // TODO config - attempt.error("too many redirects") - } else if attempt.url().host_str() == Some("jan.revolt.chat") { // TODO config - attempt.stop() - } else { - attempt.follow() - } - })) + .redirect(redirect::Policy::none()) .build() .expect("reqwest Client"); /// Spoof User Agent as Discord - static ref RE_USER_AGENT_SPOOFING_AS_DISCORD: Regex = Regex::new("^(?:(?:https?:)?//)?(?:(?:vx|fx)?twitter|(?:fixv|fixup)?x|(?:old\\.|new\\.|www\\.)reddit).com").expect("valid regex"); + static ref RE_USER_AGENT_SPOOFING_AS_DISCORD: Regex = Regex::new("^(?:(?:vx|fx)?twitter|(?:fixv|fixup)?x|(?:old\\.|new\\.|www\\.)reddit).com").expect("valid regex"); /// Regex for matching new Reddit URLs - static ref RE_URL_NEW_REDDIT: Regex = Regex::new("^(?:(?:https?:)?//)?(?:(?:new\\.|www\\.)?reddit).com").expect("valid regex"); + static ref RE_URL_NEW_REDDIT: Regex = Regex::new("^(?:(?:new\\.|www\\.)?reddit).com").expect("valid regex"); + + /// Regex for matching YouTube Shorts URLs + static ref RE_URL_YOUTUBE_SHORTS: Regex = Regex::new("^(?:(?:https?:)?//)?(?:(?:www\\.)?youtube\\.com)/shorts/([a-zA-Z0-9_-]+)").expect("valid regex"); /// Cache for proxy results static ref PROXY_CACHE: moka::future::Cache)>> = moka::future::Cache::builder() @@ -59,6 +60,72 @@ lazy_static! { .max_capacity(10_000) // Cache up to 10k embeds .time_to_live(Duration::from_secs(60)) // For up to 1 minute .build(); + + static ref DNS_CACHE: moka::future::Cache> = moka::future::Cache::builder() + .max_capacity(10_000) + .time_to_idle(Duration::from_secs(30)) + .build(); + + static ref IP_BLOCKLIST: IpFilter = IpFilter::block(&[ + "0.0.0.0/8", + "10.0.0.0/8", + "192.168.0.0/16", + "127.0.0.0/8", + "172.16.0.0/12", + "169.254.0.0/16", + "::1", + "fc00::/7", + ] + ).unwrap(); +} + +#[derive(Clone)] +pub struct IPRequest { + url: Url, + ip: IpAddr, + pub blocked: bool, +} + +impl From for Url { + fn from(value: IPRequest) -> Self { + let mut url = value.url.clone(); + url.set_host(Some(&value.ip.to_string())) + .map(|_| url) + .unwrap_or(value.url) + } +} + +struct CachedDnsResolver {} + +impl reqwest::dns::Resolve for CachedDnsResolver { + fn resolve(&self, name: Name) -> reqwest::dns::Resolving { + Box::pin(async move { + { + if let Some(addrs) = DNS_CACHE.get(&name.as_str().to_string()).await { + let resp: Addrs = Box::new(addrs.clone().into_iter()); + return Ok(resp); + } + } + + let mut lookup = name.as_str().to_string(); + if !lookup.contains(":") { + lookup += ":0"; + } + + let fallback: Vec = tokio::net::lookup_host(&lookup) + .await + .map_err(|e| -> Box { Box::new(e) })? + .collect(); + + { + DNS_CACHE + .insert(name.as_str().to_string().clone(), fallback.clone()) + .await; + let addrs: Addrs = Box::new(fallback.clone().into_iter()); + Ok(addrs) + } + }) + } } /// Information about a successful request @@ -73,7 +140,7 @@ impl Request { if let Some(hit) = PROXY_CACHE.get(url).await { hit } else { - let Request { response, mime } = Request::new(url).await?; + let Request { response, mime } = Request::new_from_str(url).await?; if matches!(mime.type_(), mime::IMAGE | mime::VIDEO) { let bytes = report_internal_error!(response.bytes().await); @@ -135,7 +202,7 @@ impl Request { let request = if let Some(request) = request { request } else { - let request = Request::new(url).await?; + let request = Request::new_from_str(url).await?; if matches!(request.mime.type_(), mime::IMAGE) { request } else { @@ -173,7 +240,7 @@ impl Request { let response = if let Some(Request { response, .. }) = request { response } else { - let Request { response, mime } = Request::new(url).await?; + let Request { response, mime } = Request::new_from_str(url).await?; if matches!(mime.type_(), mime::VIDEO) { response } else { @@ -208,11 +275,18 @@ impl Request { .to_string(); } + // Re-map Youtube Shorts to regular Youtube links + if let Some(captures) = RE_URL_YOUTUBE_SHORTS.captures(&url) { + if let Some(video_id) = captures.get(1) { + url = format!("https://youtube.com/watch?v={}", video_id.as_str()); + } + } + // Generate the actual embed if let Some(hit) = EMBED_CACHE.get(&url).await { Ok(hit) } else { - let request = Request::new(&url).await?; + let request = Request::new_from_str(&url).await?; let embed = match (request.mime.type_(), request.mime.subtype()) { (_, mime::HTML) => { let content_type = request @@ -255,15 +329,27 @@ impl Request { } /// Send a new request to a service - pub async fn new(url: &str) -> Result { - let response = CLIENT + pub async fn new(url: Url) -> Result { + let mut url = url; + let url_host_str = url.host_str().ok_or(create_error!(ProxyError))?.to_string(); + + let mut blocker = Request::url_is_blacklisted(&url).await?; + + if blocker.blocked { + return Err(create_error!(InvalidOperation)); + } + + let mut redirect_count = 0; + + loop { + let response = CLIENT .get(url) .header( "User-Agent", - if RE_USER_AGENT_SPOOFING_AS_DISCORD.is_match(url) { + if RE_USER_AGENT_SPOOFING_AS_DISCORD.is_match(&url_host_str) { "Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com)" } else { - "Mozilla/5.0 (compatible; January/2.0; +https://github.com/revoltchat/backend)" + "Mozilla/5.0 (compatible; January/2.0; +https://github.com/stoatchat/stoatchat)" }, ) .header("Accept-Language", "en-US,en;q=0.5") @@ -271,31 +357,130 @@ impl Request { .await .map_err(|_| create_error!(ProxyError))?; - if !response.status().is_success() { - tracing::error!("{:?}", response); - return Err(create_error!(ProxyError)); - } + if response.status().is_redirection() { + redirect_count += 1; - let content_type = response - .headers() - .get(CONTENT_TYPE) - .ok_or(create_error!(ProxyError))? - .to_str() - .map_err(|_| create_error!(ProxyError))?; + if redirect_count > 5 { + return Err(create_error!(ProxyError)); + } + if let Some(location) = response.headers().get("location") { + let location = location.to_str().map_err(|_| create_error!(ProxyError))?; + url = Url::from_str(location).to_internal_error()?; - let mime: mime::Mime = content_type - .parse() - .map_err(|_| create_error!(ProxyError))?; + blocker = Request::url_is_blacklisted(&url).await?; - Ok(Request { response, mime }) + if blocker.blocked { + return Err(create_error!(InvalidOperation)); + } + + continue; + } else { + return Err(create_error!(ProxyError)); + } + } + + if !response.status().is_success() { + tracing::error!("{:?}", response); + return Err(create_error!(ProxyError)); + } + + let content_type = response + .headers() + .get(CONTENT_TYPE) + .ok_or(create_error!(ProxyError))? + .to_str() + .map_err(|_| create_error!(ProxyError))?; + + let mime: mime::Mime = content_type + .parse() + .map_err(|_| create_error!(ProxyError))?; + + return Ok(Request { response, mime }); + } + } + + pub async fn new_from_str(url: &str) -> Result { + let proper_url = Url::parse(url).map_err(|_| create_error!(ProxyError))?; + Request::new(proper_url).await } /// Check if something exists - pub async fn exists(url: &str) -> bool { + pub async fn exists(url: Url) -> bool { if let Ok(response) = CLIENT.head(url).send().await { response.status().is_success() } else { false } } + + pub async fn exists_from_str(url: &str) -> Result { + let proper_url = Url::parse(url).map_err(|_| create_error!(ProxyError))?; + Ok(Request::exists(proper_url).await) + } + + pub async fn url_is_blacklisted(url: &Url) -> Result { + let resolved_address: IpAddr; + + if let Some(host) = url.host() { + match host { + Host::Ipv4(ipv4) => { + resolved_address = ipv4.into(); + if !IP_BLOCKLIST.is_allowed(&ipv4.to_string()) { + return Err(create_error!(InvalidOperation)); + } + } + Host::Ipv6(ipv6) => { + resolved_address = ipv6.into(); + if !IP_BLOCKLIST.is_allowed(&ipv6.to_string()) { + return Err(create_error!(InvalidOperation)); + } + } + Host::Domain(domain) => { + let domain = domain.to_string(); + + let config = config().await; + + // First step: TLDs and blocked domains + if !domain.contains(".") // lazily block TLDs + || config.january.blocked_domains.iter().any(|x| x == &domain) + { + return Err(create_error!(InvalidOperation)); + } + + // Second step: resolve the IP and check the blocklist + let resolver = CachedDnsResolver {}; + if let Ok(mut resolved_ip) = resolver + .resolve( + Name::from_str(&domain) + .map_err(|_| create_error!(ProxyError)) + .unwrap(), + ) + .await + { + if let Some(resolved_ip) = resolved_ip.next() { + resolved_address = resolved_ip.ip(); + let resolved_string = resolved_address.to_string(); + if !IP_BLOCKLIST.is_allowed(&resolved_string) + || resolved_string.contains("::ffff:") + { + return Err(create_error!(InvalidOperation)); + } + } else { + return Err(create_error!(InvalidOperation)); + } + } else { + return Err(create_error!(ProxyError)); + } + } + } + } else { + return Err(create_error!(ProxyError)); + }; + + Ok(IPRequest { + url: url.clone(), + ip: resolved_address, + blocked: false, + }) + } } diff --git a/crates/services/january/src/website_embed.rs b/crates/services/january/src/website_embed.rs index 49ac2846e..0e025b73b 100644 --- a/crates/services/january/src/website_embed.rs +++ b/crates/services/january/src/website_embed.rs @@ -190,7 +190,7 @@ pub async fn create_website_embed(original_url: &str, document: &str) -> Option< pub async fn populate_special(original_url: String, metadata: &mut WebsiteMetadata) { lazy_static! { - static ref RE_YOUTUBE: Regex = Regex::new("^(?:(?:https?:)?//)?(?:(?:www|m)\\.)?(?:(?:youtube\\.com|youtu.be))(?:/(?:[\\w\\-]+\\?v=|embed/|v/)?)([\\w\\-]+)(?:\\S+)?$").unwrap(); + static ref RE_YOUTUBE: Regex = Regex::new("^(?:(?:https?:)?//)?(?:(?:www|m)\\.)?(?:(?:youtube\\.com|youtu.be))(?:/(?:[\\w\\-]+\\?v=|embed/|v/|shorts/)?)([\\w\\-]+)(?:\\S+)?$").unwrap(); static ref RE_LIGHTSPEED: Regex = Regex::new("^(?:https?://)?(?:[\\w]+\\.)?lightspeed\\.tv/([a-z0-9_]{4,25})").unwrap(); @@ -236,11 +236,12 @@ pub async fn populate_special(original_url: String, metadata: &mut WebsiteMetada metadata.site_name.take(); // Verify the video exists - if !crate::requests::Request::exists(&format!( + if !crate::requests::Request::exists_from_str(&format!( "http://img.youtube.com/vi/{}/sddefault.jpg", id )) .await + .unwrap_or(false) { return; } @@ -312,7 +313,7 @@ pub async fn populate_special(original_url: String, metadata: &mut WebsiteMetada Some(Special::GIF) } else { RE_APPLE_MUSIC - .captures_iter(url) + .captures_iter(&original_url) .next() .map(|captures| Special::AppleMusic { album_id: captures[1].to_string(), diff --git a/default.nix b/default.nix index dad66fc2e..68fb5384b 100644 --- a/default.nix +++ b/default.nix @@ -1,27 +1,41 @@ -{ - pkgs ? import { }, +{ pkgs ? import (fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/77ef7a29d276c6d8303aece3444d61118ef71ac2.tar.gz"; + sha256 = "0pm4l48jq8plzrrrisimahxqlcpx7qqq9c99hylmf7p3zlc3phsy"; + }) {}, }: -pkgs.mkShell rec { - buildInputs = [ - # Tools - pkgs.git - pkgs.just +let + nix-ld-libs = pkgs.buildEnv { + name = "nix-ld-libs"; + paths = with pkgs; [ + stdenv.cc.cc.lib + zlib + openssl.out + ]; + pathsToLink = [ "/lib" ]; + }; - # Cargo - pkgs.cargo - pkgs.cargo-nextest - - # Rust - pkgs.rustc - pkgs.clippy - pkgs.rustfmt - pkgs.pkg-config - pkgs.openssl.dev +in pkgs.mkShell { + packages = with pkgs; [ + mise + cargo-binstall + (writeShellScriptBin "fish" '' + exec ${pkgs.fish}/bin/fish -C 'mise activate fish | source' "$@" + '') + ]; - # mdbook - pkgs.mdbook + buildInputs = with pkgs; [ + pkg-config + openssl.dev ]; - RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; -} + shellHook = '' + export TMPDIR=/tmp + export NIX_LD="${pkgs.stdenv.cc.libc}/lib/ld-linux-x86-64.so.2" + export NIX_LD_LIBRARY_PATH="${nix-ld-libs}/lib" + export LD_LIBRARY_PATH="${nix-ld-libs}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" + + export MISE_NODE_COMPILE=false + eval "$(mise activate bash)" + ''; +} \ No newline at end of file diff --git a/doc/.gitignore b/doc/.gitignore deleted file mode 100644 index 7585238ef..000000000 --- a/doc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -book diff --git a/doc/book.toml b/doc/book.toml deleted file mode 100644 index 5ef489b50..000000000 --- a/doc/book.toml +++ /dev/null @@ -1,6 +0,0 @@ -[book] -authors = [] -language = "en" -multilingual = false -src = "src" -title = "Revolt Backend" diff --git a/doc/src/SUMMARY.md b/doc/src/SUMMARY.md deleted file mode 100644 index e772ccd7b..000000000 --- a/doc/src/SUMMARY.md +++ /dev/null @@ -1,8 +0,0 @@ -# Summary - -- [Introduction](./hello.md) -- [Project Structure]() -- [Creating new API features](./new_features.md) -- [Testing]() - - [Writing a new database test]() - - [Writing a new API test]() diff --git a/doc/src/hello.md b/doc/src/hello.md deleted file mode 100644 index f8182679a..000000000 --- a/doc/src/hello.md +++ /dev/null @@ -1,5 +0,0 @@ -# Revolt Backend - -Welcome to the developer documentation for the Revolt backend. - -This is very much incomplete and needs more work! diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..b2d6de306 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..a31d8713e --- /dev/null +++ b/docs/README.md @@ -0,0 +1,41 @@ +# Website + +This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. + +## Installation + +```bash +pnpm install +``` + +## Local Development + +```bash +pnpm start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +## Build + +```bash +pnpm build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +## Deployment + +Using SSH: + +```bash +USE_SSH=true pnpm run deploy +``` + +Not using SSH: + +```bash +GIT_USER= pnpm run deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/docs/default.nix b/docs/default.nix new file mode 100644 index 000000000..f7b9b2fd5 --- /dev/null +++ b/docs/default.nix @@ -0,0 +1,11 @@ +{ + pkgs ? import { }, +}: + +with pkgs; +pkgs.mkShell { + buildInputs = [ + nodejs + nodejs.pkgs.pnpm + ]; +} diff --git a/docs/docs/developers/api/_category_.json b/docs/docs/developers/api/_category_.json new file mode 100644 index 000000000..ec96f5535 --- /dev/null +++ b/docs/docs/developers/api/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "API", + "position": 2, + "link": { + "type": "generated-index", + "description": "Connecting and consuming the Stoat API" + }, + "collapsed": false, + "collapsible": true +} \ No newline at end of file diff --git a/docs/docs/developers/api/authentication.md b/docs/docs/developers/api/authentication.md new file mode 100644 index 000000000..6586d06be --- /dev/null +++ b/docs/docs/developers/api/authentication.md @@ -0,0 +1,15 @@ +# Authentication + +To authenticate with the API, you must first acquire a bot token or user token: + +- **Bot:** create one from user settings in the client +- **User:** copy one from client or authenticate through API + +Then you may provide these through either: + +| Type | Header | +| :---: | :---------------: | +| Bot | `X-Bot-Token` | +| User | `X-Session-Token` | + +When dealing with an authenticated route. diff --git a/docs/docs/developers/api/permission_hierarchy.svg b/docs/docs/developers/api/permission_hierarchy.svg new file mode 100644 index 000000000..9bad3366c --- /dev/null +++ b/docs/docs/developers/api/permission_hierarchy.svg @@ -0,0 +1 @@ +
Fetch Server
Fetch Server
Determine Server Permissions
Apply allows from
default_permission
Apply allows from...
§
Member has un-applied role?
§...
Yes
Yes
No
No
Resolve role from
server object
Resolve role from...
Apply allows from
role_permission 
Apply allows from...
Apply denies from
role_permission
Apply denies from...
Determine Channel Permissions
Fetch Channel
Fetch Channel
Channel
Type
Channel...
(Text | Voice) Channel
(Text | Voice) Channel
Apply maximum
allows
Apply maximum...
Apply (#1).
Apply (#1).
Is user group owner?
Is user group ow...
No
No
Apply maximum
allows
Apply maximum...
Apply allows from
c.permissions
Apply allows from...
Determine Server Permissions 
Determine Server Per...
Apply allows
and denies.
Apply allows...
Apply allows from
permissions 
Apply allows from...
Apply denies from
permissions
Apply denies from...
†: order here does not matter.
†: order here does no...
§
Member has un-applied role?
§...
¶: assume we fetch server / member obj
¶: assume we fetch s...
Yes
Yes
Role has
overrides
Role has...
Yes
Yes
Apply allows from role_permissions 
Apply allows from ro...
Apply denies from role_permissions
Apply denies from ro...
No
No
No
No
Has default permissions?
Has default permis...
No
No
Yes
Yes
§: assume roles are sorted 
§: assume roles are...
Fetch Member
Fetch Member
Is the user
server owner?
Is the user...
Apply maximum
allows
Apply maximum...
Yes
Yes
No
No
#1: view channel, view history, send, manage, voice, embed, invite, upload
#1: view channel, view history, send,...
#2: view, history, send, voice, embed, invite, upload, change nick, change pfp
#2: view, history, send, voice, embed, i...
Saved Messages
Saved Messages
Direct Message
Direct Message
Yes
Yes
Has specified permissions?
Has specified pe...
Group
Group
Yes
Yes
Apply (#1).
Apply (#1).
No
No
‡: the permission set #2 is the default value
‡: the permission set...
Has send
perm?
Has send...
Determine User Permissions
Determine User Permi...
Yes
Yes
No
No
#3: view, history
#3: view, history
Apply (#3).
Apply (#3).
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/docs/docs/developers/api/permissions.mdx b/docs/docs/developers/api/permissions.mdx new file mode 100644 index 000000000..a40a5763a --- /dev/null +++ b/docs/docs/developers/api/permissions.mdx @@ -0,0 +1,49 @@ +# Permissions + +Stoat's permission system works by sequentially applying allows then denies. + +## Flow Chart + +Below are the high-level steps taken to determine both server and channel permissions (click to view). + + + + + +If you are looking to implement permissions in a library, I highly recommend reading either the Stoat JavaScript SDK or the backend source code since all the routines are well commented and should be relatively easy to understand. + +## Values + +The following permissions are currently allocated: + +| Name | Value | Bitwise | Description | +| --------------------- | :-----------: | :-------: | ------------------------------------------------------- | +| `ManageChannel` | `1` | `1 << 0` | Manage the channel or channels on the server | +| `ManageServer` | `2` | `1 << 1` | Manage the server | +| `ManagePermissions` | `4` | `1 << 2` | Manage permissions on servers or channels | +| `ManageRole` | `8` | `1 << 3` | Manage roles on server | +| `ManageCustomisation` | `16` | `1 << 4` | Manage emoji on servers | +| `KickMembers` | `64` | `1 << 6` | Kick other members below their ranking | +| `BanMembers` | `128` | `1 << 7` | Ban other members below their ranking | +| `TimeoutMembers` | `256` | `1 << 8` | Timeout other members below their ranking | +| `AssignRoles` | `512` | `1 << 9` | Assign roles to members below their ranking | +| `ChangeNickname` | `1024` | `1 << 10` | Change own nickname | +| `ManageNicknames` | `2048` | `1 << 11` | Change or remove other's nicknames below their ranking | +| `ChangeAvatar` | `4096` | `1 << 12` | Change own avatar | +| `RemoveAvatars` | `8192` | `1 << 13` | Remove other's avatars below their ranking | +| `ViewChannel` | `1048576` | `1 << 20` | View a channel | +| `ReadMessageHistory` | `2097152` | `1 << 21` | Read a channel's past message history | +| `SendMessage` | `4194304` | `1 << 22` | Send a message in a channel | +| `ManageMessages` | `8388608` | `1 << 23` | Delete messages in a channel | +| `ManageWebhooks` | `16777216` | `1 << 24` | Manage webhook entries on a channel | +| `InviteOthers` | `33554432` | `1 << 25` | Create invites to this channel | +| `SendEmbeds` | `67108864` | `1 << 26` | Send embedded content in this channel | +| `UploadFiles` | `134217728` | `1 << 27` | Send attachments and media in this channel | +| `Masquerade` | `268435456` | `1 << 28` | Masquerade messages using custom nickname and avatar | +| `React` | `536870912` | `1 << 29` | React to messages with emojis | +| `Connect` | `1073741824` | `1 << 30` | Connect to a voice channel | +| `Speak` | `2147483648` | `1 << 31` | Speak in a voice call | +| `Video` | `4294967296` | `1 << 32` | Share video in a voice call | +| `MuteMembers` | `8589934592` | `1 << 33` | Mute other members with lower ranking in a voice call | +| `DeafenMembers` | `17179869184` | `1 << 34` | Deafen other members with lower ranking in a voice call | +| `MoveMembers` | `34359738368` | `1 << 35` | Move members between voice channels | diff --git a/docs/docs/developers/api/ratelimits.md b/docs/docs/developers/api/ratelimits.md new file mode 100644 index 000000000..b939015b8 --- /dev/null +++ b/docs/docs/developers/api/ratelimits.md @@ -0,0 +1,49 @@ +# Rate Limits + +Stoat uses a fixed-window ratelimiting algorithm: + +- You are given a set amount of calls per each named bucket. +- Any calls past this limit will result in 429 errors. +- Buckets are replenished after 10 seconds from initial request. + +## Buckets + +There are distinct buckets that you may be calling against, none of these affect each other and can be used up independently of one another. + +| Method | Path | Limit | +| -------: | --------------------------- | :---: | +| | `/users` | 20 | +| `PATCH` | `/users/:id` | 2 | +| | `/users/:id/default_avatar` | 255 | +| | `/bots` | 10 | +| | `/channels` | 15 | +| `POST` | `/channels/:id/messages` | 10 | +| | `/servers` | 5 | +| | `/auth` | 3 | +| `DELETE` | `/auth` | 255 | +| | `/safety` | 15 | +| | `/safety/report` | 3 | +| | `/swagger` | 100 | +| | `/*` | 20 | + +## Headers + +There are multiple headers you can use to figure out when you can and cannot send requests, and to determine when you can next send a request. + +| Header | Type | Description | +| ------------------------- | :------: | ------------------------------------------------ | +| `X-RateLimit-Limit` | `number` | Maximum number of calls allowed for this bucket. | +| `X-RateLimit-Bucket` | `string` | Unique identifier for this bucket. | +| `X-RateLimit-Remaining` | `number` | Remaining number of calls left for this bucket. | +| `X-RateLimit-Reset-After` | `number` | Milliseconds left until calls are replenished. | + +## Rate Limited Response + +When you receive `429 Too Many Requests`, you will also receive a JSON body with the schema: + +```typescript +interface Response { + // Milliseconds until calls are replenished + retry_after: number; +} +``` diff --git a/docs/docs/developers/api/uploading-files.md b/docs/docs/developers/api/uploading-files.md new file mode 100644 index 000000000..2ee1a1ee4 --- /dev/null +++ b/docs/docs/developers/api/uploading-files.md @@ -0,0 +1,47 @@ +# Uploading Files + +File uploads work by first sending a file to the server and then using the ID provided. + +You can find out what kinds of files you can upload by visiting [the API documentation](https://cdn.stoatusercontent.com/scalar). + +To upload a file, pick the desired tag then send a **POST** to `{endpoint}/{tag}` along with a `multipart/form-data` body with one field `file` that contains the file you wish to upload. + +You must specify session/bot authentication token as with any other API route. + +You will receive the following JSON response: + +```json +{ + "id": "0" +} +``` + +You can use the ID wherever a file is required in the API. + +Code sample in JavaScript using Fetch API: + +```js +const body = new FormData(); +body.append("file", file); + +const data = await fetch(`${endpoint}/${tag}`, { + method: "POST", + body, + headers: { + "X-Session-Token": "...", // or X-Bot-Token + }, +}).then((res) => res.json()); + +// use data.id +``` + +## Differences from old Autumn + +If you are migrating from old Autumn, the following key points are important: + +- There are only two paths that serve a unique image, the preview version of it (if available) and the original image. +- You should not specify any query parameters under any circumstance, the preview route will serve the optimal size for the content type. +- Preview routes for banners, emojis, backgrounds, and attachments will redirect to the original file where the file is not an image or the image is animated. +- If you are currently using logic to replace the URL path to start/stop animations, you should use the following templates: (NB. this only applies to avatars and icons) + - Non-animated file: `/{tag}/{file_id}` + - Animated file: `/{tag}/{file_id}/{file_name}` or `/{tag}/{file_id}/original` (if name unavailable) diff --git a/docs/docs/developers/endpoints.md b/docs/docs/developers/endpoints.md new file mode 100644 index 000000000..99a7d6f44 --- /dev/null +++ b/docs/docs/developers/endpoints.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 1 +--- + +# Endpoints + +[![Run in Yaak](https://external.stoatusercontent.com/proxy?url=https://yaak.app/static/button.svg)](https://yaak.app/button/run?name=Stoat+API&url=https%3A%2F%2Fstoat.chat%2Fapi%2Fopenapi.json) + +**We are moving stuff around currently following the rebrand, guidance will follow soon!** + +You can connect to the API on the following URLs: + +| URL | Release | Description | +| ----------------------------- | :--------: | ---------------------------------- | +| `https://api.stoat.chat` | Production | Primary API endpoint | + +You can connect to the events server on the following URLs: + +| URL | Release | Description | +| ------------------------------ | :--------: | ------------------------------------- | +| `wss://events.stoat.chat` | Production | Primary events endpoint | diff --git a/docs/docs/developers/events/_category_.json b/docs/docs/developers/events/_category_.json new file mode 100644 index 000000000..d5a249fad --- /dev/null +++ b/docs/docs/developers/events/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Events", + "position": 2, + "link": { + "type": "generated-index", + "description": "Connecting and using the Stoat gateway" + }, + "collapsed": false, + "collapsible": true +} \ No newline at end of file diff --git a/docs/docs/developers/events/establishing.md b/docs/docs/developers/events/establishing.md new file mode 100644 index 000000000..92d397632 --- /dev/null +++ b/docs/docs/developers/events/establishing.md @@ -0,0 +1,57 @@ +# Establishing a connection + +To get started, you should have: + +- A WebSocket URL, which is found from the API root. +- A valid session or bot token. + +You may authenticate in one of two ways: + +- Include credentials in the connection URL, see [Query Parameters](#query-parameters). +- Sending an [Authenticate](./protocol.md#authenticate) event to the server. + +You should listen out for [Error](./protocol.md#error) events to find out if your credentials are incorrect or if something goes wrong here. + +After authenticating, the server will respond with [Authenticated](./protocol.md#authenticated) then it will send a [Ready](./protocol.md#ready) event containing useful data. + +The server will now start sending relevant events as they come in. + +You should [Ping](./protocol.md#ping) the server every 10 to 30 seconds to prevent your connection being dropped. + +Bots receive all events, normal users do not receive UserUpdate events fanned out through servers by default, [read more here](./protocol.md#subscribe). + +## Query Parameters + +The Bonfire service supports additional query parameters: + +| Parameter | Description | Values | Required | +| --------- | ----------------------------------------------------------------------- | -------------------------- | -------- | +| `version` | Describes the protocol version in use. | `1` | No † | +| `format` | In what format to send packets, default is JSON. | `json`, `msgpack` | No | +| `token` | token for authenticating the connecting user. | Session or bot token | No | +| `ready` | Fields to include in the `Ready` event payload, by default all are sent | [See Below](#ready-fields) | No | + +† `version` may become compulsary in the future, please set it to `1` if you can. + +### Ready Fields + +The ready query parameter can be passed multiple times to specify multiple fields, supported fields are: + +| Value | Description | +| ----------------- | --------------------------------------------------------------------------------------------------------------- | +| `users` | Includes all users you have a relation with. | +| `servers` | Includes all servers you are in. | +| `channels` | Includes all channels you have access to. | +| `members` | Includes all members you have a relation with. | +| `emojis` | Includes all emojis you have access to. | +| `user_settings` | Specify which settings to pre-fetch, specify a setting by setting the value to `user_settings[]`. | +| `channel_unreads` | Includes all channel unreads you have. | +| `policy_changes` | Includes all new policy changes you should be aware of, this is not sent to bots. | + +For example: + +``` +?ready=users&ready=servers&ready=user_settings[ordering] +``` + +You may specify these in the connection URL: `wss://stoat.chat/events?version=1&format=json`. diff --git a/docs/docs/developers/events/protocol.md b/docs/docs/developers/events/protocol.md new file mode 100644 index 000000000..6e0c8d5ea --- /dev/null +++ b/docs/docs/developers/events/protocol.md @@ -0,0 +1,605 @@ +# Events + +This page documents various incoming and outgoing events. + +**Help Wanted:** we should adopt [AsyncAPI](https://www.asyncapi.com) to properly document the protocol! + +## Client to Server + +### Authenticate + +Authenticate with the server. + +```json +{ + "type": "Authenticate", + "token": "{token}" +} +``` + +### BeginTyping + +Tell other users that you have begun typing in a channel. + +Must be in the specified channel or nothing will happen. + +```json +{ + "type": "BeginTyping", + "channel": "{channel_id}" +} +``` + +### EndTyping + +Tell other users that you have stopped typing in a channel. + +Must be in the specified channel or nothing will happen. + +```json +{ + "type": "EndTyping", + "channel": "{channel_id}" +} +``` + +### Ping + +Ping the server, you can specify a timestamp that you'll receive back. + +```json +{ + "type": "Ping", + "data": 0 +} +``` + +### Subscribe + +Subscribe to a server's UserUpdate events. + +```json +{ + "type": "Subscribe", + "server_id": "{server_id}" +} +``` + +Implementation notes: + +- Subscriptions automatically expire within 15 minutes. +- A client may have up to 5 active subscriptions. +- This has no effect on bot sessions. +- This event should only be sent **iff** app/client is in focus. +- You should aim to send this event at most every 10 minutes per server. + +## Server to Client + +### Error + +An error occurred which meant you couldn't authenticate. + +```json +{ + "type": "Error", + "error": "{error_id}" +} +``` + +The `{error_id}` can be one of the following: + +- `LabelMe`: uncategorised error +- `InternalError`: the server ran into an issue +- `InvalidSession`: authentication details are incorrect +- `OnboardingNotFinished`: user has not chosen a username +- `AlreadyAuthenticated`: this connection is already authenticated + +### Authenticated + +The server has authenticated your connection and you will shortly start receiving data. + +```json +{ + "type": "Authenticated" +} +``` + +### Logged Out + +The current user session has been invalidated or the bot token has been reset. + +```json +{ + "type": "Logout" +} +``` + +Your connection will be closed shortly after. + +### Bulk + +Several events have been sent, process each item of `v` as its own event. + +```json +{ + "type": "Bulk", + "v": [...] +} +``` + +### Pong + +Ping response from the server. + +```json +{ + "type": "Pong", + "data": 0 +} +``` + +### Ready + +Data for use by client, data structures match the API specification. + +```json +{ + "type": "Ready", + "users"?: [{..}], + "servers"?: [{..}], + "channels"?: [{..}], + "members"?: [{..}], + "emojis"?: [{..}], + "user_settings"?: [{..}], + "channel_unreads"?: [{..}], + "policy_changes"?: [{..}], +} +``` + +### Message + +Message received, the event object has the same schema as the Message object in the API with the addition of an event type. + +```json +{ + "type": "Message", + [..] +} +``` + +### MessageUpdate + +Message edited or otherwise updated. + +```json +{ + "type": "MessageUpdate", + "id": "{message_id}", + "channel": "{channel_id}", + "data": {..} +} +``` + +- `data` field contains a partial Message object. + +### MessageAppend + +Message has data being appended to it. + +```json +{ + "type": "MessageAppend", + "id": "{message_id}", + "channel": "{channel_id}", + "append": { + "embeds"?: [...] + } +} +``` + +### MessageDelete + +Message has been deleted. + +```json +{ + "type": "MessageDelete", + "id": "{message_id}", + "channel": "{channel_id}" +} +``` + +### MessageReact + +A reaction has been added to a message. + +```json +{ + "type": "MessageReact", + "id": "{message_id}", + "channel_id": "{channel_id}", + "user_id": "{user_id}", + "emoji_id": "{emoji_id}" +} +``` + +### MessageUnreact + +A reaction has been removed from a message. + +```json +{ + "type": "MessageUnreact", + "id": "{message_id}", + "channel_id": "{channel_id}", + "user_id": "{user_id}", + "emoji_id": "{emoji_id}" +} +``` + +### MessageRemoveReaction + +A certain reaction has been removed from the message. + +```json +{ + "type": "MessageRemoveReaction", + "id": "{message_id}", + "channel_id": "{channel_id}", + "emoji_id": "{emoji_id}" +} +``` + +### ChannelCreate + +Channel created, the event object has the same schema as the Channel object in the API with the addition of an event type. + +```json +{ + "type": "ChannelCreate", + [..] +} +``` + +### ChannelUpdate + +Channel details updated. + +```json +{ + "type": "ChannelUpdate", + "id": "{channel_id}", + "data": {..}, + "clear": ["{field}", ...] +} +``` + +- `data` field contains a partial Channel object. +- `{field}` is a field to remove, one of: + - `Icon` + - `Description` + +### ChannelDelete + +Channel has been deleted. + +```json +{ + "type": "ChannelDelete", + "id": "{channel_id}" +} +``` + +### ChannelGroupJoin + +A user has joined the group. + +```json +{ + "type": "ChannelGroupJoin", + "id": "{channel_id}", + "user": "{user_id}" +} +``` + +### ChannelGroupLeave + +A user has left the group. + +```json +{ + "type": "ChannelGroupLeave", + "id": "{channel_id}", + "user": "{user_id}" +} +``` + +### ChannelStartTyping + +A user has started typing in this channel. + +```json +{ + "type": "ChannelStartTyping", + "id": "{channel_id}", + "user": "{user_id}" +} +``` + +### ChannelStopTyping + +A user has stopped typing in this channel. + +```json +{ + "type": "ChannelStopTyping", + "id": "{channel_id}", + "user": "{user_id}" +} +``` + +### ChannelAck + +You have acknowledged new messages in this channel up to this message ID. + +```json +{ + "type": "ChannelAck", + "id": "{channel_id}", + "user": "{user_id}", + "message_id": "{message_id}" +} +``` + +### ServerCreate + +Server created, the event object has the same schema as the SERVER object in the API with the addition of an event type. + +```json +{ + "type": "ServerCreate", + [..] +} +``` + +### ServerUpdate + +Server details updated. + +```json +{ + "type": "ServerUpdate", + "id": "{server_id}", + "data": {..}, + "clear": ["{field}", ...] +} +``` + +- `data` field contains a partial Server object. +- `{field}` is a field to remove, one of: + - `Icon` + - `Banner` + - `Description` + +### ServerDelete + +Server has been deleted. + +```json +{ + "type": "ServerDelete", + "id": "{server_id}" +} +``` + +### ServerMemberUpdate + +Server member details updated. + +```json +{ + "type": "ServerMemberUpdate", + "id": { + "server": "{server_id}", + "user": "{user_id}" + }, + "data": {..}, + "clear": ["{field}", ...] +} +``` + +- `data` field contains a partial Server Member object. +- `{field}` is a field to remove, one of: + - `Nickname` + - `Avatar` + +### ServerMemberJoin + +A user has joined the server. + +```json +{ + "type": "ServerMemberJoin", + "id": "{server_id}", + "user": "{user_id}", + "member": {..} +} +``` + +- `member` field contains a Member object. + +### ServerMemberLeave + +A user has left the server. + +```json +{ + "type": "ServerMemberLeave", + "id": "{server_id}", + "user": "{user_id}" +} +``` + +### ServerRoleUpdate + +Server role has been updated or created. + +```json +{ + "type": "ServerRoleUpdate", + "id": "{server_id}", + "role_id": "{role_id}", + "data": {..}, + "clear": ["{field}", ...] +} +``` + +- `data` field contains a partial Server Role object. +- `clear` is a field to remove, one of: + - `Colour` + +### ServerRoleDelete + +Server role has been deleted. + +```json +{ + "type": "ServerRoleDelete", + "id": "{server_id}", + "role_id": "{role_id}" +} +``` + +### UserUpdate + +User has been updated. + +```json +{ + "type": "UserUpdate", + "id": "{user_id}", + "data": {..}, + "clear": ["{field}", ...] +} +``` + +- `data` field contains a partial User object. +- `clear` is a field to remove, one of: + - `ProfileContent` + - `ProfileBackground` + - `StatusText` + - `Avatar` + - `DisplayName` + +### UserRelationship + +Your relationship with another user has changed. + +```json +{ + "type": "UserRelationship", + "id": "{your_user_id}", + "user": "{..}", + "status": "{status}" +} +``` + +- `user` field contains a User object. +- `status` field matches Relationship Status in API. + +### UserPlatformWipe + +User has been platform banned or deleted their account. + +Clients should remove the following associated data: + +- Messages +- DM Channels +- Relationships +- Server Memberships + +User flags are specified to explain why a wipe is occurring though not all reasons will necessarily ever appear. + +```json +{ + "type": "UserPlatformWipe", + "user_id": "{user_id}", + "flags": "{user_flags}" +} +``` + +### EmojiCreate + +Emoji created, the event object has the same schema as the Emoji object in the API with the addition of an event type. + +```json +{ + "type": "EmojiCreate", + [..] +} +``` + +### EmojiUpdate + +Emoji has been updated. + +```json +{ + "type": "EmojiUpdate", + "id": "{emoji_id}", + "data": { + "name"?: "{emoji_name}" + } +} +``` + +- `data` field contains a partial Emoji object. + +### EmojiDelete + +Emoji has been deleted. + +```json +{ + "type": "EmojiDelete", + "id": "{emoji_id}" +} +``` + +### Auth + +Forwarded events from [Authifier](https://github.com/authifier/authifier), currently only session deletion events are forwarded. + +```json +{ + "type": "Auth", + "event_type": "{event_type}", + [..] +} +``` + +Event type may be defined as one of the following with the additional properties: + +#### DeleteSession + +A session has been deleted. + +```json +{ + "event_type": "DeleteSession", + "user_id": "{user_id}", + "session_id": "{session_id}" +} +``` + +#### DeleteAllSessions + +All sessions for this account have been deleted, optionally excluding a given ID. + +```json +{ + "event_type": "DeleteAllSessions", + "user_id": "{user_id}", + "exclude_session_id": "{session_id}" +} +``` diff --git a/docs/docs/developers/legacy-plugin-api.md b/docs/docs/developers/legacy-plugin-api.md new file mode 100644 index 000000000..d2c452c8f --- /dev/null +++ b/docs/docs/developers/legacy-plugin-api.md @@ -0,0 +1,147 @@ +# Plugin API + +:::danger +This page documents the old Revite Plugin API (manifest v1), it will be replaced in the new client. +::: + +:::warning +The Plugin API is very powerful. **Tread carefully.** + +**Zero guarantees or sandboxes are provided.** Your code is run as-is. +::: + +This document details the very experimental plugin API available in [Revite](https://github.com/stoatchat/for-legacy-web). + +This is more or less a proof of concept but can be used to achieve some simple client modifications. + +## Plugin Manifest + +Below is the specification for revision 1 of the plugin API. The `format` parameter is not currently enforced but you should set it to `1` to avoid future breakage. + +````typescript +type Plugin = { + /** + * Plugin Format Revision + */ + format: 1; + + /** + * Semver Version String + * + * This is the version of the plugin. + */ + version: string; + + /** + * Plugin Namespace + * + * This will usually be the author's name. + */ + namespace: string; + + /** + * Plugin Id + * + * This should be a valid URL slug, e.g. cool-plugin. + */ + id: string; + + /** + * Entrypoint + * + * Valid Javascript code. It must be a function which returns a object. + * + * ```typescript + * function (state: State) { + * return { + * onUnload: () => {} + * } + * } + * ``` + */ + entrypoint: string; + + /** + * Whether this plugin is enabled. + * + * @default true + */ + enabled?: boolean; +}; +```` + +An example plugin: + +```javascript +{ + format: 1, + version: "0.0.1", + namespace: "insert", + id: "my-plugin", + entrypoint: `(state) => { + console.log('[my-plugin] Plugin init!'); + return { + onUnload: () => console.log('[my-plugin] bye!') + } + }` +} +``` + +## Using the Plugin API + +To begin, you can load plugins using the global plugin manager at `state.plugins`. + +Open the developer console and run: + +```javascript +state.plugins.load({ ... }); +// ...where [...] is your plugin manifest as described above. +``` + +## Plugin API + +A plugin's entrypoint is required to return an object which is referred to as the **instance**: + +```typescript +interface Instance { + onUnload?: () => void; +} +``` + +The Plugin API (`state.plugins`) exposes the following methods: + +```typescript +interface PluginAPI { + /** + * Add a plugin + * @param plugin Plugin Manifest + */ + add(plugin: Plugin); + + /** + * Remove a plugin + * @param namespace Plugin Namespace + * @param id Plugin Id + */ + remove(namespace: string, id: string); + + /** + * Load a plugin + * @param namespace Plugin Namespace + * @param id Plugin Id + */ + load(namespace: string, id: string); + + /** + * Unload a plugin + * @param namespace Plugin Namespace + * @param id Plugin Id + */ + unload(namespace: string, id: string); + + /** + * Reset everything + */ + reset(); +} +``` diff --git a/docs/docs/developers/libraries.md b/docs/docs/developers/libraries.md new file mode 100644 index 000000000..bda99ae10 --- /dev/null +++ b/docs/docs/developers/libraries.md @@ -0,0 +1,8 @@ +# Libraries + +The following libraries are provided by the Stoat team: + +- [Javascript SDK](https://github.com/stoatchat/javascript-client-sdk) +- [Python SDK](https://github.com/stoatchat/python-client-sdk) + +You can find a host of [community created libraries here](https://github.com/stoatchat/awesome-stoat#-api-libraries). diff --git a/docs/docs/developers/stoat-migration-guide.md b/docs/docs/developers/stoat-migration-guide.md new file mode 100644 index 000000000..c26168b52 --- /dev/null +++ b/docs/docs/developers/stoat-migration-guide.md @@ -0,0 +1,22 @@ +# Stoat Migration Guide + +:::warning + +This is not yet finished. + +::: + +## Endpoint changes + +| Service | Old URL | New URL | +| ---------- | ----------------------------------- | --------------------------------------- | +| **API** | `https://api.revolt.chat` | `https://stoat.chat/api` | +| | `https://app.revolt.chat/api` | `https://stoat.chat/api` | +| | `https://revolt.chat/api` | No equivalent | +| **Events** | `wss://ws.revolt.chat` | `wss://stoat.chat/events` | +| | `wss://app.revolt.chat/events` | `wss://stoat.chat/events` | +| | `wss://revolt.chat/events` | No equivalent | +| **Files** | `https://autumn.revolt.chat` | `https://cdn.stoatusercontent.com` | +| | `https://cdn.revoltusercontent.com` | `https://cdn.stoatusercontent.com` | +| **Proxy** | `https://jan.revolt.chat` | `https://external.stoatusercontent.com` | +| **Voice** | `https://vortex.revolt.chat` | Superseded by Voice Chats v2 | diff --git a/docs/docs/developing/backend/_category_.json b/docs/docs/developing/backend/_category_.json new file mode 100644 index 000000000..dccd5ffc7 --- /dev/null +++ b/docs/docs/developing/backend/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Backend", + "position": 10, + "link": { + "type": "generated-index", + "description": "Building the Stoat software" + }, + "collapsed": false, + "collapsible": true +} \ No newline at end of file diff --git a/doc/src/new_features.md b/docs/docs/developing/backend/new_features.md similarity index 70% rename from doc/src/new_features.md rename to docs/docs/developing/backend/new_features.md index 82f068a1d..18d43afce 100644 --- a/doc/src/new_features.md +++ b/docs/docs/developing/backend/new_features.md @@ -1,15 +1,15 @@ -# New API features +# Adding new API features New API features must be documented where appropriate, this document aims to cover everywhere you need to update for new features. Before writing new API features, generally a good idea to: -- Consult with other developers in the [Revolt Developers space](https://rvlt.gg/API) +- Consult with other developers in the [Stoat Developers space](https://stt.gg/API) - If it's a relatively big feature, also [write an RFC](https://github.com/revoltchat/rfcs) When your feature is ready to release, ensure to: - Update backend documentation (what you're reading now!) if applicable -- Update the [developers documentation](https://github.com/revoltchat/wiki) if applicable +- Update the [developers documentation](https://github.com/stoatchat/stoatchat/tree/main/docs) if applicable - Update the Feature Matrix (or ask someone that can to do so) - Ensure it is properly listed in the backend release changelog diff --git a/docs/docs/developing/contrib.md b/docs/docs/developing/contrib.md new file mode 100644 index 000000000..565f92eae --- /dev/null +++ b/docs/docs/developing/contrib.md @@ -0,0 +1,49 @@ +--- +sidebar_position: 2 +--- + +# Contribution Guide + +This is the contribution guide for developers wanting to help out with Stoat. + +## Repository Lifecycle + +### Making Commits + +- Sign-off your commits ([Git flag](https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---signoff)), [read here about DCO obligations](https://developercertificate.org/). +- Sign commits where possible, [learn more about that here](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits). +- Prefer using [Conventional Commit style](https://www.conventionalcommits.org/en/v1.0.0-beta.2/). +- If present, e.g. `prettier`, `cargo fmt`, use the formatter. +- Try to keep each PR bound to a single feature or change, multiple bug fixes may be fine in some cases. + This is to avoid your PR getting stuck due to parts of it having conflicts or other issues. + +### Merging Pull Requests + +All PR titles must use use [Conventional Commit style](https://www.conventionalcommits.org/en/v1.0.0-beta.2/) and will be squash merged. + +### Use of generative AI + +Please do not open PRs generated with LLMs. + +## What can I help with? + +Stuff is currently being moved around, for the mean time, come ask in the development server: https://stt.gg/API + +Also typically `help wanted` labels are available on repo issues! + + + +## Project Guidance + +Please read the additional relevant guidance on: + +- [Developing for Backend](https://github.com/stoatchat/backend?tab=readme-ov-file#development-guide) (contrib guide TBA) +- [Contributing to Frontend](https://stoatchat.github.io/for-web/contribution-guide.html) +- [Contributing to Android](https://stoatchat.github.io/for-android/contributing/guidelines/) diff --git a/docs/docs/faq.md b/docs/docs/faq.md new file mode 100644 index 000000000..5f09386e2 --- /dev/null +++ b/docs/docs/faq.md @@ -0,0 +1,109 @@ +--- +sidebar_position: 4 +--- + +# 📖 Frequently Asked Questions + +This page includes several frequently asked questions and explanations. + +All of these answers are written from the perspective of the project owner. + +**Last Update:** 10th May 2024 + +
+ Why another project? + + I think this is best explained with a bit of history: + - Stoat (formerly Revolt) started as a passion project + - It grew way beyond any of our expectations + - We might as well keep going since there is an interest in this space + + Beyond that: + - Stoat has been a great learning experience, including development, management, and running the infrastructure for a large project. Stoat has also taught me a lot about different concepts and programming languages, and really, that's how developers learn. We make cool projects to try to better how we work, it doesn't matter if someone has done it before as long as you can attempt to do the same. Reinventing the wheel is part of the process. + - At the time, there was also a relative void of competition in this specific genre of chat platforms. There were Guilded, Discord, and Matrix but these are all either closed-source or cater to a different audience. + + PS. I've had a few people say, 'why not just contribute to X?', the answer is quite simple, I just didn't know about any of these projects (i.e. Matrix). +
+ +
+ How are we funded? + + Stoat is entirely funded through donations, we have amassed a significant amount of money from donations alone. (financial transparency reports coming soon :tm:) + + The month-to-month income of Stoat covers our operational costs and leaves enough spare to cover yearly expenses and the occassional one-time expense, such as for additional hardware. + + We have monetisation plans lined up for the future, however it is not our intention to paywall existing features, instead where possible we intend to pass down costs such as for file storage or voice bandwidth. +
+ +
+ 'X' feature when? + + Please take a look at [our roadmap on GitHub](https://op.stoatinternal.com/projects/all-of-revolt/gantt?query_id=53). +
+ +
+ Does Stoat have federation? + + As of right now, Stoat does not feature any federation and **it is not in our feature roadmap**. + + However, this does not necessarily mean federation is off the table, possible avenues are: + - Implement our own federation protocol + - Implement a promising up and coming federation protocol, polyproto + - Implement the Matrix protocol (unlikely, obtuse and unstable) + - Implement the XMPP protocol (battle-tested and stable) + + Any federation that is implemented MUST exercise caution in: + - Preventing spam and abuse: moderators should be able to block malicious actors + - Protecting user data: users should be able to redact all of their information and messages +
+ +
+ What can I do with Stoat and how do I self-host? + + In general: + - The Stoat branding is used to represent the platform, stoat.chat. + - You may use the branding as-is to promote the platform and your community on the platform. + - You should not use the branding in order to appear as if you are associated with the Stoat team. + - Please make explicit distinctions between Stoat (the platform, "stoat.chat") and the Stoat software. + - The Stoat software is provided unbranded and only associated by name. + + If you have any concerns or questions, please liase with us at [contact@stoat.chat](mailto:contact@stoat.chat). + + As a third-party platform: + - You **must** provide correct attribution in line with our software licenses: + + If you are using official images (GitHub Packages / Docker Hub), attribution is included. + If you are modifying the software and using it in production, you must publish the changes to the source publicly in line with AGPLv3. (In addition to providing attribution back to the original project.) + - You are **solely responsible** for whatever happens on your third party instance, we provide no warranty or liability for what happens on 3rd party instances. + - You **must not** appear to associate with Stoat / stoat.chat unless if granted explicit written permission. In regards to custom clients, provide a warning of any potential risks or clear it with us. + - You **may not** use any of the Stoat branding or brand assets to advertise or promote your third party instance. + + You can self-host Stoat by: + - Using [Docker Compose and our recommended guide](https://github.com/stoatchat/self-hosted). + - Building individual components yourself from the [source code](https://github.com/stoatchat). +
+ +
+ Can you verify my server/bot? + + Currently, you can only apply to verify servers given that you have a valid reason to believe verification is necessary for your community. Verification is intended to provide protection for server owners from copy cats and to provide authenticity to users as such we are not just giving it out to anyone because that would defeat the purpose. + + However if you would like to get a server verified, you should satisfy one of the following criteria: + + - Official community for a well-established open source project + - Official community for any other well-established product, service, or person + - Large and active distinct pre-existing community + + Distinct means the community is unique and well-known (& has an active presence) off platform. This means we are not currently verifying generic servers that centre around a topic unless if it meets one of the first two criteria. Though in special circumstances, well known on platform communities may also be considered. + + Server verification also comes with a vanity invite, so please have one ready if you want to apply. To apply, drop an email at [contact@stoat.chat](mailto:contact@stoat.chat). + + We also periodically prune verification from servers that have fallen into disrepair and / or otherwise are no longer active. +
+ +For questions about the Stoat platform, you may want to go to our knowledge base: + +- [What badges can I get?](https://support.stoat.chat/kb/account/badges) +- [How old do I have to be to use Stoat?](https://support.stoat.chat/kb/safety/minimum-age-guidelines) +- [Are there any restrictions on servers being on Discover?](https://support.stoat.chat/kb/safety/discover-guidelines) +- [(... and more)](https://support.stoat.chat) diff --git a/docs/docs/help.md b/docs/docs/help.md new file mode 100644 index 000000000..7de5ca510 --- /dev/null +++ b/docs/docs/help.md @@ -0,0 +1,30 @@ +--- +sidebar_position: 3 +--- + +# 💖 Helping Stoat! + +You can contribute to Stoat in a variety of ways: + +### 1. Feedback + +The easiest, but most important, way to contribute to Stoat is to voice your opinion and give us feedback. +We want to hear what you think and appreciate and await your feature suggestions, bug reports and general opinions on everything Stoat has to offer. + +Typically, you can open issues on the relevant [GitHub repositories](https://github.com/stoatchat). + + + +### 2. Translate + +Stoat is used by users all around the world; as such, it's more accessible if the user interface is available in a variety of languages. +You can contribute translations through [**Weblate**](https://translate.stoat.chat/engage/revolt/). + +### 3. Donate + +Stoat is not backed by a big company, is not currently monetised (for example, via a subscription service) and does not serve you advertisements; as such, Stoat currently relies entirely on donations. +You can learn more about donating [here](https://ko-fi.com/stoatchat) - if you want to make a larger donation, please consult me first. + +### 4. Join the project + +We are a small team and always appreciate more help! [Check out roles we're looking for here!](https://outline.stoatinternal.com/s/454dd0eb-44b5-41f7-b1d1-b6accec577a0) diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 000000000..370a2a4bd --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,17 @@ +--- +sidebar_position: 1 +--- + +# 🤗 Introduction + +Welcome to Stoat's developer documentation. Everything you need to contribute to Stoat, build apps or bots, or to learn more about the project can be found here. + +Learn more about: + +- [Contributing as a developer](./developing/contrib) +- [Other ways to help out](./help) + +You may also be interested in the: + +- [Frontend Book](https://stoatchat.github.io/for-web) +- [Android Book](https://stoatchat.github.io/for-android) diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts new file mode 100644 index 000000000..928a02d1d --- /dev/null +++ b/docs/docusaurus.config.ts @@ -0,0 +1,182 @@ +import { themes as prismThemes } from 'prism-react-renderer'; +import type { Config } from '@docusaurus/types'; +import type * as Preset from '@docusaurus/preset-classic'; +import type { ScalarOptions } from '@scalar/docusaurus'; + +const config: Config = { + title: 'Stoat Developers', + tagline: 'Developer documentation for Stoat', + favicon: 'https://stoat.chat/favicon-stoat.svg', + + future: { + v4: true, + }, + + url: 'https://developers.stoat.chat', + baseUrl: '/', + + organizationName: 'stoatchat', + projectName: 'stoatchat', + + onBrokenLinks: 'throw', + + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + { + docs: { + routeBasePath: '/', + sidebarPath: './sidebars.ts', + editUrl: + 'https://github.com/stoatchat/stoatchat/tree/main/docs/', + }, + } satisfies Preset.Options, + ], + ], + + plugins: [ + [ + '@scalar/docusaurus', + { + label: 'API Reference', + route: '/api-reference', + showNavLink: true, + configuration: { + url: 'https://stoat.chat/api/openapi.json', + }, + } as ScalarOptions, + ], + [ + '@docusaurus/plugin-client-redirects', + { + fromExtensions: ['html', 'htm'], + redirects: [ + // legacy docs website (stoatchat/developer-wiki) + { + from: '/developers/api/reference.html', + to: '/api-reference', + }, + { + from: '/contrib.html', + to: '/developing/contrib', + }, + { + from: '/contrib', + to: '/developing/contrib', + }, + ], + } + ], + ], + + themeConfig: { + // image: 'img/docusaurus-social-card.jpg', + colorMode: { + respectPrefersColorScheme: true, + }, + navbar: { + logo: { + alt: 'Stoat for Developers', + src: '/img/navbar.light.svg', + srcDark: '/img/navbar.dark.svg' + }, + items: [ + { + type: 'doc', + docId: 'index', + label: 'Docs' + }, + { + href: 'https://github.com/stoatchat', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Developers', + items: [ + { + label: 'Source Code', + href: 'https://github.com/stoatchat' + }, + { + label: 'Help Translate', + href: 'https://translate.stoat.chat' + }, + ], + }, + { + title: 'Team', + items: [ + { + label: 'About', + href: 'https://stoat.chat/about' + }, + { + label: 'Blog and Changelogs', + href: 'https://stoat.chat/updates' + }, + { + label: 'Contact', + href: 'https://support.stoat.chat' + }, + ], + }, + { + title: 'Stoat on Socials', + items: [ + { + label: 'Bluesky', + href: 'https://bsky.app/profile/stoat.chat' + }, + { + label: 'Reddit', + href: 'https://reddit.com/r/stoatchat' + }, + { + label: 'Stoat Server', + href: 'https://stt.gg/Testers' + }, + ], + }, + { + title: 'Legal', + items: [ + { + label: 'Community Guidelines', + href: 'https://stoat.chat/legal/community-guidelines' + }, + { + label: 'Terms of Service', + href: 'https://stoat.chat/legal/terms' + }, + { + label: 'Privacy Policy', + href: 'https://stoat.chat/legal/privacy' + }, + { + label: 'Imprint', + href: 'https://stoat.chat/legal/imprint' + }, + ], + }, + ], + copyright: `© Revolt Platforms Ltd, ${new Date().getFullYear()}`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + } satisfies Preset.ThemeConfig, +}; + +export default config; diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 000000000..29bc71f8f --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,18449 @@ +{ + "name": "docs", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docs", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-client-redirects": "^3.9.2", + "@docusaurus/preset-classic": "3.9.2", + "@mdx-js/react": "^3.0.0", + "@scalar/docusaurus": "^0.7.21", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/tsconfig": "3.9.2", + "@docusaurus/types": "3.9.2", + "typescript": "~5.6.2" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.9.tgz", + "integrity": "sha512-E6x4h5CPPPJ0za1r5HsLtHbeI+Tp3H+YFtcH8G3dSSPFE6w+PZINzB4NxLZmg1QqSeA5HTP3ZEzzsohp0o2GEw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.17", + "@vercel/oidc": "3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.17.tgz", + "integrity": "sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "2.0.93", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.93.tgz", + "integrity": "sha512-2TzhpQr10HuWxpqyHpSAUMRUqD1G2O73J2sAaJChomVDbjr7BwpM0mdR3aRamCXNtuLiJmTFQhbNzw8fXMBdYw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "3.0.17", + "ai": "5.0.93", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.25.76 || ^4.1.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.9.0.tgz", + "integrity": "sha512-4q9QCxFPiDIx1n5w41A1JMkrXI8p0ugCQnCGFtCKZPmWtwgWCqwVRncIbp++81xSELFZVQUfiB7Kbsla1tIBSw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.43.0.tgz", + "integrity": "sha512-YsKYkohIMxiYEAu8nppZi5EioYDUIo9Heoor8K8vMUnkUtGCOEU/Q4p5OWaYSSBx3evo09Ga9rG4jsKViIcDzQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.43.0.tgz", + "integrity": "sha512-kDGJWt3nzf0nu5RPFXQhNGl6Q0cn35fazxVWXhd0Fw3Vo6gcVfrcezcBenHb66laxnVJ7uwr1uKhmsu3Wy25sQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.43.0.tgz", + "integrity": "sha512-RAFipkAnI8xhL/Sgi/gpXgNWN5HDM6F7z4NNNOcI8ZMYysZEBsqVXojg/WdKEKkQCOHVTZ3mooIjc5BaQdyVtA==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.43.0.tgz", + "integrity": "sha512-PmVs83THco8Qig3cAjU9a5eAGaSxsfgh7PdmWMQFE/MCmIcLPv0MVpgfcGGyPjZGYvPC4cg+3q7JJxcNSsEaTg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.43.0.tgz", + "integrity": "sha512-Bs4zMLXvkAr19FSOZWNizlNUpRFxZVxtvyEJ+q3n3+hPZUcKjo0LIh15qghhRcQPEihjBN6Gr/U+AqRfOCsvnA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.43.0.tgz", + "integrity": "sha512-pwHv+z8TZAKbwAWt9+v2gIqlqcCFiMdteTdgdPn2yOBRx4WUQdsIWAaG9GiV3by8jO51FuFQnTohhauuI63y3A==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.43.0.tgz", + "integrity": "sha512-wKy6x6fKcnB1CsfeNNdGp4dzLzz04k8II3JLt6Sp81F8s57Ks3/K9qsysmL9SJa8P486s719bBttVLE8JJYurQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.43.0.tgz", + "integrity": "sha512-TA21h2KwqCUyPXhSAWF3R2UES/FAnzjaVPDI6cRPXeadX+pdrGN0GWat5gSUATJVcMHECn+lGvuMMRxO86o2Pg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.43.0.tgz", + "integrity": "sha512-rvWVEiA1iLcFmHS3oIXGIBreHIxNZqEFDjiNyRtLEffgd62kul2DjXM7H5bOouDMTo1ywMWT9OeQnzrhlTGAwA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.43.0.tgz", + "integrity": "sha512-scCijGd38npvH2uHbYhO4f1SR8It5R2FZqOjNcMfw/7Ph7Hxvl+cd7Mo6RzIxsNRcLW5RrwjtpTK3gpDe8r/WQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.43.0.tgz", + "integrity": "sha512-jMkRLWJYr4Hcmpl89e4vIWs69Mkf8Uwx7MG5ZKk2UxW3G3TmouGjI0Ph5mVPmg3Jf1UG3AdmVDc4XupzycT1Jw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.43.0.tgz", + "integrity": "sha512-KyQiVz+HdYtissC0J9KIGhHhKytQyJX+82GVsbv5rSCXbETnAoojvUyCn+3KRtWUvMDYCsZ+Y7hM71STTUJUJg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.43.0.tgz", + "integrity": "sha512-UnUBNY0U+oT0bkYDsEqVsCkErC2w7idk4CRiLSzicqY8tGylD9oP0j13X/fse1CuiAFCCr3jfl+cBlN6dC0OFw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", + "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.43.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.3.1.tgz", + "integrity": "sha512-ktVbkePE+2h9RwqCUMbWXOoebFyDOxHqImAqfs+lC8yOU+XwEW4jgvHGJK079deTeHtdhUNj0PXHSnhJINvHzQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/css": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.3.2.tgz", + "integrity": "sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.3.2.tgz", + "integrity": "sha512-74SFD6WluwvgsOPqifYOviEEVwDxslxfhakTlra+JviaNcs7KK/rjsPj89kVEoQc9FUxRkAofaJnHIR7pb4TSQ==", + "license": "MIT", + "dependencies": { + "@ai-sdk/react": "^2.0.30", + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/core": "4.3.1", + "@docsearch/css": "4.3.2", + "ai": "^5.0.30", + "algoliasearch": "^5.28.0", + "marked": "^16.3.0", + "zod": "^4.1.8" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.2.tgz", + "integrity": "sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.2.tgz", + "integrity": "sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.9.2", + "@docusaurus/cssnano-preset": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.2.tgz", + "integrity": "sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.9.2", + "@docusaurus/bundler": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.2.tgz", + "integrity": "sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.2.tgz", + "integrity": "sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.2.tgz", + "integrity": "sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", + "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.10.1.tgz", + "integrity": "sha512-LHgd+YDvkhfOHMAE6XtUng3DQNzVM765RqVRrMJgHtzAvfopQhY6ieprqjxDVBdv21cLma6I0jHr+YCZH8fL9A==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/babel": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.1.tgz", + "integrity": "sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/bundler": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.1.tgz", + "integrity": "sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.10.1", + "@docusaurus/cssnano-preset": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^7.0.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/core": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", + "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.1", + "@docusaurus/bundler": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "^5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.3", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.7", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*", + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/cssnano-preset": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz", + "integrity": "sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/logger": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", + "integrity": "sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/mdx-loader": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz", + "integrity": "sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.1.tgz", + "integrity": "sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz", + "integrity": "sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "escape-string-regexp": "^4.0.0", + "execa": "^5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/utils-common": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.1.tgz", + "integrity": "sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/@docusaurus/utils-validation": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz", + "integrity": "sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-client-redirects/node_modules/webpackbar": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", + "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", + "license": "MIT", + "dependencies": { + "ansis": "^3.2.0", + "consola": "^3.2.3", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@rspack/core": "*", + "webpack": "3 || 4 || 5" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.2.tgz", + "integrity": "sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", + "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.2.tgz", + "integrity": "sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.2.tgz", + "integrity": "sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.2.tgz", + "integrity": "sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.2.tgz", + "integrity": "sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.2.tgz", + "integrity": "sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.2.tgz", + "integrity": "sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.2.tgz", + "integrity": "sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.2.tgz", + "integrity": "sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.2.tgz", + "integrity": "sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/plugin-css-cascade-layers": "3.9.2", + "@docusaurus/plugin-debug": "3.9.2", + "@docusaurus/plugin-google-analytics": "3.9.2", + "@docusaurus/plugin-google-gtag": "3.9.2", + "@docusaurus/plugin-google-tag-manager": "3.9.2", + "@docusaurus/plugin-sitemap": "3.9.2", + "@docusaurus/plugin-svgr": "3.9.2", + "@docusaurus/theme-classic": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-search-algolia": "3.9.2", + "@docusaurus/types": "3.9.2" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.2.tgz", + "integrity": "sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/plugin-content-blog": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/plugin-content-pages": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.2.tgz", + "integrity": "sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.9.2", + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.2.tgz", + "integrity": "sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.9.0 || ^4.1.0", + "@docusaurus/core": "3.9.2", + "@docusaurus/logger": "3.9.2", + "@docusaurus/plugin-content-docs": "3.9.2", + "@docusaurus/theme-common": "3.9.2", + "@docusaurus/theme-translations": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-validation": "3.9.2", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.2.tgz", + "integrity": "sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/tsconfig": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", + "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.2.tgz", + "integrity": "sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/types": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "escape-string-regexp": "^4.0.0", + "execa": "5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.2.tgz", + "integrity": "sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.9.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.2.tgz", + "integrity": "sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.2", + "@docusaurus/utils": "3.9.2", + "@docusaurus/utils-common": "3.9.2", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@scalar/docusaurus": { + "version": "0.7.44", + "resolved": "https://registry.npmjs.org/@scalar/docusaurus/-/docusaurus-0.7.44.tgz", + "integrity": "sha512-GUop+mdVe761bcUw/PDdyhR969dF948REosp7JyiQ+6TnlaDfg/7C3lUbwV8sGa1DTNrjKeXqHBh8AOMgubIWQ==", + "license": "MIT", + "dependencies": { + "@scalar/types": "0.6.10" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@docusaurus/utils": "^3.9.2", + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@scalar/helpers": { + "version": "0.2.18", + "resolved": "https://registry.npmjs.org/@scalar/helpers/-/helpers-0.2.18.tgz", + "integrity": "sha512-w1d4tpNEVZ293oB2BAgLrS0kVPUtG3eByNmOCJA5eK9vcT4D3cmsGtWjUaaqit0BQCsBFHK51rasGvSWnApYTw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/types": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/@scalar/types/-/types-0.6.10.tgz", + "integrity": "sha512-fZkelRwcEeAhsn4c0wjYXWrzSzLaEyfxTn/eazXJ4XfCIsgJTQyK0FD8mnOBZJ2vEIbtT2E1mBKnCbDxrJIlxA==", + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.2.18", + "nanoid": "^5.1.6", + "type-fest": "^5.3.1", + "zod": "^4.3.5" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/types/node_modules/nanoid": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.15.tgz", + "integrity": "sha512-kBg3RpGtIe+RpTbyXwoI6pk5yD7KUiI3sygUqgeBMRst42KmhB4RZC7eiO9Wa1HIpaCCtpE2DJ6OI4Wi5ebwFw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@scalar/types/node_modules/type-fest": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz", + "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.4.tgz", + "integrity": "sha512-tBFxBp9Nfyy5rsmefN+WXc1JeW/j2BpBHFdLZbEVfs9wn3E3NRFxwV0pJg8M1qQAexFpvz73hJXFofV0ZAu92A==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", + "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vercel/oidc": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.3.tgz", + "integrity": "sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ai": { + "version": "5.0.93", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.93.tgz", + "integrity": "sha512-9eGcu+1PJgPg4pRNV4L7tLjRR3wdJC9CXQoNMvtqvYNOLZHFCzjHtVIOr2SIkoJJeu2+sOy3hyiSuTmy2MA40g==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "2.0.9", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.17", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.43.0.tgz", + "integrity": "sha512-hbkK41JsuGYhk+atBDxlcKxskjDCh3OOEDpdKZPtw+3zucBqhlojRG5e5KtCmByGyYvwZswVeaSWglgLn2fibg==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.9.0", + "@algolia/client-abtesting": "5.43.0", + "@algolia/client-analytics": "5.43.0", + "@algolia/client-common": "5.43.0", + "@algolia/client-insights": "5.43.0", + "@algolia/client-personalization": "5.43.0", + "@algolia/client-query-suggestions": "5.43.0", + "@algolia/client-search": "5.43.0", + "@algolia/ingestion": "1.43.0", + "@algolia/monitoring": "1.43.0", + "@algolia/recommend": "5.43.0", + "@algolia/requester-browser-xhr": "5.43.0", + "@algolia/requester-fetch": "5.43.0", + "@algolia/requester-node-http": "5.43.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.1.tgz", + "integrity": "sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", + "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-lite": "^1.0.30001754", + "fraction.js": "^5.3.4", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.28", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz", + "integrity": "sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001754", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", + "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", + "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.26.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.46.0.tgz", + "integrity": "sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", + "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.3.0.tgz", + "integrity": "sha512-Qq68+VkJlc8tjnPV1i7HtbIn7ohmjZa88qUvHMIK0ZKUXMCuV45cT7cEXALPUmeXCe0q1DWQkQTemHVaLIFSrg==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.250", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz", + "integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.6.tgz", + "integrity": "sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", + "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.0.tgz", + "integrity": "sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz", + "integrity": "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.21", + "browserslist": "^4.26.0", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.4.2", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz", + "integrity": "sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "license": "BlueOak-1.0.0" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.5", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.19.tgz", + "integrity": "sha512-Ev+SgeqiNGT1ufsXyVC5RrJRXdrkRJ1Gol9Qw7Pb72YCKJXrBvP0ckZhBeVSrw2m06DJpei2528uIpjMb4TsoQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.12" + } + }, + "node_modules/style-to-object": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.12.tgz", + "integrity": "sha512-ddJqYnoT4t97QvN2C95bCgt+m7AAgXjVnkk/jxAfmp7EAB8nnqqZYEbMd3em7/vEomDb2LAQKAy1RFfv41mdNw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.6" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/swr": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", + "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..f1c29cc9b --- /dev/null +++ b/docs/package.json @@ -0,0 +1,50 @@ +{ + "name": "docs", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc" + }, + "dependencies": { + "@docusaurus/core": "3.9.2", + "@docusaurus/plugin-client-redirects": "^3.9.2", + "@docusaurus/preset-classic": "3.9.2", + "@mdx-js/react": "^3.0.0", + "@scalar/docusaurus": "^0.7.21", + "clsx": "^2.0.0", + "prism-react-renderer": "^2.3.0", + "react": "^19.2.7", + "react-dom": "^19.2.7" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.9.2", + "@docusaurus/tsconfig": "3.9.2", + "@docusaurus/types": "3.9.2", + "typescript": "~5.6.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=20.0" + }, + "packageManager": "pnpm@10.22.0+sha512.bf049efe995b28f527fd2b41ae0474ce29186f7edcb3bf545087bd61fbbebb2bf75362d1307fda09c2d288e1e499787ac12d4fcb617a974718a6051f2eee741c" +} diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml new file mode 100644 index 000000000..499532942 --- /dev/null +++ b/docs/pnpm-lock.yaml @@ -0,0 +1,11468 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@docusaurus/core': + specifier: 3.9.2 + version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-client-redirects': + specifier: ^3.9.2 + version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/preset-classic': + specifier: 3.9.2 + version: 3.9.2(@algolia/client-search@5.43.0)(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)(typescript@5.6.3) + '@mdx-js/react': + specifier: ^3.0.0 + version: 3.1.1(@types/react@19.2.17)(react@19.2.7) + '@scalar/docusaurus': + specifier: ^0.7.21 + version: 0.7.21(@docusaurus/utils@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7) + clsx: + specifier: ^2.0.0 + version: 2.1.1 + prism-react-renderer: + specifier: ^2.3.0 + version: 2.4.1(react@19.2.7) + react: + specifier: ^19.2.7 + version: 19.2.7 + react-dom: + specifier: ^19.2.7 + version: 19.2.7(react@19.2.7) + devDependencies: + '@docusaurus/module-type-aliases': + specifier: 3.9.2 + version: 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/tsconfig': + specifier: 3.9.2 + version: 3.9.2 + '@docusaurus/types': + specifier: 3.9.2 + version: 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + typescript: + specifier: ~5.6.2 + version: 5.6.3 + +packages: + + '@ai-sdk/gateway@2.0.9': + resolution: {integrity: sha512-E6x4h5CPPPJ0za1r5HsLtHbeI+Tp3H+YFtcH8G3dSSPFE6w+PZINzB4NxLZmg1QqSeA5HTP3ZEzzsohp0o2GEw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@3.0.17': + resolution: {integrity: sha512-TR3Gs4I3Tym4Ll+EPdzRdvo/rc8Js6c4nVhFLuvGLX/Y4V9ZcQMa/HTiYsHEgmYrf1zVi6Q145UEZUfleOwOjw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + engines: {node: '>=18'} + + '@ai-sdk/react@2.0.93': + resolution: {integrity: sha512-2TzhpQr10HuWxpqyHpSAUMRUqD1G2O73J2sAaJChomVDbjr7BwpM0mdR3aRamCXNtuLiJmTFQhbNzw8fXMBdYw==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.25.76 || ^4.1.8 + peerDependenciesMeta: + zod: + optional: true + + '@algolia/abtesting@1.9.0': + resolution: {integrity: sha512-4q9QCxFPiDIx1n5w41A1JMkrXI8p0ugCQnCGFtCKZPmWtwgWCqwVRncIbp++81xSELFZVQUfiB7Kbsla1tIBSw==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.19.2': + resolution: {integrity: sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==} + + '@algolia/autocomplete-plugin-algolia-insights@1.19.2': + resolution: {integrity: sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-shared@1.19.2': + resolution: {integrity: sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.43.0': + resolution: {integrity: sha512-YsKYkohIMxiYEAu8nppZi5EioYDUIo9Heoor8K8vMUnkUtGCOEU/Q4p5OWaYSSBx3evo09Ga9rG4jsKViIcDzQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.43.0': + resolution: {integrity: sha512-kDGJWt3nzf0nu5RPFXQhNGl6Q0cn35fazxVWXhd0Fw3Vo6gcVfrcezcBenHb66laxnVJ7uwr1uKhmsu3Wy25sQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.43.0': + resolution: {integrity: sha512-RAFipkAnI8xhL/Sgi/gpXgNWN5HDM6F7z4NNNOcI8ZMYysZEBsqVXojg/WdKEKkQCOHVTZ3mooIjc5BaQdyVtA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.43.0': + resolution: {integrity: sha512-PmVs83THco8Qig3cAjU9a5eAGaSxsfgh7PdmWMQFE/MCmIcLPv0MVpgfcGGyPjZGYvPC4cg+3q7JJxcNSsEaTg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.43.0': + resolution: {integrity: sha512-Bs4zMLXvkAr19FSOZWNizlNUpRFxZVxtvyEJ+q3n3+hPZUcKjo0LIh15qghhRcQPEihjBN6Gr/U+AqRfOCsvnA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.43.0': + resolution: {integrity: sha512-pwHv+z8TZAKbwAWt9+v2gIqlqcCFiMdteTdgdPn2yOBRx4WUQdsIWAaG9GiV3by8jO51FuFQnTohhauuI63y3A==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.43.0': + resolution: {integrity: sha512-wKy6x6fKcnB1CsfeNNdGp4dzLzz04k8II3JLt6Sp81F8s57Ks3/K9qsysmL9SJa8P486s719bBttVLE8JJYurQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/events@4.0.1': + resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} + + '@algolia/ingestion@1.43.0': + resolution: {integrity: sha512-TA21h2KwqCUyPXhSAWF3R2UES/FAnzjaVPDI6cRPXeadX+pdrGN0GWat5gSUATJVcMHECn+lGvuMMRxO86o2Pg==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.43.0': + resolution: {integrity: sha512-rvWVEiA1iLcFmHS3oIXGIBreHIxNZqEFDjiNyRtLEffgd62kul2DjXM7H5bOouDMTo1ywMWT9OeQnzrhlTGAwA==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.43.0': + resolution: {integrity: sha512-scCijGd38npvH2uHbYhO4f1SR8It5R2FZqOjNcMfw/7Ph7Hxvl+cd7Mo6RzIxsNRcLW5RrwjtpTK3gpDe8r/WQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.43.0': + resolution: {integrity: sha512-jMkRLWJYr4Hcmpl89e4vIWs69Mkf8Uwx7MG5ZKk2UxW3G3TmouGjI0Ph5mVPmg3Jf1UG3AdmVDc4XupzycT1Jw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.43.0': + resolution: {integrity: sha512-KyQiVz+HdYtissC0J9KIGhHhKytQyJX+82GVsbv5rSCXbETnAoojvUyCn+3KRtWUvMDYCsZ+Y7hM71STTUJUJg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.43.0': + resolution: {integrity: sha512-UnUBNY0U+oT0bkYDsEqVsCkErC2w7idk4CRiLSzicqY8tGylD9oP0j13X/fse1CuiAFCCr3jfl+cBlN6dC0OFw==} + engines: {node: '>= 14.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.5': + resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.4': + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.28.5': + resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.28.5': + resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.4': + resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.28.5': + resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-constant-elements@7.27.1': + resolution: {integrity: sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.4': + resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.28.5': + resolution: {integrity: sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.5': + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.5': + resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.28.5': + resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.28.5': + resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime-corejs3@7.28.4': + resolution: {integrity: sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@csstools/cascade-layer-name-parser@2.0.5': + resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@csstools/media-query-list-parser@4.0.3': + resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/postcss-alpha-function@1.0.1': + resolution: {integrity: sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-cascade-layers@5.0.2': + resolution: {integrity: sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-function-display-p3-linear@1.0.1': + resolution: {integrity: sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-function@4.0.12': + resolution: {integrity: sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-mix-function@3.0.12': + resolution: {integrity: sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2': + resolution: {integrity: sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-content-alt-text@2.0.8': + resolution: {integrity: sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-contrast-color-function@2.0.12': + resolution: {integrity: sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-exponential-functions@2.0.9': + resolution: {integrity: sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-font-format-keywords@4.0.0': + resolution: {integrity: sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-gamut-mapping@2.0.11': + resolution: {integrity: sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-gradients-interpolation-method@5.0.12': + resolution: {integrity: sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-hwb-function@4.0.12': + resolution: {integrity: sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-ic-unit@4.0.4': + resolution: {integrity: sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-initial@2.0.1': + resolution: {integrity: sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-is-pseudo-class@5.0.3': + resolution: {integrity: sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-light-dark-function@2.0.11': + resolution: {integrity: sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-float-and-clear@3.0.0': + resolution: {integrity: sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-overflow@2.0.0': + resolution: {integrity: sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-overscroll-behavior@2.0.0': + resolution: {integrity: sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-resize@3.0.0': + resolution: {integrity: sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-logical-viewport-units@3.0.4': + resolution: {integrity: sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-media-minmax@2.0.9': + resolution: {integrity: sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5': + resolution: {integrity: sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-nested-calc@4.0.0': + resolution: {integrity: sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-normalize-display-values@4.0.0': + resolution: {integrity: sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-oklab-function@4.0.12': + resolution: {integrity: sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-progressive-custom-properties@4.2.1': + resolution: {integrity: sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-random-function@2.0.1': + resolution: {integrity: sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-relative-color-syntax@3.0.12': + resolution: {integrity: sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-scope-pseudo-class@4.0.1': + resolution: {integrity: sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-sign-functions@1.1.4': + resolution: {integrity: sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-stepped-value-functions@4.0.9': + resolution: {integrity: sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-text-decoration-shorthand@4.0.3': + resolution: {integrity: sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-trigonometric-functions@4.0.9': + resolution: {integrity: sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/postcss-unset-value@4.0.0': + resolution: {integrity: sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/selector-resolve-nested@3.1.0': + resolution: {integrity: sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@csstools/utilities@2.0.0': + resolution: {integrity: sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@docsearch/core@4.3.1': + resolution: {integrity: sha512-ktVbkePE+2h9RwqCUMbWXOoebFyDOxHqImAqfs+lC8yOU+XwEW4jgvHGJK079deTeHtdhUNj0PXHSnhJINvHzQ==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + + '@docsearch/css@4.3.2': + resolution: {integrity: sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==} + + '@docsearch/react@4.3.2': + resolution: {integrity: sha512-74SFD6WluwvgsOPqifYOviEEVwDxslxfhakTlra+JviaNcs7KK/rjsPj89kVEoQc9FUxRkAofaJnHIR7pb4TSQ==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@docusaurus/babel@3.9.2': + resolution: {integrity: sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==} + engines: {node: '>=20.0'} + + '@docusaurus/bundler@3.9.2': + resolution: {integrity: sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==} + engines: {node: '>=20.0'} + peerDependencies: + '@docusaurus/faster': '*' + peerDependenciesMeta: + '@docusaurus/faster': + optional: true + + '@docusaurus/core@3.9.2': + resolution: {integrity: sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==} + engines: {node: '>=20.0'} + hasBin: true + peerDependencies: + '@mdx-js/react': ^3.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/cssnano-preset@3.9.2': + resolution: {integrity: sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==} + engines: {node: '>=20.0'} + + '@docusaurus/logger@3.9.2': + resolution: {integrity: sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==} + engines: {node: '>=20.0'} + + '@docusaurus/mdx-loader@3.9.2': + resolution: {integrity: sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/module-type-aliases@3.9.2': + resolution: {integrity: sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==} + peerDependencies: + react: '*' + react-dom: '*' + + '@docusaurus/plugin-client-redirects@3.9.2': + resolution: {integrity: sha512-lUgMArI9vyOYMzLRBUILcg9vcPTCyyI2aiuXq/4npcMVqOr6GfmwtmBYWSbNMlIUM0147smm4WhpXD0KFboffw==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-content-blog@3.9.2': + resolution: {integrity: sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==} + engines: {node: '>=20.0'} + peerDependencies: + '@docusaurus/plugin-content-docs': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-content-docs@3.9.2': + resolution: {integrity: sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-content-pages@3.9.2': + resolution: {integrity: sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-css-cascade-layers@3.9.2': + resolution: {integrity: sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==} + engines: {node: '>=20.0'} + + '@docusaurus/plugin-debug@3.9.2': + resolution: {integrity: sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-google-analytics@3.9.2': + resolution: {integrity: sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-google-gtag@3.9.2': + resolution: {integrity: sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-google-tag-manager@3.9.2': + resolution: {integrity: sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-sitemap@3.9.2': + resolution: {integrity: sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/plugin-svgr@3.9.2': + resolution: {integrity: sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/preset-classic@3.9.2': + resolution: {integrity: sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/react-loadable@6.0.0': + resolution: {integrity: sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==} + peerDependencies: + react: '*' + + '@docusaurus/theme-classic@3.9.2': + resolution: {integrity: sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/theme-common@3.9.2': + resolution: {integrity: sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==} + engines: {node: '>=20.0'} + peerDependencies: + '@docusaurus/plugin-content-docs': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/theme-search-algolia@3.9.2': + resolution: {integrity: sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==} + engines: {node: '>=20.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/theme-translations@3.9.2': + resolution: {integrity: sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==} + engines: {node: '>=20.0'} + + '@docusaurus/tsconfig@3.9.2': + resolution: {integrity: sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==} + + '@docusaurus/types@3.9.2': + resolution: {integrity: sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@docusaurus/utils-common@3.9.2': + resolution: {integrity: sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==} + engines: {node: '>=20.0'} + + '@docusaurus/utils-validation@3.9.2': + resolution: {integrity: sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==} + engines: {node: '>=20.0'} + + '@docusaurus/utils@3.9.2': + resolution: {integrity: sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==} + engines: {node: '>=20.0'} + + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.2.1': + resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.21.0': + resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.3.1': + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + engines: {node: '>=12'} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@scalar/docusaurus@0.7.21': + resolution: {integrity: sha512-Olh6qK05eC1wK2yoNSx8jkWpr7AUzZTwy8B4jsDzuQYTwyjKHnkWKkQ2UfH3yTRlXWtRH4YtI+eqDuc4ZkY9eQ==} + engines: {node: '>=20'} + peerDependencies: + '@docusaurus/utils': ^3.7.0 + react: ^18.0.0 || ^19.0.0 + + '@scalar/openapi-types@0.5.1': + resolution: {integrity: sha512-8g7s9lPolyDFtijyh3Ob459tpezPuZbkXoFgJwBTHjPZ7ap+TvOJTvLk56CFwxVBVz2BxCzWJqxYyy3FUdeLoA==} + engines: {node: '>=20'} + + '@scalar/types@0.4.0': + resolution: {integrity: sha512-vOD1GZez7kPdVA+UQit05QE9dbALfevhK9kqRTsqcPX7FvvZ9eQWSNl1GKmKtmRiAZGThv2agM5AvHRxkH2JSw==} + engines: {node: '>=20'} + + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@slorber/react-helmet-async@1.3.0': + resolution: {integrity: sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==} + peerDependencies: + react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@slorber/remark-comment@1.0.0': + resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/plugin-svgo@8.1.0': + resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@svgr/webpack@8.1.0': + resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} + engines: {node: '>=14'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.7': + resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} + + '@types/express@4.17.25': + resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + + '@types/gtag.js@0.0.12': + resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/history@4.7.11': + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/http-proxy@1.17.17': + resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node-forge@1.3.14': + resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-router-config@5.0.11': + resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} + + '@types/react-router-dom@5.3.3': + resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + + '@types/react-router@5.1.20': + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + + '@types/react@19.2.17': + resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + + '@types/react@19.2.4': + resolution: {integrity: sha512-tBFxBp9Nfyy5rsmefN+WXc1JeW/j2BpBHFdLZbEVfs9wn3E3NRFxwV0pJg8M1qQAexFpvz73hJXFofV0ZAu92A==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.34': + resolution: {integrity: sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher + + '@vercel/oidc@3.0.3': + resolution: {integrity: sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==} + engines: {node: '>= 20'} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ai@5.0.93: + resolution: {integrity: sha512-9eGcu+1PJgPg4pRNV4L7tLjRR3wdJC9CXQoNMvtqvYNOLZHFCzjHtVIOr2SIkoJJeu2+sOy3hyiSuTmy2MA40g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + algoliasearch-helper@3.26.1: + resolution: {integrity: sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==} + peerDependencies: + algoliasearch: '>= 3.1 < 6' + + algoliasearch@5.43.0: + resolution: {integrity: sha512-hbkK41JsuGYhk+atBDxlcKxskjDCh3OOEDpdKZPtw+3zucBqhlojRG5e5KtCmByGyYvwZswVeaSWglgLn2fibg==} + engines: {node: '>= 14.0.0'} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + autoprefixer@10.4.22: + resolution: {integrity: sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-loader@9.2.1: + resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + + babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.8.28: + resolution: {integrity: sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==} + hasBin: true + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@6.2.1: + resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.0: + resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + + caniuse-lite@1.0.30001754: + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combine-promises@1.2.0: + resolution: {integrity: sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==} + engines: {node: '>=10'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + copy-webpack-plugin@11.0.0: + resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.1.0 + + core-js-compat@3.46.0: + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} + + core-js-pure@3.46.0: + resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==} + + core-js@3.46.0: + resolution: {integrity: sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + css-blank-pseudo@7.0.1: + resolution: {integrity: sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + css-declaration-sorter@7.3.0: + resolution: {integrity: sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + + css-has-pseudo@7.0.3: + resolution: {integrity: sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + css-loader@6.11.0: + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-minimizer-webpack-plugin@5.0.1: + resolution: {integrity: sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + + css-prefers-color-scheme@10.0.0: + resolution: {integrity: sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssdb@8.4.2: + resolution: {integrity: sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssnano-preset-advanced@6.1.2: + resolution: {integrity: sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-preset-default@6.1.2: + resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-utils@4.0.2: + resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano@6.1.2: + resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.3.0: + resolution: {integrity: sha512-Qq68+VkJlc8tjnPV1i7HtbIn7ohmjZa88qUvHMIK0ZKUXMCuV45cT7cEXALPUmeXCe0q1DWQkQTemHVaLIFSrg==} + engines: {node: '>=18'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + detect-port@1.6.1: + resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} + engines: {node: '>= 4.0.0'} + hasBin: true + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.250: + resolution: {integrity: sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + emoticon@4.1.0: + resolution: {integrity: sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-goat@4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.5.0: + resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eta@2.2.0: + resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + engines: {node: '>=6.0.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-loader@6.2.0: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-yarn@3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + history@4.10.1: + resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + html-webpack-plugin@5.6.4: + resolution: {integrity: sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.10: + resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} + + http-proxy-middleware@2.0.9: + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infima@0.2.0-alpha.45: + resolution: {integrity: sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==} + engines: {node: '>=12'} + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + + inline-style-parser@0.2.6: + resolution: {integrity: sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg==} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} + + is-npm@6.1.0: + resolution: {integrity: sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + is-yarn-global@0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + latest-version@7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + + launch-editor@2.12.0: + resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-directive@3.1.0: + resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@4.51.0: + resolution: {integrity: sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A==} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + mini-css-extract-plugin@2.9.4: + resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.5: + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + engines: {node: ^18 || >=20} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} + engines: {node: '>=14.16'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + null-loader@4.0.1: + resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-to-regexp@1.9.0: + resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + + path-to-regexp@3.3.0: + resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + postcss-attribute-case-insensitive@7.0.1: + resolution: {integrity: sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-calc@9.0.1: + resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.2 + + postcss-clamp@4.1.0: + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} + peerDependencies: + postcss: ^8.4.6 + + postcss-color-functional-notation@7.0.12: + resolution: {integrity: sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-color-hex-alpha@10.0.0: + resolution: {integrity: sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-color-rebeccapurple@10.0.0: + resolution: {integrity: sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-colormin@6.1.0: + resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-convert-values@6.1.0: + resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-custom-media@11.0.6: + resolution: {integrity: sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-custom-properties@14.0.6: + resolution: {integrity: sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-custom-selectors@8.0.5: + resolution: {integrity: sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-dir-pseudo-class@9.0.1: + resolution: {integrity: sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-discard-comments@6.0.2: + resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-duplicates@6.0.3: + resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-empty@6.0.3: + resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-overridden@6.0.2: + resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-unused@6.0.5: + resolution: {integrity: sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-double-position-gradients@6.0.4: + resolution: {integrity: sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-focus-visible@10.0.1: + resolution: {integrity: sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-focus-within@9.0.1: + resolution: {integrity: sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-font-variant@5.0.0: + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: ^8.1.0 + + postcss-gap-properties@6.0.0: + resolution: {integrity: sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-image-set-function@7.0.0: + resolution: {integrity: sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-lab-function@7.0.12: + resolution: {integrity: sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-loader@7.3.4: + resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} + engines: {node: '>= 14.15.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + + postcss-logical@8.1.0: + resolution: {integrity: sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-merge-idents@6.0.3: + resolution: {integrity: sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-longhand@6.0.5: + resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-rules@6.1.1: + resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-font-values@6.1.0: + resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-gradients@6.0.3: + resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-params@6.1.0: + resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-selectors@6.0.4: + resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-nesting@13.0.2: + resolution: {integrity: sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-normalize-charset@6.0.2: + resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-display-values@6.0.2: + resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-positions@6.0.2: + resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-repeat-style@6.0.2: + resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-string@6.0.2: + resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-timing-functions@6.0.2: + resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-unicode@6.1.0: + resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-url@6.0.2: + resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-whitespace@6.0.2: + resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-opacity-percentage@3.0.0: + resolution: {integrity: sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-ordered-values@6.0.2: + resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-overflow-shorthand@6.0.0: + resolution: {integrity: sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-page-break@3.0.4: + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: ^8 + + postcss-place@10.0.0: + resolution: {integrity: sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-preset-env@10.4.0: + resolution: {integrity: sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-pseudo-class-any-link@10.0.1: + resolution: {integrity: sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-reduce-idents@6.0.3: + resolution: {integrity: sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-initial@6.1.0: + resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-transforms@6.0.2: + resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-replace-overflow-wrap@4.0.0: + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} + peerDependencies: + postcss: ^8.0.3 + + postcss-selector-not@8.0.1: + resolution: {integrity: sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-sort-media-queries@5.2.0: + resolution: {integrity: sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.4.23 + + postcss-svgo@6.0.3: + resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} + engines: {node: ^14 || ^16 || >= 18} + peerDependencies: + postcss: ^8.4.31 + + postcss-unique-selectors@6.0.4: + resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss-zindex@6.0.2: + resolution: {integrity: sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + + pretty-time@1.1.0: + resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} + engines: {node: '>=4'} + + prism-react-renderer@2.4.1: + resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} + peerDependencies: + react: '>=16.0.0' + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pupa@3.3.0: + resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} + engines: {node: '>=12.20'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} + peerDependencies: + react: ^19.2.7 + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-json-view-lite@2.5.0: + resolution: {integrity: sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==} + engines: {node: '>=18'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + + react-loadable-ssr-addon-v5-slorber@1.0.1: + resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} + engines: {node: '>=10.13.0'} + peerDependencies: + react-loadable: '*' + webpack: '>=4.41.1 || 5.x' + + react-router-config@5.1.1: + resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} + peerDependencies: + react: '>=15' + react-router: '>=5' + + react-router-dom@5.3.4: + resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} + peerDependencies: + react: '>=15' + + react-router@5.3.4: + resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} + peerDependencies: + react: '>=15' + + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + registry-auth-token@5.1.0: + resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remark-directive@3.0.1: + resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==} + + remark-emoji@4.0.1: + resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pathname@3.0.0: + resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rtlcss@4.3.0: + resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==} + engines: {node: '>=12.0.0'} + hasBin: true + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.3: + resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + schema-dts@1.1.5: + resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-handler@6.1.6: + resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@7.1.2: + resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + sort-css-media-queries@2.2.0: + resolution: {integrity: sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==} + engines: {node: '>= 6.3.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-js@1.1.19: + resolution: {integrity: sha512-Ev+SgeqiNGT1ufsXyVC5RrJRXdrkRJ1Gol9Qw7Pb72YCKJXrBvP0ckZhBeVSrw2m06DJpei2528uIpjMb4TsoQ==} + + style-to-object@1.0.12: + resolution: {integrity: sha512-ddJqYnoT4t97QvN2C95bCgt+m7AAgXjVnkk/jxAfmp7EAB8nnqqZYEbMd3em7/vEomDb2LAQKAy1RFfv41mdNw==} + + stylehacks@6.1.1: + resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + swr@2.3.6: + resolution: {integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.44.1: + resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + engines: {node: '>=10'} + hasBin: true + + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@5.0.0: + resolution: {integrity: sha512-GeJop7+u7BYlQ6yQCAY1nBQiRSHR+6OdCEtd8Bwp9a3NK3+fWAVjOaPKJDteB9f6cIJ0wt4IfnScjLG450EpXA==} + engines: {node: '>=20'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-notifier@6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-loader@4.1.1: + resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + file-loader: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + file-loader: + optional: true + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + value-equal@1.0.1: + resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webpack-bundle-analyzer@4.10.2: + resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} + engines: {node: '>= 10.13.0'} + hasBin: true + + webpack-dev-middleware@7.4.5: + resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.2.2: + resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack@5.102.1: + resolution: {integrity: sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + webpackbar@6.0.1: + resolution: {integrity: sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==} + engines: {node: '>=14.21.3'} + peerDependencies: + webpack: 3 || 4 || 5 + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + zod@4.1.11: + resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} + + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ai-sdk/gateway@2.0.9(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.17(zod@4.1.12) + '@vercel/oidc': 3.0.3 + zod: 4.1.12 + + '@ai-sdk/provider-utils@3.0.17(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 4.1.12 + + '@ai-sdk/provider@2.0.0': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@2.0.93(react@19.2.7)(zod@4.1.12)': + dependencies: + '@ai-sdk/provider-utils': 3.0.17(zod@4.1.12) + ai: 5.0.93(zod@4.1.12) + react: 19.2.7 + swr: 2.3.6(react@19.2.7) + throttleit: 2.1.0 + optionalDependencies: + zod: 4.1.12 + + '@algolia/abtesting@1.9.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/autocomplete-core@1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-shared@1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)': + dependencies: + '@algolia/client-search': 5.43.0 + algoliasearch: 5.43.0 + + '@algolia/client-abtesting@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-analytics@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-common@5.43.0': {} + + '@algolia/client-insights@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-personalization@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-query-suggestions@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-search@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/events@4.0.1': {} + + '@algolia/ingestion@1.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/monitoring@1.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/recommend@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/requester-browser-xhr@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + + '@algolia/requester-fetch@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + + '@algolia/requester-node-http@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-constant-elements@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-runtime@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.5) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.5) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.5) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) + core-js-compat: 3.46.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.5 + esutils: 2.0.3 + + '@babel/preset-react@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + '@babel/runtime-corejs3@7.28.4': + dependencies: + core-js-pure: 3.46.0 + + '@babel/runtime@7.28.4': {} + + '@babel/runtime@7.29.7': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@colors/colors@1.5.0': + optional: true + + '@csstools/cascade-layer-name-parser@2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/postcss-alpha-function@1.0.1(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-cascade-layers@5.0.2(postcss@8.5.6)': + dependencies: + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + '@csstools/postcss-color-function-display-p3-linear@1.0.1(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-color-function@4.0.12(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-color-mix-function@3.0.12(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-content-alt-text@2.0.8(postcss@8.5.6)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-contrast-color-function@2.0.12(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-exponential-functions@2.0.9(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-font-format-keywords@4.0.0(postcss@8.5.6)': + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-gamut-mapping@2.0.11(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-gradients-interpolation-method@5.0.12(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-hwb-function@4.0.12(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-ic-unit@4.0.4(postcss@8.5.6)': + dependencies: + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-initial@2.0.1(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/postcss-is-pseudo-class@5.0.3(postcss@8.5.6)': + dependencies: + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + '@csstools/postcss-light-dark-function@2.0.11(postcss@8.5.6)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/postcss-logical-overflow@2.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/postcss-logical-resize@3.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-logical-viewport-units@3.0.4(postcss@8.5.6)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-media-minmax@2.0.9(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + postcss: 8.5.6 + + '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5(postcss@8.5.6)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + postcss: 8.5.6 + + '@csstools/postcss-nested-calc@4.0.0(postcss@8.5.6)': + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-normalize-display-values@4.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-oklab-function@4.0.12(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-progressive-custom-properties@4.2.1(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-random-function@2.0.1(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-relative-color-syntax@3.0.12(postcss@8.5.6)': + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + '@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + '@csstools/postcss-sign-functions@1.1.4(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-stepped-value-functions@4.0.9(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-text-decoration-shorthand@4.0.3(postcss@8.5.6)': + dependencies: + '@csstools/color-helpers': 5.1.0 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + '@csstools/postcss-trigonometric-functions@4.0.9(postcss@8.5.6)': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + + '@csstools/postcss-unset-value@4.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@csstools/utilities@2.0.0(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@discoveryjs/json-ext@0.5.7': {} + + '@docsearch/core@4.3.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + optionalDependencies: + '@types/react': 19.2.17 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@docsearch/css@4.3.2': {} + + '@docsearch/react@4.3.2(@algolia/client-search@5.43.0)(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)': + dependencies: + '@ai-sdk/react': 2.0.93(react@19.2.7)(zod@4.1.12) + '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)(search-insights@2.17.3) + '@docsearch/core': 4.3.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docsearch/css': 4.3.2 + ai: 5.0.93(zod@4.1.12) + algoliasearch: 5.43.0 + marked: 16.4.2 + zod: 4.1.12 + optionalDependencies: + '@types/react': 19.2.17 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@docusaurus/babel@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/core': 7.28.5 + '@babel/generator': 7.28.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.5) + '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.28.5) + '@babel/preset-env': 7.28.5(@babel/core@7.28.5) + '@babel/preset-react': 7.28.5(@babel/core@7.28.5) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) + '@babel/runtime': 7.28.4 + '@babel/runtime-corejs3': 7.28.4 + '@babel/traverse': 7.28.5 + '@docusaurus/logger': 3.9.2 + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + babel-plugin-dynamic-import-node: 2.3.3 + fs-extra: 11.3.2 + tslib: 2.8.1 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/bundler@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@babel/core': 7.28.5 + '@docusaurus/babel': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/cssnano-preset': 3.9.2 + '@docusaurus/logger': 3.9.2 + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + babel-loader: 9.2.1(@babel/core@7.28.5)(webpack@5.102.1) + clean-css: 5.3.3 + copy-webpack-plugin: 11.0.0(webpack@5.102.1) + css-loader: 6.11.0(webpack@5.102.1) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.102.1) + cssnano: 6.1.2(postcss@8.5.6) + file-loader: 6.2.0(webpack@5.102.1) + html-minifier-terser: 7.2.0 + mini-css-extract-plugin: 2.9.4(webpack@5.102.1) + null-loader: 4.0.1(webpack@5.102.1) + postcss: 8.5.6 + postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.6.3)(webpack@5.102.1) + postcss-preset-env: 10.4.0(postcss@8.5.6) + terser-webpack-plugin: 5.3.14(webpack@5.102.1) + tslib: 2.8.1 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) + webpack: 5.102.1 + webpackbar: 6.0.1(webpack@5.102.1) + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - csso + - esbuild + - lightningcss + - react + - react-dom + - supports-color + - typescript + - uglify-js + - webpack-cli + + '@docusaurus/core@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/babel': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/bundler': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/logger': 3.9.2 + '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.7) + boxen: 6.2.1 + chalk: 4.1.2 + chokidar: 3.6.0 + cli-table3: 0.6.5 + combine-promises: 1.2.0 + commander: 5.1.0 + core-js: 3.46.0 + detect-port: 1.6.1 + escape-html: 1.0.3 + eta: 2.2.0 + eval: 0.1.8 + execa: 5.1.1 + fs-extra: 11.3.2 + html-tags: 3.3.1 + html-webpack-plugin: 5.6.4(webpack@5.102.1) + leven: 3.1.0 + lodash: 4.17.21 + open: 8.4.2 + p-map: 4.0.0 + prompts: 2.4.2 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)' + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.7)' + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@19.2.7))(webpack@5.102.1) + react-router: 5.3.4(react@19.2.7) + react-router-config: 5.1.1(react-router@5.3.4(react@19.2.7))(react@19.2.7) + react-router-dom: 5.3.4(react@19.2.7) + semver: 7.7.3 + serve-handler: 6.1.6 + tinypool: 1.1.1 + tslib: 2.8.1 + update-notifier: 6.0.2 + webpack: 5.102.1 + webpack-bundle-analyzer: 4.10.2 + webpack-dev-server: 5.2.2(webpack@5.102.1) + webpack-merge: 6.0.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/cssnano-preset@3.9.2': + dependencies: + cssnano-preset-advanced: 6.1.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-sort-media-queries: 5.2.0(postcss@8.5.6) + tslib: 2.8.1 + + '@docusaurus/logger@3.9.2': + dependencies: + chalk: 4.1.2 + tslib: 2.8.1 + + '@docusaurus/mdx-loader@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/logger': 3.9.2 + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@mdx-js/mdx': 3.1.1 + '@slorber/remark-comment': 1.0.0 + escape-html: 1.0.3 + estree-util-value-to-estree: 3.5.0 + file-loader: 6.2.0(webpack@5.102.1) + fs-extra: 11.3.2 + image-size: 2.0.2 + mdast-util-mdx: 3.0.0 + mdast-util-to-string: 4.0.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + rehype-raw: 7.0.0 + remark-directive: 3.0.1 + remark-emoji: 4.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.1 + stringify-object: 3.3.0 + tslib: 2.8.1 + unified: 11.0.5 + unist-util-visit: 5.0.0 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) + vfile: 6.0.3 + webpack: 5.102.1 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/module-type-aliases@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/history': 4.7.11 + '@types/react': 19.2.4 + '@types/react-router-config': 5.0.11 + '@types/react-router-dom': 5.3.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)' + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.7)' + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/plugin-client-redirects@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/logger': 3.9.2 + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + eta: 2.2.0 + fs-extra: 11.3.2 + lodash: 4.17.21 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-content-blog@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/logger': 3.9.2 + '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + cheerio: 1.0.0-rc.12 + feed: 4.2.2 + fs-extra: 11.3.2 + lodash: 4.17.21 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + schema-dts: 1.1.5 + srcset: 4.0.0 + tslib: 2.8.1 + unist-util-visit: 5.0.0 + utility-types: 3.11.0 + webpack: 5.102.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/logger': 3.9.2 + '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/module-type-aliases': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/react-router-config': 5.0.11 + combine-promises: 1.2.0 + fs-extra: 11.3.2 + js-yaml: 4.1.1 + lodash: 4.17.21 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + schema-dts: 1.1.5 + tslib: 2.8.1 + utility-types: 3.11.0 + webpack: 5.102.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-content-pages@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + fs-extra: 11.3.2 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + webpack: 5.102.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-css-cascade-layers@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - react + - react-dom + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-debug@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + fs-extra: 11.3.2 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-json-view-lite: 2.5.0(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-google-analytics@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-google-gtag@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/gtag.js': 0.0.12 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-google-tag-manager@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-sitemap@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/logger': 3.9.2 + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + fs-extra: 11.3.2 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + sitemap: 7.1.2 + tslib: 2.8.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/plugin-svgr@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/webpack': 8.1.0(typescript@5.6.3) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + webpack: 5.102.1 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/preset-classic@3.9.2(@algolia/client-search@5.43.0)(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-css-cascade-layers': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-debug': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-google-analytics': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-google-gtag': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-google-tag-manager': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-sitemap': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-svgr': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/theme-classic': 3.9.2(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-search-algolia': 3.9.2(@algolia/client-search@5.43.0)(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)(typescript@5.6.3) + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/react-loadable@6.0.0(react@19.2.7)': + dependencies: + '@types/react': 19.2.4 + react: 19.2.7 + + '@docusaurus/theme-classic@3.9.2(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/logger': 3.9.2 + '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/module-type-aliases': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-translations': 3.9.2 + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.7) + clsx: 2.1.1 + infima: 0.2.0-alpha.45 + lodash: 4.17.21 + nprogress: 0.2.0 + postcss: 8.5.6 + prism-react-renderer: 2.4.1(react@19.2.7) + prismjs: 1.30.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-router-dom: 5.3.4(react@19.2.7) + rtlcss: 4.3.0 + tslib: 2.8.1 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@docusaurus/faster' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/module-type-aliases': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@types/history': 4.7.11 + '@types/react': 19.2.17 + '@types/react-router-config': 5.0.11 + clsx: 2.1.1 + parse-numeric-range: 1.3.0 + prism-react-renderer: 2.4.1(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.43.0)(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3)(typescript@5.6.3)': + dependencies: + '@docsearch/react': 4.3.2(@algolia/client-search@5.43.0)(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(search-insights@2.17.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/logger': 3.9.2 + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.6.3))(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/theme-translations': 3.9.2 + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + algoliasearch: 5.43.0 + algoliasearch-helper: 3.26.1(algoliasearch@5.43.0) + clsx: 2.1.1 + eta: 2.2.0 + fs-extra: 11.3.2 + lodash: 4.17.21 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + tslib: 2.8.1 + utility-types: 3.11.0 + transitivePeerDependencies: + - '@algolia/client-search' + - '@docusaurus/faster' + - '@mdx-js/react' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/react' + - bufferutil + - csso + - debug + - esbuild + - lightningcss + - search-insights + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + + '@docusaurus/theme-translations@3.9.2': + dependencies: + fs-extra: 11.3.2 + tslib: 2.8.1 + + '@docusaurus/tsconfig@3.9.2': {} + + '@docusaurus/types@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@mdx-js/mdx': 3.1.1 + '@types/history': 4.7.11 + '@types/mdast': 4.0.4 + '@types/react': 19.2.4 + commander: 5.1.0 + joi: 17.13.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)' + utility-types: 3.11.0 + webpack: 5.102.1 + webpack-merge: 5.10.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils-common@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils-validation@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/logger': 3.9.2 + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + fs-extra: 11.3.2 + joi: 17.13.3 + js-yaml: 4.1.1 + lodash: 4.17.21 + tslib: 2.8.1 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@docusaurus/utils@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/logger': 3.9.2 + '@docusaurus/types': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@docusaurus/utils-common': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + escape-string-regexp: 4.0.0 + execa: 5.1.1 + file-loader: 6.2.0(webpack@5.102.1) + fs-extra: 11.3.2 + github-slugger: 1.5.0 + globby: 11.1.0 + gray-matter: 4.0.3 + jiti: 1.21.7 + js-yaml: 4.1.1 + lodash: 4.17.21 + micromatch: 4.0.8 + p-queue: 6.6.2 + prompts: 2.4.2 + resolve-pathname: 3.0.0 + tslib: 2.8.1 + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1) + utility-types: 3.11.0 + webpack: 5.102.1 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - react + - react-dom + - supports-color + - uglify-js + - webpack-cli + + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.10.1 + '@types/yargs': 17.0.34 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.15.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.2.17 + react: 19.2.7 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@opentelemetry/api@1.9.0': {} + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.3.1': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@polka/url@1.0.0-next.29': {} + + '@scalar/docusaurus@0.7.21(@docusaurus/utils@3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)': + dependencies: + '@docusaurus/utils': 3.9.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@scalar/types': 0.4.0 + react: 19.2.7 + + '@scalar/openapi-types@0.5.1': + dependencies: + zod: 4.1.11 + + '@scalar/types@0.4.0': + dependencies: + '@scalar/openapi-types': 0.5.1 + nanoid: 5.1.5 + type-fest: 5.0.0 + zod: 4.1.11 + + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@4.6.0': {} + + '@sindresorhus/is@5.6.0': {} + + '@slorber/react-helmet-async@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + invariant: 2.2.4 + prop-types: 15.8.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-fast-compare: 3.2.2 + shallowequal: 1.1.0 + + '@slorber/remark-comment@1.0.0': + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + + '@standard-schema/spec@1.0.0': {} + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + + '@svgr/babel-preset@8.1.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.28.5) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.5) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.5) + + '@svgr/core@8.1.0(typescript@5.6.3)': + dependencies: + '@babel/core': 7.28.5 + '@svgr/babel-preset': 8.1.0(@babel/core@7.28.5) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.6.3) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.28.5 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))': + dependencies: + '@babel/core': 7.28.5 + '@svgr/babel-preset': 8.1.0(@babel/core@7.28.5) + '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3)': + dependencies: + '@svgr/core': 8.1.0(typescript@5.6.3) + cosmiconfig: 8.3.6(typescript@5.6.3) + deepmerge: 4.3.1 + svgo: 3.3.2 + transitivePeerDependencies: + - typescript + + '@svgr/webpack@8.1.0(typescript@5.6.3)': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.5) + '@babel/preset-env': 7.28.5(@babel/core@7.28.5) + '@babel/preset-react': 7.28.5(@babel/core@7.28.5) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) + '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3) + transitivePeerDependencies: + - supports-color + - typescript + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@trysound/sax@0.2.0': {} + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 24.10.1 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 24.10.1 + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 4.19.7 + '@types/node': 24.10.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 24.10.1 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@4.19.7': + dependencies: + '@types/node': 24.10.1 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@4.17.25': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.7 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.10 + + '@types/gtag.js@0.0.12': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/history@4.7.11': {} + + '@types/html-minifier-terser@6.1.0': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/http-errors@2.0.5': {} + + '@types/http-proxy@1.17.17': + dependencies: + '@types/node': 24.10.1 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/mime@1.3.5': {} + + '@types/ms@2.1.0': {} + + '@types/node-forge@1.3.14': + dependencies: + '@types/node': 24.10.1 + + '@types/node@17.0.45': {} + + '@types/node@24.10.1': + dependencies: + undici-types: 7.16.0 + + '@types/prismjs@1.26.5': {} + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-router-config@5.0.11': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.2.4 + '@types/react-router': 5.1.20 + + '@types/react-router-dom@5.3.3': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.2.4 + '@types/react-router': 5.1.20 + + '@types/react-router@5.1.20': + dependencies: + '@types/history': 4.7.11 + '@types/react': 19.2.4 + + '@types/react@19.2.17': + dependencies: + csstype: 3.2.3 + + '@types/react@19.2.4': + dependencies: + csstype: 3.1.3 + + '@types/retry@0.12.2': {} + + '@types/sax@1.2.7': + dependencies: + '@types/node': 17.0.45 + + '@types/send@0.17.6': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 24.10.1 + + '@types/send@1.2.1': + dependencies: + '@types/node': 24.10.1 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.25 + + '@types/serve-static@1.15.10': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 24.10.1 + '@types/send': 0.17.6 + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 24.10.1 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 24.10.1 + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.34': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@ungap/structured-clone@1.3.0': {} + + '@vercel/oidc@3.0.3': {} + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + address@1.2.2: {} + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ai@5.0.93(zod@4.1.12): + dependencies: + '@ai-sdk/gateway': 2.0.9(zod@4.1.12) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.17(zod@4.1.12) + '@opentelemetry/api': 1.9.0 + zod: 4.1.12 + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch-helper@3.26.1(algoliasearch@5.43.0): + dependencies: + '@algolia/events': 4.0.1 + algoliasearch: 5.43.0 + + algoliasearch@5.43.0: + dependencies: + '@algolia/abtesting': 1.9.0 + '@algolia/client-abtesting': 5.43.0 + '@algolia/client-analytics': 5.43.0 + '@algolia/client-common': 5.43.0 + '@algolia/client-insights': 5.43.0 + '@algolia/client-personalization': 5.43.0 + '@algolia/client-query-suggestions': 5.43.0 + '@algolia/client-search': 5.43.0 + '@algolia/ingestion': 1.43.0 + '@algolia/monitoring': 1.43.0 + '@algolia/recommend': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-html-community@0.0.8: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-flatten@1.1.1: {} + + array-union@2.1.0: {} + + astring@1.9.0: {} + + autoprefixer@10.4.22(postcss@8.5.6): + dependencies: + browserslist: 4.28.0 + caniuse-lite: 1.0.30001754 + fraction.js: 5.3.4 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + babel-loader@9.2.1(@babel/core@7.28.5)(webpack@5.102.1): + dependencies: + '@babel/core': 7.28.5 + find-cache-dir: 4.0.0 + schema-utils: 4.3.3 + webpack: 5.102.1 + + babel-plugin-dynamic-import-node@2.3.3: + dependencies: + object.assign: 4.1.7 + + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + core-js-compat: 3.46.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.8.28: {} + + batch@0.6.1: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.3.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + boolbase@1.0.0: {} + + boxen@6.2.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + boxen@7.1.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.0: + dependencies: + baseline-browser-mapping: 2.8.28 + caniuse-lite: 1.0.30001754 + electron-to-chromium: 1.5.250 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.28.0) + + buffer-from@1.1.2: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + bytes@3.0.0: {} + + bytes@3.1.2: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.1.0 + responselike: 3.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + camelcase@6.3.0: {} + + camelcase@7.0.1: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.28.0 + caniuse-lite: 1.0.30001754 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001754: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + char-regex@1.0.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.0.0-rc.12: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + htmlparser2: 8.0.2 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + clean-stack@2.2.0: {} + + cli-boxes@3.0.0: {} + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@2.0.20: {} + + combine-promises@1.2.0: {} + + comma-separated-tokens@2.0.3: {} + + commander@10.0.1: {} + + commander@2.20.3: {} + + commander@5.1.0: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + common-path-prefix@3.0.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@6.0.0: + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.11 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + + connect-history-api-fallback@2.0.0: {} + + consola@3.4.2: {} + + content-disposition@0.5.2: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + copy-webpack-plugin@11.0.0(webpack@5.102.1): + dependencies: + fast-glob: 3.3.3 + glob-parent: 6.0.2 + globby: 13.2.2 + normalize-path: 3.0.0 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + webpack: 5.102.1 + + core-js-compat@3.46.0: + dependencies: + browserslist: 4.28.0 + + core-js-pure@3.46.0: {} + + core-js@3.46.0: {} + + core-util-is@1.0.3: {} + + cosmiconfig@8.3.6(typescript@5.6.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.6.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + + css-blank-pseudo@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + css-declaration-sorter@7.3.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + css-has-pseudo@7.0.3(postcss@8.5.6): + dependencies: + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + css-loader@6.11.0(webpack@5.102.1): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + postcss-value-parser: 4.2.0 + semver: 7.7.3 + optionalDependencies: + webpack: 5.102.1 + + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.102.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + cssnano: 6.1.2(postcss@8.5.6) + jest-worker: 29.7.0 + postcss: 8.5.6 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + webpack: 5.102.1 + optionalDependencies: + clean-css: 5.3.3 + + css-prefers-color-scheme@10.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + cssdb@8.4.2: {} + + cssesc@3.0.0: {} + + cssnano-preset-advanced@6.1.2(postcss@8.5.6): + dependencies: + autoprefixer: 10.4.22(postcss@8.5.6) + browserslist: 4.28.0 + cssnano-preset-default: 6.1.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-discard-unused: 6.0.5(postcss@8.5.6) + postcss-merge-idents: 6.0.3(postcss@8.5.6) + postcss-reduce-idents: 6.0.3(postcss@8.5.6) + postcss-zindex: 6.0.2(postcss@8.5.6) + + cssnano-preset-default@6.1.2(postcss@8.5.6): + dependencies: + browserslist: 4.28.0 + css-declaration-sorter: 7.3.0(postcss@8.5.6) + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 9.0.1(postcss@8.5.6) + postcss-colormin: 6.1.0(postcss@8.5.6) + postcss-convert-values: 6.1.0(postcss@8.5.6) + postcss-discard-comments: 6.0.2(postcss@8.5.6) + postcss-discard-duplicates: 6.0.3(postcss@8.5.6) + postcss-discard-empty: 6.0.3(postcss@8.5.6) + postcss-discard-overridden: 6.0.2(postcss@8.5.6) + postcss-merge-longhand: 6.0.5(postcss@8.5.6) + postcss-merge-rules: 6.1.1(postcss@8.5.6) + postcss-minify-font-values: 6.1.0(postcss@8.5.6) + postcss-minify-gradients: 6.0.3(postcss@8.5.6) + postcss-minify-params: 6.1.0(postcss@8.5.6) + postcss-minify-selectors: 6.0.4(postcss@8.5.6) + postcss-normalize-charset: 6.0.2(postcss@8.5.6) + postcss-normalize-display-values: 6.0.2(postcss@8.5.6) + postcss-normalize-positions: 6.0.2(postcss@8.5.6) + postcss-normalize-repeat-style: 6.0.2(postcss@8.5.6) + postcss-normalize-string: 6.0.2(postcss@8.5.6) + postcss-normalize-timing-functions: 6.0.2(postcss@8.5.6) + postcss-normalize-unicode: 6.1.0(postcss@8.5.6) + postcss-normalize-url: 6.0.2(postcss@8.5.6) + postcss-normalize-whitespace: 6.0.2(postcss@8.5.6) + postcss-ordered-values: 6.0.2(postcss@8.5.6) + postcss-reduce-initial: 6.1.0(postcss@8.5.6) + postcss-reduce-transforms: 6.0.2(postcss@8.5.6) + postcss-svgo: 6.0.3(postcss@8.5.6) + postcss-unique-selectors: 6.0.4(postcss@8.5.6) + + cssnano-utils@4.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@6.1.2(postcss@8.5.6): + dependencies: + cssnano-preset-default: 6.1.2(postcss@8.5.6) + lilconfig: 3.1.3 + postcss: 8.5.6 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + csstype@3.1.3: {} + + csstype@3.2.3: {} + + debounce@1.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + deepmerge@4.3.1: {} + + default-browser-id@5.0.0: {} + + default-browser@5.3.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + depd@1.1.2: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-node@2.1.0: {} + + detect-port@1.6.1: + dependencies: + address: 1.2.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + dom-converter@0.2.0: + dependencies: + utila: 0.4.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.250: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojilib@2.4.0: {} + + emojis-list@3.0.0: {} + + emoticon@4.1.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@2.2.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.15.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + + escalade@3.2.0: {} + + escape-goat@4.0.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-value-to-estree@3.5.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + eta@2.2.0: {} + + etag@1.8.1: {} + + eval@0.1.8: + dependencies: + '@types/node': 24.10.1 + require-like: 0.1.2 + + eventemitter3@4.0.7: {} + + events@3.3.0: {} + + eventsource-parser@3.0.6: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-uri@3.1.0: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + feed@4.2.2: + dependencies: + xml-js: 1.6.11 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-loader@6.2.0(webpack@5.102.1): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.102.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@4.0.0: + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + flat@5.0.2: {} + + follow-redirects@1.15.11: {} + + form-data-encoder@2.1.4: {} + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fraction.js@5.3.4: {} + + fresh@0.5.2: {} + + fs-extra@11.3.2: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-own-enumerable-property-symbols@3.0.2: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + github-slugger@1.5.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + glob-to-regexp@0.4.1: {} + + global-dirs@3.0.1: + dependencies: + ini: 2.0.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + + gopd@1.2.0: {} + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + handle-thing@2.0.1: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-yarn@3.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.19 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.19 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + he@1.2.0: {} + + history@4.10.1: + dependencies: + '@babel/runtime': 7.28.4 + loose-envify: 1.4.0 + resolve-pathname: 3.0.0 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + value-equal: 1.0.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-escaper@2.0.2: {} + + html-minifier-terser@6.1.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.44.1 + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.44.1 + + html-tags@3.3.1: {} + + html-void-elements@3.0.0: {} + + html-webpack-plugin@5.6.4(webpack@5.102.1): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.3.0 + optionalDependencies: + webpack: 5.102.1 + + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-cache-semantics@4.2.0: {} + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.10: {} + + http-proxy-middleware@2.0.9(@types/express@4.17.25): + dependencies: + '@types/http-proxy': 1.17.17 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.25 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.11 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + human-signals@2.1.0: {} + + hyperdyperid@1.2.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + ignore@5.3.2: {} + + image-size@2.0.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + infima@0.2.0-alpha.45: {} + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@2.0.0: {} + + inline-style-parser@0.2.6: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-decimal@2.0.1: {} + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-installed-globally@0.4.0: + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + + is-network-error@1.3.0: {} + + is-npm@6.1.0: {} + + is-number@7.0.0: {} + + is-obj@1.0.1: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@3.0.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regexp@1.0.0: {} + + is-stream@2.0.1: {} + + is-typedarray@1.0.0: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is-yarn-global@0.4.1: {} + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 24.10.1 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-worker@27.5.1: + dependencies: + '@types/node': 24.10.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest-worker@29.7.0: + dependencies: + '@types/node': 24.10.1 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.7: {} + + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + latest-version@7.0.0: + dependencies: + package-json: 8.1.1 + + launch-editor@2.12.0: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.3 + + leven@3.1.0: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.1: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.debounce@4.0.8: {} + + lodash.memoize@4.1.2: {} + + lodash.uniq@4.5.0: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lowercase-keys@3.0.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + markdown-extensions@2.0.0: {} + + markdown-table@2.0.0: + dependencies: + repeat-string: 1.6.1 + + markdown-table@3.0.4: {} + + marked@16.4.2: {} + + math-intrinsics@1.1.0: {} + + mdast-util-directive@3.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-visit-parents: 6.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + media-typer@0.3.0: {} + + memfs@4.51.0: + dependencies: + '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@1.1.0: {} + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@1.1.0: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.33.0: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.18: + dependencies: + mime-db: 1.33.0 + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + mini-css-extract-plugin@2.9.4(webpack@5.102.1): + dependencies: + schema-utils: 4.3.3 + tapable: 2.3.0 + webpack: 5.102.1 + + minimalistic-assert@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimist@1.2.8: {} + + mrmime@2.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + nanoid@3.3.11: {} + + nanoid@5.1.5: {} + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neo-async@2.6.2: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + + node-forge@1.3.1: {} + + node-releases@2.0.27: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@8.1.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + null-loader@4.0.1(webpack@5.102.1): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.102.1 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.1.0: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@10.2.0: + dependencies: + default-browser: 5.3.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + opener@1.5.2: {} + + p-cancelable@3.0.0: {} + + p-finally@1.0.0: {} + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.2 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.3.0 + retry: 0.13.1 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.1.0 + registry-url: 6.0.1 + semver: 7.7.3 + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-numeric-range@1.3.0: {} + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-exists@5.0.0: {} + + path-is-inside@1.0.2: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@0.1.12: {} + + path-to-regexp@1.9.0: + dependencies: + isarray: 0.0.1 + + path-to-regexp@3.3.0: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pkg-dir@7.0.0: + dependencies: + find-up: 6.3.0 + + postcss-attribute-case-insensitive@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-calc@9.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-clamp@4.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-color-functional-notation@7.0.12(postcss@8.5.6): + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-color-hex-alpha@10.0.0(postcss@8.5.6): + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-color-rebeccapurple@10.0.0(postcss@8.5.6): + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-colormin@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.28.0 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-convert-values@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.28.0 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-custom-media@11.0.6(postcss@8.5.6): + dependencies: + '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + postcss: 8.5.6 + + postcss-custom-properties@14.0.6(postcss@8.5.6): + dependencies: + '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-custom-selectors@8.0.5(postcss@8.5.6): + dependencies: + '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-dir-pseudo-class@9.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-discard-comments@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-duplicates@6.0.3(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-empty@6.0.3(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-overridden@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-discard-unused@6.0.5(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-double-position-gradients@6.0.4(postcss@8.5.6): + dependencies: + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-focus-visible@10.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-focus-within@9.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-font-variant@5.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-gap-properties@6.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-image-set-function@7.0.0(postcss@8.5.6): + dependencies: + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-lab-function@7.0.12(postcss@8.5.6): + dependencies: + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/utilities': 2.0.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.6.3)(webpack@5.102.1): + dependencies: + cosmiconfig: 8.3.6(typescript@5.6.3) + jiti: 1.21.7 + postcss: 8.5.6 + semver: 7.7.3 + webpack: 5.102.1 + transitivePeerDependencies: + - typescript + + postcss-logical@8.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-merge-idents@6.0.3(postcss@8.5.6): + dependencies: + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-merge-longhand@6.0.5(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + stylehacks: 6.1.1(postcss@8.5.6) + + postcss-merge-rules@6.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.28.0 + caniuse-api: 3.0.0 + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-minify-font-values@6.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@6.0.3(postcss@8.5.6): + dependencies: + colord: 2.9.3 + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-params@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.28.0 + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@6.0.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-nesting@13.0.2(postcss@8.5.6): + dependencies: + '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.0) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-normalize-charset@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-normalize-display-values@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.28.0 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-opacity-percentage@3.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-ordered-values@6.0.2(postcss@8.5.6): + dependencies: + cssnano-utils: 4.0.2(postcss@8.5.6) + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-overflow-shorthand@6.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-page-break@3.0.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-place@10.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-preset-env@10.4.0(postcss@8.5.6): + dependencies: + '@csstools/postcss-alpha-function': 1.0.1(postcss@8.5.6) + '@csstools/postcss-cascade-layers': 5.0.2(postcss@8.5.6) + '@csstools/postcss-color-function': 4.0.12(postcss@8.5.6) + '@csstools/postcss-color-function-display-p3-linear': 1.0.1(postcss@8.5.6) + '@csstools/postcss-color-mix-function': 3.0.12(postcss@8.5.6) + '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.2(postcss@8.5.6) + '@csstools/postcss-content-alt-text': 2.0.8(postcss@8.5.6) + '@csstools/postcss-contrast-color-function': 2.0.12(postcss@8.5.6) + '@csstools/postcss-exponential-functions': 2.0.9(postcss@8.5.6) + '@csstools/postcss-font-format-keywords': 4.0.0(postcss@8.5.6) + '@csstools/postcss-gamut-mapping': 2.0.11(postcss@8.5.6) + '@csstools/postcss-gradients-interpolation-method': 5.0.12(postcss@8.5.6) + '@csstools/postcss-hwb-function': 4.0.12(postcss@8.5.6) + '@csstools/postcss-ic-unit': 4.0.4(postcss@8.5.6) + '@csstools/postcss-initial': 2.0.1(postcss@8.5.6) + '@csstools/postcss-is-pseudo-class': 5.0.3(postcss@8.5.6) + '@csstools/postcss-light-dark-function': 2.0.11(postcss@8.5.6) + '@csstools/postcss-logical-float-and-clear': 3.0.0(postcss@8.5.6) + '@csstools/postcss-logical-overflow': 2.0.0(postcss@8.5.6) + '@csstools/postcss-logical-overscroll-behavior': 2.0.0(postcss@8.5.6) + '@csstools/postcss-logical-resize': 3.0.0(postcss@8.5.6) + '@csstools/postcss-logical-viewport-units': 3.0.4(postcss@8.5.6) + '@csstools/postcss-media-minmax': 2.0.9(postcss@8.5.6) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 3.0.5(postcss@8.5.6) + '@csstools/postcss-nested-calc': 4.0.0(postcss@8.5.6) + '@csstools/postcss-normalize-display-values': 4.0.0(postcss@8.5.6) + '@csstools/postcss-oklab-function': 4.0.12(postcss@8.5.6) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.6) + '@csstools/postcss-random-function': 2.0.1(postcss@8.5.6) + '@csstools/postcss-relative-color-syntax': 3.0.12(postcss@8.5.6) + '@csstools/postcss-scope-pseudo-class': 4.0.1(postcss@8.5.6) + '@csstools/postcss-sign-functions': 1.1.4(postcss@8.5.6) + '@csstools/postcss-stepped-value-functions': 4.0.9(postcss@8.5.6) + '@csstools/postcss-text-decoration-shorthand': 4.0.3(postcss@8.5.6) + '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.6) + '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.6) + autoprefixer: 10.4.22(postcss@8.5.6) + browserslist: 4.28.0 + css-blank-pseudo: 7.0.1(postcss@8.5.6) + css-has-pseudo: 7.0.3(postcss@8.5.6) + css-prefers-color-scheme: 10.0.0(postcss@8.5.6) + cssdb: 8.4.2 + postcss: 8.5.6 + postcss-attribute-case-insensitive: 7.0.1(postcss@8.5.6) + postcss-clamp: 4.1.0(postcss@8.5.6) + postcss-color-functional-notation: 7.0.12(postcss@8.5.6) + postcss-color-hex-alpha: 10.0.0(postcss@8.5.6) + postcss-color-rebeccapurple: 10.0.0(postcss@8.5.6) + postcss-custom-media: 11.0.6(postcss@8.5.6) + postcss-custom-properties: 14.0.6(postcss@8.5.6) + postcss-custom-selectors: 8.0.5(postcss@8.5.6) + postcss-dir-pseudo-class: 9.0.1(postcss@8.5.6) + postcss-double-position-gradients: 6.0.4(postcss@8.5.6) + postcss-focus-visible: 10.0.1(postcss@8.5.6) + postcss-focus-within: 9.0.1(postcss@8.5.6) + postcss-font-variant: 5.0.0(postcss@8.5.6) + postcss-gap-properties: 6.0.0(postcss@8.5.6) + postcss-image-set-function: 7.0.0(postcss@8.5.6) + postcss-lab-function: 7.0.12(postcss@8.5.6) + postcss-logical: 8.1.0(postcss@8.5.6) + postcss-nesting: 13.0.2(postcss@8.5.6) + postcss-opacity-percentage: 3.0.0(postcss@8.5.6) + postcss-overflow-shorthand: 6.0.0(postcss@8.5.6) + postcss-page-break: 3.0.4(postcss@8.5.6) + postcss-place: 10.0.0(postcss@8.5.6) + postcss-pseudo-class-any-link: 10.0.1(postcss@8.5.6) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.6) + postcss-selector-not: 8.0.1(postcss@8.5.6) + + postcss-pseudo-class-any-link@10.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-reduce-idents@6.0.3(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@6.1.0(postcss@8.5.6): + dependencies: + browserslist: 4.28.0 + caniuse-api: 3.0.0 + postcss: 8.5.6 + + postcss-reduce-transforms@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + postcss-replace-overflow-wrap@4.0.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-not@8.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-sort-media-queries@5.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + sort-css-media-queries: 2.2.0 + + postcss-svgo@6.0.3(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 + + postcss-unique-selectors@6.0.4(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-value-parser@4.2.0: {} + + postcss-zindex@6.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + pretty-error@4.0.0: + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + + pretty-time@1.1.0: {} + + prism-react-renderer@2.4.1(react@19.2.7): + dependencies: + '@types/prismjs': 1.26.5 + clsx: 2.1.1 + react: 19.2.7 + + prismjs@1.30.0: {} + + process-nextick-args@2.0.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + punycode@2.3.1: {} + + pupa@3.3.0: + dependencies: + escape-goat: 4.0.0 + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.0: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dom@19.2.7(react@19.2.7): + dependencies: + react: 19.2.7 + scheduler: 0.27.0 + + react-fast-compare@3.2.2: {} + + react-is@16.13.1: {} + + react-json-view-lite@2.5.0(react@19.2.7): + dependencies: + react: 19.2.7 + + react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@19.2.7))(webpack@5.102.1): + dependencies: + '@babel/runtime': 7.28.4 + react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.7)' + webpack: 5.102.1 + + react-router-config@5.1.1(react-router@5.3.4(react@19.2.7))(react@19.2.7): + dependencies: + '@babel/runtime': 7.28.4 + react: 19.2.7 + react-router: 5.3.4(react@19.2.7) + + react-router-dom@5.3.4(react@19.2.7): + dependencies: + '@babel/runtime': 7.28.4 + history: 4.10.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.2.7 + react-router: 5.3.4(react@19.2.7) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + react-router@5.3.4(react@19.2.7): + dependencies: + '@babel/runtime': 7.28.4 + history: 4.10.1 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + path-to-regexp: 1.9.0 + prop-types: 15.8.1 + react: 19.2.7 + react-is: 16.13.1 + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + react@19.2.7: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + registry-auth-token@5.1.0: + dependencies: + '@pnpm/npm-conf': 2.3.1 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + regjsgen@0.8.0: {} + + regjsparser@0.13.0: + dependencies: + jsesc: 3.1.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + relateurl@0.2.7: {} + + remark-directive@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-directive: 3.1.0 + micromark-extension-directive: 3.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-emoji@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + emoticon: 4.1.0 + mdast-util-find-and-replace: 3.0.2 + node-emoji: 2.2.0 + unified: 11.0.5 + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + renderkid@3.0.0: + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + + repeat-string@1.6.1: {} + + require-from-string@2.0.2: {} + + require-like@0.1.2: {} + + requires-port@1.0.0: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-pathname@3.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + retry@0.13.1: {} + + reusify@1.1.0: {} + + rtlcss@4.3.0: + dependencies: + escalade: 3.2.0 + picocolors: 1.1.1 + postcss: 8.5.6 + strip-json-comments: 3.1.1 + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.3: {} + + scheduler@0.27.0: {} + + schema-dts@1.1.5: {} + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + search-insights@2.17.3: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + select-hose@2.0.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.14 + node-forge: 1.3.1 + + semver-diff@4.0.0: + dependencies: + semver: 7.7.3 + + semver@6.3.1: {} + + semver@7.7.3: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-handler@6.1.6: + dependencies: + bytes: 3.0.0 + content-disposition: 0.5.2 + mime-types: 2.1.18 + minimatch: 3.1.2 + path-is-inside: 1.0.2 + path-to-regexp: 3.3.0 + range-parser: 1.2.0 + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shallowequal@1.1.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + sirv@2.0.4: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + sitemap@7.1.2: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.3 + + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + + slash@3.0.0: {} + + slash@4.0.0: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + sort-css-media-queries@2.2.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + + spdy-transport@3.0.0: + dependencies: + debug: 4.4.3 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.3 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + sprintf-js@1.0.3: {} + + srcset@4.0.0: {} + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + std-env@3.10.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-bom-string@1.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + style-to-js@1.1.19: + dependencies: + style-to-object: 1.0.12 + + style-to-object@1.0.12: + dependencies: + inline-style-parser: 0.2.6 + + stylehacks@6.1.1(postcss@8.5.6): + dependencies: + browserslist: 4.28.0 + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-parser@2.0.4: {} + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.2.2 + css-tree: 2.3.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + + swr@2.3.6(react@19.2.7): + dependencies: + dequal: 2.0.3 + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) + + tagged-tag@1.0.0: {} + + tapable@2.3.0: {} + + terser-webpack-plugin@5.3.14(webpack@5.102.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.1 + webpack: 5.102.1 + + terser@5.44.1: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + thingies@2.5.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + throttleit@2.1.0: {} + + thunky@1.1.0: {} + + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + + tinypool@1.1.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + totalist@3.0.1: {} + + tree-dump@1.1.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tslib@2.8.1: {} + + type-fest@0.21.3: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + type-fest@5.0.0: + dependencies: + tagged-tag: 1.0.0 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typescript@5.6.3: {} + + undici-types@7.16.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-emoji-modifier-base@1.0.0: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.4(browserslist@4.28.0): + dependencies: + browserslist: 4.28.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-notifier@6.0.2: + dependencies: + boxen: 7.1.1 + chalk: 5.6.2 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.1.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.3.0 + semver: 7.7.3 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-loader@4.1.1(file-loader@6.2.0(webpack@5.102.1))(webpack@5.102.1): + dependencies: + loader-utils: 2.0.4 + mime-types: 2.1.35 + schema-utils: 3.3.0 + webpack: 5.102.1 + optionalDependencies: + file-loader: 6.2.0(webpack@5.102.1) + + use-sync-external-store@1.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + + util-deprecate@1.0.2: {} + + utila@0.4.0: {} + + utility-types@3.11.0: {} + + utils-merge@1.0.1: {} + + uuid@8.3.2: {} + + value-equal@1.0.1: {} + + vary@1.1.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + watchpack@2.4.4: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + web-namespaces@2.0.1: {} + + webpack-bundle-analyzer@4.10.2: + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.15.0 + acorn-walk: 8.3.4 + commander: 7.2.0 + debounce: 1.2.1 + escape-string-regexp: 4.0.0 + gzip-size: 6.0.0 + html-escaper: 2.0.2 + opener: 1.5.2 + picocolors: 1.1.1 + sirv: 2.0.4 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + webpack-dev-middleware@7.4.5(webpack@5.102.1): + dependencies: + colorette: 2.0.20 + memfs: 4.51.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.3 + optionalDependencies: + webpack: 5.102.1 + + webpack-dev-server@5.2.2(webpack@5.102.1): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.7 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.10 + '@types/sockjs': 0.3.36 + '@types/ws': 8.18.1 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.1 + connect-history-api-fallback: 2.0.0 + express: 4.21.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.2.0 + launch-editor: 2.12.0 + open: 10.2.0 + p-retry: 6.2.1 + schema-utils: 4.3.3 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.5(webpack@5.102.1) + ws: 8.18.3 + optionalDependencies: + webpack: 5.102.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-merge@6.0.1: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.3.3: {} + + webpack@5.102.1: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.28.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(webpack@5.102.1) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpackbar@6.0.1(webpack@5.102.1): + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + consola: 3.4.2 + figures: 3.2.0 + markdown-table: 2.0.0 + pretty-time: 1.1.0 + std-env: 3.10.0 + webpack: 5.102.1 + wrap-ansi: 7.0.0 + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.10 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + + wildcard@2.0.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + ws@7.5.10: {} + + ws@8.18.3: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + + xdg-basedir@5.1.0: {} + + xml-js@1.6.11: + dependencies: + sax: 1.4.3 + + yallist@3.1.1: {} + + yocto-queue@1.2.2: {} + + zod@4.1.11: {} + + zod@4.1.12: {} + + zwitch@2.0.4: {} diff --git a/docs/pnpm-workspace.yaml b/docs/pnpm-workspace.yaml new file mode 100644 index 000000000..1f4781336 --- /dev/null +++ b/docs/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +ignoredBuiltDependencies: + - core-js-pure + +onlyBuiltDependencies: + - core-js diff --git a/docs/sidebars.ts b/docs/sidebars.ts new file mode 100644 index 000000000..95bfc472e --- /dev/null +++ b/docs/sidebars.ts @@ -0,0 +1,49 @@ +import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'; + +const sidebars: SidebarsConfig = { + docsSidebar: [ + 'index', + 'help', + 'faq', + { + type: 'category', + label: "Developers", + link: { + type: "generated-index", + description: "Building with Stoat" + }, + items: [ + { + type: 'autogenerated', + dirName: 'developers', + } + ] + }, + { + type: 'category', + label: "Developing Stoat", + link: { + type: "generated-index", + description: "Building Stoat" + }, + items: [ + { + type: 'autogenerated', + dirName: 'developing', + }, + { + type: 'link', + label: "for Web", + href: "https://stoatchat.github.io/for-web" + }, + { + type: 'link', + label: "for Android", + href: "https://stoatchat.github.io/for-android" + } + ] + } + ], +}; + +export default sidebars; diff --git a/docs/static/.nojekyll b/docs/static/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/docs/static/img/.gitkeep b/docs/static/img/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docs/static/img/navbar.dark.svg b/docs/static/img/navbar.dark.svg new file mode 100644 index 000000000..6a5d88c0f --- /dev/null +++ b/docs/static/img/navbar.dark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/static/img/navbar.light.svg b/docs/static/img/navbar.light.svg new file mode 100644 index 000000000..83bc88b07 --- /dev/null +++ b/docs/static/img/navbar.light.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 000000000..920d7a652 --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,8 @@ +{ + // This file is not used in compilation. It is here just for a nice editor experience. + "extends": "@docusaurus/tsconfig", + "compilerOptions": { + "baseUrl": "." + }, + "exclude": [".docusaurus", "build"] +} diff --git a/git-town.toml b/git-town.toml new file mode 100644 index 000000000..65a40966f --- /dev/null +++ b/git-town.toml @@ -0,0 +1,8 @@ +# See https://www.git-town.com/configuration-file for details + +[branches] +main = "main" + +[hosting] +forge-type = "github" +github-connector = "gh" diff --git a/justfile b/justfile deleted file mode 100644 index 74c7082d1..000000000 --- a/justfile +++ /dev/null @@ -1,21 +0,0 @@ -publish: - cargo publish --package revolt-parser - cargo publish --package revolt-result - cargo publish --package revolt-config - cargo publish --package revolt-files - cargo publish --package revolt-permissions - cargo publish --package revolt-models - cargo publish --package revolt-presence - cargo publish --package revolt-database - -patch: - cargo release version patch --execute - -minor: - cargo release version minor --execute - -major: - cargo release version major --execute - -release: - scripts/try-tag-and-release.sh diff --git a/livekit.example.yml b/livekit.example.yml new file mode 100644 index 000000000..f502dd7ae --- /dev/null +++ b/livekit.example.yml @@ -0,0 +1,13 @@ +port: 7880 +redis: + address: localhost:6379 + username: "" + password: "" +webhook: + api_key: worldwide + urls: + - 'http://localhost:8500/worldwide' +logging: + level: debug +keys: + worldwide: ZjCofRlfm6GGtjlifmNpCDkcQbEIIVC0 diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 000000000..f43b09c30 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,157 @@ +{ + "bootstrap-sha": "0cf4a8ecc41c7984ba3ee5664dd979c5f14b59b4", + "packages": { + ".": { + "changelog-path": "CHANGELOG.md", + "release-type": "simple", + "bump-minor-pre-major": false, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease": false, + "include-component-in-tag": false, + "extra-files": [ + { + "type": "toml", + "path": "crates/delta/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/bonfire/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/coalesced/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/config/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/database/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/files/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/models/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/parser/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/permissions/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/presence/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/ratelimits/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/core/result/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/daemons/crond/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/daemons/pushd/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/daemons/voice-ingress/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/services/autumn/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/services/gifbox/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "crates/services/january/Cargo.toml", + "jsonpath": "$.package.version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-coalesced'].version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-config'].version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-database'].version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-files'].version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-models'].version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-parser'].version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-permissions'].version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-presence'].version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-ratelimits'].version" + }, + { + "type": "toml", + "path": "Cargo.toml", + "jsonpath": "$.workspace.dependencies['revolt-result'].version" + } + ] + } + }, + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" +} \ No newline at end of file diff --git a/renovate.json b/renovate.json new file mode 100644 index 000000000..9ccd60d51 --- /dev/null +++ b/renovate.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended" + ], + "cloneSubmodules": true, + "cloneSubmodulesFilter": [ + "*", + "!packages/client/assets" + ] +} \ No newline at end of file diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 000000000..ed1966141 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.92.0" \ No newline at end of file diff --git a/scripts/build-image-layer.sh b/scripts/build-image-layer.sh index 0a0fa32b7..52170fdda 100644 --- a/scripts/build-image-layer.sh +++ b/scripts/build-image-layer.sh @@ -32,17 +32,23 @@ deps() { crates/core/permissions/src \ crates/core/presence/src \ crates/core/result/src \ + crates/core/coalesced/src \ + crates/core/ratelimits/src \ crates/services/autumn/src \ crates/services/january/src \ + crates/services/gifbox/src \ crates/daemons/crond/src \ - crates/daemons/pushd/src + crates/daemons/pushd/src \ + crates/daemons/voice-ingress/src echo 'fn main() { panic!("stub"); }' | tee crates/bonfire/src/main.rs | tee crates/delta/src/main.rs | tee crates/services/autumn/src/main.rs | tee crates/services/january/src/main.rs | + tee crates/services/gifbox/src/main.rs | tee crates/daemons/crond/src/main.rs | - tee crates/daemons/pushd/src/main.rs + tee crates/daemons/pushd/src/main.rs | + tee crates/daemons/voice-ingress/src/main.rs echo '' | tee crates/core/config/src/lib.rs | tee crates/core/database/src/lib.rs | @@ -51,7 +57,9 @@ deps() { tee crates/core/parser/src/lib.rs | tee crates/core/permissions/src/lib.rs | tee crates/core/presence/src/lib.rs | - tee crates/core/result/src/lib.rs + tee crates/core/result/src/lib.rs | + tee crates/core/coalesced/src/lib.rs | + tee crates/core/ratelimits/src/lib.rs if [ -z "$TARGETARCH" ]; then cargo build -j 10 --locked --release @@ -66,13 +74,16 @@ apps() { crates/delta/src/main.rs \ crates/daemons/crond/src/main.rs \ crates/daemons/pushd/src/main.rs \ + crates/daemons/voice-ingress/src/main.rs \ crates/core/config/src/lib.rs \ crates/core/database/src/lib.rs \ crates/core/models/src/lib.rs \ crates/core/parser/src/lib.rs \ crates/core/permissions/src/lib.rs \ crates/core/presence/src/lib.rs \ - crates/core/result/src/lib.rs + crates/core/result/src/lib.rs \ + crates/core/coalesced/src/lib.rs \ + crates/core/ratelimits/src/lib.rs if [ -z "$TARGETARCH" ]; then cargo build -j 10 --locked --release diff --git a/scripts/publish-debug-image.sh b/scripts/publish-debug-image.sh index 6686344cb..872609443 100755 --- a/scripts/publish-debug-image.sh +++ b/scripts/publish-debug-image.sh @@ -20,21 +20,25 @@ fi TAG=$1-debug echo "Building images, will tag for ghcr.io with $TAG!" -docker build -t ghcr.io/revoltchat/base:latest -f Dockerfile.useCurrentArch . -docker build -t ghcr.io/revoltchat/server:$TAG - < crates/delta/Dockerfile -docker build -t ghcr.io/revoltchat/bonfire:$TAG - < crates/bonfire/Dockerfile -docker build -t ghcr.io/revoltchat/autumn:$TAG - < crates/services/autumn/Dockerfile -docker build -t ghcr.io/revoltchat/january:$TAG - < crates/services/january/Dockerfile -docker build -t ghcr.io/revoltchat/crond:$TAG - < crates/daemons/crond/Dockerfile -docker build -t ghcr.io/revoltchat/pushd:$TAG - < crates/daemons/pushd/Dockerfile +docker build -t ghcr.io/stoatchat/base:latest -f Dockerfile.useCurrentArch . +docker build -t ghcr.io/stoatchat/server:$TAG - < crates/delta/Dockerfile +docker build -t ghcr.io/stoatchat/bonfire:$TAG - < crates/bonfire/Dockerfile +docker build -t ghcr.io/stoatchat/autumn:$TAG - < crates/services/autumn/Dockerfile +docker build -t ghcr.io/stoatchat/january:$TAG - < crates/services/january/Dockerfile +docker build -t ghcr.io/stoatchat/gifbox:$TAG - < crates/services/gifbox/Dockerfile +docker build -t ghcr.io/stoatchat/crond:$TAG - < crates/daemons/crond/Dockerfile +docker build -t ghcr.io/stoatchat/pushd:$TAG - < crates/daemons/pushd/Dockerfile +docker build -t ghcr.io/stoatchat/voice-ingress:$TAG - < crates/daemons/voice-ingress/Dockerfile if [ "$DEBUG" = "true" ]; then git restore Cargo.toml fi -docker push ghcr.io/revoltchat/server:$TAG -docker push ghcr.io/revoltchat/bonfire:$TAG -docker push ghcr.io/revoltchat/autumn:$TAG -docker push ghcr.io/revoltchat/january:$TAG -docker push ghcr.io/revoltchat/crond:$TAG -docker push ghcr.io/revoltchat/pushd:$TAG +docker push ghcr.io/stoatchat/server:$TAG +docker push ghcr.io/stoatchat/bonfire:$TAG +docker push ghcr.io/stoatchat/autumn:$TAG +docker push ghcr.io/stoatchat/january:$TAG +docker push ghcr.io/stoatchat/gifbox:$TAG +docker push ghcr.io/stoatchat/crond:$TAG +docker push ghcr.io/stoatchat/pushd:$TAG +docker push ghcr.io/stoatchat/voice-ingress:$TAG diff --git a/scripts/start.sh b/scripts/start.sh deleted file mode 100755 index 466d56071..000000000 --- a/scripts/start.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -set -e -cargo build \ - --bin revolt-delta \ - --bin revolt-bonfire \ - --bin revolt-autumn \ - --bin revolt-january - -trap 'pkill -f revolt-' SIGINT -cargo run --bin revolt-delta & -cargo run --bin revolt-bonfire & -cargo run --bin revolt-autumn & -cargo run --bin revolt-january diff --git a/scripts/try-tag-and-release.sh b/scripts/try-tag-and-release.sh deleted file mode 100755 index 2ab918458..000000000 --- a/scripts/try-tag-and-release.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -date=$(date +'%Y%m%d') -incr=1 - -while [ $(git tag -l "$date-$incr") ]; do - incr=$((incr+1)) -done - -tag=$date-$incr -echo About to tag and push $tag in 3 seconds... -sleep 3s - -git tag $tag -git push --atomic origin $(git rev-parse --abbrev-ref HEAD) $tag diff --git a/version.txt b/version.txt new file mode 100644 index 000000000..5daaa7ba8 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +0.13.7