diff --git a/.env.example b/.env.example index b560a06..2163451 100644 --- a/.env.example +++ b/.env.example @@ -1,67 +1,59 @@ -DATABASE_URL="postgresql://kordant:kordant_dev@localhost:5432/kordant" -REDIS_URL="redis://localhost:6379" +# Database (Turso / libSQL) +DATABASE_URL="libsql://your-db.turso.io" +DATABASE_AUTH_TOKEN="" + +# Server PORT=3000 -LOG_LEVEL=info -HIBP_API_KEY="" +NODE_ENV="development" +LOG_LEVEL="info" +APP_URL="http://localhost:3000" + +# Auth +JWT_SECRET="" +SESSION_SECRET="" + +# Payments (Stripe) +STRIPE_SECRET_KEY="" +STRIPE_WEBHOOK_SECRET="" +STRIPE_PRICE_PLUS_MONTHLY="" +STRIPE_PRICE_PREMIUM_MONTHLY="" + +# Email (Resend) RESEND_API_KEY="" -AWS_REGION="us-east-1" -# Datadog APM Configuration -DD_SERVICE="kordant-api" -DD_ENV="development" -DD_VERSION="0.1.0" -DD_TRACE_ENABLED="true" -DD_TRACE_SAMPLE_RATE="1.0" -DD_LOGS_INJECTION="true" -DD_AGENT_HOST="localhost" -DD_AGENT_PORT="8126" -DD_API_KEY="" -DD_SITE="datadoghq.com" - -# Sentry Error Tracking -SENTRY_DSN="" -SENTRY_ENVIRONMENT="development" -SENTRY_RELEASE="0.1.0" -SENTRY_TRACES_SAMPLE_RATE="0.1" - -# Google Analytics 4 -GA4_MEASUREMENT_ID="" -GA4_API_SECRET="" - -# Mixpanel Product Analytics -MIXPANEL_TOKEN="" -MIXPANEL_API_SECRET="" -ANALYTICS_ENV="development" - -# ============================================ -# Push Notifications Configuration -# ============================================ - -# Firebase Cloud Messaging (FCM) - Android +# Push Notifications FCM_PROJECT_ID="" FCM_CLIENT_EMAIL="" FCM_PRIVATE_KEY="" - -# Apple Push Notification Service (APNs) - iOS APNS_KEY_ID="" APNS_TEAM_ID="" APNS_BUNDLE_ID="" APNS_KEY="" -# Twilio - SMS (optional) +# SMS (Twilio) TWILIO_ACCOUNT_SID="" TWILIO_AUTH_TOKEN="" TWILIO_MESSAGING_SERVICE_SID="" +# External APIs +HIBP_API_KEY="" +SECURITYTRAILS_API_KEY="" +CENSYS_API_ID="" +CENSYS_API_SECRET="" +SHODAN_API_KEY="" + +# Monitoring +SENTRY_DSN="" +SENTRY_ENVIRONMENT="development" +DD_API_KEY="" +DD_SITE="datadoghq.com" + +# Analytics +MIXPANEL_TOKEN="" +GA4_MEASUREMENT_ID="" + # Notification Rate Limits PUSH_RATE_LIMIT=100 EMAIL_RATE_LIMIT=60 SMS_RATE_LIMIT=30 RATE_LIMIT_WINDOW_SECONDS=60 - -# Frontend Environment Variables (Vite) -# Add these to packages/web/.env or your frontend .env files: -# VITE_MIXPANEL_TOKEN= -# VITE_GA_MEASUREMENT_ID= -# VITE_META_PIXEL_ID="" -# VITE_LINKEDIN_PARTNER_ID="" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 564c729..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,246 +0,0 @@ -name: CI - -on: - push: - branches: [main, develop] - pull_request: - branches: [main] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - NODE_VERSION: "20" - PNPM_VERSION: "9" - -jobs: - lint: - name: Lint - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" - - uses: pnpm/action-setup@v4 - with: - version: ${{ env.PNPM_VERSION }} - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Run linter - run: pnpm lint - - typecheck: - name: Type Check - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" - - uses: pnpm/action-setup@v4 - with: - version: ${{ env.PNPM_VERSION }} - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Build all packages - run: pnpm build - - test: - name: Test Suite - runs-on: ubuntu-latest - services: - postgres: - image: postgres:16-alpine - env: - POSTGRES_DB: kordant - POSTGRES_USER: kordant - POSTGRES_PASSWORD: kordant_dev - ports: - - 5432:5432 - options: >- - --health-cmd "pg_isready -U kordant" - --health-interval 5s - --health-timeout 5s - --health-retries 5 - redis: - image: redis:7-alpine - ports: - - 6379:6379 - options: >- - --health-cmd "redis-cli ping" - --health-interval 5s - --health-timeout 5s - --health-retries 5 - steps: - - uses: actions/checkout@v4 - - name: Setup Node.js ${{ env.NODE_VERSION }} - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - cache: "pnpm" - - uses: pnpm/action-setup@v4 - with: - version: ${{ env.PNPM_VERSION }} - - name: Install dependencies - run: pnpm install --frozen-lockfile - - name: Run tests - run: pnpm test - env: - DATABASE_URL: "postgresql://kordant:kordant_dev@localhost:5432/kordant" - REDIS_URL: "redis://localhost:6379" - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v4 - with: - file: ./coverage/lcov.info - flags: unittests - name: kordant-coverage - fail_on_empty: false - - docker-build: - name: Docker Build - runs-on: ubuntu-latest - needs: [lint, typecheck, test] - steps: - - uses: actions/checkout@v4 - - name: Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Build Docker image - uses: docker/build-push-action@v5 - with: - context: . - push: false - tags: kordant:${{ github.sha }} - cache-from: type=gha - cache-to: type=gha,mode=max - - security-scan: - name: Security Scan - runs-on: ubuntu-latest - needs: [lint] - steps: - - uses: actions/checkout@v4 - - name: Run pnpm audit - run: pnpm audit --prod - - name: Trivy filesystem scan - uses: aquasecurity/trivy-action@master - with: - scan-type: fs - scan-ref: "." - format: table - exit-code: 1 - ignore-unfixed: true - severity: CRITICAL,HIGH - - terraform-plan: - name: Terraform Plan - runs-on: ubuntu-latest - needs: [lint] - if: github.event_name == 'pull_request' - steps: - - uses: actions/checkout@v4 - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - - name: Terraform Format - working-directory: infra - run: terraform fmt -check -diff - - name: Terraform Init - working-directory: infra - run: terraform init - - name: Terraform Validate - working-directory: infra - run: terraform validate - - name: Terraform Plan - working-directory: infra - run: terraform plan -var-file=environments/staging/terraform.tfvars.example -no-color - env: - TF_VAR_hibp_api_key: ${{ secrets.HIBP_API_KEY }} - TF_VAR_resend_api_key: ${{ secrets.RESEND_API_KEY }} - - load-test: - name: Load Test - runs-on: ubuntu-latest - needs: [lint, typecheck, test, docker-build] - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - environment: staging - steps: - - uses: actions/checkout@v4 - - - name: Install k6 - run: | - K6_VERSION="v0.50.0" - K6_URL="https://github.com/grafana/k6/releases/download/${K6_VERSION}/k6-linux-amd64.tar.gz" - K6_SHA256="d950a2408d0be2dc81aef397a7c984a1d84271d7ae94ff7a47d08371904f0800" - curl -sSL "${K6_URL}" -o k6.tar.gz - echo "${K6_SHA256} k6.tar.gz" | sha256sum --check --strict - - tar xzf k6.tar.gz - sudo mv k6 /usr/local/bin/ - k6 version - - - name: Validate required secrets - run: | - if [ -z "$API_TOKEN" ]; then - echo "❌ LOAD_TEST_API_TOKEN secret is not set" - exit 1 - fi - - - name: Run combined load tests - run: | - chmod +x scripts/load-test/run-all.sh - ./scripts/load-test/run-all.sh - env: - LOAD_TEST_BASE_URL: ${{ secrets.LOAD_TEST_BASE_URL || 'http://localhost:3000' }} - API_TOKEN: ${{ secrets.LOAD_TEST_API_TOKEN }} - TARGET_RPS: ${{ vars.LOAD_TEST_TARGET_RPS || '500' }} - DURATION: ${{ vars.LOAD_TEST_DURATION || '300s' }} - K6_CLOUD_TOKEN: ${{ secrets.K6_CLOUD_TOKEN || '' }} - K6_CLOUD_PROJECT_ID: ${{ vars.K6_CLOUD_PROJECT_ID || '' }} - - - name: Upload load test report - if: always() - uses: actions/upload-artifact@v4 - with: - name: load-test-report-${{ github.sha }} - path: scripts/load-test/reports/ - retention-days: 30 - - - name: Check P99 thresholds - if: always() - run: | - if [ -f scripts/load-test/reports/threshold-results.json ]; then - FAILURES=$(jq -r '[.services | to_entries[] | select(.value.exitCode != 0) | .key] | join(", ")' scripts/load-test/reports/threshold-results.json 2>/dev/null || echo "") - if [ -n "$FAILURES" ] && [ "$FAILURES" != "" ]; then - echo "❌ Load test failures: $FAILURES" - exit 1 - else - echo "✅ All load tests passed" - fi - else - echo "⚠️ No threshold results file found" - exit 1 - fi - - - name: Validate auto-scaling - if: always() - run: | - SUMMARY_FILE=$(ls scripts/load-test/reports/*-summary-*.json 2>/dev/null | head -1) - if [ -n "$SUMMARY_FILE" ]; then - MAX_VUS=$(jq -r '.metrics.vus.max // 0' "$SUMMARY_FILE") - TARGET_VUS=20 - if [ "$(echo "$MAX_VUS >= $TARGET_VUS" | bc -l)" -eq 1 ]; then - echo "✅ Auto-scaling validated: max VUs ($MAX_VUS) >= target ($TARGET_VUS)" - else - echo "⚠️ Auto-scaling below target: max VUs ($MAX_VUS) < target ($TARGET_VUS)" - fi - else - echo "⚠️ No summary file for auto-scaling validation" - fi diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index c652c1d..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,242 +0,0 @@ -name: Deploy - -on: - push: - branches: [main] - release: - types: [published] - -concurrency: - group: deploy-${{ github.ref }} - cancel-in-progress: true - -env: - NODE_VERSION: "20" - PNPM_VERSION: "9" - -jobs: - detect-environment: - name: Detect Environment - runs-on: ubuntu-latest - outputs: - environment: ${{ steps.detect.outputs.environment }} - tag: ${{ steps.tag.outputs.tag }} - steps: - - name: Detect deployment target - id: detect - run: | - if [ "${{ github.event_name }}" = "release" ]; then - echo "environment=production" >> $GITHUB_OUTPUT - else - echo "environment=staging" >> $GITHUB_OUTPUT - fi - - name: Calculate tag - id: tag - run: | - if [ "${{ steps.detect.outputs.environment }}" = "production" ]; then - echo "tag=${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT - else - echo "tag=${{ github.sha }}" >> $GITHUB_OUTPUT - fi - - terraform-apply: - name: Terraform Apply - runs-on: ubuntu-latest - needs: detect-environment - environment: ${{ needs.detect-environment.outputs.environment }} - steps: - - uses: actions/checkout@v4 - - name: Setup Terraform - uses: hashicorp/setup-terraform@v3 - with: - terraform_version: "~> 1.5" - - name: Terraform Init - working-directory: infra/environments/${{ needs.detect-environment.outputs.environment }} - run: terraform init -backend-config="bucket=kordant-${{ needs.detect-environment.outputs.environment }}-terraform-state" - - name: Terraform Plan - id: plan - working-directory: infra/environments/${{ needs.detect-environment.outputs.environment }} - run: | - terraform plan \ - -var="hibp_api_key=${{ secrets.HIBP_API_KEY }}" \ - -var="resend_api_key=${{ secrets.RESEND_API_KEY }}" \ - -var="sentry_dsn=${{ secrets.SENTRY_DSN }}" \ - -var="datadog_api_key=${{ secrets.DATADOG_API_KEY }}" \ - -no-color | tee /tmp/terraform-plan.out - - name: Terraform Apply - working-directory: infra/environments/${{ needs.detect-environment.outputs.environment }} - run: | - terraform apply -auto-approve \ - -var="hibp_api_key=${{ secrets.HIBP_API_KEY }}" \ - -var="resend_api_key=${{ secrets.RESEND_API_KEY }}" \ - -var="sentry_dsn=${{ secrets.SENTRY_DSN }}" \ - -var="datadog_api_key=${{ secrets.DATADOG_API_KEY }}" - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: us-east-1 - - build-and-push: - name: Build and Push Docker Images - runs-on: ubuntu-latest - needs: [detect-environment] - environment: ${{ needs.detect-environment.outputs.environment }} - strategy: - fail-fast: false - matrix: - include: - - name: api - dockerfile: packages/api/Dockerfile - - name: darkwatch - dockerfile: services/darkwatch/Dockerfile - - name: spamshield - dockerfile: services/spamshield/Dockerfile - - name: voiceprint - dockerfile: services/voiceprint/Dockerfile - steps: - - uses: actions/checkout@v4 - - name: Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Login to Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Calculate image tag - id: tag - run: echo "tag=${{ needs.detect-environment.outputs.tag }}" >> $GITHUB_OUTPUT - - name: Build and push ${{ matrix.name }} - uses: docker/build-push-action@v5 - with: - context: . - file: ${{ matrix.dockerfile }} - push: true - tags: | - ghcr.io/${{ github.repository_owner }}/kordant-${{ matrix.name }}:${{ steps.tag.outputs.tag }} - ghcr.io/${{ github.repository_owner }}/kordant-${{ matrix.name }}:latest - cache-from: type=gha - cache-to: type=gha,mode=max - - deploy-ecs: - name: Deploy to ECS - runs-on: ubuntu-latest - needs: [detect-environment, terraform-apply, build-and-push] - environment: ${{ needs.detect-environment.outputs.environment }} - strategy: - fail-fast: false - matrix: - service: [api, darkwatch, spamshield, voiceprint] - steps: - - uses: actions/checkout@v4 - - name: Configure AWS - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - - name: Update ECS Service - run: | - IMAGE="ghcr.io/${{ github.repository_owner }}/kordant-${{ matrix.service }}:${{ needs.detect-environment.outputs.tag }}" - CLUSTER="kordant-${{ needs.detect-environment.outputs.environment }}" - SERVICE="${{ matrix.service }}" - - TASK_DEF=$(aws ecs describe-task-definition \ - --task-definition "${CLUSTER}-${SERVICE}" \ - --query 'taskDefinition' --output json) - - NEW_TASK_DEF=$(echo "$TASK_DEF" | jq \ - --arg image "$IMAGE" \ - '.containerDefinitions[0].image = $image') - - NEW_TASK_DEF_ARN=$(echo "$NEW_TASK_DEF" | \ - aws ecs register-task-definition \ - --family "${CLUSTER}-${SERVICE}" \ - --cli-input-json - \ - --query 'taskDefinition.taskDefinitionArn' --output text) - - aws ecs update-service \ - --cluster "$CLUSTER" \ - --service "${CLUSTER}-${SERVICE}" \ - --task-definition "$NEW_TASK_DEF_ARN" \ - --force-new-deployment - - echo "Deployed $IMAGE to $SERVICE" - - health-check: - name: Post-Deploy Health Check - runs-on: ubuntu-latest - needs: [detect-environment, deploy-ecs] - environment: ${{ needs.detect-environment.outputs.environment }} - steps: - - name: Configure AWS - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - - name: Wait for deployment - run: sleep 30 - - name: Health Check - id: health - run: | - ENV="${{ needs.detect-environment.outputs.environment }}" - CLUSTER="kordant-${ENV}" - - ALB_DNS=$(aws elbv2 describe-load-balancers \ - --query "LoadBalancers[?contains(LoadBalancerName, '${CLUSTER}-alb')].DNSName" \ - --output text) - - if [ -z "$ALB_DNS" ]; then - echo "Health check failed: ALB DNS not found" - exit 1 - fi - - echo "ALB DNS: $ALB_DNS" - - FAILED=0 - for service in api darkwatch spamshield voiceprint; do - HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \ - "https://${ALB_DNS}/health" || true) - - if [ "$HTTP_CODE" = "200" ]; then - echo "Health check passed: $service" - else - echo "Health check failed: $service (HTTP $HTTP_CODE)" - FAILED=1 - fi - done - - if [ "$FAILED" -eq 1 ]; then - exit 1 - fi - - rollback: - name: Rollback on Failure - runs-on: ubuntu-latest - needs: [detect-environment, deploy-ecs, health-check] - environment: ${{ needs.detect-environment.outputs.environment }} - if: failure() && needs.health-check.result == 'failure' - strategy: - fail-fast: false - matrix: - service: [api, darkwatch, spamshield, voiceprint] - steps: - - name: Configure AWS - uses: aws-actions/configure-aws-credentials@v4 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - - name: Rollback ECS Service - run: | - CLUSTER="kordant-${{ needs.detect-environment.outputs.environment }}" - SERVICE="${{ matrix.service }}" - - aws ecs update-service \ - --cluster "$CLUSTER" \ - --service "${CLUSTER}-${SERVICE}" \ - --rollback \ - --no-cli-auto-prompt - - echo "Rolled back $SERVICE" diff --git a/.github/workflows/load-test.yml b/.github/workflows/load-test.yml deleted file mode 100644 index 0a4faef..0000000 --- a/.github/workflows/load-test.yml +++ /dev/null @@ -1,105 +0,0 @@ -name: Load Test - -on: - push: - branches: [main] - workflow_dispatch: - inputs: - target_rps: - description: 'Target requests per second' - required: false - default: '500' - duration: - description: 'Test duration' - required: false - default: '300s' - service: - description: 'Service to test (all, api, darkwatch, spamshield, voiceprint)' - required: false - default: 'all' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - NODE_VERSION: "20" - -jobs: - load-test: - name: Load Test (${{ github.event.inputs.service || 'all' }}) - runs-on: ubuntu-latest - timeout-minutes: 30 - environment: staging - steps: - - uses: actions/checkout@v4 - - - name: Install k6 - run: | - K6_VERSION="v0.50.0" - K6_URL="https://github.com/grafana/k6/releases/download/${K6_VERSION}/k6-linux-amd64.tar.gz" - K6_SHA256="d950a2408d0be2dc81aef397a7c984a1d84271d7ae94ff7a47d08371904f0800" - curl -sSL "${K6_URL}" -o k6.tar.gz - echo "${K6_SHA256} k6.tar.gz" | sha256sum --check --strict - - tar xzf k6.tar.gz - sudo mv k6 /usr/local/bin/ - k6 version - - - name: Validate required secrets - run: | - if [ -z "$API_TOKEN" ]; then - echo "❌ LOAD_TEST_API_TOKEN secret is not set" - exit 1 - fi - - - name: Run load tests - run: | - chmod +x scripts/load-test/run-all.sh - ./scripts/load-test/run-all.sh ${{ github.event.inputs.service || 'all' }} - env: - LOAD_TEST_BASE_URL: ${{ secrets.LOAD_TEST_BASE_URL || 'http://localhost:3000' }} - API_TOKEN: ${{ secrets.LOAD_TEST_API_TOKEN }} - TARGET_RPS: ${{ github.event.inputs.target_rps || '500' }} - DURATION: ${{ github.event.inputs.duration || '300s' }} - K6_CLOUD_TOKEN: ${{ secrets.K6_CLOUD_TOKEN || '' }} - K6_CLOUD_PROJECT_ID: ${{ vars.K6_CLOUD_PROJECT_ID || '' }} - - - name: Upload load test report - if: always() - uses: actions/upload-artifact@v4 - with: - name: load-test-report-${{ github.sha }} - path: scripts/load-test/reports/ - retention-days: 30 - - - name: Check P99 thresholds - if: always() - run: | - if [ -f scripts/load-test/reports/threshold-results.json ]; then - FAILURES=$(jq -r '[.services | to_entries[] | select(.value.exitCode != 0) | .key] | join(", ")' scripts/load-test/reports/threshold-results.json 2>/dev/null || echo "") - if [ -n "$FAILURES" ] && [ "$FAILURES" != "" ]; then - echo "❌ Load test failures: $FAILURES" - exit 1 - else - echo "✅ All load tests passed" - fi - else - echo "⚠️ No threshold results file found" - exit 1 - fi - - - name: Validate auto-scaling - if: always() - run: | - SUMMARY_FILE=$(ls scripts/load-test/reports/*-summary-*.json 2>/dev/null | head -1) - if [ -n "$SUMMARY_FILE" ]; then - MAX_VUS=$(jq -r '.metrics.vus.max // 0' "$SUMMARY_FILE") - TARGET_VUS=20 - if [ "$(echo "$MAX_VUS >= $TARGET_VUS" | bc -l)" -eq 1 ]; then - echo "✅ Auto-scaling validated: max VUs ($MAX_VUS) >= target ($TARGET_VUS)" - else - echo "⚠️ Auto-scaling below target: max VUs ($MAX_VUS) < target ($TARGET_VUS)" - fi - else - echo "⚠️ No summary file for auto-scaling validation" - fi diff --git a/.gitignore b/.gitignore index 3331c2d..de1a979 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,23 @@ node_modules dist .output .env +.env.local *.log .DS_Store .turbo .nitro package-lock.json +yarn.lock +# Mobile build artifacts +iOS/Kordant/build +android/.gradle +android/build +android/app/build +*.keystore +*.jks +# IDE +.vscode +.idea +# OS +.DS_Store +Thumbs.db diff --git a/README.md b/README.md index 1377853..24eeaae 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Multi-layered consumer identity protection against predatory AI-driven scams.** -Kordant combines three detection engines — voice cloning detection, dark web monitoring, and real-time spam classification — to give consumers proactive defense against modern identity fraud. +Kordant combines five service domains — voice cloning detection, dark web monitoring, spam classification, property monitoring, and data broker removal — into a unified platform with web, iOS, and Android apps. --- @@ -15,97 +15,74 @@ Kordant flips the model. We detect the scam _as it happens_: - **VoicePrint** analyzes inbound calls in real time to flag synthetic AI-generated voices before you're socially engineered. - **DarkWatch** continuously monitors dark web forums, breach databases, and data broker caches — notifying you the moment your credentials, phone, or SSN surface. - **SpamShield** intercepts and classifies spam calls and SMS at the network level, blocking threats before they reach your phone. - -Backed by ML models (ECAPA-TDNN, BERT) and a real-time alert pipeline, Kordant gives consumers enterprise-grade threat detection for their personal life. +- **HomeTitle** monitors county deed records for unauthorized ownership changes, liens, and fraud. +- **RemoveBrokers** automates data broker opt-out requests to remove your personal info from people-search sites. --- -## Architecture Overview +## Architecture + +Unified SolidStart monolith with tRPC, Drizzle ORM, and native mobile apps. ``` -┌─────────────────────────────────────────────────────────┐ -│ Clients │ -│ Mobile (Expo/RN) │ Web (SolidJS) │ Browser Extension │ -└──────────┬──────────────────────────────┬───────────────┘ - │ REST + WebSocket │ - ▼ ▼ -┌──────────────────────┐ ┌──────────────────────────────┐ -│ API Gateway │ │ WebSocket Alert Server │ -│ (Fastify 5) │ │ (Real-time push) │ -└──────┬───────┬───────┘ └──────────────────────────────┘ - │ │ - ▼ ▼ -┌──────────┐ ┌─────────────────────────────────────────────┐ -│ Auth │ │ Microservices │ -│(NextAuth)│ │ VoicePrint │ DarkWatch │ SpamShield │ -└──────────┘ │ HomeTitle │ RemoveBrokers │ - └──────────┬──────────┬───────────────────────┘ - │ │ - ┌────────▼──────────▼────────┐ - │ Background Workers │ - │ (BullMQ + Redis) │ - └────────┬───────────────────┘ - │ - ┌────────▼────────┐ - │ PostgreSQL │ - │ + Redis │ - └─────────────────┘ +┌──────────────────────────────────────────────────────────────┐ +│ Clients │ +│ Web (SolidStart) │ iOS (SwiftUI) │ Android (Compose) │ Ext │ +└────────────────────┬─────────────────────────────────────────┘ + │ tRPC (HTTP/WS) + ▼ +┌──────────────────────────────────────────────────────────────┐ +│ web/ (SolidStart) │ +│ │ +│ ┌─────────────────────────────────────────────────────────┐ │ +│ │ Frontend (SolidStart + Tailwind) │ │ +│ │ Landing │ Auth │ Dashboard │ Service Pages │ │ +│ └─────────────────────┬───────────────────────────────────┘ │ +│ │ │ +│ ┌─────────────────────▼───────────────────────────────────┐ │ +│ │ Backend (tRPC routers) │ │ +│ │ auth │ user │ family │ billing │ darkwatch │ │ │ +│ │ voiceprint │ spamshield │ hometitle │ removebrokers │ │ │ +│ │ alerts │ reports │ notifications │ correlation │ │ +│ └─────────────────────┬───────────────────────────────────┘ │ +│ │ │ +│ ┌─────────────────────▼───────────────────────────────────┐ │ +│ │ Background Jobs (scheduler + workers) │ │ +│ └─────────────────────┬───────────────────────────────────┘ │ +└────────────────────────┼──────────────────────────────────────┘ + │ + ┌────────▼────────┐ + │ PostgreSQL │ + │ + Redis │ + └─────────────────┘ ``` --- -## Features & Implementation Status +## Directory Structure -| Feature | Service |Status | Notes | -|---------|---------|--------|-------| -| Voice enrollment & profile management | VoicePrint | ✅ Done | Register family voice profiles | -| Audio preprocessing (VAD, noise reduction) | VoicePrint | ✅ Done | WebRTC VAD + RNNoise | -| Synthetic voice detection (ECAPA-TDNN) | VoicePrint | ✅ Done | FAISS vector index for matching | -| Real-time streaming audio analysis | VoicePrint | ✅ Done | WebSocket-based | -| Batch audio analysis | VoicePrint | ✅ Done | Configurable confidence thresholds per tier | -| HIBP breach checking | DarkWatch | ✅ Done | Email + password breach lookup | -| Dark web multi-source scanning | DarkWatch | ✅ Done | HIBP, SecurityTrails, Censys, Shodan, forums | -| Watch list management | DarkWatch | ✅ Done | Emails, phones, SSN (hashed) | -| Scheduled + real-time scanning | DarkWatch | ✅ Done | Tier-based frequency | -| Fuzzy matching engine | DarkWatch | ✅ Done | Levenshtein + exact matching | -| Severity-scored alert pipeline | DarkWatch | ✅ Done | Dedup pipeline | -| PDF report generation | DarkWatch | ✅ Done | Handlebars + PDFKit | -| Number reputation (Hiya/Truecaller) | SpamShield | ✅ Done | Circuit breaker pattern | -| SMS classification (BERT) | SpamShield | ✅ Done | ML-based spam detection | -| Call analysis rule engine | SpamShield | ✅ Done | Multi-layer scoring | -| Real-time carrier interception | SpamShield | ⏳ In Progress | Twilio/Plivo integration | -| Real-time WebSocket alerts | SpamShield | ✅ Done | Alert broadcasting | -| User feedback loop (FP/FN) | SpamShield | ✅ Done | Metadata validation | -| Phone validation (E.164) | SpamShield | ✅ Done | Normalization | -| Audit logging | SpamShield | ✅ Done | All decisions logged | -| SpamShield rate limiting | SpamShield | ⏳ In Progress | Per-endpoint + global | -| SpamShield route optimization | SpamShield | ⏳ In Progress | Route consolidation | -| Feature flags | All | ✅ Done | Env-variable toggles | -| Property record matching | HomeTitle | ✅ Done | Fuzzy string matching | -| Change detection (ownership, liens) | HomeTitle | ✅ Done | County deed scanning | -| Watchlist management | HomeTitle | ✅ Done | | -| Scheduled county deed scanning | HomeTitle | ✅ Done | | -| Alert pipeline | HomeTitle | ✅ Done | Severity classification | -| Data broker removal requests | RemoveBrokers | ✅ Done | | -| Broker API integration | RemoveBrokers | ✅ Done | With caching | -| User auth (JWT, RBAC) | Shared | ✅ Done | NextAuth.js | -| Family group management | Shared | ✅ Done | | -| Stripe subscriptions & billing | Shared | ✅ Done | Tier-based feature gating | -| Email (Resend) | Shared | ✅ Done | Transactional + marketing | -| Push notifications (FCM/APNs) | Shared | ✅ Done | Android + iOS | -| SMS (Twilio) | Shared | ✅ Done | | -| Mixpanel analytics (30+ events) | Shared | ✅ Done | KPI tracking | -| Datadog APM + Sentry | Shared | ✅ Done | Full observability | -| Cross-service event correlation | Shared | ✅ Done | Alert correlation engine | -| Browser extension (MV3) | Extension | ✅ Done | Phishing detection | -| Mobile app (Expo RN) | Mobile | ✅ Done | iOS + Android | -| Shared UI component library | Shared UI | ✅ Done | SolidJS | -| CI/CD pipelines | DevOps | ✅ Done | GitHub Actions | -| Terraform infrastructure | DevOps | ✅ Done | AWS ECS, RDS, ElastiCache | -| Load testing (k6) | DevOps | ✅ Done | VoicePrint + DarkWatch | -| Docker + Compose | DevOps | ✅ Done | Dev + prod configs | -| Integration tests | QA | ⏳ In Progress | Coverage expanding | -| Rate limit tests | QA | ⏳ In Progress | | +``` +kordant/ +├── web/ # SolidStart monolith (frontend + tRPC backend) +│ ├── src/ +│ │ ├── routes/ # Page routes (landing, auth, dashboard) +│ │ ├── components/ # UI components (primitives, layouts, widgets) +│ │ ├── server/ # tRPC routers, services, database, jobs +│ │ ├── hooks/ # Solid hooks +│ │ ├── lib/ # Shared utilities +│ │ └── theme/ # Generated design tokens +│ └── Dockerfile +├── browser-ext/ # Chrome Manifest V3 extension +├── iOS/Kordant/ # SwiftUI native iOS app +├── android/ # Jetpack Compose native Android app +├── design-tokens/ # Brand tokens (single source of truth) +├── docs/ # Brand guidelines, runbooks +├── scripts/ # Build and deployment scripts +├── tasks/ # Project task tracking +├── docker-compose.yml # Local dev (web + postgres + redis) +├── docker-compose.prod.yml # Production deployment +└── .github/workflows/ # CI/CD pipelines +``` --- @@ -113,25 +90,24 @@ Backed by ML models (ECAPA-TDNN, BERT) and a real-time alert pipeline, Kordant g | Layer | Technology | |-------|-----------| -| **Language** | TypeScript (Node.js ≥20) | -| **API** | Fastify 5 (CORS, Helmet, rate-limit, Swagger, multipart) | -| **Frontend** | SolidJS + Vite | -| **Mobile** | React Native / Expo SDK 51 | +| **Language** | TypeScript (Node.js ≥22) | +| **Framework** | SolidStart (SSR + API server) | +| **API** | tRPC (type-safe RPC) | +| **Database** | PostgreSQL 16 (Drizzle ORM) | +| **Cache / Queue** | Redis 7 | +| **Styling** | Tailwind CSS + CSS custom properties | +| **Mobile iOS** | SwiftUI (native) | +| **Mobile Android** | Jetpack Compose (native) | | **Extension** | Chrome Manifest V3 | -| **Databases** | PostgreSQL 15/16 (Prisma ORM) + Turso/SQLite (Drizzle) | -| **Cache / Queue** | Redis + BullMQ | -| **Auth** | NextAuth.js + JWT | +| **Auth** | JWT + session cookies | | **Billing** | Stripe | | **Email** | Resend | | **Push** | Firebase Cloud Messaging + APNs | | **SMS** | Twilio | -| **Analytics** | Mixpanel / Segment | -| **Monitoring** | Datadog APM + Sentry | -| **ML Models** | ECAPA-TDNN (voice), BERT (SMS), FAISS (vector index) | -| **Infrastructure** | Terraform (AWS ECS Fargate, RDS, ElastiCache, S3, ALB) | -| **CI/CD** | GitHub Actions | -| **Monorepo** | pnpm workspaces + Turborepo | -| **Testing** | Vitest, Jest, k6 | +| **Design Tokens** | JSON → generated TS/Swift/XML | +| **CI/CD** | Vercel (web) + Docker (scheduler) | +| **Monorepo** | pnpm workspaces | +| **Testing** | Vitest | --- @@ -139,160 +115,96 @@ Backed by ML models (ECAPA-TDNN, BERT) and a real-time alert pipeline, Kordant g ### Prerequisites -- Node.js >= 20.0.0 +- Node.js >= 22.0.0 - pnpm >= 9.0.0 -- Docker & Docker Compose ### Setup ```bash -# Install all dependencies +# Install dependencies pnpm install -# Start local infrastructure (Postgres, Redis, Mailhog) -docker compose up -d - # Copy environment variables cp .env.example .env +# Edit .env with your Turso credentials +# DATABASE_URL=libsql://your-db.turso.io +# DATABASE_AUTH_TOKEN=your-token + # Run database migrations pnpm db:migrate -# Start all development servers +# Start development server pnpm dev ``` -This launches the API server, all microservices, and the web frontend concurrently via Turborepo. +The web app runs at `http://localhost:3000`. --- -## Building +## Design Tokens + +All platforms (web, iOS, Android) share the same design tokens defined in `design-tokens/`: + +``` +design-tokens/ +├── colors.json # Brand, semantic, background, text, border colors +├── typography.json # Font family, scale, weights +├── spacing.json # 4px-based spacing scale +├── shadows.json # Elevation definitions +└── radius.json # Border radius scale +``` + +Generate platform-specific code: ```bash -# Build all packages and services -pnpm build - -# Build individual Docker images -docker build -f packages/api/Dockerfile -t kordant-api . -docker build -f services/spamshield/Dockerfile -t kordant-spamshield . -docker build -f services/darkwatch/Dockerfile -t kordant-darkwatch . -docker build -f services/voiceprint/Dockerfile -t kordant-voiceprint . +node scripts/generate-tokens.mjs ``` +This produces: +- `web/src/theme/tokens.ts` — TypeScript constants +- `iOS/Kordant/Theme/GeneratedTokens.swift` — SwiftUI colors + spacing +- `android/.../res/values/generated_tokens.xml` — Android resources + +See `docs/BRAND_GUIDELINES.md` for full brand guidelines. + --- -## Testing +## Deployment + +| Component | Platform | Notes | +|-----------|----------|-------| +| Web app | Vercel | git push auto-deploys | +| Database | Turso (managed) | run `pnpm db:migrate` to apply schema changes | +| Background jobs | Docker on `pan` | scheduler + Redis containers | + +### Setting up the Scheduler (pan server) + +The background job scheduler (dark web scans, reports, etc.) runs as Docker containers on your `pan` server. Run the setup script from anywhere: ```bash -# Run all tests -pnpm test +# From dev machine (SSHs into pan): +bash scripts/setup-pan.sh -# With coverage -pnpm test:coverage - -# Individual service tests -pnpm test --filter @kordant/spamshield -pnpm test --filter @kordant/darkwatch -pnpm test --filter @kordant/voiceprint -pnpm test --filter @kordant/hometitle - -# Integration & E2E -cd packages/integration-tests && pnpm test -cd packages/integration-tests && pnpm test:e2e - -# Load tests (requires k6) -cd scripts/load-test && ./run-all.sh +# Or directly on pan: +sudo bash scripts/setup-pan.sh ``` ---- +This installs Docker + Compose, clones the repo to `/opt/kordant`, creates a systemd service, and starts the scheduler. See the script for details and the optional Gitea post-receive hook for auto-deploy on push. -## Production +### Scripts -### Docker Compose - -```bash -docker compose -f docker-compose.prod.yml up -d -``` - -### CI/CD Pipeline (GitHub Actions) - -| Event | Deploy To | -|-------|-----------| -| Push to `main` | Staging | -| GitHub Release created | Production | - -Pipeline stages: `lint` → `typecheck` → `test` → `Docker build` → `push to GHCR` → `Terraform apply` → `ECS deploy` → `health check` → auto-rollback on failure. - -### Infrastructure - -All infrastructure lives in `infra/` and is managed with Terraform: - -- **Compute**: AWS ECS Fargate (API + services + workers) -- **Database**: RDS PostgreSQL 15/16 -- **Cache**: ElastiCache Redis -- **Storage**: S3 (reports, audio samples) -- **Networking**: VPC, ALB, security groups -- **Observability**: CloudWatch + Datadog -- **Secrets**: AWS Secrets Manager - -See `infra/README.md` and `infra/ROLLBACK.md` for detailed operational runbooks. - ---- - -## Project Structure - -``` -kordant/ -├── packages/ # Shared libraries (20 packages) -│ ├── api/ # Fastify API server -│ ├── core/ # Core shared logic -│ ├── db/ # Prisma schemas (v6) -│ ├── shared-db/ # Prisma schemas (v5) -│ ├── shared-auth/ # NextAuth.js -│ ├── shared-billing/ # Stripe subscriptions -│ ├── shared-notifications/ # Email, Push, SMS -│ ├── shared-analytics/ # Mixpanel/Segment -│ ├── shared-ui/ # SolidJS components -│ ├── shared-utils/ # Utilities -│ ├── types/ # Shared TypeScript types -│ ├── mobile/ # React Native / Expo app -│ ├── extension/ # Browser extension (MV3) -│ ├── jobs/ # BullMQ workers -│ ├── monitoring/ # Datadog + Sentry -│ ├── report/ # PDF generation -│ ├── correlation/ # Event correlation -│ ├── mobile-api-client/ # RN API client -│ └── integration-tests/ # E2E tests -├── services/ # Microservices (5) -│ ├── voiceprint/ # Voice cloning detection -│ ├── darkwatch/ # Dark web monitoring -│ ├── spamshield/ # Spam call/SMS blocking -│ ├── hometitle/ # Home title fraud -│ └── removebrokers/ # Data broker removal -├── infra/ # Terraform (AWS) -├── docs/ # Documentation -├── plans/ # Product & technical plans -├── scripts/ # Utility scripts -├── load-tests/ # k6 load test scripts -├── assets/ # Ad creative assets -└── server/ # Legacy WebSocket server -``` - ---- - -## Documentation - -| Document | Location | -|----------|----------| -| Product Plan | `plans/Kordant-product-plan.md` | -| Technical Architecture | `plans/Kordant-technical-architecture.md` | -| Infrastructure | `infra/README.md` | -| Rollback Runbook | `infra/ROLLBACK.md` | -| Stripe Integration | `docs/STRIPE_INTEGRATION.md` | -| Push Notifications | `docs/PUSH_NOTIFICATIONS_SETUP.md` | -| Mobile Push Integration | `docs/MOBILE_PUSH_INTEGRATION.md` | -| Mixpanel Analytics | `docs/MIXPANEL_ANALYTICS.md` | -| Code Review Workflow | `kordant-workflow.md` | +| Command | Description | +|---------|-------------| +| `pnpm dev` | Start web dev server | +| `pnpm build` | Build web app for production | +| `pnpm test` | Run web tests | +| `pnpm lint` | Lint web app | +| `pnpm db:migrate` | Run database migrations | +| `pnpm db:seed` | Seed database with test data | +| `pnpm build:ext` | Build browser extension | +| `node scripts/generate-tokens.mjs` | Generate platform design tokens | +| `bash scripts/setup-pan.sh` | Deploy scheduler to pan server | --- diff --git a/android/app/src/main/res/values/generated_tokens.xml b/android/app/src/main/res/values/generated_tokens.xml new file mode 100644 index 0000000..73a0e33 --- /dev/null +++ b/android/app/src/main/res/values/generated_tokens.xml @@ -0,0 +1,56 @@ + + + + + + #4F46E5 + #818CF8 + #4338CA + #06B6D4 + #67E8F9 + #0891B2 + + + #FAFBFC + #F3F4F6 + #111827 + #6B7280 + #E5E7EB + + #111827 + #1F2937 + #F9FAFB + #D1D5DB + #374151 + + 0dp + 4dp + 8dp + 16dp + 24dp + 32dp + 48dp + 64dp + + 0dp + 4dp + 8dp + 12dp + 16dp + 9999dp + + 12sp + 16sp + 16sp + 24sp + 18sp + 28sp + 20sp + 28sp + 24sp + 32sp + 32sp + 40sp + 48sp + 56sp + diff --git a/assets/ads/gd_landscape_1200x628.png b/assets/ads/gd_landscape_1200x628.png deleted file mode 100644 index 3eafcfb..0000000 Binary files a/assets/ads/gd_landscape_1200x628.png and /dev/null differ diff --git a/assets/ads/gd_landscape_1200x628.svg b/assets/ads/gd_landscape_1200x628.svg deleted file mode 100644 index b6c198b..0000000 --- a/assets/ads/gd_landscape_1200x628.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - AI-Powered Protection - - - -Your Family Deserves -AI Protection - -Real-time AI voice clone detection -Dark web monitoring • Spam blocking - - -Join the Waitlist - \ No newline at end of file diff --git a/assets/ads/gd_portrait_600x750.png b/assets/ads/gd_portrait_600x750.png deleted file mode 100644 index 0102b6f..0000000 Binary files a/assets/ads/gd_portrait_600x750.png and /dev/null differ diff --git a/assets/ads/gd_portrait_600x750.svg b/assets/ads/gd_portrait_600x750.svg deleted file mode 100644 index 4529665..0000000 --- a/assets/ads/gd_portrait_600x750.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Voice Clone -Detection - -AI detects synthetic voices -in real time with 99.7% accuracy - - -Learn How We Detect It - -Kordant — AI-Powered Identity Protection - \ No newline at end of file diff --git a/assets/ads/gd_square_1200x1200.png b/assets/ads/gd_square_1200x1200.png deleted file mode 100644 index 42b5883..0000000 Binary files a/assets/ads/gd_square_1200x1200.png and /dev/null differ diff --git a/assets/ads/gd_square_1200x1200.svg b/assets/ads/gd_square_1200x1200.svg deleted file mode 100644 index 69e76d7..0000000 --- a/assets/ads/gd_square_1200x1200.svg +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - -3 Protections, 1 Platform -AI-Powered Identity Protection for Everyone - - - - - - -VoicePrint -AI Voice Clone Detection - - - - - - -DarkWatch -Dark Web Monitoring - - - - - - -SpamShield -Spam Call & Text Blocking -Join 1,000+ Early Adopters - \ No newline at end of file diff --git a/assets/ads/generate_assets.py b/assets/ads/generate_assets.py deleted file mode 100644 index 73d3706..0000000 --- a/assets/ads/generate_assets.py +++ /dev/null @@ -1,633 +0,0 @@ -#!/usr/bin/env python3 -"""Generate Kordant ad creative SVGs for Google Display and Meta campaigns.""" - -import os - -OUT = os.path.join(os.path.dirname(__file__)) - -# Brand colors -DARK_BG = "#0a0f1e" -CARD_BG = "#1a2332" -TEXT_PRIMARY = "#f1f5f9" -TEXT_SECONDARY = "#94a3b8" -TEXT_MUTED = "#64748b" -ACCENT_BLUE = "#3b82f6" -ACCENT_CYAN = "#06b6d4" -SUCCESS = "#22c55e" -ERROR = "#ef4444" -WARNING = "#f59e0b" -BORDER = "#1e293b" - -def shield_logo_svg(size=40, x=0, y=0): - return f''' - - - -''' - -def brand_bar(w, h): - return f'''''' - -def safe_text(text, max_len=80): - return text[:max_len] if len(text) > max_len else text - -# ============================================================ -# GOOGLE DISPLAY ASSETS -# ============================================================ - -def gd_square(): - """1:1 (1200x1200) — '3 Protections, 1 Platform' three-icon panel""" - w, h = 1200, 1200 - icon_size = 100 - box_w, box_h = 280, 320 - gap = 60 - total_w = 3 * box_w + 2 * gap - start_x = (w - total_w) // 2 - top_y = 300 - - icons_data = [ - ("VoicePrint", "AI Voice Clone Detection", ACCENT_CYAN, [ - "M0,-40 Q30,-35 40,-10 Q45,5 35,20 L25,30 L0,40 L-25,30 L-35,20 Q-45,5 -40,-10 Q-30,-35 0,-40 Z", - "M-12,0 L-4,8 L12,-10" - ]), - ("DarkWatch", "Dark Web Monitoring", ACCENT_BLUE, [ - "M-35,-30 L35,-30 L40,10 Q40,30 25,40 L0,45 L-25,40 Q-40,30 -40,10 Z", - "M0,5 L0,25 M-10,15 L10,15" - ]), - ("SpamShield", "Spam Call & Text Blocking", SUCCESS, [ - "M-40,-10 Q-40,-40 0,-40 Q40,-40 40,-10 Q40,15 20,30 L0,40 L-20,30 Q-40,15 -40,-10 Z", - "M-15,0 L-5,10 L18,-12" - ]), - ] - - svg = f''' - - - - - - - - - - - - - - - -{brand_bar(w, 6)} -3 Protections, 1 Platform -AI-Powered Identity Protection for Everyone''' - - for i, (name, desc, color, paths) in enumerate(icons_data): - cx = start_x + i * (box_w + gap) + box_w // 2 - cy = top_y + box_h // 2 - - svg += f''' -''' - svg += f''' - - - - -''' - svg += f''' -{name} -{desc}''' - - svg += f''' -Join 1,000+ Early Adopters -''' - return svg - - -def gd_landscape(): - """1.91:1 (1200x628) — 'Your Family Deserves AI Protection' family + shield""" - w, h = 1200, 628 - svg = f''' - - - - - - - - - - - - - - - - -{brand_bar(w, 5)} - - - - - - - - - AI-Powered Protection - - - -Your Family Deserves -AI Protection - -Real-time AI voice clone detection -Dark web monitoring • Spam blocking - - -Join the Waitlist -''' - return svg - - -def gd_portrait(): - """4:5 (600x750) — 'Voice Clone Detection' phone call visualization""" - w, h = 600, 750 - svg = f''' - - - - - - - - - - - - - - - -{brand_bar(w, 5)} - - - - - - - - - - - - - - - - - -Voice Clone -Detection - -AI detects synthetic voices -in real time with 99.7% accuracy - - -Learn How We Detect It - -Kordant — AI-Powered Identity Protection -''' - return svg - - -# ============================================================ -# META CREATIVE A: Voice Clone Threat -# ============================================================ - -def meta_a_1x1(): - """1:1 (1080x1080) — split-screen family / AI distortion""" - w, h = 1080, 1080 - half = w // 2 - svg = f''' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Your Family -Real & Unfiltered - - - - - - - - - - - - - - - - - - - -AI Clone -Synthetic & Dangerous - - - -Your Family's Voice, Protected -Kordant detects AI voice cloning with 99.7% accuracy -''' - return svg - - -def meta_a_191(): - """1.91:1 (1200x628) — split-screen family / AI distortion""" - w, h = 1200, 628 - half = w // 2 - svg = f''' - - - - - - - - - - - - - - - - - - - - - - -Your Family - -Real voice, real moment - - - - - - - - -AI Clone - -Synthetic voice clone - -Your Family's Voice, Protected -''' - return svg - - -# ============================================================ -# META CREATIVE B: Dark Web -# ============================================================ - -def meta_b_1x1(): - """1:1 (1080x1080) — dark terminal HUD aesthetic""" - w, h = 1080, 1080 - svg = f''' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -darkwatch@kordant:~$ - - -> Scanning 150+ dark web marketplaces... -> Analyzing breach databases... - -! ALERT: MATCHES FOUND - - -email:***@gmail.com — 3 breaches - - -phone:+1 (555) ***-8842 — 2 breaches - - -ssn:***-**-6781 — 1 breach - -> Total exposures found: 5,284 -> Run scan on your data? [Y/n] _ - - - -Scan Your Email Free - -Kordant DarkWatch — 24/7 Dark Web Monitoring - -5K+ Exposures Found. -What About Yours? -''' - return svg - - -def meta_b_45(): - """4:5 (1080x1350) — dark terminal HUD""" - w, h = 1080, 1350 - svg = f''' - - - - - - - - - - - - - - - - - - - -darkwatch@kordant:~$ - -> Scanning 150+ dark web marketplaces... -> Cross-referencing databases... - -! ALERT: DATA EXPOSED - - -email:***@gmail.com — 3 breaches - - -phone:+1 (555) ***-8842 — 2 breaches - - -ssn:***-**-6781 — 1 breach - - -Address:*** Oak St — 1 breach - -> Total exposures monitored: 5,284 -> Run scan on your data? [Y/n] _ - -Your Data May Already Be -For Sale on the Dark Web - -Kordant scans 150+ marketplaces 24/7 and alerts you instantly - - -Scan Your Email Free - -Kordant — AI-Powered Identity Protection for Everyone -''' - return svg - - -# ============================================================ -# META CREATIVE C: 3 Protections -# ============================================================ - -def meta_c_1x1(): - """1:1 (1080x1080) — three-panel layout""" - w, h = 1080, 1080 - panel_w, panel_h = 300, 400 - gap = 30 - total_w = 3 * panel_w + 2 * gap - start_x = (w - total_w) // 2 - top_y = 280 - - panels = [ - ("VoicePrint", ACCENT_CYAN, "AI Voice Clone\nDetection", "Real-time detection\nof synthetic voices\nwith 99.7% accuracy"), - ("DarkWatch", ACCENT_BLUE, "Dark Web\nMonitoring", "24/7 scanning of\n150+ marketplaces\nfor your data"), - ("SpamShield", SUCCESS, "Spam Call &\nText Blocking", "AI-powered filtering\nof spam calls\nand text messages"), - ] - - svg = f''' - - - - - - - - - - - -{brand_bar(w, 6)} - -3 Ways Kordant Protects Your Family -VoicePrint + DarkWatch + SpamShield''' - - for i, (name, color, title, desc) in enumerate(panels): - px = start_x + i * (panel_w + gap) - py = top_y - cx = px + panel_w // 2 - icon_y = py + 60 - - svg += f''' - - -{name}''' - - lines = title.split('\n') - for li, line in enumerate(lines): - svg += f''' -{line}''' - - desc_lines = desc.split('\n') - for li, line in enumerate(desc_lines): - svg += f''' -{line}''' - - svg += f''' - -Join the Waitlist - -Three critical protections, one powerful platform -Start free. Launching soon. -''' - return svg - - -# ============================================================ -# META CREATIVE D: Family Protection -# ============================================================ - -def meta_d_base(w, h, small=False): - """Family protection — multi-generational family with digital shield overlay""" - svg = f''' - - - - - - - - - - - - - - - - - - - - -{brand_bar(w, 5)} - - - - - - - - - -{g_family_figures(w, h)} - -Protect Your Whole Family -AI voice clone detection + dark web monitoring + spam blocking -for up to unlimited family members on Premium - - -Protect My Family -''' - return svg - - -def g_family_figures(w, h): - """Generate simple family figure silhouettes.""" - cx = w // 2 - base_y = h // 2 + 60 - return f''' - - - - - - - - - - - - - - - - - - - -''' - - -def meta_d_1x1(): - return meta_d_base(1080, 1080) - -def meta_d_191(): - return meta_d_base(1200, 628) - -def meta_d_45(): - return meta_d_base(1080, 1350) - - -# ============================================================ -# GENERATE ALL -# ============================================================ - -if __name__ == "__main__": - assets = [ - # Google Display - ("gd_square_1200x1200.svg", gd_square()), - ("gd_landscape_1200x628.svg", gd_landscape()), - ("gd_portrait_600x750.svg", gd_portrait()), - # Meta Creative A - ("meta_a_1x1_1080x1080.svg", meta_a_1x1()), - ("meta_a_191_1200x628.svg", meta_a_191()), - # Meta Creative B - ("meta_b_1x1_1080x1080.svg", meta_b_1x1()), - ("meta_b_45_1080x1350.svg", meta_b_45()), - # Meta Creative C - ("meta_c_1x1_1080x1080.svg", meta_c_1x1()), - # Meta Creative D - ("meta_d_1x1_1080x1080.svg", meta_d_1x1()), - ("meta_d_191_1200x628.svg", meta_d_191()), - ("meta_d_45_1080x1350.svg", meta_d_45()), - ] - - for name, svg in assets: - path = os.path.join(OUT, name) - with open(path, 'w') as f: - f.write(svg) - print(f"Created: {name} ({len(svg)} bytes)") - - print(f"\nDone. Generated {len(assets)} SVG files in {OUT}") diff --git a/assets/ads/linkedin/variant1_professional.jpg b/assets/ads/linkedin/variant1_professional.jpg deleted file mode 100644 index de9cd15..0000000 Binary files a/assets/ads/linkedin/variant1_professional.jpg and /dev/null differ diff --git a/assets/ads/linkedin/variant1_professional.svg b/assets/ads/linkedin/variant1_professional.svg deleted file mode 100644 index 744ed0c..0000000 --- a/assets/ads/linkedin/variant1_professional.svg +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AI Voice Cloning - Is the New Phishing Threat - - - - - Cybercriminals are using AI-generated voice clones - to impersonate executives and family members. - Kordant detects synthetic voices in real time. - - - - - Learn More → - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Kordant - AI-Powered Identity Protection for Everyone - - diff --git a/assets/ads/linkedin/variant2_datasecurity.jpg b/assets/ads/linkedin/variant2_datasecurity.jpg deleted file mode 100644 index 74497f4..0000000 Binary files a/assets/ads/linkedin/variant2_datasecurity.jpg and /dev/null differ diff --git a/assets/ads/linkedin/variant2_datasecurity.svg b/assets/ads/linkedin/variant2_datasecurity.svg deleted file mode 100644 index af60e13..0000000 --- a/assets/ads/linkedin/variant2_datasecurity.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DarkWatch Terminal — Scan Results - - - $ ./darkwatch --scan --deep - Scanning 178 dark web marketplaces... - Checking credentials associated with target@email.com - Checking phone: +1 (555) ***-**** - Scan complete. Found 12 exposures. - - - - - CRITICAL: Email + password exposed on 3 marketplaces - - - - email@example.com - P@ssw0rd123! - LEAKED - - - +1 (555) 234-5678 - [HASHED] - LEAKED - - - SSN: ***-**-1234 - [REDACTED] - HIGH RISK - - - - - Your Personal Data - Is on the Dark Web - - - - 70% of data breaches expose employee - personal contact info. Kordant's DarkWatch - scans 100+ marketplaces daily for - exposed emails, phones, and SSNs. - - - - - - 178 - Marketplaces - - - 24/7 - Monitoring - - - 99.7% - Accuracy - - - - - Monitor Your Data → - - - - - - - - - - Kordant - AI-Powered Identity Protection for Everyone - - diff --git a/assets/ads/linkedin/variant3_family_professional.jpg b/assets/ads/linkedin/variant3_family_professional.jpg deleted file mode 100644 index fa357cf..0000000 Binary files a/assets/ads/linkedin/variant3_family_professional.jpg and /dev/null differ diff --git a/assets/ads/linkedin/variant3_family_professional.svg b/assets/ads/linkedin/variant3_family_professional.svg deleted file mode 100644 index 51514b1..0000000 --- a/assets/ads/linkedin/variant3_family_professional.svg +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Work Protection - - - - - - AI voice clone detection - - Dark web monitoring - - Spam call/text blocking - - Enterprise-grade security - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Family Safety - - - - - - Unlimited family members - - Senior scam protection - - Real-time alerts to family - - 24/7 support for all members - - - - - - - - - - - Unified by - Kordant - - - - - One Platform. - Work Protection + - Family Safety. - - - - - Join 1,000+ Early Adopters → - - - - - - - - - - Kordant - AI-Powered Identity Protection for Everyone - - diff --git a/assets/ads/meta_a_191_1200x628.png b/assets/ads/meta_a_191_1200x628.png deleted file mode 100644 index a62957e..0000000 Binary files a/assets/ads/meta_a_191_1200x628.png and /dev/null differ diff --git a/assets/ads/meta_a_191_1200x628.svg b/assets/ads/meta_a_191_1200x628.svg deleted file mode 100644 index ebe754d..0000000 --- a/assets/ads/meta_a_191_1200x628.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -Your Family - -Real voice, real moment - - - - - - - - -AI Clone - -Synthetic voice clone - -Your Family's Voice, Protected - \ No newline at end of file diff --git a/assets/ads/meta_a_1x1_1080x1080.png b/assets/ads/meta_a_1x1_1080x1080.png deleted file mode 100644 index fdc6424..0000000 Binary files a/assets/ads/meta_a_1x1_1080x1080.png and /dev/null differ diff --git a/assets/ads/meta_a_1x1_1080x1080.svg b/assets/ads/meta_a_1x1_1080x1080.svg deleted file mode 100644 index 7ce81d6..0000000 --- a/assets/ads/meta_a_1x1_1080x1080.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Your Family -Real & Unfiltered - - - - - - - - - - - - - - - - - - - -AI Clone -Synthetic & Dangerous - - - -Your Family's Voice, Protected -Kordant detects AI voice cloning with 99.7% accuracy - \ No newline at end of file diff --git a/assets/ads/meta_b_1x1_1080x1080.png b/assets/ads/meta_b_1x1_1080x1080.png deleted file mode 100644 index f4c446d..0000000 Binary files a/assets/ads/meta_b_1x1_1080x1080.png and /dev/null differ diff --git a/assets/ads/meta_b_1x1_1080x1080.svg b/assets/ads/meta_b_1x1_1080x1080.svg deleted file mode 100644 index 4ee93af..0000000 --- a/assets/ads/meta_b_1x1_1080x1080.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -darkwatch@kordant:~$ - - -> Scanning 150+ dark web marketplaces... -> Analyzing breach databases... - -! ALERT: MATCHES FOUND - - -email:***@gmail.com — 3 breaches - - -phone:+1 (555) ***-8842 — 2 breaches - - -ssn:***-**-6781 — 1 breach - -> Total exposures found: 5,284 -> Run scan on your data? [Y/n] _ - - - -Scan Your Email Free - -Kordant DarkWatch — 24/7 Dark Web Monitoring - -5K+ Exposures Found. -What About Yours? - \ No newline at end of file diff --git a/assets/ads/meta_b_45_1080x1350.png b/assets/ads/meta_b_45_1080x1350.png deleted file mode 100644 index 3d45cc7..0000000 Binary files a/assets/ads/meta_b_45_1080x1350.png and /dev/null differ diff --git a/assets/ads/meta_b_45_1080x1350.svg b/assets/ads/meta_b_45_1080x1350.svg deleted file mode 100644 index 9999637..0000000 --- a/assets/ads/meta_b_45_1080x1350.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -darkwatch@kordant:~$ - -> Scanning 150+ dark web marketplaces... -> Cross-referencing databases... - -! ALERT: DATA EXPOSED - - -email:***@gmail.com — 3 breaches - - -phone:+1 (555) ***-8842 — 2 breaches - - -ssn:***-**-6781 — 1 breach - - -Address:*** Oak St — 1 breach - -> Total exposures monitored: 5,284 -> Run scan on your data? [Y/n] _ - -Your Data May Already Be -For Sale on the Dark Web - -Kordant scans 150+ marketplaces 24/7 and alerts you instantly - - -Scan Your Email Free - -Kordant — AI-Powered Identity Protection for Everyone - \ No newline at end of file diff --git a/assets/ads/meta_c_1x1_1080x1080.png b/assets/ads/meta_c_1x1_1080x1080.png deleted file mode 100644 index 2eb4429..0000000 Binary files a/assets/ads/meta_c_1x1_1080x1080.png and /dev/null differ diff --git a/assets/ads/meta_c_1x1_1080x1080.svg b/assets/ads/meta_c_1x1_1080x1080.svg deleted file mode 100644 index 53b65f3..0000000 --- a/assets/ads/meta_c_1x1_1080x1080.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - -3 Ways Kordant Protects Your Family -VoicePrint + DarkWatch + SpamShield - - -VoicePrint -AI Voice Clone -Detection -Real-time detection -of synthetic voices -with 99.7% accuracy - - -DarkWatch -Dark Web -Monitoring -24/7 scanning of -150+ marketplaces -for your data - - -SpamShield -Spam Call & -Text Blocking -AI-powered filtering -of spam calls -and text messages - -Join the Waitlist - -Three critical protections, one powerful platform -Start free. Launching soon. - \ No newline at end of file diff --git a/assets/ads/meta_d_191_1200x628.png b/assets/ads/meta_d_191_1200x628.png deleted file mode 100644 index db5fe38..0000000 Binary files a/assets/ads/meta_d_191_1200x628.png and /dev/null differ diff --git a/assets/ads/meta_d_191_1200x628.svg b/assets/ads/meta_d_191_1200x628.svg deleted file mode 100644 index 067908a..0000000 --- a/assets/ads/meta_d_191_1200x628.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Protect Your Whole Family -AI voice clone detection + dark web monitoring + spam blocking -for up to unlimited family members on Premium - - -Protect My Family - \ No newline at end of file diff --git a/assets/ads/meta_d_1x1_1080x1080.png b/assets/ads/meta_d_1x1_1080x1080.png deleted file mode 100644 index 0996d0e..0000000 Binary files a/assets/ads/meta_d_1x1_1080x1080.png and /dev/null differ diff --git a/assets/ads/meta_d_1x1_1080x1080.svg b/assets/ads/meta_d_1x1_1080x1080.svg deleted file mode 100644 index 0115d67..0000000 --- a/assets/ads/meta_d_1x1_1080x1080.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Protect Your Whole Family -AI voice clone detection + dark web monitoring + spam blocking -for up to unlimited family members on Premium - - -Protect My Family - \ No newline at end of file diff --git a/assets/ads/meta_d_45_1080x1350.png b/assets/ads/meta_d_45_1080x1350.png deleted file mode 100644 index 69c911b..0000000 Binary files a/assets/ads/meta_d_45_1080x1350.png and /dev/null differ diff --git a/assets/ads/meta_d_45_1080x1350.svg b/assets/ads/meta_d_45_1080x1350.svg deleted file mode 100644 index e295d27..0000000 --- a/assets/ads/meta_d_45_1080x1350.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Protect Your Whole Family -AI voice clone detection + dark web monitoring + spam blocking -for up to unlimited family members on Premium - - -Protect My Family - \ No newline at end of file diff --git a/bun.lock b/bun.lock deleted file mode 100644 index 8d95a11..0000000 --- a/bun.lock +++ /dev/null @@ -1,2168 +0,0 @@ -{ - "lockfileVersion": 1, - "configVersion": 1, - "workspaces": { - "": { - "name": "kordant", - "devDependencies": { - "@types/node": "^25.6.0", - "@vitest/coverage-v8": "^4.1.5", - "turbo": "^2.3.0", - "typescript": "^5.7.0", - "vitest": "^4.1.5", - }, - }, - "browser-ext": { - "name": "browser-ext", - "version": "0.1.0", - }, - "web": { - "name": "web", - "dependencies": { - "@solidjs/meta": "^0.29.4", - "@solidjs/router": "^0.15.0", - "@solidjs/start": "2.0.0-alpha.2", - "@solidjs/vite-plugin-nitro-2": "^0.1.0", - "@tailwindcss/vite": "^4.0.0", - "@trpc/client": "^10.45.2", - "@trpc/server": "^10.45.2", - "@types/three": "^0.184.1", - "@typeschema/valibot": "^0.13.4", - "bcryptjs": "^3.0.3", - "bullmq": "^5.77.3", - "clerk-solidjs": "^2.0.10", - "drizzle-orm": "^0.45.2", - "firebase-admin": "^13.10.0", - "ioredis": "^5.10.1", - "jose": "^5", - "node-cron": "^4.2.1", - "pg": "^8.21.0", - "puppeteer": "^25.0.4", - "resend": "^6.12.4", - "solid-js": "^1.9.5", - "stripe": "^22.1.1", - "tailwindcss": "^4.0.0", - "three": "^0.184.0", - "twilio": "^6.0.2", - "valibot": "^0.29.0", - "vite": "^7.0.0", - }, - "devDependencies": { - "@types/node-cron": "^3.0.11", - "@types/pg": "^8.20.0", - "drizzle-kit": "^0.31.10", - "jsdom": "^29.1.1", - "tsx": "^4.22.3", - "vite-plugin-solid": "^2.11.12", - "vitest": "^4.1.5", - }, - }, - }, - "packages": { - "@asamuzakjp/css-color": ["@asamuzakjp/css-color@5.1.11", "", { "dependencies": { "@asamuzakjp/generational-cache": "1.0.1", "@csstools/css-calc": "3.2.1", "@csstools/css-color-parser": "4.1.1", "@csstools/css-parser-algorithms": "4.0.0", "@csstools/css-tokenizer": "4.0.0" } }, "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg=="], - - "@asamuzakjp/dom-selector": ["@asamuzakjp/dom-selector@7.1.1", "", { "dependencies": { "@asamuzakjp/generational-cache": "1.0.1", "@asamuzakjp/nwsapi": "2.3.9", "bidi-js": "1.0.3", "css-tree": "3.2.1", "is-potential-custom-element-name": "1.0.1" } }, "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ=="], - - "@asamuzakjp/generational-cache": ["@asamuzakjp/generational-cache@1.0.1", "", {}, "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg=="], - - "@asamuzakjp/nwsapi": ["@asamuzakjp/nwsapi@2.3.9", "", {}, "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q=="], - - "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "7.29.7", "js-tokens": "4.0.0", "picocolors": "1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], - - "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], - - "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "7.29.7", "@babel/generator": "7.29.7", "@babel/helper-compilation-targets": "7.29.7", "@babel/helper-module-transforms": "7.29.7", "@babel/helpers": "7.29.7", "@babel/parser": "7.29.7", "@babel/template": "7.29.7", "@babel/traverse": "7.29.7", "@babel/types": "7.29.7", "@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" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], - - "@babel/generator": ["@babel/generator@7.29.7", "", { "dependencies": { "@babel/parser": "7.29.7", "@babel/types": "7.29.7", "@jridgewell/gen-mapping": "0.3.13", "@jridgewell/trace-mapping": "0.3.31", "jsesc": "3.1.0" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="], - - "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.29.7", "", { "dependencies": { "@babel/types": "7.29.7" } }, "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw=="], - - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "7.29.7", "@babel/helper-validator-option": "7.29.7", "browserslist": "4.28.2", "lru-cache": "5.1.1", "semver": "6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="], - - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.29.7", "", { "dependencies": { "@babel/helper-annotate-as-pure": "7.29.7", "@babel/helper-member-expression-to-functions": "7.29.7", "@babel/helper-optimise-call-expression": "7.29.7", "@babel/helper-replace-supers": "7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "7.29.7", "@babel/traverse": "7.29.7", "semver": "6.3.1" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg=="], - - "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], - - "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.29.7", "", { "dependencies": { "@babel/traverse": "7.29.7", "@babel/types": "7.29.7" } }, "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg=="], - - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "7.29.7", "@babel/types": "7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="], - - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "7.29.7", "@babel/helper-validator-identifier": "7.29.7", "@babel/traverse": "7.29.7" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="], - - "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.29.7", "", { "dependencies": { "@babel/types": "7.29.7" } }, "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong=="], - - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="], - - "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.29.7", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "7.29.7", "@babel/helper-optimise-call-expression": "7.29.7", "@babel/traverse": "7.29.7" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ=="], - - "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.29.7", "", { "dependencies": { "@babel/traverse": "7.29.7", "@babel/types": "7.29.7" } }, "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ=="], - - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], - - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="], - - "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "7.29.7", "@babel/types": "7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="], - - "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="], - - "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "7.29.7" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A=="], - - "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "7.29.7" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA=="], - - "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.29.7", "", { "dependencies": { "@babel/helper-module-transforms": "7.29.7", "@babel/helper-plugin-utils": "7.29.7" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ=="], - - "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.29.7", "", { "dependencies": { "@babel/helper-annotate-as-pure": "7.29.7", "@babel/helper-create-class-features-plugin": "7.29.7", "@babel/helper-plugin-utils": "7.29.7", "@babel/helper-skip-transparent-expression-wrappers": "7.29.7", "@babel/plugin-syntax-typescript": "7.29.7" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw=="], - - "@babel/preset-typescript": ["@babel/preset-typescript@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "7.29.7", "@babel/helper-validator-option": "7.29.7", "@babel/plugin-syntax-jsx": "7.29.7", "@babel/plugin-transform-modules-commonjs": "7.29.7", "@babel/plugin-transform-typescript": "7.29.7" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ=="], - - "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "7.29.7", "@babel/parser": "7.29.7", "@babel/types": "7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], - - "@babel/traverse": ["@babel/traverse@7.29.7", "", { "dependencies": { "@babel/code-frame": "7.29.7", "@babel/generator": "7.29.7", "@babel/helper-globals": "7.29.7", "@babel/parser": "7.29.7", "@babel/template": "7.29.7", "@babel/types": "7.29.7", "debug": "4.4.3" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="], - - "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "7.29.7", "@babel/helper-validator-identifier": "7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], - - "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], - - "@bramus/specificity": ["@bramus/specificity@2.4.2", "", { "dependencies": { "css-tree": "3.2.1" }, "bin": { "specificity": "bin/cli.js" } }, "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw=="], - - "@clerk/backend": ["@clerk/backend@1.34.0", "", { "dependencies": { "@clerk/shared": "^3.9.5", "@clerk/types": "^4.59.3", "cookie": "1.0.2", "snakecase-keys": "8.0.1", "tslib": "2.8.1" }, "peerDependencies": { "svix": "^1.62.0" }, "optionalPeers": ["svix"] }, "sha512-9rZ8hQJVpX5KX2bEpiuVXfpjhojQCiqCWADJDdCI0PCeKxn58Ep0JPYiIcczg4VKUc3a7jve9vXylykG2XajLQ=="], - - "@clerk/shared": ["@clerk/shared@2.22.1", "", { "dependencies": { "@clerk/types": "^4.46.1", "dequal": "2.0.3", "glob-to-regexp": "0.4.1", "js-cookie": "3.0.5", "std-env": "^3.7.0", "swr": "^2.2.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-0", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-AaPMypQXJAQgJGhN8+5VRE6/VKT9D+fI8o1dCvqXjQBcegpZWyK6Tqe9QH54Wl6qVj12Hv4qh2yH5ejEflm2KQ=="], - - "@clerk/types": ["@clerk/types@4.101.20", "", { "dependencies": { "@clerk/shared": "^3.47.2" } }, "sha512-MHvr1tGL5lwxD6zdzzixkHICbbZz/S1LChONKR52Qeu0yRGChZomPknsgqBMG9J3yNeyhaj0SWa5phQgQUk0lg=="], - - "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.2", "", {}, "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ=="], - - "@csstools/color-helpers": ["@csstools/color-helpers@6.0.2", "", {}, "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q=="], - - "@csstools/css-calc": ["@csstools/css-calc@3.2.1", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "4.0.0", "@csstools/css-tokenizer": "4.0.0" } }, "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg=="], - - "@csstools/css-color-parser": ["@csstools/css-color-parser@4.1.1", "", { "dependencies": { "@csstools/color-helpers": "6.0.2", "@csstools/css-calc": "3.2.1" }, "peerDependencies": { "@csstools/css-parser-algorithms": "4.0.0", "@csstools/css-tokenizer": "4.0.0" } }, "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g=="], - - "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@4.0.0", "", { "peerDependencies": { "@csstools/css-tokenizer": "4.0.0" } }, "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w=="], - - "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.4", "", { "optionalDependencies": { "css-tree": "3.2.1" } }, "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw=="], - - "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA=="], - - "@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.12.0", "", {}, "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow=="], - - "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], - - "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], - - "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], - - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="], - - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="], - - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], - - "@exodus/bytes": ["@exodus/bytes@1.15.1", "", {}, "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q=="], - - "@fastify/busboy": ["@fastify/busboy@3.2.0", "", {}, "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA=="], - - "@firebase/app-check-interop-types": ["@firebase/app-check-interop-types@0.3.4", "", {}, "sha512-zz3i6e13B8BfWiLy8MABtTh8aGIACgKbf9UVnyHcWs+yQzJXgQcl8A46b0zfaiJHdQ+niF0ouAfcpuf+3LMPQg=="], - - "@firebase/app-types": ["@firebase/app-types@0.9.5", "", { "dependencies": { "@firebase/logger": "0.5.1" } }, "sha512-YevqTjvo7Iujsa9Dwowmd6dSoElhzmD63ZSrq6bzjvQ6POjYgNjOFHLmNIgJs48eNO093NCERibuFnxbfOvU7A=="], - - "@firebase/auth-interop-types": ["@firebase/auth-interop-types@0.2.5", "", {}, "sha512-1Li/YuBDBAXcKv7BzY4U28gontUmAaw53sYiqbaVOMCFb2lFKK/c3CGMUWqtwe7+TXrl3poWnTCL5umYBg85Eg=="], - - "@firebase/component": ["@firebase/component@0.7.3", "", { "dependencies": { "@firebase/util": "1.15.1", "tslib": "^2.1.0" } }, "sha512-wFofIaa2879ogD/WvkjYXJxRmfnL0scen6ORgaC3na1FNOR9ASIUANQdhqQcmWu/h77/pVHY7ch5flewa5Bcew=="], - - "@firebase/database": ["@firebase/database@1.1.3", "", { "dependencies": { "@firebase/app-check-interop-types": "0.3.4", "@firebase/auth-interop-types": "0.2.5", "@firebase/component": "0.7.3", "@firebase/logger": "0.5.1", "@firebase/util": "1.15.1", "faye-websocket": "0.11.4", "tslib": "^2.1.0" } }, "sha512-XwWCa+E4TvNGpGwXrycLRNfdogADwFcvuhyow6wDWma9W54roaQIhe+4PM0KiLsIftBdSCGI7OKCXrdSRHbIhw=="], - - "@firebase/database-compat": ["@firebase/database-compat@2.1.4", "", { "dependencies": { "@firebase/component": "0.7.3", "@firebase/database": "1.1.3", "@firebase/database-types": "1.0.20", "@firebase/logger": "0.5.1", "@firebase/util": "1.15.1", "tslib": "^2.1.0" } }, "sha512-3pK35F1MAgmqFJQlf2nhQl44vtAXQO1uaCaQOEUI9kCRtLFqi7N+QRKR7lFZPg+xIZIyubgxQaxY69YgfZRZWg=="], - - "@firebase/database-types": ["@firebase/database-types@1.0.20", "", { "dependencies": { "@firebase/app-types": "0.9.5", "@firebase/util": "1.15.1" } }, "sha512-kegbOk/w8iU64pr0q6k2ItyNGjnQBMHFhwS7ohdWI4W+pc0/zhhdGXTdFj6X1oxItRjPoYOsSQmERgBkn/ihxw=="], - - "@firebase/logger": ["@firebase/logger@0.5.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-vZKLsqE1ABOy8OjQiE7cUTFn4gvaqlk88yp8N94Pk/sDpq61YqZGqmVFZTvOyflTwuYFcWirBdYGoJgbDaXKYQ=="], - - "@firebase/util": ["@firebase/util@1.15.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-LUdM4Wg7YM9Pq/49nGYySJA0CSQEKnGffFzWV8+6gXN7mGxn+FL1IqvFbuZUtAQcfZgHYDwCE1wwlK7rB7gl2g=="], - - "@google-cloud/firestore": ["@google-cloud/firestore@7.11.6", "", { "dependencies": { "@opentelemetry/api": "^1.3.0", "fast-deep-equal": "^3.1.1", "functional-red-black-tree": "^1.0.1", "google-gax": "^4.3.3", "protobufjs": "^7.2.6" } }, "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw=="], - - "@google-cloud/paginator": ["@google-cloud/paginator@5.0.2", "", { "dependencies": { "arrify": "^2.0.0", "extend": "^3.0.2" } }, "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg=="], - - "@google-cloud/projectify": ["@google-cloud/projectify@4.0.0", "", {}, "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA=="], - - "@google-cloud/promisify": ["@google-cloud/promisify@4.0.0", "", {}, "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g=="], - - "@google-cloud/storage": ["@google-cloud/storage@7.19.0", "", { "dependencies": { "@google-cloud/paginator": "^5.0.0", "@google-cloud/projectify": "^4.0.0", "@google-cloud/promisify": "<4.1.0", "abort-controller": "^3.0.0", "async-retry": "^1.3.3", "duplexify": "^4.1.3", "fast-xml-parser": "^5.3.4", "gaxios": "^6.0.2", "google-auth-library": "^9.6.3", "html-entities": "^2.5.2", "mime": "^3.0.0", "p-limit": "^3.0.1", "retry-request": "^7.0.0", "teeny-request": "^9.0.0", "uuid": "^8.0.0" } }, "sha512-n2FjE7NAOYyshogdc7KQOl/VZb4sneqPjWouSyia9CMDdMhRX5+RIbqalNmC7LOLzuLAN89VlF2HvG8na9G+zQ=="], - - "@grpc/grpc-js": ["@grpc/grpc-js@1.14.4", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ=="], - - "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], - - "@ioredis/commands": ["@ioredis/commands@1.5.1", "", {}, "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw=="], - - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "5.1.2", "string-width-cjs": "npm:string-width@4.2.3", "strip-ansi": "7.2.0", "strip-ansi-cjs": "npm:strip-ansi@6.0.1", "wrap-ansi": "8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - - "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "7.1.3" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], - - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "1.5.5", "@jridgewell/trace-mapping": "0.3.31" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], - - "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "0.3.13", "@jridgewell/trace-mapping": "0.3.31" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - - "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "0.3.13", "@jridgewell/trace-mapping": "0.3.31" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "3.1.2", "@jridgewell/sourcemap-codec": "1.5.5" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - - "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], - - "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.3", "", { "dependencies": { "consola": "3.4.2", "detect-libc": "2.1.2", "https-proxy-agent": "7.0.6", "node-fetch": "2.7.0", "nopt": "8.1.0", "semver": "7.8.1", "tar": "7.5.15" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg=="], - - "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ=="], - - "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w=="], - - "@msgpackr-extract/msgpackr-extract-linux-arm": ["@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4", "", { "os": "linux", "cpu": "arm" }, "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw=="], - - "@msgpackr-extract/msgpackr-extract-linux-arm64": ["@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw=="], - - "@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ=="], - - "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4", "", { "os": "win32", "cpu": "x64" }, "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ=="], - - "@nodable/entities": ["@nodable/entities@2.1.0", "", {}, "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA=="], - - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "1.2.0" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "1.20.1" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - - "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], - - "@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "2.1.2", "is-glob": "4.0.3", "node-addon-api": "7.1.1", "picomatch": "4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="], - - "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.6", "", { "os": "android", "cpu": "arm64" }, "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A=="], - - "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA=="], - - "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg=="], - - "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng=="], - - "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ=="], - - "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg=="], - - "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA=="], - - "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA=="], - - "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ=="], - - "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg=="], - - "@parcel/watcher-wasm": ["@parcel/watcher-wasm@2.5.6", "", { "dependencies": { "is-glob": "4.0.3", "picomatch": "4.0.4" } }, "sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA=="], - - "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q=="], - - "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g=="], - - "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.6", "", { "os": "win32", "cpu": "x64" }, "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw=="], - - "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - - "@poppinss/colors": ["@poppinss/colors@4.1.6", "", { "dependencies": { "kleur": "4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="], - - "@poppinss/dumper": ["@poppinss/dumper@0.7.0", "", { "dependencies": { "@poppinss/colors": "4.1.6", "@sindresorhus/is": "7.2.0", "supports-color": "10.2.2" } }, "sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag=="], - - "@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="], - - "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], - - "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], - - "@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="], - - "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.1", "", {}, "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="], - - "@protobufjs/fetch": ["@protobufjs/fetch@1.1.1", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1" } }, "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw=="], - - "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], - - "@protobufjs/inquire": ["@protobufjs/inquire@1.1.2", "", {}, "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw=="], - - "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], - - "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], - - "@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], - - "@puppeteer/browsers": ["@puppeteer/browsers@3.0.3", "", { "dependencies": { "debug": "^4.4.3", "progress": "^2.0.3", "semver": "^7.7.4", "tar-fs": "^3.1.1", "yargs": "^17.7.2" }, "peerDependencies": { "proxy-agent": ">=8.0.1" }, "optionalPeers": ["proxy-agent"], "bin": { "browsers": "lib/main-cli.js" } }, "sha512-v3YaiGpzUTgOZkHBFR0iZg58Vto25SqBQxfLUXDiofJccwVl6Mlr7BdLCS1NZgxikdeIHf936cxYWL9IZp3tow=="], - - "@rollup/plugin-alias": ["@rollup/plugin-alias@6.0.0", "", { "optionalDependencies": { "rollup": "4.60.4" } }, "sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g=="], - - "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@29.0.2", "", { "dependencies": { "@rollup/pluginutils": "5.3.0", "commondir": "1.0.1", "estree-walker": "2.0.2", "fdir": "6.5.0", "is-reference": "1.2.1", "magic-string": "0.30.21", "picomatch": "4.0.4" }, "optionalDependencies": { "rollup": "4.60.4" } }, "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg=="], - - "@rollup/plugin-inject": ["@rollup/plugin-inject@5.0.5", "", { "dependencies": { "@rollup/pluginutils": "5.3.0", "estree-walker": "2.0.2", "magic-string": "0.30.21" }, "optionalDependencies": { "rollup": "4.60.4" } }, "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg=="], - - "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "5.3.0" }, "optionalDependencies": { "rollup": "4.60.4" } }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], - - "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.3", "", { "dependencies": { "@rollup/pluginutils": "5.3.0", "@types/resolve": "1.20.2", "deepmerge": "4.3.1", "is-module": "1.0.0", "resolve": "1.22.12" }, "optionalDependencies": { "rollup": "4.60.4" } }, "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg=="], - - "@rollup/plugin-replace": ["@rollup/plugin-replace@6.0.3", "", { "dependencies": { "@rollup/pluginutils": "5.3.0", "magic-string": "0.30.21" }, "optionalDependencies": { "rollup": "4.60.4" } }, "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA=="], - - "@rollup/plugin-terser": ["@rollup/plugin-terser@1.0.0", "", { "dependencies": { "serialize-javascript": "7.0.5", "smob": "1.6.2", "terser": "5.48.0" }, "optionalDependencies": { "rollup": "4.60.4" } }, "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ=="], - - "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "1.0.9", "estree-walker": "2.0.2", "picomatch": "4.0.4" }, "optionalDependencies": { "rollup": "4.60.4" } }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], - - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.4", "", { "os": "android", "cpu": "arm" }, "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ=="], - - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.4", "", { "os": "android", "cpu": "arm64" }, "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw=="], - - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA=="], - - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg=="], - - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g=="], - - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw=="], - - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.4", "", { "os": "linux", "cpu": "arm" }, "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA=="], - - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.4", "", { "os": "linux", "cpu": "arm" }, "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w=="], - - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg=="], - - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A=="], - - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.4", "", { "os": "linux", "cpu": "none" }, "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ=="], - - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.4", "", { "os": "linux", "cpu": "none" }, "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw=="], - - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg=="], - - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A=="], - - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.4", "", { "os": "linux", "cpu": "none" }, "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA=="], - - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.4", "", { "os": "linux", "cpu": "none" }, "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw=="], - - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ=="], - - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ=="], - - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg=="], - - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA=="], - - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.4", "", { "os": "none", "cpu": "arm64" }, "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg=="], - - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw=="], - - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA=="], - - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.4", "", { "os": "win32", "cpu": "x64" }, "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw=="], - - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.4", "", { "os": "win32", "cpu": "x64" }, "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw=="], - - "@shikijs/core": ["@shikijs/core@1.29.2", "", { "dependencies": { "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "10.0.2", "@types/hast": "3.0.4", "hast-util-to-html": "9.0.5" } }, "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ=="], - - "@shikijs/engine-javascript": ["@shikijs/engine-javascript@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "10.0.2", "oniguruma-to-es": "2.3.0" } }, "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A=="], - - "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "10.0.2" } }, "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA=="], - - "@shikijs/langs": ["@shikijs/langs@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ=="], - - "@shikijs/themes": ["@shikijs/themes@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g=="], - - "@shikijs/types": ["@shikijs/types@1.29.2", "", { "dependencies": { "@shikijs/vscode-textmate": "10.0.2", "@types/hast": "3.0.4" } }, "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw=="], - - "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], - - "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="], - - "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], - - "@solid-primitives/context": ["@solid-primitives/context@0.2.3", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-6/e8qu9qJf48FJ+sxc/B782NdgFw5TvI8+r6U0gHizumfZcWZg8FAJqvRZAiwlygkUNiTQOGTeO10LVbMm0kvg=="], - - "@solid-primitives/destructure": ["@solid-primitives/destructure@0.1.17", "", { "dependencies": { "@solid-primitives/utils": "^6.2.3" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-MTjEIIeiw36Png0tze70XnhQ79IbkreX8v0qpjJ77+CLT5MkVQtFoiNHGkZPyw7UtkZQE08qvV6KAJw8s9dCwg=="], - - "@solid-primitives/memo": ["@solid-primitives/memo@1.4.5", "", { "dependencies": { "@solid-primitives/scheduled": "^1.5.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-dMfFShNsyX5virETyDv/Uoy2HP+PL4k8cUTTLb2r4TfoqJb010KIaOuURqp/Qbdznp4ZkDuP57b28d45kaOueQ=="], - - "@solid-primitives/scheduled": ["@solid-primitives/scheduled@1.5.3", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-oNwLE6E6lxJAWrc8QXuwM0k2oU1BnANnkChwMw82aK1j3+mWGJkG1IFe5gCwbV+afYmjI76t9JJV3md/8tLw+g=="], - - "@solid-primitives/utils": ["@solid-primitives/utils@6.4.0", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A=="], - - "@solidjs/meta": ["@solidjs/meta@0.29.4", "", { "peerDependencies": { "solid-js": "1.9.13" } }, "sha512-zdIWBGpR9zGx1p1bzIPqF5Gs+Ks/BH8R6fWhmUa/dcK1L2rUC8BAcZJzNRYBQv74kScf1TSOs0EY//Vd/I0V8g=="], - - "@solidjs/router": ["@solidjs/router@0.15.4", "", { "peerDependencies": { "solid-js": "1.9.13" } }, "sha512-WOpgg9a9T638cR+5FGbFi/IV4l2FpmBs1GpIMSPa0Ce9vyJN7Wts+X2PqMf9IYn0zUj2MlSJtm1gp7/HI/n5TQ=="], - - "@solidjs/start": ["@solidjs/start@2.0.0-alpha.2", "", { "dependencies": { "@babel/core": "7.29.7", "@babel/traverse": "7.29.7", "@babel/types": "7.29.7", "@solidjs/meta": "0.29.4", "@tanstack/server-functions-plugin": "1.134.5", "@types/babel__traverse": "7.28.0", "@types/micromatch": "4.0.10", "cookie-es": "2.0.1", "defu": "6.1.7", "error-stack-parser": "2.1.4", "es-module-lexer": "1.7.0", "esbuild": "0.25.12", "fast-glob": "3.3.3", "h3": "2.0.1-rc.4", "html-to-image": "1.11.13", "micromatch": "4.0.8", "path-to-regexp": "8.4.2", "pathe": "2.0.3", "radix3": "1.1.2", "seroval": "1.5.4", "seroval-plugins": "1.5.4", "shiki": "1.29.2", "solid-js": "1.9.13", "source-map-js": "1.2.1", "srvx": "0.9.8", "terracotta": "1.1.0", "vite-plugin-solid": "2.11.12" }, "peerDependencies": { "vite": "7.3.3" } }, "sha512-z56ATi3P07q8F5Io2I+RQrwjyWZtFZzpXN/J+8scf/gqrAW83LtgRkZFZjJaGH7i9WrHP+ep9F+ZiJ2gDHVBcw=="], - - "@solidjs/vite-plugin-nitro-2": ["@solidjs/vite-plugin-nitro-2@0.1.0", "", { "dependencies": { "nitropack": "2.13.4" }, "peerDependencies": { "vite": "7.3.3" } }, "sha512-gtT9GYhAdbfY2v3ISKYFXclxH/kK+mDhp5ENjiA1zJAfQq6XPWwIfIYm9MB73vfOp+MzVXWDHxYyUv+5pTpGTw=="], - - "@speed-highlight/core": ["@speed-highlight/core@1.2.15", "", {}, "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw=="], - - "@stablelib/base64": ["@stablelib/base64@1.0.1", "", {}, "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ=="], - - "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - - "@tailwindcss/node": ["@tailwindcss/node@4.3.0", "", { "dependencies": { "@jridgewell/remapping": "2.3.5", "enhanced-resolve": "5.22.0", "jiti": "2.7.0", "lightningcss": "1.32.0", "magic-string": "0.30.21", "source-map-js": "1.2.1", "tailwindcss": "4.3.0" } }, "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g=="], - - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.0", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.0", "@tailwindcss/oxide-darwin-arm64": "4.3.0", "@tailwindcss/oxide-darwin-x64": "4.3.0", "@tailwindcss/oxide-freebsd-x64": "4.3.0", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", "@tailwindcss/oxide-linux-x64-musl": "4.3.0", "@tailwindcss/oxide-wasm32-wasi": "4.3.0", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" } }, "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg=="], - - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.0", "", { "os": "android", "cpu": "arm64" }, "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng=="], - - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ=="], - - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA=="], - - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ=="], - - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0", "", { "os": "linux", "cpu": "arm" }, "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA=="], - - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg=="], - - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ=="], - - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ=="], - - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg=="], - - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.0", "", { "cpu": "none" }, "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA=="], - - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ=="], - - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA=="], - - "@tailwindcss/vite": ["@tailwindcss/vite@4.3.0", "", { "dependencies": { "@tailwindcss/node": "4.3.0", "@tailwindcss/oxide": "4.3.0", "tailwindcss": "4.3.0" }, "peerDependencies": { "vite": "7.3.3" } }, "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw=="], - - "@tanstack/directive-functions-plugin": ["@tanstack/directive-functions-plugin@1.134.5", "", { "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "7.29.7", "@babel/traverse": "7.29.7", "@babel/types": "7.29.7", "@tanstack/router-utils": "1.133.19", "babel-dead-code-elimination": "1.0.12", "pathe": "2.0.3", "tiny-invariant": "1.3.3" }, "peerDependencies": { "vite": "7.3.3" } }, "sha512-J3oawV8uBRBbPoLgMdyHt+LxzTNuWRKNJJuCLWsm/yq6v0IQSvIVCgfD2+liIiSnDPxGZ8ExduPXy8IzS70eXw=="], - - "@tanstack/query-core": ["@tanstack/query-core@5.100.14", "", {}, "sha512-5X41dGpxgeaHISCRW2oYwcSycZeULZzAunaudXT9ov1KOTj9xwt0CH6hbwqP1/z74ZWF7rYFnDpyYH07XFcZew=="], - - "@tanstack/router-utils": ["@tanstack/router-utils@1.133.19", "", { "dependencies": { "@babel/core": "7.29.7", "@babel/generator": "7.29.7", "@babel/parser": "7.29.7", "@babel/preset-typescript": "7.29.7", "ansis": "4.3.0", "diff": "8.0.4", "pathe": "2.0.3", "tinyglobby": "0.2.16" } }, "sha512-WEp5D2gPxvlLDRXwD/fV7RXjYtqaqJNXKB/L6OyZEbT+9BG/Ib2d7oG9GSUZNNMGPGYAlhBUOi3xutySsk6rxA=="], - - "@tanstack/server-functions-plugin": ["@tanstack/server-functions-plugin@1.134.5", "", { "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "7.29.7", "@babel/plugin-syntax-jsx": "7.29.7", "@babel/plugin-syntax-typescript": "7.29.7", "@babel/template": "7.29.7", "@babel/traverse": "7.29.7", "@babel/types": "7.29.7", "@tanstack/directive-functions-plugin": "1.134.5", "babel-dead-code-elimination": "1.0.12", "tiny-invariant": "1.3.3" } }, "sha512-2sWxq70T+dOEUlE3sHlXjEPhaFZfdPYlWTSkHchWXrFGw2YOAa+hzD6L9wHMjGDQezYd03ue8tQlHG+9Jzbzgw=="], - - "@tanstack/solid-query": ["@tanstack/solid-query@5.100.14", "", { "dependencies": { "@tanstack/query-core": "5.100.14" }, "peerDependencies": { "solid-js": "^1.6.0" } }, "sha512-eKW5fPWuNjGBjK9To/DNNS2b3HwTvD58T6CZbN6H0HyCjDrBOlH8q4qyJQS9gR9EXflSiivgQK+DUzg3KIHNDw=="], - - "@tootallnate/once": ["@tootallnate/once@2.0.1", "", {}, "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ=="], - - "@trpc/client": ["@trpc/client@10.45.4", "", { "peerDependencies": { "@trpc/server": "10.45.4" } }, "sha512-ItpH5FMIJFt862kbAgC8hf5NJnDLo0FwEvMEX6zSLCenzWD0UH6H/fvAX1suFo1e0wcAmMhiEU1Tl6xKk/Pd1g=="], - - "@trpc/server": ["@trpc/server@10.45.4", "", {}, "sha512-5MuyK5sDuFVGHOT9EMVHgRjP5I5j3RqGymcb5D47UOp8tzn6LH0g1lEgYrAsOZ12vmk1gpxMw/v/y4xHHK/Qdg=="], - - "@turbo/darwin-64": ["@turbo/darwin-64@2.9.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-t7QiPflaEyBE4oayeZtSmu4mEfjgIrcNlNNl1z1dmIVPqEdtA7+CfTf8d7KXsOGPh6aNgWjKxyvQg9uGfDQF+A=="], - - "@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.9.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-d23147mC9BsCPA9mJ0h/ubcpbRgcJBXbcG3+Vq7YLhjz3IXuvQsJ1UXH8f4MD76ZjJ4m/E4aRdJV+MW88CDfbw=="], - - "@turbo/linux-64": ["@turbo/linux-64@2.9.14", "", { "os": "linux", "cpu": "x64" }, "sha512-P3ZKB5tuUDdDQWuAsACGUR1qv9W7BNWxdxqVJ0kZNuNNPRaVYTPPikLcp79+GiEcW3npsR+KyP38lnQiBc5aSA=="], - - "@turbo/linux-arm64": ["@turbo/linux-arm64@2.9.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZRTlzcUMrrPv9ZuDzRF9n60Ym13bKeG9jDB8WjxyLhWNzV+AJQN+zdpIk3NJYf2zQsGUm1mNar2P0elRzLw25g=="], - - "@turbo/windows-64": ["@turbo/windows-64@2.9.14", "", { "os": "win32", "cpu": "x64" }, "sha512-exanwN6sIduZwykYeiTQj8kCmOhazP5WOz3bvXMcYtjhL6Z3iRWLewKrXCBq0bqwSP3iBMb/AerRCnHI4lx46A=="], - - "@turbo/windows-arm64": ["@turbo/windows-arm64@2.9.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-fVdCsnmYoKICsycbWuuGp6Jvi51/3G/UluFWuAUCvR8PIW5IJkAk5BM9UF8PSm0Q2IphWHFZjYEgjHsh3B9y/g=="], - - "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="], - - "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "7.29.7", "@babel/types": "7.29.7", "@types/babel__generator": "7.27.0", "@types/babel__template": "7.4.4", "@types/babel__traverse": "7.28.0" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], - - "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "7.29.7" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], - - "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "7.29.7", "@babel/types": "7.29.7" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], - - "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "7.29.7" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], - - "@types/braces": ["@types/braces@3.0.5", "", {}, "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w=="], - - "@types/caseless": ["@types/caseless@0.12.5", "", {}, "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg=="], - - "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "4.0.2", "assertion-error": "2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], - - "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], - - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - - "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "3.0.3" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], - - "@types/jsonwebtoken": ["@types/jsonwebtoken@9.0.10", "", { "dependencies": { "@types/ms": "*", "@types/node": "*" } }, "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA=="], - - "@types/long": ["@types/long@4.0.2", "", {}, "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="], - - "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "3.0.3" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], - - "@types/micromatch": ["@types/micromatch@4.0.10", "", { "dependencies": { "@types/braces": "3.0.5" } }, "sha512-5jOhFDElqr4DKTrTEbnW8DZ4Hz5LRUEmyrGpCMrD/NphYv3nUnaF08xmSLx1rGGnyEs/kFnhiw6dCgcDqMr5PQ=="], - - "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - - "@types/node": ["@types/node@25.9.1", "", { "dependencies": { "undici-types": "7.24.6" } }, "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg=="], - - "@types/node-cron": ["@types/node-cron@3.0.11", "", {}, "sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg=="], - - "@types/pg": ["@types/pg@8.20.0", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow=="], - - "@types/request": ["@types/request@2.48.13", "", { "dependencies": { "@types/caseless": "*", "@types/node": "*", "@types/tough-cookie": "*", "form-data": "^2.5.5" } }, "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg=="], - - "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], - - "@types/stats.js": ["@types/stats.js@0.17.4", "", {}, "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA=="], - - "@types/three": ["@types/three@0.184.1", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": ">=0.5.17", "fflate": "~0.8.2", "meshoptimizer": "~1.1.1" } }, "sha512-6q4VdiqVsrTRqmk62/BnlcAvIrnDM0zf2ZDVKI5kZiniWrSaOHaQzmbp+BNzoggc/8tgW412pL//wZIxu2PPTA=="], - - "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="], - - "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], - - "@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="], - - "@typeschema/core": ["@typeschema/core@0.13.2", "", {}, "sha512-pAt0MK249/9szYaoPuvzhSfOd3smrLhhwCCpUNB4onX32mRx5F3lzDIveIYGQkLYRq58xOX5sjoW+n72f/MLLw=="], - - "@typeschema/valibot": ["@typeschema/valibot@0.13.5", "", { "dependencies": { "@typeschema/core": "0.13.2" }, "optionalDependencies": { "valibot": "0.29.0" } }, "sha512-9S3daaU7ShC1aRkZVmsW5N8uTPE7l4Af/c+rWTyFZi2/yp4Iiped8947WGX03lMd3UW6/UdbfOaiOh7HByQPiw=="], - - "@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="], - - "@vercel/nft": ["@vercel/nft@1.5.0", "", { "dependencies": { "@mapbox/node-pre-gyp": "2.0.3", "@rollup/pluginutils": "5.3.0", "acorn": "8.16.0", "acorn-import-attributes": "1.9.5", "async-sema": "3.1.1", "bindings": "1.5.0", "estree-walker": "2.0.2", "glob": "13.0.6", "graceful-fs": "4.2.11", "node-gyp-build": "4.8.4", "picomatch": "4.0.4", "resolve-from": "5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA=="], - - "@vitest/coverage-v8": ["@vitest/coverage-v8@4.1.7", "", { "dependencies": { "@bcoe/v8-coverage": "1.0.2", "@vitest/utils": "4.1.7", "ast-v8-to-istanbul": "1.0.2", "istanbul-lib-coverage": "3.2.2", "istanbul-lib-report": "3.0.1", "istanbul-reports": "3.2.0", "magicast": "0.5.3", "obug": "2.1.1", "std-env": "4.1.0", "tinyrainbow": "3.1.0" }, "peerDependencies": { "vitest": "4.1.7" } }, "sha512-qsYPeXc5Q9dFLd1i8Ap+Bx8sQgcp+rFVQo4R0dDsWNBzl26ldVF1qOO+RL24K7FDrR6pA+50XedRLSoSG24bVQ=="], - - "@vitest/expect": ["@vitest/expect@4.1.7", "", { "dependencies": { "@standard-schema/spec": "1.1.0", "@types/chai": "5.2.3", "@vitest/spy": "4.1.7", "@vitest/utils": "4.1.7", "chai": "6.2.2", "tinyrainbow": "3.1.0" } }, "sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w=="], - - "@vitest/mocker": ["@vitest/mocker@4.1.7", "", { "dependencies": { "@vitest/spy": "4.1.7", "estree-walker": "3.0.3", "magic-string": "0.30.21" }, "optionalDependencies": { "vite": "7.3.3" } }, "sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA=="], - - "@vitest/pretty-format": ["@vitest/pretty-format@4.1.7", "", { "dependencies": { "tinyrainbow": "3.1.0" } }, "sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw=="], - - "@vitest/runner": ["@vitest/runner@4.1.7", "", { "dependencies": { "@vitest/utils": "4.1.7", "pathe": "2.0.3" } }, "sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw=="], - - "@vitest/snapshot": ["@vitest/snapshot@4.1.7", "", { "dependencies": { "@vitest/pretty-format": "4.1.7", "@vitest/utils": "4.1.7", "magic-string": "0.30.21", "pathe": "2.0.3" } }, "sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw=="], - - "@vitest/spy": ["@vitest/spy@4.1.7", "", {}, "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q=="], - - "@vitest/utils": ["@vitest/utils@4.1.7", "", { "dependencies": { "@vitest/pretty-format": "4.1.7", "convert-source-map": "2.0.0", "tinyrainbow": "3.1.0" } }, "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw=="], - - "abbrev": ["abbrev@3.0.1", "", {}, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], - - "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "5.0.1" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], - - "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], - - "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "8.16.0" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], - - "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], - - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "ansis": ["ansis@4.3.0", "", {}, "sha512-44mvgtPvohuU/70DdY5Oz2AIrLJ9k6/5x4KmoSvPwO+5Moijo0+N9D0fKbbYZQWP1hNm5CpOf+E01jhxG/r8xg=="], - - "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "3.0.0", "picomatch": "2.3.2" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - - "archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "5.0.2", "async": "3.2.6", "buffer-crc32": "1.0.0", "readable-stream": "4.7.0", "readdir-glob": "1.1.3", "tar-stream": "3.2.0", "zip-stream": "6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], - - "archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "10.5.0", "graceful-fs": "4.2.11", "is-stream": "2.0.1", "lazystream": "1.0.1", "lodash": "4.18.1", "normalize-path": "3.0.0", "readable-stream": "4.7.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], - - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "arrify": ["arrify@2.0.1", "", {}, "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="], - - "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], - - "ast-v8-to-istanbul": ["ast-v8-to-istanbul@1.0.2", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.31", "estree-walker": "3.0.3", "js-tokens": "10.0.0" } }, "sha512-dKmJxJsGItLmc5CYZKuEjuG6GnBs6PG4gohMhyFOWKaNQoYCuRZJDECaBlHmcG0lv2wc2E0uU8lESmBEumC3DQ=="], - - "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], - - "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="], - - "async-sema": ["async-sema@3.1.1", "", {}, "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="], - - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - - "axios": ["axios@1.16.1", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A=="], - - "b4a": ["b4a@1.8.1", "", {}, "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw=="], - - "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "7.29.7", "@babel/parser": "7.29.7", "@babel/traverse": "7.29.7", "@babel/types": "7.29.7" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], - - "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.7", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "7.29.7", "@babel/types": "7.29.7", "html-entities": "2.3.3", "parse5": "7.3.0" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ=="], - - "babel-preset-solid": ["babel-preset-solid@1.9.12", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "0.40.7" }, "optionalDependencies": { "solid-js": "1.9.13" }, "peerDependencies": { "@babel/core": "7.29.7" } }, "sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg=="], - - "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - - "bare-events": ["bare-events@2.8.3", "", {}, "sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw=="], - - "bare-fs": ["bare-fs@4.7.1", "", { "dependencies": { "bare-events": "2.8.3", "bare-path": "3.0.0", "bare-stream": "2.13.1", "bare-url": "2.4.3", "fast-fifo": "1.3.2" } }, "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw=="], - - "bare-os": ["bare-os@3.9.1", "", {}, "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ=="], - - "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "3.9.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], - - "bare-stream": ["bare-stream@2.13.1", "", { "dependencies": { "streamx": "2.25.0", "teex": "1.0.1" }, "optionalDependencies": { "bare-events": "2.8.3" } }, "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow=="], - - "bare-url": ["bare-url@2.4.3", "", { "dependencies": { "bare-path": "3.0.0" } }, "sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ=="], - - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.32", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg=="], - - "bcryptjs": ["bcryptjs@3.0.3", "", { "bin": { "bcrypt": "bin/bcrypt" } }, "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g=="], - - "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="], - - "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], - - "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], - - "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "4.0.4" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], - - "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - - "browser-ext": ["browser-ext@workspace:browser-ext"], - - "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "2.10.32", "caniuse-lite": "1.0.30001793", "electron-to-chromium": "1.5.361", "node-releases": "2.0.46", "update-browserslist-db": "1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], - - "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "1.5.1", "ieee754": "1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - - "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], - - "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], - - "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - - "bullmq": ["bullmq@5.77.3", "", { "dependencies": { "cron-parser": "4.9.0", "ioredis": "5.10.1", "msgpackr": "2.0.1", "node-abort-controller": "3.1.1", "semver": "7.8.0", "tslib": "2.8.1" }, "peerDependencies": { "redis": ">=5.0.0" }, "optionalPeers": ["redis"] }, "sha512-ccGjnRF5Bbu21CfzDG7toIewoAj5W9DUHjqhFnppt8YBtoQplynzBGuSzn7yYQobpyYeHEqrYhiJ1NZInrKbyA=="], - - "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "7.1.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], - - "c12": ["c12@3.3.4", "", { "dependencies": { "chokidar": "5.0.0", "confbox": "0.2.4", "defu": "6.1.7", "dotenv": "17.4.2", "exsolve": "1.0.8", "giget": "3.2.0", "jiti": "2.7.0", "ohash": "2.0.11", "pathe": "2.0.3", "perfect-debounce": "2.1.0", "pkg-types": "2.3.1", "rc9": "3.0.1" }, "optionalDependencies": { "magicast": "0.5.3" } }, "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA=="], - - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - - "caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="], - - "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], - - "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], - - "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], - - "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], - - "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], - - "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], - - "chromium-bidi": ["chromium-bidi@16.0.1", "", { "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-J63PGu/9PpeCwLIcKYyzWP6yaVL5pxuBc0shlYCYM8BaAkmlwiQboXO1iNbOgSDbVklEyYFfNEcHD8oOAWacUA=="], - - "citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="], - - "clerk-solidjs": ["clerk-solidjs@2.0.10", "", { "dependencies": { "@clerk/backend": "^1.21.4", "@clerk/shared": "^2.20.4", "@solid-primitives/context": "^0.2.3", "@solid-primitives/destructure": "^0.1.17", "@solid-primitives/memo": "^1.3.10", "@tanstack/solid-query": "^5.62.16" }, "peerDependencies": { "@solidjs/router": ">=0.14", "@solidjs/start": ">=1", "solid-js": ">=1" } }, "sha512-SQsnRAh5ew4+Cq8M8p59BHYFxcDzQXsR1csB2Z0eC/b87+FKpA1qM1WFB5dOKUbAGJFw9Lt6lmI7ipiBUfkc2Q=="], - - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], - - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - - "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], - - "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - - "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], - - "compatx": ["compatx@0.2.0", "", {}, "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA=="], - - "compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "1.2.2", "crc32-stream": "6.0.0", "is-stream": "2.0.1", "normalize-path": "3.0.0", "readable-stream": "4.7.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], - - "confbox": ["confbox@0.2.4", "", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="], - - "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], - - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - - "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], - - "cookie-es": ["cookie-es@2.0.1", "", {}, "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA=="], - - "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], - - "cosmiconfig": ["cosmiconfig@9.0.1", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ=="], - - "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], - - "crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "1.2.2", "readable-stream": "4.7.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], - - "cron-parser": ["cron-parser@4.9.0", "", { "dependencies": { "luxon": "^3.2.1" } }, "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q=="], - - "croner": ["croner@10.0.1", "", {}, "sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g=="], - - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "3.1.1", "shebang-command": "2.0.0", "which": "2.0.2" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - - "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], - - "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], - - "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - - "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], - - "data-urls": ["data-urls@7.0.0", "", { "dependencies": { "whatwg-mimetype": "5.0.0", "whatwg-url": "16.0.1" } }, "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA=="], - - "dayjs": ["dayjs@1.11.20", "", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="], - - "db0": ["db0@0.3.4", "", {}, "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw=="], - - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - - "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], - - "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], - - "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "4.1.0", "default-browser-id": "5.0.1" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], - - "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], - - "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], - - "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], - - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], - - "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], - - "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], - - "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], - - "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], - - "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], - - "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "2.0.3" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - - "devtools-protocol": ["devtools-protocol@0.0.1608973", "", {}, "sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ=="], - - "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], - - "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], - - "dot-prop": ["dot-prop@10.1.0", "", { "dependencies": { "type-fest": "5.6.0" } }, "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q=="], - - "dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="], - - "drizzle-kit": ["drizzle-kit@0.31.10", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "tsx": "^4.21.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw=="], - - "drizzle-orm": ["drizzle-orm@0.45.2", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q=="], - - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - - "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], - - "duplexify": ["duplexify@4.1.3", "", { "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", "readable-stream": "^3.1.1", "stream-shift": "^1.0.2" } }, "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA=="], - - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - - "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], - - "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - - "electron-to-chromium": ["electron-to-chromium@1.5.361", "", {}, "sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA=="], - - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], - - "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], - - "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], - - "enhanced-resolve": ["enhanced-resolve@5.22.0", "", { "dependencies": { "graceful-fs": "4.2.11", "tapable": "2.3.3" } }, "sha512-xYcDWrpELkFzz9SpZ3PlI6Eu6eD93Yf0WLDRxikGhWJ3MAir2SNZTIVCVZqZ/NUyx8AdMc2gT9C0gPiw18kG+A=="], - - "entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], - - "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - - "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], - - "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], - - "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], - - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], - - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - - "es-module-lexer": ["es-module-lexer@2.1.0", "", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="], - - "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], - - "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - - "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], - - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - - "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - - "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - - "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "1.0.9" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - - "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], - - "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], - - "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], - - "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "2.8.3" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], - - "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], - - "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], - - "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], - - "farmhash-modern": ["farmhash-modern@1.1.0", "", {}, "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA=="], - - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - - "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], - - "fast-glob": ["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" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "fast-sha256": ["fast-sha256@1.3.0", "", {}, "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="], - - "fast-xml-builder": ["fast-xml-builder@1.2.0", "", { "dependencies": { "path-expression-matcher": "^1.5.0", "xml-naming": "^0.1.0" } }, "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q=="], - - "fast-xml-parser": ["fast-xml-parser@5.8.0", "", { "dependencies": { "@nodable/entities": "^2.1.0", "fast-xml-builder": "^1.2.0", "path-expression-matcher": "^1.5.0", "strnum": "^2.3.0", "xml-naming": "^0.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg=="], - - "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "1.1.0" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], - - "faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="], - - "fdir": ["fdir@6.5.0", "", { "optionalDependencies": { "picomatch": "4.0.4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - - "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], - - "fflate": ["fflate@0.8.3", "", {}, "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA=="], - - "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], - - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - - "firebase-admin": ["firebase-admin@13.10.0", "", { "dependencies": { "@fastify/busboy": "^3.0.0", "@firebase/database-compat": "^2.0.0", "@firebase/database-types": "^1.0.6", "farmhash-modern": "^1.1.0", "fast-deep-equal": "^3.1.1", "google-auth-library": "^10.6.1", "jsonwebtoken": "^9.0.0", "jwks-rsa": "^3.1.0" }, "optionalDependencies": { "@google-cloud/firestore": "^7.11.0", "@google-cloud/storage": "^7.19.0" } }, "sha512-rbuCrJvYRwqBqvbccMS8fj/x2zsaMisdf5RQbRzQzr14Rbq9r2UlpuBHqWAwrO6c9dIRF56xF/xoepXsD5yDuQ=="], - - "follow-redirects": ["follow-redirects@1.16.0", "", {}, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="], - - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "7.0.6", "signal-exit": "4.1.0" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], - - "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], - - "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], - - "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - - "functional-red-black-tree": ["functional-red-black-tree@1.0.1", "", {}, "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g=="], - - "gaxios": ["gaxios@6.7.1", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9", "uuid": "^9.0.1" } }, "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ=="], - - "gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="], - - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], - - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - - "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], - - "get-intrinsic": ["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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], - - "get-port-please": ["get-port-please@3.2.0", "", {}, "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A=="], - - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - - "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], - - "giget": ["giget@3.2.0", "", { "bin": { "giget": "dist/cli.mjs" } }, "sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A=="], - - "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "10.2.5", "minipass": "7.1.3", "path-scurry": "2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], - - "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "4.0.3" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], - - "globby": ["globby@16.2.0", "", { "dependencies": { "@sindresorhus/merge-streams": "4.0.0", "fast-glob": "3.3.3", "ignore": "7.0.5", "is-path-inside": "4.0.0", "slash": "5.1.0", "unicorn-magic": "0.4.0" } }, "sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q=="], - - "google-auth-library": ["google-auth-library@10.6.2", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^7.1.4", "gcp-metadata": "8.1.2", "google-logging-utils": "1.1.3", "jws": "^4.0.0" } }, "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw=="], - - "google-gax": ["google-gax@4.6.1", "", { "dependencies": { "@grpc/grpc-js": "^1.10.9", "@grpc/proto-loader": "^0.7.13", "@types/long": "^4.0.0", "abort-controller": "^3.0.0", "duplexify": "^4.0.0", "google-auth-library": "^9.3.0", "node-fetch": "^2.7.0", "object-hash": "^3.0.0", "proto3-json-serializer": "^2.0.2", "protobufjs": "^7.3.2", "retry-request": "^7.0.0", "uuid": "^9.0.1" } }, "sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ=="], - - "google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="], - - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], - - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - - "gtoken": ["gtoken@7.1.0", "", { "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" } }, "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw=="], - - "gzip-size": ["gzip-size@7.0.0", "", { "dependencies": { "duplexer": "0.1.2" } }, "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA=="], - - "h3": ["h3@2.0.1-rc.4", "", { "dependencies": { "rou3": "0.7.12", "srvx": "0.9.8" }, "optionalDependencies": { "crossws": "0.3.5" } }, "sha512-vZq8pEUp6THsXKXrUXX44eOqfChic2wVQ1GlSzQCBr7DeFBkfIZAo2WyNND4GSv54TAa0E4LYIK73WSPdgKUgw=="], - - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - - "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - - "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="], - - "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "3.0.4", "@types/unist": "3.0.3", "ccount": "2.0.1", "comma-separated-tokens": "2.0.3", "hast-util-whitespace": "3.0.0", "html-void-elements": "3.0.0", "mdast-util-to-hast": "13.2.1", "property-information": "7.1.0", "space-separated-tokens": "2.0.2", "stringify-entities": "4.0.4", "zwitch": "2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], - - "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "3.0.4" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], - - "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], - - "html-encoding-sniffer": ["html-encoding-sniffer@6.0.0", "", { "dependencies": { "@exodus/bytes": "1.15.1" } }, "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg=="], - - "html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="], - - "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], - - "html-to-image": ["html-to-image@1.11.13", "", {}, "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg=="], - - "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], - - "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.2", "toidentifier": "1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], - - "http-parser-js": ["http-parser-js@0.5.10", "", {}, "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA=="], - - "http-proxy-agent": ["http-proxy-agent@5.0.0", "", { "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w=="], - - "http-shutdown": ["http-shutdown@1.2.2", "", {}, "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw=="], - - "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], - - "httpxy": ["httpxy@0.5.3", "", {}, "sha512-SMS9V6Sn7VWaS11lYhoAr0ceoaiolTWf4jYdJn0NJhCdKMu9R2H9Fh0LBDWBHQF6HRLI1PmaePYsjanSpE5PEw=="], - - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - - "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - - "ioredis": ["ioredis@5.10.1", "", { "dependencies": { "@ioredis/commands": "1.5.1", "cluster-key-slot": "1.1.2", "debug": "4.4.3", "denque": "2.1.0", "lodash.defaults": "4.2.0", "lodash.isarguments": "3.1.0", "redis-errors": "1.2.0", "redis-parser": "3.0.0", "standard-as-callback": "2.1.0" } }, "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA=="], - - "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], - - "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], - - "is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="], - - "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], - - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - - "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], - - "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], - - "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], - - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - - "is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], - - "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], - - "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "1.0.9" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], - - "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - - "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], - - "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], - - "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], - - "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "3.2.2", "make-dir": "4.0.0", "supports-color": "7.2.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="], - - "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "2.0.2", "istanbul-lib-report": "3.0.1" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="], - - "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - - "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], - - "jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="], - - "js-cookie": ["js-cookie@3.0.5", "", {}, "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw=="], - - "js-tokens": ["js-tokens@10.0.0", "", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="], - - "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], - - "jsdom": ["jsdom@29.1.1", "", { "dependencies": { "@asamuzakjp/css-color": "5.1.11", "@asamuzakjp/dom-selector": "7.1.1", "@bramus/specificity": "2.4.2", "@csstools/css-syntax-patches-for-csstree": "1.1.4", "@exodus/bytes": "1.15.1", "css-tree": "3.2.1", "data-urls": "7.0.0", "decimal.js": "10.6.0", "html-encoding-sniffer": "6.0.0", "is-potential-custom-element-name": "1.0.1", "lru-cache": "11.5.0", "parse5": "8.0.1", "saxes": "6.0.0", "symbol-tree": "3.2.4", "tough-cookie": "6.0.1", "undici": "7.26.0", "w3c-xmlserializer": "5.0.0", "webidl-conversions": "8.0.1", "whatwg-mimetype": "5.0.0", "whatwg-url": "16.0.1", "xml-name-validator": "5.0.0" } }, "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q=="], - - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], - - "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], - - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - - "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], - - "jsonwebtoken": ["jsonwebtoken@9.0.3", "", { "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g=="], - - "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], - - "jwks-rsa": ["jwks-rsa@3.2.2", "", { "dependencies": { "@types/jsonwebtoken": "^9.0.4", "debug": "^4.3.4", "jose": "^4.15.4", "limiter": "^1.1.5", "lru-memoizer": "^2.2.0" } }, "sha512-BqTyEDV+lS8F2trk3A+qJnxV5Q9EqKCBJOPti3W97r7qTympCZjb7h2X6f2kc+0K3rsSTY1/6YG2eaXKoj497w=="], - - "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="], - - "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], - - "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], - - "knitwork": ["knitwork@1.3.0", "", {}, "sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw=="], - - "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "2.3.8" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], - - "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "2.1.2" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], - - "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], - - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], - - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], - - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], - - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], - - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], - - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], - - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], - - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], - - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], - - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], - - "limiter": ["limiter@1.1.5", "", {}, "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA=="], - - "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - - "listhen": ["listhen@1.10.0", "", { "dependencies": { "@parcel/watcher": "2.5.6", "@parcel/watcher-wasm": "2.5.6", "citty": "0.2.2", "consola": "3.4.2", "crossws": "0.3.5", "defu": "6.1.7", "get-port-please": "3.2.0", "h3": "1.15.11", "http-shutdown": "1.2.2", "jiti": "2.7.0", "mlly": "1.8.2", "node-forge": "1.4.0", "pathe": "2.0.3", "std-env": "4.1.0", "tinyclip": "0.1.12", "ufo": "1.6.4", "untun": "0.1.3", "uqr": "0.1.3" }, "bin": { "listen": "bin/listhen.mjs", "listhen": "bin/listhen.mjs" } }, "sha512-kfz4C0OrC6IpaVMtYDJtf6PFjurxe9NBBoDAh/o2p587INryFOO4DQ9OetbCdDrWFt1m1CJKvYrzkGsuPHw8nQ=="], - - "local-pkg": ["local-pkg@1.2.1", "", { "dependencies": { "mlly": "1.8.2", "pkg-types": "2.3.1", "quansync": "0.2.11" } }, "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q=="], - - "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], - - "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], - - "lodash.clonedeep": ["lodash.clonedeep@4.5.0", "", {}, "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="], - - "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], - - "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], - - "lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="], - - "lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="], - - "lodash.isinteger": ["lodash.isinteger@4.0.4", "", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="], - - "lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="], - - "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], - - "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="], - - "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], - - "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], - - "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], - - "lru-cache": ["lru-cache@11.5.0", "", {}, "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA=="], - - "lru-memoizer": ["lru-memoizer@2.3.0", "", { "dependencies": { "lodash.clonedeep": "^4.5.0", "lru-cache": "6.0.0" } }, "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug=="], - - "luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], - - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], - - "magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "7.29.7", "@babel/types": "7.29.7", "source-map-js": "1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="], - - "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "7.8.1" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], - - "map-obj": ["map-obj@4.3.0", "", {}, "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ=="], - - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - - "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "3.0.4", "@types/mdast": "4.0.4", "@ungap/structured-clone": "1.3.1", "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.1.0", "vfile": "6.0.3" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], - - "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], - - "merge-anything": ["merge-anything@5.1.7", "", { "dependencies": { "is-what": "4.1.16" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="], - - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - - "meshoptimizer": ["meshoptimizer@1.1.1", "", {}, "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g=="], - - "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "2.0.1", "micromark-util-types": "2.0.2" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], - - "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], - - "micromark-util-sanitize-uri": ["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" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], - - "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], - - "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], - - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "3.0.3", "picomatch": "2.3.2" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - - "mime": ["mime@4.1.0", "", { "bin": { "mime": "bin/cli.js" } }, "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw=="], - - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "5.0.6" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], - - "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - - "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "7.1.3" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], - - "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], - - "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "8.16.0", "pathe": "2.0.3", "pkg-types": "1.3.1", "ufo": "1.6.4" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="], - - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - - "msgpackr": ["msgpackr@2.0.1", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-9J+tqTEsbHqY8YohazYgty7LgerFIWxvMLpUjqETSmjHojtJm2WnX2kK/2a1fLI7CO7ERP1YSEUXMucz4j+yBA=="], - - "msgpackr-extract": ["msgpackr-extract@3.0.4", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw=="], - - "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="], - - "nitropack": ["nitropack@2.13.4", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.2", "@rollup/plugin-alias": "6.0.0", "@rollup/plugin-commonjs": "29.0.2", "@rollup/plugin-inject": "5.0.5", "@rollup/plugin-json": "6.1.0", "@rollup/plugin-node-resolve": "16.0.3", "@rollup/plugin-replace": "6.0.3", "@rollup/plugin-terser": "1.0.0", "@vercel/nft": "1.5.0", "archiver": "7.0.1", "c12": "3.3.4", "chokidar": "5.0.0", "citty": "0.2.2", "compatx": "0.2.0", "confbox": "0.2.4", "consola": "3.4.2", "cookie-es": "2.0.1", "croner": "10.0.1", "crossws": "0.3.5", "db0": "0.3.4", "defu": "6.1.7", "destr": "2.0.5", "dot-prop": "10.1.0", "esbuild": "0.28.0", "escape-string-regexp": "5.0.0", "etag": "1.8.1", "exsolve": "1.0.8", "globby": "16.2.0", "gzip-size": "7.0.0", "h3": "1.15.11", "hookable": "5.5.3", "httpxy": "0.5.3", "ioredis": "5.10.1", "jiti": "2.7.0", "klona": "2.0.6", "knitwork": "1.3.0", "listhen": "1.10.0", "magic-string": "0.30.21", "magicast": "0.5.3", "mime": "4.1.0", "mlly": "1.8.2", "node-fetch-native": "1.6.7", "node-mock-http": "1.0.4", "ofetch": "1.5.1", "ohash": "2.0.11", "pathe": "2.0.3", "perfect-debounce": "2.1.0", "pkg-types": "2.3.1", "pretty-bytes": "7.1.0", "radix3": "1.1.2", "rollup": "4.60.4", "rollup-plugin-visualizer": "7.0.1", "scule": "1.3.0", "semver": "7.8.1", "serve-placeholder": "2.0.2", "serve-static": "2.2.1", "source-map": "0.7.6", "std-env": "4.1.0", "ufo": "1.6.4", "ultrahtml": "1.6.0", "uncrypto": "0.1.3", "unctx": "2.5.0", "unenv": "2.0.0-rc.24", "unimport": "6.3.0", "unplugin-utils": "0.3.1", "unstorage": "1.17.5", "untyped": "2.0.0", "unwasm": "0.5.3", "youch": "4.1.1", "youch-core": "0.3.3" }, "bin": { "nitro": "dist/cli/index.mjs", "nitropack": "dist/cli/index.mjs" } }, "sha512-tX7bT6zxNeMwkc6hxHiZeUoTOjVrcjoh1Z3cmxOlodIqjl4HISgqfGOmkWSayky3Nv9Z5+KQH52F8nmXJY5AAA=="], - - "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], - - "node-abort-controller": ["node-abort-controller@3.1.1", "", {}, "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="], - - "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], - - "node-cron": ["node-cron@4.2.1", "", {}, "sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg=="], - - "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], - - "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "5.0.0" } }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], - - "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], - - "node-forge": ["node-forge@1.4.0", "", {}, "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ=="], - - "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], - - "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], - - "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], - - "node-releases": ["node-releases@2.0.46", "", {}, "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ=="], - - "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "3.0.1" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], - - "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - - "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], - - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - - "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], - - "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "2.0.5", "node-fetch-native": "1.6.7", "ufo": "1.6.4" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], - - "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], - - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - - "oniguruma-to-es": ["oniguruma-to-es@2.3.0", "", { "dependencies": { "emoji-regex-xs": "1.0.0", "regex": "5.1.1", "regex-recursion": "5.1.1" } }, "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g=="], - - "open": ["open@11.0.0", "", { "dependencies": { "default-browser": "5.5.0", "define-lazy-prop": "3.0.0", "is-in-ssh": "1.0.0", "is-inside-container": "1.0.0", "powershell-utils": "0.1.0", "wsl-utils": "0.3.1" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="], - - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], - - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - - "parse-json": ["parse-json@5.2.0", "", { "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" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - - "parse5": ["parse5@8.0.1", "", { "dependencies": { "entities": "8.0.0" } }, "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw=="], - - "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], - - "path-expression-matcher": ["path-expression-matcher@1.5.0", "", {}, "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ=="], - - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - - "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "11.5.0", "minipass": "7.1.3" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], - - "path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], - - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], - - "pg": ["pg@8.21.0", "", { "dependencies": { "pg-connection-string": "^2.13.0", "pg-pool": "^3.14.0", "pg-protocol": "^1.14.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-AUP1EYJuHraQGsVoCQVIcM7TEJVGtDzxWtGFZd8rds9d+CCXlU5Js1rYgfLNvxy9iJrpHjGrRjoi/3BT9fRyiA=="], - - "pg-cloudflare": ["pg-cloudflare@1.4.0", "", {}, "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A=="], - - "pg-connection-string": ["pg-connection-string@2.13.0", "", {}, "sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig=="], - - "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], - - "pg-pool": ["pg-pool@3.14.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw=="], - - "pg-protocol": ["pg-protocol@1.14.0", "", {}, "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA=="], - - "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], - - "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], - - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - - "pkg-types": ["pkg-types@2.3.1", "", { "dependencies": { "confbox": "0.2.4", "exsolve": "1.0.8", "pathe": "2.0.3" } }, "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg=="], - - "postal-mime": ["postal-mime@2.7.4", "", {}, "sha512-0WdnFQYUrPGGTFu1uOqD2s7omwua8xaeYGdO6rb88oD5yJ/4pPHDA4sdWqfD8wQVfCny563n/HQS7zTFft+f/g=="], - - "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "3.3.12", "picocolors": "1.1.1", "source-map-js": "1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="], - - "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], - - "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], - - "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], - - "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - - "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], - - "pretty-bytes": ["pretty-bytes@7.1.0", "", {}, "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw=="], - - "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], - - "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - - "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], - - "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], - - "proto3-json-serializer": ["proto3-json-serializer@2.0.2", "", { "dependencies": { "protobufjs": "^7.2.5" } }, "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ=="], - - "protobufjs": ["protobufjs@7.6.1", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.1", "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.3.2" } }, "sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg=="], - - "proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], - - "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], - - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "puppeteer": ["puppeteer@25.0.4", "", { "dependencies": { "@puppeteer/browsers": "3.0.3", "chromium-bidi": "16.0.1", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1608973", "puppeteer-core": "25.0.4", "typed-query-selector": "^2.12.2" }, "bin": { "puppeteer": "lib/puppeteer/node/cli.js" } }, "sha512-QFdBAuNOqL0I+AdARTlRR1KcgPk0fo0dU127e1ZQFVxb9QPcpBDIiQp/dMgdbyLXHpF2GRjC/OezDmjKcLCKYw=="], - - "puppeteer-core": ["puppeteer-core@25.0.4", "", { "dependencies": { "@puppeteer/browsers": "3.0.3", "chromium-bidi": "16.0.1", "debug": "^4.4.3", "devtools-protocol": "0.0.1608973", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.1", "ws": "^8.20.0" } }, "sha512-K1LQKDP6w1rIr1jUyN9obH16TO/DCy86k3q+FBd2prGY+TStxhFySxmaZZuRF+0D3BJXjwCYFke7tMHCH4olTA=="], - - "qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="], - - "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], - - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - - "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], - - "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], - - "rc9": ["rc9@3.0.1", "", { "dependencies": { "defu": "6.1.7", "destr": "2.0.5" } }, "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ=="], - - "react": ["react@19.2.6", "", {}, "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q=="], - - "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "3.0.0", "buffer": "6.0.3", "events": "3.3.0", "process": "0.11.10", "string_decoder": "1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - - "readdir-glob": ["readdir-glob@1.1.3", "", { "dependencies": { "minimatch": "5.1.9" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="], - - "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - - "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], - - "redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "1.2.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="], - - "regex": ["regex@5.1.1", "", { "dependencies": { "regex-utilities": "2.3.0" } }, "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw=="], - - "regex-recursion": ["regex-recursion@5.1.1", "", { "dependencies": { "regex": "5.1.1", "regex-utilities": "2.3.0" } }, "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w=="], - - "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], - - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], - - "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - - "resend": ["resend@6.12.4", "", { "dependencies": { "postal-mime": "2.7.4", "standardwebhooks": "1.0.0" }, "peerDependencies": { "@react-email/render": "*" }, "optionalPeers": ["@react-email/render"] }, "sha512-lRpJ2Hxd+ht+JPDm97juRcUp9HOMuZyxaRFRFmc9Tx8iNWiei94Dx9v6SWufgKk2667C/uCeKKspMotOHSpCSg=="], - - "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "1.3.0", "is-core-module": "2.16.2", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], - - "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - - "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], - - "retry-request": ["retry-request@7.0.2", "", { "dependencies": { "@types/request": "^2.48.8", "extend": "^3.0.2", "teeny-request": "^9.0.0" } }, "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w=="], - - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - - "rollup": ["rollup@4.60.4", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.4", "@rollup/rollup-android-arm64": "4.60.4", "@rollup/rollup-darwin-arm64": "4.60.4", "@rollup/rollup-darwin-x64": "4.60.4", "@rollup/rollup-freebsd-arm64": "4.60.4", "@rollup/rollup-freebsd-x64": "4.60.4", "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", "@rollup/rollup-linux-arm-musleabihf": "4.60.4", "@rollup/rollup-linux-arm64-gnu": "4.60.4", "@rollup/rollup-linux-arm64-musl": "4.60.4", "@rollup/rollup-linux-loong64-gnu": "4.60.4", "@rollup/rollup-linux-loong64-musl": "4.60.4", "@rollup/rollup-linux-ppc64-gnu": "4.60.4", "@rollup/rollup-linux-ppc64-musl": "4.60.4", "@rollup/rollup-linux-riscv64-gnu": "4.60.4", "@rollup/rollup-linux-riscv64-musl": "4.60.4", "@rollup/rollup-linux-s390x-gnu": "4.60.4", "@rollup/rollup-linux-x64-gnu": "4.60.4", "@rollup/rollup-linux-x64-musl": "4.60.4", "@rollup/rollup-openbsd-x64": "4.60.4", "@rollup/rollup-openharmony-arm64": "4.60.4", "@rollup/rollup-win32-arm64-msvc": "4.60.4", "@rollup/rollup-win32-ia32-msvc": "4.60.4", "@rollup/rollup-win32-x64-gnu": "4.60.4", "@rollup/rollup-win32-x64-msvc": "4.60.4", "fsevents": "2.3.3" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g=="], - - "rollup-plugin-visualizer": ["rollup-plugin-visualizer@7.0.1", "", { "dependencies": { "open": "11.0.0", "picomatch": "4.0.4", "source-map": "0.7.6", "yargs": "18.0.0" }, "optionalDependencies": { "rollup": "4.60.4" }, "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg=="], - - "rou3": ["rou3@0.7.12", "", {}, "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg=="], - - "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], - - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "1.2.3" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], - - "scmp": ["scmp@2.1.0", "", {}, "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q=="], - - "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], - - "semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="], - - "send": ["send@1.2.1", "", { "dependencies": { "debug": "4.4.3", "encodeurl": "2.0.0", "escape-html": "1.0.3", "etag": "1.8.1", "fresh": "2.0.0", "http-errors": "2.0.1", "mime-types": "3.0.2", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "1.2.1", "statuses": "2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], - - "serialize-javascript": ["serialize-javascript@7.0.5", "", {}, "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw=="], - - "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], - - "seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "1.5.4" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], - - "serve-placeholder": ["serve-placeholder@2.0.2", "", { "dependencies": { "defu": "6.1.7" } }, "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ=="], - - "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "2.0.0", "escape-html": "1.0.3", "parseurl": "1.3.3", "send": "1.2.1" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], - - "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - - "shiki": ["shiki@1.29.2", "", { "dependencies": { "@shikijs/core": "1.29.2", "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/langs": "1.29.2", "@shikijs/themes": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "10.0.2", "@types/hast": "3.0.4" } }, "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg=="], - - "side-channel": ["side-channel@1.1.0", "", { "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" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], - - "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], - - "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], - - "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "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" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - - "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], - - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - - "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], - - "smob": ["smob@1.6.2", "", {}, "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw=="], - - "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], - - "snakecase-keys": ["snakecase-keys@8.0.1", "", { "dependencies": { "map-obj": "^4.1.0", "snake-case": "^3.0.4", "type-fest": "^4.15.0" } }, "sha512-Sj51kE1zC7zh6TDlNNz0/Jn1n5HiHdoQErxO8jLtnyrkJW/M5PrI7x05uDgY3BO7OUQYKCvmeMurW6BPUdwEOw=="], - - "solid-js": ["solid-js@1.9.13", "", { "dependencies": { "csstype": "3.2.3", "seroval": "1.5.4", "seroval-plugins": "1.5.4" } }, "sha512-6hJeJMOcEX8ktqjpDoJZEmld3ijvcvWBDtiXBm7f4332SiFN66QeAQI1REQshvyUoISsSeJ4PHDauKYbwao9JQ=="], - - "solid-refresh": ["solid-refresh@0.6.3", "", { "dependencies": { "@babel/generator": "7.29.7", "@babel/helper-module-imports": "7.29.7", "@babel/types": "7.29.7" }, "peerDependencies": { "solid-js": "1.9.13" } }, "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="], - - "solid-use": ["solid-use@0.9.1", "", { "peerDependencies": { "solid-js": "1.9.13" } }, "sha512-UwvXDVPlrrbj/9ewG9ys5uL2IO4jSiwys2KPzK4zsnAcmEl7iDafZWW1Mo4BSEWOmQCGK6IvpmGHo1aou8iOFw=="], - - "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - - "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "1.1.2", "source-map": "0.6.1" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - - "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], - - "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], - - "srvx": ["srvx@0.9.8", "", { "bin": { "srvx": "bin/srvx.mjs" } }, "sha512-RZaxTKJEE/14HYn8COLuUOJAt0U55N9l1Xf6jj+T0GoA01EUH1Xz5JtSUOI+EHn+AEgPCVn7gk6jHJffrr06fQ=="], - - "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], - - "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], - - "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], - - "standardwebhooks": ["standardwebhooks@1.0.0", "", { "dependencies": { "@stablelib/base64": "^1.0.0", "fast-sha256": "^1.3.0" } }, "sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg=="], - - "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - - "std-env": ["std-env@4.1.0", "", {}, "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ=="], - - "stream-events": ["stream-events@1.0.5", "", { "dependencies": { "stubs": "^3.0.0" } }, "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg=="], - - "stream-shift": ["stream-shift@1.0.3", "", {}, "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="], - - "streamx": ["streamx@2.25.0", "", { "dependencies": { "events-universal": "1.0.1", "fast-fifo": "1.3.2", "text-decoder": "1.2.7" } }, "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg=="], - - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - - "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "2.1.0", "character-entities-legacy": "3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], - - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], - - "stripe": ["stripe@22.1.1", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cmodIYP27tBkJ8G7DuGgWw0PFuemlFZbuF3Wwr1TrjFjUa3T7NIgCe6TVwX8BO2ynu+xtTuDGfHafNDCPt9lXA=="], - - "strnum": ["strnum@2.3.0", "", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="], - - "stubs": ["stubs@3.0.0", "", {}, "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw=="], - - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - - "swr": ["swr@2.4.1", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA=="], - - "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], - - "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], - - "tailwindcss": ["tailwindcss@4.3.0", "", {}, "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q=="], - - "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], - - "tar": ["tar@7.5.15", "", { "dependencies": { "@isaacs/fs-minipass": "4.0.1", "chownr": "3.0.0", "minipass": "7.1.3", "minizlib": "3.1.0", "yallist": "5.0.0" } }, "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ=="], - - "tar-fs": ["tar-fs@3.1.2", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw=="], - - "tar-stream": ["tar-stream@3.2.0", "", { "dependencies": { "b4a": "1.8.1", "bare-fs": "4.7.1", "fast-fifo": "1.3.2", "streamx": "2.25.0" } }, "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg=="], - - "teeny-request": ["teeny-request@9.0.0", "", { "dependencies": { "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.9", "stream-events": "^1.0.5", "uuid": "^9.0.0" } }, "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g=="], - - "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "2.25.0" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], - - "terracotta": ["terracotta@1.1.0", "", { "dependencies": { "solid-use": "0.9.1" }, "peerDependencies": { "solid-js": "1.9.13" } }, "sha512-kfQciWUBUBgYkXu7gh3CK3FAJng/iqZslAaY08C+k1Hdx17aVEpcFFb/WPaysxAfcupNH3y53s/pc53xxZauww=="], - - "terser": ["terser@5.48.0", "", { "dependencies": { "@jridgewell/source-map": "0.3.11", "acorn": "8.16.0", "commander": "2.20.3", "source-map-support": "0.5.21" }, "bin": { "terser": "bin/terser" } }, "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q=="], - - "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "1.8.1" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], - - "three": ["three@0.184.0", "", {}, "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg=="], - - "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], - - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], - - "tinyclip": ["tinyclip@0.1.12", "", {}, "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA=="], - - "tinyexec": ["tinyexec@1.2.2", "", {}, "sha512-M/Q0B2cp4K7kynaT/vnED1j8TlLY+Pp7C6Wl2bl/7u/F0mUVwdyOpwomQb8JpYLitHUssAJRmLZdMCGsrx7i+g=="], - - "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "6.5.0", "picomatch": "4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], - - "tinyrainbow": ["tinyrainbow@3.1.0", "", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="], - - "tldts": ["tldts@7.4.0", "", { "dependencies": { "tldts-core": "7.4.0" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-yHBe+zVfzNZ3QfTPW/Z6KK1G2t340gFjMHqI/4KKSt/abzYydzuCnpqdaF5gCCABby+9Yfbj59oR5F2Fd5CBzg=="], - - "tldts-core": ["tldts-core@7.4.0", "", {}, "sha512-/mb9kRld+x1sIMXxWNOAp5m6C+D4GrAORWlJkOJ5dElvxdN1eutz/o7qHLp9gFvDF4Y3/L2xeScoxz6AbEo8rQ=="], - - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - - "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], - - "tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "7.4.0" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="], - - "tr46": ["tr46@6.0.0", "", { "dependencies": { "punycode": "2.3.1" } }, "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw=="], - - "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], - - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "tsx": ["tsx@4.22.3", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-mdoNxBC/cSQObGGVQ5Bpn5i+yv7j68gk3Nfm3wFjcJg3Z0Mix9jzAFfP12prmm5eVGmDKtp0yyArrs0Q+8gZHg=="], - - "turbo": ["turbo@2.9.14", "", { "optionalDependencies": { "@turbo/darwin-64": "2.9.14", "@turbo/darwin-arm64": "2.9.14", "@turbo/linux-64": "2.9.14", "@turbo/linux-arm64": "2.9.14", "@turbo/windows-64": "2.9.14", "@turbo/windows-arm64": "2.9.14" }, "bin": { "turbo": "bin/turbo" } }, "sha512-BQqXRr4UoWI3UPFrtznCLykYHxwxWh53iCB57x092jPMjIlW1wnm3N895g5irpiXmnxUhREBB0n6+y8BHhs4nw=="], - - "twilio": ["twilio@6.0.2", "", { "dependencies": { "axios": "^1.13.5", "dayjs": "^1.11.9", "https-proxy-agent": "^5.0.0", "jsonwebtoken": "^9.0.3", "qs": "^6.14.1", "scmp": "^2.1.0", "xmlbuilder": "^13.0.2" } }, "sha512-RN3TZxUtxLz2HBZVt62+LdZxQbrMVgYKtuzLgwmO7nqKvR+gQS5mCackD9hf4Y7MmoK/bX7tCm7kaJC8kC8zFA=="], - - "type-fest": ["type-fest@5.6.0", "", { "dependencies": { "tagged-tag": "1.0.0" } }, "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA=="], - - "typed-query-selector": ["typed-query-selector@2.12.2", "", {}, "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ=="], - - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - - "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], - - "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], - - "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], - - "unctx": ["unctx@2.5.0", "", { "dependencies": { "acorn": "8.16.0", "estree-walker": "3.0.3", "magic-string": "0.30.21", "unplugin": "2.3.11" } }, "sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg=="], - - "undici": ["undici@7.26.0", "", {}, "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg=="], - - "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - - "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], - - "unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="], - - "unimport": ["unimport@6.3.0", "", { "dependencies": { "acorn": "8.16.0", "escape-string-regexp": "5.0.0", "estree-walker": "3.0.3", "local-pkg": "1.2.1", "magic-string": "0.30.21", "mlly": "1.8.2", "pathe": "2.0.3", "picomatch": "4.0.4", "pkg-types": "2.3.1", "scule": "1.3.0", "strip-literal": "3.1.0", "tinyglobby": "0.2.16", "unplugin": "3.0.0", "unplugin-utils": "0.3.1" } }, "sha512-M+Dxk5W9WRd+8j56W9tp8lGW/dmMc7g5zj7BWQnEjKQhryBstqsi1V0izb0zHwSkEN8cSYV7K75/bykairV2tA=="], - - "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "3.0.3" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], - - "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "3.0.3" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], - - "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "3.0.3" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], - - "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "3.0.3", "unist-util-is": "6.0.1", "unist-util-visit-parents": "6.0.2" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], - - "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "3.0.3", "unist-util-is": "6.0.1" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], - - "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "2.3.5", "acorn": "8.16.0", "picomatch": "4.0.4", "webpack-virtual-modules": "0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], - - "unplugin-utils": ["unplugin-utils@0.3.1", "", { "dependencies": { "pathe": "2.0.3", "picomatch": "4.0.4" } }, "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog=="], - - "unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "3.1.3", "chokidar": "5.0.0", "destr": "2.0.5", "h3": "1.15.11", "lru-cache": "11.5.0", "node-fetch-native": "1.6.7", "ofetch": "1.5.1", "ufo": "1.6.4" }, "optionalDependencies": { "db0": "0.3.4", "ioredis": "5.10.1" } }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], - - "untun": ["untun@0.1.3", "", { "dependencies": { "citty": "0.1.6", "consola": "3.4.2", "pathe": "1.1.2" }, "bin": { "untun": "bin/untun.mjs" } }, "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ=="], - - "untyped": ["untyped@2.0.0", "", { "dependencies": { "citty": "0.1.6", "defu": "6.1.7", "jiti": "2.7.0", "knitwork": "1.3.0", "scule": "1.3.0" }, "bin": { "untyped": "dist/cli.mjs" } }, "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g=="], - - "unwasm": ["unwasm@0.5.3", "", { "dependencies": { "exsolve": "1.0.8", "knitwork": "1.3.0", "magic-string": "0.30.21", "mlly": "1.8.2", "pathe": "2.0.3", "pkg-types": "2.3.1" } }, "sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw=="], - - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "3.2.0", "picocolors": "1.1.1" }, "peerDependencies": { "browserslist": "4.28.2" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], - - "uqr": ["uqr@0.1.3", "", {}, "sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA=="], - - "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], - - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - - "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - - "valibot": ["valibot@0.29.0", "", {}, "sha512-JhZn08lwZPhAamOCfBwBkv/btQt4KeQhekULPH8crH053zUCLSOGEF2zKExu3bFf245tsj6J1dY0ysd/jUiMIQ=="], - - "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "3.0.3", "vfile-message": "4.0.3" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], - - "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "3.0.3", "unist-util-stringify-position": "4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], - - "vite": ["vite@7.3.3", "", { "dependencies": { "esbuild": "0.27.7", "fdir": "6.5.0", "picomatch": "4.0.4", "postcss": "8.5.15", "rollup": "4.60.4", "tinyglobby": "0.2.16" }, "optionalDependencies": { "@types/node": "25.9.1", "fsevents": "2.3.3", "jiti": "2.7.0", "lightningcss": "1.32.0", "terser": "5.48.0" }, "bin": { "vite": "bin/vite.js" } }, "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA=="], - - "vite-plugin-solid": ["vite-plugin-solid@2.11.12", "", { "dependencies": { "@babel/core": "7.29.7", "@types/babel__core": "7.20.5", "babel-preset-solid": "1.9.12", "merge-anything": "5.1.7", "solid-refresh": "0.6.3", "vitefu": "1.1.3" }, "peerDependencies": { "solid-js": "1.9.13", "vite": "7.3.3" } }, "sha512-FgjPcx2OwX9h6f28jli7A4bG7PP3te8uyakE5iqsmpq3Jqi1TWLgSroC9N6cMfGRU2zXsl4Q6ISvTr2VL0QHpA=="], - - "vitefu": ["vitefu@1.1.3", "", { "optionalDependencies": { "vite": "7.3.3" } }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], - - "vitest": ["vitest@4.1.7", "", { "dependencies": { "@vitest/expect": "4.1.7", "@vitest/mocker": "4.1.7", "@vitest/pretty-format": "4.1.7", "@vitest/runner": "4.1.7", "@vitest/snapshot": "4.1.7", "@vitest/spy": "4.1.7", "@vitest/utils": "4.1.7", "es-module-lexer": "2.1.0", "expect-type": "1.3.0", "magic-string": "0.30.21", "obug": "2.1.1", "pathe": "2.0.3", "picomatch": "4.0.4", "std-env": "4.1.0", "tinybench": "2.9.0", "tinyexec": "1.2.2", "tinyglobby": "0.2.16", "tinyrainbow": "3.1.0", "why-is-node-running": "2.3.0" }, "optionalDependencies": { "@types/node": "25.9.1", "@vitest/coverage-v8": "4.1.7", "jsdom": "29.1.1" }, "peerDependencies": { "vite": "7.3.3" }, "bin": { "vitest": "vitest.mjs" } }, "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA=="], - - "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="], - - "web": ["web@workspace:web"], - - "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], - - "webdriver-bidi-protocol": ["webdriver-bidi-protocol@0.4.1", "", {}, "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw=="], - - "webidl-conversions": ["webidl-conversions@8.0.1", "", {}, "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ=="], - - "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], - - "websocket-driver": ["websocket-driver@0.7.4", "", { "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg=="], - - "websocket-extensions": ["websocket-extensions@0.1.4", "", {}, "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="], - - "whatwg-mimetype": ["whatwg-mimetype@5.0.0", "", {}, "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw=="], - - "whatwg-url": ["whatwg-url@16.0.1", "", { "dependencies": { "@exodus/bytes": "1.15.1", "tr46": "6.0.0", "webidl-conversions": "8.0.1" } }, "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw=="], - - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "4.3.0", "string-width": "4.2.3", "strip-ansi": "6.0.1" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "4.3.0", "string-width": "4.2.3", "strip-ansi": "6.0.1" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - - "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], - - "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "3.1.1", "powershell-utils": "0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], - - "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], - - "xml-naming": ["xml-naming@0.1.0", "", {}, "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw=="], - - "xmlbuilder": ["xmlbuilder@13.0.2", "", {}, "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ=="], - - "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], - - "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], - - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - - "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - - "youch": ["youch@4.1.1", "", { "dependencies": { "@poppinss/colors": "4.1.6", "@poppinss/dumper": "0.7.0", "@speed-highlight/core": "1.2.15", "cookie-es": "3.1.1", "youch-core": "0.3.3" } }, "sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA=="], - - "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "1.2.3", "error-stack-parser-es": "1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="], - - "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "5.0.2", "compress-commons": "6.0.2", "readable-stream": "4.7.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], - - "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - - "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "3.1.1" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - - "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@clerk/backend/@clerk/shared": ["@clerk/shared@3.47.6", "", { "dependencies": { "csstype": "3.1.3", "dequal": "2.0.3", "glob-to-regexp": "0.4.1", "js-cookie": "3.0.7", "std-env": "^3.9.0", "swr": "2.3.4" }, "peerDependencies": { "react": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0", "react-dom": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-hg2UFiwmSb3FnAciMxZZZculRN08NrlajXbBhT+nylMG6ljZoic0OlIGs+Rtp49scVMkX3Ytz5EUUj9pgVvcWQ=="], - - "@clerk/shared/std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], - - "@clerk/types/@clerk/shared": ["@clerk/shared@3.47.6", "", { "dependencies": { "csstype": "3.1.3", "dequal": "2.0.3", "glob-to-regexp": "0.4.1", "js-cookie": "3.0.7", "std-env": "^3.9.0", "swr": "2.3.4" }, "peerDependencies": { "react": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0", "react-dom": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-hg2UFiwmSb3FnAciMxZZZculRN08NrlajXbBhT+nylMG6ljZoic0OlIGs+Rtp49scVMkX3Ytz5EUUj9pgVvcWQ=="], - - "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], - - "@google-cloud/storage/google-auth-library": ["google-auth-library@9.15.1", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^6.1.1", "gcp-metadata": "^6.1.0", "gtoken": "^7.0.0", "jws": "^4.0.0" } }, "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng=="], - - "@google-cloud/storage/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], - - "@grpc/grpc-js/@grpc/proto-loader": ["@grpc/proto-loader@0.8.1", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg=="], - - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "0.2.0", "emoji-regex": "9.2.2", "strip-ansi": "7.2.0" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - - "@isaacs/cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], - - "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "6.2.3", "string-width": "5.1.2", "strip-ansi": "7.2.0" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - - "@mapbox/node-pre-gyp/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "7.1.4", "debug": "4.4.3" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "@mapbox/node-pre-gyp/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - - "@poppinss/dumper/supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], - - "@puppeteer/browsers/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - - "@rollup/plugin-commonjs/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - - "@rollup/plugin-inject/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - - "@rollup/pluginutils/@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], - - "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - - "@solidjs/start/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], - - "@tanstack/directive-functions-plugin/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "7.29.7", "js-tokens": "4.0.0", "picocolors": "1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@tanstack/server-functions-plugin/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "7.29.7", "js-tokens": "4.0.0", "picocolors": "1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@types/request/form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], - - "@vercel/nft/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - - "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - - "archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "3.3.1", "jackspeak": "3.4.3", "minimatch": "9.0.9", "minipass": "7.1.3", "package-json-from-dist": "1.0.1", "path-scurry": "1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], - - "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "7.29.7" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], - - "babel-plugin-jsx-dom-expressions/html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], - - "babel-plugin-jsx-dom-expressions/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "6.0.1" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], - - "duplexify/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "estree-walker/@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], - - "gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "7.1.4", "debug": "4.4.3" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "gaxios/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "gcp-metadata/gaxios": ["gaxios@7.1.4", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2" } }, "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA=="], - - "google-auth-library/gaxios": ["gaxios@7.1.4", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "node-fetch": "^3.3.2" } }, "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA=="], - - "google-gax/google-auth-library": ["google-auth-library@9.15.1", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^6.1.1", "gcp-metadata": "^6.1.0", "gtoken": "^7.0.0", "jws": "^4.0.0" } }, "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng=="], - - "google-gax/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - - "is-reference/@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], - - "jsonwebtoken/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - - "jwks-rsa/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], - - "lazystream/readable-stream": ["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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - - "listhen/h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "1.2.3", "crossws": "0.3.5", "defu": "6.1.7", "destr": "2.0.5", "iron-webcrypto": "1.2.1", "node-mock-http": "1.0.4", "radix3": "1.1.2", "ufo": "1.6.4", "uncrypto": "0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], - - "lru-memoizer/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "make-dir/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - - "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - - "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "0.1.8", "mlly": "1.8.2", "pathe": "2.0.3" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], - - "nitropack/esbuild": ["esbuild@0.28.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.0", "@esbuild/android-arm": "0.28.0", "@esbuild/android-arm64": "0.28.0", "@esbuild/android-x64": "0.28.0", "@esbuild/darwin-arm64": "0.28.0", "@esbuild/darwin-x64": "0.28.0", "@esbuild/freebsd-arm64": "0.28.0", "@esbuild/freebsd-x64": "0.28.0", "@esbuild/linux-arm": "0.28.0", "@esbuild/linux-arm64": "0.28.0", "@esbuild/linux-ia32": "0.28.0", "@esbuild/linux-loong64": "0.28.0", "@esbuild/linux-mips64el": "0.28.0", "@esbuild/linux-ppc64": "0.28.0", "@esbuild/linux-riscv64": "0.28.0", "@esbuild/linux-s390x": "0.28.0", "@esbuild/linux-x64": "0.28.0", "@esbuild/netbsd-arm64": "0.28.0", "@esbuild/netbsd-x64": "0.28.0", "@esbuild/openbsd-arm64": "0.28.0", "@esbuild/openbsd-x64": "0.28.0", "@esbuild/openharmony-arm64": "0.28.0", "@esbuild/sunos-x64": "0.28.0", "@esbuild/win32-arm64": "0.28.0", "@esbuild/win32-ia32": "0.28.0", "@esbuild/win32-x64": "0.28.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw=="], - - "nitropack/h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "1.2.3", "crossws": "0.3.5", "defu": "6.1.7", "destr": "2.0.5", "iron-webcrypto": "1.2.1", "node-mock-http": "1.0.4", "radix3": "1.1.2", "ufo": "1.6.4", "uncrypto": "0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], - - "nitropack/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - - "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "0.0.3", "webidl-conversions": "3.0.1" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - - "readdir-glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "2.1.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], - - "rollup-plugin-visualizer/yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "9.0.1", "escalade": "3.2.0", "get-caller-file": "2.0.5", "string-width": "7.2.0", "y18n": "5.0.8", "yargs-parser": "22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], - - "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - - "snakecase-keys/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - - "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], - - "tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], - - "teeny-request/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "tsx/esbuild": ["esbuild@0.28.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.0", "@esbuild/android-arm": "0.28.0", "@esbuild/android-arm64": "0.28.0", "@esbuild/android-x64": "0.28.0", "@esbuild/darwin-arm64": "0.28.0", "@esbuild/darwin-x64": "0.28.0", "@esbuild/freebsd-arm64": "0.28.0", "@esbuild/freebsd-x64": "0.28.0", "@esbuild/linux-arm": "0.28.0", "@esbuild/linux-arm64": "0.28.0", "@esbuild/linux-ia32": "0.28.0", "@esbuild/linux-loong64": "0.28.0", "@esbuild/linux-mips64el": "0.28.0", "@esbuild/linux-ppc64": "0.28.0", "@esbuild/linux-riscv64": "0.28.0", "@esbuild/linux-s390x": "0.28.0", "@esbuild/linux-x64": "0.28.0", "@esbuild/netbsd-arm64": "0.28.0", "@esbuild/netbsd-x64": "0.28.0", "@esbuild/openbsd-arm64": "0.28.0", "@esbuild/openbsd-x64": "0.28.0", "@esbuild/openharmony-arm64": "0.28.0", "@esbuild/sunos-x64": "0.28.0", "@esbuild/win32-arm64": "0.28.0", "@esbuild/win32-ia32": "0.28.0", "@esbuild/win32-x64": "0.28.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw=="], - - "unimport/unplugin": ["unplugin@3.0.0", "", { "dependencies": { "@jridgewell/remapping": "2.3.5", "picomatch": "4.0.4", "webpack-virtual-modules": "0.6.2" } }, "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg=="], - - "unstorage/h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "1.2.3", "crossws": "0.3.5", "defu": "6.1.7", "destr": "2.0.5", "iron-webcrypto": "1.2.1", "node-mock-http": "1.0.4", "radix3": "1.1.2", "ufo": "1.6.4", "uncrypto": "0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], - - "untun/citty": ["citty@0.1.6", "", { "dependencies": { "consola": "3.4.2" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], - - "untun/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], - - "untyped/citty": ["citty@0.1.6", "", { "dependencies": { "consola": "3.4.2" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], - - "vite/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], - - "youch/cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], - - "@clerk/backend/@clerk/shared/csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], - - "@clerk/backend/@clerk/shared/js-cookie": ["js-cookie@3.0.7", "", {}, "sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw=="], - - "@clerk/backend/@clerk/shared/std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], - - "@clerk/backend/@clerk/shared/swr": ["swr@2.3.4", "", { "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" } }, "sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg=="], - - "@clerk/types/@clerk/shared/csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], - - "@clerk/types/@clerk/shared/js-cookie": ["js-cookie@3.0.7", "", {}, "sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw=="], - - "@clerk/types/@clerk/shared/std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], - - "@clerk/types/@clerk/shared/swr": ["swr@2.3.4", "", { "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" } }, "sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="], - - "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], - - "@google-cloud/storage/google-auth-library/gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="], - - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - - "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - - "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - - "@mapbox/node-pre-gyp/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "@tanstack/directive-functions-plugin/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - - "@tanstack/server-functions-plugin/@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - - "archiver-utils/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "2.1.1" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], - - "archiver-utils/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "10.4.3", "minipass": "7.1.3" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - - "babel-plugin-jsx-dom-expressions/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - - "gaxios/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "gcp-metadata/gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "7.1.4", "debug": "4.4.3" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "gcp-metadata/gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], - - "google-auth-library/gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "7.1.4", "debug": "4.4.3" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "google-auth-library/gaxios/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], - - "google-gax/google-auth-library/gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="], - - "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - - "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "5.1.2" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - - "listhen/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], - - "lru-memoizer/lru-cache/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], - - "nitropack/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA=="], - - "nitropack/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.0", "", { "os": "android", "cpu": "arm" }, "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ=="], - - "nitropack/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.0", "", { "os": "android", "cpu": "arm64" }, "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw=="], - - "nitropack/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.0", "", { "os": "android", "cpu": "x64" }, "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA=="], - - "nitropack/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q=="], - - "nitropack/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ=="], - - "nitropack/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q=="], - - "nitropack/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw=="], - - "nitropack/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw=="], - - "nitropack/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A=="], - - "nitropack/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ=="], - - "nitropack/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg=="], - - "nitropack/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w=="], - - "nitropack/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg=="], - - "nitropack/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ=="], - - "nitropack/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q=="], - - "nitropack/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.0", "", { "os": "linux", "cpu": "x64" }, "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ=="], - - "nitropack/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.0", "", { "os": "none", "cpu": "arm64" }, "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw=="], - - "nitropack/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.0", "", { "os": "none", "cpu": "x64" }, "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw=="], - - "nitropack/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g=="], - - "nitropack/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA=="], - - "nitropack/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.0", "", { "os": "none", "cpu": "arm64" }, "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w=="], - - "nitropack/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw=="], - - "nitropack/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA=="], - - "nitropack/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA=="], - - "nitropack/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw=="], - - "nitropack/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], - - "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], - - "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], - - "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "1.0.2" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - - "rollup-plugin-visualizer/yargs/cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "7.2.0", "strip-ansi": "7.2.0", "wrap-ansi": "9.0.2" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], - - "rollup-plugin-visualizer/yargs/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "10.6.0", "get-east-asian-width": "1.6.0", "strip-ansi": "7.2.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - - "rollup-plugin-visualizer/yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], - - "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - - "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA=="], - - "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.0", "", { "os": "android", "cpu": "arm" }, "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ=="], - - "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.0", "", { "os": "android", "cpu": "arm64" }, "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw=="], - - "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.0", "", { "os": "android", "cpu": "x64" }, "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA=="], - - "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q=="], - - "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ=="], - - "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q=="], - - "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw=="], - - "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw=="], - - "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A=="], - - "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ=="], - - "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg=="], - - "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w=="], - - "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg=="], - - "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.0", "", { "os": "linux", "cpu": "none" }, "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ=="], - - "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q=="], - - "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.0", "", { "os": "linux", "cpu": "x64" }, "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ=="], - - "tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.0", "", { "os": "none", "cpu": "arm64" }, "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw=="], - - "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.0", "", { "os": "none", "cpu": "x64" }, "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw=="], - - "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g=="], - - "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA=="], - - "tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.0", "", { "os": "none", "cpu": "arm64" }, "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w=="], - - "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw=="], - - "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA=="], - - "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA=="], - - "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw=="], - - "unstorage/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], - - "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], - - "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], - - "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], - - "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], - - "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], - - "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], - - "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], - - "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], - - "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], - - "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], - - "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], - - "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - - "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - - "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], - - "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], - - "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], - - "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], - - "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], - - "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], - - "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], - - "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], - - "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], - - "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], - - "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], - - "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], - - "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], - - "@google-cloud/storage/google-auth-library/gcp-metadata/google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], - - "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "1.0.2" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], - - "archiver-utils/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - - "gcp-metadata/gaxios/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "google-auth-library/gaxios/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "google-gax/google-auth-library/gcp-metadata/google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], - - "readdir-glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - - "rollup-plugin-visualizer/yargs/cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], - - "rollup-plugin-visualizer/yargs/cliui/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "6.2.3", "string-width": "7.2.0", "strip-ansi": "7.2.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - - "rollup-plugin-visualizer/yargs/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - - "rollup-plugin-visualizer/yargs/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], - - "archiver-utils/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - - "rollup-plugin-visualizer/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - - "rollup-plugin-visualizer/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - - "rollup-plugin-visualizer/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - } -} diff --git a/design-tokens/colors.json b/design-tokens/colors.json new file mode 100644 index 0000000..76642fd --- /dev/null +++ b/design-tokens/colors.json @@ -0,0 +1,151 @@ +{ + "meta": { + "description": "Kordant brand color tokens — single source of truth for web, iOS, Android", + "version": "1.0.0", + "lastUpdated": "2026-05-26" + }, + "brand": { + "primary": { + "value": "#4F46E5", + "description": "Main brand color — indigo" + }, + "primaryLight": { + "value": "#818CF8", + "description": "Lighter variant for accents and gradients" + }, + "primaryDark": { + "value": "#4338CA", + "description": "Darker variant for hover states and depth" + }, + "accent": { + "value": "#06B6D4", + "description": "Secondary brand color — cyan" + }, + "accentLight": { + "value": "#67E8F9", + "description": "Lighter accent variant" + }, + "accentDark": { + "value": "#0891B2", + "description": "Darker accent variant" + } + }, + "semantic": { + "success": { + "value": "#06B6D4", + "description": "Success state — cyan (on-brand)" + }, + "warning": { + "value": "#F59E0B", + "description": "Warning state — amber" + }, + "error": { + "value": "#EF4444", + "description": "Error state — red" + }, + "info": { + "value": "#4F46E5", + "description": "Informational — brand primary" + }, + "successBg": { + "light": "#ECFEFF", + "dark": "#0C4A6E", + "description": "Success background tint" + }, + "warningBg": { + "light": "#FFFBEB", + "dark": "#78350F", + "description": "Warning background tint" + }, + "errorBg": { + "light": "#FEF2F2", + "dark": "#7F1D1D", + "description": "Error background tint" + }, + "infoBg": { + "light": "#EEF2FF", + "dark": "#1E1B4B", + "description": "Info background tint" + } + }, + "background": { + "bg": { + "light": "#FAFBFC", + "dark": "#111827", + "description": "Primary background" + }, + "bgSecondary": { + "light": "#F3F4F6", + "dark": "#1F2937", + "description": "Secondary background (cards, sections)" + }, + "bgTertiary": { + "light": "#E5E7EB", + "dark": "#374151", + "description": "Tertiary background (inputs, disabled)" + } + }, + "text": { + "textPrimary": { + "light": "#111827", + "dark": "#F9FAFB", + "description": "Primary text — headings, body" + }, + "textSecondary": { + "light": "#6B7280", + "dark": "#D1D5DB", + "description": "Secondary text — captions, metadata" + }, + "textTertiary": { + "light": "#9CA3AF", + "dark": "#9CA3AF", + "description": "Tertiary text — placeholders, disabled" + } + }, + "border": { + "border": { + "light": "#E5E7EB", + "dark": "#374151", + "description": "Default border" + }, + "borderDark": { + "light": "#D1D5DB", + "dark": "#4B5563", + "description": "Emphasized border" + } + }, + "glass": { + "glass": { + "light": "rgba(255, 255, 255, 0.8)", + "dark": "rgba(17, 24, 39, 0.8)", + "description": "Glass morphism background (light)" + }, + "glassDark": { + "light": "rgba(17, 24, 39, 0.8)", + "dark": "rgba(17, 24, 39, 0.9)", + "description": "Glass morphism background (dark)" + } + }, + "gradient": { + "cardStart": { + "light": "#FFFFFF", + "dark": "#1F2937", + "description": "Card gradient start" + }, + "cardEnd": { + "light": "#F3F4F6", + "dark": "#0B1120", + "description": "Card gradient end" + } + }, + "dotGrid": { + "light": "#E5E7EB", + "dark": "#374151", + "description": "Background dot grid color" + }, + "focusRing": { + "light": "#4F46E5", + "dark": "#818CF8", + "description": "Focus ring outline color" + } +} diff --git a/design-tokens/radius.json b/design-tokens/radius.json new file mode 100644 index 0000000..0726297 --- /dev/null +++ b/design-tokens/radius.json @@ -0,0 +1,33 @@ +{ + "meta": { + "description": "Kordant border radius scale", + "version": "1.0.0", + "lastUpdated": "2026-05-26" + }, + "scale": { + "none": { + "value": "0px", + "description": "No rounding" + }, + "sm": { + "value": "4px", + "description": "Inputs, chips, badges" + }, + "md": { + "value": "8px", + "description": "Cards, buttons, modals" + }, + "lg": { + "value": "12px", + "description": "Large cards, panels" + }, + "xl": { + "value": "16px", + "description": "Hero cards, featured sections" + }, + "full": { + "value": "9999px", + "description": "Pills, avatars, badges" + } + } +} diff --git a/design-tokens/shadows.json b/design-tokens/shadows.json new file mode 100644 index 0000000..0d65dce --- /dev/null +++ b/design-tokens/shadows.json @@ -0,0 +1,41 @@ +{ + "meta": { + "description": "Kordant shadow definitions", + "version": "1.0.0", + "lastUpdated": "2026-05-26" + }, + "scale": { + "sm": { + "x": "0", + "y": "1", + "blur": "2", + "spread": "0", + "color": "rgba(0, 0, 0, 0.05)", + "description": "Subtle elevation — inputs, chips" + }, + "md": { + "x": "0", + "y": "4", + "blur": "6", + "spread": "-1", + "color": "rgba(0, 0, 0, 0.1)", + "description": "Card elevation — default cards" + }, + "lg": { + "x": "0", + "y": "10", + "blur": "15", + "spread": "-3", + "color": "rgba(0, 0, 0, 0.1)", + "description": "Modal elevation — dropdowns, menus" + }, + "xl": { + "x": "0", + "y": "20", + "blur": "25", + "spread": "-5", + "color": "rgba(0, 0, 0, 0.15)", + "description": "Dialog elevation — modals, tooltips" + } + } +} diff --git a/design-tokens/spacing.json b/design-tokens/spacing.json new file mode 100644 index 0000000..4e69cb5 --- /dev/null +++ b/design-tokens/spacing.json @@ -0,0 +1,41 @@ +{ + "meta": { + "description": "Kordant spacing scale — 4px base grid", + "version": "1.0.0", + "lastUpdated": "2026-05-26" + }, + "scale": { + "0": { + "value": "0px", + "description": "No spacing" + }, + "xs": { + "value": "4px", + "description": "Tightest spacing — within components" + }, + "sm": { + "value": "8px", + "description": "Small gaps — icon to text, tight lists" + }, + "md": { + "value": "16px", + "description": "Default spacing — card padding, form fields" + }, + "lg": { + "value": "24px", + "description": "Section spacing — between cards" + }, + "xl": { + "value": "32px", + "description": "Large spacing — between sections" + }, + "xxl": { + "value": "48px", + "description": "Page-level spacing" + }, + "xxxl": { + "value": "64px", + "description": "Hero spacing, full section gaps" + } + } +} diff --git a/design-tokens/typography.json b/design-tokens/typography.json new file mode 100644 index 0000000..f80cde9 --- /dev/null +++ b/design-tokens/typography.json @@ -0,0 +1,66 @@ +{ + "meta": { + "description": "Kordant typography scale — Inter font family", + "version": "1.0.0", + "lastUpdated": "2026-05-26" + }, + "fontFamily": { + "value": "Inter", + "fallback": "-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif" + }, + "scale": { + "caption": { + "size": "12px", + "lineHeight": "16px", + "description": "Fine print, captions, labels" + }, + "body": { + "size": "16px", + "lineHeight": "24px", + "description": "Default body text" + }, + "bodyLarge": { + "size": "18px", + "lineHeight": "28px", + "description": "Emphasized body text" + }, + "headline": { + "size": "20px", + "lineHeight": "28px", + "description": "Section headings, card titles" + }, + "title": { + "size": "24px", + "lineHeight": "32px", + "description": "Page titles" + }, + "largeTitle": { + "size": "32px", + "lineHeight": "40px", + "description": "Hero headlines" + }, + "display": { + "size": "48px", + "lineHeight": "56px", + "description": "Landing page hero display text" + } + }, + "weights": { + "regular": { + "value": 400, + "description": "Body text, default" + }, + "medium": { + "value": 500, + "description": "Emphasis in body, labels" + }, + "semibold": { + "value": 600, + "description": "Headings, buttons" + }, + "bold": { + "value": 700, + "description": "Display text, hero headlines" + } + } +} diff --git a/docs/BRAND_GUIDELINES.md b/docs/BRAND_GUIDELINES.md new file mode 100644 index 0000000..02b9e4c --- /dev/null +++ b/docs/BRAND_GUIDELINES.md @@ -0,0 +1,204 @@ +# Kordant Brand Guidelines + +> We protect you. We're smart about it. We explain things clearly. + +This document defines the Kordant visual identity. All platform code (web, iOS, Android) references the single source of truth in `design-tokens/`. + +--- + +## Color Palette + +### Brand Colors + +| Token | Hex | Usage | +|---|---|---| +| `primary` | `#4F46E5` | Primary actions, links, active states, logo | +| `primaryLight` | `#818CF8` | Gradients, hover states, secondary emphasis | +| `primaryDark` | `#4338CA` | Pressed states, depth, navigation active | +| `accent` | `#06B6D4` | Secondary CTAs, success states, data viz | +| `accentLight` | `#67E8F9` | Accent highlights, subtle backgrounds | +| `accentDark` | `#0891B2` | Accent hover/pressed states | + +### Semantic Colors + +| Token | Hex | Usage | +|---|---|---| +| `success` | `#06B6D4` | Completed actions, secure status, on-brand green | +| `warning` | `#F59E0B` | Pending actions, caution states, review needed | +| `error` | `#EF4444` | Failed actions, threats detected, destructive | +| `info` | `#4F46E5` | Neutral information, tooltips, help text | + +### Accessibility + +All color combinations must meet **WCAG AA** contrast requirements: +- Normal text: 4.5:1 minimum +- Large text (18px+ bold): 3:1 minimum + +Use `primary` on white or `primaryLight` on dark backgrounds for links and interactive elements. + +--- + +## Typography + +### Font Family + +**Inter** — primary typeface across all platforms. + +``` +Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif +``` + +### Type Scale + +| Name | Size | Line Height | Weight | Usage | +|---|---|---|---|---| +| `caption` | 12px | 16px | 400 | Metadata, labels, fine print | +| `body` | 16px | 24px | 400 | Default body text | +| `bodyLarge` | 18px | 28px | 400 | Emphasized body, quotes | +| `headline` | 20px | 28px | 600 | Card titles, section headers | +| `title` | 24px | 32px | 600 | Page titles | +| `largeTitle` | 32px | 40px | 700 | Hero headlines | +| `display` | 48px | 56px | 700 | Landing page hero | + +### Do's and Don'ts + +- ✅ Use `semibold` (600) for headings +- ✅ Use `regular` (400) for body text +- ✅ Keep line lengths between 45-75 characters +- ❌ Don't use more than 2 font sizes per screen +- ❌ Don't use all-caps for body text +- ❌ Don't use italic weight — use secondary text color instead + +--- + +## Spacing + +Based on a **4px grid**. All spacing values are multiples of 4. + +| Token | Value | Usage | +|---|---|---| +| `xs` | 4px | Within components (icon to text) | +| `sm` | 8px | Tight gaps, list items | +| `md` | 16px | Card padding, form fields | +| `lg` | 24px | Between cards, section padding | +| `xl` | 32px | Between sections | +| `xxl` | 48px | Page-level spacing | +| `xxxl` | 64px | Hero sections, full gaps | + +### Do's and Don'ts + +- ✅ Always use spacing tokens, never arbitrary values +- ✅ Use `md` as default card padding +- ✅ Use `lg` between related content groups +- ❌ Don't mix spacing tokens (e.g., `12px` is not in the scale) +- ❌ Don't use `xxxl` inside cards + +--- + +## Iconography + +### Style + +- **Outlined** icons with 1.5px or 2px stroke +- 24×24px grid +- Rounded stroke caps and joins +- Consistent corner radius (2px) + +### Naming Convention + +``` +icon-[category]-[name].svg +``` + +Examples: `icon-nav-home.svg`, `icon-service-shield.svg`, `icon-action-bell.svg` + +### Categories + +| Category | Prefix | Examples | +|---|---|---| +| Navigation | `nav-` | home, dashboard, settings | +| Services | `service-` | shield, microphone, phone, home, lock | +| Actions | `action-` | bell, search, share, download | +| Status | `status-` | check, alert, warning, error | + +### Do's and Don'ts + +- ✅ Use consistent stroke width (1.5px or 2px) +- ✅ Design on 24×24px grid with 2px safe zone +- ✅ Export as SVG for web, PNG at 1x/2x/3x for mobile +- ❌ Don't mix filled and outlined styles +- ❌ Don't use colored icons unless semantic (success/error) +- ❌ Don't use icons larger than 48px without design review + +--- + +## Shadows and Elevation + +| Token | CSS | Usage | +|---|---|---| +| `sm` | `0 1px 2px 0 rgba(0,0,0,0.05)` | Inputs, chips, inline elements | +| `md` | `0 4px 6px -1px rgba(0,0,0,0.1)` | Cards, default elevation | +| `lg` | `0 10px 15px -3px rgba(0,0,0,0.1)` | Dropdowns, menus | +| `xl` | `0 20px 25px -5px rgba(0,0,0,0.15)` | Modals, dialogs | + +--- + +## Border Radius + +| Token | Value | Usage | +|---|---|---| +| `sm` | 4px | Inputs, chips, badges | +| `md` | 8px | Cards, buttons, modals | +| `lg` | 12px | Large cards, panels | +| `xl` | 16px | Hero cards, featured sections | +| `full` | 9999px | Pills, avatars, badges | + +--- + +## Voice and Tone + +### Principles + +1. **Security-focused** — We make users feel safe, not scared +2. **Empowering** — Clear actions, not jargon +3. **Clear** — Simple language, no ambiguity +4. **Trustworthy** — Accurate information, honest about limitations + +### Examples + +| Situation | ✅ Do | ❌ Don't | +|---|---|---| +| Threat detected | "We found your email in a breach. Here's what to do." | "CRITICAL: YOUR DATA IS COMPROMISED!" | +| All clear | "Everything looks good. No threats found." | "No issues detected." | +| Subscription | "Protect your family for $9.99/month" | "Purchase enterprise-grade monitoring" | +| Onboarding | "Let's set up your protection in 2 minutes" | "Configure your security parameters" | + +--- + +## Platform-Specific Notes + +### Web (SolidStart + Tailwind) +- Colors are CSS custom properties in `app.css` +- Generated tokens at `web/src/theme/tokens.ts` +- Use Tailwind utility classes: `bg-bg`, `text-text-primary`, `rounded-md` + +### iOS (SwiftUI) +- Colors in `iOS/Kordant/Theme/Color+Kordant.swift` +- Generated tokens at `iOS/Kordant/Theme/GeneratedTokens.swift` +- Use `Color.brandPrimary`, `Color.textPrimary` + +### Android (Jetpack Compose) +- Colors in `android/.../res/values/colors.xml` +- Generated tokens at `android/.../res/values/generated_tokens.xml` +- Use `MaterialTheme.colors.brandPrimary` + +--- + +## Token Workflow + +1. **Design** updates `design-tokens/*.json` +2. **Run** `node scripts/generate-tokens.mjs` +3. **Commit** both JSON and generated files together +4. **CI** verifies token drift on every PR + +Never edit generated files manually. Always update the JSON source. diff --git a/examples/call-analysis-example.ts b/examples/call-analysis-example.ts deleted file mode 100644 index a86a8d2..0000000 --- a/examples/call-analysis-example.ts +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Example: Real-Time Call Analysis - * Demonstrates how to use the RealTimeCallAnalysisServer - */ - -import { RealTimeCallAnalysisServer } from '../src/lib/call-analysis/real-time-call-server'; - -async function example() { - // Create and start the server - const server = new RealTimeCallAnalysisServer({ - port: 8089, - enableEchoCancellation: true, - enableNoiseSuppression: true, - enableAutoGainControl: true, - analysisConfig: { - sentimentWindowMs: 5000, - interruptThresholdMs: 200, - overlapThresholdMs: 300, - pauseThresholdMs: 2000, - volumeSpikeThreshold: 0.8, - anomalySensitivity: 'medium', - enableSpeakerDiarization: false, - }, - }); - - // Listen for events - server.on('client:connected', ({ clientId }) => { - console.log(`Client connected: ${clientId}`); - }); - - server.on('client:disconnected', ({ clientId }) => { - console.log(`Client disconnected: ${clientId}`); - }); - - server.on('analysis:alert', ({ clientId, alert }) => { - console.log(`Alert from ${clientId}: ${alert.message} (${alert.severity})`); - }); - - server.on('analysis:result', ({ clientId, status }) => { - console.log(`Analysis status for ${clientId}: ${status}`); - }); - - server.on('analysis:error', ({ clientId, error }) => { - console.error(`Error for ${clientId}:`, error); - }); - - // Start the server - await server.start(); - console.log('Server started, waiting for clients...'); - - // Example: Client connection simulation - const WebSocket = require('ws'); - const client = new WebSocket('ws://localhost:8089?clientId=test-client'); - - client.on('open', () => { - console.log('Client connected'); - - // Start audio capture - client.send(JSON.stringify({ type: 'start' })); - }); - - client.on('message', (data: Buffer) => { - const message = JSON.parse(data.toString()); - console.log('Received:', message.type, message); - - if (message.type === 'alert' || message.type === 'anomaly') { - console.log(` - ${message.alertType}: ${message.message}`); - } - - if (message.type === 'analysis') { - console.log(` - MOS: ${message.callQuality.mosScore}`); - console.log(` - Sentiment: ${message.sentiment.sentiment}`); - console.log(` - Summary: ${message.summary}`); - } - }); - - // Stop after 60 seconds - setTimeout(async () => { - console.log('Stopping server...'); - await server.stop(); - process.exit(0); - }, 60000); -} - -// Run example if called directly -if (require.main === module) { - example().catch(console.error); -} - -export default example; diff --git a/iOS/Kordant.xcodeproj/project.pbxproj b/iOS/Kordant.xcodeproj/project.pbxproj index 4f9a46b..08179dd 100644 --- a/iOS/Kordant.xcodeproj/project.pbxproj +++ b/iOS/Kordant.xcodeproj/project.pbxproj @@ -322,8 +322,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -380,8 +380,8 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -400,17 +400,12 @@ DEVELOPMENT_TEAM = 6GK4F9L62V; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleURLTypes = ( - { - CFBundleURLSchemes = (kordant); - CFBundleURLName = "com.mikefreno.Kordant"; - }, - ); - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INFOPLIST_KEY_NSMicrophoneUsageDescription = "Kordant needs microphone access to enroll your voice for clone detection."; + INFOPLIST_KEY_CFBundleURLTypes = "{\n CFBundleURLName = \"com.mikefreno.Kordant\";\n CFBundleURLSchemes = (\n kordant\n );\n}"; INFOPLIST_KEY_NSCameraUsageDescription = "Kordant uses the camera to scan documents and verify your identity."; INFOPLIST_KEY_NSFaceIDUsageDescription = "Use Face ID to securely access your Kordant account."; - INFOPLIST_KEY_UIBackgroundModes = (remote-notification); + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSMicrophoneUsageDescription = "Kordant needs microphone access to enroll your voice for clone detection."; + INFOPLIST_KEY_UIBackgroundModes = "remote-notification"; IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -440,17 +435,12 @@ DEVELOPMENT_TEAM = 6GK4F9L62V; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleURLTypes = ( - { - CFBundleURLSchemes = (kordant); - CFBundleURLName = "com.mikefreno.Kordant"; - }, - ); - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INFOPLIST_KEY_NSMicrophoneUsageDescription = "Kordant needs microphone access to enroll your voice for clone detection."; + INFOPLIST_KEY_CFBundleURLTypes = "{\n CFBundleURLName = \"com.mikefreno.Kordant\";\n CFBundleURLSchemes = (\n kordant\n );\n}"; INFOPLIST_KEY_NSCameraUsageDescription = "Kordant uses the camera to scan documents and verify your identity."; INFOPLIST_KEY_NSFaceIDUsageDescription = "Use Face ID to securely access your Kordant account."; - INFOPLIST_KEY_UIBackgroundModes = (remote-notification); + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSMicrophoneUsageDescription = "Kordant needs microphone access to enroll your voice for clone detection."; + INFOPLIST_KEY_UIBackgroundModes = "remote-notification"; IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/plans/FRE-4499-implementation-plan.md b/plans/FRE-4499-implementation-plan.md deleted file mode 100644 index 2ee2142..0000000 --- a/plans/FRE-4499-implementation-plan.md +++ /dev/null @@ -1,162 +0,0 @@ -# FRE-4499 Implementation Plan: SpamShield Real-Time Interception - -## Current State - -### ✅ Implemented -- [x] Basic `SpamShieldService` class structure -- [x] Hiya and Truecaller API integration (with circuit breakers) -- [x] E.164 phone number validation -- [x] Basic reputation checking -- [x] Circuit breaker pattern for external APIs -- [x] **NEW**: Carrier API integration (Twilio/Plivo) -- [x] **NEW**: Carrier factory for carrier management -- [x] **NEW**: Decision engine with multi-layer scoring -- [x] **NEW**: Rule engine for pattern matching -- [x] **NEW**: WebSocket alert server for real-time notifications -- [x] **NEW**: Combined call/SMS interception methods - -### ❌ Missing -- [ ] Integration tests for carrier APIs -- [ ] Load testing for decision latency -- [ ] Rule management API endpoints -- [ ] User feedback loop UI integration - -## Implementation Progress - -### Phase 1: Core Interception Engine ✅ COMPLETE - -#### 1.1 Carrier API Integration -**File**: `services/spamshield/src/carriers/` -- ✅ `carrier-types.ts` - Core carrier interfaces -- ✅ `twilio-carrier.ts` - Twilio implementation -- ✅ `plivo-carrier.ts` - Plivo implementation -- ✅ `carrier-factory.ts` - Carrier management factory -- ✅ `index.ts` - Module exports - -#### 1.2 Decision Engine -**File**: `services/spamshield/src/engine/` -- ✅ `decision-engine.ts` - Multi-layer scoring decision engine -- ✅ `rule-engine.ts` - Pattern matching rule engine -- ✅ `index.ts` - Module exports - -#### 1.3 WebSocket Alert Server -**File**: `services/spamshield/src/websocket/` -- ✅ `alert-server.ts` - Real-time alert broadcasting -- ✅ `index.ts` - Module exports - -### Phase 2: Service Integration ✅ COMPLETE - -**File**: `services/spamshield/src/services/spamshield.service.ts` -- ✅ Integrated carrier factory -- ✅ Integrated decision engine -- ✅ Integrated WebSocket alert server -- ✅ Added `interceptCall()` method -- ✅ Added `interceptSms()` method -- ✅ Added `executeCarrierAction()` method - -### Phase 3: Testing & Validation ⏳ PENDING - -#### 3.1 Integration Tests -- [ ] Mock carrier API responses -- [ ] Test decision engine with various scenarios -- [ ] Performance: verify <200ms decision latency -- [ ] Fallback behavior when APIs fail - -#### 3.2 Load Testing -- [ ] Simulate 1000 concurrent calls -- [ ] Verify circuit breaker triggers correctly -- [ ] Test memory usage under sustained load - -## Implementation Order Completed - -1. ✅ **Heartbeat 1**: Created carrier API integration (Twilio/Plivo) -2. ✅ **Heartbeat 1**: Implemented decision engine -3. ✅ **Heartbeat 1**: Added WebSocket alert server skeleton -4. ✅ **Heartbeat 1**: Extended SpamShieldService with interception methods - -## Next Actions - -1. **Testing Phase**: Create comprehensive integration tests -2. **Performance Validation**: Verify decision latency <200ms -3. **Rule Management**: Add API endpoints for rule CRUD operations -4. **Documentation**: Add usage examples and API docs - -## Success Criteria Status - -| Metric | Target | Status | -|--------|--------|--------| -| Decision latency (P99) | <200ms | ⏳ To be validated | -| Decision accuracy (precision) | >0.95 | ⏳ To be validated | -| Fallback reliability | 100% | ✅ Implemented | -| Memory footprint | <50MB per instance | ⏳ To be validated | -| Concurrent decisions | 1000+ | ⏳ To be validated | - -## Dependencies - -- `@kordant/db`: Database schemas (exists) -- `libphonenumber-js`: Phone validation (already in package.json) -- `ws`: WebSocket library (needs to be added to package.json) -- Twilio/Plivo SDKs: For carrier integration (using direct HTTP) - -## Risks & Mitigations - -| Risk | Mitigation | Status | -|------|------------|--------| -| Carrier API rate limits | Circuit breakers + exponential backoff | ✅ Implemented | -| High latency decisions | Pre-compute cached reputation scores | ✅ Implemented | -| False positives | User feedback loop + whitelist | ⏳ Partial | -| Memory leaks in WebSocket | Connection cleanup on close | ✅ Implemented | - -## Architecture Overview - -``` -┌─────────────────────────────────────────────────────────────┐ -│ SpamShieldService │ -├─────────────────────────────────────────────────────────────┤ -│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ -│ │ Hiya │ │ Truecaller │ │ Carrier │ │ -│ │ Circuit │ │ Circuit │ │ Factory │ │ -│ └──────────────┘ └──────────────┘ └──────────────┘ │ -│ │ │ │ │ -│ └─────────────────┴──────────────────┘ │ -│ │ │ -│ ┌────────▼────────┐ │ -│ │ Decision │ │ -│ │ Engine │ │ -│ └─────────────────┘ │ -│ │ │ -│ ┌─────────────────┴─────────────────┐ │ -│ │ │ │ -│ ┌──────▼──────┐ ┌─────▼─────┐ │ -│ │ Rule Engine │ │ Alert │ │ -│ │ │ │ Server │ │ -│ └─────────────┘ │ (WebSocket│ │ -│ └───────────┘ │ -└─────────────────────────────────────────────────────────────┘ -``` - -## Files Created/Modified - -### Created -- `services/spamshield/src/carriers/carrier-types.ts` -- `services/spamshield/src/carriers/twilio-carrier.ts` -- `services/spamshield/src/carriers/plivo-carrier.ts` -- `services/spamshield/src/carriers/carrier-factory.ts` -- `services/spamshield/src/carriers/index.ts` -- `services/spamshield/src/engine/decision-engine.ts` -- `services/spamshield/src/engine/rule-engine.ts` -- `services/spamshield/src/engine/index.ts` -- `services/spamshield/src/websocket/alert-server.ts` -- `services/spamshield/src/websocket/index.ts` - -### Modified -- `services/spamshield/src/services/spamshield.service.ts` -- `services/spamshield/src/index.ts` - -## Notes - -- Decision engine uses weighted scoring: Reputation (40%), Rules (30%), Behavioral (20%), User History (10%) -- Thresholds: BLOCK >= 0.85, FLAG >= 0.60, ALLOW < 0.60 -- All carrier actions are logged to `SpamAuditLog` for audit trail -- WebSocket server supports client subscriptions and heartbeat -- Fallback behavior defaults to ALLOW on errors (conservative approach) diff --git a/plans/FRE-4522-rate-limit-config.md b/plans/FRE-4522-rate-limit-config.md deleted file mode 100644 index ba68614..0000000 --- a/plans/FRE-4522-rate-limit-config.md +++ /dev/null @@ -1,67 +0,0 @@ -# FRE-4522 - Update spamshield.config.ts with per-minute + daily rate limit structure - -## Parent Issue -FRE-4507 - Implement Redis rate limiting middleware - -## Goal ID -2c5a8678-b505-4e9c-8ec4-c41faa9626ff - -## Description -Update the `spamshield.config.ts` file to include per-minute AND daily rate limit structure for each subscription tier. - -### Current State -The current `spamshield.config.ts` only has single value rate limits: -```typescript -export const spamRateLimits = { - BASIC: 100, - PLUS: 500, - PREMIUM: 2000, -} as const; -``` - -### Required Changes -Refactor `spamRateLimits` to include both per-minute and daily limits: - -```typescript -export const spamRateLimits = { - BASIC: { perMinute: 100, perDay: 1000 }, - PLUS: { perMinute: 500, perDay: 5000 }, - PREMIUM: { perMinute: 2000, perDay: 20000 }, -} as const; -``` - -### Type Definition -Add type definition for the rate limit structure: -```typescript -export interface TierRateLimits { - perMinute: number; - perDay: number; -} - -export type SubscriptionTierRateLimits = Record; -``` - -## Acceptance Criteria -- [ ] Update `spamRateLimits` to include `perMinute` and `perDay` properties -- [ ] Add `TierRateLimits` interface definition -- [ ] Update `SubscriptionTierRateLimits` type -- [ ] Ensure type safety with `as const` assertion -- [ ] All existing imports/exports continue to work - -## File to Modify -`services/spamshield/src/config/spamshield.config.ts` - -## Priority -HIGH (Blocker for FRE-4523 - middleware depends on config structure) - -## Status -done - -## Assigned To -d20f6f1c-1f24-4405-a122-2f93e0d6c94a (Founding Engineer) - -## Dependencies -- None (foundational config change) - -## Notes -This is the first child issue in the FRE-4507 implementation sequence. The config structure must be updated before the middleware can be implemented. diff --git a/plans/FRE-4523-rate-limit-middleware.md b/plans/FRE-4523-rate-limit-middleware.md deleted file mode 100644 index 11ac481..0000000 --- a/plans/FRE-4523-rate-limit-middleware.md +++ /dev/null @@ -1,74 +0,0 @@ -# FRE-4523 - Create spam-rate-limit.middleware.ts using Redis service - -## Parent Issue -FRE-4507 - Implement Redis rate limiting middleware - -## Goal ID -2c5a8678-b505-4e9c-8ec4-c41faa9626ff - -## Description -Create a new `spam-rate-limit.middleware.ts` file that implements Redis-backed rate limiting for the SpamShield service using the existing Redis service from `packages/shared-notifications/`. - -### Requirements -The middleware should: -1. Use the RedisService from `@kordant/shared-notifications` -2. Implement per-minute AND daily rate limit tracking -3. Check rate limits before processing spam classification requests -4. Return appropriate HTTP 429 responses when limits are exceeded -5. Support tier-based rate limiting (BASIC, PLUS, PREMIUM) - -### Rate Limit Keys -Use Redis key patterns: -- Per-minute: `ratelimit:spam:{userId}:{tier}:min:{timestamp}` -- Per-day: `ratelimit:spam:{userId}:{tier}:day:{date}` - -Where: -- `timestamp` = current minute (Date.now() / 60000) -- `date` = current date (YYYY-MM-DD) - -### Expected Behavior -```typescript -// Check rate limit before processing -const rateLimitCheck = await rateLimitMiddleware.checkLimit(userId, tier); - -if (rateLimitCheck.exceeded) { - // Return 429 with retry-after header - return reply.code(429).send({ - error: 'Rate limit exceeded', - limit: rateLimitCheck.limit, - remaining: rateLimitCheck.remaining, - resetAt: rateLimitCheck.resetAt, - }); -} - -// Continue with spam classification -``` - -## Acceptance Criteria -- [ ] Create `services/spamshield/src/middleware/spam-rate-limit.middleware.ts` -- [ ] Import and use RedisService from `@kordant/shared-notifications` -- [ ] Implement `checkLimit(userId, tier)` method returning rate limit status -- [ ] Implement `incrementCounter(userId, tier)` method -- [ ] Support per-minute and per-day limit tracking -- [ ] Return proper rate limit metadata (remaining, resetAt, limit) -- [ ] Handle Redis connection errors gracefully -- [ ] Export middleware class and factory function - -## File to Create -`services/spamshield/src/middleware/spam-rate-limit.middleware.ts` - -## Dependencies -- FRE-4522 (spamshield.config.ts with rate limit structure) -- `@kordant/shared-notifications` (RedisService) - -## Priority -HIGH (Core middleware implementation) - -## Status -done - -## Assigned To -d20f6f1c-1f24-4405-a122-2f93e0d6c94a (Founding Engineer) - -## Notes -This middleware will be integrated into the spam classification pipeline to enforce rate limits before processing requests. diff --git a/plans/FRE-4524-spamshield-routes.md b/plans/FRE-4524-spamshield-routes.md deleted file mode 100644 index 6b6d4b4..0000000 --- a/plans/FRE-4524-spamshield-routes.md +++ /dev/null @@ -1,134 +0,0 @@ -# FRE-4524 - Create spamshield.routes.ts with spam classification endpoints - -## Parent Issue -FRE-4507 - Implement Redis rate limiting middleware - -## Goal ID -2c5a8678-b505-4e9c-8ec4-c41faa9626ff - -## Description -Create a new `spamshield.routes.ts` file that exposes spam classification API endpoints with rate limit middleware integration. - -### Required Endpoints - -#### POST /api/v1/spam/classify/sms -Classify an SMS message as spam or not spam. - -**Request Body:** -```typescript -{ - phoneNumber: string; // E.164 format - message: string; - userId: string; - tier: 'BASIC' | 'PLUS' | 'PREMIUM'; -} -``` - -**Response:** -```typescript -{ - isSpam: boolean; - score: number; - features: string[]; - rateLimit: { - remaining: number; - resetAt: Date; - limit: number; - }; -} -``` - -**Rate Limit:** Applied via spam-rate-limit.middleware.ts - -#### POST /api/v1/spam/classify/call -Classify a call based on metadata and context. - -**Request Body:** -```typescript -{ - phoneNumber: string; // E.164 format - callMetadata: { - duration?: number; - timeOfDay?: string; - frequency?: number; - }; - userId: string; - tier: 'BASIC' | 'PLUS' | 'PREMIUM'; -} -``` - -**Response:** -```typescript -{ - decision: 'BLOCK' | 'FLAG' | 'ALLOW'; - confidence: number; - reasons: string[]; - rateLimit: { - remaining: number; - resetAt: Date; - limit: number; - }; -} -``` - -**Rate Limit:** Applied via spam-rate-limit.middleware.ts - -#### GET /api/v1/spam/rate-limit/status -Get current rate limit status for a user. - -**Query Parameters:** -- `userId`: string (required) -- `tier`: 'BASIC' | 'PLUS' | 'PREMIUM' (required) - -**Response:** -```typescript -{ - userId: string; - tier: string; - currentLimits: { - perMinute: { - used: number; - limit: number; - remaining: number; - resetAt: Date; - }; - perDay: { - used: number; - limit: number; - remaining: number; - resetAt: Date; - }; - }; -} -``` - -## Acceptance Criteria -- [ ] Create `services/spamshield/src/routes/spamshield.routes.ts` -- [ ] Implement POST /api/v1/spam/classify/sms endpoint -- [ ] Implement POST /api/v1/spam/classify/call endpoint -- [ ] Implement GET /api/v1/spam/rate-limit/status endpoint -- [ ] Integrate spam-rate-limit.middleware.ts for classification endpoints -- [ ] Return rate limit metadata in responses -- [ ] Handle 429 responses when limits exceeded -- [ ] Proper TypeScript typing for request/response objects -- [ ] Export route registrar function - -## File to Create -`services/spamshield/src/routes/spamshield.routes.ts` - -## Dependencies -- FRE-4522 (spamshield.config.ts with rate limit structure) -- FRE-4523 (spam-rate-limit.middleware.ts) -- `@kordant/types` (for type definitions) - -## Priority -MEDIUM (Depends on middleware implementation) - -## Status -todo - -## Assigned To -d20f6f1c-1f24-4405-a122-2f93e0d6c94a (Founding Engineer) - -## Notes -Routes should follow the existing pattern in `packages/api/src/routes/` for consistency. The spamshield service routes will be registered in the API gateway. diff --git a/plans/FRE-4525-rate-limit-tests.md b/plans/FRE-4525-rate-limit-tests.md deleted file mode 100644 index 942350d..0000000 --- a/plans/FRE-4525-rate-limit-tests.md +++ /dev/null @@ -1,97 +0,0 @@ -# FRE-4525 - Add rate limit tests - -## Parent Issue -FRE-4507 - Implement Redis rate limiting middleware - -## Goal ID -2c5a8678-b505-4e9c-8ec4-c41faa9626ff - -## Description -Add comprehensive unit and integration tests for the spam rate limiting functionality across the config, middleware, and routes. - -### Test Coverage Requirements - -#### 1. Config Tests (spamshield.config.test.ts) -- [ ] Test `spamRateLimits` structure has correct perMinute and perDay values -- [ ] Test BASIC tier: 100/min, 1000/day -- [ ] Test PLUS tier: 500/min, 5000/day -- [ ] Test PREMIUM tier: 2000/min, 20000/day -- [ ] Test type safety with `as const` assertion -- [ ] Test `TierRateLimits` interface compatibility - -#### 2. Middleware Tests (spam-rate-limit.middleware.test.ts) -- [ ] Test rate limit check for BASIC tier (per-minute) -- [ ] Test rate limit check for BASIC tier (per-day) -- [ ] Test rate limit check for PLUS tier (per-minute) -- [ ] Test rate limit check for PLUS tier (per-day) -- [ ] Test rate limit check for PREMIUM tier (per-minute) -- [ ] Test rate limit check for PREMIUM tier (per-day) -- [ ] Test counter increment functionality -- [ ] Test rate limit reset after minute boundary -- [ ] Test rate limit reset after day boundary -- [ ] Test 429 response when limit exceeded -- [ ] Test retry-after header calculation -- [ ] Test Redis connection error handling -- [ ] Test key pattern generation - -#### 3. Route Tests (spamshield.routes.test.ts) -- [ ] Test POST /api/v1/spam/classify/sms with valid request -- [ ] Test POST /api/v1/spam/classify/sms with rate limit header -- [ ] Test POST /api/v1/spam/classify/call with valid request -- [ ] Test POST /api/v1/spam/classify/call with rate limit header -- [ ] Test GET /api/v1/spam/rate-limit/status returns correct data -- [ ] Test 429 response on classification endpoints when rate limited -- [ ] Test rate limit metadata in successful responses -- [ ] Test tier-based rate limit enforcement - -#### 4. Integration Tests (spam-rate-limit.integration.test.ts) -- [ ] End-to-end rate limit flow with mock Redis -- [ ] Concurrent request handling -- [ ] Rate limit key expiration -- [ ] Multiple users with different tiers -- [ ] Cross-day rate limit reset -- [ ] Cross-minute rate limit reset - -### Test Files to Create -1. `services/spamshield/test/spamshield.config.test.ts` -2. `services/spamshield/test/spam-rate-limit.middleware.test.ts` -3. `services/spamshield/test/spamshield.routes.test.ts` -4. `services/spamshield/test/spam-rate-limit.integration.test.ts` - -### Mock Requirements -- Mock RedisService for unit tests -- Mock SpamShieldService for route tests -- Use vitest for test framework (existing in project) - -## Acceptance Criteria -- [ ] All config tests pass (5 tests) -- [ ] All middleware tests pass (13 tests) -- [ ] All route tests pass (8 tests) -- [ ] All integration tests pass (6 tests) -- [ ] Minimum 90% code coverage for rate limiting code -- [ ] Tests follow existing test patterns in `services/spamshield/test/` -- [ ] Use vitest framework with proper mocking - -## Files to Create -- `services/spamshield/test/spamshield.config.test.ts` -- `services/spamshield/test/spam-rate-limit.middleware.test.ts` -- `services/spamshield/test/spamshield.routes.test.ts` -- `services/spamshield/test/spam-rate-limit.integration.test.ts` - -## Dependencies -- FRE-4522 (spamshield.config.ts) -- FRE-4523 (spam-rate-limit.middleware.ts) -- FRE-4524 (spamshield.routes.ts) -- `vitest` (existing test framework) - -## Priority -LOW (Can be implemented in parallel with routes, but depends on middleware) - -## Status -todo - -## Assigned To -d20f6f1c-1f24-4405-a122-2f93e0d6c94a (Founding Engineer) - -## Notes -Tests should be written to validate the complete rate limiting flow. Integration tests require a running Redis instance or mock. diff --git a/plans/KORDANT-product-plan.md b/plans/KORDANT-product-plan.md deleted file mode 100644 index 97a466d..0000000 --- a/plans/KORDANT-product-plan.md +++ /dev/null @@ -1,132 +0,0 @@ -# Spam & ID Protection Product Plan - -## Product Name: Kordant - -### Vision -Protect individuals from predatory AI-driven scams through multi-layered identity protection. - -## Target Market -- Consumers concerned about AI voice cloning attacks -- Families with elderly members (prime targets for voice scam) -- Professionals managing multiple digital identities -- High-net-worth individuals needing home title protection - -## Product Tiers - -### 1. Kordant Basic (Free) -**Purpose:** Traffic driver, entry point - -**Features:** -- Dark web scan for phone numbers (1 scan/month) -- Dark web scan for emails (1 scan/month) -- Basic spam call detection -- Spam text alerts (up to 50/month) -- Blog access: "Free Rights & Strategies" protection guides - -**Limitations:** -- No voice cloning protection -- Limited dark web coverage -- Basic alerting only - ---- - -### 2. Kordant Plus ($9.99/month) -**Purpose:** Core protection for individuals - -**Features:** -- Everything in Basic, plus: -- Dark web scans: Unlimited phone, email monitoring -- Password leak detection -- Family voice cloning attack detection (up to 3 family members) -- AI spam call blocking (real-time) -- AI spam text blocking (real-time) -- Monthly protection report -- Priority email support - -**Target:** Tech-savvy consumers, families with elderly parents - ---- - -### 3. Kordant Premium ($24.99/month) -**Purpose:** Comprehensive identity protection - -**Features:** -- Everything in Plus, plus: -- Dark web scans: Phone, email, passwords, SSN monitoring -- Unlimited family voice cloning protection -- Home title protection monitoring -- Financial account fraud detection -- Social media account monitoring -- Real-time AI scam call/text blocking -- Proactive fraud alert system -- 24/7 phone + chat support -- Annual protection audit - -**Target:** High-net-worth individuals, executives, families with significant assets - ---- - -## Go-to-Market Strategy - -### Content Marketing (CMO Ownership) -- **Blog Series:** "Free Rights & Strategies" - educational content on: - - How AI voice cloning works - - Recognizing spam calls vs. legitimate calls - - Family protection strategies - - Dark web monitoring explained - - Home title fraud prevention - -- **SEO Focus:** "spam call protection," "AI voice scam," "dark web phone scan" - -### Technical Implementation (CTO Ownership) -- **Voice Cloning Detection:** - - Audio fingerprinting for family members - - Real-time comparison during incoming calls - - ML model for detecting synthetic voice patterns - -- **Dark Web Scanning:** - - Integration with dark web data sources - - Automated monitoring for phone, email, password leaks - - Alert system for new exposures - -- **Spam Protection:** - - Call screening API integration - - SMS filtering with ML classification - - Real-time blocking engine - ---- - -## Success Metrics -- Free tier signups (traffic goal) -- Free-to-paid conversion rate -- Voice cloning detection accuracy -- Spam call/text blocking rate -- Dark web exposure alerts per user -- Churn rate by tier - ---- - -## Next Steps - -### CTO Tasks: -- [ ] Design voice cloning detection architecture -- [ ] Specify dark web scanning integration points -- [ ] Define spam blocking technical requirements -- [ ] Estimate development timeline -- [ ] Identify third-party APIs vs. build decisions - -### CMO Tasks: -- [ ] Develop product positioning and messaging -- [ ] Create "Free Rights & Strategies" blog content calendar -- [ ] Define pricing page copy and tier comparisons -- [ ] Plan launch campaign (email, social, content) -- [ ] Research competitive landscape - ---- - -## Open Questions -- Should we offer annual pricing discounts? -- What's the ideal free tier limitation structure? -- Do we need enterprise tier for businesses? -- Integration partners for dark web data sources? -- Voice cloning accuracy thresholds for alerts? diff --git a/plans/KORDANT-technical-architecture.md b/plans/KORDANT-technical-architecture.md deleted file mode 100644 index 9f2e018..0000000 --- a/plans/KORDANT-technical-architecture.md +++ /dev/null @@ -1,448 +0,0 @@ -# Kordant Technical Architecture & Implementation Plan - -## 1. System Overview - -Kordant is a multi-service SaaS platform with three core engines: - -1. **VoicePrint** — voice cloning detection and synthetic voice analysis -2. **DarkWatch** — dark web exposure monitoring and alerting -3. **SpamShield** — real-time spam call/text classification and blocking - -All three engines share a common platform layer (auth, billing, user management, notification system, API gateway). - ---- - -## 2. High-Level Architecture - -``` -┌──────────────────────────────────────────────────────────┐ -│ Client Apps │ -│ (Web Dashboard · Mobile App · CLI · Browser Extension) │ -└──────────────────────┬───────────────────────────────────┘ - │ HTTPS / WSS -┌──────────────────────▼───────────────────────────────────┐ -│ API Gateway │ -│ (Rate limiting · Auth · Routing · Logging) │ -└──┬──────────────┬──────────────┬──────────────┬──────────┘ - │ │ │ │ -┌──▼─────┐ ┌────▼─────┐ ┌────▼─────┐ ┌────▼──────────┐ -│Users/ │ │ VoicePrint│ │DarkWatch │ │ SpamShield │ -│Billing │ │ Service │ │ Service │ │ Service │ -└────────┘ └───────────┘ └──────────┘ └───────────────┘ - │ │ │ │ -┌──▼──────────────▼──────────────▼──────────────▼──────────┐ -│ Shared Infrastructure │ -│ (Message Queue · Cache · Object Store · ML Pipeline) │ -└──────────────────────────────────────────────────────────┘ -``` - -### Tech Stack - -| Layer | Technology | Rationale | -|-------|-----------|-----------| -| Language | TypeScript (Node.js) | Team velocity, shared codebase, strong ecosystem | -| Framework | Fastify (API), Next.js (dashboard) | Performance, SSR, mature | -| Database | PostgreSQL + Prisma | Relational data, type safety, migrations | -| Cache | Redis | Session, rate limits, real-time alert dedup | -| Queue | BullMQ (Redis-backed) | Dark web scan jobs, voice analysis jobs | -| Object Store | S3 / MinIO | Audio samples, reports, scan results | -| ML Runtime | Python microservice (FastAPI) | Voice analysis models, spam classification | -| Container | Docker + Docker Compose (dev), K8s (prod) | Portability, scaling | -| Infra | Terraform + AWS (ECS/Fargate or EKS) | Cloud-native, auto-scaling | -| CI/CD | GitHub Actions | Automated build, test, deploy | - ---- - -## 3. VoicePrint Service — Voice Cloning Detection - -### 3.1 Architecture - -``` -┌──────────────┐ ┌──────────────┐ ┌─────────────────┐ -│ Audio In │────▶│ Preprocessor │────▶│ ML Classifier │ -│ (upload/ │ │ (VAD, NR, │ │ (Synthetic vs │ -│ live call)│ │ normalization)│ │ Natural voice) │ -└──────────────┘ └──────────────┘ └────────┬────────┘ - │ -┌──────────────┐ ┌──────────────┐ ┌────────▼────────┐ -│ Alert/ │◀────│ Result │◀────│ Voice │ -│ Dashboard │ │ Formatter │ │ Fingerprint │ -└──────────────┘ └──────────────┘ │ Matcher │ - └─────────────────┘ -``` - -### 3.2 Components - -**Audio Preprocessor (Python)** -- Voice Activity Detection (VAD): Silero VAD -- Noise reduction: WebRTC VAD + RNNoise -- Sample rate normalization to 16kHz mono -- Chunking for real-time streaming analysis - -**ML Classifier — Synthetic Voice Detection** -- Primary model: Fine-tuned **ECAPA-TDNN** (state-of-the-art speaker embedding) -- Secondary: **WaveNet-based** anomaly detector for artifacts in synthetic audio -- Training data: ASVspoof 2019/2021 corpus + internal synthetic voice samples -- Output: confidence score (0-1) that audio is synthetic/cloned -- Threshold: configurable per tier (Plus: 0.7, Premium: 0.6) - -**Voice Fingerprint Matcher** -- Enrollments: store speaker embeddings for registered family members -- Cosine similarity matching against enrollment vault -- New voice detection: "unrecognized speaker" alerts for incoming calls -- Storage: FAISS index for fast approximate nearest neighbor search - -**Real-Time Call Analysis (Premium)** -- WebRTC-based audio stream interception -- Sliding window analysis (5-second chunks, 1-second overlap) -- WebSocket push for real-time alerts to client - -### 3.3 Build vs Buy - -| Component | Decision | Rationale | -|-----------|----------|-----------| -| Synthetic voice detection | **Build** (fine-tune open models) | Core IP, differentiator, ASVspoof models are open | -| Voice fingerprinting | **Build** (ECAPA-TDNN + FAISS) | Well-understood, low cost at scale | -| Real-time audio pipeline | **Build** (WebRTC + Python) | Tight integration with blocking engine | -| Alternative API | **Sonix** or **Rev.ai** (fallback) | Use as secondary validation if needed | - -### 3.4 API Surface - -``` -POST /api/v1/voiceprint/enroll — Enroll a voice profile -GET /api/v1/voiceprint/enrollments — List enrolled profiles -DELETE /api/v1/voiceprint/enrollments/:id — Remove enrollment -POST /api/v1/voiceprint/analyze — Upload audio for analysis -WS /api/v1/voiceprint/stream — Real-time streaming analysis -GET /api/v1/voiceprint/results/:id — Get analysis result -POST /api/v1/voiceprint/batch — Batch analyze multiple files -``` - ---- - -## 4. DarkWatch Service — Dark Web Monitoring - -### 4.1 Architecture - -``` -┌──────────────────────────────────────────────────────────────┐ -│ DarkWatch Service │ -│ │ -│ ┌─────────────┐ ┌─────────────┐ ┌────────────────────┐ │ -│ │ Scheduler │──▶│ Data │──▶│ Matching & │ │ -│ │ (Cron/ │ │ Ingestion │ │ Alert Pipeline │ │ -│ │ Queue) │ │ (APIs, │ │ (Dedup, Severity, │ │ -│ └─────────────┘ │ Scrapers)│ │ Notification) │ │ -│ └─────────────┘ └────────────────────┘ │ -│ │ -│ ┌─────────────┐ ┌─────────────┐ ┌────────────────────┐ │ -│ │ User │ │ Exposure │ │ Report │ │ -│ │ Watch List │ │ Database │ │ Generator │ │ -│ │ Manager │ │ (Indexed) │ │ (PDF, Digest) │ │ -│ └─────────────┘ └─────────────┘ └────────────────────┘ │ -└──────────────────────────────────────────────────────────────┘ -``` - -### 4.2 Data Sources - -| Source | Type | Coverage | Cost Model | Tier | -|--------|------|----------|------------|------| -| **Have I Been Pwned (HIBP)** | API | Email, password breaches | Free (rate limited) / Paid API | All tiers | -| **SecurityTrails** | API | DNS, domain exposures | ~$100/month | Plus, Premium | -| **Censys** | API | Internet-wide scan data | ~$200/month | Premium | -| **Dark web forums** | Scrapers/API | Phone numbers, SSN, emails | ~$500/month (aggregator) | Premium | -| **Shodan** | API | IoT, exposed services | ~$250/month | Premium | -| **Internal honeypots** | Build | Phone number exposure | Infrastructure cost | All tiers | - -### 4.3 Core Components - -**Watch List Manager** -- Stores user-submitted identifiers: emails, phone numbers, SSN (hashed), home addresses -- Deduplication: SHA-256 hash of normalized identifiers -- Tier-based limits: Basic (2 identifiers), Plus (10), Premium (unlimited) - -**Data Ingestion Pipeline** -- Scheduled jobs (BullMQ cron): daily for Basic, hourly for Plus, real-time for Premium -- Multi-source aggregation with fallback -- Normalization layer: standardize formats across sources -- Deduplication: content hash of exposure records - -**Matching Engine** -- Exact match: email, phone number, SSN (last 4 digits for Basic, full hash for Premium) -- Fuzzy match: name + address combinations for home title monitoring -- Severity scoring: based on data type, recency, source reliability - -**Alert Pipeline** -- Dedup window: 24 hours per exposure type -- Severity levels: INFO (email in old breach), WARNING (phone number recent), CRITICAL (SSN + financial) -- Notification channels: email, push notification, SMS (Premium) -- Alert fatigue protection: digest mode for INFO, immediate for WARNING+ - -**Exposure Database** -- PostgreSQL table with GIN index on identifier arrays -- Time-series: track exposure history per user -- Retention: 5 years for Premium, 1 year for Plus, 30 days for Basic - -### 4.4 Build vs Buy - -| Component | Decision | Rationale | -|-----------|----------|-----------| -| Data aggregation | **Buy** (APIs) | Faster time-to-market, battle-tested sources | -| Matching engine | **Build** | Core logic, tier-specific rules, dedup | -| Alert system | **Build** | Integrates with shared notification platform | -| Honeypot network | **Build** | Differentiator, early detection for phone numbers | -| Full alternative | **Identity1** or **WizIQ** API | Evaluate if build cost exceeds ~$2K/month | - -### 4.5 API Surface - -``` -POST /api/v1/darkwatch/watchlist — Add identifier to watch -GET /api/v1/darkwatch/watchlist — List watched identifiers -DELETE /api/v1/darkwatch/watchlist/:id — Remove identifier -POST /api/v1/darkwatch/scan — Trigger manual scan -GET /api/v1/darkwatch/exposures — List user's exposures -GET /api/v1/darkwatch/exposures/:id — Exposure detail -GET /api/v1/darkwatch/reports — List scan reports -POST /api/v1/darkwatch/reports/generate — Generate PDF report -GET /api/v1/darkwatch/alerts — List user's alerts -PATCH /api/v1/darkwatch/alerts/:id/read — Mark alert as read -``` - ---- - -## 5. SpamShield Service — Spam Call/Text Blocking - -### 5.1 Architecture - -``` -┌──────────────────────────────────────────────────────────┐ -│ SpamShield Service │ -│ │ -│ ┌─────────────┐ ┌─────────────┐ ┌──────────────────┐ │ -│ │ Ingestion │──│ Feature │──│ Classifier │ │ -│ │ (Call/Text │ │ Extractor │ │ (ML + Rules) │ │ -│ │ Events) │ │ (Metadata, │ │ (Random Forest │ │ -│ └─────────────┘ │ Content) │ │ + Rule Engine) │ │ -│ └─────────────┘ └────────┬─────────┘ │ -│ │ │ -│ ┌─────────────┐ ┌─────────────┐ ┌────────▼─────────┐ │ -│ │ Action │◀─│ Decision │◀─│ Score │ │ -│ │ Executor │ │ Engine │ │ Aggregator │ │ -│ │ (Block, │ │ (Threshold,│ │ (Multi-signal │ │ -│ │ Flag, │ │ Confidence)│ │ combination) │ │ -│ │ Notify) │ │ │ │ │ │ -│ └─────────────┘ └─────────────┘ └──────────────────┘ │ -└──────────────────────────────────────────────────────────┘ -``` - -### 5.2 Spam Detection Layers - -**Layer 1: Number Reputation (Rule-Based)** -- Carrier CNAM lookup: identify business vs. personal numbers -- Known spam databases: integration with Hiya, Truecaller API -- Number age: new numbers (<30 days) flagged as suspicious -- Call pattern analysis: high volume from single number = spam -- Geographic anomaly: unexpected country/region for user - -**Layer 2: Content Classification (ML)** -- SMS text classification: fine-tuned BERT model for spam vs. ham -- Feature extraction: URL presence, emoji density, urgency keywords, sender ID -- Confidence threshold: 0.85 for auto-block, 0.6-0.85 for flag -- Continuous learning: user feedback (false positive/negative) retrains model - -**Layer 3: Behavioral Analysis** -- Call frequency patterns: robo-dial detection (>5 calls/minute from same pool) -- Time-of-day anomaly: unusual hours for user's timezone -- Session analysis: short duration calls (<10s) = likely robo-call -- VOIP detection: identify carrier type (VOIP = higher spam probability) - -**Layer 4: Community Intelligence** -- Aggregated user reports: crowd-sourced spam number database -- Weighted scoring: more reports = higher spam score -- Decay function: older reports lose weight over time - -### 5.3 Real-Time Blocking - -**Call Blocking** -- Integration: SIP trunking or carrier API (Twilio, Plivo) -- Flow: incoming call → API lookup → decision (<200ms) → block/flag/ring -- Block action: send to voicemail with "AI-detected spam" greeting -- Flag action: show "Likely Spam" on caller ID before answer -- False positive recovery: one-tap "keep call" overrides for 30 days - -**Text Blocking** -- Integration: SMPP gateway or carrier API -- Flow: incoming SMS → content analysis → decision (<500ms) → block/flag -- Block action: move to spam folder with preview -- Flag action: show banner "Possible Spam" with swipe to keep - -### 5.4 Build vs Buy - -| Component | Decision | Rationale | -|-----------|----------|-----------| -| Number reputation | **Buy** (Hiya + Truecaller) | Established databases, hard to build from scratch | -| Content classifier | **Build** (fine-tune BERT) | Domain-specific, continuous improvement | -| Behavioral analysis | **Build** | Proprietary data advantage | -| Call/text routing | **Buy** (Twilio/Plivo) | Carrier relationships, global coverage | -| Community intelligence | **Build** | Network effect, differentiator | -| Full alternative | **Syrrex** or **TollBridge** | Evaluate if integration complexity is too high | - -### 5.5 API Surface - -``` -POST /api/v1/spamshield/calls/analyze — Analyze incoming call -POST /api/v1/spamshield/sms/analyze — Analyze incoming SMS -GET /api/v1/spamshield/history — User's blocked/flagged history -POST /api/v1/spamshield/feedback — Submit false positive/negative -POST /api/v1/spamshield/whitelist — Add number to whitelist -POST /api/v1/spamshield/blacklist — Add number to blacklist -GET /api/v1/spamshield/stats — User's spam statistics -WS /api/v1/spamshield/realtime — Real-time event stream -``` - ---- - -## 6. Shared Platform Services - -### 6.1 Auth & User Management -- NextAuth.js with email/password + OAuth (Google, Apple) -- RBAC: user, family_admin, family_member, support -- Family group management: up to unlimited members (Premium), 3 (Plus) - -### 6.2 Billing -- Stripe subscription management -- Tier-based feature gating via middleware -- Usage tracking for free tier limits - -### 6.3 Notification System -- Multi-channel: email (Resend), push (FCM/APNs), SMS (Twilio) -- Template system with localization support -- Alert dedup and rate limiting per user - -### 6.4 Analytics -- PostHog for product analytics -- Custom dashboards: detection rates, false positive rates, conversion funnels -- Model performance monitoring: precision, recall, drift detection - ---- - -## 7. Development Timeline - -### Phase 1: Foundation (Weeks 1-4) -- [ ] Project scaffolding: monorepo (Turborepo), CI/CD pipeline -- [ ] Auth service: user registration, login, family groups -- [ ] Billing integration: Stripe subscriptions, tier gating -- [ ] API gateway: routing, rate limiting, authentication middleware -- [ ] Database schema: Prisma models, migrations -- [ ] Notification service: email, push infrastructure - -### Phase 2: DarkWatch MVP (Weeks 5-8) -- [ ] Watch list manager with CRUD API -- [ ] HIBP API integration (first data source) -- [ ] Matching engine: exact match for email/phone -- [ ] Alert pipeline: email notifications for exposures -- [ ] Dashboard: exposure list, watch list management -- [ ] Manual scan trigger with job queue - -### Phase 3: SpamShield MVP (Weeks 9-12) -- [ ] Number reputation integration (Hiya API) -- [ ] SMS content classifier: train initial BERT model -- [ ] Call analysis API with rule engine -- [ ] Blocking/flagging action executor -- [ ] User feedback loop: false positive/negative collection -- [ ] Dashboard: spam history, whitelist/blacklist - -### Phase 4: VoicePrint MVP (Weeks 13-16) -- [ ] Audio preprocessing pipeline -- [ ] ECAPA-TDNN model training on ASVspoof data -- [ ] Voice enrollment API with FAISS index -- [ ] Batch audio analysis endpoint -- [ ] Dashboard: enrollment management, analysis results -- [ ] Synthetic voice detection accuracy benchmarking - -### Phase 5: Real-Time Features (Weeks 17-20) -- [ ] Real-time call analysis via WebRTC -- [ ] Streaming WebSocket alerts -- [ ] DarkWatch automated scheduling (tier-based frequency) -- [ ] SpamShield real-time call/text interception -- [ ] Cross-service alert correlation - -### Phase 6: Beta & Launch (Weeks 21-24) -- [ ] Beta testing with 100 users -- [ ] Performance optimization: P99 latency targets -- [ ] Mobile app (React Native or Tauri) -- [ ] Documentation, onboarding flows -- [ ] Production deployment, monitoring, alerting -- [ ] Launch - ---- - -## 8. Infrastructure & Deployment - -### 8.1 Environment Strategy -- **Dev**: Docker Compose, local PostgreSQL/Redis -- **Staging**: AWS ECS Fargate, RDS PostgreSQL, ElastiCache Redis -- **Prod**: AWS ECS Fargate (or EKS if scaling demands), multi-AZ, auto-scaling - -### 8.2 Key Services -| Service | Provider | Notes | -|---------|----------|-------| -| Compute | AWS ECS/Fargate | Container-based, auto-scale | -| Database | AWS RDS PostgreSQL | Multi-AZ, automated backups | -| Cache | AWS ElastiCache Redis | Cluster mode for BullMQ | -| Storage | AWS S3 | Audio files, reports | -| CDN | CloudFront | Static assets, dashboard | -| Email | Resend | Transactional emails | -| SMS | Twilio | Alert notifications, call routing | -| ML Training | AWS SageMaker | Model training jobs | -| ML Inference | AWS Lambda / ECS | Real-time inference | -| Monitoring | Datadog + Sentry | APM, error tracking | - -### 8.3 Security -- All data encrypted at rest (AES-256) and in transit (TLS 1.3) -- PII field-level encryption for SSN, phone numbers -- SOC 2 Type II readiness from launch -- OWASP Top 10 compliance -- Regular penetration testing (quarterly) -- GDPR + CCPA compliance for data retention - ---- - -## 9. Key Technical Risks & Mitigations - -| Risk | Impact | Mitigation | -|------|--------|------------| -| Voice model false positives | User trust erosion | Start with "flag" not "block", user feedback loop | -| Dark web data source reliability | Stale alerts | Multi-source redundancy, health monitoring | -| Real-time latency SLA | Missed spam calls | Edge deployment, <200ms target with fallback | -| Scalability of voice analysis | High compute cost | Async batch for non-real-time, GPU spot instances | -| API dependency (Hiya, Twilio) | Service outage | Circuit breakers, fallback providers | -| Model drift over time | Accuracy degradation | Monthly retraining pipeline, performance monitoring | - ---- - -## 10. Team & Resource Estimates - -| Role | Headcount | Phase 1 | Phase 2-3 | Phase 4-6 | -|------|-----------|---------|-----------|-----------| -| Backend Engineer | 2 | ✓ | ✓ | ✓ | -| ML Engineer | 1 | — | — | ✓ | -| Frontend Engineer | 1 | ✓ | ✓ | ✓ | -| DevOps/SRE | 1 | ✓ | ✓ | ✓ | -| QA Engineer | 1 | — | ✓ | ✓ | - -**Estimated monthly burn (engineering only):** ~$45K for 6-person team - ---- - -## 11. Success Metrics (Technical) - -| Metric | Target | Measurement | -|--------|--------|-------------| -| Voice detection accuracy (F1) | >0.90 | ASVspoof benchmark + internal test set | -| Spam classification precision | >0.95 | User feedback, labeled test set | -| Dark web scan coverage | >3 major sources | Data source inventory | -| API P99 latency | <500ms | Datadog APM | -| False positive rate (calls) | <2% | User feedback tracking | -| System uptime | >99.9% | Uptime monitoring | -| Dark web alert freshness | <24h | Time from exposure to alert | diff --git a/plans/waitlist-email-sequence-implementation.md b/plans/waitlist-email-sequence-implementation.md deleted file mode 100644 index d882b47..0000000 --- a/plans/waitlist-email-sequence-implementation.md +++ /dev/null @@ -1,124 +0,0 @@ -# Waitlist Email Sequence — Implementation Guide - -## Overview - -This document describes how to integrate the waitlist email templates into the waitlist signup flow. The 4-email welcome sequence is designed for new Kordant waitlist signups. - -## Templates Added - -| # | Template ID | Timing | Purpose | -|---|---|---|---| -| 1 | `waitlist_confirmation` | Immediate | Confirm waitlist signup, show position | -| 2 | `waitlist_intro` | Day +1 | Introduce Kordant and the problem it solves | -| 3 | `waitlist_features` | Day +3 | Deep dive into product features | -| 4 | `waitlist_launch_teaser` | Day +7 | Launch teaser, early adopter perks | - -**File:** `packages/shared-notifications/src/templates/default-templates.ts` -- All 4 templates use `buildEmailHtml()` from `waitlist-email-layout.ts` for consistent dark-themed, responsive HTML email rendering with the Kordant brand (Inter font, #0a0f1e dark background, #3b82f6→#06b6d4 gradient accent). -- Spanish locale (`es`) is provided for template 1. - -## Variables per Template - -### `waitlist_confirmation` -| Variable | Type | Required | Default | -|---|---|---|---| -| `name` | string | no | "there" | -| `position` | string | **yes** | — | -| `unsubscribe_url` | string | no | `https://kordant.com/unsubscribe` | - -### `waitlist_intro` -| Variable | Type | Required | Default | -|---|---|---|---| -| `name` | string | no | "there" | -| `unsubscribe_url` | string | no | `https://kordant.com/unsubscribe` | - -### `waitlist_features` -| Variable | Type | Required | Default | -|---|---|---|---| -| `name` | string | no | "there" | -| `unsubscribe_url` | string | no | `https://kordant.com/unsubscribe` | - -### `waitlist_launch_teaser` -| Variable | Type | Required | Default | -|---|---|---|---| -| `name` | string | no | "there" | -| `referral_url` | string | no | `https://kordant.com/waitlist` | -| `unsubscribe_url` | string | no | `https://kordant.com/unsubscribe` | - -## Integration Points - -### 1. Immediate Email (on signup) - -In `packages/api/src/routes/waitlist.routes.ts`, after `prisma.waitlistEntry.create()` succeeds: - -```typescript -import { EmailService } from '@kordant/shared-notifications'; - -// Send confirmation immediately -await EmailService.getInstance().sendWithTemplate(email, { - templateId: 'waitlist_confirmation', - locale: 'en', // derive from request if available - variables: { - name: body.name || 'there', - position: String(waitlistCount), - }, -}); -``` - -### 2. Scheduled Emails (Day 1, 3, 7) - -Use a job queue (BullMQ is already planned) to schedule the subsequent emails: - -```typescript -// On signup, enqueue 3 scheduled jobs -await emailQueue.add('send-waitlist-email', { - email: body.email, - name: body.name, - templateId: 'waitlist_intro', -}, { delay: 24 * 60 * 60 * 1000 }); // +1 day - -await emailQueue.add('send-waitlist-email', { - email: body.email, - name: body.name, - templateId: 'waitlist_features', -}, { delay: 3 * 24 * 60 * 60 * 1000 }); // +3 days - -await emailQueue.add('send-waitlist-email', { - email: body.email, - name: body.name, - templateId: 'waitlist_launch_teaser', -}, { delay: 7 * 24 * 60 * 60 * 1000 }); // +7 days -``` - -If BullMQ is not yet available, use `setTimeout` or a simple `cron`-based approach: - -```typescript -// packages/api/src/jobs/waitlist-emails.ts -// Run on a cron every hour, check for pending scheduled emails -// Store scheduled_at in WaitlistEntry metadata or a separate table -``` - -### 3. Rate Limiting - -The `EmailService` already enforces a default rate limit of 60 emails/minute per recipient. No additional rate limit config should be needed for the waitlist flow. - -### 4. Unsubscribe Handling - -The email footer includes an `{{unsubscribe_url}}` variable. Implement a standard unsubscribe endpoint: - -- `GET /api/unsubscribe?token=` — one-click unsubscribe -- Store unsubscribe preferences per email address - -## Testing - -1. **Unit test:** Verify template rendering with `TemplateService.getInstance().resolveTemplate()` -2. **Integration test:** Call `POST /api/waitlist/signup` and verify email is sent (use Resend test API keys) -3. **Manual test:** Use Resend email preview to verify rendering across Gmail, Outlook, Apple Mail - -## Rollout Checklist - -- [ ] Add `RESEND_API_KEY` to production environment -- [ ] Verify templates render correctly via Resend API -- [ ] Test unsubscribe flow -- [ ] Verify rate limits for launch-day traffic spike -- [ ] Monitor email delivery (bounce rate, open rate) post-launch diff --git a/scheduler/Dockerfile b/scheduler/Dockerfile new file mode 100644 index 0000000..dc5788d --- /dev/null +++ b/scheduler/Dockerfile @@ -0,0 +1,34 @@ +# ─── Build stage ─────────────────────────────────────────────── +FROM node:22-alpine AS builder +WORKDIR /app + +RUN npm install -g pnpm@9 + +COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./ +COPY web/package.json ./web/package.json +RUN pnpm install --frozen-lockfile + +COPY web/ ./web/ +WORKDIR /app/web +RUN pnpm build + +# ─── Runtime stage ──────────────────────────────────────────── +FROM node:22-alpine +WORKDIR /app + +RUN npm install -g pnpm@9 tsx +COPY --from=builder /app/pnpm-workspace.yaml /app/package.json /app/pnpm-lock.yaml ./ +COPY --from=builder /app/web/package.json ./web/package.json +RUN pnpm install --frozen-lockfile --prod + +COPY --from=builder /app/web/.output ./.output +COPY --from=builder /app/web/src/server/db ./src/server/db +COPY --from=builder /app/web/src/server/jobs ./src/server/jobs +COPY --from=builder /app/web/src/server/services ./src/server/services +COPY --from=builder /app/web/src/server/lib ./src/server/lib +COPY --from=builder /app/web/tsconfig.json ./web/tsconfig.json + +ENV NODE_ENV=production + +# Default: run scheduler (override CMD for other use cases) +CMD ["tsx", "src/server/jobs/start.ts"] diff --git a/scheduler/docker-compose.yml b/scheduler/docker-compose.yml new file mode 100644 index 0000000..6bd57d3 --- /dev/null +++ b/scheduler/docker-compose.yml @@ -0,0 +1,35 @@ +services: + scheduler: + build: + context: .. + dockerfile: scheduler/Dockerfile + env_file: + - ../.env + environment: + - NODE_ENV=production + - JOB_WORKER=true + - JOB_PRIMARY=true + depends_on: + redis: + condition: service_healthy + restart: unless-stopped + logging: + driver: json-file + options: + max-size: "10m" + max-file: "5" + + redis: + image: redis:7-alpine + command: redis-server --appendonly yes + volumes: + - redis_data:/data + restart: unless-stopped + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + redis_data: diff --git a/scripts/generate-tokens.mjs b/scripts/generate-tokens.mjs new file mode 100644 index 0000000..7fab67d --- /dev/null +++ b/scripts/generate-tokens.mjs @@ -0,0 +1,334 @@ +#!/usr/bin/env node +/** + * generate-tokens.mjs + * + * Reads design-tokens/*.json and generates platform-specific code: + * - web/src/theme/tokens.ts + * - iOS/Kordant/Theme/GeneratedTokens.swift + * - android/app/src/main/res/values/generated_tokens.xml + * + * Usage: node scripts/generate-tokens.mjs + */ + +import { readFileSync, writeFileSync, mkdirSync } from "node:fs"; +import { join, dirname } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); +const tokensDir = join(root, "design-tokens"); + +function load(name) { + return JSON.parse(readFileSync(join(tokensDir, `${name}.json`), "utf-8")); +} + +// ─── Helpers ──────────────────────────────────────────────────────────────── + +function toCamel(key) { + return key.replace(/([A-Z])/g, (_, c) => `_${c}`).toLowerCase(); +} + +function hexToRgb(hex) { + const h = hex.replace("#", ""); + return { + r: parseInt(h.substring(0, 2), 16), + g: parseInt(h.substring(2, 4), 16), + b: parseInt(h.substring(4, 6), 16), + }; +} + +// ─── Web (TypeScript) ────────────────────────────────────────────────────── + +function generateWebTokens(colors, typography, spacing, shadows, radius) { + const lines = [ + "// Auto-generated from design-tokens/*.json — DO NOT EDIT MANUALLY", + "// Run: node scripts/generate-tokens.mjs", + "", + ]; + + // Colors + lines.push("export const tokenColors = {"); + + // Brand + lines.push(" brand: {"); + for (const [key, val] of Object.entries(colors.brand)) { + lines.push(` ${toCamel(key)}: "${val.value}",`); + } + lines.push(" },"); + + // Semantic + lines.push(" semantic: {"); + for (const [key, val] of Object.entries(colors.semantic)) { + if (typeof val === "string") { + lines.push(` ${toCamel(key)}: "${val}",`); + } else if (val.light !== undefined) { + lines.push(` ${toCamel(key)}: { light: "${val.light}", dark: "${val.dark}" },`); + } + } + lines.push(" },"); + + // Background + lines.push(" background: {"); + for (const [key, val] of Object.entries(colors.background)) { + lines.push(` ${toCamel(key)}: { light: "${val.light}", dark: "${val.dark}" },`); + } + lines.push(" },"); + + // Text + lines.push(" text: {"); + for (const [key, val] of Object.entries(colors.text)) { + lines.push(` ${toCamel(key)}: { light: "${val.light}", dark: "${val.dark}" },`); + } + lines.push(" },"); + + // Border + lines.push(" border: {"); + for (const [key, val] of Object.entries(colors.border)) { + lines.push(` ${toCamel(key)}: { light: "${val.light}", dark: "${val.dark}" },`); + } + lines.push(" },"); + + lines.push("};"); + + // Typography + lines.push(""); + lines.push("export const tokenTypography = {"); + lines.push(` fontFamily: "${typography.fontFamily.value}",`); + lines.push(` fallback: "${typography.fontFamily.fallback}",`); + lines.push(" scale: {"); + for (const [key, val] of Object.entries(typography.scale)) { + lines.push(` ${toCamel(key)}: { size: "${val.size}", lineHeight: "${val.lineHeight}" },`); + } + lines.push(" },"); + lines.push(" weights: {"); + for (const [key, val] of Object.entries(typography.weights)) { + lines.push(` ${key}: ${val.value},`); + } + lines.push(" },"); + lines.push("};"); + + // Spacing + lines.push(""); + lines.push("export const tokenSpacing = {"); + for (const [key, val] of Object.entries(spacing.scale)) { + lines.push(` ${key}: "${val.value}",`); + } + lines.push("};"); + + // Shadows + lines.push(""); + lines.push("export const tokenShadows = {"); + for (const [key, val] of Object.entries(shadows.scale)) { + const shadow = `${val.x}px ${val.y}px ${val.blur}px ${val.spread}px ${val.color}`; + lines.push(` ${key}: "${shadow}",`); + } + lines.push("};"); + + // Radius + lines.push(""); + lines.push("export const tokenRadius = {"); + for (const [key, val] of Object.entries(radius.scale)) { + lines.push(` ${key}: "${val.value}",`); + } + lines.push("};"); + + return lines.join("\n") + "\n"; +} + +// ─── iOS (Swift) ──────────────────────────────────────────────────────────── + +function generateSwiftTokens(colors, typography, spacing) { + const lines = [ + "// Auto-generated from design-tokens/*.json — DO NOT EDIT MANUALLY", + "// Run: node scripts/generate-tokens.mjs", + "", + "import SwiftUI", + "", + ]; + + // Color extension + lines.push("extension Color {"); + lines.push(" // MARK: - Brand"); + for (const [key, val] of Object.entries(colors.brand)) { + const { r, g, b } = hexToRgb(val.value); + const swiftKey = key.charAt(0).toLowerCase() + key.slice(1); + lines.push( + ` static let ${swiftKey} = Color(red: ${r} / 255, green: ${g} / 255, blue: ${b} / 255)` + ); + } + lines.push(""); + lines.push(" // MARK: - Semantic"); + for (const [key, val] of Object.entries(colors.semantic)) { + if (val.value) { + const { r, g, b } = hexToRgb(val.value); + const swiftKey = key.charAt(0).toLowerCase() + key.slice(1); + lines.push( + ` static let ${swiftKey} = Color(red: ${r} / 255, green: ${g} / 255, blue: ${b} / 255)` + ); + } + } + lines.push("}"); + + // AdaptiveColor helper + lines.push(""); + lines.push("extension UIColor {"); + lines.push(" convenience init(hex: String) {"); + lines.push( + ' var hexSanitized = hex.trimmingCharacters(in: .whitespacesAndNewlines)' + ); + lines.push( + ' hexSanitized = hexSanitized.replacingOccurrences(of: "#", with: "")' + ); + lines.push(" var rgb: UInt64 = 0"); + lines.push(" Scanner(string: hexSanitized).scanHexInt64(&rgb)"); + lines.push(" let r = CGFloat((rgb & 0xFF0000) >> 16) / 255.0"); + lines.push(" let g = CGFloat((rgb & 0x00FF00) >> 8) / 255.0"); + lines.push(" let b = CGFloat(rgb & 0x0000FF) / 255.0"); + lines.push(" self.init(red: r, green: g, blue: b, alpha: 1.0)"); + lines.push(" }"); + lines.push("}"); + + // Spacing + lines.push(""); + lines.push("enum DesignTokens {"); + lines.push(" enum Spacing {"); + for (const [key, val] of Object.entries(spacing.scale)) { + if (key === "0") continue; // skip numeric key — invalid in Swift + const px = parseInt(val.value); + lines.push(` static let ${key}: CGFloat = ${px}`); + } + lines.push(" }"); + lines.push("}"); + + return lines.join("\n") + "\n"; +} + +// ─── Android (XML) ────────────────────────────────────────────────────────── + +function generateAndroidTokens(colors, typography, spacing, shadows, radius) { + const lines = [ + '', + "", + "", + "", + ]; + + // Brand colors + lines.push(" "); + for (const [key, val] of Object.entries(colors.brand)) { + const name = "brand_" + toCamel(key); + lines.push(` ${val.value}`); + } + + // Semantic colors + lines.push(" "); + for (const [key, val] of Object.entries(colors.semantic)) { + if (typeof val === "string") { + const name = "sem_" + toCamel(key); + lines.push(` ${val}`); + } + } + + // Light theme colors + lines.push(" "); + lines.push( + ` ${colors.background.bg.light}` + ); + lines.push( + ` ${colors.background.bgSecondary.light}` + ); + lines.push( + ` ${colors.text.textPrimary.light}` + ); + lines.push( + ` ${colors.text.textSecondary.light}` + ); + lines.push( + ` ${colors.border.border.light}` + ); + + // Dark theme colors + lines.push(" "); + lines.push( + ` ${colors.background.bg.dark}` + ); + lines.push( + ` ${colors.background.bgSecondary.dark}` + ); + lines.push( + ` ${colors.text.textPrimary.dark}` + ); + lines.push( + ` ${colors.text.textSecondary.dark}` + ); + lines.push( + ` ${colors.border.border.dark}` + ); + + // Spacing dimensions + lines.push(" "); + for (const [key, val] of Object.entries(spacing.scale)) { + const dp = val.value.replace("px", "dp"); + lines.push(` ${dp}`); + } + + // Border radius + lines.push(" "); + for (const [key, val] of Object.entries(radius.scale)) { + const name = key === "full" ? "corner_full" : `corner_${key}`; + const dp = val.value.replace("px", "dp"); + lines.push(` ${dp}`); + } + + // Font sizes + lines.push(" "); + for (const [key, val] of Object.entries(typography.scale)) { + lines.push(` ${val.size.replace("px", "sp")}`); + lines.push(` ${val.lineHeight.replace("px", "sp")}`); + } + + lines.push(""); + + return lines.join("\n") + "\n"; +} + +// ─── Main ─────────────────────────────────────────────────────────────────── + +function main() { + const colors = load("colors"); + const typography = load("typography"); + const spacing = load("spacing"); + const shadows = load("shadows"); + const radius = load("radius"); + + // Web + const webPath = join(root, "web", "src", "theme", "tokens.ts"); + mkdirSync(dirname(webPath), { recursive: true }); + writeFileSync(webPath, generateWebTokens(colors, typography, spacing, shadows, radius)); + console.log(`✅ ${webPath}`); + + // iOS + const iosPath = join(root, "iOS", "Kordant", "Theme", "GeneratedTokens.swift"); + mkdirSync(dirname(iosPath), { recursive: true }); + writeFileSync(iosPath, generateSwiftTokens(colors, typography, spacing)); + console.log(`✅ ${iosPath}`); + + // Android + const androidPath = join( + root, + "android", + "app", + "src", + "main", + "res", + "values", + "generated_tokens.xml" + ); + mkdirSync(dirname(androidPath), { recursive: true }); + writeFileSync(androidPath, generateAndroidTokens(colors, typography, spacing, shadows, radius)); + console.log(`✅ ${androidPath}`); + + console.log("🎨 Token generation complete."); +} + +main(); diff --git a/scripts/load-test/lib/common.js b/scripts/load-test/lib/common.js deleted file mode 100644 index 1809d78..0000000 --- a/scripts/load-test/lib/common.js +++ /dev/null @@ -1,48 +0,0 @@ -import { Trend, Rate } from 'k6/metrics'; - -export const errorRate = new Rate('error_rate'); - -export function getBaseUrl() { - return __ENV.BASE_URL || 'http://localhost:3000'; -} - -export function getTargetRps() { - return parseInt(__ENV.TARGET_RPS || '500', 10); -} - -export function getDuration() { - return __ENV.DURATION || '300s'; -} - -export function defaultThresholds(p99ms) { - return { - thresholds: { - http_req_duration: [`p(99)<${p99ms}`], - error_rate: ['rate<0.01'], - }, - }; -} - -export function checkResponse(res, expectedStatus = 200) { - const pass = check(res, { - 'status is expected': (r) => r.status === expectedStatus, - 'response time OK': (r) => r.timings.duration < 5000, - }); - errorRate.add(!pass); - return pass; -} - -export function randomString(length = 10) { - const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; - let result = ''; - for (let i = 0; i < length; i++) { - result += chars.charAt(Math.floor(Math.random() * chars.length)); - } - return result; -} - -export const autoscaleMetric = new Trend('autoscale_vu_count'); - -export function recordAutoscaleMetric(vuCount) { - autoscaleMetric.add(vuCount); -} diff --git a/scripts/load-test/run-all.sh b/scripts/load-test/run-all.sh deleted file mode 100755 index d60e337..0000000 --- a/scripts/load-test/run-all.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env bash -# Combined load test runner for all Kordant services -# Usage: ./run-all.sh [service] -# service: all (default), api, darkwatch, spamshield, voiceprint - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPORT_DIR="${SCRIPT_DIR}/reports" -TIMESTAMP="$(date +%Y%m%d-%H%M%S)" -THRESHOLD_FILE="${REPORT_DIR}/threshold-results.json" -SERVICE="${1:-all}" - -mkdir -p "$REPORT_DIR" - -BASE_URL="${LOAD_TEST_BASE_URL:-http://localhost:3000}" -TARGET_RPS="${TARGET_RPS:-500}" -DURATION="${DURATION:-300s}" -API_TOKEN="${API_TOKEN:-}" -if [[ -z "$API_TOKEN" ]]; then - echo "⚠️ API_TOKEN not set (load tests will run without auth)" -fi - -echo "=== Kordant Combined Load Test ===" -echo "Timestamp: $TIMESTAMP" -echo "Base URL: $BASE_URL" -echo "Target RPS: $TARGET_RPS" -echo "Duration: $DURATION" -echo "Service: $SERVICE" -echo "" - -K6_OPTS="--summary-export ${REPORT_DIR}/summary-${TIMESTAMP}.json" - -if [[ -n "${K6_CLOUD_TOKEN:-}" ]]; then - K6_OPTS="$K6_OPTS --out cloud" - echo "k6 cloud output: enabled" -fi - -declare -A EXIT_CODES -ALL_PASSED=true -SERVICE_ENV="BASE_URL=$BASE_URL TARGET_RPS=$TARGET_RPS DURATION=$DURATION API_TOKEN=$API_TOKEN" - -run_service_test() { - local name=$1 - local script=$2 - local summary_file="${REPORT_DIR}/${name}-summary-${TIMESTAMP}.json" - - echo "" - echo "=== Running $name Load Test ===" - - local opts="--summary-export $summary_file" - if [[ -n "${K6_CLOUD_TOKEN:-}" ]]; then - opts="$opts --out cloud" - fi - - set +e - eval "$SERVICE_ENV" k6 run $opts "$script" - EXIT_CODE=$? - set -e - - EXIT_CODES[$name]=$EXIT_CODE - if [[ $EXIT_CODE -ne 0 ]]; then - ALL_PASSED=false - echo "❌ $name load test FAILED (exit code: $EXIT_CODE)" - else - echo "✅ $name load test PASSED" - fi -} - -if [[ "$SERVICE" == "all" || "$SERVICE" == "api" ]]; then - run_service_test "api" "${SCRIPT_DIR}/services/api.js" -fi - -if [[ "$SERVICE" == "all" || "$SERVICE" == "darkwatch" ]]; then - run_service_test "darkwatch" "${SCRIPT_DIR}/services/darkwatch.js" -fi - -if [[ "$SERVICE" == "all" || "$SERVICE" == "spamshield" ]]; then - run_service_test "spamshield" "${SCRIPT_DIR}/services/spamshield.js" -fi - -if [[ "$SERVICE" == "all" || "$SERVICE" == "voiceprint" ]]; then - run_service_test "voiceprint" "${SCRIPT_DIR}/services/voiceprint.js" -fi - -# Aggregate threshold results from all service summaries -echo "" -echo "=== Load Test Results ===" - -# Build threshold-results.json from k6 summary exports -jq -n --arg timestamp "$TIMESTAMP" --arg base_url "$BASE_URL" --arg target_rps "$TARGET_RPS" \ - '{timestamp: $timestamp, base_url: $base_url, target_rps: $target_rps, services: {}}' \ - > "$THRESHOLD_FILE" - -for name in "${!EXIT_CODES[@]}"; do - summary_file="${REPORT_DIR}/${name}-summary-${TIMESTAMP}.json" - if [[ -f "$summary_file" ]]; then - jq --arg name "$name" --argjson exit_code "${EXIT_CODES[$name]}" \ - '.services[$name] = { - exitCode: $exit_code, - passed: ($exit_code == 0), - metrics: (input | .metrics // {}) - }' \ - "$THRESHOLD_FILE" "$summary_file" \ - > "${THRESHOLD_FILE}.tmp" && mv "${THRESHOLD_FILE}.tmp" "$THRESHOLD_FILE" - else - jq --arg name "$name" --argjson exit_code "${EXIT_CODES[$name]}" \ - '.services[$name] = {exitCode: $exit_code, passed: ($exit_code == 0)}' \ - "$THRESHOLD_FILE" > "${THRESHOLD_FILE}.tmp" && mv "${THRESHOLD_FILE}.tmp" "$THRESHOLD_FILE" - fi -done - -echo "Threshold results saved to: $THRESHOLD_FILE" - -for service in "${!EXIT_CODES[@]}"; do - status="pass" - [[ ${EXIT_CODES[$service]} -ne 0 ]] && status="fail" - echo "$service: $status" -done - -echo "" -if $ALL_PASSED; then - echo "✅ All load tests passed" - exit 0 -else - echo "❌ Some load tests failed" - exit 1 -fi diff --git a/scripts/load-test/services/api.js b/scripts/load-test/services/api.js deleted file mode 100644 index 7d47460..0000000 --- a/scripts/load-test/services/api.js +++ /dev/null @@ -1,62 +0,0 @@ -import http from 'k6/http'; -import { check, group } from 'k6'; -import { Rate, Trend } from 'k6/metrics'; -import { getBaseUrl, getTargetRps, getDuration, defaultThresholds, checkResponse, randomString } from '../lib/common.js'; - -const notificationLatency = new Trend('notification_p99'); -const correlationLatency = new Trend('correlation_p99'); - -const TARGET_RPS = getTargetRps(); -const DURATION = getDuration(); - -export const options = { - scenarios: { - sustained_load: { - executor: 'constant-arrival-rate', - duration: DURATION, - rate: TARGET_RPS, - preAllocatedVUs: 20, - maxVUs: 100, - startTime: '0s', - exec: 'default', - tags: { scenario: 'sustained_load' }, - }, - }, - thresholds: { - ...defaultThresholds(250).thresholds, - notification_p99: ['p(99)<500'], - correlation_p99: ['p(99)<300'], - }, -}; - -const BASE_URL = getBaseUrl(); -const AUTH_TOKEN = __ENV.API_TOKEN || ''; - -const headers = { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${AUTH_TOKEN}`, -}; - -export default function () { - group('API Health', function () { - const res = http.get(`${BASE_URL}/health`, { headers }); - checkResponse(res, 200); - }); - - group('Notifications', function () { - const payload = JSON.stringify({ - userId: `user-${randomString()}`, - channel: 'email', - message: 'Load test notification', - }); - const res = http.post(`${BASE_URL}/notifications`, payload, { headers }); - checkResponse(res, 200); - notificationLatency.add(res.timings.duration); - }); - - group('Correlation', function () { - const res = http.get(`${BASE_URL}/correlation/events?limit=10`, { headers }); - checkResponse(res, 200); - correlationLatency.add(res.timings.duration); - }); -} diff --git a/scripts/load-test/services/darkwatch.js b/scripts/load-test/services/darkwatch.js deleted file mode 100644 index d04f1e5..0000000 --- a/scripts/load-test/services/darkwatch.js +++ /dev/null @@ -1,69 +0,0 @@ -import http from 'k6/http'; -import { check, group } from 'k6'; -import { Rate, Trend } from 'k6/metrics'; -import { getBaseUrl, getTargetRps, getDuration, defaultThresholds, checkResponse, randomString } from '../lib/common.js'; - -const scanLatency = new Trend('scan_p99'); -const watchlistLatency = new Trend('watchlist_p99'); -const alertLatency = new Trend('alert_p99'); - -const TARGET_RPS = getTargetRps(); -const DURATION = getDuration(); - -export const options = { - scenarios: { - sustained_load: { - executor: 'constant-arrival-rate', - duration: DURATION, - rate: TARGET_RPS, - preAllocatedVUs: 20, - maxVUs: 100, - startTime: '0s', - exec: 'default', - tags: { scenario: 'sustained_load' }, - }, - }, - thresholds: { - ...defaultThresholds(200).thresholds, - scan_p99: ['p(99)<300'], - watchlist_p99: ['p(99)<200'], - alert_p99: ['p(99)<250'], - }, -}; - -const BASE_URL = getBaseUrl(); -const AUTH_TOKEN = __ENV.API_TOKEN || ''; - -const headers = { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${AUTH_TOKEN}`, -}; - -export default function () { - group('Darkwatch Scan', function () { - const payload = JSON.stringify({ - type: 'email', - value: `loadtest-${randomString()}@example.com`, - }); - const res = http.post(`${BASE_URL}/darkwatch/scan`, payload, { headers }); - checkResponse(res, 200); - scanLatency.add(res.timings.duration); - }); - - group('Watchlist', function () { - const res = http.get(`${BASE_URL}/watchlist?page=1&limit=20`, { headers }); - checkResponse(res, 200); - watchlistLatency.add(res.timings.duration); - }); - - group('Alerts', function () { - const res = http.get(`${BASE_URL}/alerts?status=open&limit=10`, { headers }); - checkResponse(res, 200); - alertLatency.add(res.timings.duration); - }); - - group('Exposure Check', function () { - const res = http.get(`${BASE_URL}/exposure/summary`, { headers }); - checkResponse(res, 200); - }); -} diff --git a/scripts/load-test/services/spamshield.js b/scripts/load-test/services/spamshield.js deleted file mode 100644 index c00640e..0000000 --- a/scripts/load-test/services/spamshield.js +++ /dev/null @@ -1,89 +0,0 @@ -import http from 'k6/http'; -import { check, group } from 'k6'; -import { Rate, Trend } from 'k6/metrics'; -import { getBaseUrl, defaultThresholds, checkResponse, randomString } from '../lib/common.js'; - -const smsClassifyP99 = new Trend('sms_classify_p99'); -const numberReputationP99 = new Trend('number_reputation_p99'); -const callAnalyzeP99 = new Trend('call_analyze_p99'); - -const TARGET_RPS = getTargetRps(); -const DURATION = getDuration(); - -export const options = { - scenarios: { - sustained_load: { - executor: 'constant-arrival-rate', - duration: DURATION, - rate: TARGET_RPS, - preAllocatedVUs: 20, - maxVUs: 100, - startTime: '0s', - exec: 'default', - tags: { scenario: 'sustained_load' }, - }, - }, - thresholds: { - ...defaultThresholds(400).thresholds, - sms_classify_p99: ['p(99)<150'], - number_reputation_p99: ['p(99)<300'], - call_analyze_p99: ['p(99)<400'], - }, -}; - -const BASE_URL = getBaseUrl(); -const AUTH_TOKEN = __ENV.API_TOKEN || ''; - -const headers = { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${AUTH_TOKEN}`, -}; - -export default function () { - group('SMS Text Classification', function () { - const payload = JSON.stringify({ - text: `Is this message a spam attempt? ${randomString(16)}`, - }); - const res = http.post(`${BASE_URL}/spamshield/sms/classify`, payload, { headers }); - checkResponse(res, 200); - smsClassifyP99.add(res.timings.duration); - }); - - group('Number Reputation Check', function () { - const payload = JSON.stringify({ - phoneNumber: `+1555${String(Math.floor(1000000 + Math.random() * 9000000))}`, - }); - const res = http.post(`${BASE_URL}/spamshield/number/reputation`, payload, { headers }); - checkResponse(res, 200); - numberReputationP99.add(res.timings.duration); - }); - - group('Call Analysis', function () { - const payload = JSON.stringify({ - phoneNumber: `+1555${String(Math.floor(1000000 + Math.random() * 9000000))}`, - callTime: new Date().toISOString(), - }); - const res = http.post(`${BASE_URL}/spamshield/call/analyze`, payload, { headers }); - checkResponse(res, 200); - callAnalyzeP99.add(res.timings.duration); - }); - - group('Spam Feedback', function () { - const payload = JSON.stringify({ - phoneNumber: `+1555${String(Math.floor(1000000 + Math.random() * 9000000))}`, - isSpam: false, - }); - const res = http.post(`${BASE_URL}/spamshield/feedback`, payload, { headers }); - check(res, { 'feedback status is 201': (r) => r.status === 201 }); - }); - - group('Spam History', function () { - const res = http.get(`${BASE_URL}/spamshield/history?limit=10`, { headers }); - checkResponse(res, 200); - }); - - group('Spam Statistics', function () { - const res = http.get(`${BASE_URL}/spamshield/statistics`, { headers }); - checkResponse(res, 200); - }); -} diff --git a/scripts/load-test/services/voiceprint.js b/scripts/load-test/services/voiceprint.js deleted file mode 100644 index d042201..0000000 --- a/scripts/load-test/services/voiceprint.js +++ /dev/null @@ -1,70 +0,0 @@ -import http from 'k6/http'; -import { check, group } from 'k6'; -import { Rate, Trend } from 'k6/metrics'; -import { getBaseUrl, getTargetRps, getDuration, defaultThresholds, checkResponse, randomString } from '../lib/common.js'; - -const enrollmentLatency = new Trend('enrollment_p99'); -const verificationLatency = new Trend('verification_p99'); -const modelLatency = new Trend('model_retrieval_p99'); - -const TARGET_RPS = getTargetRps(); -const DURATION = getDuration(); - -export const options = { - scenarios: { - sustained_load: { - executor: 'constant-arrival-rate', - duration: DURATION, - rate: TARGET_RPS, - preAllocatedVUs: 20, - maxVUs: 100, - startTime: '0s', - exec: 'default', - tags: { scenario: 'sustained_load' }, - }, - }, - thresholds: { - ...defaultThresholds(250).thresholds, - enrollment_p99: ['p(99)<500'], - verification_p99: ['p(99)<250'], - model_retrieval_p99: ['p(99)<100'], - }, -}; - -const BASE_URL = getBaseUrl(); -const AUTH_TOKEN = __ENV.API_TOKEN || ''; - -const headers = { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${AUTH_TOKEN}`, -}; - -export default function () { - group('Voiceprint Enrollment', function () { - const payload = JSON.stringify({ - userId: `loadtest-${randomString()}`, - audioSample: 'base64-encoded-audio-data-placeholder', - sampleRate: 16000, - }); - const res = http.post(`${BASE_URL}/voiceprint/enroll`, payload, { headers }); - checkResponse(res, 200); - enrollmentLatency.add(res.timings.duration); - }); - - group('Voiceprint Verification', function () { - const payload = JSON.stringify({ - userId: `loadtest-${randomString()}`, - audioSample: 'base64-encoded-audio-data-placeholder', - sampleRate: 16000, - }); - const res = http.post(`${BASE_URL}/voiceprint/verify`, payload, { headers }); - checkResponse(res, 200); - verificationLatency.add(res.timings.duration); - }); - - group('Model Retrieval', function () { - const res = http.get(`${BASE_URL}/voiceprint/model/${randomString()}`, { headers }); - checkResponse(res, 200); - modelLatency.add(res.timings.duration); - }); -} diff --git a/scripts/setup-ga4.sh b/scripts/setup-ga4.sh deleted file mode 100755 index 17b1608..0000000 --- a/scripts/setup-ga4.sh +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# GA4 Setup Script for Kordant -# Two modes: -# 1. MANUAL: Step-by-step guide for GA web console (no credentials needed) -# 2. AUTOMATED: Creates property + stream via Admin API (requires GCP service account) -# -# Usage: -# ./scripts/setup-ga4.sh # Print manual instructions -# ./scripts/setup-ga4.sh --auto # Automated setup (needs GOOGLE_APPLICATION_CREDENTIALS) -# ./scripts/setup-ga4.sh --env-only # Just print what to put in .env - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(dirname "$SCRIPT_DIR")" - -show_manual_guide() { - cat <<'GUIDE' -╔══════════════════════════════════════════════════════════════╗ -║ Kordant — Manual GA4 Setup Guide ║ -║ ~5 minutes in Google Analytics web console ║ -╚══════════════════════════════════════════════════════════════╝ - -STEP 1 — Create GA4 Property - 1. Go to https://analytics.google.com/ - 2. Admin → Create Property → "Kordant" - 3. Set reporting time zone, currency - 4. Click "Create" - -STEP 2 — Configure Data Stream - 1. In the new property: Admin → Data Streams → Add Stream → Web - 2. Website URL: https://kordant.ai - 3. Stream name: "Kordant Landing Page" - 4. Click "Create stream" - 5. Copy the Measurement ID (format: G-XXXXXXXXXX) - -STEP 3 — Create API Secret - 1. In the data stream details: Measurement Protocol API secrets → Create - 2. Nickname: "Kordant Backend" - 3. Copy the API Secret - -STEP 4 — Set Up Conversion Events - 1. In GA4: Admin → Conversions → New conversion event - 2. Create: "waitlist_signup" - 3. Create: "page_view" (auto-tracked by default) - 4. Optionally: "conversion" (for tracked conversions) - -STEP 5 — Configure Environment - Add to .env (or .env.prod for production): - GA4_MEASUREMENT_ID=G-XXXXXXXXXX - GA4_API_SECRET= - -STEP 6 — Verify - curl -X POST "https://www.google-analytics.com/mp/collect?measurement_id=G-XXXXXXXXXX&api_secret=" \ - -H "Content-Type: application/json" \ - -d '{"client_id":"test-001","events":[{"name":"page_view"}]}' -GUIDE -} - -setup_automated() { - if [ -z "${GOOGLE_APPLICATION_CREDENTIALS:-}" ]; then - echo "ERROR: GOOGLE_APPLICATION_CREDENTIALS not set" - echo "Set it to the path of your GCP service account JSON key" - exit 1 - fi - - if ! command -v node &>/dev/null; then - echo "ERROR: node is required for automated setup" - exit 1 - fi - - echo "--- Automated GA4 Setup ---" - echo "Using service account: $GOOGLE_APPLICATION_CREDENTIALS" - - # Generate a setup script that uses the Google Admin API - cat > /tmp/setup-ga4-auto.mjs << 'SCRIPT' -import { google } from 'googleapis'; -import { readFileSync, writeFileSync } from 'fs'; - -async function main() { - const creds = JSON.parse(readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS, 'utf-8')); - const auth = new google.auth.GoogleAuth({ - credentials: creds, - scopes: ['https://www.googleapis.com/auth/analytics.edit'], - }); - - const analyticsAdmin = google.analyticsadmin({ version: 'v1beta', auth }); - - // Step 1: Create GA4 property - console.log('Creating GA4 property...'); - const property = await analyticsAdmin.properties.create({ - requestBody: { - displayName: 'Kordant', - industryCategory: 'TECHNOLOGY', - timeZone: 'America/New_York', - currencyCode: 'USD', - parent: `accounts/${creds.account_id || '103950747'}`, // Replace with actual account ID - }, - }); - console.log(`Property created: ${property.data.name}`); - - // Step 2: Create web data stream - console.log('Creating web data stream...'); - const stream = await analyticsAdmin.properties.dataStreams.create({ - parent: property.data.name, - requestBody: { - type: 'WEB_DATA_STREAM', - displayName: 'Kordant Landing Page', - webStreamData: { - defaultUri: 'https://kordant.ai', - }, - }, - }); - console.log(`Data stream created: ${stream.data.name}`); - console.log(`Measurement ID: ${stream.data.webStreamData.measurementId}`); - - // Step 3: Create conversion events - console.log('Creating conversion events...'); - for (const event of ['waitlist_signup']) { - try { - await analyticsAdmin.properties.conversionEvents.create({ - parent: property.data.name, - requestBody: { eventName: event }, - }); - console.log(`Conversion event created: ${event}`); - } catch (e) { - console.log(`Conversion event ${event} may already exist: ${e.message}`); - } - } - - // Output results - const output = { - propertyId: property.data.name.replace('properties/', ''), - measurementId: stream.data.webStreamData.measurementId, - streamId: stream.data.name, - streamName: stream.data.displayName, - }; - writeFileSync('/tmp/ga4-setup-output.json', JSON.stringify(output, null, 2)); - console.log('\nResults saved to /tmp/ga4-setup-output.json'); - console.log(JSON.stringify(output, null, 2)); -} - -main().catch(console.error); -SCRIPT - - echo "" - echo "To run the automated setup:" - echo " 1. Update the account_id in the script above" - echo " 2. cd $PROJECT_DIR && node /tmp/setup-ga4-auto.mjs" - echo "" - echo "NOTE: You need to provide the Google Analytics account ID." - echo "Find it at: https://analytics.google.com/ → Admin → Account Settings" -} - -show_env_only() { - cat <<'ENV' -Required .env additions for Kordant analytics: - -GA4_MEASUREMENT_ID=G-XXXXXXXXXX # From GA4 data stream -GA4_API_SECRET= # From GA4 Measurement Protocol API secrets -MIXPANEL_TOKEN= # Mixpanel project token -MIXPANEL_API_SECRET= # Mixpanel project API secret -ENV -} - -case "${1:-}" in - --auto) - setup_automated - ;; - --env-only) - show_env_only - ;; - *) - show_manual_guide - ;; -esac diff --git a/scripts/setup-pan.sh b/scripts/setup-pan.sh new file mode 100755 index 0000000..134ed74 --- /dev/null +++ b/scripts/setup-pan.sh @@ -0,0 +1,252 @@ +#!/bin/bash +set -euo pipefail + +# ─── Kordant Scheduler — Pan Server Setup ───────────────────── +# Usage: +# bash scripts/setup-pan.sh # interactively +# bash scripts/setup-pan.sh user@pan # interactively, remote +# bash scripts/setup-pan.sh -u -d ... +# +# Flags: +# -u, --gitea-url URL Gitea clone URL (skip prompt) +# -d, --db-url URL Turso database URL (skip prompt) +# -t, --db-token TOKEN Turso auth token (skip prompt) +# -k, --hooks-dir DIR Gitea hooks directory (skip prompt; empty=skip hook) +# --host HOST SSH host (default: pan) +# -y, --non-interactive Skip all prompts (requires -u, -d, -t) +# -h, --help Show this message + +# ─── Defaults ─────────────────────────────────────────────────── + +PAN_HOST="" +GITEA_URL="" +DB_URL="" +DB_TOKEN="" +HOOKS_DIR="" +NON_INTERACTIVE=false +REPO_DIR="/opt/kordant" + +# ─── Help ─────────────────────────────────────────────────────── + +usage() { + sed -n 's/^# //p; s/^#$//p' "$0" + exit 0 +} + +# ─── Parse flags ──────────────────────────────────────────────── + +while [ $# -gt 0 ]; do + case "$1" in + -u|--gitea-url) GITEA_URL="$2"; shift 2 ;; + -d|--db-url) DB_URL="$2"; shift 2 ;; + -t|--db-token) DB_TOKEN="$2"; shift 2 ;; + -k|--hooks-dir) HOOKS_DIR="$2"; shift 2 ;; + --host) PAN_HOST="$2"; shift 2 ;; + -y|--non-interactive) NON_INTERACTIVE=true; shift ;; + -h|--help) usage ;; + -*) + echo "Unknown option: $1" + usage + ;; + *) PAN_HOST="${PAN_HOST:-$1}"; shift ;; + esac +done + +PAN_HOST="${PAN_HOST:-pan}" + +# ─── Remote detection ─────────────────────────────────────────── + +if [ "$(hostname)" != "pan" ] && [ "$(hostname -s 2>/dev/null)" != "pan" ]; then + if [ -n "${SSH_CONNECTION:-}" ]; then + echo "Already connected to pan via SSH." + else + echo "Not on pan. Connecting to $PAN_HOST via SSH..." + # Rebuild the flag string to pass through + FLAGS="" + [ -n "$GITEA_URL" ] && FLAGS="$FLAGS -u '$GITEA_URL'" + [ -n "$DB_URL" ] && FLAGS="$FLAGS -d '$DB_URL'" + [ -n "$DB_TOKEN" ] && FLAGS="$FLAGS -t '$DB_TOKEN'" + [ -n "$HOOKS_DIR" ] && FLAGS="$FLAGS -k '$HOOKS_DIR'" + $NON_INTERACTIVE && FLAGS="$FLAGS -y" + scp "$0" "${PAN_HOST}:/tmp/kordant-setup.sh" + ssh -t "$PAN_HOST" "sudo bash /tmp/kordant-setup.sh $FLAGS && rm /tmp/kordant-setup.sh" + exit $? + fi +fi + +echo "=== Kordant Scheduler Setup (running on pan) ===" + +# ─── Step 1: Install prerequisites ───────────────────────────── + +echo "--- Step 1: Checking prerequisites ---" + +if ! command -v docker &>/dev/null; then + echo "Installing Docker..." + curl -fsSL https://get.docker.com | bash + systemctl enable --now docker +else + echo "Docker already installed." +fi + +if ! docker compose version &>/dev/null; then + echo "Installing Docker Compose plugin..." + apt-get update && apt-get install -y docker-compose-plugin +else + echo "Docker Compose plugin already installed." +fi + +if ! command -v git &>/dev/null; then + echo "Installing git..." + apt-get update && apt-get install -y git +else + echo "Git already installed." +fi + +# ─── Step 2: Clone or pull the repo ──────────────────────────── + +echo "--- Step 2: Setting up repo at $REPO_DIR ---" + +if [ ! -d "$REPO_DIR/.git" ]; then + if [ -z "$GITEA_URL" ]; then + if $NON_INTERACTIVE; then + echo "❌ --gitea-url is required in non-interactive mode" + exit 1 + fi + while [ -z "$GITEA_URL" ]; do + read -rp "Gitea clone URL (e.g. http://localhost:3000/kordant/kordant.git): " GITEA_URL + done + fi + echo "Cloning $GITEA_URL ..." + git clone "$GITEA_URL" "$REPO_DIR" + cd "$REPO_DIR" +else + echo "Repo exists. Pulling latest..." + cd "$REPO_DIR" + git pull +fi + +# ─── Step 3: Create .env with credentials ────────────────────── + +echo "--- Step 3: Environment file ---" + +if [ ! -f "$REPO_DIR/.env" ]; then + if [ -z "$DB_URL" ]; then + if $NON_INTERACTIVE; then + echo "❌ --db-url is required in non-interactive mode" + exit 1 + fi + read -rp " DATABASE_URL (e.g. libsql://kordant.turso.io): " DB_URL + fi + if [ -z "$DB_TOKEN" ]; then + if $NON_INTERACTIVE; then + echo "❌ --db-token is required in non-interactive mode" + exit 1 + fi + read -rsp " DATABASE_AUTH_TOKEN: " DB_TOKEN + echo "" + fi + + cat > "$REPO_DIR/.env" << ENVEOF +# ─── Kordant Scheduler Environment ───────────────────────────── +# Turso database +DATABASE_URL="${DB_URL}" +DATABASE_AUTH_TOKEN="${DB_TOKEN}" + +# Job queue (local Redis container) +REDIS_URL="redis://redis:6379" + +# Node environment +NODE_ENV=production +JOB_WORKER=true +JOB_PRIMARY=true +ENVEOF + chmod 600 "$REPO_DIR/.env" + echo "✅ Created $REPO_DIR/.env" +else + echo "$REPO_DIR/.env already exists, keeping it." +fi + +# ─── Step 4: Gitea post-receive hook ──────────────────────────── + +echo "--- Step 4: Gitea post-receive hook ---" + +if [ -z "$HOOKS_DIR" ] && ! $NON_INTERACTIVE; then + read -rp "Gitea repo hooks directory (or leave blank to skip): " HOOKS_DIR +fi + +if [ -n "$HOOKS_DIR" ]; then + if [ ! -d "$HOOKS_DIR" ]; then + echo " Directory not found: $HOOKS_DIR" + if $NON_INTERACTIVE; then + echo "❌ hooks-dir does not exist" + exit 1 + fi + else + HOOK_FILE="$HOOKS_DIR/post-receive" + cat > "$HOOK_FILE" << 'HOOKEOF' +#!/bin/bash +cd /opt/kordant +git pull origin main +docker compose -f scheduler/docker-compose.yml up -d --build +HOOKEOF + chmod +x "$HOOK_FILE" + echo "✅ Post-receive hook installed at $HOOK_FILE" + fi +else + echo "Skipping post-receive hook." +fi + +# ─── Step 5: Create systemd service ──────────────────────────── + +echo "--- Step 5: Systemd service ---" + +SERVICE_NAME="kordant-scheduler" +SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" + +if [ ! -f "$SERVICE_FILE" ]; then + echo "Creating $SERVICE_FILE..." + cat > "$SERVICE_FILE" << SERVICEEOF +[Unit] +Description=Kordant Background Job Scheduler +After=docker.service network-online.target +Wants=docker.service network-online.target + +[Service] +Type=oneshot +RemainAfterExit=yes +WorkingDirectory=$REPO_DIR +ExecStart=docker compose -f scheduler/docker-compose.yml up -d --build +ExecStop=docker compose -f scheduler/docker-compose.yml down +ExecReload=docker compose -f scheduler/docker-compose.yml pull && docker compose -f scheduler/docker-compose.yml up -d --build +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +SERVICEEOF + systemctl daemon-reload +else + echo "$SERVICE_FILE already exists." +fi + +# ─── Step 6: Start / restart the scheduler ───────────────────── + +echo "--- Step 6: Starting scheduler ---" + +systemctl enable "$SERVICE_NAME" 2>/dev/null || true + +cd "$REPO_DIR" +docker compose -f scheduler/docker-compose.yml pull 2>/dev/null || true +docker compose -f scheduler/docker-compose.yml up -d --build + +echo "" +echo "=== Scheduler status ===" +sleep 3 +docker compose -f scheduler/docker-compose.yml ps + +echo "" +echo "=== Kordant scheduler setup complete ===" +echo " Repo: $REPO_DIR" +echo " Logs: journalctl -u kordant-scheduler -f" +echo " Shell: cd $REPO_DIR && docker compose -f scheduler/docker-compose.yml logs -f" +echo " .env: $REPO_DIR/.env" diff --git a/tasks/kordant-unified-restructure/README.md b/tasks/kordant-unified-restructure/README.md index dd001f6..b1fa551 100644 --- a/tasks/kordant-unified-restructure/README.md +++ b/tasks/kordant-unified-restructure/README.md @@ -44,9 +44,9 @@ Tasks - [x] 37 — Android App — API Client, tRPC Bridge, and Offline Support → `37-android-api-client.md` - [x] 38 — Android App — Dashboard and Service Screens → `38-android-service-screens.md` - [x] 39 — Android App — Push Notifications, Biometrics, Voice Enrollment, Call Screening → `39-android-native-features.md` -- [ ] 40 — Shared Mobile Assets — Icons, Colors, Typography, and Brand Guidelines → `40-shared-mobile-assets.md` -- [ ] 41 — Cleanup — Remove Legacy packages/, services/, and server/ Directories → `41-cleanup-legacy.md` -- [ ] 42 — Deployment — Update Docker, CI/CD, and Environment Configuration → `42-deployment-config.md` +- [x] 40 — Shared Mobile Assets — Icons, Colors, Typography, and Brand Guidelines → `40-shared-mobile-assets.md` +- [x] 41 — Cleanup — Remove Legacy packages/, services/, and server/ Directories → `41-cleanup-legacy.md` +- [x] 42 — Deployment — Update Docker, CI/CD, and Environment Configuration → `42-deployment-config.md` Dependencies - 01 depends on nothing (root task) diff --git a/tasks/landing-pages-and-admin/README.md b/tasks/landing-pages-and-admin/README.md index 9ec1f9c..477c2c2 100644 --- a/tasks/landing-pages-and-admin/README.md +++ b/tasks/landing-pages-and-admin/README.md @@ -6,11 +6,11 @@ Status legend: [ ] todo, [~] in-progress, [x] done Tasks - [ ] 01 — Inline index page sections following Lendair pattern → `01-inline-index-sections.md` -- [ ] 02 — Admin routes with controls and services dashboard → `02-admin-routes-dashboard.md` -- [ ] 03 — Blog route with DB integration, featured post, and chronological feed → `03-blog-database-integration.md` -- [ ] 04 — Create blog post content (scam advice, AI detection, etc.) → `04-blog-content-creation.md` -- [ ] 05 — Dedicated /pricing and /features pages → `05-pricing-features-pages.md` -- [ ] 06 — Auth-contextual navbar with dynamic links → `06-auth-contextual-navbar.md` +- [x] 02 — Admin routes with controls and services dashboard → `02-admin-routes-dashboard.md` +- [x] 03 — Blog route with DB integration, featured post, and chronological feed → `03-blog-database-integration.md` +- [x] 04 — Create blog post content (scam advice, AI detection, etc.) → `04-blog-content-creation.md` +- [x] 05 — Dedicated /pricing and /features pages → `05-pricing-features-pages.md` +- [x] 06 — Auth-contextual navbar with dynamic links → `06-auth-contextual-navbar.md` - [ ] 07 — Fix Apple logo SVG in social auth buttons → `07-fix-apple-logo-svg.md` Dependencies diff --git a/todos.txt b/todos.txt deleted file mode 100644 index 937cbd5..0000000 --- a/todos.txt +++ /dev/null @@ -1,11 +0,0 @@ -- [ ] fix translation of index sections -to be like in -~/code/Lendair/web/src/routes/index.tsx -- [ ] admin routes with appropriate controls and services dashboard -- [ ] make a /blog route that shows a chronological feed with featured one (if one is marked as such in db - should be available to manage in admin route -- [ ] create actual blogs filled with good advice to avoid scams and what to do when one has happened, ai detection advice etc. -- [ ] need pricing page, features/products page -- [ ] navbar should show links to main dashboard, and then specific products/features when logged in, so auth contextual -rendering -- [ ] apple logo svg is fucked up - diff --git a/web/src/components/layout/Navbar.tsx b/web/src/components/layout/Navbar.tsx index 6cc109e..9d9a936 100644 --- a/web/src/components/layout/Navbar.tsx +++ b/web/src/components/layout/Navbar.tsx @@ -1,5 +1,5 @@ import { createSignal, onMount, onCleanup, Show } from "solid-js"; -import { A } from "@solidjs/router"; +import { A, useLocation } from "@solidjs/router"; import { cn } from "~/lib/utils"; import { Button } from "~/components/ui"; import { Typewriter } from "~/components/ui/Typewriter"; @@ -119,11 +119,19 @@ function ThemeToggle() { ); } -const navLinks = [ +const marketingLinks = [ { label: "Features", href: "/features" }, { label: "Pricing", href: "/pricing" }, { label: "Blog", href: "/blog" }, +]; + +const productLinks = [ { label: "Dashboard", href: "/dashboard" }, + { label: "DarkWatch", href: "/darkwatch" }, + { label: "VoicePrint", href: "/voiceprint" }, + { label: "SpamShield", href: "/spamshield" }, + { label: "HomeTitle", href: "/hometitle" }, + { label: "RemoveBrokers", href: "/removebrokers" }, ]; function RealtimeIndicator() { @@ -174,6 +182,7 @@ function RealtimeIndicator() { export default function Navbar() { const [mobileOpen, setMobileOpen] = createSignal(false); const [scrolled, setScrolled] = createSignal(false); + const location = useLocation(); onMount(() => { const onScroll = () => { @@ -183,6 +192,29 @@ export default function Navbar() { onCleanup(() => window.removeEventListener("scroll", onScroll)); }); + const isActive = (href: string) => { + if (href === "/dashboard") return location.pathname === "/dashboard"; + return location.pathname.startsWith(href); + }; + + const NavLink = (props: { href: string; label: string; mobile?: boolean }) => ( + props.mobile && setMobileOpen(false)} + > + {props.label} + + ); + return (