From c869096be81d14368d842f0c4c06f1dc2b9ecaa1 Mon Sep 17 00:00:00 2001 From: Harshith Mullapudi Date: Thu, 30 Oct 2025 12:30:56 +0530 Subject: [PATCH] Feat: Space v3 * feat: space v3 * feat: connected space creation * fix: * fix: session_id for memory ingestion * chore: simplify gitignore patterns for agent directories --------- Co-authored-by: Manoj --- .env.example | 3 - .github/workflows/build-docker-image.yml | 26 - .gitignore | 17 +- README.md | 51 +- apps/init/.gitignore | 51 - apps/init/Dockerfile | 70 - apps/init/README.md | 197 -- apps/init/entrypoint.sh | 22 - apps/init/package.json | 145 -- apps/init/src/cli/index.ts | 14 - apps/init/src/cli/version.ts | 3 - apps/init/src/commands/init.ts | 36 - apps/init/src/index.ts | 3 - apps/init/src/utils/ascii.ts | 29 - apps/init/src/utils/env.ts | 24 - apps/init/src/utils/trigger.ts | 182 -- apps/init/trigger.dump | Bin 741986 -> 0 bytes apps/init/tsconfig.json | 40 - apps/init/vite.config.ts | 8 - apps/webapp/app/bullmq/queues/index.ts | 66 + apps/webapp/app/bullmq/start-workers.ts | 1 - apps/webapp/app/bullmq/workers/index.ts | 89 +- .../app/jobs/bert/topic-analysis.logic.ts | 250 ++ .../app/jobs/ingest/ingest-episode.logic.ts | 48 + .../jobs/session/session-compaction.logic.ts | 4 +- .../app/jobs/spaces/space-assignment.logic.ts | 1201 ++++++++++ .../jobs/spaces/space-identification.logic.ts | 229 ++ .../app/jobs/spaces/space-summary.logic.ts | 721 ++++++ apps/webapp/app/lib/queue-adapter.server.ts | 79 +- apps/webapp/app/models/workspace.server.ts | 33 +- .../app/routes/api.v1.conversation._index.tsx | 6 +- apps/webapp/app/routes/api.v1.logs.tsx | 1 + apps/webapp/app/routes/api.v1.spaces.ts | 13 +- .../app/services/bertTopicAnalysis.server.ts | 107 + apps/webapp/app/services/clustering.server.ts | 0 apps/webapp/app/services/graphModels/space.ts | 37 + apps/webapp/app/services/mcp.server.ts | 1 + .../app/services/sessionCompaction.server.ts | 262 --- apps/webapp/app/services/space.server.ts | 26 +- .../webapp/app/trigger/bert/topic-analysis.ts | 53 + apps/webapp/app/trigger/ingest/ingest.ts | 9 + .../app/trigger/ingest/retry-no-credits.ts | 8 +- .../app/trigger/spaces/space-assignment.ts | 1185 +--------- .../app/trigger/spaces/space-pattern.ts | 557 ----- .../app/trigger/spaces/space-summary.ts | 791 +------ apps/webapp/app/trigger/utils/space-utils.ts | 19 +- apps/webapp/app/utils/mcp/memory.ts | 82 +- apps/webapp/package.json | 11 +- apps/webapp/python/README.md | 299 +++ apps/webapp/python/main.py | 384 +++ apps/webapp/python/requirements.txt | 8 + apps/webapp/trigger.config.ts | 4 + docker/Dockerfile | 18 +- docs/self-hosting/docker.mdx | 7 +- docs/self-hosting/overview.mdx | 2 +- hosting/docker/.env | 4 +- hosting/docker/docker-compose.yaml | 1 + .../migration.sql | 2 + packages/database/prisma/schema.prisma | 2 + pnpm-lock.yaml | 2077 +---------------- 60 files changed, 3809 insertions(+), 5809 deletions(-) delete mode 100644 apps/init/.gitignore delete mode 100644 apps/init/Dockerfile delete mode 100644 apps/init/README.md delete mode 100644 apps/init/entrypoint.sh delete mode 100644 apps/init/package.json delete mode 100644 apps/init/src/cli/index.ts delete mode 100644 apps/init/src/cli/version.ts delete mode 100644 apps/init/src/commands/init.ts delete mode 100644 apps/init/src/index.ts delete mode 100644 apps/init/src/utils/ascii.ts delete mode 100644 apps/init/src/utils/env.ts delete mode 100644 apps/init/src/utils/trigger.ts delete mode 100644 apps/init/trigger.dump delete mode 100644 apps/init/tsconfig.json delete mode 100644 apps/init/vite.config.ts create mode 100644 apps/webapp/app/jobs/bert/topic-analysis.logic.ts create mode 100644 apps/webapp/app/jobs/spaces/space-assignment.logic.ts create mode 100644 apps/webapp/app/jobs/spaces/space-identification.logic.ts create mode 100644 apps/webapp/app/jobs/spaces/space-summary.logic.ts create mode 100644 apps/webapp/app/services/bertTopicAnalysis.server.ts delete mode 100644 apps/webapp/app/services/clustering.server.ts delete mode 100644 apps/webapp/app/services/sessionCompaction.server.ts create mode 100644 apps/webapp/app/trigger/bert/topic-analysis.ts delete mode 100644 apps/webapp/app/trigger/spaces/space-pattern.ts create mode 100644 apps/webapp/python/README.md create mode 100644 apps/webapp/python/main.py create mode 100644 apps/webapp/python/requirements.txt create mode 100644 packages/database/prisma/migrations/20251029102022_add_metadata_to_workspace/migration.sql diff --git a/.env.example b/.env.example index bf9ea11..2694189 100644 --- a/.env.example +++ b/.env.example @@ -41,10 +41,7 @@ NEO4J_USERNAME=neo4j NEO4J_PASSWORD=27192e6432564f4788d55c15131bd5ac OPENAI_API_KEY= - MAGIC_LINK_SECRET=27192e6432564f4788d55c15131bd5ac - - NEO4J_AUTH=neo4j/27192e6432564f4788d55c15131bd5ac OLLAMA_URL=http://ollama:11434 diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml index 5f53f5b..b784c09 100644 --- a/.github/workflows/build-docker-image.yml +++ b/.github/workflows/build-docker-image.yml @@ -7,32 +7,6 @@ on: workflow_dispatch: jobs: - build-init: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - with: - ref: main - - - name: Set up QEMU - uses: docker/setup-qemu-action@v1 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Login to Docker Registry - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Build and Push Frontend Docker Image - uses: docker/build-push-action@v2 - with: - context: . - file: ./apps/init/Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: redplanethq/init:${{ github.ref_name }} - build-webapp: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 0a7d866..e264cdb 100644 --- a/.gitignore +++ b/.gitignore @@ -46,13 +46,14 @@ registry/ .cursor CLAUDE.md +AGENTS.md .claude -.clinerules/byterover-rules.md -.kilocode/rules/byterover-rules.md -.roo/rules/byterover-rules.md -.windsurf/rules/byterover-rules.md -.cursor/rules/byterover-rules.mdc -.kiro/steering/byterover-rules.md -.qoder/rules/byterover-rules.md -.augment/rules/byterover-rules.md \ No newline at end of file +.clinerules +.kilocode +.roo +.windsurf +.cursor +.kiro +.qoder +.augment \ No newline at end of file diff --git a/README.md b/README.md index aeea5a1..5a194eb 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ CORE memory achieves **88.24%** average accuracy in Locomo dataset across all re ## Overview -**Problem** +**Problem** Developers waste time re-explaining context to AI tools. Hit token limits in Claude? Start fresh and lose everything. Switch from ChatGPT/Claude to Cursor? Explain your context again. Your conversations, decisions, and insights vanish between sessions. With every new AI tool, the cost of context switching grows. @@ -64,6 +64,7 @@ Developers waste time re-explaining context to AI tools. Hit token limits in Cla CORE is an open-source unified, persistent memory layer for all your AI tools. Your context follows you from Cursor to Claude to ChatGPT to Claude Code. One knowledge graph remembers who said what, when, and why. Connect once, remember everywhere. Stop managing context and start building. ## πŸš€ CORE Self-Hosting + Want to run CORE on your own infrastructure? Self-hosting gives you complete control over your data and deployment. **Quick Deploy Options:** @@ -80,15 +81,20 @@ Want to run CORE on your own infrastructure? Self-hosting gives you complete con ### Setup 1. Clone the repository: + ``` git clone https://github.com/RedPlanetHQ/core.git cd core ``` + 2. Configure environment variables in `core/.env`: + ``` OPENAI_API_KEY=your_openai_api_key ``` + 3. Start the service + ``` docker-compose up -d ``` @@ -100,6 +106,7 @@ Once deployed, you can configure your AI providers (OpenAI, Anthropic) and start Note: We tried open-source models like Ollama or GPT OSS but facts generation were not good, we are still figuring out how to improve on that and then will also support OSS models. ## πŸš€ CORE Cloud + **Build your unified memory graph in 5 minutes:** Don't want to manage infrastructure? CORE Cloud lets you build your personal memory system instantly - no setup, no servers, just memory that works. @@ -115,24 +122,24 @@ Don't want to manage infrastructure? CORE Cloud lets you build your personal mem ## 🧩 Key Features -### 🧠 **Unified, Portable Memory**: +### 🧠 **Unified, Portable Memory**: + Add and recall your memory across **Cursor, Windsurf, Claude Desktop, Claude Code, Gemini CLI, AWS's Kiro, VS Code, and Roo Code** via MCP ![core-claude](https://github.com/user-attachments/assets/56c98288-ee87-4cd0-8b02-860aca1c7f9a) - -### πŸ•ΈοΈ **Temporal + Reified Knowledge Graph**: +### πŸ•ΈοΈ **Temporal + Reified Knowledge Graph**: Remember the story behind every factβ€”track who said what, when, and why with rich relationships and full provenance, not just flat storage ![core-memory-graph](https://github.com/user-attachments/assets/5d1ee659-d519-4624-85d1-e0497cbdd60a) - -### 🌐 **Browser Extension**: +### 🌐 **Browser Extension**: Save conversations and content from ChatGPT, Grok, Gemini, Twitter, YouTube, blog posts, and any webpage directly into your CORE memory. **How to Use Extension** + 1. [Download the Extension](https://chromewebstore.google.com/detail/core-extension/cglndoindnhdbfcbijikibfjoholdjcc) from the Chrome Web Store. 2. Login to [CORE dashboard](https://core.heysol.ai) - Navigate to Settings (bottom left) @@ -141,13 +148,12 @@ Save conversations and content from ChatGPT, Grok, Gemini, Twitter, YouTube, blo https://github.com/user-attachments/assets/6e629834-1b9d-4fe6-ae58-a9068986036a +### πŸ’¬ **Chat with Memory**: -### πŸ’¬ **Chat with Memory**: Ask questions like "What are my writing preferences?" with instant insights from your connected knowledge ![chat-with-memory](https://github.com/user-attachments/assets/d798802f-bd51-4daf-b2b5-46de7d206f66) - ### ⚑ **Auto-Sync from Apps**: Automatically capture relevant context from Linear, Slack, Notion, GitHub and other connected apps into your CORE memory @@ -156,16 +162,12 @@ Automatically capture relevant context from Linear, Slack, Notion, GitHub and ot ![core-slack](https://github.com/user-attachments/assets/d5fefe38-221e-4076-8a44-8ed673960f03) - -### πŸ”— **MCP Integration Hub**: +### πŸ”— **MCP Integration Hub**: Connect Linear, Slack, GitHub, Notion once to COREβ€”then use all their tools in Claude, Cursor, or any MCP client with a single URL - ![core-linear-claude](https://github.com/user-attachments/assets/7d59d92b-8c56-4745-a7ab-9a3c0341aa32) - - ## How CORE create memory memory-ingest-diagram @@ -179,7 +181,6 @@ CORE’s ingestion pipeline has four phases designed to capture evolving context The Result: Instead of a flat database, CORE gives you a memory that grows and changes with you - preserving context, evolution, and ownership so agents can actually use it. - ![memory-ingest-eg](https://github.com/user-attachments/assets/1d0a8007-153a-4842-9586-f6f4de43e647) ## How CORE recalls from memory @@ -204,7 +205,7 @@ Explore our documentation to get the most out of CORE - [Connect Core MCP with Claude](https://docs.heysol.ai/providers/claude) - [Connect Core MCP with Cursor](https://docs.heysol.ai/providers/cursor) - [Connect Core MCP with Claude Code](https://docs.heysol.ai/providers/claude-code) -- [Connect Core MCP with Codex](https://docs.heysol.ai/providers/codex) +- [Connect Core MCP with Codex](https://docs.heysol.ai/providers/codex) - [Basic Concepts](https://docs.heysol.ai/overview) - [API Reference](https://docs.heysol.ai/api-reference/get-user-profile) @@ -249,21 +250,11 @@ Have questions or feedback? We're here to help: +<<<<<<< Updated upstream +<<<<<<< HEAD +# ======= - - - - - - - - - - - - - - - +> > > > > > > Stashed changes +> > > > > > > 62db6c1 (feat: automatic space identification) diff --git a/apps/init/.gitignore b/apps/init/.gitignore deleted file mode 100644 index 3814592..0000000 --- a/apps/init/.gitignore +++ /dev/null @@ -1,51 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# Dependencies -node_modules -.pnp -.pnp.js - -# Local env files -.env -.env.local -.env.development.local -.env.test.local -.env.production.local - -# Testing -coverage - -# Turbo -.turbo - -# Vercel -.vercel - -# Build Outputs -.next/ -out/ -build -dist -.tshy/ -.tshy-build/ - -# Debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Misc -.DS_Store -*.pem - -docker-compose.dev.yaml - -clickhouse/ -.vscode/ -registry/ - -.cursor -CLAUDE.md - -.claude - diff --git a/apps/init/Dockerfile b/apps/init/Dockerfile deleted file mode 100644 index 46ec445..0000000 --- a/apps/init/Dockerfile +++ /dev/null @@ -1,70 +0,0 @@ -ARG NODE_IMAGE=node:20.11.1-bullseye-slim@sha256:5a5a92b3a8d392691c983719dbdc65d9f30085d6dcd65376e7a32e6fe9bf4cbe - -FROM ${NODE_IMAGE} AS pruner - -WORKDIR /core - -COPY --chown=node:node . . -RUN npx -q turbo@2.5.3 prune --scope=@redplanethq/init --docker -RUN find . -name "node_modules" -type d -prune -exec rm -rf '{}' + - -# Base strategy to have layer caching -FROM ${NODE_IMAGE} AS base -RUN apt-get update && apt-get install -y openssl dumb-init postgresql-client -WORKDIR /core -COPY --chown=node:node .gitignore .gitignore -COPY --from=pruner --chown=node:node /core/out/json/ . -COPY --from=pruner --chown=node:node /core/out/pnpm-lock.yaml ./pnpm-lock.yaml -COPY --from=pruner --chown=node:node /core/out/pnpm-workspace.yaml ./pnpm-workspace.yaml - -## Dev deps -FROM base AS dev-deps -WORKDIR /core -# Corepack is used to install pnpm -RUN corepack enable -ENV NODE_ENV development -RUN pnpm install --ignore-scripts --no-frozen-lockfile - -## Production deps -FROM base AS production-deps -WORKDIR /core -# Corepack is used to install pnpm -RUN corepack enable -ENV NODE_ENV production -RUN pnpm install --prod --no-frozen-lockfile - -## Builder (builds the init CLI) -FROM base AS builder -WORKDIR /core -# Corepack is used to install pnpm -RUN corepack enable - -COPY --from=pruner --chown=node:node /core/out/full/ . -COPY --from=dev-deps --chown=node:node /core/ . -COPY --chown=node:node turbo.json turbo.json -COPY --chown=node:node .configs/tsconfig.base.json .configs/tsconfig.base.json -RUN pnpm run build --filter=@redplanethq/init... - -# Runner -FROM ${NODE_IMAGE} AS runner -RUN apt-get update && apt-get install -y openssl postgresql-client ca-certificates -WORKDIR /core -RUN corepack enable -ENV NODE_ENV production - -COPY --from=base /usr/bin/dumb-init /usr/bin/dumb-init -COPY --from=pruner --chown=node:node /core/out/full/ . -COPY --from=production-deps --chown=node:node /core . -COPY --from=builder --chown=node:node /core/apps/init/dist ./apps/init/dist - -# Copy the trigger dump file -COPY --chown=node:node apps/init/trigger.dump ./apps/init/trigger.dump - -# Copy and set up entrypoint script -COPY --chown=node:node apps/init/entrypoint.sh ./apps/init/entrypoint.sh -RUN chmod +x ./apps/init/entrypoint.sh - -USER node -WORKDIR /core/apps/init -ENTRYPOINT ["dumb-init", "--"] -CMD ["./entrypoint.sh"] \ No newline at end of file diff --git a/apps/init/README.md b/apps/init/README.md deleted file mode 100644 index 9d6d85d..0000000 --- a/apps/init/README.md +++ /dev/null @@ -1,197 +0,0 @@ -# Core CLI - -🧠 **CORE - Contextual Observation & Recall Engine** - -A Command-Line Interface for setting up and managing the Core development environment. - -## Installation - -```bash -npm install -g @redplanethq/core -``` - -## Commands - -### `core init` - -**One-time setup command** - Initializes the Core development environment with full configuration. - -### `core start` - -**Daily usage command** - Starts all Core services (Docker containers). - -### `core stop` - -**Daily usage command** - Stops all Core services (Docker containers). - -## Getting Started - -### Prerequisites - -- **Node.js** (v18.20.0 or higher) -- **Docker** and **Docker Compose** -- **Git** -- **pnpm** package manager - -### Initial Setup - -1. **Clone the Core repository:** - ```bash - git clone https://github.com/redplanethq/core.git - cd core - ``` - -2. **Run the initialization command:** - ```bash - core init - ``` - -3. **The CLI will guide you through the complete setup process:** - -#### Step 1: Prerequisites Check -- The CLI shows a checklist of required tools -- Confirms you're in the Core repository directory -- Exits with instructions if prerequisites aren't met - -#### Step 2: Environment Configuration - -- Copies `.env.example` to `.env` in the root directory -- Copies `trigger/.env.example` to `trigger/.env` -- Skips copying if `.env` files already exist - -#### Step 3: Docker Services Startup - -- Starts main Core services: `docker compose up -d` -- Starts Trigger.dev services: `docker compose up -d` (in trigger/ directory) -- Shows real-time output with progress indicators - -#### Step 4: Database Health Check - -- Verifies PostgreSQL is running on `localhost:5432` -- Retries for up to 60 seconds if needed - -#### Step 5: Trigger.dev Setup (Interactive) - -- **If Trigger.dev is not configured:** - - 1. Prompts you to open http://localhost:8030 - 2. Asks you to login to Trigger.dev - 3. Guides you to create an organization and project - 4. Collects your Project ID and Secret Key - 5. Updates `.env` with your Trigger.dev configuration - 6. Restarts Core services with new configuration - -- **If Trigger.dev is already configured:** - - Skips setup and shows "Configuration already exists" message - -#### Step 6: Docker Registry Login - -- Displays docker login command with credentials from `.env` -- Waits for you to complete the login process - -#### Step 7: Trigger.dev Task Deployment - -- Automatically runs: `npx trigger.dev@v4-beta login -a http://localhost:8030` -- Deploys tasks with: `pnpm trigger:deploy` -- Shows manual deployment instructions if automatic deployment fails - -#### Step 8: Setup Complete! - -- Confirms all services are running -- Shows service URLs and connection information - -## Daily Usage - -After initial setup, use these commands for daily development: - -### Start Services - -```bash -core start -``` - -Starts all Docker containers for Core development. - -### Stop Services - -```bash -core stop -``` - -Stops all Docker containers. - -## Service URLs - -After setup, these services will be available: - -- **Core Application**: http://localhost:3033 -- **Trigger.dev**: http://localhost:8030 -- **PostgreSQL**: localhost:5432 - -## Troubleshooting - -### Repository Not Found - -If you run commands outside the Core repository: - -- The CLI will ask you to confirm you're in the Core repository -- If not, it provides instructions to clone the repository -- Navigate to the Core repository directory before running commands again - -### Docker Issues - -- Ensure Docker is running -- Check Docker Compose is installed -- Verify you have sufficient system resources - -### Trigger.dev Setup Issues - -- Check container logs: `docker logs trigger-webapp --tail 50` -- Ensure you can access http://localhost:8030 -- Verify your network allows connections to localhost - -### Environment Variables - -The CLI automatically manages these environment variables: - -- `TRIGGER_PROJECT_ID` - Your Trigger.dev project ID -- `TRIGGER_SECRET_KEY` - Your Trigger.dev secret key -- Docker registry credentials for deployment - -### Manual Trigger.dev Deployment - -If automatic deployment fails, run manually: - -```bash -npx trigger.dev@v4-beta login -a http://localhost:8030 -pnpm trigger:deploy -``` - -## Development Workflow - -1. **First time setup:** `core init` -2. **Daily development:** - - `core start` - Start your development environment - - Do your development work - - `core stop` - Stop services when done - -## Support - -For issues and questions: - -- Check the main Core repository: https://github.com/redplanethq/core -- Review Docker container logs for troubleshooting -- Ensure all prerequisites are properly installed - -## Features - -- πŸš€ **One-command setup** - Complete environment initialization -- πŸ”„ **Smart configuration** - Skips already configured components -- πŸ“± **Real-time feedback** - Live progress indicators and output -- 🐳 **Docker integration** - Full container lifecycle management -- πŸ”§ **Interactive setup** - Guided configuration process -- 🎯 **Error handling** - Graceful failure with recovery instructions - ---- - -**Happy coding with Core!** πŸŽ‰ diff --git a/apps/init/entrypoint.sh b/apps/init/entrypoint.sh deleted file mode 100644 index 86b64f0..0000000 --- a/apps/init/entrypoint.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -# Exit on any error -set -e - -echo "Starting init CLI..." - -# Wait for database to be ready -echo "Waiting for database connection..." -until pg_isready -h "${DB_HOST:-localhost}" -p "${DB_PORT:-5432}" -U "${POSTGRES_USER:-docker}"; do - echo "Database is unavailable - sleeping" - sleep 2 -done - -echo "Database is ready!" - -# Run the init command -echo "Running init command..." -node ./dist/esm/index.js init - -echo "Init completed successfully!" -exit 0 \ No newline at end of file diff --git a/apps/init/package.json b/apps/init/package.json deleted file mode 100644 index b7c2101..0000000 --- a/apps/init/package.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "name": "@redplanethq/init", - "version": "0.1.0", - "description": "A init service to create trigger instance", - "type": "module", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/redplanethq/core", - "directory": "apps/init" - }, - "publishConfig": { - "access": "public" - }, - "keywords": [ - "typescript" - ], - "files": [ - "dist", - "trigger.dump" - ], - "bin": { - "core": "./dist/esm/index.js" - }, - "tshy": { - "selfLink": false, - "main": false, - "module": false, - "dialects": [ - "esm" - ], - "project": "./tsconfig.json", - "exclude": [ - "**/*.test.ts" - ], - "exports": { - "./package.json": "./package.json", - ".": "./src/index.ts" - } - }, - "devDependencies": { - "@epic-web/test-server": "^0.1.0", - "@types/gradient-string": "^1.1.2", - "@types/ini": "^4.1.1", - "@types/object-hash": "3.0.6", - "@types/polka": "^0.5.7", - "@types/react": "^18.2.48", - "@types/resolve": "^1.20.6", - "@types/rimraf": "^4.0.5", - "@types/semver": "^7.5.0", - "@types/source-map-support": "0.5.10", - "@types/ws": "^8.5.3", - "cpy-cli": "^5.0.0", - "execa": "^8.0.1", - "find-up": "^7.0.0", - "rimraf": "^5.0.7", - "ts-essentials": "10.0.1", - "tshy": "^3.0.2", - "tsx": "4.17.0" - }, - "scripts": { - "clean": "rimraf dist .tshy .tshy-build .turbo", - "typecheck": "tsc -p tsconfig.src.json --noEmit", - "build": "tshy", - "test": "vitest", - "test:e2e": "vitest --run -c ./e2e/vitest.config.ts" - }, - "dependencies": { - "@clack/prompts": "^0.10.0", - "@depot/cli": "0.0.1-cli.2.80.0", - "@opentelemetry/api": "1.9.0", - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/exporter-logs-otlp-http": "0.52.1", - "@opentelemetry/exporter-trace-otlp-http": "0.52.1", - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/instrumentation-fetch": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-logs": "0.52.1", - "@opentelemetry/sdk-node": "0.52.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "@opentelemetry/sdk-trace-node": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1", - "ansi-escapes": "^7.0.0", - "braces": "^3.0.3", - "c12": "^1.11.1", - "chalk": "^5.2.0", - "chokidar": "^3.6.0", - "cli-table3": "^0.6.3", - "commander": "^9.4.1", - "defu": "^6.1.4", - "dotenv": "^16.4.5", - "dotenv-expand": "^12.0.2", - "esbuild": "^0.23.0", - "eventsource": "^3.0.2", - "evt": "^2.4.13", - "fast-npm-meta": "^0.2.2", - "git-last-commit": "^1.0.1", - "gradient-string": "^2.0.2", - "has-flag": "^5.0.1", - "import-in-the-middle": "1.11.0", - "import-meta-resolve": "^4.1.0", - "ini": "^5.0.0", - "jsonc-parser": "3.2.1", - "magicast": "^0.3.4", - "minimatch": "^10.0.1", - "mlly": "^1.7.1", - "nypm": "^0.5.4", - "nanoid": "3.3.8", - "object-hash": "^3.0.0", - "open": "^10.0.3", - "knex": "3.1.0", - "p-limit": "^6.2.0", - "p-retry": "^6.1.0", - "partysocket": "^1.0.2", - "pkg-types": "^1.1.3", - "polka": "^0.5.2", - "pg": "8.16.3", - "resolve": "^1.22.8", - "semver": "^7.5.0", - "signal-exit": "^4.1.0", - "source-map-support": "0.5.21", - "std-env": "^3.7.0", - "supports-color": "^10.0.0", - "tiny-invariant": "^1.2.0", - "tinyexec": "^0.3.1", - "tinyglobby": "^0.2.10", - "uuid": "11.1.0", - "ws": "^8.18.0", - "xdg-app-paths": "^8.3.0", - "zod": "3.23.8", - "zod-validation-error": "^1.5.0" - }, - "engines": { - "node": ">=18.20.0" - }, - "exports": { - "./package.json": "./package.json", - ".": { - "import": { - "types": "./dist/esm/index.d.ts", - "default": "./dist/esm/index.js" - } - } - } -} diff --git a/apps/init/src/cli/index.ts b/apps/init/src/cli/index.ts deleted file mode 100644 index e20545c..0000000 --- a/apps/init/src/cli/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Command } from "commander"; -import { initCommand } from "../commands/init.js"; -import { VERSION } from "./version.js"; - -const program = new Command(); - -program.name("core").description("Core CLI - A Command-Line Interface for Core").version(VERSION); - -program - .command("init") - .description("Initialize Core development environment (run once)") - .action(initCommand); - -program.parse(process.argv); diff --git a/apps/init/src/cli/version.ts b/apps/init/src/cli/version.ts deleted file mode 100644 index 2985a76..0000000 --- a/apps/init/src/cli/version.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { env } from "../utils/env.js"; - -export const VERSION = env.VERSION; diff --git a/apps/init/src/commands/init.ts b/apps/init/src/commands/init.ts deleted file mode 100644 index 83ad673..0000000 --- a/apps/init/src/commands/init.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { intro, outro, note } from "@clack/prompts"; -import { printCoreBrainLogo } from "../utils/ascii.js"; -import { initTriggerDatabase, updateWorkerImage } from "../utils/trigger.js"; - -export async function initCommand() { - // Display the CORE brain logo - printCoreBrainLogo(); - - intro("πŸš€ Core Development Environment Setup"); - - try { - await initTriggerDatabase(); - await updateWorkerImage(); - - note( - [ - "Your services will start running:", - "", - "β€’ Core Application: http://localhost:3033", - "β€’ Trigger.dev: http://localhost:8030", - "β€’ PostgreSQL: localhost:5432", - "", - "You can now start developing with Core!", - "", - "ℹ️ When logging in to the Core Application, you can find the login URL in the Docker container logs:", - " docker logs core-app --tail 50", - ].join("\n"), - "πŸš€ Services Running" - ); - outro("πŸŽ‰ Setup Complete!"); - process.exit(0); - } catch (error: any) { - outro(`❌ Setup failed: ${error.message}`); - process.exit(1); - } -} diff --git a/apps/init/src/index.ts b/apps/init/src/index.ts deleted file mode 100644 index 44007a1..0000000 --- a/apps/init/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node - -import "./cli/index.js"; diff --git a/apps/init/src/utils/ascii.ts b/apps/init/src/utils/ascii.ts deleted file mode 100644 index 5df2765..0000000 --- a/apps/init/src/utils/ascii.ts +++ /dev/null @@ -1,29 +0,0 @@ -import chalk from "chalk"; -import { VERSION } from "../cli/version.js"; - -export function printCoreBrainLogo(): void { - const brain = ` - β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— - β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β• - β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— - β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β• - β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— - β•šβ•β•β•β•β•β• β•šβ•β•β•β•β•β• β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β• - - o o o - o o---o---o o - o---o o o---o---o - o o---o---o---o o - o---o o o---o---o - o o---o---o o - o o o - - `; - - console.log(chalk.cyan(brain)); - console.log( - chalk.bold.white( - ` 🧠 CORE - Contextual Observation & Recall Engine ${VERSION ? chalk.gray(`(${VERSION})`) : ""}\n` - ) - ); -} diff --git a/apps/init/src/utils/env.ts b/apps/init/src/utils/env.ts deleted file mode 100644 index 458ec7b..0000000 --- a/apps/init/src/utils/env.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { z } from "zod"; - -const EnvironmentSchema = z.object({ - // Version - VERSION: z.string().default("0.1.24"), - - // Database - DB_HOST: z.string().default("localhost"), - DB_PORT: z.string().default("5432"), - TRIGGER_DB: z.string().default("trigger"), - POSTGRES_USER: z.string().default("docker"), - POSTGRES_PASSWORD: z.string().default("docker"), - - // Trigger database - TRIGGER_TASKS_IMAGE: z.string().default("redplanethq/proj_core:latest"), - - // Node environment - NODE_ENV: z - .union([z.literal("development"), z.literal("production"), z.literal("test")]) - .default("development"), -}); - -export type Environment = z.infer; -export const env = EnvironmentSchema.parse(process.env); diff --git a/apps/init/src/utils/trigger.ts b/apps/init/src/utils/trigger.ts deleted file mode 100644 index b8bd389..0000000 --- a/apps/init/src/utils/trigger.ts +++ /dev/null @@ -1,182 +0,0 @@ -import Knex from "knex"; -import path from "path"; -import { fileURLToPath } from "url"; -import { env } from "./env.js"; -import { spinner, note, log } from "@clack/prompts"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -/** - * Returns a PostgreSQL database URL for the given database name. - * Throws if required environment variables are missing. - */ -export function getDatabaseUrl(dbName: string): string { - const { POSTGRES_USER, POSTGRES_PASSWORD, DB_HOST, DB_PORT } = env; - - if (!POSTGRES_USER || !POSTGRES_PASSWORD || !DB_HOST || !DB_PORT || !dbName) { - throw new Error( - "One or more required environment variables are missing: POSTGRES_USER, POSTGRES_PASSWORD, DB_HOST, DB_PORT, dbName" - ); - } - - return `postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${dbName}`; -} - -/** - * Checks if the database specified by TRIGGER_DB exists, and creates it if it does not. - * Returns { exists: boolean, created: boolean } - exists indicates success, created indicates if database was newly created. - */ -export async function ensureDatabaseExists(): Promise<{ exists: boolean; created: boolean }> { - const { TRIGGER_DB } = env; - - if (!TRIGGER_DB) { - throw new Error("TRIGGER_DB environment variable is missing"); - } - - // Build a connection string to the default 'postgres' database - const adminDbUrl = getDatabaseUrl("postgres"); - - // Create a Knex instance for the admin connection - const adminKnex = Knex({ - client: "pg", - connection: adminDbUrl, - }); - - const s = spinner(); - s.start("Checking for Trigger.dev database..."); - - try { - // Check if the database exists - const result = await adminKnex.select(1).from("pg_database").where("datname", TRIGGER_DB); - - if (result.length === 0) { - s.message("Database not found. Creating..."); - // Database does not exist, create it - await adminKnex.raw(`CREATE DATABASE "${TRIGGER_DB}"`); - s.stop("Database created."); - return { exists: true, created: true }; - } else { - s.stop("Database exists."); - return { exists: true, created: false }; - } - } catch (err) { - s.stop("Failed to ensure database exists."); - log.warning("Failed to ensure database exists: " + (err as Error).message); - return { exists: false, created: false }; - } finally { - await adminKnex.destroy(); - } -} - -// Main initialization function -export async function initTriggerDatabase() { - const { TRIGGER_DB } = env; - - if (!TRIGGER_DB) { - throw new Error("TRIGGER_DB environment variable is missing"); - } - - // Ensure the database exists - const { exists, created } = await ensureDatabaseExists(); - if (!exists) { - throw new Error("Failed to create or verify database exists"); - } - - // Only run pg_restore if the database was newly created - if (!created) { - note("Database already exists, skipping restore from trigger.dump"); - return; - } - - // Run pg_restore with the trigger.dump file - const dumpFilePath = path.join(__dirname, "../../../trigger.dump"); - const connectionString = getDatabaseUrl(TRIGGER_DB); - - const s = spinner(); - s.start("Restoring database from trigger.dump..."); - - try { - // Use execSync and capture stdout/stderr, send to spinner.log - const { spawn } = await import("child_process"); - await new Promise((resolve, reject) => { - const child = spawn( - "pg_restore", - ["--verbose", "--no-acl", "--no-owner", "-d", connectionString, dumpFilePath], - { stdio: ["ignore", "pipe", "pipe"] } - ); - - child.stdout.on("data", (data) => { - s.message(data.toString()); - }); - - child.stderr.on("data", (data) => { - s.message(data.toString()); - }); - - child.on("close", (code) => { - if (code === 0) { - s.stop("Database restored successfully from trigger.dump"); - resolve(); - } else { - s.stop("Failed to restore database."); - log.warning(`Failed to restore database: pg_restore exited with code ${code}`); - reject(new Error(`Database restore failed: pg_restore exited with code ${code}`)); - } - }); - - child.on("error", (err) => { - s.stop("Failed to restore database."); - log.warning("Failed to restore database: " + err.message); - reject(new Error(`Database restore failed: ${err.message}`)); - }); - }); - } catch (error: any) { - s.stop("Failed to restore database."); - log.warning("Failed to restore database: " + error.message); - throw new Error(`Database restore failed: ${error.message}`); - } -} - -export async function updateWorkerImage() { - const { TRIGGER_DB, TRIGGER_TASKS_IMAGE } = env; - - if (!TRIGGER_DB) { - throw new Error("TRIGGER_DB environment variable is missing"); - } - - const connectionString = getDatabaseUrl(TRIGGER_DB); - - const knex = Knex({ - client: "pg", - connection: connectionString, - }); - - const s = spinner(); - s.start("Updating worker image reference..."); - - try { - // Get the first record from WorkerDeployment table - const firstWorkerDeployment = await knex("WorkerDeployment").select("id").first(); - - if (!firstWorkerDeployment) { - s.stop("No WorkerDeployment records found, skipping image update"); - note("No WorkerDeployment records found, skipping image update"); - return; - } - - // Update the imageReference column with the TRIGGER_TASKS_IMAGE value - await knex("WorkerDeployment").where("id", firstWorkerDeployment.id).update({ - imageReference: TRIGGER_TASKS_IMAGE, - updatedAt: new Date(), - }); - - s.stop(`Successfully updated worker image reference to: ${TRIGGER_TASKS_IMAGE}`); - } catch (error: any) { - s.stop("Failed to update worker image."); - log.warning("Failed to update worker image: " + error.message); - throw new Error(`Worker image update failed: ${error.message}`); - } finally { - await knex.destroy(); - } -} diff --git a/apps/init/trigger.dump b/apps/init/trigger.dump deleted file mode 100644 index 81a09bcf2053f43fc9dc18402f7752cbe1405d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 741986 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�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≻y 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%0A+;+c)i1~& zBSTdE$|({&gVkE%D)}YZ<)hMj?p$1|7`qAZ_pmvV_gtzfQE9?>j!>hvw^fDmPIu)y zV#MS}SbyPt@(iaTGkf&S&Yr6!K9xm!L_WqU_59SZ+vG7nm~T8)wfv=Wg9S6FnAC{6 zo4#~Lg42}jLoLzeh`vMRC7 zL^ks-BCrlR5o`61+<&9W!XEly)BW7L)*W=J`Hi>y8rK_j*yZL@hIASRT?q{@!A79D zj^Dv+YKVjPV>2|^2Rih$ep%6Wp}y#JN7&3QHdGmXMq}Jts^7xHQg98%FU(8qh;vm) z2dsIQ$*;M-+OA2xVR>@}ia^+utT`Faj#sSh6s@_I36{7rwT#LHh`76Xq+ z>cjz(QbUGqhOKNnWjcMtoKxsew|;Spl$VP1*@b3?-{0L*X3PBUunPB=(R>`^Fdim* zYBL5RHpF?~cpGDu<&3Mc8)@N64Ftz-YXBGeI=68%*H4r@H7@)f*+@G3Io}2QjN1!Lvyj6I1eAfR?+S6V+X^kL!`chs46MMXG7$Q0lb=g2d}c-}b2q zw}yQ@ko?*aZB~?yV2g{?V`Mqum|IL{VeA(B8>WDlXAa8!=Pu0z{z!hX2%U8&?LI71a zJ1XoKXeTk2aB7OLK#FHCnSP^gb!s-DT}v}^Z>)S3)0<%J&-a2e!+1V6#lV^H1+r%( z@k zZNszPbYdXJe9jA;Agl0mSrfzZl3&x_(N}%-7NSxB2_SH*@lZymwfW#n=AFb%9`DNE z6THj}3nyFMoU-4))*wG*bYFOhm@tl(&rW#)LXZ0UX3H-{gm`Rin8jZJTqeeGgPpyNTEXdX{yWP z<3)!n7FjDG$1#Z~lh9sxuV0)6Yi&D{WevnoeymFOb9tbzZ$Gu&C`C;BYYPNoIV?Hg z)Putouh}OuC(|7f%a6bKTh+%~monU}cCv|UZy=ST<$Z~@!}`Za-2m27n zBUmffOYL=M9HfAOD0|G3Wd0;1p#hzd#nTW*^2`G6;S%bk$`zPdT>a4*mf-ZvIP{Q7 z!>0P7`-z@+<_#DZ#2ka89C1Lt;jl)QQ34Xv+}tk3u;C1mM9MfS+o&?Z*`*{2RD&;?CY#2-ri=&@DK;Z}Z(+HS^R zkA*GwPylUTeQNY^@Zpn4ytz&tZ{QcS&k@939)3eV2gx!=Y!7r%R{g?sZo0_pL{W%y zgW@!JS-(-Vt~y4CvqbhH=UtmV$=2k7yd#N}vB(tf>$U%8ER(PZ)|*6`y!>L!KBAqEPeDbfUjaf*Vd- z^}5jXNp)rF?hm8>$obLuZElBLoqaZo>?9WB*}P+exgG(2Ty2w1bdQ-JV*FY)!(5LP z(fq1P0fbZX=I`ETqS^;pzp556_1xr<^IA4F6d3BzGmueWjpSTCWgBTqF-}3LXCcc% zDeDylSwN%trai5B^jvD7C!*;d&}0BRijcsKAi%Mp<>#|q%#=*d5y&l&g5Ul3bmUyO;Y!}=8HCE> znPw4uEPoyj3=bfOPc=y&AbU*WboA>p`vtnC3Jh#0md^+Gb*oq}R9}d|X($^7i-)!| zLujWn^iA80hsR7EuGcJXP1GrkVO?Jr-h&0iY1E&0k7WxKRc~-jgbl>hvo9tBg)v1e z%DWSy)qOy24LD3fD)$}Hl1ioz6nKVQJ`PZ<}q`Ny( zKLy?opSjT(Zymq%rUmcGPiIJMSvJTpBRzG^x{?RN79Dv;_D0XL(DW~WNjl}>aP-r& ztA?lbFr2cRh&FhbX7hbT7#V6Q9^Eo#U&zVyoJ$p^ly`qTmbE^di`#JV{*x{5wK_>- z&%VEs8eeualXxSh4cvvT18m(LYFl@_V2RLb3V=;9Q%?|q(H0CcDXvMib38(x8xUOs zF&iv1&&*UVghc!XSd~dFWbPSVS})im%c=}HwEZAUTG=;Y#Cq-5q8`_+BSt4kr8do` zU{>XAzN~}mtM7PvX7Aq@E)x=#i%f9e3w88~Ggp*W+v)wvZr2x7|&M9Oi* zl{g-L+ViA5Yb)da){@7~Shd;Aa~|}z>~78cfJ1ujAsGtTN5rtCt{_1o89e!*r7_t} zbu0>ha#^Aj%y7UaOkQAc>4Ddc;4dXxE zxfcAge9zB`+gtWz)3GT{!0VP#U)>5NQIgyHwsXS8uT5WzN9Hn-2);#;QX@u$CK{k> zouPe3e0k4$Gg{}wn$IfsDlE-_Ok{>?fe^Yc<}$z&x=s&|pxzG$zudRoG+sZ9%_E|` zRA$9CwR)|X_Y`*Jz^m8o@+3yd>&}IP$7Y(=?FR3~s}c&o5^|1aePxL6X`k$+E7Vx| z&F#ap{47)jbvt27T}OB_Tz5Yk+Beup(k`m8!++7{;omJb{foP^1p;Ceh-DcFCPkU2 zZ#97bHbX?96f0BWAJ>@v&zjZx&z5(0U+e#~QR`pRhq;|Nz4_WTg?b0qe8cHt%+SSX zKFZ+8v}R5*qUHDkD_rG`|102Ep{Mvn);q@iJGlXxfot5v1@-z^y+7xoc{?KN~K7$Lnc9uNx8q3$Xq)wRKT*I+j8qa3uc=nwa3V=N-Ep z+N^N{y05D=QW^5|oTA9+;R9PXJN!xMuN2#iu0jGyhm8O8SR6jyx)22W>btRbs-meD zJ{rCGTh-bOwTCaTnH=5JEs-8Hjck)sPzd={DJfiEWUy}$e&r5gc)|5pP&fGiCqSAB zxo6(6WZry_)0o!#E!C~ft_NlXCChu^Gb>KfMfw>Dy0SjpNh6VeH|7-WaI3Ubd6(xz(J;~4=P1Jh>d?Wh7=^10Zt|YKOKR~H-5z$Q zkkBa!8^&yHV}@_G(fCztM@s^Zg+q5We1JIW*b_a27ho3$oH zNH!x@S)6RK&x1ywzkAgp^B4tN>90%5hx(=vg2@H(3Xikq#I0sI4m5o0*~3G7gfrgF zd~=~OYR0ebe*?kE@@O#FZ{`TcRT@lBk$c>msKA)Gh9xTbwPsPE|CwZ8Xn>I_F8I&rL)D4F3$5ke;k3kT;~%cbA; z7aJrUMO_zEa`%Be>FD~SgYe5cTq;?YO~spK}V- zT5kHN4RA7L^aanRTG_RvJs|q_EwlgH9t7TUl(SLm$BMoDMAfW*=Xq=&9Ab050q!{% zDHGI%rP**PxF+Q1E<3f4Cs&Oz^DA#;`jrfcciXz_APICP_>+L%7>?YyvAbZ65;b*s z^k%{9uxuWo%ZRuH{qUtlT}o+}bC8!}sVDtW9TBgTz|SFc?E8BUQNtC@Be5Yim<`h% zRSYdUV8S?tM)_7k^yuwhJIu`Zi^)+oWcaV`{R%~t=O831^>^!{AKc3`P8_Xvi2DFP zzSiXRHQ19z{>w_Jlu=v(_l~^4VI=ZbIBDo;kS@E)boX1coT2B~8aeP(oze9EuW@6J zq-6_!V3)!TB2b)|ub*WT%ScgJF)mA$ZnLYy;x0s(fL)%iY&-mCHnDRUwbKZypC(1j zPgZ}cf*t+U^}0hE_~TAlF!HvWGJ29uJ7wpu^1C@U1o5wYQ&B;6lAutN7M=l}zSwb* zOnQ zia2!uBcUdtwdrt*ha`rcuDoWQ{Bi;yP+uL>BBdGokL8ROwQQ3dMOUCv9V3{~%T;fJ z$5t|YiK4ffX-P{Xao3s{s2~Jx2H*;{8Emi{U*T%5^l{uU-gok=P>#FV71xPc5Nfpe z#MA4h5=P;f5D0G5yaE?(p}1YeYdYD-*W;qChE+rRBR&e?NJW%RqSvjwc=_94ZR0J@ zcl^T{sN1N(cchG4I;zx}$0gQ5-S z=Tn?6T@ZMS*f5ggmi%<<&kCtFK*0LbgU7sc!ZTr)CRt075{$ zzgW99e@zF6Y8a7Z)A45?_u!KT=(!7?sJmNeF?&~9h8x0)$xZcb)q+gi6c~?6^ac~> zXL$4vz^gZ>^`)unUjqM*-uC-g-}gIufBMy;VtWJMRE1VBp%P`7WZ#1yj=K5*g{{I! z?epshC5bN8I^;nGo}I;y&e^-)LcJnKa8Leb)*?>ZfZ->1!+)h zqOh|#A5?4hF+>V6fmmki@zmep?W6c`yTj6{z3^8kQdW?4bL2U~`eoHPVBY}&LElWf z-gNUpd>utmcp?`}MzBCn$mx~rTA8PJdC^9v24gNrLV{IzBbNha>E3I?Q0m&7GQ5E& zt3gcEc_(L57nY$Ed z+m`#dbugwK6tCHFzChq8qd*aP1h^)0HWG~hf&}*$s2QXfxf+^8!Xx0LVVTq zi&u5>Qmr5$>%*dVPeJTmd zl{3O`rH$vTAb3y8PL$9M;g#jUSoy zd^99TPrcwtG04L}-D<9#t&Zf{=Dq2Z;h|`+aWt|Xud?(oA0vkxWymcoEf%|TM&sbU zG4W;N-`w!3Pe&fNsy%U$YuZ4H^9W)z*3w7)E>LD(A#9%9$LdC%3*G%zZ;!sT)AaOS z@}cajf^>W0zhKK7ia%tpBsaBtR2Qj=7_Lv=jH?v*ZZN!O(+3DLD?fh^=Z#h2l>d{l z^H!2j$%5zyVW5=>G|*@*J+#)kzkZn)vF2{P7-Jk_fU0{lPu4&&Kd?S@lih`CB$*m3 z?t3?B&gO%*?MCQlsMr?4Y)tVOfWAm;{NdylGKJ9sWt>kn5xwya!E~}jAyIijuLn90 z12EaqKw)vKU4v*a_KJ@%Y@#=`%&;CZr!Y#%$@Y%UQ(SvC(l)wT8>xjR8W>_7=|`ty2Kynf?nPLZxEjZrHP%vnOP%Jkp^ zN=J@bNI7@J49jQy4ybMGM>@!_3gjwOdAiWYrA%B^W)28HrW0UXC07KJ0?8Y zzRJl@i;@w%Qwy0X?*`If5Te!g9l8DZE8hsZS4oK)mm2h=#eG3C)^6Kh{z7*HB3}4J zu5}txRPRYNYW3yygz_yW{u47;xS#OrX5SxRyotXn*F0;o`O#HxDh<=pOKUQvXe`UT zKIs>XoG*2c|Q35poH?ymJbwZzN>W+-ML+chhE@Zl=>@j^Si}v0*H@#22l@8Vc#d z?BXZ?KG^o#3i3v&O?a=v z3K7Ibg3~pssQCz+QC&5qMXb?U0KqwrnT#c<2Fk@AOMIm7r20^w{)hS?as;Huc9~v- z3{=@~YT+g~cj{Uz7Y=Q${iVdjkVrCo+mXzdoqt&v^QY67`tJkz$rOv$NKjr&fG#t# z@hLg@H2z%ZvSsmpYuyd@FDY+AaoDc|6-D#2#f5zhV1ugG&HXw~==w#?7TuLL15Pb6 z>eD`$16#hueU#(~NUth<5N+6mSh~!>6n`Z~^}}_ohbF86gOLY~S^QnF?DvHj;F8HQ zIKdoqT-5qz6b2G+tS|wH8T93M0pYcw3(~mg2)Hr*fokIbY3IS|@Ye$k2o1#s62AlO zSzzN$Lx>um(rL?qzJoW)gn~j0P3DE>Z+qR?L6Et@v9%Z>t(MDJzB} zCqG%F6o^(xvS|*3>K4&_>GGUs>FR&vQ%i!*!Vy$i>nY1k_w*shcLd>Uq3Iy;ZPUf6+9l?&}Opi z8{&1)M29!S#dWzVEcqlmE|7!6 z^=+j^BiSu?{Y*j_I?a7ak&=wrGL5cL_!f})E7(2)ek~ds=zWz8yGWEoi3F$EUq9Jy zp7j!Z>1Oz@t1gOh^mqMq1$8qu864hU*g^h>=q+nbCKyBG>cP)cW;p9Q3Tm zwVKE*K?E}jx`GR?d@w0%waxi>`||4smmfz!$5_`?pt!TlT1b~!zF)SL7(P4rle<8e zIcpF4^qqZ@61m#RE`R%Zt_$Rz5h^>y0$D~APXixskP6c3r+)%{*$wcXY2-sje7T|4 z!U3JCP=2V1000mG0E_Fw#}~ERqr!Q$Np&&kJJPTqVT^nt%Pe>DR-%w3jum??A-z?2 zYSIB=O(yc6RId`NYIk=%No3OIx(!%qU6ksLg5tAG?dcEk?K-_P*z>dkBJCFNqCsLz zhMGDO_e1Ujk0Z}3UwIMSX+MAKXJDWioD|&YgGleAQHLgo#`Y{%cKV}h=x3unpf`TV z6@&^$47;!@r2OTL#;#u6iJHZ9U7V<7MSb0yy`OFDMsM91-_&1a&iC_PxjTK;D)uwH zH8HjGQ$dzib1>`p!*NcE@f4otS}s*C?#=tmB=dVdMvb*THu+!DsNW{Kp^8TZ!=ltW z)`ljY3pze(sNyt?0Ua32753mjJXEgW2hBzx+~!mnwLAdh)mA?YxL)NR-;9Y>aE0}| zb~MV{2pJ>$cjkDuia_Cu!SVTo?_b!#&ig6VVs@Z; z#m5d`;^ekitXCvedGW$ZZ0I6Q{x<2i2kO7=cAD@K%}e&l32j zQ2=}L`wC|b(z7!-q+gUAKc3eW6GD-0OBMWd=MbxdbNx(u5x*Uz4d?(?BaeHigpEpD zpLzx^@vYqDQyu%rM}&t+XFw4Ccx<~0H+v4>xv^G&@*euIW8XupF9((|I;P=RN%-n_ zZ`91`xwL5_5*TdP)iG~AJosiQP&r4}+MQ@&C~`6oV5%=-4o+Ip#dv#VE!F;#0-SNv z5F5?;N#e_Cv)m)ztjPKzg2~p46X#;#o~0_y6JY0Dn&b0zD%Oh6HB>B1{!*h=Z{)Ql zDqBZo`uJnm;@4M{>NjEaWt&N`$#*q7L~jPI%4~u+nEt8;yI^ZNeepN59?Q)Jv7pT% z%uZA!TR~Y$~ZRdU!=jpB}jT?U)o5m>hFvdEGs1YQ1aK zzM_3?P8nW47%93%^G$|aYV9CD92-=BFc?@yPD5YM=<4M2h8mSmi7zfvZIyR7*=EUG zuJ9m#Sjvyu33zIr6=&GsdVe@zk$1ht^3@^~C3AxgU-3sZ^qp}a=R?uO1I2&EN(Ws? zJQN$(S(~QuOB))6OvCu<8H9Ha9*_ZXKHRf!^(F84O}ti~k__2nPBcK1@;DF3h{;XB z@fyxFKrUr|AZ-XWSCKZi} z8y@r*CG#b{+JJpPM~T#63^!f)MWUYpQuYblD&Sn~q9)$=vhvP8Om3dj-_r+zUsu&~ zYoPyT7Wwp9fmTRE=X39!j7m`*VHw^Cv;QtL`3f>CjGMSIqaMXS*32!W?V}HfI%JY; z&Vc^H=exnqnbn{Y5evd@t-;V`b#CXUEp?~;xw8r<0kgNOj}jQy*;eM?gT1Om9v#Ss zOKb!OG$&hX+)C;!{+*5_?66=ob;mI;ui?}>gZL24IM?>pVc4ojeeOE0910upR{~Fh z@XW&Njzp4@Q5xGr)iC?_q0|gsy;Ed2C;q+)S0WMQIA^#yO#BT=_WoNd~AcrRP+$2@uxjGO3X$lnT(` zkd1dw4gkla$tgvX2)srEI^>ajPW?GLRwLPfiivU>FCPuH)-uGf0ZI6J?K9@L=vb(R zugLbe54>}UC!mt0pwz{|aaKt4ABjnMLIx_#=xRMO>#A*4Pa9suHLXr z6?V2JDs=Y9^*6S~U3X4;T8i>>p6^n4lRCVWObC*bgk;;Y?$CKH0#k-8(push;}|}3 zoa$4Gf#$jrU)I6k08ANGCt9BM>Aa*$yo9a z+9i!C*xjG$Nd0M3H?)Cf2BA#)ImGX>Twyw-(jB1+Uh^}@NJWFpzqn;WWqv$;@5P~T zNg|Uw+GsKKGzv5033>rs&9@EIfnh$18+Bc8dA%2IV{4uy0b?fv-a!a={RyL4#LpxI zZc%)a={Lo@@@9oCSEwAiqQP^NXPZGQ-REdIJpRKutBji5J?7nd8*x89+_2bv z5Ll3I+Sv)aVbKW!CJs}?G&|HTyN|Vl4zak$7uYgd$V&Ds&Py_fCLJ_GAWHfJ^({+K z^MEVn+3y&>`mD4+80j(vfn-wsf{KrFd}e&6yx;2lWGy;y;BE3xu&vto0@LK@ckUHt zVC#T}1`O$jAThVE8A_!`1jrRN9&5pl=n?$-`ezJy3o7%vw(P|LfV@8Hfp7L<2h zQB$;GF9kqNL83j)kUv>B-8tl{*_{oBPZf2QTfdZTLi~WlHpj~=SmHHKEE4XoV#k<>rTD@nCq3k6UnWCz?<$X!8ZB}}&+hFXMEnjO~Q&lhdJIXSo3x#^M2Afo!G z4W=GU3xj*;chdS>nugr52?-?PZ%V_>sy~A&cHnLr*1><;1#{x_ zj|ptfC<7nv2UHyvxk!E{4P>!7n*rGF%_ z7LMRVJ?F4Reg{~l2<_E|J0&1Sfi9`B%gl+$7gO5n-f_;PQnT?R`f>;YG^vO?r!4ud zqvGXAJTtLZcAq&vK_;+YnVtMO)CX^8(6a zcMJ?Em6~v#2E~st4jWrRVubmrK>j#C7=`W>Aclbv8$5@~HXJAV?Q_2XXMD;8Er*q? z$vOPLy=^E5N&p*2402~#Xnr#T8f?`;NJWPqZ*(r(EzLkG1;E;{6GH-wc$d`~sUBm&}L2Yj z`J)~mW^K#ex=`gp@zPo6f2FLh`+}98QZ#J}LFK-vV8(9wLvXXW{ z_DC}o0i(fF+{rYJ0t}=TF^}E}(Og{VSL0W4S%-QIp~&hO zv#uc`@UQXGwe~o1`Gdd0Jw!iZENroQ7$+d%CL;M}3eST7R-R;_YZ6J%MLThVlpPcI&}5Og?%jN97yP`Pi`3*HN*rmU zE9Oap{(!cW=8OQx!Y}iPM7EDZV|A!ful3j)yhoRXahaUNd^^ePCNNLwWq`!|Ziv_@ zx<*E_4_z4!963C&$4oH-p&oMBE1}(Vq!Qxp@x10qM8`U3At2bn>}w+Y+TWnhkKrV>D`ZJOg$X zimy?#B@%v*?uzC%2v68}w@#C}QyS7m)Ux%^$)Gj)MO21TV@TJX` z4FFkkK`vwSrgpt1;{vG!DnCp4deXD}GOOM;j zI!SV6Y5&4h>FR92egxw1)V^ZG!usPoC_B*RoJ{N=7{WVxa(L*=FG6SYDuD%spcpIQ z%8!@P1X`F7Qt!pQ9WRol0zuo@73HbYDl0|0kG4Ujs@tIg)ZiAV#p87gT6CgmA5quG z1s{Ib%YAlpaNlbF^2S-7R9sgnbRiJnk>xUdEkUvEh!COkLxJoK|H!ksLk6it0{tSV zT`C8R)bOHOAKpWd=PWn9!)hyO;{^(FR8f(J7UZ;++YQ`!Xp{~CM9W0&?VfDlos3rP z6}BuS%fd(b+j*25XMg5VRU-G(n`H*!r&IqQC=6=n zDst;!-crr5MTp7lY=`i980nPqRAi2VS?lsyS)tmNsUB#8I^zQ*a~KeSi&>-E&{g)G zw$dAg?@KnMyrEr)A~@l`VFm3qe9F4Uz2_#~_8Dvr8Ru)4{^I&jX3ZMBprKI%4I~n` z($UH>_x)HNF!!R(qOQx8%2lFf^)*kuU>UAGvD<7bz?|vw{nbPHS3t}VBEKC>FxlrO z(g-bfRBkpKa%HEHM&m=DgQV2cdas(QoH|ci(ul{EigdX})$N9L?XP1K%FL7zfVe1|PUS?^=oNWq4L)VMzuD zpPd{3a5CIgr+PiEQSFK{rhkv)eo(O2px477mm8T4Gu%$Fia?2RDG91U(WM%f>p(;6 z!&&uMqj@X3rc$DGl7(HvfhvJ|uk;_HB2VwOVF4a=;>}BN^YI8?GIj&-vCsW^(*9xN zamO8~=tU*lUIX53XUEZT^vNqp$S>S1Ev4r?6G#x4N?G73{O z`P=X_JU3!fT==VJ-lXd|UX~z-FazjqhlJ6)1|?0Srx63{;ErbJzkpt9<)(7wf&E_2%jDxzrVL#^T%< z>-nHH*M(U&(<IYbjo|49N_tPfqZCW zlo)kT|ZIT8JZkOl(Ea03g7*{c9L7iS1SyA_T#F1$Z z9zsIHXf+-tBhy1&(K!CmzdIfMf?N-OPl1qNeyGdk0FQ+TfrJ(hG%5A$jx_Df5NJ^n zbj~nXG#@-&1e#wBWB@*+lcv5mNkixQIqpJkaD=@a@bWmR4g7coMA>?dCI!DPXzFVY zv?dPB{?tzb-QFoV#@!19mmSZyf%8j)q!AN(lDVs-@JA*-SpF&WHDZz%c&rGTMy;?1odf z5iDWWIBBdaWGXz_^&tPWs1gS2>`o&whcIt;##;F6ij2YT=EgSuEoQ80`F5fLmlJfS zat5PqfvE!0JOnHw@lN#4S-Fs z^iel#`)ZgbStC7D{$Udp19e z!HObj#**;WZ){4UErwl!e)Xt-ePj zIH(q2@}!>vx)G^nvm1Bzvb!UaezdYpVy@ zTEXQa5YV41r5WV}P_pr1mz z?X&D{?E}HuTd2*ML_G`epfancXXM0_o}v2f!F?Z!8M^2dCVsVe1z3-KD5ND6AJk7S zON~tmZJ%Joz+S7Nj_*pL8wgvkT=VVf_}LN~ZXv#IrKf!6!>=%F@u{SQ&O%bJ+g`N< zP{w@!hI+F(CpszSRG@{5Spg)r1pl)ACtAWz3ccIcDgv;xz|P9AZw)hRNv>}ouDr9P-eu^^BEftk6_Zx(*c*(L>`L+<@E*w6CKa!s?57)=u4;Hf2etM>goM z$mx}bN}!ODicl$9^n8;{SJTwU!CjXjinCf z)%as)G=HKD{y+?p$1->U9E!Y0{(M0J!N_Vy;|N9a(~R407LCrp%NNV(=0oLP0IH|2 z*q+oBlAK6+?m(`+$@+w*XlK|0QxT$hwT#Nkfk$B6Vc*Xb_SSq1@wzlm5U(I(d?;Qe zqpIR`@(Ja-;G5(=>+nZ1SQx0PkTpP^|E#%FS&fP#50Hs@jsWWS`Q%zBT;(T;!}Y>P zmMBLE60cO3LZWv0hSI4S_hpVdK8qOKT9awQ#g8C+IR-U3j$;KlwvNgP>u0r8eYv&u zqOG&^>enC;o2Wf~bM>AirAd>oU;6yKxYSqb@`vnt?NXF*1Wf! zSKT(dHi9V>1^335V;$|UU6Z`HLYT!CKKZH}n~>Mt*}YbA<3dMYMUtVp)dT;@LhkFw zA``okE@5BO`dGB5v^#qDCbx|YQ&K;y^yHDl)~XOX1)qKBxP0tsVkN;}+;m>$8dZ+5 zugXtbrKwg~!xanegt?c6KWJn~KD5jl9ay#-r!g;5;3z=`kz~i;dw{P$RjAXhr?1KUMtT&8rRbM)%@v5gGeB3{2t}WX_{Oj<-%H1j6Joinp~xacX%|UU zfdecUE;}dPm^ivWC2WVGFHCC+kxD6NX<~*-y*JNJUJZ`V80p7fShr6M0YNIgzID?B zzUP}Sb2z*DO$Cxu^<)BL(m^F^9)D@?^@SdAjLZ`q8{1&d)vF1KCcOtg z-3AZ4c4w4>%Ll!2r$bi1rDyC|qSvrivu*dH-&eKZGurpSk=GC6K8Qw}7TmNN&;Mv3 zS}y=ApFHe9%V6`Q-$G@ZeEGwx;;2V*Z#PqmqZ06i;(l~1xfC6zfeR!zzx>tx#MYDx zF|`S==A*_3osBybB~lSCoH6So+C}>lRVlaXw?+UcJEO2>_>IW@eo8dqS7&>Yv94$u zU-Ug5crPoqf+t^f1=^&tFd+2zF(9+}H8B0*V$96N(C}C1>`(-#Ig;t|4YcvC+_S z4#xh)Q;K+mgx;(I;yiTQm)F?6|Jk-DkZa_lcEPT_G*ddtk-M`V6a82&!-58sUHczSYx1fNAO{v9iy+1gvnJu0RpyUn^1z z|1vmx$ve%!_hjfryZuBv&+;l*?MqR!h%LUs{N+zww!JyzDdkf&pA|;}aMMeCZMM1m z+iW)n6BR$PHt&Hgb0D^$z5|$uY^s4XIcp~B47}oDkkN(WPT-(`1132VGynhq5C8xW zKax7%ICD0@LkyYlfoP)RW&DoeRvf##WVS6)lBAWE2bJvh2w9!;oXjQo;CnYK>`_^Z zgKF$27VrG_yrED{IZrEez?>zI2)*uIy5`S^{{g~h-_~6KrMk_|9z--CRu1aKD|5-wQO_56 zAO$U?{W&$glRLy8d0bq@mP5HXGXc{;>qGj07H__sbHVGgXkkC2}0Dy64Xsi5UmU0`@9)gZq?)LVB&mB zp@TcZD|%Cv5U3a+0A`jGSfpSAdknk@ok-h&f)9nQ=Xz1saUODwFh^j-_f-s~hz$Gnn#y)2aRzi}tJf}DzW7eRR}h)Wg8$YS ztcabsKj^<+ot=|?FV_FDu?mG3ugAhAfo5bvz$l&N7=$E6N|Yr6k<`EW?1dlf@PSa3 ze;&E}HLI63zcC`h(&bsIk#SUKXqF$a?Gv$Umei3UXdOx30f`376I#6N|ZlV&=Qn@}x}l zR`|xtgd+pLPr0{-PH5}IpbRw@2QpMuTF~v+G4kCIp6Vt;F`$yaNrM@mXfg%*aB>AD zJVEFCpjU3$+$eJ#gPBaQj)-qb^}otBoo$%LJLo)HnM}R#v~>Fk6hvFCu&mFLNq0dx zfy_@9?Vp#c(p_;j9p)Mv-sRR|L+|4TUB$(m%ow_;$Z?sB6D(X3X-5$jCLMj5i#Q>- z^!?p~WUAk3&7zEk_t!G>&%@!E0v`;j2eiqi>KJi;D z_11*?BKHJf#0>HdG?eXUDVei9;V$PM82+)`OpCPgVJzJ!oUAQB85TFdGFI3 zHpOLH=|2fO!{BZVk?&J}^xq%jb~~Lcek@v{;|7H|P+mqAgY`-w(4gXSWiVjVb<_NY z8+ICLdr~6uTYli0YRw`%J`$gX5Mw=nAk@r8+`k)P*a5#S60k#rM;8?FDKIV>1jFYq|h&!@+13VMRj*Bj~3GtG$GrZkfz<;Q^p*rv@yiB8Ru$uW`I&q`o;IHb8?K8L95Zv; zp?vrwZsz*w$teP`w`FH5E7X}>d-~jNxv15-H5bmRfv9J2bgA@J^Ld5dWNG(!pwCqTYA!U{_;dJCxX$Gw_z!GBAGC_9QD+kru za#edF%q1a3=Ga!c63P}|WfbSf%nJsY%fcAZJ!|7r>m}=bI+suuAzdU1mx-ItLLk*m z5fDlvi`$#cRtZlA%FaRoDeujW>hH(97Qha2!O^&|aZ%2kH&%dKdsZWX>GI1EkA@YO zgtuCyJkudVCo079YW>x~*jP9ABlX#HsO3C@eya*xcc8LPx*xPJ^UZjqb1m}Pf3sTr z`_}fV3+H%< zOo#GQQ+HA!tfBDtovv0@w`G_|@Bp>@p?p0YC+wEkoH3||9M^$q-NRZA1ilh&EX{dv zAw$za&!%6KH$SSSllYYyOvbCjAffuo1cUgxy*$0EyhjMXg0${*&~tB_YfD>MT>+$g zZ%P$tfb1?R+`v8O&X{2caUA>+oyBx;(VN$2@j9@^-B{C>9P)Y zf5Sf+KUd}omq7Pw7$bG|Fa#cBLw ztZ?OQmL@-{kr?`b4+Nv zWjnmZa#UH1gn4sjcZ;*_tgQTPQ16e|tS|^x2${ZnY;F7mgj~a6-ksX%yLsvEIo73a zsKb%oEsPx~zCRM2PKL4|-ngSddpf->94rE%k1XV1MuLY9V07U3K|_cF^=YxtWi2f&hc2tK45epy`G zZi_KmOe&YuX}|YeYySSXbpwhw6_mJ6SSu_J013?z^ zkPZ~_$q%SH*n=Az#zj=UD;9%hGn}SeeT^jfin%WE@BXU}JDtfl-8^?EyD!GA8b_5J zAKh`#Xc9^Ub8XxchsT(vPJH0|kyFi^&g5AXtgkoZhIrXiAP8IdhVBp3Q_aTI-fQM5 zFr%#}smqn@cLE&SbxL4DocpzULUA^`r}g4yTQ_MO>*ZK zZ)d4S{u-^*?joP!34#xrGhdQSOZ(PkLM!LCYky^!V}Od#rwqR7ehJ#!92w@B+Glgt zMPtxzgvzjiEs?&t8Y6;? z?{cT8g?B@|_nsLx@sRlB=`VF!x@xIU|F=g~N@Y+~5PPllWkT%Xlej{17M)A%ex$%H zcfHthbc;~JKP8Lx%lSyS0(4mDwB2qZ+kV^(o@+0FFR6E!Gsen!1tl4T{d9dr;NE(f zGN}>&X11&17mD*MGWIDqB#mkHkr2Ge<+q3G4}7?#g*lT*uSgqj5gJyJ2I7QQ zQ$%*Uusqb}EhESPV+R=YwCn;&knylC?HNilzaQ=7=`ErS4nsjs2?BCXFkddtS;354 zYsZ4IM~!Vg-CXv39aPeqZA=s*B?zp0RL&pI!LQp%*61?>t%F^P>JVO=(i;5T4>wm> zT`L0ym8dP!i-ZS3%dC4I4811vR3m6s%pYcV6EQw2Uzg2olXbQt~`HG9wAv{7@!T~420mlR?*Z6W;o5XY@1QAnVkhS=awzqP7k;mP`0JHfkc)9wM+ zZdU91(S9xWqDQ6!2{rLGKn=I}#)rW6>eN}q?QJ}ftKSG=$XvSdgNmYl_6ZqsQdPNN zQv|XJsExH=BzOG=x1>dlg~Z{+9a#1D|fuUM@Sg;BiP> z#c;6wovvn+E#$vKGji>?mmqP10}2Ad>y!ZTOQ4^|rc@?|w&x-`x4*i26(WxyJoD%o zrkLSJR^`HeXuO_*bfvBD z?H0Wd*_DE{0c9BMi^K3mW0HI7(}(i$`eEV_lNv122j3=(>nL&=n}E7#tD~KoRY&(T zrHLXOV@5Bt$rZ^p3+}y4AyZ)0hJmg*&Rbc)s^>YTFDUS3IH)(UAE}q|xQ0It=PmiL z(bKLKLir_J5yf1D-`VUU_X%h^RMc`&U+M0Xv1fGEnUGt?$d6}cxX-SK_HDC2J$@!` zGfRXVeT~$62}0X8YBWicTaijT4d*e_{riX_4S?+z^4c9EG0e?m?N35i=QQs+3!?=U z!xgP-55L`Q%mnUzS$S(HePd8+FCY(=XbyQ=?c88xcFCd5Gt&@Ql0WQWAo~i>UU-u% z%>UhXzh(-V)?B~uP64Adohv5>$9F!$> z#OE3+HdXnXz#sU%$Yd1K(?xv(c2VoKZB01p!W}q1s(WdlhlJ_&_!L2K8zD zero>7Yp8}$&`ee!1hp>5w%L*#V;(ya% z_6ehSKauC-fizGjZ>@=EwyR#bd|uWd04V#WrV%c1==j$_VQEVT&BGeWLq>M03_<&5FE~F?=^uu5I8_OIAf{NjN{DW41mw zfpA)<8G`Ko{uUv)u`v*QJOj5cwd90~4h?V_gi;M2AG<0CcNQZhKf>D~;+61CT}}>? zz(`_`xeyDN^1}&vgBk3!2d`yLKRn$+IJc72ycV%GG3QnO#)dJ3X2LOkX=vtzf#)9u zx^hVg1AzcNCz<5JQjlzst9___&GFIJs*WqBTm*0r-@x**bMcsIbmg4P|?vvL-q>EL~s!%`RmP80omzR)jqiK3* zoCbJD%P2J$U(FDz=$i)9ng}$=^DtX)1oD%iqMTq-r^BC}N;&_N`a71UCz69qp@YQv zeM{S5sEs%{^_QPYGzn0X#$u&%AK6@}RsF3%Q(M1-uza?Rsvf`pc9W$Ka5--fZ5FE- z{K@9&_pfR&umfZ|0>2)XH!~%CcLKs>ZPv0oxGgZW7mB{FI4vd9DZEhR!ch#!{gvk? z5`%=1Ep*VM<5t%$pm&AHxi1fW_ce&Q@9n&~}R80Ni7;+Nv0{5f;JiM3~c`i(Vz({60xuJbc;tTfHvbg!n9CX!9Y@t_s;T zYX!&XQ)Ew!=r&aOnf*@GTYP5A$+5AEq`F;n?7dpQslJ7CZfrw~)c7cxtx5js@!T$@ zSPtNwog%qpKOAP*3&!qtrhQAN>9`4#PaD>@YwM}=-P4nhjq0mqR{67V%Xxj#;>!%P z%I8~K=jcJaPftXqT0d$W8fE?fML@d0JbS=n9|JXGLHMB051p!`H8a=|S`6rGkLE`8 zVRvmosp;oG>zU&bY<)4b=@Q~>cl3zUAE3nNbdv31W=dkPp&&VJsk$c#Q5g+p1hAZJ zLJ7ZaxFNV5hd5qeXGNo~tXCIZV3^B6=2h}nZD4da% zRm{j5aM3gBX@xJo^)5ll6uJf7kLOlujhltZ9HrGk<0=PZ_0@hC)8M~$kDzlv3IcZTt$u6opJxqdvU*Ho_Z2e71)7zPEJql-Ub@j}dpRF50_!Z!Lf$ zC%-&UWQJWQ&{vBUxlODoGmNBsWQ{ihXd#wk2#RKVGd@Nkbst;hw<+{vNK)G#m~f@o zFa1k-rICpuAT(C7<9BvgT=_NJj9J}`+1-Z(;Tc2>P&E}l_Q$`Mkt*$GBb-x8zt9pZ zWH+GlA%%U)eTvrex(>J~DJk{haqKqTDu0j;*v&RL#zJHImtUv}?BMn&2wKPTc61a~4jJhp>) z{qK5sCqKFjdWbh=%8@K&3E)&8&Ym+w1#vxi!1SZ@wvU^*dT>AM`$lG|U~3ja$ix&f zRJ~uaT=iG|DcGTV$^0Nlo?`cNB18tQ6`WWWIe-d72pYR%ymazGi~nkB%Cbz4?T4B? z#;2CI%3KBD>Nc-u)Oy|GWE}x*;78LeaG{2@LbPGbWkVo~Y9@!&+g6aWafq1A4vhyk- z@(p|mGAHU15<=Y^_Ba0<>t|%DQx8oMsc!!AKv2Ycp7r%&gF>FBGtQ6DTlgQjCfn3~ zq$k}TQeeK$6HmACwbrYvn7`*rh5ihxoQ5NEcgiRQTa_pY=A)_WpnNwI|6ru7ReL6^ zS9T;xw0wbhqwx>S-vt$g*Xe@}Ak779`lC{Gnt7YE3P2K-LfFIaHEEk2Ws$F{mShCe z?PSB4*l;>de#a+oa$0{n99EAFVQtC@CE-bdpC3~v94d)Do&o=q(g(zTBC=RW6Vr7p zB2w8BEfMDq->yL`!G=*6eh<{?Gi~~VYfEVQRREhW`eI5a5 z;>@VF$XEpPf*gJ+)ZB}vjtXZ(rYpY@(8=(D@c>}I4R4@j6jDbH5;jv@_&qVi-JAV& zn}lQjkt|WsYhdB3-QPm z!}jl)s3tL(%n2l;Xrj*R41Gz6E^|01h#E!k|4oaA8xBRp9v{Z3t=B`uJ>yazU4%YI zV<{$J2w*J_M>bB1I0f0dif~04sIZ{CY(G%(?%r0bk^?D@#$Hm=31VW4bA!q3nTkoL~h?VKb)Z0OTyRIx79anx<&f&$`Mxg4SiA-+v=~M&RhSv zN2BI14Zu_ktgiA^r73XV16#&TGFPZ@PQS~YmME0D>Hz_JcP}|?|N8GyrV}iDY%W`U z141>lK1*Hag}Ex8=8E1FPDjl8L@6UN;Q~ypSrH=C`kLD?3XyQ=R9Vh}RclSa;3t1kgsiQ-P zOcgZ6heszvv2)w`0sMV3xkQvw0yb_mG2ihk#zn&cnmfK%OD1~E`h34FpCoI^UI8{S zA3s$@qv^5l2C@y1&Cd|96{_mrH${j!LZH5`U47KZ1$*|Ixjm8+2oo`lPXN&$CA*9Q zCL@qbPdlm`KYQl}wP*WI-SVP2yNl zR5($R1eHN`fzrr-?|)Pb$F~35?nh4;ZuE&fNpK#=S@A5=GiF?@vaT4Q*nE7R8*d%~ z?nq=B(=Ni|%^}?c%*3ZYP@Zt+HdRU$6p5G55g^7v6finB58d%#Sn!M7chfrtT3rpK ztz4UdJ)5CB(fTqEOzH~cI;XqDPNUITeEBPi(+E=bltW?S19BKqVtXB!{5Ik#>?P;l zot3zjCPrl-Ti=GXEe^6U_>KT_{3x{U!J{t?VcYBt7IyWj!isa3o9z*DmweG>Vt8$k z?+|VXKOu(i%J=;9)pa!5RC*qAP|<2kakQDQzG&s-XzK~NnUa<=vl@0vw>Cvm735Kx^tms?G2UkkQ%|?zRJ>@NGKmymQ>bXOAMYOGV zXo}PnGYGlPx3`qb#&|w-06u{8c;XvSonP4dQM)-G?~~y@Ydoi_)Gr}Pt*DDU=`B?#R-!g_K^11gGj{pTd$edw&&HFsbZ2yI{&QWAwy54PpLCWlXrahVmqBT>{7kL(pcRC3hvGzRUP zwCh0;)%9SX=rDDK^by^5;#zoq(#Nj#S~$@N2LXBNC{CKF!f@E<^S!!lsW~)wT*2C) zrUV4@^p z(ij@t#W65@em*%q`aH++&C$8dVYP{s)VQ0(d64$SC+XJ+G2pc39mc3-S+oSs;%^rj z-%f_jOOjcTomg@GkP&(I6LP5oc@c8tokfRU_Ff)VE?l7YnWrC{e8>idtT;g+cwBQ% zhAW}qfU5RE7T%JOPyShv|5HD~b}Fm;--|L#pfrT!c!uOK4#5Nkz1W*Wa8Bhoos;Fi z5#=`!?bUz0$2qHY`_GGC?Ft zP|W#WnmULo)1w!|-U^<{w@h{9lC6c8JG(x0EbWL-zBoNnydknEq}<&)&tWPt?4s+z zCr>gh!YS<0ctlQvqv*>3>>*D@(vN!FJj0>fCfIyV8~h+@um+RNb1p0uy5EUS=l_83 zX9y}t_@!3i@fk6!cw=OxkJ_&OgZWYLU8AhX(5hm%l}xlV50MtLk|GM9T@ogz*ah&uoIzh-;b3+R&8qvQ z{p@-DUe8_UAYws{BtTqGl*}`*BPb&nyx{TZP)P_*AE18a_O(=_)0dWjjUl%`?+FMs z>s?wlqx&w|U;MCd2y>sYezE&w)e*7h71MKEP;25e*Mq=qm}f4hY5Cb2VO5HDv8* zBc`nUQAF)$U8VT!zQ5$#blkj`3VXmVAB5Z-9?3_QIwShRZu)5mO=-oKLLf+*MPaBf z)bFt#+N(DHar9<-1*+>9b*7m<@EB&g)G|X0Pc%DKqCzydEFpq+NME1=`OWQYoP);f zY_lT_;_-KTD}jhmpU`XR3Cw8(**xtw`1@vVcj7=l&-LHu0QcpgBVmpZfT2&zE{@iJ zwBN5otYaP&4Y)z@lA`&1(tnhM|5CQ#|5(cZlU5KURlPB;qA5BnNV>vmtRgc6stOFp zu>TF|gux~r5cCQ{MaQ-k6{dP&4a+Sd$9!33b_SfBH?}7kFxz(Dw0bC~OVUFGY89gm zv`)K5p33Y7Qt8w+ZYqG?a8-vIwBr%{$(~cFx(irXB#^XMVx1^${o^&aujwchKz)AA zH{8g6o&vT-)M4K5K+EgCIC#*rIPs3itG8!E1vlP^Kb+=AQ;OxMlm|s*N$I= zwe5QnZ}~i_%>=4{x5clSIvE=SD5~Ji&R6&m%lwVfwuJ)|Mm2i$LpD5Tw=sdeB`Z~5 z@-xYbD}?(n5g>PvZwfM^ets8hOocanR|WenU;<-L^O)Bl=4$r?rPWsCa061e&42AN zNP_o*1Xxcdv@k#I&bgbaGv|%B)eu?Dk1MDp|2LKsvbqact_&bKzCgPJtHE*D!ZS2ODY`^axWwQLqUfqbs|qiP0>%D2>;IqX ze#dX`alI;Ai{{^YWMt7lg#5T5MNEh#_Ufq>zVT}K0bO(m(|b$au+UR`r=nwcji0Rz zTh>qvhMC7W4>}ZK>`|*1-C#g!L6F^$$IH7~nmX$BOw@wX7Y{9*gou{n_cOv~gjbGV z!US(*03E+{^wo^Oye)s-teA;tp)+HJYNiU|<>cElSm>_x%!^wSS(i5t(M#9#^`=`; z%m%DDJ|irM-jVx5ZGM5h2gZJg>p6Y=JOA1L&8J(q6gB5!+lssjMiJoQ@6)j zSB2CzjlM>~Ud*~%AoLA#z5*~ng#3`;kq#A7XtUImHtfss}wCR zyNIEn_ZeJLpB;>3#?bdL9LTNT3DcNJu(v)UJUH2QPV}vdDMM*vhMZ>Sq5ku0YdYI5rX@{e4aY zW(GS2OM-A?{}~Oj{q8^BEc8JJyGUjAoW4h%DlS{FyM=XTa$Wh!Ehd`7%0jWa9rgev z*S^xftjoVH*sW%&t-l)K;o*p&QYWW|qHVIfCl{)1e#)N#6779t z1)od@)Fy0&T}wDgm0>g}RCWvhiQf?bE7d$j)%I~(Lu1Us6U*BBZ=%vC{_#hth0k*# z$(<%izm4xqsRE@#VXu|)v_!NR8=hg^0qt^hcf+`Xu1dmP=^)v2-pgC)WG1r~hBP!k zS6x3wA8ZyYEm8BioZmQe&IO2CyKcG!&gwFJO);<3=4T)E>jrTXKnxu5g|IT(F#JZ@ z`5XhZPTdv&{tAKPucEHZgAiGN0VjJ1Tng(UjnBM_Y~-V<4uZHclN#JN*fP6HW)@FJ zxWTr*58Q9Zb4TYI{%eCFwRK|#h*r{F#ZON?8Y_g{QIf5U$b7mOOpB1w)PX%gJ3x3e zQ=0tW5%CBG#rTUDsOxQP)mKc5j;!GA-yxXY9;ovj&lC zuOu+-@rGGxmYU7oGdz9dq#$I_b=%*Hw$j*s`}hQ~$A@|F(8+E&3hO69zy5Dc=hhw{ z^57e@??1QrU2C6Zgp@wWZwl295$`SDx^0E(qm0JSr-^{n41C`N*n46SnT9pKMDv5Y z1^<;SufxHQ#FJ6cK-TK`lAx|yWITM{9q}iN%%sNIp}w@ZpI=TIWcBd(?N$4#yZzA=?L8ylNFRwBAUE|0jg}3)+GW<$CPgoD8l6Nen(|0jQ-ZDs>7|>+k1e7AO}}n zWgZ-Ui$)z~%*lF@c z>Ud#4FcdJCZ?;2I0HCOp2J+#2@!+T|>vje4wtWJ(V#PPcM5M3dht1dnX>TI$lB)_rR!a36B&8R6dhK*13vy|6VOJ z{roWYncmh1VGY1$2^of5hShNf!A-L*NM=iM)BA`By}3(@yOV9em#~-vcu;pXOV&n% zzOFN;?MF*Y@t9VMGI3D(j5bbCNB&Eu#Z;N4&cd`uWj&GjhAy9YpJGS>!M|O$CF*Ii zDQ_M&Z{pWs^x_nNxX6k{7EEP48t{uE>SOAxx!5J6h!`1t*vb5576Akumvmz>!JX%*85i9evLhl4o&etR;AzkZY4qR{)y=_cOIr=Q5qEyZir z=j+h{EPfY72slFcro=oY>_@;6>Of)C^mo$2=2ZQG)O11q#X;d`DZVuHZB$cyD*v%N zwJlsH`Rn^F0k^jE8t-~u(ti$4N?k2bI70GvcZxBt+lZO_9sM(VIs^o%Fb;H?1|IJV z;m@;dy7+TQGa0ik(P2M{BR@^#W{>ROXu?ta#==Xywj(NDo%f3?L@H( zR}Y07`k^k>Ndk#gd~5yLr@yY{)lF8SG0WX{j0r%A)YsmX@OH))#=UL@I|wtrIxe7Ttr zb+#Z{jO9jqwnafDQ5tlIOI0R@h5!P*HLg;5{W**z6tkbmcL8ARmP8xWN4abEy56#U z;D81WzQCIimHO-Q)CrOl6vPfr?$7KBSgX`~Yh~q`<@Qh7e4PHyS5!_k0oPBc0SwOn z7Mo1YIC>WvzbI$MtmEz;U>K=xD-*x#7^%oeT$|h%pkfQ)h&BRq=>}X*$}dSU5STCp z5p0AEBgxyYNega_2J&2QV&nT<<`{QFa~_P}Aq;-&rx?t%yBRcIDlyR0eII&a6dSkS z=Dxgab;o~KxhTMBI?it2k#f&~oa`!`j5DBq#7I-V7*MY z?tJEb#g$tEufpK?yg7qJ<9LeNvnZzY$z$=_{0qnN@57t{`N<3{oS<6gi#iN0!+k>e zMZ7xT^RgRBgd!lIR8pW8-4~(!Zrp3P@Ve}&bHdeUWdYQ&vhwnp3+MhI^55oFBXv{F zHbveP&uRjHCTxPEFNe|OQ^G_aZdI0YA>ShpYJgLBd%+vFBT}XsiZOFcKcLw6A|aXM-XT zy?sIb*j;S*5-6%pzD!Za_s-ZYu%*#Z@N+z*K1lzBGXIY^!0lha@$WeXsWB|aD!42t z8beC7z{`wAA?)wf9Ic9f;+SI`v-S7yK!&bg0Yu0w!g1pD%C!@qL-i)jBZqzt18mjy zAu91OP>8+&0B^{XR!}u({(LAV4D)T=t$f;}4L`jfPMt#!dboHos@Ja58Ng%`Zaw%y z=Sk8e6S5me^hT{HyZO6^W{Md@hGd>(z2bA;_T3NgcpOJN)pYC7Z`}aC(_Zq!7=|+lmOsk-?NmI) z1sZnWbCul((fvb-j4(VzB!%q$I;q zXyveo;qelfab?ic4CkH1WNg99z6(bJN%yvy6k7lQ5C8yR<#6sy?ev)KlbSC8xVOiG zGeJ-_ZMw4o7&ljjt)FTr&bpG+Z2DPaS{2~k}uXi1U{8(an z&(4AUJ6|8Ay7DMFjSZfV7=FWgOL(S=5~v7=Ah>^uJB9YQAeB7$cnw}G9>zA z8a#s$6A0FD%*Oq1=g8d)#7eCJn{+pq%xuVWe+(RJc=j=OL34++b&lj&x6`<|DuZPW zia{A^@FlRG4^Rk~B4302jnUta0I|o~$%#r4UHg)ZdFz9N53Oepc$}+43>(P}(KW?^ zr8s^54<Gsr>MK4oM_jer&r+3VT5g@Vm*7pnk>Q$bunlWU%9v#nFhc^L zalz7ch83_n-*{Tiu^kq}+1=dsle7yrin5JHR}}9T99@;r8g^VtruY>__1Hd765}=W zu>K6J^L)F`k1av37^1eHI;K7vz&&vhdB|shvN%K~8_&kasdh8U3ArK(2*Lu5e4baR zDd=g8&kEt+3W%dgfP-h10kmd4v~!M+eETZ0q9@So)e3*@%58Nk2>t6=_OKacUP}$@ z_tj82$D5+ZwQ8>0yeslUm!%=B&M!ne7Y%WM*nh$}ohbK*#fu{-hGS#1@i8Fp8)D3ogRFK&0|)dB>o=MQ{=IrXLG^%rRE8yzTaw%w1K zVWjlEjX|?IsFO4t41%w>Bdb<@;;n)~R)z?S`@w+sV5R4m4m65+PJMJ>iGW1PLR;a$ zN#=-2uu=@Irxy-wC3rH7dZk3>oE9@T7V@QVA2pd^Sb$6MF7$Ckd*O;4ldTHVjrdkk zaGX10DjN5TbR&i|{gPc@XI>Qzf6 zqBwVh?QySSeueJVMJKYL^oKe<#O%Rtm=21{k1DFosQ4oB zW8vc3Ph^j^)FDiYpo@I~{lVW(j(fO_rY+nPPAhWF{ByF-8 z?i@joVn4dpR0bo!vhN&+gqC3cM&3I_6a*15`9(jCd4cij_%e|`Z)to6WYvvRAZfz? zGdQqxgVR{@D?F$ZSkCJBm~ZZl78-|u7mYqDoC#mDM{EtHml#HcB$)tPn7wFdOljxk zn>)eZQ;Hh97>6lX{^q?I~#bxGN}7z5?$KMJzrHMP{)hn9tXeivTWd&aD91*KpDIfY6b)j3yt~Rrs*-B;2rK}UQD;yWKg@ih~OgzoGi&Al+0Xl@qGAUM;<#$ z=1EyDQw-W7y$TUoQ!g2ENARK8t;d!gK1Mvl@}|y4v)M5W*y?91bO@pqh#!#@r?BI^ zzjS@26AN3ICS)1WEdD5$-r!C1SY&Yb^G)I9XocL(!cADh}?_ys|SiN=uHI7gfdd} z%jTi?bd%T6T*Plx0!)3m&!sjTP_llB-&=q}my!rr>U`eVjy4q=kO7H#N6eN*@EFxD zy*T!HX=J3{n5N}!WMq^TjU|&~YLk+S6doRu6Wm9WWC)jLa)Kv9Nmy^%#xe(%ZmhO(5T`j7*HC_*vA^8U_dJ(V@}L12 z-fy`P2rkMLm-*5W846Y98d{VKU0+U=kj|z|p1dx}7beTd#!~7^$YO99-G-Chz1O9R zf698MyY~47OGj65IL11l)H`|E%ulUf_*A$}dlpwJmZD&?g{33OG4goire}}{pR1SG zjOP)KWl3E~{#EEvd3cya=oG2RxqPjGD6a%zB@--NTE*jO0&3Eisq3zgup8 z)L7HJ2;){mmQQLwW^ONEb6M>*jqH7kBq9F-=)*t0X?>UaO@T769*ft9%y-CNtmR`` zu8jKSgsIg{^i3HCl`H<@Dw#Txy7ANCv}NOK<;W8Fd$Poe z_uGm)=liz)<_Ug5x4OoxJ=D4Cne8cR=`vC-6)fES%d)(idgfaW;@ZK33bBXv*WSBnQW>SfuagQt zRjg76s=F}dS5km6HFg4r8?-DXwr3|%E_89gg}|@h64pz>M~+(zWzPs< zCAP@fh$K9&Uf<45m}o;8H*&!A{Gu!cZTigKAGbT$-+Aikr1xDQAzK99r_-WJX`0<6kC5#v z5NyfONo$!f3ngcW8ti6>+>}CGH-|y9Th={nKi@F*5--bVbM%|V^GMgqg>=u~SI8*H;*tazFhPg&*79J9cPHp9+n@<_Yol)@s)cLo;(9^S^M0~I? zq6~orCq$Bq_OV~ghz^%EWLn5d2vd~p;0X~vcUR=zLnsI=D+^*F>7LpvhyA{urAS|U z^AcuLXdEqWCylX*I*JReZ42Z}3IKo(79;Vj24~pBB*QwZMf0?11J`tl2oBaYvGnI) zGmHPV4JY<^+7%7WHb@`>!Kl$j&HY>%UnI>z7%XEm+G}|SWWvhqTwC9TtKH*E3?{Qo z#iCzt={=b`5olAS7dOwQp|8h`;yvvl1qnncJ>f|}8DBdS8~KwC`%@&uwH>DNQwb2} zmso-qzH-O%k^=R_5uNlix9(lW%HMRDj5b7y$!Dl(IfB_%ueECUhFZmRF7U+cR-zlS z+4;dt(0nyFL<-tat{gu>)4T3JM5#)@ZvD}k{9EXPs&19n)ZP>bExY^3_rASfti8EOF-FemWT$D8$v;^70Xgu8wc&3$58Af?MpJWOSthI1A8 zneaU6wD?V40H`S5Xs*PB({nwUxnA@$MMPYzKU)n^v{I=dJR!5=EJ{fbKf)nMblfopI zEvkLYZPrJP@3jXdh`z*p-bnhHg?6az9M64}xxXypv-A`1BM2iLg?zT{iZlW@2eJIo zh;|lvOu+fOa_H}mazE#h`qUfV+LCN>!Gzbupcp{PPrAIe!%4i`?PUPp9aLpG2vKf_ zQemA)iLuyC`{^GjZLH)MhRyyR^pF*3!2(IOgGwZHW#%`?k*2x*Z&P>4d*3I{J$Xi} zfmVOD;5@#Ic8%NLHXpOP?DT>yqF6&^il^)D=w>Y^Pt?pnWr%+b5(tBAHBe#(b?eK9 z7?JpmLF;4vt*oOr6p@v2q2`V<_+1aSTU(vw`2wpAmDPCp24@U~IerylT}Ph#zWL8D zxeV2u+o<+Bz>8K*hM-%kespm?yck@c?yfhZ7@>UJsuQHhRyLV+rTsGdo5GYjgpg#Q zF8zL3HU+iBkgWrY(e)Y#w*;5Z&YtxE01yBGCnp#F`ChloHU}*mUDBn5AXKOy0si+g zNKF=M(TJr*qoXI+3`C&KfS1U)=x45C>f*y;@<&Q2?L@-@TYz8Zr7QFmGZS%tZWq+! znGd^I)(ZyIa~C2#|1fyobU7;{SJFg;G==&=(MR98&@orySZZ7douz^) zd@mr`Aan71UFi}5eBd_|osmKYIzE^@8X%74#4!RlE3pZ>Uic4#@jxTXALQjpA9pqh>eN;U`Uvi_f0D$B%`Wf-YcUp?r_3pGQCzwv_UpF#;Fw4q`I<(@ML$}@k~4_BmEtAa)18}AfI?@_nTyab>vhRc zd?8360DhTuJt6(Aye%aK$2!DoPac$4p5xZ?;b==7)|x5$MtKXf(BHC~am~G{!BX0U^H`vjpwQAm3ahH_YS>Bw! zMdh!C(&Z$yfCyzxgz2$_>F7xADuD|tQbk!HCu)u4K0t+H=AxIE2*?jvJ3Dka*_xOj zOaV!2EtUA&F$mq)CRsimv80>z2)x$RBLnz=&RN~;UP?b{_NBDFEitNzUuIUlQfNb= z5%ES|$%6CBq$zr^LT_NsOQBkJXT?mR>#Li*#@>SXxkg){>TpZ@Y~o{YF-iAMXnn`M zV#Si0zYMPvhse__+MqM{*(Y2dn5T5^`#2JuG^L>Iljjx}8;I12w}y?3Uu_>-y&r)+f#noKe@i7I741SdJD(43`u-oJF0?P+!=CDi0WGytOZ*>sV5R=lKRTUxx3u ztSTM4dj_@F*>QGIx!R*7eeadMOf4~$E{Q~EgzlY-Ur-Zj199FY)F|6o^d$dn2| z65Bvvd=P4*Z~HgzrHwb|*rwvka--qg{*U!WqDzr$Eyr*d#XGv{y!Yh#BISWL@ko%( z({g4sXF|I4-AUUYXyM8C;{8%Tuf{~unL}gtsu>N)%>pcS@=MEtSU+fi>)dw#3?W+N z0xNo3GZx7I__FcGtSUQN0VYlPfPdN*{DvyZnzhDG#g`M8=GU?FZGtF@a_Xnb^)40; zqd+PlRH~;pRL97LY1hsdl=JVCDBAngIC&A?huuQGjuavaVP`G?tN_gw;QMi|z(eGY zXWS~rrTbvdmx|6I)c<}0iKj~TQ)>g_;I`?<3|Hs9W_NqsI9|JspWe?z$IV4OqM)IH z;05;>oF6>teu%R=+sy){M=<*NDEO*c1Z4UO2s4K54qW33WOI=WZ^~7uFB?2%G57Us z=tq5$Zpp(}WMHOd^e(jsyGhI}fbrAzah~9_Wb~)H0^91LOyl7Y4EE{8&eZj%%oya@ zo3xbZ?u+)KCLhu;kka)V#?8Pxfk=zi2n>uJn7fbdr=+y@fPhAkHh#s6P<+@CYbESO z;dCc2S^8=@y46R_{fvf|6W`ufmoDcbx+JJT3#@J)(<>dZRxFivn|^yCmRSB@^H1tKf|`+tFNCD{ub zo~m}gf%DL+nlfRExBlyp;g4{*;dTN78{g9TS&3VJS6Dl-)wo#UUJ_~2NgtaG(~}5U zyt}WK{(L46>ti6Dd4W#7Z?4dxi`Vdj&!Eprj7Cuf_*847u`&ND&q~U)YU@FnW|yxg z`{xaQs?toJl47nZ9@9c@#OVRsxJ~F+n4<2dQbT?1Vh50=)QP#k%*0Wb zn$VYf6iAoijOhB@mm9(}4I^D0$rV!SPv_VQNE}K@=_K0iDaxg4;o`Ou*2DA?-Sz9i zp!4Z`gxM7JnPT{I&At)IO{T$f9D{q(<34QI9w8qG7*^y+mG3|=^l>$!GVBiYKnHO= zc19!CcT;w!qh8I}@a`YBQsRwNu&~>UQ1h1sB1UiS*PfI8M;q zX*8+z4l-hyoI!9oeU`pE61S{xrvIjAFrVcC>C!F+nm}pNPXoT zzWLFJ-b+SB0PLSBF5ZxlO_@cr+(55?TU_Y3Vw4|QDd9vtY4c$aKX=) z#W!9ZXt#sF+7-ipX@KZS5z(zW%mG|t#jMX3SnzvxA!|;7mT<r=oFJD)**ZEf(+Z2hY28%oK0|fWjOAp7C-USdHX& z5_JY7oZ2b`X;AK(rib6L$W5(6g55gOPiXUs0YpEyt;R*Uqv`cP{geWrZeU>TPBgN`^u0cg zWS$yS4m-R;=^-BJvt0~vrk>qAm4RA4x8Vdj^2hMdAi9&`4MJQYKoeWhzavCSXDA;r zW&nJ6RxaA~a(Zb@+!^r%=mZChW7n>}vD2V%x2e;vNx(z&f=r}y3kx*s`M9|f-11Na z%`E?61Uuc|fSZ@VsOAd{U|dN!oVHjnr3Da3fy1qeelYc`itxDbGNL#qeVwX6DwN(J zfHqOvAL(%s=xE;L6pHPF*|!8u$MrB5$_(vySA{q@2EE!v)0{TBnryS2%m*aMKnw7> z(7`1yN(yAJ4`oOd^a)OwEH;`t00zjQ_0#^_XO#Z0g?<0C0`H$!_9aP7AvjE=2$`XH zf>TIL!)OktC>0k7^sh}8{-L)*X7ccZJhelDqi4o9-ms26zbAl(YZ_(A0HrtvV+7p| z%Hv`$7Py^sP9j}k}?@TUi&~ft}G$pK(oe=1oSjKAvb49@SQ+N zU2v9=Z{*9Nr>?eIyuE*fAWv~!!+_dM$ z<4?za9OqfS5oHj|W%r321yem+!%(6#KCyew?eoc==N#CCI_?@v|Pzs*rIIK@lp?}?O z^L8*MSDAydUGS-`<#DbpP3K8E;*{C-Lp-?Gk83@5rA7zVJwCTRf#>}^cyqo3x@((HUjX$ z6?t9_Zj-*_tZd}LILPAzbrqr+z+$!vCVMHvQ~O%8&BNAc??Fgqos-a4T?oz? zM@4$CAlBT>Sd|GhI2na1|?+xCkQG`h01;l z@%>Agc{Y6CW2?cqW~Wab{% zaK^YvGk5A02{6nO=*I$jO-mT2dKt~*n9}vMy&!%N_q+Ue$j|n(-F8DnJb^3`q1hk4 zo}q~x*4u!JcnQ0iye*IO7XxnJ^q8QOYj5_@;IwcfaPzdfzxzK=Ojc{ON&%sM(_Rw2 znkFL2l8wX74j%n=EF)W%WKic@ya8&kvM=LuJsu9HoX|uHG7ankFfYymXU}ypNve_M z=+DGn1h1@6e>u-6a^2=M6NHd85Y&2)cqSy^+hhtrd$~(Yw!R!$Ix`VjS+}0&F>|MY zCN#It?^#4Kfe;&PTMWI#g>=1bkZ_nFiL0tgP&8TWrq4?s;|K1uoJemmOlKqQxKnL=q>Rtx97P-w}-2ARpsfKm z4U3&qKnU~9iDgwNH9q3c&25HJzr?yNF-h7iUcMYyjlV}H6FXW_d!VN!`6vWRHQP|K zP+Q6d9NLv593vF05u1PCLHA}4ra4O*Z>3JZhgO^NFR)<1z$*(-H;T2JvD5h9q9~M4 zlbb!zQr^u@E77D5HmwOHVxP*z@wIz4zj< z1L*L+7ol)SfEH%i?eDJX@SHyEY3!!{=Y6%^R`I^w=(`el0*e-;U%?BcfmT0 zLoRRbA1wbKk$80D0)m3qzpR(bzf$$LJzt{`*x4mFZqmOQnKh9oH}P{vJY1H4t6zGW zzL;62Qcc961L)(ziu~78Ym|}?`THRO-DKPKL|$|s*9C((1NrV1f*jzM*{+cD+K0bw zyxxq|R_A6ijNlh~+R+a^o^{Bpkl8e*{$a-ycOTBrPosyb;?8@^eOYIxiCOj>mCd2l zP$BRhU}gZ;3Bal|zWm^#PK}3v)1Umv@~gCb6JdvuG1dy=z3|LppHmRl@1>NkE}qr9 zO*4csDP2tN20uAx*!MHLs17lW-NOP)Nm?l@i}b`uzKN}Szp36cvRO6@T7d^Z9&nvq zD~$lta^M8ZVxfsE0jLJ=Bd|R5KO3oOtbkBKFkaj zq3Fnf^D-7X#K(v@1@O(4Sn;0L34Wfpt&Fg+~r*KT9%&4?5QZJHG7GsPXPkJHGMp*m5 z&RsU=`g&N_VJ@ec7KgN|m~=C&y6QSufAY_mw|t8bBN)wp8&nD@3Nqk^dG$un-(5yX zj17_MfHie(1Y}rzdf7J5xtGUSbR}~lSep+*Oc6;+>M3MGI1naV>EP-kJ8t|2w8L`s zx*vy8Av%30aF$fA5WJC1E^g}DTUHLM3eaS{joh)q=~m#!`}cf2jqc{T9hj1)dWB;C zoJPkSPy2HRGFU-0K>(*x2q+;-3#ZJUshqtnNler7{HOz+$hTy1 z_(h~7 zP62aq1#dp%$$DRJjMqS`<$+FRuCW7Ue0v650DEw! z&9^J3MYP|oc=KuXl&cMe+`{EX-I(xjf24H2h-|IXK=SNIEMjdWh~FpR=pZy_w#>z= zsTOTF3_m@Ze{5_2H zxP~+NqwlXXc)R2G`}SkGXnMsqjbpTYGCut=jH2vxAw1eIuxm9!Qj^#hlje!4FM>Y2 zyQr6EOK&cuiJ=hY*=-k61Oyv48D0Jy&l#EU-$ahVG_K4>Dtt5m4aHYq3**R2LLT%G z#%*SWa7WB?f=Z-4ge*f4tnTlM;!acCyu5@Uq`V1fREE>lDAKzvT#1koFCc{%y+qv) zeb_>TIMuGhCAjii3=%&Yc{Mr9aVW9OrE48|FH}k*ToXwrYj`mrz6(C8NR>v`a`6Q9 zGj&uSK<9Zkx^IsK}8x>$nY&b0>4XjlqKr$I|@gPvxpyI(JC^!``}#i*@f+GW)t~)GI5Cme zQ?SUJWb&lrd&$ewIX^~1-P;}s%UvOiu5zi0u?p8d&_rHFa~EY8>HXw#KxP$=AsJ%?Hy2OM%m`GRU3ZrfkgOW6Jk|DzCI)1wl+F zyRHU%+No%4H_}U@4hcO(e~$&m0nyZt+Fo1Ir#Vw8zX+R|nJc7@FwSTv9LalRE)V3f z0F1{>BL1uQrgiwr_h45f)EB?Kb~WBM9|(3+iyJ2;bP$Q0Zcg?-QhYky(w(k_)h1{R7VeUBZ%%!!xw2>*QZxIz1@fI2;XHHj~Oa1*t$(|JP)LGZ0 zD-z0u`s~bhc8>r5qzpbtSoC`(M$(51g^ z?55$iHP8*t^24W*Y)h!dDu+R2Y2gAHRykfN++7IFdk$pD?+kZm2!d_~>XJRawgD7Q(}YA71>9ITtrfPUE5s}&;qh=pg0LmB z1QWeOs`w-gQkESTnNxaqEFgB@P&LLkFNH3dFG-I{x=_CXltbE%OeY-d!0dk^0HJ;v2m8| zgghhB=saR@#UTn{yaG%(=B?bDaY-L;y%3_LuA|h3~z0JN=7}t z{ji&?2|YblKNGFazeV9skS6U+RK%8lV^>svFN2$yAd8uq;Ei&(^dV3r_qXODd_a)z zjcG3i6$CaQdl?Y47UjOd;!Un_lX!z_EfKM6XTAwwbVk*nqui58m+jl4BY#}u7f;&R zl2*@!y@J{g;?G+w@L48~Mdm=Hvy^^M_-4Ru8p07IQ&op~6_qE3yLUc}Z>N!KJ|k9t zq60*K9=ZnHux$RJHZx*mSNoGfNP?-o*{EzKnJ^QtO>dQz){pZQW@^DPz~<}}sKmaW zob5h&_LqLeAb_R4x)&dDB#JK~g&E{4_K-awf|!yE@r~yA0;qCij6DVVEBPLc;vjBjmzmj{Om6EPFC&|TueJ5nh+_$@3<%q`oVpzC{?^_Qn4bRHe#HH z{@Tl%g{7!pD<$pPVRHmipF)$h=R^kl7;*P$&zNs8i3i&gORNILArpRw4)ONwUnagS zFuBl(Dw-blTDtg=jubLb&CkCpXuk76cDIuzA-4Yd*G0(3PnUOwNTj{@hFX$2#;iHA zf7MK7PAse}L#R^pcJygBU00xxq#6%>ooIJGqfqf)g|iUor^9cJ^FO`~he}7&fY~Mt zg;)`lK$6~O8X^OIl^kyN^B&1Jq(u^caZx*y@=5$Q?5GplmZ{ob8~#c8*?9@n+!tmy z_;z#T#5v;8k#gS7wWkU{u#A!Yz`bDeujl+ql{=o=#RKx&#Tn%g4y%Ru&~Mg8eb+2~ zK`Dsv0!-H_z^6c|a-s!;MPsHFF}s8PshJ2u>vb=r6~VM&b9jUtr)qq3GCNl7v*o%v z(ci$#LF@f~XK+DYL2(^ZJsl&NaR>QxR5iELM7_+?i0NFrFQBQ}pz4AkeJ;X~bOtQp zrR|w=<{#CsBH6G6OGwy01o2IgkLDMVK}Elyl~T^Kiq(B2R&mX zoDRsZG}#2!H7&jfe6%`jS*?8GNUf^a@$ysQ5)yTcSF7Np6#e!)83HVgsAw%P8MRo8 zrvu;6*z29^_h=53Lk0i<5C8xzw-*!JldlU|n>Z5Z3J53VSZ=Nc9B?rgJC+fv%F1^d zE!x(9)9G`1V{B)AaOQ5(s62?oL3&5P-Db4=AW|2&3^NzcbBiD7)-z64rX}XoLg`b~ zHH?yiu=e=ugJJ>496Xu{25NWRsVf;9@-58Zz}N}4s2E8%?Hx%6VU_CeS}~Z4-}o58 ztvVfcibh565tAmxD*?xm4-j>z)LNMz888zBOaPYHaCYSW|DC`8UjA*Ld@7+*C_yni zj}auv3JfQa6vh$~g$N>{|Dn_Dd&Gb0GXZ<_wj)qz6D8akz7rh1!8r! zcvPAE&Kpf{$k>yj&iQLwsd2Z+iN&-|3UG!%TT64tN%j)c_|>=Efs^==!zF60`VXSX z^fNx!=<^%rGLcNQb)~w~x30eJX!TM{EQ(D8vwcS)K}WZ2xc166iP^INw*Zk3T$R1u z#hWHSPXIq=S$3aGp)K0@q6nq?{ZY7@)gBzM{+hcs7l(@S<(xV-M9Ype9_==uWhCQX zts_rz!%wC!Tqpz`-ln7<`g#{;Td7GX{W2UjX<;JAvgI)$a|m$)ynJX9CR0Ll-)cWe z>#sC$zIyfP;@p74An-8P3Ydp9JBxb*N(qsTASM2O>j9)s-{A6|K>OHViRr#s>Px2` zF+6RyQ!3A#f5(kzm_Mw59WbakC1yAzo#3;IIx#EPx&oW~5~A>fq&#m)RRFHk^6O~8 zR=nSN5~0S+t&ax8mki3_%SqPG%D>A#T$MV`$m8-}H$+^D4-Z@_1Ga=F23aXPr$-)` zy}7E(X}|nhq^@93+MT{ZOJ(V=@K=R^gu zjj!%M)(IDYU7ly3d&KWZKe_qqze{aPu5(UhlAZW;at2#?ryOF)#)GD~Gl`o$U-{Th zf#zQQv2`)u{qXn8KX$il*XvLhIb;V)Is)%k;cV@2oQ%#Uu6?+~REVWbkFXbBVr-j< z7`cIHt;Y_M>|wtkPXCP>1n5N8T@*-^h-{4vm(4!gEK0M5HlL1|s%O-dJ070={_&LM zehG-rMm$3ZoJ<7YF|gv1c+0G|8!MM{@P1vv0>73rx8NJ6D`7iJ0-tx~=lXg)VD9~@ zGfG;bZY8~{dP#K-><>TI7%DPNh6$T+nWknb4Wcl(S6B5jxd-N z{m@PyanO_FHV(@pck^ETjmKq@`{dZkU%ni2o>*kZRCX|s7uLNo^;)#>xD97v4|&Vd zPZDZ=3MsxFaimRTpEm>r3{d^0`wY zbpuT9(K17_H}G@daaHM-78w(zHLCEJSj~$_geZ-1hNs02#?Y1e(*jrXEQKlZXz|tY zSD|B=n);Im0{{%@L+Nr0X8Q1He;?^G%jaePE`Xc(tLescfZW9^A-a(icSW2cJ(Tf* z(F17Kt|P@;i&7OK+acvl6lsi7%lEKJqZ}}YiDva>L*(f2IWtx9zxGq4twV_kCqN5X zAJ5RM^FWJ1x`5}#_iUU{f>MygU|pRK-jrSVMUbAal2Qaqff@RRx9-(4@{?i^DPBfC z0}cCNntv{@1qr_&V){tM9z^ZCroI=#&-p1g7i(i_QOQRDx6?fYj=I1tbU>57zpo?Q zQIP$dNO5uxmSJYw9S9r>jNy!D1V8`5ZZ&@||BuZ#u%viDDg3qEIF8{ogVFpgX*k1U zEJgm4-px1cLjSW%%~5EJJ>3#72{Sr2PEt(Qt%$LgX<%pwU;hIk#-q1965u54Yb~TW z^u}gG`Is1(_3s;^qrcKIG}iEJ*P(gFnQswL1jn$H=^988=ySBVu;X>CV184ZQ56^& zw6@)?9J+jAconD6qKDWT?}ufe#K+v`DkrB5A*?>wC`J3x`vlClayT>}oo( ze6|R$Z{bc4_q*_l@6GC(b_Obt_Rm;L##E(Grx^J9afb$=rbA#I7PpFGf!X2jag0ho zu^TPh+>`o%A7VpJxb74=9~T7bJ{M6Cau~-D7ei%w2ktTAF|nUTc8ozJm5xeR9Mjsn zixdpwfm~-CU)FEh_!|?#rg(XM%O}RLjQmqbo)y!l{-8J|8hJgqJx5mbF^olVy9t14 zyq}Rr5kuj=90)(WV=R1s&Wos!YyqvreCfm@>PlCepQ+09i|$(wN2OqwAE>c1;jBN6 zFAP*<{sNm2ey&;nYX7&%h$`1L^}dU|4A%8m)+41S=sg3mneiX)M98jOG^xNT5QLXq zBO1#G0$vGV!-*RzqbLQCC9kNJmjz{Ts(s0G5)3zc6ch0YD-ilBdOlZQTKX)5+45_4 z0Gst6%#}Xx$L0RFi8XzpD5eM`f7yY+AUKO@B&A6T&NDiPlK*7R=$-y%)%IgmJB`=zw81jgPX-k@cG6~ptv^%W)*q{2t20X3{S z`1pvtkn7kxrrP6ks&==vrsCtBM^DEjJj}~b6nnun__}A4@Ld|_^Z>G_q#J}eJgh0Y zJrg0OjY_52nN{CWJywBORHn0Y_tLL0YFK667)~Y5M{Q0C>o9&e_TOz4C2umvC_=65 z+qN@k!@wfrK}`5_Caj;d=He@^SSt*8Q@0c&L3=?S%S%vlo4D0)d2oz!m+qHKW69<} zG2@;u^z+;jekMtfM%djx^@uO!1AUHF{&r`{p&v)~#&4#5T&RWI=aid|{{9_7`&(4B zT9><+62O!W^C`tPR@_FAEB<>*Un-oOtJ591c^oR0{u+c{)Ql`T1h^G9I(L-%wis>7 z;_7Lsr0brsURodkLdkL2S%}BNZTi6lE0zu)uZdRo>m+;(y(5S>yQhyW%zCI?>)v<1 zOZ^1ZWqvVE!&>~!B4^EQx+V=rVff7uZl-ORIc&m&e(1VKk-Gw1#}C*R;bU1M7HUL? zpSBEyisUpZ+*sUkBy~MUMtpuaPz9au>2xwR38lYD6ijwW1GUy9Y0>!B*JpB{b`IM1 z0}JIQ*c7@wENedU@-uI_1ljj@m}XD~lARiy{6*iav7fD`$r&B?fjkJ}mt-Wwo+FR3 zn?MQ=W?TaSX7v3UH>6?Qua`DZXYJ7U|9zgAG2WJ7>u|k0>?p@MDLW1o*x0* z00H1OO}BY);-tlsx6Md@^LVEXyLk`q1qh6rXj%SiR_ zW^^6rdIjM56v5v%D0V|S`%d0n@nO)}P~iZ0@uGAcozE z0ehOr2qTc6#h1x{Km8sqmUV%7h!ZpcY9J&#tjebiYLBB-Kl}-e$CxNBqASpTCHV6V zK64kZa=8on1N<`gOZnff^}Z80lR~y+65zB)huOu{vWU7yXbn@x!MQ4MXJ%y}4xZMy ziCwEI<)HavM)ZT0=`XzKnB|e~tgfF#$^j_tU`qXKv9AAHrp-DI|4^uJ@n=E)`^`~upH3lGvy&|1WmmKM=8g-xcV(at! z8(+IB*53E!(D`u20wa)5a20AEz{iev5%B%4LuN4K=mNyX4D95(@ZbE2OJapM$CSth zRj!BX#?V(vDo7kvAH-cN-EG|}%VT0?Nmt8zv^*3oC|UXqZB$fxrOg!_jr%017)oLB zPOuw2OM$Z+rfI`ChoYy1)HGn)6BQ0XX2#D-p#u*d`1OlHvyM5z0Op3kkT2<5_2xLC zLw+Pi8y~>Zu7;?zbfSJ*d8Gk6o`B2ZD+6Ui4}a&aC^r|lhGBV)ip;$dJ($KaO%H%z zIbdvEhi3X$?Kudew%h>@C6^gwsoF~A%o}&+@dl}8Ts_c{UDvC=@}>L(2^X^0a91|zcs_V@4t9p`|^xl^o}zlHMi z0@;?D52X6I3_U+*f+fw4iT0$TX~Z9;v&*#0WXMia$(e}YX(bOh#|4ulNo|3QMhp<> zJ|xfAm4>H$tdnx184a7H9?gg-LYVuvst!kkNbfSG6mdh3l+EF1JLET#!T)>TRtsaP<;v~J!jvZzGmoT#YYX%xtHy&qNeE^QpnFb?a-VX z_$hoKLNB8QJoe8@s2zdPIB4~S+U=>UsQlC$eT*Bq!G;x)u{Tr}=)9A%OKb*Z4#sd6Ne>Zv9 zw&Q=xXdoE@Ktch*;&bGr$u1R!M`{PxIOUw$4n^#tN7FtGt^+|m%I^X`{i-BFcF<>8XCkgb2M|FbZDG+gOg zX&j#+FO=)_TtjiQ4oxTUimx3@6$#$*jN?;m(=FMBO zz$2Dh4!~T`iVB1&Z0`c@W7}KzZ=y{_>|m8A!3FB6kC-K%aev`&D~>(Us>kP?AU_v$ z%XRjwg$#zW%tanqLXZ#^6=mJ+n3*-(u>rH5renb#<|CuRL`{i_Or{sr$j0fN_>U>e z2TXibjy0i6FI{CSix!*&)@%{9U)X~h)r~rUL8(B{jn`*p4z9osK%wy>l?$h`*AIu1 zkC0D7Ujpo0G~N^*_I!7mJW_QS6w^+S^rL6x1}!F)b<^!7%;onvv1t-Si0z@eY0`-C zjJ89H2>fw>gE6SvbxcBvp z#HlHm=wY~yzyQbRP*_{|DlezdUyLF322T;9)(b|*nKMCKcIvm2r50~kVMg{lGuEKl zi&?mNH{-gZ5;HImyE_6@t4p?w{PKpkhZb9d`OW>z#aM%(m+E87_36H%l+Sd#0!e@BNz#_jU!!i!me+C z2+t1Simk5eEmrwsOA3RI8$>}uj5@yqb9-ufGWf!P-2-@a2c|1o2N@l#4gzGaj}V1? zTJ~uw1v8#6wt3o3Q4fsrwcF-&FC{`wUY&&z>)?G3c_$s6S3 zHTi0mR$C;AcP;iUxqL9CO;(R6vE1&W4KJyHU$) zWdpT3_Yr*|7BNoT=P58Nq@8W4F}u2Zh5222S)DCja{)KTowc1Tv306iV_U`}VwTfV zCXP0ga|R>NEaByc=h$&t#y3=2asf|+@PR3NVJr99xh`lED76;CD_UxqlZQ=NKEF|2 zV&QZg+B3oRA)d51nR3=MGkKe6o4oS2xawt4DWT@NC&AFznQ7P7q~|`Sajz#s9-}2G z1*G2}J(54)4>1Du6c%_tjRc^qZcPuWH4AUGS&UI@2%i+d;eNVqF|Mfey<*KmrU4Y!j#Z9QteXPug5cO4%#Zp!6|hh+(J z^W3v~xm-y)##UCWi@%!VJ}Yinh5pGKLsk&@&wfq0vvkANo`AG;rN#-|#{hefgC#Y|p zrT#HaLx>n8fRZH(ib06a=3K5B{oUgE#wXZu>-*=rx8-F=@+d&e68y|#UKJot+w8NA_Qv|7#{pA|pFRnK;MWp7;DJ6j*+ZC9`Dj_-@BAA8^WTKg=m zwylqL#y5{v#$DGDPb9AXh~ItV zyT_x8C%KPf)VQLnm$;IB9{g-P+xYJC#&va{e4X(+<1@SM;g%^6SQ7Dt;(JEiRT*2Xfi3R4#G~HgXL;u>zAgT=J#ojS^YNX3#{Jf~$92T>?`!-yPo?nO zLSLk98lP*&`~I`1!4}!}qw(>f5~I-=FGQiu>5&B~7lNFY(EHeAB{n zkEayB5qA;48~gH#_sp)IbvOPH@#4B##HzT*9{V+xFHb9eB35XugZS2nJ@Hwwzeeoz zc$}>JxRN?I9$S3>8}GEov)=uNBVNH0PlQ$THlBO@C{Ji`y+mDNMZE11?;&Dn?A*>1 zh?mOSi-%X@xx|meYU}Y_pZ3HR>^%3$lZdw#Pb+pttkip)#L{>VTzdq9cuujN`FMA2 z>G2MT6U5$pBk|T_f5r-qJ`1ZJt*qw1X zjVq0J#P!A+kG&mhE5d91&sZ7pzVEo2BO+Mr$4*$;<3C3{n=4jjd`i59r!Eok`1{yf zyvf>&T^e`LBYN-+E4wmcC_5_NIXfW!?2K4_#CsgE z2jVI@&*J^Y{ju|jKb1)08jE}9ZSoYh_#9(n-2WXhFiwhCN%5rPjmGI4i)&?_$IWho z^KWpP#Bat*W7WlajPG@KM(~V7;No+6lf?1(Wa8Gw9mjj$*zfTZaZ>vXVnrB-;sA}6 zu*YxL_`NuvV%L;-ubc|8S>mqP;6%*kXWX&IdD`{Hc7&ACJ8g8=lx5@kDvc5tQP4jG+rB+IZMCvGOA(@Mc>5oX>ZhT5CMb z)%fzpvm^=~jh(ebUc>1ziFYk>rT7o$*yiaL8Cjg;v1j5N;@{#)#oLa1ZDcp(CXv4# zp0mV|GxlhSEGTlN&bb+JAg(l?iCI;wjCelry>aTq8jC+6-?(EXzdV-4IUUzD_%ot& zoV#RJ@twSX9^Mr(g*1;PxUx@pZmzY$Nf?nZ{+s zRFIO!K8ctT_Z)dz+}_Jth`SvGlGp>0ZJJ|6UKiK?#yLv%5OJ2gm#ZzDo);N%eEJp3 zymj{86Pu)U|H&Hky01b8Nc_3TVdI)O3Auf;gBIVzD~P?wN}1%ANGKxH+vv&>5y zyD6@e^||-%dgGLhNE6REVqbg`C-Xsq!&w+-(Ge^5;EAvY$SC5*WAzTRu{a~mT;rZL zpJuEubF6sFu`=T`+4Avoy^=AX#JTvUSlwUG^4Reavm+{>lOvz?#|n!b(Wd9?U{zI; z9ec8*FO0u?Yyq zuZ0_tjQ338=D9?wQ{D&wL?CkKg(Q&o83_Uj2k$u!%t$5I*j7LWmC`f93dtvXl;SZC zAC6Vhx455?#|W#5Vy*5%B7;y_2_mFDQRcD6xUR3y!2%+dFbNDPEHDkBCf+sB#-u1B zv9gF6K?d$=Lw`1_cg@CC7a{g}C}bS>6eo@fHqKl1N4^@#0&k z+T)+R`v^{*M1p4+>)!*LME3xeh*j4CLP)i#Cu^jWofDWcK1$U1X;L3zR1+lFNf&va z5&j}OtzZr>=|U`uw^9yVSeaZjrylcK|^Rl24Br;IJsc z*s~mL6zC0*$*l>bMM@dVfSjEQ;9)OXB(O~Yg?3Wb`23B88(7D(mxPW4w*VVZM#sji zKwy9lah2?JU<+0_kcf$3VV5^kN(%6cLY8tfB2RZu3<}`b?;W5~K!GqF=`gD{k_XZo z-qlJ~&Z$czj?ajv3P9!E11GE`@9}N%kb%tH)v;3J6R4PYbfkfm!_dgE3pF&0f=Kfx z&tPM9#r+-vI9ms9yeLNFlh3$L5+~45kjT?GK++vWT&%X+BAy6wXCfTWD-soAaQt2* zDDkW-rJk`eR{x}ACk2Z%n8b)z!IGvBt8pa)a0g%rX=;m9k<$ZUBw`-N^eCC|HFhou zF9j?QwNVL7o=jXSrLR{@Vm3L+Vx<5u*43YSIX8@=v649#dlqL=ItYp$6eXNN>^)*o z_x)3H#O|p4Y$F8TL?VmhNWHlFxKdyTfGUzj&O)yBz+C~{fI@&VmKkX6FjtCgv4&-{1sCR)&;vO-RRT}#} zPJ#G|TPTnx7^knNxT_=HU93W?QOY6WWxS7glBB|xm2vNd_px$%3V7^5t~`lKtgph0 zE2$eRc@Uo?*{#4{MJTNkuXs1H%SdKP>4}uw7ZB$|)ZkPkmYOc|h=3+zpT!e-x`}UG z3EvlMo+u)a7GEeBdBy*Zf-+92*eyUrfZ9~Uapj$-HfRlO#1#@}K@Ae}gEJAh$TtYI z46sTvPGU$o4)izykmI`xXKUOKJ89z{D1+m3tGRPT9st6@X>t>0Tf$eAusr#A<77+} zbU+-2drFO)vLq8%o`-N8sd$`_0y$u1olJt_Ce|}04*+>LvI8#1%AqD^)sc-6;WCwERcKvJ%bX_tW={vD|z=sk9?PX z$7fEU8_M6PG>C}tnZvAVc$O04I_Cj!53!DtIIeE9;jjba0B{f-Bf@mc!DkRDSF?L! z#V#;RoaIS!=kZA#yFg+*y$WRYrGd~ zmAJN@#FNK+T*sph1(Lk?p*TB8xw9Uf4P2*HVD$cnH^cgqZ zDVT|SaR-H!XA5AM(H+!8asMw-j{2hV()e`Z27o)jhcL0NkceC4YcvKUlZjnK?51@K zL=n-B+<~3wJyheWxjX4{wg5NwXsrU&m6%8!%QNm^Ac89$I7hg}78+1z1A4Qziu?hl~w77gq##IintAC(r~xcn^R$v|?gi zQQVThFA4I*-g;?Ma$dBUn#5=Ya3U7+QHqlQ!pL{!YfvetiI{1qwFb zntRo}VdsDZD2w+P-wFKY`>=&UoFU&OQ-}>Th@bKFqHY9nuwtiITiMNE4Y57|oY_j& zxGvD`6TN8S5STkzjQ=4O21H%VoTw)FccS>wZRickib({H{YDfzZ5ZVF_R!3u@nfz? zj2}SmY>_xc*<%2O0PPnmkrUPy$!2Z4kmZos)4ZCTH?w7}M<%h;jF#|Fy;9D&LiHK% zo*a-f(t49Nd)(WwA|uOhW}H;@Hd*7Rw+67gS${wch|>%hQ@C}v9Z!_chA24>G>YMl zobFfdiW-qK_sUiVHDR}^Ak(O1!PR!qL5>O-2(-(A(p}$;*g$)7GeR`m#EmD-nP-i6 z5hb`&L2pPEt~+vz!Oq#ObZ7-WWJbV?#1ozhjo*2Ug!y0bHNHLLYh(^%n2msuE%BQy zQF7wdTE|K<_7QbtWDJAdPV0^~Jkj!@ZU^d~n<&+4217%)82MVaQObLXtLJdU3eE|j;BI|O1OsDZ_g`RUHav-Wou&}ABb|i^P`g>k3U15V z21&F6xQMvG$yM4-?9+v|idpYoZMAyxlC2NPGgQ;lMkBfYVaTHO2YuoY2A`kPaJAZ? z9T?|hTp>R%%13Qac1r#gZ;f_ACwHMT1}bJ%kRiuYyu{feSL`%QSDSWLFRPF>kc+Gt)i+ z`(U`1o+0bP{F0i59Jfi;IyqZnjW%|H8P^f_u!U5A%9zo^&17{rMtR3v)CjP{F*{ts` zXb9A<#3qOf+;7`N)L1W3$;DGRX!4o^7f{!%D10+KM^qpcLo<#A}tIcwDESMs1w8R?W$fj!K0gE8g@h0AwG5b8F-EiWcm1-Xn z#cr0&KHZ5);NYBMK2KCD?JYN2VCjL@FSAkQ!O4#BP@(UIU0RyGC@@7A5uAr0KU=i_+l&YXGU> z`P`h(;M{amBSLgfF-~}BS6wn!Tw{Dk=NyjD*`bz@GfTMPs`hMUQmN2An)FA&KNp&s z?C%0{CnJG1%4&qNR5|BgF}2l`{AMSBEM}Jpk_)GY&3QrJY9C{Os@tfw!N_Nxwx{oE zwgTb?5<hUmkb_MQ0XY+FOs;4{JKn|&K{ zRh}KYfrhhn=Gr9YMa;d7l9P8hA!$-cS{xDY+18aV+Mt?>Sbo#qq#;T+2mOvWLpOkC zGjWgR_=ndrY&N>Ab_yICF}FWXKY*eC(&5t(dRySuvW z9k8PMv|?^vzyfWrfJSs81ZW324Cq7r8yOD!GB-Rk9y#}BPy6-kP!lf4GkXT^AX zmTr7g=Uj$#NFD7zs4-qAVV8?0%`vs#V>joU7DK6#E95Np9 zk(3a2Akl0NdtSRW=@aPQt5Ki|>g=%LNnicPb>M)`t@i-znv^r`qo;*ZH(2a<35zY85 z03V`|r+2(hJ_~f?^fW&}?!X&FQ{SXokcrwU+1OZALJ%nBT;K8jsb5JJsIA+F5KJ~K z1t~F^c#OBi-DwR74LQCuez!@UyFt82=^#xHYg{Q9rzh7#8^>C=iKs;`I_W?_nmO%J z(~F=sIQ&-n)goBbUa@Nqi7%WiRI^+eyMbJb{Fyur)P#UUYmOdmH~T%sS3cz7nP)Hr z5;_wrXklDE-K(f@i8Az`sVHKNgJ9FG;>?@&5T_^%6q8+4>ktW{`lQ-9?Al$D<%G?R zL?-|(NN=o)>S-K5CH0VO`+%s$VFs0*DAjwO2y}orbK<#icF$NpoZ?k_u%Azs%nq~N zpBZIbS>sf>!D^((Lv$^?8_70sVK7j#fm*@W~nc!Q#y)bn7-0sQk-n$4S zF+Dz&)yYbzb`dG;9to+g+<4Yh97LvV+8e1K@U4QgkXN1(8rjlZ8&R{PtSo^()(5qL1nq8{t2ySubD2mC#D=N6!2QKBj6Gm@P}9k3;xgBlJX3hDoEL`-4_FLI10u+>hLv{M7Xo2f=tZ^7=Tgbt zz(ZjT3}HEuqXj+@6`hp7)v9}vyT`XZR5WDhpl(p5IIEg`etHxUTiIi;?aRfpfvSU* z|I($bd(v+jwHtpGoA*v+EK^h{rN1{q_VG~{8tyoeWukR zl6LSaIT6?#)%3`f4L1TrQ5Mpwu*T&HujE661q>Mkf%h?GKtmvAt(i$@mS2Qf z$Q3y8+?$o%y1T1yFsM#{aLVCW$_OdMRZ%~eu!gAzV+Ro9 z&EFz|(SZP~q^k9e(2L;=@SV$gSUpA7%y}kV@8rLM)k2GG-Yu-L7l2P84mkyxQHsnmyoMKV*O(AE)AUJ3zLWFK~+$e)sNmLQVx}5s| z1COyo&1>nnAl{(zAa;-(fKJl8sdQgugpk)ab9yqQh!OVu`5Dei^7gw)i03n!>^1Nk zkSRnZ^yk5)$g$|*#{VvgXvoHIzn8M@l=-;113H<7OsvPQ+$s!V=Xla-6VT($8!=aV zluD#{e&*U|viv|~%;r}aR747Lc(YHKFc6JD5ffso5!tL4gwP64zQSpKP>>6N1lpZG zMAL^WwSn)GUBdK94B0(UteGA}eAZvd=i$C#eQ-wBwwV(vXqw;;DVTr{0RxL-VUsxq zH)eb!Nf+Ea_vdA$NheTFgs~0GjJ%1823(qM!LS~u;vp})*hK)S!GMtjWluJ=Eo=Z=4Yp8MOftUvKL z_qKlb{ru+Vr04#0fAf3!^248hJnp~D{rCR!pMO4n{0DmO-=6c^KmYmrU;gd8AHO`` z{Cs@*?$1B|@$-j&yq`aP_t)p=-zDzG%P5dodxY?9B1aKui+nljXgPl}S8QA(j z8v%iCO30J2GSsV$Om!y&mEsu#s0XA**ds*(=9I~78&L?z6y*F|>B(VjdvzDkq#?PJ zHbLnGtVTiFP$cXIG_JQvK9G&BVoFliCrI7sGfY=Fro<)N>gts)TLE(6u6H$vl!^~p z5w*W_WYcyv^OkHuBLL_XtufbC6^@~BmN-lsNDZnR1y+NCve~Fiy(EWFv7w1-6etE_6p*L7N2rN5#CZR!Z6!iF`&)gp1@~*i zWEJc&nc*NtDT%s{MsUQ7DuIr)kSk0=pejBf&_N-#0%0|ELbfiT0uAYiAGScOic6|F z!Q*O~E3GAtSAns+FP~E5?DSs(BKRU<5 zT?WtzfJIZhsc9?fXpv1o+vrdgfJfDP4fR=^nkYOs)!wk4b~JOmIq9s=U?1=Xcbf;V z4JmdNZ(x~4t=T60CmpW?zpv7CZ&UkCsu*NzQhtSgQ0aua7xY6aqInG~03nHVC()Uz zUMM0?3E{{$$cR1J3}tNg?9NH>m28%x($Zk1!B4Ai&qd zq{zLK`Xa~=0yHbYlVmK`FU5+wps}fVMs|UyWU&+lP6d#sJfxh1#8R93@|p!uUSsr$GrIa3PPOeQME%T8QgkCF_vf+f?Z^yE?FK z{^X#|fPP6D(p1CFSzwb~j{=BJsD%=ef|_MWkSd0^kfI_Hb^PsDSHpGeCXv6+z*pHq#HJK$|;J9NJEMa zN0gAv!!relYgsKHQhKErsD(T9O4x1LQxw>Yk9B1nwnLA8naimXv4HxCXEa1;3?-4m z^;HFg(dU24A$>G(yf9sudR36q99edfRGXZu@^0{LJlY&Z7V>s%~>Hx=;i1$DG}5Z5=&Io zjU;Vx&~QNy!UALmNL#r7q;R8RhSKAzT7?RgOtL(9)BF}R67JPK&?PLbpSRN_+Cqy` zK&7tXgnml21AH=`?PPZfb8KZ1bEh;M1O&o~5Oxp2gfmGmu?pyQ5%Z8by=o&OZW12= zmV4SYY<9HR;qpC)szHe#cen7SKh7Bp5tw2US{hjk>jJ2Th6K$~g$XxMV(iCV&AQ7F zP>1%v1zA_Scaxner&>_q+LY9bL>P-A1sBb`(_I&6}v8$ThUF?xL+Il8BzK~y_X|RMQV8_<I?b8rv>c3Pa%&gu@r{2&23;GKt|5aqFn0%F0>%D0fy87e}T+A$#qFI z%=J?50ssRc`ZA})Y31UduBe)#5y%txO_&Mmnj&S5)d4|fmF^D^FcZ47b<>gdvD~Yg z%a(eTb9}P$*b6-R-TK9t0>G~Fwt7D_WGEVGR+1$Ft=>cxVjj*Rs7nPo$jNz5tK@J< zo0~06Xb`-gDFvVX2?RMk+1MY4u$lQCYXqt_Dq4U)vkRX1;#qP5i|aH&vldVcxmXhp zH6s|eVxwEgaN52GumJEu)PYDxWoaYKMg$=+ted6BR&6>^B) zlk<{Y&>HpRDH1_ey%Hp>G+hw@6o&K+WqaNY*;bOLmHO}>2v)0vr-EYKhLu`|X7MjP z)@%+8+pT0qNan0jB?N6|){AZvqf^vUouzcKt9Va011SVhy+0I-kyWX+8_#OCbbx6B z$q1{SYMYTAE4}{EchOu@k=2_Cw2+Fv*BY#Yb ziiS&W{}noI4Tt76wBvc znq)>Kr?__zQ-eC9&(P=(JFIdTOnfX`HoF0qh0@uBu3 z)5%Cijpe@kXF$pJF90RKFU$H1fAiyCemm%5=)d;;-~aaf z<-Z3?{!eh^kN=@`ALr|e&TOgv;z!A*Mt zIAu zVTiUEQK|dw^1fbqCy$BJLy$x5V3U+`hwTWPX(z#?%>}Py(lnEpT;k>eRr&@`md+ z2re}h2Jm7&r7Gcp`l@TtLJzs90y8iYz~e@DZ52G%<%k^?;*>&^qFN47nv4&mBXOD?(`R@`A1i%9<0Y>NwEM z!?}{-bgI+C4FI0n1&Gkp*i!(w*Ur@DO-=PC>K+3n-E*~(0FVT|X3|n}-zBGn{OqeO z8vRlEBvV7Pm%?eR7H6yn3&_sDzpfCCrGONLW?=Wqq$K@=Kju+Ea=59y>G}d3RXaXS zSneT9O8#%r*v@XEDoxm^Xh?>(H?UzT;6bX>k%5pkU&-o_6-k6Vyt) zX~Lp{8pRn;{PZf`mc1zTuW|!L_@+4o<~rSDmHi+*Smkhm_NS_aj@~9eV0tUV+wbbETTeC7DS!~?3CssUlY+M~shtI7AG z2N7{oTeZ^&Rz>{p1V+$MQ`B(@+zq;UU^`1mQ)xO}^pK2|s}c1!eNM|XcsRsN{3KxG zQkt{n=}G&M2QT5r<= z@q)WR-%Rc}R{?u-189%|1Hf|2Y(d@u>k#1ckUgsDnYJm#vawsBuX0mJMTO^v46bw< zkPm((jhtPJZb?HJ)P}t0G)j^|@4Dn~0BY#%Z8G@K>D@dd_*51itc#Ma6BK~5G9Fr}Sn z4TI#Y(i_B&q^JyOnzdyY^0LeVNIB6}4)-#Jyr%$X1nUb}4rNxAH6l=x3@KOYsqS#G zQPS=0!ceM~*E=k1br^7UZD%y~ps4a9f?{|jD^Ldtz`JgS4s8#S{8aZ=MKD<*RC;5XXA)FS@7C7^)!boe?FcWRzxxF);F}T7m%wz_yngAey zq_vPJl0C7b$#{A~__xBx^>eBYna#U3_l?mUg$C?sS)zMJ4UK|MlXTu9S`Yx+JyTOv zKabo@vY`W*guG**jqTZlaL*H|(H*GZVSTi(XAt;{Y$SN4^!$e^J-d*Hoozl{Hx#(U zFln*4f&nsZDfgj62mMDFb(@(7O))^wmFMZUI?VzA7inYN!cs#e+xv;u=9W`?FKDnM zZL$Q6rz}u=JvAYpA$Lr-KAU2IEnV*)Sj5N2XbZq+_v~F%mhajJKSI^y zT}4i(zbWetZqX^^#}#&UDY)gJ)L9@b@zW#QWtXcN!0yl~2&iMD!(P#Qz~SG?s(?z> z3j-jk)lh8-gLPF~v#W=e!O7B+rE+Mzl`Nm8_F@;xWe?c(r;ZpO4=J>2wDaKcd0y}=jCE2_r@2y3t1@zX7B3ztQkqbM%w%!J z$xptZ22gz=%}LG=cry=fFm&VREjd4g~yJe@AuT09Z*8S)(}6?nQt zPR=dfh0Y`}dKztB)H#9=Ro4Ub>chMRRwo8>x0c0bx8&gP`{atlE&%}gXVAj_{|_zv z7Jsq+%HNE2y^n9#me9ht&#yoKH2!|g_m}g>zkmN@o!^(|UxO9^6=DrV`FkHxZ5&r5 zWcwYfv0TdmNpru(e}W3b)1mJF2dL1cg%zo*EYeq;9H{|}2i+A7UP*oc!PTn;xIuda z`mB%sgLIQ6^pQ&{xP%@vKQHLCM5Z8lL4-)Rlas+}BQ+&#_YXZ@TLkF5ilJaCxD+4? zH6sTEy2V14q@0d8CNy;7*%&(Ek!~RjAKA+r%6#@NbjN%@l#-^5l;hyV z+@u&6(->W^CI0Ho-nEgiFGX?y01yBG0QG%UHH1ea9<|z#QHZt8)L0>q2Tvw3)B_+re{I!=U7O1tDE(*JB^|)GZ$K z71CBygO5XIdQq)KJ9^Es-A|m0NC#UUJlZKhr zc2!2q@hK_Abh1Ci(ol|=hYV|?ARDEyw-=-}&d`;92tB~ekSIoPXpsT1+4ZA*<>A52 zS!*Jy&}!r0M$T4rEH_IBQ%@el6yjm!fc46uVNIBBR7GW2ad6L|%uUMxj_b{2{nSZ! zYKC@TnWgXR=JQGi<7R^Ne4O2f)&*CZBzaG3hH4BEBs`O}QVm~P2@Ojtl2pZ2UpqMp z*g)xVh-7ynw?RC5+sy+9GvVk%8ONH(MPHIXLEc3wC0_DsT&3KVvP3Jo2>JHix;kl3;N5o@oS+3k`&R|OWNx{|iL zJva(g0e}?rGU=e(%VS4(ZBd>nxgNs=5-mxpQ|NTs+i5L(HAo86{GccwA`x7*S~`Ry zk|M3(M57QA9eVM=7Ab;&J7M8G=vb~=nD(*)!h} zELb#6BL6LCZ*?>>8GwXbosz8af9Es7P`ASQ_bFwYcV;d(- zJh(OKs=^w)?=D=mDL|xE4wC>|nIcz0#NC-Lt2FRxiGJHHwt)a8+g>TcA1iZwzZGCU zX`iLdnudl%X4+vIEv)*nnz=bGz_A$sHgc*SZGkj1MD+UMADA7|m{KH?@v|wRVTE3Z z8sNboT$-BI2>2o;Akxrk+qL4_+=V$WVCo-=SM#B4>=sC5f6~uY& z$BxMvC!U5FcnBcDVoqBog$LL~U1pxUX1^51MV?Rbie-p!X1nt+*T4dcnE|i7W9M|( zHX*vSbi9IVBapl}O#{=?Rf*^_vrOM)610?W!Df@{?i?X4(y-etP6=4d*s6Ivj3yu< zI2V9=^hq`iI_USpp1_s+;dDqrB2SyQ_0{@mvX068ZvkA42(`LJI0Cm&J3HZ0a{#Ab zFbhGuHT}1ds?;>NEZV8A^qF-!CsV(ji_$a(GB@XKPNlE3inIpk`AOC_kULJ`6?j&} zQ5X|iy$B;~ad9hl1g>2vyJ6ERb&@gTN|K2@^jrr%tSM>M6j!(oZ*Z;+spgF&M?MM6 zJPw2IyB!~9Rky~7Wq|= zz$JWU>_RbsgDscbTdlSEZY`8FPUh?|hsA7WW+TWaK*b4%_>g;vMWCmx;;UN|yt``C z1U7?WK*P)Awifp$y!vF^ts2l3S-7-oo0C2`4-eOZoJLNqX7wcx3D_CwM+(l!de*e& z0QjbXBP;sS#t@Ni(S}t<&nKIwhLkx=1II}cRjX2)qwx+`=OI)LE$=F`Uarn2RJv)- zwYvYS0FxG4@*|4%^eVp#DGY^aF~gf5b`w*eE-+fxqS7IoWpGEZg+L&;882y1ZknQV zHVv&dK@zC(u&k)Eb#9C}l*YYYo3?J8T--aSJ-HB4e!0IxrrFR+op%44{BsT0$uXKy z0kcZ2pkb9enasgtBLN=;HApMLbFt91p#Z-GumaOnz;MpQ-Ce=B8uzxhY| z{r@8C`A3b<&%gc%y!0@#XJ7htEz9w|_lYm@jDN&e_4oWQvL0!A_gBtJcG!^8AbZI{ zR=7AzNF&Q_>F`l?ZzZ%lUdm$>FB-F}=EEl4QsSXf^+|D$MF9Qu2JnNghJ)quNVA)( zF0WX^=u6gducY6I0hz<|d98+MUf zdw~uT%fh(%30CC&Gl~o^LP{Z3>~!r&awtXhQbm`Wp2vK$MB?;rA{6fu;8CGM^MhR? zP=+7@%B17x0G0UrMYl4&LM$QZ)S!?A$+oCy(nk9#VN~&gjSk&8Q9j~SL=`vnoyw6z z>H3C%YAXNe!;p=*gTv|Ssm!kOc__m0tOr)2^xsUhx_<4a2{6FM%s@7E8qfvrkRk^L z4OUa^eN{cWA+>HCaxJ%{>;ng@(QUJohGeS?TN2JMpUIov=#YgG%ZNemlJZFa4=I^V zNTnv2s0V9R7dkWP)Ggppa+3t(C0*T3sHRdQ2h%v956x?K&`*wdiQ6~eC|;Am@pKI7 z#rT`>18Q;^po`i`K~pY(>2B#MIT{X@!7Z&@ymA!kv~FLULawJ6<)Dtym-}fSZ>^kT zlY#*iY(;?+pKXfd4qNCoDF`$1fSZ#JoB#<;%{Sx|JR?Y)=uS-4ijEE}Dyy4v5cKJr zg`Uh02N7}Xk!;Y3XX?PIn;|;pLq1AZ?q|2Q$peF&ICX3XtM58_n5LKRf#~4KLw*k3 z6$EC7uyvJoPruaO2B5I@Di1pM?HN?o<7QF9hbI*ic)SQI{_)m zF3EnH7OuK8&-7&*ro8$;Z#rt@kzO2Fa`~L}fkAwwt4z_$My87WmuhNIy94C_-hk8f z1nBy|vu1?NSt|}~gKA14w55M?q>$%K0omP0b{qBPp?A!0`#7ydKZPL2ONDu-(x@PI}Oxj&zldlZ=M+RRpqTGD-qgM2eA; zudZ()r(aPMFON&u6KqpoNeJ~bofv_&mX8zFVnV@lePv=W7ezos!57TK$4L>_bmSIX zPIeSvx@kF#PJPeeodM?wStAK*dRia$N0;V^Ej8dI!!<|QIbr6uyeZ1+st$Mwq;3i_ z&J?l8iz6y2sIX5wEbUgsR++ZuAVu>cy;?|+n^SNEH-Ok3&Zi@yW3}L;NX%CUOi^ZE zU7rIwfsanSP06gInDDHk6qXSGIunAE-|`f{KnfuuB|F9N8e#{LrhJx0oGM zoHmHXuHQou3q>?ZA_es&M=7VL$l7xEZ^?#%0R>0|%*#p6loNy_nS|<9|LFTNb%gFp z50kkkgGvSj*U@ws+|reG>h9$#VFf|8rjVA%nG3899$ed7X0sT0-dXA?1y=^jXoT&ship%*|OrIdLdkc*S!0(m#91 zQJP&+zub+Pe*J($bi?sTQ(U{~lHKL+l5+u_1KAvIQPOBm^hZbd;yf9gX>t@~wi2fK z(vby`?V?9-3dE>YE&zg|oX2t*WrtkXRqYNulEXpfPFn#7MX1g> zr``mxz?&{JRR`D{|Cy>qRxpwT`4>YTw4-QO_c9{#kuFPSql`n_711s=yTu^N#le?V zh9z@yx}Ij!j0iYo%KF&_6RW&MO7WC&)QrS>z$v(jr>e_uGmh!c+gv+cZ*X`JIK?{L zPIpWjoVfp4#L0#tbjrdc8s9cz^VC^~QO5t(Xph6zf$6M2@M0;LL)#8BO|t>LAQ2`F zC5`Y~obj3B5Nes~cgnES6BAfTk<#gT0mE>&m~_q!*|kw#rb?4NsK#>F67aRP|MB7& z*&=|=b_jFA7$a+z=|OI&=3ucU#j_#4RhcrdFeA$l@{s={a78}AX>sKwCyVAOz_}2= zIbCQT>MFK54ss4XY%PPktw1LD6g>kK02ODzAbppa0@DqjoZ$=wnNsrbGX5QD&7esG z!d)rz9~s&*$fcf!rBswjvcGdsN7wBO^k7Aa3R|-n^ScHIonXfBsWpia@EMiDJXM2~do;yo}C zM3*b&a!hg3@sGxqssaR0tam(zjNG(drWA}5H3ym#;J@zF3@1i3o2z^pZ2rUX_Arst zL69bdNip)nCNs+>OEF4KS=)3F^n0=`cgtCu=^bBXr&Jl9UEe_6L%TMvyOYo!o$9#b z)mbA9Dpo*fqXU-qY}xEP&8xD7&Y8OkS?~aLm4S2#R4j$SQ%fvj)j1y8$0@*Sb|=pe zOre-Ryg6G#pC{-f000mG0K09)B|Wd%{j34SRR`o8oJ}`xv!E*=PvCz-A@jEbM(8SbluqXTZLGZyfF77Ex8S?Gbx`#Y4o>dhf2e9UhH#)GgsL0u)?8;RI%iSEi?cmH*7U(>e?Db*e zQ{SYA>Vb$mahLO4aR}+FVuW1jCMwdzO+QGJiG3&X5Do#ZarILn}h7D&(ukDG;{RfMx-}gPkQM&%MODJPTAzezv5vJ z<{ZvCNCTQ(9yadimve+xH5*`KY`O025vuva%%Es+0BTDXz1v22PM$vQcN+5`k#?q0 z)msp}rFreIGtf3obf_$LeayOSX5Kt>WZRCh)?kq^oWwHSiSnk72A`K^^46Fea;`{&BK~9 z4JIx~TXMVoBv=~K1e{MvMI;-0wWqb}%m{ABS-eiY6vVYz|KP$^xh=D~hP1aQsfwPr zPEOF95w<>3Sx(ICU9ZNnwSLC9tK4u51bW0NrmLMpweiUG(98GdRC+ncF#9=qlXg=+ zLf}jO@tm1g<9F7~*dTIj&Ky0gR{RuJu0GI3qv%~y@`FD&F+jr7Gv%vK`v{O|;Og>% zA*hkB6QM8;kmaks1aCYz)6i-}DlY4p!&wtKL64u}{etXG=XvdFPNwEni^Ae$lMg!v z8Go+yWydN(XXasMn~`5Cmh+ZY)elq~HWeYdNs?n%m{&~igXbp+(3)@)WnAybFaQn#J+J9p>6bo(X6%Jw#Mpr#j1 zPwAYN2Zy-*uH)%u#-8YJ={Xdh-CXnRA%DQXm7F9MhVSG=KDmm>= zH$wc5tz=1wA7ja_sQxnpYl=d1Hml~ta88;q`*5f*((3223qj_?8!pDK{QNF;X_H{n zRG7a`fZFUKI4<5Cud8+(oD%Lf%d#ulv$@0w{yu3tJuTb7y4!~>fFqD#IM<@0giCtYRI3_ z;fRuSYyd$(G*Nl2;2>VBk(&)Kc4qsO=mA?DPbJ60*^HO5a>dsQeKL&gL2 zNmTM6Sx|;R*tO+%CKI)X^ujwB@-jol=mY`t6=4XlAGD zsB7w@$0sd}ai#MCG6xVP4I8Jfy}J|h){lcQc*yFIKCn|TtVQ6`S-+4wLCACJxf4#w zgw#7bp-;U!eLUn45EE1sO^x1CTRhBXiWc=)ig8M=`j>SlgAS)`vSRe7viEpv-bim| zGv-XW3y=QB<`h~6z9W^WO?;A7bVysgw0_(4mG4F`yE|q8LtoUc?=V@fc8Jh|HIsbk zd~l*koz(D2q<^?FxT4dEvN;|0R3)whh14DP{^Rs54FZ|@?z~~LyVT>dx3VrdQa(Zy zvIk^F#gsg~r8ns!r<3K2UQnB}qIngH&SpN9mIX14QM8BYyz&Zgn48qWh{ zsX_Oi&MsEsFrCHP6EEvp>fXXa_mdFRA?m99<29jn)l6;B4t8eD;Q3eNA`iCrRIPAq>kFCelP zr`7YMUM;h>oZg7OP=Y)TX2#ZlG3UQh_o(@t_Hr>sx_lm+wwB*abn!UK5?3L{k#SD zml7cRc96lGUt+%gnNq9@k_<>o%iU>)nAFUc#svJ6^9w@aa6X47dF%wxOeWfD2?qmZ zaSo)@b?AA}MONlejo`aLDJMepJl`ZEg5Hox(0f=v6aAb&{LlS?xAHIWhw8Gdzwz|&VVGgZpY^S?# zky@Pfm1o_~{anhmJpEqIe{{QHx*nAa@zPZRqqaB$W7G4TD17G}XUtM-I??a0=S4;4 zhtmQIuLTvRQt7lY?S(o8+qp6PJvr)}nVXaM(peeK?pY--GOc1sdBqedZBBZ1y4|8F z9Q4>VOVQK>J4>gj=hf*1YGGD6#+<69Sz3WPu?MmvZWGM0g9`wTXm4ps2E?&vvsUR^ z+VR_qv&R;5jKyBZaGrejq8IW$te5D%=pf`YGS(y*fD#WpA~;=;?g<_G|`D*q)g?3_wTJ}b=0=qvVr0(q0t_|(boQ=IdKNgrx?7b*VT9w0a4P>>% z3kQ3Cm_j;|YxuV`y#o}$RBI-%Xlnu|lCPf$h7NX$CzxoAPU<tDfwPBdn#h>t)RY=e-=!EEw$ONPK>4{q080_+|^U!OTsX?I@RoaxXqoPozP za%w?KS(&|e@}Zf`gUxBtPCXTI6t_*c3vta$pWkA}dpqsn(w(5EGz*n5SX6fk4Dv2f zH>T0*3Dh-16;+~7HgcX-(&f}A6B)9*(^NQvUTBf)40~)IohL5>N*1i~G&QasB3(BW zDA6Q6o62`xK|VOM+%{P-UF7VLZ^IMaa(*U^MzO!@lpWsWG;0`YG}Nxuyg;ocD=r-X)dM2i+V1360(Y%wJb+x zYQk8Y>olGB>r`08F{#1C2vIK3tN3?ltol0H3#4J{)^a*2a?^OW5NSzqXL@~I@@bd{ z4u<7K9kL4@9=!T*@L(y~(J9;R{kpr)e#b{vGMRk>XFVyUUzzLePc# zB%_FaFY%ObxIaE6RP}a&bkaf!;7m97;O^wz?$0gioK78OhW6ixfm@mg=4>mvL81e^ zU*=SRnR0ST!^V|GxeIIpCRRMww;%IYyF9xiwN1I4?@|mPOU_`zlfrrMtJQ+%J`;uY z_n?xh*2Tkr&YB)8$d!05%`#(eAV^j^L!BSB|_f?u`GOxM;;aebo?_e#Tb_&6Y&g%ESs~Y zi z5Oa4YJ&Rs~0^oqy*|8h1I@!Tl?7Z)7Jcr^7k1c{&Zp zE{ap)2DASjt@|{}#W%`K{59*_^=dnF!gUwVu#PFoFkn)z*4LWwOO?T~O`B3X?f1kQ zeb-JEft?u|hXj$18OY>XIs|thc8cGo>GT?g~CivPq3z@ zXag)!MY!G9OSAb!7IpmyhLkT`!|%>HyJq&7i=zs(gJqJpPEo94Y7z1~G{e*=&3?{f zhC&uyMEW9a$x&yer#KCoialev6fF(Ejrw@+uswQOL%^#?prv`%>YGG9 zD?%DqrlC60F0fSBh;E76{8opXvQ~@2|B|A4`H(pZgy92ra+=OjV9#_+VMC3ptdt>R zvDsHr8@4;=3Mdg=%q+k$5vu}bzFmX&{=xJxldy8{^8a_|u{lu)>i|qGQr-wt%Ptgk zE*0(SOzK69Q^7g1XJRN>s@4~q+3sbAMHiEd7_pa4J7=CfO6#0BME+StImJ;*GLMmK zr@a9sk5VIqVflucZ8q#nWIpM{a_!-po%78;#G*qK`H6jhU3{q8af%b=Gw%Uuy`4+D zI1d{qpH-Jh=Wof_yJ71i^%ngDg`+#xcE9N|$aTvprh*~IY#D+1l&Y9tCgVUk1a^&PfL&*`2+I(6Cg*+0yWbVMHAict z|4-LCA~~4!E~y5nXD_`(k*L}WO!+)aSJ2I_DT`_XGGE26x(lH?dNfh6@2uRgICV3T zd@4WA0b()LTGdyrIMm{3$rIL{Ora$wU6);_B{^iGnI;a&0zT}^Rw_REvfb~$oR3Nm z8UCjl2n6m{c1C@jmaOK6{swZw;C9&=ph9O|Hsg?EQ6xokM^x5e(!L|)`#q(|h_;vs ztsy$W?vPzA7NhyKxZ0(uI9e-deB@=t=2V{;&i!a z<@&^V6GS5sL(h~hKb^{mD`Actxf(pRO?+aww;dLZw-0etiERCNmui~Zbd6O*usYLm zN&6)SerO)S$`D`ES&H+qT5s548k%bq^KlST5SXd;0}N}P>#m?3HUP5UU6Ywzp4Xuv zKY7t*HgRdZiE1lr5#-rH4z-cnxh#cb`pJtQJeQ#^z=r}@aS-#bIn=nm+14V)dx(auK84Tv`Y@Q zsQUkYd?)SWPT4T^$}o|*%$ zqWSpUFEvNy9O?*eI}5jpMO;wn=B_#U+2+gXC`Yw`@&O>GTpCBQ@M5LV@z8`OxxFw$ zUeG?CqihRw%M#5-;PegzQ}GKzMyc|tj?cwwsm$o-o80l z>6v*d6fKmj_#B4?9tneDOFUXzjH0LRrfn4(pB)9hEghSJo#ILccYLg_x;A7@M|f2!(-aw$0S2m-`Q@;q#q8^r#nmXvt2|o%kI^HdA6+)2e4^D87Nj<_yVb}y9V*z}?-W0WmXo_iB3Dg&pfuHZ z$nU8Oy92D$j3k4e7_w?Ag~C+Um>4S6R=59yZz=X@Fd*1lIi2-TPewPUtDQgOX{6`u zuDRGF?-4cxIg)lnSW>VKO8Q9Opq1J^ZW_j5Y{#8V9ft7?-*m>-rP-?Olr2BauA1Hk z%o`|n?m^v~W`YlK)A4TbR*E$-CnbCT_@E?CMT5GJ@c2R}gAQYI^k!^LATtrPcd8jMMsfG5NIfLAMrfGeq;M{)!; zd>W#98h(MRYDS4dXR}bm$BYP3{RYELNU#HXR}Wguv=uS|V;kU^;x1iENS%0FH6T}@!OVp$iJ3f=u>1egjpe)UyT59*$$!AM`P4~2wHeB9u z^Cq)%0NLT(gWKV?U5x3`Sc#&}buM@~Udmqfn{+?ZN{jIg9hs|-GrhmPPo z^hrR;md1aJBiY>JV))>kN6s~GrqsG`pm}@kLs#&??&MBY8S1T_7(j+SwBOQhQRJ>V z$SZBAP$N5J92=XOGd{4~fkT-_jvBOrsW^S3Ytwhy!q=#hOrvMcNufZ0YN#3V?B&rst}Ckut$r_KVsYO3K^ z7xgicDWwngNOj0&5BmiPNsXB^Yt&yD1z$4+&7b>fl|^sgPI&sM=na6ziR&b@l<}_O zoj7yJrmga1P=AmY+OI_ifyO!~Xn1OZi&rPgIKY$4qq@*@41#J!YG~|h9rMSUa$Mgl z28)_hMA3m`PBX?pQLhG!8ddGnG1GrX^ipanXSSj}P9-NJ^c;UIqqaKY>~UDGy$>^g z)jf9O&iYknHDIo4XAJ_cC9G{qFjsX}J&A|%Q9&&96M?1Sh(qvudIJtshBs(G0v0B> zCHrr2VCPWXjV5`OFa4S^YVFX{K5)_BeaUge@ZQPdohjq|R@mm|XCwE9XsWCQjn!0e zGkeD#B01KgOOq^-sz;CWEuQR-!}Xnvbz}9w@Wg|_Qzr)x&h-m6){~Vuximqw&#?+;BS;W7Fb33O3kl(}dA^-8t z9d<+g@?p5pm*ve*e|pdPQu3Ji{|q*!YT4DGr4od`20Ujp*pxx1-x1gFPx|NWU+ACr zWhsTfsXzVp?>~HZpC5+Z^Zf10-;N)?`Tg7L&tJYT^M_x5`bUQ@$H)EK^{4Ot_`~zd zFUL2}AHO|*ygwwnr=O9KMr1$UtG!E)wX!tv{wofdb@`8`x(nNxyMPvl5aworI&`T- zVmkG+ZhEE>#tGQP!6DLgnj$5ME%@>7j!C%ycbcOWTG|2aIv6{#8Z!mxYAG}`Au7^W zR3B)sgh|w{pD+%SlIwM_t+pmG<;pq7x~Z#`UuGuo!p%9RYC2h-@=3Z9WS49_HN}5b zpSDeBbZl^(82=wB32OOn51kM0rK=QhLESCCLf(t}k5(RBSk}gd8aHOOiH$S5o zhwS{=15{hr+sr{cyQ5@S2Z!X|RrgM0$&bm~qMb_D@%n%vH}#sO4edB3Wh5Lu5@@#1 z;GTmN#{>sxw!1DbjZ8SknJbx&*1&y-e*ZM3UfriJq1aUkdGXM#NvaTH((YvFqzWZU z=h8({=OsACv9##J%VhGD-~z?rajx&Tz`_uEtEP@cUtx0y*H=>t%YmXKDP6fq1SI9i z$Ku$d;1?olCgZ0KFmj?(%QJjy0iOh2Xr$`+f9T*_^1z1HrA%+=F1kz7deWK;UY)Hl zNM?u7^p^WYqSPU@TouRXKsY6UJS_}Xs6`Qr)(=5bVu?^!`@!$4~}xgY|g{yR1jfbO zu0rB-D8$aDug9U|F%My!+u>%#X%}g&pQ zbU9+6JR%>HTKa#ZVfTOGkQi}DH2&u5KYsh|&%YjdNPIu{FWXPouj`lN`yapg`RDuo zz1IKckoe(}X|*29`s^#Tnn=Y-8Htf`o!5KBVftT~RvxB$HoEkHLSKD0(CcbUNlKH$ zDbQz_U8!RhYp17o=1^y`AVh(u8B$XNvpF_~KIYNV0VsRhbYOSQimNfDX_@`x5ukOv z`dig8GMnJJqmV*ZM|S{42`?I4NM8jRNYH zHBL>wBYM;(#=02doNy!mN0KhtUe1f;3Y`|lMs!Y^)1v5*I+}vs0qlt!%1s|a<@oKA z09Qb$zd1biyJK5Wy5dAob8%js|ueFfEkW+*H|F(N;3lgnwL*)y>JUe%npdA6-CB6|5a zV1u2HW+An`-94|Bwq1PAF?BjJ9O&4SGP3lFdMc23R%vxq2$cy0`JRUII5b)%JJCir zsvH3H%1O0TXB7-*M3yJHzOGEZO*nBN1rA8?y}J$;8G`Kh-5t8;_yqP+Lcoi^)2OkKYX^s(}hP<9ouo}jkj6_?smV@Ap^E|ajx76e+=R4Vei+0#~ux~jmib}5L6llL&-wVqfGFQCxy7Q=AZ8^7X z6@j#9F={fvpy)b$RA=y63=AjO4WoN@cTK=`GfOQ;Cq=MdhWi;mGZU9!caz`|k)5x% zt0X^3py`ycFI6~$eA2~$ahSRz%Cu7jI{XHZb)^p0we)4%$D0gf9&G~=o=fG;clmdG z*J&(p1QYeN=^Cs%$4OY8Tuw5kY&ld5i(vQS+Zqm3Syak%^}4)BDB?snWsm!N(k|UW zk|MDbKhBcA(#@(lE7Hlj^azK2JrKXMXL(s&hhRpi=Z?gN)crAOQO+PyR1_Qga**wo zK1Fi+K=O29{B$-~b($ww6dg*CI=C=;8R&nc%hRhz423cbQ6Qs}gc2p@rvo+Z8t<~t z@l;k*>~qlQ9hM3m68bg_(VF6c6eeEVrtXR-0w25dOf09<{$7VY(MKZddY#<|>R8Md zda~QQ-YAw?oD)-STJcPFDy9yOt7>WWYnIQCj@vkKa&oNptckr00)YF1#&A<oQ(qfnAl$)bx3?r4Pge%G&(pc8a7oCXu647IoWsy|b6XhW z^uW7({$VH0JW&7q+gT_2f(vh?a!jowWhB^^Q?nn>jm5c#3ECXlsnpXr&3G2pl}<(U zNiQqUeD8+H|Wsg zoI+}r4qnQsum3nXXoLNWTgdAu4)TA%t;aa9Ci9r7lxD7b%GUfO{7R*kmw+40^xY}=d?PnOTfuOc@O9?oi~synbQSr?ApYB{3F4v(x3T}B&OZK^=PW z6whDhPPuD$C!%gbDn|~Bv^xpQWe`os4yj1=U|;o6r}IiRgL8dxVy*MogJ9lrjw?@C6N=LV0 zfkEB;QU$`G48Rx|QaMx9QAhfaxLYp0QP5SW*~K%KGdl+fRh4M6{PCBT>qF&Q)#1R2 zR(00pgy|2g2T}7hAicB!qR;E%MDat{J2Exj819YTA$D*Y;p+4pdqwq}Mig!4Y&UYxFfN}VLX1I2J<(#-zg`;bHjytvd))n)9Y+e4J3PgnZ~k#ZQ!l1iYdj>xe+oMy=X z(>F^uS=ci;Uke(6Sa3oEGi~}>9W7~RGJhQ7bjTXeb%rWgrvMq%&Y#~!BdBD_dx~f1 zrIV2$7;Bnp78p^8*-j{|>^!yPvo4-(^nzKnl1JdUQU7H;)dS>~M~Slm-O|S_9OQ(# z2(L=c-R!lgwm>!XIA{u1<7$`hRsRdG^>REZ{1meE)O@Gvc9;EY4`0VoI13|HwRnGV zdUh2GYL{-k9NaF}sMD)EQj>wNjlCeHw5m7t&YNaV@Fr!*k~Oj+SSz@wtx14I)52M+ z-|<(!Zb4x3DfkPX_h=QYECq4%RAG;Uc<49O^p19GrrUj$u`pCJI61;|g!j~S23k`` zAt#Z&pB=lUCdmBA$6uW)0;9Ui9pk68w^B!UXk&WmZt&{Hx;Qgt75Jv}NZ+sKWM&;~ zw~t=OZk}UP4s*lRUTAmVOkI!;S-aeCoOZhB6nbL#-)1tpO&!*CkNS?y83~V` zQJ3l~IORu|uZ=z@5ehPHoa^NKFV=+47$D~%N7YyD(VvYsxU0|Tx|EPrUa+HehT2tZ zR~_X^19fDuGQ{K25oWv*DzKr0wtmrgexwIDEIk_uOzxbT~>6 zB@h;#y-Fw016U?@mLCE1MUAc=-ZU~C9SPuUUgi+fEwwh?w3${1OfUUMrygN2SIGdH z>ZDzwu2b1@M3pT@ZGX!HatQHf`Z*x@L#_tX%sNHq8Z=S*Zd$Q|TU32D%tv9*9d_Gs zjq46Fg&+7BOIKSkUA}}E2KdKFoet(7k5hBbtO*!44G;4dvW(H%9DL(Y8;S0mTm zoB@yf9!O60N**U9k$b>uUG;%xM^oi()?BN)k*d3oT3_9*rn)rM`ZUL6Bv&~e+~}rX z-Xk7KPRZ;E+i!XvUi!6-tZVR6^PbULs+kAIqxx`wq9x00EqNU`%^ekW;1=?D@xrVg zP{z%4(&q5o^gdr5l~~nEb4nKZz97NmrewNWnX3o6^#QnKgjs)$&6*e;0%#lf1#RWU z2(ntC3@hoyY{e0Jj`!NqJwmN7D_I|~DPIQ_h$ElX$2Au>xonpYmiepk?ERpheAlDz zr%W`kE3i`i1vlO4?%dU6H8sbCuKEj2U7OG;EDm?^zh zYHH7vak8U|te{=re?4_!P2$5&h9h^it2<1$R7R*WlOlUVTmPT{swp1*7Eu(?C!qen z9QuiCMH^rBE#zO|)u6}2Xaz^ls!Wx{Vs%5KHd~|BA=tPK0(~B`Z*&=(qSPR!w6Jxo zg0Tt@=W&QV{{N?HJ-z*mA~;+v4l2Ff7e&=G)xi6?c2K)9%N!NfN~-k7y(_m)!16C;1?RPEstWt!D8#O!L-l&= zS-&_i6*h6Qx|%I;X=GDft$1LykF`2)z^9Wg5!FexvJO`VnI57)u*C6rGFx$u7oR~L zU-kVKd$+SlRno|dKDt1j&nk1gsl-GVm}(>t@ZD1iBwL}ptX6U&elc8F+2f=D8X&lh3pIc ziEfdoUc?%lX(#ho^`5TCJo#1X4#_0ylOy@@@=rU6A6+Gy>tcjD7Ez;GH8}#>x^`Ff zk!m#!!{NaB4`y2-geVKAigt z^DkyZx{i~PFgYgPI9&9VqI^fg&Cd6bftjt<<=FEs$$z4BwL;V#J`5Dc-HFEE2@88i zec)BUCi`Y4vYVZ~WFC253Z31Dr2kW#Fn&Osur5pP{FM*CE$`Q#>kM(i*S8)Kme~b2&?%Kh`-A$SXQfH)+IW%@ zaIp!gN)0-B3RZaT*Vn8>+M(BU)IP z0nq!hDMMAzyR)dKgmAp=NYv6DIqBwzdC{Ul8FRSQX`HO#kZgFH*>Mb1#5-uq zU}y{G!tpYt40A$Cl)XG~={O;@)K!7fl#2!!dc7Nir;h3NXF_Fo0Yi0#w*^`jT&SQf z^N@wQ9f*wsI)hb-r6}ePV<5WdM-_6$#A(drKoN@0`m|fp9A;(Ot9~M_6Ki@k&+x~8qztZU6#{Cu+HEKnWD>qT8)T3 z=tfZRIl7wBq$UpFits7XuF2*0G*pE}%N>Fn4MjFFQX%UCLu+Br8w6gLsBA%sm1ExoP+T6Q-$9JfODm#z6V?lwnAs+0vQoR&%NpM6114Cr9VD2-sO^?ioc8oXXn3@l8=#x@j552B2lK$MC3xutQmyaHMXu z4u(V;onn-c(uXX_7ZobwC^|#dH7s(c0TeAhE2DyhEY&CPybEZh3|ssPSLQ^N}w^5pAExpPB^oAnc!$T z+8h>k&7Z7$qe*1EiK&nQJZ;FOV1tf*x)50uyleKRdK1x@wCJJuEq@FuEa|QQ+Y7nI zvPo=?wtws>SP5gI95E^}Mg<^{K}lE_g+v$zRQ*5YTP6iE`KjsLt8&+_zz@`i>GnzLc5{!kKirD6x zE6Ur3RlA?@R<}mDJp>%XA|UKsL%X0-kdym^ldUeNVI4M(yz6C`Wcq}7&4=lVqWdD}9#A?Qc7f6;{RY=s4T#9;E7 z`i@-OjpBH$_8g&~3XRosIR2~A^bSYnR6(x%Md-CvSf(iwV&`1rkOnGT@z z(B*0dn#Tm&`Wm8trh>3z1eI-OhO@&cQkyO{c)spUCWzj+J+5INR}}|LKFt_q#>pmx zdAqz#RjI4jDr((ZwKMzt$hjG2w~-0M482*#(eY1RnaMPpYL~kOFIqNjQPE*WK+prs zJ8^QZR_DnuhoY;J>2T|DnAK9<& z#?Do8GZs?jnras9Zl;uzY>ti!W2Pb;4$$okis4G5DPq#W)-75be`5EXw^WD4E;Kpc z5BeVYSE#cz377_i)IV|t*Z>vh!4%&+)H7KaTyU$$6>WgLNA;;iV&<+YI`(kYltezs zD~u0pxm9aKdXA!Kb_pe@udpeyJT!c(`T$!nr)3PfZ`k!L=SYo|o}Wkf!iJe1O-kR8 zL2^qGUF5szcazglRH$-Yk-L~9^H}o9GzC6+xv#}Y)b2ccUvy(Smtf(5X=D>C4lggU2)ZSU%t|n5O(u`hgSfo-w zLNQV8&jtl*4Ld4!VvrV?gQ!Uu;ZD7Dq4H>MCLV{v?DCV8e_W-cGc9osORH%D6UV!A z9xgXDaMGfiw8_W`D<+`l9hGv-^X z4p8_)J?u1cqg+0?fn#?c4H#UeWahM_Z&j5NzbUxL*<&tH-A4tVS&lOW^&OP0zq~f) z4_q7D>)P1(EAPL4`1{+p-&$N7Z|`@teH!WAn_tFHZ$F=JKi04Jf4DZjd_CWN60>{G zS0$KU^$RHxkY!WbkCN_963F>)*!@u>u>e^!3pK^7KtqMoyNc2Y-oW|D*d#YWeTLn=nv>^bHNm3 zaVw6^5GG!5j#G{RE>0?yZs;|#QkF@JF{5#r3?I4@5$nc@6~zcki+T)+RV-)oBVwKQ z@7*AIwNZxd7V%HXA*=W$;840Mi?Mc>%jED9(p`5YEUtlYce<1lq{XMiT!+iZLA@fY zu4@42B^L9} zT0zJ}i-|4ucbbaoTp z$x+I}X%(cLM3S>S(?7#Sz?y+FN2#G9SB8o`Kt-lF*0d~_Ir_PJ=+;;((<2&eXD!~X zs<#N*)a8eJGGL1r<$-Yx^q!2QF0TuP4XhsxKcj=KBH5<(@gmOH4$B3A-~c7%$lFgR zWO}iURz6(Y8p=j@T1QCEP=8`9=N*qrF>DSF#W#OXktd!z+23^P)mt6o3rTcJh~$Do zOp6bqKAr@n;6!Ytu(h~mxOAkhB}U{e`Yxo*x+z0cAX*CVFg+*|CA(q+!aVaRGP_>d zWYA8oI?4pzjon;ZL}x5Lkl#3VvrD_~Ok_mg z=A>(PG5EStw6TMHi5X-OOwj`AiKJIRb#l43S?pn_D$YN+*iM)EtAVV;NYUiAyL-*k z5fXLu;Ig{mlDIkp=7g_SMEWVkQb`Ch0VA}*I*7~UZC6OZVI};P;+)Vvr5%=i5u(O? zKyf|-pv~VyD_jV$M8L7|<|*b3pw~P^p;aT3Kv8v<>#ax3I6XJ(Z9c>9x{}}3 zc@A@OvEr0!5kRyX01PfWM+he~6J&eJPBudzvXH*=KsAO&tF?sL?l$Hflf-WE-3{_h z(IhCe=cf_hV@PEc>3)i|-IPrZ=Xx`6z&wM(L^XJTaRYIWycxWTFRV<`hiokXpTxED#B-F? zCR$4H22Xe_tdfD6n0idHP=Jt(UFlX6&9GA1FxoUgEnI!Zp!*qfE~P-}5a+D8H7k}= z-tffuT=wwUh7MR}lo-g+_&o$UNs8=7F@qyw1}$At(Yhz zAgN|NT|nZR5$KD-FT1wUfLJqYEy_uo5U7HwvMSy&(3u(W>68ocZg(EU9Y%>3h{sj; zIU|oQq;z36sZhm8JPRC0Si;Tc-Um(_*U5 zh!JtVrW9vWx^W6osOUx;67 zRvL0d4Tzr)6E?DqFyBUaFH7utbej)=0%M)RDH8Az@1ceU&j9ee?XdH%3gWOin z{-(_36lQ5Cn9y<%czpf_O%e9M&d9*LY)CIgGQ(fR0<*M_SbMRyO)!%n^rRt8>?744 z-*{DaAjYc4Fob;xLLQzI13YpVfnplV*^Ma7JFjXEM$$oSbJK)|U_(42Q&de(RA0!i zZ)1G{Io2m6iyn8^bsEunpanUrVPfod3AgN%&Hf-cauA|yv|Ta$j7q8)ZUu&o4FpDG z+GRH_nwa^0lEL5sPC5C(&s+6Lp#$Aok8JZgaP#zkFk)13G_mE$DFUWRr*N$Nl$qc(r-u3{S z2}ei1&6&tkkPXki1=FsMzYejtw{eo#YF6#RBQ_z%P?v~6Q5bS*>Mr&#Nw&x-K5&Xh z%S8yC0)M3cNL#7#+0vs&Lh09PqY2)MG~udr<#-p{gIMDXQ6p0VF8RorJ57~Z6dgkeQ?j6f|l zKW=W(m(CGDcDG{@D_R7=fGtEF|Q;Y7=o(Hg#&5{J;R+-MXVD z29y{9*w-3cd13O=HrxzOxs|%p>!MmQwccLwjsOiNfSNwKmc)%conZy5pDH3S0`cgn}oq8FmPG!`Z_#&fc}FP(@*R)CH=jxX{JA;l_%{pnqx&HodH98f&Vm zkTe>^6hUaM2FP@aIRzGo=J-hE0XHF4Ruexj0EAu9h;WhN7SCuBcA%1PMu{1RC>Mu~ zK)iStTX}F5O^3*E?9I*0&lej$hW{cqsYH!TWOJm+A!~w1GDjSvA=->x`Dwl3x;8d& zh@k!1#527SajVf3^9<7jext<)ThlNVhjv2jn}~f<7=7Fjnw?~CiD8+$5dB^YfUveS z2E0|u5;9K>ed5d5L{0&bQ}{S@5KP!J1Z>>lEMSb)Sp{Qv!zdi8OEgt-s8)v_AjHr` z%q)wC!@VDxjoq`JEx^zX>M)DMKlt_A+UNJnTGtfp)eczPWHRn^jadhhj zBDUyo7V{JdKkIR}6_-6VngY#D5d-d)Fg=jj;{AR+TR%^0=0vh)bs_LX`1cOYFPjkw zs5|WEN{Ivlgz}=CQGT5Uq0lM8F@s)3Cwv*`vkJZ2JcYSCeBBJn>&Q6mo4GG;_oeR5 z?c$t-5ME@3GQze%RmDPIRg`okbU!6PgwvpqP0;_M6Q~EoBQVoL;Q#;-0021}EUOPD z56mJc z3fkUT>@@XEJhvh}v*B(LX0KFLqZJk6EwXY5uAwtsRHZRdH5A&KT#zQKHyK(?0WZ&2 zKADwzOqC4FtXQ^M{qv^|0o2TWWRKCC8uuLm$C%q$2P)APUSb${3jL5A7ZijT?xvxC zoz*6t3=meK-p)Dx^EzUtA6Q2m%aRZN%G-}$zTNHq{lOKs{Qm8SZ`bkeec!fUKkety z-u~M<;&{7#{qLVYfBNwASJn})A7F3ydCylVzb{2{`2G6A&huK%as0~`yScLpKp_LA z7?bI-gMx~?%Cug+mK?hd#OQCJpimGx@(aw$ltiO)m^|V9vJN~!doNFF=4N(_cvyr{PJ^!+nr1Zd@Q5}5$Wx0N?d-VHOXQ~ z4v}{h5}YjUwnRPxuQmHkJbpUrNPSNhwo~#@_4uY}A|uoMFhqV1sHUe$RoEy*LdS_% zIF40)2IXPrazqNCGy$N8s57#aO$NQCOs#sobYPj{)6Jwf9Jb&xf$lP*fi&Yls{QaA zG9iIMCQnUq{gNCEtv+?De;v7!{2mzU$TEF-SwZB78ST)}G;*ag5|l3GVw-t$_)2ca zhC`*d7c3Gp)210ULhm)L&fk#ogWWAYsN*3vAh~3q?C`x!$=w`^rNrPMnQvbN2_nZ* znAiT0DZ0SmiO>POBhMW+@!{)|RPj~05 zLj*3*p%|BhCEWG?U#J73DJki7ITi7a4x$!Ha|SXp)d!_YH}lV&4!qAz#3E$cTfY9@ z9h<@Hki&85CAq^Z>7p|(@Zb}`WkL64xsU6}T=Xe{i7`l$#S+9O@P6&VAr_OuXof5y zT|Zo=otafd1KD)TQ(z%URI#iQMn`?pi;*HZ+%qw&xQNs=GmsFjbw+xzLS+HP4&AM*R~5Hy*LBM`qKvYofL;kMP!I$76ypWlsnV z#bd*G$c%Hbt0GmiS{(AlV5#6fiR1m}WJV5*M?iZp)?1Qw&bV zt=C82VOM0wUDX>1J{9@Z2*yQ=4n@85A$UYS>}s|=6#~knrW&bg6#%q)23u`J z(xRFd8_T436y8?Rb$**7KoQ+-*e=-yDH5dVaWVpIls4SCCPFDi=bb8!p!Ko>+G1eLi7l7oRCy&Wll6ncflPT@O}1c}$$~Tz*ImvRWgS&^%MzGf z&lT!0PA1v}mVH&J$WYcElK;fn)EU@z6LL?-|F;?_VV#2(ji3DD`PZ?(X}no17*{#q zAywvE(9D78+7wx&y_>_<=ZVER_ zYG&m5c*arJkfrOYdozcUngQBkSEWX4*j4zDu!Im-NpY2sYDy3*l?{6iYPA?p=-4&ShKJDXO~Oo$p%07U*WX7|(BedLVNC^Fq&(3j z&>&q{rKD=Do?iObyL(k7M@Szb-C`+P%tyDuREnc^&!I|@@-ZSMlyNE553IiWWJ>di zfebd`ZrYRp%O%bXu|BOnXDU^siw#zRw*hKJry-xv z>A7fhGfmWovdYmr6;+!_AvnSolQ+m>G^4h=e3x+L=#%G&=ZX~x2`$0SD4roZTp;-t+=1q! z;Gbhm&TyG($LyYBze6gCrV-^s=H7EVBi~lVUGy!lE(8y~-y*E3<$aoxX!WUIyXu;y z{xdT=cx(!k^mC3d@tI`oc_I8;Ufadz@W>(%*c^cocd#RcE~q#PWXz8-9T9~hG$;vJTCvh%wQvk?1yb$}+IkOx7KjBL`p{%b>h#49YS^&Ba9sLx!#?hr3$P&8!$c z9ah1Y1TgMj7kj1|9_mk%NOo1~${Nu;b6@VR6An{>>6ieM^JQ|Uu`*zpwrVXb-llxI zT8+%jz(*1DCN;~E~D5lu(GqE7Y8k4!hyT%Dd-weFX^Xn$iScoZBGY#9--!T26 zse@;^Z|(^-I349MjfqvZ##f#%A?{dE=@9Ht;4yk9%QCT2Lwh__GCNp2y9XST4ThH7 zW?fyhw=g$Z*Lrm+N6=Vkh2B-HLt2pTC4DMF0VGXQORB*aS3hEI8qNh& zmouQO@jGY&nr^0)8}g@0qF{BnMPgf16v1a;Qn#m`9do1><4(BEGs6a@EL$Ih9Ti+` z$*%Mup7Or2Q@8szoTpK-x_;t{f*No-`C{SEddP&#Vu}lLL@E^jt()~cB|cPQZhqcY zC4&0P>AJnfkc}AGfnknn2B}3i8_sH$x2d~^kb%tf+vTvb8P2!PVvyx1OCwW?&gVpQ zz63?ndd&M5-8zvTaA3)*WGSw6=cX<*|CB|=ZvL|_f3xQp(nC3N#zFT0NmD5CMSdJO`i5cTZa` z_Zi9a%-?GAx<)RYqi^Vn1eB%RR*95d+%_x*AsihNq&de{>03MXT;!lhTbnXSS2Jq6 zfhR?>kg0hRJ9asNCOG-tHuGIs67b$vGm6&WqZl!>Y0X=Wwdm1HBgQ}&g8-(;4mN}P zV8U%qZC46{uSfx1#S=ZfjB^#2ZiY=fqEDX1ZjZ z;c`7v$eEaxAh;;{k^;Ut|D!UVav(W%S&UaHN6j3-A=gS4s`VVV3Ag4&H~D%eBfbPT zPUKEjB?w0tIjh-!U9Kme+;G0jde@uKTCW8e{|vJsvI+k^(<*0Zr-oK9epD_YpkHnu z<)2O@VnV!$h6+}i(wa6+)b<-!#^i(KoPeIbJgi4C=ks97kq%A`Zl^RLU#G`yFnBc5kt$Vvs8)nwaw1g}>oy$$hM-p`8#%TW(`Hr(+%!ii3-yk zJbg(1g0qUCCTSse&tVenD!-T%^Ha7Ya_DUDG2Gl%E!^j`U^|=^Kr-6hggi4B#iyiB z$hb650Wph9N$Ra;6|D$qu`bfoZx*2m@I?uaNDE#VQpLTEkb#;i$13^I8K=Zc!3B#} zQ8oZb06TaBDAj}-E=Mqg0nM|DnqZLT;f{of6#W`v(5$o?uKn%yt_Azq+sG4I^K+5y zdOMBkAzVN_?-qYC`8A}f2sP-ABs8_4C~@`k6d?euW|Occ?Pj9jx7;5WSM$$ehH`jn z#WrA2?;s2?MfV{eg~ZeJ0TUqXFgLdYc5-^xZc<=sj0=oWw>73mBN!=#Ax6n7vy#=U z9u}mkTB*n+=EatZM{h^sEZpOaBz9&{Prf_bxvB4-9hkMAwQ%=&MH;4u$5n@3S>vyO zu|OaTVI33y>9^p3z}d0FX0|pXSVVB!hdt5ayiB`={h3P)P9Ksc6xvritVPRx)Ohq` z^ye~Id3V?%;$y)C?`Dt*Hy`P$>0_}vBbbS-Z{<#=l60{XNT;w(vBl^v@2Q0@$)08v zvNL2Gi5R>Z)@9nXlQ*;ertjyb+-|tNiaVI-?@c+!PDks7A!Ue$52sj zd$^Acu`j!)ODSXacVtGAEjkcjhkXHY4jIA2KDlcii!{pqfQy_**>O$hD^tp z2h&4c+N(&7ZUQVji;MX`B;u|TS9A@NpH(Cc9e7jjFs%Rp5C8z1XAnl6fx}9>c+0ud z{I@2BDMp|f*d=_xz52q|4UcXK1sZ1y$w6nAa1NP_+L+S~bC8^5vYJos-xkdINNeP5 zW`4uwNeVi~9wxami))Shw3^QFNSu7mjMP!SLMwUcG6fLPrR#R@FvyX^PSuvvsl9W2 z1*s-o(}R#zEYJg~^(u>asxR0Si6e>R8D@?XlI_FHo)C;odEmR-U$&FDUa>Fkp|}0R zw8ZZciC0RdOiIG=Q37W`1*krZy@o&@HcZZ#rNHgBnf!h3qyflylX|xx@N#!VPDk8B zTTFwnZxS|G-J(gegd2|`E{$N%UGj&iVU#c{?9m}VoKnkEtr7}xHY4CS_np8z-O>3; zhacW`W-R3p%5e8+PN^n$8Z4Q;sjm?U%XH3{V!)X0B{3ICi=S7O=&-5G=ae6+@D41L z9PBCYcvXPM3@_#qqsQG&Wq`bcg6cH&^ zQBh2CvJ_)ZN#^Uo z^TSOuu@b?0BVbFL16$G)N<0#BwrVOekd_^q@ks7oP5x=xL+Ihbq9sY4oSemk6&Zm% zL4gMIdmpBW?xH$2H6EKOBDddD*2;N}xhWK7+(Ywe3D8&?tre=cT%J5gt2G9Ka{Tw}Lt zV1|&in>roBME7J_fgIbJP42FCu`H27jMo}01M{;tw;Tv3hpF~~)iN^(S)BCq+@4f& zPn7ATBwM4bR(0g_vf;c$n;m-iO~f{7zhlEuY`K|NhfGw_o0WKy~rk|CXP9`TF_VKKw}<+^*W$bixqjVJ^#_{XfTfocUV+ zBn{HDy}pRQ2t-u&k{-fV_qfQhcyP2R7ThQx+OHnb%``bR7Q;C_+8mkTAykv^VIc;^ zBuNQO(;#H@gu4zv9yV0ljKYvv42P_Y^)ADw5ejU!<*3{*hiZ&;5NH&mviX6gM;x)< z6vzBjNtN`X3y3oF5@&P^OX)82;O+>nr35iXcK$aB+1?X_AD& zsQE8q6>%lF5@e_b6rx&!^q_{Z-h77IsJC%lFX~QehI%;x^dyA}D9U(0) z!#1Pmdc-e`zzTDz1Bnnd5_2?B!Ryt2kG;-==vS%j%>>XyacI|2yJGDXrN zQif7~7q*YvkW! zwwARci&8zlh~=hg)~w8Mm8DT*Y^%;^RaTOlUMOSLHiel$%2@?9HMt5&m~=a2=}O&1>>N+$_deDa_V?>6C2@_IuQaw?X*ju3t}Xlaz-B|*Kj0G z%j_0Ke|hTA&hOz3k04ZsvqVK5Dtb>>khDw1u+bcj4o0kU0I)2a_g9%<42Ujh;w%)$CZ zukcf!HuNUF8Y0tFT(6QiXc6uadBF%Tlo2Z6aJg>imm?Xm#@T2V76G`6Z$}@C%k9;2 z>y-6?gC#~7NDG?shY%g{6s;!y!plG&%1|s6kXavh4BdC%^Ws7@(v@#{XIZXkHMZw4 z{hT#KE>SKLEHL%ax$0&-)IyT1ml^4oA&iR)n5@H8%(*hf5x&A`Rb{Xsy20TP4#wGn zT*liS=<4bCC8Rgku-VSLL;xq7lqa@d$?|0lAPQTX?P=4HSld=#p zf~Ue^1R4J3X1Qegc)eR}jw~W=ZfGs|6T;}q8+56ezm&Kz80P*U_QnO1V!{otgR<-2bjYxDL`;M6jY!BNQi)Xy%K%7= zj7MsOptUE4je@m4o=nQ>slSco0B5I*DiLw3l+Goj#-8{LE|f_=r}J(hYy=afuaLB< zxKRG5JU{_eE~_F$g;A_`5K_*FanZXUJPq3dT_pOE7(Gf#M?g7@Amw)A=Q&);^B{!0 zVttU>Q}5K;V!VTAj5BPiU4ZMbNo>Kb0waMplvN9ah|>YwDxM&=qPOBNmUL56gWELj z+Y+98R)-qB_?&3wbX+ZnCmb=I!x~EO1{Ghkc@qolGgxA+Sd%U|>4}4pF`{9EfAR47=$1KQ28cuQQERS%eWOcgNG7O_r}pNUKp86EXFOj9|`mDp!Ex z_^Fyd6E*JP@N1PXu{>u!&nGv+s_42$8`GTVD0+NV1j=2d?%=+qnUMBMd-*y?5ti|p zKqJ8CDG&GX_G&H}S+xzTJRp0tW>dQ58Y^`65HYIc8RgvzhOXWv!h}{AJYA+V4Jrk~ z?vSNBWF;0zkFb)qDOH@6Dl3TT;ysXRil>o4$?wS#9jgNnG6GA+)6WC1<08dHh70cy zFGw-SLwS>dkveoEDZa|)+4NdQxcq<;iA39^Rs| z#jJ412tExVS@lu|JU&J%)ZZ;qUuhc+?qv8h9aOTaDGrs30l`B#Ac9JUvV?+y=`Xe5Q`MjjD-$oVa#Od(-} z`Ykq`2G~;FOB@gJUXaHwelh;-v^jy5>=7-gR3Ae0>v^Uv$7;b1x9CGfwpM)_2@(l5 zwd`TzhGjGu&%|egI`FCn^vc7H&x(b(@dd`MGe|1oy{+Ne-|)n5r=lpNgC~861nfK7HTX;bLEo2{HrxjsmHW6Btm}jEo9@9Q_s&b{ybvQL`i< zsU1G&Tg3i6(w)tQy(o`T7NXQ>RT?~vmWrVFCgtRCEvi*S0@rZGfK*9h9`vIU27*Iz zI#H<(-jUK3qkbbo({Z&%AdN8&phNg?mjL}mR)_0SJ3sF-;pT~7L^guw-V>Z1I~DHi+Elf>e34?W2KQD z@%XG#moY-|`>-e*H3Gh{y+9H#j=omoXzT>Y8MV7 z-Z54sGU!(In^=QEN6aYPK9lTBG(R>8X5FBkuG`{rr;-mqHb-FS?FV{WGB#0b6&He@obwM4jkqiR`Qh493=K#}_*U4br~ z9>v%`eoDp99;z}P82Iw$f)kcTon-V^g?{uCx7h@+$hri!Hlm5RbQ~wUQKQT0Ya^b> z^n>AYoX3*dB%-`84N8dIJw;ecxyV!2MK6a>J?b;0-&z8lq>PB6?k-1=c(WNNDr$Aj z7mTV>Bj`v@n}Qp;+YxckZ>Y?N&`Tx&y(rsciBRcF=u+ghQyV%;zGYweiHCiVw}>8v zp|Orj1Tc3H^^s1Lu)Gv!A=5aUD<}j*V5*%a9(Mt16zlyfM-(~QeCT|%6m zOqZF?>52h!aabmyxcsgLl}G86PEm%zqfc^Gp}!-tt3`dhFVVe!2?aWiU$Rk&n7y7u{mmYW;c zwMs)naitP-Iz(@r`tnGO9cBiirCNDS((EKHjGvgNOyNn>AdEPiXYKH;VhLDW@UVVa z4b7d*s{OO&3ygR=swaPq!Gt36T_f;Oquhee6nvd(7<1E@Qj~s7W2m91hIP!@o-v3l z&nH)n^ZdU+7SH+vOPV*!lHd4O{&9Z$^zFm5r1}2+!^d^Mf7-6{d;NWX`|jgU?|%B< zOPa60{d~EdS+*mcuiN4vVUz*vadCV1bzAP^_2v9?I}^l6&ZR~EOmcF`5{)iLgD3`) z7Gda2K9pD?En?$AS81#{MQ&C)HzXCB;Uf1`Ie@WZA=l(;P*_WK#djRBy^@WMS2Of= zkK_+2P09GLC+OVSX*d5OtHVo9D(QGuQ$G@eQU%8dUyQHyw`i_JcS9G$c4_tjZxn_& zr8m=`E@)vR0+%`a10RbZ6L}6Tu_+syB8uIe5qvCz@0EQ*9i$J5t%T58;?uqBxb;vNgaXSZb7v~c#-Akt*+3kpHI+c7O8dYJx(VAaC&01 zO70XRW~SZT2lhF_<5#JY$SzB5xQ zZH@Ruw_a-t<`uP5lEh}@t1;Zg<6yJ)+Jau30|l`#tyhvNug=_$D#t3!R^c&5gfNUT zr=H?$rhp6Lv;ch5b&`y@&3b9Kwud>>tucpkau%^Nm3(4c;3D<&URMe`j94(7fti{_ z8U%8&i>%?NI3Kg1zl~vv+OkazD>8Ii{iDXo?j04kd4~^;acn-N$12a1ybRQV*%0-# z96I;Fh*s19EWw2K#x#?LdRz8g2`gU+*=!iH6V6)($|C)1l?1G+9qB`kfbvZVG4bzH zZu0V&;$cl`y6}L4-Lk*j-M|icHppbA66UHUrI}j9 zCsviAbnmfU`b|U_1RwP_#J(AaN)3D%E{gzBQ?Bwup7LGBG^hU>^i1_>7*J>2C{tQ0s=qq@`wyJ{ zZ(pasf90oqzdQf_W_^J5AK$({^$*{#_n$xi{5rjV{dA@OL5TVLw=Z8`|MT6)^ZIVm z$*atys(w`!uVU!+%`fFl`;zwcb-wK5{I~VISn~)1WIQ8EIWSmNf5Ywtw}!$-R}AGP zu3d2ozJh@^MJqLQ5U;|8OZd?BmBr}bj&sSiX4Rv5+j!xiF@;g$7_84^`zEICUs2Ygh5W^W!2^E8?lRy#N*SO`u>ok{I8Io7O9&mLMWE)LeW(*y1> zF6r>%Y7u+*fK9W=!2+C8)GMtlYxo%W?`GL%m)dx4u5LJ)8hq7*W~H2}lAA~5VoFH! z;EpoUsCZyjDB`$0)EaFi{B4x(^BHHzmk^8zl>*TcNvB1IP*bQ7$u85}YW&Z5R=JPS zD|Yju*T?B8&b9e-Ftc!_d^ju@eTL-0b+cKY4ue@oLFifZ1gPT?#ym|-X9>X0{4hF? z0@qkV7jlks_%}u{C3zT*Y^QnN*!2&))>X9kYn$kIpwy?w@Fm-UXkjB(jh*!$QZQLKkLhliDmd7k#V4lCtoGqfG5F z=qN7xO@8GK(zlx}CNDh@jNGeASXGX$f2&e@-Krvaa%A4}M20stu<^RJAaOAAf=>bO zN)WUzC`JrE<1Fw1qp9w5ne0_w9f+?C(kZX>DZ7aRHaWJBi+$=9H?g$<$ z@sUfgos0uS5k8D6Is9+9yiJnVuLCMl7K>}4VyuASv@pnICxt^H^zwK-O!e-%5^;QV z%YUgO_;MDp#nbkFb*bBFaRs>YREU>=*8v=qr4)-bL8zurD?{nJthu2ax9Q?wuT2?D zy7hE`ES5L&th>NE0hn@0giph~$>RDXS9$uNvo*;`Ckh&uOL!@xc<*IzipAmIur<^1 z74okU%p~0n`b-6WGg4u^O74(kGspqEy7p$X4u@n@)Z|lABkOF6RnPh{88(8?*KYu| z1MVjELZfDL8dG zD6C*Pi8xFb4f7a5iQP9tkCrZ9{Z+#vc5|&umAN~Dx`iOKlv!Le?CObWFDO-qGLS8z zWqn&$Y8T#iG5-Mw4&1;l7S^S9%&l=W8q0_`pp0l{>oaCCdXf`L)G;8&sk<2s^TKel zManycdJc{pqaNjAj6QtC_(`M=sCNJBpuYJdL47~H3fTAjm1Tc(y!-IW-=l!7Z+^}D z*W>N)J^!5F-M{wlpFV#7_X76Q$6v3{U$(FBK7IV}a0q#ll+4!1f< z_xmav$ECN=L=&Ifi1i5f19BDP3lQ-g`c;pDFbf`9)A7J!5&370fgS!J9d>BX^CPdb zPBA2Tld?En7)iwK;W@VTV*h zMY`8&l{#(nQcx(m0XrtCSHq-J0MCuv^!INJNm#H&(7XqkKN&Tsm0dJyy17=KW6nh7 z08yEr5)o?f7<8q1P8xaIt$G%Z4p89L;gDyO2=l-nSKk!szT4(D(xw<-Z33C~E-IAp zyl@GGAc!?Ofut!yC9I66Lk;f25NqAi?Wm_XrT9V2`J?Y>5um=w4>OpF>IKH;h~N;1 z;yi;ewVt>YB{~Lwb2_@j2Z!vtXxJ$~Q^X1Jr?|dny|5}!iaRg&U@9(V3Gy@C^h^@W z478S^%@Ws>$_?Z&!l)}FVt_TRE5qxt$(uM;aX0%oz~|L(dy~_*Y8v7jEs>ZQ3qLN> zSjR9x1oB>S2=gEi->YPYQ|G1`gsoHAWw zrezlLiEMH_1;BgvDA&c6$C68dLNk;@hDij%IyJ^WvWu9XepdXg4DG8!u&G1eh&Jn4 zDgeB8j0^F|$f^)Rd{Ya@9p*42!YroIM!bRaF(o*e{3P6WvZ^*c(UWy0Z!2#PJq$NG zs|2vd5fh=;Vv`iHDZPSz7HgwoKN#fD7W^E9$8>cp8o*(@pSgV!43TbH%tDI=!L%tx z89hE-du~`)i2H6~)vYQ1LynH8i;^+jNCwP>VUMf4!jikxa$cU&$Z%D__6uj15wJR0|K5f^UG}(U$9_Bx_k|8w>tf7-VHUa zk)kL=d3TtjG8gQQ$-x8n;F#tGBbdab4xF~l4F=0m)`5_Jyu%~IZ#0;yt z+svjGl_%sbT6VsX@FK81YaUS-T4XGH3>?s2nj+pKa@d;w_68Xu+-Qc5P<+C3s3{aB zT>vM$H_r$Tm=W39-CV(*9x8V;vXugyYyoV%eyR>y3XE}gB8wiB%|Q|yp5Z>e8M?|Q zW7t$~D*rF>0(?qf+=h8Y9KJ>vi&GRls1Z47-(HPD9;Pbt&xt~)ni6d{a1HNb{HEFn z8stNrPKi0Y0D(}(FJ3TvLiCC%@hul>8UCd3uxY?Y71I4O-W{&=bQ%JN>kxV4K z!}KZg`}}EW9=H<@eO)nb;qVmvIUI4A&_KPS9)ViRA_63x)YTg3waX)U=m{_5(Q+?K12p{vJn*?jgtK7}H&vxtWT?2h zVrZ&Ol~%~!ouaj90}l;@r3Yk_EC%hVJV!p$ zG#HLA)G(SO$tO|Hzc{Az@*}MI53ghT6MyB`H=o~~zs%2ZOuxR`FK@riPp>BJ{l|}Q zKHTg4u>IRH{qEzN>&w^Ye{ewG^W4VS)2pezc%SdRr&kZQonpT7_GiDPRI1AMqz z6Xe-s25(6Din9f+1Wct72pxt9wg|A{TgTo+y+uZQ3#MUrt}qpi9h$wQ>uSgAS_d(# za33p;l1k@E-c2ZnH=y{bJ4ItY>oOY=0>OAz%DWbqOGN1%bbRS4D|BPmW9o5x&{&i8 zKfw%H*DwcD3p0l_rZX$FEFlT3PUqxvYn;N0GUW2i@XIq&LUx3#H$1VD)>i3*eiy~m zg%Soh?3nmk-3!3M^av})E>ve2tAQ>&xJ+l+zd$ptE{O-;aE9Sb_c=PPnHL$Gy#^Bq znkTcrh;LgpOfus*=nrBwZTLo0XqD9_$xvhVZ2+Z-=G5nIpQvYdj}NLlHZPDBF#E`8 ze|>{fQ8PxdTYe_d#~~hQQaQ5Z4$B55MM!p?4j5a@bFMs8xnK7nS&ijm(#Ua6-_L@T z*FbxxWyWdn2D9yI2xSS-6kU%p9E6jwN$B1pUa%^K~i2sa(a>h zf$SkztlR5g@haNi;`MSy9)*EYw_$jsvv_v`U5~UAwZ&**Ol&*k$m+bza1ndc%)?`7se*k+P<1+RnWJSn_fJfyQ?t7?}s6d$w4I^7yD|H4?pvmDLRq9K3_ zYIFI^Y94l$d|9?6e6ws5t06OnEpsw)tV3@a+TP9*44LUHLmxVI_!G7kPb2R#f)qo1 zl|gP2YMsYY$`ohyHA*RD%j8K^g-l%|YLgYe7#*}2z;cCfhw~PLvc@RpmJ9PkLtp51 z=`N0VUL@f5h;THLvb!l^>-_-65S%#~UX)tG1cmL1$Ui+YxLbZdnz1B-LjjOdh^8r} z8@xwXzDnHp@0UeDLBYJ+>yL-a_k$Tg3jhER007}{M47daIj>H=o0~RBx8149WgvR8 z15F|(R;>|N$m4iE4eFz7gW`k%N~0_`HvdkAK=QMyEc`54Fj?xz_h{1gIqQO{hRpm4 z{thA3rjUBN?@Td29l1r zzBv0fFnwSe%$$)uKsPjs(r8s8Ng+41A}!EUEiS7p!HCS327wj`6G)39(a*-|VEW4f zsr=7Da1nA98aHdLlNUa) zOy<%~6R49JhoqM#l`Q5A@pud6VG);Nby3V4dfe@s0VkUt`tU#%)m?6aOerLbQ*|#= zGS+IUJD0APhDA##%!GQ1ryz)e7cG8%U!|#+NwFJ#39vzqlTk7YS8l4{@Qmu<*B`|) z6kU-$8ULU#7zd?^^$wS#5J((wCNVmi!fQ-t+5;dT`B7e$(`;KZj5%7s7Y{WM9+MuV zj^%oU@k~7t#i8C5T(cSnVRVU(6oy%*lj^Ktk<-Fwu1g`ja6@DYjd-_ILx{luoKX<3 zpKfcMT86ZM{x;Y6IZjOb7J}xoKqi6iJN4IHFFbl7oCjj!9#zt+n?9BV-Ip5S0>`^O z?dxT(k$J5Sgs}}*u0A@ta@`Y@Z>+cv9PbVuSI3@7EYFD8E_^&SCDI{OXznARXHO?rf}w0*=q3Q zaiPBscvj_VENAqhdSW>k8HsW|KjkR<~;9 zxdv4*Gu?41uI`#YEx_~*=r-R6!<5y_R#fJQti*1zwN6s?lsKU2F{_M)q3_I6*EprjbZe$q3uRvaDJ5$GEe&66)q~^g0bnL`DwMRiq>~O}EN81~u}x@SgzyAH zi{;H`m%m+|66Iz z|MMpdr|!piwNTrd%Xz4~NZY;EWnVL**X2*OU5_~Ur0I4ujCW}7XS9f{znKxkoF6C+ zSC21T4}%*C2#~Wd8zNC<(5{uzXh4mI(%JZsrs^tQLtd3dG)Hz{$Ot4EuguO%nKP1P z(+PspOo7>aELgI2*%~1d_IvSx(6DCi04lkn%s7-{5vV)V?8r@a%*7YZgL82)nC?S; zsx1?!Lw8r%jj=X9epPVYMFE*!r$vlsbTjphVoPhkRUlM)gu1iK?ZP(f)m5Z?q4dGD z1gZqFxgT59LqNE*Vk5+Fi5E z(9NjPsfZmNO;&kujSvMpAfz52+R@QQxzD%^VN0SAFs!QW3qw6sIAg0816_0t)3Sid z*B07ABs}Vf^qndOrsUT}^bdV5-4-1u$0Qd+r<-fT6@gNQ-o!Z%o3Q3i4MHW`El>m9P{kPuI?AONBQ+(KIyjRB=)vTs z#N){LP0dX=$5_OEn;6pMI8yziS!#|&F*z8P%Ta@olkK7i0WNId97Uboln$(DoLm-@ zs#NB1@BuT?EOPl92wvvzt?_eIhhak-7Bd4$VgO8J)@lnL8lp7S2Xw`s2iynGy8BAE z=WMzp`t3zk;xLR>^px-zyUOfBWDN#*Afyy^@MpaGO4F6qBRN6C)xc-&9?t7a?tfwT z26n_ExLJ(SU5X(=w7$r&EH%;z(Mb{Ey|N;10;oo8e#y|PevgOB9KL{6nBc9&vdJOl z(zod4JuVK2-JhL8IG-dwPIl>M950>=W)+cLMj5)rywP(rV)Yd(`G};agVv*V#w)c zqK82Ak2GCZXWHoK4Wo+;Rgi5mU10u~m4^v1&S5 zNl`@koD7r7l3YrVV#dHag(GB{nODSJ^L?N$wq?C;S%2 z!`cq)Tzk?XnVpR%b+DR~VQkX)MswSU5-!w$qSXt}L?224ewb__jn{Rn{U8hN|%t-w)!0F0;O@+MLY=@<$4Y}{)Szm0mtmu`{uO@Z?LZrqtwvBx zC*Sj}2Cv=*mV3xNt|auXhwTreo*D`EL^h`W1biY{zX8y_YI51_Py&jqxp!*+<5o1E z!W15`0>(f`ex_(6&2QpI$jE_D?NU<$`cPvSnJu2|A`=**Fxx$}jF}G{N`E&wtM+9o z4RkoP^Hi6nbV`a}gtwsv5&Ra(%P0y}xT8{K<$IYLv1?o5uakV0CzJL5Cf>Ab4KTf(7L#rCM6f)mcRLo&4d}v|S zS@~{vZ^9%d@z83`!aY07p6>Wo)#sPPBr+I}sEV+!`8n>^2BuBwdeExw4(f8s&3J7y zqu|s6SX{L?Y5l1vFQ7jF6y$#bD`9I%^I61yhF*zhve{g7E9k&04wo3pY*xi`i>rVK zw_CIV!+s8rMH7yrmW!rb+n$(A&)I#?i$O^o*hsH+WIMsiakpX8lqeKGJ85&jP zA*a@U{z|g@1WAQJ;}R6AMh+#Ene&1d@qo`%R|OWLo= z0#Zy9_(<>ufj&lA*sXZQrQUvjykVn6+UDgJQty^GeGvm!L{spMN4lhFJhV|J$v9*+ zeeQPrG^}W{=#}iQlfD7{XpWv+keUQ``Zi4AqF@%GFd#lrYbnF1;gaGLo+b++;xL-Y z4*QZqo*guAZjQ6n7thb?Q!L&L6r7xIcY16YJkzJS6?^ns=82I63!lB}c#!x^Cd@z!>}CDD%^4;e+XB6|!Rv34@S^ETp0+VPIrrLM1iB5YSkHDUKR` z=pZm(oF1r&gOsb!W>z19BA05a`v|i%*&RJFanc$C(gg*d0UaH-DdOTrsu6nhg{GMB zXJnziY~yc{R>L#aA+Ua;#T>=k3cPz0HP1Ijqhja+zy(4hx?5c#i|OeAPp6~KooV9H3ayZO$;KNTs!g_ZYikfQ;%`-zy4oo^xlamEd%$!pWKtv|+j+j>}yY^kFTsnO1&K z*U}*eRzeP8zL@^mP_Ui4yCzTbP@m1e$uaZcrCh7r5k9nPXC(LJzh+sCf0X^2l zjupM&iZIP2?CYM29FTm&bn`r)sIBc(cXKAFXB?#abMrKH3E^jPrGW~;`_TSW6LNE8 zJnf?wmoYrk)5g!;9@{Z~eLpyZEDJ1O_ZAPz!3q?$Gu176pUdv;1-p&RsXvEdUJwMl-!3 z4#(a8XJ$mMl%{tG-ALh|p;s|YeRmw)1h!E>xpAf9H5c5}o2skr@oTY;!il27Mx07D zottB2u?pysd=;t`94l5` zqUUz&##QIm%GtqkizgCyTlC%ZYL50*c^DL@p~fe8I>qTd@G}`5Ak?pD6hf^xGUCB4}p56hBDV;)q~)YfsKb-)}}R=z4_)HFihMN4Jr79 zX9rLTpSo%eo-)!!nHGab9N`dT$UlVnEN-`5EX65jmQ^*mh=t6;>8_-KQ(KUL6U{7| z#l%@>$tJvmBYP5sFa4gn5CuLRYOhe-AHuQpd$L7?JgQ7^R@7V+BP0fF( z)n3APW-W?l%7|o6A3i@*&Z^VHBov7o`7l0?i=9=#S=*({V zGLtazo5`J@qwFF*+|Al#4bY>@I9pIqpWWm(?#|FQG07%bLD4W9_mgxTfTm3WEUra8 z^g1oLuT(1WRo^{u?P4XF7}Zb_i722akf@jyhaOL^vQ-Z?TsH~beo;h{7LeldHL8zc z|FjB7HjmFaJSVKFB*nZ@eXcVgJtni`FI-Ku1C7K&B@n|x{g`!#OWgv%?6RtxthDvG zM370JAeQkEp&{Tt0t#HP(_AjZhN1fhkf!B7bHfMXrjW$H~lQIkF^RP3Z| zAelaJ13T}p=5mQu;)Zt9LE;@9X)$HPBzxU;)v1sEWKM1F*Vnl~l}P3#{*~K*WA=t& zA0mDY!-}gn;3G|E{>6D=w>kg-5C8zf_bGbjc9yxAb$EOJkZC)F=3OpNH~s0^Vi>tr{c*!6lAa(%rZR zeS0FLk~MfYcMVlikL0xx9$M0}O@b;}rJEHV&$I}>NCTTgJg8kHH?i&zpmK->0CO+hkpmRs*(w|DDHArMb~VXP(9wx*5eeJ0%Q0MnRIR41ligmQ;IXEhZBcv zy!d=^C_`J&5P{R!-G;TB()8ieZGNx|@TBAZG&j~b9ozSKxU5k9qbZp$`(|Cmu3uN+)Xjpv#pLWo4%Ao3D}(6aIcD`Oaf}@|ESignmc+u zYh#?kF=ez;XEKx2cv;yvd1UV8H*6B%VO16hzKb;=E*`ldNXRuU2#$`35Uxm>Ca2He z?W$gv1#1L7t=J_lX`#2EqiO6&u`*Q7#N0x{L$Z&e8uU+LddDZL^WcmvZIAiop-LNb zDeH<8IwkpP#sP) zZ0SzP8w+vPCcU9s$Ku;NOfzDzv0&tA52eO=0-Z7pxLeT0p9i{%BXO2a~UfjBp257)E$k z=mVYSr3cdqY2kF6dWadU!p~PaC812nh!=A)i+SA1eQr{vZjLCQJqJdp4w*o^xomE4 z>5D?Ay@^H7GJVLwtukz~ee@JWbyzLTIBP&VI%RN!B`n!ZfoRec+1;SP^wBX5TXZh^ zO4yTg{$w7AC-=}`P0s_nP+f(Hg_60Wu&|i47gN1L`ojKaF%>WA?u(hGD(QlE*l9C( zC*u!>woiJA)&54RxxQX>%!j8&w}KxM4A_ol15)TZ*+CscuOMh{qa%u4$`X^BuD!$g zn7bkBTb$@`HXZPJElQyx`2>=%kvo#$~d6n(LZI;O&~zQRZt? zFjdj~L~U1%4Z#!5PKOS;g>n}itFoHi?C(`t31?^#=iFQ;@^f+DYvZI6WIiO6T-Ap9 z@1!nVMFG7nn=dt18pi}|qAB0h)T8``Vp3Zu9;UK4ZVu=&yIhMTu9=<0Cg#&!vtcc6 z6-6s1XX@RY$@#=Y8P;YP#$gQ`DecTPN~j;iyKkOdMiFp2>UYL(kJE$Sm-8@jZpVB_ z1TytyiG;=1z#GwwXQ5Swmu_N|=DaPU{-&glduPoD>Gm;D^vh8pK5S z6q$_0`grH<4UFB8oi9iZply)J36tX9n@R&y4KO%!0Zo3)Hr1-H#`~;dwj?6eJtT{y zME0OCHBAm!6=wlZ6j6*f$n%qpLl zE}(r%f-Y41y#5^Z7R+ebwcD;u<(@Zh13d?~f}ahiHv5zFaf?fYp??KC7!GfhE$G*I zo03$Jh}r5!Fwu1*;0Gsk6ITFIwp%L3{6#3z7L3rk-f;!HUR-PJ&QA>wXdP;4G2o#?98fupkoYzZg2%l3Ayt1(! z7wi=5c*Ue#x;&K?s1%t0m}DEMa*+R8^fsJEya&{vzQuu{WdC)m)(Qairbp})AUoN1 zvGL|Ul&R8Gpl|jhl&{=^t5A2oLuR(1nW^!Z;AI0E*dXBz;mTqTo{djwqOXhTl$U%7 zcvVKxd5&;qZ$bv?rJJM{y)~S4BBPt>^_z8AY*f)zaVCn2M6-!gtXpXiO4rv1fPcBs zTSNFu^=51d_E;V0Mc=qv?yxcn5k&i;{v!PQXeao>+1X~qf;eWHG>wPJG*un2WxR9X zBiESvG%qo>gme_hY#oz47i_+Ezt78NXxHSD+my4kVA%4_};=G<-y7wCL#@P!ie*zYP5c2C*8tG7^(%A= z#w^4>pWJyS12d=#DpZ)4u56-=?~xjYJXm!lGdOCG#af&D)r4IFZJe1M+?6~#NY(+Q zy5)81PNO=EVdJCWB3BP(vuCs;Bn%ttzNed|HNT}Zg2&QThK!)2s2T_ z(uNtk`3Y{xVg`mGaf=A}Dzsh@F15d5IK}zhsS*7S@Cgh}*>A%e?sY5ZL+0MAcCk1I z-3+^RM}5$&Mi)JoY^b}Mk}`}jAYg*`tA!e=8jZKfg~T4Ss0P1LDyW;SJ@SK-Q5oD~ z+9fm#6ywX-`hjB)8^d8;LRB6K>O;%}!{zMfMh{-3LfOUZqeEcCFx>MLzKra^Zp;V& z=G;Twx<#ES?%t4Gwa*w$+`eiy;2GN3Ji5t&8O1v{4SHo;iupyox^Bf`mrC%SFBQ{i zw==P^#d(b?)3j+-L7P+JY6s1CxO)FOiRe!5nFk{=F#_=NPpnk7%!gukG4vYZlx9xo zzX3&5iag|&<0mx`$Iua+CRjk2)e+~!gG;w;*hY<@2m_<0L<3}NNrf-(^J;E6&uys@ z5sFu@Oa0OAWGei0ukR>Dl|837n=EP!VAytVuQ!*S<|a7fl7wTh&5$;gjVdzyh@~I# zC`^vCR9qazL+rt-;_q~R#rL}z6~euFg_=+jZV|AJbqd1XE~|)7irVWmr+Tyc7*4n3 zKsu#Y!^fUg#e*<*SA)Ax@hS(W$=3@F;;Awz1%*{3T5_JN)ca8EMtudUG0j zh4TW7l=Ti!>+BBnmVM0qb*abZ{p)%JO6XXeKbS4f8)k&qqOIuA?aPn2N-Vmf19>Kr zr!G2-dE6~sO&q&)NLH8`0fH|E3uPDtbi~wXhV62${^#WCy!=Qg!q3Z+zwuW_`m`VK z-oFj2&d()%>)*e<{jGm}`~KtSncn{N%a{Lb)iD#H?)U5ef3?0x+O{nnXDU}aa{~Ex zPqEt0GdOvEY1bjrCHKJ2=mN(=BB#h=h( z7IC!Nq9S`(NnrhXRB+AjTAH)+OOC57IfPb*g@;kOA#-F!hYiQk&q20&S7u;(1=7q% z>gd?P*E=hZH<=ySPz+5k3ryOwRfI0r(^PzXvXl`j#l7CHe1BX=SiriOS=q&r)Q({T zWo1swr5}dDA&ujZC5774bOWp*WJR)C0jY=#U_>@8mvD1Di$Fw03XoojRyO6X4VAZS zfxTedNSa{Rq+?T5{>f7ci1->=iwqSxWclpPYXymDd5HPTG9W3FU(NOiW&6-@#t>vU zF1AI*p27`jxxkR;Zsw50OVIw1UrxzTEhO{`xpseMgsZzt^_{E1B&-+&@VR=(TjsLX zD`HYiKB+jZIW{f(^P$pX_(IM6S2FB1$a%-Ykna4H)+FtSe4ll}x7| z>!T^6w5wItZB0qWQnEz?)MnnmqHB8StQ}ebFV>v0pOk;H01^JfXP+Z4I5LPZ*jc6v zGclEi#tEsPRkZAl;BI)h{iWQkGP)|#S> zL5(~o$Z!tfFre_X*){VoP|i$N^sd8s)theCyE)^$56RpFMaHxfEnL@htxAx4GuQIA zpqgfMcTeWkPdGV5NJ1k`tijwyNvLp$cV^Xowbu}DpbD37=%9iY)X!eQWD$=|3j?-g zQLMld!ax!$34fP~zx@hRm?bg&7xKLrnv(wG$V2Hf??i4P3%MK|B?SO-1iEY#7Q1Fc zGoA`4CBku*?+sGv7BTLSU#u^FLB`iF!`9mEh&1@1BoXj42#CO4?^L$$sPcr}j6sfG* z9GvP3c#Sc&!hIwF01yBG>q*!!Lzijs28y2H9Yb$HR@Jeu3)sa4Z8wk0)63=c>n0qL zMxI1PV(>ePH>K9d%K=)7(M^cdZH8EVba71z-dJWA&tpOPy4rbbhN&#ToJ?otcLRPj zT(B`j>n;xf(bJSxr65VL9D|J#f->(N;89K2ezz!W{u^-6vkus8K)gjYye#J1UW{iU zT-Y9ULpm;>Grrjwf*AzO3>rbAK0tY&%o-yo?Tu6)#3$GoCjaf`8$OU!()kc0Q9~5* zzl?$yb_F&(2~y&OVo^N(9ce)UES)a9nyZq4S#i4ACIEpoD~A#FFqi0fMv)BecxDuY zy2_^aa;)mxkd5r%@mmyWW`Cw(tHUUlTf*c=hi;B>O9VOq_2=Icb~bHWEP|EvLL*3m zN2vl`8T7!EbJ8(pRvhM%P3|beF_!koCp7W+CR(?d6>RK^)-|eQ?q)L;i>q}cZmS}N zwFHq*7Kg@hkzMBI#4Rp=(%X^~mNZN*Piz3g#Pcdg^A_s5xE`YMxP-#9(x&l6Mzx## zs~lcN05u$A^)a>wUvxB=B`o@@CoHmCo&zN1V%x=%6bG4n>Mkev_ut5_I5-7874dH( zxf$2WT+9+VFE2h*OBHzzi5IQ?(MS?)vbZj`-n0FtQU_8t%+e~42+z}kZ@p@ZGpRf) z`e&ibt$ho@3wu7p>}k>%zpGgf{dTR(Ko6sUmIN&Y^I=IkW_t|YBWh9;n3Wr&zZVQ| z*61U@OQ?MOPYiomXSt@U)y2mt86`&-WK5C*AVs8Dn!52jGzlg@c3tUatnV)4Qoy+o zmoqLhq{INNV5b$AfLeG=r8Z?YM~`5I$LfH8A6Bu_L*%0&XqfF+43X)9OQ(L{FiifR z9El&vZ2INZoc@Eq^7rGnw;%qo4BaoLfC}hKE!bScO1;hzB%L}9gOgs@RaYSH{4E2 zQE*toanwq=N3BFP!K{CEyU1aGKEcm3R9ZUmIi7X-j~?-fr3JxHhfPtn#gV~mj&uz7 zJ!biwzI>Eut64s`ilZQmt>z$IsGzD7YQw|%_XK~SGOIyD`1;1CBy+VZOiHOyRJ1Xz zL@TZKg}^+SXAjRGYIbbbgsob%aU_`0wHY|itN6G-!~h-c&(T8Zca2D3Ch80$s>oS4 z6=*nSM1~4-ia0;EuR|qX_+z@e9loB`T><3-6X#?(qq^OIR@*u8RY`@{VV+rb|BDuX zRXehWD%<^%(aY#=>x@erhcMr@*RB#+i3g|D&?+gg#Xn`gYXQ>JBMrS_v(F z7A2*hmkTf$Clc?I4s1=Q4p^FD;Uo5&jy&R$t}%a9r^1tXO0J`Dhy~r|CXMGE7Y}|| z6r~j5c&{&&RH{@$@v7oxadgDw9vAK5CqpxWN~Wn(KG?5TVM{cRl34&8@vs>99Rmmo zH50bXwGq^$hmz}BwdZAAeHSt|9VitGU`9z0P|)sh(Y460a0nq&2H&n)yxnY})zhcy zyBq%pt?ow-@z1YA{5Sr}{_So3W&Qn%L;TxMAIkS%%dx$E^FF6_Z*SkOU;pbl!2jRz z>Er$G4X5_&;hihmf%UpxpY_fIbjZO};L7GG(-*p@_r&6(=+$~2x`b2GAdJZTiXXEQeE zrnTu&bVARFEcMulG)r57dJIBMx5D)tsVXXbB}N#|Zl(pjUMRTHVLKgQFJZ=5Q31{# zFb8B!Z<>x&1B22VpMsYp{@>xr0hGERllceF9L0;=2!jX zhJZ7$MBBi$(YvPTxr8Lb=R#?I7;C!rC?WUY6uG<5^{elASdQa|(2MMT6x`ma6fg&x zUiUfYGlR2(O6d7-NcSKq1J#yUzs)dPTJK;eR~>qcT+xi<(&Ai@dJx0KRqvvdsb&Q+ z;#|0N*2a!I?hDh9x}#}EH)cg8wf(!lO}4$f-C0O3=*2Mr`moag>w|Wrx-EC)cbS3_ zs+C{}uc7YM1t)Oa`$Uf&-!~Ll6g;6lcPEL0lr7L<6+`5$Vbc+uR>J{03}HW2nBI=e zPDiD8Fp6rtJLzGGB7kK4z^RI|WeOH7Hp6j4TpXul9HPP_Y@BcY_0yORL0bmdL_N`_ zGfGvj>4$KJwfXkgIVl)4Ly$(NN=0p^<4Br)GV_EX z>8a1Y{!m#Vg#RGC#D zvq@kOMKjf;1EJuj5awAB&S)MAKC;WW@DcKPH~#7%V|GpyId;G#@&4FO$E74e6HRF1~D7F9!He^lTQzxJgB5jtt?isbpcO zTY__G<`K&)-Y2y~0akP@YPQ%Ze2}NZ=f|e`wi@(PbM;`BXD9)^gHVwVQ+D9cMa9(A zavM7!cmluGa3AR2gAoZDVffH$5_lr0n|PnpN~5m$%UgT=z^(mdS<1p+`SRtL<0|LF znEm+S-TwQx@xHuy-N#4&ey!zG`>(HGp8NWzFP}dC*Xvt;-H%H>=bC0aUZ3Uh`eZkp zBJ*{4{R`C|CcJ4u|KrBi{X?!%aU9K|i2^>LQQSSNxs5XCbU+LgXi^%%YvwlYNRpq5Lht4IK1?Y+G zCwS-G2U8I+8k5}2lWaT3=m_=ssC7f*JX9~rvcrRGS`^x43J4anLvLP@RG_kuC5ebt zvNfl@tg-awCEkj)9Q?yzE2`~T+@b@C>?Jz37E$3-g})38b;FxVX+|9!0a?T?YZ|!) zp6jAm^-mXck*~Lx#SL#-!Y9Fcr$@XpIy{Gl3^`TgaOzRh7*4^MVl3uaoet6^XVWXF z>06(F+ohKX{UGBahvAYXlFPEqo}TX-6*cwU^qmYB5q`#GX6KOAX!J&LsWO6NtzXJv zcsIU=u|5Mv1b>XC@jl}HQ?^65;r){J&!}JKpI~w1212b?&^Lm_O}E7Ojc}3?z8@)K zDA-V3{Gp4JxlV++E=pYrD!tW+?2cSfYctm0TrohTbZZqvN|#=w;Gu;)BW<=hU^h+l zU~Q{Mi0&*jYgrE%m|{lT)Va(#HyPi}Px8>$kWDnbyscnMIXW{Kr;0|#-^VbSQHI$F zPCfXUid`{kvdG_JtC0ei{Ff)4Dw=|<5dNzmOToC7sE-lu4D5?EISqz5sH~9Eo>?PnF-l2-s7Y^reP^!8ip^S zfz~r5#efXiLVHOm-r;a%YKiPuIjxv;+IkTumz@%2GIy)tpehcMGBvI52*S-~)-E5d zo2o=!$ms}(<0R=W9cBh)V@;h7D_SP9^zv}%81AHR`$B0~W2bm}$Y_-{6kIO@`VY25 zC<{i!77I;bYW)8h`x9)}w(PpHtV&csA>gEd*9Iv`QAQe#q!O0i|L6@t~-ZAlSE+bR*tHTk-+0%8sl&tAn6xZW$xD=q99oq;Y&G0U(?Ikd2xOkDtJ!bhoI^l!8=^er@Kw+#FG1{GaD=Em4G^^r_M{oM1*&;y z`(eLLS92J{onF)l`94-EhV1Z%u~Zws^0U|BZ4LEiQ+Zv(LhDA@wp_!jySw$IRr=}V56;~IjsYB~iDo9_vvd$5BI z!tZ^sA0+!masTwjoxlKnLM0Kxfi}8&y8_!MiSBC<2v)ia+$gdJI8RV)hNaHU7}4V&;ftzuR)UPLw`!Uhv#KJp+?|XJc4Ild4>E0oPgD>>#PTYl%%AWL^ zkVOoHZzc>k7xPoYECu>dQG)$H65hzXaRR;551d!EN%l`FEhwlTJ? z6O}YY&CuQ9f`l_dO;yg+uGzwLTHe4hYm0lLFSg{#4{Jg?dwz(_R^$+7yFu(J@aJI6 zgS9w~i}x`i7!W8apH?Tj_!Q%v zyx=nHY+h4VrA$&#S_m}cKz~0O)f*|VR7V@j#93Pbeb_?cV}w7rx{PfLz*}pN{;tH- zjMXqJn^u}sG{6)fph()x+1cQ!BX`i{tKiU$l>s(m_3hFqZm08K!$zsjz#K8&x< z4O&AY-JM2{4FCWT005@%rIAHCsm?A5AkX&Ct(4?kfD4>s-3lz<-PjxZoKWY9CMwaf zYG#z1)hbJ;`W-aAZ&)=I#76v9%8@F!oes1?-$J>tNvsSBQ1akUv8L>3sYIQ~k+2;D zpj+Qj<+!|&`+KC7%X4RhXr z*PHRvgI@9a(-dX56xW+bq^Dy(?G12_8MuK`@AnP-VYSWPOl0n$T&FaUj6&j*@?ivbEXl%r8 zHzPVa0O7uk+G}=~ldi*9E`xWLsA_=*rFYSMj|s1qvod(J5U+1d?A*a$;`Y{tRr?Qs z$#*M_w*HbsPIvv-2D{|}m{VF!__tHDv-OjjA}!sZH?LX!g8 z0Em9lBpa=CD1k@(bX`W_%Kd)on~6WD=^26 zUez0)Ju=i^;Jss@yCNTseY94V9}V5)pX7#gw4M&cSdPuB4Gr%V+R{RLm`$7qJtT51qSrndd10 z)6YIY+xinO6vvcoPG0(XJ>Ydv@H1CPe@G1Ra@JROye*|A40p5i{$=qLB9X2OguLIA zb=N}2vN1#KO@>lc@lNmb0K91UK6r28CIT!2nM}Wo?7}vbuv08ZGji1=NRS^@&FvP_A*Xq-hw98>TKr-}iq)cs*48 z)w&N+4{49#qM73F43!_fWCPNRnab0X+r52)dS`g*&b;npH(kvdswk81?7bUmZv*uC zl*O^$042tZ*UGUW=>!kxiw_-p&>d(1(7fq{tV)D-)Kyz#z9;TtJa#2%H^2iDs0x{B zOe#TLb(*Ps6lOx*z|~Dv$PXD$gTn~cHbbTEB;ptGIrer|l@~CC2R-JO&8t)Ldrsg< zE0sJ0`@|ZwSlA#IHd^%FgY1jRf_OD#)%?-JJ*pJ>Fb)wxsp1#iSreZB%|P-093%Yw z`#=BFzrOzYa=G6Ad|UtipZ@eOfBH}V^mqSx=85~i{N?%I{`L5W`|Y3qW&6wDZts8n z(_ilYlemqb?LYqWpC7N!{}7Y($J4YtzRT;6TjBP{d-ZPc`l&Md;}}_9|3hM*T%-Ix zSAic_-_6J*7Sg4g-0N8Ynnkp6Y89CqfeP@H9=`Z?@1PwkG;~1g8`sf5{KY%80s)&_ zC!k~zfI2<}HfiX`RE?t~?xZ}x9(&i^8xLT-K#BD?SD`-S0lWCQ0iJLEkA!SFLsorW zAv_saxoTd5ke(Ad%QkPQJ;3vvSi)XT7|E-c;1iI>ETR(<&M@@<3INI=o!+wZgYvOi zPyZxX^K&pnsbBZ8aqogd8%5V&RvA;c4W4Nb1He;7s5JV{l)Nzu2X}7;ME%zaT3yz( zb%8p}p1DmHcTxaa`_n?;0!BvtPBWVbXNIWMXH906o6ezbGNd%I+-7q z*ayGEgH8WY&us==zjym<+|}`m%rQAtyR64xX2iH8g8Cj42lJW=WuE--8~}A+rs4}p zPYd{FqggvUb-Q6F#;500)=bXbY7pT5$*o`9z_1GOhfM zFF>G)++N0G0`zv$+vl8XuF*`k-&TNDOFlBphyHz$>h_siOviDM<~1RCtUy|a$w})s zHg>VI)!F+bqi^Ic-8NSdBoFV{27KG^_;wz{PK7Va?3`%n9LGs`vgNmAY1*7n;@{WK z_y2I+|38=g|JrZ=*LwZ`{!uIa|34JpfBb{%r$h0--2VH2{fEDQ9KW^m`}Lpx?fd7~ z-~8$CzMs!O?)%?ufAjud9E$(Xad^GI_Sg6M{$4Jx<@0{NZmr9g*Y|kc|ET)j|DGCW z1D3`^y3;}UyI_)P%}%5Ge!ZIah5xx`^>NIvkDP`;d>yg*KG|%qtZ?X{J&ZM|Pqr8X z$I*$(&{jwv(xuY$l#bKDHIE%7{(O-)PeY1&wYV$VPK(xS(Egq$x zXsYrc{r0^nOVVwiY7J*(MjZ@L9m8$taH7jicuZ=|PJGVZD>PmE3PUAJ+j%jP*;c4;5cZ8kyGk7ya^yuWS*Cq54KK5d zF_E^rZhZD|0exFk8756)_glIIeebcbWbcwZB=j6(|9XhIGuUFY=%PF+B(`HruxZrF zokRcc_-&NQ2-R-7k;!Ucdd!ny%)Htje`PqYI8F_KD`0l%L{Cw`@AQ)u%|kdimB^KM ztFpB`ob{Kro3c9H)Tr$Xh)vl~>(FJ~h4Q5rdHoW?uZopjzStebJu}c-YDo)=yPxRIQ<}eJhM?Jw&r!`u zA#A|^VZLj~b2GTOu#d1k4$-gQBlSDOQi8V)-ST(ZHGE1tFlN7aXMZJ1#Qs9Vx{ewn z-vkX{qs*tP>x=g=cF-$*+p0Wlyt`R;^G>ia-mDikDH=B;uFBr>!V|Z|`dbc}Dse3+ z*ZW0U)x9U*KydX%bJGyG(`=VaGulq0vYj3?m0k=k>1G*!V&~hFSvD_5hxiwxNyz|I z`I*X2a$zOdT`uXTC8mL}FDs6mf)3GB&O-xogDUMzX*ji86&elTd%vC0Eb|x*_1C$xGfiH(aAwec{8%VANof+r=)!JjNX846t5jQu zHLFz4ZPE_dyuSjdZ&u&d+wx^5Y3hrmgmyQSnV#q*2K@}Z8&1CRzgkaTF$>=NXqO(i z2MZ$qI%>>xTxiZKJ@)-aWqtqDHcuRpEz)~H-kR`>&y|*&y7-RYGjfLp znL}q#xc8p^xNOTg?v|MH?&m{7Maz54pl4@`3R`}k*~xSCAQD)QpL@$X?TV6n%zARSAUlU7 zwvw}C`@Pd-Um;LNYH^iNu^O(GB=w#rhv9ma4OXD{N@`O>yjn)xoQDnFA`6z!arghW zMng^9r1qq!Z~Pm8qT1w?CO1S24SAvj1`amOujSKM==?Y7gx=ziZ`o(n5IQ|%M%TAx zKAet9_iAO`z_fnjZ76t5nosp7Z`^C=6BP>IGo5n+w`>yjrXw)8c<-#Ba%rk0S7XZ5 z^;N#A85s=j(!`>zOIlf+@_COtb|p^gigOG^uuw`4pSZCdmHi3@Li7LVKJ!^^$g-bq z_!%MnmDwiCA~Dv2!u4tdZy>+92Wt{GddOC*4dc_vp4+U#dpGK6Mw5GEX1!3mEb^l7 zTvm9RX=f+i-kK%+3S32FErK!mayv$HIg=*`N8{36z145klNIj9d%1I1jc4?6Oah59 zRH#V0(kr@NPf6;}rUq3pR_VL9jo^o1VX~dLNOLAmCi%k(D+JIL^|b=`&QYW~F|fam z!zJA^$v}gCe1?!oNVOY_{uK;}9mfiv`WH0eT(7?hVOQPPt)<6@A&7sA3g0^G&e@k# zP0yEvk-#uvLU&u=@5WOg&BltdH+j#w zwJuEhcemt|0(l`py15~`LlW3rorbSnmDRs5SH^cIdx(d!j36V>H*C(u{i{qdKD;8W zejt}*LH4P)rbPty(FBziaf(sd*uB%KZQ<(=q!-c;&OY{Evh-ItBgFY{jZ z@2|!)C%H*P5(YQwa%A(M#*nZnkO|u9@9HRXbQQ zC>wIt>UBv?4aypPOhSak74l^(HcuI0COYpZK4^{?%d*>y4*SHNJiV#=czeM@!UrvM z+Oq%v5C8y>sAotZ8`R`sqEI)6c8&tv_;S@<-@So>Vxs>&Q5ILe&ZnC4F6mrmtpjEs zu_*qj{JEZ?>?lG0{yh=2cKNlaakvUU^P5% z!ByhJ5Y`ut@;gXO^N>#G+c5)zt4@0Zg<8on>Q}KbWtJu~cyV}C4M=6-hUUI7!o9;3 zBm)FcLcxCUcR#>oo+Pl&Vvl$X9%Q$laZMHy6i47T6VSHB`%?AG`8&HEzC|r&I_2 zPDaV2FivDo3AFPIew|A>sMi)qt%yzp?oNZ2join{sa~)t-Bl{a#5v77B>LSfb>Sqs zi$@x&>n2WB2L=y}UKboD8TLw`cuvB79q;<{_sXHdzlG_&4JosFLME|Q{jf<%I^HIE zc|5jB_HMj>I;Dt*FOAm&O`W+znu^L5{%cxOof8RN^V{1lc_*>-RgZ#klRHnPOTVri8};EQxA*t5Dd( z=UH=`4|Zp^03t_u@ZjFi1j;Y5aB78UfGdXmXh*ycxHwp} z>c}SbUuj%7Mm5zq!4WT&`5^FE1nGUIergjbU%RY_8>iVukW#5b@X!fKCWBYtJZkEA zVLu3u)ET+|eCZ3ocb(T;ewlMWmc=21Qn$RXGar19h+AS;H26v5UZIrkG6q|6UHEAZ zk@cM?zUorsc6m0E#&a!h^AwOBT~WH<#CwShZb)PDme+X$sc;R6&|dv;eoqKC79Ib&ev|n)^{JGFw)9$kq3fFCKhxXvNTodWh5KbI4!2fPu&A9E8$R6kZ7KxaN>ctq-QZAnF&I*%2~3NaO&N# z56Ch|wOh94KUuMfGr4Rd89YbWE?+_xR8rf=NcNkw9+N7IkwiqB$UryO}7tPczzyIFL zwD-cX`~se1fSfDxj zW1suD^JcUAfw28;_%1d{S5Hoh;rBS&85QoH#QE<$%o<0&(8+R|?p8V7L?e2qCBVOB zQ9lScJJBSbRh=DVvohjxW)k85oa)OTpZ+elBDrDqfDXaV{A@|pW@AVANC|j5;R$dL zZ054lC4_Y5=-NAh!j|=L^+6)_%+me%$(!1X>KuVjt4uNU8GovyJ1-YRo!-W`&&g?? z)y&^5D^Uew!n;pG+*M9g(*65zS5{P|CSDTnuVigc{EbESVQYCOf5Jpg;wx#@Ri5+} zGBf#oj1Yjfkf4}1P2Mthe55RWWp3YyX}xj!{_+o3#;qH;W<6^hjA-4Uz}1PYS%(ed zE+1usBHlPzyKX+@vUOcVTgXexz{4u&d3>$oVp=Qs#rSAyq@ZX%s|^DY04k0I%yFhf7t)sxlqzu zCZF~O7aOESR`({GI>wQ#k#oeLHwFsZl7HuVF^cthJbFS2!#h_cM74)tR{N-xLR7`{ zxk+?628cRDjurK%RE87lPmWW0iZSQwbnp02-5EQ1F8pLWiZ-rt7wbEl@9f?8+{bO( zO0(LeF@5%V18+Lf86rtWL55yG@a4z z#til{y*&20t=q5J>wPi#2AZIai`&Z!ANnPPP)60f9B zC#&f<%RIHqI$(M#MZl&jtnW>S*jy#4c$MOyKD}Wl8hm@c=78pZA40D%pLGKSrIN}H z(QDfvPERZ zJ;wx>z>4N%@aW}xso?%N+4|dvj*nxC>4&rPz=}9oemLnN9Fc|)+_r%ypPErxoVzqU z0psm!_E}yn92~nz$A|5%%*9nQQHmHC#aKCQ6zrp$;4a%FDyCbIWRSsbxMio^dP}&} zD)sa$X(KKk7Ek?vT%nl@%QqXnNaw!Xv-ZqQL@wT&yR@?li(+$@%Q*qv_-)6Srr4|P z^grY~RiPOVn(66de8-9G7Jn3_o_8S1X43i?;o&sRQhfLGfK>YjxvV!OMSnrk@Q7-=_@k5t25c(yhIk z-u%+j-bfb@GUel!g4J(-C1hPERgP)A z$yKjl9jc6_ogE=dRM&KO<~G*&s0<~T0V!m-o=sSh2?r(}Lt8nW{O0ZanrR@CJP`*o ztu+xC8rLxiyWP7bl)2+(lCh8QGs~1S67n0?bYW%dc014E;YhnROHNW3k(&G+V z+iYkhU_8l@o9A`MNS?Cym@HN9U?TfVb>n)D?b$QFGaWV|sDIs#QS;f{Z^8$6LV4N` zRzkX;hrY8urf*{6FzVih9+NJiwrLqQI1BKX=r}UWZ4_ShhHY`0d9~}U4x+bcK7W;| zlkV+7MHo#oY>*#M`Q9OKnMT5PSt@eh)b*G8 z_(O>^5r6O?clPq{IZw~hoK?EeXZq%C4BV@7Pr?-E>;vh-$ZW@Aalv7*-d*k(i7QV9SjuNGvZ`5)xJoL zPy2b9TGXdhhdNm7Zxy*sWVLW#xc>8hC&NAe&&)#~9y?*}o`cL0K|7m2n z+v7iN`#=2i{ks3t_BXHh-~I6bE&sDO;lF;KfBTRB`1k+(AOG$j{^j#Ge|h}N-~Ho1 z{DH=ci=NRnGKz|Kq!PeE;}jZ|DCg(9MNyNY}?A zF{aT0iv~<=0voN=TySU+$;k}auA0jy^v~1lc>!KqlnWct*j*aQ59}5kttC1mJ{!SH<{~)Z%I~N`8eK59QOE00HGq zR@$<0ab>;oO0_(|p6-lZaS#siSu1?hRm#e#(Ac3_zx=jX-BMFladLk&-W|Z}G)w}^ zK&=+q`n$!|!5h5*bZrLXE2ex)y1gM+n#01XiJ z<4!I-=x#CDzN@Pk?5dxhqsB}(a_(dvkKt_4%rC&YyZCPI))8JtbeUtoS zp!F2B`y6az?P{w75VwPW<2_N$IhJb2#eeVnq;a;w;VqZER7sb|Bfs)$2%flbflk{k z{GQNp3DqB1BDLScTVDu9EAwg&ZU%%`juw~8@g;9LLv;!1MHT6tN`O8{Pi?Kt2;!&~ zt^(C8Pv@-LG?t&5u~}5@;tV-^HnE~(QretMyuGdX`%FkiZvzlTXyDg3d>NTdYYP-7 zqo@s3IVfVI717mU$A40`C_F9p`MxXt{0X8A!ihL_;;>k4`}7CHhEO57_!LNz?Kzwr0!Q)(uo)Pm)^^Dj4^`PDyZb-{vz7 zYyW`DyN&DaDCYN$Kie~(ntm{@{nlB0-U`)*yDM4a9f|O6^#3_W?oxu;KCt)z01yBG zV_L~4ciop~_x5w}*HBl!WfzEqkWl4L8P=FxBS`wZiNVh3^5!SJiMgyExwbms6fWlS zu}ysY3wyW|sA1wtblSwBi{Ll;4;2x=L4x0_pzfZKPM(eMx6k7t*!g25C}uv4r-5C?al_GzET~0~U>UIs zZ`>MGKKS#4Ra%2?IdYfk_}MI(HvV}d9f=B@}4 zQlvI&*o+Q|7CKeG#2nw4UB|4#8w^ey^2?w+S1RN^q@gq@#GDmF4auE_P%ZQkN1eyg{E{PmCDLK>uauJf2r#GiHbamlS!FqcQJmies-2LCH5_bfL|`X`xr{WH&|#I9)bfc#eYKp)b^`PM#V{Z> z5q{d4T!VZ4VXO}_`>O;lqjUnJIvvy_gRo_8T?Uu&!|rbL7b$h${B2O!$Jn~w29JFW zi*?sxRWWo%WR+F~r{(WKaJLTPXBE2ol_E7Rg6aUOvFeJde$tZMqO(OmK)fx?&R@d# zE-~mNr(n17sEJKpR4}#F4MSQPw%%L#>=RT+l5;OJ12rnkPhPKajI5+8!+2wr;+6UB zLYfJ)-qY-y>^3d6FV@kJ-0k``;H?fCa=dorss=y?V@6u_UWA>CP?mUo{rQPqUNYEJ z2N8-SdqP4tJd&jrtt`>yCkBgZFxiTZwdyb+YNLnjIV}cPw2}HZ!mJNVqvc!cR)Tgt zn*ql$LFEjbJK<6ZcDsrt;d<50%fRpn_}dbhO@@prF62Qrxs#c{^skHH35)XF`M4hE zoJV~#`+)l|(gX#s)ZtoV>G`%XA)P{uqbXjb7u_WZMon1VWi2-9Vm8CqtE|-J9Inmd zoGE=Wkp<&4qsS{+#VjqW0)b#t8C=eZa(PTlF4NROAh`KV;{fLWzW8j(3IgJGlEu{c zACidve+MG}XZY(3MApmY`u7b){`Oz~Vfou-`N10g=D+{jalc>x_4vF0x;_8fKfM0( z_~$?W<$pa8`Ckn|?w`y0di`-MU+#}Tx{gm7(SLMi_v`m^|KkaN{yVgR5%qsN1VO#; z05=J&nAk;Dv}I_(Vc)k)f2q-x6B8ilS7_atOdeb_FUb*$?eAYNDO0$L)Q;aSv?jy* zfOhWMhuwbXK6o(RFWQ&fbaKG2LnNQ^2Yuks+|IB>{VBh63r>O_Qr6~&QTH)8BXF9* zwk)jvD~Hq~^X3Y}U^>U<)sC#4YmIy_kBBZ{f&*Hs$v60As;qKh_Ms9F*}GJOjRWD? zX9HZ>Sa#tsS^(m%bSjnZ+3gjx0(&?6*RGNF)PIGjBJ`)-tRSus7n9ih`Jf3sYOjLs z!&CIAO-x&hHq`ANo52ne!T{^*a1Rfc|1b3i&;ZQCY}UEqWqVxhzu%(y+Ei3*9gfm8 z9CuFU8|21SmXzN)t>?;vm~yzwpi4fbfHBIc;eFCaoWL=ceL~1i&+aMI@T7luA==(2 zfVQ%b@^e%z0Si{>2ytzk*LOVZ)4&RfaS%xPxqD8Kv#aVq_|hqquQ0HUHUj1d7v@H4 z^w=J~a-?^qQBjKPMI%*Bxxgk0w3?5 zp40fJCwygrzx{?6XR<2bp#?3``8+W)C?g2h{_kB-hPF=<5g!bPXc?B))9!j;E z+Vr9E)n-RV?+rDbUj#)jp0KKro|ba}7<_~IXM=9k3Ld;Q;%G(L-IZtujBE;J-@0bB zFKVu;oU;{ou@i=m-!s`ed`i(dl_H(Kqx62z*)GOefu908%aRIB^s7g5a5uon*^+h_ za1N;OHrq!<*(Z-xi9RxH-YD*}%Vf?~{tr0#pc_#J^!NCUbFIu2u5*6}>EGuJr*P~NcG6Ed{-vy09h9)=2vfEJw#{yd(@eNYmdQf_Zb_auF$Jj zevx;|6De%nUhO*tl;*$5$;Hz)k*Vn-8$8RRoM3bQl6@AgI~YJb$Mlvxg;0qLhp$n% zpXVz4v%kxzA(wN}lbR2iF#Vgg9hF}zNMa7RPTIcn5v=#Nl=lFYh@t)ijlQTz_R&ol zf&a{CW9B(S@jgHdKhc* z(lzL4bj~Fh7Oj2rBW<7o{GG3Lm4uTnx;LQrl@Et9X-qsl|Kf%(BH@ngR%HtyCutE`E}%j-TH)o$|Jv|!sLabIi>uYUUXq^8s= zwNNB)S-RlS$Og=3P6iTC)k6Wip1!7pG~Bw)z$|$XWbj-HrI-PP`luR zKctPbDEUABvmEc1PTe#=e0LqkqGAxsnpQVYSrv)5J>^=1g;sUrvslIK-l5*|d%b9e zF0glZ2zcnC*baS_0JVLpwR#shmk;{rQ|{nZ3Q_)@-CeyJS~T|Bep!(%WUj)QQ?4MC z=hri=PYarAA_dJUQ)ZzthG$d}+yTXNL%e=LsbbanTql;babG8X={Pl7hi!J}{7v59 z?VMzii2}L#hM@>MLv4$xEVgOu%1pV^C5egPXV~Z5Ztb`GNdTjad_pyks;JypISZUM1!Yqb__lzGnW zdXugdV6>mNasTR{mjo9w^~&4wmCrJOTq`I?h*N!e8{5u!xN->d;0X zmDX{mXH7}ETXR%ZKMaC)&!cKEWj5c%J5Aooft<#}FiPbj@Yr_CYWEnHB7C0@nV};rFmEkIpP*nDZhi*|S#Kd|@?i!GF)^fA7G?i3lkOm4KD$52Ah1RgGU>RccUp zVjDr&4&)*)YA}wy=UQSuSV{R3H(h(Q?J)toeEG+X3U$q z+D?)SHQv2XhR?o^Yo6uyEMGd(?>Sia<9|Io`hPP!+Ao*upPC(Qx9j!~uYY^b?C7@t z!~1XF%jduT+xI{H%Rm0lvm=Plzmh)x`CtF^r^k$q{&;KucMCL|MT|`LnW`PE{Rd)o*$Ba74#u^wS96>ACX>aN zp;3~*w#02r21ljH#A_Bzm2!c>^D1+usp7(rTA=RDL-$}cJHhd0B-N$zVcje4t%j@X zI%D6#uVR#rWj;9bg)Ctr8baR>H`+awhVP&8Pv;3G|zm3)8 zgJmd_o!;d@`ApQiLa|*;$}5gRhk7;ojegOKTLmzX+MBS|EO}4P2By$spNXo=LaF+w zDHpLV!NdfAqmFruAu4wEd%2K)dAp{y~Vyy-pffpQqhvUuHi_V@r~Ga8@XxdC|I{deCF4NCl{RQ z0$nSdzF{CVE%Ifi#Z@9N`)Fv}1TBi{^><`l?UqmDrGC=Q=aOYVn94(eRCwgQcBheN zfX4Qbr)^Ohv0A?df8t6hHacumBG`i0C_I#aUs+21xv@bZ3T%<@u##<MN|l?@aTn6`jzYs#C2mEz52_WkWm zQ<;TwyTVzS5-5ebf-r&so>p45odo0%0U6#ViD{ru)|VK&Y3@p&$xeBKtpSVP0~Y0V z$i`MC11dSuDm$Zmhu#44**nbUn=0(uP{WR{ON%+PQylaXN}e(bu5e61yFMX4C(9?P!D|2w(Sz=tFfIVnX0ug zHkG5>HgJp8 zD{WXE_1}7-jcLR5+US#(F%8cRID*-+J}l*sk!=H(;0`@6<4oHiv%;(t== zM9T*~>ec$<9TX??9z*6;U~>Oo-2J|vbZd98GUq3@dpn>0=jNa7000mG01bSM!#}}? z!&Ut<`$D}4kZ(XUW|m60EgWI*%M(0dHP~B3bKQ8O@$aR%z1Jx;uRlAfkx*uJc-kug zelx85IX0l}SGv8@qczk|$3*MZfKoVn?csh59By_0PeQ=4{cJ0z_P91N6IBYAhfV5@ zxvmqredX{>?~nl>k;FkQ8%K7x-TXJ+qIYi)iJJiD)t*tCi3$CM*P9J{x{$9tn#Va- zWSX>NDAX$qMmyRYiv1`pcb0bWgJbkS>BKIUG*tqfxMN|GK2y^I4(xO(2f|O43Fcm% zCHG{pNfs2&<=UX-a5~q(zJOsnJCUC$P=(6=8l9`L?yI##tmIBp^i?hX z*wZB%iatyMwNvai)(^&3Yfh``7QZ%_QEvidX8S`cU(}Av7})IIt8N!Y-p-pE-z$st zqztSuFFUo)Xy2}uTeUg^I2GAQ3@aaxSR zo^{amoi;iZqRcFxiACL=RW8d+@DyO#TRIN>I?%nVhSfTav#c*VSKiIa3 z_V!N=Y}g}HJ~no1`Rkji^1lH@R=rojE!IvOR{iP(7~s#!y7D;JDR)bQf+D#77U&mwdNXdg|7@>UYpa*s4`IC)G=u8FMyLbolj<7`Sp%-K zALE!vk5|s4!A1tKe&T>@-S~#R3_5f_t=f*M`RP$U43@94>8m9qtE5ZmJK86&>thu& z$aRPe(GMxp8#=AW07cRHjUPmKQ-6T(6*z2^EB{o5)^|!jid}yLeCZj!&bUV6UBH6s z(8;IS}1SB&3FHp&XR%a^nUGwtEqRY zKIm_hDA!ZJ!!cge^lXW;X7Aq2cMycm21xcad*5GOkOY8=Er_|dN zpeqyOIvse`Djny^OI>sRWQpG9=Y__}a5dQW`nB>b?YJpCL$|LKz8S{YV?jVChtS{A zo7gAJ%KL@Tv*v?o5Ph`D9o@SN!+`8SF#Dur3X<<^g;43ug1UN!g-Oj{g&pj)f}-Bf z()eptdd|-eSajQ`UcWk>Eo9-`F2bl+*+M;!ty?$N>J}we`K>RhD>vB?LhHAI|3XUz zdS`mwsLJlv6yG0I_f%*0E*=(W`{)^2*-m$C{iY=7)rM0VX*b<%jJKN^BeUVHQP&2m zUTJ%T8NO0qkzV+wWh6GAn71LgYd8YxqHgfBHIj*Cw z?}n=%lrAF?XrGkXZ2)1Z&FatV7gqXlci}qyzpS#G)RhaT!VN}6y5lC10ro;L`5^!x zllQoNMmbrfUES)b56~yS>BL&lXWyj|R=+*0Zi8>!xGGL*n6Lv$Owv6%2dW`LMXtJR zDOd4TtxO)k>A?vV{jiWqz%4B%&~vM=YPD>ka<5P)6l?AV}rXYFgjwGE1{x2!W` zAyS?k90)~%<6z=f3%Q~3pRUen%te5Kx5%>VWJ|Wm*@YFt{E^dM! zZj)I&ll{JT{@vz$n-B%&Mbqx}yC zsl+hgzN@KMy2CG3-2`A9({1&e<2WsV**)1g@l3!4U_zjF&Xw#(AiNLte1YrROQz0dlGhs0`|0Rzn|C20v%q({# z98IH2QLOqO;93y`pac6ndD7+!;%Tb2`a+u5hi_=6cLSZyZ4g#);TJ9;@hVX>Ib>Cb zNl$0`pmJsEUU*Ir`9B9^`4CX3C=u3>995zVSU21R=q5Q5-DCs}Gw*)qW zXf>@n$+8j;zWBzQid{4s6D)8NP+#2q07ATwm#NM|+R60nr%N`go@x`8A5s6;jGqCY z8eZNy?9oZ2Q0JMOhTUWd*=_mTf5)dBN6K@#I}j6cR4RT=MxTf(>px`ft{epyL`X{ByfjpezITH zojR%N#6;Pg`U5UhG3Z}H)q`Wdwf@)_k|{lbe7+<7pWvNs=Bsae?wvz7XmO}W;2+xw zt~(&6Sfw#CKBZ)A@c*va=YLkJC+; zFA6Wz?_nFX68l{B#=TiDSz)5i+B~+Kb0XaBb~>vUl}tPOCk$qv`m{;`#sSMgcH-m74^*0$GLH4{$ zn{3Rd)9#kuq3ub%L4uoOz&_12h#*;lKq+@4)nSITDe4TfsZSJh;Z!~OZTEdA43$0;*rt!0j#-uhAuYLO`LLE9&`&;?ot<8 zLkc{MrW4S4882m%{Nf3mS9WD~PTd(VA!i$b{JRsnPsRy(vK=ktST8?wDxA<}PN1I0 z-V7+Z^BC65N#U^gw;vO{aL`bgcXm&&N=|e4a^Go|4z!1hdi=__{Se-$a}p z*Rc|*R~F%7-P>3H%_}%49n3l*28RUZ&}U~=no9dXbRh5k6_mZOSphgho)AHf4 zccndCM`uAj1r^yWY!_>@xj%79sHf^&>sP^bDFT~dfZD#HWN*^ypK9qFJ=@dX>IQne zkM)T=`us)tw9my&fy8#}f_NPMlkVdOgFrvqADj%7#JJR^&Lx41E)WvM@0p)bC@Uk7_tllzqjd%81chB&h9YcZa_cyUc@c2G$*#s;5$kcXQ<^wiit z^xmZiwcqUaGt=`)dT-1VQCij_v(Ubl0gru<>L%ct^Bj82d+pA^na_($(kNI42*DgW_ zpwD5L54syHFQGdZ6<7QX>^S@S?!=TpW1tVPER4SSj`aG8OIe45X&-*jY}G%Kql2Tr zh1gwK?RN&G;ua}lG5}H(J!m?wpuJB|Y!Rm$-O_IQX;#umg(yI z`44txQE`u{B03EjB4cW-h+8X@R&VyXo{8n^mScf1%~9=2ScTvxrQH@6%*; zItFIRUj*N#MlQJaEASjyC!2BeYD_cilsdKojbPN%RG9fcxeC%@xC&J+z`kL&PzRz_U5$te%ZOYQ_fLhb&wTe@k(pI zZev)T`M!Pib)A{(YK!fzp2*w@s$pvFO{LPO9v3fWZ*=1RRDJY1e&_k@);afI#7QUE z8#3R@fD*L>^Kid)n!*>|&>*nuy!-br zLSJhCn@P45>Fi7;w*Ks`yS&CboU#}&FKN39b)Smwfzz~`aQpmB#n+!HUKkN<)y-6` zIRgSxr*#iM?0K^twF?^14TzxNt)A`Bp9_Ux4cA@psn9CXT^G~Ys5$p-c%XM7F1L|P z{rZ)C!Zx}s1=>}?G&R2Kz_?P-s;0{6|GrUjcQ{`-K(aU65~^>;z;y!+`IsWyuoEx# zS=3!A@Y**V18nXETUfkk=f>V?&n!nwv`bt09fuQr?hpaC0Sc(+Uc$u>rusv?$3jPS zr9oJDZ*QV-K0m0$E`GW9X0xa4Y=6-D3G(cuqLsXg=W4@Qd_pkq&fSYhs8s~Gj?eGh zWTp4J2-Asbsjg%T%Mb9=G~Wc%T`B&bbW#h?j&M3#nA6lqHSE9lFqKZbvN05XJxy7` z=&?3{hf~N%pKqr4-}K0adr52?&2xp$C0Bn(N8QCGmxEaVZjBIXuG=08P*@) z#YH>>o>YgfX4hOGCQVn&tmZ4#>M3d$w#K&**(OvO%uXAyd^)>r<`;PSn(OA6S>xOO zYCJSMUrv7y+gdf;cs-H+dbU?jF;~e+g;f;5CiW)|ouK3WN7;mtub1g5s8XtqO4*HO zcADjko$&+e+{shlR>gN4#pK{EoIy0d!=Lmd{!tsWC+-W^sWDryfv9UTmRxpiv zlH(i_UDd*SR4#c!Mu9(AvQ()3o4LV&N5;tkn?Z^HHJxhWrZmv#2+ zJ73bvWb7kDEB9S{?@OQ(`l-Sb+qO+MxTE@9_Ch2PQMCewc=% z=fu`@Gp7}BQ8l@qKJ$LBkND${fZOzmJ7O*OS)If_p;fsdAG33J^WDbI+>Ml$_hdMq zxJ4&Se$M8v%Mc*z4%n8*t+bnK=F__%#x^-`j>Q4kteMgHz{sv^SdFcF>Z$OG^QeC0 zy}KZZ?lzDDIeK~r3ex$O%W$8K>Z{KwTCLvs%1FIJo$zpp7f7R2um48-y;_~+jJt5) zJ-}zGG}_UCQB`9SLX90T9DZo@pU8$#J`w*qF-JD4wW(UH`j7Cx~|{Ls&>u&7)G)2sKNp0KFZdDh!;pI(8Upwv#YG2MnKHg$F1k)aRlEN&C=IgX? z6dOCe>FVjzo?x!_In_c)p0w6?apRp3iRdr3e&6ZeH~!q5Y`Ut6KfQ{Wn(*^}hTgD; zj_)0&$$m+&CzR6CW`81aVT|%~t~@Qf*y(QHhyH1hV$Cc!zJ=Wu&#XZp@)sbg->aMT zDcItGBoP=yOj>t;%p|3qHOi&KfR^x}>09062ZeOK)`Vf-cdi1Un5#Z*ajP9aVzvOS z{(xf)v)j-0+M6#%-OM1@QdIGq2<|x{6HX)8Zj;Q~J-3(=sI;k1Q3g_T?enwV=-n3> zo+dGPLdQ&1^X;v?M(3O$I7hc9~ECW zMe2tX&-!!G=5OLa}@;*Y#t^z}LD1$D@_YZqi)eh!SU6Yn%wCZ7S06;oR zd)xDRoBI18)(IEhQrR}Yzs>vJgt-k~3U*V2Wnx0?(%+rBdV^z(ghiE{nDet~ZW6W4 zz9KEwbLPY*bK^5S;LhGo$&YWWDH1n*&MVB$1KtKIs<7bdQ54S{jW3SC-OqNjcMtMJ&twa;i=DgU;W&-bD&<}X4p`W& zPWf{zL!cE=m#$bq>@hdW2l(vcR1xqgmh|aenZUx{tEP+-qx`Nj690aiU?5WpuqcG# zyE}u*wfR`HWx^n425AnqP}CgTXkXSj{_MWeAEqUNmx>!82whwUwC{O}V5B*1(-Q<` z;=Xd((M^N-;hqG5x^(mLr3H(;n7G|k?QNNI_v|S1SM%X|>tpV3|Be8fwaL6_mDAv$ z`GUHsO}e18s^i{-CLt*%ItnI^aYat=Zb)UT&rK2Gp07X4O*KUCECe|R%_5(HO`LE& zg?!C@s_W=nqCDJo?kMkk%8Iw$_tF1rPo=x+ZA6!T)W6V+2n=f~gL!PCxeC8Mq-(cl z`QI~MZ`c19oQ~six&C9Ej=%rQ{m*~@`SW8q9e?|8f43k1@-O?J{`LO)?|=WNe|-Mw zFMs*d|HSF|m(QR69G7E#e2)7c@9*=EI_!`3ZliEX%dx}E z(sH~|@e#n~0zWwM^;05mtE>8VKZxvwE?0O}8J^43iW_h04np=4LTZL>Y)JD^rxS2Y zhZqB)dD+bw^M*5;D7lm*X?>a*oOXRZPs@zaq$A|~FjH+EBC6hWKQ)#8_{~N$5=WKZ z3zqOZll!XpjasDBtg|f79MtNauM7pHX-kTgqJb0|*(oS99Naip!e0*)mR+$v~Pu2X%9$zPop|mE6sf?zXhWl!Y*j4zmhk<`e*S z74hbGzPS}%HsyJ|o1~}rka1J(M}zXRrA@0s+vIIpX9J1f9~Q94-TQ3Z`Bqd~!9u~y zL?!EV9yV_~o$5iEjN`31dY!YAJypuOZrYP8FJEk+^hYl@+QnS^J31+9iRcpU3H+?qFfg`rh^~&C0hAO=eYqvr>0uw$)RzRqA}BneUdmP7W<@U z-381;2UnNTGu=c)9+V~z9$CT1^}|2C@`GT-hD0>s%|`VybB*%UY(dRv()_C!7aY^o z9`W}Z_7hddc2ibwm>~`&AB69C&g8OB@Ek2*O5ko#d-^nVqQp;=(c_2l{hIQ1XI#$7 zg1XA)5|sc?CKdO&Aq`RcH>NnA;mx#e^eZ=N#@yd`>cEN(&vr18*Xj<-rlPn4>PzNYWU;Wq9#@ zsSvMRWuBVZnTTHeAasG@!S01+zfN%I3e?*BI?V0>01yBGv&{u>;fhF?`-g+eA0WDU zmkZcW++E0lKU4-Bj4Pn%jbHe44!dP$yfKsx@1I0JsPvCn{Dj7vjWna8zP{_-H)q4g zhOmiW+utky#)Zqk%%-0{XS3`-0nM=g?VI!8HQnf~_`tLt2u{HhuJG=1=zy}{1L>z( z@5HU=J8c^~+3Zj^HA~JuSn;=t0%v4%U)ryT^=`V9iUp@6ui!g3XS=4sZE{x*Gx9Kh z8f_-veD3Tt(fUlil<6TL{-(_9-olltvXc4{Ai8=*1vlq+wacy=`L;jBft$Re8;4kx z=~XUc`)(*lxZlpP`(`HNj=b9^Zk}fqfCQ)NhBhXtA6Ge!ceI3+W-oQd%5(ofI=b^p z?&j&KGOm1Z81N}l=w@;YEw&fm$xfs(ytG?4S!_mjH?`^;v9$@+d%71vRCnBh@oC+J zA>W1du6SuzzVHQ!t~c%pRv&)yvHrE2{Z^?pn{<;^FoE%=IN(xg(lGUSXNc~gEHBk? zv*0$dO*v0Yfpzwy5XGy?B5zdpFHkO3`Ij@T${b)~v~TGYa`M4!r3TOaeZxs8Aa*mm zzcFhzg=)9jetMP0^s&>rH=WB-xK4b4ccsk{hej%`HaYkCuDPp)3~vKL#+ynl)6aHL z7i@F${M=a3(Hl+53s$lTJ)L5kx_tsAud-3nNr!}P;;`YLtTfrB&D?EOZq$e`T8JxO z&Uc;Mm(O+|e;&=lZuz|Ed)^2Vbq1X=caHLABgfPNID*@RYGET*pN!`&oO<5Bro(6g zWm|U5+Cs@Z9o=Q5uT&T?y(ffp@AOwlciPq$wh1&v`9Ga+b?s>hyH8fyRD{Iagoo=_ zn*yh!TK&DU+a&(gUsS)=?>5zJig8EJ`nI{I%X+Op+bZ~Up43CCs>)&9eTPUW&wM|9 zbM^&^u3qEH`!mny(3l>ki2Jz5c7y>x`4_-A4@c+x>RCEWC>Ms-SXH0y&UBZ;U2lH9 zlYjc8WnYd?`)-D)i1{u%1?%~niXp(!i7arhLZtf%b?z$`eMFj>3|)0luVcI!w0k8I zP2M2b?J%1bYUfSdIciL*?uNBeA{QNJ6tQ&DGyT5PfZdEmYxM5a`!9^Mh09@|J6at5 zX7jT+F?#>|XE*)fi3#~e7fU~P=YypiYPO?sUlAxCR#NvlFY+;oof2!&yXsWAavmLX zCEH7K0NWIwlna-cFf?_Kv2jd5M*qnnD_FKAFBBJ18WPy&r=B&c-i0>nCLrXL^Sk~O z=J4fGuTP-o_9d(6i?;gJ!zU#~_i*0Ni(R>z&^CNE1(gwZItO_Lu6*B;)uJDyBb5T$ zlw6jf9U;N)~2IxtN3=pzx5q;)t#YEEET{<4f8DPPkP^-=IcW(o?0oTRa12S7LR zPS^1ndQF?n>Z9L+3TX)^DaBbIJo45=%bSk|p2=^~v$;r~y$hYVZxig@q`qp}-@Ok$ zeB~P)y4izHuCD4yk-xh)o6O&SF%ze4;VuZh=eIv`wED8>)|^KRU1{@}hdaM25&f<% zNj-cF_S$p_D!h^D&THx^>$jrH>D%BDM+c4k0FlSztgc%yZ_m_yR#yJ;e+&YyDOmW^79#J1sZh^KFlmv{Ow zX?vSEb_cAc`)v^~JRAomWK+-^9cJ3pJA%h!#rWy{LhpLb^FdJ~W3T$5d`)V)1w*8a z%F{Hw{lPC~JKZ<4)k636w#}{Ah@*Vb#eDYB67rz@T;J(Wnrf!w=A~$E+LOQ8H8d%2 z_qvb3p*x`2Y96tm-hBASROEM4Sc-JlrReguxS5-? z+<3Ub;XJ>?>brR=HfrSV-Dbt>Y;WY1=PJZ9pVjI`v|w?t_aVrfdqd z*e@w%wowtD<6ua|GD*ZSj5;sIUfblOcPBSUZ#^wSI+zx{B1i6`BaR_ei}#q zHiQgyryHuzU_ojSA5xW+MlN%S4{JGx&L(+sJAUW?4F$4a#_X*gXrIbdjNLCy@{Yvy z6bQBbRZF!RHKipnFKIXWrQY5JxAp#UqoAF<(68=x`%`5sNXv21Q1!5O+b1p}**O09 zZL~3|cVZQcGdcxr{O?~lR?pmLkH zqJ)bk<-d2GU_&6*b~ZQ7`BM2VViv0a;^kaS zK|W&EHl4GKXq7oaqGGY>8qex-5qawo&6WE*X%C~N=g;an@L$4#7!;o z6u|ej+iBC$v->g)iwyP{`g(QUfw?1mWs;=Lv8eqQKGmJ>tlg0LMAgo!ldh7qfsOKK z{+QZ;`(Y6l)YRuD7AV%!^BAHM7I7WPF&q|+t9`@pC3A(~&zd0=@^YJio@P#L%cV*8 z)ZFCJPTU@UMmHQE%$s(t=dtcHZD3BZ#S9H)+ZWR`y?m_WXFKH?f2l#pNUN7r%XuQd6gDTe@(6Uie~1{J9CZwrA?Y`?Y?@RBc=H^_g{WrvtKz6KW+aO@2B3+dQjKn;dt;(u(VqP@EoS+$h0Y`h|BIv6N)Zr>j0uLmw1D zZMJU0^-?usRoK9i^c7@_WcH+mi3Rc=Z(?&}-tUY5_I>6&9CD4auISOST59@o7Ok_7 zZ3EX6apECysBWV!c#vl{?@FU{pD-H%c+-hgd-d~tq}gvnvpl$o^zqSRtxB8HnX)bt zD8BmQ{;r#(OUj?7Seu|is)7!_{@dGZ6Vk=mSWx9{zo8Dg>^6??le1~H8e)uY_BO6v0$u62{Peu}(Z+%(kl60*OxJ{S22^`PU|U4GO? z`dv(!=1NyA{atin9{xMEgEzA-iq555Yc?sJjHk~0OR;%TXEk|$34g-UM<53D`Y2kow%J+uDB@r)#2lx`%bWDL~J0vMr+}+lMfG^#t8! z1~+;2=}x5Gzi=)lz2b$pv<{y>uEmMDxd1GyxF?2Q%8k!NQt~tL`Z|j) zR-nyh7ALRIG0sW~OKxojTk6rzHt&f;4;fUlbY}B1X>bXn`pY z9?oORS}uvJ+hnC)IZP8es{y9)Hc>|83UNX89MBYZ)=V12;}?2$!xUW64mW{u-xVKK z7}iC!N_aa)eriofRe!e}1d%ab?zB|+}+DZYmnm!oZ&_}_c? z3ij(J-n+i?Mgbull1g^w+J_186^R#Dk~@6d6g5u!KC}OR(~I5m)g0@p4$NiPE%*@2 zw({Sc+mGkTQ#LO2yB+kaP9~jSTPpgj{)+C{8`X6Bn!A&;w1{XF-qNud^sb$kAzr8W zY&&P3mS*B1e)Z~2J#dPj!}k*YjGxMfw&4mbZsp3(X8$L(!o3*~szH0&p6E;4VUx-x zYbX?^_}l1k{p8hxsJS#Ncw{ntE;?wNU?jU3B$!S`R2EhGoY8;DPy9YrB1e4 zm8Po>av zV#>eF+`;{I+WFk@aJzjAFA)ie^&;_0 zyv6y(RHv*Pe*cfo=T2)q%DHsH*PqwxkSemtH+pafwKcl? zj(2|LxFlD2;T@M%2y%*4WS8o!SGooozfl8z5U@{49~ep)IXOX3X(tcc30bXl4OL$K z#t(06-9kKBSG_qx-ncvXQ_3XKff{Ar_aRx_Wj3Iq;-mI^^Fi(0YK_%#P#zls z!!SZrgmi_%fp7RyH(sUDy59Udqfi@v&(wasl-9?keL55v(xN7~v#roq$S;y1 zrGV@%HNmFdzB#7V3=v~x&d`?6cCK!&ZHfwwwxW4#oHI1&=4EaFuIOcp5cZ9Sx_y`B zakrB58uu#IActUes=jcP)vLjc%KSEoo-{gAHQ-oNVQ%`$7nKiA@`+T9>rk>(pNOCJ z%)21WzBUUXtKa-4zBe~o>Yr8wZ6D+T{DMS{U?s91NXs9IVx!4!F168q_gmjmK1omL z?Xr+i4q7*fZBd$@-MS49IsW?a=bmWnIHjre zJOlmPP2^rOL@6sULF$g~CRg%JZcYnz;!{MQ3?GM&NnJQyf`+RfVbCeu*VR@~t?kso?zUfj8yUnh&V>mh7@kYo^d~J{; zr(EQyN#aCI{XhB5*8dlNv-{<8{pb8<|M^erKmBF@^S_SY?7#i_^$-90m;HJF%isUg z>!1EOp8vf3`EULwzuCY3%isOyfBuhudNG}es$QSZ>+Sx>!*ad+QHNbG=QnBlGy2=V zo6csyOk!0;-XKC$#JaLca7UhhY{mBG}YW zcQ6*BW(9WMpsg;RvZoSQ)DmnIneJArdK-k~Z_WAMNb}(&ZveiAsEIbi;B_#}$Qcl< z#=bxQTf?%AJAM<)>vFKZN5QBRsJuxe8J@D=ph7Dnry!P77+a&8!Bo=qYHbowonj;U z{T{CUUBu~yB(=&e=xXDirBV1M5)S_TWu@K_<*r~{sjrK7yo%jQh}l9han*Gn!CKbz zn?W|&B7pw(!|FE1W+4UGV&4a2PY}OPh++#%n3ksj_k_|^jJNz-M~tE%&+_t3f?aux zwb5Yi$=J{uG}Y)X9&ZnU2xG=xU|70Jdrk9=v?+}-&4;IOGqFyIr!_oWK@!SgRc>V-(y^)Eh z7b4yU>HW`+fwayo=NHnq1)<~%jhd)Tt<>zo ztVq4hrpVjU>h|X7S8x^~Kv;MkVed)=#aM5&*W$a=qj91|i3s%53UD1O_)VBwFserb zd-lGSFt4bFiB)8W?Pu$oA`b1%UPZSH==Eo1h3x!0#lbIZ+AT9gu&f7re@Mv9TD0en zy<(8fjPaF;j3#|YU9$ZX$=P3K-wW|xqQGDaHw8=W4DsehH@#Z17>u2Ri|F9~ttMXL zv1%nwZK&o|#1k2&yF#S4C3e3xW1BH<7V+fU7yRLHIydoAeZ$ABnX?Ke&mVNT70nKa zb&5tftgSlrLVNYu?=I;Yha1C0fnTrWQVr2h>etg^%o$lRSzG#K)7XhdGXnShUizD} z2{D@d@kxzcxPd2u_9@V013EzNZ-zgSfi3p85ri>ZB}1^b`zj5slE9`~$Bs>9Gd$b` z0eXi8CwN!9ckCFm(iKX!2u*&IuODK^D~4~%reF*_Bj=p--mhA}B&&k@;Jn#=%qLoW z`8yX}B{7wji5mo9rhuF9n;p~;RI<`j2~>Om*-mA!QzF?^BBtY*HUCdsBaH4~4&7NQ z8uVX*bsBJk`8V|JTNz2G$d?BU-U+=KlF%Omb)WIF=F;3D)9_AUc)%KN>gd)bCx@S; zx;w1+00ACAh>x%>m52Z(H^`YOWpCd1nkW)a#pr!3p|v?Ja(rT~QWvp{jkgCi*#Kw< z?iZ70sh#-fbiZ_xbUHsrXgflc)>G-`6U&^Q-F-knSI{(o4QO!XZR6V(``Z-LJG+pM zf~4RrJaV64I8u|Hm4$6ei1rG3xIp+HLSv24!?MC}LIwwrH~j5azJn-TA(?g~)91(? zcV^t5b-|dJjF4w>y}Ko@C%NcGf-|{xjfmm=-a^Ikv6A^_CIMQxk>)g}EG{|#$}Hq} zR{DmDK(#HnfF~AEx3@@hchI(2&4&Z4%IJ*x3XSOUZX8FfpU?~hwkz?~hIi&5VB4G)4I<38=cB=hLGfz|88e8UPo zpb}SSH^5Rj0FY}k8bJF3zAit5aiVR1_;K7%SPoxoV5+rv=c zB3>GB8#@2_6DxkQ8^An0l4iG}7F>QXm3G!8noVZ&RWk)08?+?{#}(csIH zUXv~nvHQ6p!8XHS(DY6}W07}nM_-G;kInG^0RYw~cl$|GZj6}+AZX$&k^_R2M48`k zTOui298fMdn09APD9a5pajZf&qnwr`5Ms%ln8L;D^&N?Da;K9zw|FLCx9&M!}yUI*f>0J3N8;l9CmP(E{!!9A<%rtp2+2 zNq|f)-wC#@P~_dHes70b8iOsS0M%qOIm#h>m~?oCY@C<_chQ;LW?Er z*sh;sHzN|p=!I4|NDN=w3_oV*vyYs%K7e)UNh&S&VV-^Xy`JtZ0+<-(KE#;^F=hnl^AKzD zHf%~_=swiB}dH2Mj0)86}e_6gq^3f@_ zvkKgSYF__0W9Oo*w{;%bCvpYAz5$Pet3+u`*&=C6e)>6UHE2&#(UfXx634d4bN(OL z`@3|nHq;5!9CzuNn_kFEiy6b9_}IP^W3$^o3nf=Du>?Nu-<_hTr3%6*;G4|3eR)pJ z)!0J&6D)ogmJb1K-Nne<5(mq@?FlVbesPWG-Si@GKl()gbJXi@39aw!bEttPB_@Mf zo9YQ1iq4EO}ELCi|Q71VN*bs|=1cZ)xFX0a}An zM{!W|HXD9aH5RfY1;1oWFmr|_s}wt_Q`t7}SLN2$+K-j3DdN#kuQaF#<>$TWq7aLJ zv(ZD=dqrT|F8)iTO>ksF)DMI{}x>JFH~r zMECxRX?)|A^8qapcd&_)V-YL9TwvhoG7KRu|8F(z>@l{zy)jeVA9o~}5lUko?KSb> ztT^obPcZ_lS(50EJYy>nJXWh4vCNci;0zQZrw-zu;l_xR7Mag(_yb1;f8S$Gfi0Ag z{pP#nbAr7Ep&QSTPg_-RYHSyl5lvjXA1H-fj;6W0b}02^|a@)tFY zkkjTmgaxNkSH|UZ*oe;g^q7Mge0C|&Xqv@VC%cHBsl}b<8ElVGjZ<2*c0ii}lqvD$ z{Sk!OTYMe#GRlZgn>_k+pD3g;R%^^!K%9Uc>dJl})E>FuEW!kRn;1Y$mrgoqw&~sCSTO)5iGv8$1l)k)6^L74f2&Ydw^*04x z6${YCX0jo4^}%GsmoptdGKj7gX+8)zQK#!jXf>usU$6V4|3gHH5 z#ghx{XMXPj74+?bdY6sVA+yo52HG zqp{+N7EK^5`<%^pp#}s-jaanlgCsF)ZT7R|(a_v!a1Xb951P|BY9zYdsN1fo9s`)N z8^t7tK+s@InH95xdyG6aN?C{qy-72)-7Pj-3+@Kfw*w$OxYYv(Wa3GcOYJQ#`m|mW z5aBf2UKf)$brO3$#FWZa*E#?zq)S%DVl>+q^Z z=0(i?n)19klXfbLAa+EU`67cz7+RqfG>&YZJZFRct%j$?_V4;!dB`O69J$;Qthay@ zZO;AOZeVAj@}_1pLKGpIQro~Zv1kdZMcOtQ=Z<`l#XM)SAv>tf*@UoLa2G@Hg41Vy zZ#Je(Ftj)WnY-=)`1JYf{ll;O*H6EE{_(hGG2YTQ%?c=`xtvsM->()1|ykT%kspu{Qm?BDNgV0{#W3*fTJF5T_z?-Y( z*6enpX#8>e?bG#$H)={9mpA%+Q;5}sQvnR+7UscrKZzLF-UQ*#?Cqs-M}Q*0Dz+yl z8+P`%sswKB5NxXGoB1cu1grvh7O{0AP28re-5y}1Ul(ZY_JNv$u5lL!z=UkpFgHY| z(yLr*7*5p=yZc&&Pon%5;})7+0I=fg8+ir-m^VZeyc>J&?JX4`QNIe*i!iJ%HmnPd zp<+nnxh53MXguL65$440FeOZkh$t(9gop4aLkJA6p_b>_KLs$Uhd?MR7?>$Cb2#NZ z0wJj~4T(`;#P_NC!`qyb48)R=n*vXSZ2Ok8zsclhbFXT#;mqzvoy1|6BJR%L$H%k*g&J}<#R-Y?h^-sl<6TesWU5VN6g z?hFb1ob&B#Q)P1c7=!^mi|5pwCDdi@Mc2n>oriZbLVZpckrUwZhT`RI zW@bg?6E&V{Cn^A{{?Bf!uFY$d~;YP=mdRdgAvGlHU)qZtPIIFlAT zF3xbT(RNjFG2V3OR(hU++h}phvLXuvO_Xu$-SF%e^t8GQb2_C>o4M*?mPAo(o&MS& zD!`j|m|DJ_YL6gL5gHoAUbXS;i5O6Cu)2lZosJ{vHw_S*vk`ZI>KdDW!L5L~7xyXr zluRuVo?@Fz;QZ;$zB*TLT4RimA{HaZ2orm4k%^N=DS{O!fv8pMP!*Ct3p#DarHPDF zd@O-pBX`WYL+x-&AhCAzn>~B&ul|B>k2>%&u!wW#)-<^obk*HW5o7lUH~#i#Zv1_k z=5O5ifBpRP`q%xpukVfj<qoDBe|#4EJl!tysDJ(=G~@x2=Hqq$4oJN2`GU>%M)ao=U3cdal9Zm% z;ZlB)$CPp0>??*CZ`J8H{7YQGbxNHhgcrP!r_khP~xyk4h4KI?A#RZ=d z6&j(g7=V()RSM3^9tZO1Vc14Gf`3SFUo+hXDI6oORcDJ_ua6gLU-IwICN?I;?Q}SD z8YW@Gf!-DBB`mSHuS^?8CeY1!n7z6}UzcLaXko-vw7G&oB7+y7Y+gA*l#$8DARCr4 z!_xjKaaNIog_XfWywINCrtKbY_WSAunzmUX9#>2YB}&hsqnt+}hRa&TA11`hJ3SNw z&E~7_SvbHWXE5|#P$w-=L7Ub)8D=ucW;N)lr75>OZXU-yv^h;l2@Tbx&lW+>CWnk= z>#28*u|JM=vp!rhyMC9^X{k-Y)uienR-&PyA?@xUW%l5~V{yv@sp$5pirOekbfQSM z=BQJY5HVb50jQQ7kE{7ZTZRsfQA^kzl3SapHWZ4dx!yG53~!oG1m*5&PPi;ImklQj zRDFdR3WBLK9@D*_0PrV4k9-ItpOC#mb1`45WcLnfMJU6ZxbZ zYs;xIo04=-a&>8TWxX-dc$*(7C0uBsbGhi2yJAuq6c)#~x?yPlA4G8JlilMtooHVYG0oW<*=nCRFX=<(dGGF4ae^=4V_n_Bx@ z*6b=1@L_0URwH7qCN+U~$c%GcUg6b|>=%RuwF)1S)~ z+>;i+nuXC^d0k4%@w4FIXJA$=^j%gk%+(t!l?nNRG@4a$;wfMD;zKsyMUin&!YZD- zp6`JFE(OL*h6Idu=E=Wb!WZ5AtnpB+CXw&v`7EyNS+*%Jh_IKcL5~t^*bYTZRCI4S$$YL%@H^Xw#J$UHe zY|>YUlF%akliQev!Tk7=)X~Ee4=F{>=-U^{G(Rj(p3t#&Z4OtUEvn*^TX^cCE6Ti? zggtTed1L8umW;4Cay(0D*_Mf$p!+Qzcglx&6)HHqe= z8?P_pHrZl$7J09c|I6QYJcVw9yMe*~6qcx7SiZ6FgZVQSno&=7l2)WS^5#4L+~2?9 zOd^IptjB+afNqt#HY%^;HhIGZGNO`mh8%(Z}*%4BXypMd&XyKb> zu0)s9OoGKkibF9?(KCjC(v%#Au26+p8<4UkTU+Xs%-`bb&SAPmGfSO_g-B_5%tP25 zK|cz);j7{39FF~Nv;KA^Pm>i+@d2RPTg@!cm-@$L^xFSK8GU?|(f_23{`~Wgzy9*i zcBG8{vVC3u_4)Vpmv+>DUF)ZB^UptA|4SMDw_iVf`RneuY+61}%=_4<{o{?EKkoVC z>B~7i$F*~C{=0tW6xie5V*JXujH)lgOUQEyJLWg#&#@CC7Vc5nVXI%hHQmjyZ@2}U za%L)X88}0xX$g@{7U?1XtV$WO<>uTSaNJp((B8RDq&8!WZRN>Hjy!Bg2IfsUm7)wY z`529-yrXt7gW475WA()sv%82e|G0bKxVTsoY0fRf7=)@*I>uxb^eC7>Si?=aC~Mmk z+RH{GH-e53$%k*6TP!c$)ulM*B{vI>{bfkhaJ1SVJ}2W(JSXSJbMiaS$xpx3zyI~~ zPe0^2c|Lu|~c0Vd7ef`8{u>hT=mEa(6q&ZpWl@wiJoq(_+ZPesQ};d9#b0 z4fsxP0((2lNlP$a*~hqJlntxJZ0w&vuTUGY3}>P@;*`>-Q$09S_g6#Q^XjV)DCS=n z?zxKkOayxoCA-zQJ=_V@Y+0-3%V0@XuVPK}&L>dbd6uYjrM+B52rd@;&Ukc=53a1?FIn=8Z z-?LLCf!kh?{4>?r)&TRZq9wDP$zlL2w=OJD7W&i@{y}NpH1rC#!()Z&$cdNXt@Mi^ zmD#bE$-vCvp8en{7N0=bv)Gs!dSLw05Uxw)8h>`SkH%A@-Z1`(u<1qUQ*A+o2zvD= zB^sa@>XE$zCC{u<<5J_bwQSCqe+ocFjcEg*w!#9HZNy>`r)j!cT2O6>w(f~pR&T?_ zZ!|!Q4&^jN(I9gUN=mnG=sUP<0_rC zF&lO;&=dEBmJ0v?5C8!8oB?E2O}6Sqo02Zu&4a>4!M7WT)=i@uPKi-S;`p?i#gZ}aTHhG73%?68Iq)zLu z=9v%-3v}Fp?AMBl9UgV(?8YAG#}NF=Gr0>n+h`2*5g3Uw1R0_HP))nx5i~+)HFyB0 zY!d)+85_1chCy4T42JHBwj$6KRO!{RT8ST)-P9%=lqg74hMRse(T#v4)E?Yg;&)q; z>Rzac;@=E9rD$5jT2oR{D5EkuqC*usitd^Bc5~P7icGA(r3xq-iYV3T?C@^k8M6Rx zOCLsAj>Q%+e%90(;}~bV8e+|8ty8Y)9a_``7NJ>0u->_~s)0KOaWo^saaXM`++=e( zwt1on(kq5B>M=7=q3M8fBs9DIZ`mLUzcS2Fb@Um781(?kMF4njyfttTbtZ>()jNBP)-l;}b6+KwpfIa84t2Yl= zESiO8tPB{YTNqJQaoCMP8VN-lHiCHiTE=yblu)O1^&yP(1iLd@ncUmg=u=S{>5{>J z!6btno&yYqSKXbD&ls9_r>VRdm6`;I=q!Q=jlhlm+aT~oN9L>@n92uuc{a|{Aa2qXsN*CDDtMIf47}@++Dr1{yUGdwS0~8cPiwFu%irHvNZ!+Tg+;lZ7 zR|X=he(2p;ysm?rHVJJFJ2heE?oA~Ea55R)HzId&7+(zoEsh6<{`}M1X*cSKHe@lJ zi!e!ko96S*ZRwDYF%-itv8t=_VZ)GtYMn(rQB=uuZ$6%@{=O=yfme$OQ&A91OvYkO zmu0vGhN`<~H6jS)uHL;}m`znf&t`Jdg_Q-ss!Cq9D1Wb`$O&&!$qtUwgd+%jz%*P> zh+e%s85zan#t@=j6Zo*uI{-fy#VN2XH668}KJaFB^Qb>{;114Oom=r&Z~Q4MJD z3od!VkDgl9PRK8q_&8K{4*$WRayuA4(FDHZG<6=z`ll!GH_?MlWdohW2m~%?47+n( zw3iMYo@YLFe$Qxwitq0<#9fMt>v~^iy|Jn&)r;@urD$hCXTsmqjqGz+>NeESj2cgt zfAdfWx%AwMELRBF464QFN|v`7wHLuB;}Z_su}-3ar#`~qo4j!_w)RE|NiT^zLx#hZ{I%J%Kug!-M@XkKY#i3 z%jf_4_dfIEJeZHhps5|(!Z>EW>+*5(jQhIg`@c8Zq|#vN879`3N*{-Aay&rDiy&q^AyrqU3%db1gEqWB+Hy z#s9o`2{e3nWmAyXSklkRO!&~XcbWO1HI36gyUWlcW1&v^bHjHw!$UBwQOuHVE)=>WU$Xr&s;v}~zI;bWNc7?cWHr~>qW>X?~ zj?Bw5+e7gVM-x9j+YN>5tDpF4iuWUhEtx+wEs{6Q6Bob9SqJww{obFoPIckcHm5+%6 zaym~z#YETpw@OZi$kxB7-OUQ`*OE*?6Pcv*Q-3ijWIwv}Jo}Q)*tgrlLs?XILzV~6 zWeazgS>J4)t7bEI35#}^ZXWz$jqk91>BVm$p|m7CmMUA4#_{UwPLYGb;#Fu4PKn zY9hAfx|a=q97Ut!Se};Q+?jF%>l33th5AFzCfJ5pA!~hEU{wj1y9Oj-2(#FeGnRM+ zy&z9!yGwy!Vi4D7a}%Zzt2y| zZ~)DL-Q20>?t;DGZ3cPM3ym@8iSHOgBijI1U!0SO<}yCTzBn{v%npbi#5!#&kSn3Pn>KF7BV3nX=@;U<;W|1NI!3 zIy)T79p43Z4jR`aWnc~0GQFB^`)HBjtXkApT&A61tErmFicS4)s?e0e$h6H}yMiMs zAqD0GHd8+koN1(JW;8NJljVr^hZmcD3_BcJJB5l`=)@TDp3T|2!`ybK$DJSe6gPpH zZ;%Z+yQLg^cPHgaPGQr0Yz8@n7tSf0?Ar$1Hp8|HQ8U^UcH@siRV8sXB=K3CAbCN~ zuT>K8wk{TpBnYg@>G9Ux9MCRGT@ez-9$FL*K2mk7pe0F|AOCK4^poj-+O!cEGmP<1 z^=_1PcsRyJWpevxEzu{SZ}FS!OEM|^p%m%f0qeXPEB;O@v_&8RQo&mY6lkaB?hLUu zZ<$n10c6!Xn?D~j&pm=K3kHD8ZI@(gsyJ^NKM#L7TWYlw0*4ljH*`6)q~twN#f7l% zKAv{Q`p0w+?4!3*My1nlbATEJVXr$W&3=!K^CAItx9=TPW_*uoOjb`s%m}oXCgi*n z;AB^Ht^SMZk4X^4rj+{OSrR9=h=Venl6`+M84#hk)M-+LXynI?K%DQSwj>(&z%v96?ZoP?dND zB5S1%<)q=8*u7t%%bvxs<{J9{DlOa00q!O=6x^)jAy_@|RA3b?3g%I_Q_CeAKr5!p zry)Ug(I7LMH*uIR&EG2AhJiUZp1~G2q$Kw_C>q8}nx=%#g%J&wfyIhi6`(m4>`E|P znsfb_PdA%0Hr(SgOgXjgZ|<5|A7N{n1)fpqc#_60DjFk6fv7)G`>U7+$5+|+)Pc~XO)LKl^r&H zOSGf2^sVCUIJ%1;sphos5v&U?NUZ2P7x*UdzDzPnbE&4MopV*cS4{}kJS zb>MJxP|Sp6>cdDXAc*SNWm3HgPG+b*nT2OHQx#{Gg&y_+Vp%p@aM5@AGPTD@xEVM zo9F)w5Kx929I@-AJ|v?d`nyK}_(gZ85x8uYSmCe?02g z>J0;^i*B98EeUcGuVFTDw6>HR@In}QD5T=2*HevH$w(wcKDrr8H6Tmz*(7JiI8QG2 zk&UvE(oV;r)Z&KdavYTPBQZ9v!hj#jHqgjC>eSrwWOQSc1c;#qo7^lV)a8;xQgwrK zEV5DW3Ln|cBjdhWh_G*sAX@+-3L6syef&fcxAdt%lIb>jyCLNk95S~K1~y39IM{I@ z@tY}&U0;{%rdW{grNyaX(a)>Yjcg?>p&7i$jE=zwbAOt+#SQCfi0#FYL_kb{02JalCp(C){*`eMYHX42@7&CU1g(dO-8+JlxW_`{elMY3KKJ$W~=ytP1Vf znIDh{nB@-z9ojxdVjy%(8(vH(Fb$y2=vns`l8I(iMAM7aJd~@WC>%t?ww}M~lCdK{ zhlAJCVdOhB0)uHU+sZw3LiR869IMf;w)5;n*>cjXLC8{Uyg=a)Tc2=AT4bMq1VZ4E z#CK`z4AV;k?&Rqha_i3pq?^xM54;o|nn6Yfe7?6X+67KjSET3iLuF7R!wnQixJ477 zFOr=Lg_q35FcVr&I9`#4*=(s7`L08i3!0?qyJU<8fLQ@2h4Ent0YRv}7}URBx2*2D_iC>}2#Ycpt)=7;ty0kAOS zIF+*@W;dYfs8zJkJ=>N zpOzVNrK%@Z000mG0E=|A8E1*SuO;9{;Ua1t!(&t$EpAP3J?yhKY%VC79lH9u;$Nv_ zRVQzDT>R|rR$xJ_ZY(5D6(!`zb}2^qSB7lNnr51#?9I>x#v`bAU`I5CYlziPBbKxR zaNCV20m72N=pn&TWrDOwpQobJ5VBTWr~Lkl=Yj!$@|_uIHK|88Vq4$%$sqXdD6)HV zu_qe2JLTkX3U|k)r~JqieAPh5W_S)18`-D)L>VX=cDU%C)?&fGmT-h>g1zGG7V4o8 zG)kLcKSkp?X+!EzX(R*0hHNvm z(5;@n;Uxq2x7r$p3z&O^R*^wab%07x7&@^kn<ZTK{DKEF${|4 zNAe3>LxyrgO90Bxs<%#!syMFO{@h9;T2 zstn`IXB1DJli^mvkE$_okLQSSb9!|{d0RaMUydByTM6u{!-gX*DiJpN3|(0ULE~qz z$WtL#k`+m_sa&MBoHALWKp$EVSq#m7ZnI|$=kek$H~~4;x=v%b`~1*Njr6g$z%GCa zXmrN{4E6PzIy9vDRQh>oGGctLF!|#-;x@9cEka2(LGmXz6_~4A(0^kPn1jmf*~Ke#O;!F$?6Fc9rAbXm`ADjciol_FJMb5wPCXv_u#o!NU!F%lK4 zwg8N9@{_nts)jYmd&SVIBJD{YA*=-I2nQ1^4JY{oi{`G`n~r*G)`T!ibLrYH&>@pJ zaG6d3NtNpEk;%O)W8I{iZPLuDYMDc$4^t(L01Sy?iO_sDZ4;bX-IyHDEE;xIP}Y#A z`Za!kt8d-@)Mgm?c+eOn%yRTpgUUOpnqRWoX=;8ZZz}qsM`f_=sWwMJs#$GOY|hDq zR>tRw#b=kDlQ43bc`Rub6*WT@NVh(Ry`@$~Vjt{EMthT|gG!5@_1Ud|8Jmld_eJ2O zBivh2(mCQ)Ukn2;)=1F&I1ey!>Wy9GMq9~BOjpFh=+5|0PaKxQlOfrDYcbP|sQVZ* zOS+?8Lvh9F!3|*U1aE={4Ni0X(hLz8_#|vaJ@uN%KgIYA+N)-T+sJ7YW$UZZZ0{IF znk4UmfnwD_&{=NU9(O+qMf933oZ%@kWZ9%+uiB}wxyllzx-;_~BIV&TfRbX!6l8!> z3_+5KhEhdq0sk}$$H(By#VUS{ofe}IBX-VeYD{UuErhU-znO(x95rJ^I(JC^YQi{~ZYdhK2Ak?ciq$Dgxm&vo_e38tcSXxBX+SpU&0X&* zVn&%Mg_RD4Hka_y+sI5`rIt&6a^X9v42|Ih?m53-moUaVSY*f_(j~9FqTISvay%nc z+gR7RreV~e9CH1*Nm%RYgiSc%)aC864sNQy1vRTd2c}q@-cNK$kaum) zY~c{573JkFbBvq(lEF=vy&A07oKoDHyGjiDTF+(BarVpGc7EiOC1;GC!$9D|7?XfJ zqyXGTi;;`CA*_8zQUVOItBddD=6c{!kiZ#?{n{Tnrs|e{gUVCoy^*I5G3Yg|emT!| zEV7WHJ%y%<{n{r7#j)`xy9&$Ame`EP-i#=_@<(oF=nUp+#{HxK+pD5=(#y zppJD>pk?x~p0ps-nEV)m##6VvR<*8pgn937u%aELoT)8xD-(TY&OugwVgq)G>qW*@ zv*L#8SXivVYR^ zCT}J%QQLTL84W%X0=;s+TYXh&NQXi-ZX6w4!@L2J1Z+!_swKHt_o1D7qKWP8S(Dw? z%T+5W&YI1r*R8w@c&Z|kf_AYUt1Hx3s%EFwvM%fHhih!ai&Y9DlT&Rk%g{M>A5*KI}r~ld;!&P$`kJ1{gde=g|1J5 z8jt?ebq>%QF#qLDH%T1P$^R#|ZkzwaCgq1|S~{DQ^V)v==_)_JM#pjd?YHNbHh%j0 zx&HLa{KNH+`t6T5DJ)Qy=WNgQahH<{yTK@i=uf{|wvdmqbOg9P>Es5|sqXxaA{K=B1n372$Xw8- zjf114yt+pp0z;9KEb6e2eJchSFuWY{T9ukF1-q?baE%<7mTL&;ZupF=CIc|U29#-S zbFi#@eo}oytGp@m=hYdOQRtfX6#e{GzC_I=T|DZdwNWrJ&Ozw}Y>pFDp|zW53JO7C z-9Uz7kOR%ms)B&mZsIb|kl1*n$(94P>8g^4yD|t*gKfe_LDS-}@sPJNxz|&V$jn7s z;ia(-=xgkAt3y&qEXBR?U3C7u*EGxvG*w-jW3?G6ARrT0z`)a#TsFO|$`f+17|cO^ zwhMEz01#Pf#D{|<`8f`+S6$7`z#yYQP+nL_qa0X-@jdb;EYyWKPOnpa1JeC*7+e`9 zQH~Cs-LVZ>76@~r6svEroWp3=erP3!3C;|miW}A-G#9XU6b#sSu@~5AY{rOu{B45H z(9?F|wwqQK{+#OQyg8yQ!YLOqd7cc|69IVg**2kDMjM%s%K8j*X;TkjXUc!J=mDSv zn&q_UNpB*_98v+=w$#-A5slL0@Vi+u1+lBTfLq%_MO=0)h{*>{;fhW~W#3f7Z(5|5 zFfw~uC`(P#(Q05}aX3GW%h`o7Gbs0e@y;jjyC+h~UA$1lrM_I1=HN#QZq=BvxPCj# z2Bd5=*4WEVg$c2VMmL_0=r3blE_IMs%q#>ixtN@=OWJa=4cE#;124y-7@XuF3irIr zLlh>wB~>V-A&;oi7(CNrv1Rw7x)|`F;=sh9jh59ei>bxrWcKGro>T#q7{5*fXJ`~3 zmFH+xwh_)mQ|Yv4L8J<3b?vqJC#~vRF+p;vRpSZ>>DmR(vrZl&?hW9=xTijsfi=3( z)fW3?*ptTDK!B;gO_;Qe;n-m_D1|X=*YvzV^D;xd8uGkGh0|twBE}G2MZ>8C|p28Q6e2Y2H_`_mY#BETN zVln^TZfu%(xGE~Hf;i4H(D)3yx1z4MFpzi5O|i@O+%nwmj^v4Fkqfqn!d?AbVE^4N zd1_b&p0(AWz}prcmGtThc4(gGmZ7+1g;Z7Kbur6l3DUa0Rz)G%v_WX0Xc`F^Q)#-H zIPJbu%0@RCJ<(^3wA9#G&KDbxE^g0Q748k)2Zy>rZRc2WrRA`oSVXR1u%Farq8WEk zMJcPg4h8ULI1}VEm1xCGWRhjAKHZGfApnEVaO5eUUA*iDy4lQu z_-A>8UT6s(Qv;e-{8jCH(ZVTlqPS2{=cz$nNkhw%!FUP0-bJEz_hPYgZnB z6e9szbdlJeQEefF5K1fFjNjiVtr(uFIzxch^75#$2}OO>dY`KJDQj^kfBVXa~Wo1qn8KCx1BpV;0FSGQd}HcRN!Oz%cGaT-ycchXD?i!Uaka$&Xlw^}2 zhnip%oG&f0oQAcC>3kT)7|vo#VoVCB&1%TgWyAY8GKq2$C3II=-3+t6&1mONSq;Qp zO;g9bIxDnM)s7I#Dxyi^;VxhV4F&>5+OVZD<_l0XuyUCuYW*d?Jq8#nL3cI7n2|qo z6Ufots!g35EJS`rnOZE4XKlcV_k=Jw8Arpo1X9ZC66f}B=7d-r+5`;WWc{$-;`(&_ zz4$Y$`+^EJ)T!ML{PgX(H0NEcp3llo46z{K>-IF8d>5-@bQ-jiGnqjrf41mi&g{b= zKt&34a*nqaKZ(r>6793l1ZjnjVUfG6nN52jYCRfl>fK8SIe&NBq03ZsRlJ;4qTE4M z&~|f#ktseq)+j~<5K_P$Kl{{B*UmE1cEJRuCTmrGd^@_hQ4F)I>U7$E^UN99Td~h7 zQ#q{}%*c)7R1GdyMKbq|59s&vF(V~c&#Mt!7j|QwJLM2v6+6Qp-%CcZatjYZ5e72# zIRkOborZZ*VW7|3B4={Ya*Kv#rFAQ$0cGGbVbgnhLKP{2!asOpQO=t!|2W*AlB~`X zLcF1CvRNJrHI}LG1c~XAV~TJ%2HzCJO;P%oGHlPvVR&tnvE%v!z@vz|_ySq3E z(d?}S-lAgzA5U>TK;TRMm>9LCGU9aOMxPXSJakNS7Jt|XFMpyD{_&#`UM2qg`sx1m z%kf(p;a@&Z-}9eeuW!G7{`%A1zubTO@womNss8``AAkAv+vmT0N34rn?f3CxX^seT&re+GP8S3z2x}XOb|OqVreM0ZJm4tQQEiw?>@Cbnz=>fwAD5N(O%w+x zW&i*X005G;TGLqiq9X-{X9Ky!Qa~xP8Fs69O!P0Sg%wA`Y2yn(wk36{={jW6-evMp z(zJ{m4hz4Vi4mf8X5MVrrKk(_i=;UgK;vzg9kKU9SHHT~MNI`if~nN*w%()!^N2Yr z=9;z>)kXK(r9qmtATXag6}k^Co@)1-tQY<-UD%J=1WAA$maj|z7a2N}{~Sb)X@r}@ zBy3A+k(olPJatM*r}~nTbj4dNZ1Oc`OCs~BoX>9(s~IBj{fNBO``+CC%8tex4l$Z- zkPP?}I}A?;WFB*8`JGRxJd>JHrgDo}Q_;!{FV`BI8#D>+7`B;|Qf7f|URe}N5O65J zH}g7fi}WGB)M>w|k4+dY4a=#Om#M4jUp8!rq=iS$YAdvsvO!U0A@7ol2z?&*SCvS- zRJ-YJ7b+ACy)>W@3_RkCio8dDJO4S`H_ENzw!fL$eby2jr;H__Es}8Je3_4{yU}U-Rvm2>q zTM;t6?T^z@&PVndr2lG`bb?l|HMP@OLEl z#(C{9g_f&*k>Aez18uHDD=e?0$j{rHcc{`S-7PoK}{zg;*|fxg3m_Ag&P{qXtUB6iNXWxLmMjPZOtZ|m{# zp&G(^2#Qvg2Ka?Q^oB@ zkT3B>d7x1v3Q|)@%To2xfvwDqL93E*+N0TdS#g4bH;H*DUHN3#jy^mdRr(QHLx%m% ze-grFFrtg&hyTR2S_zVb1IJ}y#J|YFk?QPvM_E2IV?-3YjX*2)K)a;oFy(LL*d87s zlNG;m3IjkkV9fw0e~c)bi?qfUwMg%|Fu&-E()V}#j=;{c7xTfHR+AL4X?_Aeu{Sp8svpSXB; zxseOV7Fm{DZtMk^Hx}8qOz&5ndpa~*63ChP+^*h<#5j%ZZBF$)kD^EkanQ0(@JEVLo{%H|W;1fg8FLnu6F^fD&1wrw=q11f6Mv3h# zrJPIS#?{59)MHm{yhozrQ+z0aWUkl~SR4!<-z*|(R&-X~y5SMlBEDx1F^rDkNJY#h zRhWgrW)M-txI`;&Mszg$S0taOL135~x^iBE+z@&i^3{!u>BeIZk9fVFJUb54LAHS; z;V0Lz+niZ$b%@w{j9ud%o8wv@POscVVBA<0^KaTW%pJ3DUyY)ova2r95!)YzYZs{- zfzH73K6MvT+%h2)E9RwE>=z7fM&tvZK^d1oBI(qV<*0o=-Cbt4{=~?h7a>`X$f4Q& z1Cms>FT`Rah=YEDEP7Mm#Dy2=;{CFEnMd%pAxsBeMh70S)usd@(~f3>fuT8EfyJoe zreK)}bRnIK6VExo!r}!B%1Z_~KX((WV^9_dA{o561^L_-Hynn+C}>{|@Ytm27P$eK zEmkKstF!sl<@7_>l?zXLh}0T|XqFOEs5c=(+LFB1DPV$|xt;j#J;5===dxX)uSEpg zbpKX)9dwyai}apS^q56iolZBSZ2d_lBaIGbm5Ndw(wqIji~teiyUl~IAW-u1yStPU z%(~CJ!U`sI08YCTtbe=piVd)H`qjVl%zViu?rhwv&~lg)%xn}jF1qg*C6jXt4T=p_ z4eF9vUSza_v^MAU>~PpK%cuI9Ww8PJQQKTny&4o16Nm_ss7b8uD>u;Wu zB5w9ffGn|wB7iKEbhszZvlzFEED)ewQ$#NZ#cjnca@2GJ+77w;$dlM%90&<@wL2j< zM2Ni~PkIrBN6B5?Ni7;4IMY{IG@CF@sBprH*y2-75CX;`p6wcf0PYdCDgMcZt7}q% zoz66wlMi&@BCQ^Ygs3M(1-=feRCLbN$8F}O2bgwywE;4e*hm-(^;AzqNaq|hEp|bI z;UEkcoT?4025#2m-Sd7OMxn(ix(bt8dqfq7vNOJ0?yAduz~KaCc7A`lHD^18K%edO zuIz5DiKib<4HFnfUBa$}`ScutDAFD=_{?)S*RtVlPK0L-0Y#R%+8bApa2>n${PXY&Os)F&qvp`qtuLc@p=(-vqAK?tOWKrfDdPF z0gN!NU;x>Ig1J?&dAi*R7+_PJ%)#Xz&K)uL3@~Jx$yGS3>QC-1F_v6jtD7C>e+92` zvofg}E^s1pR>Yur(J;AH;Ay6+uKpBj#2eo67P;I5-Ui4JZRdy!Dx9T^0=j3}ZcBpH z&Pv$V%gGs^jVUOo0OU3yqTx9qxG}R>1KrsMvmL9#Hcf6Y){O>zQ*@5tVSguhx496D z1Bb=&z^TNuXl`8$ljd#0KE$(2MYD_TyGtUfy97=%eiy z)f=-zW9ukO60BvVa-2}7T*;E>Y<{3oB!ZaqG$iZG$ne#{_u`v|%#B;#gLsNaY2Vwd(-*Go;B z3lmqVAvHVFMFB9=Tv3JGGeV!!=q?O+7_A{j<1Xbk>Tf)vE(e=#zA>bQHo%($E5gK> zDIsQu{55&jFg$7c>$O{0Jq-bRtD*1gRks?!{$V=9VOZ7)YEsrqP{i{)MxipN{V#TG zP;ZC)zcG>0$@jTi_l*g%s|{<5xc&rBv{-B zJaUMj<27-dw*l}a`{{0$3}gt-HS87IfsoEI9%2x=I5)Tf6V?Q*BrzA%qm_Y?&5PeK zFXQ}%%g)s;7-p?YRBHQp<-ge-O2KvK3DSwBPO2^?BP{_zVEzneWq3iZ6PPK zp@mHvRCUmaQis2xYC~o}>Fvu8#MXiunLVhvQ+&A!tbbSVx*ANx4Bvlvv~NYLVa=Vl$Xi}H3;gNosn zQG!VK%;dzsO}(BhF4yDl4qfoT)(k3Dv_ zBfYh{R@FhLON3eV2K*Rq;FDpi;8XN`>@9aiNn0?zo@dN-7!h~rE-YTqP1X{n<}OQ7 z#*lFr*w($>FzGO2M>#>|=9E%CiHF$jKh48C8Nhmb$~~Sj%mGn(j?*;w^!>Z$8}+rqAtrWTGdx z<)Gx0mW2S{gu$W7jGmWmG~YdC5!!uKuc2j9%Mm=>9P%GB+n|4TX?@+=-5C{l4D|>s z$c%x4w#fNpRvbMhA34V3JJNjYSFRa1HK9(C4d!KPi#f}%ip)Wn!wrLmYYc}}#XKim zeY>}I(vQUUYvA8p!4)T1@8rz2Pmc{+1p^jBbg3#vumG@Ex3@3aXV66K=o5t}+)R)$ z|7a$Z+{Rd+3W;eD{ea1M!yxCtzKNVZ6eL3i#GcAojTC&95sPjFf!5dKalg`c0Bp_!gul#NFMzhH`vz*OU z&RKm8hHU>=8LlW&Ym~8A9`h6dGia9moOj|lnico#jRCg_!{%n(F&aVWf|nVS+PSMK zYp%Vz)7NB8QZFYoh1#U5om4f6oeA_ZdP@^3C+Y_jPjrG^YqNPj-G$yBldHsAaS2N9 zF(twe#ZI|nHi7*o$1tg6yY{S1xQX z2{)%Vqc?;`npkbCD1+q%2{5m}QBrk5K3e+-pkNL?`FGx0xodFKnHaIEHOgc0=?n92 z@#e?A7iA@C8?bMyvt3LWQdy}&Stjzib0%}5_*ven&R5Myb7q7Z=c!UXOWkXmGpOmi z*cB{Lc(u57XFgCgWn7q>iC+5$V@JV!ti$Urk(1+_|A99UZAL%*51xkh5(Ay z47{o_XGjJ^qjjQnMpuJcC7LS#`Q9~kITW(Ig0Kzd63&XF2LjX#2%ipR>m1J4x`~>?X zreQatVn|`K{Nl=O^ELYiVvWlzfTT~GzEq@*p70+gBw4veF0Bvr;(;I-* zyh-F*st9QAxt)QZqZv z)z6;)yk#y-6-$2L5nidGS<;2T(muC2-r9G$%Sr>4rA{g_N#n7|q;waS`j zy9!SzuVQ&g52P3ch|HpqYI!>VkynB~swfN%bg~bbuI(kE7kkeloDGOvS-M)_I`%&( zAJ_Py?H#w&3e{+A>l6B>&DjXEFmBugd21FL25Er2AYg^_*ymtV(veN*VwLP91{65-dx?@KNAe>!!;g#kk$qjdde&CM!=%q}{<4ews8rtWJgFZHd{JCO{eohkXpU9c z*b~Qx&jmaRS+5v3tD0*zQ(c%ukHE_55L+X0xT;K&CMxH8DE{*8W;SIWu<5BKm3lKG ztI8#{&t_xv8e=&Dm2g>Cjcf%T9MZI+YG_|=RHd=JDvraiI;S!s%YKn?Na)!Xp zC@|FscvVoyHhW3l)}bSBVaZ$#8X77~MZ$Q0mfUaHYN?@lCYZ(wQ=pTmp*)$Sz%Q1s|NqrwK3Pm zK5PWc$XHl;9w)W_bnB7REO54PwT6d0lF2JopHQ34l;x1-K)yu$G#SB2jqkt4dtiv0 z#(O?HF>EDKCu$%z<7ChP?F!YnA-Z>5cP}B(68pGdnnkkdZU*e~<|&{#A#6zgD^G;% z_1!;@dIwW2r{pZONs%TKag!Le2`kMiKJo0$m^g(0ieh>d>BE_TCIgKO)nF1t(M4l1 zmyRq@pk}uuq^OF!TAVzRZOiYysro(@jBRc|39(7P-LwhgA7v+I&Oo-uO_{wncK2MP!C%5harzNb-8=i zvNbr}2blxHe+;@I2vL4x$@FYT6VKy(P@Dy4F*Po4j4XSeYj&GiX_HQA6>W z3QpX_m6ey=jmeui*db8Vy3V~|6%n=?>bWZwTQCZJAhbY^HOuCCwKP))W7 zv+AR0CM-YZx1au9s6;l=npAVUzPzcw$OCi(xJ>wmaM$sdFOU0$Lqj40YO^gwQc&*< zs$ll+^x@8!`ERk88L7Di%oI^oWp=0lS`E-X+3PFGH@V!+mQyC- zM@$8&h{zWqo1={+LRsYxx%^2TVF$J0jy0XgBpp5b{H|&p^wVsaN;0?9KZ9488)+4Q z#%!X=`3^Q~G3jdZ!~y>k2|9PsMdk7F6f@ntt4II=ZdJt7?zH`8ra}S?dr{%V;#}=E z8gpbZRGSu%unuo(7g^*?KZJC7zmjKV#(4fz)u!kuH3tZO1{2y%LE(L4KFV*I`unUA z#iyKS0%Ry36MwPUK#;!g5BcrmuV#uu!JHuA$Ly6Ws%CzLqHoZQ3b7!7iVQSrNt+Rl zw%Ac;cTprr>^io)uG3vKC{s~;x$G7FeTFrH=^!F-c+-R#@~1kV-vkU&>r0Kd>M8=w zX5px2!2`SE{C?4bK(mI~Q2Z(UUZg!Nf;aJ814boniYe-v9hMWay~kuT8Is5Dlu50V zCc0JMrzB;lj`q%*oxHL21&QRIRefiyENE9QVRdt$pE^X@ssJ*XhM*xFZ{AN#$Pc*` z{AA=knBn42w+spu5ytdA%tWyq=q8-44%v*ZCPx7n;?HqYWA2fR4HZVKy&f=0COtd{ z@9D}mojp3y)w1`g`wz8X&0P}}{Zr$gy-ahGE3Oe|*12a+mDGiziqvM_blC+m38}9o)tnA+1$uo zxxOpclRA%+Q!qX64B8U(+q--TeuM4=`q7)uXnQk9^vAmPa>1=St zs>Z*MDo+Qhm^yn>^(<63%($?ECk8a*x2*%@*kt-=+V%<=pAKt^D)ZzjbbRBXUY-E27p*u_g< z24Ir|xvHMStJ}m3H%)uIeORcvoy@5NWj05{b&1F`=D6-6+z{QW1DeX|A~i!qAW(Fz zklj6T^Pcd#t=2P63s!kS+@1J)7jFQz1*`G1KtUfP5#(Q}#eF>Wz|J=}E0gomt{HKd zXmZBfJ<2?9^y-`>5C0l#~PL`T)1rZaZZgTcl z`^X`fat^K;ttmTidUun0HdC-hv@qyrNx>Xq!I&7IO}*xat7HpzL;zby$Q z$yloW@WV7+7I>oOge>ZrFFGOAS-ayPsfP)#sv0~DRt9Qklfk5>c&Iq$`*>==!$8&` z5ZzTykFycqPr>%diK3f7RqRh^k&;gCjp%lf{HF*)v%c*CzZvH|(zM(4ey=ZliIRjN$WH?Kr;ku@6~~97 z#qZA(afbm%ZL znUim*sgRlMyH?LH_-Do1q=;u$*{8Qg*e*I8RF`;6RLPQVH>FP3+hW3G4G3_lN!_E( zcqFRrDv~f|2X}qRW&^I++`FG*E>-#I74rGPcj4{3brogye~RLQ!{v5zR)|8gnd~(T zuSfidN@SA#g{6FX-9tshbTK|!<2iCFo)om?jfu)-T=}X>CtNm8;Ua~@$rk!llO=~-m6*0)voeu^7c^%#2h`WDyFEz zl!lTM3$5&7WXkHEl5V(3nll;Qc@}%z5?7fTu;H|xDsuq{kNQa+MlqPXsSsO@xnSNc zu3X*JqScoj--fD&C&=)0)kE?rvc6KYXy>wvS6ZV*_3rATR2OSNMeEGk%;MBbBm|Sb zXi_6GtM0uFURYHrJ0lA&noa;+6Ym$3Eb4(KgdJT!zey7V=z4r%506e?9R$@p-y|A4 zv^$#sb$0)!t0n&4TWtpSD$`CjLWfzK)hCLbo!xH%HaZ*RQPscSTH*b>yZcjJWQ%*Z z(~U+Gj!nU&^%<))wVLXPOBPpGKYTIyV}fEov3lZJKhwKwpUx(mnf|06f&oyHU+K1~ z%+C^o{9+E_7DXnTJgv{%LYvM&k~}x}+M6AQN_A$CZcPD@5E}y0Nf94;OrEX4!hPo2l->s^W2%l*cVl;s>FdrSEb=)a>bp)r4)@+~WDW;^F4m zLBGu&3B3@zQ}rI~wO4fnj&Jo^6n*W?hq)Q(q?(k)q0VUb={KJM01yBGm`b$?gGnZB-z7vFgH6`WG%k^mh#b+jqd5WlY@ zZs-P%YfQJAzC5dGd;wKgFn&MsBhlIEG`kEXVcN9YJr8j*t299=JP?X-j570;!np~u z;adP@K$^d}%y3mJ!F{AE)#w4HlyC(2loz$Hf^+frFYZW=Dz{BNt&n|@Gnf0r$voO( zF9d0DC*je(E`f9Am&3<>==RcTNVV`b+22>J3c^=MtprwEwh(5EE;^r>G$hcIZ*$=7L6 z5}q=lNivI#q@hFQ4E6X=jK=E8i_;1fsHzP+H|nWOY!4@Wt2HX8q2VURk!|Mr5@Iz8 z!q!9NoByc$#`lv+2x^+9^5sZ0k6T}yXkD^E7n)7vhtG^8w4!tQk&+u6&K%cjz4E)7 zSIx6Nj45FIv}y;8H^;2BB!J^wa>vR%YcbZ+z%{GTTNf1Y8R7Rl;cj#}v8^_62RoCR z*iGD@hmCkH&?6rYV4p{#QMCBXcxIh-Tu%G z#En$-ggx#P(LwO0%*HnE>XvV(r^K(}uXESV87Ie(2b)>$ED2<{nwiaDX9|vc;+8Tj zGm-g;>fPBWF{!}Ah&*mYCKY(IrJoR?Ag|Zjw@8;>{Z58~L24IKj_CH05X6iH_agpL zHFXzLKvnWlg6^+^()BJUYD?#z@2cB-nMI4nNC;MQ@6Oh{>SV-`N)KG5#MGLN2)`H8 z1dX5URx7GdIx*zKv6Y8SXFt;&JkN!XV5}iPsI&z7V-*Ne6m3c>f;giHnit}3%&Xhfa zw=#u1O1sS%LVRTpgkWkpBR`7hemc@w`Pt5s$i$3E7|u-pHz)fefsf66v%htcq2rNa z=qSz~<3*H-$%$iHy(){L19+F2uqS@Y?|^T;z3Q57RMO&XnSF%Z7787;#&qUEvri=s zZZu?z6r5Qt2jDs715M`-DjFs{p3f>2Nk!KqyXkKdfsUuw@9l{QMkdVm1{zEvy9`~D z;XEb8QPsnvav?iB{##H*=_B8FnNKYhJheREUBG$rk((hJT@J_T6Z-H(puILL++ZkX zt@_zLQM~`$1;%SaRnxLlon4Yi{X65U@|GA*As4k! zUA-K7`K`v$*Hi(a0>*Po^vYt`C=;tH!C^BO-F>lcs1|)UQFa_R+%+Bn3t^a2ta3hb ztMW7~sx>*)FHw4?iVi)d#P7P_ah{D*LAsFB>CxP+>vp0;SVFvfoPbpIyxD4Rss~pI znuB|asi{{U?r^6*+!M}G_}T!AaYhiz;^eJKeKwh662ONJ(-;!-#<}ZH$*{M*Ju|J3 zpPZ`Dz*T1Lt5ZwnnX9liRl-bHcuG`q^29(;c{01E>Vr!Z$QpYicQKpcz32nvHyckH zqa~ag)yI4qvNkrEEsJD>M~d;0-2xFTzP-E5h77#6e9E}&eWDGbV$*9R)yWIOR$Pjd znkR2nTqkT@Zl%<8776gAdYg6FUQT_Jn820|Mg;Fn*uk7>OqG}xZsyc8#aNQcUfoFu z8w`1Qc1pg-jjCO6)&t!9d(=<*4y#rl)o=Awg)__Go=q2)?qcWo~SCGAm~>)D|amG~7Bv)U)>frk%8#V7UN zqgdX)FZwigl1yIIJ+sYAB{@@D6x3F_fzmDp-@ceM`7YI< znZ2R-s-D4ePMqmns^4TX*Mvi%$z5ZA4xNvioQ~7rB>5b}?UJT?dFt6o$wcEMUj014 zEHZ0atlz`?P)LCWriA0nT6iWt|t(BlUku}wO8aAOx8)otr1)O$Bi%Z?M$A-wOJBskEYhU z$(B(P$9Fo?p&Pp<;4<_sb6R#oflw@LCO*(D&bo>x&$hezx$rH!7snx{s%u8B_Fbk08)fE;?MN zjf@lG>iH5)ZD2;hd5O02Q2ByqhECl*81<+b0{q_iTJJn5=5Fj3^zKg7+N+6?>{aB) zCla|EW`+Mi!-NqP?06P;MEC}>3l-tQoKp8X)22zAnNu>9vBhX;+Eg8hYVMgwM9qgv zN0%0ao?G@iCnpn>;f9T-x3>Uylm1=gxfY5Zi^QoaNEgAfM;`5!9(mj8+o7L z#dxX3h%Fm#+5fBh#6v$k)5a0nP_c#|PSXuLWlx1Zb@5)os3Ngl9vcLN*;{#brZa1R zYC8Bge~My9Q}IWm#zXsQSK8tLl&Y{v95cNn0fEEs#qN^faTsxg)t;V;FwxcE)fBND2wS4*c+m}y& z-OI0kjI90J{`Kqq>t}eiYr8+*i20*?0aEu-4xCq=mi<2Z^DG}7$$xmYbWB#rOH!zq zO6$?;p#h~sS7%3p%3=nUv)SUrO)trP? z9@^}b*w%I_LPk+@!oKc@UBb;SES$a*?F7^-)qGv8A3iO$a8pZ)Ek6+cj?H?SH=o(8 z&VBosF2{3GF@Or{@!l8EY<;cksT+?f8MsZt*J` z=edQx#4gV%6;)r!Ut)XvSpeP*B6I6BhJE|m6(wq8LqcwfEaG>MTT73pq zXCz&3VI4u6Lww~TR(CaJwAsjOD&67Pbf~Zk zJU)tVT`c@Xx|l2snK9EQa3Z29mg30sy{ieQj{XbcBj_)r29qX6Qyp$${}i>k%$V zRkZ?%QW_?1B4e1TI@lLnDyI7P(x4fJ4O`DHX!UKd3OMJLq4Cd|8(bJQY{0XiQx+x|UGhb()>Hi7Q;)VN}JR<-huiL6V>oht5R6)!*;jE zVNB}QHej9e93mJFvn_GdZk&rVuh5;*o}2Zk3t>WkqPLToFT8|A$ou(yoNms}!$+6c z(9Fi;C!5`TQ29e!K?VGV9$VAPXJQK~MY1la!>SC=Qv~4rc4pN)G;UQK z-;nOQZa6g4%>Qu(_)N$uG=RbLkxOn)LJR$xTTNy&i)U9gFu-sFY9M2cZ**A(mTk^` z9@Q)fVC77D3?nK2%xG{_^`KqkhEab)CHvJ%lV4&%(Kd}29k#yz+@_E}+4v>2Omdzhgv)ML#j z=6;r*q}UywZaMQN-MTyC2_YZLbX2oQQFS!A6vM#w+12Zzd+B0EN)6sj2xGsczT{F{ z##}46EY2YZ=fw{L>ZoURiL%(|>h`>-*|NZLqF;~{MfZLC{^u=RjlSi5FKX3_wJzOF z?{6j>&#vdPdSTUNYvS0g*Jn?i;>W&7U*DVsFH)m#qxYz2jmzk2wRO?Gby#Q%?tzb& z&&{Sr-#>2|&H$4TH+?17GRCj0m&1nl-*`1XT#mpddU3P^tATy*IO9Cg5vjg%hw4R~Q zXOk$oxfdrZtE#-O?od}X{JT1NUE3|YW|;&-8$5TH%DKsTApign003Pp3b|Py|LF#j z>hpF>E>G1-fYC5T-UQF78)GQykg({>**nlXZ3bFbE4*zFu=vm$qsY`6(}O>||O z+hhu`)L~mZBT_w`=kUoz_oj=Jjf^yYcGrof?h<>sgG{bnR2WnVx@?qWQ2GY&UFcA3 zG6USu;3hM=*}5IAF&*M2j(l4sTY}AW=lG<^y!y3l|K!#EqbcMqB7xxkm{t(GrdG8|vz;GI+$ZhG7uj*xhV*>8}!nV`{+GC#gJp{bgkAUZUY-FZrc=E%cqhTnUr z-MssoX(nrdnHw&TCVwAa{A|7?TOPRsl6HN^jpBiWF@l87Oc|MslgVh1cvgs zXD0D-D%qYDvMAWbP=&VeVCaSCOxy9-=XTT?Pt|zAgOW}mFHcRRSWT6`y8%pe z4wXGM`{wsa_sDZNs~&PcZE`dKA)0D>t4+4f_J00$>z--AC1q@4aB|QlTBzfw(HK}S)AT9cc?rPOS^ZE*R?;cDm{!n71lFom%n}Q19SBaOQK8 z{i;H2cD}!ufL+`|Uh2MaRX4r=%&3R`^KM3ZQ%|@h6FYsh{JzIj%h`RJ@oQa1Pk9L; z%^pq$angMCoqAG3R-qPn^#@QOeNNTI$~+vp61g*l=<60NCecoAuuk&~(DE!&e}>PE zNv6$S70oHWEW9yh4p$S-aZsV~g~d2|i?aoRF$Fo}G2z;(L4Ddvt6RUSzcD|j zOw&z;H1#9(8Sf*X_vt73$iUxp9mzUXQza{>TW_GBB9jQVS698zWH(4Y;oaL!zhv`t zyQyJ^!TfnsX~S8h{v36i+<-O2A*oTD0c(q$j~)`+zuhXYsHx^IMK#dD!D;=mStjmF^PTT+RKa~wUPq&wdE)xC?Pe0i#Cl*o02v!O@ALlOtKsT!BIOSWS> znkL_;;tY97Du>%)olYex`AhGlQ(`GP)Oxtf`59Jqbx!e^$m3S>sbzM`W*O(L$*LOCPt%HBV77teB_7cg3K51So@52y#V zHpSf%_4#eC*337AkKT%1Z-gGjQ%h{m`}Bt>vPX z@w_mP+GMV{i`nj~OnaL7N}h|C#E?0>g{D8iyO)ZgIV;&5Qn15ip2is)g2tv=oq3@Y z?Yi z5o}Cy;8|nPhx0R;i{clFE7V+gXRK;?veh?nN={FrW&1ET6%|rfPkZT(ynOq2ogmC- z=ma+FNAZa|hO4}7bD-=N_)d5!S6!96-5z?@#pqgUH{DU@u07HjC}p_+XWb9C>>R)6PH?KBgJnGV|M+|9pxQdx|caC2%_Jblqy@Z6vkgWu1I z&;DHp1vf{hyP)aKZMrxNvc7fGZ{Qu|_o4EpRkm@YK%Ip~UzII&2UZ*5!ovoSfiP?}_ z=Jy%y>*# zvZxdq@?@&vtR%woK5)Kt=WJbV8q+nW(dLk|-D@2pYEx|TQqT2|kZ@8^Rlgrb`)MQ9M)@xDX3gIL(|IPW?qKjpQN98t|toTLuE9!vI<<|_;-rSAUNf$7j(&ER96JE`fwn+_d;r@U}Rwqf?@w*kZusRtJRf<$UWVM)W+cF2!$>qkLDgd>uadN{@-#D1KcjMe~mx-?t z#tbtkdgwz<32AP&-t3h0FIF?xca!mM`GA$&)kO`D+;?WJxW%;Fx9Od8$ZgUIPQOsB z*JgQ@oXI>@#f*6ZrYHTFY_X!q)gd{YEl5=0PcOR4?Do{S6cgXwD)LJpH zC%3Ptd^h%&JzY%AwC^No(x*gU;e1y;WdA-2+w7}OI^1EL^KiLxI;y&Ud>R||3cb+NlEeOsYj%0tJv>v%d^5EB@qOK+ zm7yXut!S28SX3oXDtfs^yB^zBmVbAT>U#ze0Q~{=lfUO;ipgv(KCA88RlY1va1&yH9e; zK?mGJVNsQw&ziGPRqo^+dAVn2?r$~@+8G?{`Udf8T%;PQR)a?~={=<$ch5MM(45g# zNO}}=#~sR~32nTsy8!o;2)(jQm&Cn zHu?k2LyH^uc2nBa_o_|xTHGM}tMMMHzsM+RGQaSK%c-@tq3(b{(vn|8CC7cFbarx= zhnxQLzXiE$30X?_`em>^m2ayivM`y{*)SAv(u?sw4_(kO+c$i(Ob#Fy(op!jsgGpx z>kZkRR`7qJHip&a?O}~`%PddsC#qvIHfD*B?2(x0bL`oC)+J@HhYlKvI-=rX=d=_xitzCEKx6k-A7LLZZpV zImZBcZ>=6m`3vUAv%_8<@;dXO@*Mfs%OYEK+U=JS{Q6J%y%zzEJ6HXSSgwD5L0ID= zNpU&~=wFrAof&CHs$i=jhM>D6D)crZ+@NbqS=y@3YbvS=d#==Uqs@?NjDC_AIMzfz zb2sm&v^z!q zQ^qWZ5T!3_s@%oq`_0L*7u8KfZQoq+<{kMm9#X(w=IKAnOdM0Z&JezdG3I?cF40=L14g{hq ziiXqoz~&a?C3A2bmv zE~MmD4sU1Sbzna@OKObmX$vTcc_ReD{ExZb#P>Z3f^vaZbEB3q_wQ#AaeLSo5jh?? zR>n4+B4}Oz3tj8^-_W)G;c{7ipRV-}|Mr*v_{)F%;jg1>{iomm?w|hkcmMRq=fD1G z{q4W}`9FU5ufP3y{U5s4*KZ$x`@jGCx4*m}|MEZo{L=V6wQ>x|TWr7u4mV5Fp@_QzvIL0t(s4^#*$@mG?(q#D`vjA2m;gX{QKr)^YNiEN8+BKf z--l|Mn-xj22irY#*Q5L zb^PQVHjxu{lcjLMHSFvn85$md(@ERkMBE$DX%Eo-*MI*Ma^_3c?+y!g|u z{*0fI1XiYto-0P|=34@(?!UvXBu*skL1XAyeK4=wnP4)?U&Mjm&w(3U2m7qCT!myU z>}LxBi)Uhr+W~`9g5h3AHP1JqoR2mWg@-@ExXFe`5C zW-*Wign(a!_?}fOOdJGnC9w8wqm4PVQ6!av2kbkj96N;mUfHu-fj$J}^;QK4V<#eL zdpH3ySF$yDwBHGx#a$=AzYc;I82u10Qbbo{Kr6K1w4_xHbAdFv#ge!HRc^^)Nt}&B z$+fd+d>Czp@4gpf?aznk?XC|rAH0yc8c}IhlQnqWk6O-$X7Mm^c{mR?=&VlYkKuTw z;lsEn0CECLZ9MV-N*i~>%V#-Y%XW)gA(>b4yL4J2D9z=DE zCRm(PMrfA)8-cS%KWRcz=XDocQDMM@0#v*CPalv4nf1sJE1AN$jZs~A=Z*Mpz*M!q z9sBZ?g@q)SlOaVEbYDlBY+ZX016eRyh}8oTvi@w)(U}Wc7zgL6QL7NI6J^W}jM5;x z*6INieE=WUrPc1-EwpRq-tvYz|KFVoHHAR=yVyH1l@n#tu)J!Z!AupeTc(BlO+Z2s z^*0a>u}oT|TAfVNwV-0!AYLA7$uYLPsJ5p;mebL5NUpvPKCpT+yJG8+QfUC%oH-p7Nig;~lF*1?UT$`Pu#_=QIY8U)d#qb38 zxB_dnlIm=~ZDWW1$&90Rfe|CO`3{blV1KQ;*buW-Y%}Pn?IvmvW72C&ICz8k;J8#wtku2H?*=Gd67TBBurX z)oOWRQhu;i^mqEZ#K|5b78WAW(0?WAdaYk!i5upYc z=MffW4=cFA{aI}?Ymf%dSshp_7V?n;W*~$>qUm5Y$u<(Vv}8Jk{2kw3PAp4LN~dM0 zxYM`S2!-VSaX^R^TqJbyO>~#(y% zu=-=L_ZBBDRA8GG-R8bnNTA{pwcf9e5mpXx(O_;?33XmU@e0Nc^JY0YVLn95)$qks zY*sq01Ap{d7s85N#k&G0_W9k{5osO9v>#Z1gLMDoU7+8^>L^LhO~6H?^#>FFjVNt) z-A^#4ix~Od&S08%(GA69Y)tDPi;UKj=inf|1GiArZ^9_z!vFlIlK_O63Al9#wXaSw z9ZBU-|6p|6!r}pNbOQ}oC-z$xe$`hB=@P0|L`8tYr*ZB&Yvd$lVD48Ux9ZgT=c{Gq zh=V#$DLTDg2-*!|f{)hnd)A$+De)w4f_&+r)Ncsb9AV^tuw5pB58|V(+2^ z7g3?h3ST^8*p0=I1oV3+ihugBvW#73!qpyg^R;O8xAP9oU{#{WCNeDB?h{;#@d2zo zp}<5ZU*~x}tO&`V_qsF|$UPAnnx4zgJI77(9;IV&va7rM>4q>Aqpqk@+s|KdiLHs$t?W&KY7*ycBNQXtQDf{Aqfj4k z7n1%aZkQOF1TD*dh7#V?h@E~1qrk)8+gw7dUq9{if|*Sxtjby=*i4f3JA6*_t;8y7 zo}@j5iTj`;ChT$+bR=vEV2rh!yiAa9v%l4{Z+}2~PX&83_!c-`bzve2j#Z7{63)%G zF+%KcR4|@(b|z%(8?EXIp6tITDomK=_wU^&A|eDpC&t~nvuW77Zgn3CNflZU&OmXD zfM2oZ8!UJ+sRXw@C!BEt^?Jh25zCVmg1#kRE7B_&pHD;h0Tad-i`MM$oP`9$Y>)q# zR+BXnRtZ65b+5DOvww}jTR{7O{u7PVc3xSV0ut<|6z4e@2X6DW~mck|6U@n9)x zf-}I#W?off*=iG-?1D!YopmRjVWSo7gTyik?OR=n1@F{q@x6W#pzZ5!mc~7Js}RYH zIeQX_#V{cu#Dp+(_CSR*9Q}-aw;)e;t8IL3q>xE79sV;5}EUsuuR32cj)(0f_TgX@j`p4MBF{&>p z7gr(LJfvvhCiS>>?){1=dt{lBrw`Sazn{JB-mU$6iCbNSnL%qr)XkKm90 z(LV6!_^039e)Id^{Kp?|&;N6k^T$8@>-#T%ef;frfBeJ${rb!M@wfN?{NMk*|M|Dy z{q3LM?RRSHZtu(E^}gTkkJovxLx2BrXI$RNkhlNb@7$4N>b?5iH`d={pa%(Q-JGi! zP*LkFXs<8k93&$6q(wN)PQp*>s)t%>5eAnDI>SJ9yojNFW^0d$v8{{k+%d_#=zJ6Y zTib>BsXDCp?7Uh*%VEnG2)6K3a8MY_4^a${G5>-?n!iHy{)`zn;BM!UozHcd5X~D| z*qtP=nTinglYJxGJqhPQ5PE`N?B1{TEA4w*y7$5~se72IvjM9-NRP8>*4c}+UcngZ zQg35AYw`lnSwQARd{Z;^5y3Bj;Sa|DCLD{MMsWaUQX}b{u!4lj_G~Xf)WQv#%3H9e zzPP)O`ed8n{=iOmvMhEdo3Mr_@EzIuAb|>fh9<7h5K(Gx)WqdxJ|E6JaZP~AgTRg{ z6x_IpTAPCt{_Y0uvq4dN^PxnJZ^&x>&mqRXo4ab$L@LYTIl#**VPLF&132koR-0pp z9-Xz8fh^{<>41HCyT}+42022ie@aE>em)@bU zyCFd8=iBDh$5d5^S^pRok=j>n{XgH=m*u~4WB>J+8~g9w*tdWE_dopo-=2S&8~c9z z)9?Rj|I_tx{NXqE^&k83r$7J8pZ<><`~B~Kd;j6DUDtnoKmPLiZFh4!oL`ES>(A@< z%Tw~RzV@F-!x4(3_5J!k?q+a=Bw6C!s(zaMG!6c+LI4&4j{MBoM*h|$i{uIXwN3I> z(8&$V`XT&EaGE#dE>fWl#~m!}Dmb=UQq)^8efMXPkaf5}p-0z=X&1eaP65$7QTJV) z*8ar%JV^99|8?Th2R+?)2sO74ruhoDwXxOR0kBhEj2YnWu6{c0-lC4SfnAGp&FZ-` zpWIlYZ(o4G1|oJnW)gLn@g39}X>wrCB`^fgJjcr4Q*YV6u-OJyGj^r)=*-93n3^zI zVRdgx326QgT=CNee>OHve^Lun!?v2dP6SMSZ=%#u(o9If1nD-m5$06gPPn+Hs<3UU zvKEGz;z7)a2tbkdZn-+GHlKI%-Xwg*A-%|yiM{%}Sm3V2vk5pKf@J%DZ9g;OCGZ&2 zY3Fg<<{#+L>VyZZ*Nb{$^?%v*&jI!Cfzb-KO#-OTjO zew%Fcz8_|LiP{2Yh#G&3IJkd9KbjH%01yBGcwSfW2s`suh@m9c;2={?1zHK=a)E@o z)^VRn-I{T2ViQkh%ce;Jl=PoX0^6K4@jJ%yZI1U5E_XmWub`Lm&O&lDIw7sEvKg36 zFXel44tKf{_O9F4#5ysEY@x|Ds|Fv!imsw?>Q$Z;H$P0FZ4$Prv`xO>BpYAkh-E}t$Y~q-vs0k-bcRwX$Ps*3afWdrDoIGEt_BrQFvc)Pl)1no&x~H{0 zz4NI(W|hzOja7m_>h2WUbDCe+VLpMnepCimPtyjJ-VIgs(*rPh5qy6C3Mt!b)Q2aq zeT<2>@50^N_N7|-4gNA|X2S3Q7bf;L)O}CGukmzm5iSritcYDyDa%NggR}?&dVHZ_ zPw&t{sZf2g?*qdO7x!iapHL~9E^o#}Es%%`3Wt2H&ZcRh;HrAizg8bC_CR-acJPxQ zV&@wRbCdD!-yw)(qBh$MA0ku_R`a&9AG3s;ox^;ah&yTnnIoCNi=i@;4T z2`jDDtF3!)eq!lOIHu?VLDNEDJ2|cc2CnK*(H~!=MK#VTPA0A3tG7X5D)?I(k8U6H zrqgbFXBP%@K)(&m_!NtD&*rwXU_odu!g5P$c*1Ab@BIJ+r5O|Nlf^q*bSH0J7*#ul zLYolv;9?Vb0hN6MB`(gn?yBr4>ld+h6{T38v%oU`0DOrgponb#@jyWDbTz#e0JE5c zWPKeg{b3{g5ETP_G@3`TBV&8No1#nX61CdgN|+PXO*VtgiJnNi8Kr=32=QP!Ww9&* zp=m7-2$Lou_OqEaiaLL*v5s%QU&Sc0iT(HmyFB0b^!#!rLydbYR(0M>m2p*BUKwBX zgUAKjgs#E`-Sv@&YH~Seu)2Xp+<=SyjZMUL3t6_CNj}dJ@Em^I+sOt{m%#$UxSd5_ znDX7mIs`+%Rj5z_zUY=W#=WP=jKe*5u+B}m(p?eMR^cMB;Mi|p{QjNMs_U>f{YElA zc=MC&{rydNe49wjR4YkwU@w@7#>Qs*H>ZgzYyVm&$ootun<~)cjHPeDX$y_o4}Htm zmeI~0;Ct?=#qBVYa#UA(hv!$Nn&#(CN3b)21edXMs&i~*&8GTeMtNy(eKPSh&+fhW zb*m|eF}wTa82iF=J|l2`Ca}WHGEjSl52n?6x>r|VX3KPgjGlLT&;>?@=2V#OZXyt@ zt+*>JGmH56->%5EtH`8qT!= zzyh(+mV7q@e_QdlnHyx<3G<}K-w_zcdY}CzH590XWl6XG!HCxT6c9|U3PhDwQ!m-Z zJzQAzcD8}4;gv@-{P)68C5oc6Y?IyRKkG((L-1S$eZFBuEf@Qy3ZdBv*QuGh7X{PV zMc(X}4tk#(y~dS!^F>sPunCMhPM7U&%wv} zotEb#>U2OuX$^pKWM_DWYg@q1shox7Gxlo9_Sj^|LzA2#AQ z_PSr^b)63%@fLU1TERUgj3;BW4HEnnRF8AI8 z$5uh1_NKMJ>eiM~NmT_421&_LO=iN`P5>ID z?dyA+(E5qWEJBrGDm8UyH^u40nXE&YdH%0qv~;@3NEzf%a;83>#HkKhhmEy~;x~OCR3aFvn08jR$#U%Z8jK29HMrctZ^wwq8 zsa|d@@foaW3ZdYtY-@Lxs9DZ*<26Bjvqb_lS2M5GN)3F~ zo--G?t`s)r<8LJ!Kk!mt9C;l@GauJFXDgZXuyPZAx;jZbP-sy=~r^J(~a)o?v!f{oH0ZM6VQyN3- z^+u|#+h^X#6bjMsq2Nw0ke;pz4|Hb}s+;BBjei`!suT+=Z-;TSNi$JM(L2#Qz|;p- zRvi(I-voN4SU!SI_fOEtx}(yywcl-0J*ev5tLp?-qyiaC9sMXPp~+6S$^9EwL&n|AOSHPf$03LxK!eG~J^65+Rhu(*mJ+Ki6Px?s)EiF!<7T!ijDlPASxTlpv5 zaJNb4do>u$BiL|#QfI|E5g6?j1THLk$HJN_RH|ez2RGCv9#VW&-}wi)VKge+;N1p9 zSsem+?rCJ4O$T_K6WJ6jXz;zXOAz}{vwuptojj~PMfLwE*_(6W(R~!R&g7J5Z9$qj z(910%SZ=mbE5Flg9T?ON#%E(%zkMMtO%a#oA>WAHdb?548`0A?*CYPW1#DxD6^Zf$ z)>_5Z-)w%XMi=qP7jX4<|ICcD?@o2gZ292sSyZ7+t}C@e#YnTGMIB2|`AosUZ<5dL zdW=%7cdY*WPH%DpF@B3@YHQJx1OpDS)NbsU;Ba0lbsa!99Hz+CN3+n# zpA%z0{GOea3*Oy$SwLywR99W@{T&kt9C&@9 z$G-846Q)0YT||=vAisMA+01}#>rv;VZ6dP=olkke@W+z&-vKovT?6zSK>z@6m1^j zEG_nO=Pa%{*ZaG&af$LQ*<4bG)Uy8mD*}G4M*_1K(d>cXeQJn0yjIMG9~nDYsY-Ib zk;b;;~ zLQVBM4xHI)l_ddsSDI}bGB9WU%;`!w3DeQuGWCA;(jVLNm3?|D%1~T7Sn$zMPexc-k<`-B_s~K;=~jHrSg=>p zganLttu|&`<1h===a>n523JiO0>_&8WJKDTeUr!ZpG%#sILz?&P$r3oN`%m1rhtDE z_xh~+k6O&JzFZoPAEXc!tf-FN4l=VPMU9}tETYW#7-xxNk*pGn9@7$*t#-_SnK&d# zDoR;{)t4m?>TH%!|LTnjDo?jobD!MZo+yI`3!y|VuSsgytVPtv5BZ(vud9;&)RpaJ za#XD$(3pPB25~6vW6EQEA+|;}=)|afZ+wLLf}6HW>VBVN?j~!;MR zC`aywYQ9X8%C6v(>;rS1IRG`RQkrGDr&y8qz`pG&yOFSz)6+4W}4jC4!X(?C3NTJ6+w|Cgb8bxV^Q%`Ho=W?>?a%1*Vt#E z!)m;fmW_SW(AvVR@kfNPiy|yjV^?z0mni1zm`F5~*L9M+?+TuBgl}IlQF5LUlVq8x zSYRJP^NV4gQFYly#;{ws$_zydTae;wsVCEbISi4oC27W}1hH&(HF+{S8z@c>SMX4FjS=_wgGNo&apq}U|5wZ?)s zW7HZm@-aEc7llV{q_m_Y8%Wz%mZZ}Fjg_FKtU?L(NZwupf(DL$?{o6!@vutGQQiLd zi8J8-;HJR zaYOt5VNA9U+}zV(y`HIzK?png zkPqEpsLv&_=i!E^#lmix1?Lr7I~w9bdYmkrWon%)Q!|{hBqigh)@o201n!d(M_%|b zdLRwk$1;5dz(}%rWsrZnf0AA|8nIg0CrR$b0%p5xy|$lIFI~22!z$uM{f*%m^XrGv zD$8&qEk>Ha8;xAu`m2TD3@aE)N+Vw747+=Wih7^Me`Vszl8eQ6C5rC^p7Z<3c+^-d zYIlu$t zq^hw@&MF(M%l9nr`lotY{k*rSO8Vy$#>kLQN_fHRJ1oebZmKH^`f98f(m*nHv^DEl z+2H3ujtuNhSz!A<6IEi^*q4!Sug?8IA`);8LFyX>dWCG36X_{fx>fe>;$(51(#z^z zt&3*O?q@c-!jHcxm+tI1000mG0NK{q_=U?|Cbf_;0xNk1*6%E~FnJ!sy&`3>61>Tb zlZu2y9qCa+Y?R-3z*2?0+j)COQj;~^ecP}WB|Kovk3OSBH`nNDRX7=l(f|*lo(xod zvMYf{X%=)ynThPoTXc2n{&+@-X&8Pg8_+39Xx&p7%2BxvBZyVnH$tFP%W3dJ$(^()VL{WujkE~Wt2?vh?J*3tF|#w? zC#9c}YqwpW+-2yajUdO)(HZ~%VPVT!C1Tu+|Cx3GDK6xkL$EBB$=J&>u-(}Kk<$R` zkp7PTDTi-Z$*ukl30do8`8`Z#{wMJ*hhQeHh^OOSDoCL3TGS~WMYEUxUZ7gkHnO}>W z2V(ZevsX9Yo79b7FUn9D<5#s^1$ra++86~c(j^j80gH$TxPauHehQ=4NY(2%E3m(- zv?4Xct+79w&@Pkk1@?0wAcjGjye@rBeT+0tfR+9i3smyvUDw#D-RG^&kU4g5X-&v^ zHxWzju*x;p9IzM*_XT;l5eV+y=2cSMW6YzyEv9b|e{&S{z!bgP%ueUXab?4{TuD4i zT>S$*;!UY5$;@9xMRs(KXeLoQ!EAL`7U6YhiH)XPLH0)XKkmb09g`65ausSaHFBHG zl@ANUZJj={b7-BEQA66*gd(M9K(%n;B=5py~vDn51^_he>`vy}>^KHC3QDOLHeX zQ{Ybc^%#t0@6|{W<#;|=nr7A5^AXhGZr74A>UMn7=bQel{&oLO-8l;VFrt5&112vd zvCm@PH(Jl;y{-peRwEFUBZgNM;g=)5#9{ zZcdiQCd@kK8~bM{E{$)QBPT^%Gcp#&O@hohQi%2ifgDfyq~Y`+8$xp3>g*%nPZ9%* zcvhWbmXG!L=j8TXHN4t5t`m+G^pdQ_A*H%{I0L4`aHj#@$vaG;M=Fjv)jHk zbXNQXsddKY!H-}#El#0}uFNx=nP08=od~Lmd{)k(GsBB9lB|p&z=LgfR)%+tw=|un z8!gdyUBtn@dm#yXP=?+ohHq5k-O2IRh1RaDlD*pz<`ccJ%i6HjX1`ULnb;DH{+jVr zrM3+Ir<1+fp}Vjh4%YeI9%_XPy??iNX2lFG$q=E&nzU}}_ykN$v6r!I%G$a5>^ByM zdenV#vTa=~-in#idZJ+o0Wk!cZhEG8=r@pRT~B$2s1V2ex=_CKs#xnQY2!b%|JXivdOmsGjKmhfm=J zY58d`-F$$|Cfw9w^V~MJsnZGqC0Vz7z1m1>7Un$pdOy`&%34!sKEp&Ed3eUnp4-1H6afo6a&IAwoqz5v1!QH3SU;0 zFwEAp4^!L2#PlI+!rW&C%_NS$Zj+l$q^+# z^Bd)PlD5OVtrC@*LBXWJg?TCK!KdFY7mhUNZlY_0&@NOjkQ}4urP}N+zwf0QY|8y$ zS9WVV6W;KB9f)IxT_B{7ZIl}ySX1)2)&1MM>@y`Sm6aU$r0Q`6(n)%C{U+xu@RZd~ zNx|A&E;#QOS%q*~l98C+h=f8de{;0w{bk)xl2o_J@xe0o{E^mcwQnSja>8ZO)Zw-1-2f1SYgUK9g67pxf5qa`d8=q- z*i`w-fXj;94c$ayvrEiMFao7c{nD6@Nvue)xUqidol=vG(XClos*i42Gx~6S(pU%V zw1JnXu;p%y*FWZk1aCn$}NR;?la2juulqYy?awtr~W?M1C^n&-=)*fCVOhj zjMe{iVvrq5f=D$WccKaD6>>8H_sVo%&E9YH215bM%|;2}H4@jh;Ni;d>S77X>p%dr z6y3oeO=basewcHbYptw&6cANwkPd@1&jQ@ZnmM+fsM?ckZUD2V<%qr5%`3J~&d2_c zSNR+T$$T>4!cETJ+axV7k{sW3UDO}&(`wd9Gwi-uNBX~+HO&<62j0BO;~a6lN!i`J zYlSAgPr`e$L3Z@1r!FEw>M(~unG)@=pL#K%T=zjab}M`ml~ysO2x`7cA$6b3%IXYT zO8Z#I%-zh)zmg5v)UOFvcUpt8@bc+Ex)rX(o9+K^G$8%1nHjgS&-+i`-}4?rrXIC3 ztIeXjTPooST6RniyQx@T+po5m2YW1ZZL`A6kT%2DL6(Gh>c4IFHo&;%nk4nimv8wP z8v`1Bgt-wnTAdt-7*J+Y^J3t<$+q3t^N)$I z*auJckn=TwqyULc5@&OKGcmBqNUUuxHkO25h$@12B2n3RS37lyeekRsJLO3sc1&fJ z(rbGGdbPpsUVDCdkSC~r-F|a|r?Z`m|1`a0zlK4=VxSq4kA6@y{y+v^gddcDYN-ja zL7Lmi{gsK=3qb=qf%|zLGE+lEF1FFTeCD)YSMY@BeX=LeNM*hDKJ8@IAZW69pQcF} zvQHM&MUvoWCPFbpk&2|3vYuz}OI8X&7h}Oldydu^|@N_}n)??L^L?ON!75 zl*Ny*th89jX7Hs=x-;`#cSZlINurIIeeg+A9u852#Hoh1N$O96_J;5Nv8R975Pu*% z;C=%I0ihmW81l`0`>;jcym@z1svi<%re^7&8_iDl%0Ph2l&-!k8X0LdgAUTEN{9d)4yz$?MK+U(nYdKL$%%9H3{Ia$3)fq zP%+-+Q9fvq4t)xctJLWQnkD=BwhwOJlpjueo4wcY2@fyC+j#rBK+v z_cOO`R3Yi@8;Ux4Oj6$zw&Av)$0$ZKKY%y;WS_aZ1J3 z$7ed-2beHA+vm4>P8EOExwI3KugFd#>S&d8xQ<1F@25y$3$zllncP4Fb+DH?-NewDF^{fQ6wv_(HC-+uzObfG}PIK2h(@w(hHSrbdt! zxq5T^OvHyBf{_*zq*Y4&ohh(;)%N|D?^taI2y^u}Tp{ph4YWe^&_st{$r-RyqO;dY zDBPS@HgdZpQ>;-7ik8dCKf9;`Nyk&-Y)totY;g@ z`!<1XeLsD|+4k;msP(rGn3oXol!k6{<}F`OP?Co(swj~`%?>KHw_yP|zrk{z5^Jlr zr8S;*K=#}#JNOlrxn~b-Z(Ap*kLmlE@Do!(K*0&95iHW|YR)En5ndK}4a!(|-8pda z&go6$1uzQpUS}QfTN{M5Az6v5VwSO5hB9ta`Z7-j$eDg!zAZPq!1W_W5Ydu0kH_xRx* zJlNzP@YPSVgu9H}6{gc>Pq0<@+=ss7>FxO(1C(rU9N_XGdnq_1>xng z$#}^tyW}DnbMuK=@@uuX$wS@Tf8+5A$9yu%b}v>#{HThXsLkyECWp2@F~7!jA44X6 zXiAv>Fdj^3x{AUM_FME`58q1oysFu~*Ia>V=DGe%WXC z5T~?5y0&Z03zyctxn|%1I#w{8RH%fv6Ff+_oaT@E;FMrL-@IPv?VA>kb<7Mmg_`iD zZ8EyM-wxoP_c~jdhZ^;63pD7tUXKZS3fkJ%6!+Kp*F2}QF3(}=?9Z=zR{NI^AJ1kg zy&r@2emW19LGRdjq&?UM#gtkSSg&_v14NZz3orwVN9FKl=s&^Bauw2tq}Qwi-{xHW zuqWi-`~mevc21Sld)re0k^BLQtb0iB^*Sf5Hc&*sxirqpXuj%6xnFk5gwJ3>`}fjv z9dZELA%{rJ_}Bbu2Q=vS%rXp#YkXDt?meT1@HAf9wFKqp$+3-ndAgw2nn-h$9U@6< zliq-q2f)fGI6sr_yio+x$rO5d9gz&6%$2>fo+)%y_lJ;!aD=7$Ru;4)QoDzU_kZ~Y z0)3==s~hi>-29yjd>zDK8?MeuD5`q1A2X;AjPBh?lte#OdMN320`bCw?lfx6$qTp< zk<)q7Imv<41oH~JQ&*fn~32MY_O;hs~3|8-AwH}?LSaT0Yh%Gt8q_w^PW`oZ>Y}?msOFj)wVaGwWBx|($Sm8 zWpxLwq0E`O-2P<%3j01WFlI6IMMe;6s?-8?XFW@PneHJjuQVAapUKsq*lc7I@$=?n zUL+1b{QaxA%sP^r6x;SE&E#HV$M0@7rF=uFJoxK8hGLp-lzdk^#5|5Ae@n~m%!D}X zRJ;Bfud+H#ij%5h`DX-q9M;BY>V5A*8X^nF}1OxdM zA<)mX*>Uv_n&zf+rf$7WY;V7N9ZvhC{8Yc{3#we<31+i#@bQXD6gjhcBQ64?F2ZSl zIHtO(HyW26_^7UL;H^%b-S;gzVKI+xb|Q4GJyVl(+Kzs=x1zL49WXhaK`xi(Q06%KP7=T(Yw(v2k{)8@+Y9V$Ubm*{d5X} zcd>U>ybzlgQ|tpKBHiDeb9MEtb{;<=sh^^gADe03U`;$#O{N+my`aV)lM83pJ|K{$ ziFe@`^`ka!BI8cg=~Xv>(W5mf=#zPaX@0gDTHeMr6auWbI)qg9M6kOiJA$4~@ZE(E zv*@K*CAII98~-hs;idcO+YDsnIEVTX(b1gRj!w80WXP+osNHnions8DoJ-V*k8}RN z?MhC$;t%!nd!Kpp$997thi?~Xw0%b)36rEn1P%NIyzXsaqks+%`rrd7(Yct?j3Oo7 z>S-F#chO+2&2;bn59jGIXw!}gq00f0o4T|&m>I{7>#XPFW+T~j>oOYTKCN~UZp*@r zmchq0rAx~rGG&+^}0u?|Xojx9FKBlwri4v{j!0{wBhpgRGjo>UsJ!Z$fxh z^N1HGO4Zd(66`2J?i|BktiQfCAy%G)7ftrvTYo?%_c_L^irTqpBoG{X~m{lEh?EU%Sl>{LQ4i+nyX5@!L`@mbE^4ZMz-8{XQ z5AIgjTPX9x88BPZ`lXxmJfl;ybx8A+s5+#ke{b5&=JB6xHcM}D-H&fz{BQ*Bg3i)E zy#avU3gfFzq29M(R2X92!<8o0@euo9F8yhG6McN@*}5OIAkb34 zpwAe)Xsm-7)5kjf?|MM9lzjq7qHz3l+@vfQYy?AL*tVyww3{T(pa_sz!f#f8XH5z1}-b!#c_c**27kX`rFa zo|r5jD!CTZ6H?oxp-;X&{X~&AH?@E6jh@N?5=o?UK_UnH!l-B_%%sy|`GWcZ%I{pV zc?o}b`a4BmouR9323Xkzj8gKRe{~86TWAsm7=t>Wf?}8u)JkP(f)0)uL-f1{i@mUi&c=fkV48yQi=s3)Pfphso4-w;U)6Q4(n0;b6 zdLu7FjzhOEu&yki*?@YEMn_+#p`T6+egpUGiMVnBw&U2alivfuwh1fLc&8PdTBk{^ z7$5=JtXgviqh54(-j1OMb!ML5x#cloUN&?o9B(l|D2?ta zO|F`C)Kkr+1YM?=ZuiS=!S-Djb*Q52fdpJM@3c2=1GUa6`sJk5srdwM2pJF2=krsH z3%f(@1LNwohd8|o6@Hw*dc17)0DTu77}ag{VEQ7y+k-|d2=ul7|46T7hfpoEegiDq zxpk_EZ1qjJGwdphW8kK!mhMOci8Re}Pw)4Mx7uK4o6(BC^k3!bUWFi_Y@aiqDS~ko zmVVGeUkBe!u{(~qn^TnYsn2zLePa>f*XkJQ_S>VUBEG3EfVPBQ-+4c8Ht&nde>o>? zHSOfhq4@-eySY6(vF<+EW@GQXsD*flB3VF$+q>3N{ZJm{0fgs@L`(PXiE4gDe0&Ehy$EVLCq74oGU1VnB%^nIuu5kfgt=R3>8sOi zRc1GK8^B{g`(ieVGmB7R+Lf|FK-iAI6kxHfU)xZ+Bw-irHtUgi&ICvcR5(;aqlfAV zz4=d!tG`ByV4XRDV^}OAhpUrrLYuDZ>?S+Cn&Nh*2$D5FZB|ALN@>@&wD0expSU{X zv`{*jH?G#rT;{L|2e^fBd?9j>ZsqkG^|1aYt@PlAL)sjH7O4 ztbuBkhfUTZ5AZ^5QU9_EsZnvM4b0o(X>|^&;PQL+TyRZ=l`klO6HHwCkU)Te&CWz_ z1oQhZg8weZe*>ELZ2?_x{lHfE5PbnpHV29IL!8TSYTI{Y$i0nEWLjKFZ;n9YE2KtFdq^@Qp0F{Fb zBL?4DdjgO}lJ=iG&&l(C2m{j~7!~gfQJg!sF3>>miXEKZv>(cRK@1Zp*M5NqhK-(>8uTzg(@?*U3KofmAsOpyx8q z1kuv=hp6O)D8TmK*IB|Eq9Cn01yBGfd(+_kQB3^wASoe;#j2Zn%=j>kb_8Vm7xb?CZ~6YaJvpVZ3I}u zfM=t)PI40&g8*0j>4%lzWhm8?j;WO0po_9STuGAIe?r62fDRnKw&zL6yGva94LQf8!1XfaWR^*Rz_80>N12JwyLtOT<&!j19&XUigN*^ea z65U&m-br(NKeD7C(o4wgpSyup95d8tC;l6RN?FQ8f^7&w|tqg(bc#G={1Cm zM2X7954hlyq_!ncQk71dJDWqp@GDz}GuAk_f3|n^E}gG293zmYE+Nq=rT9ltb~6yX zF}Xj9tA30kZJQ=a`N8W?+-}wkL%R#aoF&o2XBo zqRS*}QYYY~j{_&Hj0k;)kAa9H7mv|enX*kr7iogrkxqUIHq34Fo3^^yNwG$*#zOhE z`!x6+$(WIK0^G)ViHWju7(jel-y}&fPR!~)sZ@6phe3^Gm%TG|5&pFpt6}O5*c1va zReh#PP6@>~E8^EScp4B#xvbWQWDQnFaIJ&4>f33+yArny`}t;7?s=2kvol{d0`3=n zw+v$kBJH9=>Hf) zMawSNB2mGD|KDiJEi1hx7|2b+*`!55@@z1FJ@_59ndD|sU6YC0Z{=p?*?4hbU~X`J zVKccwUL`Sh3l&teMY@wgKj}gs8m)(U}GGkEY`#J)k9d>RhN6xe|%gR%y~1XP)02hgIGt zoGB{;k4m30^fUYJ7a+VHGe8m}!Mb*ZeErO)nt)VFa5BorHfiuX$vAOe2_EW(+qWv~ zl(|6sKA>u9YM+E=n?%Llj>FQXH+;ZhlQlgEn~N37-Iy=?rRPzWc4&aB7Oh3h9hk9C z%j&H~P)IU3p+&O6$2j*Z%BilD0G-gAqUW%zk@8br9<5*9!g$wrb0q@I`ny}vbgR6; z%*v*GAl&zJA z56QLthVbMGGxjeMJPWldyu0xxja_1=JL>KYY|$dO+u{Ptu@frL%U4SOoMQ?1_9eRH3`cgfR=CWGj<1T&)t2KZ16wvEQuXf){}mBhNWzx z>IP)=XtjEiv3nTo!1Qh3)Rt~N zosgS7)S1QURZ?b)j~g2kh@7Y3hh_IAVM-pB?`O5zUl=I&O*hlWF{k_a z74rcv(L-1}Z2PZP%Rbkg(0TQ3GFvTERhrqU;ac8TnZSaR2cb3Aakg-s^h8OTAJxTV z+8uJ)y1hE76EC&iP2@lD5BY6+#g|OtM%~r=j>iok5^#1>x3wp_pqoA=p{|q~qB=HT za?wpC?}?kl!G^%y_tF{M@MS>`R5no=Da2#>_@s7r+Xr-9H2^3Nm{#Ji3r1J}0?g7j^kd_R`0Y+uH4Gdg#_`$9HE^e+ZuH4oR}u&3;`+iUxt%>%wiG z#BKW3%IA7Wb{?|e){GEa2Lj`yyfG3qbt=`Sp0ek<#oWR^;EoB|w~|p_&h(Zz^MOP^8q)i{_#NB}8CieiCXmXjtN*x%1gVSS-h4a`)#0b!KjuW$={|0V6c}I`I{E7v+ zxyKjMyn$eJg7%DjB$%}tTi3~C+&zDDA7x*9405aEP7Fu+xUZ~g;t+zfh4}6qI~dRs z*L?K*FFjNc>J3VwS%?{46P`h!1DYR@QLv4S*nl&Tl4S^YZzt@p+V|vtGZB-%5D%HR zSst918SzW=y;$H%4O$0!IdFRT&2D3cm(3zzowHI6LNY5~JektFKe;|Mqa8Er*qNT^ z0Jv+j&_J!^#C%m4pAle()QN+#i6k zFK6v3QE_oXF6XyxsA>}Wun=o)fU1cLt=X;Tn_|hrVw}_^?8Gje)__yDiIUkxYSg*( z4d`GQ0o|5Q(&9Ja%&xEjB`4LR;l4jmIIb6tH3{G>A%eVf#xi6lQiG?)m%T#Gl-^oZ;V#2D1I;o9C zn*l+W(&u@ByIdKw!sk_L-ytuW`?voxn`kZA6F2iS61=-JyF2)3Ef3lNoz^X!nBExy z9v6U>xufpp!L$*u0vEx}8lGr}$0}|@eUmU1gg2QWG;9A%D{28Notbq?l6obuODP0{ z4Q51x0M~0WT-TP3gb*Ggud*6MG?dtElsd7yc|PP6&0%g3VmEV{<`E|Z@r}Sor&bRU zHaZB%4jb6+p?jJNxD&P{)davl+u#R3I>t*=zL_*tn^fKFe#t$yNqsw@%IZC&&{nrG zKs}%#-r$9wz+6r4cH%WbSMPyXR`s8AJ8qWjm#J)zvF@%!>Gc~9LEE4wv0hK=qgAq< zq_p%bHY^NTGuueC+PaN6NaVnsaV?o!zs=iCxrijXnB`DAG@a=b7icv(+aDP7y1G+m zdEx!Ou#+VQY+JP|VxjojF%hI5GTz;RZtOAX4GQc7<;+^fQuNPglF6Q?x&3<~9ISVvVt+)>q z_2FDTJ-JU(vcxGMTjxl}JwGa?m%W@OhZuXL;8*GBqNIRTHYn~z@E2GRWLjZgHxmcD zwt@Awxfw`5sgp$DHn3w<@6Sna7u1F_M#dq+$)uj9@ZA1wG zcQ)0kr-$=)C*Ql#MX~eP76j|LZ<8535rzF;bqm5S*t!k~+lhYr0E+JCz=`j6NZ>R? zj2Y0cf*1gUdbXj6ip+RQzWmOvlIM0W*#Z9a)_2mSae&rn|MCDNzT3(soxV|KfhV** zFkKj77Xbf0aQ3Gq$b#||hV(JEQZ>v~)XD;2u$}H6^7!XDI722|H-jL;^chK@Bth3< zTw(elZo69{a0daso7q=Q^(S7<>2@JyFP&CT@Ipa7V*vYV6R z{*BEsOKS&Ydi7Jk8w4Nw*hqB}ZzQLC&o{yKrp`E;$}IA3o11hX z^|uti(FJ09x3m{!yGm?$6>oE=Mq+{o(CD;phSkKc`g72(gIc|@0p3{ERxw}#4^Gzi zUA1DHM;mL<(;V+z$0Ea5P!$YnKBYLnT!d>hOX^LNCNMWEvkbL2yH=Sk}x zL$14?Y=E7iD%&5Kww>V32%nv4$>eMY!l{r4?qq=dU3S}x&yOtK>^n%w*x20&Rn@|M z0w5iOVU@zZg9C;a?U@l0#C&+C$qED96-o27&1u`YaER2L1mc~%uC4qkVB}PDjp(%Y zIU!>=$X<1o)g?HDH1=i@SzzA&-YZo_GT!d|mB4XQA~NS>OMYZ9X?T?RuPtb$TeJ8t z)TXngXuHg;dSJS+-bP~B@L)c{s>3?=H>(aik7@10wJ;otlcsGaq8Iu*G(B*6Ke2J#}m}qwsXQ8Od|1l}<_TQxr1Nm55f1HKQ zakHzYPxw$Zd?vdMq8#=`W_L=4)lag~l2vat?G4A91zpUan&>@<%KmS)YxAIf^Tf49 zxtQFnuC@s$K_%%NgY2rVNO(S5&ThK4MNd$mR1iJkDku-hW6%M!pE+Tr?8`&~wWq5x ztdC@X+D5)>n|aZ@+DnQ1%Feotki#4GYBK0_dH-s!rzCm9Y}b8MmCm=9=AioJF+s5B z*q#_SY_MOr4)sXc5Su*ycxS5n1%3b@uGBP7c9;iU&;uUv0dw#}yL7X?UzudTFz<;S zERL00tbBBv$lkq;c>KEuZ=ND_P23~UK?uAcvbHX%6ZT(G3@K;C%%)!W*!!jUcsZ@B zoVVEn)(Ha;5=84L560mP&;A?z=ODw(`x9GWvNl=uz!#!BIT=lQy##u>~Ijdc$!a-^jKO z(eOSe`L&sK)fMeTsZ{XIF2bM17wZ2%0%Q7K;pBwAO+>;bs)3NK`jf@5 z+oi4)^!J;JQeTh)q8H+6#t9<{SNfx>PjPoQyzbcOy~$R8n^56nVtxXA1Wm1z1lNN6 z>+R_tqH8KlNB#XEr~Za9WZlu#Kg6*8c%NmPOF4J0Rx$SkTfm%M^E)dW zSXxtW66&-Cf}_`OoJ*m8P4-k9Z31rKL2A`O@tudDfJF`b(hJ}0IEVQ7Vewf6V6GEq z+tw@_l6Ce~rSSk6dhdn}*;atqmUAL{XE&G`_Tr?!i7Yt>epQ7@@V-x1R86sqLDB7X zbY9qnKPPCvF6k^}2on3DuB)?HVQ;F!#DlV6)|YKmJKON^(aizBEDX`@b;WV)X z%RbiD4ZiO**?Wl8Tjmb2hg8i@2m$5nB&_bx@e6D13)5%Y#cSBh3ixKOdo!(%{?si* znb>Zam0)cPl5Z+ScTgcU+&**K)S}lp$2ShdV`}9aP!${2Iq|_O1?gCDK9uMiyZL1x zaN=@DrCkEZlwfI zck*F_WRiEby;zFhGsFTLzq+|Z=fJ?4zPe$)^Q3lL`_w~FZk<;X(8i29p{n(#P3!LN zz2*~laJf3+tVuhN`UHIaw4-VdBzmzu@&cHif=dkX3JN6TbmE5uHXM|E?V0LwITQLu z4p{Z}HU)CKMzfFuU@m%@pL)K)_6;dkFw7NYYngYGDTMu^ryd%LJfs*IWi^)AxXrUM%1Kph>G+~x#%*fPAtpZ5Vb z^M9m<=1RDTf!svJ1<~kd*}rh^A1-Lqa8>eU{4PLO@07D9DOUlbbd2)T_JZVz2aJk3=_YOr8qtzqB^p{u|b&e_Sr>lC|kKe|$b)|GquP+Vs2S z_kZ}@{;>b)pZ>O8e;$AS_w(n^%m2T%>0jRe^2fjY<9{>}cc&?ImlW{oKhtH&ncXb%wvV%ku3|d#{vuc>guM*{v39=sRg`>zX@L z!4nCuq1)3)CZ^Yol&q6{lEQ}85q0@G2SZmIQ;GzzA1TYxnEsr5=oK!6E7KZ<;j+KGkIrn zK;8^dS7WbT$$Fyi9*WRKHcPeIIN?_pz`9M-xe=V5Sf4|?HwHIk?U;LGRNNfnCsE>t zG@Yf;C2vWEwpk&9A9P0`ZtdL=@&`%xEpOo=2khl#uF@g$jgjDbx^06umrGN5h;iF0 zU7FcxC;%JX0gG649@5JDE&WHyL6@GZ<|_aI2? z+)9?b4UrX>GR|ZR?3H&OON9)k%fRvqfA+0K8$SDj5|+?4gPYyTEYi4|v)=X3zlLoa z9e$rBVe6zZ5`N9#+5&#XUyO%P>a#LB~sql6}@4c z|Fz2vYmz=P2=;v5yhSZEE918WIdOJdQDI=mFqtMMvEhY~`%WIb@IWPjSP5<7f;K=K z3(FzleXqT*5XNYWA^#M#s97Ut{Q0jggX{IbaT)x_FPFjAW$^F+{LlaR!yop`Tn2ys zm+Rm6&)_Pu%uRaq}4GN?RwOg{Id94EyTU8s$P6cWtDU2s%PzUfAnO zAH<#2)AZ3!y%08P15O02&2XQfr4=L^b8E44L>j15EqHbV>kT{mHfw(wG}monAFg8< zKmb54TCt;|RO57Zst=unj~wA_^2NI)z!QfgD~r<6s2UB z;db)!_h+}dSy8#}rjYAQf0=tGIp!nn6sQEFLW~ z$`zG2Q;vk(PwB4>pti|YejJk}@bVdczE+h74NoIT33*7To;9aaHi#F2#X=z0VD7~@ z(7Ir=_UYsQj)pv6FG+D1gPcqdJL{fIn)Pi<|t#MgYABHdeyD?4^ncn1euBf>E`!80} z>a(9ye$u2FNS$d#vKSsW=6a)dkIiC5RK(#W36YsyVcTAy| zN@3E-qxYxEt6S*6`Rtrqv~V&#e9jHaUMM|{!O7|xL+ldfYUvFFksYMYXQH)uW&=Nm z$ApB!rqHNu!8*oWk3WAWUVpXt>U3@e8*!8E&1ZX5!#&6fPhw@z1dVOxoUihXB?|R6{M8!^%ycl+LGn zYTbslf0z1qbBBG%=M$ac=C|~~EUG)WN&D_3=`#cA?A%ITil|a`cH*Zr5Nv_JTW}te zQrW;)`cQN%Qa9rH$n?a<41qZJs;}trY%%I^z@SL={0?&tx54oSs#gC5BvQR0;~OHMtsi6`m2VCaQ0zmyvw8_jAr^iaV<>_8At6NqR1U@ z{8&V4vazdkdTBWPO>=CeaQm(lvONPbS0Qxl$b4(`l^8s$#@kc4<0zq-p)F@1xXOS( z2@?10NO?;3F^JEII7q{C0(Y1?Zl}REp>Yerq$bYUV=`S!42~*33$4D~hV?HU=r-K1 zb@|3>j+w4nEE&VyNcSQxu@0Lw6B!rFnTaea;A`^is$3$dN0@4%g+g@uFZ+=7zi|>S zznp}(PQu^*>wo_F4Pk#!Ob3gum`~6?f|M92C>-Ue}yyqbN z<=MF38bN)2d5?d20dChv|L@X7}969H^fl!^tjPJqfUm${hv zmA>R{v6e#lVfQ+I*|wDwrdTQMKRR-rbnoWtscV*L(t>hMJH7#{{mM^i7h1a}x&j2h zAxj(Bg%hX<*<$2YE;`(yeZFmep7pCc^|!Au|%JVe4PVyB|-P# zV@)R3#F`i{w(W^++qN^&#LmRFZQHhOdo$lRd;Ys;&rYAyudDm_s;jzg)$K0bYP7%- zaGpYBA_|s95#T9>%0hX;j@elOcS1didl}C6O-U^biJk(?xWhzQM)v{ukVMM}!bD<2--=^O zLD?)tak7r3q-r{H#O??9m&o@yF<4->&gNT&2fj2*9-vUrSx2+LJgIT8h&Q{E{fgm^g~x0Vv!_Ti zn~Hne?puhCa6kDerg=t{VzK=hv?apx?HG2v;io!ynD@X!G#NdiJk>tgwL)BS`gr=0 zN+iO-TrgY|*D-`&BZ}&r{&RRrE8?>aCb7Yn!B;G$fcz4jYeN(qYN*q4IYa?(CHhaB z7Fh3Y01(&h5G6K2c8 zsYl}?XvzJfU3awF;GFs|2;2jSqMqyLa6g>DCm8NkP_OC>o8~HIdr{9rtGJE5CLu^j z>ln|z&EZe!O*FUAYtAL=MdUhNzpA`DHJjqs- zFrk7Igw9SD?R&=&1pyyLbC2T_iJl~Kc-wOv)?HQj@^@J(!@!AK`j^1_Ej6H9Q7w0( zKyKJDSifM-rKK6>xX^I^v2qbajwL+e zf1Y0jV$BY@C3QcPiA=p*|j=W)JV7q}#)Hmj|r{X$0YH5MSi@*$AK< zb~D2?%hR#gYskMle;KBZB_ZSzPn4deo(k%7&G75=23uImWTDLMxSGR}t?lONr?E!W zWO-+6d<9)c9?q6|KGIk|#KW3d6RKuf7C!*Q_y0Vtd=^twO(^6)3Fyr$`;jDPE^EBS zKGvKCUg#@4Jc${U2Kqwib7y%uhXkiAYZ5c3@jTZr#1x6$51GBqc6=3@W$E?sx|Pt8 zZkNQqU0_BPc@=age%fM9t&O6o6<)9D@;C$Z^;I?PwkgneX8&YqWpc&36#$;egbP`Ytx|T;9_G9i^h`MpGw(o|Aws zofH%^krE?bA9@$qXc8$}xSk4$&O7$euJeB3jaD_}q-nkS8wJk-?oR_Mo(9|-nf|~N z^1ho+Yite|+l^Ukx}t=gdrPKEZCBmPyaZ$s+MZ>a=L%r0ksSICtArfYh0aGLF!&FK z1-D5`FRM+(h$rB9JDcwwQ-e73Z9E6;(Gn+|J)SATogmI`AbTw{sak>w-Hn%6 zisS|NoIzc(sKTU)%w#(+#_Ey*=6)|?>mXR=*e-WOu(f4Q&s?kCJRn}Mp>xDd?9wp8 zDU6Zlad^rwhQ)qLfrHfK0~ex{U$K=Vs}%BDNj<~(nTp%XS3}w+0`G-QE18jqTpI3E zz@3L(BKcW7+jrARH_ccVYBCuFt{SCFM-18+cl+@6W-bbDzd7l*_e!rne*+V~0lmiU zCun|s)?jrnNuzybt@2gF=i0|9yGCt4hO;;dVMQ9VIXD!hwC@5@VY7E9Szotxj^4;D zTnr*xyXTOaIl#h;1w8@Tb(dTGiOVCjg)`51(AaTVr^gzq(|Ad=ezl|pVr<1eG>?x= zzDSocVk?W+eyMZO+RN^dG$2j74Z68|J2~(`!tKHWhaqXpt=9^8UZ!taTy&e(&b7?kNDUph{t6yEeNPv_JS6@r!t<=j0wBifY?;5cz* zR@55}tzimuYoIVm5c`ytC@~oP!rA&gI+W8lEP;+iT2rNNC3hxg-<+8kRov3hboY2( zY`jh)0?bRZS%i|U2EfRy)3h4#q-$3*xZ>gIQzEwOj4$)JS4pU{nOFOiAzOj3ut6UOk6;*eD3pm!SND+@mYAPE$Az$9=g%?}zW@es_s#0NO zcNzkFf8l)ih1uwPQ7vs?msM+}ITIEE1*r~lR`tvRIqjI>*!fUWH`vV-v_|}+LapqD zAx8))e(&UJy^2iRWBm=TEVTH;J!f4za%5tG>t0&SQwI*Sx9>|RO44;X`%V3)IgE+M zrVpWruML!05KL>#E;s!-RbRl0P?MUXSki@?(m~+ONsz(1^XF4u94rRtCdRX}IZP+r z)$bA0qcFH^8sTsXc(Z=!?HQqL7AfEIsm7(33S}?VQaOQs5>$7)5 zW{>;5j7$lMJx(5s)hC}<5!9)qKp-TUJjtmY-jRIIF%o=*@|8RQTmMA>OtN5M zD}%Q8ZgU*f&GLESYx6rg=*HQH;pWT1f%W@qyT-Y<)u(&s39mxCed^oe`|C=_>&jD0 z$Ll@(3Xj)IqW5zT9`}dc+t|qmpNm~<#>m8*)6<^rTPsiE#LKfstM`2yY_1dHhc=Xq zNwV@tsn!BXkPI*d5h>Mjj`x)DJ4t;DA-`s?fo3ZYT~`e9@7EZR(MD=^)iqBxw%()j zR$oWV#iL$G0||y1oQ9_-L$z^=rP9JZwNY|G4Ta(_BE1B04`qJx6LmVp^Lr#h_||6= z7WRmQEDqSDgQi7XGGD#-;ip9HTUwCi4jLm^4)oj_!&c4FoW8R+dgWogdXk4#Nz)i* z2|zJ2)MMXRT|Wx1QAocLTNaGH>)D{gYu~NjzL;e@ zF*RJ=a#Ht~JKU~!<h@!m=73YB z@03^lE;w&B=TCe4r#~laazyhlZ6S!IR0S{h!tJa#k*$${oYs4j-5mI~!kK8(8+*>( zZVJM%+Lmd|PK3s0xwk}YoNG&WeOR#5TTFx}#^_eB48#mH#yXJ|V2IadV;qWIl?|Pm3uqsQ+ZF{-2C1WW3tK#im#s^G$^*^Od9dAtWJyJOX<=AXC9*5d z#OkN*YoBkHPZYRelD>XaRMd!oLP2EfWb`}=>iw)CYx+P;-_U&jlf!#QEQzVyw9vMXY5r!DO2LgH5TEb zVrhjiF5z#omyX7L{Jij*Sv1v%M{1g!+AWAX@jPKGd!Akk<+ih4wajHZGViX^d2x`= zzu7+RuYYd9K-~zR2YXl`AeXeWG>KoUtT8?lOC8x;H*wT4*@92=Nw_-bN$EY~r`)Da?ob#_F_vLl4bC9Ei; z8{%{Nv`H9`u{&#To7r?-`ShmY1z|zvl4K6HmV;!iDqx)Bwt%>C7hljt7EF za23w6IzTEF4IiOAco|{9f0P7pDf!lx50}zx#8f8X=7ZR)jMxNncmU-YG-Zt89YDrL zx!_>-j{ZQyfab4Y%=$UgwNJVr_~T`AO3CB#^(J@*G-w4k0+SSW2i?OD z7I^xbqT3l(T$0dZCs@hGbeYoRb4ifP2k+PG25s-B3vFw(*={lr36(St%mI_oG2rjA z4%S0w+vuFoL%xF!B&6eJu6pQCs{yU~43vnGgK5BKgG14OlCXsbW~_%K_JS zagg@0n3nUL0_*^?iRBGf+?v0iprh2K>K-S^XeMAUPD!d2LLyWc{w6@bx3jQ0Hi!w& z0m3l!sSP_Hc;YTSS$Vgl#X2*NQAFvo^fglv^`aUAjw&D_?+$6)3MWa}@H=TUf=Qvl zZ9J)d1yqUK*n0$=^YymkT%Td|AM|4JeW~n@D@UT@M`DpM3uRkf(h`ko_}&l*IIPZT zNG8>ySCQ=4ql_>4rsS+;cbP)XizID~U2}R#CeYNZ`Y}QXHa^TE3=;{l0#fFQNh=Sz zQajpgJ#_fl_>idmaZus?L=^REmo@f1TQtcL-#K}3muY3S&H=H~{0d_ld_VPyji|Yv z@P~{`2&EMr6@9X#MQ`YtsZd8Mh1I$Fh_Em|ou<3fm%)KzRv65{TUk&Nc%w~)Fv=;@ zqBTWnrV?CUmT|8myFp8%kqSU!9unUXE5mcH z2Rj@4M>Th-^21!lxb%~g4;?4v1`xy0S(;ijtIjs8TmyjU;WpBX1-xNRAuds}e&_0E z#8Wu;`t==EIngwdGw2vY*!I@~Uo)KGytb>zTbI_WsO&NDgKEkGoVDEx*&)b*l57;J zR3YX8G0vfW4@!y$b6k;Paa-_qmFq`OYYb7#@9-&4jl|E3u@os?FJVz8jG%lGs+OsZ z!)vp3E)$X`vRvYfe&;he1PzV#64f3(d$elhgoJHI6`k>#z_0cJJo?w)e1EZWldkKG zkx!vYDfK;7qZFIj*T6n_?2f%@aaB~`MQpDyP^hmo+g%XpV*e=WpKp?=c2AN4lxzw$ zAPUasSRPRu?J+4%^1@|yM|IR!*D)ODjjA;fTY*GL9EocbBWfCHo`BI>KrnNZI6zWD zWw_1I&efe;)WX>Zvq7AZEi@FHpTRPr^-q=q&%0-%5vY=l42PAOr8l~LB?HC6rvRV{ zyp$Htr^^ll5{F#MJoK*BxxjPwY@cUCO|!WXEHY>UQ}J=8J@+vaml19KvFZ0XtccSF zr+@r}b674Xcvruz!Gv~3TM2A3H>&X>ShK&!aF+)w=U+7RDAX%cp{?uMd1&it^q+%N zp%c6;l=Di0819`jSWe)+E=V10v4V)QLZ?(r-2i%@2o8IS2NznMu?M)xIuR zRM%|j!pA>f9PUWktpsFKg@>8_So2$Ty5|$Xub5#!D(9OvjWK*6PF_p?&P};t((FZb zY#L-D=%TUMXwnendGCKPxLOA+ePYdD#S?B~!9La~X*G2C<8T#8zVrx4?-ufzg+pCY z1hT$d7@eC~U=m)4CHAr9Vm+Zq!Jtb;GA$N7#(B_J?W&=%U31???$Vy$aTu!lCq^1t<5G3@7E7rE3w2^|9! zr1dN;?7bPfUsw?#JOY;MITJ7EJYpvB-@_*d!2D{iBYu_lb|ZIOCVOWz&oj0fZMv6^ zYVYKz_vsdmB%n=QU&EY_FE%UfzbT+gFdOiO5|5<%y;m}=V%6(N+-VBRp@%h`G@p+C zzN^t1Lr}*%yRtw%#yD=DX&?EzWciV%pl4+PtG#fup1iJcX8=jql(c5R)m8EB zy^MUj=6a^cJ8qudDP4{&?**kJyC5sIZgznx0nP3!6% zVx(TeSxOazbtDn(Vgpm$P04E+FdFpJrBGQ`h2^N|kdmQoVB6DYTOWyQt_G=Su=Q3u z=ksp(T${SMl%v95Er*w3llD^I@%PP9FRX#mr{83uS5^-5zy}(F_&;A;WTsX#?6hu8 z(o9t9jLWEJ%fTL|T~`ppPF|KF9D>RiZLK-g3<*rmoOO0T!j2F^N6HcVr0cJnBgH$X z-Kf<0%=Zyw^y6D!IcLT>vWgSl`9`??yK6(RVoVLZ;*h0)4G(0k>@}H68gHI9@Yq;t z7}|iNYt1xMA_tAG#MuQiAAzOE!EC&skDT&tQXE-A%3Vv!_pum+msFoj6D3d_$e84I z>y>M=VIH2joR~ythJTppiG*W9?@o#rw(~Otec?_^F%)U-&oqHX(gu~eX5+_Wc?`v3d&!(ys z-P}&c=Az_v-C9M$MXp0zoQ=FUOD}PZN8;GVJWY|QV8+JIcBEX}|G?BuKc8IcwgT&F zsLYb-njD7Lz~p6_KhQa!RT|nN%T-hH*>i|=A@bd+XST0wFj=FYKYznh`wUYV-6o3} zJhbom*BRkMUJ&5aju2pMXbMe>8pZa6=oF2sK{oyscok%Lc=~-P`MP4($z8u&W|^bm zI>H7*OnEbx|Eal~yQ>UXj>O(6)wm@saEfrrqFr8bR#aqTdvl)TbYL)$DIAw2_(zz=^L|xbRE60@7(%N&>ob>htqe%K%)am+ znIDzX`=E~wHwsJU0kw~C*9FtNOQB@yaO081tfa-yGhvrbSs)K8msYuWO?{?;ht~iF0Y(su;WS0R zHX2Lv%raz}*e;h?X-3zKYPpcX>Pqu{#ym<`BMe??DP4of`m=& zY;S`Af%E|t{e`{%f_?vj{r`dk|AK@6fASaA<@05Uv_J|%X1)*s3|p4?!jRM*_1c0f9+HgSYGey(|q zMj3GHHJ-Mu4L35>qC}LTssunlt@%*Xn8|sFhbeFl*FdF^qU}J}0i&e6ct81+-Q&cL zlz#`Xz(}P_z`kizu!mCYUif{aoD@dq^dGQUcCXIf-nRqF~ zt=;Ae6CqJeEgY6Kln~F$anExwzjE*w3I84S7F}#Ox9iG*S1)%715O*4f5OgMy4@hO zfr$w7G$vy-9041rmy1$OWv^A0Y-c-O{z?#(q zdew(n*WZjf@<;UT{}FwB9G_hoJ_`6iyP^T8m~V*Q{55HIc6La%tnFQfxt2>l1zg%X zu7i0xp>p<|yVe-gma9p~a8P7{z#RBftYjnx{@vnv3%R;XEfEm{5>{!1B{unt+@-D{ z)X+~vDnl9uRYSfI{^!VPXUPqOH{u~uJv>IEMCU6Pwc{>TDixdP!D0Y0Yb>g0Hwt1r zHJ5Mo-eZbzO$9$G%ZMI|=DM~a7C!+Sm5>NkLCZr$qz=CDR_l)EV;DZZd6Q=yb=gJ2 z*5&p22<9;rER|B(QgJ}&tXXpd6PQ-D^MMLqn zHirPvsS`$OM5W&-kp{fX!VskrZY`8;tsTRwdfgCI3R&&rvm+ZEa==HfGc?4|-iWr0 zJ5wZN5*G>4Vf1!1HRIF%Lf=Cw6?eOm9R}X@rlphMe|OTWZW{dj8dpr<_w)^k3e1zXo=A-jdTZ{z`N7k2F<2 zcb7DYaj7~c1}JJJr* zQeR4LDToIhkANRDfEb8dBEcXrN(TUl z($)i*OGnGaDJJL!_aud5#K4D$G4l+*VI*Mi8OVLPX7Hs?z)vnNF4haHy+)E2LD!by zktPBqlGg?soF}>JqL(t)(F^eNyo2L4qqcsVZ+N{$4bLt?_k4WZ9~;D zeSnO^@rKKipSFh@N}e50mU(KSH!UxExLZeyyG!Bd&H*jHDe_BwUh3gcN^ti-rS5pE^J>& zT5kum;qwK&Ibq+#-yS_winNaQ?ARn;RfAUW1cEf2GFv`ZpS7pBA$CW7^-k36rru0* z5nh(*)qWm1I#)^Lko?ZQzTQE1AYZd}(K!2JyB;aMBq&hpW)|Nnod=<7Ohg2SWnI5B zb0hyy!kKI{)E^t46o*A1xLvATgcr&4R{J<|O*`@%Q8geGRVR>UH!3B-3GD~W?crEc zS!!+FrpgAQu#D;wW2_3f!90qcODVJnWVZ%oc!faRbRDT*tx^+4(jF%Pf3@K5s^_r~ zJ3|YAUz%xjEth0WtCywWWz6UX8hR~E^h{7JY^vkRX&TywMv&JTbBKKXP<`RW_9 zpj=v4;-8vhi%<9Y&F9P8rS#-plru6m#x+#u&(SQx;283#QH$ah9h^zkWtxVwh*#3Q zv1nLcbVsHI7EpUo*c8PPCrl>L+$r~Z764I177x*~cIDDu1{llffZxJd*|j{KUJjTz z=E%rw?o`|#4OCGC^tTgPQOW#`+w8w2KKCy;|1Y@kFSz&z&i+?_%V}E|15munGq$~e z6G1?At;e&rNi0IEze`B^`hl|}uv2(FuZ*`C(w>e7*rdd!ZFJZZhEk^m%mMQ!G3DnQ zsK#Yc31t?KU{t!1o>=9^ASbsLY69jLu1*_MkU+A3se+>Fp^d2K_J31If>9_u7BGQB zJ%gXMLfH{!s@S|MZ1^~S2mMl_;e!Zm#Jqf{BS_(*;p&|F^TLHjCv$khFMsC6=nglZ zvlH?>r!%}6!bSr{pj`yEp)ny7CZL-5`r+=ozYGmYquo%v6Y-3InIA^ObPX8?Cv=q| z##EY=_;Ez4O3q3cwR+pzg=mrB@wNQm7g2A~?eXC(kW0K>|nVBKOAq5*^(` z)t~5L59jkhq;iUlxcy*xOxYbF*{BAA#3j@zCiir)qpi*L2?Yljd{bVvfdfd)xx=!YF0FPhPi-`b#^VQP7GQjd5=<%Nn zP&TV>?FYbs*ff7aeF073XB)!78tZ2E^)aGTd}3{RAU2-{JUdo3sAbkPoo7F zMacn0^jX6AQYiv66T)whgO{={bo+q;3z9v6P!FaJ;xcsS3k#{0>y4@3z-kOPkfsrN z(9!d{O5s0}FUF`1!mQhK+}8`vFdYyLLn_0@O_orIB9fHgAl7+fD zC7a%OC3#b`#eVq8I?<-~S5PZ|WHAr+M>*9c$XaVKAp~ZmYRm3@n_SeNSakhj5D3Ef zQx2gx040J8*Tknbu9%dwuxgY96nG}W1QqqX_Tajn(U*jj7( z(GX`$TUnb<>qAnI*4sL5`J%LAX!L{Y>8nh61L?xT&2qVSZO%^EOv%KrjEnO2me>8E zj9}}tfu5X#U^Y&r{8l%WnW=$ILk9ZbJH2E$9#=P)n`5JL%Nl7shW;1?3uC+2I`;i~ z({_)y8Mhm!w=1WW zBa2dm%|>q0+Mwm%7YSpxwM0~9g zskKR8Q=~?dm>ROA(TL#pXS^G?%w7I+q7~%%Cy_WmTO2FOX(BUtKHguicl|kGHI+c5 z1dcmN;pC4>Vx4}zuG==$8zeJcXF{9|8juRUrM&^ynckm%(Hd2i&+ev~nW2nIySF=%b0U>xUkwLXrV296Jk)!9=QR!Ccn=-bl zPxH&UeGhS}VHV|^bw`N*oF4e$bNF4hE9}-mm9NjO&T#oGaFj#dMqu zEz8)I^vB`CEfiK5WKqPQBrwdv7*&|Es}Zhc3=*o-)f4RWw70c^s~r=dp%_IfD{$XX z)1^~bn+xhYt?TGjTHwGAer!(D>3z2f(5FNK5+4?`_g1wEK<+=+1$@UFf z5x=xzewD929z?}ToP|qwyM;5&G2TSS+0L`1(p!eWH4v^zVfl4n8RQ^XM-Dl+GmCcLDXO>IN;EtnySUj)yJ^Joz9V2_^{cc_}i{LB1Kl=d9l7{bZnfMFm zY8lt<(Ri24G>6>Mebf>TTD(XQSE0W0X8#iPV&q`M`)MgwB9qZ7?&75nDFh3t-nUoA zTJ0fUV?8d9N+=onm+MBm%i@5=&dpcC43Fx*ceEK1$;+{Wq8E+bk5If_ak?k&uL&rG zNJ{)t%AqP|jQEV(5KM*>1Ew2e5ypYCJa#vKM)WN2BK$`I`s( zQB?CZFP(S7m_t0TmlCe1`F@3GhaGgGfvab53ZEXX+kZ<`c;gRTwlyy4)-Hlj{KYT@ zv`362&p!pr#4gumkVP+~`39XG`{WHL6#3n?Y&*tOEy;lv(nz6|{wLzSegz{|b>X4d z!kPY>7Q>xdnALkmnj6iIdj%VKuGV$HlZN>GQar^sAB+RtsGv|&BuB-_x0c7t#UXz`9ryv6~J zJd^#7$8g-CVZzQ$=Z8<@sGzv~ve$# z=nM%c5()vn7t96LVH<=g=qoNt!oaKYaW$Pp1fHK!y~Dc;{=(IyXsi~dns;a=TM-LG z&83Sw;~=*C58|Cajof0g=;f5FXv!L5J6?SH|Yf5F{INVLE{u~CR-_J&!}qGz@k0qwhk)W|ZL;e$^ma+}f$g1#L*r+ewI;bT zWNhrXcLkW#5(fZM`)W_vQxyx)gowpKW55~j#nNUNWmJ5gbMjf zz*D?OLq8{LsCYD+x@cfswIdssc=yO7Vy?c|bHjfE zM+?rW@5{|b`GZo{fvd7Ot=iS!>~j3C#5nmEJpBVL{__Soi{G%$Wkwjt7}EB=Zz6dA zY56LfqTFmQSe!IH+_IBOtFx0PtNEkN2-#5ir*vrC?OBxTQ=~EH?ff+Y#)KN&cmKD zybSIS`x^o|^Hsu&dLW>d{yk75&*I70Jop5+y4kv7L(O5x5hc779bgQ&v{uZ5i>R+FoaE7&*YwG~gK<_D)>cQElw^|SNMEeGXGl~oc9H~Vxwk`V}@vl*M) z+FRb4;`TNo>b+Vw46Y7IZ{%BL%j}(AXHfW-Sxuc&Nv|rz%Lyq^=AjBf(1w9@@EO4< z$>sWC$eYN3D8LL|9B=#Ua-LRLO7u+!GJ4ddT#-PGa>!RS8)Ib^Q^DRGCd<+3`z7jW{yv5b23fq<`5sSHza+fjvhiF8em+~2 zgLY7|bUwV;toU)?7N9M1K1Bd)oRW=q$Q?eIHVy(bUvYT8gpcWbI5Aa6roFGq5DgEh zLLHpmvxelzRc0b}fZTjoc6jf)B;5s~>=5rDeSpR#!V-=f!x#PIeY-+}9;q0(_hW#@ zO~z@0!Rv1E`?r2E@lALa+IC`ebo38kzc&KAzoquI+70p3ecoA+Kh%k zMcZwU&`#)2xfPiWV>ptAW(+lmANOjxKAhV1$-R|x$Jb+kCzVn+Euf@G*?tsoQQs_y zj`g&>FK>xZVl(AW%r@gZE*?04ZvSWa-uWMg<>&5_<~Z1b>JNYg>co_Z2H!l=C+MXz zHBhzUhbfLa>j7!H-cCyAnnuvF}={vQ!5)NV{tb^ax<)1vXW{3U83_Plb#LD$|dw zMA<7}UqjisqS3SsM`n%3d3(_W<%2MY`Dd~DmE}T{%D=Q#Xy?0<-CWRLu*|$Qe^!_? z`CQNrhxN?|%Xo@wHKuW#cCL`rXp)6j;fi4A#wsd)MWFzE_E7Eg^9bm-d-BQ+ZdbbX zW(%rXy<61#?|si&k9HEaGm1?PG)BN%Mc}tRg2uCW`vYiLZL_bMC*k$X_1miE(~k_$ z)7vzZxT(3bA9`+WWU67gEnHxOd$K4eG!4a6@&LqjaA0DYcR#bjL{u`|V9VQRZa=1o zR5Y`gQLvPD*j{s5W@0mCVGiPHM=~azkLGUZ8x?VP_m~q`$m08$@vjic3ea+?!KxB* z#Y_4~2=U6a(4Wa~k%Ob4-?2TP>MVY&8Sc$YKljf%zM+HO0!{r*^UMDc`2X&h7-jnG zn4tLVm>B)r(XfB(cx&(A?6@U4JV8rNLoQCmtJn8vn{P`ZP`3|Mhv`$BuSA?!@C|d% zC)amyuyashp_6}MQl+bNad>iZxL0msdK5O1RXH5@Gg|{K^N=q54gBg);DY~YmWh}b ztIubK^_jA5>)V}7T#_JJ{2Y*UTluU~Zh#_D7<9q&5F-69ene3bbd3r6LJP-25W|o@ z&GwY{{$>d8_rsbHE=S(bZFTn7Gh+c014dqo`2ROOsVfC+w0O5z zFER`m#stq#ug{S_Nz|nnNqh7n|Ix`_GP2>zm?M`T#XdRx&42*b+Bs zur(?>_qWch5_4avdoavbe@7mh-YE*g)~M~=E8tq{^^QCVv%EMr6s#C2peCjn>r6~7 zo|!r(_HkrfdL8T11;>oThMBBWAl#IDy*-4bBZmt0`cJi-OR>a2Y-GUiaP9Dvmj&3@ z`k8a|*-HsT(@C00fs&LiPtJxJX{26+f24pKUjW%JdxkEPWoNA5#db3Q#fAWqXVvK? zA<{t^N}uQzB)VL9+HaoCrQs%k_QTnk&6}}d<#`V}4^0u6zjO469%3h%nk+ntvn}Lj z+Uq>C(YYOC1(9dj>tu^qzEFYpbh_gBx)$Hi#lvCb2aWrx2Dc>2Brw3HU46q)+-HWp z>IB&Iw{V>;l(QSTGPHwke2};A^P-lb^okE8SJF_W|4+mk{1#OPTfnk+cT~ z4LidmQ1%0-EN-`Cw6vQuzwsuv>e#?DPRhIYX=qpna;();d71C`&zCIBJ}+URYL;?yeI}h@nmzH=IxZu=#Q@?U#E4h zm!lwN`Zsi*mtVi;A3S17VtMy10X)B|sS@({SDLh>Q+h84 z8SN~T7a~||=5%R@7`!BZIl0CO3Jdk8I$aB^fXoCmMM_#4>T9wfenb9dMOij(E~I0T z^bq}I(I6cLX(+==?r9)yw7-B4?c8>!%YEVeV>Q6-E~T?H{OZkC}QxG>jyfM z>C8>%tkY#p`*}Ey!419SeeC!;Q@77r*6Gs=x2X{io#iO=;574HYgM_)&+yPufpzu{ zcA?jdj(438&^yc#=HMrcnx#8?kI;QdgZ)7iuO^ud7GZ<>K~ABgFMVWOKJ4O4HT_&x z^D=bHl)CV{*!{dTIY+nTJ{N3Gj4huN@qeE!p1k5V zF1Xa^thny;T!6m#Gl-zu>@S+9vALymfG!4dg1V;|>v($@7H=(Nw76VlJ5@8PY}iQ- z2ZF^q!i_=PejS5o^f3bE95a%5j5S1}F{t_O7D4aBLk4<_X$a(9?Hpx8F!EZkAmZJ= zE>kcA4-IH5`76?!KO+7A4d}W37rgryy#E7%K7U-&YTHiiG$dk5A6mxc4?8S|uD#gc zvq+=9QCGCtrle*O;EZA@1iB*MHx8xRp z(>*11Ap+Gk@x!x@AkAoHeXLDMjqA*!UdnZ8-{{zb#?6{PX${?4kD1ABMUJ-oHf?{A zayOQN1~(sj{=>TeL+0eeSo9+pzP$Nk4dX4RX51C4)$v_E)qYH7V&i?Po%4<7>}BRA zQRZyq^>*U!LPkb=|M_C(d7E|h^Fz>OvbbT$@OvjCA9x+$a%AC8mi8@#of*_SHVb~$#BIk<9pi+3e5_}jCMk@ z0o^DV?#Iy!q|Aj}9dj$Ur&QL2;+SrD4>fgj&V>$79G zyQ%zr3!IWWK+w;+xvq@TJ5HgS`SPH))|xR*K1Qw@2B?nmzRQz ziH!G?rxl)ugM*Lf+p~ehUmALLbXVI*N`fa0xV8_D0g4M#B32?beTuRC^_1z|Y9;$o z5hFQ92|5$z1CyLe#=e4U*@@Npf`9n8i{Y%{i-s&T1%}T z%+JggL?VaBlb+4wGpK9p&k!X-L zO_Z$K$Bo=s+Kp4|lglIti~8A~#e0GuGO~${-y)>uk}=ZRIA97qyr1no)wJL5ZqJ@Z zGEPQqlr|(5Ztnj!_tJF{1q@9^Gmcm)hP>j2s+XWW0O)KDiMo z8AqdXV;ZdASGzmIH)2s5^KwX?-{PE5_&J8QZE6)olRW9$B1Zv%NX*_aH^4Cl>J0>qG^P2`r<;m3{@A@?%2bICDYtK$HU_fe)g7wrxJ}B zZf}tDd6u_*Q?J7UwQ%n`6Mq`7I07EaE)9-Q-L5jG9#~zhlWo(RcQuCAkb1qZ<*5GD z_WlUJ4cUM@j{S-p`%DDv2$XQ69@T?rBjE9~n$u3wg_bZc#?jU=_(`7I->cd^4G?~I zNe;&J@h^ZH8gTaqT7H!W^K^S!Z~u4%L{gYP`q|{pkEL1x{DDU!OyB@z z*lbs;+;H3d8N&{o&el1>xCA`C9Ou>TD^R*gVAlpkPTlwy%RyqT(5Dldsd%Ox@KEb1 z89QYBuG#4AjF6lV z%e(t1f={7_7GE4NN2uJejS&8w2u$U#*RqxcC<6l>#y3H@cIQhD8-cC&;ATR1W zsjW&wTXEVCzTvDRY`ruTcvtRnJIQUTYhF{FX7)p1l?~zP<~!XEUWEK&PgC!#XVVq% zcO73Pxojmx$%-=XWd1bB9=xxjzUC+|1w5{6o?#ftExQT2rAsAfLCC<9w(G=ZBANuZkTRw~x@>t}~2zifmdJEBhn>t#Mv zwC5WNu8vNAy&naBd>F>uG3Qfi*X1Y0902R^oi%S%vV%GTh1xUAfo;WEYW5+9dX*s# z<#Q=7ZW-0}R)d4pgOKPiSK4GJ&!|)*-&*Y<91}S=ZT6(MP~pOU9F=SPf&GR*uYQNR zsD_RqB0z^Kh~)d8*TXkVSrk8sSwL6|L}Dy(b87IXGCT>A-GzZfwG6xu?KQi?ljR#jN0~h2vovwT7{4WOO}&86R@eSSOc#GoMh-| zpq4@VdU@rPp+dYEdV_Mtp5YYmE?MNmK=!cQEI-i^WWxAx>mNsz_g32$?_DK<5d9pq zO&B>%g>BA<$CMaeht!GF@qd8}x7scZw@{`L&?N>xi^xqSa*K$V1)= zY$O^9cn!v%x050)ejVz-Li%j9@JU}XiCKv+l!&_i;&LuM_0ieqN@#K_b#81t8C4o7 zk^%C?=cq}+YSgz@uWlPW9R89ql0-ET8j485k1Kc6qtaVH=su3 zZU)Dc6@i&gO^OpW_U0aI&5W*Q3`faVG4r9c2$*0BV#M;`%;}4M!R|nD`>4*3fp)G% zQ-I5j@iPpC-c(|Lv40nH)j|QSwzmgytc??$vIo8`lGxMW{{mS+roUtw?VHqt3}X&- z0}0m_bh$mD-6piurraZ3Pz;=9Ul8x8?~V1m+d3rpkg~W17BVOFh^RuZjt8Lx9lZ4s z_>ko(F#GG*=WpLXJ^%QQ9cOg-5Ep#*7xd1vVhlLP5&;(gTo@6*@b}4%)gg2n#wr09 z#zaqemQ$~ekU^_A!lOx?#AdC~4b+Bci0$%Cwfj-WL-e-j+}q@Yu#U-=^MYI7zLA~& zhODrNqKht%sdpDgJThty{|F82YRA~pt!Wvb_KCy-ub#n5v1V54LfKDbZr`h+)=RLt zCQ~-vPEa7jR}O1PX9?S4eDD;R6?SV9Us3&Q3<>4PLw|mKkzK+C?QO|bA0{TGse2C=(6f5Z+3NmrVo&(r>TO zgb{Y}S$in~W8K;Uw51zE ziiQwAfD3+vi+8?CA-yppIq2p41uQ-^2Dxx?kHt}}uzBz@$xQ(wQD7GYR!yW$>oQUS zey7d+sWj$*kv#lr0&de5sd%(SqVixpyf%P2WY-BD5toRg=koqjL=(fkd!h*@zhd93 z0{ryn`rfW7_m!D{`|&Z;3l)}i*<2YWixv=53thN!I!Xcv5m!#T$cVvkg0BwbU|4HA z2Yn)mfo_|30D>2|)y`=YJQEtg>O9$CjiS93pks|k=N0I{d}mugyStALEM(zz+vVl? z$G7pJnI84)uDh^^238g!Wee+Z$%TRR#p-e^)y`r&MKdiDW0H>Nd6g1fC3>VSnE(cl z4B;Ds85uzVo6i&IM8IU{(K-A5JtVJ<#qg60oxfz{H+TJ62V2h*8ydjqIU?iaf ztPh?75}5A&7r-ic=o@gcZq0l7)c^gPo98}2n%z}kB`dLhMC2X77y-r-2}IZ;Ja+gE z?=}r9$Y`~V?GTTVuc)Z!C5BihT*To$TVb@*N~2ihS0$!liQ0{M@D#a(pH?TKSI=(y z@#X3N{-KSfFE3|P|3>5`pX)W7&A3_eu)+a}H>v8R!ylO-N)cUYV?RM*V?sybHJGpA zYmijF@g&4&Uuj1~n_;OoZA$doOBQuUv$V#Wcp$Q(_|N^4B-GFjSr8ky*-iNm%Q z`CwsDnOp{II65J701`G$EiF?|@OOTTcB}>ULCg&Zg(rVS9-0>&*XX8&jak#Ws-wcv zrXguZ;5vi6O6>5uhQz% zBFjuh+0QbeP7AH26cA&Ah-LKG)?QSAK34PKDMCp%$2m@K zz>~v1QatbBR@nwPCg=r#5lRpCt9MZ*A^V8RF&ttv3XhlAMnoloZ+xPLur~Q0ciyvATqq%~I zhowXJbd-?DW}&U48cAqdMERD7(Vrm1VQyj_r3td@;JUBY$ciL*)krLsH%u4-(8|*G z8;S>fEH-0@d9bS+E1`X3VL`KGYwpnFY|r07#gec4xybybLV&|XhdE{ji7`C6Ys}5Y z4TCx%>|-M()v#ua_$D{pqutPE7DC$Rjmt>LI~5Oi93A`YfT4i+);~BSsmKX`vn+wJ zi2JT*Bs#kK_U*@4!oef!b#1(OplxB48V6j21;Dadu01yBGfDXpTQ*jZBVYiM8tjZ0_!sWA1 zov5W+TStr`vT=I|HkaLX0t>z%T{Z;eLA;}g>W#a^JJKsF{`550pI@K9uP@`@S33M3 z8`vL%iLdUe(5xz2j0%-RKZZRUTMs`>mw2_WP@3{*O|hl7ye zOz5&5D7U&wXDQEx)4P=UgB6)V{mE^lIG?ZS>y=4e<=Q9dwGZ9qOTO;MkKn8C+7cbw zk0+s(=GNi01p#9$CFaw)&LX4Hw(5Aur!&2QUtioNyJL3z&G=24VzX22c-xK)S{pvDFcEhP^8P9tb%P zJ;8PZVon(2u$V^xBDbx@T`W<9-5~z7p2$UEv6>%5fevVILM*6AWub7K#oOh0r~qV(2gU9ZloG3NJd>6m55ZItXYz0Jt2^CB-=fB z3Riu-GtI(~UiU-xf^%qDo{t{>Bj!FdPDOx*Sh4BEN++H zSY!K!egAq}m>(Dv@OQP>!-&q)?RWre6V{knkv_JAR5^ln3>T>=%mvGUUW|wUbFO)9 z9=o!@#1baYQcKakJ_61Yl1T4}97{7zvbcS)!;@3G+u*JwXY;xh_mhWSzM`dnu>ifl zrsrHj!hHd>)kLg_xaopZ2U9`I2`>XxN<>vEyPx@JrcD1cB$r5PG|( zAue_It~q~w@`((``du~iso2V91rU2PE(5v$ae2TWk9QM)~cmocDS;QqafCwVRykvZrh*Eqx zQyxAbSu$8sT^o;%Bno0L-gydQbE(&uKfbm8c}YOGfB%}&=jyHnP$YeRqFsbjY1-#l z*aEm`*9TPBX|wkbB@(PL0=8P zzpA!G?HY~$O9nD;TvByzC8kPj5wY-K?B}!sP~uvmejL?MX1w$d!p2|c{$;YpTg zC_vhTldl7;1F)h+AkPhlATFApWLoXCxrPEEP>2@06R9YNXflq?8)SII_~3@-C(mey z_&>HUe#bXei|vw#qM{r+KJkNSo;a*o2N>rf)NO{6!Rv`uB*8Rz-Kb<-l@;?h%F?LI z7}dt&8aAg5EeGndb`kQ~neM?(Q-%2cWY852{#t5pyD_gPl^?^luUFV6i{_cNF<7HQ zhzwN7nuo1Wwo0}k|DH0L6hEonX6WdA$80=j3fDV$4-FR<`uJL^SE1i?kqb*T4BX+K_wK}EfP@rRv_$w$v4pzWhTcm#_6gm)@Qau@Az3!3r3AS7*n;6QdSw^+$1LAJT@2P2Dyd^rG&thR74}iJ6_`8Zn(ut(sW3z|m-uC+YnN3sO)&!8yG6Cpg!U z*Dw3UNDbk-*e_)IdyJYyjIq@72!is^^rq8J_R)o;OCm$PD{nMlvVVVmQtO0OI3K^A~QImFkQbAh3P7K}!@sJ`Zr1h+ok;UO@4S%vG1SnT}mbK_tk zXxDRNAJoB;j@a8qAsTZ)U&kSMN*&sbbU3N1TBpNij({wJBC#4Fd(e+qVG$(goOkpU zX3cv?A`+}|*c8u&;_sjMv*2PZ_a^DE{?j=Ve_8+aSMSn(TA%0L*4c;Fk^io`BTKA9 zX`5RA_?LdDZu}@2a?w@}{CaAtlvC9{z*kh9n}dV!VlYsyy+BakP_O~|<A&Yvq(_0v_J0`gTz z4P<6Aa%H^=3V;e{xa{i0qA3E zVzTLaAWn`UVh-p8kl`JR&sqS#s=#;omJvoFv8pEWJg3n%!=NS)GK&o=Xj( z4|X-ZBNpzAQd@a`$EdSb{Mb#oUbi(9B6KyKGuEO_XgjsN4h)jIA{1kmwNC1cnTeG) zhw3k)sujq(>QgWk1vOIbyc)!nQVf)sqPKL{$YcWXFSjtSQSdthPplC#1H3w?HW&b4rB;LC!?j>t|BZCln<*C zc$8Myut0)wBJ)$3Cc{%z$t6nP^ZV*odDh>C5p*Z`*8>Bb^ZncTr18#IAK64kxHh8_ zAETp`4sZyY;5bJKp_96RM;zfvwkMq_&Y8O}YSbEpFd;_x6E3`*X%@PkJRH)9sK$g3 zVTv#hA27E)IOJhL1m|wN#J5$xdWDAd=hx4qst?y1n&?{oGg-miFLxk1oa%Gafn3N( z)o~-V2Tk5iytwKbD=31;d(~wM=FO5$c$Cunp`!LQ-dP^9w9>$ z>At<1UmRaj#<`~vLK<0GEvg6#*66}a52&jSM{XBbRO#oXg#XX>=U z&v-}al4%LqMts!6q1MQ>Fg-LY*v*QnP`pk;)h;Ya2Th?ePvaddx45nvI&xCv%fY#( z7Eh}-!XBf#)3#3LkY>?8fVmv1OE>E+SoH?Q_fDcN+vxvV-(H?RX0qzjz7SdMZw-*WlND-Avh?&)iaGKhTg&8hrmX23RY4HJrkc=w#zVcVpJA3Iy8UAu> z)@z&ivix?dB+_+6)((qq%R9Xu=ZGjs^{F#Jzgi%fvcRUQvc@h@KNfC=3s-GUoZBzR z#_PH0np zLuCOW@4awkN&BB{d#73 z&)+W13Lkq*m0=g1QLP4F z+Y~j_qbDeb)x3*JYGr+%$W8D=3p*nDV$iaAsooXv(_X|n_p_r|l6EhrBURg>laaa5 zhuuD)vznI>ezH$O{^jfECz9{$LGRmX{eL~_5Bi($+LZawyi(t)_Zw<`?R8YI%B-Pz z3NDxqU0`bA9>rP4~>&bxa{Ee9Zg5*!zXm+2;FZu^ng1dh3#@Hjng&=%2qT2Cn}kyHde3jJe7f3 zQar*6qR3}^!M{haIU4nH1?hWBcObEOVppA2jpWukJny>-$?=)X>{$= z<=yp$c1(aA0jHv~fsS!&LmdMGzt|H%*f2LQRZ`#$9heLQL)pFANbYehsz ziY!QoMQR={QBHN`!m?eZbl5k7WlS?W5O3z(tt?W+?(4iCHT{688xh;I9Gm31;1@mE^h_zv%vRIDZxqk$Eub>ZR!#sxbvl<| z3=M+3V%dr^Xvk1+3KE5cx7E_s`Fw@qH?TK8z{jdi{5PBUkHYNYuKRwO3o?GV1gm+g z#ziAH9FP#uIy0Ve9U`s>F%neaIXBR#!}|he_%vNTPl<@`TokjwKo*i}j`f;mF%e*y zxuUYwcu{88Ag2d`pbE}AKk2=`Vm=Y|Lp^nG()suJRrTRIqD~un4oc5rP_0je7rR(t zB4h7#nJur-VeS($4dlOHWgK!2 zcf2ubf8L}w>Z@I7QG2zNd~W~#`tAAa`u6?l7pRfqm1JoT49R4VRn_;Yd0W+cbyjPD zk=m$pKkZ!Ml0=*2(;}uiV3OA;2E9ae|7l+?~r} zD8_wydBQtVm$y;%8^?60#A|7>Z_}}?%Au)FDl8EehIU9=PK{(T=N)%QPa3KzT~h-@9MCCL8Tdn z#=c1b)S9~=kK(I@dcUWujoDYs7@wbiyw<#betK;k*Obc-U6s?d9}O@DG&H23Q~*9& z#ETvJV?l}K)yPk$tpO}Z8R&#XU>cofO}Bj5@cHhOMaHp^Z8NIN&B-F5t68kRB^Y_M z0Ber*&L(fKLkq6^)RN3+B)qWv53Sd?NN{iKU{?2IyGakoQprh#Kd3ZB~+QtkF!9VrTG-;@kMN zqxX$$k4(wxNqg`Rsu{oY6rt$ewyvLFHP@Nz{>BMispcvz)ovWLAz(FG2hW6~fzl#P z8MW_8Uj3x=Z{$SN{*(q1*y-ceAHY>I|?c|`E$`)nGd){L3^hg zn@Gay?|#C6q5J00K@P)F}|v_UC}A_Img;pT4cv2KV39k|kev z*#I?_QEXsAgZfYpM>BpN8{MUHz~Wjzt&BAEFa+=$A4RqCkD-B|p`wFx*!+`))WQ#k zgL^m>%1ov45m&>58dcRb*n1A>%ljM(FvW7jMAMw8kO<7 zzxEnJ|G8uHp;6vmjG8*{L_Hkj6BRTeu1c?yl@~>29bpIHxx9hCq*JS^qtU70*W<4^ zRl2lQLKElijw~~`H+d440k8|K%STSqu*N&1{F(fn6V$D+zwT!Idhrq5S0wK}W&~c= zJQJO#?tZ{}5^@+`o`7o}@&t!I&w@lTiVdk>V%p$6kPf#>MLS0|txhgRe)@kAte(+r54&n4aSNlhWHsi4v=>rGCEE;t&kxSFqPdPdys;aKw3qbObl0UP!~F%HeBI#9W*X4G$R5ZtaZHQWi} zHDCh40ZYu;b)zAS2~kge+iJguQ&pVT&?QN8kU^OT0y0Wl-I$kj)MfnjpbH84&-Lv$ z(lAoWmW#HUg+Q3+iaG-cG^)U`%N;JwYN83)kxt9)MvSfA5-?LkSPfV-EW3&~F%*Gl zaV}4_>Rc*4(Xf-~Q$?8g_u()av}^jw9A5O5TKo-j$f(y@GX@D2S3u6Yq#a#UVr%^n zV1w6Sf=Z_~rV!i)@G^-ihb%PE;1RX5w~|ZuMCnvXwN2SI4MK8eJN}j|{2;!-%$q}g z!C?0JZDiFS&o3$me-j}6`T3(`yBKS}o(S>K8X4V>4tVQ~AxSdgr;R35sp{I{Q~)*& zTy)4rSOTTimHonYI5J&L|yy+s^X~T*PlF8FO8aih0n_` z4%|&md9pUbWxK>Yq~=h4y5>X_1frV%=4nL{*KX3tB0-w-83y)FEK#YxSI-~d zrGsKsdM&=I?}g>bS8F!SyH9bhoVbMttJ>EqJiL5={`yrV?Z2_&c+1xTea>jgV}p=y zP~A8c6`xxWDsqUl(=8u!Uj6jN7=t*U+H?w2=Rc`U+cinq1PV?aB5FZ^7#-d53y(g%T>Z+ZM(}G0TQliV7mqqpZ)PXREZ&^E zn)NpR@@D;gXj6Xc?#rrSZXq7SNbi!K4vkMaGGuR5ZS@%RE<|VO`ij+|KM}$(V7l%+ zuT*0^a$Gj|h;q@aRTgX1fGzcqz>(*JsWPaSc!%88+ViZ{bME~j7kz#H{Q0d+`gi9l zMi8f7=gN!$GurOhPE)ofoQaHEj%XXIi?`UduW8h#sx&;}Kr~jxi^Y@yvr-LYREy^B zC9k3bJE(4V4uuSJ+U3Cn4;AWHcki*7{1y57kEhSCJ%87&&EIuhwduldYfFk&(66ac zZfUGyZ{{F~y4|ra4H87_YeH~Bx_2Go4C6{easvAus?&0{6G|U+I|2-AYL6qJ#O#PY zru06)jqWEAqLwdrseHT?|6EUa?o9g-KCHh^Zkki0l{8iW01+!RN7t83uuiq$wl;g( zrGwPQ!(n}BIzCq6kLk1FByz5WyjxO)=b_+R72X6(GEH?~kg)g9#iQ!4!=2mI^pvlK zO@9I*Klc7z@L)lQ>xj=iG&nUM&{kZ=+J^zIu3uU}VPw^&7b2@@`xUMaoCiM8EIh-r zCRK-^7Uxn1j|2n-+ZAF%*}ZnN_k&YoHJYURr3htr*Fjt3$G30dd%x!;Ue8-Wd)z9t z-v_K{s&)`Tl3^KM$HJ?qx3Qmysi_G}WTMF8gl}xp3&~kcBO77gQ6LpOheJXA9EzF9 z>RY8Mb3M2nA!>5)ok8A}Hz%Db?ImCR{_@l5%LO&c(1vW?2f0*%1u)hDw>4d5(69u< zbM2jbXxg5&1|F-k?iu1(TZg4{Vo_HYphJ0W%>tDSCPXy7aN7Ma8~YUFePG#QFAYA| zT>NWh?p(ckiFl7{Qati`tD;L>jTjEm@Xa^ZdE%+0(ZE8JdzwWJJ#Imfc*-4h<;!Sk zC9uO6P1yp`!F}I)#f>)e$@h;yqF$f>$xXT*;SBJv2>5gzIryP#kfs;R1J(M-)j|8* z0vY0f%BFQ#15PLHDkBveFFUlITU0r*^(qJI8m^BPBB=@3w(t!uj&juI^jgF2uEAlX z<@al&BQOx}tqG>S-d!O;f2|h$8wA}ZcWsgDx-Lnli7nds+ELb)`ma_e0WS}+S`c*X z&g$Gyc68B()wT z>4KXH1MtZ%5-h1mJL73+a5IFvxQcA;I@bWxY90may3ddeC_v^zw$<&YX3C1$zh9ji z)gMyt`H?1yzn_=^3c>oZ31@XK2OyH zU3E&0!`n4AijYTf@c;l2007vK#WGbL9g8&B)Chp2^ZUswak?`Oz%YGr!PPL>>r+`@jA-e zDhua3Uy!d^sWc(|)F^*Uvx)Ty>iKaz)pQ#c!hD>wu+v>~WuQKiYpd!4 z3ym6ykO|Pf=x(P6Pm#U9W8o?)Gp|Lc=hK+8L(ctgAA2RGYXeIJSpBG%sZfC*@meo@ z)@@nGkE5KnQSC#TnmtPxc#TW)+r|n5w`iuKYGm|7EOn@c04v4-d-J!bgjcBhnEs!>yTx9T}f9$A-% zz+WPab7F$-d;%nO8dw|jni!fqnC=-`_Wh04=y?n7CvkKwJC#4qA^+<=28|cF*pi3q zq1q!6*%}LgRT(`L8;Y)LkAKuto=GF@R2v6{fNq{|_!APfu$<-vV9c}{FM|Hue9x&i z(k;e~^^a^(mE+Gs?{WnFzRvs5Kk1FA1>J+_EFW;LK-4-qVUj`P=D}U#g_U{I@F%~L z58wujGpT9-an8%H5x2(CnufkCXQFOsiE5{T<|*;CR34NC12ER#guhj5+-1Z!>1KUx z-+qs&sYm&GK8Z@?sa*gRuxl9cohb3Eb=+34L5>xATn9_)T zcizDBs|cBZrRl8fJY)0`3($a$yKOq+?oF(2a?KBM>T|ikrApvKtCVmqoL~=L zHZh|Gjf()a)?+=8YM`}+@%wz@ZC1^VA4nT8&J#bws&-F@%Wji*06_Rnn=w_*=q*v> z&GXW@PZ!=l{)@r?b!p!#wK1^QS1zp?lmBX;f2>bW-`AfXd&v5?arvw2+67UGv7OS4YycZfTa% zyH8QW-FAWoj%j${YjOQ^|8<8U3oF)(7Io_QiCMF^YQQO>9j&t5reO)EPEcoin%SN2 zwMe10iU%XM?KfqGni#et96FGkvPO`X zwRqp%&T1Nb8%tZ-o^`oRd|+0}={65JhvqTndS}|}&cV&}`wuNj&RmHbFA{#gFosNu zMSGHs%sO;yRe*DAR?DeORj?lSh$yOC#e<_@e3z<#H^=-svl7H_t8PKjSS&}@C z=H_~SSKx7Dv8>>21qC4nURH+du}ovl>wK!Okcv{wXx#^ty5`HJuYbV;j}`Aa`_H{M z#FAj**PVH~y2M}0Q6QKinn#>~g=*0b^bD{O<1hqIujsK=C-1aZvL-0DR$aD-yqDSy zbu*U=mqCY}<1X1j1g*w*tLPa?H6NUyC+*t*WSH(fyVe*!t>1;c3M0OR(dYn0arPMN ze7z#%w656>^=g&a)Ea3{OLtGhrUNGGvIWz1F*&S(^x7c>szC(vwezhTb~f-6_G-F>n2 zSCkb5eY@LE-Riy-II8xyb@~IScXE|kz^=h&+W=N~^ZDlTOKi25s*;^;pBFJe*wVXcP5o;J`$V z+2=c~X3;5A2h=qfKgI_mgpwvh-n&i*q}K}?>pfl0dYi(39i+DOD zNR@mwUJ?8l4w|5v2(LUA9al3l0yN)f!HLMghboYF7!##~ z{HX(cx|6geOdEw{3{~<@w~u9qmTWn|4aV@D>`-wZT!DOrBf8e${A*r>|uixsQ?6FB!8M@iGQ!M&YrRPD)ru2DT?y*9B@u7jUR-Fue{QSG{%b_sIDi4weCrbXeN@zaBAL$B$S06 zy)Tb6eEVkO=R86ps`28wxGs}(w7CBG{{8E(rxhgL`qeIS6vC(VBlA9wfLb^jFny3| zR3Pm&viM|Y8B*|&Y+c+jwi+w_#&gd5Iarawo@Z&F^+j^I4yzNqV5SlBKX|+OwvJz} zk$LHEy!$V8ISvlj3z$EGrltT5?U*)QV+=Yw2Z;0Dy)JE9 zx&}Pdb1T#IX6%9v$9V|E0f%ivS1bUH4>FR*!`=b_tBzde-&EgU(>p&7{aWLNGgw_B zT}wSAMwNBi0W`tz@_9P8ZtHb~egiz)+OVQdp!JeW57X;TGlNIEZh!0q{npG5-ff>Hdqf`sqokpWI}+>m{llQ-s`36O zTYRYR*g|IgO<;4yU&F^vB7$W_rqOLN8h;C6*5-D1n>+%9?2{MkjJvzFP0_uf3)%-Q zYnoO9Ab=Jc$p}YALV5W|vR3VD>8cQ~J)4&N z3Acojj;-3d%xYX#S4{KJIUvC+s2-za!P#9JdNFloM^>^1+K>`}=+*hxHO-COWQfM5 z`@%GVA;H2Qgm=E(F%~6K%c%R*zCPVv26Mhg@I!Ngjt4I0z!fSWc%)g74}u7mPEkb~ z@zk_~&kGKFN8NgE77{mVb3xa#=jdaFzzOGDMM+HP6JY3o_yTK(5b-7M!JaW#3ABS?XwNwgXi?&Dml5Q97TN}@NSQn?Y&7c#Qb(Y`^Bigx@pf_5TDnt z_9l5(<(j6V<5h!VhpwB%Jl*pMn!%IoTy_X|HJW-`9P--_hl8wF^;NGo7znI9NSu?`~EN z(dp33?yh7FS3XU3Qvl@H>(Q)aTGrh8hK7-6ZFYi{&`~nmgp<#W2&`a?kD7c=wtA#G zZ}(Jim|E8TD@t7b@;VglcPNs!IWGCP5(4gA%X!|+YZC_*T@%pBK^hO{*E}`jrCY1Y z&U%J-qsb@iqO0aOt1zo;sJqnG3=S_gzf`WPJtz$$eDGpTy{Th3!-Vyhe#YO$@Nlii zKqqy03m|8W>`-UOWbqL`!A6x}jdogVC<$4O=|C_bnP#iHU|_1$6BY~z8rGmHHz@h?9jxl z0Hb@h9^|L!>rIpJt93ltJB@O`>$8ZHFK4xy(OWdmLIY-WtHTzm*Tc`OGd`)bd@8yd zwVSZiH63+B(&8_4fx~94*>jD=IuGpBv`$FWHVt{xvi5b$gA3bL%6rpID?UMX3D;RN zmvMEk9ksu!+v`>8YFedwZw|nEiU}&HVmLMgb?7eC4XF)#sQ*<#kgOXT6eI4Zs{_q2 z+HOs{)NNLs>FSpA&<5Xjj~+1o!8k}#)ooja+!bS#)cyK&cazO8JLS^lUUBukm}z-F z)oTFc-qfS}HV>as5o&cA4I=Q`wwQIOoUB1Lk_p6z(Xw09NL9O)bq8$Id~IJf3sW7@ z!xbHxK5!C9c~AP1u1od`LP8xgOg(HN9v*wG2%W&^c!)+LzeHHJG$B z>olY=5~2VA5C8x|siqSn?L72V-8vJ(HlQ4_iRb1DxU|t{M)Vc~al-QUh{UGbE)k7@ z)^*$Vfp>_n?;p;af)xAf9CK)!gTx+-9HQFCa;P8hP`hu{+@3_XRUNJAY3u5fAu*LD zZo$2hNJlG{;Z$bitm;^&*X$SgQ_g*_Uc#eIJd)GRy$2U3#ro6s>aX{TlD~|v*R|f2 z^ke3s{ZU~ZAc8>G$!W~|I{CU1WPDK2EIQxgDX(-f%742v&Xmu>3hAV*i zAj_`9>N>xMzBbXE(&Qt_IK@8Uy9+!Rwh?uMgGR%sx9B`BCiXpb+O9fqlnTKGQa)%R z1AD-?pAIhkr9@3+=(h&VvxNP1&1uF`=+IVWe$_;u=VT$Gf=keH3ATCCfR$n4*E@ET zvW_EA9&u|9(Jp&$UE$tBPr9vUkEljk8@;A^^c^3xg`|7_s;#F`t-WiUxKO;HV2Iq&Qprb3x*injck~8t&1Q~lqHoQW6DmoE6-d{4o;HlEsDQe2s0dA5^1bUi zM$uaM#IR%|u~>eOJAHewvyy%CKUqXr{k27THsjaFn#iCxn1k75U4I9;A-7r$gmpwy zX-*Bx;9QTVWLoMfZ{DiB>Y1;B0j;7V>zOiqu=hF4I9 z{s$vA3W|vcYFN9jS4?ozscBLCC1iGI;?Rfp`#u29baSnStnuEve7PzKB)CO^^9i6P zVtx5AigcIk^`fDn;)SK{*VhR|^U%d^N8LNAuos>ZPF)v{N4Jqq9;Mh|*D-1&0(?)G zVz#2GWkK@QEAfUfr2PwU%n-@3sIyj(9}|A%&j zMo;~ScBAIK4LS_0hnp%joHg*wrG zYb&|~$ExY&!2*SL#h+}`>Bc4ho-gK+zkW9JL&GFEFWMty19_`_Knf9*J6f~;IPW<) z?Uvho3TW|yoSkNr&~%eP!kbX}V$^A?eU73j?nP%+=jlmEBri_>I zO#{ARP6PJghEMA8vkokEW=}l2qBvbvlwefv2cxk=G z)^AVW|IH`n$4fK5T^tZRD` z!-{ox1Eg_Q(?_s5Wb0Mex2EQwZTzTfJKlc^Z7bcbO*NF{OWeKu`1 zYH$DQwNz`+IJQG&D+C+LxQhJhAZuvAGLLyGYB}r;Ql5F%1)@Z5R1LmMnx=a+<-J;42T-q`Ff6!pz9ewV_`Y^8y_PMn-!B!*#n!hPxT1?p&jUw0 z5UIAn;-ji~R&85%pg<3KP>2ZPRxOFT>Mxd_7V>J$Hc1UmBQ7UdC2A0o-QMV4KO zH~66q*L=N*@{cyL=haIeVnvMChWwzR4bs2+d`!UFhmNeSok@$GZ zup)yJ8T!AI<zRrlTt=a+;8bl;HJ1Z<5@J~!0=g((>vLB1 zeeGjMRqCn!TGK(1j$>`Bmatk+kl9E)q^S|#K50W{qa=GB8d0vD-KG8uUM)(p?b))? zrMxR>&_aArpOdwPcB|&kNAW&gF5UR?kJq7%Prq5)lF#qu)hNv>R0;CoOVBv|&T2y& z9*B6A?RNB!(`NHRD#E;L(LiBWbPFgj))1Ev_Kn{m=TIQ@RnY)jjhIT&>x$v>;C?Gm zBp3ISQ9$X{Pd|afFRPYGcbDrs)Ua9342JBl#<5HuakwZ z5E|g0MqsHVVwZ~M)txp75ur!c*@DvnV$cAb4SR%`^PJn&_cN=q*d5W+WnaP9%LypP z?S+A3oevRz*~gtVTj6?ct+s0qajmdTUG-89@HrkCJ~LpKu9kU1K*dESTo8yQr3*R? z4P@CcJv&F&wGbM?yI>F5%~s&`ac$Q}Rj2xcD7YI89aU7Rp&HkzfbDfA;4ksPUGK`$ z{4$tWUPG6|?L)K3juueEYNYHF&Yg2PZOyn@KyxNts=ff}+dSm7>Bum_ajLGqQ!8gi z@3&@bZ*!$IYsvY+To~Q+>+jZ`4Y2w2pC0=2$LH@)UqAo66hAbPw07<2L?3F;`$*>w zho0O~!*++=D3BFxna-WUxwzkJ0=;LYbfbHzyVqF#q0MR4@u`&^-ky6O+Lc<`-B=O` zk8X|wV8YFnr#fR`{a*TP|4vrYrCHZgj?gt#NJDGY*14-LaH!?n);TmKWV(bk(=XlU zx_e!kL$>PR@6Z%AvEoe43mf9{kyN{EN-AVj`$;gsYoKpq$asb(S$d%Y>jaG5J9X1tJc5BRo%KiaaE4DUt9LnRTaK6}jB0Zv4rHvzH116*`-HeiEbW>Fk z{?SyTES_s`J*16Egx}@z8W3W=JpJR#S^Vi@(3gL|Aag&miwClM4e_K&-XDZdgHAk}r`1GG~2WgG;Jx;23C+Hu(=s)|r;X>Ds9c* z^%GUQx`kh@r z-HKx`&T@%G6fBwcd|wDc2+`#1v4VyjlR+gi3Q@%3n<~0i5eQ;`SOeDp&J9mOMX!3L{qKXvcUNgH`HozrIRKIh46A8l-%@r?y@b&VIor?C_%HM|^H z_!3t&<>rBVa{6hl1tPh;-PiJ){6}GU!8y%ft$C_;Ko{Rx3jx}i-qokq0Waw1{{Pyy z!}mAtIbS4^E*F{n{Vls(<8|tgHVY6p=p)gG;Lev4AZs;=OoP>0XT^-#Kx+c1EWPnD z%o5C!L}&FpGsqASx3Sgc)g+|J7P=rrHKe`z_X{nv2yM8hK@K8wy`1HDS#K#qjlsc9Kh;I zV;yP^6>68Zw1`9@G$g6G7Apd2kfbyKOQSnBZc-)L%x>(^(xct2!VCCmu>sTOx)pR? zZ|AO{-`ylu*Vx5NrITVnHP>`Zt>G4`iqyfya&4=$h9E%Q;UZlykee>g(P-hh)!?1% zWZCrzI{?~@-`SYmbdf}BfhB7;s_@b4bs^pvrc(2K8%6W)?0oyTVTBOsRCQld1;PoV zd@cpkBwB~$Q`JMBCt!`0HpSN_(M2EKmmYedgU)}(RFmcy;+-Ylbx06V%29fB@vsj&;g{qq50cx2O|31C$ z_~B{81`-?z6(FprR~5R!a`j#2b}Y|bhDtqrMKJQ&Vjj%z$<^N80Cx^10wKSWI-J!0 ze7ThszY$kz9KUWlAO|+m`q-#EJk^{E3v|+{-n3pfy6KeEH%iCBrP@|IR~f`C zDQJ6Dh4wynsJeqbgg)nqfXC-k87uL>W5Pmw zjSp^_000mG03oZ~cB;xg7KE>FMTysYg743&$LFVC)MfMH>a|jqH*Grk^?-@$;;o3* z&^77jk!8mF*@C7Kq`EW_UPOG7A{?@Cb*CNxc&ppmVOm1^>bh8!#?_XgkE$2vQJ|&U zdH!efSn=^c%sbyC@#p&f$MZ**vM2{%Zw4ZT#+qz6`ndr&YL-8#280YvgH?2K=E+3e zjArK6af9xfb%3&pv2(yTn(UNy3-nN75BwDh75p&Of&;D z!pY}ekom!@;!7Oz*Taxi0t_I%Pn9&@{N@H)l`KkQT)XnlQ}fR2uYG>G54Z8-u~Jq?_|hF?PB#+7turXBRX=4_vF}z< z7BW#3e}!rmVjAk`n+^*tV!#D$-#&Qh#piqc&-PkPHrLDe_Vo3wyx=!NjSzUFQ*}Xm zhVB4un&gNN;jTyANG5eenGsGa`^CfVkuZ9+&T_MZl(F(EtVFBZk^vpaJfekk-ZB`e z<0=w|#m4vFE2we1|AGU(%E|xZ9-8a8u#ZgQo0+ThZMv9L*Nm(78Z}ZO@7|ar{lBDr z+jbi}lI(NMzhD;bm#^`{bz5i4l8GhEXD}fFU5HdPX%63Uat#1YXOq=?Kzw%RgC-K zh@XYspC!#@wCP`dwEVBFT2N& zbrbLHo79_L27b=$brUr;&9+lO#zdoTtxE0`FNuhcngT~2e_j~DCTv^*v9W;hwP#M% zjse~VQVC4fHTA=Mizz!9_{(e%(zic6kGQaPh z%$*to@FS-SH6KaIU8s1{Jy0ZAJ}yzwjxWC!w@V|^P{Y7EP2)IS!Hu!~F*Jl)K(5w$ z43b@DqqClaEQ9n=fFX}|jaCjV-nUR41W`k|jyz3YISx6OfiI(};r!@Tv5;oQ)QQ$TA;tvC^MOeKqTEh#QM;>C zIh#}My1uoav;TYbj$e)A?#B}xx3u*`$D9X;Kc*I()K=hB4bcZx2eB<6TuVjxvj`Qm z^V7621-(RW9#(=><8*cFN*LH^Unz|os>4CWKk$Zh*xqK(kv(ajcFm?$Pw~dC?cVS2 zZ<%%5yM1MwR6zP>Ta~a~d6D9(uIMTgGRwM+b?ND=t^;mjrcXsJGevl-4F19^ph|E8 z`k>HBDRD9cAqI@?CQ=UnttfD`-8#FPOWL(G@bn}9)i;ym!=>Pduw!DIufk=BB^P0A zW)~od8hrrh!Yw_LQ!07Er=&e~AOLnQ^nhcSDb&(?0WeOn1z(lY#q{iHW{QBWlIQDi zi21;-H4@A0JFX(%N3^2c7B^^M0~@|=zMV5J=8RM(-9cM1 zR&fOzDYYZ@bs_hy|Mm3#>+9r2UD{3aAi2U98w!QUPInDS4;0QD$bxKH%1{a`Vv`~$ zVK&IiG^Pa&Q(&c?K1jMzE5IXoAk=V*j`1Dvfo(7x=ov?0BJBO0877q6&fMqtaPG0a zA1J)qOt}FMz`_bxS!AF<9H0Uw5?ZeK?#Qkjc8WS8R`!aZfH0nt3{-?s)E(@NlcToh zgh-J`C7Z+cArW}|4p)-5w`=YZk#%Q)2PRENNxcfN{|D{-`S$t`_}SZO%J1Xen-(;<`jmEv5xaBD4syHkW$4;JltPks=&aqX_I%rznw%z3_d3zJOG;0k#CJGF16G_*y~Y z?A1mYm9U`oxn#rg8?gBDR@nn+(=zB-8bDTn z>+u5{f(QZ(mM6RFM2neX0>y#C(JsnT$pArtZPZ8r2W{R_6K#Ep8;GxmapQ}}6U3oy z#2)btc?IaA7G-H}im(X6A!ci9um(gpE-CTjWd?B$Y-{Y3K^W0GA}r`Yhc(IZF$DXD z3upknQ^`}Vg}vBjgxeS;%JgAMEnXdo$dEHazSGgi7M!S>V3ps z9e^gS_k-w@S8BT{cCB8)fA9{8uPJRZ;f?LRe#*{MvBG;Va`Zvqrf|wl&q?y+636O0 z5*bH+kejHjifawJk92Dc@FHRz=TK8@{Yl{SA~ z%B}}kWjQcDo-?x70fIC7>M%fj4up4iixz2HVH+EdD=)x)rxpTWAvmv~2DqZXpW_pR zVgcTInwd(ZDufds`ScJPjxDEOb+-5x*u<$R^Cw3!el$-(h;ENavWf1RVQHKSd$__s zppXX1bo232zE!EKXq_g)71%IU4Gh&3al_~cQH!;u^pny)bz5}hBTe^Ix#{!-rLe8_ zJv*Qxi_7Nu#vgz&dNAG}OmatJfZcH>1jr5>G5f%IwxPk6r!CPs^JD=HG@yi6$g^F?1ts28tHa2IA`U$ z9{`{DCJs^--LuTqe&IV=_v=O_@gp!XG8G|=<_PA_v{xyemO+9as<(j6!M*oiTL zLggR|&X>s&7b^IGjiIp5@T69WUIeCtTmc|eGe{7UVRP+4^E$iPbh^Syl%H^$KkGX4 zu|lW2`=kBlSq3O6zojb$Fx3T@gyfO!_e@XI!%zj^4eJ>%)^$21*!N4ENk56_=^ zHZcSpA@9xWjw_9nD&-k4ht=>(grBaA2l*l#vI@oq^ z%u)wcTlxB2ter)*N-^Q!Ij5P2&B}r6_t+vJhL=@ip&m595Iy#Cz(H7aPge)gxo9mg zME}XPP(o!V{Qm7<-}}pjl2F{D|GJ-|*~`26_#~hWcDza5*bup(DkMwuE&B*1MFxGCxRpJdX%R3Y$?2ra3QDY zQ?dZcNC4hAPG>2VltJ-)5=F+< zSRoIDj&1|~mnA*QQn=ZVPWf<;z@P)5D-I&R&#G0-BS{;Piwmuvai{2zfN%-t+E#hM+)x)&54ZoMkfMXte(fzd37UIij*wigc*NHyPM$n z*w1>kH#v{t5jT-|>Bpi2XqN4?{gaUjrJP}R!yE{^Mkw`IZ?6DH? z0p}6dtKsJr8kHkwA*f_9uY8&Dx=Vh64tnT}a*(6~UlY(SSecE-u*k=coNyL&BC#!-D*Px#OE zY{tnCEK7&2J=gjXaBu`Nn4~*X1jukrgiLc_?X&KKxwwqfaGYuUACH;crhrShnrgtNFTq=Gm}yS`__OYZ#p9p}aL12I3(QFMUxcus)2FOYZ<6 zI#bkJA`LYhd2lCFeCYQ=4dm0dKoM@8)sL-Br4knWM8HORCCVF|q$(^%*5 zElcb_Z2=C%QUSW+9`ACt#%Oz*>)y9`{qqW{@>TgMDO$Oo)&#yzX&4C(;ylPcM{SFu zC1Rp1d295jq;aD)fEXb(y2@C`Y81&AQ z@FMtYN|LDWy|!KBM*aN$^n3~&>x;re!H^~8P1zP`4>tvrB;-zw9|n7CK~w0p7ZDC* zT0oqJr%`1!CQ-2sUx?{$%-&aHf$wpA@i%I|eXygfS5Or24e9xN3!c zUfM}G|L&TCR2$0Z(oQpzJgAwP!TdodtQfuOF%6sNXmhp-sSbE|_He0A1B0lFZlvjK zHpf?@7}`gxIa9ihKIPhjI;VV4?4)4Wbwbu0B{;F+Q<&KL@2;=e-3zug;Q$f_M_wDr z?mH#JC|s^_66x$b+}w^OcfjGQ`B;UkQ>M)_5*7PwjBD&Vw7?zgOq|X^78$H6&N?}R zsG|?+gwgF=L%F}wt;4FP$C8s;(cOc`bh)yt*g#@S6?(Sq0+b3iThZ^@SE~`2ON6*Y=89=(uS+H&vHiS@J3H-NK>R*|pnSzG{ zaW)3{S5j=RPInzk=er&NkaOvd-Zi)5L(*YCd*-RHg}Zq+p_$3|5#6uEnfmRq07RX> z0-_^LA~3Lyi>o6l&37{Z!odA$OteJ}FkVGtc%=(2ARR50L%62+9x%KFBCHg8m6VM^ zQpdt&skt8%&2WKsVmEVdGzH|Z_vUB*{rsBm*2W@H(bmA!J5XL1J!@*H3`e}zgaOq< zTH#!3T&UG;ZK6GQmL%XA6rMi>+Xk-OHONU}`xO8MaukKIJOzvCSgh=Ucz2`%Ub+eg zhW5CtA=)JbtfAqnrjbPN=QY!UqauNJfr!K>Qwm2VT9Fsf9F6pgGlxJRJDW7I5dgi| zrRrKP2nIA!Z6iuwrP9_k(2WKH-7;M%s$mN2WgOILaZktC+ zs?7)`6;Lxx;j)11$>JYHX^t3Bu-B+any^k_tVC+64u4V$e87p6+-KwTfYgCn+yW^i za!gf;>@x+T5x0;qGh+A>25FySw+m&V1JK-Hi>p$;8Am^nAbkt6#12qch^1&UquBC~ zvw0i#CC$;)Yk+QP?fvl+DT&WkpC&uGynnsE{r&AvzSsPPz;Cwrk35t`Fg!`r|3%cp{=$+$e;VI0W^da-j!EDd3Nw{R8sQB8KF?CPX5SF)u@?0xsN`UPq1 zKI23Ks)P!fb36Pe4Y=d4le0EPulljq>~Vj$u#NxsXP60dfPIF$a$e z!0ajL>s^}`DJ%Xs51i1 zHk`L^AC~p2|NGY;bahb!#BOa}IQyfiB&70Gb7F^$D_%rwfFySYSzHX?ifl2N(&ri& zId!Ky&RC_Eyds~*k|^BnM*yiqOz?bg1u>#u)4{dV_^s~xjM6Xpq>p=r9zSi{-3-8{ zw{vTQonx$sl8ScK6t;{b3Cc@&KIcUZHWn?A)d(gRMRV$2@NEoB|24-6<}oYY3aCp_ z%F-2NOHelU!g^Z{CjS!!J3oPA$9-E5XZ!g1{8U-;*e!C_6d#N+IEh=7Q8Xj1b_kc7 zVpl*ES>}W*2zr))B31Vbn2Y91t9OVoIW++48Z3YSb_)c0R9gvj6zD+#8XsdMt0|fr zn~q1EGwEx{Oa`zy3Gd@(>onE->cVN`($+$$vZW7<@R}m;p<7Y#c|?#P7zOw;D!mj$ zOp^YFjNI9Sf_*ZLFJ!=%K%1(wihx+dTvN{oj zpPIfl;BqCP&xn7HY?nC_mWIJW416~~@PMBMvRzex3a+@n{;K2u97oQII}eXA^Tl{u zrKN{9y`(t*4+4t+LZYfzv}Pwi!F^gXvH&6}@MOqTf2+Ds9Ma&MX+UR07bZr~Ggux}Jp4Ri^XRMtLFGnKS*~ESxX^~uLS}SFuI}X@Yp?=kf$g$*qh3fO9vuEkf2eK zMPNi&$Bz5KaslO(V#%P0rli)Ipp&35pE8wrNE8%?C}531ojsI916=4J9Hq6iIynpu-Ud1LcDB0o;Wz9jva_f-McCvqd*MA9FzzN(d|` zwt#%kEP<;Vf-;5vUAL(^JI=0_Ndr61bI)adO!~tz*8@)%_{QAk-Q)v(AvAqr6%MKL zLEs`)%0M8!HIChI4k9?o4nAbM9D1kCuM3DySd}d<&A1K-lZ`|KDlxgl*Y+_okXvs@ z3$kuEk9b;;U7Hnu{yhQ9{T}UP+26f#aTavwvCP6EayHderduL#)Rd$I6~p<%E$Svz zBP%GvV9(U>l>5?1=ati*0Nqi7N4TzVa49u~oXknE;ljaXV~eldt>dI7e%hG&{QA*O zJ$);K`}Hx#-8I?soiceO(?Su=QKBOc5V+AKPF!nXsK{t8Ee+wkBxex*am(BQkLxUK z%QRonvrYuse8iXtcNtpfcby zfJBvVu*gn*NgNsKh3|e9-y=2fIlbJePQht5H_|{5P}Kghj3xMcn?~<@X@7l zckr~86ibzBMe^?F_hD;|qLrLR5)$3<;!xNxN=^*n?t>+3T68Z;#*SnI^vcEnEy10m zAABJnF@a?}OP7Q~pJH0764HC4ipG(ng3;}6!{p>z*Ijpn_(ZK$f@@PcDx=@s4n&;w z!N^bN)r?)h_putW004?q1IH~Itr8b{yZ2!%=fUwi9b1%j%HBsDqze8Pe3Af-AZ3M) zqlxh?6nxBNsQ`1Z9<4tuhjDYyEcfu}G>ZI3b2j+KQap=R)AO~>Ru1GJ1T>L5_6?^9 zR~5GcA9N{$Dno-dwx%O?^jbB504LCVmj-_XHKP<|0u-{jm!^1MsrlSED{xS-a>yV4 zYN47I8ec8+@o5KqlYSdmLF#4KYrrpPw2Vdki`5}t6}qb!dgSC~P;gdGr8RA-W=m~H z2?9(X6P!=AOHNyxHY*}8Sn12h z^S$SF+}N#|xmgEd#4(4#L0EtSgpFbGJ2>$wdm6(ohNIXrv}u})a`;#`bOojM0dgtuSwh+;GJAPgrSo*?;wbM#1gv#a1UXa7BXP zcq^;oG?|H5DB>7!tqi&5Wnw_86lD%BBWg%rXsl}V7`4wi-Z2mju;|j+k4S$^MaxW@ z9Ush?CuH~CYv5^VoadM|y3cF-Qlfi~$ebHU87x4ZL+2AGN3jcVrU0czEJ@uV_bi!J z;+B!DOB)IQ5V;m)k@9*`^^W8meHyizF~F!RupedjaMiFrjkPg#eGdKBVUNuZ36b}vKqlgYp^Z~QcBx}lKAx05*$%3Ud6zkynt)O=rK%g zO7+t4kpSGiq;nH(%|WDr_<&zk?rfnQEbg@1lh}yWUhXq7XClMe68rk`>*vR>PoBkJ z^)X}PeYl8Ivez96m`NE?5`Z>>k_7fLbe3b3S^)J1{c(CMp5m@Go-G8lcHSfql2c3U-~B#jl4}3}5C8!4f%-3G zd4wsDf8;U3z^Oz5l1!=y7R+aVv*chRQWb43G%gxaI@>Gx?~&b*u#3`&Blw~X573}y zssqg6NF_q$fk7YlY1aY~=0u3m+W=0be(-Z|k4f)h+c#o7*e~Lv021U3B6cS>Zv^cs zIHM6VaS>h+cMvW(%?`5QVybwc2m5Jbq-|k9O#;Z+X(cp4?;Q)^e*-( zO(uP^pWm-%J#r7Mi51or2wEN$I%Tubmj=~0A?^0uIcHBUsNU&)?+)A)Zl(qXQW<)nAuH#Gq>Pz3Bets+c*S~sy`8+H-Gx8^7b$1`N z(rf;*2oT;ED>zGt#Y-h{@QTn8{~{yq*^B^U+b|sCW$UO!2+X*PbgXI>2>?u#LXCY` zV@eG8eqy1uCqhg}7Qg2pGb3c|DLw;;GwaOC&Jc4It9bwQ`gS+k1JiA##1z<@%zTU_ z%t0KBXkU}SDNWo=(`sC3a0ga7imEQP0iFo@LcxcKW7|@o0Z3_xiJ?(&&x2PYcY|cI z#W<;hlD2nx*J2PjQpAc42^UuJ_IrxQ|H(`kaGcz1sep7OC-Ma{4qz03D_~Ttg5&I* zNglwtOU2pbfG~)O10bNcYSvsxA1!yz(KmYB`O5L$R%V?WcNl1XRNTIU*D{iY9XM2K zy6zr5j6GPgr%(MxWWY~ciBf2`?;z|KM9ILZUz(TkiyUFmx_Vjz@ue5vDi}z$snB4z z#|E&hQ>xYZhAXSsi)EPeeDBENBh&*iL`0f>BBPB4+kMhin0!9Plv9m+M$GU1>bdM| z&=|}%vrWAPjgJ8fvgb5wR#Oe3Zy^3dR~8UC@Fl_(0VbE%BYugAw-_ zcP-))daSh~@=(o`W)iViBA!jG)y z^h&QnIq)TMCaWEs+-T&!wnJlPf0AGApH-S45vWTn5BaSOtYV?+uhHy;mb{NH@^!{> z#D$X0c>$Kj)&WTr_I&6zR301#wyTxzz*f#I5I@kaIbU>L@vMkeb zNG_Z!?FOKeB}9eXC+T66&(zwN)mD}1ZG&T!d!}oi zW5Fug9O%s0K-ejsi(fPcH32lofx8#JTy1uNkoq;q9IG@U+XsF;J<@%|N9Ofj(P|8U zT_`{%5SfCtq`=vG_8V$WIQk_bC0kBdS)+IffszptaCvC!9DEu0@TyaqM6uJtvrHEi zsSV)RZ8?kZ-;$Xv?Gmt)-g0(qFK6+9=_Jm#_nXuBd{afJb3sv7g>sdd&9va$NHtZZ z+84_lN+Tg0yE>8qfTH6mCsq^iBLZRV!BgqFVijO#xKK2bqrQqBH(hAC8m%vraLBuS zb%`9B_|!jpO27BV`}pHfFG{)$I(C zC%nJ2dGl-A9?hAkT=U>!gOee&k4iNdp?ahnLIWut%ZP@yDb$&AxmltNMDoD-vgBw+ zG*tsj9KEq6(@|ky@X3#|%(uI#_#tfALqR2{3#IwI%vGQ6?d|n##Ts{4X2RB)=`8!I zWT(9=M;W_A8di-1J&ihi%y2=6Y;#;yM7^(o- znt;P1@yx-e@cL>8sXJ=cIrZ7j{{7?S??+bS&X_$H+!qgEJ1Q-{IG&CuqKTS3cp`^B z;-Yhz%A(d60HI3bKZLdxIkiYnsvL07kko)UaP4*jN~01u8=*BIQvpX3*e+d@qnM0ZW+PwY zU>^1wAsehD)8MReM0&6<*iVmyrV&J`pa6tuqvzX0K}x&zqRuZmX?L|>NXVCmq}LmH z`R=wMj-5SMJnOk#BtO87b#tOvTsL}L0pOYUrt8W9J8FEWex zw&SljagUUYw3P<+5jr+(WG4aNK~P+uGhBQiYYK<9$pLub^g!~~h!p_~9gZ@WG%7AY z$Ty8i@FD1&Zg*#r4=)s2IXfA>PHnK)OGo>?C7Eb8+lNd`mq@Zt+bKFb2!J3*bJR*l z030g2jG=7+-z?IOfmlunOE-P#R92L(WQ%Vb*ko;E<@0-B{{*O)Gk)BBbmxXCcX@R` z?U-ZJ`Z|_%2^<%8^8EDU=@$!f`Q!PREYHIbwl@m}$cKQ27(eV(3ahl^q_ZeON93SH z!U|=h8g|1$47LLl7Y<*6;{&QXY$PHLi~SB)mIG+OjA?q;88){7Z618jGVZ|#rS}0o z6k8H60pxg{vkBVElUEP}0RHlBYyrSq?;%nPLPhEV5uCHq_^+va9*NdLYAv|)0!Sl! z4FyQcJ6#G(r}w1j}3CogR?SPc51Rn2rQ;MdkkoxSdyoRE^(y--!FQpE%E{)Zy;M& zL`$3vknTX2Y>-Sq73obcI>WC?CCs^kl8&xBA8vs)bYbvt+;zO*PJ7`c5O8^2OjAv zfl8suT4C#qRzPaV<~RbSH1-|@d`}0T!kK;C;R~eU9pxesb826A^XbQr-ky;Bo_~K? z8JXXmN$2VT#qOFGdSp6AQc}VxvTtw(qv?Q=7UaK*JSUmp%uo^cS2G(1I!%MKYU%+u z&WcBajLC{nE7cUuhjL)qgX^i4+yx*?3UZWc>l^<2>E{+q*SWl_hVVlea5wTQvz1LE z-G#uQMdfIh#R()O_rlvzO9Z|If?E(j>+sl21@MR?2A)gL@tgoO2?(SGWl{*eeK;1l zB!U%jtf9JBzFEZM*YEum!ohyH&5ZiJ{e7!4d4D^d+d3bW%m9`qi9CzrAm1Fm==d#Q z)*3s6L%86h=@``15dz7Jz1wc%l(?7FHuXrk%G-_viZ4Q1O@DE2@2HJF69=Cn#EYiY zH2g!Be zz?~(7nj8F8Q6N{e>rNm>)hDAecT7q?Fyi+EViz+wOAka8Bx2BX5x!OR!l$4}!)5zu z56!lcHNv*`bRtB%lEa;rt@-0r+&X{)1;}(2eB2fmgcfYVvP`7G=D{m+tV^vGheg*4 z4xuTors+uM5rq&ztqy#;sgaU4K<6%1Dpq!?`e_-O~tQw6jZHWqC z&CF@Bo7>3Z!b5Qx5y(_2GpQPi!r`h&A}yi)ic{!XmQZdp`^96tMfW z&|v(gDSE{Vfpgw|)z^0a9%>3)uUsCSyx{r>n^MI+q|^v)=mIisRgxmL=2BJ3Sb-uz*+5?PZqKzd!A1 z(-bB8y330{RH@CAM+d;pUV_Mh?UNe0FM4)eQ+R~iHbz(wJv%vfw~pWjXoU(<85w|T z#k_Fz+enoUs+um?mO?o$;}f$-{-Drgw(`R69(rXTAoiQ`*?cMA6aKG-edqnx+caOG zn&AL@bb&q2DHuL341wc0!1@`;!vcKTK!zQ8*d`YfBfHz^ENWV%XpHx*hEQ5Zf&qP`*h)Y|QIRt^E_#=f4qZ~=4ma`OJM~G1 z>%FvA#s~ItO(=&u`E5QLJ>A6t$m#AZb2RfBXBmOuPPSl3_X58!S(mX%l;zKw+Jrc& z4mWg!PKyN=7*!x$F~tX4S#RtnjzM!l$<|WuD}E`^-@#6-SaQ3m_+O6dKl&A{)hhOa zO!0~Nmv?ubBGTLJ0Y7n-qDh8Z+*fus0=jpl8kupXgE3-l9+LCxp@Lap|aeM?-N}1Xy>DJR~yeZCHL^Ezh+)0sI4jX&{pZdx@ZW=(t|p}W@>U~{vY;o}jBi0GNhTskE|+hhUkiOcLNqHJCO zE9rP#aw@41AprkG0waTS9IcB5IJR02xLZbHq?ZN&ffxgbKIBmlvcc@nEC2m?~Q1U~830;7qaFN3nSJws*UfhD>UDHm*BQKTJeaFCmkAeYNwmiFZGV_6h4hKfU~Yz2EnSTIb<9XC`2yh;Whw zQV@l{C3qTk2fPNK6a3lsQWiv@!Jbi&mC+EGadb@vf%W+NV(8_L-KNgSP>LaX3<__8 zvj$M>7H^F*@KdB<_Uw#f&)ba6+9MC9`SCK_3hzG_(29H0bPQmgBUYA4_~;1qK*4T- zMXTNsSb%*OP&H&vjkt>NlS^`v{gO=<59AQ2JKQtFP^E#bN?EnqQ%DNDh@JljJLghN z`vp-Kn-TZanlPtmPES|sz|iEKALVW^0@+`=$|z070OX(zg<*`2xNg3PucF%2C1}dI9VJp zoR-Q}b+0l#M3F(XseK9pHRR2MwRp2uCQfV7l4E@9*ypyE2V)`jcguflnDE#M+?&ya z<-BL|%?Ovn92;llWYPfPnw}DWaaqtuc zVGcfp-2*&DPduiI(?rmA%w9gGOT!~?z@B|i>s^{9`y#QHPOCLb+mJwGrAkv5N!jE@ zxgx2Hr9pq`{yjS>!1}3WJ~9}IDZs5>*RI+94V2rX9IbH%Z{%=rmq1s|^{PP1)=}`2 zf$|5N5x%Z$oTb5m!XxguuR{QJfdohDh9WWZ;f>P48A!V>E~;4An@Nx4+&CrF*$!Ak z#NY4|rZPA~36=%G$$8$wnux&>`2==anB1wQnKWGpNlo1-jZ-1E6D(BlJ{D2(SQa-&9h_fj}o8&@_N+qxJUJrz1( z^FDSO$b$obzzymx0PhYWq#9gA_y-&WAucWZoSmcF^+8dTEx%X$M<2M&<>lmQy=~(o z+ZVLmYS_rapkS0FOGa3P3qeal;qk>FE-O`B=6mmORTmbLe4&V&9~Ax2v>~s7Ca+#% zTTR4XgAm0?3&b3VO4zq?@F84K@oG&}WcAxL*IdM!v+jnDVAhsNc<-mcYm*s)u#wQ@%q{#eRqXkZtq}ODSWksHdoxQz?lPWJg=No z6zvM$E)qKh#DM>ym4Qm#7yze`qMMo@RkP`?(e%(rz>Z-k*;U){97(q2b}2zgsn4># z>vd!L+^*ZKQ1f!J&x}t)n|>bt#cLTK?=@e3&DY&c?CxCG45(@{ceS#(U=2HQRj-2B z3kSv;D$UUr3djk+5)lK3c36-tT{=BeG+PgFZjrOuUZ*Oce;tTmqheE;?fd~fi4VJf!Uo2~my^S}+!0FnrO8*ZKEtTnz-9?h1hyjE#Lf~TVWmDk9)jQ~$Tu)mM&kLq7< zuOB~8eHHf_jOW*M7TTdpkfswy>n!tuA&S_lWeFGYkR;va1-WYkOX*%ug^dJwXm!AG z1^(#O%9x@C@(1rl0?{5}1#5b>tBs5+>JAlMwe^V z%i{J(pnjlpcDUlsMFJM&{`#R zC2hTHI^g>OB)mMDrA90EkX+DzsC{@83U#k#GO{{#3tXL!Y0&l{tTY8eMzu z`K^Axx3yAkZ({%?46^w5KrAeQXi?lKv(yK^P^9J4RvQI0lOU6DxrM?BfMHcsl`TQ| zE{dxj`-ueaaTj}$NQL;9g9hgZEGIg*d&|ZBP;-A*;e*lN-T+^AJ~;RV6T-v z%@uecM1-11Co~lzP3veK!GVs0PeH}W^Xjy;pxWUyg*R97`c50jQ%U5~FVbFrwf@gm zx@9lWPm&~@>DRZv^2^izoL+wsec$d`V$5$hZi8Sg&DvFFd%)8UifO0YU)nMjR5#e`VK^K9dX1WPll*baVUm&c^fIk!HM< zPM*Jn=l*$G>M?Es*t|Uy(&P+CPGC$!~1h>#&&)#*QWGZ-qf$OQT z1<+^kYl|OzkS@XJip*|eD~P}WbR-r&7v9uRWTqw$-0iT}>`XSFCc#F2dS(EA%olwg z9KX3Ad0@JPq$q&06BuC#0yj?!lAe+yo6aM>3Mz$64A^5z4uE@b3a;nKS85u&C)fF4 zpDVb1wgq1WljraV$gv#-BXhNJbc*yVBRtobaY=WN^LKZQ%1T>=rMw*Q3j5AMb4LV& zGNTHe8%Q`^z>!OOsiyPYvMIi|TQD9+hXtUw5-UYKDL2b^P~=V^zQ|2P+(kGtfVKy` zowDkeLWG{O@oLQ_zdl}G`tv1qe14w4i`np#w*gt+iJG-=tvbShLd8VO!RJbsDu6Jx z7_bL0*+IV?pvw{XzF}!q&j!9Y5|~uMUjwFB500xl5-VMvMl;~%2XFF;z82RwRa@kb z?FH{PC7fXO_mE0tjLR~njEqhbl?ItxPg5@zKLJ3wq|74dZ3=2Qyg+nTFYd0vf;RO~asgmfom z$o4h6;3Usxl+^f8%l**q0CB_?-xc4g*@6bvRaL~o z__&v=qiD^rolf%w0gDnE9FKOl>lcaxxB63Bz|G$ZXj|Xi`VO*hzq_9nkkB^EjWSr1 zOJaeqsetGqc5lgn(Vct-CqnM`l4&z#X%&YN~OZ z8he32UfT2THDvx{zK$6rtsC%+p7SegJo6ML1%DNQ%Uwj)$X%`yp=*gMA-&rae8BgP zYe8q{ZV(UX8ElQW03!_u97zKR4QUW@6L8krK887{N2}Q-dv*Lkp!6yucHW}(^gY0E zY3;p5jRKx20UAZuY)|&|4yI5c;A0~BWmD3^F-KoK&Y|Yxzm13+5TrfzX|e-#1vAo3d8*0RypDSsNU`Hp`F^(U0Dq80%)0dF*m!?=XPp_o6M*G- zghCetpE(5!E%^0-jmg`LTeJiR?A#C}x-O+#iOXf0^o24qp|EJyOID7hwGK`M%I^3` zB6~>Sx$<^;<2a|;1w{?Gh1_szb>MUhdpAz3_F)`}uYY@BG~hH<*&-OT*-!_jkP#QL zD1`S!p_saqn=k9_z3)g#bi33P8Oh8*w>x|`v)-6xJxGo*T!Z` zocBxT1r-&itnvHv$6ugB@4q@D|JZb`&Jr|t*NUVX&Se-!#Tf8+)~dl%MGQHJ?0_kJ zr_ZEbS~5c;{uFj#P&?Bhof++>cD-i}tvksP)sE9TY(to&;u?)9wU7NEYa6}#qHhNj zd!W|)_xxJ_KDDy$y5=7{qrisi+SphVbpj#@44K6%ks9rKKy0Z+f*=}}AcGG0lKr5i zACZ>?FyYLxqgbmi_D}Y-N zY-wDM=u5RVWb50yRs0Y^%UwL7hB{lgj|lqqn7pZ3J)OFYF70u57wpp335fh#JzY_< zN3^jBB!VrOV$et-7{^|rrS{4xnl=ieOBp5ua&_d+fsF(`%~kP{2n-hqk!Ee6OOk`x z4Zst>;dZl_GEtedU$Lf*%;|vsddt_&DBIz@yDY%p%~L}S9j$Hx=%@)WH7iO~QD~1- zmH7x8^^!Tn4m8!Z#7;#^HD%Ts=m8i!?eQE9HgJ4oZ% zS!z0mgmcsQ~hjELl?1r)dsHJJdJ217{ zn9{&d!J(xbgfEemJU~>>d2p%IaMV8vy4-%*QkJ*(>g0i1DSxHqw>Q?S`Gv*x_VhkE z_T7`HHp*sr#?qAa8_d-BFFNRn$`n@eK<1?@XQodZwcRwx9>)H7z_$}) zaCE$JQyMKAoa{^=G}{h>ytQe!ZwM#BZi5*gFKpphS?H->_DddWDSxw8c>wkzmDgjT z*F0Dl7+Z2cmDIwg9AD`RqFu@vEDe#d(xVrLuplPjL~@*@cfiJ0I1mNkiJu2Z(h6s% zS-x!Twi1B~T3sqznr&;&u2M4_FkYLywzGJupx;|rP-jor(UVL-5!2}q0J#^ISn2zi zXy?recv*0htgp>d_oo3KN`PNPh5={{-iFhO$gk<_+XGKj#-37cxV2VwYd6J#`2Bh% z)zyB{5iNb2kCLnO;OfQm72>x}Z#E_hDGZ?12>Jlxe#t7RYmC4iM$Nd$ID|{V(J%mC zUbkKn{_KR?Mgbc>u*zW&>uqACt4KtD_S(A+KwgIj+%h+1`gqID#kq0~9LCC1MQ%PC zuZ;Tr;jp340X})zlAA(D7Rx$On&t&7O;oX}^Z6LL)~I4YD+{7Y?-VCtIUwf9bb$C+ z5Gt?|85BL z019Yd>F6|Kq@FW?MQ(ueNu@-aD;p>~0KAB70Fu@^uE@Yy@bidt%=8EPi|?=`_D9f1cx_!4K8_Lu0)lB!9BF z3eu{P05VEOAZ!r<4$&J#5>Z?^01l%PWm}LQ5LROK6WOySN6j5w9OY}HLL@BqAZE}r zVh^RJb{cNh6|EkeOP{;05Em- zPlfI&9iaiwha5=9Y^7JFfLdiU+ub~FAATHF@4(8sKd7F1CzZXvVb;)B=l%V)a=QNW zWB>fyQ^UsHi*{yZG{x}19Ktnf$1C4Oso4tpu6N*JYlm7mt%FOGD{i1`e32R6H)UyV zNw@F>79C8P0+SK&AOB77jmAtj)J?}Od8oAS=SSglX>KDcUo{Zn3;=bnLk)np z-fN~Sz+6i&27E#zI7se+YNt_llt4Wu8@}=bB3g%kqp6)(shWYyN0qLY72+QOGRH)# zG6*jCN5LMEXFi^}t2H^}SJ9dEW#aP-=)7(BR_5?Y&&?UG`;n-o!P zZ=|{RX&V{B*>{HOGWf9sy&)$)1F zG$RYbB9&?p7K2Rq)v}mU4_?VUh_=2C86bgimz1v!8NNnOo{c*z*g(p%%|_9HHrOaX zL}XJJ2x9hpoDME7KKEo58wo7sJ^9AhOlk^?00{$?lpKyjm>8~dnwYe|Q&G;!7Ua=G z5={g5>!MAoKI_cxMJi^k=J{z~e*2>uI2BGdBY

skB0_*0V*(iEL8A^#jhYb>J%6 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 diff --git a/apps/init/tsconfig.json b/apps/init/tsconfig.json deleted file mode 100644 index b01fe1d..0000000 --- a/apps/init/tsconfig.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "include": ["./src/**/*.ts"], - "exclude": ["./src/**/*.test.ts"], - "compilerOptions": { - "target": "es2022", - "lib": ["ES2022", "DOM", "DOM.Iterable", "DOM.AsyncIterable"], - "module": "NodeNext", - "moduleResolution": "NodeNext", - "moduleDetection": "force", - "verbatimModuleSyntax": false, - "jsx": "react", - - "strict": true, - "alwaysStrict": true, - "strictPropertyInitialization": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitAny": true, - "noImplicitReturns": true, - "noImplicitThis": true, - - "noFallthroughCasesInSwitch": true, - "resolveJsonModule": true, - - "removeComments": false, - "esModuleInterop": true, - "emitDecoratorMetadata": false, - "experimentalDecorators": false, - "downlevelIteration": true, - "isolatedModules": true, - "noUncheckedIndexedAccess": true, - - "pretty": true, - "isolatedDeclarations": false, - "composite": true, - "sourceMap": true - } -} diff --git a/apps/init/vite.config.ts b/apps/init/vite.config.ts deleted file mode 100644 index aba1cd0..0000000 --- a/apps/init/vite.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { configDefaults, defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - globals: true, - exclude: [...configDefaults.exclude, "e2e/**/*"], - }, -}); diff --git a/apps/webapp/app/bullmq/queues/index.ts b/apps/webapp/app/bullmq/queues/index.ts index ebefc4b..fb627af 100644 --- a/apps/webapp/app/bullmq/queues/index.ts +++ b/apps/webapp/app/bullmq/queues/index.ts @@ -92,3 +92,69 @@ export const sessionCompactionQueue = new Queue("session-compaction-queue", { }, }, }); + +/** + * BERT topic analysis queue + * Handles CPU-intensive topic modeling on user episodes + */ +export const bertTopicQueue = new Queue("bert-topic-queue", { + connection: getRedisConnection(), + defaultJobOptions: { + attempts: 2, // Only 2 attempts due to long runtime + backoff: { + type: "exponential", + delay: 5000, + }, + removeOnComplete: { + age: 7200, // Keep completed jobs for 2 hours + count: 100, + }, + removeOnFail: { + age: 172800, // Keep failed jobs for 48 hours (for debugging) + }, + }, +}); + +/** + * Space assignment queue + * Handles assigning episodes to spaces based on semantic matching + */ +export const spaceAssignmentQueue = new Queue("space-assignment-queue", { + connection: getRedisConnection(), + defaultJobOptions: { + attempts: 3, + backoff: { + type: "exponential", + delay: 2000, + }, + removeOnComplete: { + age: 3600, + count: 1000, + }, + removeOnFail: { + age: 86400, + }, + }, +}); + +/** + * Space summary queue + * Handles generating summaries for spaces + */ +export const spaceSummaryQueue = new Queue("space-summary-queue", { + connection: getRedisConnection(), + defaultJobOptions: { + attempts: 3, + backoff: { + type: "exponential", + delay: 2000, + }, + removeOnComplete: { + age: 3600, + count: 1000, + }, + removeOnFail: { + age: 86400, + }, + }, +}); diff --git a/apps/webapp/app/bullmq/start-workers.ts b/apps/webapp/app/bullmq/start-workers.ts index 1d64b40..b16c597 100644 --- a/apps/webapp/app/bullmq/start-workers.ts +++ b/apps/webapp/app/bullmq/start-workers.ts @@ -66,7 +66,6 @@ export async function initWorkers(): Promise { queue: conversationTitleQueue, name: "conversation-title", }, - { worker: sessionCompactionWorker, queue: sessionCompactionQueue, diff --git a/apps/webapp/app/bullmq/workers/index.ts b/apps/webapp/app/bullmq/workers/index.ts index e2d930d..3b58656 100644 --- a/apps/webapp/app/bullmq/workers/index.ts +++ b/apps/webapp/app/bullmq/workers/index.ts @@ -18,24 +18,39 @@ import { processConversationTitleCreation, type CreateConversationTitlePayload, } from "~/jobs/conversation/create-title.logic"; - import { processSessionCompaction, type SessionCompactionPayload, } from "~/jobs/session/session-compaction.logic"; +import { + processTopicAnalysis, + type TopicAnalysisPayload, +} from "~/jobs/bert/topic-analysis.logic"; + import { enqueueIngestEpisode, enqueueSpaceAssignment, enqueueSessionCompaction, + enqueueBertTopicAnalysis, + enqueueSpaceSummary, } from "~/lib/queue-adapter.server"; import { logger } from "~/services/logger.service"; +import { + processSpaceAssignment, + type SpaceAssignmentPayload, +} from "~/jobs/spaces/space-assignment.logic"; +import { + processSpaceSummary, + type SpaceSummaryPayload, +} from "~/jobs/spaces/space-summary.logic"; /** * Episode ingestion worker - * Processes individual episode ingestion jobs with per-user concurrency + * Processes individual episode ingestion jobs with global concurrency * - * Note: Per-user concurrency is achieved by using userId as part of the jobId - * when adding jobs to the queue, ensuring only one job per user runs at a time + * Note: BullMQ uses global concurrency limit (5 jobs max). + * Trigger.dev uses per-user concurrency via concurrencyKey. + * For most open-source deployments, global concurrency is sufficient. */ export const ingestWorker = new Worker( "ingest-queue", @@ -47,11 +62,12 @@ export const ingestWorker = new Worker( // Callbacks to enqueue follow-up jobs enqueueSpaceAssignment, enqueueSessionCompaction, + enqueueBertTopicAnalysis, ); }, { connection: getRedisConnection(), - concurrency: 5, // Process up to 5 jobs in parallel + concurrency: 1, // Global limit: process up to 1 jobs in parallel }, ); @@ -108,6 +124,65 @@ export const sessionCompactionWorker = new Worker( }, ); +/** + * BERT topic analysis worker + * Handles CPU-intensive topic modeling + */ +export const bertTopicWorker = new Worker( + "bert-topic-queue", + async (job) => { + const payload = job.data as TopicAnalysisPayload; + return await processTopicAnalysis( + payload, + // Callback to enqueue space summary + enqueueSpaceSummary, + ); + }, + { + connection: getRedisConnection(), + concurrency: 2, // Process up to 2 analyses in parallel (CPU-intensive) + }, +); + +/** + * Space assignment worker + * Handles assigning episodes to spaces based on semantic matching + * + * Note: Global concurrency of 1 ensures sequential processing. + * Trigger.dev uses per-user concurrency via concurrencyKey. + */ +export const spaceAssignmentWorker = new Worker( + "space-assignment-queue", + async (job) => { + const payload = job.data as SpaceAssignmentPayload; + return await processSpaceAssignment( + payload, + // Callback to enqueue space summary + enqueueSpaceSummary, + ); + }, + { + connection: getRedisConnection(), + concurrency: 1, // Global limit: process one job at a time + }, +); + +/** + * Space summary worker + * Handles generating summaries for spaces + */ +export const spaceSummaryWorker = new Worker( + "space-summary-queue", + async (job) => { + const payload = job.data as SpaceSummaryPayload; + return await processSpaceSummary(payload); + }, + { + connection: getRedisConnection(), + concurrency: 1, // Process one space summary at a time + }, +); + /** * Graceful shutdown handler */ @@ -116,8 +191,10 @@ export async function closeAllWorkers(): Promise { ingestWorker.close(), documentIngestWorker.close(), conversationTitleWorker.close(), - sessionCompactionWorker.close(), + bertTopicWorker.close(), + spaceSummaryWorker.close(), + spaceAssignmentWorker.close(), ]); logger.log("All BullMQ workers closed"); } diff --git a/apps/webapp/app/jobs/bert/topic-analysis.logic.ts b/apps/webapp/app/jobs/bert/topic-analysis.logic.ts new file mode 100644 index 0000000..238d01b --- /dev/null +++ b/apps/webapp/app/jobs/bert/topic-analysis.logic.ts @@ -0,0 +1,250 @@ +import { exec } from "child_process"; +import { promisify } from "util"; +import { identifySpacesForTopics } from "~/jobs/spaces/space-identification.logic"; +import { assignEpisodesToSpace } from "~/services/graphModels/space"; +import { logger } from "~/services/logger.service"; +import { SpaceService } from "~/services/space.server"; +import { prisma } from "~/trigger/utils/prisma"; + +const execAsync = promisify(exec); + +export interface TopicAnalysisPayload { + userId: string; + workspaceId: string; + minTopicSize?: number; + nrTopics?: number; +} + +export interface TopicAnalysisResult { + topics: { + [topicId: string]: { + keywords: string[]; + episodeIds: string[]; + }; + }; +} + +/** + * Run BERT analysis using exec (for BullMQ/Docker) + */ +async function runBertWithExec( + userId: string, + minTopicSize: number, + nrTopics?: number, +): Promise { + let command = `python3 /core/apps/webapp/python/main.py ${userId} --json`; + + if (minTopicSize) { + command += ` --min-topic-size ${minTopicSize}`; + } + + if (nrTopics) { + command += ` --nr-topics ${nrTopics}`; + } + + console.log(`[BERT Topic Analysis] Executing: ${command}`); + + const { stdout, stderr } = await execAsync(command, { + timeout: 300000, // 5 minutes + maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large outputs + }); + + if (stderr) { + console.warn(`[BERT Topic Analysis] Warnings:`, stderr); + } + + return stdout; +} + +/** + * Process BERT topic analysis on user's episodes + * This is the common logic shared between Trigger.dev and BullMQ + * + * NOTE: This function does NOT update workspace.metadata.lastTopicAnalysisAt + * That should be done by the caller BEFORE enqueueing this job to prevent + * duplicate analyses from racing conditions. + */ +export async function processTopicAnalysis( + payload: TopicAnalysisPayload, + enqueueSpaceSummary?: (params: { + spaceId: string; + userId: string; + }) => Promise, + pythonRunner?: ( + userId: string, + minTopicSize: number, + nrTopics?: number, + ) => Promise, +): Promise { + const { userId, workspaceId, minTopicSize = 10, nrTopics } = payload; + + console.log(`[BERT Topic Analysis] Starting analysis for user: ${userId}`); + console.log( + `[BERT Topic Analysis] Parameters: minTopicSize=${minTopicSize}, nrTopics=${nrTopics || "auto"}`, + ); + + try { + const startTime = Date.now(); + + // Run BERT analysis using provided runner or default exec + const runner = pythonRunner || runBertWithExec; + const stdout = await runner(userId, minTopicSize, nrTopics); + + const duration = Date.now() - startTime; + console.log(`[BERT Topic Analysis] Completed in ${duration}ms`); + + // Parse the JSON output + const result: TopicAnalysisResult = JSON.parse(stdout); + + // Log summary + const topicCount = Object.keys(result.topics).length; + const totalEpisodes = Object.values(result.topics).reduce( + (sum, topic) => sum + topic.episodeIds.length, + 0, + ); + + console.log( + `[BERT Topic Analysis] Found ${topicCount} topics covering ${totalEpisodes} episodes`, + ); + + // Step 2: Identify spaces for topics using LLM + try { + logger.info("[BERT Topic Analysis] Starting space identification", { + userId, + topicCount, + }); + + const spaceProposals = await identifySpacesForTopics({ + userId, + topics: result.topics, + }); + + logger.info("[BERT Topic Analysis] Space identification completed", { + userId, + proposalCount: spaceProposals.length, + }); + + // Step 3: Create or find spaces and assign episodes + // Get existing spaces from PostgreSQL + const existingSpacesFromDb = await prisma.space.findMany({ + where: { workspaceId }, + }); + const existingSpacesByName = new Map( + existingSpacesFromDb.map((s) => [s.name.toLowerCase(), s]), + ); + + for (const proposal of spaceProposals) { + try { + // Check if space already exists (case-insensitive match) + let spaceId: string; + const existingSpace = existingSpacesByName.get( + proposal.name.toLowerCase(), + ); + + if (existingSpace) { + // Use existing space + spaceId = existingSpace.id; + logger.info("[BERT Topic Analysis] Using existing space", { + spaceName: proposal.name, + spaceId, + }); + } else { + // Create new space (creates in both PostgreSQL and Neo4j) + // Skip automatic space assignment since we're manually assigning from BERT topics + const spaceService = new SpaceService(); + const newSpace = await spaceService.createSpace({ + name: proposal.name, + description: proposal.intent, + userId, + workspaceId, + }); + spaceId = newSpace.id; + logger.info("[BERT Topic Analysis] Created new space", { + spaceName: proposal.name, + spaceId, + intent: proposal.intent, + }); + } + + // Collect all episode IDs from the topics in this proposal + const episodeIds: string[] = []; + for (const topicId of proposal.topics) { + const topic = result.topics[topicId]; + if (topic) { + episodeIds.push(...topic.episodeIds); + } + } + + // Assign all episodes from these topics to the space + if (episodeIds.length > 0) { + await assignEpisodesToSpace(episodeIds, spaceId, userId); + logger.info("[BERT Topic Analysis] Assigned episodes to space", { + spaceName: proposal.name, + spaceId, + episodeCount: episodeIds.length, + topics: proposal.topics, + }); + + // Step 4: Trigger space summary if callback provided + if (enqueueSpaceSummary) { + await enqueueSpaceSummary({ spaceId, userId }); + logger.info("[BERT Topic Analysis] Triggered space summary", { + spaceName: proposal.name, + spaceId, + }); + } + } + } catch (spaceError) { + logger.error( + "[BERT Topic Analysis] Failed to process space proposal", + { + proposal, + error: spaceError, + }, + ); + // Continue with other proposals + } + } + } catch (spaceIdentificationError) { + logger.error( + "[BERT Topic Analysis] Space identification failed, returning topics only", + { + error: spaceIdentificationError, + }, + ); + // Return topics even if space identification fails + } + + return result; + } catch (error) { + console.error(`[BERT Topic Analysis] Error:`, error); + + if (error instanceof Error) { + // Check for timeout + if (error.message.includes("ETIMEDOUT")) { + throw new Error( + `Topic analysis timed out after 5 minutes. User may have too many episodes.`, + ); + } + + // Check for Python errors + if (error.message.includes("python3: not found")) { + throw new Error(`Python 3 is not installed or not available in PATH.`); + } + + // Check for Neo4j connection errors + if (error.message.includes("Failed to connect to Neo4j")) { + throw new Error( + `Could not connect to Neo4j. Check NEO4J_URI and credentials.`, + ); + } + + // Check for no episodes + if (error.message.includes("No episodes found")) { + throw new Error(`No episodes found for userId: ${userId}`); + } + } + + throw error; + } +} diff --git a/apps/webapp/app/jobs/ingest/ingest-episode.logic.ts b/apps/webapp/app/jobs/ingest/ingest-episode.logic.ts index e1b515a..5ddc8ae 100644 --- a/apps/webapp/app/jobs/ingest/ingest-episode.logic.ts +++ b/apps/webapp/app/jobs/ingest/ingest-episode.logic.ts @@ -7,6 +7,10 @@ import { prisma } from "~/trigger/utils/prisma"; import { EpisodeType } from "@core/types"; import { deductCredits, hasCredits } from "~/trigger/utils/utils"; import { assignEpisodesToSpace } from "~/services/graphModels/space"; +import { + shouldTriggerTopicAnalysis, + updateLastTopicAnalysisTime, +} from "~/services/bertTopicAnalysis.server"; export const IngestBodyRequest = z.object({ episodeBody: z.string(), @@ -55,6 +59,12 @@ export async function processEpisodeIngestion( sessionId: string; source: string; }) => Promise, + enqueueBertTopicAnalysis?: (params: { + userId: string; + workspaceId: string; + minTopicSize?: number; + nrTopics?: number; + }) => Promise, ): Promise { try { logger.log(`Processing job for user ${payload.userId}`); @@ -250,6 +260,44 @@ export async function processEpisodeIngestion( }); } + // Auto-trigger BERT topic analysis if threshold met (20+ new episodes) + try { + if ( + currentStatus === IngestionStatus.COMPLETED && + enqueueBertTopicAnalysis + ) { + const shouldTrigger = await shouldTriggerTopicAnalysis( + payload.userId, + payload.workspaceId, + ); + + if (shouldTrigger) { + logger.info( + `Triggering BERT topic analysis after reaching 20+ new episodes`, + { + userId: payload.userId, + workspaceId: payload.workspaceId, + }, + ); + + await enqueueBertTopicAnalysis({ + userId: payload.userId, + workspaceId: payload.workspaceId, + minTopicSize: 10, + }); + + // Update the last analysis timestamp + await updateLastTopicAnalysisTime(payload.workspaceId); + } + } + } catch (topicAnalysisError) { + // Don't fail the ingestion if topic analysis fails + logger.warn(`Failed to trigger topic analysis after ingestion:`, { + error: topicAnalysisError, + userId: payload.userId, + }); + } + return { success: true, episodeDetails }; } catch (err: any) { await prisma.ingestionQueue.update({ diff --git a/apps/webapp/app/jobs/session/session-compaction.logic.ts b/apps/webapp/app/jobs/session/session-compaction.logic.ts index 92e242b..ae1b6ca 100644 --- a/apps/webapp/app/jobs/session/session-compaction.logic.ts +++ b/apps/webapp/app/jobs/session/session-compaction.logic.ts @@ -36,7 +36,7 @@ export interface SessionCompactionResult { } // Zod schema for LLM response validation -const CompactionResultSchema = z.object({ +export const CompactionResultSchema = z.object({ summary: z.string().describe("Consolidated narrative of the entire session"), confidence: z .number() @@ -45,7 +45,7 @@ const CompactionResultSchema = z.object({ .describe("Confidence score of the compaction quality"), }); -const CONFIG = { +export const CONFIG = { minEpisodesForCompaction: 5, // Minimum episodes to trigger compaction compactionThreshold: 1, // Trigger after N new episodes maxEpisodesPerBatch: 50, // Process in batches if needed diff --git a/apps/webapp/app/jobs/spaces/space-assignment.logic.ts b/apps/webapp/app/jobs/spaces/space-assignment.logic.ts new file mode 100644 index 0000000..5dbbf81 --- /dev/null +++ b/apps/webapp/app/jobs/spaces/space-assignment.logic.ts @@ -0,0 +1,1201 @@ +import { z } from "zod"; +import { logger } from "~/services/logger.service"; +import { SpaceService } from "~/services/space.server"; +import { makeModelCall } from "~/lib/model.server"; +import { createBatch, getBatch } from "~/lib/batch.server"; +import { runQuery } from "~/lib/neo4j.server"; +import { + assignEpisodesToSpace, + getSpaceEpisodeCount, +} from "~/services/graphModels/space"; +import { + updateMultipleSpaceStatuses, + SPACE_STATUS, +} from "~/trigger/utils/space-status"; +import type { CoreMessage } from "ai"; +import { type Space } from "@prisma/client"; + +export interface SpaceAssignmentPayload { + userId: string; + workspaceId: string; + mode: "new_space" | "episode"; + newSpaceId?: string; // For new_space mode + episodeIds?: string[]; // For daily_batch mode (default: 1) + batchSize?: number; // Processing batch size +} + +interface EpisodeData { + uuid: string; + content: string; + originalContent: string; + source: string; + createdAt: Date; + metadata: any; +} + +interface AssignmentResult { + episodeId: string; + spaceIds: string[]; + confidence: number; + reasoning?: string; +} + +const CONFIG = { + newSpaceMode: { + batchSize: 20, + confidenceThreshold: 0.75, // Intent-based threshold for new space creation + useBatchAPI: true, // Use batch API for new space mode + minEpisodesForBatch: 5, // Minimum episodes to use batch API + }, + episodeMode: { + batchSize: 20, + confidenceThreshold: 0.75, // Intent-based threshold for episode assignment + useBatchAPI: true, // Use batch API for episode mode + minEpisodesForBatch: 5, // Minimum episodes to use batch API + }, +}; + +// Zod schema for LLM response validation +const AssignmentResultSchema = z.array( + z.object({ + episodeId: z.string(), + addSpaceId: z.array(z.string()), + confidence: z.number(), + reasoning: z.string(), + }), +); + +export interface SpaceAssignmentResult { + success: boolean; + mode: string; + processed: number; + assignments: number; + batches?: number; + spacesAvailable: number; + affectedSpaces: number; + summaryTriggered: boolean; + patternCheckTriggered: boolean; +} + +/** + * Core business logic for space assignment + * This is shared between Trigger.dev and BullMQ implementations + */ +export async function processSpaceAssignment( + payload: SpaceAssignmentPayload, + // Callback function for triggering space summary + enqueueSpaceSummary?: (params: { + userId: string; + workspaceId: string; + spaceId: string; + triggerSource: "assignment" | "manual" | "scheduled"; + }) => Promise, +): Promise { + const { + userId, + workspaceId, + mode, + newSpaceId, + episodeIds, + batchSize = mode === "new_space" + ? CONFIG.newSpaceMode.batchSize + : CONFIG.episodeMode.batchSize, + } = payload; + + logger.info(`Starting space assignment`, { + userId, + mode, + newSpaceId, + episodeIds, + batchSize, + }); + + const spaceService = new SpaceService(); + + try { + // 1. Get user's spaces + const spaces = await spaceService.getUserSpaces(userId); + + if (spaces.length === 0) { + logger.info(`No spaces found for user ${userId}, skipping assignment`); + return { + success: true, + mode, + processed: 0, + assignments: 0, + spacesAvailable: 0, + affectedSpaces: 0, + summaryTriggered: false, + patternCheckTriggered: false, + }; + } + + // 2. Get episodes to analyze based on mode + const episodes = await getEpisodesToAnalyze(userId, mode, { + newSpaceId, + episodeIds, + }); + + if (episodes.length === 0) { + logger.info( + `No episodes to analyze for user ${userId} in ${mode} mode`, + ); + return { + success: true, + mode, + processed: 0, + assignments: 0, + spacesAvailable: spaces.length, + affectedSpaces: 0, + summaryTriggered: false, + patternCheckTriggered: false, + }; + } + + // 3. Process episodes using batch AI or fallback to sequential + const config = + mode === "new_space" ? CONFIG.newSpaceMode : CONFIG.episodeMode; + const shouldUseBatchAPI = true; + + let totalProcessed = 0; + let totalAssignments = 0; + let totalBatches = 0; + const affectedSpaces = new Set(); // Track spaces that received new episodes + + if (shouldUseBatchAPI) { + logger.info( + `Using Batch AI processing for ${episodes.length} episodes`, + { + mode, + userId, + batchSize, + }, + ); + + const batchResult = await processBatchAI( + episodes, + spaces, + userId, + mode, + newSpaceId, + batchSize, + ); + totalProcessed = batchResult.processed; + totalAssignments = batchResult.assignments; + batchResult.affectedSpaces?.forEach((spaceId) => + affectedSpaces.add(spaceId), + ); + } else { + logger.info( + `Using sequential processing for ${episodes.length} episodes (below batch threshold)`, + { + mode, + userId, + minRequired: config.minEpisodesForBatch, + }, + ); + + // Fallback to sequential processing for smaller episode sets + totalBatches = Math.ceil(episodes.length / batchSize); + + for (let i = 0; i < totalBatches; i++) { + const batch = episodes.slice(i * batchSize, (i + 1) * batchSize); + + logger.info( + `Processing batch ${i + 1}/${totalBatches} with ${batch.length} episodes`, + { + mode, + userId, + }, + ); + + const batchResult = await processBatch( + batch, + spaces, + userId, + mode, + newSpaceId, + ); + totalProcessed += batchResult.processed; + totalAssignments += batchResult.assignments; + batchResult.affectedSpaces?.forEach((spaceId) => + affectedSpaces.add(spaceId), + ); + + // Add delay between batches to avoid rate limiting + if (i < totalBatches - 1) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + } + } + + logger.info(`Completed LLM space assignment`, { + userId, + mode, + totalProcessed, + totalAssignments, + spacesAvailable: spaces.length, + affectedSpaces: affectedSpaces.size, + }); + + // 4. Update space status to "processing" for affected spaces + if (affectedSpaces.size > 0) { + try { + await updateMultipleSpaceStatuses( + Array.from(affectedSpaces), + SPACE_STATUS.PROCESSING, + { + userId, + operation: "space-assignment", + metadata: { mode, phase: "start_processing" }, + }, + ); + } catch (statusError) { + logger.warn(`Failed to update space statuses to processing:`, { + error: statusError, + userId, + mode, + }); + } + } + + // 5. Trigger space summaries for affected spaces (fan-out pattern) + if (affectedSpaces.size > 0 && enqueueSpaceSummary) { + try { + logger.info( + `Triggering space summaries for ${affectedSpaces.size} affected spaces in parallel`, + ); + + // Fan out to multiple parallel triggers + const summaryPromises = Array.from(affectedSpaces).map((spaceId) => + enqueueSpaceSummary({ + userId, + workspaceId, + spaceId, + triggerSource: "assignment", + }).catch((error) => { + logger.warn(`Failed to trigger summary for space ${spaceId}:`, { + error, + }); + return { success: false, spaceId, error: error.message }; + }), + ); + + const summaryResults = await Promise.allSettled(summaryPromises); + const successful = summaryResults.filter( + (r) => r.status === "fulfilled", + ).length; + const failed = summaryResults.filter( + (r) => r.status === "rejected", + ).length; + + logger.info(`Space summary triggers completed`, { + userId, + mode, + totalSpaces: affectedSpaces.size, + successful, + failed, + }); + } catch (summaryError) { + // Don't fail the assignment if summary generation fails + logger.warn(`Failed to trigger space summaries after assignment:`, { + error: summaryError, + userId, + mode, + affectedSpaces: Array.from(affectedSpaces), + }); + } + } + + // 6. Update space status to "ready" after all processing is complete + if (affectedSpaces.size > 0) { + try { + await updateMultipleSpaceStatuses( + Array.from(affectedSpaces), + SPACE_STATUS.READY, + { + userId, + operation: "space-assignment", + metadata: { mode, phase: "completed_processing" }, + }, + ); + } catch (finalStatusError) { + logger.warn(`Failed to update space statuses to ready:`, { + error: finalStatusError, + userId, + mode, + }); + } + } + + return { + success: true, + mode, + processed: totalProcessed, + assignments: totalAssignments, + batches: totalBatches, + spacesAvailable: spaces.length, + affectedSpaces: affectedSpaces.size, + summaryTriggered: affectedSpaces.size > 0, + patternCheckTriggered: affectedSpaces.size > 0, + }; + } catch (error) { + logger.error( + `Error in LLM space assignment for user ${userId}:`, + error as Record, + ); + throw error; + } +} + +async function getEpisodesToAnalyze( + userId: string, + mode: "new_space" | "episode", + options: { newSpaceId?: string; episodeIds?: string[] }, +): Promise { + let query: string; + let params: any = { userId }; + + if (mode === "new_space") { + // For new space: analyze all recent episodes + query = ` + MATCH (e:Episode {userId: $userId}) + RETURN e + ORDER BY e.createdAt DESC + LIMIT 1000 + `; + } else { + // For episode mode: analyze specific episodes + query = ` + UNWIND $episodeIds AS episodeId + MATCH (e:Episode {uuid: episodeId, userId: $userId}) + RETURN e + ORDER BY e.createdAt DESC + `; + params.episodeIds = options.episodeIds; + } + + const result = await runQuery(query, params); + + return result.map((record) => { + const episode = record.get("e").properties; + return { + uuid: episode.uuid, + content: episode.content, + originalContent: episode.originalContent, + source: episode.source, + createdAt: new Date(episode.createdAt), + metadata: JSON.parse(episode.metadata || "{}"), + }; + }); +} + +async function processBatchAI( + episodes: EpisodeData[], + spaces: Space[], + userId: string, + mode: "new_space" | "episode", + newSpaceId?: string, + batchSize: number = 50, +): Promise<{ + processed: number; + assignments: number; + affectedSpaces?: string[]; +}> { + try { + // Create batches of episodes + const episodeBatches: EpisodeData[][] = []; + for (let i = 0; i < episodes.length; i += batchSize) { + episodeBatches.push(episodes.slice(i, i + batchSize)); + } + + logger.info( + `Creating ${episodeBatches.length} batch AI requests for ${episodes.length} episodes`, + ); + + // Create batch requests with prompts + const batchRequests = await Promise.all( + episodeBatches.map(async (batch, index) => { + const promptMessages = await createLLMPrompt( + batch, + spaces, + mode, + newSpaceId, + userId, + ); + const systemPrompt = + promptMessages.find((m) => m.role === "system")?.content || ""; + const userPrompt = + promptMessages.find((m) => m.role === "user")?.content || ""; + + return { + customId: `episode-space-assignment-${userId}-${mode}-${index}`, + messages: [{ role: "user" as const, content: userPrompt }], + systemPrompt, + }; + }), + ); + + // Submit batch to AI provider + const { batchId } = await createBatch({ + requests: batchRequests, + outputSchema: AssignmentResultSchema, + maxRetries: 3, + timeoutMs: 1200000, // 10 minutes timeout + }); + + logger.info(`Batch AI job created: ${batchId}`, { + userId, + mode, + batchRequests: batchRequests.length, + }); + + // Poll for completion with improved handling + const maxPollingTime = 1200000; // 13 minutes + const pollInterval = 5000; // 5 seconds + const startTime = Date.now(); + + let batch = await getBatch({ batchId }); + + while (batch.status === "processing" || batch.status === "pending") { + const elapsed = Date.now() - startTime; + + if (elapsed > maxPollingTime) { + logger.warn( + `Batch AI job timed out after ${elapsed}ms, processing partial results`, + { + batchId, + status: batch.status, + completed: batch.completedRequests, + total: batch.totalRequests, + failed: batch.failedRequests, + }, + ); + break; // Exit loop to process any available results + } + + logger.info(`Batch AI job status: ${batch.status}`, { + batchId, + completed: batch.completedRequests, + total: batch.totalRequests, + failed: batch.failedRequests, + elapsed: elapsed, + }); + + await new Promise((resolve) => setTimeout(resolve, pollInterval)); + batch = await getBatch({ batchId }); + } + + // Handle different completion scenarios + if (batch.status === "failed") { + logger.error(`Batch AI job failed completely`, { + batchId, + status: batch.status, + }); + throw new Error(`Batch AI job failed with status: ${batch.status}`); + } + + // Log final status regardless of completion state + logger.info(`Batch AI job processing finished`, { + batchId, + status: batch.status, + completed: batch.completedRequests, + total: batch.totalRequests, + failed: batch.failedRequests, + }); + + if (!batch.results || batch.results.length === 0) { + logger.warn(`No results returned from batch AI job ${batchId}`, { + status: batch.status, + completed: batch.completedRequests, + failed: batch.failedRequests, + }); + + // If we have no results but some requests failed, fall back to sequential processing + if (batch.failedRequests && batch.failedRequests > 0) { + logger.info( + `Falling back to sequential processing due to batch failures`, + ); + return await processBatch(episodes, spaces, userId, mode, newSpaceId); + } + + return { processed: episodes.length, assignments: 0 }; + } + + logger.info(`Processing batch results`, { + batchId, + status: batch.status, + resultsCount: batch.results.length, + totalRequests: batch.totalRequests, + completedRequests: batch.completedRequests, + failedRequests: batch.failedRequests, + }); + + // Process all batch results + let totalAssignments = 0; + const affectedSpaces = new Set(); + const confidenceThreshold = + mode === "new_space" + ? CONFIG.newSpaceMode.confidenceThreshold + : CONFIG.episodeMode.confidenceThreshold; + + for (const result of batch.results) { + if (result.error) { + logger.warn(`Batch AI request ${result.customId} failed:`, { + error: result.error, + }); + continue; + } + + if (!result.response) { + logger.warn(`No response from batch AI request ${result.customId}`); + continue; + } + + // Parse assignments from this batch result + let assignments: AssignmentResult[] = []; + try { + // Extract episode batch info from customId + const batchIndexMatch = result.customId.match(/-(\d+)$/); + const batchIndex = batchIndexMatch ? parseInt(batchIndexMatch[1]) : 0; + const episodeBatch = episodeBatches[batchIndex]; + + if (Array.isArray(result.response)) { + // Handle direct array response (from structured output) + assignments = result.response.map((a) => ({ + episodeId: a.episodeId, + spaceIds: a.addSpaceId || [], + confidence: a.confidence || 0.75, + reasoning: a.reasoning, + })); + } else if (typeof result.response === "string") { + // Parse from text response with tags (fallback for non-structured output) + assignments = parseLLMResponseWithTags( + result.response, + episodeBatch, + spaces, + ); + } else if (typeof result.response === "object" && result.response) { + // Handle object response that might contain the array directly + try { + let responseData = result.response; + if (responseData.results && Array.isArray(responseData.results)) { + responseData = responseData.results; + } + + if (Array.isArray(responseData)) { + assignments = responseData.map((a) => ({ + episodeId: a.episodeId, + spaceIds: a.addSpaceId || [], + confidence: a.confidence || 0.75, + reasoning: a.reasoning, + })); + } else { + // Fallback parsing + assignments = parseLLMResponse( + JSON.stringify(result.response), + episodeBatch, + spaces, + ); + } + } catch (parseError) { + logger.error( + `Error processing object response ${result.customId}:`, + { error: parseError }, + ); + assignments = []; + } + } else { + // Fallback parsing + assignments = parseLLMResponse( + JSON.stringify(result.response), + episodeBatch, + spaces, + ); + } + } catch (parseError) { + logger.error(`Error parsing batch result ${result.customId}:`, { + error: parseError, + }); + continue; + } + + // Group episodes by space for batch assignment + const spaceToEpisodes = new Map(); + + for (const assignment of assignments) { + if ( + assignment.spaceIds.length > 0 && + assignment.confidence >= confidenceThreshold + ) { + for (const spaceId of assignment.spaceIds) { + if (!spaceToEpisodes.has(spaceId)) { + spaceToEpisodes.set(spaceId, []); + } + spaceToEpisodes.get(spaceId)!.push(assignment.episodeId); + } + } + } + + // Apply batch assignments - one call per space + for (const [spaceId, episodeIds] of spaceToEpisodes) { + try { + const assignmentResult = await assignEpisodesToSpace( + episodeIds, + spaceId, + userId, + ); + + if (assignmentResult.success) { + totalAssignments += episodeIds.length; + affectedSpaces.add(spaceId); + logger.info( + `Batch AI assigned ${episodeIds.length} episodes to space ${spaceId}`, + { + episodeIds, + mode, + batchId: result.customId, + }, + ); + } + } catch (error) { + logger.warn( + `Failed to assign ${episodeIds.length} episodes to space ${spaceId}:`, + { error, episodeIds }, + ); + } + } + } + + // Log final batch processing results + logger.info(`Batch AI processing completed`, { + batchId, + totalEpisodes: episodes.length, + processedBatches: batch.results.length, + totalAssignments, + affectedSpaces: affectedSpaces.size, + completedRequests: batch.completedRequests, + failedRequests: batch.failedRequests || 0, + }); + + // If we have significant failures, consider fallback processing for remaining episodes + const failureRate = batch.failedRequests + ? batch.failedRequests / batch.totalRequests + : 0; + if (failureRate > 0.5) { + // If more than 50% failed + logger.warn( + `High failure rate (${Math.round(failureRate * 100)}%) in batch processing, consider reviewing prompts or input quality`, + ); + } + + return { + processed: episodes.length, + assignments: totalAssignments, + affectedSpaces: Array.from(affectedSpaces), + }; + } catch (error) { + logger.error("Error in Batch AI processing:", { error }); + throw error; + } +} + +async function processBatch( + episodes: EpisodeData[], + spaces: Space[], + userId: string, + mode: "new_space" | "episode", + newSpaceId?: string, +): Promise<{ + processed: number; + assignments: number; + affectedSpaces?: string[]; +}> { + try { + // Create the LLM prompt based on mode + const prompt = await createLLMPrompt( + episodes, + spaces, + mode, + newSpaceId, + userId, + ); + + // Episode-intent matching is MEDIUM complexity (semantic analysis with intent alignment) + let responseText = ""; + await makeModelCall( + false, + prompt, + (text: string) => { + responseText = text; + }, + undefined, + "high", + ); + + // Parse LLM response + const assignments = parseLLMResponseWithTags( + responseText, + episodes, + spaces, + ); + + // Apply assignments + let totalAssignments = 0; + const affectedSpaces = new Set(); + const confidenceThreshold = + mode === "new_space" + ? CONFIG.newSpaceMode.confidenceThreshold + : CONFIG.episodeMode.confidenceThreshold; + + for (const assignment of assignments) { + if ( + assignment.spaceIds.length > 0 && + assignment.confidence >= confidenceThreshold + ) { + // Assign to each space individually to track metadata properly + for (const spaceId of assignment.spaceIds) { + try { + const result = await assignEpisodesToSpace( + [assignment.episodeId], + spaceId, + userId, + ); + + if (result.success) { + totalAssignments++; + affectedSpaces.add(spaceId); + + logger.info( + `LLM assigned episode ${assignment.episodeId} to space ${spaceId}`, + { + confidence: assignment.confidence, + reasoning: assignment.reasoning || "No reasoning", + mode, + } as Record, + ); + } + } catch (error) { + logger.warn( + `Failed to assign episode ${assignment.episodeId} to space ${spaceId}:`, + error as Record, + ); + } + } + } + } + + return { + processed: episodes.length, + assignments: totalAssignments, + affectedSpaces: Array.from(affectedSpaces), + }; + } catch (error) { + logger.error("Error processing batch:", error as Record); + return { processed: 0, assignments: 0, affectedSpaces: [] }; + } +} + +async function createLLMPrompt( + episodes: EpisodeData[], + spaces: Space[], + mode: "new_space" | "episode", + newSpaceId?: string, + userId?: string, +): Promise { + const episodesDescription = episodes + .map( + (ep) => + `ID: ${ep.uuid}\nCONTENT: ${ep.content}\nSOURCE: ${ep.source}\nMETADATA: ${JSON.stringify(ep.metadata)}`, + ) + .join("\n\n"); + + // Get enhanced space information with episode counts + const enhancedSpaces = await Promise.all( + spaces.map(async (space) => { + const currentCount = userId + ? await getSpaceEpisodeCount(space.id, userId) + : 0; + return { + ...space, + currentEpisodeCount: currentCount, + }; + }), + ); + + if (mode === "new_space" && newSpaceId) { + // Focus on the new space for assignment + const newSpace = enhancedSpaces.find((s) => s.id === newSpaceId); + if (!newSpace) { + throw new Error(`New space ${newSpaceId} not found`); + } + + return [ + { + role: "system", + content: `You are analyzing episodes for assignment to a newly created space based on the space's intent and purpose. + +CORE PRINCIPLE: Match episodes based on WHAT THE EPISODE IS FUNDAMENTALLY ABOUT (its primary subject), not just keyword overlap. + +STEP-BY-STEP FILTERING PROCESS: + +Step 1: IDENTIFY PRIMARY SUBJECT +Ask: "Who or what is this episode fundamentally about?" +- Is it about a specific person? (by name, or "I"/"my" = speaker) +- Is it about a system, tool, or organization? +- Is it about a project, event, or activity? +- Is it about a concept, topic, or idea? + +Step 2: HANDLE IMPLICIT SUBJECTS +- "I prefer..." or "My..." β†’ Subject is the SPEAKER (check episode source/metadata for identity) +- "User discussed..." or "Person X said..." β†’ Subject is that specific person +- "We decided..." β†’ Subject is the group/team/project being discussed +- If unclear, identify from context clues in the episode content + +Step 3: CHECK SUBJECT ALIGNMENT +Does the PRIMARY SUBJECT match what the space is about? +- Match the subject identity (right person/thing/concept?) +- Match the subject relationship (is episode ABOUT the subject or just MENTIONING it?) +- Match the intent purpose (does episode serve the space's purpose?) +- Check scope constraints: If space description includes scope requirements (e.g., "cross-context", "not app-specific", "broadly useful", "stable for 3+ months"), verify episode meets those constraints + +Step 4: DISTINGUISH SUBJECT vs META +Ask: "Is this episode ABOUT the subject itself, or ABOUT discussing/analyzing the subject?" +- ABOUT subject: Episode contains actual content related to subject +- META-discussion: Episode discusses how to handle/analyze/organize the subject +- Only assign if episode is ABOUT the subject, not meta-discussion + +Step 5: VERIFY CONFIDENCE +Only assign if confidence >= 0.75 based on: +- Subject identity clarity (is subject clearly identified?) +- Subject alignment strength (how well does it match space intent?) +- Content relevance (does episode content serve space purpose?) + +CRITICAL RULE: PRIMARY SUBJECT MATCHING +The episode's PRIMARY SUBJECT must match the space's target subject. +- If space is about Person A, episodes about Person B should NOT match (even if same topic) +- If space is about a specific concept, meta-discussions about that concept should NOT match +- If space is about actual behaviors/facts, process discussions about organizing those facts should NOT match + +EXAMPLES OF CORRECT FILTERING: + +Example 1 - Person Identity: +Space: "Alex's work preferences" +Episode A: "I prefer morning meetings and async updates" (speaker: Alex) β†’ ASSIGN βœ… (primary subject: Alex's preferences) +Episode B: "Jordan prefers afternoon meetings" (speaker: System) β†’ DO NOT ASSIGN ❌ (primary subject: Jordan, not Alex) + +Example 2 - Meta vs Actual: +Space: "Recipe collection" +Episode A: "My lasagna recipe: 3 layers pasta, bΓ©chamel, meat sauce..." β†’ ASSIGN βœ… (primary subject: actual recipe) +Episode B: "We should organize recipes by cuisine type" β†’ DO NOT ASSIGN ❌ (primary subject: organizing system, not recipe) + +Example 3 - Keyword Overlap Without Subject Match: +Space: "Home renovation project" +Episode A: "Installed new kitchen cabinets, chose oak wood" β†’ ASSIGN βœ… (primary subject: home renovation) +Episode B: "Friend asked advice about their kitchen renovation" β†’ DO NOT ASSIGN ❌ (primary subject: friend's project, not this home) + +Example 4 - Scope Constraints: +Space: "Personal identity and preferences (broadly useful across contexts, not app-specific)" +Episode A: "I prefer async communication and morning work hours" β†’ ASSIGN βœ… (cross-context preference, broadly applicable) +Episode B: "Demonstrated knowledge of ProjectX technical stack" β†’ DO NOT ASSIGN ❌ (work/project knowledge, not personal identity) + +RESPONSE FORMAT: +Provide your response inside tags with a valid JSON array: + + +[ + { + "episodeId": "episode-uuid", + "addSpaceId": ["${newSpaceId}"], + "confidence": 0.75, + "reasoning": "Brief explanation of intent match" + } +] + + +IMPORTANT: If an episode doesn't align with the space's intent, use empty addSpaceId array: [] +Example: {"episodeId": "ep-123", "addSpaceId": [], "confidence": 0.0, "reasoning": "No intent alignment"}`, + }, + { + role: "user", + content: `NEW SPACE TO POPULATE: +Name: ${newSpace.name} +Intent/Purpose: ${newSpace.description || "No description"} +Current Episodes: ${newSpace.currentEpisodeCount} + +EPISODES TO EVALUATE: +${episodesDescription} + +ASSIGNMENT TASK: +For each episode above, follow the step-by-step process to determine if it should be assigned to this space. + +Remember: +1. Identify the PRIMARY SUBJECT of each episode (who/what is it about?) +2. Check if that PRIMARY SUBJECT matches what this space is about +3. If the episode is ABOUT something else (even if it mentions related keywords), do NOT assign +4. If the episode is a META-discussion about the space's topic (not actual content), do NOT assign +5. Only assign if the episode's primary subject aligns with the space's intent AND confidence >= 0.75 + +Provide your analysis and assignments using the specified JSON format.`, + }, + ]; + } else { + // Episode mode - consider all spaces + const spacesDescription = enhancedSpaces + .map((space) => { + const spaceInfo = [ + `- ${space.name} (${space.id})`, + ` Intent/Purpose: ${space.description || "No description"}`, + ` Current Episodes: ${space.currentEpisodeCount}`, + ]; + + if (space.summary) { + spaceInfo.push(` Summary: ${space.summary}`); + } + + return spaceInfo.join("\n"); + }) + .join("\n\n"); + + return [ + { + role: "system", + content: `You are an expert at organizing episodes into semantic spaces based on the space's intent and purpose. + +CORE PRINCIPLE: Match episodes based on WHAT THE EPISODE IS FUNDAMENTALLY ABOUT (its primary subject), not just keyword overlap. + +STEP-BY-STEP FILTERING PROCESS: + +Step 1: IDENTIFY PRIMARY SUBJECT +Ask: "Who or what is this episode fundamentally about?" +- Is it about a specific person? (by name, or "I"/"my" = speaker) +- Is it about a system, tool, or organization? +- Is it about a project, event, or activity? +- Is it about a concept, topic, or idea? + +Step 2: HANDLE IMPLICIT SUBJECTS +- "I prefer..." or "My..." β†’ Subject is the SPEAKER (check episode source/metadata for identity) +- "User discussed..." or "Person X said..." β†’ Subject is that specific person +- "We decided..." β†’ Subject is the group/team/project being discussed +- If unclear, identify from context clues in the episode content + +Step 3: CHECK SUBJECT ALIGNMENT WITH EACH SPACE +For each available space, does the episode's PRIMARY SUBJECT match what that space is about? +- Match the subject identity (right person/thing/concept?) +- Match the subject relationship (is episode ABOUT the subject or just MENTIONING it?) +- Match the intent purpose (does episode serve the space's purpose?) +- An episode can match multiple spaces if its primary subject serves multiple intents + +Step 4: DISTINGUISH SUBJECT vs META +Ask: "Is this episode ABOUT the subject itself, or ABOUT discussing/analyzing the subject?" +- ABOUT subject: Episode contains actual content related to subject +- META-discussion: Episode discusses how to handle/analyze/organize the subject +- Only assign if episode is ABOUT the subject, not meta-discussion + +Step 5: VERIFY CONFIDENCE +Only assign to a space if confidence >= 0.75 based on: +- Subject identity clarity (is subject clearly identified?) +- Subject alignment strength (how well does it match space intent?) +- Content relevance (does episode content serve space purpose?) + +Step 6: MULTI-SPACE ASSIGNMENT +- An episode can belong to multiple spaces if its primary subject serves multiple intents +- Each space assignment should meet the >= 0.75 confidence threshold independently +- If no spaces match, use empty addSpaceId: [] + +CRITICAL RULE: PRIMARY SUBJECT MATCHING +The episode's PRIMARY SUBJECT must match the space's target subject. +- If space is about Person A, episodes about Person B should NOT match (even if same topic) +- If space is about a specific concept, meta-discussions about that concept should NOT match +- If space is about actual behaviors/facts, process discussions about organizing those facts should NOT match + +EXAMPLES OF CORRECT FILTERING: + +Example 1 - Person Identity: +Space: "Alex's work preferences" +Episode A: "I prefer morning meetings and async updates" (speaker: Alex) β†’ ASSIGN βœ… (primary subject: Alex's preferences) +Episode B: "Jordan prefers afternoon meetings" (speaker: System) β†’ DO NOT ASSIGN ❌ (primary subject: Jordan, not Alex) + +Example 2 - Meta vs Actual: +Space: "Recipe collection" +Episode A: "My lasagna recipe: 3 layers pasta, bΓ©chamel, meat sauce..." β†’ ASSIGN βœ… (primary subject: actual recipe) +Episode B: "We should organize recipes by cuisine type" β†’ DO NOT ASSIGN ❌ (primary subject: organizing system, not recipe) + +Example 3 - Keyword Overlap Without Subject Match: +Space: "Home renovation project" +Episode A: "Installed new kitchen cabinets, chose oak wood" β†’ ASSIGN βœ… (primary subject: home renovation) +Episode B: "Friend asked advice about their kitchen renovation" β†’ DO NOT ASSIGN ❌ (primary subject: friend's project, not this home) + +Example 4 - Scope Constraints: +Space: "Personal identity and preferences (broadly useful across contexts, not app-specific)" +Episode A: "I prefer async communication and morning work hours" β†’ ASSIGN βœ… (cross-context preference, broadly applicable) +Episode B: "I format task titles as {verb}: {title} in TaskApp" β†’ DO NOT ASSIGN ❌ (app-specific behavior, fails "not app-specific" constraint) +Episode C: "Demonstrated knowledge of ProjectX technical stack" β†’ DO NOT ASSIGN ❌ (work/project knowledge, not personal identity) + +RESPONSE FORMAT: +Provide your response inside tags with a valid JSON array: + + +[ + { + "episodeId": "episode-uuid", + "addSpaceId": ["space-uuid1", "space-uuid2"], + "confidence": 0.75, + "reasoning": "Brief explanation of intent match" + } +] + + +IMPORTANT: If no spaces' intents align with an episode, use empty addSpaceId array: [] +Example: {"episodeId": "ep-123", "addSpaceId": [], "confidence": 0.0, "reasoning": "No matching space intent"}`, + }, + { + role: "user", + content: `AVAILABLE SPACES (with their intents/purposes): +${spacesDescription} + +EPISODES TO ORGANIZE: +${episodesDescription} + +ASSIGNMENT TASK: +For each episode above, follow the step-by-step process to determine which space(s) it should be assigned to. + +Remember: +1. Identify the PRIMARY SUBJECT of each episode (who/what is it about?) +2. Check if that PRIMARY SUBJECT matches what each space is about +3. If the episode is ABOUT something else (even if it mentions related keywords), do NOT assign to that space +4. If the episode is a META-discussion about a space's topic (not actual content), do NOT assign to that space +5. An episode can be assigned to multiple spaces if its primary subject serves multiple intents +6. Only assign if the episode's primary subject aligns with the space's intent AND confidence >= 0.75 for that space + +Provide your analysis and assignments using the specified JSON format.`, + }, + ]; + } +} + +function parseLLMResponseWithTags( + response: string, + episodes: EpisodeData[], + spaces: Space[], +): AssignmentResult[] { + try { + // Extract content from tags + const outputMatch = response.match(/([\s\S]*?)<\/output>/); + if (!outputMatch) { + logger.warn( + "No tags found in LLM response, falling back to full response parsing", + ); + return parseLLMResponse(response, episodes, spaces); + } + + const jsonContent = outputMatch[1].trim(); + const parsed = JSON.parse(jsonContent); + + if (!Array.isArray(parsed)) { + logger.warn( + "Invalid LLM response format - expected array in tags", + ); + return []; + } + + const validSpaceIds = new Set(spaces.map((s) => s.id)); + const validEpisodeIds = new Set(episodes.map((e) => e.uuid)); + + return parsed + .filter((assignment: any) => { + // Validate assignment structure + if ( + !assignment.episodeId || + !validEpisodeIds.has(assignment.episodeId) + ) { + return false; + } + + // Validate spaceIds array + if (!assignment.addSpaceId || !Array.isArray(assignment.addSpaceId)) { + assignment.addSpaceId = []; + } + + // Filter out invalid space IDs + assignment.addSpaceId = assignment.addSpaceId.filter( + (spaceId: string) => validSpaceIds.has(spaceId), + ); + + return true; + }) + .map((assignment: any) => ({ + episodeId: assignment.episodeId, + spaceIds: assignment.addSpaceId, + confidence: assignment.confidence || 0.75, + reasoning: assignment.reasoning, + })); + } catch (error) { + logger.error( + "Error parsing LLM response with tags:", + error as Record, + ); + logger.debug("Raw LLM response:", { response } as Record); + // Fallback to regular parsing + return parseLLMResponse(response, episodes, spaces); + } +} + +function parseLLMResponse( + response: string, + episodes: EpisodeData[], + spaces: Space[], +): AssignmentResult[] { + try { + // Clean the response - remove any markdown formatting + const cleanedResponse = response + .replace(/```json\n?/g, "") + .replace(/```\n?/g, "") + .trim(); + + const parsed = JSON.parse(cleanedResponse); + + if (!parsed.assignments || !Array.isArray(parsed.assignments)) { + logger.warn("Invalid LLM response format - no assignments array"); + return []; + } + + const validSpaceIds = new Set(spaces.map((s) => s.id)); + const validEpisodeIds = new Set(episodes.map((e) => e.uuid)); + + return parsed.assignments + .filter((assignment: any) => { + // Validate assignment structure + if ( + !assignment.episodeId || + !validEpisodeIds.has(assignment.episodeId) + ) { + return false; + } + + if (!assignment.spaceIds || !Array.isArray(assignment.spaceIds)) { + return false; + } + + // Filter out invalid space IDs + assignment.spaceIds = assignment.spaceIds.filter((spaceId: string) => + validSpaceIds.has(spaceId), + ); + + return true; + }) + .map((assignment: any) => ({ + episodeId: assignment.episodeId, + spaceIds: assignment.spaceIds, + confidence: assignment.confidence || 0.75, + reasoning: assignment.reasoning, + })); + } catch (error) { + logger.error( + "Error parsing LLM response:", + error as Record, + ); + logger.debug("Raw LLM response:", { response } as Record); + return []; + } +} diff --git a/apps/webapp/app/jobs/spaces/space-identification.logic.ts b/apps/webapp/app/jobs/spaces/space-identification.logic.ts new file mode 100644 index 0000000..55cfb42 --- /dev/null +++ b/apps/webapp/app/jobs/spaces/space-identification.logic.ts @@ -0,0 +1,229 @@ +/** + * Space Identification Logic + * + * Uses LLM to identify appropriate spaces for topics discovered by BERT analysis + */ + +import { makeModelCall } from "~/lib/model.server"; +import { getAllSpacesForUser } from "~/services/graphModels/space"; +import { getEpisode } from "~/services/graphModels/episode"; +import { logger } from "~/services/logger.service"; +import type { SpaceNode } from "@core/types"; + +export interface TopicData { + keywords: string[]; + episodeIds: string[]; +} + +export interface SpaceProposal { + name: string; + intent: string; + confidence: number; + reason: string; + topics: string[]; // Array of topic IDs +} + +interface IdentifySpacesParams { + userId: string; + topics: Record; +} + +/** + * Identify spaces for topics using LLM analysis + * Takes top 10 keywords and top 5 episodes per topic + */ +export async function identifySpacesForTopics( + params: IdentifySpacesParams, +): Promise { + const { userId, topics } = params; + + // Get existing spaces for the user + const existingSpaces = await getAllSpacesForUser(userId); + + // Prepare topic data with top 10 keywords and top 5 episodes + const topicsForAnalysis = await Promise.all( + Object.entries(topics).map(async ([topicId, topicData]) => { + // Take top 10 keywords + const topKeywords = topicData.keywords.slice(0, 10); + + // Take top 5 episodes and fetch their content + const topEpisodeIds = topicData.episodeIds.slice(0, 5); + const episodes = await Promise.all( + topEpisodeIds.map((id) => getEpisode(id)), + ); + + return { + topicId, + keywords: topKeywords, + episodes: episodes + .filter((e) => e !== null) + .map((e) => ({ + content: e!.content.substring(0, 500), // Limit to 500 chars per episode + })), + episodeCount: topicData.episodeIds.length, + }; + }), + ); + + // Build the prompt + const prompt = buildSpaceIdentificationPrompt( + existingSpaces, + topicsForAnalysis, + ); + + logger.info("Identifying spaces for topics", { + userId, + topicCount: Object.keys(topics).length, + existingSpaceCount: existingSpaces.length, + }); + + // Call LLM with structured output + let responseText = ""; + await makeModelCall( + false, // not streaming + [{ role: "user", content: prompt }], + (text) => { + responseText = text; + }, + { + temperature: 0.7, + }, + "high", // Use high complexity for space identification + ); + + // Parse the response + const proposals = parseSpaceProposals(responseText); + + logger.info("Space identification completed", { + userId, + proposalCount: proposals.length, + }); + + return proposals; +} + +/** + * Build the prompt for space identification + */ +function buildSpaceIdentificationPrompt( + existingSpaces: SpaceNode[], + topics: Array<{ + topicId: string; + keywords: string[]; + episodes: Array<{ content: string }>; + episodeCount: number; + }>, +): string { + const existingSpacesSection = + existingSpaces.length > 0 + ? `## Existing Spaces + +The user currently has these spaces: +${existingSpaces.map((s) => `- **${s.name}**: ${s.description || "No description"} (${s.contextCount || 0} episodes)`).join("\n")} + +When identifying new spaces, consider if topics fit into existing spaces or if new spaces are needed.` + : `## Existing Spaces + +The user currently has no spaces defined. This is a fresh start for space organization.`; + + const topicsSection = `## Topics Discovered + +BERT topic modeling has identified ${topics.length} distinct topics from the user's episodes. Each topic represents a cluster of semantically related content. + +${topics + .map( + (t, idx) => `### Topic ${idx + 1} (ID: ${t.topicId}) +**Episode Count**: ${t.episodeCount} +**Top Keywords**: ${t.keywords.join(", ")} + +**Sample Episodes** (showing ${t.episodes.length} of ${t.episodeCount}): +${t.episodes.map((e, i) => `${i + 1}. ${e.content}`).join("\n")} +`, + ) + .join("\n")}`; + + return `You are a knowledge organization expert. Your task is to analyze discovered topics and identify appropriate "spaces" (thematic containers) for organizing episodic memories. + +${existingSpacesSection} + +${topicsSection} + +## Task + +Analyze the topics above and identify spaces that would help organize this content meaningfully. For each space: + +1. **Consider existing spaces first**: If topics clearly belong to existing spaces, assign them there +2. **Create new spaces when needed**: If topics represent distinct themes not covered by existing spaces +3. **Group related topics**: Multiple topics can be assigned to the same space if they share a theme +4. **Aim for 20-50 episodes per space**: This is the sweet spot for space cohesion +5. **Focus on user intent**: What would help the user find and understand this content later? + +## Output Format + +Return your analysis as a JSON array of space proposals. Each proposal should have: + +\`\`\`json +[ + { + "name": "Space name (use existing space name if assigning to existing space)", + "intent": "Clear description of what this space represents", + "confidence": 0.85, + "reason": "Brief explanation of why these topics belong together", + "topics": ["topic-id-1", "topic-id-2"] + } +] +\`\`\` + +**Important Guidelines**: +- **confidence**: 0.0-1.0 scale indicating how confident you are this is a good grouping +- **topics**: Array of topic IDs (use the exact IDs from above like "0", "1", "-1", etc.) +- **name**: For existing spaces, use the EXACT name. For new spaces, create a clear, concise name +- Only propose spaces with confidence >= 0.6 +- Each topic should only appear in ONE space proposal +- Topic "-1" is the outlier topic (noise) - only include if it genuinely fits a theme + +Return ONLY the JSON array, no additional text.`; +} + +/** + * Parse space proposals from LLM response + */ +function parseSpaceProposals(responseText: string): SpaceProposal[] { + try { + // Extract JSON from markdown code blocks if present + const jsonMatch = responseText.match(/```(?:json)?\s*(\[[\s\S]*?\])\s*```/); + const jsonText = jsonMatch ? jsonMatch[1] : responseText; + + const proposals = JSON.parse(jsonText.trim()); + + if (!Array.isArray(proposals)) { + throw new Error("Response is not an array"); + } + + // Validate and filter proposals + return proposals + .filter((p) => { + return ( + p.name && + p.intent && + typeof p.confidence === "number" && + p.confidence >= 0.6 && + Array.isArray(p.topics) && + p.topics.length > 0 + ); + }) + .map((p) => ({ + name: p.name.trim(), + intent: p.intent.trim(), + confidence: p.confidence, + reason: (p.reason || "").trim(), + topics: p.topics.map((t: any) => String(t)), + })); + } catch (error) { + logger.error("Failed to parse space proposals", { + error, + responseText: responseText.substring(0, 500), + }); + return []; + } +} diff --git a/apps/webapp/app/jobs/spaces/space-summary.logic.ts b/apps/webapp/app/jobs/spaces/space-summary.logic.ts new file mode 100644 index 0000000..0482fa5 --- /dev/null +++ b/apps/webapp/app/jobs/spaces/space-summary.logic.ts @@ -0,0 +1,721 @@ +import { logger } from "~/services/logger.service"; +import { SpaceService } from "~/services/space.server"; +import { makeModelCall } from "~/lib/model.server"; +import { runQuery } from "~/lib/neo4j.server"; +import { updateSpaceStatus, SPACE_STATUS } from "~/trigger/utils/space-status"; +import type { CoreMessage } from "ai"; +import { z } from "zod"; +import { getSpace, updateSpace } from "~/trigger/utils/space-utils"; +import { getSpaceEpisodeCount } from "~/services/graphModels/space"; + +export interface SpaceSummaryPayload { + userId: string; + spaceId: string; // Single space only + triggerSource?: "assignment" | "manual" | "scheduled"; +} + +interface SpaceEpisodeData { + uuid: string; + content: string; + originalContent: string; + source: string; + createdAt: Date; + validAt: Date; + metadata: any; + sessionId: string | null; +} + +interface SpaceSummaryData { + spaceId: string; + spaceName: string; + spaceDescription?: string; + contextCount: number; + summary: string; + keyEntities: string[]; + themes: string[]; + confidence: number; + lastUpdated: Date; + isIncremental: boolean; +} + +// Zod schema for LLM response validation +const SummaryResultSchema = z.object({ + summary: z.string(), + keyEntities: z.array(z.string()), + themes: z.array(z.string()), + confidence: z.number().min(0).max(1), +}); + +const CONFIG = { + maxEpisodesForSummary: 20, // Limit episodes for performance + minEpisodesForSummary: 1, // Minimum episodes to generate summary + summaryEpisodeThreshold: 5, // Minimum new episodes required to trigger summary (configurable) +}; + +export interface SpaceSummaryResult { + success: boolean; + spaceId: string; + triggerSource: string; + summary?: { + statementCount: number; + confidence: number; + themesCount: number; + } | null; + reason?: string; +} + +/** + * Core business logic for space summary generation + * This is shared between Trigger.dev and BullMQ implementations + */ +export async function processSpaceSummary( + payload: SpaceSummaryPayload, +): Promise { + const { userId, spaceId, triggerSource = "manual" } = payload; + + logger.info(`Starting space summary generation`, { + userId, + spaceId, + triggerSource, + }); + + try { + // Update status to processing + await updateSpaceStatus(spaceId, SPACE_STATUS.PROCESSING, { + userId, + operation: "space-summary", + metadata: { triggerSource, phase: "start_summary" }, + }); + + // Generate summary for the single space + const summaryResult = await generateSpaceSummary( + spaceId, + userId, + triggerSource, + ); + + if (summaryResult) { + // Store the summary + await storeSummary(summaryResult); + + // Update status to ready after successful completion + await updateSpaceStatus(spaceId, SPACE_STATUS.READY, { + userId, + operation: "space-summary", + metadata: { + triggerSource, + phase: "completed_summary", + contextCount: summaryResult.contextCount, + confidence: summaryResult.confidence, + }, + }); + + logger.info(`Generated summary for space ${spaceId}`, { + statementCount: summaryResult.contextCount, + confidence: summaryResult.confidence, + themes: summaryResult.themes.length, + triggerSource, + }); + + return { + success: true, + spaceId, + triggerSource, + summary: { + statementCount: summaryResult.contextCount, + confidence: summaryResult.confidence, + themesCount: summaryResult.themes.length, + }, + }; + } else { + // No summary generated - this could be due to insufficient episodes or no new episodes + // This is not an error state, so update status to ready + await updateSpaceStatus(spaceId, SPACE_STATUS.READY, { + userId, + operation: "space-summary", + metadata: { + triggerSource, + phase: "no_summary_needed", + reason: "Insufficient episodes or no new episodes to summarize", + }, + }); + + logger.info( + `No summary generated for space ${spaceId} - insufficient or no new episodes`, + ); + return { + success: true, + spaceId, + triggerSource, + summary: null, + reason: "No episodes to summarize", + }; + } + } catch (error) { + // Update status to error on exception + try { + await updateSpaceStatus(spaceId, SPACE_STATUS.ERROR, { + userId, + operation: "space-summary", + metadata: { + triggerSource, + phase: "exception", + error: error instanceof Error ? error.message : "Unknown error", + }, + }); + } catch (statusError) { + logger.warn(`Failed to update status to error for space ${spaceId}`, { + statusError, + }); + } + + logger.error( + `Error in space summary generation for space ${spaceId}:`, + error as Record, + ); + throw error; + } +} + +async function generateSpaceSummary( + spaceId: string, + userId: string, + triggerSource?: "assignment" | "manual" | "scheduled", +): Promise { + try { + // 1. Get space details + const spaceService = new SpaceService(); + const space = await spaceService.getSpace(spaceId, userId); + + if (!space) { + logger.warn(`Space ${spaceId} not found for user ${userId}`); + return null; + } + + // 2. Check episode count threshold (skip for manual triggers) + if (triggerSource !== "manual") { + const currentEpisodeCount = await getSpaceEpisodeCount(spaceId, userId); + const lastSummaryEpisodeCount = space.contextCount || 0; + const episodeDifference = currentEpisodeCount - lastSummaryEpisodeCount; + + if ( + episodeDifference < CONFIG.summaryEpisodeThreshold || + lastSummaryEpisodeCount !== 0 + ) { + logger.info( + `Skipping summary generation for space ${spaceId}: only ${episodeDifference} new episodes (threshold: ${CONFIG.summaryEpisodeThreshold})`, + { + currentEpisodeCount, + lastSummaryEpisodeCount, + episodeDifference, + threshold: CONFIG.summaryEpisodeThreshold, + }, + ); + return null; + } + + logger.info( + `Proceeding with summary generation for space ${spaceId}: ${episodeDifference} new episodes (threshold: ${CONFIG.summaryEpisodeThreshold})`, + { + currentEpisodeCount, + lastSummaryEpisodeCount, + episodeDifference, + }, + ); + } + + // 2. Check for existing summary + const existingSummary = await getExistingSummary(spaceId); + const isIncremental = existingSummary !== null; + + // 3. Get episodes (all or new ones based on existing summary) + const episodes = await getSpaceEpisodes( + spaceId, + userId, + isIncremental ? existingSummary?.lastUpdated : undefined, + ); + + // Handle case where no new episodes exist for incremental update + if (isIncremental && episodes.length === 0) { + logger.info( + `No new episodes found for space ${spaceId}, skipping summary update`, + ); + return null; + } + + // Check minimum episode requirement for new summaries only + if (!isIncremental && episodes.length < CONFIG.minEpisodesForSummary) { + logger.info( + `Space ${spaceId} has insufficient episodes (${episodes.length}) for new summary`, + ); + return null; + } + + // 4. Process episodes using unified approach + let summaryResult; + + if (episodes.length > CONFIG.maxEpisodesForSummary) { + logger.info( + `Large space detected (${episodes.length} episodes). Processing in batches.`, + ); + + // Process in batches, each building on previous result + const batches: SpaceEpisodeData[][] = []; + for (let i = 0; i < episodes.length; i += CONFIG.maxEpisodesForSummary) { + batches.push(episodes.slice(i, i + CONFIG.maxEpisodesForSummary)); + } + + let currentSummary = existingSummary?.summary || null; + let currentThemes = existingSummary?.themes || []; + let cumulativeConfidence = 0; + + for (const [batchIndex, batch] of batches.entries()) { + logger.info( + `Processing batch ${batchIndex + 1}/${batches.length} with ${batch.length} episodes`, + ); + + const batchResult = await generateUnifiedSummary( + space.name, + space.description as string, + batch, + currentSummary, + currentThemes, + ); + + if (batchResult) { + currentSummary = batchResult.summary; + currentThemes = batchResult.themes; + cumulativeConfidence += batchResult.confidence; + } else { + logger.warn(`Failed to process batch ${batchIndex + 1}`); + } + + // Small delay between batches + if (batchIndex < batches.length - 1) { + await new Promise((resolve) => setTimeout(resolve, 500)); + } + } + + summaryResult = currentSummary + ? { + summary: currentSummary, + themes: currentThemes, + confidence: Math.min(cumulativeConfidence / batches.length, 1.0), + } + : null; + } else { + logger.info( + `Processing ${episodes.length} episodes with unified approach`, + ); + + // Use unified approach for smaller spaces + summaryResult = await generateUnifiedSummary( + space.name, + space.description as string, + episodes, + existingSummary?.summary || null, + existingSummary?.themes || [], + ); + } + + if (!summaryResult) { + logger.warn(`Failed to generate LLM summary for space ${spaceId}`); + return null; + } + + // Get the actual current counts from Neo4j + const currentEpisodeCount = await getSpaceEpisodeCount(spaceId, userId); + + return { + spaceId: space.uuid, + spaceName: space.name, + spaceDescription: space.description as string, + contextCount: currentEpisodeCount, + summary: summaryResult.summary, + keyEntities: summaryResult.keyEntities || [], + themes: summaryResult.themes, + confidence: summaryResult.confidence, + lastUpdated: new Date(), + isIncremental, + }; + } catch (error) { + logger.error( + `Error generating summary for space ${spaceId}:`, + error as Record, + ); + return null; + } +} + +async function generateUnifiedSummary( + spaceName: string, + spaceDescription: string | undefined, + episodes: SpaceEpisodeData[], + previousSummary: string | null = null, + previousThemes: string[] = [], +): Promise<{ + summary: string; + themes: string[]; + confidence: number; + keyEntities?: string[]; +} | null> { + try { + const prompt = createUnifiedSummaryPrompt( + spaceName, + spaceDescription, + episodes, + previousSummary, + previousThemes, + ); + + // Space summary generation requires HIGH complexity (creative synthesis, narrative generation) + let responseText = ""; + await makeModelCall( + false, + prompt, + (text: string) => { + responseText = text; + }, + undefined, + "high", + ); + + return parseSummaryResponse(responseText); + } catch (error) { + logger.error( + "Error generating unified summary:", + error as Record, + ); + return null; + } +} + +function createUnifiedSummaryPrompt( + spaceName: string, + spaceDescription: string | undefined, + episodes: SpaceEpisodeData[], + previousSummary: string | null, + previousThemes: string[], +): CoreMessage[] { + // If there are no episodes and no previous summary, we cannot generate a meaningful summary + if (episodes.length === 0 && previousSummary === null) { + throw new Error( + "Cannot generate summary without episodes or existing summary", + ); + } + + const episodesText = episodes + .map( + (episode) => + `- ${episode.content} (Source: ${episode.source}, Session: ${episode.sessionId || "N/A"})`, + ) + .join("\n"); + + // Extract key entities and themes from episode content + const contentWords = episodes + .map((ep) => ep.content.toLowerCase()) + .join(" ") + .split(/\s+/) + .filter((word) => word.length > 3); + + const wordFrequency = new Map(); + contentWords.forEach((word) => { + wordFrequency.set(word, (wordFrequency.get(word) || 0) + 1); + }); + + const topEntities = Array.from(wordFrequency.entries()) + .sort(([, a], [, b]) => b - a) + .slice(0, 10) + .map(([word]) => word); + + const isUpdate = previousSummary !== null; + + return [ + { + role: "system", + content: `You are an expert at analyzing and summarizing episodes within semantic spaces based on the space's intent and purpose. Your task is to ${isUpdate ? "update an existing summary by integrating new episodes" : "create a comprehensive summary of episodes"}. + +CRITICAL RULES: +1. Base your summary ONLY on insights derived from the actual content/episodes provided +2. Use the space's INTENT/PURPOSE (from description) to guide what to summarize and how to organize it +3. Write in a factual, neutral tone - avoid promotional language ("pivotal", "invaluable", "cutting-edge") +4. Be specific and concrete - reference actual content, patterns, and insights found in the episodes +5. If episodes are insufficient for meaningful insights, state that more data is needed + +INTENT-DRIVEN SUMMARIZATION: +Your summary should SERVE the space's intended purpose. Examples: +- "Learning React" β†’ Summarize React concepts, patterns, techniques learned +- "Project X Updates" β†’ Summarize progress, decisions, blockers, next steps +- "Health Tracking" β†’ Summarize metrics, trends, observations, insights +- "Guidelines for React" β†’ Extract actionable patterns, best practices, rules +- "Evolution of design thinking" β†’ Track how thinking changed over time, decision points +The intent defines WHY this space exists - organize content to serve that purpose. + +INSTRUCTIONS: +${ + isUpdate + ? `1. Review the existing summary and themes carefully +2. Analyze the new episodes for patterns and insights that align with the space's intent +3. Identify connecting points between existing knowledge and new episodes +4. Update the summary to seamlessly integrate new information while preserving valuable existing insights +5. Evolve themes by adding new ones or refining existing ones based on the space's purpose +6. Organize the summary to serve the space's intended use case` + : `1. Analyze the semantic content and relationships within the episodes +2. Identify topics/sections that align with the space's INTENT and PURPOSE +3. Create a coherent summary that serves the space's intended use case +4. Organize the summary based on the space's purpose (not generic frequency-based themes)` +} +${isUpdate ? "7" : "5"}. Assess your confidence in the ${isUpdate ? "updated" : ""} summary quality (0.0-1.0) + +INTENT-ALIGNED ORGANIZATION: +- Organize sections based on what serves the space's purpose +- Topics don't need minimum episode counts - relevance to intent matters most +- Each section should provide value aligned with the space's intended use +- For "guidelines" spaces: focus on actionable patterns +- For "tracking" spaces: focus on temporal patterns and changes +- For "learning" spaces: focus on concepts and insights gained +- Let the space's intent drive the structure, not rigid rules + +${ + isUpdate + ? `CONNECTION FOCUS: +- Entity relationships that span across batches/time +- Theme evolution and expansion +- Temporal patterns and progressions +- Contradictions or confirmations of existing insights +- New insights that complement existing knowledge` + : "" +} + +RESPONSE FORMAT: +Provide your response inside tags with valid JSON. Include both HTML summary and markdown format. + + +{ + "summary": "${isUpdate ? "Updated HTML summary that integrates new insights with existing knowledge. Write factually about what the statements reveal - mention specific entities, relationships, and patterns found in the data. Avoid marketing language. Use HTML tags for structure." : "Factual HTML summary based on patterns found in the statements. Report what the data actually shows - specific entities, relationships, frequencies, and concrete insights. Avoid promotional language. Use HTML tags like

, ,

    ,
  • for structure. Keep it concise and evidence-based."}", + "keyEntities": ["entity1", "entity2", "entity3"], + "themes": ["${isUpdate ? 'updated_theme1", "new_theme2", "evolved_theme3' : 'theme1", "theme2", "theme3'}"], + "confidence": 0.85 +} + + +JSON FORMATTING RULES: +- HTML content in summary field is allowed and encouraged +- Escape quotes within strings as \" +- Escape HTML angle brackets if needed: < and > +- Use proper HTML tags for structure:

    , , ,

      ,
    • ,

      , etc. +- HTML content should be well-formed and semantic + +GUIDELINES: +${ + isUpdate + ? `- Preserve valuable insights from existing summary +- Integrate new information by highlighting connections +- Themes should evolve naturally, don't replace wholesale +- The updated summary should read as a coherent whole +- Make the summary user-friendly and explain what value this space provides` + : `- Report only what the episodes actually reveal - be specific and concrete +- Cite actual content and patterns found in the episodes +- Avoid generic descriptions that could apply to any space +- Use neutral, factual language - no "comprehensive", "robust", "cutting-edge" etc. +- Themes must be backed by at least 3 supporting episodes with clear evidence +- Better to have fewer, well-supported themes than many weak ones +- Confidence should reflect actual data quality and coverage, not aspirational goals` +}`, + }, + { + role: "user", + content: `SPACE INFORMATION: +Name: "${spaceName}" +Intent/Purpose: ${spaceDescription || "No specific intent provided - organize naturally based on content"} + +${ + isUpdate + ? `EXISTING SUMMARY: +${previousSummary} + +EXISTING THEMES: +${previousThemes.join(", ")} + +NEW EPISODES TO INTEGRATE (${episodes.length} episodes):` + : `EPISODES IN THIS SPACE (${episodes.length} episodes):` +} +${episodesText} + +${ + episodes.length > 0 + ? `TOP WORDS BY FREQUENCY: +${topEntities.join(", ")}` + : "" +} + +${ + isUpdate + ? "Please identify connections between the existing summary and new episodes, then update the summary to integrate the new insights coherently. Organize the summary to SERVE the space's intent/purpose. Remember: only summarize insights from the actual episode content." + : "Please analyze the episodes and provide a comprehensive summary that SERVES the space's intent/purpose. Organize sections based on what would be most valuable for this space's intended use case. If the intent is unclear, organize naturally based on content patterns. Only summarize insights from actual episode content." +}`, + }, + ]; +} + +async function getExistingSummary(spaceId: string): Promise<{ + summary: string; + themes: string[]; + lastUpdated: Date; + contextCount: number; +} | null> { + try { + const existingSummary = await getSpace(spaceId); + + if (existingSummary?.summary) { + return { + summary: existingSummary.summary, + themes: existingSummary.themes, + lastUpdated: existingSummary.summaryGeneratedAt || new Date(), + contextCount: existingSummary.contextCount || 0, + }; + } + + return null; + } catch (error) { + logger.warn(`Failed to get existing summary for space ${spaceId}:`, { + error, + }); + return null; + } +} + +async function getSpaceEpisodes( + spaceId: string, + userId: string, + sinceDate?: Date, +): Promise { + // Query episodes directly using Space-[:HAS_EPISODE]->Episode relationships + const params: any = { spaceId, userId }; + + let dateCondition = ""; + if (sinceDate) { + dateCondition = "AND e.createdAt > $sinceDate"; + params.sinceDate = sinceDate.toISOString(); + } + + const query = ` + MATCH (space:Space {uuid: $spaceId, userId: $userId})-[:HAS_EPISODE]->(e:Episode {userId: $userId}) + WHERE e IS NOT NULL ${dateCondition} + RETURN DISTINCT e + ORDER BY e.createdAt DESC + `; + + const result = await runQuery(query, params); + + return result.map((record) => { + const episode = record.get("e").properties; + return { + uuid: episode.uuid, + content: episode.content, + originalContent: episode.originalContent, + source: episode.source, + createdAt: new Date(episode.createdAt), + validAt: new Date(episode.validAt), + metadata: JSON.parse(episode.metadata || "{}"), + sessionId: episode.sessionId, + }; + }); +} + +function parseSummaryResponse(response: string): { + summary: string; + themes: string[]; + confidence: number; + keyEntities?: string[]; +} | null { + try { + // Extract content from tags + const outputMatch = response.match(/([\s\S]*?)<\/output>/); + if (!outputMatch) { + logger.warn("No tags found in LLM summary response"); + logger.debug("Full LLM response:", { response }); + return null; + } + + let jsonContent = outputMatch[1].trim(); + + let parsed; + try { + parsed = JSON.parse(jsonContent); + } catch (jsonError) { + logger.warn("JSON parsing failed, attempting cleanup and retry", { + originalError: jsonError, + jsonContent: jsonContent.substring(0, 500) + "...", // Log first 500 chars + }); + + // More aggressive cleanup for malformed JSON + jsonContent = jsonContent + .replace(/([^\\])"/g, '$1\\"') // Escape unescaped quotes + .replace(/^"/g, '\\"') // Escape quotes at start + .replace(/\\\\"/g, '\\"'); // Fix double-escaped quotes + + parsed = JSON.parse(jsonContent); + } + + // Validate the response structure + const validationResult = SummaryResultSchema.safeParse(parsed); + if (!validationResult.success) { + logger.warn("Invalid LLM summary response format:", { + error: validationResult.error, + parsedData: parsed, + }); + return null; + } + + return validationResult.data; + } catch (error) { + logger.error( + "Error parsing LLM summary response:", + error as Record, + ); + logger.debug("Failed response content:", { response }); + return null; + } +} + +async function storeSummary(summaryData: SpaceSummaryData): Promise { + try { + // Store in PostgreSQL for API access and persistence + await updateSpace(summaryData); + + // Also store in Neo4j for graph-based queries + const query = ` + MATCH (space:Space {uuid: $spaceId}) + SET space.summary = $summary, + space.keyEntities = $keyEntities, + space.themes = $themes, + space.summaryConfidence = $confidence, + space.summaryContextCount = $contextCount, + space.summaryLastUpdated = datetime($lastUpdated) + RETURN space + `; + + await runQuery(query, { + spaceId: summaryData.spaceId, + summary: summaryData.summary, + keyEntities: summaryData.keyEntities, + themes: summaryData.themes, + confidence: summaryData.confidence, + contextCount: summaryData.contextCount, + lastUpdated: summaryData.lastUpdated.toISOString(), + }); + + logger.info(`Stored summary for space ${summaryData.spaceId}`, { + themes: summaryData.themes.length, + keyEntities: summaryData.keyEntities.length, + confidence: summaryData.confidence, + }); + } catch (error) { + logger.error( + `Error storing summary for space ${summaryData.spaceId}:`, + error as Record, + ); + throw error; + } +} diff --git a/apps/webapp/app/lib/queue-adapter.server.ts b/apps/webapp/app/lib/queue-adapter.server.ts index af9281d..4a867dc 100644 --- a/apps/webapp/app/lib/queue-adapter.server.ts +++ b/apps/webapp/app/lib/queue-adapter.server.ts @@ -15,7 +15,8 @@ import type { z } from "zod"; import type { IngestBodyRequest } from "~/jobs/ingest/ingest-episode.logic"; import type { CreateConversationTitlePayload } from "~/jobs/conversation/create-title.logic"; import type { SessionCompactionPayload } from "~/jobs/session/session-compaction.logic"; -import { type SpaceAssignmentPayload } from "~/trigger/spaces/space-assignment"; +import type { SpaceAssignmentPayload } from "~/jobs/spaces/space-assignment.logic"; +import type { SpaceSummaryPayload } from "~/jobs/spaces/space-summary.logic"; type QueueProvider = "trigger" | "bullmq"; @@ -144,22 +145,86 @@ export async function enqueueSessionCompaction( /** * Enqueue space assignment job - * (Helper for common job logic to call) */ export async function enqueueSpaceAssignment( payload: SpaceAssignmentPayload, -): Promise { +): Promise<{ id?: string }> { const provider = env.QUEUE_PROVIDER as QueueProvider; if (provider === "trigger") { const { triggerSpaceAssignment } = await import( "~/trigger/spaces/space-assignment" ); - await triggerSpaceAssignment(payload); + const handler = await triggerSpaceAssignment(payload); + return { id: handler.id }; } else { - // For BullMQ, space assignment is not implemented yet - // You can add it later when needed - console.warn("Space assignment not implemented for BullMQ yet"); + // BullMQ + const { spaceAssignmentQueue } = await import("~/bullmq/queues"); + const job = await spaceAssignmentQueue.add("space-assignment", payload, { + jobId: `space-assignment-${payload.userId}-${payload.mode}-${Date.now()}`, + attempts: 3, + backoff: { type: "exponential", delay: 2000 }, + }); + return { id: job.id }; + } +} + +/** + * Enqueue space summary job + */ +export async function enqueueSpaceSummary( + payload: SpaceSummaryPayload, +): Promise<{ id?: string }> { + const provider = env.QUEUE_PROVIDER as QueueProvider; + + if (provider === "trigger") { + const { triggerSpaceSummary } = await import( + "~/trigger/spaces/space-summary" + ); + const handler = await triggerSpaceSummary(payload); + return { id: handler.id }; + } else { + // BullMQ + const { spaceSummaryQueue } = await import("~/bullmq/queues"); + const job = await spaceSummaryQueue.add("space-summary", payload, { + jobId: `space-summary-${payload.spaceId}-${Date.now()}`, + attempts: 3, + backoff: { type: "exponential", delay: 2000 }, + }); + return { id: job.id }; + } +} + +/** + * Enqueue BERT topic analysis job + */ +export async function enqueueBertTopicAnalysis(payload: { + userId: string; + workspaceId: string; + minTopicSize?: number; + nrTopics?: number; +}): Promise<{ id?: string }> { + const provider = env.QUEUE_PROVIDER as QueueProvider; + + if (provider === "trigger") { + const { bertTopicAnalysisTask } = await import( + "~/trigger/bert/topic-analysis" + ); + const handler = await bertTopicAnalysisTask.trigger(payload, { + queue: "bert-topic-analysis", + concurrencyKey: payload.userId, + tags: [payload.userId, "bert-analysis"], + }); + return { id: handler.id }; + } else { + // BullMQ + const { bertTopicQueue } = await import("~/bullmq/queues"); + const job = await bertTopicQueue.add("topic-analysis", payload, { + jobId: `bert-${payload.userId}-${Date.now()}`, + attempts: 2, // Only 2 attempts for expensive operations + backoff: { type: "exponential", delay: 5000 }, + }); + return { id: job.id }; } } diff --git a/apps/webapp/app/models/workspace.server.ts b/apps/webapp/app/models/workspace.server.ts index 7bd5bee..7800a19 100644 --- a/apps/webapp/app/models/workspace.server.ts +++ b/apps/webapp/app/models/workspace.server.ts @@ -29,12 +29,6 @@ Exclude: β€’ Anything not explicitly consented to share don't store anything the user did not explicitly consent to share.`; -const githubDescription = `Everything related to my GitHub work - repos I'm working on, projects I contribute to, code I'm writing, PRs I'm reviewing. Basically my coding life on GitHub.`; - -const healthDescription = `My health and wellness stuff - how I'm feeling, what I'm learning about my body, experiments I'm trying, patterns I notice. Whatever matters to me about staying healthy.`; - -const fitnessDescription = `My workouts and training - what I'm doing at the gym, runs I'm going on, progress I'm making, goals I'm chasing. Anything related to physical exercise and getting stronger.`; - export async function createWorkspace( input: CreateWorkspaceDto, ): Promise { @@ -56,32 +50,7 @@ export async function createWorkspace( await ensureBillingInitialized(workspace.id); // Create default spaces - await Promise.all([ - spaceService.createSpace({ - name: "Profile", - description: profileRule, - userId: input.userId, - workspaceId: workspace.id, - }), - spaceService.createSpace({ - name: "GitHub", - description: githubDescription, - userId: input.userId, - workspaceId: workspace.id, - }), - spaceService.createSpace({ - name: "Health", - description: healthDescription, - userId: input.userId, - workspaceId: workspace.id, - }), - spaceService.createSpace({ - name: "Fitness", - description: fitnessDescription, - userId: input.userId, - workspaceId: workspace.id, - }), - ]); + await Promise.all([]); try { const response = await sendEmail({ email: "welcome", to: user.email }); diff --git a/apps/webapp/app/routes/api.v1.conversation._index.tsx b/apps/webapp/app/routes/api.v1.conversation._index.tsx index 8e92a4c..922f02c 100644 --- a/apps/webapp/app/routes/api.v1.conversation._index.tsx +++ b/apps/webapp/app/routes/api.v1.conversation._index.tsx @@ -19,7 +19,10 @@ import { import { getModel } from "~/lib/model.server"; import { UserTypeEnum } from "@core/types"; import { nanoid } from "nanoid"; -import { getOrCreatePersonalAccessToken } from "~/services/personalAccessToken.server"; +import { + deletePersonalAccessToken, + getOrCreatePersonalAccessToken, +} from "~/services/personalAccessToken.server"; import { hasAnswer, hasQuestion, @@ -126,6 +129,7 @@ const { loader, action } = createHybridActionApiRoute( }); result.consumeStream(); // no await + await deletePersonalAccessToken(pat?.id); return result.toUIMessageStreamResponse({ originalMessages: validatedMessages, diff --git a/apps/webapp/app/routes/api.v1.logs.tsx b/apps/webapp/app/routes/api.v1.logs.tsx index 0a06c57..78950e7 100644 --- a/apps/webapp/app/routes/api.v1.logs.tsx +++ b/apps/webapp/app/routes/api.v1.logs.tsx @@ -1,6 +1,7 @@ import { json } from "@remix-run/node"; import { z } from "zod"; import { prisma } from "~/db.server"; + import { createHybridLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server"; // Schema for logs search parameters diff --git a/apps/webapp/app/routes/api.v1.spaces.ts b/apps/webapp/app/routes/api.v1.spaces.ts index a363482..7a195c2 100644 --- a/apps/webapp/app/routes/api.v1.spaces.ts +++ b/apps/webapp/app/routes/api.v1.spaces.ts @@ -7,7 +7,10 @@ import { SpaceService } from "~/services/space.server"; import { json } from "@remix-run/node"; import { prisma } from "~/db.server"; import { apiCors } from "~/utils/apiCors"; -import { isTriggerDeployment } from "~/lib/queue-adapter.server"; +import { + enqueueSpaceAssignment, + isTriggerDeployment, +} from "~/lib/queue-adapter.server"; const spaceService = new SpaceService(); @@ -74,6 +77,14 @@ const { action } = createHybridActionApiRoute( workspaceId: user.Workspace.id, }); + await enqueueSpaceAssignment({ + userId: user.id, + workspaceId: user.Workspace.id, + mode: "new_space", + newSpaceId: space.id, + batchSize: 25, // Analyze recent statements for the new space + }); + return json({ space, success: true }); } diff --git a/apps/webapp/app/services/bertTopicAnalysis.server.ts b/apps/webapp/app/services/bertTopicAnalysis.server.ts new file mode 100644 index 0000000..27b0dcf --- /dev/null +++ b/apps/webapp/app/services/bertTopicAnalysis.server.ts @@ -0,0 +1,107 @@ +import { prisma } from "~/trigger/utils/prisma"; +import { logger } from "~/services/logger.service"; +import { runQuery } from "~/lib/neo4j.server"; + +interface WorkspaceMetadata { + lastTopicAnalysisAt?: string; + [key: string]: any; +} + +/** + * Check if we should trigger a BERT topic analysis for this workspace + * Criteria: 20+ new episodes since last analysis (or no previous analysis) + */ +export async function shouldTriggerTopicAnalysis( + userId: string, + workspaceId: string, +): Promise { + try { + // Get workspace metadata + const workspace = await prisma.workspace.findUnique({ + where: { id: workspaceId }, + select: { metadata: true }, + }); + + if (!workspace) { + logger.warn(`Workspace not found: ${workspaceId}`); + return false; + } + + const metadata = (workspace.metadata || {}) as WorkspaceMetadata; + const lastAnalysisAt = metadata.lastTopicAnalysisAt; + + // Count episodes since last analysis + const query = lastAnalysisAt + ? ` + MATCH (e:Episode {userId: $userId}) + WHERE e.createdAt > datetime($lastAnalysisAt) + RETURN count(e) as newEpisodeCount + ` + : ` + MATCH (e:Episode {userId: $userId}) + RETURN count(e) as totalEpisodeCount + `; + + const result = await runQuery(query, { + userId, + lastAnalysisAt, + }); + + const episodeCount = lastAnalysisAt + ? result[0]?.get("newEpisodeCount")?.toNumber() || 0 + : result[0]?.get("totalEpisodeCount")?.toNumber() || 0; + + logger.info( + `[Topic Analysis Check] User: ${userId}, New episodes: ${episodeCount}, Last analysis: ${lastAnalysisAt || "never"}`, + ); + + // Trigger if 20+ new episodes + return episodeCount >= 20; + } catch (error) { + logger.error( + `[Topic Analysis Check] Error checking episode count:`, + error, + ); + return false; + } +} + +/** + * Update workspace metadata with last topic analysis timestamp + */ +export async function updateLastTopicAnalysisTime( + workspaceId: string, +): Promise { + try { + const workspace = await prisma.workspace.findUnique({ + where: { id: workspaceId }, + select: { metadata: true }, + }); + + if (!workspace) { + logger.warn(`Workspace not found: ${workspaceId}`); + return; + } + + const metadata = (workspace.metadata || {}) as WorkspaceMetadata; + + await prisma.workspace.update({ + where: { id: workspaceId }, + data: { + metadata: { + ...metadata, + lastTopicAnalysisAt: new Date().toISOString(), + }, + }, + }); + + logger.info( + `[Topic Analysis] Updated last analysis timestamp for workspace: ${workspaceId}`, + ); + } catch (error) { + logger.error( + `[Topic Analysis] Error updating last analysis timestamp:`, + error, + ); + } +} diff --git a/apps/webapp/app/services/clustering.server.ts b/apps/webapp/app/services/clustering.server.ts deleted file mode 100644 index e69de29..0000000 diff --git a/apps/webapp/app/services/graphModels/space.ts b/apps/webapp/app/services/graphModels/space.ts index be0fbfb..054af4e 100644 --- a/apps/webapp/app/services/graphModels/space.ts +++ b/apps/webapp/app/services/graphModels/space.ts @@ -45,6 +45,43 @@ export async function createSpace( }; } +/** + * Get all active spaces for a user + */ +export async function getAllSpacesForUser( + userId: string, +): Promise { + const query = ` + MATCH (s:Space {userId: $userId}) + WHERE s.isActive = true + + // Count episodes assigned to each space + OPTIONAL MATCH (s)-[:HAS_EPISODE]->(e:Episode {userId: $userId}) + + WITH s, count(e) as episodeCount + RETURN s, episodeCount + ORDER BY s.createdAt DESC + `; + + const result = await runQuery(query, { userId }); + + return result.map((record) => { + const spaceData = record.get("s").properties; + const episodeCount = record.get("episodeCount") || 0; + + return { + uuid: spaceData.uuid, + name: spaceData.name, + description: spaceData.description, + userId: spaceData.userId, + createdAt: new Date(spaceData.createdAt), + updatedAt: new Date(spaceData.updatedAt), + isActive: spaceData.isActive, + contextCount: Number(episodeCount), + }; + }); +} + /** * Get a specific space by ID */ diff --git a/apps/webapp/app/services/mcp.server.ts b/apps/webapp/app/services/mcp.server.ts index 3800f60..f44fb54 100644 --- a/apps/webapp/app/services/mcp.server.ts +++ b/apps/webapp/app/services/mcp.server.ts @@ -58,6 +58,7 @@ async function createMcpServer( // Handle memory tools and integration meta-tools if ( name.startsWith("memory_") || + name === "get_session_id" || name === "get_integrations" || name === "get_integration_actions" || name === "execute_integration_action" diff --git a/apps/webapp/app/services/sessionCompaction.server.ts b/apps/webapp/app/services/sessionCompaction.server.ts deleted file mode 100644 index 8d4b36b..0000000 --- a/apps/webapp/app/services/sessionCompaction.server.ts +++ /dev/null @@ -1,262 +0,0 @@ -import { logger } from "~/services/logger.service"; -import { - getCompactedSessionBySessionId, - getCompactionStats, - getSessionEpisodes, - type CompactedSessionNode, -} from "~/services/graphModels/compactedSession"; -import { enqueueSessionCompaction } from "~/lib/queue-adapter.server"; - -/** - * Configuration for session compaction - */ -export const COMPACTION_CONFIG = { - minEpisodesForCompaction: 5, // Minimum episodes to trigger initial compaction - compactionThreshold: 1, // Trigger update after N new episodes - autoCompactionEnabled: true, // Enable automatic compaction -}; - -/** - * SessionCompactionService - Manages session compaction lifecycle - */ -export class SessionCompactionService { - /** - * Check if a session should be compacted - */ - async shouldCompact(sessionId: string, userId: string): Promise<{ - shouldCompact: boolean; - reason: string; - episodeCount?: number; - newEpisodeCount?: number; - }> { - try { - // Get existing compact - const existingCompact = await getCompactedSessionBySessionId(sessionId, userId); - - if (!existingCompact) { - // No compact exists, check if we have enough episodes - const episodeCount = await this.getSessionEpisodeCount(sessionId, userId); - - if (episodeCount >= COMPACTION_CONFIG.minEpisodesForCompaction) { - return { - shouldCompact: true, - reason: "initial_compaction", - episodeCount, - }; - } - - return { - shouldCompact: false, - reason: "insufficient_episodes", - episodeCount, - }; - } - - // Compact exists, check if we have enough new episodes - const newEpisodeCount = await this.getNewEpisodeCount( - sessionId, - userId, - existingCompact.endTime - ); - - if (newEpisodeCount >= COMPACTION_CONFIG.compactionThreshold) { - return { - shouldCompact: true, - reason: "update_compaction", - newEpisodeCount, - }; - } - - return { - shouldCompact: false, - reason: "insufficient_new_episodes", - newEpisodeCount, - }; - } catch (error) { - logger.error(`Error checking if session should compact`, { - sessionId, - userId, - error: error instanceof Error ? error.message : String(error), - }); - - return { - shouldCompact: false, - reason: "error", - }; - } - } - - /** - * Get total episode count for a session - */ - private async getSessionEpisodeCount( - sessionId: string, - userId: string - ): Promise { - const episodes = await getSessionEpisodes(sessionId, userId); - return episodes.length; - } - - /** - * Get count of new episodes since last compaction - */ - private async getNewEpisodeCount( - sessionId: string, - userId: string, - afterTime: Date - ): Promise { - const episodes = await getSessionEpisodes(sessionId, userId, afterTime); - return episodes.length; - } - - /** - * Trigger compaction for a session - */ - async triggerCompaction( - sessionId: string, - userId: string, - source: string, - triggerSource: "auto" | "manual" | "threshold" = "auto" - ): Promise<{ success: boolean; taskId?: string; error?: string }> { - try { - // Check if compaction should be triggered - const check = await this.shouldCompact(sessionId, userId); - - if (!check.shouldCompact) { - logger.info(`Compaction not needed`, { - sessionId, - userId, - reason: check.reason, - }); - - return { - success: false, - error: `Compaction not needed: ${check.reason}`, - }; - } - - // Trigger the compaction task - logger.info(`Triggering session compaction`, { - sessionId, - userId, - source, - triggerSource, - reason: check.reason, - }); - - const handle = await enqueueSessionCompaction({ - userId, - sessionId, - source, - triggerSource, - }); - - logger.info(`Session compaction triggered`, { - sessionId, - userId, - taskId: handle.id, - }); - - return { - success: true, - taskId: handle.id, - }; - } catch (error) { - logger.error(`Failed to trigger compaction`, { - sessionId, - userId, - error: error instanceof Error ? error.message : String(error), - }); - - return { - success: false, - error: error instanceof Error ? error.message : "Unknown error", - }; - } - } - - /** - * Get compacted session for recall - */ - async getCompactForRecall( - sessionId: string, - userId: string - ): Promise { - try { - return await getCompactedSessionBySessionId(sessionId, userId); - } catch (error) { - logger.error(`Error fetching compact for recall`, { - sessionId, - userId, - error: error instanceof Error ? error.message : String(error), - }); - return null; - } - } - - /** - * Get compaction statistics for a user - */ - async getStats(userId: string): Promise<{ - totalCompacts: number; - totalEpisodes: number; - averageCompressionRatio: number; - mostRecentCompaction: Date | null; - }> { - try { - return await getCompactionStats(userId); - } catch (error) { - logger.error(`Error fetching compaction stats`, { - userId, - error: error instanceof Error ? error.message : String(error), - }); - - return { - totalCompacts: 0, - totalEpisodes: 0, - averageCompressionRatio: 0, - mostRecentCompaction: null, - }; - } - } - - /** - * Auto-trigger compaction after episode ingestion - * Called from ingestion pipeline - */ - async autoTriggerAfterIngestion( - sessionId: string | null | undefined, - userId: string, - source: string - ): Promise { - // Skip if no sessionId or auto-compaction disabled - if (!sessionId || !COMPACTION_CONFIG.autoCompactionEnabled) { - return; - } - - try { - const check = await this.shouldCompact(sessionId, userId); - - if (check.shouldCompact) { - logger.info(`Auto-triggering compaction after ingestion`, { - sessionId, - userId, - reason: check.reason, - }); - - // Trigger compaction asynchronously (don't wait) - await this.triggerCompaction(sessionId, userId, source, "auto"); - } - } catch (error) { - // Log error but don't fail ingestion - logger.error(`Error in auto-trigger compaction`, { - sessionId, - userId, - error: error instanceof Error ? error.message : String(error), - }); - } - } -} - -// Singleton instance -export const sessionCompactionService = new SessionCompactionService(); diff --git a/apps/webapp/app/services/space.server.ts b/apps/webapp/app/services/space.server.ts index dcf213b..72d2a25 100644 --- a/apps/webapp/app/services/space.server.ts +++ b/apps/webapp/app/services/space.server.ts @@ -16,8 +16,6 @@ import { updateSpace, } from "./graphModels/space"; import { prisma } from "~/trigger/utils/prisma"; -import { trackFeatureUsage } from "./telemetry.server"; -import { enqueueSpaceAssignment } from "~/lib/queue-adapter.server"; export class SpaceService { /** @@ -65,26 +63,7 @@ export class SpaceService { logger.info(`Created space ${space.id} successfully`); // Track space creation - trackFeatureUsage("space_created", params.userId).catch(console.error); - - // Trigger automatic LLM assignment for the new space - try { - await enqueueSpaceAssignment({ - userId: params.userId, - workspaceId: params.workspaceId, - mode: "new_space", - newSpaceId: space.id, - batchSize: 25, // Analyze recent statements for the new space - }); - - logger.info(`Triggered LLM space assignment for new space ${space.id}`); - } catch (error) { - // Don't fail space creation if LLM assignment fails - logger.warn( - `Failed to trigger LLM assignment for space ${space.id}:`, - error as Record, - ); - } + // trackFeatureUsage("space_created", params.userId).catch(console.error); return space; } @@ -197,9 +176,6 @@ export class SpaceService { logger.info(`Nothing to update to graph`); } - // Track space update - trackFeatureUsage("space_updated", userId).catch(console.error); - logger.info(`Updated space ${spaceId} successfully`); return space; } diff --git a/apps/webapp/app/trigger/bert/topic-analysis.ts b/apps/webapp/app/trigger/bert/topic-analysis.ts new file mode 100644 index 0000000..afba294 --- /dev/null +++ b/apps/webapp/app/trigger/bert/topic-analysis.ts @@ -0,0 +1,53 @@ +import { task } from "@trigger.dev/sdk/v3"; +import { python } from "@trigger.dev/python"; +import { + processTopicAnalysis, + type TopicAnalysisPayload, +} from "~/jobs/bert/topic-analysis.logic"; +import { spaceSummaryTask } from "~/trigger/spaces/space-summary"; + +/** + * Python runner for Trigger.dev using python.runScript + */ +async function runBertWithTriggerPython( + userId: string, + minTopicSize: number, + nrTopics?: number, +): Promise { + const args = [userId, "--json"]; + + if (nrTopics) { + args.push("--nr-topics", String(nrTopics)); + } + + console.log( + `[BERT Topic Analysis] Running with Trigger.dev Python: args=${args.join(" ")}`, + ); + + const result = await python.runScript("./python/main.py", args); + return result.stdout; +} + +/** + * Trigger.dev task for BERT topic analysis + * + * This is a thin wrapper around the common logic in jobs/bert/topic-analysis.logic.ts + */ +export const bertTopicAnalysisTask = task({ + id: "bert-topic-analysis", + queue: { + name: "bert-topic-analysis", + concurrencyLimit: 3, // Max 3 parallel analyses to avoid CPU overload + }, + run: async (payload: TopicAnalysisPayload) => { + return await processTopicAnalysis( + payload, + // Callback to enqueue space summary + async (params) => { + await spaceSummaryTask.trigger(params); + }, + // Python runner for Trigger.dev + runBertWithTriggerPython, + ); + }, +}); diff --git a/apps/webapp/app/trigger/ingest/ingest.ts b/apps/webapp/app/trigger/ingest/ingest.ts index 4a3cd02..a65f672 100644 --- a/apps/webapp/app/trigger/ingest/ingest.ts +++ b/apps/webapp/app/trigger/ingest/ingest.ts @@ -6,6 +6,7 @@ import { } from "~/jobs/ingest/ingest-episode.logic"; import { triggerSpaceAssignment } from "../spaces/space-assignment"; import { triggerSessionCompaction } from "../session/session-compaction"; +import { bertTopicAnalysisTask } from "../bert/topic-analysis"; const ingestionQueue = queue({ name: "ingestion-queue", @@ -32,6 +33,14 @@ export const ingestTask = task({ async (params) => { await triggerSessionCompaction(params); }, + // Callback for BERT topic analysis + async (params) => { + await bertTopicAnalysisTask.trigger(params, { + queue: "bert-topic-analysis", + concurrencyKey: params.userId, + tags: [params.userId, "bert-analysis"], + }); + }, ); }, }); diff --git a/apps/webapp/app/trigger/ingest/retry-no-credits.ts b/apps/webapp/app/trigger/ingest/retry-no-credits.ts index dcc0556..7eab24e 100644 --- a/apps/webapp/app/trigger/ingest/retry-no-credits.ts +++ b/apps/webapp/app/trigger/ingest/retry-no-credits.ts @@ -1,9 +1,9 @@ import { task } from "@trigger.dev/sdk"; import { z } from "zod"; -import { IngestionQueue, IngestionStatus } from "@core/database"; +import { IngestionStatus } from "@core/database"; import { logger } from "~/services/logger.service"; import { prisma } from "../utils/prisma"; -import { IngestBodyRequest, ingestTask } from "./ingest"; +import { type IngestBodyRequest, ingestTask } from "./ingest"; export const RetryNoCreditBodyRequest = z.object({ workspaceId: z.string(), @@ -43,9 +43,7 @@ export const retryNoCreditsTask = task({ }; } - logger.log( - `Found ${noCreditItems.length} NO_CREDITS episodes to retry`, - ); + logger.log(`Found ${noCreditItems.length} NO_CREDITS episodes to retry`); const results = { total: noCreditItems.length, diff --git a/apps/webapp/app/trigger/spaces/space-assignment.ts b/apps/webapp/app/trigger/spaces/space-assignment.ts index 23359d7..bfc815f 100644 --- a/apps/webapp/app/trigger/spaces/space-assignment.ts +++ b/apps/webapp/app/trigger/spaces/space-assignment.ts @@ -1,79 +1,12 @@ import { queue, task } from "@trigger.dev/sdk/v3"; import { logger } from "~/services/logger.service"; -import { SpaceService } from "~/services/space.server"; -import { makeModelCall } from "~/lib/model.server"; -import { createBatch, getBatch } from "~/lib/batch.server"; -import { runQuery } from "~/lib/neo4j.server"; import { - assignEpisodesToSpace, - getSpaceEpisodeCount, -} from "~/services/graphModels/space"; + processSpaceAssignment, + type SpaceAssignmentPayload, +} from "~/jobs/spaces/space-assignment.logic"; import { triggerSpaceSummary } from "./space-summary"; -import { triggerSpacePattern } from "./space-pattern"; -import { - updateMultipleSpaceStatuses, - SPACE_STATUS, -} from "../utils/space-status"; -import type { CoreMessage } from "ai"; -import { z } from "zod"; -import { type Space } from "@prisma/client"; -export interface SpaceAssignmentPayload { - userId: string; - workspaceId: string; - mode: "new_space" | "episode"; - newSpaceId?: string; // For new_space mode - episodeIds?: string[]; // For daily_batch mode (default: 1) - batchSize?: number; // Processing batch size -} - -interface EpisodeData { - uuid: string; - content: string; - originalContent: string; - source: string; - createdAt: Date; - metadata: any; -} - -interface SpaceData { - uuid: string; - name: string; - description?: string; - episodeCount: number; -} - -interface AssignmentResult { - episodeId: string; - spaceIds: string[]; - confidence: number; - reasoning?: string; -} - -const CONFIG = { - newSpaceMode: { - batchSize: 20, - confidenceThreshold: 0.75, // Intent-based threshold for new space creation - useBatchAPI: true, // Use batch API for new space mode - minEpisodesForBatch: 5, // Minimum episodes to use batch API - }, - episodeMode: { - batchSize: 20, - confidenceThreshold: 0.75, // Intent-based threshold for episode assignment - useBatchAPI: true, // Use batch API for episode mode - minEpisodesForBatch: 5, // Minimum episodes to use batch API - }, -}; - -// Zod schema for LLM response validation -const AssignmentResultSchema = z.array( - z.object({ - episodeId: z.string(), - addSpaceId: z.array(z.string()), - confidence: z.number(), - reasoning: z.string(), - }), -); +export type { SpaceAssignmentPayload }; const spaceAssignmentQueue = queue({ name: "space-assignment-queue", @@ -85,1110 +18,22 @@ export const spaceAssignmentTask = task({ queue: spaceAssignmentQueue, maxDuration: 1800, // 15 minutes timeout run: async (payload: SpaceAssignmentPayload) => { - const { - userId, - workspaceId, - mode, - newSpaceId, - episodeIds, - batchSize = mode === "new_space" - ? CONFIG.newSpaceMode.batchSize - : CONFIG.episodeMode.batchSize, - } = payload; - - logger.info(`Starting space assignment`, { - userId, - mode, - newSpaceId, - episodeIds, - batchSize, + logger.info(`[Trigger.dev] Starting space assignment task`, { + userId: payload.userId, + mode: payload.mode, }); - const spaceService = new SpaceService(); - - try { - // 1. Get user's spaces - const spaces = await spaceService.getUserSpaces(userId); - - if (spaces.length === 0) { - logger.info(`No spaces found for user ${userId}, skipping assignment`); - return { - success: true, - message: "No spaces to assign to", - processed: 0, - }; - } - - // 2. Get episodes to analyze based on mode - const episodes = await getEpisodesToAnalyze(userId, mode, { - newSpaceId, - episodeIds, - }); - - if (episodes.length === 0) { - logger.info( - `No episodes to analyze for user ${userId} in ${mode} mode`, - ); - return { - success: true, - message: "No episodes to analyze", - processed: 0, - }; - } - - // 3. Process episodes using batch AI or fallback to sequential - const config = - mode === "new_space" ? CONFIG.newSpaceMode : CONFIG.episodeMode; - // const shouldUseBatchAPI = - // config.useBatchAPI && episodes.length >= config.minEpisodesForBatch; - const shouldUseBatchAPI = true; - - let totalProcessed = 0; - let totalAssignments = 0; - let totalBatches = 0; - const affectedSpaces = new Set(); // Track spaces that received new episodes - - if (shouldUseBatchAPI) { - logger.info( - `Using Batch AI processing for ${episodes.length} episodes`, - { - mode, - userId, - batchSize, - }, - ); - - const batchResult = await processBatchAI( - episodes, - spaces, - userId, - mode, - newSpaceId, - batchSize, - ); - totalProcessed = batchResult.processed; - totalAssignments = batchResult.assignments; - batchResult.affectedSpaces?.forEach((spaceId) => - affectedSpaces.add(spaceId), - ); - } else { - logger.info( - `Using sequential processing for ${episodes.length} episodes (below batch threshold)`, - { - mode, - userId, - minRequired: config.minEpisodesForBatch, - }, - ); - - // Fallback to sequential processing for smaller episode sets - totalBatches = Math.ceil(episodes.length / batchSize); - - for (let i = 0; i < totalBatches; i++) { - const batch = episodes.slice(i * batchSize, (i + 1) * batchSize); - - logger.info( - `Processing batch ${i + 1}/${totalBatches} with ${batch.length} episodes`, - { - mode, - userId, - }, - ); - - const batchResult = await processBatch( - batch, - spaces, - userId, - mode, - newSpaceId, - ); - totalProcessed += batchResult.processed; - totalAssignments += batchResult.assignments; - batchResult.affectedSpaces?.forEach((spaceId) => - affectedSpaces.add(spaceId), - ); - - // Add delay between batches to avoid rate limiting - if (i < totalBatches - 1) { - await new Promise((resolve) => setTimeout(resolve, 1000)); - } - } - } - - logger.info(`Completed LLM space assignment`, { - userId, - mode, - totalProcessed, - totalAssignments, - spacesAvailable: spaces.length, - affectedSpaces: affectedSpaces.size, - }); - - // 4. Update space status to "processing" for affected spaces - if (affectedSpaces.size > 0) { - try { - await updateMultipleSpaceStatuses( - Array.from(affectedSpaces), - SPACE_STATUS.PROCESSING, - { - userId, - operation: "space-assignment", - metadata: { mode, phase: "start_processing" }, - }, - ); - } catch (statusError) { - logger.warn(`Failed to update space statuses to processing:`, { - error: statusError, - userId, - mode, - }); - } - } - - // 5. Trigger space summaries for affected spaces (fan-out pattern) - if (affectedSpaces.size > 0) { - try { - logger.info( - `Triggering space summaries for ${affectedSpaces.size} affected spaces in parallel`, - ); - - // Fan out to multiple parallel triggers - const summaryPromises = Array.from(affectedSpaces).map((spaceId) => - triggerSpaceSummary({ - userId, - workspaceId, - spaceId, - triggerSource: "assignment", - }).catch((error) => { - logger.warn(`Failed to trigger summary for space ${spaceId}:`, { - error, - }); - return { success: false, spaceId, error: error.message }; - }), - ); - - const summaryResults = await Promise.allSettled(summaryPromises); - const successful = summaryResults.filter( - (r) => r.status === "fulfilled", - ).length; - const failed = summaryResults.filter( - (r) => r.status === "rejected", - ).length; - - logger.info(`Space summary triggers completed`, { - userId, - mode, - totalSpaces: affectedSpaces.size, - successful, - failed, - }); - } catch (summaryError) { - // Don't fail the assignment if summary generation fails - logger.warn(`Failed to trigger space summaries after assignment:`, { - error: summaryError, - userId, - mode, - affectedSpaces: Array.from(affectedSpaces), - }); - } - } - - // 6. Update space status to "ready" after all processing is complete - if (affectedSpaces.size > 0) { - try { - await updateMultipleSpaceStatuses( - Array.from(affectedSpaces), - SPACE_STATUS.READY, - { - userId, - operation: "space-assignment", - metadata: { mode, phase: "completed_processing" }, - }, - ); - } catch (finalStatusError) { - logger.warn(`Failed to update space statuses to ready:`, { - error: finalStatusError, - userId, - mode, - }); - } - } - - return { - success: true, - mode, - processed: totalProcessed, - assignments: totalAssignments, - batches: totalBatches, - spacesAvailable: spaces.length, - affectedSpaces: affectedSpaces.size, - summaryTriggered: affectedSpaces.size > 0, - patternCheckTriggered: affectedSpaces.size > 0, - }; - } catch (error) { - logger.error( - `Error in LLM space assignment for user ${userId}:`, - error as Record, - ); - throw error; - } + // Use common business logic with callback for triggering space summaries + return await processSpaceAssignment( + payload, + // Callback to enqueue space summary + async (summaryPayload) => { + return await triggerSpaceSummary(summaryPayload); + }, + ); }, }); -async function getEpisodesToAnalyze( - userId: string, - mode: "new_space" | "episode", - options: { newSpaceId?: string; episodeIds?: string[] }, -): Promise { - let query: string; - let params: any = { userId }; - - if (mode === "new_space") { - // For new space: analyze all recent episodes - query = ` - MATCH (e:Episode {userId: $userId}) - RETURN e - ORDER BY e.createdAt DESC - LIMIT 1000 - `; - } else { - // For episode mode: analyze specific episodes - query = ` - UNWIND $episodeIds AS episodeId - MATCH (e:Episode {uuid: episodeId, userId: $userId}) - RETURN e - ORDER BY e.createdAt DESC - `; - params.episodeIds = options.episodeIds; - } - - const result = await runQuery(query, params); - - return result.map((record) => { - const episode = record.get("e").properties; - return { - uuid: episode.uuid, - content: episode.content, - originalContent: episode.originalContent, - source: episode.source, - createdAt: new Date(episode.createdAt), - metadata: JSON.parse(episode.metadata || "{}"), - }; - }); -} - -async function processBatchAI( - episodes: EpisodeData[], - spaces: Space[], - userId: string, - mode: "new_space" | "episode", - newSpaceId?: string, - batchSize: number = 50, -): Promise<{ - processed: number; - assignments: number; - affectedSpaces?: string[]; -}> { - try { - // Create batches of episodes - const episodeBatches: EpisodeData[][] = []; - for (let i = 0; i < episodes.length; i += batchSize) { - episodeBatches.push(episodes.slice(i, i + batchSize)); - } - - logger.info( - `Creating ${episodeBatches.length} batch AI requests for ${episodes.length} episodes`, - ); - - // Create batch requests with prompts - const batchRequests = await Promise.all( - episodeBatches.map(async (batch, index) => { - const promptMessages = await createLLMPrompt( - batch, - spaces, - mode, - newSpaceId, - userId, - ); - const systemPrompt = - promptMessages.find((m) => m.role === "system")?.content || ""; - const userPrompt = - promptMessages.find((m) => m.role === "user")?.content || ""; - - return { - customId: `episode-space-assignment-${userId}-${mode}-${index}`, - messages: [{ role: "user" as const, content: userPrompt }], - systemPrompt, - }; - }), - ); - - // Submit batch to AI provider - const { batchId } = await createBatch({ - requests: batchRequests, - outputSchema: AssignmentResultSchema, - maxRetries: 3, - timeoutMs: 1200000, // 10 minutes timeout - }); - - logger.info(`Batch AI job created: ${batchId}`, { - userId, - mode, - batchRequests: batchRequests.length, - }); - - // Poll for completion with improved handling - const maxPollingTime = 1200000; // 13 minutes - const pollInterval = 5000; // 5 seconds - const startTime = Date.now(); - - let batch = await getBatch({ batchId }); - - while (batch.status === "processing" || batch.status === "pending") { - const elapsed = Date.now() - startTime; - - if (elapsed > maxPollingTime) { - logger.warn( - `Batch AI job timed out after ${elapsed}ms, processing partial results`, - { - batchId, - status: batch.status, - completed: batch.completedRequests, - total: batch.totalRequests, - failed: batch.failedRequests, - }, - ); - break; // Exit loop to process any available results - } - - logger.info(`Batch AI job status: ${batch.status}`, { - batchId, - completed: batch.completedRequests, - total: batch.totalRequests, - failed: batch.failedRequests, - elapsed: elapsed, - }); - - await new Promise((resolve) => setTimeout(resolve, pollInterval)); - batch = await getBatch({ batchId }); - } - - // Handle different completion scenarios - if (batch.status === "failed") { - logger.error(`Batch AI job failed completely`, { - batchId, - status: batch.status, - }); - throw new Error(`Batch AI job failed with status: ${batch.status}`); - } - - // Log final status regardless of completion state - logger.info(`Batch AI job processing finished`, { - batchId, - status: batch.status, - completed: batch.completedRequests, - total: batch.totalRequests, - failed: batch.failedRequests, - }); - - if (!batch.results || batch.results.length === 0) { - logger.warn(`No results returned from batch AI job ${batchId}`, { - status: batch.status, - completed: batch.completedRequests, - failed: batch.failedRequests, - }); - - // If we have no results but some requests failed, fall back to sequential processing - if (batch.failedRequests && batch.failedRequests > 0) { - logger.info( - `Falling back to sequential processing due to batch failures`, - ); - return await processBatch(episodes, spaces, userId, mode, newSpaceId); - } - - return { processed: episodes.length, assignments: 0 }; - } - - logger.info(`Processing batch results`, { - batchId, - status: batch.status, - resultsCount: batch.results.length, - totalRequests: batch.totalRequests, - completedRequests: batch.completedRequests, - failedRequests: batch.failedRequests, - }); - - // Process all batch results - let totalAssignments = 0; - const affectedSpaces = new Set(); - const confidenceThreshold = - mode === "new_space" - ? CONFIG.newSpaceMode.confidenceThreshold - : CONFIG.episodeMode.confidenceThreshold; - - for (const result of batch.results) { - if (result.error) { - logger.warn(`Batch AI request ${result.customId} failed:`, { - error: result.error, - }); - continue; - } - - if (!result.response) { - logger.warn(`No response from batch AI request ${result.customId}`); - continue; - } - - // Parse assignments from this batch result - let assignments: AssignmentResult[] = []; - try { - // Extract episode batch info from customId - const batchIndexMatch = result.customId.match(/-(\d+)$/); - const batchIndex = batchIndexMatch ? parseInt(batchIndexMatch[1]) : 0; - const episodeBatch = episodeBatches[batchIndex]; - - if (Array.isArray(result.response)) { - // Handle direct array response (from structured output) - assignments = result.response.map((a) => ({ - episodeId: a.episodeId, - spaceIds: a.addSpaceId || [], - confidence: a.confidence || 0.75, - reasoning: a.reasoning, - })); - } else if (typeof result.response === "string") { - // Parse from text response with tags (fallback for non-structured output) - assignments = parseLLMResponseWithTags( - result.response, - episodeBatch, - spaces, - ); - } else if (typeof result.response === "object" && result.response) { - // Handle object response that might contain the array directly - try { - let responseData = result.response; - if (responseData.results && Array.isArray(responseData.results)) { - responseData = responseData.results; - } - - if (Array.isArray(responseData)) { - assignments = responseData.map((a) => ({ - episodeId: a.episodeId, - spaceIds: a.addSpaceId || [], - confidence: a.confidence || 0.75, - reasoning: a.reasoning, - })); - } else { - // Fallback parsing - assignments = parseLLMResponse( - JSON.stringify(result.response), - episodeBatch, - spaces, - ); - } - } catch (parseError) { - logger.error( - `Error processing object response ${result.customId}:`, - { error: parseError }, - ); - assignments = []; - } - } else { - // Fallback parsing - assignments = parseLLMResponse( - JSON.stringify(result.response), - episodeBatch, - spaces, - ); - } - } catch (parseError) { - logger.error(`Error parsing batch result ${result.customId}:`, { - error: parseError, - }); - continue; - } - - // Group episodes by space for batch assignment - const spaceToEpisodes = new Map(); - - for (const assignment of assignments) { - if ( - assignment.spaceIds.length > 0 && - assignment.confidence >= confidenceThreshold - ) { - for (const spaceId of assignment.spaceIds) { - if (!spaceToEpisodes.has(spaceId)) { - spaceToEpisodes.set(spaceId, []); - } - spaceToEpisodes.get(spaceId)!.push(assignment.episodeId); - } - } - } - - // Apply batch assignments - one call per space - for (const [spaceId, episodeIds] of spaceToEpisodes) { - try { - const assignmentResult = await assignEpisodesToSpace( - episodeIds, - spaceId, - userId, - ); - - if (assignmentResult.success) { - totalAssignments += episodeIds.length; - affectedSpaces.add(spaceId); - logger.info( - `Batch AI assigned ${episodeIds.length} episodes to space ${spaceId}`, - { - episodeIds, - mode, - batchId: result.customId, - }, - ); - } - } catch (error) { - logger.warn( - `Failed to assign ${episodeIds.length} episodes to space ${spaceId}:`, - { error, episodeIds }, - ); - } - } - } - - // Log final batch processing results - logger.info(`Batch AI processing completed`, { - batchId, - totalEpisodes: episodes.length, - processedBatches: batch.results.length, - totalAssignments, - affectedSpaces: affectedSpaces.size, - completedRequests: batch.completedRequests, - failedRequests: batch.failedRequests || 0, - }); - - // If we have significant failures, consider fallback processing for remaining episodes - const failureRate = batch.failedRequests - ? batch.failedRequests / batch.totalRequests - : 0; - if (failureRate > 0.5) { - // If more than 50% failed - logger.warn( - `High failure rate (${Math.round(failureRate * 100)}%) in batch processing, consider reviewing prompts or input quality`, - ); - } - - return { - processed: episodes.length, - assignments: totalAssignments, - affectedSpaces: Array.from(affectedSpaces), - }; - } catch (error) { - logger.error("Error in Batch AI processing:", { error }); - throw error; - } -} - -async function processBatch( - episodes: EpisodeData[], - spaces: Space[], - userId: string, - mode: "new_space" | "episode", - newSpaceId?: string, -): Promise<{ - processed: number; - assignments: number; - affectedSpaces?: string[]; -}> { - try { - // Create the LLM prompt based on mode - const prompt = await createLLMPrompt( - episodes, - spaces, - mode, - newSpaceId, - userId, - ); - - // Episode-intent matching is MEDIUM complexity (semantic analysis with intent alignment) - let responseText = ""; - await makeModelCall( - false, - prompt, - (text: string) => { - responseText = text; - }, - undefined, - "high", - ); - - // Response text is now set by the callback - - // Parse LLM response - const assignments = parseLLMResponseWithTags( - responseText, - episodes, - spaces, - ); - - // Apply assignments - let totalAssignments = 0; - const affectedSpaces = new Set(); - const confidenceThreshold = - mode === "new_space" - ? CONFIG.newSpaceMode.confidenceThreshold - : CONFIG.episodeMode.confidenceThreshold; - - for (const assignment of assignments) { - if ( - assignment.spaceIds.length > 0 && - assignment.confidence >= confidenceThreshold - ) { - // Assign to each space individually to track metadata properly - for (const spaceId of assignment.spaceIds) { - try { - const result = await assignEpisodesToSpace( - [assignment.episodeId], - spaceId, - userId, - ); - - if (result.success) { - totalAssignments++; - affectedSpaces.add(spaceId); - - logger.info( - `LLM assigned episode ${assignment.episodeId} to space ${spaceId}`, - { - confidence: assignment.confidence, - reasoning: assignment.reasoning || "No reasoning", - mode, - } as Record, - ); - } - } catch (error) { - logger.warn( - `Failed to assign episode ${assignment.episodeId} to space ${spaceId}:`, - error as Record, - ); - } - } - } - } - - return { - processed: episodes.length, - assignments: totalAssignments, - affectedSpaces: Array.from(affectedSpaces), - }; - } catch (error) { - logger.error("Error processing batch:", error as Record); - return { processed: 0, assignments: 0, affectedSpaces: [] }; - } -} - -async function createLLMPrompt( - episodes: EpisodeData[], - spaces: Space[], - mode: "new_space" | "episode", - newSpaceId?: string, - userId?: string, -): Promise { - const episodesDescription = episodes - .map( - (ep) => - `ID: ${ep.uuid}\nCONTENT: ${ep.content}\nSOURCE: ${ep.source}\nMETADATA: ${JSON.stringify(ep.metadata)}`, - ) - .join("\n\n"); - - // Get enhanced space information with episode counts - const enhancedSpaces = await Promise.all( - spaces.map(async (space) => { - const currentCount = userId - ? await getSpaceEpisodeCount(space.id, userId) - : 0; - return { - ...space, - currentEpisodeCount: currentCount, - }; - }), - ); - - if (mode === "new_space" && newSpaceId) { - // Focus on the new space for assignment - const newSpace = enhancedSpaces.find((s) => s.id === newSpaceId); - if (!newSpace) { - throw new Error(`New space ${newSpaceId} not found`); - } - - return [ - { - role: "system", - content: `You are analyzing episodes for assignment to a newly created space based on the space's intent and purpose. - -CORE PRINCIPLE: Match episodes based on WHAT THE EPISODE IS FUNDAMENTALLY ABOUT (its primary subject), not just keyword overlap. - -STEP-BY-STEP FILTERING PROCESS: - -Step 1: IDENTIFY PRIMARY SUBJECT -Ask: "Who or what is this episode fundamentally about?" -- Is it about a specific person? (by name, or "I"/"my" = speaker) -- Is it about a system, tool, or organization? -- Is it about a project, event, or activity? -- Is it about a concept, topic, or idea? - -Step 2: HANDLE IMPLICIT SUBJECTS -- "I prefer..." or "My..." β†’ Subject is the SPEAKER (check episode source/metadata for identity) -- "User discussed..." or "Person X said..." β†’ Subject is that specific person -- "We decided..." β†’ Subject is the group/team/project being discussed -- If unclear, identify from context clues in the episode content - -Step 3: CHECK SUBJECT ALIGNMENT -Does the PRIMARY SUBJECT match what the space is about? -- Match the subject identity (right person/thing/concept?) -- Match the subject relationship (is episode ABOUT the subject or just MENTIONING it?) -- Match the intent purpose (does episode serve the space's purpose?) -- Check scope constraints: If space description includes scope requirements (e.g., "cross-context", "not app-specific", "broadly useful", "stable for 3+ months"), verify episode meets those constraints - -Step 4: DISTINGUISH SUBJECT vs META -Ask: "Is this episode ABOUT the subject itself, or ABOUT discussing/analyzing the subject?" -- ABOUT subject: Episode contains actual content related to subject -- META-discussion: Episode discusses how to handle/analyze/organize the subject -- Only assign if episode is ABOUT the subject, not meta-discussion - -Step 5: VERIFY CONFIDENCE -Only assign if confidence >= 0.75 based on: -- Subject identity clarity (is subject clearly identified?) -- Subject alignment strength (how well does it match space intent?) -- Content relevance (does episode content serve space purpose?) - -CRITICAL RULE: PRIMARY SUBJECT MATCHING -The episode's PRIMARY SUBJECT must match the space's target subject. -- If space is about Person A, episodes about Person B should NOT match (even if same topic) -- If space is about a specific concept, meta-discussions about that concept should NOT match -- If space is about actual behaviors/facts, process discussions about organizing those facts should NOT match - -EXAMPLES OF CORRECT FILTERING: - -Example 1 - Person Identity: -Space: "Alex's work preferences" -Episode A: "I prefer morning meetings and async updates" (speaker: Alex) β†’ ASSIGN βœ… (primary subject: Alex's preferences) -Episode B: "Jordan prefers afternoon meetings" (speaker: System) β†’ DO NOT ASSIGN ❌ (primary subject: Jordan, not Alex) - -Example 2 - Meta vs Actual: -Space: "Recipe collection" -Episode A: "My lasagna recipe: 3 layers pasta, bΓ©chamel, meat sauce..." β†’ ASSIGN βœ… (primary subject: actual recipe) -Episode B: "We should organize recipes by cuisine type" β†’ DO NOT ASSIGN ❌ (primary subject: organizing system, not recipe) - -Example 3 - Keyword Overlap Without Subject Match: -Space: "Home renovation project" -Episode A: "Installed new kitchen cabinets, chose oak wood" β†’ ASSIGN βœ… (primary subject: home renovation) -Episode B: "Friend asked advice about their kitchen renovation" β†’ DO NOT ASSIGN ❌ (primary subject: friend's project, not this home) - -Example 4 - Scope Constraints: -Space: "Personal identity and preferences (broadly useful across contexts, not app-specific)" -Episode A: "I prefer async communication and morning work hours" β†’ ASSIGN βœ… (cross-context preference, broadly applicable) -Episode B: "Demonstrated knowledge of ProjectX technical stack" β†’ DO NOT ASSIGN ❌ (work/project knowledge, not personal identity) - -RESPONSE FORMAT: -Provide your response inside tags with a valid JSON array: - - -[ - { - "episodeId": "episode-uuid", - "addSpaceId": ["${newSpaceId}"], - "confidence": 0.75, - "reasoning": "Brief explanation of intent match" - } -] - - -IMPORTANT: If an episode doesn't align with the space's intent, use empty addSpaceId array: [] -Example: {"episodeId": "ep-123", "addSpaceId": [], "confidence": 0.0, "reasoning": "No intent alignment"}`, - }, - { - role: "user", - content: `NEW SPACE TO POPULATE: -Name: ${newSpace.name} -Intent/Purpose: ${newSpace.description || "No description"} -Current Episodes: ${newSpace.currentEpisodeCount} - -EPISODES TO EVALUATE: -${episodesDescription} - -ASSIGNMENT TASK: -For each episode above, follow the step-by-step process to determine if it should be assigned to this space. - -Remember: -1. Identify the PRIMARY SUBJECT of each episode (who/what is it about?) -2. Check if that PRIMARY SUBJECT matches what this space is about -3. If the episode is ABOUT something else (even if it mentions related keywords), do NOT assign -4. If the episode is a META-discussion about the space's topic (not actual content), do NOT assign -5. Only assign if the episode's primary subject aligns with the space's intent AND confidence >= 0.75 - -Provide your analysis and assignments using the specified JSON format.`, - }, - ]; - } else { - // Episode mode - consider all spaces - const spacesDescription = enhancedSpaces - .map((space) => { - const spaceInfo = [ - `- ${space.name} (${space.id})`, - ` Intent/Purpose: ${space.description || "No description"}`, - ` Current Episodes: ${space.currentEpisodeCount}`, - ]; - - if (space.summary) { - spaceInfo.push(` Summary: ${space.summary}`); - } - - return spaceInfo.join("\n"); - }) - .join("\n\n"); - - return [ - { - role: "system", - content: `You are an expert at organizing episodes into semantic spaces based on the space's intent and purpose. - -CORE PRINCIPLE: Match episodes based on WHAT THE EPISODE IS FUNDAMENTALLY ABOUT (its primary subject), not just keyword overlap. - -STEP-BY-STEP FILTERING PROCESS: - -Step 1: IDENTIFY PRIMARY SUBJECT -Ask: "Who or what is this episode fundamentally about?" -- Is it about a specific person? (by name, or "I"/"my" = speaker) -- Is it about a system, tool, or organization? -- Is it about a project, event, or activity? -- Is it about a concept, topic, or idea? - -Step 2: HANDLE IMPLICIT SUBJECTS -- "I prefer..." or "My..." β†’ Subject is the SPEAKER (check episode source/metadata for identity) -- "User discussed..." or "Person X said..." β†’ Subject is that specific person -- "We decided..." β†’ Subject is the group/team/project being discussed -- If unclear, identify from context clues in the episode content - -Step 3: CHECK SUBJECT ALIGNMENT WITH EACH SPACE -For each available space, does the episode's PRIMARY SUBJECT match what that space is about? -- Match the subject identity (right person/thing/concept?) -- Match the subject relationship (is episode ABOUT the subject or just MENTIONING it?) -- Match the intent purpose (does episode serve the space's purpose?) -- An episode can match multiple spaces if its primary subject serves multiple intents - -Step 4: DISTINGUISH SUBJECT vs META -Ask: "Is this episode ABOUT the subject itself, or ABOUT discussing/analyzing the subject?" -- ABOUT subject: Episode contains actual content related to subject -- META-discussion: Episode discusses how to handle/analyze/organize the subject -- Only assign if episode is ABOUT the subject, not meta-discussion - -Step 5: VERIFY CONFIDENCE -Only assign to a space if confidence >= 0.75 based on: -- Subject identity clarity (is subject clearly identified?) -- Subject alignment strength (how well does it match space intent?) -- Content relevance (does episode content serve space purpose?) - -Step 6: MULTI-SPACE ASSIGNMENT -- An episode can belong to multiple spaces if its primary subject serves multiple intents -- Each space assignment should meet the >= 0.75 confidence threshold independently -- If no spaces match, use empty addSpaceId: [] - -CRITICAL RULE: PRIMARY SUBJECT MATCHING -The episode's PRIMARY SUBJECT must match the space's target subject. -- If space is about Person A, episodes about Person B should NOT match (even if same topic) -- If space is about a specific concept, meta-discussions about that concept should NOT match -- If space is about actual behaviors/facts, process discussions about organizing those facts should NOT match - -EXAMPLES OF CORRECT FILTERING: - -Example 1 - Person Identity: -Space: "Alex's work preferences" -Episode A: "I prefer morning meetings and async updates" (speaker: Alex) β†’ ASSIGN βœ… (primary subject: Alex's preferences) -Episode B: "Jordan prefers afternoon meetings" (speaker: System) β†’ DO NOT ASSIGN ❌ (primary subject: Jordan, not Alex) - -Example 2 - Meta vs Actual: -Space: "Recipe collection" -Episode A: "My lasagna recipe: 3 layers pasta, bΓ©chamel, meat sauce..." β†’ ASSIGN βœ… (primary subject: actual recipe) -Episode B: "We should organize recipes by cuisine type" β†’ DO NOT ASSIGN ❌ (primary subject: organizing system, not recipe) - -Example 3 - Keyword Overlap Without Subject Match: -Space: "Home renovation project" -Episode A: "Installed new kitchen cabinets, chose oak wood" β†’ ASSIGN βœ… (primary subject: home renovation) -Episode B: "Friend asked advice about their kitchen renovation" β†’ DO NOT ASSIGN ❌ (primary subject: friend's project, not this home) - -Example 4 - Scope Constraints: -Space: "Personal identity and preferences (broadly useful across contexts, not app-specific)" -Episode A: "I prefer async communication and morning work hours" β†’ ASSIGN βœ… (cross-context preference, broadly applicable) -Episode B: "I format task titles as {verb}: {title} in TaskApp" β†’ DO NOT ASSIGN ❌ (app-specific behavior, fails "not app-specific" constraint) -Episode C: "Demonstrated knowledge of ProjectX technical stack" β†’ DO NOT ASSIGN ❌ (work/project knowledge, not personal identity) - -RESPONSE FORMAT: -Provide your response inside tags with a valid JSON array: - - -[ - { - "episodeId": "episode-uuid", - "addSpaceId": ["space-uuid1", "space-uuid2"], - "confidence": 0.75, - "reasoning": "Brief explanation of intent match" - } -] - - -IMPORTANT: If no spaces' intents align with an episode, use empty addSpaceId array: [] -Example: {"episodeId": "ep-123", "addSpaceId": [], "confidence": 0.0, "reasoning": "No matching space intent"}`, - }, - { - role: "user", - content: `AVAILABLE SPACES (with their intents/purposes): -${spacesDescription} - -EPISODES TO ORGANIZE: -${episodesDescription} - -ASSIGNMENT TASK: -For each episode above, follow the step-by-step process to determine which space(s) it should be assigned to. - -Remember: -1. Identify the PRIMARY SUBJECT of each episode (who/what is it about?) -2. Check if that PRIMARY SUBJECT matches what each space is about -3. If the episode is ABOUT something else (even if it mentions related keywords), do NOT assign to that space -4. If the episode is a META-discussion about a space's topic (not actual content), do NOT assign to that space -5. An episode can be assigned to multiple spaces if its primary subject serves multiple intents -6. Only assign if the episode's primary subject aligns with the space's intent AND confidence >= 0.75 for that space - -Provide your analysis and assignments using the specified JSON format.`, - }, - ]; - } -} - -function parseLLMResponseWithTags( - response: string, - episodes: EpisodeData[], - spaces: Space[], -): AssignmentResult[] { - try { - // Extract content from tags - const outputMatch = response.match(/([\s\S]*?)<\/output>/); - if (!outputMatch) { - logger.warn( - "No tags found in LLM response, falling back to full response parsing", - ); - return parseLLMResponse(response, episodes, spaces); - } - - const jsonContent = outputMatch[1].trim(); - const parsed = JSON.parse(jsonContent); - - if (!Array.isArray(parsed)) { - logger.warn( - "Invalid LLM response format - expected array in tags", - ); - return []; - } - - const validSpaceIds = new Set(spaces.map((s) => s.id)); - const validEpisodeIds = new Set(episodes.map((e) => e.uuid)); - - return parsed - .filter((assignment: any) => { - // Validate assignment structure - if ( - !assignment.episodeId || - !validEpisodeIds.has(assignment.episodeId) - ) { - return false; - } - - // Validate spaceIds array - if (!assignment.addSpaceId || !Array.isArray(assignment.addSpaceId)) { - assignment.addSpaceId = []; - } - - // Filter out invalid space IDs - assignment.addSpaceId = assignment.addSpaceId.filter( - (spaceId: string) => validSpaceIds.has(spaceId), - ); - - return true; - }) - .map((assignment: any) => ({ - episodeId: assignment.episodeId, - spaceIds: assignment.addSpaceId, - confidence: assignment.confidence || 0.75, - reasoning: assignment.reasoning, - })); - } catch (error) { - logger.error( - "Error parsing LLM response with tags:", - error as Record, - ); - logger.debug("Raw LLM response:", { response } as Record); - // Fallback to regular parsing - return parseLLMResponse(response, episodes, spaces); - } -} - -function parseLLMResponse( - response: string, - episodes: EpisodeData[], - spaces: Space[], -): AssignmentResult[] { - try { - // Clean the response - remove any markdown formatting - const cleanedResponse = response - .replace(/```json\n?/g, "") - .replace(/```\n?/g, "") - .trim(); - - const parsed = JSON.parse(cleanedResponse); - - if (!parsed.assignments || !Array.isArray(parsed.assignments)) { - logger.warn("Invalid LLM response format - no assignments array"); - return []; - } - - const validSpaceIds = new Set(spaces.map((s) => s.id)); - const validEpisodeIds = new Set(episodes.map((e) => e.uuid)); - - return parsed.assignments - .filter((assignment: any) => { - // Validate assignment structure - if ( - !assignment.episodeId || - !validEpisodeIds.has(assignment.episodeId) - ) { - return false; - } - - if (!assignment.spaceIds || !Array.isArray(assignment.spaceIds)) { - return false; - } - - // Filter out invalid space IDs - assignment.spaceIds = assignment.spaceIds.filter((spaceId: string) => - validSpaceIds.has(spaceId), - ); - - return true; - }) - .map((assignment: any) => ({ - episodeId: assignment.episodeId, - spaceIds: assignment.spaceIds, - confidence: assignment.confidence || 0.75, - reasoning: assignment.reasoning, - })); - } catch (error) { - logger.error( - "Error parsing LLM response:", - error as Record, - ); - logger.debug("Raw LLM response:", { response } as Record); - return []; - } -} - // Helper function to trigger the task export async function triggerSpaceAssignment(payload: SpaceAssignmentPayload) { return await spaceAssignmentTask.trigger(payload, { diff --git a/apps/webapp/app/trigger/spaces/space-pattern.ts b/apps/webapp/app/trigger/spaces/space-pattern.ts deleted file mode 100644 index 89a6263..0000000 --- a/apps/webapp/app/trigger/spaces/space-pattern.ts +++ /dev/null @@ -1,557 +0,0 @@ -import { task } from "@trigger.dev/sdk/v3"; -import { logger } from "~/services/logger.service"; -import { makeModelCall } from "~/lib/model.server"; -import { runQuery } from "~/lib/neo4j.server"; -import type { CoreMessage } from "ai"; -import { z } from "zod"; -import { - EXPLICIT_PATTERN_TYPES, - IMPLICIT_PATTERN_TYPES, - type SpacePattern, - type PatternDetectionResult, -} from "@core/types"; -import { createSpacePattern, getSpace } from "../utils/space-utils"; - -interface SpacePatternPayload { - userId: string; - workspaceId: string; - spaceId: string; - triggerSource?: - | "summary_complete" - | "manual" - | "assignment" - | "scheduled" - | "new_space" - | "growth_threshold" - | "ingestion_complete"; -} - -interface SpaceStatementData { - uuid: string; - fact: string; - subject: string; - predicate: string; - object: string; - createdAt: Date; - validAt: Date; - content?: string; // For implicit pattern analysis -} - -interface SpaceThemeData { - themes: string[]; - summary: string; -} - -// Zod schemas for LLM response validation -const ExplicitPatternSchema = z.object({ - name: z.string(), - type: z.string(), - summary: z.string(), - evidence: z.array(z.string()), - confidence: z.number().min(0).max(1), -}); - -const ImplicitPatternSchema = z.object({ - name: z.string(), - type: z.string(), - summary: z.string(), - evidence: z.array(z.string()), - confidence: z.number().min(0).max(1), -}); - -const PatternAnalysisSchema = z.object({ - explicitPatterns: z.array(ExplicitPatternSchema), - implicitPatterns: z.array(ImplicitPatternSchema), -}); - -const CONFIG = { - minStatementsForPatterns: 5, - maxPatternsPerSpace: 20, - minPatternConfidence: 0.85, -}; - -export const spacePatternTask = task({ - id: "space-pattern", - run: async (payload: SpacePatternPayload) => { - const { userId, workspaceId, spaceId, triggerSource = "manual" } = payload; - - logger.info(`Starting space pattern detection`, { - userId, - workspaceId, - spaceId, - triggerSource, - }); - - try { - // Get space data and check if it has enough content - const space = await getSpaceForPatternAnalysis(spaceId); - if (!space) { - return { - success: false, - spaceId, - error: "Space not found or insufficient data", - }; - } - - // Get statements for pattern analysis - const statements = await getSpaceStatementsForPatterns(spaceId, userId); - - if (statements.length < CONFIG.minStatementsForPatterns) { - logger.info( - `Space ${spaceId} has insufficient statements (${statements.length}) for pattern detection`, - ); - return { - success: true, - spaceId, - triggerSource, - patterns: { - explicitPatterns: [], - implicitPatterns: [], - totalPatternsFound: 0, - }, - }; - } - - // Detect patterns - const patternResult = await detectSpacePatterns(space, statements); - - if (patternResult) { - // Store patterns - await storePatterns( - patternResult.explicitPatterns, - patternResult.implicitPatterns, - spaceId, - ); - - logger.info(`Generated patterns for space ${spaceId}`, { - explicitPatterns: patternResult.explicitPatterns.length, - implicitPatterns: patternResult.implicitPatterns.length, - totalPatterns: patternResult.totalPatternsFound, - triggerSource, - }); - - return { - success: true, - spaceId, - triggerSource, - patterns: { - explicitPatterns: patternResult.explicitPatterns.length, - implicitPatterns: patternResult.implicitPatterns.length, - totalPatternsFound: patternResult.totalPatternsFound, - }, - }; - } else { - logger.warn(`Failed to detect patterns for space ${spaceId}`); - return { - success: false, - spaceId, - triggerSource, - error: "Failed to detect patterns", - }; - } - } catch (error) { - logger.error( - `Error in space pattern detection for space ${spaceId}:`, - error as Record, - ); - throw error; - } - }, -}); - -async function getSpaceForPatternAnalysis( - spaceId: string, -): Promise { - try { - const space = await getSpace(spaceId); - - if (!space || !space.themes || space.themes.length === 0) { - logger.warn( - `Space ${spaceId} not found or has no themes for pattern analysis`, - ); - return null; - } - - return { - themes: space.themes, - summary: space.summary || "", - }; - } catch (error) { - logger.error( - `Error getting space for pattern analysis:`, - error as Record, - ); - return null; - } -} - -async function getSpaceStatementsForPatterns( - spaceId: string, - userId: string, -): Promise { - const query = ` - MATCH (s:Statement) - WHERE s.userId = $userId - AND s.spaceIds IS NOT NULL - AND $spaceId IN s.spaceIds - AND s.invalidAt IS NULL - MATCH (s)-[:HAS_SUBJECT]->(subj:Entity) - MATCH (s)-[:HAS_PREDICATE]->(pred:Entity) - MATCH (s)-[:HAS_OBJECT]->(obj:Entity) - RETURN s, subj.name as subject, pred.name as predicate, obj.name as object - ORDER BY s.createdAt DESC - `; - - const result = await runQuery(query, { - spaceId, - userId, - }); - - return result.map((record) => { - const statement = record.get("s").properties; - return { - uuid: statement.uuid, - fact: statement.fact, - subject: record.get("subject"), - predicate: record.get("predicate"), - object: record.get("object"), - createdAt: new Date(statement.createdAt), - validAt: new Date(statement.validAt), - content: statement.fact, // Use fact as content for implicit analysis - }; - }); -} - -async function detectSpacePatterns( - space: SpaceThemeData, - statements: SpaceStatementData[], -): Promise { - try { - // Extract explicit patterns from themes - const explicitPatterns = await extractExplicitPatterns( - space.themes, - space.summary, - statements, - ); - - // Extract implicit patterns from statement analysis - const implicitPatterns = await extractImplicitPatterns(statements); - - return { - explicitPatterns, - implicitPatterns, - totalPatternsFound: explicitPatterns.length + implicitPatterns.length, - processingStats: { - statementsAnalyzed: statements.length, - themesProcessed: space.themes.length, - implicitPatternsExtracted: implicitPatterns.length, - }, - }; - } catch (error) { - logger.error( - "Error detecting space patterns:", - error as Record, - ); - return null; - } -} - -async function extractExplicitPatterns( - themes: string[], - summary: string, - statements: SpaceStatementData[], -): Promise[]> { - if (themes.length === 0) return []; - - const prompt = createExplicitPatternPrompt(themes, summary, statements); - - // Pattern extraction requires HIGH complexity (insight synthesis, pattern recognition) - let responseText = ""; - await makeModelCall(false, prompt, (text: string) => { - responseText = text; - }, undefined, 'high'); - - const patterns = parseExplicitPatternResponse(responseText); - - return patterns.map((pattern) => ({ - name: pattern.name || `${pattern.type} pattern`, - source: "explicit" as const, - type: pattern.type, - summary: pattern.summary, - evidence: pattern.evidence, - confidence: pattern.confidence, - userConfirmed: "pending" as const, - })); -} - -async function extractImplicitPatterns( - statements: SpaceStatementData[], -): Promise[]> { - if (statements.length < CONFIG.minStatementsForPatterns) return []; - - const prompt = createImplicitPatternPrompt(statements); - - // Implicit pattern discovery requires HIGH complexity (pattern recognition from statements) - let responseText = ""; - await makeModelCall(false, prompt, (text: string) => { - responseText = text; - }, undefined, 'high'); - - const patterns = parseImplicitPatternResponse(responseText); - - return patterns.map((pattern) => ({ - name: pattern.name || `${pattern.type} pattern`, - source: "implicit" as const, - type: pattern.type, - summary: pattern.summary, - evidence: pattern.evidence, - confidence: pattern.confidence, - userConfirmed: "pending" as const, - })); -} - -function createExplicitPatternPrompt( - themes: string[], - summary: string, - statements: SpaceStatementData[], -): CoreMessage[] { - const statementsText = statements - .map((stmt) => `[${stmt.uuid}] ${stmt.fact}`) - .join("\n"); - - const explicitTypes = Object.values(EXPLICIT_PATTERN_TYPES).join('", "'); - - return [ - { - role: "system", - content: `You are an expert at extracting structured patterns from themes and supporting evidence. - -Your task is to convert high-level themes into explicit patterns with supporting statement evidence. - -INSTRUCTIONS: -1. For each theme, create a pattern that explains what it reveals about the user -2. Give each pattern a short, descriptive name (2-4 words) -3. Find supporting statement IDs that provide evidence for each pattern -4. Assess confidence based on evidence strength and theme clarity -5. Use appropriate pattern types from these guidelines: "${explicitTypes}" - - "theme": High-level thematic content areas - - "topic": Specific subject matter or topics of interest - - "domain": Knowledge or work domains the user operates in - - "interest_area": Areas of personal interest or hobby -6. You may suggest new pattern types if none of the guidelines fit well - -RESPONSE FORMAT: -Provide your response inside tags with valid JSON. - - -{ - "explicitPatterns": [ - { - "name": "Short descriptive name for the pattern", - "type": "theme", - "summary": "Description of what this pattern reveals about the user", - "evidence": ["statement_id_1", "statement_id_2"], - "confidence": 0.85 - } - ] -} -`, - }, - { - role: "user", - content: `THEMES TO ANALYZE: -${themes.map((theme, i) => `${i + 1}. ${theme}`).join("\n")} - -SPACE SUMMARY: -${summary} - -SUPPORTING STATEMENTS: -${statementsText} - -Please extract explicit patterns from these themes and map them to supporting statement evidence.`, - }, - ]; -} - -function createImplicitPatternPrompt( - statements: SpaceStatementData[], -): CoreMessage[] { - const statementsText = statements - .map( - (stmt) => - `[${stmt.uuid}] ${stmt.fact} (${stmt.subject} β†’ ${stmt.predicate} β†’ ${stmt.object})`, - ) - .join("\n"); - - const implicitTypes = Object.values(IMPLICIT_PATTERN_TYPES).join('", "'); - - return [ - { - role: "system", - content: `You are an expert at discovering implicit behavioral patterns from statement analysis. - -Your task is to identify hidden patterns in user behavior, preferences, and habits from statement content. - -INSTRUCTIONS: -1. Analyze statement content for behavioral patterns, not explicit topics -2. Give each pattern a short, descriptive name (2-4 words) -3. Look for recurring behaviors, preferences, and working styles -4. Identify how the user approaches tasks, makes decisions, and interacts -5. Use appropriate pattern types from these guidelines: "${implicitTypes}" - - "preference": Personal preferences and choices - - "habit": Recurring behaviors and routines - - "workflow": Work and process patterns - - "communication_style": How user communicates and expresses ideas - - "decision_pattern": Decision-making approaches and criteria - - "temporal_pattern": Time-based behavioral patterns - - "behavioral_pattern": General behavioral tendencies - - "learning_style": How user learns and processes information - - "collaboration_style": How user works with others -6. You may suggest new pattern types if none of the guidelines fit well -7. Focus on what the statements reveal about how the user thinks, works, or behaves - -RESPONSE FORMAT: -Provide your response inside tags with valid JSON. - - -{ - "implicitPatterns": [ - { - "name": "Short descriptive name for the pattern", - "type": "preference", - "summary": "Description of what this behavioral pattern reveals", - "evidence": ["statement_id_1", "statement_id_2"], - "confidence": 0.75 - } - ] -} -`, - }, - { - role: "user", - content: `STATEMENTS TO ANALYZE FOR IMPLICIT PATTERNS: -${statementsText} - -Please identify implicit behavioral patterns, preferences, and habits from these statements.`, - }, - ]; -} - -function parseExplicitPatternResponse(response: string): Array<{ - name: string; - type: string; - summary: string; - evidence: string[]; - confidence: number; -}> { - try { - const outputMatch = response.match(/([\s\S]*?)<\/output>/); - if (!outputMatch) { - logger.warn("No tags found in explicit pattern response"); - return []; - } - - const parsed = JSON.parse(outputMatch[1].trim()); - const validationResult = z - .object({ - explicitPatterns: z.array(ExplicitPatternSchema), - }) - .safeParse(parsed); - - if (!validationResult.success) { - logger.warn("Invalid explicit pattern response format:", { - error: validationResult.error, - }); - return []; - } - - return validationResult.data.explicitPatterns.filter( - (p) => - p.confidence >= CONFIG.minPatternConfidence && p.evidence.length >= 3, // Ensure at least 3 evidence statements - ); - } catch (error) { - logger.error( - "Error parsing explicit pattern response:", - error as Record, - ); - return []; - } -} - -function parseImplicitPatternResponse(response: string): Array<{ - name: string; - type: string; - summary: string; - evidence: string[]; - confidence: number; -}> { - try { - const outputMatch = response.match(/([\s\S]*?)<\/output>/); - if (!outputMatch) { - logger.warn("No tags found in implicit pattern response"); - return []; - } - - const parsed = JSON.parse(outputMatch[1].trim()); - const validationResult = z - .object({ - implicitPatterns: z.array(ImplicitPatternSchema), - }) - .safeParse(parsed); - - if (!validationResult.success) { - logger.warn("Invalid implicit pattern response format:", { - error: validationResult.error, - }); - return []; - } - - return validationResult.data.implicitPatterns.filter( - (p) => - p.confidence >= CONFIG.minPatternConfidence && p.evidence.length >= 3, // Ensure at least 3 evidence statements - ); - } catch (error) { - logger.error( - "Error parsing implicit pattern response:", - error as Record, - ); - return []; - } -} - -async function storePatterns( - explicitPatterns: Omit< - SpacePattern, - "id" | "createdAt" | "updatedAt" | "spaceId" - >[], - implicitPatterns: Omit< - SpacePattern, - "id" | "createdAt" | "updatedAt" | "spaceId" - >[], - spaceId: string, -): Promise { - try { - const allPatterns = [...explicitPatterns, ...implicitPatterns]; - - if (allPatterns.length === 0) return; - - // Store in PostgreSQL - await createSpacePattern(spaceId, allPatterns); - - logger.info(`Stored ${allPatterns.length} patterns`, { - explicit: explicitPatterns.length, - implicit: implicitPatterns.length, - }); - } catch (error) { - logger.error("Error storing patterns:", error as Record); - throw error; - } -} - -// Helper function to trigger the task -export async function triggerSpacePattern(payload: SpacePatternPayload) { - return await spacePatternTask.trigger(payload, { - concurrencyKey: `space-pattern-${payload.spaceId}`, // Prevent parallel runs for the same space - tags: [payload.userId, payload.spaceId, payload.triggerSource || "manual"], - }); -} diff --git a/apps/webapp/app/trigger/spaces/space-summary.ts b/apps/webapp/app/trigger/spaces/space-summary.ts index ceafbeb..a21547a 100644 --- a/apps/webapp/app/trigger/spaces/space-summary.ts +++ b/apps/webapp/app/trigger/spaces/space-summary.ts @@ -1,62 +1,11 @@ import { queue, task } from "@trigger.dev/sdk/v3"; import { logger } from "~/services/logger.service"; -import { SpaceService } from "~/services/space.server"; -import { makeModelCall } from "~/lib/model.server"; -import { runQuery } from "~/lib/neo4j.server"; -import { updateSpaceStatus, SPACE_STATUS } from "../utils/space-status"; -import type { CoreMessage } from "ai"; -import { z } from "zod"; -import { triggerSpacePattern } from "./space-pattern"; -import { getSpace, updateSpace } from "../utils/space-utils"; +import { + processSpaceSummary, + type SpaceSummaryPayload, +} from "~/jobs/spaces/space-summary.logic"; -import { EpisodeType } from "@core/types"; -import { getSpaceEpisodeCount } from "~/services/graphModels/space"; -import { addToQueue } from "~/lib/ingest.server"; - -interface SpaceSummaryPayload { - userId: string; - workspaceId: string; - spaceId: string; // Single space only - triggerSource?: "assignment" | "manual" | "scheduled"; -} - -interface SpaceEpisodeData { - uuid: string; - content: string; - originalContent: string; - source: string; - createdAt: Date; - validAt: Date; - metadata: any; - sessionId: string | null; -} - -interface SpaceSummaryData { - spaceId: string; - spaceName: string; - spaceDescription?: string; - contextCount: number; - summary: string; - keyEntities: string[]; - themes: string[]; - confidence: number; - lastUpdated: Date; - isIncremental: boolean; -} - -// Zod schema for LLM response validation -const SummaryResultSchema = z.object({ - summary: z.string(), - keyEntities: z.array(z.string()), - themes: z.array(z.string()), - confidence: z.number().min(0).max(1), -}); - -const CONFIG = { - maxEpisodesForSummary: 20, // Limit episodes for performance - minEpisodesForSummary: 1, // Minimum episodes to generate summary - summaryEpisodeThreshold: 5, // Minimum new episodes required to trigger summary (configurable) -}; +export type { SpaceSummaryPayload }; export const spaceSummaryQueue = queue({ name: "space-summary-queue", @@ -67,735 +16,17 @@ export const spaceSummaryTask = task({ id: "space-summary", queue: spaceSummaryQueue, run: async (payload: SpaceSummaryPayload) => { - const { userId, workspaceId, spaceId, triggerSource = "manual" } = payload; - - logger.info(`Starting space summary generation`, { - userId, - workspaceId, - spaceId, - triggerSource, + logger.info(`[Trigger.dev] Starting space summary task`, { + userId: payload.userId, + spaceId: payload.spaceId, + triggerSource: payload.triggerSource, }); - try { - // Update status to processing - await updateSpaceStatus(spaceId, SPACE_STATUS.PROCESSING, { - userId, - operation: "space-summary", - metadata: { triggerSource, phase: "start_summary" }, - }); - - // Generate summary for the single space - const summaryResult = await generateSpaceSummary( - spaceId, - userId, - triggerSource, - ); - - if (summaryResult) { - // Store the summary - await storeSummary(summaryResult); - - // Update status to ready after successful completion - await updateSpaceStatus(spaceId, SPACE_STATUS.READY, { - userId, - operation: "space-summary", - metadata: { - triggerSource, - phase: "completed_summary", - contextCount: summaryResult.contextCount, - confidence: summaryResult.confidence, - }, - }); - - logger.info(`Generated summary for space ${spaceId}`, { - statementCount: summaryResult.contextCount, - confidence: summaryResult.confidence, - themes: summaryResult.themes.length, - triggerSource, - }); - - return { - success: true, - spaceId, - triggerSource, - summary: { - statementCount: summaryResult.contextCount, - confidence: summaryResult.confidence, - themesCount: summaryResult.themes.length, - }, - }; - } else { - // No summary generated - this could be due to insufficient episodes or no new episodes - // This is not an error state, so update status to ready - await updateSpaceStatus(spaceId, SPACE_STATUS.READY, { - userId, - operation: "space-summary", - metadata: { - triggerSource, - phase: "no_summary_needed", - reason: "Insufficient episodes or no new episodes to summarize", - }, - }); - - logger.info( - `No summary generated for space ${spaceId} - insufficient or no new episodes`, - ); - return { - success: true, - spaceId, - triggerSource, - summary: null, - reason: "No episodes to summarize", - }; - } - } catch (error) { - // Update status to error on exception - try { - await updateSpaceStatus(spaceId, SPACE_STATUS.ERROR, { - userId, - operation: "space-summary", - metadata: { - triggerSource, - phase: "exception", - error: error instanceof Error ? error.message : "Unknown error", - }, - }); - } catch (statusError) { - logger.warn(`Failed to update status to error for space ${spaceId}`, { - statusError, - }); - } - - logger.error( - `Error in space summary generation for space ${spaceId}:`, - error as Record, - ); - throw error; - } + // Use common business logic + return await processSpaceSummary(payload); }, }); -async function generateSpaceSummary( - spaceId: string, - userId: string, - triggerSource?: "assignment" | "manual" | "scheduled", -): Promise { - try { - // 1. Get space details - const spaceService = new SpaceService(); - const space = await spaceService.getSpace(spaceId, userId); - - if (!space) { - logger.warn(`Space ${spaceId} not found for user ${userId}`); - return null; - } - - // 2. Check episode count threshold (skip for manual triggers) - if (triggerSource !== "manual") { - const currentEpisodeCount = await getSpaceEpisodeCount(spaceId, userId); - const lastSummaryEpisodeCount = space.contextCount || 0; - const episodeDifference = currentEpisodeCount - lastSummaryEpisodeCount; - - if ( - episodeDifference < CONFIG.summaryEpisodeThreshold || - lastSummaryEpisodeCount !== 0 - ) { - logger.info( - `Skipping summary generation for space ${spaceId}: only ${episodeDifference} new episodes (threshold: ${CONFIG.summaryEpisodeThreshold})`, - { - currentEpisodeCount, - lastSummaryEpisodeCount, - episodeDifference, - threshold: CONFIG.summaryEpisodeThreshold, - }, - ); - return null; - } - - logger.info( - `Proceeding with summary generation for space ${spaceId}: ${episodeDifference} new episodes (threshold: ${CONFIG.summaryEpisodeThreshold})`, - { - currentEpisodeCount, - lastSummaryEpisodeCount, - episodeDifference, - }, - ); - } - - // 2. Check for existing summary - const existingSummary = await getExistingSummary(spaceId); - const isIncremental = existingSummary !== null; - - // 3. Get episodes (all or new ones based on existing summary) - const episodes = await getSpaceEpisodes( - spaceId, - userId, - isIncremental ? existingSummary?.lastUpdated : undefined, - ); - - // Handle case where no new episodes exist for incremental update - if (isIncremental && episodes.length === 0) { - logger.info( - `No new episodes found for space ${spaceId}, skipping summary update`, - ); - return null; - } - - // Check minimum episode requirement for new summaries only - if (!isIncremental && episodes.length < CONFIG.minEpisodesForSummary) { - logger.info( - `Space ${spaceId} has insufficient episodes (${episodes.length}) for new summary`, - ); - return null; - } - - // 4. Process episodes using unified approach - let summaryResult; - - if (episodes.length > CONFIG.maxEpisodesForSummary) { - logger.info( - `Large space detected (${episodes.length} episodes). Processing in batches.`, - ); - - // Process in batches, each building on previous result - const batches: SpaceEpisodeData[][] = []; - for (let i = 0; i < episodes.length; i += CONFIG.maxEpisodesForSummary) { - batches.push(episodes.slice(i, i + CONFIG.maxEpisodesForSummary)); - } - - let currentSummary = existingSummary?.summary || null; - let currentThemes = existingSummary?.themes || []; - let cumulativeConfidence = 0; - - for (const [batchIndex, batch] of batches.entries()) { - logger.info( - `Processing batch ${batchIndex + 1}/${batches.length} with ${batch.length} episodes`, - ); - - const batchResult = await generateUnifiedSummary( - space.name, - space.description as string, - batch, - currentSummary, - currentThemes, - ); - - if (batchResult) { - currentSummary = batchResult.summary; - currentThemes = batchResult.themes; - cumulativeConfidence += batchResult.confidence; - } else { - logger.warn(`Failed to process batch ${batchIndex + 1}`); - } - - // Small delay between batches - if (batchIndex < batches.length - 1) { - await new Promise((resolve) => setTimeout(resolve, 500)); - } - } - - summaryResult = currentSummary - ? { - summary: currentSummary, - themes: currentThemes, - confidence: Math.min(cumulativeConfidence / batches.length, 1.0), - } - : null; - } else { - logger.info( - `Processing ${episodes.length} episodes with unified approach`, - ); - - // Use unified approach for smaller spaces - summaryResult = await generateUnifiedSummary( - space.name, - space.description as string, - episodes, - existingSummary?.summary || null, - existingSummary?.themes || [], - ); - } - - if (!summaryResult) { - logger.warn(`Failed to generate LLM summary for space ${spaceId}`); - return null; - } - - // Get the actual current counts from Neo4j - const currentEpisodeCount = await getSpaceEpisodeCount(spaceId, userId); - - return { - spaceId: space.uuid, - spaceName: space.name, - spaceDescription: space.description as string, - contextCount: currentEpisodeCount, - summary: summaryResult.summary, - keyEntities: summaryResult.keyEntities || [], - themes: summaryResult.themes, - confidence: summaryResult.confidence, - lastUpdated: new Date(), - isIncremental, - }; - } catch (error) { - logger.error( - `Error generating summary for space ${spaceId}:`, - error as Record, - ); - return null; - } -} - -async function generateUnifiedSummary( - spaceName: string, - spaceDescription: string | undefined, - episodes: SpaceEpisodeData[], - previousSummary: string | null = null, - previousThemes: string[] = [], -): Promise<{ - summary: string; - themes: string[]; - confidence: number; - keyEntities?: string[]; -} | null> { - try { - const prompt = createUnifiedSummaryPrompt( - spaceName, - spaceDescription, - episodes, - previousSummary, - previousThemes, - ); - - // Space summary generation requires HIGH complexity (creative synthesis, narrative generation) - let responseText = ""; - await makeModelCall( - false, - prompt, - (text: string) => { - responseText = text; - }, - undefined, - "high", - ); - - return parseSummaryResponse(responseText); - } catch (error) { - logger.error( - "Error generating unified summary:", - error as Record, - ); - return null; - } -} - -function createUnifiedSummaryPrompt( - spaceName: string, - spaceDescription: string | undefined, - episodes: SpaceEpisodeData[], - previousSummary: string | null, - previousThemes: string[], -): CoreMessage[] { - // If there are no episodes and no previous summary, we cannot generate a meaningful summary - if (episodes.length === 0 && previousSummary === null) { - throw new Error( - "Cannot generate summary without episodes or existing summary", - ); - } - - const episodesText = episodes - .map( - (episode) => - `- ${episode.content} (Source: ${episode.source}, Session: ${episode.sessionId || "N/A"})`, - ) - .join("\n"); - - // Extract key entities and themes from episode content - const contentWords = episodes - .map((ep) => ep.content.toLowerCase()) - .join(" ") - .split(/\s+/) - .filter((word) => word.length > 3); - - const wordFrequency = new Map(); - contentWords.forEach((word) => { - wordFrequency.set(word, (wordFrequency.get(word) || 0) + 1); - }); - - const topEntities = Array.from(wordFrequency.entries()) - .sort(([, a], [, b]) => b - a) - .slice(0, 10) - .map(([word]) => word); - - const isUpdate = previousSummary !== null; - - return [ - { - role: "system", - content: `You are an expert at analyzing and summarizing episodes within semantic spaces based on the space's intent and purpose. Your task is to ${isUpdate ? "update an existing summary by integrating new episodes" : "create a comprehensive summary of episodes"}. - -CRITICAL RULES: -1. Base your summary ONLY on insights derived from the actual content/episodes provided -2. Use the space's INTENT/PURPOSE (from description) to guide what to summarize and how to organize it -3. Write in a factual, neutral tone - avoid promotional language ("pivotal", "invaluable", "cutting-edge") -4. Be specific and concrete - reference actual content, patterns, and insights found in the episodes -5. If episodes are insufficient for meaningful insights, state that more data is needed - -INTENT-DRIVEN SUMMARIZATION: -Your summary should SERVE the space's intended purpose. Examples: -- "Learning React" β†’ Summarize React concepts, patterns, techniques learned -- "Project X Updates" β†’ Summarize progress, decisions, blockers, next steps -- "Health Tracking" β†’ Summarize metrics, trends, observations, insights -- "Guidelines for React" β†’ Extract actionable patterns, best practices, rules -- "Evolution of design thinking" β†’ Track how thinking changed over time, decision points -The intent defines WHY this space exists - organize content to serve that purpose. - -INSTRUCTIONS: -${ - isUpdate - ? `1. Review the existing summary and themes carefully -2. Analyze the new episodes for patterns and insights that align with the space's intent -3. Identify connecting points between existing knowledge and new episodes -4. Update the summary to seamlessly integrate new information while preserving valuable existing insights -5. Evolve themes by adding new ones or refining existing ones based on the space's purpose -6. Organize the summary to serve the space's intended use case` - : `1. Analyze the semantic content and relationships within the episodes -2. Identify topics/sections that align with the space's INTENT and PURPOSE -3. Create a coherent summary that serves the space's intended use case -4. Organize the summary based on the space's purpose (not generic frequency-based themes)` -} -${isUpdate ? "7" : "5"}. Assess your confidence in the ${isUpdate ? "updated" : ""} summary quality (0.0-1.0) - -INTENT-ALIGNED ORGANIZATION: -- Organize sections based on what serves the space's purpose -- Topics don't need minimum episode counts - relevance to intent matters most -- Each section should provide value aligned with the space's intended use -- For "guidelines" spaces: focus on actionable patterns -- For "tracking" spaces: focus on temporal patterns and changes -- For "learning" spaces: focus on concepts and insights gained -- Let the space's intent drive the structure, not rigid rules - -${ - isUpdate - ? `CONNECTION FOCUS: -- Entity relationships that span across batches/time -- Theme evolution and expansion -- Temporal patterns and progressions -- Contradictions or confirmations of existing insights -- New insights that complement existing knowledge` - : "" -} - -RESPONSE FORMAT: -Provide your response inside tags with valid JSON. Include both HTML summary and markdown format. - - -{ - "summary": "${isUpdate ? "Updated HTML summary that integrates new insights with existing knowledge. Write factually about what the statements reveal - mention specific entities, relationships, and patterns found in the data. Avoid marketing language. Use HTML tags for structure." : "Factual HTML summary based on patterns found in the statements. Report what the data actually shows - specific entities, relationships, frequencies, and concrete insights. Avoid promotional language. Use HTML tags like

      , ,

        ,
      • for structure. Keep it concise and evidence-based."}", - "keyEntities": ["entity1", "entity2", "entity3"], - "themes": ["${isUpdate ? 'updated_theme1", "new_theme2", "evolved_theme3' : 'theme1", "theme2", "theme3'}"], - "confidence": 0.85 -} - - -JSON FORMATTING RULES: -- HTML content in summary field is allowed and encouraged -- Escape quotes within strings as \" -- Escape HTML angle brackets if needed: < and > -- Use proper HTML tags for structure:

        , , ,

          ,
        • ,

          , etc. -- HTML content should be well-formed and semantic - -GUIDELINES: -${ - isUpdate - ? `- Preserve valuable insights from existing summary -- Integrate new information by highlighting connections -- Themes should evolve naturally, don't replace wholesale -- The updated summary should read as a coherent whole -- Make the summary user-friendly and explain what value this space provides` - : `- Report only what the episodes actually reveal - be specific and concrete -- Cite actual content and patterns found in the episodes -- Avoid generic descriptions that could apply to any space -- Use neutral, factual language - no "comprehensive", "robust", "cutting-edge" etc. -- Themes must be backed by at least 3 supporting episodes with clear evidence -- Better to have fewer, well-supported themes than many weak ones -- Confidence should reflect actual data quality and coverage, not aspirational goals` -}`, - }, - { - role: "user", - content: `SPACE INFORMATION: -Name: "${spaceName}" -Intent/Purpose: ${spaceDescription || "No specific intent provided - organize naturally based on content"} - -${ - isUpdate - ? `EXISTING SUMMARY: -${previousSummary} - -EXISTING THEMES: -${previousThemes.join(", ")} - -NEW EPISODES TO INTEGRATE (${episodes.length} episodes):` - : `EPISODES IN THIS SPACE (${episodes.length} episodes):` -} -${episodesText} - -${ - episodes.length > 0 - ? `TOP WORDS BY FREQUENCY: -${topEntities.join(", ")}` - : "" -} - -${ - isUpdate - ? "Please identify connections between the existing summary and new episodes, then update the summary to integrate the new insights coherently. Organize the summary to SERVE the space's intent/purpose. Remember: only summarize insights from the actual episode content." - : "Please analyze the episodes and provide a comprehensive summary that SERVES the space's intent/purpose. Organize sections based on what would be most valuable for this space's intended use case. If the intent is unclear, organize naturally based on content patterns. Only summarize insights from actual episode content." -}`, - }, - ]; -} - -async function getExistingSummary(spaceId: string): Promise<{ - summary: string; - themes: string[]; - lastUpdated: Date; - contextCount: number; -} | null> { - try { - const existingSummary = await getSpace(spaceId); - - if (existingSummary?.summary) { - return { - summary: existingSummary.summary, - themes: existingSummary.themes, - lastUpdated: existingSummary.summaryGeneratedAt || new Date(), - contextCount: existingSummary.contextCount || 0, - }; - } - - return null; - } catch (error) { - logger.warn(`Failed to get existing summary for space ${spaceId}:`, { - error, - }); - return null; - } -} - -async function getSpaceEpisodes( - spaceId: string, - userId: string, - sinceDate?: Date, -): Promise { - // Query episodes directly using Space-[:HAS_EPISODE]->Episode relationships - const params: any = { spaceId, userId }; - - let dateCondition = ""; - if (sinceDate) { - dateCondition = "AND e.createdAt > $sinceDate"; - params.sinceDate = sinceDate.toISOString(); - } - - const query = ` - MATCH (space:Space {uuid: $spaceId, userId: $userId})-[:HAS_EPISODE]->(e:Episode {userId: $userId}) - WHERE e IS NOT NULL ${dateCondition} - RETURN DISTINCT e - ORDER BY e.createdAt DESC - `; - - const result = await runQuery(query, params); - - return result.map((record) => { - const episode = record.get("e").properties; - return { - uuid: episode.uuid, - content: episode.content, - originalContent: episode.originalContent, - source: episode.source, - createdAt: new Date(episode.createdAt), - validAt: new Date(episode.validAt), - metadata: JSON.parse(episode.metadata || "{}"), - sessionId: episode.sessionId, - }; - }); -} - -function parseSummaryResponse(response: string): { - summary: string; - themes: string[]; - confidence: number; - keyEntities?: string[]; -} | null { - try { - // Extract content from tags - const outputMatch = response.match(/([\s\S]*?)<\/output>/); - if (!outputMatch) { - logger.warn("No tags found in LLM summary response"); - logger.debug("Full LLM response:", { response }); - return null; - } - - let jsonContent = outputMatch[1].trim(); - - let parsed; - try { - parsed = JSON.parse(jsonContent); - } catch (jsonError) { - logger.warn("JSON parsing failed, attempting cleanup and retry", { - originalError: jsonError, - jsonContent: jsonContent.substring(0, 500) + "...", // Log first 500 chars - }); - - // More aggressive cleanup for malformed JSON - jsonContent = jsonContent - .replace(/([^\\])"/g, '$1\\"') // Escape unescaped quotes - .replace(/^"/g, '\\"') // Escape quotes at start - .replace(/\\\\"/g, '\\"'); // Fix double-escaped quotes - - parsed = JSON.parse(jsonContent); - } - - // Validate the response structure - const validationResult = SummaryResultSchema.safeParse(parsed); - if (!validationResult.success) { - logger.warn("Invalid LLM summary response format:", { - error: validationResult.error, - parsedData: parsed, - }); - return null; - } - - return validationResult.data; - } catch (error) { - logger.error( - "Error parsing LLM summary response:", - error as Record, - ); - logger.debug("Failed response content:", { response }); - return null; - } -} - -async function storeSummary(summaryData: SpaceSummaryData): Promise { - try { - // Store in PostgreSQL for API access and persistence - await updateSpace(summaryData); - - // Also store in Neo4j for graph-based queries - const query = ` - MATCH (space:Space {uuid: $spaceId}) - SET space.summary = $summary, - space.keyEntities = $keyEntities, - space.themes = $themes, - space.summaryConfidence = $confidence, - space.summaryContextCount = $contextCount, - space.summaryLastUpdated = datetime($lastUpdated) - RETURN space - `; - - await runQuery(query, { - spaceId: summaryData.spaceId, - summary: summaryData.summary, - keyEntities: summaryData.keyEntities, - themes: summaryData.themes, - confidence: summaryData.confidence, - contextCount: summaryData.contextCount, - lastUpdated: summaryData.lastUpdated.toISOString(), - }); - - logger.info(`Stored summary for space ${summaryData.spaceId}`, { - themes: summaryData.themes.length, - keyEntities: summaryData.keyEntities.length, - confidence: summaryData.confidence, - }); - } catch (error) { - logger.error( - `Error storing summary for space ${summaryData.spaceId}:`, - error as Record, - ); - throw error; - } -} - -/** - * Process space summary sequentially: ingest document then trigger patterns - */ -async function processSpaceSummarySequentially({ - userId, - workspaceId, - spaceId, - spaceName, - summaryContent, - triggerSource, -}: { - userId: string; - workspaceId: string; - spaceId: string; - spaceName: string; - summaryContent: string; - triggerSource: - | "summary_complete" - | "manual" - | "assignment" - | "scheduled" - | "new_space" - | "growth_threshold" - | "ingestion_complete"; -}): Promise { - // Step 1: Ingest summary as document synchronously - await ingestSpaceSummaryDocument(spaceId, userId, spaceName, summaryContent); - - logger.info( - `Successfully ingested space summary document for space ${spaceId}`, - ); - - // Step 2: Now trigger space patterns (patterns will have access to the ingested summary) - await triggerSpacePattern({ - userId, - workspaceId, - spaceId, - triggerSource, - }); - - logger.info( - `Sequential processing completed for space ${spaceId}: summary ingested β†’ patterns triggered`, - ); -} - -/** - * Ingest space summary as document synchronously - */ -async function ingestSpaceSummaryDocument( - spaceId: string, - userId: string, - spaceName: string, - summaryContent: string, -): Promise { - // Create the ingest body - const ingestBody = { - episodeBody: summaryContent, - referenceTime: new Date().toISOString(), - metadata: { - documentType: "space_summary", - spaceId, - spaceName, - generatedAt: new Date().toISOString(), - }, - source: "space", - spaceId, - sessionId: spaceId, - type: EpisodeType.DOCUMENT, - }; - - // Add to queue - await addToQueue(ingestBody, userId); - - logger.info(`Queued space summary for synchronous ingestion`); - - return; -} - // Helper function to trigger the task export async function triggerSpaceSummary(payload: SpaceSummaryPayload) { return await spaceSummaryTask.trigger(payload, { diff --git a/apps/webapp/app/trigger/utils/space-utils.ts b/apps/webapp/app/trigger/utils/space-utils.ts index 8144c56..fee6c27 100644 --- a/apps/webapp/app/trigger/utils/space-utils.ts +++ b/apps/webapp/app/trigger/utils/space-utils.ts @@ -1,4 +1,3 @@ -import { type SpacePattern } from "@core/types"; import { prisma } from "./prisma"; export const getSpace = async (spaceId: string) => { @@ -11,22 +10,6 @@ export const getSpace = async (spaceId: string) => { return space; }; -export const createSpacePattern = async ( - spaceId: string, - allPatterns: Omit< - SpacePattern, - "id" | "createdAt" | "updatedAt" | "spaceId" - >[], -) => { - return await prisma.spacePattern.createMany({ - data: allPatterns.map((pattern) => ({ - ...pattern, - spaceId, - userConfirmed: pattern.userConfirmed as any, // Temporary cast until Prisma client is regenerated - })), - }); -}; - export const updateSpace = async (summaryData: { spaceId: string; summary: string; @@ -41,7 +24,7 @@ export const updateSpace = async (summaryData: { summary: summaryData.summary, themes: summaryData.themes, contextCount: summaryData.contextCount, - summaryGeneratedAt: new Date().toISOString() + summaryGeneratedAt: new Date().toISOString(), }, }); }; diff --git a/apps/webapp/app/utils/mcp/memory.ts b/apps/webapp/app/utils/mcp/memory.ts index 9bc5792..fa441d7 100644 --- a/apps/webapp/app/utils/mcp/memory.ts +++ b/apps/webapp/app/utils/mcp/memory.ts @@ -1,3 +1,4 @@ +import { randomUUID } from "node:crypto"; import { EpisodeTypeEnum } from "@core/types"; import { addToQueue } from "~/lib/ingest.server"; import { logger } from "~/services/logger.service"; @@ -19,24 +20,24 @@ const SearchParamsSchema = { description: "Search query optimized for knowledge graph retrieval. Choose the right query structure based on your search intent:\n\n" + "1. **Entity-Centric Queries** (Best for graph search):\n" + - " - βœ… GOOD: \"User's preferences for code style and formatting\"\n" + - " - βœ… GOOD: \"Project authentication implementation decisions\"\n" + - " - ❌ BAD: \"user code style\"\n" + + ' - βœ… GOOD: "User\'s preferences for code style and formatting"\n' + + ' - βœ… GOOD: "Project authentication implementation decisions"\n' + + ' - ❌ BAD: "user code style"\n' + " - Format: [Person/Project] + [relationship/attribute] + [context]\n\n" + "2. **Multi-Entity Relationship Queries** (Excellent for episode graph):\n" + - " - βœ… GOOD: \"User and team discussions about API design patterns\"\n" + - " - βœ… GOOD: \"relationship between database schema and performance optimization\"\n" + - " - ❌ BAD: \"user team api design\"\n" + + ' - βœ… GOOD: "User and team discussions about API design patterns"\n' + + ' - βœ… GOOD: "relationship between database schema and performance optimization"\n' + + ' - ❌ BAD: "user team api design"\n' + " - Format: [Entity1] + [relationship type] + [Entity2] + [context]\n\n" + "3. **Semantic Question Queries** (Good for vector search):\n" + - " - βœ… GOOD: \"What causes authentication errors in production? What are the security requirements?\"\n" + - " - βœ… GOOD: \"How does caching improve API response times compared to direct database queries?\"\n" + - " - ❌ BAD: \"auth errors production\"\n" + + ' - βœ… GOOD: "What causes authentication errors in production? What are the security requirements?"\n' + + ' - βœ… GOOD: "How does caching improve API response times compared to direct database queries?"\n' + + ' - ❌ BAD: "auth errors production"\n' + " - Format: Complete natural questions with full context\n\n" + "4. **Concept Exploration Queries** (Good for BFS traversal):\n" + - " - βœ… GOOD: \"concepts and ideas related to database indexing and query optimization\"\n" + - " - βœ… GOOD: \"topics connected to user authentication and session management\"\n" + - " - ❌ BAD: \"database indexing concepts\"\n" + + ' - βœ… GOOD: "concepts and ideas related to database indexing and query optimization"\n' + + ' - βœ… GOOD: "topics connected to user authentication and session management"\n' + + ' - ❌ BAD: "database indexing concepts"\n' + " - Format: [concept] + related/connected + [domain/context]\n\n" + "Avoid keyword soup queries - use complete phrases with proper context for best results.", }, @@ -75,6 +76,11 @@ const IngestSchema = { description: "The conversation text to store. Include both what the user asked and what you answered. Keep it concise but complete.", }, + sessionId: { + type: "string", + description: + "IMPORTANT: Session ID (UUID) is required to track the conversation session. If you don't have a sessionId in your context, you MUST call the get_session_id tool first to obtain one before calling memory_ingest.", + }, spaceIds: { type: "array", items: { @@ -84,14 +90,14 @@ const IngestSchema = { "Optional: Array of space UUIDs (from memory_get_spaces). Add this to organize the memory by project. Example: If discussing 'core' project, include the 'core' space ID. Leave empty to store in general memory.", }, }, - required: ["message"], + required: ["message", "sessionId"], }; export const memoryTools = [ { name: "memory_ingest", description: - "Store conversation in memory for future reference. USE THIS TOOL: At the END of every conversation after fully answering the user. WHAT TO STORE: 1) User's question or request, 2) Your solution or explanation, 3) Important decisions made, 4) Key insights discovered. HOW TO USE: Put the entire conversation summary in the 'message' field. Optionally add spaceIds array to organize by project. Returns: Success confirmation with storage ID.", + "Store conversation in memory for future reference. USE THIS TOOL: At the END of every conversation after fully answering the user. WHAT TO STORE: 1) User's question or request, 2) Your solution or explanation, 3) Important decisions made, 4) Key insights discovered. HOW TO USE: Put the entire conversation summary in the 'message' field. IMPORTANT: You MUST provide a sessionId - if you don't have one in your context, call get_session_id tool first to obtain it. Optionally add spaceIds array to organize by project. Returns: Success confirmation with storage ID.", inputSchema: IngestSchema, }, { @@ -150,6 +156,20 @@ export const memoryTools = [ }, }, }, + { + name: "get_session_id", + description: + "Get a new session ID for the MCP connection. USE THIS TOOL: When you need a session ID and don't have one yet. This generates a unique UUID to identify your MCP session. IMPORTANT: If any other tool requires a sessionId parameter and you don't have one, call this tool first to get a session ID. Returns: A UUID string to use as sessionId.", + inputSchema: { + type: "object", + properties: { + new: { + type: "boolean", + description: "Set to true to get a new sessionId.", + }, + }, + }, + }, { name: "get_integrations", description: @@ -243,6 +263,8 @@ export async function callMemoryTool( return await handleUserProfile(userId); case "memory_get_space": return await handleGetSpace({ ...args, userId }); + case "get_session_id": + return await handleGetSessionId(); case "get_integrations": return await handleGetIntegrations({ ...args, userId }); case "get_integration_actions": @@ -334,6 +356,7 @@ async function handleMemoryIngest(args: any) { source: args.source, type: EpisodeTypeEnum.CONVERSATION, spaceIds, + sessionId: args.sessionId, }, args.userId, ); @@ -462,7 +485,7 @@ async function handleGetSpace(args: any) { const spaceDetails = { id: space.id, name: space.name, - description: space.description, + summary: space.summary, }; return { @@ -489,6 +512,35 @@ async function handleGetSpace(args: any) { } } +// Handler for get_session_id +async function handleGetSessionId() { + try { + const sessionId = randomUUID(); + + return { + content: [ + { + type: "text", + text: JSON.stringify({ sessionId }), + }, + ], + isError: false, + }; + } catch (error) { + logger.error(`MCP get session id error: ${error}`); + + return { + content: [ + { + type: "text", + text: `Error generating session ID: ${error instanceof Error ? error.message : String(error)}`, + }, + ], + isError: true, + }; + } +} + // Handler for get_integrations async function handleGetIntegrations(args: any) { try { diff --git a/apps/webapp/package.json b/apps/webapp/package.json index aae6e45..49179ce 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -44,6 +44,7 @@ "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-progress": "^1.1.4", "@radix-ui/react-scroll-area": "^1.0.5", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-separator": "^1.1.7", @@ -53,7 +54,6 @@ "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.2.7", - "@radix-ui/react-progress": "^1.1.4", "@remix-run/express": "2.16.7", "@remix-run/node": "2.1.0", "@remix-run/react": "2.16.7", @@ -80,6 +80,7 @@ "@tiptap/pm": "^2.11.9", "@tiptap/react": "^2.11.9", "@tiptap/starter-kit": "2.11.9", + "@trigger.dev/python": "4.0.4", "@trigger.dev/react-hooks": "4.0.4", "@trigger.dev/sdk": "4.0.4", "ai": "5.0.78", @@ -125,25 +126,25 @@ "react": "^18.2.0", "react-calendar-heatmap": "^1.10.0", "react-dom": "^18.2.0", + "react-hotkeys-hook": "^4.5.0", "react-markdown": "10.1.0", "react-resizable-panels": "^1.0.9", - "react-hotkeys-hook": "^4.5.0", "react-virtualized": "^9.22.6", - "resumable-stream": "2.2.8", "remix-auth": "^4.2.0", "remix-auth-oauth2": "^3.4.1", "remix-themes": "^2.0.4", "remix-typedjson": "0.3.1", "remix-utils": "^7.7.0", + "resumable-stream": "2.2.8", "sigma": "^3.0.2", - "stripe": "19.0.0", "simple-oauth2": "^5.1.0", + "stripe": "19.0.0", "tailwind-merge": "^2.6.0", - "tiptap-markdown": "0.9.0", "tailwind-scrollbar-hide": "^2.0.0", "tailwindcss-animate": "^1.0.7", "tailwindcss-textshadow": "^2.1.3", "tiny-invariant": "^1.3.1", + "tiptap-markdown": "0.9.0", "zod": "3.25.76", "zod-error": "1.5.0", "zod-validation-error": "^1.5.0" diff --git a/apps/webapp/python/README.md b/apps/webapp/python/README.md new file mode 100644 index 0000000..f44116b --- /dev/null +++ b/apps/webapp/python/README.md @@ -0,0 +1,299 @@ +# BERT Topic Modeling CLI for Echo Episodes + +This CLI tool performs topic modeling on Echo episodes using BERTopic. It connects to Neo4j, retrieves episodes with their pre-computed embeddings for a given user, and discovers thematic clusters using HDBSCAN clustering. + +## Features + +- Connects to Neo4j database to fetch episodes +- Uses pre-computed embeddings (no need to regenerate them) +- Performs semantic topic clustering with BERTopic +- Displays topics with: + - Top keywords per topic + - Episode count per topic + - Sample episodes for each topic +- Configurable minimum topic size +- Environment variable support for easy configuration + +## Prerequisites + +- Python 3.8+ +- Access to Neo4j database with episodes stored +- Pre-computed embeddings stored in Neo4j (in `contentEmbedding` field) + +## Installation + +1. Navigate to the bert directory: + +```bash +cd apps/webapp/app/bert +``` + +2. Install dependencies: + +```bash +pip install -r requirements.txt +``` + +## Configuration + +The CLI can read Neo4j connection details from: + +1. **Environment variables** (recommended) - Create a `.env` file or export: + + ```bash + export NEO4J_URI=bolt://localhost:7687 + export NEO4J_USERNAME=neo4j + export NEO4J_PASSWORD=your_password + ``` + +2. **Command-line options** - Pass credentials directly as flags + +3. **From project root** - The tool automatically loads `.env` from the project root + +## Usage + +### Basic Usage + +Using environment variables (most common): + +```bash +python main.py +``` + +### Advanced Options + +```bash +python main.py [OPTIONS] +``` + +**Options:** + +- `--min-topic-size INTEGER`: Minimum number of episodes per topic (default: 10) +- `--nr-topics INTEGER`: Target number of topics for reduction (optional) +- `--propose-spaces`: Generate space proposals using OpenAI (requires OPENAI_API_KEY) +- `--openai-api-key TEXT`: OpenAI API key for space proposals (or use OPENAI_API_KEY env var) +- `--json`: Output only final results in JSON format (suppresses all other output) +- `--neo4j-uri TEXT`: Neo4j connection URI (default: bolt://localhost:7687) +- `--neo4j-username TEXT`: Neo4j username (default: neo4j) +- `--neo4j-password TEXT`: Neo4j password (required) + +### Examples + +1. **Basic usage with environment variables:** + + ```bash + python main.py user-123 + ``` + +2. **Custom minimum topic size:** + + ```bash + python main.py user-123 --min-topic-size 10 + ``` + +3. **Explicit credentials:** + + ```bash + python main.py user-123 \ + --neo4j-uri bolt://neo4j:7687 \ + --neo4j-username neo4j \ + --neo4j-password mypassword + ``` + +4. **Using Docker compose Neo4j:** + ```bash + python main.py user-123 \ + --neo4j-uri bolt://localhost:7687 \ + --neo4j-password 27192e6432564f4788d55c15131bd5ac + ``` + +5. **With space proposals:** + ```bash + python main.py user-123 --propose-spaces + ``` + +6. **JSON output mode (for programmatic use):** + ```bash + python main.py user-123 --json + ``` + +7. **JSON output with space proposals:** + ```bash + python main.py user-123 --propose-spaces --json + ``` + +### Get Help + +```bash +python main.py --help +``` + +## Output Formats + +### Human-Readable Output (Default) + +The CLI outputs: + +``` +================================================================================ +BERT TOPIC MODELING FOR ECHO EPISODES +================================================================================ +User ID: user-123 +Min Topic Size: 20 +================================================================================ + +βœ“ Connected to Neo4j at bolt://localhost:7687 +βœ“ Fetched 150 episodes with embeddings + +πŸ” Running BERTopic analysis (min_topic_size=20)... +βœ“ Topic modeling complete + +================================================================================ +TOPIC MODELING RESULTS +================================================================================ +Total Topics Found: 5 +Total Episodes: 150 +================================================================================ + +──────────────────────────────────────────────────────────────────────────────── +Topic 0: 45 episodes +──────────────────────────────────────────────────────────────────────────────── +Keywords: authentication, login, user, security, session, password, token, oauth, jwt, credentials + +Sample Episodes (showing up to 3): + 1. [uuid-123] + Discussing authentication flow for the new user login system... + + 2. [uuid-456] + Implementing OAuth2 with JWT tokens for secure sessions... + + 3. [uuid-789] + Password reset functionality with email verification... + +──────────────────────────────────────────────────────────────────────────────── +Topic 1: 32 episodes +──────────────────────────────────────────────────────────────────────────────── +Keywords: database, neo4j, query, graph, cypher, nodes, relationships, index, performance, optimization + +Sample Episodes (showing up to 3): + ... + +Topic -1 (Outliers): 8 episodes + +================================================================================ +βœ“ Analysis complete! +================================================================================ + +βœ“ Neo4j connection closed +``` + +### JSON Output Mode (--json flag) + +When using the `--json` flag, the tool outputs only a clean JSON object with no debug logs: + +```json +{ + "topics": { + "0": { + "keywords": ["authentication", "login", "user", "security", "session"], + "episodeIds": ["uuid-123", "uuid-456", "uuid-789"] + }, + "1": { + "keywords": ["database", "neo4j", "query", "graph", "cypher"], + "episodeIds": ["uuid-abc", "uuid-def"] + } + }, + "spaces": [ + { + "name": "User Authentication", + "intent": "Episodes about user authentication, login systems, and security belong in this space.", + "confidence": 85, + "topics": [0, 3], + "estimatedEpisodes": 120 + } + ] +} +``` + +**JSON Output Structure:** +- `topics`: Dictionary of topic IDs with keywords and episode UUIDs +- `spaces`: Array of space proposals (only if `--propose-spaces` is used) + - `name`: Space name (2-5 words) + - `intent`: Classification intent (1-2 sentences) + - `confidence`: Confidence score (0-100) + - `topics`: Source topic IDs that form this space + - `estimatedEpisodes`: Estimated number of episodes in this space + +**Use Cases for JSON Mode:** +- Programmatic consumption by other tools +- Piping output to jq or other JSON processors +- Integration with CI/CD pipelines +- Automated space creation workflows + +## How It Works + +1. **Connection**: Establishes connection to Neo4j database +2. **Data Fetching**: Queries all episodes for the given userId that have: + - Non-null `contentEmbedding` field + - Non-empty content +3. **Topic Modeling**: Runs BERTopic with: + - Pre-computed embeddings (no re-embedding needed) + - HDBSCAN clustering (automatic cluster discovery) + - Keyword extraction via c-TF-IDF +4. **Results**: Displays topics with keywords and sample episodes + +## Neo4j Query + +The tool uses this Cypher query to fetch episodes: + +```cypher +MATCH (e:Episode {userId: $userId}) +WHERE e.contentEmbedding IS NOT NULL + AND size(e.contentEmbedding) > 0 + AND e.content IS NOT NULL + AND e.content <> '' +RETURN e.uuid as uuid, + e.content as content, + e.contentEmbedding as embedding, + e.createdAt as createdAt +ORDER BY e.createdAt DESC +``` + +## Tuning Parameters + +- **`--min-topic-size`**: + - Smaller values (5-10): More granular topics, may include noise + - Larger values (20-30): Broader topics, more coherent but fewer clusters + - Recommended: Start with 20 and adjust based on your data + +## Troubleshooting + +### No episodes found + +- Verify the userId exists in Neo4j +- Check that episodes have `contentEmbedding` populated +- Ensure episodes have non-empty `content` field + +### Connection errors + +- Verify Neo4j is running: `docker ps | grep neo4j` +- Check URI format: should be `bolt://host:port` +- Verify credentials are correct + +### Too few/many topics + +- Adjust `--min-topic-size` parameter +- Need more topics: decrease the value (e.g., `--min-topic-size 10`) +- Need fewer topics: increase the value (e.g., `--min-topic-size 30`) + +## Dependencies + +- `bertopic>=0.16.0` - Topic modeling +- `neo4j>=5.14.0` - Neo4j Python driver +- `click>=8.1.0` - CLI framework +- `numpy>=1.24.0` - Numerical operations +- `python-dotenv>=1.0.0` - Environment variable loading + +## License + +Part of the Echo project. diff --git a/apps/webapp/python/main.py b/apps/webapp/python/main.py new file mode 100644 index 0000000..e4fc22a --- /dev/null +++ b/apps/webapp/python/main.py @@ -0,0 +1,384 @@ +#!/usr/bin/env python3 +""" +BERT Topic Modeling CLI for Echo Episodes + +This CLI tool connects to Neo4j, retrieves episodes with their embeddings for a given userId, +and performs topic modeling using BERTopic to discover thematic clusters. +""" + +import os +import sys +import json +from typing import List, Tuple, Dict, Any +import click +import numpy as np +from neo4j import GraphDatabase +from bertopic import BERTopic +from bertopic.vectorizers import ClassTfidfTransformer +from dotenv import load_dotenv +from sklearn.feature_extraction.text import CountVectorizer +from umap import UMAP +from hdbscan import HDBSCAN + + +class Neo4jConnection: + """Manages Neo4j database connection.""" + + def __init__(self, uri: str, username: str, password: str, quiet: bool = False): + """Initialize Neo4j connection. + + Args: + uri: Neo4j connection URI (e.g., bolt://localhost:7687) + username: Neo4j username + password: Neo4j password + quiet: If True, suppress output messages + """ + self.quiet = quiet + try: + self.driver = GraphDatabase.driver(uri, auth=(username, password)) + # Verify connection + self.driver.verify_connectivity() + if not quiet: + click.echo(f"βœ“ Connected to Neo4j at {uri}") + except Exception as e: + if not quiet: + click.echo(f"βœ— Failed to connect to Neo4j: {e}", err=True) + sys.exit(1) + + def close(self): + """Close the Neo4j connection.""" + if self.driver: + self.driver.close() + if not self.quiet: + click.echo("βœ“ Neo4j connection closed") + + def get_episodes_with_embeddings(self, user_id: str) -> Tuple[List[str], List[str], np.ndarray]: + """Fetch all episodes with their embeddings for a given user. + + Args: + user_id: The user ID to fetch episodes for + + Returns: + Tuple of (episode_uuids, episode_contents, embeddings_array) + """ + query = """ + MATCH (e:Episode {userId: $userId}) + WHERE e.contentEmbedding IS NOT NULL + AND size(e.contentEmbedding) > 0 + AND e.content IS NOT NULL + AND e.content <> '' + RETURN e.uuid as uuid, + e.content as content, + e.contentEmbedding as embedding, + e.createdAt as createdAt + ORDER BY e.createdAt DESC + """ + + with self.driver.session() as session: + result = session.run(query, userId=user_id) + records = list(result) + + if not records: + if not self.quiet: + click.echo(f"βœ— No episodes found for userId: {user_id}", err=True) + sys.exit(1) + + uuids = [] + contents = [] + embeddings = [] + + for record in records: + uuids.append(record["uuid"]) + contents.append(record["content"]) + embeddings.append(record["embedding"]) + + embeddings_array = np.array(embeddings, dtype=np.float32) + + if not self.quiet: + click.echo(f"βœ“ Fetched {len(contents)} episodes with embeddings") + return uuids, contents, embeddings_array + + +def run_bertopic_analysis( + contents: List[str], + embeddings: np.ndarray, + min_topic_size: int = 20, + nr_topics: int = None, + quiet: bool = False +) -> Tuple[BERTopic, List[int], List[float]]: + """Run BERTopic clustering on episode contents with improved configuration. + + Args: + contents: List of episode content strings + embeddings: Pre-computed embeddings for the episodes + min_topic_size: Minimum number of documents per topic + nr_topics: Target number of topics (optional, for topic reduction) + quiet: If True, suppress output messages + + Returns: + Tuple of (bertopic_model, topic_assignments, probabilities) + """ + if not quiet: + click.echo(f"\nπŸ” Running BERTopic analysis (min_topic_size={min_topic_size})...") + + # Step 1: Configure UMAP for dimensionality reduction + # More aggressive reduction helps find distinct clusters + umap_model = UMAP( + n_neighbors=15, # Balance between local/global structure + n_components=5, # Reduce to 5 dimensions + min_dist=0.0, # Allow tight clusters + metric='cosine', # Use cosine similarity + random_state=42 + ) + + # Step 2: Configure HDBSCAN for clustering + # Tuned to find more granular topics + hdbscan_model = HDBSCAN( + min_cluster_size=min_topic_size, # Minimum episodes per topic + min_samples=5, # More sensitive to local density + metric='euclidean', + cluster_selection_method='eom', # Excess of mass method + prediction_data=True + ) + + # Step 3: Configure vectorizer with stopword removal + # Remove common English stopwords that pollute topic keywords + vectorizer_model = CountVectorizer( + stop_words='english', # Remove common English words + min_df=2, # Word must appear in at least 2 docs + max_df=0.95, # Ignore words in >95% of docs + ngram_range=(1, 2) # Include unigrams and bigrams + ) + + # Step 4: Configure c-TF-IDF with better parameters + ctfidf_model = ClassTfidfTransformer( + reduce_frequent_words=True, # Further reduce common words + bm25_weighting=True # Use BM25 for better keyword extraction + ) + + # Step 5: Initialize BERTopic with all custom components + model = BERTopic( + embedding_model=None, # Use pre-computed embeddings + umap_model=umap_model, + hdbscan_model=hdbscan_model, + vectorizer_model=vectorizer_model, + ctfidf_model=ctfidf_model, + top_n_words=15, # More keywords per topic + nr_topics=nr_topics, # Optional topic reduction + calculate_probabilities=True, + verbose=(not quiet) + ) + + # Fit the model with pre-computed embeddings + topics, probs = model.fit_transform(contents, embeddings=embeddings) + + # Get topic count + unique_topics = len(set(topics)) - (1 if -1 in topics else 0) + if not quiet: + click.echo(f"βœ“ Topic modeling complete - Found {unique_topics} topics") + + return model, topics, probs + + +def print_topic_results( + model: BERTopic, + topics: List[int], + uuids: List[str], + contents: List[str] +): + """Print formatted topic results. + + Args: + model: Fitted BERTopic model + topics: Topic assignments for each episode + uuids: Episode UUIDs + contents: Episode contents + """ + # Get topic info + topic_info = model.get_topic_info() + num_topics = len(topic_info) - 1 # Exclude outlier topic (-1) + + click.echo(f"\n{'='*80}") + click.echo(f"TOPIC MODELING RESULTS") + click.echo(f"{'='*80}") + click.echo(f"Total Topics Found: {num_topics}") + click.echo(f"Total Episodes: {len(contents)}") + click.echo(f"{'='*80}\n") + + # Print each topic + for idx, row in topic_info.iterrows(): + topic_id = row['Topic'] + count = row['Count'] + + # Skip outlier topic + if topic_id == -1: + click.echo(f"Topic -1 (Outliers): {count} episodes\n") + continue + + # Get top words for this topic + topic_words = model.get_topic(topic_id) + + click.echo(f"{'─'*80}") + click.echo(f"Topic {topic_id}: {count} episodes") + click.echo(f"{'─'*80}") + + # Print top keywords + if topic_words: + keywords = [word for word, score in topic_words[:10]] + click.echo(f"Keywords: {', '.join(keywords)}") + + # Print sample episodes + topic_episodes = [(uuid, content) for uuid, content, topic + in zip(uuids, contents, topics) if topic == topic_id] + + click.echo(f"\nSample Episodes (showing up to 3):") + for i, (uuid, content) in enumerate(topic_episodes[:3]): + # Truncate content for display + truncated = content[:200] + "..." if len(content) > 200 else content + click.echo(f" {i+1}. [{uuid}]") + click.echo(f" {truncated}\n") + + click.echo() + + +def build_json_output( + model: BERTopic, + topics: List[int], + uuids: List[str] +) -> Dict[str, Any]: + """Build JSON output structure. + + Args: + model: Fitted BERTopic model + topics: Topic assignments for each episode + uuids: Episode UUIDs + + Returns: + Dictionary with topics data + """ + # Build topics dictionary + topics_dict = {} + topic_info = model.get_topic_info() + + for idx, row in topic_info.iterrows(): + topic_id = row['Topic'] + + # Skip outlier topic + if topic_id == -1: + continue + + # Get keywords + topic_words = model.get_topic(topic_id) + keywords = [word for word, score in topic_words[:10]] if topic_words else [] + + # Get episode IDs for this topic + episode_ids = [uuid for uuid, topic in zip(uuids, topics) if topic == topic_id] + + topics_dict[topic_id] = { + "keywords": keywords, + "episodeIds": episode_ids + } + + return {"topics": topics_dict} + + +@click.command() +@click.argument('user_id', type=str) +@click.option( + '--min-topic-size', + default=10, + type=int, + help='Minimum number of episodes per topic (default: 10, lower = more granular topics)' +) +@click.option( + '--nr-topics', + default=None, + type=int, + help='Target number of topics for reduction (optional, e.g., 20 for ~20 topics)' +) +@click.option( + '--neo4j-uri', + envvar='NEO4J_URI', + default='bolt://localhost:7687', + help='Neo4j connection URI (default: bolt://localhost:7687)' +) +@click.option( + '--neo4j-username', + envvar='NEO4J_USERNAME', + default='neo4j', + help='Neo4j username (default: neo4j)' +) +@click.option( + '--neo4j-password', + envvar='NEO4J_PASSWORD', + required=True, + help='Neo4j password (required, can use NEO4J_PASSWORD env var)' +) +@click.option( + '--json', + 'json_output', + is_flag=True, + default=False, + help='Output only final results in JSON format (suppresses all other output)' +) +def main(user_id: str, min_topic_size: int, nr_topics: int, neo4j_uri: str, neo4j_username: str, neo4j_password: str, json_output: bool): + """ + Run BERTopic analysis on episodes for a given USER_ID. + + This tool connects to Neo4j, retrieves all episodes with embeddings for the specified user, + and performs topic modeling to discover thematic clusters. + + Examples: + + # Using environment variables from .env file + python main.py user-123 + + # With custom min topic size + python main.py user-123 --min-topic-size 10 + + # With explicit Neo4j credentials + python main.py user-123 --neo4j-uri bolt://localhost:7687 --neo4j-password mypassword + """ + # Print header only if not in JSON mode + if not json_output: + click.echo(f"\n{'='*80}") + click.echo("BERT TOPIC MODELING FOR ECHO EPISODES") + click.echo(f"{'='*80}") + click.echo(f"User ID: {user_id}") + click.echo(f"Min Topic Size: {min_topic_size}") + if nr_topics: + click.echo(f"Target Topics: ~{nr_topics}") + click.echo(f"{'='*80}\n") + + # Connect to Neo4j (quiet mode if JSON output) + neo4j_conn = Neo4jConnection(neo4j_uri, neo4j_username, neo4j_password, quiet=json_output) + + try: + # Fetch episodes with embeddings + uuids, contents, embeddings = neo4j_conn.get_episodes_with_embeddings(user_id) + + # Run BERTopic analysis + model, topics, probs = run_bertopic_analysis(contents, embeddings, min_topic_size, nr_topics, quiet=json_output) + + # Output results + if json_output: + # JSON output mode - only print JSON + output = build_json_output(model, topics, uuids) + click.echo(json.dumps(output, indent=2)) + else: + # Normal output mode - print formatted results + print_topic_results(model, topics, uuids, contents) + + click.echo(f"{'='*80}") + click.echo("βœ“ Analysis complete!") + click.echo(f"{'='*80}\n") + + finally: + # Always close connection + neo4j_conn.close() + + +if __name__ == '__main__': + # Load environment variables from .env file if present + load_dotenv() + main() diff --git a/apps/webapp/python/requirements.txt b/apps/webapp/python/requirements.txt new file mode 100644 index 0000000..3b9f751 --- /dev/null +++ b/apps/webapp/python/requirements.txt @@ -0,0 +1,8 @@ +bertopic>=0.16.0 +neo4j>=5.14.0 +click>=8.1.0 +numpy>=1.24.0 +python-dotenv>=1.0.0 +scikit-learn>=1.3.0 +umap-learn>=0.5.4 +hdbscan>=0.8.33 diff --git a/apps/webapp/trigger.config.ts b/apps/webapp/trigger.config.ts index 938f4b5..65ed8f1 100644 --- a/apps/webapp/trigger.config.ts +++ b/apps/webapp/trigger.config.ts @@ -1,6 +1,7 @@ import { defineConfig } from "@trigger.dev/sdk/v3"; import { syncEnvVars } from "@trigger.dev/build/extensions/core"; import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; +import { pythonExtension } from "@trigger.dev/python/extension"; export default defineConfig({ project: process.env.TRIGGER_PROJECT_ID as string, @@ -23,6 +24,9 @@ export default defineConfig({ dirs: ["./app/trigger"], build: { extensions: [ + pythonExtension({ + scripts: ["./python/*.py"], + }), syncEnvVars(() => ({ // ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY as string, // API_BASE_URL: process.env.API_BASE_URL as string, diff --git a/docker/Dockerfile b/docker/Dockerfile index 8833971..c994713 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -55,7 +55,16 @@ RUN pnpm run build --filter=webapp... # Runner FROM ${NODE_IMAGE} AS runner -RUN apt-get update && apt-get install -y openssl netcat-openbsd ca-certificates +RUN apt-get update && apt-get install -y \ + openssl \ + netcat-openbsd \ + ca-certificates \ + python3 \ + python3-pip \ + python3-venv \ + gcc \ + g++ \ + && rm -rf /var/lib/apt/lists/* WORKDIR /core RUN corepack enable ENV NODE_ENV production @@ -69,6 +78,13 @@ COPY --from=builder --chown=node:node /core/apps/webapp/build ./apps/webapp/buil COPY --from=builder --chown=node:node /core/apps/webapp/public ./apps/webapp/public COPY --from=builder --chown=node:node /core/scripts ./scripts +# Install BERT Python dependencies +COPY --chown=node:node apps/webapp/python/requirements.txt ./apps/webapp/python/requirements.txt +RUN pip3 install --no-cache-dir -r ./apps/webapp/python/requirements.txt + +# Copy BERT scripts +COPY --chown=node:node apps/webapp/python/main.py ./apps/webapp/python/main.py + EXPOSE 3000 USER node diff --git a/docs/self-hosting/docker.mdx b/docs/self-hosting/docker.mdx index 2dde599..42143b5 100644 --- a/docs/self-hosting/docker.mdx +++ b/docs/self-hosting/docker.mdx @@ -14,9 +14,7 @@ description: "Get started with CORE in 5 minutes" ## Requirements -These are the minimum requirements for running the webapp and background job components. They can run on the same, or on separate machines. - -It's fine to run everything on the same machine for testing. To be able to scale your workers, you will want to run them separately. +These are the minimum requirements for running the core. ### Prerequisites @@ -27,7 +25,6 @@ To run CORE, you will need: ### System Requirements -**Webapp & Database Machine:** - 4+ vCPU - 8+ GB RAM - 20+ GB Storage @@ -41,7 +38,7 @@ CORE offers multiple deployment approaches depending on your needs: For a one-click deployment experience, use Railway: -[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/6aEd9C?referralCode=LHvbIb&utm_medium=integration&utm_source=template&utm_campaign=generic) +[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/core?referralCode=LHvbIb&utm_medium=integration&utm_source=template&utm_campaign=generic) Railway will automatically set up all required services and handle the infrastructure for you. diff --git a/docs/self-hosting/overview.mdx b/docs/self-hosting/overview.mdx index aea684d..5850fca 100644 --- a/docs/self-hosting/overview.mdx +++ b/docs/self-hosting/overview.mdx @@ -16,7 +16,7 @@ We provide version-tagged releases for self-hosted deployments. It's highly advi For a quick one-click deployment, you can use Railway: -[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/6aEd9C?referralCode=LHvbIb&utm_medium=integration&utm_source=template&utm_campaign=generic) +[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/core?referralCode=LHvbIb&utm_medium=integration&utm_source=template&utm_campaign=generic) Alternatively, you can follow our [Docker deployment guide](/self-hosting/docker) for manual setup. diff --git a/hosting/docker/.env b/hosting/docker/.env index 1d6bf66..56a84f4 100644 --- a/hosting/docker/.env +++ b/hosting/docker/.env @@ -52,4 +52,6 @@ MODEL=gpt-4.1-2025-04-14 ## for opensource embedding model # EMBEDDING_MODEL=mxbai-embed-large -QUEUE_PROVIDER=bullmq \ No newline at end of file +QUEUE_PROVIDER=bullmq + +TELEMETRY_ENABLED=false \ No newline at end of file diff --git a/hosting/docker/docker-compose.yaml b/hosting/docker/docker-compose.yaml index 4487903..3d102ee 100644 --- a/hosting/docker/docker-compose.yaml +++ b/hosting/docker/docker-compose.yaml @@ -33,6 +33,7 @@ services: - ENABLE_EMAIL_LOGIN=${ENABLE_EMAIL_LOGIN} - OLLAMA_URL=${OLLAMA_URL} - EMBEDDING_MODEL=${EMBEDDING_MODEL} + - EMBEDDING_MODEL_SIZE=${EMBEDDING_MODEL_SIZE} - MODEL=${MODEL} - TRIGGER_PROJECT_ID=${TRIGGER_PROJECT_ID} - TRIGGER_SECRET_KEY=${TRIGGER_SECRET_KEY} diff --git a/packages/database/prisma/migrations/20251029102022_add_metadata_to_workspace/migration.sql b/packages/database/prisma/migrations/20251029102022_add_metadata_to_workspace/migration.sql new file mode 100644 index 0000000..fbff632 --- /dev/null +++ b/packages/database/prisma/migrations/20251029102022_add_metadata_to_workspace/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Workspace" ADD COLUMN "metadata" JSONB NOT NULL DEFAULT '{}'; diff --git a/packages/database/prisma/schema.prisma b/packages/database/prisma/schema.prisma index e6f67e0..ae728fa 100644 --- a/packages/database/prisma/schema.prisma +++ b/packages/database/prisma/schema.prisma @@ -694,6 +694,8 @@ model Workspace { slug String @unique icon String? + metadata Json @default("{}") + integrations String[] userId String? @unique diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a78a8f..0d21cb5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,253 +31,6 @@ importers: specifier: 5.5.4 version: 5.5.4 - apps/init: - dependencies: - '@clack/prompts': - specifier: ^0.10.0 - version: 0.10.1 - '@depot/cli': - specifier: 0.0.1-cli.2.80.0 - version: 0.0.1-cli.2.80.0 - '@opentelemetry/api': - specifier: 1.9.0 - version: 1.9.0 - '@opentelemetry/api-logs': - specifier: 0.52.1 - version: 0.52.1 - '@opentelemetry/exporter-logs-otlp-http': - specifier: 0.52.1 - version: 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': - specifier: 0.52.1 - version: 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': - specifier: 0.52.1 - version: 0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0) - '@opentelemetry/instrumentation-fetch': - specifier: 0.52.1 - version: 0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0) - '@opentelemetry/resources': - specifier: 1.25.1 - version: 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': - specifier: 0.52.1 - version: 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node': - specifier: 0.52.1 - version: 0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0) - '@opentelemetry/sdk-trace-base': - specifier: 1.25.1 - version: 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': - specifier: 1.25.1 - version: 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': - specifier: 1.25.1 - version: 1.25.1 - ansi-escapes: - specifier: ^7.0.0 - version: 7.0.0 - braces: - specifier: ^3.0.3 - version: 3.0.3 - c12: - specifier: ^1.11.1 - version: 1.11.2(magicast@0.3.5) - chalk: - specifier: ^5.2.0 - version: 5.4.1 - chokidar: - specifier: ^3.6.0 - version: 3.6.0 - cli-table3: - specifier: ^0.6.3 - version: 0.6.5 - commander: - specifier: ^9.4.1 - version: 9.5.0 - defu: - specifier: ^6.1.4 - version: 6.1.4 - dotenv: - specifier: ^16.4.5 - version: 16.5.0 - dotenv-expand: - specifier: ^12.0.2 - version: 12.0.2 - esbuild: - specifier: ^0.23.0 - version: 0.23.1 - eventsource: - specifier: ^3.0.2 - version: 3.0.7 - evt: - specifier: ^2.4.13 - version: 2.5.9 - fast-npm-meta: - specifier: ^0.2.2 - version: 0.2.2 - git-last-commit: - specifier: ^1.0.1 - version: 1.0.1 - gradient-string: - specifier: ^2.0.2 - version: 2.0.2 - has-flag: - specifier: ^5.0.1 - version: 5.0.1 - import-in-the-middle: - specifier: 1.11.0 - version: 1.11.0 - import-meta-resolve: - specifier: ^4.1.0 - version: 4.1.0 - ini: - specifier: ^5.0.0 - version: 5.0.0 - jsonc-parser: - specifier: 3.2.1 - version: 3.2.1 - knex: - specifier: 3.1.0 - version: 3.1.0(pg@8.16.3)(supports-color@10.0.0) - magicast: - specifier: ^0.3.4 - version: 0.3.5 - minimatch: - specifier: ^10.0.1 - version: 10.0.2 - mlly: - specifier: ^1.7.1 - version: 1.7.4 - nanoid: - specifier: 3.3.8 - version: 3.3.8 - nypm: - specifier: ^0.5.4 - version: 0.5.4 - object-hash: - specifier: ^3.0.0 - version: 3.0.0 - open: - specifier: ^10.0.3 - version: 10.2.0 - p-limit: - specifier: ^6.2.0 - version: 6.2.0 - p-retry: - specifier: ^6.1.0 - version: 6.2.1 - partysocket: - specifier: ^1.0.2 - version: 1.1.4 - pg: - specifier: 8.16.3 - version: 8.16.3 - pkg-types: - specifier: ^1.1.3 - version: 1.3.1 - polka: - specifier: ^0.5.2 - version: 0.5.2 - resolve: - specifier: ^1.22.8 - version: 1.22.10 - semver: - specifier: ^7.5.0 - version: 7.7.2 - signal-exit: - specifier: ^4.1.0 - version: 4.1.0 - source-map-support: - specifier: 0.5.21 - version: 0.5.21 - std-env: - specifier: ^3.7.0 - version: 3.9.0 - supports-color: - specifier: ^10.0.0 - version: 10.0.0 - tiny-invariant: - specifier: ^1.2.0 - version: 1.3.3 - tinyexec: - specifier: ^0.3.1 - version: 0.3.2 - tinyglobby: - specifier: ^0.2.10 - version: 0.2.14 - uuid: - specifier: 11.1.0 - version: 11.1.0 - ws: - specifier: ^8.18.0 - version: 8.18.3 - xdg-app-paths: - specifier: ^8.3.0 - version: 8.3.0 - zod: - specifier: 3.23.8 - version: 3.23.8 - zod-validation-error: - specifier: ^1.5.0 - version: 1.5.0(zod@3.23.8) - devDependencies: - '@epic-web/test-server': - specifier: ^0.1.0 - version: 0.1.6 - '@types/gradient-string': - specifier: ^1.1.2 - version: 1.1.6 - '@types/ini': - specifier: ^4.1.1 - version: 4.1.1 - '@types/object-hash': - specifier: 3.0.6 - version: 3.0.6 - '@types/polka': - specifier: ^0.5.7 - version: 0.5.7 - '@types/react': - specifier: ^18.2.48 - version: 18.2.69 - '@types/resolve': - specifier: ^1.20.6 - version: 1.20.6 - '@types/rimraf': - specifier: ^4.0.5 - version: 4.0.5 - '@types/semver': - specifier: ^7.5.0 - version: 7.7.0 - '@types/source-map-support': - specifier: 0.5.10 - version: 0.5.10 - '@types/ws': - specifier: ^8.5.3 - version: 8.18.1 - cpy-cli: - specifier: ^5.0.0 - version: 5.0.0 - execa: - specifier: ^8.0.1 - version: 8.0.1 - find-up: - specifier: ^7.0.0 - version: 7.0.0 - rimraf: - specifier: ^5.0.7 - version: 5.0.10 - ts-essentials: - specifier: 10.0.1 - version: 10.0.1(typescript@5.8.3) - tshy: - specifier: ^3.0.2 - version: 3.0.2 - tsx: - specifier: 4.17.0 - version: 4.17.0 - apps/webapp: dependencies: '@ai-sdk/amazon-bedrock': @@ -478,6 +231,9 @@ importers: '@tiptap/starter-kit': specifier: 2.11.9 version: 2.11.9 + '@trigger.dev/python': + specifier: 4.0.4 + version: 4.0.4(@trigger.dev/build@4.0.4(typescript@5.8.3))(@trigger.dev/sdk@4.0.4(ai@5.0.78(zod@3.25.76))(zod@3.25.76)) '@trigger.dev/react-hooks': specifier: 4.0.4 version: 4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1001,10 +757,6 @@ packages: zod: optional: true - '@arr/every@1.0.1': - resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} - engines: {node: '>=4'} - '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -1702,19 +1454,9 @@ packages: '@changesets/write@0.2.3': resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} - '@clack/core@0.4.2': - resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==} - - '@clack/prompts@0.10.1': - resolution: {integrity: sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==} - '@coji/remix-auth-google@4.2.0': resolution: {integrity: sha512-H9i3fvVz0GE18GUZHpz7p7FQjuiuloTIBAPjW7cfv7lUEk+mI6WRTVLEHJBLLuTlAF1+0EbzvPRYKutxZiFdfw==} - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - '@conform-to/dom@0.6.3': resolution: {integrity: sha512-8UbO8vTP0lwpJjzo0TIrQMqWQb65Gj6WpNEVfhHouTEkFTDCP9mND2kO6w1e4TgucRfIDKleYxcFee3lNZsBcw==} @@ -1732,65 +1474,6 @@ packages: '@daybrush/utils@1.13.0': resolution: {integrity: sha512-ALK12C6SQNNHw1enXK+UO8bdyQ+jaWNQ1Af7Z3FNxeAwjYhQT7do+TRE4RASAJ3ObaS2+TJ7TXR3oz2Gzbw0PQ==} - '@depot/cli-darwin-arm64@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-H7tQ0zWXVmdYXGFvt3d/v5fmquMlMM1I9JC8C2yiBZ9En9a20hzSbKoiym92RtcfqjKQFvhXL0DT6vQmJ8bgQA==} - engines: {node: '>=14'} - cpu: [arm64] - os: [darwin] - - '@depot/cli-darwin-x64@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-3RDyybnCC2YSvbJCkHxXBYbKR7adUO7U00O9DHreX8EyS2E/C3kQgET+rFXR+iDdeG0h+h+At2rDng7AxvUhDw==} - engines: {node: '>=14'} - cpu: [x64] - os: [darwin] - - '@depot/cli-linux-arm64@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-Fc1+Guqdsl2WM+b+76FirRjjRvEoYZX0MI4uuIQF9c9gwp6UZSZ5o3U7lAUpdkclVMKXSAW5bsIpgcOfUiJX3w==} - engines: {node: '>=14'} - cpu: [arm64] - os: [linux] - - '@depot/cli-linux-arm@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-95kjKwKxP6RKkAhJoPlO6g3drEYpFWy9AC7QfvQMHDRnI3HXgbxA/BSTp4R3C4TTfp5JUPShVf8Js/NAcrUpUQ==} - engines: {node: '>=14'} - cpu: [arm] - os: [linux] - - '@depot/cli-linux-ia32@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-2KoyIoYqnyIuynPN+mWbugoOB2APiNNvFLKERWOwPa0KYLSfcENT3sYxDW8tDuIw2dftHlmZN73uvXrGFeMcDQ==} - engines: {node: '>=14'} - cpu: [ia32] - os: [linux] - - '@depot/cli-linux-x64@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-B8xDlXFxhYHD2tUk0jUv7SKipLfWwJVlY7ZhDQixyQzatibXakahdqpvZJgE6FLZJd3lgFIEAVsKURZHa1l57A==} - engines: {node: '>=14'} - cpu: [x64] - os: [linux] - - '@depot/cli-win32-arm64@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-CPJX691MKEhnKZX25xS+opWESgPQ73HKkEwkAvvVqdBzahndcHoqAeIxYLv2hoCqrDlkH3YCF+DJleLiEP3blA==} - engines: {node: '>=14'} - cpu: [arm64] - os: [win32] - - '@depot/cli-win32-ia32@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-6eewZ1zPEyNL3zcCwC01s3rZNMqMGVu1iv/EPywj3/uk4CNyUBaTlZ3StQ1BLFHPQnU0vk29yOzA5ZEuRLSyxA==} - engines: {node: '>=14'} - cpu: [ia32] - os: [win32] - - '@depot/cli-win32-x64@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-9CRcc7D0/x4UrBkDuc35WVPMQG5gKMD1JckGLEl6VREE0Ppdny6n+hunQ8prwVc8aqzKG134XCC2U4DUjYg18A==} - engines: {node: '>=14'} - cpu: [x64] - os: [win32] - - '@depot/cli@0.0.1-cli.2.80.0': - resolution: {integrity: sha512-KvmOiQdpbamFziqnzzgqBm6RjfGhLJimBBYEOVriTxCPtVJuBIFm34xZllM36OQzPZIWpWBP+2/UnOyRG5smUg==} - engines: {node: '>=14'} - hasBin: true - '@edgefirst-dev/data@0.0.4': resolution: {integrity: sha512-VLhlvEPDJ0Sd0pE6sAYTQkIqZCXVonaWlgRJIQQHzfjTXCadF77qqHj5NxaPSc4wCul0DJO/0MnejVqJAXUiRg==} engines: {node: '>=20.0.0'} @@ -1828,10 +1511,6 @@ packages: '@emotion/memoize@0.7.4': resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - '@epic-web/test-server@0.1.6': - resolution: {integrity: sha512-n6+dZKI2I3J8f3vjIFAYh5trgAJl0crji76+K1aoiRJqEYjdsCX/nVgBrkBCwPpBqhv9NZ1XlMqzfOafkqY5EQ==} - engines: {node: '>=20'} - '@esbuild/aix-ppc64@0.19.11': resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} engines: {node: '>=12'} @@ -1844,12 +1523,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.25.5': resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} @@ -1874,12 +1547,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.25.5': resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} @@ -1904,12 +1571,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.25.5': resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} @@ -1934,12 +1595,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.25.5': resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} @@ -1964,12 +1619,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.25.5': resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} @@ -1994,12 +1643,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.25.5': resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} @@ -2024,12 +1667,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.25.5': resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} @@ -2054,12 +1691,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} @@ -2084,12 +1715,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.25.5': resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} @@ -2114,12 +1739,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.25.5': resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} @@ -2144,12 +1763,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.25.5': resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} @@ -2174,12 +1787,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.25.5': resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} @@ -2204,12 +1811,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.25.5': resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} @@ -2234,12 +1835,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.25.5': resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} @@ -2264,12 +1859,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.25.5': resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} @@ -2294,12 +1883,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.25.5': resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} @@ -2324,12 +1907,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.25.5': resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} @@ -2360,24 +1937,12 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.5': resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.25.5': resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} @@ -2402,12 +1967,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.5': resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} @@ -2432,12 +1991,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.25.5': resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} @@ -2462,12 +2015,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.25.5': resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} @@ -2492,12 +2039,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.25.5': resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} @@ -2522,12 +2063,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.25.5': resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} @@ -2574,15 +2109,6 @@ packages: resolution: {integrity: sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==} engines: {node: '>=14.0.0'} - '@grpc/grpc-js@1.13.4': - resolution: {integrity: sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==} - engines: {node: '>=12.10.0'} - - '@grpc/proto-loader@0.7.15': - resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} - engines: {node: '>=6'} - hasBin: true - '@hapi/boom@10.0.1': resolution: {integrity: sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==} @@ -2601,19 +2127,6 @@ packages: '@hapi/wreck@18.1.0': resolution: {integrity: sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w==} - '@hono/node-server@1.16.0': - resolution: {integrity: sha512-9LwRb5XOrTFapOABiQjGC50wRVlzUvWZsDHINCnkBniP+Q+LQf4waN0nzk9t+2kqcTsnGnieSmqpHsr6kH2bdw==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - - '@hono/node-ws@1.2.0': - resolution: {integrity: sha512-OBPQ8OSHBw29mj00wT/xGYtB6HY54j0fNSdVZ7gZM3TUeq0So11GXaWtFf1xWxQNfumKIsj0wRuLKWfVsO5GgQ==} - engines: {node: '>=18.14.1'} - peerDependencies: - '@hono/node-server': ^1.11.1 - hono: ^4.6.0 - '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -2680,9 +2193,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@jsonhero/path@1.0.21': resolution: {integrity: sha512-gVUDj/92acpVoJwsVJ/RuWOaHyG4oFzn898WNGQItLCTQ+hOaVlEaImhwE1WqOTf+l3dGOUkbSiVKlb3q1hd1Q==} @@ -2844,39 +2354,20 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - '@open-draft/deferred-promise@2.2.0': - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - '@opentelemetry/api-logs@0.203.0': resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} engines: {node: '>=8.0.0'} - '@opentelemetry/api-logs@0.52.1': - resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} - engines: {node: '>=14'} - '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@1.25.1': - resolution: {integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/context-async-hooks@2.0.1': resolution: {integrity: sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@1.25.1': - resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.0.1': resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} engines: {node: ^18.19.0 || >=20.6.0} @@ -2889,108 +2380,30 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-http@0.52.1': - resolution: {integrity: sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/exporter-trace-otlp-grpc@0.52.1': - resolution: {integrity: sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - '@opentelemetry/exporter-trace-otlp-http@0.203.0': resolution: {integrity: sha512-ZDiaswNYo0yq/cy1bBLJFe691izEJ6IgNmkjm4C6kE9ub/OMQqDXORx2D2j8fzTBTxONyzusbaZlqtfmyqURPw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-http@0.52.1': - resolution: {integrity: sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/exporter-trace-otlp-proto@0.52.1': - resolution: {integrity: sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/exporter-zipkin@1.25.1': - resolution: {integrity: sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/instrumentation-fetch@0.52.1': - resolution: {integrity: sha512-EJDQXdv1ZGyBifox+8BK+hP0tg29abNPdScE+lW77bUVrThD5vn2dOo+blAS3Z8Od+eqTUTDzXVDIFjGgTK01w==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - '@opentelemetry/instrumentation@0.203.0': resolution: {integrity: sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.52.1': - resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.203.0': resolution: {integrity: sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.52.1': - resolution: {integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - - '@opentelemetry/otlp-grpc-exporter-base@0.52.1': - resolution: {integrity: sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.0.0 - '@opentelemetry/otlp-transformer@0.203.0': resolution: {integrity: sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-transformer@0.52.1': - resolution: {integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/propagator-b3@1.25.1': - resolution: {integrity: sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/propagator-jaeger@1.25.1': - resolution: {integrity: sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/resources@1.25.1': - resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@2.0.1': resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} engines: {node: ^18.19.0 || >=20.6.0} @@ -3003,64 +2416,24 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-logs@0.52.1': - resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.10.0' - - '@opentelemetry/sdk-metrics@1.25.1': - resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-metrics@2.0.1': resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.9.0 <1.10.0' - '@opentelemetry/sdk-node@0.52.1': - resolution: {integrity: sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@1.25.1': - resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-base@2.0.1': resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-node@1.25.1': - resolution: {integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-node@2.0.1': resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-web@1.25.1': - resolution: {integrity: sha512-SS6JaSkHngcBCNdWGthzcvaKGRnDw2AeP57HyTEileLToJ7WLMeV+064iRlVyoT4+e77MRp2T2dDSrmaUyxoNg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/semantic-conventions@1.25.1': - resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} - engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.36.0': resolution: {integrity: sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==} engines: {node: '>=14'} @@ -3169,9 +2542,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@polka/url@0.5.0': - resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} - '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -5556,6 +4926,13 @@ packages: resolution: {integrity: sha512-c5myttkNhqaqvLlEz3ttE1qEsULlD6ILBge5FAfEtMv9HVS/pNlgvMKrdFMefaGO/bE4HoxrNGdJsY683Kq32w==} engines: {node: '>=18.20.0'} + '@trigger.dev/python@4.0.4': + resolution: {integrity: sha512-46eYZZtvMsd+kahHlysOABDip2aLtyQHnR9PK+NqL7UDaKj9Rj67tG5Qb9UWgolc4W4tIDpBBedipexmJaJhtA==} + engines: {node: '>=18.20.0'} + peerDependencies: + '@trigger.dev/build': ^4.0.4 + '@trigger.dev/sdk': ^4.0.4 + '@trigger.dev/react-hooks@4.0.4': resolution: {integrity: sha512-tgyaGKwFTbVaD4QZdR5GBc2R7T/yq+vHpWw506ys75Mo9uEZN0rGmw7g5q1Pe4XJvsdDiVjcxcJ4tK8zwUM5Zg==} engines: {node: '>=18.20.0'} @@ -5726,9 +5103,6 @@ packages: '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} - '@types/gradient-string@1.1.6': - resolution: {integrity: sha512-LkaYxluY4G5wR1M4AKQUal2q61Di1yVVCw42ImFTuaIoQVgmV0WP1xUaLB8zwb47mp82vWTpePI9JmrjEnJ7nQ==} - '@types/hast@2.3.10': resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} @@ -5738,9 +5112,6 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/ini@4.1.1': - resolution: {integrity: sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==} - '@types/is-ci@3.0.4': resolution: {integrity: sha512-AkCYCmwlXeuH89DagDCzvCAyltI2v9lh3U3DqSg/GrBYoReAaWwxfXCqMx9UV5MajLZ4ZFwZzV4cABGIxk2XRw==} @@ -5810,12 +5181,6 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/object-hash@3.0.6': - resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==} - - '@types/polka@0.5.7': - resolution: {integrity: sha512-TH8CDXM8zoskPCNmWabtK7ziGv9Q21s4hMZLVYK5HFEfqmGXBqq/Wgi7jNELWXftZK/1J/9CezYa06x1RKeQ+g==} - '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -5845,16 +5210,6 @@ packages: '@types/react@18.2.69': resolution: {integrity: sha512-W1HOMUWY/1Yyw0ba5TkCV+oqynRjG7BnteBB+B7JmAK7iw3l2SW+VGOxL+akPweix6jk2NNJtyJKpn4TkpfK3Q==} - '@types/resolve@1.20.6': - resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} - - '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - - '@types/rimraf@4.0.5': - resolution: {integrity: sha512-DTCZoIQotB2SUJnYgrEx43cQIUYOlNZz0AZPbKU4PSLYTUdML5Gox0++z4F9kQocxStrCmRNhi4x5x/UlwtKUA==} - deprecated: This is a stub types definition. rimraf provides its own type definitions, so you do not need this installed. - '@types/scheduler@0.26.0': resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} @@ -5867,24 +5222,12 @@ packages: '@types/serve-static@1.15.8': resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} - '@types/shimmer@1.2.0': - resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} - '@types/simple-oauth2@5.0.7': resolution: {integrity: sha512-8JbWVJbiTSBQP/7eiyGKyXWAqp3dKQZpaA+pdW16FCi32ujkzRMG8JfjoAzdWt6W8U591ZNdHcPtP2D7ILTKuA==} '@types/slug@5.0.9': resolution: {integrity: sha512-6Yp8BSplP35Esa/wOG1wLNKiqXevpQTEF/RcL/NV6BBQaMmZh4YlDwCgrrFSoUE4xAGvnKd5c+lkQJmPrBAzfQ==} - '@types/source-map-support@0.5.10': - resolution: {integrity: sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==} - - '@types/tinycolor2@1.4.6': - resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} - - '@types/trouter@3.1.4': - resolution: {integrity: sha512-4YIL/2AvvZqKBWenjvEpxpblT2KGO6793ipr5QS7/6DpQ3O3SwZGgNGWezxf3pzeYZc24a2pJIrR/+Jxh/wYNQ==} - '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -5903,9 +5246,6 @@ packages: '@types/webpack@5.28.5': resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@5.62.0': resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6240,10 +5580,6 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - aggregate-error@4.0.1: - resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} - engines: {node: '>=12'} - ai@5.0.78: resolution: {integrity: sha512-ec77fmQwJGLduswMrW4AAUGSOiu8dZaIwMmWHHGKsrMUFFS6ugfkTyx0srtuKYHNRRLRC2dT7cPirnUl98VnxA==} engines: {node: '>=18'} @@ -6273,10 +5609,6 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} - engines: {node: '>=18'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -6374,10 +5706,6 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - arrify@3.0.0: - resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} - engines: {node: '>=12'} - ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -6514,10 +5842,6 @@ packages: bullmq@5.53.2: resolution: {integrity: sha512-xHgxrP/yNJHD7VCw1h+eRBh+2TCPBCM39uC9gCyksYc6ufcJP+HTZ/A2lzB2x7qMFWrvsX7tM40AT2BmdkYL/Q==} - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6532,14 +5856,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - c12@1.11.2: - resolution: {integrity: sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==} - peerDependencies: - magicast: ^0.3.4 - peerDependenciesMeta: - magicast: - optional: true - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -6647,9 +5963,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} @@ -6666,10 +5979,6 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - clean-stack@4.2.0: - resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} - engines: {node: '>=12'} - cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -6678,10 +5987,6 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} - client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -6746,9 +6051,6 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -6787,10 +6089,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -6879,19 +6177,6 @@ packages: typescript: optional: true - cp-file@10.0.0: - resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==} - engines: {node: '>=14.16'} - - cpy-cli@5.0.0: - resolution: {integrity: sha512-fb+DZYbL9KHc0BC4NYqGRrDIJZPXUmjjtqdw4XRRg8iV8dIfghUX/WiL+q4/B/KFTy3sK6jsbUhBaz0/Hxg7IQ==} - engines: {node: '>=16'} - hasBin: true - - cpy@10.1.0: - resolution: {integrity: sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ==} - engines: {node: '>=16'} - crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} @@ -7146,15 +6431,6 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -7215,14 +6491,6 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} - - default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} - engines: {node: '>=18'} - defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -7230,10 +6498,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -7241,9 +6505,6 @@ packages: defined@1.0.1: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -7263,9 +6524,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destr@2.0.5: - resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -7343,10 +6601,6 @@ packages: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} - dotenv-expand@12.0.2: - resolution: {integrity: sha512-lXpXz2ZE1cea1gL4sz2Ipj8y4PiVjytYr3Ij0SWoms1PGxIv7m2CRKuRuCRtHdVuvM/hNJPMxt5PbhboNC4dPQ==} - engines: {node: '>=12'} - dotenv@16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} @@ -7434,10 +6688,6 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -7507,11 +6757,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.25.5: resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} @@ -7532,10 +6777,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - eslint-config-prettier@8.10.0: resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true @@ -7699,10 +6940,6 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - esm@3.2.25: - resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} - engines: {node: '>=6'} - espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7768,9 +7005,6 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} - event-target-polyfill@0.0.4: - resolution: {integrity: sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -7854,9 +7088,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-npm-meta@0.2.2: - resolution: {integrity: sha512-E+fdxeaOQGo/CMWc9f4uHFfgUPJRAu7N3uB8GBvB3SDPAIWJK4GKyYhkAGFq+GYrcbKNfQIz5VVQyJnDuPPCrg==} - fast-sort@3.4.1: resolution: {integrity: sha512-76uvGPsF6So53sZAqenP9UVT3p5l7cyTHkLWVCMinh41Y8NDrK1IYXJgaBMfc1gk7nJiSRZp676kddFG2Aa5+A==} @@ -7916,10 +7147,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} - find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} @@ -8058,10 +7285,6 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -8089,16 +7312,6 @@ packages: get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - getopts@2.3.0: - resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} - - giget@1.2.5: - resolution: {integrity: sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==} - hasBin: true - - git-last-commit@1.0.1: - resolution: {integrity: sha512-FDSgeMqa7GnJDxt/q0AbrxbfeTyxp4ImxEw1e4nw6NUHA5FMhFUq33dTXI4Xdgcj1VQ1q5QLWF6WxFrJ8KCBOg==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -8144,10 +7357,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -8161,10 +7370,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - gradient-string@2.0.2: - resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} - engines: {node: '>=10'} - grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} @@ -8224,10 +7429,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-flag@5.0.1: - resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} - engines: {node: '>=12'} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -8263,10 +7464,6 @@ packages: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} - hono@4.8.5: - resolution: {integrity: sha512-Up2cQbtNz1s111qpnnECdTGqSIUIhZJMLikdKkshebQSEBcoUKq6XJayLGqSZWidiH0zfHRCJqFu062Mz5UuRA==} - engines: {node: '>=16.9.0'} - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -8349,9 +7546,6 @@ packages: import-in-the-middle@1.11.0: resolution: {integrity: sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -8360,10 +7554,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -8374,10 +7564,6 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@5.0.0: - resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} - engines: {node: ^18.17.0 || >=20.5.0} - inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -8392,10 +7578,6 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - interpret@2.2.0: - resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} - engines: {node: '>= 0.10'} - ioredis@5.6.1: resolution: {integrity: sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==} engines: {node: '>=12.22.0'} @@ -8473,11 +7655,6 @@ packages: is-deflate@1.0.0: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -8505,11 +7682,6 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -8522,10 +7694,6 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} - engines: {node: '>=16'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -8627,10 +7795,6 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -8767,9 +7931,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -8780,10 +7941,6 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - junk@4.0.1: - resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} - engines: {node: '>=12.20'} - katex@0.16.22: resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} hasBin: true @@ -8805,34 +7962,6 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - knex@3.1.0: - resolution: {integrity: sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==} - engines: {node: '>=16'} - hasBin: true - peerDependencies: - better-sqlite3: '*' - mysql: '*' - mysql2: '*' - pg: '*' - pg-native: '*' - sqlite3: '*' - tedious: '*' - peerDependenciesMeta: - better-sqlite3: - optional: true - mysql: - optional: true - mysql2: - optional: true - pg: - optional: true - pg-native: - optional: true - sqlite3: - optional: true - tedious: - optional: true - language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -8968,10 +8097,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -9055,9 +8180,6 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -9086,10 +8208,6 @@ packages: engines: {node: '>= 16'} hasBin: true - matchit@1.1.0: - resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} - engines: {node: '>=6'} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -9177,10 +8295,6 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - meow@6.1.1: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} @@ -9496,9 +8610,6 @@ packages: ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -9562,9 +8673,6 @@ packages: neo4j-driver@5.28.1: resolution: {integrity: sha512-jbyBwyM0a3RLGcP43q3hIxPUPxA+1bE04RovOKdNAS42EtBMVCKcPSeOvWiHxgXp1ZFd0a8XqK+7LtguInOLUg==} - nested-error-stacks@2.1.1: - resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - next@14.1.4: resolution: {integrity: sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==} engines: {node: '>=18.17.0'} @@ -9592,9 +8700,6 @@ packages: node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -9685,11 +8790,6 @@ packages: num2fraction@1.2.2: resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} - nypm@0.5.4: - resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -9734,9 +8834,6 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - ohash@1.1.6: - resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==} - ollama-ai-provider-v2@1.5.1: resolution: {integrity: sha512-5R3z7Y+mm8VEtoq+rIoIqkEy83oYM3DXX6Nyrn6yofYvYl56BCoJMNwXsPrpmCI0O4fN/gAIDTLpznYMRGzZ5g==} engines: {node: '>=18'} @@ -9766,10 +8863,6 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} - openai@5.12.2: resolution: {integrity: sha512-xqzHHQch5Tws5PcKR2xsZGX9xtch+JQFz5zb14dGqlshmmDAFBFEWmeIpf7wVqWV+w7Emj7jRgkNJakyKE0tYQ==} hasBin: true @@ -9793,10 +8886,6 @@ packages: orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - os-paths@7.4.0: - resolution: {integrity: sha512-Ux1J4NUqC6tZayBqLN1kUlDAEvLiQlli/53sSddU4IN+h+3xxnv2HmRSMpVSvr1hvJzotfMs3ERvETGK+f4OwA==} - engines: {node: '>= 4.0'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -9814,18 +8903,10 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - p-event@5.0.1: - resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} - p-filter@3.0.0: - resolution: {integrity: sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -9834,14 +8915,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-limit@6.2.0: - resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} - engines: {node: '>=18'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -9850,10 +8923,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -9862,22 +8931,6 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-map@5.5.0: - resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} - engines: {node: '>=12'} - - p-map@6.0.0: - resolution: {integrity: sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==} - engines: {node: '>=16'} - - p-retry@6.2.1: - resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} - engines: {node: '>=16.17'} - - p-timeout@5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -9931,17 +8984,10 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - partysocket@1.1.4: - resolution: {integrity: sha512-jXP7PFj2h5/v4UjDS8P7MZy6NJUQ7sspiFyxL4uc/+oKOL+KdtXzHnTV8INPGxBrLTXgalyG3kd12Qm7WrYc3A==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -9996,49 +9042,9 @@ packages: peek-stream@1.1.3: resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - pg-cloudflare@1.2.7: - resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} - - pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} - - pg-connection-string@2.9.1: - resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} - - pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - - pg-pool@3.10.1: - resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} - peerDependencies: - pg: '>=8.0' - - pg-protocol@1.10.3: - resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} - - pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - - pg@8.16.3: - resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==} - engines: {node: '>= 16.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true - - pgpass@1.0.5: - resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - picocolors@0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} @@ -10093,13 +9099,6 @@ packages: pkg-types@2.1.0: resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} - polite-json@5.0.0: - resolution: {integrity: sha512-OLS/0XeUAcE8a2fdwemNja+udKgXNnY6yKVIXqAD2zVRx1KvY6Ato/rZ2vdzbxqYwPW0u6SCNC/bAMPNzpzxbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - polka@0.5.2: - resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -10257,22 +9256,6 @@ packages: resolution: {integrity: sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==} engines: {node: ^10 || ^12 || >=14} - postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} - - postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} - - postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} - - postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} - posthog-js@1.250.2: resolution: {integrity: sha512-g/H9lJhjhsYPnpxntqp36osK7oJ6CFqul2+mVUkaacAJUG4DqCG8iawsSnZvvUmapjapbf2HUA7PCRrpRsl06A==} peerDependencies: @@ -10567,9 +9550,6 @@ packages: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} - rc9@2.1.2: - resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - react-calendar-heatmap@1.10.0: resolution: {integrity: sha512-e5vcrzMWzKIF710egr1FpjWyuDEFeZm39nvV25muc8Wtqqi8iDOfqREELeQ9Wouqf9hhj939gq0i+iAxo7KdSw==} peerDependencies: @@ -10757,10 +9737,6 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -10904,10 +9880,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-import@2.0.0: - resolution: {integrity: sha512-jpKjLibLuc8D1XEV2+7zb0aqN7I8d12u89g/v6IsgCzdVlccMQJq4TKkPw5fbhHdxhm7nbVtN+KvOTnjFf+nEA==} - engines: {node: 20 || >=22} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -10935,10 +9907,6 @@ packages: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -10948,10 +9916,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - rimraf@6.0.1: resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} engines: {node: 20 || >=22} @@ -10972,10 +9936,6 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} - engines: {node: '>=18'} - run-exclusive@2.2.19: resolution: {integrity: sha512-K3mdoAi7tjJ/qT7Flj90L7QyPozwUaAG+CVhkdDje4HLKXUYC3N/Jzkau3flHVDLQVhiHBtcimVodMjN9egYbA==} @@ -11107,9 +10067,6 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} - shimmer@1.2.1: - resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -11142,17 +10099,10 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - slug@6.1.0: resolution: {integrity: sha512-x6vLHCMasg4DR2LPiyFGI0gJJhywY6DTiGhCrOMzb3SOk/0JVLIaL4UhyFSHu04SD3uAavrKY/K3zZ3i6iRcgA==} @@ -11232,10 +10182,6 @@ packages: spdx-license-ids@3.0.21: resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -11402,10 +10348,6 @@ packages: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} - supports-color@10.0.0: - resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==} - engines: {node: '>=18'} - supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -11431,11 +10373,6 @@ packages: peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - sync-content@2.0.1: - resolution: {integrity: sha512-NI1mo514yFhr8pV/5Etvgh+pSBUIpoAKoiBIUwALVlQQNAwb40bTw8hhPFaip/dvv0GhpHVOq0vq8iY02ppLTg==} - engines: {node: 20 || >=22} - hasBin: true - tailwind-merge@2.2.0: resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} @@ -11496,10 +10433,6 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - tarn@3.0.2: - resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} - engines: {node: '>=8.0.0'} - tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} @@ -11545,16 +10478,9 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - tildify@2.0.0: - resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} - engines: {node: '>=8'} - tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} @@ -11562,9 +10488,6 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinygradient@1.1.5: - resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} - tippy.js@6.3.7: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} @@ -11611,10 +10534,6 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - trouter@2.0.1: - resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} - engines: {node: '>=6'} - ts-algebra@2.0.0: resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} @@ -11624,14 +10543,6 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-essentials@10.0.1: - resolution: {integrity: sha512-HPH+H2bkkO8FkMDau+hFvv7KYozzned9Zr1Urn7rRPXMF4mZmCKOq+u4AI1AAW+2bofIOXTuSdKo9drQuni2dQ==} - peerDependencies: - typescript: '>=4.5.0' - peerDependenciesMeta: - typescript: - optional: true - ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -11665,11 +10576,6 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tshy@3.0.2: - resolution: {integrity: sha512-8GkWnAfmNXxl8iDTZ1o2H4jdaj9H7HeDKkr5qd0ZhQBCNA41D3xqTyg2Ycs51VCfmjJ5e+0v9AUmD6ylAI9Bgw==} - engines: {node: 20 || >=22} - hasBin: true - tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -11701,11 +10607,6 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tsx@4.17.0: - resolution: {integrity: sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==} - engines: {node: '>=18.0.0'} - hasBin: true - tsx@4.20.4: resolution: {integrity: sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==} engines: {node: '>=18.0.0'} @@ -11859,10 +10760,6 @@ packages: resolution: {integrity: sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA==} engines: {node: '>=20.18.1'} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -11982,10 +10879,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -12122,10 +11015,6 @@ packages: w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - walk-up-path@4.0.0: - resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} - engines: {node: 20 || >=22} - watchpack@2.4.4: resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} engines: {node: '>=10.13.0'} @@ -12272,18 +11161,6 @@ packages: utf-8-validate: optional: true - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} - engines: {node: '>=18'} - - xdg-app-paths@8.3.0: - resolution: {integrity: sha512-mgxlWVZw0TNWHoGmXq+NC3uhCIc55dDpAlDkMQUaIAcQzysb0kxctwv//fvuW61/nAAeUBJMQ8mnZjMmuYwOcQ==} - engines: {node: '>= 4.0'} - - xdg-portable@10.6.0: - resolution: {integrity: sha512-xrcqhWDvtZ7WLmt8G4f3hHy37iK7D2idtosRgkeiSPZEPmBShp0VfmRBLWAPC6zLF48APJ21yfea+RfQMF4/Aw==} - engines: {node: '>= 4.0'} - xmlhttprequest-ssl@2.0.0: resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'} @@ -12341,10 +11218,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} - yoctocolors@2.1.1: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} @@ -12458,8 +11331,6 @@ snapshots: optionalDependencies: zod: 3.25.76 - '@arr/every@1.0.1': {} - '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -13923,7 +12794,7 @@ snapshots: '@babel/traverse': 7.27.4 '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -13943,7 +12814,7 @@ snapshots: '@babel/traverse': 7.27.4 '@babel/types': 7.27.6 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -14219,7 +13090,7 @@ snapshots: '@babel/parser': 7.27.5 '@babel/template': 7.27.2 '@babel/types': 7.27.6 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -14410,22 +13281,8 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 - '@clack/core@0.4.2': - dependencies: - picocolors: 1.1.1 - sisteransi: 1.0.5 - - '@clack/prompts@0.10.1': - dependencies: - '@clack/core': 0.4.2 - picocolors: 1.1.1 - sisteransi: 1.0.5 - '@coji/remix-auth-google@4.2.0': {} - '@colors/colors@1.5.0': - optional: true - '@conform-to/dom@0.6.3': {} '@conform-to/react@0.6.3(react@18.3.1)': @@ -14440,45 +13297,6 @@ snapshots: '@daybrush/utils@1.13.0': {} - '@depot/cli-darwin-arm64@0.0.1-cli.2.80.0': - optional: true - - '@depot/cli-darwin-x64@0.0.1-cli.2.80.0': - optional: true - - '@depot/cli-linux-arm64@0.0.1-cli.2.80.0': - optional: true - - '@depot/cli-linux-arm@0.0.1-cli.2.80.0': - optional: true - - '@depot/cli-linux-ia32@0.0.1-cli.2.80.0': - optional: true - - '@depot/cli-linux-x64@0.0.1-cli.2.80.0': - optional: true - - '@depot/cli-win32-arm64@0.0.1-cli.2.80.0': - optional: true - - '@depot/cli-win32-ia32@0.0.1-cli.2.80.0': - optional: true - - '@depot/cli-win32-x64@0.0.1-cli.2.80.0': - optional: true - - '@depot/cli@0.0.1-cli.2.80.0': - optionalDependencies: - '@depot/cli-darwin-arm64': 0.0.1-cli.2.80.0 - '@depot/cli-darwin-x64': 0.0.1-cli.2.80.0 - '@depot/cli-linux-arm': 0.0.1-cli.2.80.0 - '@depot/cli-linux-arm64': 0.0.1-cli.2.80.0 - '@depot/cli-linux-ia32': 0.0.1-cli.2.80.0 - '@depot/cli-linux-x64': 0.0.1-cli.2.80.0 - '@depot/cli-win32-arm64': 0.0.1-cli.2.80.0 - '@depot/cli-win32-ia32': 0.0.1-cli.2.80.0 - '@depot/cli-win32-x64': 0.0.1-cli.2.80.0 - '@edgefirst-dev/data@0.0.4': {} '@egjs/agent@2.4.4': {} @@ -14521,27 +13339,12 @@ snapshots: '@emotion/memoize@0.7.4': optional: true - '@epic-web/test-server@0.1.6': - dependencies: - '@hono/node-server': 1.16.0(hono@4.8.5) - '@hono/node-ws': 1.2.0(@hono/node-server@1.16.0(hono@4.8.5))(hono@4.8.5) - '@open-draft/deferred-promise': 2.2.0 - '@types/ws': 8.18.1 - hono: 4.8.5 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@esbuild/aix-ppc64@0.19.11': optional: true '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.23.1': - optional: true - '@esbuild/aix-ppc64@0.25.5': optional: true @@ -14554,9 +13357,6 @@ snapshots: '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.23.1': - optional: true - '@esbuild/android-arm64@0.25.5': optional: true @@ -14569,9 +13369,6 @@ snapshots: '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.23.1': - optional: true - '@esbuild/android-arm@0.25.5': optional: true @@ -14584,9 +13381,6 @@ snapshots: '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.23.1': - optional: true - '@esbuild/android-x64@0.25.5': optional: true @@ -14599,9 +13393,6 @@ snapshots: '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.23.1': - optional: true - '@esbuild/darwin-arm64@0.25.5': optional: true @@ -14614,9 +13405,6 @@ snapshots: '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.23.1': - optional: true - '@esbuild/darwin-x64@0.25.5': optional: true @@ -14629,9 +13417,6 @@ snapshots: '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.23.1': - optional: true - '@esbuild/freebsd-arm64@0.25.5': optional: true @@ -14644,9 +13429,6 @@ snapshots: '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.23.1': - optional: true - '@esbuild/freebsd-x64@0.25.5': optional: true @@ -14659,9 +13441,6 @@ snapshots: '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.23.1': - optional: true - '@esbuild/linux-arm64@0.25.5': optional: true @@ -14674,9 +13453,6 @@ snapshots: '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.23.1': - optional: true - '@esbuild/linux-arm@0.25.5': optional: true @@ -14689,9 +13465,6 @@ snapshots: '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.23.1': - optional: true - '@esbuild/linux-ia32@0.25.5': optional: true @@ -14704,9 +13477,6 @@ snapshots: '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.23.1': - optional: true - '@esbuild/linux-loong64@0.25.5': optional: true @@ -14719,9 +13489,6 @@ snapshots: '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.23.1': - optional: true - '@esbuild/linux-mips64el@0.25.5': optional: true @@ -14734,9 +13501,6 @@ snapshots: '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.23.1': - optional: true - '@esbuild/linux-ppc64@0.25.5': optional: true @@ -14749,9 +13513,6 @@ snapshots: '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.23.1': - optional: true - '@esbuild/linux-riscv64@0.25.5': optional: true @@ -14764,9 +13525,6 @@ snapshots: '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.23.1': - optional: true - '@esbuild/linux-s390x@0.25.5': optional: true @@ -14779,9 +13537,6 @@ snapshots: '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.23.1': - optional: true - '@esbuild/linux-x64@0.25.5': optional: true @@ -14797,15 +13552,9 @@ snapshots: '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.23.1': - optional: true - '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.23.1': - optional: true - '@esbuild/openbsd-arm64@0.25.5': optional: true @@ -14818,9 +13567,6 @@ snapshots: '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.23.1': - optional: true - '@esbuild/openbsd-x64@0.25.5': optional: true @@ -14833,9 +13579,6 @@ snapshots: '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.23.1': - optional: true - '@esbuild/sunos-x64@0.25.5': optional: true @@ -14848,9 +13591,6 @@ snapshots: '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.23.1': - optional: true - '@esbuild/win32-arm64@0.25.5': optional: true @@ -14863,9 +13603,6 @@ snapshots: '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.23.1': - optional: true - '@esbuild/win32-ia32@0.25.5': optional: true @@ -14878,9 +13615,6 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.23.1': - optional: true - '@esbuild/win32-x64@0.25.5': optional: true @@ -14894,7 +13628,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -14937,18 +13671,6 @@ snapshots: '@google-cloud/precise-date@4.0.0': {} - '@grpc/grpc-js@1.13.4': - dependencies: - '@grpc/proto-loader': 0.7.15 - '@js-sdsl/ordered-map': 4.4.2 - - '@grpc/proto-loader@0.7.15': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.3.2 - protobufjs: 7.5.3 - yargs: 17.7.2 - '@hapi/boom@10.0.1': dependencies: '@hapi/hoek': 11.0.7 @@ -14969,23 +13691,10 @@ snapshots: '@hapi/bourne': 3.0.0 '@hapi/hoek': 11.0.7 - '@hono/node-server@1.16.0(hono@4.8.5)': - dependencies: - hono: 4.8.5 - - '@hono/node-ws@1.2.0(@hono/node-server@1.16.0(hono@4.8.5))(hono@4.8.5)': - dependencies: - '@hono/node-server': 1.16.0(hono@4.8.5) - hono: 4.8.5 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -15065,8 +13774,6 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 optional: true - '@js-sdsl/ordered-map@4.4.2': {} - '@jsonhero/path@1.0.21': {} '@jspm/core@2.1.0': {} @@ -15244,31 +13951,16 @@ snapshots: '@one-ini/wasm@0.1.1': {} - '@open-draft/deferred-promise@2.2.0': {} - '@opentelemetry/api-logs@0.203.0': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs@0.52.1': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api@1.9.0': {} - '@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -15283,25 +13975,6 @@ snapshots: '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http@0.52.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.52.1 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.13.4 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -15311,60 +13984,12 @@ snapshots: '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-trace-otlp-proto@0.52.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/exporter-zipkin@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 - - '@opentelemetry/instrumentation-fetch@0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0) - '@opentelemetry/sdk-trace-web': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 - transitivePeerDependencies: - - supports-color - '@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.203.0 import-in-the-middle: 1.11.0 - require-in-the-middle: 7.5.2(supports-color@10.0.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.52.1 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.11.0 - require-in-the-middle: 7.5.2(supports-color@10.0.0) - semver: 7.7.2 - shimmer: 1.2.1 + require-in-the-middle: 7.5.2 transitivePeerDependencies: - supports-color @@ -15374,20 +13999,6 @@ snapshots: '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/otlp-grpc-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': - dependencies: - '@grpc/grpc-js': 1.13.4 - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -15399,33 +14010,6 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) protobufjs: 7.5.3 - '@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.52.1 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - protobufjs: 7.5.3 - - '@opentelemetry/propagator-b3@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/propagator-jaeger@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -15439,52 +14023,12 @@ snapshots: '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.52.1 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - - '@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - lodash.merge: 4.6.2 - '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.52.1 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-zipkin': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 - '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -15492,16 +14036,6 @@ snapshots: '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.36.0 - '@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - semver: 7.7.2 - '@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -15509,15 +14043,6 @@ snapshots: '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-web@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 - - '@opentelemetry/semantic-conventions@1.25.1': {} - '@opentelemetry/semantic-conventions@1.36.0': {} '@oslojs/asn1@1.0.0': @@ -15603,8 +14128,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@polka/url@0.5.0': {} - '@popperjs/core@2.11.8': {} '@posthog/core@1.3.1': {} @@ -18441,7 +16964,7 @@ snapshots: '@opentelemetry/semantic-conventions': 1.36.0 dequal: 2.0.3 eventsource: 3.0.7 - eventsource-parser: 3.0.3 + eventsource-parser: 3.0.6 execa: 8.0.1 humanize-duration: 3.33.0 jose: 5.10.0 @@ -18461,6 +16984,17 @@ snapshots: - supports-color - utf-8-validate + '@trigger.dev/python@4.0.4(@trigger.dev/build@4.0.4(typescript@5.8.3))(@trigger.dev/sdk@4.0.4(ai@5.0.78(zod@3.25.76))(zod@3.25.76))': + dependencies: + '@trigger.dev/build': 4.0.4(typescript@5.8.3) + '@trigger.dev/core': 4.0.4 + '@trigger.dev/sdk': 4.0.4(ai@5.0.78(zod@3.25.76))(zod@3.25.76) + tinyexec: 0.3.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@trigger.dev/react-hooks@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@trigger.dev/core': 4.0.4 @@ -18686,10 +17220,6 @@ snapshots: '@types/geojson@7946.0.16': {} - '@types/gradient-string@1.1.6': - dependencies: - '@types/tinycolor2': 1.4.6 - '@types/hast@2.3.10': dependencies: '@types/unist': 2.0.11 @@ -18700,8 +17230,6 @@ snapshots: '@types/http-errors@2.0.5': {} - '@types/ini@4.1.1': {} - '@types/is-ci@3.0.4': dependencies: ci-info: 3.9.0 @@ -18772,15 +17300,6 @@ snapshots: '@types/normalize-package-data@2.4.4': {} - '@types/object-hash@3.0.6': {} - - '@types/polka@0.5.7': - dependencies: - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 - '@types/node': 20.11.5 - '@types/trouter': 3.1.4 - '@types/prismjs@1.26.5': {} '@types/prop-types@15.7.15': {} @@ -18814,14 +17333,6 @@ snapshots: '@types/scheduler': 0.26.0 csstype: 3.1.3 - '@types/resolve@1.20.6': {} - - '@types/retry@0.12.2': {} - - '@types/rimraf@4.0.5': - dependencies: - rimraf: 6.0.1 - '@types/scheduler@0.26.0': {} '@types/semver@7.7.0': {} @@ -18837,20 +17348,10 @@ snapshots: '@types/node': 20.11.5 '@types/send': 0.17.5 - '@types/shimmer@1.2.0': {} - '@types/simple-oauth2@5.0.7': {} '@types/slug@5.0.9': {} - '@types/source-map-support@0.5.10': - dependencies: - source-map: 0.6.1 - - '@types/tinycolor2@1.4.6': {} - - '@types/trouter@3.1.4': {} - '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -18872,10 +17373,6 @@ snapshots: - uglify-js - webpack-cli - '@types/ws@8.18.1': - dependencies: - '@types/node': 20.19.7 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -18883,7 +17380,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -18903,7 +17400,7 @@ snapshots: '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -18920,7 +17417,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -18933,7 +17430,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 eslint: 8.57.1 optionalDependencies: typescript: 5.8.3 @@ -18954,7 +17451,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 eslint: 8.57.1 tsutils: 3.21.0(typescript@5.8.3) optionalDependencies: @@ -18966,7 +17463,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.8.3) optionalDependencies: @@ -18982,7 +17479,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 semver: 7.7.2 @@ -18996,7 +17493,7 @@ snapshots: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -19287,11 +17784,6 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - aggregate-error@4.0.1: - dependencies: - clean-stack: 4.2.0 - indent-string: 5.0.0 - ai@5.0.78(zod@3.25.76): dependencies: '@ai-sdk/gateway': 2.0.1(zod@3.25.76) @@ -19325,10 +17817,6 @@ snapshots: ansi-colors@4.1.3: {} - ansi-escapes@7.0.0: - dependencies: - environment: 1.1.0 - ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -19449,8 +17937,6 @@ snapshots: arrify@1.0.1: {} - arrify@3.0.0: {} - ast-types-flow@0.0.8: {} astring@1.9.0: {} @@ -19556,7 +18042,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -19626,10 +18112,6 @@ snapshots: transitivePeerDependencies: - supports-color - bundle-name@4.1.0: - dependencies: - run-applescript: 7.0.0 - bundle-require@5.1.0(esbuild@0.25.5): dependencies: esbuild: 0.25.5 @@ -19641,23 +18123,6 @@ snapshots: bytes@3.1.2: {} - c12@1.11.2(magicast@0.3.5): - dependencies: - chokidar: 3.6.0 - confbox: 0.1.8 - defu: 6.1.4 - dotenv: 16.5.0 - giget: 1.2.5 - jiti: 1.21.7 - mlly: 1.7.4 - ohash: 1.1.6 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.3.1 - rc9: 2.1.2 - optionalDependencies: - magicast: 0.3.5 - cac@6.7.14: {} cacache@17.1.4: @@ -19792,10 +18257,6 @@ snapshots: ci-info@3.9.0: {} - citty@0.1.6: - dependencies: - consola: 3.4.2 - cjs-module-lexer@1.4.3: {} class-transformer@0.5.1: {} @@ -19812,22 +18273,12 @@ snapshots: clean-stack@2.2.0: {} - clean-stack@4.2.0: - dependencies: - escape-string-regexp: 5.0.0 - cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 cli-spinners@2.9.2: {} - cli-table3@0.6.5: - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - client-only@0.0.1: {} cliui@6.0.0: @@ -19913,8 +18364,6 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 - colorette@2.0.19: {} - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -19937,8 +18386,6 @@ snapshots: commander@8.3.0: {} - commander@9.5.0: {} - compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -20022,28 +18469,6 @@ snapshots: optionalDependencies: typescript: 5.8.3 - cp-file@10.0.0: - dependencies: - graceful-fs: 4.2.11 - nested-error-stacks: 2.1.1 - p-event: 5.0.1 - - cpy-cli@5.0.0: - dependencies: - cpy: 10.1.0 - meow: 12.1.1 - - cpy@10.1.0: - dependencies: - arrify: 3.0.0 - cp-file: 10.0.0 - globby: 13.2.2 - junk: 4.0.1 - micromatch: 4.0.8 - nested-error-stacks: 2.1.1 - p-filter: 3.0.0 - p-map: 6.0.0 - crelt@1.0.6: {} cron-parser@4.9.0: @@ -20319,21 +18744,13 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.4(supports-color@10.0.0): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 10.0.0 - debug@4.3.7: dependencies: ms: 2.1.3 - debug@4.4.1(supports-color@10.0.0): + debug@4.4.1: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 10.0.0 debug@4.4.3: dependencies: @@ -20379,13 +18796,6 @@ snapshots: deepmerge@4.3.1: {} - default-browser-id@5.0.0: {} - - default-browser@5.2.1: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.0 - defaults@1.0.4: dependencies: clone: 1.0.4 @@ -20396,8 +18806,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@3.0.0: {} - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -20406,8 +18814,6 @@ snapshots: defined@1.0.1: {} - defu@6.1.4: {} - delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -20420,8 +18826,6 @@ snapshots: dequal@2.0.3: {} - destr@2.0.5: {} - destroy@1.2.0: {} detect-indent@6.1.0: {} @@ -20495,10 +18899,6 @@ snapshots: dotenv-expand@10.0.0: {} - dotenv-expand@12.0.2: - dependencies: - dotenv: 16.5.0 - dotenv@16.0.3: {} dotenv@16.5.0: {} @@ -20599,8 +18999,6 @@ snapshots: env-paths@2.2.1: {} - environment@1.1.0: {} - err-code@2.0.3: {} errno@0.1.8: @@ -20811,33 +19209,6 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.23.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 - esbuild@0.25.5: optionalDependencies: '@esbuild/aix-ppc64': 0.25.5 @@ -20874,8 +19245,6 @@ snapshots: escape-string-regexp@4.0.0: {} - escape-string-regexp@5.0.0: {} - eslint-config-prettier@8.10.0(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -20908,7 +19277,7 @@ snapshots: eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 eslint: 8.57.1 get-tsconfig: 4.10.1 is-bun-module: 2.0.0 @@ -21130,7 +19499,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -21160,8 +19529,6 @@ snapshots: transitivePeerDependencies: - supports-color - esm@3.2.25: {} - espree@9.6.1: dependencies: acorn: 8.15.0 @@ -21226,8 +19593,6 @@ snapshots: '@types/node': 20.19.7 require-like: 0.1.2 - event-target-polyfill@0.0.4: {} - event-target-shim@5.0.1: {} events@3.3.0: {} @@ -21339,7 +19704,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -21389,8 +19754,6 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-npm-meta@0.2.2: {} - fast-sort@3.4.1: {} fast-uri@3.0.6: {} @@ -21443,7 +19806,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -21462,12 +19825,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@7.0.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - unicorn-magic: 0.1.0 - find-yarn-workspace-root2@1.2.16: dependencies: micromatch: 4.0.8 @@ -21604,8 +19961,6 @@ snapshots: get-nonce@1.0.1: {} - get-package-type@0.1.0: {} - get-port@5.1.1: {} get-proto@1.0.1: @@ -21632,20 +19987,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - getopts@2.3.0: {} - - giget@1.2.5: - dependencies: - citty: 0.1.6 - consola: 3.4.2 - defu: 6.1.4 - node-fetch-native: 1.6.6 - nypm: 0.5.4 - pathe: 2.0.3 - tar: 6.2.1 - - git-last-commit@1.0.1: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -21711,14 +20052,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globby@13.2.2: - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 4.0.0 - globrex@0.1.2: {} gopd@1.2.0: {} @@ -21727,11 +20060,6 @@ snapshots: graceful-fs@4.2.11: {} - gradient-string@2.0.2: - dependencies: - chalk: 4.1.2 - tinygradient: 1.1.5 - grapheme-splitter@1.0.4: {} graphemer@1.4.0: {} @@ -21788,8 +20116,6 @@ snapshots: has-flag@4.0.0: {} - has-flag@5.0.1: {} - has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -21856,8 +20182,6 @@ snapshots: highlight.js@11.11.1: {} - hono@4.8.5: {} - hosted-git-info@2.8.9: {} hosted-git-info@6.1.3: @@ -21942,14 +20266,10 @@ snapshots: cjs-module-lexer: 1.4.3 module-details-from-path: 1.0.4 - import-meta-resolve@4.1.0: {} - imurmurhash@0.1.4: {} indent-string@4.0.0: {} - indent-string@5.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -21959,8 +20279,6 @@ snapshots: ini@1.3.8: {} - ini@5.0.0: {} - inline-style-parser@0.1.1: {} inline-style-parser@0.2.4: {} @@ -21973,13 +20291,11 @@ snapshots: internmap@2.0.3: {} - interpret@2.2.0: {} - ioredis@5.6.1: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -22065,8 +20381,6 @@ snapshots: is-deflate@1.0.0: {} - is-docker@3.0.0: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -22090,18 +20404,12 @@ snapshots: is-hexadecimal@2.0.1: {} - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - is-interactive@1.0.0: {} is-map@2.0.3: {} is-negative-zero@2.0.3: {} - is-network-error@1.1.0: {} - is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -22183,10 +20491,6 @@ snapshots: is-windows@1.0.2: {} - is-wsl@3.1.0: - dependencies: - is-inside-container: 1.0.0 - isarray@1.0.0: {} isarray@2.0.5: {} @@ -22304,8 +20608,6 @@ snapshots: json5@2.2.3: {} - jsonc-parser@3.2.1: {} - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -22323,8 +20625,6 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 - junk@4.0.1: {} - katex@0.16.22: dependencies: commander: 8.3.0 @@ -22346,27 +20646,6 @@ snapshots: kleur@4.1.5: {} - knex@3.1.0(pg@8.16.3)(supports-color@10.0.0): - dependencies: - colorette: 2.0.19 - commander: 10.0.1 - debug: 4.3.4(supports-color@10.0.0) - escalade: 3.2.0 - esm: 3.2.25 - get-package-type: 0.1.0 - getopts: 2.3.0 - interpret: 2.2.0 - lodash: 4.17.21 - pg-connection-string: 2.6.2 - rechoir: 0.8.0 - resolve-from: 5.0.0 - tarn: 3.0.2 - tildify: 2.0.0 - optionalDependencies: - pg: 8.16.3 - transitivePeerDependencies: - - supports-color - language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -22488,10 +20767,6 @@ snapshots: dependencies: p-locate: 5.0.0 - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - lodash.camelcase@4.3.0: {} lodash.castarray@4.4.0: {} @@ -22560,12 +20835,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - magicast@0.3.5: - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - source-map-js: 1.2.1 - make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -22591,10 +20860,6 @@ snapshots: marked@7.0.4: {} - matchit@1.1.0: - dependencies: - '@arr/every': 1.0.1 - math-intrinsics@1.1.0: {} md-to-react-email@5.0.2(react@18.3.1): @@ -22812,8 +21077,6 @@ snapshots: memorystream@0.3.1: {} - meow@12.1.1: {} - meow@6.1.1: dependencies: '@types/minimist': 1.2.5 @@ -23143,7 +21406,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.3 decode-named-character-reference: 1.1.0 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -23165,7 +21428,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.3 decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -23305,8 +21568,6 @@ snapshots: ms@2.0.0: {} - ms@2.1.2: {} - ms@2.1.3: {} msgpackr-extract@3.0.3: @@ -23369,8 +21630,6 @@ snapshots: neo4j-driver-core: 5.28.1 rxjs: 7.8.2 - nested-error-stacks@2.1.1: {} - next@14.1.4(@babel/core@7.24.5)(@opentelemetry/api@1.9.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.89.2): dependencies: '@next/env': 14.1.4 @@ -23409,8 +21668,6 @@ snapshots: dependencies: lodash: 4.17.21 - node-fetch-native@1.6.6: {} - node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 @@ -23545,15 +21802,6 @@ snapshots: num2fraction@1.2.2: {} - nypm@0.5.4: - dependencies: - citty: 0.1.6 - consola: 3.4.2 - pathe: 2.0.3 - pkg-types: 1.3.1 - tinyexec: 0.3.2 - ufo: 1.6.1 - object-assign@4.1.1: {} object-hash@2.2.0: {} @@ -23605,8 +21853,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - ohash@1.1.6: {} - ollama-ai-provider-v2@1.5.1(zod@3.25.76): dependencies: '@ai-sdk/provider': 2.0.0 @@ -23635,13 +21881,6 @@ snapshots: dependencies: mimic-fn: 4.0.0 - open@10.2.0: - dependencies: - default-browser: 5.2.1 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - wsl-utils: 0.1.0 - openai@5.12.2(ws@8.18.3)(zod@3.25.76): optionalDependencies: ws: 8.18.3 @@ -23670,10 +21909,6 @@ snapshots: orderedmap@2.1.1: {} - os-paths@7.4.0: - optionalDependencies: - fsevents: 2.3.3 - os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -23690,18 +21925,10 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - p-event@5.0.1: - dependencies: - p-timeout: 5.1.0 - p-filter@2.1.0: dependencies: p-map: 2.1.0 - p-filter@3.0.0: - dependencies: - p-map: 5.5.0 - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -23710,14 +21937,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.1 - - p-limit@6.2.0: - dependencies: - yocto-queue: 1.2.1 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -23726,30 +21945,12 @@ snapshots: dependencies: p-limit: 3.1.0 - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - p-map@2.1.0: {} p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - p-map@5.5.0: - dependencies: - aggregate-error: 4.0.1 - - p-map@6.0.0: {} - - p-retry@6.2.1: - dependencies: - '@types/retry': 0.12.2 - is-network-error: 1.1.0 - retry: 0.13.1 - - p-timeout@5.1.0: {} - p-try@2.2.0: {} package-json-from-dist@1.0.1: {} @@ -23809,14 +22010,8 @@ snapshots: parseurl@1.3.3: {} - partysocket@1.1.4: - dependencies: - event-target-polyfill: 0.0.4 - path-exists@4.0.0: {} - path-exists@5.0.0: {} - path-is-absolute@1.0.1: {} path-key@2.0.1: {} @@ -23859,51 +22054,12 @@ snapshots: duplexify: 3.7.1 through2: 2.0.5 - perfect-debounce@1.0.0: {} - periscopic@3.1.0: dependencies: '@types/estree': 1.0.8 estree-walker: 3.0.3 is-reference: 3.0.3 - pg-cloudflare@1.2.7: - optional: true - - pg-connection-string@2.6.2: {} - - pg-connection-string@2.9.1: {} - - pg-int8@1.0.1: {} - - pg-pool@3.10.1(pg@8.16.3): - dependencies: - pg: 8.16.3 - - pg-protocol@1.10.3: {} - - 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.7 - postgres-interval: 1.2.0 - - pg@8.16.3: - dependencies: - pg-connection-string: 2.9.1 - pg-pool: 3.10.1(pg@8.16.3) - pg-protocol: 1.10.3 - pg-types: 2.2.0 - pgpass: 1.0.5 - optionalDependencies: - pg-cloudflare: 1.2.7 - - pgpass@1.0.5: - dependencies: - split2: 4.2.0 - picocolors@0.2.1: {} picocolors@1.1.1: {} @@ -23942,13 +22098,6 @@ snapshots: exsolve: 1.0.5 pathe: 2.0.3 - polite-json@5.0.0: {} - - polka@0.5.2: - dependencies: - '@polka/url': 0.5.0 - trouter: 2.0.1 - possible-typed-array-names@1.1.0: {} postcss-discard-duplicates@5.1.0(postcss@8.5.5): @@ -24117,16 +22266,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postgres-array@2.0.0: {} - - postgres-bytea@1.0.0: {} - - postgres-date@1.0.7: {} - - postgres-interval@1.2.0: - dependencies: - xtend: 4.0.2 - posthog-js@1.250.2: dependencies: core-js: 3.43.0 @@ -24414,11 +22553,6 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 - rc9@2.1.2: - dependencies: - defu: 6.1.4 - destr: 2.0.5 - react-calendar-heatmap@1.10.0(react@18.3.1): dependencies: memoize-one: 5.2.1 @@ -24741,10 +22875,6 @@ snapshots: readdirp@4.1.2: {} - rechoir@0.8.0: - dependencies: - resolve: 1.22.10 - redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -24870,9 +23000,9 @@ snapshots: require-from-string@2.0.2: {} - require-in-the-middle@7.5.2(supports-color@10.0.0): + require-in-the-middle@7.5.2: dependencies: - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.3 module-details-from-path: 1.0.4 resolve: 1.22.10 transitivePeerDependencies: @@ -24892,11 +23022,6 @@ snapshots: resolve-from@5.0.0: {} - resolve-import@2.0.0: - dependencies: - glob: 11.0.2 - walk-up-path: 4.0.0 - resolve-pkg-maps@1.0.0: {} resolve.exports@2.0.3: {} @@ -24922,18 +23047,12 @@ snapshots: retry@0.12.0: {} - retry@0.13.1: {} - reusify@1.1.0: {} rimraf@3.0.2: dependencies: glob: 7.2.3 - rimraf@5.0.10: - dependencies: - glob: 10.4.5 - rimraf@6.0.1: dependencies: glob: 11.0.2 @@ -24971,7 +23090,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -24979,8 +23098,6 @@ snapshots: transitivePeerDependencies: - supports-color - run-applescript@7.0.0: {} - run-exclusive@2.2.19: dependencies: minimal-polyfills: 2.2.3 @@ -25090,7 +23207,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -25168,8 +23285,6 @@ snapshots: shell-quote@1.8.3: {} - shimmer@1.2.1: {} - side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -25213,7 +23328,7 @@ snapshots: dependencies: '@hapi/hoek': 11.0.7 '@hapi/wreck': 18.1.0 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 joi: 17.13.3 transitivePeerDependencies: - supports-color @@ -25222,12 +23337,8 @@ snapshots: dependencies: is-arrayish: 0.3.2 - sisteransi@1.0.5: {} - slash@3.0.0: {} - slash@4.0.0: {} - slug@6.1.0: {} smartwrap@2.0.2: @@ -25348,8 +23459,6 @@ snapshots: spdx-license-ids@3.0.21: {} - split2@4.2.0: {} - sprintf-js@1.0.3: {} ssri@10.0.6: @@ -25532,8 +23641,6 @@ snapshots: dependencies: copy-anything: 3.0.5 - supports-color@10.0.0: {} - supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -25558,14 +23665,6 @@ snapshots: react: 18.3.1 use-sync-external-store: 1.5.0(react@18.3.1) - sync-content@2.0.1: - dependencies: - glob: 11.0.2 - mkdirp: 3.0.1 - path-scurry: 2.0.0 - rimraf: 6.0.1 - tshy: 3.0.2 - tailwind-merge@2.2.0: dependencies: '@babel/runtime': 7.27.6 @@ -25682,8 +23781,6 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - tarn@3.0.2: {} - tdigest@0.1.2: dependencies: bintrees: 1.0.2 @@ -25738,12 +23835,8 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - tildify@2.0.0: {} - tiny-invariant@1.3.3: {} - tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} tinyglobby@0.2.14: @@ -25751,11 +23844,6 @@ snapshots: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - tinygradient@1.1.5: - dependencies: - '@types/tinycolor2': 1.4.6 - tinycolor2: 1.6.0 - tippy.js@6.3.7: dependencies: '@popperjs/core': 2.11.8 @@ -25796,20 +23884,12 @@ snapshots: trough@2.2.0: {} - trouter@2.0.1: - dependencies: - matchit: 1.1.0 - ts-algebra@2.0.0: {} ts-api-utils@1.4.3(typescript@5.8.3): dependencies: typescript: 5.8.3 - ts-essentials@10.0.1(typescript@5.8.3): - optionalDependencies: - typescript: 5.8.3 - ts-interface-checker@0.1.13: {} tsafe@1.8.5: {} @@ -25835,20 +23915,6 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tshy@3.0.2: - dependencies: - chalk: 5.4.1 - chokidar: 3.6.0 - foreground-child: 3.3.1 - minimatch: 10.0.2 - mkdirp: 3.0.1 - polite-json: 5.0.0 - resolve-import: 2.0.0 - rimraf: 6.0.1 - sync-content: 2.0.1 - typescript: 5.8.3 - walk-up-path: 4.0.0 - tslib@1.14.1: {} tslib@2.8.1: {} @@ -25859,7 +23925,7 @@ snapshots: cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 esbuild: 0.25.5 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 @@ -25887,13 +23953,6 @@ snapshots: tslib: 1.14.1 typescript: 5.8.3 - tsx@4.17.0: - dependencies: - esbuild: 0.23.1 - get-tsconfig: 4.10.1 - optionalDependencies: - fsevents: 2.3.3 - tsx@4.20.4: dependencies: esbuild: 0.25.5 @@ -26040,8 +24099,6 @@ snapshots: undici@7.13.0: {} - unicorn-magic@0.1.0: {} - unicorn-magic@0.3.0: {} unified@10.1.2: @@ -26217,8 +24274,6 @@ snapshots: utils-merge@1.0.1: {} - uuid@11.1.0: {} - uuid@9.0.1: {} uvu@0.5.6: @@ -26268,7 +24323,7 @@ snapshots: vite-node@1.6.1(@types/node@20.19.7)(less@4.4.0)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.42.0): dependencies: cac: 6.7.14 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 pathe: 1.1.2 picocolors: 1.1.1 vite: 5.4.19(@types/node@20.19.7)(less@4.4.0)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.42.0) @@ -26286,7 +24341,7 @@ snapshots: vite-node@3.2.3(@types/node@20.19.7)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.42.0)(tsx@4.20.4)(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 vite: 6.3.5(@types/node@20.19.7)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.42.0)(tsx@4.20.4)(yaml@2.8.0) @@ -26306,7 +24361,7 @@ snapshots: vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.19.7)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.42.0)(tsx@4.20.4)(yaml@2.8.0)): dependencies: - debug: 4.4.1(supports-color@10.0.0) + debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: @@ -26349,8 +24404,6 @@ snapshots: w3c-keyname@2.2.8: {} - walk-up-path@4.0.0: {} - watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 @@ -26546,22 +24599,6 @@ snapshots: ws@8.18.3: {} - wsl-utils@0.1.0: - dependencies: - is-wsl: 3.1.0 - - xdg-app-paths@8.3.0: - dependencies: - xdg-portable: 10.6.0 - optionalDependencies: - fsevents: 2.3.3 - - xdg-portable@10.6.0: - dependencies: - os-paths: 7.4.0 - optionalDependencies: - fsevents: 2.3.3 - xmlhttprequest-ssl@2.0.0: {} xtend@4.0.2: {} @@ -26615,8 +24652,6 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.1: {} - yoctocolors@2.1.1: {} zod-error@1.5.0: @@ -26627,10 +24662,6 @@ snapshots: dependencies: zod: 3.23.8 - zod-validation-error@1.5.0(zod@3.23.8): - dependencies: - zod: 3.23.8 - zod-validation-error@1.5.0(zod@3.25.76): dependencies: zod: 3.25.76