From 4ff91e8d6e771545bc3d8e7a0ac0b027ef66ba14 Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 15 Sep 2026 14:37:29 +0200 Subject: [PATCH] docs: consolidate historical records and verify public manual publication --- .gitea/workflows/publish-docs.yml | 9 + PROJECT_STATE.md | 814 ++---------------- README.md | 76 +- docs/architecture/overview.md | 31 +- ...re-sequence.visual-check.1440x900.dark.png | Bin 135458 -> 0 bytes ...e-sequence.visual-check.1440x900.light.png | Bin 134480 -> 0 bytes ...e-sequence.visual-check.2048x1320.dark.png | Bin 193758 -> 0 bytes ...-sequence.visual-check.2048x1320.light.png | Bin 190846 -> 0 bytes .../thothii-core-sequence.visual-check.html | 32 - .../thothii-core-sequence.visual-check.json | 548 ------------ ...hii-runtime.visual-check.1440x900.dark.png | Bin 139830 -> 0 bytes ...ii-runtime.visual-check.1440x900.light.png | Bin 139585 -> 0 bytes ...ii-runtime.visual-check.2048x1320.dark.png | Bin 187480 -> 0 bytes ...i-runtime.visual-check.2048x1320.light.png | Bin 186290 -> 0 bytes .../thothii-runtime.visual-check.html | 32 - .../thothii-runtime.visual-check.json | 548 ------------ docs/contracts/curated-evidence-v4.md | 4 +- docs/gestione-memory.md | 2 +- docs/installazione-docker-4-contesti.md | 137 --- .../2026-09-15-documentation-cleanup.md | 98 ++- docs/operations/compose-reference.md | 48 ++ docs/operations/public-docs-publication.md | 90 ++ .../server-upgrade-gitea-workspace-v2.md | 2 +- ...026-08-26-metadata-catalog-from-thothai.md | 695 --------------- ...-ai-catalog-description-generation-spec.md | 251 ------ ...08-28-ai-catalog-description-generation.md | 173 ---- .../2026-09-02-installation-model-catalog.md | 248 ------ docs/plans/2026-09-08-evidence-management.md | 6 +- ...26-09-08-memory-evidence-administration.md | 2 +- docs/plans/2026-09-08-memory-m1-spec.md | 2 +- docs/plans/2026-09-08-memory-m1-validation.md | 103 --- docs/plans/2026-09-08-memory-management.md | 2 +- .../2026-09-08-security-hardening-prd.md | 24 +- ...-09-08-security-hardening-resume-prompt.md | 100 --- ...2026-09-09-archive-repair-x1-validation.md | 112 --- .../2026-09-09-evidence-e1-validation.md | 67 -- .../2026-09-09-evidence-e2-validation.md | 86 -- .../2026-09-09-evidence-e3-validation.md | 100 --- docs/plans/2026-09-09-memory-m2-validation.md | 96 --- docs/plans/2026-09-09-memory-m3-validation.md | 78 -- docs/reports/knowledge-archives-release.md | 53 ++ ...23-legacy-thothai-metadata-capabilities.md | 420 --------- ...stgresql-catalog-deployment-constraints.md | 206 ----- ...othii-metadata-publication-qdrant-seams.md | 301 ------- ...ationship-management-thothai-to-thothii.md | 2 +- ...26-09-07-antigravity-gemini-flash-value.md | 122 --- .../2026-09-07-deepseek-harness-terminal.md | 154 ---- docs/research/2026-09-07-omp-codex-zcode.md | 127 --- .../2026-09-07-pi-config-vs-oh-my-pi.md | 148 ---- .../2026-09-07-zai-coding-plan-cli-quota.md | 44 - docs/research/2026-09-07-zed-acp-omp-pi.md | 67 -- docs/research/text-to-sql-products.md | 33 - ...-metadata-privacy-description-test-plan.md | 4 +- scripts/auth-docs-smoke.sh | 208 +---- scripts/test-auth-docs-smoke.sh | 94 +- scripts/test-canonical-install-compose.sh | 13 +- scripts/test-deployment-command-contract.sh | 4 +- scripts/test-no-deployment-coupling.sh | 2 +- scripts/test-verify-auth-docs.py | 67 ++ scripts/test-verify-dwh-auth-docs.sh | 317 +------ scripts/verify-auth-docs.py | 94 ++ scripts/verify-dwh-auth-docs.sh | 134 +-- scripts/verify-public-docs.py | 1 + 63 files changed, 633 insertions(+), 6598 deletions(-) delete mode 100644 docs/architecture/thothii-core-sequence.visual-check.1440x900.dark.png delete mode 100644 docs/architecture/thothii-core-sequence.visual-check.1440x900.light.png delete mode 100644 docs/architecture/thothii-core-sequence.visual-check.2048x1320.dark.png delete mode 100644 docs/architecture/thothii-core-sequence.visual-check.2048x1320.light.png delete mode 100644 docs/architecture/thothii-core-sequence.visual-check.html delete mode 100644 docs/architecture/thothii-core-sequence.visual-check.json delete mode 100644 docs/architecture/thothii-runtime.visual-check.1440x900.dark.png delete mode 100644 docs/architecture/thothii-runtime.visual-check.1440x900.light.png delete mode 100644 docs/architecture/thothii-runtime.visual-check.2048x1320.dark.png delete mode 100644 docs/architecture/thothii-runtime.visual-check.2048x1320.light.png delete mode 100644 docs/architecture/thothii-runtime.visual-check.html delete mode 100644 docs/architecture/thothii-runtime.visual-check.json delete mode 100644 docs/installazione-docker-4-contesti.md create mode 100644 docs/operations/compose-reference.md create mode 100644 docs/operations/public-docs-publication.md delete mode 100644 docs/plans/2026-08-26-metadata-catalog-from-thothai.md delete mode 100644 docs/plans/2026-08-28-ai-catalog-description-generation-spec.md delete mode 100644 docs/plans/2026-08-28-ai-catalog-description-generation.md delete mode 100644 docs/plans/2026-09-02-installation-model-catalog.md delete mode 100644 docs/plans/2026-09-08-memory-m1-validation.md delete mode 100644 docs/plans/2026-09-08-security-hardening-resume-prompt.md delete mode 100644 docs/plans/2026-09-09-archive-repair-x1-validation.md delete mode 100644 docs/plans/2026-09-09-evidence-e1-validation.md delete mode 100644 docs/plans/2026-09-09-evidence-e2-validation.md delete mode 100644 docs/plans/2026-09-09-evidence-e3-validation.md delete mode 100644 docs/plans/2026-09-09-memory-m2-validation.md delete mode 100644 docs/plans/2026-09-09-memory-m3-validation.md create mode 100644 docs/reports/knowledge-archives-release.md delete mode 100644 docs/research/2026-08-23-legacy-thothai-metadata-capabilities.md delete mode 100644 docs/research/2026-08-23-postgresql-catalog-deployment-constraints.md delete mode 100644 docs/research/2026-08-23-thothii-metadata-publication-qdrant-seams.md delete mode 100644 docs/research/2026-09-07-antigravity-gemini-flash-value.md delete mode 100644 docs/research/2026-09-07-deepseek-harness-terminal.md delete mode 100644 docs/research/2026-09-07-omp-codex-zcode.md delete mode 100644 docs/research/2026-09-07-pi-config-vs-oh-my-pi.md delete mode 100644 docs/research/2026-09-07-zai-coding-plan-cli-quota.md delete mode 100644 docs/research/2026-09-07-zed-acp-omp-pi.md delete mode 100644 docs/research/text-to-sql-products.md create mode 100644 scripts/test-verify-auth-docs.py create mode 100644 scripts/verify-auth-docs.py diff --git a/.gitea/workflows/publish-docs.yml b/.gitea/workflows/publish-docs.yml index d9cc6605..69cd096a 100644 --- a/.gitea/workflows/publish-docs.yml +++ b/.gitea/workflows/publish-docs.yml @@ -10,6 +10,8 @@ on: - "scripts/build-docs.sh" - "scripts/verify-public-docs.py" - "scripts/test-verify-public-docs.py" + - "scripts/verify-auth-docs.py" + - "scripts/test-verify-auth-docs.py" - "docs/requirements.txt" - ".gitea/workflows/publish-docs.yml" workflow_dispatch: @@ -45,6 +47,13 @@ jobs: - name: Test public documentation boundary run: python scripts/test-verify-public-docs.py + - name: Test current authentication documentation + run: | + python scripts/verify-auth-docs.py auth + python scripts/verify-auth-docs.py dwh + python scripts/test-verify-auth-docs.py auth + python scripts/test-verify-auth-docs.py dwh + - name: Build documentation run: | mkdocs build --strict diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md index e43e0350..ce318f62 100644 --- a/PROJECT_STATE.md +++ b/PROJECT_STATE.md @@ -1,719 +1,95 @@ -# ThothII — Project State - -Last updated: 2026-09-15. - -This file is the short operational snapshot. Stable commands and the architecture mental model -live in `AGENTS.md`; current design and runtime contracts live under `docs/architecture/`, -`docs/contracts/`, `docs/adr/`, and `docs/evidence.md`. Superseded plans and reports are -available from Git history rather than duplicated in the working tree. - -The guarded server migration from a legacy checkout to the schema-v2 installation, Gitea source, -Authentik, internal catalog/embedding services, and the PSD workspace repository is documented in -`docs/operations/server-upgrade-gitea-workspace-v2.md`. Treat its operator gates and rollback -requirements as mandatory; do not replace the running server stack in place. - -## Public documentation boundary — 2026-09-15 - -MkDocs now publishes only its explicit public-manual allowlist: 20 product, installation, -usage and administration pages, plus approved assets. Internal developer/project documents -remain in Git but are excluded from generated pages and search. The build and publication -workflow enforce this boundary with `scripts/verify-public-docs.py` and negative fixtures. -The critical review and proposed (not executed) source-file retirements are in -`docs/maintenance/2026-09-15-documentation-cleanup.md`. It also records pre-existing stale -paths later in this snapshot and obsolete authentication/DWH documentation verifiers; -those require a separate reference/test cleanup, not restoration of superseded guides. -Commit `043ffdfa` passed Gitea publication run 122 and the generated `pages` search index -contains only the 20 public pages. The served `/thothii-docs/` URL is still a stale static -copy dated 2026-08-26 with internal pages: locating/updating its actual server publication -path remains blocked on verified administrative access. Do not claim the live site is clean. - -## Session review layout deployed — 2026-09-14 - -Session-only dialogs now use the visible app bounds: artifact/column review grows -up to 80rem wide and the available height; short confirmations grow to 40rem. -Existing primary actions appear above and below session forms and review content, -with shared handlers, validation and pending state. Stop/delete focus Cancel; -rename focuses the name field. Administration surfaces are unchanged. The activity -shortcut is relabelled To Administration / Vai all’Amministrazione, retaining its -workspace-management destination. 778 frontend tests, five responsive browser -scenarios, typecheck, translations and the production build passed. The owner -authorized deployment and the server frontend was recreated at 18:09 CEST with tag `b1723c34-session-dialogs-20260914`. Frontend is healthy, -Omics serves the new assets, and doctor passes 13/13 checks. Core and Omics web -were not restarted. See DESIGN.md for the layout contract and -`docs/reports/2026-09-14-session-dialogs-release.md` for provenance and rollback. - -## Session composer and empty Memory fix deployed — 2026-09-14 - -The embedded shell now caps its height at the portal mount height, keeping steering -and Stop & save visible. Empty authoritative Memory archives return zero results -without requiring embedding/BM25; SQL-rule embedding is lazy and shared. The live -empty PSD archive reproduces 503 with the current image and succeeds with the -candidate. 54 Memory tests, 90 frontend tests, five browser scenarios and both image -builds passed. The owner authorized the restart and core/frontend were recreated on -2026-09-14 at 17:18 CEST with tags `49333a2d-session-memory-fix`, from code committed -as `d6cdffea`. Both are healthy; production Memory search returns `[]`, Omics serves -the corrected CSS, native doctor passes 13/13 checks, and admissions are reopened. -Session inventory is preserved. Backups and rollback images are retained. Native -CLI diagnostics must run as installation owner UID 10001 with access to Compose; -see `docs/reports/2026-09-14-session-layout-memory-fix.md` for exact commands and -the remaining interactive browser acceptance. - -## Full/embedded shell and bilingual interface - -Full/embedded shell, EN/IT UI, immutable session interaction language, dark theme, -fullscreen and full-mode logout are implemented. The local Mac descriptor explicitly -sets `shell.mode: full` and `shell.defaultLocale: en`; the native `tht` and local -core/frontend images were updated on 2026-09-13. Omics uses embedded with server-side -identity verification and a replaceable presentation-only PortalAdapter; this does -not mean this branch was verified on the production server. Its changes are -in Omics commit `95154e1`; production deployment remains pending. -See `docs/operations/shell-and-localization.md` for integration and installation -instructions and `docs/reports/2026-09-13-full-shell-implementation.md` for tests, -independent reviews, local browser checks and rollback details. - -### Documentation handoff before branch closure — 2026-09-13 - -Current rendering architecture is in `docs/architecture/application-shell.md`; -the exact portal identity/proxy contract is in `docs/install/authentication-upstream.md`. -`docs/operations/server-codex-handoff.md` is the current server delivery/deploy -runbook, including Omics source integration from GitHub, configuration, tests and -rollback. It supersedes the earlier Omics repository-relay instructions. The acceptance matrix is -`docs/testing/authentication-manual-acceptance.md`. README, documentation navigation, -user/installation/authentication guides and descriptor examples point to these -paths. Local examples explicitly use full/en; the projected server example is -for standalone OIDC, not Omics upstream. No runtime configuration or deployment -was changed by that documentation pass. The 2026-09-14 delivery is prepared for -promotion to main; the actual merge is recorded in Git. PSD acceptance remains pending. - -### Navigation readiness and session accordions — 2026-09-13 - -The Workspace navigation button now carries an accessible green/red readiness -dot instead of a separate text row. Green requires a selected workspace and a -successful, current `ready` response; checking, unavailable and other states are -red, with the state exposed through the tooltip and accessible description. -The backend readiness gate is unchanged. - -Active sessions (non-archived) and Archive both start collapsed. Their adjacent -headers are the only visible content below the scope tabs: no Sessions heading -or external selection toolbar. Each nonempty panel owns its Select all and -bulk-delete controls, scoped to that list and preserving the other's selection. -As of 2026-09-14, only one section can be open at a time, and either can be -collapsed. Empty lists show only "No sessions yet." The open section uses the -remaining sidebar height, with scrolling content capped at `min(18rem, 35dvh)`. The mobile -navigation dialog also provides a bounded height. Keyboard controls and labels -are retained. See `DESIGN.md` and `docs/guida-utente.md` for the UI contract. - -Verification: 768 frontend unit tests, 20 browser scenarios (including 80 mocked -sessions at 390/1280px), TypeScript and the production frontend build passed. -Only the Mac frontend was recreated; it is healthy at `127.0.0.1:8080`. -Core, catalog, Qdrant and embedding containers were not changed. The prior -frontend image is retained as -`thothii-frontend:before-single-session-accordion-20260914` for rollback. - -### Current Omics delivery and server handoff — 2026-09-14 - -The owner corrected the delivery requirement: Omics is obtained from GitHub, -not relayed to another repository as part of this deployment. Any optional -server-side repository copy is solely the owner's separate concern. This -supersedes the 2026-09-13 relay agreement, including historical delivery notes -in the Omics branch. Do not make another remote publication a prerequisite. - -GitHub branch `codex/thothii-embedded-shell` at -`https://github.com/Dallavilla-Tiziano/omics_portal.git` was reverified at -`fca10901a73666ca257d8f4cc4b77066295c400a` (functional commit `95154e1`). -The server operator integrates it with the current code in the confirmed Omics -checkout, normally `/home/chirone/omics_portal`, preserving later server changes. -`docs/operations/server-codex-handoff.md` is the authoritative ordered procedure: -inventory, source verification, native CLI and installation projections, -embedded/upstream auth, Omics templates/static assets/proxy, coordinated rollout, -acceptance and rollback. Server deployment and real IdP acceptance remain pending. - -## Current product shape - -### Shared Memory/Evidence typography — 2026-09-13 - -Both detail readers now share Manrope and fixed reading roles: 24px card title, -20px section headings, 16px/1.65 narrative text, and 14px metadata/code. Authored -Markdown subheadings remain subordinate to field headings; inline/fenced code no -longer shrinks cumulatively. Full-width layout, paragraph separation and isolated -FAKE examples are retained. All 762 frontend tests and 18 browser scenarios pass, -including computed typography checks at 390/1280/2400px; typecheck, i18n and Docker -build pass. Only Mac frontend was recreated: `87fca0dc5e19`, image `19f1704b6bb2`, -healthy. Core and data services are unchanged. Rollback image: -`thothii-frontend:before-knowledge-typography-20260913`. See -`docs/reports/2026-09-13-knowledge-typography.md`. No PSD/Omics deployment. - -### Knowledge reading and isolated fake Memory examples — 2026-09-13 - -Memory/Evidence details now use all available width, with display-only paragraph -splitting for long plain prose and preserved code/Markdown/source data. Evidence -provenance renders Markdown; copy controls are accessible two-sheet icons. -Memory's separate Formatting examples section contains four FAKE cards (one per -family), automatically expanded for an empty archive. These client-side examples -cannot be edited/saved/indexed and are never submitted to the model or Memory API. -No real archive content was changed. 762 tests, 18 browser scenarios, typecheck, -i18n and Docker build pass. Only the Mac frontend was recreated: `fc4286b5406d`, -image `cbe0fe0dce55`, healthy; other services unchanged. Rollback image: -`thothii-frontend:before-knowledge-reading-20260913`. Details in -`docs/reports/2026-09-13-knowledge-reading.md`; no PSD/Omics deployment. - -### Unified Session entry and complete tab borders — 2026-09-13 - -The sidebar has one Session/Sessione button: return to the current unfinished -session (including pending creation) without resetting/reconnecting it; otherwise -prepare a new question with existing readiness and dirty-edit guards. Creation -still requires submitting a question. A cold document panel is not a running session. -Session tabs now have 11px horizontal/3px vertical padding, at least 38px height, -and matching 1px borders on every side (gray inactive, red active), with no shared -baseline or overlapping bottom border. This supersedes the earlier border removal. -757 frontend tests, 15 browser scenarios, typecheck, i18n and Docker build pass. -Mac frontend `2844778d311c`, image `d58dccfee3f9`, is healthy; only that service -was recreated. Core/data services are unchanged, with no Omics or server deploy. -Rollback image: `thothii-frontend:before-session-navigation-20260913`. - -### Login copy and language-selector focus — 2026-09-13 - -Removed the redundant login eyebrow/icon and installation-account explanation; -the main sign-in heading remains. The full-header language select no longer -shows an outer focus ring after pointer interaction; keyboard focus remains -visible, including after returning with Tab. EN/IT login and both themes are -covered by 36 targeted tests and 14 browser scenarios; typecheck/build pass. -Only the Mac frontend was rebuilt/recreated: `204efd40d3eb`, image `7dd0752ff823`, -healthy. Other containers are unchanged. Rollback image: -`thothii-frontend:before-login-focus-20260913`. No production deployment. - -### Full-header and layout refinements — 2026-09-13 - -The owner's four visual adjustments are implemented: full header uses Omics -`#CB333B` in both themes with a light complete wordmark/controls; Database status -has 16px clearance below its top divider; workspace/model/Done share a compact -desktop row; session-scope tabs have no bottom border. Embedded has no extra header. -Verified with 71 targeted frontend tests, 11 browser scenarios, typecheck and -Docker production build. The Mac frontend was recreated alone and is healthy -(`8a1608ad7fc6`, image `a2f489ebe9de`); Core/data-service containers are unchanged. -Full/en is retained. Rollback image: `thothii-frontend:before-header-layout-20260913`. -See `docs/reports/2026-09-13-header-layout-refinements.md` for validation and rollback. - -### Visual review integrated with the full/embedded shell - -At the owner's request, the seven commits through `a59624a6` from -`codex/ui-visual-review` are integrated with the shell/i18n work in this checkout, -`codex/prototype-administration-pages`. Both branches started at `2d1b714e`; the -first full-shell build omitted that lateral branch and regressed the installed UI. -The integrated source retains bundled Manrope, shared type roles, catalog/context -alignment, wordmark sizes and composer autosizing alongside full/embedded and EN/IT. - -Local Docker was updated at 12:54 UTC on 2026-09-13: frontend image `605a6e6bba68`, -healthy; Core and all data-service containers were unchanged. Mac remains full/en. -The immediate pre-merge frontend is retained as -`thothii-frontend:before-visual-shell-merge-20260913`. - -Verification: 755 frontend tests, 11 Playwright visual/interaction scenarios at five -widths, translation-catalog checks, typecheck and production build. See -`docs/reports/2026-09-13-visual-shell-integration.md` for delivery, provenance and -rollback details. The separate visual-review worktree and its rollback images are -retained. No merge to `main`, push or production deployment is part of this delivery. - -Gitea #28–#31 follow-up is implemented in this checkout: Workspace's four tabs, -Database list-first entry without the preparation footer, full-height Pi instructions -with installation-host OS selection, and short Admin navigation labels. Core and -session behavior are retained. At the owner's request, these changes were rebuilt into -local Docker on 2026-09-12 at 18:31 UTC. Core/frontend are healthy and the UI at -`http://127.0.0.1:8080` serves the updated bundle. The host projection now supplies -`THT_HOST_PLATFORM=darwin`, so Pi selects macOS rather than the container's Linux OS. -Persistent dependency containers and volumes were unchanged. Rollback images are tagged -`thothii-core:before-admin-28-31-20260912` and -`thothii-frontend:before-admin-28-31-20260912`. See -`docs/reports/2026-09-12-admin-issues-28-31.md` for verification and deployment details. - -The latest context-shelf A and five Administration pages are implemented locally. -At the owner's request, local Docker project `thothii-18998cca7b0a` was rebuilt and -its core/frontend recreated on 2026-09-12. The real UI at `http://127.0.0.1:8080` -serves shelf A; both services and their existing dependencies are healthy. -Runtime model projections were regenerated as schema v2 with the single -`zai/glm-5.3` interaction default. Persistent services/volumes were not recreated. -The local launcher `/private/tmp/thothii-memory-preview.sh` now adds -`/private/tmp/thothii-context-a.compose.yaml` last, building from this checkout -instead of the earlier Memory worktree. Previous images are retained under -`thothii-core:before-context-a-20260912` and -`thothii-frontend:before-context-a-20260912`. Remote server deployment remains pending. -Core/session behavior is retained; one independently remembered workspace/model -pair controls both Core and Admin. Unsaved Admin changes block navigation and -context changes; operation activity locks the selectors. See -`docs/reports/2026-09-12-context-shelf-a-implementation.md` for verification and the -remaining server/Omics integration gate. Prototype alternatives remain untouched. - -ThothII is a human-in-the-loop datamart builder with three independently built layers: - -```text -frontend (React/SSE) → backend (Fastify) → pi --mode rpc → tht/harness → DWH (read-only) -``` - -The harness owns the deterministic eight-phase NL→SQL workflow and all session persistence. -The backend remains a process/RPC/SSE bridge for sessions and now also owns an isolated PostgreSQL -metadata catalog for administrative database configuration. The frontend renders the review gates -and keeps the live transcript in memory. See -`docs/architecture/components.md` for the detailed component and data-flow map. - -## Memory M1–M3, Evidence E1–E3 and joint workflow repair X1 implemented - -Browser authorization now derives permissions from validated session roles using the current -catalog. This fixes Memory/Evidence navigation remaining disabled for administrators whose -remembered login predates those permissions; refreshing the page loads the updated permissions. - -The owner requested two independent administration projects: Memory management and Evidence -management. Their navigation entries must sit immediately after Database management, as peers; -neither page belongs to Database management. Both require complete browsing, filtering, and CRUD -without an active core session. Shared requirements and the two project briefs are linked from -`docs/plans/2026-09-08-memory-evidence-administration.md`. Memory administration is implemented; -Evidence administration is implemented through external file editing and explicit consolidation. -Evidence editing requires an explicit evolution of the current authoring/publication contract. -The M1 specification is at `docs/plans/2026-09-08-memory-m1-spec.md` and published as -[M1 — Archivio autorevole e amministrazione delle Memory Card](https://git.tylconsulting.it/mptyl/ThothII/issues/27) -with the `ready-for-agent` and `enhancement` labels. -It covers the authoritative store, administrative CRUD, projection recovery, and current -Memory/exemplar producer integration. Its accepted test boundaries are the public harness -service, Fastify APIs, and the AppShell page, joined by a focused real-stack browser path. -The owner confirmed those boundaries and authorized publication on 2026-09-08. -M1 is implemented locally: PostgreSQL authority in `thoth_memory`, versioned installation -migrations, admin CRUD for all four families, structured dependencies and links, explicit -projection recovery, verified recall and current workflow producers. The page requires no -active session or DWH binding. The existing `catalog-migrate` preparation service now runs -Memory migrations as well. Existing installations need that preparation before using M1; -the initial implementation did not deploy or migrate the owner's stacks. -The integrated browser check passed with real authentication, Fastify, ThtRunner, harness, -PostgreSQL and Qdrant; embeddings were deterministic and unrelated Pi/session activity used -test fixtures. See `docs/plans/2026-09-08-memory-m1-validation.md` for results and commands. -M2 is implemented locally: Memory dense/BM25 fusion, physical and business scope filters, -bounded outgoing-link expansion and joint ranking, all resolved against current PostgreSQL -authority. Migration `002_hybrid_projection.sql` makes old dense projections pending until -explicit retry/rebuild; Reference remains separate. The real retrieval check uses the configured -`qwen3-embedding:0.6b` model, a separate Ollama process with a read-only model-volume mount, -and isolated PostgreSQL/Qdrant resources. See `docs/plans/2026-09-09-memory-m2-validation.md`. -M3 is implemented: editable F8 summary grounded in effective approved decisions, explicit -updates with concurrent-edit protection, selected-card/link transactions and durable review -receipts. Finalization no longer saves exemplars implicitly. SQL rules and explained errors -are consulted in the existing F4/F6/F7 gates. Successful Catalog physical synchronization -performs dependency cleanup, preserving the original removals for recovery across restarts. -Migration `003_review_receipts.sql` is required. Validation includes a real GLM 5.3 generation -case against synthetic PostgreSQL data; see `docs/plans/2026-09-09-memory-m3-validation.md`. -Evidence administration and the joint X1 conflict-repair increment are now implemented. -The same local preview was subsequently rebuilt with M3 and migration 003 applied. -Core and frontend now include the final Memory review and physical dependency cleanup. -On 2026-09-09, at the owner's request, the local PSD Docker installation -`thothii-18998cca7b0a` was updated from this worktree. Core/frontend images were rebuilt, -Catalog and Memory migrations completed, and all five services became healthy. The UI is at -`http://127.0.0.1:8080`, using the existing local authentication and persistent volumes. -The `psd-clinical` authoritative Memory archive is initially empty (no legacy import). -The existing installation configuration remains in `/Users/mp/projects/ThothII/deploy/psd/`; -`/private/tmp/thothii-memory-preview.sh` invokes its Compose files with a final build-context -and migration-command override from this worktree. A future build from the main checkout -will use that checkout's code, so retain the worktree override until the changes are integrated. -Memory revision history and compatibility with existing development sessions are not requirements. -The agreed Memory scope includes reusable domain clarifications, SQL construction rules, solved -questions, and explained, approved mistakes to avoid. This extends the current runtime's -`concept_clarified`-only reusable Memory contract. The owner also approved an editable final summary -for proposed additions/updates and Memory consumption in the relevant existing review gates. -Further agreed behavior includes persistent corrections for Memory/Evidence conflicts through -explicit choices, deletion of Memory with invalid dependencies after successful physical schema -synchronization, and bounded functional/regression tests instead of a general quality benchmark. -In-house Memory evolution is approved, including hybrid Qdrant retrieval and explicit card links -traversed in core, without a dedicated graph database. Both capabilities belong to the current -scope. PostgreSQL is the agreed authority for Memory Cards, links, and schema dependencies; -Qdrant is a rebuildable index. Links are reviewed with cards and editable in Administration; -deleting a card removes its incident links while preserving the other cards. The accepted, -implemented architecture is recorded in -`docs/adr/0018-use-postgres-for-memory-and-qdrant-for-retrieval.md`. -For Evidence administration, Q12 rejects a separate editorial publication workflow. -The final R0 direction uses external editors and a manual consolidation command that -validates structure, reports required corrections, updates derived metadata, and -activates the local Evidence index. The operator then checks the diff and runs Git -commit/push manually. No watcher, automated Git, or web editor is required. -The owner's later simplification -instruction removes the requirement to support administrative edits while core work -is in progress. Deliberate corrections made by the workflow itself remain supported. -The context specialist writes Evidence drafts independently of the installation and -without PostgreSQL access; the system refines them and stores them locally for use -and maintenance. The revised Q11 recommendation separates external drafts from a -durable local canonical file archive, removing automatic commit/push from CRUD. -The owner has now accepted local files and requires discoverable, editable Markdown -for nontechnical domain specialists, with no JSONL management surface. Editors on -Mac/PC or vim/nano on the server are the chosen R0 editing surface. Evidence -management keeps browsing/filtering/detail and clearly identifies the persistent -working tree, each Markdown file's actual host path, and the manual commands. -E1 implements editable Curated Evidence v4, deterministic legacy conversion, persistent -local files and a consolidation API with immutable candidates, manual provenance, -deletion records and recoverable activation. E2 connects its installed command, runtime source -selection and administration page. The operator completes Git steps manually. -All 35 PSD units were converted on an isolated copy with identical IDs and typed content. -Tests exercise visible edits through normalization, indexing and recall with real Qdrant; -see `docs/plans/2026-09-09-evidence-e1-validation.md` and -`docs/contracts/curated-evidence-v4.md`. E2 is now running on the local Docker preview: -all 35 PSD units were converted and indexed through the installed command. The editable -host archive is `/Users/mp/projects/ThothII/deploy/psd/evidence-registry/repo/psd-clinical/evidence`. -The original registry-volume checkout and original author repository were retained. -The installation descriptor now includes `workspace-bindings.yaml` and `evidence-host.yaml` -so native maintenance uses the same volumes and checkout as the preview. Descriptor backup: -`/private/tmp/thothii-installation-before-e2.yaml`; previous native binary: `/private/tmp/tht-before-e2`. -The launcher remains `bash /private/tmp/thothii-memory-preview.sh`; its worktree build override -is still required until integration. Runtime lease filenames now include rendered bytes so -upgrading the Evidence renderer does not collide with old immutable configs; Catalog -input fingerprints and readiness are unchanged. See `docs/plans/2026-09-09-evidence-e2-validation.md`. -E3 adds explicit source acquisition/refinement and durable comparisons in Evidence management. -Local drafts go in `evidence/incoming/`; original local documents and configured HTTP/S3 -sources are reacquired only by **Import or refresh sources** or installed -`tht workspace evidence refresh --workspace `. Keep/replace decisions, including the -native `workspace evidence decide` command, activate through the existing archive/index -path and have durable retry state. Acquired source versions and remote provenance stay -local; old documentary lineage can coexist with current manual declarations. -The installed preview's 35 PSD sources were verified unchanged with no new proposals. -The previous native CLI is backed up at `/private/tmp/tht-before-e3`. -See `docs/plans/2026-09-09-evidence-e3-validation.md` for tests and validation limits. -X1 adds `reviewer_archive_repair`: closed alternatives with complete before/after content, -explicit rejection/reformulation, admin-only application, durable session receipts and -retry of saved but inactive corrections. The coordinator uses the canonical Memory and -Evidence services; phase approval remains separate. Migration `004_archive_repairs.sql` -is required. See `docs/contracts/archive-repair.md` for authorization and recovery limits. -X1 validation is recorded in `docs/plans/2026-09-09-archive-repair-x1-validation.md`: -both archives were corrected and retrieved through the actual CLI with real PostgreSQL -and Qdrant; desktop/mobile widget behavior and permission failures were verified separately. -The local preview images include X1 and migration 004 is applied. Follow-up technical -acceptance passed with configured GLM 5.3 generating closed conflict alternatives and -the chosen Memory correction persisted and retrieved. An authenticated browser test -also verified both administration pages, navigation order, Evidence filtering, workspace -404s, desktop/mobile layout, and Evidence survival after Memory deletion. All approved -technical increments/checks are complete. A real PSD domain-conflict session remains -the reviewer's semantic acceptance check; automated cases did not modify PSD knowledge. -The joint browser inspection also fixed mobile archive navigation: below 768px, -Memory and Evidence keep the full content width and open navigation in the shared -accessible dialog. Desktop retains its sidebar; the local frontend image includes this fix. -The owner accepted the remaining simplifications and requested explicit clarification -of the core format change and the simple terminal-based Git check. E1 must adapt -the Evidence parser, renderer, authoring, validation, and normalization; convert -existing files and reindex; and verify that visible edits reach core consumption. -Preserve the internal typed model where possible. This precedes the administrative -page and is not merely a presentation change. Human inspection uses normal Git -status and optional line-level diff commands; no custom diff viewer or mandatory -double review is required. -The suggestion of making PostgreSQL the Evidence authority was withdrawn after this -clarification; it was never implemented or accepted as a replacement for Q11. -Q13 keeps manual corrections active when updated sources contradict them, until an -administrator resolves the comparison; deleted Evidence must not be regenerated -automatically. Q14 allows direct manual creation and records a manual declaration -as the current source, preserving any original document as distinct provenance. -Q15 refreshes external sources only on explicit administrator request; normal saves -and lookups do not reacquire them. These decisions, now implemented through E1–E3, are recorded in -`docs/adr/0019-author-evidence-in-app-with-automatic-activation.md`. -The decision-by-decision review is recorded in -`docs/plans/2026-09-08-memory-evidence-simplification-review.md`; it distinguishes the -new constraints from the revised technical recommendations. It also specifies a -sequential save with minimal durable retry state and direct Memory cleanup after -successful schema synchronization, without new queues or event infrastructure. -The delivery order remains Memory, Evidence, and persistent conflict repair between -both modules. Local curated Evidence must survive preprocessing Clear and be backed -up as primary data; the Qdrant projection remains rebuildable. -No runtime gate change or administrative page is implemented yet. - -## Evidence restructuring — accepted - -The evidence restructuring and PSD migration completed real acceptance on 2026-08-25. - -- The curated PSD revision contains 35 approved Evidence units and 60 review items. -- The PSD authoring repository publishes all 35 units using Curated unit schema v3. Its table-free - presentation uses hidden canonical metadata, wrapping Markdown scope lists, list-based enum - values, and collapsed technical provenance. Long domain rules now have a deterministic - human-readable presentation while retaining their exact canonical text for vector ingestion. - `tht evidence migrate ` performs the deterministic v1/v2 upgrade and older-v3 - presentation rewrite without model calls. The structured-rule PSD rewrite is currently local and - pending commit/publication. -- The accepted snapshot is - `psd-clinical-675990d90eae51da6f2bd51b1ae2609f245772ef-snapshot`. -- The active generation is `gen:f968b3bd7a553dbfef3cf47093698f2bc7f95f11`. -- Retrieval acceptance reached 20/20 Hit@10. -- A real session, `20301df7-cad7-403d-a4c1-9f35c9d07b66`, completed F1–F8 with five - receipts, three CTEs, and a final result of 78 patients. -- The durable acceptance record is - `docs/testing/evidence/evidence-restructuring-psd-acceptance-2026-08-25.md`. - -The canonical authoring, validation, publication, materialization, and preprocessing flow is -documented in `docs/evidence.md`. The governing contracts are -`docs/contracts/workspace-evidence-v3.md` and -`docs/contracts/workspace-preprocessing-cli.md`. -The incremental server procedure for the `260906-preprocessing-complete` release is -`docs/operations/server-handoff-260906-preprocessing-complete.md`. - -## Workspace preprocessing and configuration - -The native host CLI `tht` is the operator surface. Workspace preprocessing runs through: - -```sh -tht --installation /absolute/path/thothii-installation.yaml \ - workspace preprocess run --workspace -``` - -This complete one-shot command uses the profile-gated `workspace-maintenance` service. Partial DWH, -schema, Evidence, and vector mutation commands are retired. - -The right Administration sidebar invokes that same operation for the selected workspace. It shows -only current readiness or the latest bounded failure diagnostic; there is no preprocessing history. -Known non-ready state disables **Session** when it would start a new question, -while backend admission remains authoritative. -The same control exposes an inline-confirmed **Clear** action to remove replaceable reference -vectors, LSH, corpus, and checkpoints while preserving the separate Memory collection. The host CLI -equivalent is `workspace preprocess clear`. - -Each workspace now uses `-reference` for Schema, relationships, and Evidence and -`-memory` for `memory` and `solved_question`. Clear and preprocessing own only the former. -LSH ownership additionally binds the Catalog database ID and Metadata Content Revision, so derived -values cannot be reused across database identities or Catalog revisions. - -Workspace descriptors use schema v4 and contain only workspace identity and optional Evidence. -PostgreSQL Metadata Catalog owns database identity, binding, schema, descriptions, sensitivity, and -relationships; model, provider, embedding, and vector-store configuration is installation-owned. For -PSD, workspace content and runtime roots point to the -separate uncommitted repository `/Users/mp/projects/tht-workspace-psd`. Secrets remain outside -Git and are supplied only through installation-local protected files. - -## Installation Model Catalog - -`thothii-installation.yaml` schema version 2 is the only operator-authored source for session, -metadata-generation, and embedding models. The host `tht` lifecycle validates `modelCatalog` and -regenerates the backend catalog, Pi `models.json`/`settings.json`, and Compose override under the -installation-local `generated/` directory. Those projections are replaceable runtime adapters: -they are not edited, backed up, or treated as configuration. - -Core and Administration now share one canonical `modelCatalog.defaults.interaction` per installation, -independent of workspace. Runtime catalog schema v2 contains only `defaultInteraction`; apply the host, -backend, and regenerated projections together. Equal legacy defaults normalize on read; conflicting -ones require an explicit operator choice. With Admin AI configured, selectable models are the -intersection of the Pi and LiteLLM adapters; Core-only installations remain supported without Admin AI. -The existing Core and Database controls share the operational selection. Explicit model choices are -remembered per authenticated user/application mount in this browser, not in installation settings. -Resume uses that selection/default while preserving the historical workspace/revision and manifest. -Every model must be manually exercised in both Core and Admin as documented in -`docs/general/pi-configuration.md`; validation is not a live model certification. -These changes and shelf A are now deployed to local Docker; remote deployment remains pending. - -PSD DeepSeek Pro/Flash now share canonical `deepseek/...` identities across native Pi and LiteLLM, -using the existing `DEEPSEEK_API_KEY` bundle entry. Its value was confirmed identical to the working -Pi key without exposing it; no secret files were changed. The duplicate `deepseek-metadata` descriptor -is removed locally and the tracked example uses the shared provider. `secret_env` overrides legacy -Pi auth only inside temporary runtime snapshots and fails closed if the bundle key is missing. -The original auth store/history and `zai/glm-5.3` default are preserved. Local Docker projections -and core/frontend were updated together on 2026-09-12. Regenerate projections with -the matching release for the separate server deployment. - -Provider authentication declares -one explicit mode (`secret_env`, `pi_auth`, or `none`); `secret_env` names a protected bundle key. -The backend settings store now owns only the selected workspace and thinking level. Existing v1 -installations use the explicit catalog migration command; schema-v3 workspace descriptors are -converted deterministically in their curator-owned repository before commit. Strict runtime loading -does not silently infer or merge legacy sources. ADR 0013 and -`docs/plans/2026-09-02-installation-model-catalog.md` record the decision and implementation. - -## Database management - -The database, table, and authoritative physical-schema catalog slices are implemented. Database -Management now opens the Fleet Ledger presentation by default inside `AppShell`, lists every YAML -workspace, creates at most one PostgreSQL database configuration per workspace, edits direct -PostgreSQL, REST API, or SSH-tunnel installation bindings, replaces write-only encrypted secrets, -and tests supported connector bindings. The surface keeps one responsive AG Grid visible at a time: -databases lead to tables, tables lead to columns, and relationships are a sibling database view. -Parent navigation remains explicit through the breadcrumb and emphasized back control. - -Selection-scoped operations use one action selector plus an explicit **Run** control; ineligible -actions remain visible with their disabled reason, while row-scoped actions stay in the pinned final -column. The KPI strip reads installation-wide or selected-database aggregates from -`GET /catalog/metrics`. Database configuration, metadata editors, synchronization history, -description history, and sensitive-field review/history use the production APIs in right-side -drawers rather than prototype fixtures; closing a history drawer does not stop its background run. - -Sensitive-field review is now driven by the versioned local `sensitivity-v4` policy, not by a -catalog model. The backend reads selected source tables through read-only, database-specific -adapters and makes every `sensitive | non_sensitive` draft decision in the TypeScript -`SensitivityClassifier`. A single validated match protects the column. Tables up to 1,000 rows are -fully scanned; larger tables use breadth-first 300, 1,000, and text-only 3,000-value targets, with a -five-second limit per source query and no global request deadline. Source failures fail the run -instead of yielding `unknown`; coverage remains visible separately from the proposal. Draft -assessments remain transient until an administrator explicitly saves them. Optional GLiNER2 -evidence is CPU-only, offline, opt-in, and never replaces the deterministic decision point; see -`docs/operations/sensitivity-analysis.md`. The earlier v1 PSD shadow comparison kept NER disabled by -default; see `docs/reports/2026-09-02-psd-sensitivity-shadow.md`. The v2 comparison completed all -2,275 columns: CPU NER added 18 sensitive proposals and increased warm runtime from 50.1 to 61.3 -seconds; see `docs/reports/2026-09-03-psd-progressive-sensitivity-shadow.md`. -Version 4 excludes declared `bigint` primary-key columns and conventionally named `pk bigint` -columns before source inspection, reporting both as non-informative structural identifiers while -distinguishing declared constraints from inferred roles. - -Physical membership, source -comments, column types/default/nullability/PK positions, and constraint-level ordered FK pairs are -projections of the external schema. They cannot be created, renamed, or structurally edited by -hand, but administrators can explicitly clear catalog tables, columns, or relationships without -touching the source database, binding, configuration, or secrets. Table deletion cascades through -columns and relationships; table-scoped relationship cleanup includes incoming and outgoing -relationships. Curated and generated descriptions are editable; generated descriptions start null -and Database Management can generate or consolidate them for selected tables, selected columns, -all targets, or only targets whose Generated Description is missing. - -Relationship Management is now reachable directly from each configured Fleet database. One -Relationship Map shows read-only Physical Relationships together with Generated and Manual Logical -Relationships, with Active, Excluded, and All filters. Administrators can add a single-column -relationship, run deterministic name/PK/type inference, exclude or restore a logical relationship, -or delete it permanently. Exclusion retains a tombstone that a rebuild cannot reactivate; permanent -deletion allows a later rebuild to infer the same endpoints again. Inference uses no LLM, embedding, -or source values. It supports normalized table-qualified names, unique non-generic PK names, -composite-PK source columns, and the `*time_key -> dim_time.` warehouse convention while -ignoring bare generic names. Explicit table/column metadata cleanup remains a destructive boundary: it removes -the attached logical relationships and exclusions and requires a full schema synchronization before -inference or runtime publication can continue. - -The previous Database Management renderer remains a temporary comparison fallback for development -and staging only: `?db-ui=legacy` is honored in Vite development or when -`VITE_DB_MANAGEMENT_LEGACY=true`; it is not a production presentation. The standalone Fleet Ledger -prototype on port `5173` also remains temporary until owner acceptance of the integrated surface, -after which both migration aids can be removed. - -Schema refresh is one durable asynchronous engine with database-table, selected-table-column, -relationship, and full-database actions. Database-level menus expose only the table, relationship, -and full scopes; selecting tables exposes column synchronization plus manual column and relationship cleanup for that subset. Database selections -also expose manual table and relationship cleanup. Cleanup selections are atomic and share the -one-active-operation-per-database exclusion with synchronization. Runs have leases and -restart recovery, atomic apply, destructive-diff confirmation with re-scan, cancellation before -apply, retained history, and a live SSE log with polling fallback. Null metadata renders blank -rather than as a placeholder. - -Direct PostgreSQL and strict known-host-verified OpenSSH use `pg_catalog`. REST bindings use the -typed full-snapshot `POST /rpc/schema_snapshot` contract when available. Servers such as the -current PSD endpoint that exposes only `POST /rpc/run_query` use one catalog-owned read-only query -to return the exact same strict v1 snapshot in a single round trip. Both paths remain fail-closed: -an absent capability, query error, partial result, or invalid snapshot applies no catalog changes. -SSH is not yet enabled for NL→SQL session runtime. - -The catalog runs in the internal `catalog-db` PostgreSQL service. Kysely migrations are an explicit -one-shot `catalog-migrate` operation; `scripts/run-stack.sh` runs it before local startup. Runtime -sessions consume an immutable Catalog JSON snapshot tied to the runtime-config lease. It contains -the tables, columns, effective descriptions, sensitivity flags, and active relationships used by -the harness; PostgreSQL is the exclusive runtime authority for database metadata. Authored -workspace YAML remains limited to workspace identity and optional Evidence configuration. The -accepted design is recorded in ADR 0016 and the contracts under `docs/contracts/`. - -Semantic aliases, value descriptions, synonyms, and concepts remain deferred to their dedicated -slices. - -AI Description Generation uses the catalog's human-owned Sensitive Data Flag. The flag defaults to -`false`, including for newly synchronized columns. An administrator may request a local sensitivity -analysis for one selected database, selected tables, or selected columns. One deterministic -TypeScript classifier combines metadata, bounded source-content rules, and optional CPU-only NER; -no generative model decides the result. Its `sensitive` or `non_sensitive` assessments remain an -unsaved draft until the human reviews and saves any chosen flag changes, including a downgrade to -non-sensitive. Coverage is reported separately; interrupted history may count unprocessed columns. -Each started analysis records a separate Sensitivity Analysis Run with aggregate counters and safe -ordered events. The progress drawer opens before the synchronous request completes, polls the run, -and displays sanitized source-scan and local-NER phase/batch activity while classification is in -progress. This operational history never stores per-column assessments, source values, -matched spans, prompts, or free-form diagnostics. Saving a sensitive decision persists a sanitized -Sensitivity Reason as column Catalog Metadata alongside the human-owned flag; clearing the flag -clears that reason. Reloading still discards an unsaved review draft. -For unprotected columns, up to five source rows and five representative non-null values may be sent -transiently to the configured model provider. Protected columns are omitted from source reads and -replaced in the prompt by deterministic plausible values derived only from their metadata. Existing -descriptions are not regenerated when a flag changes. - -The accepted AI-description design is recorded in -`docs/plans/2026-08-28-ai-catalog-description-generation.md`, with the formal specification in the -adjacent `-spec.md` document and Gitea issue #4. Gitea issues #5–#11 deliver the implementation. -The runtime deliberately keeps ThothAI's simple operating model: one installation-wide sequential -run owned by the backend, one short-lived Python/LiteLLM completion helper per request, and -persistence limited to the run, its safe ordered text events, and each Generated Description as -soon as it succeeds. The helper performs at most one provider retry and never falls back to another -model. Stop terminates the current helper and retains prior results; three consecutive exhausted -technical batches fail the run. Startup marks stale queued/running work interrupted, and Unlock is -available only when no local start, worker, or helper is live. Runs remain inspectable through a -live SSE log with ordered polling fallback; there is no automatic resume or user-facing generation -CLI. ADRs 0009–0010 record the runtime and source-sampling decisions. - -The Installation Model Catalog accepts the protected `DEEPSEEK_API_KEY` and `ZAI_API_KEY` -references for metadata-generation providers. -It also accepts a model with no secret reference only when its OpenAI-compatible endpoint is -explicit; this covers the VPN-only AritmoLab Qwen 3.6 server without creating a fake operator -credential. The Python client supplies only its fixed non-secret compatibility placeholder. -The AritmoLab entry also sets `disableThinking: true`, mapped to the endpoint's chat-template flag, -because its default reasoning prose would violate the worker's exact JSON response contract. - -Logical relationship integration with core schema-linking is complete: session creation and resume -materialize the active physical/generated/manual map, retrieval-pack generation and Pi receive the -same runtime config, and snapshot validation fails closed on a declared missing, invalid, or orphaned -endpoint. Broader publication of other Catalog metadata to schema-linking remains a separate future -slice. - -**Deferred follow-up — Sensitive Data Policy in schema-linking.** The policy is first delivered -and tested in catalog description generation. Its enforcement for core schema-linking remains -out of scope until the current tickets are closed and the owner has completed the acceptance test. -At that gate, resume the design: `tht` must receive a read-only projection of the current Sensitive -Data Flags and exclude values from columns marked sensitive from every LSH result before it is -given to Pi. Do not start this integration before the owner gives final approval after that test. - -## Active deployment work and manual gates - -### PSD server deployment program - -The approved design and executable entry point are: - -- `docs/plans/2026-08-20-psd-server-deployment-program-design.md` -- `docs/plans/2026-08-20-psd-server-deployment-program.md` -- `docs/plans/2026-08-20-psd-server-survey.md` -- `docs/plans/2026-08-20-psd-server-project-a-standalone.md` -- `docs/plans/2026-08-20-psd-server-project-b-authentik.md` - -Last recorded state: - -- survey: `SURVEY_NO_GO`; -- Project A: `BLOCKED_BY_SURVEY_AND_MUTATION_GATE`; -- Project B: `BLOCKED_BY_PROJECT_A_AND_PRE_B_GATE`. - -The deployment is a clean replacement: legacy sessions, indexes, and application configuration -are not migration inputs. The existing stack remains intact until its documented mutation and -rollback gates are explicitly approved. Shared Omics/LocalLLM networks, ETL Evidence, DWH, -`dwh-auth`, Supabase, Authentik, Superset, and Aritmolab are outside cleanup scope. - -Human acceptance guides and sanitized report templates live under `docs/testing/` and -`docs/testing/evidence/`. The remediation checklist is -`docs/operations/psd-server-survey-remediation-checklist.md`. - -### Authentication - -The local/OIDC authentication remediation passed its automated review on 2026-08-18. Release and -PSD mutation gates remain governed by: - -- `docs/architecture/authentication.md`; -- `docs/plans/2026-08-18-thothii-authentication-acceptance-and-psd-deployment.md`; -- `docs/operations/psd-dwh-auth-rollout.md`; -- `docs/testing/authentication-manual-acceptance.md`. - -Do not infer authorization for server, Nginx, Authentik, database, credential, or cutover changes -from an automated PASS. - -## Verification status - -- The P1.1 workspace-directory registry and P2–P6 preprocessing workstreams are implemented and - have automated coverage. -- Evidence restructuring has a real PSD acceptance PASS as recorded above. -- AI Description Generation has automated coverage across installation setup, model selection, - generation/consolidation scopes, bounded sampling, cancellation/recovery, history, SSE/polling, - and the LiteLLM helper boundary. -- L2 tests requiring real providers or remote databases remain opt-in. -- Server deployment, release, and owner-operated acceptance steps remain pending wherever the - referenced runbooks require explicit approval. - -Run the layer-specific checks documented in `AGENTS.md`. For release-sensitive changes, also run -the repository contract scripts in `scripts/` and build the MkDocs site. - -## Operational invariants - -- `tht`'s `-c`/`--config` option follows the subcommand; it is not a global option. -- `--json` commands write pristine JSON to stdout. -- Persisted phase documents and the decision ledger are the source of session truth; chat is not. -- UI chrome is English; workspace document content retains the workspace language. -- The backend refuses resume for finalized or archived sessions. -- A resume must send `/riprendi-sessione `; a new session must send `/nuova-domanda`. -- DWH access is read-only. +# Project state + +Updated: 2026-09-15. This is a current snapshot, not a release diary. Stable commands +and invariants are in [AGENTS.md](AGENTS.md); prior snapshots remain in Git. + +## Current contracts + +- React supports full/embedded rendering independently of local/OIDC/upstream auth, + with EN/IT UI and immutable session interaction language. See + [application shell](docs/architecture/application-shell.md) and + [localization](docs/operations/shell-and-localization.md). +- PostgreSQL Metadata Catalog owns database identity, binding, schema, descriptions, + sensitivity and relationships for all core consumers. Workspace schema v4 contains + identity and optional Evidence only. Installation schema v2 is the authored model + catalog source. See [overview](docs/architecture/overview.md) and + [model configuration](docs/general/pi-configuration.md). +- The harness owns workflow persistence; chat is not the durable session record. + Memory uses PostgreSQL authority and derived Qdrant dense/BM25 search. Editable + Evidence has local archive authority and manual consolidation. File save, search + activation and Git publication have distinct outcomes. See + [Memory](docs/gestione-memory.md), [Evidence](docs/contracts/curated-evidence-v4.md) + and [consolidated release evidence](docs/reports/knowledge-archives-release.md). +- Reference preprocessing must not clear Memory. Use the installation-scoped + `tht --installation /absolute/path/thothii-installation.yaml workspace preprocess run` + and its [contract](docs/contracts/workspace-preprocessing-cli.md). +- DWH sessions are read-only. SSH tunnels support database-management diagnostics + and metadata synchronization, not NL→SQL session creation; use direct or REST + transport for sessions. + +## Installation and workspace boundaries + +Fresh standalone installations follow the manual terminal procedures in +[Italian](docs/install/standalone-manual-it.md) or +[English](docs/install/standalone-manual-en.md), without an installer or launcher. +The [Compose reference](docs/operations/compose-reference.md) is for maintainers, +not another quick start. Catalog and Memory migrations are explicit. + +Descriptors, authentication, provider credentials, certificates and runtime bindings +stay in protected installation-local paths. Do not copy secrets into examples or +workspace Git. Legacy runtime snapshots may use absolute paths and protected +`harness/.env`; do not silently relocate them. + +PSD authoring is separate at `/Users/mp/projects/tht-workspace-psd`. Its GitHub +repository was copied to private Gitea +[workspace_psd](https://git.tylconsulting.it/mptyl/workspace_psd), preserving both +branches. It is a copy, not automatic synchronization. Running installations were +not repointed to a different workspace remote. + +## Recorded deployments and server authority + +Use the ordered [server handoff](docs/operations/server-codex-handoff.md) for +coordinated ThothII/Omics upgrades. Omics integration uses GitHub +`Dallavilla-Tiziano/omics_portal`, with no Gitea relay prerequisite. Omics uses +embedded/upstream identity, not another ThothII OIDC login. Read +[upstream authentication](docs/install/authentication-upstream.md) before changes. + +Last recorded application deliveries (not a fresh runtime attestation): + +- [Session dialogs](docs/reports/2026-09-14-session-dialogs-release.md): + `b1723c34-session-dialogs-20260914`, frontend-only. +- [Session layout/Memory fix](docs/reports/2026-09-14-session-layout-memory-fix.md): + `49333a2d-session-memory-fix`, core/frontend. + +Keep those reports and rollback instructions while operator gates remain open. +A later deployment does not prove every earlier acceptance item passed. + +## Remaining acceptance and design gates + +- Fresh-machine Mac, Windows/WSL2 and Linux installation acceptance, including real + DWH/model endpoints, remains a separate operator exercise. +- Real IdP/portal login, logout, embedded interaction and PSD semantic acceptance + follow the [manual matrix](docs/testing/authentication-manual-acceptance.md) and + delivery reports; synthetic tests do not close them. +- [Security hardening](docs/plans/2026-09-08-security-hardening-prd.md) is a draft. + Revalidate SEC01–12 and obtain design approval before implementation or real + server/IdP/DWH mutation. +- Optional NER remains opt-in; labeled Italian quality, benchmark and licensing + acceptance are not implied by document cleanup. +- Semantic aliases, value descriptions, synonyms/concepts, dialect and multi-schema + extensions remain explicit design work. Current sensitivity delivery follows the + Catalog contract; additional policies require their own acceptance. +- Legacy database UI fallback (`?db-ui=legacy`, dev/staging) and prototype removal + remain subject to owner acceptance. + +## Documentation maintenance + +MkDocs publishes only 20 product/operator pages and five approved assets. +Architecture, contracts, ADRs, plans, research, tests and release evidence are +excluded from HTML and search. The repository itself is public: editorial exclusion +is not confidentiality. + +The [cleanup record](docs/maintenance/2026-09-15-documentation-cleanup.md) records +retired sources and retained gates. Main contains source; Actions generates the +`pages` branch. The live site requires the separate explicit deployment described +in [public manual publication](docs/operations/public-docs-publication.md). diff --git a/README.md b/README.md index 2763763a..ac3739c4 100644 --- a/README.md +++ b/README.md @@ -30,71 +30,25 @@ installation, use and administration. Developer architecture, contracts, ADRs, t plans and release records remain in this repository but are excluded from MkDocs pages and search. This is an editorial boundary, not an access restriction on the public repository. See the [documentation cleanup review](docs/maintenance/2026-09-15-documentation-cleanup.md) -for the proposed consolidation; no historical source documents have been deleted. +for the executed consolidation and the inventory of historical sources retained in Git. -## Docker Compose: local startup +## Docker Compose and installation -Requirements: Docker Engine with Compose v2. The mandatory stack is `frontend`, `core`, -`catalog-db`, `qdrant`, `embedding`, and the one-shot `embedding-model-init`. DWH and LLM remain external, -configurable endpoints—even when they are co-located with ThothII. +For a fresh installation, follow the complete manual procedure in +[Italian](docs/install/standalone-manual-it.md) or +[English](docs/install/standalone-manual-en.md). Configure protected files first; +then run the documented build, explicit migrations and startup commands with the +same installation descriptor and Compose project. There is no installer or launcher. -From a fresh clone, run these commands from the repository root: +The mandatory stack includes frontend, core, PostgreSQL catalog, Qdrant, Ollama +and the embedding initializer. DWH and LLM endpoints remain external dependencies. +Pi is included in the core image. Credentials and certificates belong in protected +installation-local files, never in the workspace repository. -```sh -cp deploy/env/local.env.example deploy/env/local.env -# Copy docs/install/examples/thothii-installation.local.yaml to a protected operator path, -# replace its placeholders, chmod it 600, and set that exact THT_INSTALLATION_CONFIG_SOURCE. -# Edit deploy/env/local.env, including PI_AUTH_FILE, THT_SECRETS_FILE, and external endpoints. -./scripts/run-stack.sh -``` - -The low-level stack script builds the core, starts `catalog-db`, runs the explicit one-shot Kysely migrations, -then runs the base+local stack in the foreground. Migrations never run implicitly in backend -startup. The core image contains its Pi runtime; no host `pi` executable is used. For a server -installation, build the image, start the catalog, and run the same migration service before the -application rollout: - -```sh -cp deploy/env/server.env.example deploy/env/server.env -# Prepare a mode-600 thothii-installation.yaml from the server example and set its exact -# path as THT_INSTALLATION_CONFIG_SOURCE. Edit all remaining storage/secret/endpoint paths. -sudo scripts/prepare-server-pi-state.sh /srv/thothii/pi-state 10001 10001 -docker compose --env-file deploy/env/server.env \ - -f compose.yaml -f deploy/compose.server.yaml \ - -f deploy/compose.session-server.yaml.example build core -docker compose --env-file deploy/env/server.env \ - -f compose.yaml -f deploy/compose.server.yaml \ - -f deploy/compose.session-server.yaml.example up -d catalog-db -docker compose --env-file deploy/env/server.env \ - -f compose.yaml -f deploy/compose.server.yaml \ - -f deploy/compose.session-server.yaml.example run --rm catalog-migrate -docker compose --env-file deploy/env/server.env \ - -f compose.yaml -f deploy/compose.server.yaml \ - -f deploy/compose.session-server.yaml.example up --build -d -``` - -The initializer is required for an empty or restored server Pi-state bind. It atomically creates -the three regular targets hidden below the writable parent bind; protected Pi auth and tracked -model/settings sources remain separate read-only mounts. See the server manual before substituting -a root other than `/srv/thothii/pi-state`. - -Workspace descriptors come from the Git remote configured by `THT_WORKSPACE_GIT_REMOTE`; their -runtime endpoint and secret bindings remain installation-local. Open - (set `THOTH_HTTP_PORT` in `deploy/env/local.env` to choose another -loopback port). - -Credentials and certificates are local protected files. Do not put them in environment examples, -workspace YAML, URLs, or Compose interpolation values. - -Application state is split across the named `settings`, `pi-state`, `workspace-registry`, -`sessions`, `qdrant-data`, and `embedding-models` volumes. `docker compose down` keeps them. -`qdrant-data` is a derived but persistent index store; `embedding-models` is an Ollama model -cache for `qwen3-embedding:0.6b` with fixed `1024`-dimension embeddings. Only an explicit destructive command such as `docker compose -down --volumes` removes them. - -The frontend depends on the core health check and proxies `/health` and `/api/*` to it. The -application health endpoint intentionally checks process readiness only; external dependency -diagnostics are exposed by `tht doctor` and do not prevent the UI from starting. +For developer topology, overlays and lifecycle details, see the internal +[Compose reference](docs/operations/compose-reference.md). Ordinary stop/down keeps +persistent data; removing volumes is destructive and is not an upgrade step. +Process health is distinct from external dependency checks performed by doctor. ## Git-backed workspace repository diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md index e3b0941b..29ad0575 100644 --- a/docs/architecture/overview.md +++ b/docs/architecture/overview.md @@ -81,20 +81,20 @@ The model proposes; a human reviewer decides at gates through widgets: The frontend renders these widget descriptors (registry in `src/widgets/`). It rebuilds the live transcript in memory from the SSE stream (`src/store/sessionStore.ts`); it is **not persisted**. -## Curated and immutable Evidence +## Evidence sources, local authority and search projections -The workspace repository is the publication boundary. The curator prepares `evidence/source/`, -reviews units in `evidence/curated/`, validates them, and merges them. With `evidence.schema_version: 2`, -the runtime materializes the full `evidence/` tree from the exact Git commit, but the renderer passes -only `curated/**/*.md` from the immutable revision root to preprocessing. Sources, manifests, and -evaluation data remain available for traceability. The runtime never modifies, stages, commits, or -publishes the authoring repository. +The workspace repository publishes revision-pinned workspace identities and Evidence sources. +An initialized editable Evidence archive is maintained locally through external editors and +explicit consolidation; normal preprocessing or source refresh must not overwrite its manual +corrections. File save, active search generation and a later human Git commit/push are separate +outcomes. See [the current Evidence contract](../contracts/curated-evidence-v4.md) and +[source/publication boundaries](../contracts/workspace-evidence-v3.md). -Before indexing, the curated corpus from the pinned revision is validated. Each workspace has two -physical Qdrant collections with different lifecycles. `reference` contains Schema, relationships, -and Evidence and may be replaced or cleared by preprocessing; `memory` contains `memory` and -`solved_question` records and is never preprocessing output. Only the `reference` collection has the -sparse `bm25` vector with `idf`, and only the Evidence stage writes sparse values. +Each workspace has separate Qdrant collections. `reference` contains Schema, relationships and +Evidence and may be replaced or cleared by preprocessing. Memory uses its own dense/BM25 +projection, rebuilt from authoritative PostgreSQL cards rather than old vector payloads or +session artifacts. Both collections can contain sparse vectors; their ownership and cleanup +lifecycles remain separate. See [Memory](../gestione-memory.md). The Administration control can clear the replaceable reference collection, LSH, corpus, and derived checkpoints. The operation preserves the memory collection and makes preprocessing required before @@ -115,6 +115,13 @@ the core can admit a new session. ## Runtime composition +PostgreSQL is the current database-metadata authority for all core consumers, not a deferred +catalog-to-core integration. The historical research on a separate catalog service and +`annotations.yaml` publication is superseded by ADRs 0004 and 0016. Preserve read-only DWH access, +installation-local bindings/secrets, revision-pinned workspace identity, and fail-closed readiness +when changing those boundaries. The exact snapshot interface is the +[Catalog Schema Snapshot contract](../contracts/catalog-schema-snapshot.md). + The local stack is started by `./scripts/run-stack.sh` after the installation descriptor and `deploy/env/local.env` exist. `core` includes Pi. `catalog-db`, Qdrant, and the Ollama embedding service are internal Compose services; only the DWH and model-provider endpoint remain external. diff --git a/docs/architecture/thothii-core-sequence.visual-check.1440x900.dark.png b/docs/architecture/thothii-core-sequence.visual-check.1440x900.dark.png deleted file mode 100644 index d0473b54d90a2a2f46d0d6ab504c04108171a8fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135458 zcmd42bySpH`!?(Y-AH$rw9?%jgNTZNfOL1~kkVb!-7)0QGr$ZCL(Mnd z&;5My-}k<2{nmQtk6|xh?Q8FSopGGUaqe&pHFq>!Z-G4t^7%q+k28U>}KuD{~}hI;om zn53pQ+oh0EGJ>Hsi7lnu1!`%1Zs(}E5le%lamIs!08ink$Sn*k^xS_x8^c$4{~2L) z_0x7e_;<`f_<-Qwp{w5$*MEnfN2EVv{yR3Nen|Q6aO3>h#=k?11^n3n1YN_QJS9+4QWJCE z>5Gv-<<1E~UYc&PhRIc!-i_ym_*lq0UgXZiT2ms2ZI->WB zcMXG`H|xc3-xlJ%f?Zzv@8q^t2`|AoJ7g(_+Jt6Wy;XA>l~Er6=d%X$UjhT$XxdO} z*6ZfD;#d3S{zVBxmg-_>A5F5!@xGIq`bSa}Nx665rh2LRotd8_B<{!m?yc)FZP!$h zs4M6M+HvEMxM5)fyrO5$@k}6RIIJN?}$1PkP!qZKmr@EsC{^st#+IeN)yaJ?r{aq#uqH_Fx45UlBGo*RN!`T<{}sVvlKK#G`q<8K)} zDYPakn26(&y;`c&nN{9ses%99-p*GrGtqWltq-~_@cZZW8~^$xX>_*u2GMr5T(??1 zWm{3A(b~*xC&1p^@81Y&3;PWJZd;1eWx zT}zK1K4`p1O4jH4do-UNLNVl5+>XW~n?gv<05>xeot(_fRQ#S@0%jdF)YRnUl5_KT$VFvZ1qCd`rGv+_;`7E?lo{ePKzN*}=$O2cW2GuULS0I!x3{UDJ3I4dn`xwEWf^$j?RtBAJL~B9 zqB`1ANCS@V9%|V_6LV_FKtK${#8IoNszNm2 zQtAXG#Rr=#cb#CYlaHYC1Cr5*cSS?jF>D<0I*vNpr-u@bKBs;PeeEOu4+1tss zeMV2y!-9uA%1d>0`^;8pS&*l$7I7j`p=ILy@O|eOewHJnsDY_*5lYe*FJvT)OEruY zRPx4J^Q24`5~xH5E+I?oZ+O!AO|E76vssAGqupwbr}>`|6Th#!IERY{fmhM5;KW-* z3)QjxdYS*X6UZq@#LE5RgjP|JnQw4quGoigc`+g)l8{nV>9Lwg{2Z*e@~xbLg4afP z1o1L!C6VjOrxU+I3yIHzz)dbbFrd*Ik>BzT|w&E;dUbYzvfVc7+Q*Zf8(s54`Y`_I~Nmw2^bzp@a8w z{>-KG=BY`X71(GJpRc(1denxdQx{h2t)#RZ)wtT|vCxqgugPX{05sET&kRr|`CQ8L z5@>u+r2E+*%K7deVWCh&CfI9NhBoI>}q4HI&07We=76d;XT|#;- z$HSpr5Yw|KroIpqq;*dZ0;Wx5n^PhKZ1hu4CD_}-ebvkTxi6hp7$}jTg z9Qaqg_j-}Y$D_B$aZPstqc922s}G$a+m$n;8RBP=6YGT`zz(F}&|1uNSB8PM_}$_v z37v@_2OFFJc7qLbN0;jD3}^6q5OmvE_UwB{5JdbE1NN542_P-4R?z{%*Sw z*y?lS$ew@j;#wKlb~DB3b?K}jQO1M1A4xt-Qh1iTEbip!)z6R>d|87H?F>E23N?TX zEw@4^S06XdlN38h5e>v#pV#?Fv)yI6+N!pnF9*PT9r%f=>CdNbpzWFG*#XKTV2Bv@ zOSYDLYr0asPOtc8eca)7lh(_i%ORusP*)mFg`@B3&`Ppg4@;1p9#;M*^s6096-x|I zJ|kTg0|h~O(ub<9dqKg7L`5Rt;;k)3d2`~l_x=fuzQ@B%Qwj5{4gUx*Q;lz=w|Ajv^iWSll=M_4n23O4nsamwwbHz^no@*e2t`sEd_FN_1A>zmOH;c z^6K$pGtr*h0FFpbhVmX@{B(4YKeU9_2y=7 zcF;M0D;7Gm9W8KV@_BIUOV8Ny!u44a*FAf`SOo**mFrVYUvFqfjT;uy2Hn65SoF3Z zW}5|_brxs&=2&}%>LN7HPpWekvFg75>bSYaod1xywaxVPQ@OYb)w_hb`%Z@XQtKR;(hy+ijZ87A3?2BeE_xFVMR6cPQ^A8AU zM|J9F`5n^EyK<*Gjt!etPT^ZG#n}b9dHg=xya9?KM&B5FhNge+c^8Uxxz^$Lmek)t ze1Scs!F(x(FP~y`8Uk+jG5d|&Op+0|uiW8L4s_c8^}y>bH&<7-xzYSSR<4Q5MTA*J zx`Q+#6I^Y(N$KDjYOoyFb};~(DT)RPsY(Yog?b9FAwYq)=#V5+F}3g>17n%7Fw72 z0O)8aE{K>EFl$%mvnk^eJzw<5jTP(34-mf?Egy9cx>^BpEDX7{BU@ZYPF^G?CT0Wf z*A}08WCfq8mdP#8LdbWzZ=eN2lU?&pt#UExCtwmWx8W~AH-s}O=&-cz+kVoEdwp?2 zLQZ~rnm?hI)^a+SjoOf#mUXG>eo_bj{l2pYY}Kycv+Vd44w<_fINIYGk%bz$1aoo! z7P!m1p!m(D{P;Mt(e&fOXZM?lPW@b5%{RW>hcp?bgh13694v(f!^|Ctvi1p}ds*BX@Zn61B1JtD^0P+uZ zb{3EFJ3|g`Z<&9Y?P1raBxQ}oMlT8f-iOq%7eTRsQg}gxC#dOAyN$hopWjDLh zhEpJqXJS4ux}Jt{-fh!3hu&VzxHP@f`7*ca4?<=;g-MD9coybu++%0wIrT2b;GN9Q z=b`ab)$rH|BNv1pi!vN1>9}=Il_;4<-Rl7x^NW^8bX8p0p^4sd%)E;Ia`v zzb8*Qeq%{JFS6;We&+iIdoqWn!7Sh0;7(KHRy^T@;^Zk?<3<1sniPNbtnTsU9E~ zuV~4A^i8L!g-n&2v_4j=L`yW$0&E5hI3r@pBf{M*D%*Vu_5bGuf z1i;@-d%fD1V-nIblaP(GT?8&iq%;?Yo?}z{r;YFquT+^3Q3G6`;>Wz=FUh@ggG1IrDXuOMRu?Xg z^RIE8SUOQP83z8oxt44x0-;iby zD_HEaMNH_@;ra~ur6l@HN7dX(N6+3qj3YA!y5{6DSQ5pbO*n>+T%~Vv6#ebvbB8Fa zUvczw<*CDE7c@+3vM6@Q$l(|ovcvqYQo!`tOC*PUp&;C1zS7_t9#3eT85*Fo*D3%-v4;K7U}_*DigJPQ#l>kv2DNt%JkJG?Q>@ z3Y=lr*D*tRZ*T_mO6e&wCKauJrvd*(vGjum@|p$5`*_tMC}8fdXFJL;dX6ipesUr= zX^v3a*Fy20(EcZTXz&lvdzPZ)5-&5Nq8+Whb05p6$EBu<*&X&QE|&Ot6h)DV1^(H% ze;D$aqpAbmLlkgHy~8q;m6f&H=eY@Q`Bvxmk{IV{rzhvx^NBW7nTW_K4EAZE!un+_8Zck%=LZJZQ`A6t!_roS`m<~wyP16bfEbj!b;af@L7P7Y1+}=iZlbQeE``fhm0qc( zdvj}}x^GJom?>J6&6}mq-Kf*d|IU!38LfQVqlGKY+P7Q z>~za41KjTt0z2)Bt*`C`Xxyiw(6qwM8Y;;D9rHJeV90D%*ZW{Be8d`Irx+?PbMIb9 z*X{%CXx>9c(a!GVjK9)uIfVh_gMpDF_KTUs>h0SKs!1K)<^cb>3%i@4F!1+4=NDi{ z_<32mAAfDl{a6LZ6W99s;mY*cR-ajt?UKdXaE6cgK6iP|tJ@UG>}IfD^<-)K;)#rH ztO`QPvC+{jEGDL3si`ItqPofCGG0HTey?BB5EFNKWgBP%B)yE;bG28~8c=S%;^OP8 zq5ODQ(web;du*Kgn()5f-c0MbWPMk5G5>iqm!-#cQzIQ_YYq8eDYhV6h+nERe6gls zV4z4ei?>zZWx-I1B%&aaW$jr8%1B8CUOYnL6A{1CKr!qH9u3UDbbUg>XGRa6J6 z(Vsk@&z3G1XAq8~7;oZb#pavonAu6Y4a3BEugx_?GJJbnBxKp>uA7+nfcDeqDp2x- zsLea!zp zxQRZL;V^bZmQHLBMirFM)vW@w>dK$X^A4iJGx>EdE-so!+t|RU5+TIEuqB|YSr${u2 zCRc+-r@cTFE@5yF?Uy{~= zE`~T-i^y8}WpotIHcRlu2W=v?E+wU3_wBI%zY! zn4A)n%HvShkY}W&b=_|RT~s**8_`U8-B(mlUeC_Vgyuy;`#q$kLsO9tQs1WkKK>XbyD$`Rxvzvda)0ZL z$O>I;xEmfWYsPinW$=Zh%2!PMeimNlgIr80!AI%&XlrSF@Lk(_OTam~`ua=RHBXT` zakvbcDYMp0EOmRyU}PtiG-$76t={0bz($=Tveu;5f| zb-OMAy8j_G+5(;YE)%dcErCMkMjN&4zRJOK_qq9#R>v1Ye$$KF^1tuf9aS5vp2jmo zgT>dH{6rj@&>=5PS~^(J%1}v(yq~NTE*RjB_{&9}-4Id&4ibF~q$htP4hH80R4yP( zQ4}c>E^-T1Pe-StkHJRJJvpr@A5eRvTkrGD+|@4J39*5G9Q91$m7L0l7&&tejR>w~ z(SoSOG!r}cJf=7ZG-+RawUQAVM8W;!#&EpeS=M0;E%;_B4UG)Lo9HXh; z?eC@D!fwMo!TKngQ07(T>yU6=3Hz9*=-3^y)k^*#*7(!{ZU4X;n!ed}zU>r4Qr}%R>{7q}jn4 zrt>i+_V6i2P&HPZ(%bn@EgHrFUuc32hu8j`9v(s4@4&dDTHk&T$dphgCYyCVev&qq zk3#e;PW4JleJRj7$op1Txn0VC)g`TNRK6PZzS996fZTD98iI7A?vq-*6<>)BUnVh? z;Ty{HZ}G>kB#Tm#lh6L85?}4>!txi^uQs~6-&BO4-3N*d>C8_qG_}v%8`eE)^-=!u zqlvCd@ZLgpyEVfxkO=>sT-0v<(sAqC#Ip|Nf>iZmBxhF>O zJ*upD8c#aevAwrP@od8f)!w*p3me?P8qvCMq(-Dqf9(h zWGwf&#O;BN8EUt9!uB&xRX9A? ze8<&#s{iOfq~DBmmI=xv@TkSDF4FLqmgXj^3rYsF+OeT+N3p1Yt^PD^YH|0#t9>$^ zfYFIgV_=aos8@ch`ZA}ROu|lFmbXG6r~*{IyN;bz&p!@4sPqvpdV(t}TwzfXt@;L= zAXUbV=t!ZAZoOtF7R@JSa?BaF=H(oUMWyn?uFJ|;<{j@5_j@t-AQ)c&=tF~l@3CKF z^-E1-3;HjD6Oo8LKawRI*}{&se(7vpT+(`+RQMr}hqNLO2&ZXgjjd;;IyFCu|} zf|G3b{7ZQK8d8nB}?tdi2FV*j9Oci(_~Mm?-LhSRj4SB)XyW0@G9jCrQF^z7v66? ztUPOKN~x&GSQb&v7qSA`m4L4{F)$|I&*7s>TWY}lmD{{{pVyJM<-%`eXp^vA!02B< zWv%MQs5t0fcV^rQGCtXz(A{{M_&b~>j6j@i214RO;kkCPUlTvycp>5am4%0ou?kxk zT8XBtU$x+6#l=+%cmucGmk>)G>@nOQiEmpHh1Lub`=c9rBqBZ!Q=pSE^H{!#?FXH8Ntc>E)4p z*UrLNe8Iox`D;e&MDJbwng}mWxzw&oe>~%K3+llunoxVRGaj5}M{tA2+L&ljc7PAMY z#d|tsRZvrV9?^-KbXx!Dvt>8KC~^5GXnoz(&WYJSTHH^hxQ2E-mUUWvy_)z!^y_+In6HXPN#`5NI|ZHvAu)# z!HxPrYKgn6$8~TG0K|C9COf#jSu>`*Jl^7YBofy;ARqv6c_1*3{x)NALl9}w79AGx&1GZAya)*d@BWq66ZKq1Zpda#7nbUr z@ANYiaEunvZaNX-Cau=Jp@eG}14o={sltepMu|Lf=xDaL~>Ev;*clryLr9=@Uy z?t6s&crmc_TQ8+i<4NFl6ryRfwibNSx;8Okb5$Kup)2(nliU#<&Hhn9mpOtZI$b*N z1X)<(zT^AnZ=3Cuc@HTvqX|oh(r!6WoblO{{X>6OjSXo+5RdEoPIRS*I_(9D_?+Yp ziC=A0;*!1)@j869Kzj+bVwFIxUY71bJ5kmK21t*I_8v+b`!xT;z{|GbsH3P-=6Uj} zcW;{`oU}&M%(Pg$Vt+lG*ggZ?BYi6MZn|%>@yUdLt%Jd76#B#@OZ*>m@%)Z!ZscRg zB^xHuSmypBxe)OOr|!R8!0Ocvq}5~VYt6cNR;xFa@7;wD8n+#iBcYumGD#!o0uMI4 z9)#Tl#D0v`aeK~V(lS6J=DszU4FI(V&^YK7F_d@0sy>lB2O8S9C>36Bgicf$2{y{d zR1t4fx7vmGqb(>XaOVeYz2@E3wo4~xB_JVpO{L>(;OHesM)@yA0ms$zWe4aq|7xLf z4_d>xN0Nfp8g{^aeLFtucPTI5SsnIaL(R6({PMFW0?x*gW`TzX$q1;(A4)tAUK9Q@ z)>*Uz@C~kdEwJ~7;Wuv%ysbCT!cb$-7loe^nY5+__cLY#ybvahW^E}ln#~@29Fu*L zk|CU(S2}xDPfMBYT-xt8H+$vncEV`d{Aka%3LTBlmTW-Z!@>ZF6Gkn%c<0*Nb%}f9 z`+ibTogQXP_~XBpY#UHjx&`kF_0b%={k;O2If9c{7HPsh_V>TlD*f6zvJoo}jb|nH z0o}Q3xu1JXh>d$0LQhVFf|hqc!8bSQF2OC(b&)L*Z?51It>8=TVl_%(->zgcz##d= z?4Q7APg2rb&$L$XStHy|SH(uNO%>^%O_@RL;7dY6!S~IpIzIhg;~8XcF)D1)0t!q@v}PYN zby@QYpPzQ$-(4%vn^#fzwx-X=y={aaPo1m>P~V;QPGkeFr>NIjYK6J|Ho5?4Rb)cM zr4!W^s!l-0yL!eNPqsquIJTfl7;VX5Cn>2$wQ8=rx&msI6 z25f3>Mca=a4SO6N;9&`C>lfqs_fcze>=$+qNc6BrnlmuG$*RlZO$ zWAC*JUHk2%Z=#5Uce>K#w!6`N*W4%_Mv&9U8^;$Xof`V`KOHNs24Rc)WHXE)|D*Qe z@r*fJUbK`i;lA^#m0w-#E>5jHAIDPi)6|wMtTf3N9skKYEf%tX@@e9vky zR!LGU)Hy+Q4pLw3)VXkTa~q8Cyprjr^_F=4{j1>gimg}@yAcurVl9~lT>YsLfi(GD z{h&pMdxyp$)p=kamcG=Qt8&PuIshFUHt4xl5PVop?Vl767!r0+%uqc>!^4z-ax zTaTyCIq~K8%d#>j6Pt>v;@$psBc%C8GgssEY!C`rYt5G9-V+MCG)7Q|9$qI%IhwSZ z>^lE21KbD*vUv13BPZvxJau#SdQqXxWVsKNS~&9(6f7{S zi@nE(qGBa3^}E`z~doNEkP{BG0@*K`0M7YyNL` zrho(H>nOUK5~GE2LeZp*h+4P4AGF!Q_iM`y z6nI#@83r?UIrsEa<7yNugEXB%h_#r>fy<#mRGp)vY=zK&`-_rgWxggSCb}WS11~OO z)WwmfZGH>O^5D?}?U!sRyPJ^i?ez3tMk}NVNeS+l+QsAf!V&_aLD!c4cD&1l$+rCn0@YO}sf|;w2&q|xso;*!ZT0(-oPr+KD z!rK?a({bjo6E4H3%e`y>kX6jTeKQN~O2>7mpz{NfhaJCIG7un?V3cLmag0QAIV;O} zmYBLGp2JG&a(a?hZqw#95(Xas2=Gjs{DuyX4&x9K-kgP*IYe_Z^Z86`8tSnmk34=D zqC;17QoQIcqN`XV1R_=v60owf^Ws-ab@wCmdgi20ynJ;FLx|tOO`I)Sp&cj(NEBL* z`5PZGx~z2aXAa7sq*n*UpuoUDapaZBH?3~+KN4N)m3rDiE4{sUHG|Z?$iznZ=q&Dl zaq|&w4$i2XY*S#PUUm|y&i}ZHjD&>5b1FsX+xw3I#|Sa-S%b6YCS)si$PzBV!m@=v z<~`U^h0T=JW%~_5^edro_cweO?!`~h$@Ad!c|3TueQIT7`*Ovl%BCPw=K!u#lgvE& zG-po0RwH;A*1}LUyY98nD<6}!Xc6wrd;PLNue%mm@uBAX?^GU}2{S*NUnfO{bNe0l z*Yd;a{`eH)XXU_h3ai<1OLS+>Y1gNt1jIV*iNiC~%zUFmH@P_ml~+W>#3@NhZiAVP zvy_~PiU&Yr1|CD>WdPfoU2ta_OXgUGJtQ}J#tu>CdZLp#(kv$Cks(1(nK}v5P79Jh-pkS}pAvCK+y@anI#4F|oBH^;eJioI7^2M8+tL z>f{Ap{oBN-q3!H^AEE0&6S!{*adLATTJsU(4H(By7jXLPgrE^U6EA|!`|~kYplEzX z+}UhA=j6)q@$uh?(2g*@ap{$y%S{pb{?hYu70H+#m?9K<4K0j&p6@Uq$kakhEnapG zENoyzcYFn-kq;U*)qU!fc>45AT>_SOk&n7xsSO%jpAf$Tom+K^-kz@Ug7afK(5m$G zIMvbKXqNY8kF0ZTXjn8;Vg!4-K6Is(nO^X!6$+?uu#BNLNxr+|X)n+k(pDFf!i;A~ zvyf94ztb9QN{K?<@z`Ac6ae{7#F`2jJ#}%3nXLYp+XdKrN*BTTAoZQ(6Z-)KI%~lN)W6ANXLf*5e#-dxp5XAq0LngO&qD z-@FKK3ilFT>nukduN5z#b^5L-zpWusW{&1hcjrrWMR%a>i3OD9ew_^`n@P*@)F9-> z2FV%E5M@*OG=`Jl<3EvUvdGxE9OQ9&3S(5O{{G`9o>{y7K}4d1S>PFdWueC;nxtG0 z2E8a%;Rf7}vZz{A^+oj4g?8I=@j|Jt+)P?1m)h4L^7v!eXZvpFOCG7MVNCQo*|E-S zoRzm0rQSzH{vBJ8A|_U#t0kB?tE6mtmYSIuN4G4ZJh}pRZjLJBoSg5II0CYEH%Qa5 zzZQ_PcA~_PNGaNMa!mmh4BQuVz~N3!a9;<%6Y%CSU?P6<^`Yt5rlMT4dGec<#x0{wvE$@UHbCgTePxT0Uqf2W2vHj_}P|1Bu z;(zvD^(!vU8_^!qadC}H#2BrpqC$ZGRO=6kGRpXJPG5qbqoteej+`qwZ>>JW6ih9^ z#MFD&PL7>VQ7~-Uu*9vk{pU|hy^3ePT`Jpy&(dL|n{nv6zGmCnb-U5g^aKhWNi(#v z(mjdw=2^NuHS~x{X<(hhKW0zRw`t5*vlMWhDa)gX3jH_IEiQLBE$o!SZV*r^N=i%K zS9(B$>}36}Wm=A^Pp&6>KkKdcCd}H9;MS(i+b`xvS4J+a6AObg!uSrdhX6e#F_7yz zk)?yM-{ELNDU5|>wjxUEbN<}(2pOpw8M?%XKJ!=^wr3xy{?_%MLsjNT`?XgrMVA)8=xC&61PKx@NtO74h3;RX&Kw_*r$J9iz@CIsoIT;% z!gtYn4<8WhdBEUWzD>y_BxG>^|8!leVm1sVO@YssoIekE&OwbW7(VvJANV=@z(T2lbRYSG zvhzQC@hI2QS135iE2588EN3|^^=(W>%b7Z7Rb?6r7j^-E_R9MODRBUkV5JL5Z7P8V z9leA`*jOTeof64IN{$`@rlyLfAAb!2gO{geaeS{aat0u7_Mx<@Zfgy2p4*J>8t^xC zMQfxTm)?{KQ5W?ZB^rr;X8-`cmHp&<<}Bs$5dHF1bqn82sKm0adA4AId}hCXm3m${ zv(wfQIQEolUzMTw?fciy(tgV25BC_s)ss#vnKdzR9@(e~(cpC+3h6HG5k z9W(!B-H%Xc>s{7+CbTV$`pM9}8>UN;Ws1~znak#0TKh)_hSJ%DU*i5^PDsRefu2b1 zj~cMO)YsMf(f0xt;4v0If^FJ5{Ff;ET?S#F1uW$0AGprOMdeNBeIcJQJL{kBdDz+Y ztXV5pPq+F~ezT~6yK^){!gySeTyg8H{{fz%o`$847B-W`f4Kln=jb=u5%e!I<$5#Z z>5F)tQhBTkwQJDx?|U)WFuX_mXNh5V#@BI%gFT8&Up3AgrN3Q!lK*alj`R|Y<#r;-Hnt%pD~b)+XVT2p)>#*iRO%cvohqumfm0=0kIpx{!yjV zRJ^|*Qdp6!G>@DGwW=lqDNpT#V{z`C@32e-=col12+(mC)Y@ygN5-!o!f(hPrADAK zE+YN67XR%1!-l)iRFIUIdVIMg=k&)cY_Ce#AblbXEQicU^4%&3-Lw}5kGf3 zgAbL@<1pXG`X0)-TDGnjhrW69LOsjYn2YQ|bP@xx@+hG$y1fxy;lC60$o_^DTJl7i z6lv7*%M`grD(=T+CrV139_st8IHS$@FmQZ)R!^5Mn?kk9HS%QjEhC?-uAx?bc$n&U zQ-G1CXn)g<%6GYp!{| z6pz(@HawQ7KVh6&_$XR!zidu}pPVl-Q8zImN=<}LKqy4xb>fsYL;jip{foDm;s)jA z`B;wxCx>j6iNfFNCfffKkS2RZ*GSW*IWn~U{grl=2st@RMZZevkIwCTwXpD&Y9uEc zRDBgF!J73(``FUZ9+srIk;cdRvb;PgT~j?%J-q~%gNA1Co_FIK>orqhHMn1UaIHOX z2SN?WGJQasOYCCh^!VF2E9)p(0S7xfD|5w#UoW)|`g(vekz!w2t=4~5(RM60*v+k` zt0e_g&Zl&GL04VR;9>6L9;ocV9pB8il;}l$!}oe+P-_vecpA82U>Hx9c_sP={a5Lc z1_lo`@r86c4+rjcZKHUhhzZ2`#h9XUtGnZNHmi}Iu>vR71v;-3y2V_heFgnd`(#Ae zFyEBnjfmQ2v-2sKKiO}q3Y>5Y3AD9t6COMx&)QT?n}{MLtQXA>F9YbO|ImlZFA`I< z^*rDBX9C;u!;&{kG(i_Fk7CYL#>*`Xlbl7$#_gOy{F36QRs513+a?4&_3$rLH#y;r zjV;OhEFlEze1XHuK|k}~IgtHFSozFf0TE^_en3*9r(M3ox3$eMgiSqxOr8Al)YVX2 zz`VIKEasb_AkdP&G^MzK4osC!E(hKHf{Nbk^MO_MS)d{T%c#Cx0aMJbOYQ_2;PKBdJ`? z*IZ=(akYM7J$cM%MiG0uh zrb9fde||7UvUwV^htA_Xh}Ij+Svc|(2Fr+MnU;HjOTWG)`Z+EV&ow1E`$Z_c%QjEu z)lW5%U$~FJAZISYGnF0{-~tchCd~I?{A74Q9+J4HFT;pYLj0XLS1J6;vuTr^xa%_^Qrb>8h**&PUWL`%--B2`y zyjnK5(#(AN?1>6PJo<*4!^3<-BQK6HArg=(OZfTj)3n_!eEpYX8Tzl%k~yEfBL6`A zYPgJ-6qceb1eok(VTpu~b40?Ehw~h!$O*3VxLjg^aeNv_oRQ>Xmb?ekk#Jd((b67F zks*4>g~~>rm1h0{{_LJ-;{tz?!4OC~H zbmhayxdHE_hoO(%4^qs4vbb|x)S_AKwV;Ed`KOKc{MGMX!~$)<=haHoZNP!Gh36lH z9V7+!7bXm_gX}VbH|{K~GQS{S%sxDxOx8_;w)}#1%jGNe8fwH4+p}O!kayywOhDN9_iuB1hFe}N}%i`pTH0ass zHgC?v(0rzl)##A5Yk2qssq7%mHqj$z=j+vsIGcNQA27Yc^AN%)Sn66j7K=76>x31> zaQQ3a9-?zAw~$&}i4GYZH|{sv2UgcT)}7UFh{IE*Ucup(h>#k%UXZwa5bc7_?kMX} zCB7MLtk08Q{Z})tL)Y;JE+~gG`{APi&+cCw6!RU{Oaw530Iww8BT`k0bf>+WGBFj3J#1IrVBN-u|Ez^MO3Uy z62{~|aB?O~v}kGL#?ljIh&qq=dh(2=FhPQBf~{QCVy~d2s&?OyjU2VQ-w|o|T0laK z4_49g;%JvU_dW58Sz2B$IrigiGM zQVE~$l2ip23`|v>sf_WvAVE;d(sA;8Oq%o!o_3pqtVqAklc~K%+q&nZJ@HT48GT@> z)4dvoew!_vslWYJhP4Xmj^n?bf8FTe8^lSX;nx$avveMNl;z&p9Mmr7#j+Bga=(~e zaj;mabGk-f)5)><)URGE0wva+L$LLc6Lo~$bn)ZQowa=z;8>cDLV(@UqLyx8A&g06KUn4mL)Ni)# zzz8A**>C|s{s`M|Wc?5(<$}7en`QPl#&O6}+tI|9Rt4#ejMPwL&cje6{BaX%zWszaZ!<64tG-Fwdf9g;YDDb&W5(G`1WY zLJUY|ZHw5nHHO$vF=X;Y?&^)}6lznc%_Zw!tDTgNG0z#>)~?g|Cf$El(Wj1+GEL!# zx>N>O8}!HWVtMf-=qH{i5hGcGY%Vxf0PB+_rdUlBP@un|xzN6Z0`}d6#QhWOyXz@Q z)W&^~=OlEhoX}^o^HATGB!%3|oB_`@#@D0jT19V}wLD{eOop{sk(p`DtJ}l#OP-DI zP?-gP_A+}Ud8G$@@@PP!-2xQBm)==E{jq&^$d-n4iqJ|;^%43-SB+4x-6xB7)7EXeu-Jk(zy zsZqO`a46FP$^*0a^?h2W?iB{#)#@jk40k;c0zqd4Wy3&XUuJPx%v4fyO?FZ(H z^Tp|8f?XPU<4EgPQQ8mdJQ;k&%%RDayG4%67ucBCmOJ#2)lPSvY+0??FAruPpxYw6 z-?^PxSy_>hu`f5KDzmb%{TUyQh;mquE}{>*wo|7ONPJy#%rsU-1=pW07jRG;rhZ-~ z&5TE>_nR~Io+UuG+WJit;fp`?RsmCe^$&(G85HRPzpjt@5|mX}z-xoXR(y-u-`T;- zEbNBG$C~Q6DB%=URs`3>9h!+Yb$Eq|c$C^56O>bWaQk%(`N1C@dmO^cn7F^RNy(*e zvj58kjOu^h>bZIMSs2|0GseNs!NIvOG(q4gB(!Aku7>JE-DY!hxQOR0BO{OP6O(gU z&54eRr9bQ>F=f0mndI-|Gt`53#nNlWi}sxiI7>fp;^!#xfvy;!YZXUtje*lSJ@c=1 zOCQs@6bi0}@ll{xnA=Qv9Vk%B#{WJvR2g&Xe!2oXSuGZ9Ez2NwT(?<(YK;zMb? z90GJEtb<*^fEu~^eczcmIg=F%l>~g|MISwogfD#18qJ~o*)Q9(@oe6)?*TPj->l4f z@>xr*l3O*l1ApFo*eHH~lSs=0_*-yOXp>NOvGS3u+1F6zUSmVftcsTY{`TJpr8MNoO^tQCMd7rm-Q-5lN1 zi;I&rphV1BQ)7R>?9Jt|^#(CotF&l)%{6IVPs@qULcBA%E6T+$P77njbxC1KxV%x&WRG*s_B@y;imBfLWUvI*_E@e--zXO)i$t}B04SbW@V z&Pc=Dka-y5ssOUfm8>z3?Gvsw*7bzLqx%xJ@h}d*W5|~?5J#vC6a@!<-$o;Gi_zIz zMJ{qxW3!`Qd5ThkXAGFR~obuFM#L|C#N9t*OB36KnaVJ z^j*pDvAOKGnUk{;A$xz+hE1Q7xl|^~Ad#H=*>^}i6H_wGfh$j^@}+rP1XsTQ)i}gy zngRw`I+|x3u2i=Khf%1G-7XsHcNaUggwNxeb?q5sZGWQD_GseIQh0x(&_DDu4y85| z-Ajb)-s!Znt+_%SqOthnqGvlbhDz04>2qj@2{`nAZaz|jo>!tLKcqZ2D^y&5U1-ro z4fGQsFlonlBKUZOP@i%zh{(Eu@Va3nPp*6~2Lv2!Dmmq_;XLMK8PhEt>65B4hES8t z`zdrD7zhm=vdGi?S=7_K7XV3up8Ff0I`sd={didIlED`?-}z{SD+Ts1iooHn3I)@j z-pFBveXUkraP=gwd~aJd1iKQ&^28}wnBjkq1ntE1Y>^!{z5dOFTQGF42vVW+c> zAV;AmOBcWqu{FLC{JlS8p)BZyB) zUFwvgAFML@ng*Lm{YjGCwN-F?W~xYG>;AmNvWI2h*>ybLsDX`b*@Zdx(-I}gu!6Mw z!_;*PU-_&LAAYZ_KDIk6nvrZIO!mRo&HnT8BeOkujj8X;DAQcQeX~SlPH@99AMl~@ zJKGH&rKs=M*2+`wfoCSVgVW8_PQ!%7{!vF2;^|TE+3S2J8?|5Z>4{+nsr#52CX6XO zFniw`(V9;BkaEnQ8w*{6qKh!g?u;<|c{!!`umW09I&LPxtDUoL&yu1>tyIw}3wguY zbrX>r0^9Yl#bz9B{0hZ6A&GD4;T%jdavqI&f2_w^1Lv7z)AlK6*FtyqYA!30mr6wC zF5?|D{`>AD73wVP=rng47h6*2rZPI4aa5=Vj_CecwHu~Yp9-dS`kC0W<;56SbipQ( zP{wHsWy~4Xn&qAI-vn!WIP*eV%KD{fzTJFILEkuuA_0G{;P}5Nd&{6UyY}t3Ed}mE zfxEcVmKK-d4n+#3xH}Xm?gR~z0tJef;!s?IQ>-|YBEg+t30feyBoH)t^ZaGrPkYba z`IO0IuE|_k*IK6>$M5WDx_jGzzT!*U_11QqUuJH4@I=BWkp;TP0K;v z0AcOl+?Js5AhWwQ)j;zC$k#-3X(m_i4nLE*D~W}W08YMfJ+96_;Zi>PQw!~|P6gzK zW%MsRd(GOH@-9&i2*ndRI)c2s&I<8%z%qfiSL&ISBk+=Bz1T6FPM}Lrlkp@s_U_<{P^ScIkn<+v%%8z5oCn`(`w~a|Y>HOH3~_VU3_eo?=?RZ0doI@{{c8?3V9Obl{S~`tcNOo_&%xg zG;U&nh-VNW80mv#m~v6jiD@GvErqeZ;$RbOO4+8UX8e4!{+_Jn&kh#T==TO!D+GRA zvxK_BV5v`Xv(KE655^16&2c5a?nzW0R6s#aEXkTF4l89hBjQEFyWZN6OM|FeXytna;I5rZW>D&HXVO?)vq?q4U-&n(GP$BB5qjBzi#;VlIeK?*@X~g z)#&9bpcY~z!@yr@B!wuX?1E!0|H}@;1Wr38HE_uUa~Qd@UPxdR27{8k9(G$-x7WC> zy!!XF!zbw(QBJEvh@*#RCLwrw&&MV?bCQNOVSZjHM&Fs)N~K4GJm%`YCC_%J+bCg| z@6~;qtA?h#ZC>*AUsiuOaO;jQ1hP#-DbV`8Lf38P06#3u&(!lVzAiL}>+r{MFm|I# zWUU)LkOa}pwO!z06RZx}y|Qz`*e=+gXId9WlLTM2iDkucn*yW}c{=X*MSGpI{ae=) zh|+P6N-$pH;@8s-8Y`M-jKPSx3jZFAX0h8~ho9mjJj+l-SVGErufJ-{u==?3XxwwhX2zq+&|z1k^=MKs-Hv`p_#?JrF zlR=mVL&6lH0;$)kdvtQx#u@vO%+sIDPjWGqEny-Rd$!8?U70?75?Rf_3q};hrtL|` zL79PzXf6Dw@7ta{F~02kS&vcw6B(cRz|gznI5n(gmn}MMnFSyJMh^Y=9(GEzb_YaV z?X@e5{`qQ+w=l^>fG?}S z9M)f*Gc}}45SI*vCNjShN-V15WFc>{ciiAbij4QlxQwK4duBRjgG{c}0VkG1E*`a{ zr>2E8qb9TUx{-gefk8m;KDLxSD0`m0+xt+Ro&AKh#GE&t%Re?uYuv|UnW8UWP5$`V z-=8^yqtB?<<(eg>Q&!bV=6j{wu;)#_|1kE6cYB=d!~z3>c1ax^x^~o}l9<=feRV8> zrxR#s%^#V(sQ|~`hngwr*)P*R)b(7aGkD+t9|`nAqOT=X%^-@Bh=!GFCkj~VhqTJg zn@FJrzT1h>*$5HXZGNzr{~7$N`yzPO34M~Rm49@7(;>=#Jr<@KWk#Zd7YPju?dxnqKkiRR<}AD@t&i^`E!S^ zj-`&*=noS!oDgB9xEJ5_{by{8M>jPUwX+cBsIEH~c>CRt7XDnnkzVT4zit8U&X+dW zz5Ff*(w>>+=`xy{yTF05j^kVZ6;h}VN7U8SxY#_SqM584vKh=M^aqX1xu} zo=7`rE{{7)L7=r~ii9xW?4xYg-X9ghjC9QVL(*W}jiREnN3#}Bm+Mwkn7(%)?UjFc z5%2m%LWoU+Rtk6H8>?+&)kdBI@x~3gk|}92-elO2&eh5l9y0TtemjGgjO0CgcaSKx z$mDUP`}MNdOEG#e7q`$ZcClT}j>~g;G<;9@W?iBZcV9#$*-OSdxMOX3RoL~ zXEiG-2?yh*QzcFjFJB(0nOW?u{kk4HinCm4Kilus_zWz-CluFE^}>;5?hw1XlUoKY z%~kqF>FJi+P3tXkMztm_62h-e*AopC3DFj9xNL?|#^&_2@IEf~Lwb#IMtbu0)=}W? zI5Ftf*3P+I!dxcs4+p;%Iv<3M){H=WClGwI*R(sFOrR88L9xpQcK5dhzE}DQ=u3>&1PNp5WB${|{-3ifr5AKwvkQ}`0 z4tBHgrWXr6Je6l9xF{VtvZ@j-vCHNkh5d3AB?$nwLLkcbzg&+Z|IWPyt*y{Z9?jQK z7(B`kx#G*VKRCXZ;xR%>LLd{F;@P#Kb=Mv%-F*_kv$kWSOu}TCHyq ze^KVk6qI=N=HuG5?WmaRU**+i$KEWZQCyaJ?KYp?ua6ulA_+P}Rlql;^0YLs_wuPO zJQn+IE==mZW~Pz z99WJG?;+C}_?*R3msup6Z#yFioSo7dHPY>l#K+II>;d+F4jqMJ{dfOd57W^x_#GB$ zA6SS$IL7g_Xi{MG`hNNS`qj6PM>9SrM&~Zm3MI0>HiYVn=PA` zbDbD5UkZcAQO|%wI(!QaJmF28+@kKXz-7kpGxS**39IlM$CK$|jn#(VG2Z9I%)!?p z^Z|dvr1IN0c5eGO8{BqT@_UASqTBpZf8XemaoFmb~)$ zT4=N1c6(eVuy)`4qhn5e2iFz0FbN9{_2mA^Ko;t8UvRp=|Wb zCr2m@))@}T3)QI5pL)0~nE+4zv5YHrJ!PH>x*qXubWo>^dq>GvD1g&izx$+wfSIK9 z++h4wmT{)3eLa)FsC$^L4Kj4iD3A}5?6JffnOQ1;fAn0~{ys6+{I;xJbYU4`?lSlL zA-ePQe3F7ukK})A0odvi8ALHnUIG!x22t0tLJ3Q+x*ahg6!=2 z&nx?+K$Y@C^zih(ChH7Xua=$SGbd%a#$I_Awj6yMe-#isPiYV2k=$t^7{ z8>lPjsz2G=*Fi;-UT4}ZB-AyriONQ&+YQ`M`hQ=Y`i1<9G&i~K9bm=-H1BJ@ZJ1QP*&;jQJFq!e|2dE=N{X= z!ci2`r7pnbknEnlP9HZ_r)wIP?#nT?6U+^SC`-S6f6_zAW_oyb*WFyWLl3gpvU+RI zmm%YGQqvcWlJkENQ_Ii$L(HxJF><>sX*HxCl+Vn)aOaP_0D!far9v=AWAg_3wBPv} zTmT0zk-7h{Pnv&CAOfLkb8HCJc{q5w1AE7?U8t)vrXbco;U{f&8wJC0-bmuQe5r(U zQBDz=m#?n6SE%2indRntMv^Ddgi^P?yP#=o(~fVJ-X{ls((CUq-6d+`U&Uc-{|c{ z!+(l9UuB-h5>>vr4FFDm%C)goc!byXOUV6$U4E@au(ZtH%Y8Ge(7rV9mWh18-Qo3f zxt_w1+mcV8LhtT`6nFTGO#7o)x=SOECA?8^a2|q^!nUic{HT12o|kM+_*2GZV%+Z8 z6)PcX1@L##0FO}~gV86c0%bq2%E#H3fNeojI~sVxgY+5&YU8OZI@T{>Bf2AY!t##K zsT}9^^3*CDV?x21h%OMe`}Q=M`N@-KFXRceer!Hs1cjXAB-s)Hn}5kXdd^n;*KjNf z|N3Ve!eYtq-#-)_trI@6sR?d|0;a&+6bvng!KbTciP3e&&XfzFo5A+3p+Bmhwin0ZQO8dfZs!18=e%hWJ9decYqrQ8xlcOuS1d={aiHR1$phSb<@>AP~cWXkV^bsv%_u-r%<$doX6Oyv5HLjT_6$!=5rPl;*wux1Il@1D+E#JTcVO{3;L1G&8a^D{@o_Pu2e9u)F zxRM^TT%g}72|AHp7SVDd*EI3dp=Cl}AatV{U2${Y3tsbPb;3;RY(ywec4wyEz$nnO zFROPYg{%I<)_@@j5>xNk$Xlt)zuiwEoBHg_Da4leVREExW0l=W{M8Vs zcTAOX^ke$xh4`G~;!#JO_*&HM4+p(OtCd#vN~T1M_WIV=LVng8=YQ~!BD=>v=}Ulp z^>+Hpkv=k>Y}oyxLGDZem;6xy zN58c-=$4j{$3a62qe4yxgJ+7-cg^lHU8N(ZVIU0fZ?hO#Zgr^U(e$iC8QcrK_#z?$ zbg465H){v-AoH&bt6upPvKPG*v_*(QXmaz}|84F3^Cx`MhA5yp>j5D?jbk4YeMTqZ z_}d@EJG(zdv&d=2@mAaOlnd>v2PHXK00W|pi6o|F6>Kr+akQw#4^Pas2SryX5X~E@ zZa)iUmEjKBh)9|^i2aMry3t+8+$m{a#@#`FCwmi$MSk*{BiO=QbIBz3<@J<8b=>&C*#V5zkorf_)LftWk?d~3lf z{?M=Yjd{K&Z$H%xwUT4Uz@wnXxyl`?Kw1*NX=KO8# z4~VQnf~!htYiJ+SS&Zt3&nJ&vr& zcXuDMV*PmwjWa6Q#fW7&OLrc+7Paxd%uUuZ4{-QZsO~3$61=Q>I{MtX?>{^*d0QAF5Q7*_*O#b6X1ouZ85-z85OrwlQtb`D0$7(PjI@ zh^$Ucx807V-p73N;Ao(hu0^2wW?#ru#iwn)j&o<}!zm93BsA#UgosZV(GeEfZLul& z_&Ud^$JL3U7hd3EKg9m4H{GWEin7ZP3Vhq@K>FCIRW>$>&( z)|1~7ts;{|>j|I#uo3Sjb;;X)9kvCYSPi+o5RQ`Sv{V-qYbnGNXk^Uh{QZoaymgdZ zZ)l{J@7jdP;ZY*4KVY@89u^`f2vB~?psj7J)SK9{h7Ipc69gbzNw;Pj8$(vKmuAk( zm$A#pHS8U{eOQQK%?qoZY<#t`0$R*%C@SK5zIYqK&vHqII!6h%gjcxat*#z7Ie2Nj z(oGo$;XUfwC-R(9v3~Y2gutgrMvdp$HDSPl$jbV^Yxf=F4t5eIk?m?st+>MnS1>g3 z#;Ug|(9<58eLJy%&wh@>d5g`*s``F%PTAL#i+RNwDglJ%N0~^t+it{1Xx>TBMX`X%LF^fR= z{pU9~^|QOwt7jZ&Lyz)CFy8T8Y?ae&xbbb@e7X|@v_k($y+A||`o?)LUlP7eV&?48 z#}<^7ZDjbl?)nZhy|A_nss{G))dlsHJs{*g&Sl3YnJ|+oEPUJ36(Z4dj5vtE+doIQ zlMrgH%fwcfGVS0Fy{mJ;Ppf@$^a8ZY`jFyI}rrFe7|=iLvzv)kV04ZOsM za>(&o$=AJ`1&3bFAcfLlquEPc{GF~sY`ok-=R+I%83nW|>Hz`PG1q~8wghBFj$7pe zVy{a}*SfCSZ#~+(Yw6li&ZWX9Fx%toF9-U%E)}e*ywOkH!RsI1bZPQ8r|t`9HOIZ~ zz^$8(efb_XBIl{K1*@&7VrX6hjlVNqBb|dXa5yemY_i$f`EfTWEmB8(J#FtAoOeqsG{k0we32vk2^~gxm4?exw|p6qkp!R{%;<}BHMEa&t35njLWunmk^b?B zmxoKx^%R$FQ*1g0tbeu?Ru?$D29yQgE}02~Wp0y79PES4YOyR5?(R;3Sh(2q!tPjR z0P3ouom|m6_3%fh>Xu4&rW5LGuSfT}lG*-D!!VPqA8`3f=RU}{8SQ?-*JERnG}w*GHPil>l>(^n#K zVaRNAaa$_G3|NdL?#pG}r>Vi`)G=l8^iFSRPfR*-E~ld+jl_m_IH~yghe6F}HO!3BZ?% z;R$SdswNWS)~JFo(Z*bvP@emj%l5`ArZupQi@|q|9j|;kx6&h6SB#=2ThiHjo(oZ!G{9dEn|yEfcwl9s9W8 zKkzmNBAoHZKpqoXOhCGBX-?T41im`Xl@tW*iU>64*Uu2BXG*RgSmiTIcQU+_ydgVO z?u<=BD=IB;-g z<*xHP?63%5EdFTj_4(imyHjP;?j&@HcY3&(hA;`im!hWd=WZ2q)xG{rl0ocfDbNP> zr8~Fd-CDryCl|&D-FIh{vF?u_2l*c{yX3a|-E?)rIV0~0GFjxQ)+D}1b%ns_-WC_I z5%BHBd4wj!BxZgJyxb+O>#Cb~COa|hLP3&nfzUUfJtrny$W+pp&=g<2#Xjk6>)zwk z+ps1J+QE*|Y=>eotn`=XC|Lc$+qa+BdYP&ck4)5zY-N9$V^vkh1NI|vCFaoMc2H;m z#fVB?aC2Ti%xg`rFACM+>3U#Gwt99FRYT&IHdQNqu}s)@9f?cC_ajwK0uQ!4YP6*5 zT@GsTdU&mF|Jb7MZf|L9qq8RWK-WPRxNzO|=5|F-%8)ZHmc-0|{=&j^WFXeMNDJt98NuJEtWsmMo+l@|Kz|ezH=}I@!??g?5Z3)RN(eMSz zF`FI2O&;^xqYQo-$7Ax%{7JboYY(kkbg&mg-zb^fx3-`aTmdbk#zRU=r^3ziWHps4 z^@Xr{mSP|44Z6zVrf0zoA@27Q@Sjjz3V1VCchaR;^|{Jx-fndDzNf|%`3Da@o!Ue^ zC$iM`_wVYgy$7s$cbvbwVU_X{vg{kJnI~EAHvp0g4LZaPhDb1bXmyJsuFRk1zu9mD zxKxP#GWF;|4__q;icrycJ$;HDHvK6_1tj49EcG7cwJC!UGYI^zS2%Vi& zQk8xp?SYY|@Li}=NYIy%d=@G1fPsb{6F|{{D3l_1FeI1nvB8}4my;{k zif#>>NMi~*0pQrrXRKDi=U6W8`JL6loc8+qH=+|Kw`-%_S0&ElM9|Gox~gf)F3yL3 z@4za-%vQzomcAcij1PxCB_abh4CEaHFg(%DvI*-FZDvC$DJi&CysvDA$TR=a2KCYg zx{7bZTwF}cKjDd3*&Q6U(}l1oS}r&nTqY0&1qAQgg32$2uXIdOu?orW{hJkrA|qu4R2lyU zT0_}IRG@ru^ltCbOD*al_c?1;?RSuu%7^Oolq^~jnO&{<99ECWO-r*7RD)M^DR163oHNNUmCP< zM`Sg8Pb5)u7h&>lR$0tE6;7dqGn0;a`zFfARXO)g`2m!~)=h)4mj|VE3`_61Id%bg~}%5b$@ldo42PPl}A7oQLVx0OL@G>T~h=Fozo%k`zhL^ickuXxB!UwRm zI`g~>C)&T@4N=C^tw@FJnneZbW{uq?D{O3-SnQl%KeCdO3wwR$6N@vB!(^ms%{9!; zVVDR)yt_M~--)~jCu;owaBU8moz>%@^y)(;XMkx)P6MP_Sn|D!m1nIg<}}6Q2Z;~e z-r?P%`8l~qhsTfRi`mER$I5krE>8~T8>6+K$H#tE*VK^lyqX#)c?E?|@7dcK%&)TI z0Eu!#31>d&h8-cdcG&O_iTtkMK{6&a&|dtvOZ7J->l#Aa` zYbdi)c}wte^R?sg&S~sTn6upT`HT7Alr|By3Zx=YK~A5&jd{pB7Ot|ONndmRBxv?> zDlVp7D}$WencegJXjDq+3>I9H&=;4)mt^PXr=6)>uS=uJe~(YuGZYLzx_^YnbC98i z_qq%yYuW9_dO0T`>5iSoORegXM3;R9;kabjLlOl0{J1xJuI_&Y?d?{=$8N2206$D%ER6BBL$Aanwrrz(C`k zZPSBD6^NDO_nBWK&P>L8gf~})|H+UiG!zN#xTq0tLeB24$Htzzf54f%Q--DdYe_u= zZm+yEggMX%?c-x>5MiN5AkcC`OpD*6elfVUP(4n59Z1J#;uKQ%1JtWmQklD^`p5N^JTO0 zm)nD8)14*^mK|Sv$IR#rYb+I-Q3`qZ24~H5YH~t9Ch%~;J_(l^bM36oyi*mc8@*oN zIG7mEx^2(s0T(2u1m-{B@7Nj-ss#%c>6K4;KTaKao&HJa1K^|n+m_zkvABQ#;dn@8 zw-1Qs7yQhI>wyUibiZ|M(VhDaL>-FQ%w=k(SD}e%)~1@x(ANvRWf6|%kgIwMwgft{ zZd>qUAU;0+xK+~-WKygUkbzhvEgnofn6A=-Txp_emWZj9AcGTm9^Jo|N?p*Zdfz0bQFljvZg3ErcK!NwHAR2cT6m@r}gUpfXR=J^&E7J51V8OD@hO#J-h{sP*m$eZ2$ZICD1i%F~^2`p9`W@0#dWxeI}aco@xwgkxM z>w=Kb;Zny@v92sh`~9hI#i&arX*ZNUP|9JmT2tUGj#uK1&HAZ;qH+?GU>P8KLX<`4 zBIwW0GgiVxS`km-4#72!@4j2r2OR_cSz>|iM+2$@o4p~2G}>nZXEKr(KLnixN%WXP zJx}EIl(iE7i79U*`KHRshB|~*=@BAtilzoPv*LpM_k=(r(m*M%t1lB?xlTdlCQrO{ zl#7#{rQW?BFke@#sTkuPSwINCR4e7K|24`dq@G^XvWg7o<&$etvQ>jCF?KmVFMb|(6H!3Tx-S6;2RbG@WtBn&c z3NaU9mQ&ko*-tLOl!znX{rWgucD9Fpkvo)R(@$;YHFYsz2V1YM>5~6WsQ++?KiQ9b+ zlvO}LHINf2fSRYk(^=*6d zl^2Pc+mFxk@?zTMGk)JE%u<>Y1lD|l;&u(S zulhb!2>1$`N@%P@BhN~Y5+3>Kzq~kJ?(l2t)zFfUt|$hd26kpcNYmPjigev_*{L`~ z+Al1HZC|+MQ$EJ27jlKYbtflqe3{y>1T%&jLINK1#o(XZEzUU#llFCcl(Wf$04eYB zB#tw$yrvgzAW+y#v1F7i|ehKNa@@N#hx zktGdHjtU_zDD5Z4hc!DrS78W6HgJ2pKG!xMVXm~7&B{)K&!N3GKaN=r@5G0<`^W^K zJOhkdO>3b0K85K7?J8P~Mh4~jR8%+y5o)@ZRppoK+Ar+7e6D7X8ziwa{LxKLTCST= zU)F3HL>Z#aEY=NRU)jO|(AZ~$1gR&oXeiv=zqFxFdfNSuBtd?@aQ;`~;#`8Ue1(mE z1%PP2V#1`&B61ZimST0o3WMoq)8;-3RkJ5DokrkUx0Mdw9*%sB{kFYvR587nrFg0gOE#cyH4VQ z!sn+IiYsUj@Nc><5@OO>XOaC6zMmW^0bZ0UX2SRF$7gWTJaHutr@AaLr^{(Qm70aH zg9hwk7^vl5&CLGj!W%VqhV{c375+~@{x&ojLqT|m)p7~)7Om- zn^L~s0Ds&>!NTE*T#1m4I|+BvXF593WGu^#E?`S=amx$qLeqq@1_dT+I#rL^*%^dq zzR$ED;S&-vIpE*ZiK7)#Ch4~xUBMwO?#lsJzcHu(0DNW6U~Rc8Ex>?4I#iUwXoj7G z{q&j;ShI4Ts-wjNd<_tai8=adHwz*}pS0Z0I_JG&g!O3EE$FRBgf1j25)vbk{zr?N zxQRp#4bWG0Z}@pQstZ~<1YZf(J~58UngaJW3);;Njzrd6LA*!-w)l^6+prWu2SPNFWW}mj1Z?+Ru*68@Fscn94i6 zV{|7KksIM3TLZa*aJ08H5B-sOSfQ)zKJBd6c)AF;Sj|4=N^)Cb1G#~ty0(*iTMoFP z>1TX6%`KEgvhBpxv!w0J!q0hinu&dO!a)E4cw*gCFQcKX=l6lnU$$VDPV-ozZ%l=w zZ^MmU^GJ$@oT{W^E>AW<-l&53AF;K3$Gi2uyULZ7-Dwt*dVYknwVsZJ+m#w`M z0dMF>thUw70h8yuQO=w6N_7n+{|I+!OJG)Hmg>^>K;>y-;p@Osc69Ej>ZnZTc7VY< zgHZd8VHpRyw|cliqs!03B6}S_rjIb(YiMck^6?d=s38dzUXW1!rRg7l4e18--r>3`~CeV0%)LL4!XCk_{@*9 z(XbT@2niwk_w;(O_v|6Uc7IBUY548!9dsVV%aWUBOSN|x5kB81isQ9vdnvHDnN4z_ zl`G+f)QQeq1jOuu?g36~mLcU6>nFSDlPHo>yVB6~9GgUDxo(HGRamDvl$22}D0qCQ zxr6MaaHFD_-RiyS*x2x97VZ2}sQD$pTDA9wYGWHG(-S%RgeX{e=X8WJvt;1n4y&Y; z`LEDGWk0t2QYYt7rK;bPko<|yqa$i}ogpbRdWLr`;eO>_ijWyn1AWur&AVYa=$(O~ z^=jcIGrVQ@)RKOR0cGB2l&n1@(j~A49i;K>aLbXWT7D>VlP?LXEU8X)(f?E+^Mx+3 zS+-~>H999c`t=(lskNud0BR-)yAI2VS9vDQP6oO_!5W(4Y0(2d5#Cx$v_1ugQQEY! zE_c?>lP`~uCJzT*!r{`08IA?xT+vq_20o-TFaYo`heQZ`EXirWu0-2-*dPh z9&a4Gx80`w$#|sp=!?GR-h~K=*n)Bo-hy2c0;{R1@q?Ch&zJAiq1oC?tDK^kx$BfC z^=EC7ZBWKW%Z5r5_rE*4)ajJhi!NSHn32+=sN34WSrK|i%to)ZU8Nv%zEOwu^9xay3*Lt9uC)Ge;Y1jsaYMaX3-urrtX3E_TLj`-W z4zosP7u~aW8ylB!zOD756yQ>n;*?2Zqi@$|>9Jn~GpLka#fmxAV zl}Xa?5ZVP+)=T^0lU%!k@V)6(jDGU&PcyfXpd;;UMI#vKbL4k?cWp8Y4hjr1D4$#L zKPuqT>sbxiL!Bzv*x-n|ohFTaeSdIt?-V^q1Wo}b7h)85b^D8vo$V4{I7b5*`TpG+@U z?1jF#eq@m6kdR}kt()o3NvmU7m@OB0T-z6fcv=QRhvG5=0NX^F9u5^d|6_PVFWMnK zSI6Ac)&H5MVwF;&nM zk7lQ)cA04Zm3t0Jo@}n8imVFJt-TLU<8IG6d7YqFSvK`wxFme$h4}>Cm9WputG>il z&_JFtE4uhy?99{WMzu-LRuHoX`Rw8h`I^-2TeLXG*ChpGO=kZI8iha20B}6m2x(Ksbhsi?X*{XEx zI9$TU=)JLHo$P(MLO71X+w6ucV~r-mk*_<)8a#A+abzJ`r+s1H$n1&NwO73RL~RPI zU=O(#HKwp>r$HD#@#GKL@pqQam@#NXtd)mWK0tLBLdIldV(_lCw{sX^!)mK1sOzky z4oPMr^tY6=ohBO%ZFr)rH!a|cN}cd}a`3ATd<0ni+vc5hSJw>EDc7$+Sn2D2YN6R5 znkxVH`5P=4=~cO7=q6+`&V*z8X);S>?TEU-p2qSLMHXdC>05j01bB+4xmJnQ?ZI9Y z?vUb!J=i)Vjx$Q-+T==+9)7AVepRPbmYPnLP8gZ9qGNA9#@z8SQ;7|Zg7{V3jr>zF zotl%LA1ENz?N6BP`gbhsHNM?^??1&A*sImvCDIi=FlKt!5R&it&NzsR}$;=U9R)QDYp%&7eU=GYp)bdYh0f z<+EEEB9P1aQZh2|I&kXx@{%fu_ASN6e-XsA9o1b!4a*`Z;&9Zk!7K;fm-U&Xf5+xN zCq8|wQ2#dI-TL9YKgR!XXoG4LW6%3_-=j=2#m!yuqeJ!URo8aPAu+2>A;}}b^RLsk zQ3q@KB-Y4Tytn3%{F zq7O$LJ|`{+NjX|`Srt22s$pDNs{1H|s2UkH?)vhwUcS!7@danhMbbS6`s2i(x=wCy z-H1L-jU-PIyr@Zu5%<0+S0s$%M$;3@wL1%%z~R3C@4bTG^rPM{|4vU^#_e{1Xpw1JsXOxnN>DT!dW71c>Gq1;}uJEHjnX7-A3ZDwcTP_18-CxQz zNbpGtv`?qcNpnC)He5U?oht)}T#pe^RX>M!qm;$odpUVoTFbh$W*Z?H*9u)Pp;39Q z9kIZP&Kj2KQVai5GfVm70n{gV^%P1aQhTTI;lH|B+Ru&8)<)RWl@A=sw;Y%ye4C1N z4FDvPnJ;iRJMjd3;VQw`WQmfz$BmX|Tq0)l3{>=$CfpwmR+;MF+u1SvmXYyYx61?C zXeKf}>C@n%Rmln%8WWKFIoO+96(|VZP7+UqkXD0LRs6lZYWMk`xY!V=ugQM( z^^i}Pw((@j>e1Gc^7!07QN8h>f)}sS8HH#snus!oKm8T+;`v@TpNSp$^prlFJtb$3 zN+J2H2t`63=Css?faJxuSoO4advpFYNu+KndBlgl-vYr|cE0)|OM+Trzy7xt0Ng<0 z$3p_7^L*oVYA9~n1RTHaUlfUmx_60t8-9)mWi=+dF|y!qB64JRM6}UqxyWYyRrOk4 zdlQ_sSPosTPF=hI>V$pD*QK<3JBRo1`rH`K4mhOpV4Y5)=uIJ;wGn3t`t0|S=;pha`KJoUq z(47@-?#V0`4gM!+Ll!NEby}~VG*&#-lKHd22c`RuS}cR-z>T!x%Jh3`psI;&(QV+y zne&7O;Dyl=`*-$d**wYeo?nFjbXsz0Ib`CD)f`wRao*t%lfUJA3abh4t2BpqkqHE> zximkcrtB%{xO`#Dgb-EM;E`WeKO4ubOsGXnO)s5p7}gm=1-8ZUAXmW1uS%OJSmQ*^ ze_4lBs_cbT#D6S>_ch!_;fv$gbQJ$MCk{`H#P3bLkQNl=eH|Hw7kqd3@?|k8%c546 z7C2?+fr^kT!Ez(GKZNkKvr}W>-BZTrbh6+1lXbgA)+{Sj`AY!WlN(HNMl81Lv`IQ= zD5DTj@HI5<#`RaAJgd};-y7m}0#8sa;aoEs&6WZ7A`1;S!HHzNjy?+0rgJ2We^O#$ z(LPfpS)+7N&s6NZ1OCOx$or(D#b<;eka=l@m9I_l_1x6dI<%Q`UNWcjkdE^-mEptO zQ^s{!@pS%YI^9dP8K$`Zb(@mSr72BDk_;Z=DS`(>ex!g+yj9O+#|mr+Hr#ZGyOl0%yjwBodCcofO@5k+zN|#m_hfN(H&U(gFma9*zyi?9XN`d0|ve;Jp@RytA%*BYdXmcCsU7_xm&SZrw($QLaSzaml{ zk}3W>jafQzE0?wpf|TbrAn479#Dxoxb61(&?*`hg-(@}B-#MZa_ZYeV5DB^Mfty;I z{N=KX`!nA4)UDKv`aiQDWgd%Xwkfy^(~%6S)y3^jM!r+>-Gg?yv>XGwdOr$h7Bg!{ z)YVy;2ZQMVJA)ARlCoF0!EOEoqm>@r4+y6j~;!qFn=0~{6#vK5C%+f*=>xp>E;g4gsiMhWa?PsdIkx3@3rQnc(l*?nI& znFrQ>S!T$dQ05FDp^|E`a0f4|=f*=zTK7oNE9q~_a|(YJpb|2KgZvuO|M;gohDj|4 zdHWOiR&{>MxjyI8(A9$$9lWHBApz#T8IrlG;2dGzc)D-+OG@B&yjg?Uv0&DuQlA#( z7ar1ZY+b0OK^+|+P;S;cgBNJ!CS)MeolE>bVG*fjQUu0eUKU|RWkhW;YDcz~LqG@< zjhBZvMOGe)L2*E&rduZ&+zvEcdQ7Y=CsMM@L*T16Dsg)et0HthDb~c}&DXR3Ej}*h zsp-G}wbls5#pPcV%J;s&F;d3D2whET^=Y%g*Wrp+kGh9pqYjPWg4Xgk|A)A*V5)1` zwg!TGa0@OQcXxMp_uvxTgA?4{Aq0m&a1X)VIk>yK!?(zJ_rCWJKB}mqHXGJn-Mwbd zG3V$psAyTqMjMC%fP*1v(ts-mm$5Ajcx5W>#l8sC7IzI5mBBOsx0GB0WOL&`OUanw z9(ZM=#}onrH+4asY;%Uk`D|Q`%&AI76THprxcZQv-$mzUtyJM@6ECl|ivSKug&OS3 z%J)gX1e~uO-*5UY7BzBZ&FDmKPtB}B7rS#s1|MB$@ z0k?rxpo?Un>UxHZ4m}BfG*O@JeJ(?2p7%pg+@irm;@LM;FQW4kW(`r*~1hXynJmsLis-W|wcJ7PY&uj*g&_kAxG{BZ3AD&eawy*nozU zeDVBeY(2SgUR|XGV|g$L0wokc+Zqpo0BMRG=F&#i|C@{>6`{Bes7twVmp6_#1B^Am z;H<9oXf(PuM5Gv!i-Dr+0mkY7s09BzfMf^O8#12Kz+i>^Sj6Od(2zpq*;+}y;i zWBCvoeF+4niJ_=mW?f=bCQJEknZ}JRDrQS_#|fDEkRif4vNj&z74B-2V|iUo44{AfQ)@j~I!vOy3PJqp3IrnUaT@EA7N7XjptjsnH< za}t{ThYAluN$XdVCgw5t|J>WF+-$HF%9y%mEdIiLY#nR~vz(S?vv6)=PS7$`4vu|P zYN_erOD89h+Agp7C)eZ!UXe244zX~c?NJHu1s<;u2SdK_fYZPru3BY|UMy3)pgszt z{{dfJ$Ew0`_JP1xfjd>lGZ!|X_4}q!MrqrSy*0H3#!DgF-j$f~>TXuPQe<%yR;4`k z1SR&QuGPGeRjQG;NSu=vjHzexqZCi7-Gv3X%n3;0tYRP zCWf+joTMtNfFF+6YG(81SuN#hW)BOW?wI~(TCoTw{FHlF-(Ei!7%7UM9k#M!d?z3wkpbX0U-qKA+#tfGA*ZAuc5wzFX=)}87 zwd?4-GZtBPf#a8Ej3}j;st#s@Io6T0fOwx~(Dtadh+xr5&;2U*jIRo|a+Bsj>#ww~ zu^4Ud28GUiT~PGd#KLsl_UF z;uxD7Z|9&RpKV{VWh%Ft4kS<0&;i8*_kL9S213=A$5obZXA}sYrazbl_;lAOM3+N* zVEN4Q9Y%g;>Y!bY5h#~nzkoVnMiDl>r9=&Ke`|j8b-*tpz_c)kOV!)1T$c{+7UB$u z4V3L1&ldF*@ta^p7t^$Hg`k%!ELBM+Ih;8xQQuMH2L@HCSEzWF#nK%9${BcsB!cpr ze#QyY1_cQ;G1RU5-$p_Zga{s&^CbZ42^z7uc&hg&_IQ5~X2a%U2z zWn*R*f~^^cw<1JECQ5P#5vKL%g#;McZvEqw(ZYCpjN!MldIP`Y?J5^kmc@MO^nHod zQ&o4le@Q-svhH4gZ48?-^rTCqV!xYKuHg;;B&2^?Dw5V77%NQUm3n^?7Z;dq z##2;i!!NGV7J@=)Zz<;GIysvCXG!(|-EP&^hgBXaU#92+5;rU{R_b{zztqsk1jj$u zsV1a8@!WQN;S;81&08w+*7=jG^fXDzl+oP&CR2EF5?44th&nq7VyA|J;KWrl>zst4 z*I5;mK_im-b2z>5Z{+GSZW4!DWYkwk2hBu6_iPv}*=Jb$`}@dD|_6?V-cdGUkWa0-0vs=X`Tj*X$TN|>&W{u6E+5H zZ=h)GWIm2IY>)rR=n2d?aL3OzI<+k105{w(r@MF2UF4TdF5Hs8RT25MV~>)rjSGLW zCTb5VrF-2%rPuKV$s3v!d$tJ_>#b9yx}tm`nhzhQYBa7f#~;J+>rky{o#esob-7Q? z7VJXSw@F&YYH z4qkitN;pNsGZ~Nc3rZbqC_A%MY9uCS*s^kV=AnjMMtsIrPd?0wV$%q#y(#|i=1{Rz z5~DW_r*b)7leb6dId*JZF@^Q!7e|G@q)3+*@t<0NkGL<(w6k$;mj&g)kOEupTV6KAu;MZv}*0czQt>?{IW?og=?&l_&R=V@G-76+KvyQx?UtANQ2$?9i0 zV?X^S#1Dy%U! zHP&#Hxw4qfdO}02C@ehvt)|ajJWB%L&4fVh6!o&ti-0crqjJiR~ysHD9W(m zRP7tp8tZ->e;%(TVS3NvDwMDmq*1%>la0W-W(FgaREM;KCV0GCW|G?0E2wu)UfDtCo~(wYSe9o3w$jE}JUq zTT*1G@CP`=ShA3sgmlr+g+HbmHvF|{iVmvNzigCTxY z-<3j=3QXf_zu0~z%@dv6S<*T#826}0SADakN1?5Owmif${lgcqIx_*a@FOLrs@v;I zxN9#QQsir+zhuAJ@|)z16in@y{o{j3#;58px*sL!td2Fzm=0ZaGGp$jQzR|aH01!_ zb~h^)?zbTYEhL_7Kr>l>PugY9z&XmmCa3BVX}p$f|C%KvkYh6=agvR#Xmr_3W+}$j zD!gvFTv0>a{EF2oHJ)Zd3{beaywYc`~oECVmQ`%OwXqOX4jca72OU7 zsdozw62d}2`&^|ckULgLE}xo^qHstWh)zrTWod_7>PU793e zQ$OnWJ&#qh#nOgFkG^5awn-*LUj4f`dKc##D_06wGoYlT-r2GXNVBt~iihgB8ud3f zdnXw#1(7IW&8lOu<3V9;!<&nHrUy+I(pf8M&seHKm0abm@tMa{Snp1_0c^+_6ko?K z_WbSvOQxbM!OX;*x$Q|LN2{_=;o7nE!@hPe^^%-{G>2ic zca$;FXa1uIGDLjw8U-zWP)S?^_!7c+Uy_U1}rMJANkANX)`wDf@`4eFdz-m58 zR~^xIT=Ty1J@XpALdbGnVmzKxR zzQ_SsxyY}=z+f6)7ZR-1D`V9ISJ9)jdxCk{WsH0d4756E#yuGE8=8QDnStRX6*0Zg zt9XD8ld%rcuwkNF&hME&reCH85u4VMXL7@Z1cQpBkjc9&CczqC8+^enS!8LEi_{3@ zn3HA}xQjqliJQB;Ljtcvw3V}W__0(6^M;;xK@Y4{OvTVoU6*V;Z2s1+mX%DFz8L~7 z;PStXy1cAhM^GStds#(ic}_46jK)ast7!Uv$nyi#VojU89|kZY+C~s}3*<&7V=~fr ztj-ip!MdB_m;^iK;vv8NY2W6z&4p7mZKHJ0hmC)<^g8Hc-B}vLm9fjkr97Qq)6(ds zQQNhco-0_W7ya_I61a{k>V)=QoA>94HlbaliI&T+s8C||hkmyO7R`5=-gM&OimDn1 zd4*07Ur*r71|&^I7Y{cYGO4R`vhI3%X39hyJ+zemR9ZiZ{p(gCv-W{e&i@(d}Mg0(|*EffKPk ziYJJpvSiaz=TtKDAN4a=7F=AfzXu#FiDV)p07oK(RV0+Luy<`(RM;p5UnAbN<3UUm|nG0y6;1Es}x=P?O&^e68>aySM&OZia2YKh=rT*&d6)dhV{E3>xeu| z*3y%xE4=NrQQ2vI=fbp`)dhVvocLFQ_2E%^uKN@$f-!r+jgir=3rJ8{&ydMWx@nY7 zJ7uMmFCYI|B7H)M1kCnJz)Ph?Kk%Km`&&R^?^lTy0c>jFE$?%!G7ZpfAR5CoMOla`M5<5Lm= z0V+m&uds;^&4l#lQ4HwgmZy;&3o<`{4(wkiZ7)Wnz<*sDM`C-}n!poH`>&;PiEn|k_k~ZN*df|X)a)5 zOyv%Wcd(o*STDsny-fxz*^al#>l9L-8^ zuPO$HE6;pA52XqLki?Ek==OmpV)ge*kLrscvogmYPdaN-dOG;|9^}Bl+ttf5F;;vL>lr^+gI8hn# zL67}~uB4sMFfv|Ei%aRut8(pn3aPGcT`AF@m#nOrgpXuNIdKSRlEULgOR#_1%uk-Q zaZR>ncP0#%J3ZJ+Ow1Vq!~52cZTK=6GZ8ETXlVUn`IMza9>33qx64Obqg6aTdrBIx z+9-#B9H3;G=Pb6jViO_2MQ|2GwqGh;+vGnbZz02(Gii}J$E%v7M828-QEAC!;wa-R zR4YKr(q8>^qyWr3emF^dG#RYpA@_HdZIo{O_I&m=#a3)f(y^ttUZ{6yV#TR%(zziGFeY z>j9Vr3Dlr0m3NEF>(^JXcD;GO+tDV_t}`ps(zi^qqr49|*GB~j@I3L05qShg7%mT$ zk87esnle>sQeEiKO|!Od);S}pZdO_YcS*X2a-b56FA*K_uP9L_@-p0Ig`km0?(p%^ zpk>Mae+_h+(Cn21`o5i}#ib_aYn0-2)nBxGr;!iMYvq4@Xx(Y67k1{*Bsf67?l!ZN z2%nIQf9P>CwMuqU%bE}DcwAO74Pm&8zKQUQx8Fho@L3;xWyjBg{jl~71W(t|HD4c* zgTt)~>2T5Z>xZ3|Ym>Q6IiDOSOWVclPL}tZ0c%17ny2e#A#0~q0PH^^+;o2NuPD}R zQaseV-!hopy%K0dRzZ$p&~;yQmWVyJ&^Wvr^0g-fou`yHP)!Z*r3hziL(HaJ-HfE~ zQ6`H$mBfB_q?Z7>kVd1F@T3;XGnk~bYHs_ILY^i>e6ad)Nppn(kyGLPb7D>2mwZJ@ z%Qz=Uj{FR_&x7wKpG`G6rW$qFThdY${)XFpuIO8#FL27kqV{HCH-3}rYoQEn^i4TW zZs9m}Bd;#6bP?1IGN<)*a@cfQ{@B<`Q*)f$*1L!a+pas|is4yqffT~c02){T9;VX*nsq;s; z-~fBV=@uC@h-PsRw8WDjo6bHNil0>(s5`UIL+;?vdziQ*m2Nvay_?v*^;aeRb)|NK zmSCgtr)MHO)ip-E`BEQI*Vs)1XYYqqfwVIQByR^~_cw(TL$gFbp!)U(BdNmmXYWVA zDLOh{_Uk(5=Wox;=KS6Jt?wW|PuhxRcELk}jtySNQK)sUUNbjQ5+(C|8K(HM+0*}v zy`plQ#hC8Vi9+1l19EOAw3v^#=-`^9%o}$f!7g)y>TUU((;o=M^bVmSffV&y2UmX~ zZepIRK}w zXnKg6HerEAj84xA$!C{2#OhDltR+beDO2vELAss=x3+dl1iwo-v3xt{d-lX%U7Ym= z!_FAu#U9FH&2?Its14n9e95z^&<4-~Y22u0U&T2Ns4}iRi-uz~2#2qmO9jov$)?7| z`7QDKwn91t!va*H!a|R(7oW2TpevD6N;<7-<$7Jk&Sg^CD($qbUwyJ_eB0z; ziLo(Xhy9Y&n6J{m;wG%NggzTK{gNU)h|m6?S^y&4lSc>BOky9i(`>K3$jZZUT$gH7c-5V_{ zSfsJeP*~(KvTx9F1M#8w^7{6R`<>au&^;8CEN}?367gMBUx^$Z5zc&KXaGZoNboE4 zdZ5zK2meIeA@)9&=o=u`h}e2cgo9=hL*-p$9>?g)yj6X5Q&lOimASZd8!zDITDiY* zEvx#1=%1Qr%`?ZTpCr>$byc*V`}4aQ-KRX-i%<}xlN>G#!&r&*KhNNkPj<+4VL#F! z2&|;IjjQbJd$j7y?<3HN8Skbc6fG!Ob}s2JEzA|rDn*KpvTo4!jHp?pVx4Yn4!`n_ z9)5m`JT5XMus4VU^$ct2EHqtD%P?Et)FpL0xT)t1{DlQzl^@-d)&;uy~3egb0c~Fb%aP0EzsC@>5(Gp{P8>~$YiQx&EnJV z#0b%xj1oqr3-W@tMvjTJ0;0Q+Hg3^WReMlb3156ocIy1I zab}GJ>IKBCvZfND;%Qb(^UGQmz`PJq2lstpw=1M($BzNqd$}5vXES0K)W!dr4-HS+ zhWGMhSKU&WdyVhai(L@`+c(pG`c=*pF)IAN*?^gg4*WetK)8ngZ!0P@ zpySi;ArTb7j){)WJ>j%8Wwzy1KiXsJQ`7bR3ma}kz+{B*r01D^9qxE)WR$i3=)z^N z&yVu>b_ha6@{(rD95JJ*Os$u4A&}9d*R+OB!|jia%qR(iPfHnR3Hd;<07gx_-TJK{ z<3Ka!5QKb3^ZbP&Sb`b~|e%ulC6ax@5ZmDJfR>_awDsG+7);9&GJ- z9B>z9B2*+sO>>7Vrs%3A<6_UFM2$q$`Q%LaZ-=d3OIvISH+Df^K=IvrsOn4U?0+%* zd%l3T&;wCIdg9>{q(&f9$(5!8kkI#`IhSY)@JIAcIQ6x~-7T9R%jH$yKY7hp;ynz% z&iRtbi+|K-Ud7p`9q2TUdLax>(5EH78(Oqk|E(J130JvXp&&~OxMzT~0S#8L2`sB@ zck@Eev@(}@LM0_4VOAp`K7(2QnivFu)q$LcRT8i8<{{o+6T$~zIPe-_Y?#36B28gU zC41IiM>Xs~T{W=0BHU}9KDiWyT2xazgb_O@If=s6t_cp9_dm^odCw{LW8gfsajlah zz}X058E%el<}?U~Ui?h_GA{F?RAPVHE0Y3hI4 z{wW2VDUN>09z7O}Z@$_WZcZEM+fDtWUH8`gIwjRPk#S! zTg0^rj(t1%v-zrp_OL)Yj?4cb6P|6g86?w?Q;)ww9CD;U(-Oks*ziwGc6UJm(4XLc zLb<-aHJ%uHPe2DTB3}PU0Bshsu0y_najXO!$In#_)bHDVD4-nt~EaxoDu zw824sv^{$l=1x#S8WO~4z$x@yKAuVq)wI|ZOgzAu2FwwOulXN$VZmKQz>#!&CPulM z0vrNmLA`h*GWb+YnTFeHi@b0J~z#`52;Qhl#Cb zl&Szm?57pJG~o~I`?WhUw_%Ko@?p)K#iOXks5Sn2%o^ zWBqi!XR(dtCcdtg-a@^VLBg*iO}JcBN3SREW^jDac;fMWU=MB{vqli1E9J~XA`F0V z0Q8WfX3Y1x6izUTr~Ry%4T`^sCy9a%p5{*Hf1dY04HA*4uU zWwoEMhhBLrdD6Q7TyX-w1p-r3^8-`}c`olL7#?t+VEzqJR26<2MZ%TzYw23IYt*wF zYCqWT_5+q=^Gegw!sm}iAL;NbSkEGAdp<0=LZm(XmWh`24`=^53|Nx-_W>mXusnKJ z+^8LIhLl(LG9Sr;Qkj0R3_L?(3|QTL7m=>4kq0xiOz@4xrHF z2_U>yO0-B99kqu%`qrj(S!g?KL*l&hLp4{kvF^P_Etd~^c)8;iyRQk^3!>b>j+qFM zQjdNb=wK7BjimEed|<<#+PhX!8-G z#HK)l`G0T8k&oNDQej+a>iTEm{yEZ@=7CEU&e(Co=Eb4hc2;#S5G0wy1>{HU9IK$OorSNH% zV&>CW6-=<1APGmwdr-X$ezk{SY-XC7_Im{IgK&3VOD4yROy_7IU8(v6BwKp8!`CRL z9#L*$op!-qt^AtL7)7~$9}TIQ_rk@9k3P~ItWy!8_Kv2AkX#CUe6MKw_%xHZ@pyYe zbhJ5q|E}u4ay@-kWN5d^oDsSz(+aIiMGOprrr%hnLd;KC76YOeb$> zQ}mITDc=v5n|5>5HCe37KDjEEacl&@p0SeM@yd48@Js3q?A2FGwsv*oi1?oS7RA#7 zf=S_3MisOpP2Lw^YiFyOkR*JbQd16YTv@ZEdeLO~w)u&~VRTbkZ0O^coaxquPh@ej z`tuDLVf7^j$*r*uQ0j?9_2nlDKT;%l(>4L@kwrOS(%A_k3yyuUiT zhPtC*LN`Awv&9W#EnR0uUB`na{=DTYWB8wUoKBrwL*zI)Mp=84-i@98Rt9pXZ-L9A zYuSHx+$JJbJxBxYHvN`uPj)-U?Sh~TBI4#hJLVTG(k`B@ZUAYX%2==;SM?1aAr{Pw z#()`%hK3rjxm3b~-iIcfGasRLxfR_Gt1ZezOMzr_6nQ2}22j$Oskm0(4){XUBRri^68Y z0OmA-R>ub7|2Cv|e94A1a*TWo7JfLN7VjaU{8Lk)R zEo%_TY7$A!?j$L%2YuF+d^OB_=IobwluR}wC~YsW%GeY{!5wD1Ts7W=b;xcX0Y=!; z>96y$5W13`;&yn5pKK^>JLZBz#k@rl0E$|o6p5@<5TbX~*_6&t7-FecfUc!f@o{o}7ISFqDO{YC2fWWXrD-zH; zV)~=GIs(A%BXCl*PWS|-EEyg?IiLysOatq$!eunWBjrF0ar;{MKClByO3L@W$m81l zy^{jsf+yAgc-GwF@Lug)S%&Ubr`j~d0GGSkQuFK^t|YqV-r;7f_z2w+(k8&VlR`8) zt)^xHq1fG+>Gvo_a3Z?_C;kSq^CICSy8Dt1An4E8l{GSolSp_2zP|jN=+aR{cabze zi$C{GA~{r7=>&811v1C;m8V0i3s{XhknhN4Kt{1jrI4Ql3`~y_`A&^UX4uc(bz#@p z#W=SQM}{WyjY|z^xZ_nbDo^A5UuZSb9sqwYVrc%mcxmcXyNuwI!<_-NZ$Lz=u^7g# z9jM}LLe-N^baBwfG_vDocggIu6GG>Lx+iI3-~LoYk-litIn35Y+NzO*FlHU>6$;!H z3r5*7LpSA1JvRAy%8@Ls^V)LU)0_lwYX3N#lR zE)8uDV8jRx%|Yy(Ce`f)!1k8~LC>YbE@0S&&2`lRLm@=WH0NjC-cT0Nzjp;WN=RH- zbS@8p?!1W9#@F#6iRY;x2bS9}C$Y;`2TfNWusZ^-6Sz?}eXe8V{j1aL@qxa!em+D} z7hKT@qwZc~y({`KiJm@@wGIaz$n=2vqw**7k8hWu0OuP(eNs2ZIbun7bI^FI*IONN zoEG~|LrCJ7$zfBLQJ|^*yHjH|A`Yt?_3(%5pk*p@55u)w+~^(r@rgE!Kc?+_H&~C& z%}8fLAGF6Y|CveuPc5KYgGesl>c2gBLq*bIj_ix(d_g3fVYdIGI`ySdBw9Ijp8Q;u zOpTFLSuyb2Csg`}J*^4nL_UjKCJifqg<%O$zYZGp<5t(-)}>5~Vi++o8TrlJqku5D z!!Ihnv6{sF$fth$t31N*ANLeVX%nU({BP!hg(|LVX+JL_{dwa%xwN zRK7mCT7@J?Ijf1_ZDl$%OZV8h_&n@h-5f8cET3XL?;`5_f-*d5Ve8{~qfi$3?J$D+ z2x1}B9XqbvZ_$#8>bnd4y>}4}VPTLZsvUe)kix}SCJ4?)mpd#XdH`wZ-9FnZI~!7IAZQ3{?imsyf3k#= zyE=%4h95X}Jh=e) zk2Hb5VH&$2O*cK9 z(P$4N6O$lS*la3TOU3@k2X5BAhQaNgt&*LJdhOW47&FG~A+8fG`wlN7$Im6JZ4e#` zQvM%w`Lj3b<+}HMVp6u-j?_m13*9)dC-eBJ(QFM707$S4wwiy`ANtk2RR7r}C@mI~ zBiZ1?=w5_qrk(yGgYTb4w(J^a_JeYU5{>s5t45n*T*le*yGa8{lm5^ZnE>HX9?*@X zXVuVq=?>3kS21m9sWWl5Akw7l8;fY*wfGQXfk(8?1Y1>V;64lRob&0dFRw@ggw{7s zRFiV|?ll*mJtx)Cj80_+W|raNWXw%UzgK+k8MB~wG7zKkQ+xZVi&D_uHL%Cs7y(&{ z`?&7!R(Y3~@4_Am4%YPJyd-TsP6>J)N3sB4Q~h$@cr?UkH}E}U`_AIoxatdF)795k z=1;uLVAz1$EfAW)*mx5M&73|5NdbG>6KY@Rd&ch-J!k1+LZm1!T0P5>We4s*%z|?R zUC7$X!-|IlktOSIx?lI(J~eAmypg3iPF{6Jnf?1mOFAO z_V|ci?W}+Bx%N3Tg~|HW%4SQ$u_NF=wYU#D3^JW*x2sD|)h$r)^i9FDq_qaid>r?i z6poD=_V5$$?J$E@NY0K|U<3+&e@|5T_Z7C3H#chgUb$I1_)*q4^WJV{zTsvqtT6#~ z6|P@~{5d(*R%geNe%gGzfDH0Q{5LVRX?{%F0Xb z5-;_=zBt|$nPJI$(%vN~=}eXbH)<1=5&9(azqvC#*WW+R8@z{xoGQQb7hb@{rN$n& z`2Ir+pXj1}JG6GltD~G&4bC?y<2wX2*o5PI5+bw(5Fy0+`f5J+ZC%MLoXj?1lKWfu zy#`;kNN!(v?1p3lo#kOuuC!n0BX3zx7^ugvK-r7ojCJof%}-q{>LhzNs@*Fnl8uko zfZe)zZ*McVcG%r1%h^E1s`$k7LsKps7##KAFHeI?$FO43MfyTmY9-pa6y?90v3xE3q=x8U8~(Xm!H`%~S?^<_v{y4ZZj z_bME?ex2)Pud@rwA~X+fyBkE!K%U*|scm%vSd#edP{CwkF%)FT%nfF{L2h<@N`?zF zD|`BFp8snhE|}0SfVqfQC{y|4if{LkhulSh&$$m+$2N*UL*xnp@jJYQGKsy0gMK$@ zA;P6IEiDaB9VGxz$>DpF;ACQxsw3=L;S8w+8fQE$PW$wy% zbiP7>|KGaU`(#ddNEDI)CkyxwOmt+>Hu1pL#ojNX5tq2tCcb;Rsbu%8cID&>AJu$bCEkE0=C)(V%tIOeBaW}pDS-VaZ z-N^bCvSeroceu=yIu*^xvjOXar8z)3a64H){e%eCWnM%Dkjs6?vbcuwZh)#xx|#X+ zSwd+{!+5ElEd<-Xa*b@0n>iu))g_Uy;wEr5y^te=8NA@h$<|)8zpx-7u6Wqefk%3E zyJs~O+}aA^MNDKkacIX!fP?V;4u6UgW6Z_a3*rCSx(F8e_`ylojW=x+ z@TN9}bB486wp!Rxbh{7$BgsO&9A$ zMjI{i|EUH1y{aVx(7Gek-`-2VH_2yEEE;DhiZ4)7l-3j4nRF42&sZILlCV}qpvZ=x zLHU78J2Gw@PYxOGlZ^SKYCSe&swZ-2C&(&#^UE*f)xP$WWbqnpbRp}|T>MdL>qFVt zj%8xxex-?2RE2k%a`_%^I!C)!=JAAR{X-5*ggnqlY)U`hAyxj)IDG&mW7Qk)lGDDh zC|~L15f&!M`j+{B`(S0QzTv2EYr`h=tb z{|D1TLE2w;J#ouw7vtx7t4-RMD5qn-w{jr!`DQ`_JeQ-y2^VLl5;m5CJ zN!GNYaIxFS^7OcI^hlAlTv=fLy485mWnTqUZr7}&_40yB)serA`8YvM<74=eQcQLL zJ^5p65SwYDGR8XS+1PL=-X$O`DN}-(I04PJY>N6(%u%tsvYogi&G7yY;SY8xlNTrf zcu`}h50<{~fv9qA-5BQXm<8{`g%*gZ8gdWx<+l;(TU@?p z&K?RX1+1$`uhXnghtv{vEbH7OW$fx%Bf2>yk{??8oa}CF#UZXLnK8ai?xzjD21coS zMc7XWogN+G0`m{hASE=sY7Gj_tHybW{rmTr$v%KNipvzW0@WB{+O3V9?8M~3zs2yI z^R%?Mm!ZzkK=@n=Q7uzoP8X93fMz0m+jcjYJ096zOiXL|bRoKz_kP7WvbybYvY3%MrT5+?iK%o^g?m$nnEsv%B|18M+G^Lac@jgh9L8Z$a~vb` z-PCuCsk9+~M}kuZZipWK9@xn<#qQK#5b6sAT#slRd9aXUYHLuC^IEH`JMLY|+ex~) zgPWPVn}*lzt#6v%XK(AWa`Up*wW=x+%OQesBF6hU^L#%lapi8KO{z~3r_DJWmQ4`O z2M!LG$5xTo*|?*v)uS#8wFRx!WNhr${f*(vk;P^AOR0Zu_=C)J}aYGs-q?vTMsh9M}SJ+maM0+-77q6-Pj+MKHm5^&lOuf}=+(|)#a@YHa=OV77 z=yBJWS*2xgnTcN%$93HmV^$Q+e0jIh>u!jB=nO|jxb_-j*6YmYU3dJNSwt-OT&#aV zJM^HU|C^JM!{Db`MYU3zeY01Q*B8G$a}OET3<@^+@|g^O><_e-Lm-`G#R&qM(kfiJ zhbrV^jW7uC0s@61_z)2%L=V1uZ+i#=#9?>{#m_#+rFUwK+KW?4jM6HX5KILinazr1 zBNnzlQa`~Vdrvu)5tmO2#Eh}2w(d|mDzJ=-Ko2BIsFFrW)+LUN1i1NL6WCptoQ~ZsZ$bT?~3V`U%y}*C(mHlh{afqE4=i;LrJe zk;5Dv&xr|n9A?FOZIG-c`!yGq#ELqj%6JX;{qt^bM;v2~*StfwD< zk;Mw|t;S(V%#Hm&kOZTOz>?Gvcd`2%l9kaB_*56};VYsB?+PAEfdBhT;2l?l&|FG9 zbllB!#iX!*U+s-gIs!qCa{ELZUa48L3;+EsCWn#zt!In-=D@a5!;aRg4x{P!cVC4y-9s+^Z6 zh8_$%l)ev4Y&|9T)@+8&qwxJ)`PIt4QOsrLdMK*#bzL<#vJLm}%*M|C*w*g$$!8F4 z&E=voCE51jX-g390xs0B-Q#GKeYU*grK@NIZKOADwgB|lzN-B#D{q=8RBbZQ?Vz4h z=#xCEh^3!Si;4QqCIzH<+UQ7=wXfhC=G+hdfU(UB^5qB#{Z!FiKbwHo-|YQS^!)7Gzs&z9utb zzWu_GsDl0OO*9WXuA{7+nA?WkzMLwzi}nU4p6G?WEApqR{-ZpQOf_?>4;f_sNGSOK z44)FTF}MA~5c|dS28-_LgvxJb9T2w^CABu#L+1g8zxhIKnY9O8+xpKXo+VwNy{U-G zqi^K@p{TIvl}kPwc^vSXX!dQ$B@u(oUznbo`X-8Lme(Q*(`JAoj0=tOcm)WLYg8=> zP1u@fQ7&1}9=IrEMiaZVbb$e@PXZbSRs?ob*Pt;oZ{!1~IIsjgCUPa84bBR`wg~$1 zxUpnNP!+;0NQ5qB;xA=p^4X_8-!+pLPOw#~*gzOC3R^}nbp^aHHDD#c$D(E$oCN&BmO788tP4nxxT7O9PZ4^r@%x}?8U3`fNE*`&cOwR~inx8hY? zm0jRS&54Hs?1*V}{Lk_7Fe@Sz!mbL=iOJE6)7JAkiN_)-sfEg1Cv~ekmsb|BaA7%o zM3{}!RkiY@FxezsBxoAC|5PpCi>}9F<@x&Un-v> zZ6r?0*3|xxR41liDZDzUWPsm@A~qaneZUO(whZjL^7#gWDPsl+KWD=`H?XhY!8{AF zEP>!PAkyoDzD=6BaeqQD%G;)qL&M~an%r2*m$}7aSc}SDS?yNUZvTl1S>#0*=Byn$ za8Pphc-|Mgxp=5ls!DBbew1gFh!{EQ`Dt)SU@dhoERbE(K;fn zPk#0}A?cjw8@%c*8k{*x@0ldY_wTaWm`Lg;-O8{ zK5=JZ`q1YQl>TXMJa@~l@VEO0b!@BrsWgri+f4W~QEy=85qWH(W(A8+jf(jl zom`rl@;lqNmexM<+uTQ#k@kNrNIi4y&OJ1Tdd}0;)m`VGB3o=9gtu+;DD}2T+*Vv< z$(?fy{blov^y1SgJJ!$;_Y05DdyzC(#aiN5h0---8bOe|1OCVF184`F>i0)ag;&ga zKYP6MOaq4B|6$HD?7fFu*KawK z_Q_tacewXnw~}K_hB`J+^RH>P(#!Uq)>|3uhYu|KGSyQgPM5g+pcILOlt+}20aFAgMWoq@A>YCa7b!i z2bDKFUPV;k&ua_%V%be4y;|ejO;XbSdKkh)7hEyoa`>27$@qHUidqq$I$2;YJJOuX z%X>);NqpJyCEQ*WijEqCn5AYLd+8rQvZHp#bj4>1+I2N`e7=fWngbj3_0$fVNkaaD zf8H62(o@{`)^-|`wyCya({LG#mc~zlJ9k;dW!@Eaj{4<9zE`kQcr3)!C_24byR?e_ zn;F6eqSVMv=4FRVhrKDT+~CX9Lws!QYG({B8-<>79DS-yAkOc9(0U6khb}wV$(xT+ z>^Su5k^-Y2PKHTsxCGuO=1K8)Bg1SJJ$qIw=+1eMT#vrXXTga>((v-@nd0rUt4{-S z>rUFUgMoH|MJ1g65*k`(+;ujo>BT=DmZNnGW@y~DWR(JEStUTDQ zC>nU^vln5;vNr>w-tFE?|BtM%3W#HCx(&hIhTzWN?!nz%gG+FCm*DR179a$7hX5hC zC%8*+cg<~b&iDQQz4wKenQo@LYuB!|YOQLVdb7aun?g;sd{?-VmS!%YheQK=*>r)& zkLES+2(yYuI**@(F5@p-q2l0rN_$YUyfvLar@-Q)l!%$rh2&93tX>J>xB)NdEh1G) zacF!4)VSf}Z){A}J>5QwOHAcxPVr#%PxG&Na|$d4w}Z1P>z7+nPaOxxjN+GD@K6~u z;7}jnNL?2D-oVO8%04@q4p@p>kmhq_?jtNhh|Zq?`{7{I0PLM;&25>{iv5?QV61-2M59W<~ZTM}v zGJ;`s3L3xG?w6EnDloSUeYlTFn?0CK?ZuzMG^v2`oHboIqmf30a+FJB(qtN*sicc) zSch|+C!1JwX#JsN9|+zI<442$)X4v|+w3ce>8^l&fCJxv6iEu9L9(_hlP;lW*~ssg z|9Gev-a*nV6fxo!DDVH3*|8k#$eP84u_Bdj+q*J-^Sx*FkMH6`S$zrn69SNYlhNd7 z@N$6C)pb7bbt6o6_ix{i+yQsDDkDUQq8>@5n{A)AN1b*t{@lfo;OlxOT>ZF`s>2Cd zb`-am#A?+f-tf8?+xO*yM==0a$JWZ6S(}a4)XE%sCf>uxO`VgQKSYdACs?V6bKx)f z$9a!ZK)2+wVI5v!vO`2KM+eA(pn>@pu(^)Q#C3ykA6B}ozjuD_8ey1{*DRdNqYma@qM#FV=%o$I@h zuAM&BkiB3N)(2c$au z0u{p~X8!HbPG_jPIl^zXvxsGX6w0!~c_z3elHhQ6BETaRwEZj}lq_akC*QPBrO%KQ zIl;MLhkM}6lP75Ryq(&!W=93o|C8(%*AIUYF;CzmNV$PFFaN!oiXPj1k`?M@wl*OG zRJap&3M~kszxjLW_U~2asi!a_E#dVcwaoYl7YH0>5LmeuV-ktH2L?^75G}HRMkJ#C zez|U=$sUb#&-bdp1isGCulf-67TUdA6eO&S)HiC{?ZSTK25_Wo#b#s^8WiL`?~E-m zA{V96hK|M=aM*OF4nHHz(_JR_*h zBJu6yg};p3CiAYVvMxj~>`r`QjteWT0$gag(_ca(u@rpy(n0-a1UnLh>&0ie*YOV^ z_C10h#zEZZ0M0O~pm%i~C(vZRR({R!m;}Ci(IjqtPSertN@y*Mx{~-<_a(uVh(9sGI3B zZr(fgxHA_0tT=UOHa8e33#Cmm!^fauwSAjCbD3nqtD5Bp3>+DPdPRE{sQ{*Duqeh- z&#|o(>(L>FD=6drG(Z+ZgW zH8kscXOJX2epaF$oTL|5{Y1iE9WK<>WH2eujdHpos`UGHi@$^>kbcr<%7rZWw*p4h zC5=3d@h_R2jK)IsvA7EZaeh}9cAwiGZTBo#F-!%?$>f}M;Vl& z`2ngrMyKh<&9$+a-L0u{*eK^*&2-@ec1%c+^4E{?WPzO!2tLkc? zR4Y;c{Ixo}x;($M^8SXVNE7izsP6RQq5S&J#?IE->h>s-zjvqMl}`bp^3b*QPAPuWdBwJpY;{N& zZj4H1eCdpx~!Q@B(v1TC&oKJW@2w=5HgB83z{*p^$6q%-5Mfk~~SkE0!W2nE8b(K}2 zr)tm81m|NRNnIY!T67uB35gJu@RF^qBZ23Vle#%RXc5$Qlf!n!lrk#wO884Q`5^xx{Zk% zlFKT7JsdRfg|;%;Oam`Zf@!K^oO)4i46Y9!I9LhlpQ9H{yIN+ir{O*Ne&edEYpnc0 zxUPE|l(Y#*pqmKgYS1s%(#Oewvjom>geZTOJMEO2BA&3X8xTR4gxLqKJ&Be%&cujN z@Uk5-IYio}FT6gerI}iId)H=XO9K+}*Weh<3C0I~NyFM}){tBTDOtfxzt%S$gWfsT zKg?xy8bU9z%W3PAQpCuh%qaXv@+r$IskH~ntPyv#su^PVyn5bcA)Bjt-Zn(!e%srm z9}mJZ<}QVKN6HF~F!2GIIizV%Vx(m2YIk;zQ&Vi1xcg-*joMElLW8kbPu-@&f+nd* zk(>N|ggPob$-+FRiu!gsV>zLY@;O_imNNXD|I=$~BW3?*{Y=tt($@8p5Fa@AdXGgG zc2w&Qrerz`boF}-v8EU5sT*^*!>rb{{;0^B>%)J}P>&BCo5Fftw+i=_5*GMljh%3I z2G$~8{%$ssb|UVsUr9R>n0()yljl%^=0g2^9dl9q7$QrqYFrmW1CR=`=75~diBQvI z_~pzjJ@GPuZ8UAx$+KkBz%D4tcJa&5;}39~Jk~?Z&e=-v!nB$ExngzDT{r+T@EJd3 z*D%jcOO5NseBC5(E28hE?WMx@P?sq$T(MfP-Rq92 z-3OL8Lg)&g?&z3&wNKB%^N4@4KucrtPx%~)JTRLABeg_Lcc|Jv+6R$wjzbo4JqEym zYXJ(+B?!CL*Rg+yW~*pe!kB8d>cN3~ew{rYFUGgylr0UR>^B3bQiWoNYHe(^KT{S0 z=}0^wn#$aOs;ZyxyLxZi<4Ka!@XFvXOIf=OKxlW9J8ej*xbYZfatl zpQqQW>HEF<>&WLN{mHyVS?(&D zI!6WpAs|#>H)_C$zYp}Ia3^eewU2)sTOy6cPlAOmvf0yk_TRV#Awv>a2=m@t{Q2>`urMrc<2I2HZwdN0k2HlF$&a*lYX z?(V6LZd$#JoAjFpRMGA-~Zr~Wuq6IyHllar@J zq-k%&&c?T$3<=hV5e@Z(kIz?H0ZpVoz7)4m1lVT=M!CJ`(j>9;#{@cFSbh%V6gNJH zG>O5?+UeisF~m!_bNT4gDp|8wEXU@m18%Fh@Fg*$4gQ?Vf|w?aF!T6n{YQ9txF04B zRyhqCfw#Sk7`1wJJ+fCCeKey$@(lIwo^k5aR#zVfpe~<1N4q<_GA-xrY^6<8*KJkW z9V4%_k$8XApBCH#nt$qwQWZ;NiGeece>n4Z?3GiWawf=w&Eo7-LryJFbrq;&(T;GY zD(Ql_zD`#dF2Qwdgz@QGy5&2fl>~cjj~GsDFdhOS-a)TV6SY&<;sgbKZY;zIMDm5@RR?Po2x~r-KGnb)3-$SXAQn=^3rgEY zY)UiwPjWCm6;w4W5(yf5yV&>SXqJ^%6!@8sMyJ~lo}OK=J=cBZ;oAL}Mf$CPw%+5` zy+!{k+ggoTMW=MMw5A%ZY%t{~Sl{5^h$-4RwqyMOFo*ni2QY4Hn0?6$!lZ!9K1zeC zz1!uIDrCQty+6l%^hd?^yG0newiffByqWN&@PSMNy!@_mJtv14Ub9_4LI}|spmowTaLXgV%Y-1Q|JIHj0~{2=?*_3A;mosPAa;%GKP62R8j%1L?AMnU$723NL1CqlOqe+3%S`h z2u}F42o)?Fe|_n#=ikEA@<><+7io+mvF=$2qJ0vD8*_!ACAynDLzG;3TuKCgxQWv_ ztnSjR@g6$*$gQyo75R)-s)5Zy58JJaaq_8tJ8fxE@cwMOIa(|9td~O7*nu5hUW08^ zt0~D>7D1DeLRy_O1Pcp%TaMkfW^qP%nEUw~0mC^N$9YqhOXK&C)R7-41Oc_3uUK~&ofq+32#iHeGVt9t+uaWVJwlaX`<7=(TCQU|0it|>&Su#2KFcIkF zngtB(IK4kSbL2~gdF_?Sl$g-rr}N4yV?>neQ{S_(!hWnAsxQSl+G6WKwun%vVxs#n zfB~lAsvtzh=dEisSETiv7<)-|7-uhDUmn^koIwDQBsC#cKtvWMcZ6oi=use$A^(Dj zm5BHqyu4K;_S?{3wSqB{5wZZp`1h&wBV}VNCtY9iOc}WgXJgAtz2Np{3`M*5CtV2p zkB>)Dd%jOf3Dmg3kWK`(vkN8lzLAvph$CT=vMj-#EM&ZOiX_}GGIJ4TlFGtPc%rJ` zDlBIK6T69^|78%GL`I)xh=uV!pDU^}MA5GfF0AGK!dl{JPU5X7bl#AP%{kTDp@muO zEK&soyxHgVZxE^#QDVyBx)Ec`_U>1SLhWC_&;4XNmkuSLayUq&_t#^}@Js+JpAFkF zBIN7n@!aTRi1lo2!K7;amkY36{Zi|Zq@T{R;HB>PPH^*GN6%it0ClV>gZ3Ax=a^@c zMeO3_4#eDHF+bQ#3~*{r(u45ASMF$|^+o-mx1;TC7C+?wbVzmaVtj?xuI1nO8Ei|#vMHjfEA5%t4k03O9Tb1hmk zD7Y1u+gT$_bW2UwA`xPj!Za)*1!up37{&JD7b4Y}b7MF7jUXg2EDsuZWFZo#WP+MY zA!NfSV^U_VjF~^@C!_msmnU5w$v34o1#(+utT&F+*t<^sSZCf1PDX>fm){ApnB2BC z&+!@v?(#bQ@`ofY}c0bPJ8h=@s^`8jms*l${O~&5b67Nk(#G zjhx=NY{RNpFrN(3)GM`lg9F5R=oWojh4ozOpEU-KxV6kbJBS=~ksmQ?JSDjEE^_1+ z9e((>$g1ax#!vstA5`op^LX(t?Qbh~4Kd7p2rV(E^pRkzZ%OOAS!Rp>^SwTwt)N<{ z*uM;EBq8ICBa1R62uRhb*QlpusFCZ zy5V036CVrM*1-UmvK!}h)9{M8*}_!I8eob(dc^T70jCY zb+XVvM`4n_h&|iRw07?bot^l|;~rW7)QcXAHta*&$g`9g1%dLqs)65QG{9)V>R^|F z&Siwor&{LGks~a}y zwuk0N@4B|Lv;m#^Qm)tYQEsHrWhMvjrd@v8LsYi8@Bj}4&p^QqOZik|>YMzgk5^Ws z+_Bzs?sA(xUxe@Sr_^M6%|mAYpfxbsQLQy?Mb!!eyx=d5oluEol{ds3B8VdSAHUx} zNY9N7Jm--AC5bW+UTKGr;+@zHqwa|;W3NynnunkAk4nt!vhrdynX%EU7|-zx9W*pd zr^hE5Tj=$;sq)-X9-rgiGBG2`ON3qgW-A!8@uC|x8B!^0DF}cFRA6c#BasUVFi6ARp5zpN5EXWGwDfExnFw)dY`(s|ia#sbvZ{Pn2=5ab?CVhxdw&V;be^w2fv* ziq0Bt`hI>}Lzqxw&H)cyH%os~{9Erxx)cRtkLomA&N6$nz8f@gCa&HBzi+NB|`S~u{77V|SU^C2WF z>^3a9^6)3<@G~chEi>LfyyqP_aBC-F-K<$6mnX#uWidB}4}7y|DWU=i(S;t;O*Gu;@;WTb}P1TpH}A4?6lSX+~MlOZSG9PJ!V9Jo*s;YMv+ z<_t(b|IZEQJH(JtZ;G#5cBCYQrOzY!!a9jiJM6#kqWsBq9B-Y9D5?)3vvl=JF9Y+A z2(Z2lahX3l?_(dP8{T0}H`W9NClPSsk7jOhSL&mBirB>~QouG!*s_{KKM9mV%Fy*# z0niO3jyq;E*NVc7I;E@J{wjEn_ zsSavX4U=JPY$B%75ui3O(&R*&erYSIy|s^)P}MTU>Ztv_%k;H!Y>Y`)t-a!l*vl8Q z{kq{y@!5_i4ty?UBf8nD5juMM$}hpmn7hPqcRNgz4GPs0LnD>?9UqE*QON2xdPpl< z;_7Bsf2cZKR;Tx+tGznHgI_ zE$gNrtgLJzF8sZ~Y-qYJayYTB4m_ecSUhc^QK5%gPgnMZy83G<%{d){nWnBb40??E zA(s$Aq^fm=rze^-i>cN+^7b3cbvp6l;(k-pgz9wXI(bUW&jC;i@82i_4>hKP7c*;8ix#Y4?c43wA2t;;qiH7$0Z?Z6+)fZOu&=tZ4x%)>cZ?dHcJ8tt zeKmEmh7z$drdOt>l-zaEpo$hMxNx*m`5m_{o@+lk^o&l*^~#NEX^qTP=r!8;+PgP@ zyCe?^ig9%_0^BlC=VLp>z+$XN&48lgr_*` z+R)J3?^Abic-1xxj(YI+>L7|6+26CW4}%l;w`b~rhr!@W!bq}ZUe~nz$*kHuW5kXt z+GALEew=@HVGI-G0FOY2(96DZd`wtbS*igN$5YJxl-6SrPb@xV;Starhm^KU{e?{ib@qaqkg>h; zOGV<28rxEe#P)$#O*gTA0!_jI7%HID66WjsJIn)~+%#UaVq6I{%;@#?o0c~1rDs3? zNYkJS5`y@wJSJ(3?<5$ZB2W6&U|w$%53!<|DRyW_v{0iEG-8^|4@Gfz7uX;yYuC2i z8x#*zmOuxkpupBU->%@0h>29xbC`Nd6OZ}CoUKdB<6j(gh3f``5bvNg6qU7T zg|uEp@Qh7K9K&dV9ZNgWk##GI8Y+--}wm0YBUWT zPw%@XtO`Lw2nNHDmJ!Dz#1KFm@SHdnDqB}u%CeR;Gp*iGv~mUXDe824?QV>lVU-_6D*4BUTb zKvbiWA(r{{pI(aK7>||6EA2EkH!e{8WF{>7>)w>}=*7t-CYB(pSVOZcZ5qo#{ zUKqa)68f)Iq`yF7r1@{)HIpTZwCWwnKL;yC^>Hr7SlGL3io42-%ge7M^f~mm`;09P zUX7XO%`8tc&(9s!EI|sag|aob5THmwl45*l3+y$H8$iyA%l9mAF2~e|Dwt7jQ74fN zd1TJy29Hr%L{Pf5FWNoLK$)xM`V-#7_hoB~mLLyHgT%|RnBIs^H$JDN86r|HhpSS5 zvT{KV52Wr1Q2I8=B*GS9gxeAmF;SY|0AMkB*=-`f$cO=0?9U~bRNJXgjF1JvR0HNN&HVlewsq1y+{foLC*7N32Pbq#_=2@^CP;Fnlv^lN2+$*|6kxx(s2j zK=7U*(?u*#XOll&wGrN{i?~S@&E<&tQ_!*FP4%5v`taR2m8IqN zjb%nhI<{kD#|#Xc-gLtPtQbUmJISBc{4Gw2LXCPApOq-4A`fh=k8P|G1rwdWn$INk z2z$gl-=D-D*NP{6##Gkw>?BH8zQOlK4PbH{{1PTL7pkoiFUD~)6whA>9&B#CF$2Q2dGS|CI3H-9jLE&8%iM&ru z?u`s&9y2+oq2Xyu;Ec8-31)pKzSW8*LmcynD#9jKJeB;5{=nA0e-9=T1pv(@;$3XS zc2wW$vI&mR&UrK-sNx90K*2bjcvGM19Lj1%p&2L;ZIPsnG7$zfg@2M9Szr;g3=+Qx z`~2;wi6);t`+HRI#P?Lh+H!EGoD0DQ&OK)=TfEIMwT)EVWJ4|Oc&4Vs@bH0+vF z1CN12AmiKRIbqJ%#x@7GE!Axln=PK$Uwc;@Cu&8B&_M-;M^gOSL8N9f)Hv%w1=2~v zJ(~k%xUv##Nc2V7qr2EY1W%ER1MB*ISk|v2wzA~;94WmX4FWD^nux;HNQA?p(tSnfj4FXhykV z|3bS5`=Vn(idACa)DF=4tZkO=`W_qq_=4`+vwF&h>|Yo1yJI3}G>#bD9-aywKa_U$wf@pc+3 zsjs&zs>DkyD3fnck-)n!9|e6)w%g&L5OiB;NaA*zzHnIx8e8{7uZTP-9yuoO8>5Q5 z?8zX=LuZf!G{0?lA~G++MTi3B1(TSf-#J=IC;B;K=&uNUJMCgJb6bt#w`I# z+np?QvZciC9ao;6&#STN)#;TQ+}o0h=PfxwowbmgW;?&X{t)y#by^I2RJ;z82_dc> z9~wbLMRtz-Xfn^qhm(}W(arq3jCg4>pPZSG5nX)e9jM>O(IS81xJFXZ2*-^b7t4|s zoEMLLs88{1@PxSa9axdZzpq?CN^^9MrRaq;MLVtPN}ZzHWhg;BNIp@UQs3uWn=NP ze1~n{dgx+FXMjn1?}d=vdF|5FPmy(?PhtPoQ&ZlVDKdRrf7@~B8CKFh#DwDhmNoO} zr#=YW*%_W_5v!_b&a^pz>dUdyNzFH`x;;$M*$Fr3od9-YIymHRT)EaMZ!DMXCsB-` zn72f1LfPj`@xC48XDLs^3g)pb*iN0F8Wwbxs@*q-+07&s?* z+;ZXeuiW#tsIydiE!vD{nHclKJ^Jl!JQMC;RIi{mtREVS8` zQ@(4q+sD@J-Ok5FBMIL%?^L>pCOd;t7C4&0(BuYUh^dDBCc?qFzETVT*SenQhvZ+FZ_RVijd*N3lhFv({7MUyUfM zBh$}w9g3dFX{WYpQ{zv!gnQuz3`1Y6D|9_$-TkR-#5~27#p)YAjZJyqx=OuF4hFRw z8Q+T%QiF<2T94*M2&rR&xi`NuV50GTuCqk*~Y*+HReR)zla9OhL%|Vbp z(F>%8J_-KDBG$u5vCbI++CLB@tpRU5cu9C|!rd;A!8{v(KHo@oL!qU8HdNH?g<^T& zSyGjr#XsqD4Kztmc4*hml0s;8W&fp^E0?&qr4X^16!Df=8pb*7QSYO>xN#zUk0EU< zwC}1~Vvk-)@DO(+4^Q#jj*a_!s;v94=+b6c|aecPkI{jHEe#b;6;* z*5HfTA(l2{Lo68zb{JDi#L4#VWLOksBGlRhC_4!bE-T{!Te39$!+k}xij1F zGXtO%YJ7IKKTjKX?r@N6ceLoaS6}n)zWM!qa~x8cKNn=;f_;;&Y||8j8!jc$igR?idmc#aEnz z%>8+@J~HRFd#vwP$Ak7JDu&xkgAT7BHodD(A5Yi{1kA@J$3H=%y3I%Ww^m+W{*iiy z!-Bi>($;xrr^nt;jyKqxhUQg>g|v$RxuTc*BQ>}+=ZC9uq&GSt(J2kj`DiY-{3kr` zu_MofWjX>0uF2@v@WQ&lx|d_$j1N0QyIY82qOa1M@+ef0@l#DMc^_UgI=SP^v%bi= zEZlB9@qQ*aKxCcSV-W5(A-ZI>3MFuIf8^!6aAXm*;6dI87gsjO!zUl6KstRi^{JN($$rb$mB5S#8`z|4C{AD`@&KVHUjja%Yzu6Zq13H{wit> zmq!WndyGx80T;f{MSf>Cc*1VsxOh!vui8+_<{}G^yKuGa&@cYH=q0)E^TR^1Y;EP z40Q35D#|;-CH2-hJ;|ClORAdYvZ|v+DH8Qys%pcdiTs64qKM-ZT0HR?&wlV|Ve$U4 zIQs0>E!moqf#N8`;9e(n@1Y~rQdD8-=VokiKRC-%@xGvE7GEPdSEfRX;e4(-E7$wN z;@8x@2>j{Hv1Q33F=L7hKRq4G2JE>>`21kD!@_X*n?hCBDHHcq+)x_SQ^*h4{S>kq z*sTO8cSf=DS4UPf9hX*psWO0Ky49e%nZJqY&mndX(fZ;qzFFzr?;Veea%sO(SG_Td zjUN3jFr>%+Z;7Zb(P?f|qPP7;-X50k#dO5@r`we#VBupvcX$t2AjT@?sXE-roOXwV z8{htU!j{=vn9*?A{q-=0g%-R2ICXix@OCDJj)a0m*ywGgsEQQz^E1P0P);9eM~Y2^ z;mP=JoQ`0t=~?rV0_PB1uczU1>l$1V`f}%1XTqXG;TK_O zE2K=58o)}S!@%OXn8%}b*GV^a;kEAVf5#^l;se``;O~*Lhk|gTN~q40%dhSBXAI+e z%1Z;?^n%qBDAY*yo%)aMZjyt-{Tyt0Ij`!0kq}RPP=X6n;r1W0IQt2pfGy2@;?hxR z9K?4S{ppELFG3A+;XOKEaRodv|6gNv3-&fsHd_V@Aw&v6&oJG&V)m)`(*!K+Cqok8 z6{hJM)g(!GJ(Q$??8uIpK|1+KSrRYQbOR?}rI>v-Q>G|le?n_JBwdysBewTjEpv#; z#Ru!DoM;3keHPp?J=1~@DfVwCW}R7OVeTV?@T*87=e&Xt#N=0uNVQ`h3gE4nl{-|bTfrXi_{=yqOWB9=ZzDJ*w`{YX;kggitNRgYZI?`ybpb=VCgekA za7j}kH3z2WHiav^M)DJ6#-f!pv$frD2-Su#@CN4jSu()nOSYejz2ko`l0YUJcSVKW^=k_sb#cxS2 z2V2?cr!*lFbO)m*g&Q{8sthYjPPKWmXaET_1AVRbD-nyRxxVxKGn(rG zroS;EQ?kYPBae#>wh$r3NKwxLRHR&r44=X`l9b9s7H7wFd+2wZSyisZjMO z#lJ{3t-SAEt6{#vVhf{OY%u0R)OG*@jkeV4vyYc|Lb3=pr(fK_uJgp6XF`WluOl+; z*9{brnLr2>c0Gr~^2!Ygl+(XWGsr-keIhJCCND`b3em%sSpwb(WfCie$RuG$PF&7; zA2NjueD4yp$|5!sC87Qep zpvfQtYTs#!+x2J&*4HoRQNz8R7zu0KPIz=A$BrJr(!S{S@Vl)xP`J^1USyTeaNSen z9coZw7mW%`Oq*fvqt^MjzGX=d$QmT zR{9;2me+4Boj=!SYqpMk6pDt+cxYe|c>yOj5sR-d?cTI$zffGhIDo9qml+M9x^3+(4?-{# zTLQ7tQnl;qVu|^Cnc+_c*ts}zTd$9X53H8X(4@6IxDq6az&MLS7H)UXT}sSfxH5Fz z06XHVpLe=|3nz#sS~2y$?(%YHYVrJDE10rq)mR-Ms$*njs7`L?MViABle-l{dzS`|%Yw6gfmW=(#1#-x8*9 zQd20v_VP9K*aD$HUP5;auCvwXkotyUopxx^Lyf4F6D|6i-paGpJkV&@%4C<|+#6Dk z8$%fGQ!ac}6T0wvN{2E8I;C>5SicNOk1H4?(n{GvMm{`nz5sZ`F(`F9G0;7Q zYjclT^FIoDVkfc**06O&pCYc#J7E|Lck-Rv~Ma?zi|ym_4iu zc$bQctcIL&dZd7OdleD^R^v|$+>?P#=DTj-JaY+)7l6rkUp$5)O_rvRF2to=-d)#i zkVtNqk)PiM##s-75GH@l&(F;fBi$u|=g%Jw3k)4(WB~`H#uUdJ=zO#8H%^lHXPYTR zLWm5yd`x#8ME{I?V6Y$$f&|VQDD;h3$}i^=nhMlN*Mx@rTM^HdVs@W+`GL5D+a=vpLFTdaA4srI`V@2jZ>Fjz_o%lse|z=IE80k}oDv zW1(zcJG>Xg6sKq20Lu9vU+404*k<=c8CUOYETd)}UX0aEZ$7-ei##tZUR3W-=oL#H z1f=9mlX8?Me`WU(CV2|E45B@y@u5RgR9S^dkikuU0*7)yq zJL&V}23;&GFN@nu@_O-tu1l75(Y2HhilG}UUB(VMhmIvNs{B1?&uDntKA|N|+EItK zpql=Sr^v!WKthC@O0AXKrom2@$8L9Lu;xe|n9*#)Vb67|Edl6P@Y6-e>>V_qqh4`NHb17MkJFFUyG?tU?OxzzWfMl^( z9ks4pJ&>x%bdW9pVyIV9b%^u-QmFIYq6;p$ z+yR8ukdG^Gmd5sMRtU#HkS)_+Q?Ygk2GT&$tJb~x6cEQg00!Txp&c6k1!&dqSKYg= zJ?B{v<89SDNcj*iLWc;%g0R2VW%;s}M1wV)A;}9Eo4BJCi?5qKal;ulUmdzMPVY{Q z01JjQw-A~I!Kbv1BXP{Mftx$ODcs2l>RI~X9b5gu*_Sxqj|-6}hI5)P@`q|Z-AgW> zm5m{E+x9K_BW#DDqf3 zM*uT2%%~6;E(uxQ!a- zLqq$AHdJu(=rBOGb($tc|dOHEw*@B%A5iSvS{av-v|8gH6OpVh(H!lOS1xauH{6^X-20;Y$AzIgXRIooCT13-#lk%^FwSEs3 zLQ7~Lf2w3JXMVuBK>FiXx)a*?^=o!Q*p0`kRp`Ybr=~=1`q}I?WiGNPZj+iT-<{pG z@#pyC|IxP>f112pDUBfMSBx0a&~L61@@RegF~=8S!(4*IL%1xdDUMUG4#^liBv8yj z|8Y9A+5qwtup~R7~%_u;tNRZAF|f2*0M#V zUu5cojohC!T}GlrM00x{R~w$4nWR}sWWP*67=&@@YH?;DxO!@M%)aYMAYnD;EB$eQ z5wQWg>eS8gPy>@xxkcFZ(r$3ly{kS`JVLf}+qJ~=6xOU;or?tCPgHF#>veCS(h3R( z)vIf2+r|;^y*yx&F?}hofG_>N9=4n?pks)P*hiFz2TbfsG53yhp_2WE>P<2aWs3iD zxztruG_=f%KdM=oOhFb+VJ8HP-EsnNH0q^dWsuGLHVxc}3ama8cC7FU-~WnoV&JNZ zk%MoF`KEdFM*z(Nj||w_?2Qory0r@K$6kIG^q%Tjb~%M??*iOL2j5P27-F|~$j$>t zp`gX%u7C_auTuH#{~7@Xw$9&JS%ZHMdOmtkO56alo#9fbSoAAzK^ zs8DC@!!GS{)b=1k@(PX{&I)VqkE^!3z_g4r@}en-2y)R}LJM^PVdpQO+stZ8dHcTuj$##;8jQaa%P8#PneVbneiz=O_SFS` zOVYys9BqUHuoN=iSb=e6g~olKr(S)A<~CvH{fU7(}c;)mu%wyUO-2rRi8Mp=GaSquRQk zDKa$RHxI}nH`TVP^k_KP+){WWP2mJLWVS3YGHvP=GKV~NQ2iQ?xBN>#WI~m4TFZfYIxp)e{!61NK*+z%;8-$N-gG3+DDi?5owZeP~lcdc_4VJ3+YgwKBQRDMZg0@1Ku-F2D3)B1Tle}h~~;-?96 zoq}?ma`AaAiaTDowelT#F@f*;^Gnk1&(6CvdlS3yS3k0yk)yS5Adwq&r15)3P&RQN z;eTDpz)DY!{R$p&4aLPl)^`ka8lVdPjW1oc2O~l)4sQ&Rq#qEba;JBx%B%69cs0~4 z5vZEm$S!~+jKMhNE#{toiTEdzy)8kdDG-D|5}x<>vL3S(<%m{DF02Zs!-=B1*VCNS zZC)=1ewGseTG)5tucm&W=wNwv?@X3iHfke*Aq^gUBK7(`fNUPj3Ne8wVE>hHndH^V z^iQD-6xQP3c8`x;Cd9vha@_t~VM<{LaDZk!gY3suD)8I5YLHsjeEo6I=H(kjU+gJ`akDp ziU=e@AQPVfabU~08c7VhamukY1ooN7%YA@!R{3^Q)>o#W+2}+}Qn@mZo>_n_w5;rq!GujVoTmj6T7TZUEHb?@Gi zQc}|0EILH#X3i*~c0H<*obf(6eI!+z#wZ%!0s~=#xL4<`Q7Y6?Ds_6WEnS@NuDJ0H`j_q2V zy03mpbghvCL4G-A92}xv>NGjLf1hgLrGxCh5PSPl8%Nw(kbowX5#;lf$C)@EU&N(9JHuE6v4 zmk=PPB**2(rE&MhiR_;*1bk@4zd`PktEpdmHYh(@%D!NLf!iNGcSM8-JpI5{yC zD+i>bDDsF%+uXS+#P`?YC~bJ`!%rM1k)2DhGVZD<;pst zG&J`57{Y&deej9K!CPX)$gqS8kjMc^#0G2mlYxQX%3ul@0mk2MB@S*!L^kY8gDvR$T|D|O=x=UA0tIt{h8?;UG^tD0yz!C{<7{}*O-*@aQQ2X z8vn^Bq50>-5sUmK1PH<93FhoDqYIj;hGgCOBx<-aL;uAfygpOF%k&G(TPc0O@uxIf z#+;S=pZIpPnQo~Y(1Qs<|22$Ii$82YCDaN#n=CRu6GwnVX-!fSs8E36{OujrX!Tka zSRAc!;jcPC>Yq=4e?Dio(d=ujt^T~)KXAybS^2xJO^*wE5tU3n!6a@z$@u|B6QIl^ zyw<%DlZx~}_^$ncOVyy5$KcQWXLt?M!1;tn{j|G3GetkfU%Zowhqv{CK1$8$*{4?{ ze*atF--_6OpCCwb;GFF}Onk3;De`H&P)m#8uomDVf%6M#Yvv*C3+G5-pxfur_`zf% z4cX}|MZCZ*OY)|tyXdR)a*}!OepIYb& zaMaPMJ`0*A8YvOTL&CuL_Z47rYX>2AqDl_Fhb=@1&e<&frch0rEbE8{Hs0v3M%~Ym zKtN@Llu&w;n)YZJnp0@@6}vPHZWfFSC~T^za9kM6t_d3{)l+i(!}`->)5twUPrMzg_vV6Ac8o zi_J?m276vB+5R~$9geS0Bg!{v@5)s^@3SZ3GpQbWY>CXu9FXMgWMIv{636DT8INua zTQpBeGGFS#{_xWT;Z*ZA4qp9{fV06^a?EfS`w*AQp04%b^g?ALNxY?=?EngYaRDEo z^s&tv4Z{oa)?wOp3VPEt9?Av72U>HZdow}wQf|myKDQL z$^i-Z?5lmz=QIrjXE-a}?qH+VH$M2BhzgbMFBk5s|BD1pwnSm=$4^doRtITl}CQi>5tcT_~rb z1{HDMnU^n>#I1uzDCaj-^dk$^6bKo)@Ss0Wl+!qN%ox6m3+~W4?)SmO7`6**jhRHj zqy{2s6tCVd)|3PsTCi(1I@H?uZt^ZtCY=fd8LJ7tRA_G?Y!&bWw>JxivST^XCInz2 zxxd_~saNRRBi%F1L>3_Tj}HKO`K5h@;CjFt7h}!&?5^5UwP<7fWm7izs1`1?)Y z6_k&C)aig-c6VwRisKMP7*J`A%_MH~#$pdpsM#*rDi?q{>e1gs!wmHOE!gjOB3g|Z z$kWrYV%DTrR!nQMna%sXAyrQ_N2(niD+6Ms{d&@Hjm9U=(?GVr_q281l*60FU))2i znMOY6wagclJaDUFSyMsUVVupBN85KS#@=#Uv68YCjRPnas{EeHSysU;<}{I!rCgH? zOzwb=(I>4y)i(?N+W8VjEA-t&R zsqm;Ba7ZZY(~O{ZfGY+ub=EWsRLX;vO3+hf9uWwf8(Rb3J~h1&L`WoU^#~Y2X##j- zKrB6MaH{I=+{$}pjd6Nw7_1}SP(D&u!nuagbzH++uT%R_dob+MvN#Q_O+dmvYLnOs zvD5ItC8*-%IO)qw6DRQk5(IK`%vXCD4`|!BfO_@Np%~idj_j<~;Xt$oZeoFqclu2Z z>k4A%Rn(1y@6c~=t-ldt67Z+onJs(2NgwF)Ge>6j7uol-biAEmU{#nq7%OGdsnTQ| zi4LM0MgCvr7{81-<21=TBSD|~U0F|yferpYN6Yg+imOBUnq;6$U8%&FkldB>>`-z& zG7&#zIytgfb`2zR7LEOLtp8_cW`iOaCt_%MF@|US_EJ0ie^ABO6zA}-Foto)iq6=> zuN!gsjs6cjnTQu(9+0nBWI_B}?Gx*h)dto)S@28$pLI1nqVoSljx7M@N*eid;=Mqr zOCR@@tnM=Y)|2{#N4K=yoh5GchHo}J-mR+|Ndfm6s5I|kc_n5cY}-|nZnhAA2o#=_ zCsAtCw{EbiR|F;*ODqG#9Nv@K-XG3Z)*~%PJODDo%aBd>K`{uS!#NLNOvYxOJgou# zk)J`F3N-xRjF_4)%%6;#2qjmdzBjzw*sM7-e$=iG&)Hih9{hmk>ft>ZRq^iXPd~!+ zO%FEUX#up%p6VZbhpXY09{Ovm>@wa5#`dsb%~L6 z7$-4f#zZD;Xvm$5i)xoVOb^%SVKpnk>o_CzX=nNWFFr4MtRg$Vv%E#@n={__ffn$0 ze^ieE=0(<5f6#mr`Q^IlX1*K%ly{nH)m~mzurED}cRyeFG*79!Jy1rRv}BId1^{g; zg>RdlHiad2!(N_>(>rm>`rC+!`$<@i-VYM2W$3zE6mwv}yJ|4y_q++y*=+jgil(_! zLwnV$ll?0kgX5|vn~ebc{vR6I<*}J82iRAKTPiMEb8W&{W{|0&&ii~Vxt={f(GTZs zf`_Qtx@lv00hMYG63kBDFUxdXyWB7ystn51+Q*RIvEXb82P>2rrv6ITpN|zfzZ@3~ zipItLX}RN{QLwIS{NI&twnc7iOA!lk<^LUwg+vGNiV#1_anc|1xKl`iSX%qvtVsuMD_G^%}7lj*zcx|EHwrQs-SeEkrJ^!*1 z|3e&8I;YuyJC`GXrs;31fd^tEu8Vdp$U_84WqY`ffu= zbQ40;{F|=_j??*{V@2ev+Joc+Y64o9xrN?Lv;sc z4cK8YDB1-}0{Z~KhaZQ%)7QXIAQt-La3uNH2qTq9a$MhYNj^KuJo z6>_KJ?oPT($_-SJE=bv$x?`t+u;A-1)Bpsrv8W=HTTJKA!^&H)?=|>poh}kz6K%Vf z0d+k8Uhs@<2iT43gp#!_Cr$ty&ZVAa+0#Qo4g=*AlP&n)K=^n;)kuwcJDEp^rkl4y z@rR2(2sd5Xh7jFRFftWyU~|pxQXNkbZlBtgGWwAZ$#JPLkYEGfD(=t1WS;>QCRQyW zQ%7fz5JtciwNM<+?j8{l4#~fj9+A(R{vk(vxKu0&{_;g6^n%6+5q`MiSU%Vyq$2;6fM)$C7mfm&xp}r(4JgFpLWn?8djcsJ z7nqRN%hOef^p~*$fWi1DGm=MIb_179M_%b`6#yI$O*=RzMbyB zx&Oo-l7;KPwVwV^kIjH^4D-k?F*+Lb_YoS&ymj9$#h&&FHsQ(m&L}KDz28-5KoFvj z(sJh8->(Bm0l+7g;|i6ed+XNR`c)-#4+ww)rjzX+2$&8a4|j_yfw<_R*6ubs3H6W{ zZ-6QqXLfdunFE3&UE8c8N8JX2Xc@~2QAH+?>}H9%VY`wN4rZ(9=_Ku1^YgMN`BhYjgUKR%2!EGyFhPDYYZipdbCZ4phYSsIA z;%xX!C&%uvtZ-6z^o_NmXmM~|-h0@V1-?_2&t;@FB6~Hkfm^{jyFeAtqGiSYOk=zx zj)XQ7{-ghW8PfTFjVv0_FJHZI0emcQLW)72!0HU`2N9_#vqxt`Suwf4is|||6Pux^ zqz-E>ZEO#usx|$0wz288>y=C<=E}99k`7MgN2iPuK8BUL-dTM53W)L6Y{on45{Q5-5M2BO&XoSYV)tjK^E zQAti#AxP~mYo<&O;Rpq#%3Q@1WMGObaH$?fasS>)|j$?;{p#{o7eZ4 z598PVJH`7@(F(s33zx1f-ba8gotzK{W&2Jl($UZbHNW%Yi-5I`w{ujF@i1}$1duR& z=hzP;$ecRr_v9%nZ5@dp(;M7Jx`(TmnB)d}Be4A}Y*)PT6GdxcFyb#fU3vAaD(2 zU@>Hb?~a`CALl2hQi0}Y_FVu%#&?Dzns>lhavaP~R1BdFI7a@mj9n_++__U^VnO@i zgNBlsKZcpbO6OuC_idYVh~;fL3DIK! zqnp#`&l@4{nFEY*;`$)7-%6nKGCEVJZKik&uI`CozaR|@K!RY#gUFteyN$f1@!%qX z%yoSO8%-PT-7b9oQ)EbeWGe zmie8`bd0tNjNYX~{g2XgJ+)-QVOAs=YI^>7u2=?W8u8{UmyvK?%;2?h1y}8F3X}f6 z=ZK`PGJ!&*ff6*~zNkZnvCMPic8a1Ao9F$q1v2J$s;KB9*1^*FR&q(t+fP=RE}*{4 zO04Ryss}E|$(xxzP2;eVy+p*Qc+|hmYP74dKEX!$iTsM0) z;Q6%_>gufvWn!82!?yo93N4n)F#~C7o^quJ+z5!X;FxT{9mMLg;l#PNlC^Sj*67Z~ zEt5z;z_ZpMA|K6NGhxnam-~@s6{YZ(d7`4=rQkObF;Ex$@%q*WYmE1T^!dh*0ayR&)4qe7a>8xBU(eTZCeV*n+D=Pfu%GMJ=GM`| zRXs>zwv~rQ;tu{bIK3r`HP5-GD|7fUY;J237pbz_0rrUmT5z2rUEbqPCJ}OAQ5PT{ zLI4WwNg;H{)xXmZ29-9KynFy6vXEz-^Qhu=OWFeeV*@m&$N!Eu@_w2GoCB+fuFIAb ziiVB4RTl2T`&Ia%21*IaO_O4<&>VmZ1^z^UjP3hHLi6EGSxKWs+EZP#uCo$}pI+_9 zyZNMw!ih`>I|% zz~{+gtNWCW3geTb;5jsyo=|spXfNJ4okjlkx+`t1D;v{d_R`52T)yAJ&4pE_`dvd6 zF5CZpqaWQEa?)qHy!_9M1x});$%9kJIQPT?wKET?#8Fupd`Wlv@o{S2Ft8>;@p*eL zu?%E)R5Un^s*4}iE|8+5Nhr6NJ8sGVk3OKjv!o!QAQ@`d&wX8{_xDfy8R&0xaB>`| zU-*mGq>&QNUn39}767%bUNt^J@F)Cu?0I^U^YX!VYiTJGkvY3}cP~z&U#c_;8(zbq zv#Ry~AgTKNPGig$BxkS$?~BUSW|OD3FIfWkkpOei9SoSM}MXShO>50 z0eJt=5BMvtD+{R^DMSa2Vt>-86V(Rh*i|!=V8Y$MQyBX5dkq(E+Dw|xEe}lUBPl1W z%Vx_NG5vTbhZ@ZN%7krVD%8|Fw|CnfxTqpUl9|en9?lTq`4t!jcOEiwmin>ONZ3Z4 z=jZin^0~%a3S=%R+OVdqO5tje%@Vf(nN$LTwEgkh;H;Sn#smI+vZZiVIUw2Em`?ti zDvX>orbo)t(uP)ZMR7vt`R;#^N#Y-C+H$p4dQ&!C3i?!5L68PI6RKQTep-5QyRLiB zwnOke`{Z#gG>qNTVQ@V`z0S;%Yy52s?1A@fl2u#JsA2i4sh=s=YvToa@?Fz;_G+)= z`GcYj401(s$k&36CBlXN=Sw%~qr8qePau6XIALh&q?^+iX zFfdAJge*TYlEz!Z-rij*EV=a&!rMh@sj$H3y8UVPHy5YVu5LFjq05a{lQ<85ec;x4 zKPD`xgIm@WZGERW3&x{Vx6I~m9^thN70&ORu}|4D$Al5(NwUnZa~c?TANCMoR+?I0 zk}4(%-i4T9_Nc$ZkeYsH**(TAzlgI35pg3s;QQ1 z9Pv)UoCW)@47EK$0=lp75)|UpU7vSfQYNdpWape&k; zP>YhZ=%}@06(#715|TpTxoYSQut5**#-;)P&IvCW8w(J9L3PQNUPo;FzU)dYkCASf zr1S;F!ST+M$X8DN^%hd=IP}2qgB3r_Ax=P}`ERbIv|^LlderAqX6}1XJtFiXOVZJj zPM)rIsw##lK_bvx<*=#o(ToKHruE!;OXgIYAHPSSRsNi^>a-0#|K5f117ddn=GqW} zT$>M_E5QAHQkw}_>6ik9so%77^3kdd&A;xt&*V(j`(Jq0^I`d z|4Q_kYVZI^I1(hlDfJI7v}?AP7dM4b>)4|x@<;ox2&hxm^fpspw%Sl4uTw&Fj9(vJ zQDcLdI=qBa+}(3GI)dsfBuD1TC6hze!i$fsdBHA%9oa%!Mgb|J>mQG`M#pxxi~!&z z=mSHs*0RGo^fftveWLwh>uO|Sz$=&{6641w!aihezvvErU@&t;eY1TiWZ)6xL zRXF`TFeU4TN=(IY8OGtpQeJw1(PR~4Z&dlFJ9HI_y8+pk4sP=Y}vjLfxi^wBs1T;AgP*h}IWOc|whGZ=` zNgw^gcCV?2{a@8hmF_fPJ_C-Ih|w;Sby|h`7nlAm1%cPG2O^!PXOD7iwe@+~+N&&` zF@hWk&8^J4Xk2Ki2o7 z{3cq`u-W;t_K7f;mp!7)8z{nP^l|bFbAYoR@}&cJU=WP*f@Rn4be%1vHrwL6IiO-KFTZPO%ZDgi2S5MXxdK8Cy&id4wVGwP z>^UuSM+ApQAri_;+VBlgIR%aB*D=rSRs1wUJ*{DM#k!7QYWql}g+POcT!s=g^o!m^ zE7J)xe4?b_oFR+EUJqLrAhD0b-pbQcN%`et4ElgfUbiO}^0lLTKZ;iGP=tGlzTLse zez>d4m$Dhm`1n4GgCkQ!*q=*vftZLT>{M#b8XqjbeFL~6Q6lxe%cj);27n^XlqocJ zTbn{cZB{dvb5EO%in?P$msLy_{{HDTVmFxIj6Ik}LVzM|%@hhMDwS|&I&UPP*jI^; zKG=Gnce6yn;jyIi5aq0swpVQgcGeLyHQ$Z0?kQ-}Y0q;`;{1;m(0P5TebV(A*d9BXP{)pagw4uq}92aVZ)>5$A}a+y*%XSdhG z-0&&@H}{br?-@dhSfZ3_TG8>@0Xgrid~08B@BB@%-WO^h5aOH%Ix) z_)8#Ie+-rp*y9Ywp&u;^xN<`+nq`VLO6? z+2~U$KQ^IT=1h_lNlbf2n1kUR+kOf^wyK_k(428@w|4#8b9NfiP0vfxSdmv-*z@!9 z>hYx0m5ob&Ke6H(J;iF6r>0`=jKWBxAtbTy2fs!`w@};$w=IaE+|RMPyj`RO$^*M@ z_)=I%{=Qwwi?y%@Bk^*~odvNYCmXJOdaS=iY|L@)*mf`AyBiHrRe$XwvFP~g`nT@o zb|S;iVX_Q9YRitCz#QikuE%!4CY1OVHV4PNHJRg;j?g zAzw6u#QxPJE^|9#ffsnvyZA^DcpiPH7s5p2_AY@0s+}jrz=kxF`$n2f1AjM4Q`6d@ z27;V96{~|d?QahQV8A57!}Q%0e6Wl^zwYMrxI+zL-y}sm8`pn1&7vauF}HtF4-OGi z3*M;#golKyE*Vc}zDyfYJMTY-w_x4B;8$5Hit6~}JXW2`UrHKWr#+Jp`jw2K5`m7B zjU(FS70lx)_DX2A5xYaS1F6-?K$rEJ;PO0 zvH)4Cfkj_GwN0$I>ES?xh3`y)hag9RQ!-%FU^zTsAJR*QcJQ$sBQEckOv6f=LiMeE z#vXOrtpIX%vyz>k7AV0`D0J{PdYt!;k+1&svR}1n z4=0%=YJu~mfR7Vl|4E5`8{)00iVX&uucB0Q;17*8dCk~@^a4$7ri|lZz)QwP=stbG z#=#_H3JWCSUmHfDv3@WJ&RSj0+@eH_fIAY5=WJ9-HntT-sc??n5dxKcq(ZpmiCz$UI@80!N)fkra^Mi2_U^d(h zKAG(F@(|%7-DcFsBpa%6HX-#-A~6hVnG9f~Lv+j;HS|*r51ahF@mRZP7eE1>dY)Mn_E6ccHcWA&2e%#1bWj~MQAhWc`OC<7wxO9(t;s!98lx6Uc zT$tq@y1AxBBmEQzVjLBQ)^mSs|K=t;$jcp+PLZDLMjPzlx~u=%;rZ<0B5D z2GZ11UML3<2QLyPtlg7R$6HF;^mpEJ=$Y*G{ZxKky*3+OV(2lDwz50>5yoyFQ8G4_ z@IQI;aJ^mLLz7}4g^UyxbOCfhSu7-2{m7!qi(cxBhgOzc=1$h1)M48AY<-mL4L$*Ykv5?CY#TU98qfQw^8-k` zhJKG71FqPqaCCkZc0hL&vY2ejzP1Rs4qM!SDOAqlBd|8v9AR)Ka3`cO3bHoFhNR?7 z?&-&7z&cKv!bi{_Ax*w_wDQ5ADhA09i_oI{_9pX0(AUD?g*nLiZD=o#-3N>2ASz7j z9^<9H1Fll3gultT{YtaF-fHS$awu_=bK~V^Z}a!=;4SeMo;JC@&^I+xED8Y)=^4~t0zhBAe zO1Z0=x+>E<>E?wYdbtd~YLBus-qHKVYeJXbH4-k!36X*pK>0QjPoW)LXa)}36WF|M8GEDImQSfzDBeGCq6QzuRI+j z^~)G-`Balxk7Co$Ffr^ukHr~s0j)*212P^ab(|gW``qr0MmS$PnByG!{v+%hLiWA9vK{MFx+9wEF}*O z{w0J^?ym;4P3eSvAqV{Kz;%haqj*Q>-Tn#n%ewRxaQ_Q_x@ zgwe>b;1LB%)Q&>Qa`dT&eWWd(f&BR%5vn5BuB-xNX_)bCt9b4VqgvJZ=`wGT_tqsp zQ|b?B^pq#a%}q+)-Ejpi47HNA8E!L$P>@%MKPwKwj6owink;H41P(N)GsPkQ;<_iw;Ijc3lWtD zaH3>1-=sIWord^Ga}LRA)wHI=3l?Bp&NkkHQ_rN;KMW zcgU?ecIkdwj3&gQ>C{rV_`btba;VsRjOWIqkttPj9q7{~W|_I1bws(tr4qk>R9_zf z4MiwHT+uE+FK=g)tLiPa+16W9EmTRE*TxHl#1I`L?%_eoi4{A>f!v$yyPsPQjp@j~ z+kTOWR0{)gp$r@fCx#drHWZd!YYxA0;{vko-k{v$f-n&3Kd!aihv#kz>X7-h@!9~) zUgUV9*RJgZ(uN%e0r@K#SZ>=V%~}jd-?GlW6}uv{&|VjuhIMmS7(^}hY?5N%I`&dT zg606hq@l^zKI(MGAW|J@VgOD@434Ag?kR*iQT)>fpxy8qwMA|WNxIi<04`8GI@~RO zByoVsl)MtKv1NyoNqjBPvSxkdt^@TRh%i>9QU{3Sri$@=Rasi|J7qO70(>A!N^>|e z9Q4S*Pe}ioTf)Rm!^OF<&(i$j(p!a8^=zz=wdUmcr! zzQ73ST4v_-P~&8_9DF#Lw_tfTVf*ydzc%6QdEkrHW@)({y+iVQT4BO?kCGTNVd=;5 zR)6On|8je((-2W`>!LSE>OQ8=Q=1csFi=f z8GID$3PE;CYL*LMn81)pV@TYkNteuH$NBmEYwyZ{i8Y}q-EpjmcIMadOpk}&aZy3g z#!|-+G!KKWbS0NYo8&jHP6O~L|m7hnIjkLuyUE2$>?xcO0tJlL1_1%Z8l1z zX37xLBrGZ^T~$RqOF}YnGna{R0Srs@)~9Hn%~9V;0X8PUc>zqKqOKr$$w%=rG_{$~ zW#f5F;(zdH|6(!s-M%Z}IwnSdryeLnH#ROAZSCh?GrrTRsFE+{nd1-RLC>F! z<32LYtyT7EMt$Ylkd}{K_OvhwO&J+57rX!io->-KZOnS?D3{OIF@^iSqaW4A)J9Ba z>P?W}14pkSAAEjwzeyGz@qZoZR^wwwLgv`zyAIXHNB0@l?Y5>b?U*Gh*hz_kKUPP| zO!zN%__+`3!x&o@P1)Q$wOdB7Z}?wqeWfLbh5~~EJ+zrxby^+FdIsa>l`Z7uZGjfh zvtm!ZVxEzaXk1ZMHXjDkPZP-OXs}e`^Lcq@XGE+;c?T)$q#>)y%rB0^>-t$NiP)Ar zdU{$~5N+VMFe^h2Jv}m*Z|r$STYgYbF(EK80o#YAf$yowQodo9C^xXNyYhbbPx)1@ zs`jM@gc1ADO@N29dvFjC@-ZxF_p&+g{nAp1S|5q>@~A?d-BFLxekm@B}URwyYcqoANT zIXlJHVk9MW*%_Pc+&*~~BK*RO=s)rW2ZmHag;Uaj=vh-_kc7ipQBz`dJvQr-p_>{2E87G=Z8|}W{G*Yu-6*Dj~|2kuZ(*J_^(mpAzs%$ z5@S!7@fKhd{Mxfu!P4jWT!oUFvL-;>GV7$$GZnMdf`D<{AGUC&+ksR z*r?iMJc?_Q0i&2WQ{H&EZ?U?6zm4L_!R}of0o89CZFd+FQc|&kWsING|t?l`J<}dhybjmF*L0eaJoJHGtss*|Cer+@UviIB;xN4p8N6UcjSp8HZUBOS*oQU<-6rs{LNlEmb^{H*$bO>FhFC~T$U0=?|ueM1xe)exCy*MvkK zHMZ|K#upNzV_}a3ZdCZyxKq1I!0CdjkJ{jMR-d??zmw^Tkb^YN`*aCT(sFuWZ@;=8 zJBl$uMWUK^WFM0EJB}P<*Kz;I7q<};^gEYY}<9YAAq@wL{s3i054qUq^lfG9u(rNMvL!dJnFys7r=E6w3|I^TZu^iti z+y0^zyI7vVjT3nG@Z`SYNzH0xc68qHbcP}q4!rA_SeV^YZI_QVnax*-bjsyk+ac6K zUAoRXWh3?Q|2 zp1keubljesoSoY|HyDT?r=L0^Ck~1+v93`8@zq{<~dzrh2~X> z`?2KhUZ;Rgd{G$|uuuZqYt3s)L_PSrwFXgJMbn;P@o}Zb0$a1BQZy7}K#50ffCFyiAmyVy*s8+{1E?MJO@!qel ztn$6|^IgsBEZMUgKCFL`wdQE5#4EK0<&!PWetb+OVA*4RoCyDEMxDno@)Z_DmdYb1{ zb}^_*77G;HOt-g(&;DiZ2y!Ssi7HOTOBRaVxRbk-WBuCjP{zLUO^uzMt#Q%LC8xET zwLi7RVh1^RNyOWBom!3rw#s|_d&*Hz_gFUs<~1V!}@? zJnisccp=}Q3jiBqx0xVuelFJk#mwrfc88h0t%Sr?PG1Zb!5JN`zNFvAKgS}oZYF9mlF-{7J=DYaK{S3^zWa$Ey`9mp(!A$KtlpqU4xWCI zWOW+=7Lbm$d;l6<%I$@e15cYU^cCO7x+~$XoG_QXrch}=%Hw=G>g9m=JyNXQ`t2Et z*WvqN^Q4nMO&6zKPu8uEtn^`?z1wzNX?XiHv{y6ittT-Z&oJErnfHs>v?awF8mVg< zZ*PtQ9Jg#+ULHG7#MSwp=QZlowUk{l*wcBcZk7hQ(=7@sbUJJ=%5<6ubA(>JHuYk$ zRL4=*d{3iAbE{OVb%#P{O2+waJZk#TT`vY!p51g$h<qTWq+5VlkKE`U1X|nZ7?>>CQ=$VRR^i`Nr&vEE2)%fjd8rr;`dH?{B2yi>75&&9xYw}mK z{{8<%a{Xg^Nk6=D%dVyHR-E}$%mBDp>W??IkC|DT5O81?q})vs5~bTL0tGt^bkRQe zF5L3G0_8Wa0pHjHN*8T^$4Q|gV8%_Zc=ufoJbsdmO*2xwhSK89qR0dR@Ti&!en=f* zJS2C^4&`Q({P3Di{a6+)nwq=|E1qY`GWm{k=PYU3tPk=>c*NIewj>ZC%fa*epQoJ0Vak8|P45|L>h_HrywJrv zKBI3~wKa^*{(3AUL8z&zLC^O)9na4`>^h!C#@twf1ram&pVDfo;fI)CPv%@1UK?sA z@8k6V7(o&^0wHLE#}_bfnhHk4X$O-9tbGptyF8b?lKBBMYOdL$>x73;0P!{j91V4I z+TW-?Dci;=9_IhHizXC&?=<-#OFcikcx95FaH!~m5<<2tBsTPIDQfkC9`WZfp>-q@ zGHSfu>oIJRaVJtmn*!8x>EJ-{rzMSq4P}j-)>Kfj8pWK={u0&zJem`_-?vTg`eXd* zq&&{(GP6G*a?Zknt)+8 zT(1&c7%1(4t2TK0=M7LdilftjXvCUcr7!C`~8$OqtYmWaqYYT(yVlQMDcMi5hqJ zDC9YGOqUr)=9CKObU{oshks~r*aQc5nZvUF+Y0+9tvm%ayHXJ^@xc9)W1hcbReP9Jj>|87{tHD81y8}utm0bOfLRadGkB?x75(XUrowxw%_8)+cV4deRfhW=&Tk`eBAQ!gUCkc_xUL z)U`|I@MX@|{e1-&PUS9Ds!N*)`nzZYeD4;C{#mACUxUV`L=(1)O)5G`8gj{hMG)oK zUhl`do5}Y{W!f5TE;OxX#r#z!J83L?Fk-B;iY}I8f{q(Em?avei8L_6b1Zm?Z(1Jqhv1Aa?X}3%onbGYJX}EU zUAxNlpy?F0n{J%{tYUZZ(|5pTYW}0~Grxy^tmROWEXV~iTH{hhxokmI`O7=&{V2ka zW1#?}rYgwR(@lf=wY91!z~sRGl@otiz+t10nwYqO!z44#AOQ;ZVcE50?RK(i4=~r# zH}n%d+B+~?oSi2~sg(M%6P7Vpw_PhZeBIHu3*aJ$bUy_$6vJmWQ!q!2ye)L*- zkMhEBPggQ$O!%c|E4#@ALhm8tWp>KXQQa@(0kn| zQ00+(s?Mq8&TFB^!zvloQGrn;|1n&{Z_8E@ybY52pHtc;gH{d#niEF6|Cy)mzxq4k zqGv*YxOEkoUz0LXML9`XS*$$NpjWd+l!MU81(<}Y=eBxtw~EOb-S2_16i<>03Ldoc z;}CZMQQ&DFP^A+g!EP;fV`H)qa~=Wz{!zIa^44Q{7mIRIzr3)&^G=b1y|M7yfp^(w zer2V`uTf17#83;MwM$**=u*qiEu)-#rOd{)Z(_niL8wi^$l4wQ;o6)6jPz!xk zx}(Ut!X{t;u0_Yc9;Z1`>uvS%Yt%&z4y{mbfd6Dddd$B36?5HPJ`eSj-#AJ`S7bU zpMHYtl{lAu7p_mYS`Em#ORVW>t305&N|R zBN74t)`Z9PdKZ7kYpXN+PC8H7M1uwJc==?68?z;DZL;vili%2qpva?fXXJoVfq4+K zH^i>3ZlRKLzVKlF9R1N@IuM8+M6X$8{_)ZEaTiS@b|kTMXn#Mu%cndtQoQ=nw>!34 z;kKruLN<4L<`+FJBZH25%i^9xZ9{!y_mjKI9R1Y3!)U}izD%Yy4;f>7u+i1&sjjn$ z$zuU9gF45-*@02Lx%O-`B(%7=J~6TS9N|{^Y4E-LU?ZiJMGF@<1#9y!`hEs2<%Q{) zgt(+RoX@z5&wnuKO3bldN5D!7LqU0Zw!zOyj;{AD7a~_BG3Y?N0J2#$#V_-ZrC8rl z%<7uA^M4NXcIV{y=IDc(tPEAl6tEKqPV~5-{dB!?2zH~!v0}e4s6#LOD9UERK{91a zP3@D)ig!x0qL&fWLmMf{ZJYVT3h51eP$cyD#H5cia}Q6sM@MTKTy5nL`63K3;Ay0f z!w;k~EJN3qf@rr@Xp|O^-9iwm-~%$M)`SE)AvXY|;7gm71Lh#}$AkUD_nfuW{84R( zKAUY(6><_A>C?OV=kt$~$7vBmxL)RRG!pUpeSI2ApYX0~|fEZ74iE|>p0Nc26l_NuT5Cz}i+4^!V4QX5k= zuwb$u%P9!Km~BRI2`3Q0_M%f9gXX4bFga41=C(ly@VnAb%i4`iEX7GJN6QnU^_hXwIkeOgYBXSS%SL+*TsTc@BqOb0t9y_xVyW%ExznGBzb?I)va6KKeuk(x>Rk|EIT`Mc21u@ z-A{Kv4FGCv>=U{UyPKy^(5@MN;B9VgS8;HfXca&4f}=>~0{<*~AbZ9|V)iZ<1I53( z3stfqNdk32O+?W_nICeMCrJOJ~SOS$5`^yX_Q|q=|23}z9E;2 z7tL+Fn;HVZJqE4jA7tBhJfBrsp_%BO2Uus4>Q#2fyvGhsl?36&JqRSP=m%v~*x3P< zle4)A^Sm$nI&1DQmwJ>sbb0w%9%NWL5AV8{$y1=yY(7cL$cNrf7NSq4<%(tLHNFi| zWdy}0r=csoLp-Yye0UP!1n6^unghr#*n0_6I=cBM>YbKyD&6+ zRFd*EP*Rs9L;A7$Eh2SDRe(u1*|+gZv$u_BS+roUwP)|JQE;$vCJFiL9n20_K6rUNtK)eoK<10yoAD*yKzQ{AXw|Yn!q$9Wkp2e8&YM%9B_Vr&7)0WOOLRX@ObV1{SZaJp zTxio1cPF@aKN!h~vzYq$IkPy2dp2rI7hSOOCX7Bo8!T!d3@u`8#z^}Ba$L>1yz?;b zH{B+DII;iG_BjZdvwEA$dOV)~B)6r7u{?G3?f4!lcb%)`b1r$7_=6vS4~GCGZ<5#f zi;|Lduo3_{w`$r78qOQv(m$UgUDiniV*RjF5rjmp13!iTf4|2@_g`k zvcyGr>C^m>km}j>nMt#KxEKhNaj;Ji&or3yPua&$O*J9{uUMx+&w**2o zDQM!>pyrOFpkd;2oyMOyOX~LLDYD}2EP&E@je|qDP;(VlQGMj#$_tI+8dPjMjZYM7j?HZs1LlAOTF7V83s zSThfuO15cLoS*}(*{!p~1GWiZ$x-0|rj#!nv;Xj-6R$QA?8axAePX(FzIJy#?S?KR zKOxmUqK6)F;uy9P_};d)U_$QxoH(lVV7Xy??rIT{Im!!mKAPdOly*vrMX6z-SWIN7ZQ!?eGV%gShN(m0-wWY;wbkubU zOFfMp`5@=q8fZ1hBI~SG6g0@mf4h+}BS}qYf*JTEMXT*V{oRtUNt#hO?etyedt?@0M2MY^+~e zR8cx)Tc&fqOMlL#>;EXS5|C^Sq~*2*ONTMSvMK02LdL$cdx&Cpnw9c|=$ZKtCj_^i zS1k5YJ&VQ*c;&KL^1k2%U1&5^9dNyb$lcHNADh-oMrePN)nUte?!8=^Ns7y~8io99 zQ;gyBMijEhCeLM->5brXcbq@_%hyM11G#{~7aAtX=Y=FoM|xP!s%x$AMa>>d$R1G( zpcJEdz~uk-knlPrfe6yd^hP(gJiT`TCtD8cWz4Jp)m?L*;*H5JzNu(m# zkYJ!^-lO;Wbp#I}|BBrOP{^l@f3XQbdh1-L`j{i?kyg|U=m`a)tqB9>1eWG2fF;-Ts-o&W@(gz@VmbF|aZ?*uuXbh;?< zZ<9cq$+L2cWoO8p;4izy00{^9jOXMnziOQznm{(fV6;(AoC*+Vtx6uQG~5PoKSjQs zth(&UeW0N$k8p*M!AP#Al%(%w&<6uuPop$x$qMKX+BT|ke@c!Kk*9C*|3}yN1o;#nV)Sc2DREnliIGd;7mJSX~ zXcT*?xA8`RP6Uv`&`MmzWiA!r!KsLy1Ef=)hQ{QKns5I8;=WKq7Rt)ibDoDIo;994 zVC?$EH{+G1#~-K_$V++osLXeEEjQtXSYU*+HR3ANpE~9L_>v?`bj6hd2+UUm&uqF{Zfws>UzTS?7o+z8FZW{+yp&R&FaiTV;o&LP z`yE@u<)g8_Jpdzi_4mhOGx3jfYJNCVM~>Ku1Y&3)&m(F~>$X?t#p{8W?9UKNw!HcZs`n^l!+nIUWHN2NKD?zD4=NV;BYu~Q-O##)VX58%vdGpA0Nvr~q zy!F9AZ&&8iEwl9#eaRy60bPg zUC8jZKLE=B&5d5>b;v9l*10ao0ATZUu1t6m&0HM7TdG;Ldr+j{UbQ#bS1R-N zOBOn*lT?B~da8W|Xo)?Jf?1$+d!wv_ zGU6?eJEcYs(o|5%nlw;TXO(`tv#nZ^`tC_ea`%;-ok zWs>SnjyLdgN&3#cVYMn@7No3MG7fM~aAXuaZooW$-wQ62r$L`CyY4+P3)!6MGjA?v zJ3TA~s5Jhn?8ja+yHpI+4;{zg%LU|81`XFsfaoSK?fx2}q+yHYd&#(2%S{#ITLDF9 z2!wcWxSvqUYfvS@<2Hu)ehD4i?DBgmFV%JT;qEAeZ2_)7e(EisgXR2Sn!frLt?sR~ z;o5Zby+%-QYo{kd1f7Pq3`-l(e%Vs5H%Z=nh?u>_%y*I3VHPnti>t|0WwhXnLni|lX8@{a1^@t01RJ(&u8*o8x@F0`aGEk0UqIB0_@)SSx zpr2_|t>va;WP~o_Rcis4FH6A4>?@vHV$fI_=~*&qV0M0)T~s+$lCiqwMZy=;fDALf zSd+K$MwECy$kfl#Zxe$zZ5s^V0(;91va>coJ0XS&14H`LPTf3DwmN&o8WvxrmiTxz zfm|EW<*u_3Q&i#eR<4%a)i#FL9U&Q4T?mjyPUXVsb^mc8F16`=m6NVre8S|u!_#OD z`&E_croYVHvCJ1Q*1L+g8*kR^pBY61lqmP@nSKq+@2O(wbed^auGl$$kWs~0F1T4k zPqQAo9~fairlkNcir?tB=EXzNG2_$0!n|43k3CTWDc?F=_f5B4^;z&{<`Hv|36_6Z zsxxUi86!vlIULP61gQpPx;&82^HGb?zGG=W_mHiAz9gL8Vab7pg7UBT!^qRt@-Wpv zc-%|}fP_*eVtvL2Hk?3uESxbi48Cdb6PJDFm%-?@J8m86+)=Nhd%w^vcpp4}dB8t2 zIeC6`1U=cltI@G9Z~j6TNXWYk-AfR3--dyqX)y4f0dbw#`Yn3`$hBf|Rho+z(f7c` z;>vLv1m2NYEYAr=;i9AcYnC8p^giBQHb-&sw0NHM`28*16SRbGXolRv<$2oD=^ip{ z@8IBOe;M|CG+e@0s`R!MbsDG;F#@j-)}SA`lCzw~O*?rUBMAC=_iPK?jgofD-k;>P zNa8F8UGMU@)NNBb->)4VKR}Kn**R*WH7eFOaj)eO(_)9HK#?X_L!3ZV6P|yu1Ab;n zV4W@HXH1ZUd;oW)yV|>s065`iKw|1kKukWJ`U!}R>brP|ea#K|U&7cxnghnWzE$Ny zc`A{$y@c|;-EQ3cG`v`+?^FfHMP%8>E?&`A4!!2Sp@Y6Cgd@9d_T!lH*Qm3|SIf0XDA z?0WN>vT@obg5~*&`k($GztnN{bpBYQe-B0%CPcRmEd6H3CdWiD2hso{Wi~nAp8v7Z z1t4G=?F)3t*ImncodEJ!!it1)pFJGvxa)fChVRHJMOtIjRVWfWt%UtGMtw7<_I#fR zKGLo4y~^=J7d=WNGu?3AIVnT;*f@^{>ZSzdW@m-}8Kb61WRc^a0BaIR-+ePB$aFEm z%J@(4Fp}yYN@RgTT2tUf=FR^f`cPvuZGDNE4k}3i>y}U2knLe^_W7sjgh<*(Bjo3R zgr8g=l4zjuI0W)A5DImj&f9 zegM2;6cIe@{A;N&QLNMd^nk{R6H`(KX()q)M$heZHCr|<-{zB#n^x98k`=}3m7kvh z_3prhfjATH>jdCV@g>>@o!+0f9%BgYeqiIIJ3j$!$(=B9^tY_tD>}1tPoGi8#fuMS=Q|G8t(dC->Il(A1BV=BGQA z;m_cGcBp|uvGU-x+9eU7;KhRps9|`@xpi>xeZf)~{wbq~oPtH=Y0UvpZYQGW!2(1? zBV;%xrU_U@i>CL(DbzuAF*#RmnjvzzocIR#`JujCEHlK(1C~?fj-yI0sWs@RU1Y49 zBygHu_6MzLG8O*Ju{$D%0RMw{vecFD6%J$eKW6-8@d^On0fAih&_&pFC7Zsw%1$La6LAl{? zG6JHVgv_Ca>=WUar&2swj!|&0KUM2W!rPyQQwp$5JmHkbLOo=Zj&aA*f%`v+_ zENIZ%o5J)4%k?c&+(I;2sMgpFIlfFhl^69w_gKM2Z*+JvW(^1CuyV9wZ@9=1seS^R zb*`d0tBg7a3q#`Y{^I%NWtm~DNPkn4$dr|)yMnLGHy1|Cb(|PC8?0~nG8i?8<8%BJ zaxc#F);OWcmziwQzYj#^y;Fyr^2RgXc=3E+1I5~={TKs@^z%o2+L#dgZpcUyT*C{L zx8l=&npjqv3B}xGn{1-`qBF5HhLVsAG?hzZVRd}Q*e~J$-;medpZ~j##ioXv68)!amH&&M9>{q~ zdQC3qnnts1=v6#)V@@czLh{$f1pIkR0HjKypCf;MLUX-vv(%A-7Ua+fRqJ~M?t^9iUoW&HP@!2qX?(xHfR5^fGtcwlnwxfqn2D0kiTy8OjGF~K##tC>DJ3D zh#x2V6I27j$N~67UTp#v1rmrMFRQq&tf_8PkKlcUC8Qn|^L-x!#9;$BE>>0f1-#Et zb^KKB?L%xDvQ*b+HqX@}UD%|KAR2`Yq37id?$2e1T+J--Juy0vsP_$f!S);hhh75- z$aFZG1)?5dGK>uLKx>sv3q}FCe+s{#4Tz~2;Hj=*yZ1#kUZs;J@+3tZx+dzsS${Km zg4qI2++M`lCZObNm?!fx9eXN|t#G2DH1iB#ZzBKnlh^G#mC(^wSkrILqygG#Ywv_b zjz`+L*|~!+!&B>mlc9PA0#)zUMgp$<0nHzyJc|25ZhUm%#lao^MZT;Jj${IGn z#4)RhqRwnbPcBq8x3DJa{?bdt$B{?}1VK7p<^E{O8}+OWYozzzS?#EJ@F%6+<|F;l2@T{*mm4$|95_T%@sH7rILB;&-GY zGc+w*>s*5=aH{_il>sS>|6}Q5tt*flOxGV9n{e#Dor0U@iA2GmTXoyFZ#`n_7*4tO z0F4aHs2|-&J#N_ad#y5QW8-!H(|)+&Zs?eypm?#;Xg>{nM<4;K1G+SC(K4oSf!R12 zk8{zz7LpQpN2afaTVPg(E{Fn6XSY|yIyFxsQXIu2TV<}-#?ItCk3ypW9IaI6*pA1` zaXPYRAv#bvR4Xz5r)B@G43L5WG%~b7uh~U>c3-gJ)FD%Yn5hm@D3~$@WFfHw;j*JM zw6xazJkg|$&*^aHp^KKWUD4~zUe|ly6%%A$(+}BCgI@GmlwRF=ls2Bc{kc@?x!oXm zH+tm>ItCId2?2Z;)bgcbkmGD(Jrd&N-1fRzEQ^|+aeB{zQQ-U{1M1#esZiN?tpt7F z`ID_!w#DH$jSB#`&L`o&?EgUs7AQ(YIg*X^y-jcw*1g0H(_2S zSzNy!DCjSEe78CLLsonMpDB@^7`A}xK@{1s`peL$?rnrP?9v3YhCO%zFZ&)qh1Jy+ zS!R~64q{+tX69sH8hE68hsr>(hh!;Q8lL&NRM)dF*E%2G+thBt$4!PhwKScF(VM_F z?v`IZ_dD&E-4dB|9F-0(3B`W09rNq_Q>O3p^w`50Mn%Nu$lpLZY%$N%O+zqa7rNW4 zwEu$zJp1(!CqN(d{l*Q%ru2&e(2x6>()pqC6djMT%}vC>XlI%M&Y$F(9N`$ng>)uk zY+Ou>y~Jf~wTLYEa8^ZP~-*Vl+qp(+7-@uixs!|2VWiUrm%uVwJnVTx1o z;TF2r!Liq^u$29JUW@Jg7HiFs$9WY%SM;4OJ`J`rhqeq#Mpwn9;pSHcs z6rF1Ha4BB&pwMn;e{H5^?`Pkhrv`9$WdGW^YPtEH1R*G`-MR(z6_5mD#eLVPdw+dr zTYK9DTY8y6tiA`ko0Vg1Iy0X+`ZaOZqnC+zisqBxE)&?^su|Z_^f7C^4FVemdr)@D z3<$897u_K0%A2d*J*PgK! zF&cn`V=$uC>&yqw<)AfLO%PVy+p|5#{j25*+Ew#d6H@=I#N$Jq7U<-#c|z&elLeqU ziSd5-*L-3RwIlYmm~1t~-5GY_E(o1XS-$N;_j;g>PTo=KBAL<2aMt*tmH7w$Ihnlg zd%e#|egbJskJ3pJy9(Iv6wy^y{0SyxN}M^ujK!-Cp~x#n3(Av_raWK5j$TEl>MC?} z)b?Z`2ql&`Erjj8Ig=TU>C%Q8?yJuoD-TkbRQ4J>bRraRfwTTj*{ zO36ZCTWiu|ZQR{Iayz`q%WSEF_)4Kra9^HY5|lbsv&-?|2CV?xpB+U`lY2Tg%}b+W zTtaIAGnWTw*{8|5Yk%%l{|-XzNW5&;q(Pc)nDtUMQ^ zJR6)Sq%=S(I$oJW>rTYnE+bxBQWH<7^}>gyX-QsQT_n>>65&$U6M7d-&->R~e*-X#pzC_s5_Pq73N@-^n?k>UL<6wwcbg{2ZNC9Mmju%1s_YqGVOhG~eT+hw!ef)^c}1hQ&LXwX{9%i$#f8|4tT)V ztutx6RV&^r3Lv4?XD>fjU0p!{f=jk3!sK_eJ8RKpUYq=sZ6I9n;wcYk#Bs~TffBT- z>6f@D1%*~PEBWe_hs7O%OgO4kLTT+e->JtQJ~reyv;S~>`i#gYfL^f$+1{l$tt(u)Zdj>(g@u68j%1PD0lb>!8D2G~_ z8pBUSlWKC=Wl=X*h`yH3FUWZKfy}5_FxjvA(_1}Ym^YO4VNSe@JwB>oEc1=}l_AYL z-xwFS*5%o`M>}tNF-{VuoEeR>|_wC?1rpOii_ zx>&4cUPWG;P8^F2b2iqxX5O$2h&k)XiZkK8EBI8)UX$u9q$YlsT-st3|!Cxbt`cc43+GH$`Gtjze zDc{;m1eYk6E?{E1JOpWY7X)WvdUlRYnXXbv^eD7_xrd)WTX&ZaL;kjjx(=C0G zdSKsZH*nMS3H)xd-!5LM&2cuH-_4eW0sF0UV49wW-;!;2GmJ%C1f?Age zIpfN;*c&EMq#6yEQn(*fh)96uWZZsC*!fl6F|rj_6*ILm6@2;2F~IHBEI#!JYA_aNi;}>pTc=oLaiz>Tc&^e zK`FsMq6$jH)M4M`_KE{Btp~3kW7 zcyZ6)wqZMUf)%#hpJ4Om%E{T-Bp}7a>1qcZ9eSfA`1Iri-`oD8WS*O2=;*9#vj4OO zsCZLMtQW$%{-|ov+L9X}Db+03mVW2F-e<9npZ{auBFsPRgu6wwsw6b(+;Xq^P^G4D zAAFJnYZ@IWaMhGNJ0hGfd?B#MUH=3Q_05a<w}`|t4c1;)z1L%6I!ID~)4c>K?}{vEdNyl?%_^~BJhp#A$d zliUA)X*f7BxxNpi6j2g1*{H4&otOpLnbCSQi7!5qe{iRihJPhRMxv}Ps~&Y%f;g}Kjh--L9(HY0kzx+S>~#oq}X z!OdX&s4LRf--l=V6Jy16V&_;5{sFbf?is2RO41_d2Ju@w_bZk=l)#xs;10e;30_uhH=WAM+&#JOt7C z|B(e3^LOok=Ig`^Ug%V&i1}oMbjt`2S0$dK7*`;<+tRnT77}9jA`I!@O7F@X8(0|Y z94ODu{wk)I^PBwj>(?l76GY5WlE3veuz35UGl5!PkAPRqpUM7d1g58$!4u`d^z<9s z#%ijnEO7D&RHo_~$}C}uDw_J%M%0|l{lmR9jEn}Ycq@c|6-u~njuBRJd3m{SqqYbq z+@6q;k*JWhwML>Ombyq5E80Ju!RC~^6;BdXo1OpdiMN}wqB0p~Xu%Vf&nW+HZ8|}Q zSx}ebCghl7+bF(%-ri-h3b;y=MVRM!75Ea0z-!e>{qM>aAuBVVFK8o^*=+@xY> zXEjOxkG@N1E{c`N*`y(dheOTQ&dD?m;{3t}{?9-(_nyRw&?prsqrkC!V{!EM^Avf` z93h6Pi-r6+wgk_VxD{ykQyHSw;J!0=>I-+qBCh==9UkxHz2kQn4wF zjZr3YXa+HW%Y*)R-I)HWosRiKmjBkQ#Q%jpy~Y7LB*4LWcfH_jsHij65py^`yJ91>W;7~@3!g$7C7JQPcEG_*>Qtql&Y_0FY737I7$ zcH6Rqw^zra!jiWyU%t%j%n(M1$4=PT+LHOf#lw6G{_^FeLC{pOu$#a*J+^O9IE8S*#(|}#|iYV*WX{1CGq|@Zuj^RA3q;J{(y{(^aj4Jp?YUDYkx4grjj~_ zGBRt?tQ-UH_3OjUUD<{P*Yj!v)<9V~=b-Q=19Nj8yNzF$hnm})n?~Ckd&|xKaVmOX zBGRy;(0&BgWt?D<7>aNM8rt=>wM0#J+YxVToz&*E*pKk;b=sqO&gfe66gAe}FYjxW zDQJ}nzKeA%wSiC9T;I3(H*Qy6PEO0k z*hWy06gzzN`A0#Ws~)%t9})x?SeK&$ za>4;rMP&ZtvxdXt&)XVwyWB}l(;cZWsnH;A>86Ny1HEtcfl^-z_4k#RXJ$r&p||Sl znqyCMMlgVIV=ztt3eimGToSYVXYb`-dc)kjoCIvPA6lCEXGP}jydOMy_$K4yH|=(V zUUf)@NSVby>~DrrU$o-oyM}Hxxk2)i&hCE+(d5vOlG3sY^IKbvwr}2S2l6cz2(yX@ zmMrop^l911UY%QMs4I(PSzuv3S8@j>3P6%=!1w3FR;(sNFHtURb~k$`hWd3CEJpeoXqa*B;a^!DG_u#9dsT=z+p{IN5|uF-I=CU&0MuQb;#S~4#AM>R4fRS zF`J}0IaysV)_iU;JzHi!dM*-mFw?M$QmCTo7I&|+QEE_DC4&eoXLsVU>W*e_P|l@aM?_5m-E&RSj*I78+J^LQ)gn@j|^ z#g{y4Z7eT8v)>*ny>(@WCjI!aw>P)YHx~j`LpmM#Ugvy#<>4h1E98o)m0907M6kMS<$+ zeUtFVr`G~!^EUe=jAEX!MHZm@D{NI;$v<a2^<3SkxY8Wua0~ zQN?jx9g7rv&{mW}C#1Wv6E!#2{Iu&=Jn90u*!_ieI3FUihf5+NCf3AuI9QUB_Hdnb z1%fWm7f_o?Tgeynp%L@kUWQG}rt$%__^lscgUJ@#40x*Mnr^nXBd6<>)V%PihYfli z#*!#6UrK(GG1+T9oZ&@*PGmJM@F7c`FDz&~JJ3YR-aqh|vL0veH#`S6@$@=hQQRsHEv12OB#*LG5xKMF+7_u$75ndAo^ z@EY6Q>(}q!`%ITEhlMstk$Ry!s|`hNY;5G@=Bg?4Z6#C(iDq`XU#avV99LVu#`HK> zwUm`TI@J0CEQ_*WFKCth@`JF32KRu$tI#)f+CqYu!Cz%EER79~Un{#B?e>mmSk3Xd z0F6TNL8(OIktqX%y^iKnVFmnwXvFgsCM`<#+gi*uf;Wb%V>HeM6AN)W7R79Gm@3N3 zZ+RRl)6;`SW4GgI)!wXQV`JAsN*$rM5PWv?nX6^`obxJ^LK~_agm(>i(NY0waT*2p!S9EA7O~UKqO)Mh zZ}%tBF-q3U5uV$J(^(AS^K&yUZuK=tFYBES#mvnQ7km_9RLacy8`*`_7E_kmEnq2E zS68DPp7eMJ!JEn5;~qmh4x*Z?RVfwYVNmNtj>I6m_DMEo@MZ+C9pje9?|!;^^Jj)Z zu=k$l0NNaYZjg zIi&{%Btt^*@>#1d(ab(gW`2#lPEvQ@-U=>r(KByq|7WtDh`hpF%zs^lxA=~_z>HeV zz5m4r1MmMcGd3aY>Ek$Cy%bPeKISO2spZ2l{hOEcD8RVVe_1mB1RsU{gLwc7o7)c6 zAAb_R$}Uclq%CC{4podMDxS1e@4uUW%7u!-%3W|D;9vC{PN2Lo{g0PwYAK@PMNLf; zo%}sWq}Bn!6mH^T0|_go=0^~osmF-apJA|>$Hi^>-_&iz#{(uVFETByx%dBckpsz4 zBpSdZwYPr(xA%&j$J}iK?hVt6e?}XgkM9pUB_*XI3JyT}pLp|#p$_(S#pCOMonF9; zJ+(3TV5G*gBTuy>})&1sZyXw6H_25^+&qA#aEhx{f?K= zUcj0A_pEs3i?Qw~vBQ6O z{ph|87e*my2jN>tv2;$mn(N~!-mA8#FGt>?Si2nrl{TUJ~Q2Oal& zRf@RY4Leb=Ea0S}J&6d2N{uzNvgm&NWpI2Hjk?$X+mtNexs=Js$r`7>U!m{~P*4D= zeoHp6HdFbY_V>gIME$pL;l6coDqw3g)GItw#9F_swvFu#iEKsx0_uPGikPgPIR%as zlARr%={uKRQ(>CE;hOTYxIRM~^5zeSe{R{To~WfU+QUG~9qbd}2PY1ng%>D7VWB^* ztWo&$Xa46uC&9J4$ZKbPQo397ZT}JG@B%+pg3j46JtH_r(Vf!7=+h?!y(dZ=kJWhfxzRz%vxF8Hn z&p<~v&~KD3^uBfUn+S=5()JeiHSIvZ!QUU$$_31W6j}7e23c--w9gBYSD)yBX~jMP z+Nb5c)BU9I>OYezrJ|{+ps+O2TlbC;mpLN97f!qb0Cun!d!%Iws2Kl20j)iwD7|3;w<;`SQ&1Qg(frp(n>2Cl*iRyE1K`9xW2mu>X#NB9rK;1! zNm8gW$+uvv9aFiAi;CyPa#pCdj%ip7W~H3@L8~4!Hk4g7l;Jt$J^4mQ~dGicYIrCi_yx0;uFYg3MA(%92}gje-rd!QP{f! zk*Xe22|crLm9PkoBZrPWg-QnB3aV%;;uCuvYrAahIVSI_ndBK;y4ik%9UWT4tYrtzFd{j>ILW|^PG6iwH;ia99AEgxWeM@zuN4b_QgvQK!R zP3ZT!cKXuZbXOsG)4sH1z2#nti;WFtf%S(;L(I|8WRkh(x)(nMg@)$EjgPVJwkRfs zRiAgka*4P+Jnn`(8D)vqH#V3IYk8d023&30XI7UzV4=YuPj6wlPA-KqEj|X+O=e2G za_BXjpk%k}o!&P1yTM!At^k?&bvA^*G7OjQ4;T3ATfHli^v^=~n!MxAujB1a?pL}l zu42~KMD))4bE8way;7w>O8&W1qO{YMYUj5$D0QolPb5PM?@x`ZZP?QNH`V#eZJXiC zWBNErd%LsT<}aF3~5! z$|}&X1Jnu8Z!}`>X_=&Mvb_;mZx9ST6!2fTF$OSrJAGqH!B-qE6fR7vdbmvwR?9tK2MslC*-L%<|0LO zn#EvE9-BPS>FN2x#Z?z}f*u>$PSBoEH9NaAfyDFF;$qZ8PiR;1RgB^_8asz9bZq41dcd-jG@xg9 zrXah8FiB!vrsIyLJ2W{w-XCCouT{){vUCC%d3Xp&CVVWJ3NoL)k0X~EsA*`LJvQe8 zD+F3>Pg%$*C@8{-V0~vf=W29X-x3mFfI3LED5R<-%|Ec+9d*cgavugu{FeGWn$c6Kx%XVS=Q zbwmf@mE6^ZJmb>0{tbqB2`X|KpR|IpKh2&^mlQ7RN?j6imAkB3(n^IcPg~A4+Y|rS z@JY%RqI}#o)+Sl_cLl~reij!~wLTiz^otV{*^Q09?O0)-hh!t(B+kC@{2HT9m)nGk zgQFs&4S^~mrGIBX{U(`XR~JS?{a5*a$TImK!2WyjvSs|DqT1T8%->oWrWVj}mrEsw*|+Qz~UW=(cRVRwY?p+z?))VwzI)^|;} zs3*uM`sP|X6CIT4*0vv86owl;q42&Rzf(rM+ALz8xT!zM-U3i|{MXO8QrV_Bs*w{s z2iYV!s;d{>A!d6kt!x-k5)(}(Y4HN!uu)7<09wRgKqO&l^3l=eWD`J7t*y%b<*afS z0Mn$KR`|T<#)_6JegHhcNq|sJFMHh_M#?$wmdLziHA5n2xY-JP$=IxIAV&fa)=Txa82~@9p5-2z<)- z&;X(BeZl8(Sa2x+70Z(7^FB=v?(FN6+$tN1b<8_j92^*6)D2sxFt7lO?d2qyLqY^} z;?c2bMq1MKnGE=-?coAvdYni+R)Ke9A{v@*8?6HMs>W(Zqj|dBvMI$sAGu1ajXLV1 z*GQU0lD@Muvu63HwP-~p{TKlM2vE~^$v!;Bj(wpXa4BuzZn0?ly=JBV8f7|r>$ZZABY z((REGlBY`!=bQYHzA;ufG$WmzH$m?$4-aGsdEL%-^qM`s5PiriSzK(=thTjB79^Of zx4MhnxJ#ZY$#vkl^Aiut99)u<;IgyTwUkEbC^cDrsLZ;Ejm_?KpA%W#4vnmdTuzMX zE+pUM$YI9HTc~&Sv!afWl{KJjx`rf#q7(-XM-mZWk0r@olyx9f9ZI49M2;DyRiZ3i6F#_s7kerS4_K zAhw-%b75`*` zJxoa0%%}b*{rQ|s9tfPh5CQl1vH~fzC ztI!xXU4drIf=VN(6W)>mblydRvafL%sTm0-YG(8}`;M zYpqSUZG1yR2?xi<;UeH-fH6}4i z;5h4wvjj@dlwBo~8R6@=KRaJi04?`VD}FHBTv;VG^KLU`z;%NVp4=4@3nufk(zEw= z3wkp~-PfNr5XUpVW=3fcnhH9Nv8%9;r%xhwTx|zTO9L#K!GWDQedwO<^h3FMYkCF_ zPJFC{LFy8GDs(f@M$O~2t|*yTC+LI_c9_hmSz{rmCJ}ba@B%$bVgO`#yj&5AwgU3t z3(u;gwcnDWNI-aoF#f^wceJQAQR+jI8WW-*oW7pX=E}wev^-}U;9uj>k4^OqCMTgZ z+4lAI%}MhFFoC%$aXI0B`74jn&ylM0)vg9k#vJq`aw4_2PnlUs{o*-GZU)E3H1AGP zExhtN&(6-+1)&ni4spY#T{iG(#IiB>x*j}v+1a)GtW6NZ_@RWz7Fe!h(ey)OA*{8H zZDg|_cl$|?47QPxQIXee)C+Vrv9n7EXU(tli&W@~?7SShBwk(?5|5LUQ8zSi$tud% z(|yM^)=Mi(<>bkxBR6ZpjuiLH(^EfWc4Ze1RjuaBXrH~PksJw=LM;v))T(``)t{Xj zBq#{4a1?eiev?|CLHu0W6aMK;#`En0JtL#B6S6q-poe0GckgIf?N1x)aNCDbiCIB% z&0O=i;UV49srq_mvnJkdJ^`F=XOmgZ%lG#Sr2;VJ>}HceF|u4(X-S~ntY5d4sl$Jx z?JdKiY`?Z|)C*8414#i3q=)Wq>24TNY3YU;P!W(;>FzG+9+Z^s?i?7Jp@(=5uj~HD zdvDLj=iU4wn;!(`JdU;2Z{OE`GLAAkjY;-J=o)G^^F&86MU#@OG^^Q9ZK^<5%-+>kG!|KL-LJhwNKht?u=^8k+E;q&5}{d2 z^*N_J-Fo~tuu|_!d}y&4SgC538myAUZMWwtOV^t`tQcvSnJG|H^S<%XQ@c1fmyMl0 z!$Y%f#Q0>B(RFHUc9@A{$R0IyDjDj?>SxS>s!ft zds7=F4eakxiH06Km6bO(j1nc{`d0*n)&0&UT|o}sh>Rw=#$fRsNUKMDf4H=}VrDKY zYjkjo=3U3qtsumv=<`c1t0>D3HWS9=)0gnkkN~hI!Kuu3ZD~P{N`}N6rjI&0l`%1P zS$y;k3LdG=_DNs0a>|dCm4C;`_3`65XMr%Z zwA#+Hg}v@^sMzE|RbR9G71KG8QF`mve>vB%bb`!!@54MY-RdjEVZ3T}{i*T`#RIO54WU>vCqx|xZ0Y@+!0n2b~Rq^Ny2dTEKO^7O|{8^X-#0dSKTYeW&Op~W^N65sE`EPyv`1;vYuUE@8(xzel|PJOE9g! zO`)T~`#mWtDkVYIgO{^>p_{bD1#x<%t*y<5>`%&KB&8-nW#~mLUSrwEnJ_jAJ+UW%G~;LbQ&lAXRFy=2kCD1SmzocFo<=0m z+P(qd?-x<}d2z@FYN{gh)d<;e{Kp*c`;gFq$7}nNxDc7ooT!+TZd`ndse*Yd*CeL+ zK?)C6 zSh8-w#8eB2L@z^>nmo4SlbHubtzOG*g7$9cVmjNUX;UwP6PlTex*>-zf@MRpK2)Tc z$2Ew5e0mHZZI=kURLm4pH1j+6yU}*CiO7OA976aUgkG1Kq&t)2ZVlT_j&2K_2k*`J z(WYNrsRUhi=2}{%8oBc{86PN|j%m^pPu)tr|3w0QU$Q?&EKw=&lQx&6GJ0{pv{Z@e z@f$l~_xSb?o)+n;_7g44#9EDdsps*Aaoi)J);bIe65?4anVB8#jseJ@E40!?gj+*? zXrc!m2U*hy{8=4`Qh_D0=ec*Ua<+Brj#O2A$nHHJs@v9p`qau@w|r1kp$8oBv`g_)%i zJ0a$pZ#OD87>ESO(Fz%NAH5MKXg5p{@jFGp`*`eeaRm_zrqQ}Obf1i zl{5D$7eX%!beYpS3&33Ee2IE=ehaFtjWF-fj!!76a&%v}JTI*(_3$2cN zq?AGVEDIndcNQ;H-xpbdYJ*^{CBG(~t6#T4gp5W`llS>4d))^GMY(};Iw-=*9ZQNX zLfG(YS@j9tJn36Ga>ryywwVQE|1{(^Xb_y0c2R5WSAH>vB@lS5p1%7^Iljd2l``>u zB50}m)84AV61*6n40BTfZjL-djJQp@I8xyWB3o+z)6cKk@%IN!w~4cE9I0xxEBhCe zKZz*lI^_Oqwugf8IZJ3Wt71_)iUof9`AcwtwY;Mvd8PTUGY&aVef@H?K0R`B&8r8U zzVsjDvm!gQrrWJ8ib1GQV}%Orx61X(=#+O^m5sCz=-nhcfOhqlqK z?xUQt8`;A`eG>O!^1Hr#b9F>2PPeCAAWOk!AvX~>yrtj)_1snxwst(GTs2+gpPW=! z^JyLtGg|3R^_D!n!F76e6YInIM_J9Qhdn(#lanvM>257=miVmR@D1=hI~{-?p4RBr zEo5(E$v33f^Rm@Ef+u>nD|>#Fxf!{>wZ!4xYVl1jG9fAH&)7Bp!u(kZ=H$VY%eq`g z)+Apowso*G@cxsRf*sS>DG6SA%>!H<2Id!k&6w{jZ_1_- zIN{-yM2qC*F(`(1n%>Qm($D6{vV;2MY0hgN7g3IbF-WObF)y`&W-hY`30p-X`K#^I z^mSaGN6Pue$@=4;#t%hx$6Va}bn}x$zRXjC+<=n@pA4$AmUF&F$Aq82uPknxn{5(n z{n)T;#QYx3{W)FG$F@O50PKoy|&%>Ppf?T7<$B)Qn;!$ap zp)8p13W#v0WT`w&p0ib*lkKT*^b1e?kl?rPtDW7;5f5oeU;m)HOZ6CMn~7I&yrX{s zSLV1!QP?C${6 zN!;F2_bONI(>HyIeDNiO5L9V~ha?a(iXD(aznpS!*D| zL$`L&_B$L2SB@wk-`L1ec{~ig&Gi>*u70=6?n))0%>InG!mU(yCL12`v7acX=uiDM zM_8?5SvYR_)}rINN+-+Vlo;xVix`eveExpYjN0;L!}YlFxhpY~^iysW7!yMYTB}zMd5Fe&l?G2*RE9^2x#_z( zg)in0j}l9UJHph93@(n`D!`ka< z$7jp)&_enOYHEHV6I8d8C{$v(MWZ8(Zm!;1)$9y~^E@`W?*2?&=+_d`*(+rBD@fB& zt!)2A!_4gT)f+oi(qxD->`VYee*y-=VmKQ{Ju{!?MC!V_sgp5E!~r`XCpbIaozv6T zZ?4wsi?A@CkM#fYyhA0E=A2uQDI#gIc=3!QcRuyXzN=zm*6UcCF-n$ji_>{dw;v&) zLQTVNdoxMT2Eo^OIF-P4{>XBm>+I|d4+(3n)|(Y5$(g@5fzTbTdoGDF{&==zIGoxP z)qL&!O|aT7JejZ7FF~+!X5eARnf7uanu`Nzcs76#_Vp*&6<(-qm`SX6TO#vLyu_)D zRN5SCxR^?yrEP0#llCdPMpBb6A`4g#OhNJ5!-~}x`14FBOpMI^%JTr%0iG2x;Hz9* z-*k6=iwQgKTg4?ir&!)5K7HLJu5{bU32)XeB!m1>l)Bb-*@tXJ+BdH%7ymMUMiWmr z^!|9z;!yhfZBtJPiNjg}9WEON-PUxu$D)K8IC8Fpj1wauzFl9@u+gtS(Hyp2BVPM% z79(k$@!#`=xdP?8{DjBF+OoWiQMt`zBaxpYM2~e6I9zyr9lli0F zhz7l)vvuJfjJ#`T2n8NkWdFIC!7DDz15FNY(ZIiJw`OeYzm;OW`+Ky3k3Y+(wjJt{r^v|)L5lb0`{=$=bFApAMCl7nb|Y2|-?! zkj7pyVc^iYeu`t{V;>gHUy?qeGR4XGG!XU~N-_{>W+X(w1k<(sdE<*zqV?VR7;#hG z%|U|puV{%lQ~b_&v8ebZk{S-ApBI%@Y~2@Iw)i_*Y1a9u4f#61dSuoYbaNBrgH!Aa zA?QuD+Y3i-BB|J%c)@Q2j&%q=-kI0wRY~82lWP)LKbU=uD(u6Xe@{h#M$tnP@$)Gq z&;=VWHq$rR*6r?^pD#=EQsb-C7~u6Lu)gv<0_20=15nJc7o? zBDe{>Dx!b!p}>aAKg?W32z*6@kjDP!%m0^Le1t#F(9G84Z)Pu+1c*KU!uBT3J>q7v zTYk-%2K~lnW@{4KJn69gje*+W2q&jChe<&`*PSunypIBmEfi~;uS^HdB*;NJ2_f~E z*H5Q#!=hjPI=&|X+`C~Rmw&$Dh0>=#_cK9LWK^?doo!oTJB~2w$RU6G`mObJqfSaT zA>p+$iIV$bR)3Rz>FMUKpv!i#(xc>(&f)BY_&AQx5V;qqxpEZ+8qqa}S}zZm-Pr)M zSnNWBVU9wxu?xS7JP3Ht*#_%u!ERpr+0w{Apjt6wJk3cb-!Ad`#RZI9(?7J_QXH4`NnLO|^#okW5e5j z6?%|sm#+^`9?pXXZ{td%7v0v`+wz=+Hjdq_xgR{Y6MO|H5x+#~`9ygk>`%q7t-#SC z7+Sb&*h3iwKYpB$m6c8Aj78WRpOux#2EL(z*e5?t6fGRXS$*OfCraIh$bY zj{RXpQI8(MtT&wo<^IJ2!pL|T(UB3Sff8UwD8|dOP7kR&8K{=hh@Aihb#K=fj zS1hpN001=o^YcN04nnFgLOx-=>tDZRd@`tHU}Wa=LTOIKMZf~Os!LAHeXQP?$>53l zR6pa^6OIISmx*b?DtkAGMqXm#NVSi-xj6|5vHe;ByhE8~M!3puPOLkr&eaaJ@WX2w zdY!OeoaCD!#hA1|_*ek1qF&S+UUOdFV5_;d>K{zFTc|=diPL2I9LA zniQrO)}5(3KY3r)P3RvUK0fq)DGP6n{Q{p+vJcMgKO)%&JEGxQ$x}9}*epET=@YdH0j$TBL-E+s<4Do9Ok=d9OEbZNc#FJ&{`q zD8rn$ca^JaP8gN2$01wG{LzM4bT8?4oma`+9k-pWIRrPSaOl|kwUvvRAB)PpMufZ5 z26|_y3fu)w`8?xdS2+Ec=zff&zJS>Ey!jjyjr z?S@hiHJ}$0g{QC6nfgd8T9yAqdSkpqS~ihjdmyhn3-A7!hezbn5{k!j3D7nOrGX#> znv$wr+p1onLy6_>?(otWtiGxWOTGT zf=(HJ*19NJUuCmzF*(#WD!g{Ch4@5ZJ1g*nekI@$U@+>`8s8%rc3D|wEdDwgu7;+F zxMs@kio7Z1+c&;xl%dgieYhRu>$B@>@2nadn@#s}kR-c-JmfqNfC!|x~9+dO#(?Racy4g;`mVT%G z8Q9LbE_Kz_9arD1Y{w>03AkjH;9+#-tR}jMndqhQMrU#x*S6`SYZxSC&)yUtY0a=h)j%&lOYejAxYWC6^e(0Xx=)qkYCRGB$4KEx(aHfc5mUN^n>xj+7XFMZNfdp>;hg2~5ydh_>4{Z` z$5~=z+z+R=7VbaKv%6Rx*E-Y-N=z2={2Ufq&f>Hr2yMoA^r74I8u=-ypoq`ol2zv* zHY|$qg`dvEmj_Uv)2;+gLYfJm*C%~r+f&mMQ~t?9%7Nx8DP>hw9B(fE3L>GMRmn8_ z4UXwW!oT;2fLV*8Xu3)#mVOG%3S?o~!j>FCbT813P9-wZgP)_Wj!LAVeZ9S}^5Mub^NN^quZCdGC7@OG|d6t^CL?zzdzl z&tCTi-F^6wv(``g!auOO*fqfQg9_VN`dDilU$D`x_yj z-;L%_;9SYhUc)}~pwzzZ3frD-Y1 z&lERcSBeA>x%y0?(=-qnnBf#jEy?x$Jl!_N9g@ zy3HXCUgznUgaA@(iuJD}1dG)vAjq`}f0uTqx4SzS@i+?!Gd0UZzBBjoD1b6QARA&7 zK&2=D=TVOiS>RY{)kALP!oM|tf(1cTmGRJcJ=EUiuS~I>t_QJduhS_SjCt<{>{(YMhf(sT2h{wM-G+`2nqs zr-$AosO^Z0t%#n(3f}qaf#N*jKSmt_g793jP|la(`n;ut0KSv;H4j;VRSgzHBPR0p zk)9AUs-u#AWou59ES5G3TAq9QE8f|(P&M{PH`lMFerypKh3M z-Sr@X99mAvLw;lY(L|WQ!iz7+N&+r$kbw6qE znEVTu=?j+=Qw!mh7bFUFjfZ!Yddl36tO+Ot5*n=eaC$}E1L`ndWP*^fq=PXqQ36DFDRBy&PO-+OhE#!~Ff@AH*fSjwpX#d9IpB1*+7CB{|!L zzu{GInCLg_9l73LVw^1uoU@JQET4jbeF54f+{)ilX|HJ*)9$^(zK(cPnA!T*-4CVR zTMTPLP@E%lA~M)%7Zw`E32ojqQC6;UiJ(K=xN-9EA-#6no(4T}7Lkg0X`c;+();&G zMuxd;T10mJz##Ym=QCEo;FqwVbegqN=dBq()^ANCLTVR^^H;}&VTvr@I^RwC<+~|r zY8Y!PbM^ops?L&>9Xwug73E*Z^-E;2Ev6XSD50}=3y0v2pwsz58(u}TLP=xih+vjH zLzJ)u1pvTp=nwcAalem_@pMby-8V9?uk#4;S)>(C$Z|Q}nUE26<`x3DZ@0Z|w!yoy zup!a$e7s#WzvwZwXS{cz&HH2;?kb=TUyTW+Qo9MR1w85o-fGZHlXEy8x^+i`Pq`g` z%H)G0oz5l3FO?um8?~6a_}sCqT$!3*lbgN9h4Ok~!7iHBy8#{*6*bIkYpYC%rUyj) zAYkxWt)g)|^atPs0$6c|eXP@yf&;DIznaW3Gz{lMZF$2`QTPQJ0mo5Or@A|6OcQ6A z@K_}g$5{r*&0@I2cX`?^udsKHUR)@Ej^@@7Yw!Y927h_+04 z74TM98*t6m&%RsbCrUAz+I0>1qE*6o04+*E3PJHt((c+ghde#nn~Li0UJ}WmAH_I{ z5D3Cit>0Q`i89DWRS~(QrZJU12VZQ4v*9UJ>!U-+y^rusoons0T)z9@9FN=*N zZD!Wj=N#Djh6d`BeOyyhr>|!)OzSA7YR`C$Splt4VZsDoeZ}huUQPA0Rw}NfaCF?^A6rt}1!uu)icoD42^#j7VDEzV2__ z)cnEq_)Yg1WbZ!FRfXkzng;I?ZyMc8+QFl0!!*PjgwJkqc#3Envqdd%$8g(ClKu&v*RK z({iZS{>IR1O5n#f@L^P+?IfyRWg4Wf-(8kJ4;IhcAr>B?f7VUqN zcJ{Ah!-#w>J8*^*uz#8Uo<#6%!l)`CB49Vd^QFwCOf1iN6BTFxU)wX~>mPE0`J~GA zJh{ViesM#Alr?hv$?tW*+k59{nm@G<;q;e%+tV2@m2DT-lB2$ndoJG00#Bz#*Qa@}J>D%0Ts2;%P;yyaw0`+f z&ZQx*@$J7ba^dyQ2RrR59%rM7e!_J2>Dg039SGEHr2l!VA%g5|zo9=k=q~5buu2M_ zOrT|6UX^PVngpT|l~=|wRQ+C+R3}b8D(>6J%dZ&(I4(JcC@NUDmP-Cv!Q zgpc+POEV&jJxzh(aqs|ecv)!~`!yzT*#wyNieMc1F?pibx|AMQiQy?U1m1I37CZ^R zlPQETcZEG*tu=R?b0_uUw%((G_as{}VXo2KE=%15xb}oko(-PW-E%#@ zxAK-@))bn&%G81!zmodKW3p)5?j!q9ErxN`iXiV~~8+w}X! z{)yYc<$dF7z#^%xzO=K*4eQ|xnkY6t%1Gu`c`PjCfU20pL#Q$+fR;563T^g%_QWO` z^~*aGYcs&SHgX>P2(ON;kjTcHJ}Z z$fuV=$g`!wxn@eLw{pTG>3dycp_CJ31W?RWlNWNua+twDC*vy64PwNXg1!<7lHsrA zf-p0`1GiS{Twv>gzL)-u&-VWT&#KX5Ym&`W0&Yimw+%7fjEe@@3^hYT->m}I)=28+ z#l>P0Jd+9XNS_62K6^J8MK`A<|LA#0U|!zwpaV-?Z1#02G&5gXr!!K&sK#Q!#L6lg z-sJDCo~P&}c=8swHmUNCJar8)>3McR{yGH%V*g<~v;a zfnxfH2Jqdna}F^%Ql)2{kk3|MaH5Y#ob2O~fK4H?+L^D!RO&MWW19Uudh?8zjx}P)fCZro@Tr;~M&z5t4^6jo&6Fn|;moFkf+5 z!)}m3@`M&9l?k_9`UW8Jksi`-Hy8|R?C&%?)%^dS(@4kf2jWj9edXxs?9#u+KokiA zr9u||e8>5(oP8Jhp&?HJ^efSRG`CLHf=W|uR*14Jgaak|r_YTYu#`mLjw@Tl$}a-DCM@ff@_z|Cbmfg8sQ*rB2nbCemAW+Mo z_2F0WS$*huZo1I!60eK4M@i-O0oBGhL1 zRIn8Ih{2xY>uRxwvBSn*PW{J4Cg#c;oy@({O$TFw6{`B`4bH!W+U=jWhxT`Oq7RNs zt1KN4elM2isFa!V{evkPzdpx3E;Z#dTZ%N`wUbH~mF@nIS@@LjCxk6mwwbr`=5ytq#EQ=ngMP4fk2 zM9Y8k_@U_Kw|19}*0S0%IG3Bi5bK7To9*dIL@g#$833Xn;Ih55Gg{`CU~oD)FlIBI z^J0F!!j-#--*HB&DfP8JUyYj^u%`(B5t+|Wuu6_hk(EZhl#8kZub>Qe)JxMk0baMs zQqzY}auoGXP&kOTCK+NnI}|-XHgi$cJ3kDT(%j_hCxy-~jAW=Zg(V3X=uOWwc-wUQ zyNq1;r9k|1`mD>JJP1x_HJqsSGWYP9{QvmCJv9ZweJ+mi-rinxNiH88JODdz|80f0 z)vm^$6>dyMjhJ?yS90;wI4x6{TDAA+ZIL*iwCV8kb2~YD+fLY{_K5z#Up*5G@&hfh zMVq*A+xhP5wTG%m7rbb-dDx)i`j^2fS0WTlP3iF&#M z9`E^Emgp~eqXQ~x4o{OD`d|)Y1PGD4;Lgomy#FXeoKy=hx;XU)zebEjq#G1Y zK9k@3tLfxjW|k)=-!5|(SOCx@#iGT!RW4{50UX@kjE6w<^Ew7L;(uFU>#^%rP{Iq7 zQ14UMHqw;(x?0iMET*?l`oQecxq2o33t+Y)-2=aZ1lbQ}Gjhy@%vAB*7_*HfJY-7% zK20ZG7?~&oub}y4`k6BW|LW-Ygj77w$^OZFh3(N)ip~)Y-$d6`d~b8Pq`%G8+wFY2 z>yoT+q6F+I9Wi@0X)$ePy_L1a4H~jmi}qU(#KF|!r4J+){nSX9h>}~z>wQ*R+lHkj zHnzt(X9DQZS`M-($1lt*EqjGXG&DG&*H}}{bxMs1jQYGys6pJHp?6f)0v-c)=M=F0MhEN~^o5@(j9r?1b^a_|!g7>?-4(%>ez zNCY3#%ar8HbB%ATP_C47SgG!NZ~%@do2NNm_90@zOUFI>K4l4r9*vGO9M;12KMj3< z5OgHkQ>dlkh3jJ0(x;B>v9Rik?bPrOdECo7pc1pwzqcA(Zo7A+2FisD!41L;@rTTJ zA4*RXQpF0$jEgx-$Npo=L}!_qp_r)Mh*au|d~fSImi7Dg{0A``&v&Q%bpn~> zatch=Jnt8GHard{7H1M4*O76n(Z5gNF&%GkS(X8tEWil@e6^)5jQSC4U%~Y^+zydR z95;K)&A|WkO4-)c)p>;0PSi(+6Aw6fVXH&ZQR?K>p4nDrVAx*&&Mv?hG#H${Wf3cm z`*Y-H<$AaCFQu5N>Nmw+XQx(W3(~`IKWuDiBAsqcY4XN(U1eu`^ zABzEeRa;xD%M1uB!tR8S=UWN>L(pqB z%B1B~O$yR&f&V)Xq--%J#Q9+-#ozLBg@%Q&t;5)bT;_U*H`^=Mfv+WZ@~Uz_Jn`{S zO=R?F#934nzg}F0SVudV^6Mnzd*_hszJX%kn7)p}PU6Uvto%`y?U|euXKHEkDobhF z{B+abc6DW$@*Xi5Z$~S>IGH^AHZj1lQpko=X{ro^LufLJ(TUj8g>f2saX~x^fjQwc zMfx|Lg+@X@C-HADtXo)GN_VKF{%T!`h14Cf(Sg ziFusASm~o<89j*@@vW6|i8T7L8JXf&%-Pnm`d_V68n=((B~KOk>MBLrVaz{nFl3S8;dlRDI3- zBI&j^t)bQ7Irm^VT|w>-)o0N^0;k}mZkd~t%;u|wXJ?EoELmH_H>K;rWiN*Z%*tG| zv(2NG>P{*HN9z{ZJY-Xm)7K_l|6&1rC?Os4xdv}wOeSS!W)^OQ(|?e=MeR%Y}~ z^gJ}p`_q&3Jl~8;mx#g;X9S$x(8X6nT>J`TC3PsrzcDq1Z%DL)Bzz0lpY4u9bOp8z z_iLK^0+ySb4dS6;<@jhPr&%H4q2XaeL;Zn!0>JOESVCDB6+wheKN;{L_ok+%rUg+d zovDSY!CLG1$pJe`pkMFDK>$*^y!Tmcrzq{uV#WR7g9FFXk%eI1MHc|cf98Vh0I)37RJ*@i0V%E&3&Y^!*j=JOpGcA9w*==w%FRwT5~x0LpAt~vw21&G?o}8 zp*}eI3!y_GZ%$7LiCVoM zH}|}3bgCCe0>n^I@T+A?+JQd5KW@WPadrV{Zj@B!rR^5TKzLu++^aQ>1r9!#Aa*!{9V37P*=zmS-2>wM%W3}*)Az#gP*T|eb| zJ~fktjn-Yy7pQSDsM||l3;;IM%fF7K|6^BWNP=qt>QXP_eYN%3qaSg3OH$vO_j^hT za;DkOL`th#F_7y?;kk`#B4%lM31ww!qcpyLL;P2sr#Y!*`L=*_W+N_6^@G5;kbv=Z z5rjAK6kGL=J*$m~{Mt*5_nVum-Cz?ljqQ%rtiV3??v2bBFZFm!9mXQ_&x;ao;aFV< zvg(?9b3if2K^>|Y=qP)g2qpH*fsw4DSzoW55<|oa={@3m#Ob2CGT0oh2Y8w{iN(K! z2S>@uz+y&ke?`a7T;pS-sR zrYg4?jkp?Tg^pc2%-;H~s8U^8n)T7s)hs(F#?4G7{tA9)#B1qg!2?3Y>(;mpwU)h8oPR`b6=->fa_Ejh(8Px9AsV}k)(@}DEf z@T!v}I+_Iz&tm}s+6cTwAyu2J(hY{m;P;N#Q37fO8R^Wg{Y;0G!+4Qpqi-^D2~}QI zmoDe6?8hmDJCnliN608@h7QteX>>5!{Flm)|Lp?h)B&~*(4#T9TuHm5S;uF5adZ+{_I~h_vr=M~403aQ5m>u=jraWI^*p&5gD%gp zWYEVSdwQG&szkl7rLS+iGkXVPa}zNw(9D~;-lKX9GtE^{;m-B%JGhz^e5sP4jH#nI z>UY9alrRiuyX{UIg>uC zIGdWLp;sjKxhjpmWW_g1%TW&TGC_Hji=?>^%%1W+)Zi4JHUx|{aIG?oE1LTB!k&@# zcr(%Egth_y%s%>QEj5*})kS8#gTs{hFTQTD31;#9StR=8+fMGC|;(jEs&4 zO@qSahkV7TsBZ{U-}8}me(2*%9G#>bW~pRB*)*B__Wjaoh$g>p!13<(^-QYT@=KY| zNuzxe!xo~#+*$_AIE#YNy3jBQtdd5wNQSpc=DYTua7Ly$Dj(asf=)r@_<8ICT$?He zaw-Z=j;?)*{jc#Yp)jBv9bUvb7}Xu!7NzW(t8L#qq)asZJ#GhpC(M-o$L{J|DKJ64 z&g-)?Eccv=jCsdlsckj}CL#`;r5@6^Pwd;R>zQA9^A80XL z^XEHgWX}aRN$Qkx?dPg978Jj_|EyF>opp=aGTyH6*zn|w!!i>iW3}DfZ?4Bm*_!^| zN+l#wAM*0zc3zk0lcSzCPz=OJ5pTMmvSP8s%V*_&?7MNhm(+aqT}_`(@12s*IC&l# zOUx|-0$5KmVBm5eEt#M%$sGt=T89nxIje;30T%_YR3vVolpM(#>$xL(YLuN9-`nY{ zHar>f6k|1Bs`0yN_xW`FTS`o}x_{2ckstU3R^5sCC@+3;wIn2y?&9owD!}8wT0X}g zr|k&Li*$q%#FOEqcG8AP6&HxbcXK!kDEvn7StL`Fiu_oqc{BVzP2bsfa7ORR#a#op z!_}1)^@x`%)_%6x_!6`~`J-4a@^##~7Yst3R-On!VUm&h;kIo4ni9Sv4Gg32GR@a- z+@92NUniH2(s@}{!udKX56b`3q3d%B*mV^5-R4NzuVSswKK1~UeV{Gdkr(3g*5+~O zW?tv@-8^6jw2a}WlvC>Z%Kn4Ji6eKnXc56TY7Tys2^=EUCx6o8W$yk7b<05bW|Xr3 zi;rF#OEOtoN6F`1;;4cTACNiy{~@AS&$ZPJGcRQtJ0fBdy8r$+tPlGw)w%!t_5We; zgu57BOq_u(TYF(x*=sAad^UCykY$l5_oA%Iwi*0yLTMn@^Oiffpa1e>8%QO-8}_ZL zZ_gkTjkfq76RjduxtsmgOcAaI@8@?P@BaA5ha2*Gc;0h-dOZB2?Ejc?aYFRq$LP}p z_3N9G64{7j9E}d@jD#W@6)~DNI6QdpV!0dmc( z4$3!kq5&UG4=?c^^G`6nMwY=d`Kha95K# zy22yBr9>3gJ;MGEoJ|xZ1;bISJ}n#GKdBeBUPxt$3#wTkBXGq6M}A^TN{*6)tEI_o z>zb!C7n(-$XaK@yvE9#vU97^{0=O-|+nTfE5Pa4r>9{=vcy)lUvnL|!2AbPr>JTiu z6O%sTtjwP~Kl7Z6xxc|{zgLvN3#vtyc~Xvm3pKmzC%IOT#K{`V9dWtD&reIi z8GT40Y%(;2jVAl`emlPJ;+;swnIwAklgCCLgVwc{4=+Z}#hDGc$-r8r`w+G4ftI*Tuq;1QFOc6J;h; z8W6?a9(_*?+qH>KiDCA~EJfB`&V^bANK@TKFgB?5ho2dmE>3M`iVXS*$Ypf+t-aO5 zg+S!L4;DQ$ed?tx2b>Jy(aLAxPQrMTlJ>p?Y;aB+7s!$;NL+m^ab0}SyU z&-cFKgWoel=PNv9-6TEI#C|dOo!j`|UzxTkvf%Qeic(6D zaPs@SMBx>Y?=ClgP~~Mr3^UmwT5bcE_~PF0!7Up? znGzF$T-|27ufXUE%9YTDU|qSSx*`u#v@HB#2C>Bb1E8Q>?%FesUG ztX)!H@tZZM9%y?&i@@y9IHlzXy6vjPruZ!E3YW6;o^^d?)s_h%r@8k)0^1R2mrs3R z0DgEbxr61dcaCvJ8Uah+mud{yBfVGESHRMe$v8VVcek9ze3v+>uygJ62gh7N#jaE- zVYjc%^~1AwFo!;UZKK>GthNB7|BbnyN*h}|8-&pRNKZd_<32H$G(E|(K1L89>9xvo zROxQ{%3(B5qOXqq?ONgQFHV|kVB-bXb+^vrGCvvaVD?ebecv=^jkTKuo?XNO(qu+j zdqPOOuWY5Q4t$?ValS+%{Rwio|7N*oC7xLbrc5|y-upE9GRkV}lr%>MS~pQEt5O$s z;WbW}U)R%e7et>}(D{r*iBLFT!a@9ZZplk-dKnGgm=*K>ol@Tz1}5Jp~yfJ8Ptq*Q3y0bwR3`26G} zU`txoVN4PM8@*?aq2OI@tB54-x}SkCSSeB z*q1-)S9f-H-4%p$Z1pf8IJW+6JLkS;^|U*lnb-DKsl7L6XMc?L6dJC#b5Jvpn$SBQ zUt=+R_;5GNVn?|4o@>>$lP`I%QvKRm^kP~?UKgNJJM&FQ)Xse>m%tlXr$jA+d?7fO z4n{wmv5nrb`DX-I**1Fq2LWqbbM|w+J_fN3Oyw?3S6ucJx9g@}k32^Oi!wt!|0Fkr zj|{CEl^||;Lywlt%gwX1=*~`Y*-+I&U6#*;w+{0jDIn}!(6g2}l_$dfbg-|Kl z;Jw}7WiTOF&f+pLs*G9k%p_Wo!Zm@Z!1xsuX@r0=fGbf=yhvYdW3ZBsGL@Z}>M7M; z+n&=@QN>fA3K+R8xDSEn@J#Np2Ru<)8fu28q^cW=wEDBG8k*LnC* z*lJ}9=GvGIDcSY=huT{*lSCu^b?C3&Vf0qqpS^TlI2I8=DM|B9=A@6d8c*H*4AU;% zZ-N(`8N{RJY3|==!b10g`l8l*3*j28j!{!JlTsn zZp2p+?Vmi_w~3C(s*KWoW)cHR3%Sz6B=GKQ%!^!IfdSSSgU-LYg=?T^ z@XyI-fH3vTt918u!QLU9c@=I5GDf$4t|xw<G$cTw6W`4G5)nT3Y`W1%;HHpL{{Xz+MQ=tgSX20dn9cHFAK^tnl{A`0^aR z8oW#KGnG}sokn{6kuodmJnXD3Wpf-K7~7`W{q3M&AhMV(7RJPk_qIsBcrct|=6g=i z=bcP+X&pWXzn-d@0}icif%SfkICa{n&Kcpx^}7KQ6{sb~o*chy!sC$aifyXL8$=-A zac>?p2ZI)~RgM2jBRMpWrRy0UR{zKNeTMxP3VIEi+W68mg=z!#@kSVo!H@N5{aIP+ zlO~iESFm!1Ehipc{J8KB^XlVHm3X_5@ZjFwzB*#^#ezwlax-PFz3jlTnXRqij_{!r zWPrh+WRnOG_*ml7R1Dttk})YarDm(_DlJV8Y~7g8wc>iI45MhIL~wABg+%-K?yqcBC*`M z=P>(fo6@)i_|#H3PQN|6og%9EkW^lt1L3)C;?p}$+aUQP^ND+|QC{9%c*4>@2Ko*o z&(W!)&TEucyeeUGPh1H)onm5QdgA=JK)wqew>s3Prf$CJ(4kRSWld9dm=SUS)-rjG zDsxKer6~>!3dqE=%g&h8nhyz4Nte9?afR$M3wO$?SUOXjGB#Cd{+U5HpchIsAnTu2CP<1KS07{5p*_;|;*zpBu_cn({T<%wy z7;Z-k0Y&0tc1iad!?FkRK|fPU_6h?IM3Vo6L~E*jYj?*(k7?1=e|9{U5m`X553m}) z{pD7tFB&I?$Et=!Vjmt-OfvB$gomHMigDibFwSuh)&a4(mJBtvogI6m_c=k~cOMvZ zgj5M~tOIZALdnt1RJ#IqSQi&671v8%xNfz6{ExJ>E^vg(Ts(Gce;;8jEWcQ&pmE)4 z;r99}V7z^1LwIcK;Zu)3xww`&E?x%~Mr?X|23{C#_UP^Pkn?7MrSM{MGW7nyBrw_E zGVHhiO&K9lRZPbfvKc7%9L1ZNUl@7JcCA(BVS^X>7RN;b-AV!@vtTM98PC=cdZ^lFi&b zEq2>Ync0?87lMeM*x9A;-P+~Y*__D;sqQYQTUM+hS;iwgBeU!caU`_gl60_ew4Gu! z$&W0lVRTg|RAlN^9wSo*$*`lkh$%BB<9o8e5FXBOUq#SlF$MytF5(UYOL26Orup*Wf^bb)=M*mbbb=V0?*UpVV|IFRXhmJi)N@T z>ZSX&8Exx~0#yo`Q(*K}RP)-xf~{7)CS3QEF>_}Ay+2hcC)^fhneDL^B9B@=TJEYM ze){kocO(AHe9_TM(pKtf?D8YkDnR7LF9os_}^~pXVuXn;n2ds9{fIM>2T2ATa5$?@3cZ z6(m7V(7#m_pu4^}?%ZEI^6-Q%{k)1zVQ}DB$T<M z98893bhQqK^Ot)Z7Pui47*p(~aR)rDA3UVz307xuLqb8oN`*Z-_+UR9EFr(dJb!rD zBzEo^(UavSLpE-&-9%l7b`_EP>{ghJK7+(e@ZI&rC@uDbiFhSs_|yFZJ9QQnN*hnBNPzl5w31XQQo zU+>L5MRd{Q{i??Y!uA!0Yfm5@M$5z1#Mol2+RmUa*s@hQ+Zw|ziG8m8o7bYVqx46- zLhA_!SE;?ou5b!N>%A4?^VM?bU*|(|m~h5>(?}55WUV{sLlkcF7C95qyVD?N@-|UDI@ngLN5iZ*5ra zBiAEM?z?x>3iArs96sER1`&r>2=f}Y8(Bz@MH6_D6Z9p;^QhX@WyxDyN2~lozuRen zo?Vp@ZX1o7%+yL{z9r*b_39EhA|0yhaL_$FC%gD#RH5_i%qdx_ z-=LqDFAycXq-PLv;u?g@K{rnZ|7>q}Z~ori&ZA$qg>(I9+s82PzzJ_=_ZLjQEl?0c zWYpyL>C`$9$FSooa&gC>UfQ`kRH7SHi{2`vk;*X0Y`r}mHe~-$w}LAcqM1CDqPw2c z*WWiPi593`n_JV(tDafpc6ODgQ%D&%DKhub&jLHCkanPK=RFbpc$HiBe!@eC9-cM-st7DtSv)8dIP(;?&heY98Xl zk}>k_l3vll0j&oQFB7dX86$53pHFL~q>4!PvNQJZQj}Dhz z-zg*zpLVl}sS3#Sm(M$_%~9Pgcc`FZqGI(1IL-D_FmVA%;avZ@tlKq8*&*Tq^}o-K zNkDRsC(s0j&|L^+LoiO4QWSfhMyrEnpkJwqS@B5C;AX!Lz^8kC<+$WR%lEBV=FG!N zsv{eDeTZDg!1!CG>YTUPY8iH4egkiK-cEB4N6p<{Wf5AlA6*%`4uTc?b_Mr<(S1$X zz~CD&4k|N>Hg8!@FDPmEe4c+#oq{3T{o*)#AL$B{0TE`UuFesu;PDZ`3MNtOnO}=C zWy*E@;wC?cEc%^*_iR+~5Ck~EdcJX|C0k8rboXOoa`{P>{%+l`_;P>;EYazn)DgBC zuCm9(JykD2h_Rf(e-;D$wD1G!H|IqPXq`QKwKDSBGYH!B3>)=mQ+NeiW3>?;s=`W& zedCRdh1tpl3%x=(cnQQ<(cP%EAw6Qrb=Tp_S)?LKyIO%cT6W}eXcfF3dej|`vft_G zP)HmewNO7upm^c|oFJcV9+}9$dF}^N##lWx9QB+7hwBU|0-(Ny2)BBYWS&Y--j#i4 z$;Z56*u%cBggyOF1`6WS+5VaZ{DGzeUZ+fzko@@N-Kt4me&POd_*@poWZvW}M#6m_ z<@>VcAvR#k>!h{9lBpicf+;`Q*Jtz+?*$Z-m0D^v=1uK*Ek?QM;|e2zt+S2y7Q*;C zLmzl3#Of_E?)P>-UwEXWg#~8rgmFt{z8?55MI4n^S*|T$;=SeO1+dl zG`YKnzG~6ay0f!G)pdB6OAtBOK>{`eCNkgbA+ z0AL)n;9tg9K6rBcs|4jI=FC!e@LE*S?OhzmFvIlI9+cYx@vv@h?*h@)mQ?SeFmdm$ zG|s4~D8RJ?RLO9{dxcsOarh$u@>=pcSDQ${s;KthLTXqS5>6>0GrvKO|ni019G` zh%{Gn$ekBwVxn*dSYg`j4cN6lU=3$X5pf({Bhb%_%GS!v7>MYhdrRg5{EV~uS?%Um z!qzJeN535HgCQv?L%x@^^L}Oh>oO8z+aB}MPIZRC<72ql2Xojv!b#lR=3^@KB8ExQ zzDqmclJjhC-7##+?1F}-=44pCJ-Y1ZoK08FHpq$rf$~bwfR@p#YkHOD58Yryz?9Zp z&C|tM`n<|&s>pQ*>+bX^P%akrTZOyi(;0UN`gO`@yA^?3w)e*AA@6LB!|D|;A*dMt z)1g5pr@bL=$Wh7V0=ifpX)p23os5je(B0jB)^M;mk>-y-1dI&DgyFRjM3|>cL(r{2 zRs~PjjYavp`atJJ^2-A?c>p0)th0l%w2A5I3Jy7W&SM_=QF>IBeCp}9z?D7s(qw;sBV>5!p;!HuTwdX_yBEmYU6_QYr75k1EE8{ z_I+XhM;Y+?9Up-6>{X>2NsI$5t+bQ(z2fhrnvC{BY<5k2>O(G`rAwfkAYB5&dXGNI zuG}>B*s^=^!ny-(d8g%+#4!IWy_myRa)haB9Lp`P^+Nxh!vup!f$|LUo){j@*>p8jDa!>|lQoC#5qSgYY5GBV8r;JHbkB>;FvEs?} z>zVnZxh(R*A$fQ6rhzr*`nBstSl4K$^%4np)wpF;J;weYd65$%DMQy{iDJA*UtB5_ zhA{Mw6X^{y$R#hUbVvrpCn@(>cW`32$T45%DHL&**}2Vbf)I@X6C9eS%zB>rTZ z$@HWcz9Dc3Y^Og8^hXPx#0v@v_Dk{?wP*)8Ku67nDhiOKSl~;}g<<+W614e2*{>aR z@;Q9gP~LAaXkyC+Eb*6q=|_)F`-|@(+idq1L%cE5V*^o?N382~mzn6_Ky%_dJRBx| zaXh1)8)(5FM#|+}he&#?xzI{6cpsoByZDSr^68R(Zys}LuM;y(ds1#*|3eFZ+7tf1 z1g`g8iJ83Kz^}sjd*$aqb?l?y5L!JXJO(G=LJW;v_;k4RX9267$~!P1KVfAXe!htKGVbZ%&*&yylzoFJ$@#V%Io*MSS>{M(z8rUV`@lnd3_6 zf{mjM@eKFl5ASveZ~Br&m%m(HLcbQIS6cD{tPJc}jY`!8FV**BITTRp$l6)-Yn|*$z$_ zgwz_7{|fT4ODuOCz-MG;VDUt~O)i^HSZB$(XfT6tGczp(VD1W`a(iRa)7xnz=kOTG zf#=2>R}jW3`By^}xCQYD0siveU;isD;}5t>e@n)J4bftMl@k#8KLx{I088{QT05gU z;axORQJ*nhTL%RMc#MfrKCB@XVe1{Dsa;++gzC34F7YU!$%#OTlvvd(N%y1M_`0T@ z`sT>2pl6(ul@>yFvue zm!pNJdRa_OOg#i<9iJaKY^&uw{1nJ)+}YOF2EX2AMk|aZNQ_MSY`eiJ9R~nX%PfR{ z5dO?6Gt7}ZPw#nwL>yqBfp)N@ohvz3w&iIzc*vTvl>?0WA7UbPxjvM8#wWyA?Ct@} z0GPG};sntkwi*W`#`gatK8``+1{f7JHKDd8Irn%!RXGC-H7L>&70tKV?(FKyvQQp9 z{3nMg%4zVEOsW?^zE+l10tN{!sgYc8$lXu>o$jGZ@{lpHnlRparwVX9`&TK#>Bp() zu0D44uo+~nFFsCb)e1dQnl0(-)N^_@(j4zEv@Z5}7YzdL|EU!qW~c;9NcZwZ3+F3L z?yC_~Uen`LO%eS1$+hUE!NMxtk}s652K$=q65m1Z_b_6<+07li31Qd%FfNEt>M|=+ue?qy(7@B81z}& z#3Db%Gc5TyBP3DB)UCC$lWr;Xt{or?0S7lFWhRBB>+z5LOqt!e5cPjVbka52Rh;z+ zuRL3P%KuxAbcSubcA1)NYr9Ygl4d=jTlX zM338aR<_M>D(IN;TR$DhHT}1SIO-_@aeJjAYgu6Nos7wNA7D{v9*PRixiua#&BZIVvh5m(@qZ)R|7EIQ9r6bEX}A&sPvtH;(26 z>2f<;Ol!VSP4R$y;LYN)A0(Aba(r=c$afJSkjdYy7@Yb%o+ENS7~wxT_l=`oyK5`z z@3@orb2k~icf(bdGTJoz5|kd-0whJwpkPo^AsiD-)>|y@%53Z6{2bs{_XLT!&fRmD zzhNc;D3LV`D3DXBSRMWePDt7Qn6&9kc8<1@cZt>*KH(}Cvq9Z_sYl+l3!J)-*jULJ z#2s}f6fePXMMp0=0aGut_mg}TfxK4F%Sc}OFs)kj3i>-7;*CKXI`b$?bT3;+6LrqcZ|CI}gC5YE$yiD(bTABtF4lt)VxC5W|z8oO$EZ!9)0Pv6)R< z%ir|~BSx0fD|>6d(xXN;V|X0VTNka1OY-6Y33y8Ace_B%is=P1I;9H`47RGLoKj{#X_!U~=)J`$2kcD4>#9;)_W09WDtg=YfRus9Sw zrFvZ|fww^D17VDIe0<1a=hw?#)(3IhuWq)On0NAjkI?kg`5sVFuWsn-dYF*vmF2Iu z;*)Iv7+@1in6(Eh&A@eoAyMH`p$x(~#|BB2Jgl@24k^Oz%RR!Zhx2&TbHh(dj|)vZ zlRCM$hNZgrqJEnEm*z_HOAN1z=&@Z5mA>ox)=528$KiXTu)X$@S1{PZD$@f};|Vx~ zlwRoVO)?T?iMdyDNep}ha^{^liOnVBOkyh=UpO-}`+`~vw1HF40Fd!TEQ zIt(QAI20(Y#2j9d#3si-EjJLjlp34pF38@-bK|{DXRX~QhnB;Cgt-I~h} zmj#~64s{AJ$n2yB?a%1IG8hGRSgwb3aB@QB=6xh;d1MNP9QIMc)m~g&f_EU0h=B2p zloxJfufE49?tTLiZjkPG_$2?aA=FfblCm$jcURqpX}D9vbmAIVSQoApV?q z^tQ1^Fm!ePO#kM4hVh?D5U8fLpJi990#0X()Z2?=RGmzz5US_8P)etxEVzDJI%bCB z@u>XY(V)PfaSUoJV?--j?HY}j63a)}z9Z-Y7(Dt2Cg zZ!8a1JwO~oA&WbZH_dVAp1Lo2A~U*ivb$+oS%x6`r}a$beWU|KXdxysmo?K>{zsT) zuk&WJYBa`jmPu4pH0s%l7t-jky=PYCz_zxqumFwamiF5Oh7Lu}AKjVJ^75x>^MKmG zMSt+-eFnyxS!>8JRg=b7QkZ^{iLA_>4|0l%oy)R9MJF1V*Q8yr2Cd2{|KMO$K@iCO zK*@=TP&_H*;B9;1-{?mHwptd7az!;PCNiGhnkFVnF>YcGZ>jOSW4CG^(qt)dvWmGk z(V`p4Pxr4Gz0_GKqD%TRR>r(2FVfZdn(H6q{MyV z*qhxT(zGl}I6>6k@iU%X$nn>JeL!GJe!_@lZ!Cza-OYN9!|^|{1sxbU%_Gd}PUecy za`CCDg&SM^e8bU>Km_Y#yCck6n~@QU?QcLFwxq$pv5MDv{{JTw1?Qyce5uidEsVis zWaz$}Yei0Eo~AJi2?<57m`S|i_6t2`T?fue`Hh4OJ$fZNoe2g6BmCJ)z(+A^Yh#{@JW?K zgBqXD1)vSh8PHtUk|0)N(?=Z0r9o>= z?d+l*HassGt0d<(T*gpRXjBFVDogjABcT@ftW|$*4X%~J-RGU}X1ViZ_U6~XhP83j z;+u!Qf#I|O9?_cq)tzDkg^2iQ7%R}-!QD@DYKGFzb)y>qJNqpFS`sGj7KX%W=dg=W zxgGT&zOFUhNJ2gk8P$5)>&vBEW1GVJ{^4R_fMZiyWrwz~OL%Z07u{=w-|RT&;yD#< zHl$u&O_ASc_)H+{HURS-MLeu(>`~Qz_8b<$4sRQKR*|T;(=X@b17}>BS$iK(%b!OJ z{-SR_Jpi>HQZi3^$#BPgzrEg|-$IRdq16#Ee?UHb zEw8VK6O5G^c%2$I3lT$Pw75&*EqxsPr%4HDAvyc#!d-Y-AO|QYhz@o(VdsvAmPp91 ze;3`q6D>EqU)qxZQ1Ag8A#f5CzIdmHVqD$ja1@gkr%}5K1f+H|!rF~dFd4%hga{4P zz+7Lg`iT1O{m0dVEN3*JE$?FOlkVQWxTMzi0ytvE7*KbTAJ675o|Keys$Fer^21hx8rFVBwZAzx>w$j%(K@hW zAnqX&_bCen#g&K3_xSnE%x0e$eu{uYj6{G}WY5Z8AkT6#gCJ3sDhCu_<%FDo)AGQa zal9$D?dhZ*7?eAqO2MGqhq?H$k}Z}ki-OHvdwG3T`4(&)qN;oAZkD6G{;6dw4_yL5 zK2$ok9pkhvs~~&1j7M+$P)=cMZ>OrPETg&&zrLXZ+UhvUNeVINSzA@wU6a50;lScW^X0yru)V!=)3`G^Z8(m1bij4vt_XVC z)OF8M7=(tTcdVLc^a1!tTb*Ff9kOe;$_y! zi@1*<2o6pJeHFA=Dg1gt{ClPO`gNFE0Ew1AfHRa?8_pKxbFB!kkx}O@fWYBTGvN+|iyOaO&i6vM00_e@77RGAcbweY z9SE}HQSbztFoD7UOv=yr zm&rx25jum@&yJY_T?9;R&Hg!=^ssC~FD-!pM{iQf-gS~`Fs-wZV~+bU%i2edO-PP@ z${*~ummR{R4@zhd5E<;cZQo=ff<$B7#GQYh3ZO9acwb zvpz?u?banh{yX@S_@fFQ8A;(x4xct^?M*WTV9yaL+%eSjH*THb@lue?n&m%P?*07T zpcX_4ILv{aB1zoJ?Wx^1GS7SR8{iWbPyht6$6}_o0OwCx`F<~^xo;A+fnl_dc?q7s z5ZE{JT{-?YKj+rYRT*;Sr2AHTZ+W0?eIQ`FHgwdJA0+Nr1KrbE-$Q4xcqb`w-qN8^tN0bNF~ogggt;kh^zP$; z!bX+L9{n|fJoS5~mo$!MGU^9cYi<0?8D9(C=^~52=7u_WXLr?Hu`<=nWt1v=(bxpk z$L;(liX?L{0V_V|( z9F4Ws))q z+C?x=lN|kP?Y(7qF73P9YU#Kb>jQH4#f6{*8$UlcU)*dK1}H)UHs4iNSYq<0j#RL2 z2`q>|x;!;tnkIhv2G>czXaHeerh1?OZ+M4a%QGPr?x_)cAOwC}dXqfY@&{-K5Yl40 za*3&T8yS-j`jQ5p1N?HY2VDzfO&ZxLlBImWK$rg91i?g1$u@^fT= ze*2!=McY6B`M*&UJ5Yr}@qM6fIeWUT=8T6-q*zcjPi-+ItdXzA{*m|W$+!Iex(Cd4 zg|o{j|9pXOSmP8})MH}!&f4VLA}R9!zAHwGJu{sN9}Pf9M*+|OdJ6RzO3*Qn>z=0~u#etko}*ltm&;NEn8dUD8?H*RXvyA=%s3V& zTwyp*PkQT?=+Cyn@Uu7c4ePt;VlL8sYV(T}ADZ9#9BFB5zfWBK)t8}=Uv!tp?9a!D z`#DFX;~qG7Z~!v4gtTvEIh~EueBL$BV3cd->-NifBL63Aqy)nsr-BnD#Pw zw(jxK(SZ)#+Z3Pzh&{SMA-kY?%>3+!X?YV$V%i3>_(TZ=gMmi3bI)d?;qotY%DV%s z0NSgdXhI~4QKJ2`!kV@aguSE7pc)07T-=&5l(S;$wD^CBoIMmc5dN)&?A*CwKXf{03!ZUY4bM0$;Mr1xG#dhdi5q5>jaM0yFm_fBZid+!i>uK_{} zkYwWf`u+bL%)wkUb22%|waLY^_TJChdzE|LD_BKIhM16=5C;c`_=BvZ8V(L#8V=6w zfV;TZUuHON1>)d5#Q7j8rs0{qzkv5~UYZ7fnd@7EfW5kfg+an}v42ED!U_XdX=cQ9 z$-uzC{SV_R?E}g2C~%G1a5deu*nIExn=>=r*r8WDS=VlY_ZZ*d-Ns7(^C`3R#s7DN z^Kt9p^4}p&Ll6$Z-|>vd9sa+=--pkB-}*cDAi4G6@3740uG8P)=LLz+{}H{P`s1H} zelL`!RhWQUJN7IxuL{4hX7Aau_+rOhI*TCqSH$OexYvW zS80^a=j4^gq$`{eL#)Taryhs<`65tvlj6L(y3=U@Ci@nHV`(>ibN9e69-itY)TIvy zLU{Rg+Q=`2CP&<*J%{d0arW8so1yuwcQ`l=n#PQ|2a}U~g%}+jP=%B5Q%DkC#b{&K zM&wTE)8C`9H&@*)@J38_Yfn$lkuimzU>evF-+ok4-J!p?Kl4kIkXFzgf<(w=F%WRQ zR=UAGQZ1j`e$D$fiEsgOfFFD|8JZow`!wUT^)+TQs! zu=wnxt$L3)uc$G(q-*@MockK?VRanjaJI?T*||4aSDor}b-sq2!=Agly9o}?$Q}GM zT7;t`|KilPw&Uq|5zTNocYIN^V>xf!e;*VP@PNeU%mbYo7ZJXr6C!0{C-?z9y~8V| z6!6Lhu%g1%)ddk(qH{42P4doa3ASKB33KMM-SY)Co+jOfxnjn>kb(D4@8DmR8lNp0 z3S-{rR(s7mP}jjz=QjtEGic!3+rRhk;5iM`F7*{dPU2HGL;3p^VZ@#*Xv%RhT_ze{=V9ZEm*1@TvS*%G`o7o0} z95?teJcv7MmAZj+mALDqGZ@mbe~|BGiQv)ZAi(off?kz(gJ)i;0oz!&J=i7Lhgorc3g1?dx;rL*J_RPoHp?aezkGle5)kJGc8kXsh48 zxseWgvc9@c8~5X7v<*~hd!bMWGHf}wc}N};qu?VH7Sxb**r2^iy75kc_;h=*Gp&Ij z@gO^Xrciqv3Jl$ytW0XneH_gF?3jgkWHlp0@K;QXdRb0ZR+a6v66)%7-7m#K^!VO~ zB0tdeDfbg~EhDk|sHmue_5CMQ^ivJmwbDQ-vB}Mw8(iw|cS+7pPi19gBO<~{?_MrI zrFVduD(dP1?%& z!_jcRhQm<2K&kqAB&Xnt0fB%fm3P)c$#t@ZnS4Wo!~KH2){Ow%~_lrS)n z@zd>vN*eQ_UaqZIVRSotdu(z2K)A^M{yM+I{@t}tfm(w|B2FpB?Aur8yA#Y6qfNJ* zt(wNQ(p$=%Y2rVy#ISHOZ+vpIbNcumgKkC`UGF@n;{*j5@ZrJjb~XUZ!m`Jkj^K3($#)`**E@8u;G$4=*S zvF}hZ{|Ip%5ok64MBr1|;lW{3P~DfF?{87ZOonw&NGZWFyq;H5tzx&Bayc>W?u_^- zBZvFs%yAi}?xarh>Bn}1WO!Bi0YP}K?G7dGKrU5DWj?j;*;!`TY%mRlalZ%{V7$hB z3upgpuT7*wT817=R4)%$El@n&%sx=|wUgUJf$xDz51#W`5}=?z{G{@l<(KS5!HJc-h zCA{EeWerNI5cQ&pbMwKCxnt~$KtRB3TMmmWBSnio*V)$UU6tSTp}q%kOE==TTW&6A z6Ds4-SC)Z?nIA~IeXlpJ{hCF&72>|<4j8<@4f45|X#!E|;^wA>|tO=zO@Sv!Dyd!t1 z4Qa_tO5M#P0iaJdSTTW0d0p2hh)BT6h+&cHr?toQpcBmka#u%*ueYsDNkbL8nVK)J zwwBPBaeJx$*7EP?G|-o4dsnM&gH}uEOpd1W)DnxKDtiJW-^21C2Az)&Bhu~HE&y?{ z+8Qp7JLAv%uTWQrxU1l>hI(f#OJ}D3?H}Y zIlbR`C#JkhPEHQJyyoaWN-SP@R>|RK#-_j$jXIfsT!Q@I?adUJhkJvn^SEO>K#;>K{*}a;FgV1NdP@VS4iHSvbxH|Utafe=x=96Y;Qhb(aBk(n;9wFtz zGKJ!c;p7JX>)30qcNMzwdJQJ?A|#@j3=2=IKxlXqM>7(w?JueJTUNW*a*pZMD`iM2 zM-Mb1*UaNf_W7`yo!*)oP?owhv$kQA`oxm1JAl!s5U>}-uhW@YR2r0~x~>(5tQ z7DanypMkue*9I_sB$lBZ&Q(tNO+3!C*l-9AvH27z)!C)4Cbf->TTD-^RC(=-Nr~e~ zS@2moO|3QZi51Q0n{?$sX}>aVb`g={jz1T@xrR4^21AyNK|3D`q&L?o%DS!&BD1*( zsGo59jzD9;Sxm`#NH_g@?G0Inaj(tN_fVea?bQ z1cbj|@%&r};;KI_0vrTXI7;{qM8R8-KWs}*I;R19-OO*QJa=r^ZPHrGM_JZt-h+O9 zYoWB&YYhm*!WZHcnv(gX=#%!?a z!C|?^poZ6sj0;br$iCH~re@{QdY4zM$}*Ax2_M!=LAwQZgaL-BA5RDzRITmzN;Y9mUmKu2n;&A~O{g(!++fgfzu;(u zVe;Tr7z1)f;zGq-fp4}RF=|jsoGJal>n6&lK5AGL_0}*x`?r{%*rQ3M%nZSip3qV4 zI_0f_ojsK4%Qd+Wq8&Qmd0@i7RE#5&;f zDP>&M_5~xi@6Ecd18D^;+m>d&v3`8e(XPAHUi^Z+&V4a?N5Q9Iu$!T=*#x0PD6-94 z7MnH?6qop_#b(&iIb<=MoGk3+XJ>#*Ufr#nvhmdxDmj$GatHp+->w>S=7Fxd3;~`K26n85{dQ4)1GuXA;~v&@DJ1x z%8hc*#2waZkAn8T#_Uk(8jQapQ3ft(=`j#KbwT-$)I|M=w^Jd*!Ku>6cgKm*OG(uq zYtesVYnjn@!`@-(ac>&-Am4VX#MpX$v1T5dGP@&bSGp&9I&qQJ|G@&bx~?5vH>}YT zywrJ)T$NcQ52}`}?BhaNlK90y+wXSH2m9-o?$OTOJwE_=&l^VW@TCHr3rZq5?N8jB zloXn^KJa@LkBUi48|weGR(BjzM$Gv`6PvBWb}C-&?v-)cOot+=v~&ATxP3IhZ~yLsp;RjUp~3f{^$A3Kk};~Y z8yU)JAOc~Txq6n~OS+d>k}N#A?7_M-&0C{8{%S`$5jNvSbEMHk9KUKHL2zN2IAj%4 zx9FkY);qpc_ocovcbBrX<>qJ>-r_3-Ht-=tF`qGX%c}%ullxd*Im`!#~ex$U*lJdk}X(RRL}(_ zNYh%ij^?PaePw@>o0a7_2i-f0ipILct@H5VmMiO#-+peh(bf&g>rCi12>Bkb-PZZ@ z7`+(KfzjuR3POkX7oHCQ0LO*r*!(jkh1NYqh*wszI3UT=Tyrv6pMLq=@<6F5)`p>9 zP0PsSh}_YU1I1F38%MyG#_PU@!rGZg0E+q|x&?V6g3=+8c^*}wQ@yfZFON+Rd3fAK zoXN=fL`%}wwze`c=Osd$XWJz^T^TLs(vi|fXJ?b(y$#iic56jW+i`pG++l-w5jYwe zlcyD@IZ@nP5#loS{@qS>_#mc*!NJ9pm7`Gq3c=ALKQFzY)iH7JUaz}6hvU&0Th=_! z4XRXM$gsg<4BQoN(KiNVzKvTd#Dqj5Ew7>*;eC*P;^C5Ts=}>GG{G z(Ee!Lnvv&@VacnWKmfWGkKgUohs55zy85RyP)QY1RTb92;F-9Wc^s|{smD4Wd{Pw^ z(;>DC=jx(Z>2mV5Bf0tLIO9Cb(^M^wLve1~25ibZ!fq$r%y>?R#o0KRk{q3GSHG+G zuQP-!5(W4MYaFh=9& z%A}t;(VO=dd48Vc9T0-PQ1#-=Q z=d2_o41K~4qpKYRon^lY?-ml|FN*~_!3BYQr1J%svtsMHc#9<<4o({J2#;-CAK9YA zP!XN0Gg+LrjUHt|cxqkm55OS7zet=adR=R>Vh^$P?IG4SaS7oo+(i^~ba6IG;3)p4 zc9@(S)UP?18UW8pF1)~(jT>@j+lmQ+5=7wRO%ApcRV6oYHjA>eE5Y8&+2Bv-KkFT2 zed{^Ea(rCU5XAV5S@+`pBSJnhG8_7;)-6PnFwa5nf`K9SmawuE5}pvDd_jq0nYp6D zlHPFtVV8?@OjO;kH(-A} zi8>1CfHtuB`ZmR*?mjr#!apG*9CQ?qb#=~XZH|r}_rBQgB2I$MeEo{5m;Qi-_!b&G zEGU+bccC()2YBI`^FS<4cGeAF00!*UTTC3a8uX_u|G;673jWXwg-8^NvWXz(il}29 z*{a~&4HlRc92^yf>ikzk6LK3$5uc_a1cXAer|FwNj@Z6vdJaw`+NivPgqguM3)J%S zHzVx0bLI!!(uu3_n!+=pRar0X%t*?AOAa-BzhfM>+e_Wq-ETX**nWD^yG2y*b0W~M zRkVgLZQKAbUq2Fq{hp$`KHVyF>x6Q&AOq23rJ7RDU+mG}?hRDp$D()dBJR31O$n^> zHhDQLRYx{(0iHkq)kdg5v-70jfa%Asbx>sTgyM(tdk&-h+72IyB||+=W~b}BEgx(z z`HV(FlJ;*`R~048hpFZN>_zuOPQ%_rlZ@LNnWT#uM5fO%_{qhc*w0_Mv>P_KeG2cy zi;QRD9$5~mv9K( zw_PHw{SB7bZ^9{1*o=jYFtAnI+oLqpe}8rMY*Y{u>yCJ2FkKUC8;s3ExKD$8yu4g)dwJoVjz7V{fqg%Y zQl0kow-!{?CJa2dIyHK_+*@im{C2xK>KQnZWTO)IAD#4RPDX`yZEw-oS>Th#H>!kF z&}xlz_E#^D=CeMotj*m_8RW?1^v4y>1>S9}l)r0R^r)R+RLU?xA=Oxg+v;-S-kOY* zbO61e@9IPX5$q1MK{d}~_uxPmdu@-$Hi8(yJF!WY-ri97Ja|0_g84L;t166G_lNz; zl)kT9;YLinzvybUThw5o(6BQw8`^MAyI%5gj|0@#Q4RqiZ?mD=I^#!49a8y#bJ^Q7 z3qE@+(Uq1;Q;Gr>6J;WE$E7W((G*U;C2l_rIlV3*5qN9vT_dUsQS_z8Zay=#psu0e z4@`kiDvUVwcS`~Azy966P~4dDvmmpy zgXbwSVVp@7i_8W4Pi|1#s$X>mlrkh(jv=dWOk{>gWB2rzE5z^)= z1Z4O)XL*k(@LT6xS^Di-I86CA7GmFkp3VFE?om(NXLz?fo6BH9u?MnWN+%9JuMnur zE*Qm8b;?W;4tjm}p(5*k{XE$3Y_u%qmLcV)W8Dlba|gU91`RW}UH z*YPx7Xz>9CEXMS$vSKfF9@WVQ@bR(9U|WEC*oqw&b%&8omCKnlN*UsL+AQQ)+Ta*ylgo-hZAAE_ zrg>9K5o{~-CCI+KT1kqmo1##liN8cncajmLn}isQFc1$Uat0R=;NObK%X?7Te7P%G34MSBf(<#z@q6UDCnmiw28+t#cAu zh5>X0ZGmvu7EwY#W{4?6GQ6~wcA33IrEPjn`PEg@@FWeDm*RZyUXMU{M)-^yA<_Ep zP2S8s!6Gu5Td7_;7gZYl3*LyZC5#R=NFc&`4+0a;RiKucG@a8p&CPn<4m1WGtro&H zHK%WyJQ-0tqJ;Mz+?@JPhgSi)mDZa(YY?E4^6XZ>dJf*5aZe3kf zS)PvehfUuzWW%lL)RGMOEV=9qoPa~4mpNY0-7?^!_ZJ?6O1KbP`Xj*2;B+cz)p}4b z^Q$f93smL%`;p~6@^_gcp(7=O2MZd9JGivEv-Mr-^!%Ph>?xVwo@0w`=eX5R5vM{g z%tk)_3;I7h3s24aS|efKU0431#^Dk;*1-wYqX=ZdC*HoE+=4e=w8Wj(`Zt5T9rO@< zlk^~8^xoAMc95gqMQsTIaZY%2v0lyh=hRU6*mF_TwqpJw8@=GL@Y%@E77CC3C+Rd2 z?)$kA&yUxe*$*CI7KEiWI~-elG1#CdJ>sS2^*`GJ^m%1sN9$ew&u2{ zg%Sh2TGcZyR-hTU+UOo$^gYv^a;h>ZGD6P}?2x+C&`buk-0aguld4x84jZ>naoRoX zJgejURd@m80r!7ngkBe%j+*tOk-;{_RYKc>@2!)Yn|$naYvWz?F<c-pqcZ(2dtJ0(KpWCdx--mKk^&D#V3skM1G6KbL&-HRI>l*iee#6TWG_AF;8|qWap}#ogSc zOx>yh0*oTRmm&+rfrp%5ZCj(etd*?8MA4$GJRw(u zh4kmo6goNy@vn(b>a7C8!uEIP5_^u`B3kkE)_QxbZ+$@z>U^o~YaUl&J8s9~7A=md z)lpdkt6xOgbV)Tdw73S@0@w#cRhg0-em)}KwfFVSiu_qApA--H{m*vSh*i;U4-hL< zCesdjoI`@Jj4@u-jghuJBvYv;P1;@w$lHCoiHAWYt1k@QVWD!CS`t(_B^B5DqD>;{ z;6r1$B95(uFQ^GrdS)}~hEJ2^h5IEs>{1R z)(*|X!JIC1!4$3C>$VpJ|2gwBZ^Ga@t!ym+)R+%66crC@41>@ozeamT>-NI$nDfUaNU#ARc z)%s6;`lDsy-U)p2SJ;IpCO@t0@=L?k=zOh_ci3=g1FqcJ))GZ2lJ!jk3i^YMK33vq_+CA)YI}*Y~@OLxPRV9j-0mO+D28%TR~4 z3R@}Pso^*^`Ii+FCy7e*Lq-v+x!1tP;?&$bcJuB>4aR7;!o2&$4=%Thx4bmuu1QDN)w<*_Gbj?~^@!Y|x;IlOLUb9Z#BcTJx z-+GX(rmLYL_afy5Z9dfVbR8)JPck-kYj0c>X`r1sA+arLTm5O8JH%C}M;~`)t1x$9 zC=T^%a5gRZrGa*PrkSm_G&*?XVH#rFc!3;N22_09Rm}9e0U?DT=rV`ii(!B>$;QFl zU_+)UsgA4drw8+7JmV8vk%x7Mqj%Oj4#^d+2RcT_4>4P<-ZnA%Cx}J;nCzucs7JbIK(G7^r zHQ$7}&hIm_@}Vv}^`jmoz7;E$yc#HEV9YgNc;~t*aj}T4OI}=t!qro>p2rL}qV6Sr zTrB!PVxu3YBMV@48(y%J+`RE+K8q;9Nb$*%P#-=nqH@FnW5zP2z(qlcH;+Y7M_)~I zIr21EzyOBL?naRXVkWKEF-w?=_2p462M2c7obVRVqMO4F2e2_Lk5hIVbC|_vV$kRD1h_7dBLAa1<$xF4* zYcUwmY`%n!xEggJ{iYJ+=tqrxpaMH)e}0LC0kF5ZE2rzWm&^>CR{vZ#6dtRuOD`F8G;U)N*SPAv4Gg3gC|tyFjJt6d&o@l_0cf6BrmTh=kjT7XY<9C zy8qQh#oLX+`0$~ji1cS)u1wJe73V#@h!zk=)IJstJ|{)R4ljX&ugN190ho(UTOr8+ zQN;Gwp_Jzd9@ogDLaFj&?H6rdjXhV5N}9r)d3ix3_OIFb+!T3FA-T2{bOcw+f7FXp zCJ)`pEz4nMW5et>0P;RH?hcpklv>v2MYf=;v2iR+OW^krn|6+r= z^3g;A2xFic&&MMjoL+aSzKNo`=x#;PmY*j$+`84Qu`#}|V`?`(1qzCU_+Y|wDPix{ z3K=lz)Gx*t;gz19U2&;U__X6<_8mA3Sk)X=luGNj)(+3Z#q0=i1mF|=xh8~xJC^1Y z6coeIwO(~g4rfQ@zB4gIqO{Ay`!p6AKnebjfN27iHk;Vt#3QEBa@q)blJ57 z0`H7Eeb7bLECg*0r?|lBDy_%m8WW{oFu!%)acQe%XhE+_0Da4kO5hethuFxx1K)FjNk0SROp}4po9R5~bJV&cV!%EjOO#nrCqNDHmff zA`|}F?zojkIVkXs=tWm<6@?CYKw1M)`SIb$KEd|J1VAmab$WpELG$5`7;Cr)gh_FORBH}% zYH41eqw8QFQgUp*+}?wO*S7W)cid2_f{{Z88sJ$di4ncX zCzT6!I%evhZal@77efk3;V(`rj?;Y{5?t&_npWUvyw&BSvQt0*($B0~wiB%kqv5uu zp3}RzWOK_rGM#Y+%5Gva3xhG=78VT80Ao$=&d#xY>qT^RWJyQ!t2{eY0>YxDRaMC> ze%uw>7el}$-aRk_<~`+Pz7c9d0;mR>Uzd$W{E{=5i|HGea1{#k*J)gyqB>(UeELwu zKAL?LfSIzC%MM{lHU?j^gqxl3Pt8VSsU=WJDYY5#X^*b8xtwZ;W1#Rs&u-$}hHY)} z5;V@44Yz8zn=_%8r@9(zh;j$PVM!I1wXYW{thjPOZIiPfEKHO3;#Y11&`SvX7cviM z-hT-TD{90;Snft{oeT9n50;d>^}yl!c+3GnKQ~>l3+;ZjQ{jA2ZC6EWuf61lEwgyj z%xkl?l>a5(jT~MgJ=t#d6&>Q)Mb)dFdixYbjZ(?NbQ)cvWnb^ZIAQGz2SLM2pAuwf^br#K6B$m+(qn=k9ZXiYFH&d`=HP)yR4#oa~bfRT!cu<&@ zI=9?r92Y^wxn1kHl)0i0zb=)&I(bV^;QB^eDj9DAb-UIj|60W4FGkIi7d8!|K zXJ75^AUGEq+)nC5W3wQ0Z~(~v6YXhnsiDthWSQGL923-Y5sD!M%I#>mK8j@-zMnK=zkV^-xHUlBy9u4m|PJk307Eb7XLm$7s48Lr%6nDfoIA-Qt@?zsNQ6 zz78F$2>J05Oo;DXd|M%cJE5ISXXgnO)S=%&ucPlw$Ow$lFP|}R|FxUY;){A9RcH4M z8WkHQvQ=XFOD?-tnVfK=NC+Y~JYb?YRjEJmB{NrEt{*`Z3h_I8(I<$t;p4xmJk-W2 ztb}g13#DL+nic^;_?-qHGOB%f1PocCIc?L3{au2uGa(YDeSNIWI+xR?7sKF#S%SFI z1qvFVCg1Tl`)jQ2t~nIM^0LI|S!z*5OBJt#UV)K`#oRfr8d(YE&OX~+#XhBaWkF-S z=ZI;z?~)!3jox2v7=zj7olf?%mzqJ2o4?ALcXV;TJbm{jes~LT0&8dwI`tXZcB%bh zX^aV=Nh4|_sJ$VjOF9~`bvJFkI(GC1Z6pvlws`HzD=z`^z{6n!u-4n&DUDM*A3;!Q zsl|7;W57^!wjj-g`_yjg?)*yJHusc3UC<$Cd1s7msRdxZH2S#X(4hq0bUwicz#y>3 z;+Ys4vc16UG#;Oh^}?XT@Zr2gA+MXeSKG$~4#t;zYJ}2Z)VyixK~RTB_@_I~-t9xy z2!_n}A0kWWcC@GYDw=8iFlV_-m&*+aK+zAHQ&^u3DJU9H`W35fwzaALw0(V$h%oy( zU&{}h{YT-ujp_^=H@0w)2aoTJ^k@=b;|8Xnr3h-ESKKssPh7hcXbVO-n&nzGY~Jl z>CXW+y4s_J-4XxtaZzMAL^30C$uEKi(YmMHf*ieYh5L1N_aoYCQ{6q@)uP<${YaVy zseP4=vEur-`9_E_WNrnByTM8dy`6*_-mc@?)6W5w znqLZ#ed&92=*4Du&yfP?Mw|^O=_X$D<5Q@332m*?d?%wmEK==j2HJmaO6-&}7m@72 z*MyIEX|H=s%I7zC(@hvEuj|S+ThnRAL=+gl2Nd_W6boyID&RZVu|P-v(4YT&s?;?Y zu*@Ou2?bEGo^;HS(59m4V8?W~>#QSW{JpFS&U9va)AB0ybI~hyJ7!h7b}(ww&|yXf zPL%-wpDBH?PH>>MaJ1v<8ZEZXt;YDy=Pv zL*o8SbJ41rs@Id)h4t*SEh=DO^xE23C>1xuI@iq8JN$NE#q$gDe)0>2e7%8P3U|c+ zb5?Qo>9wmRl5Vv8ae~e!Wz8Pvw@r`hz9f75XX!Zo+w=@+U5bO!ZjpLcH8h^T$<|#f z-}5HsVvfiVPS^f1FLZk8x?IBu9z)ETeLhNdI}n3RiG}k`PH47*cI|ieM&HnDWJzys(8v6{fva1KxLL zrXmA&78Y3ABM;BxgiM{~)rrqrdjC9H=3QbWDD-{jess0z3t1J z!506d>(|$xu1-dWM|@JXzaEli2Zwbhk$7Q6(Gh0LJ=aV-_=l~}O({d5>fTWLNVU4G zSvd-z@ytx(KUlz^RP^w3Y#CaWS8xIn{^0pD4@)kjI>R0QqRb4r)xDj8e_qoY*Y=z_ zrBCTgW+E$yY(%LN%_BiRN6<+?4CCYftu@eucXP_K6udf?%p|(tIrr;*mEi zPvSy6Lqf8v2Uw0u2E)$%hS z%GMvXGBolN^w=Kiusy*RurzI|N4)Q;6iyOm>%FWp!sV`gs^_Krt2gF#s0u~;8*$x$ ziXMu-=U+Czf#@%O;GOY6O`<+)t1)L1Ss#`}6rq?)e@@6|IYh9lC8%AzC-f*Llx!Cl zEzPPyZ7RE_`_Ix%sr^3ul*yn{is&S|4C@=DbGz z4BGt=NSoN_%<9o^`m9j|*A4pbIO#g+=!)titRxkPKfbJ~b3 zfhKXW7($CqS8v62oxy-9q3j&JaJl@)y6~`A8y+{RwvgNjx3cKtc>kHcPM*H!zoh=% zRz+Zi?9;qZcj^FMx3=4`wJ|~hHzL!6;mLtE`Y69&jQGR4BO-3m_-!`}tK;+5|EQrd z&2FD;b#Mj@3L7&?-3b)1diuNn%tp%ua}E`f3A`E`Rp#qj*5x__J*v&C;uVw_OU_!I z1^m(R$o|Cc1F=O7zK;hAYSJdT*z)3>WHfqjSNwqIPd(Aq><8aTeQ=2d**5}j>q=Go zqbNV#u{$Q{)ZPOQn$nHPvCB*v-i`Ozcca_n_3Dqvs#{mDu7pJ*J~c-+Adr^>AvX7H z3Hn%Vhda$Ly#$2rdf~f`S8ZYWDh8t0-h%g#HtVjLni^B7k^M(*u4F{-QzzqamODAH@7a_YJ?IfoHPVpn~}$= zFR1@A#SCM&QBE|Pw({yOGyeuhr~1InS~x!DhL+67rrh;sWsRAgsS z^+RS&8+Mv{>mS2>S^d%i=9!X_Z89w&e^#+xHh;B zR^Q~u^pq~tn?Bz*J(7z4LV~3W(8N4Yigk=ECK}Ic*HWff^fu6u5HKEN* zp2zhDf0@xP4@ae(2+DtV4+e%hI5F&K2e^5CQh8*9z~1vPgzmH|)5)yMuW+)choN`e zQs#&IKP1Tz!we<|min`$3x3F&lTTKY+1Z#jRQl^|KYjdN(ig1!s!IVr1U=rQal^KQ z%&il~JgLq5vzYf>D+%5|@%WZ^U%EIK39U@K%k@$BQwR#@WUEu(-vvNzBH33>4VZ0W zZ>#}y^fVJM-H`+4hVomLREZBFHwX)Xo_6=L)ihP~*4B1>4S6fN97~2Ch`(}PC~&+w zv?JP`ABb1o4hqW6n|TwX332%+3-?fLQOjET-k!#8=0vA+5t}=`o%tx#K}9ih_PAQ) zY)?BRtWW}$`8r-T35>cDu(d-Uy{Y>Q%Wwm(mc^Q#B-Sr}w(t$zL=Z?H(=v*&a@rqs6ZH6_%t??)_OpzljfI9S1~dI;X0>z*zJ$ z7zq(M9Vr-#YuCDoF1_{AGQf*n+ZknO*Ryr4cDCT!l67-`*idYcJzsP}C)IVq|md}I0UcdMTB zzvBE4!gXQ3{(qCPk1e~Q&aflaqLuqLw#8wwg=+b`L{9NuJXXU?ziw8lu?XYvcGs<( zi}o|F=xQC&rK3>n0x6)ep?I?%dyk@`hp z?(;04`O_O~6{$kTD!0#>%|+wG;6n=Xsh>#Sc1K-javgENQc+#~ToH|fMVF%@zNCWq z-_4@qgPqH~9TrOAd$Am&Ebje#g`rHiv_+|MQO*~IiUSNrNe`T!3{RPzpD6GMejH33 z=2OTe*KQ@I(&#M4N@T)vpHa8^GimPs?eh{cf7jKjAR?cw3uWQXE3ST!xtn2vI{#Mv zV!>$~kxNX#uP`*u4{;~C{K%Go6;?p5{lyFaUPBGEsIq?UDOQ{oxTcIo?C<)FsJi)Q z&fHbGma4PP8d@ug)N0qMs+T{WY5OQl^}0J^OA(DVG|L}jHAU-_P1%zFvpmB%-pr2= zZ94}id3EX6J`zVdy#3pswx1{#=5M$(mBM2@*qwt*J8)^^CE}RG37#|g?4Qs#bH!d? zyXnzm7o#fMW0O>9U*XGDxvt;!7j-CeY~0h&MTD{A?I{~9dCJFrT7YJYeU<<>A~^?R z0QN$^(`$cu7p6feXqj^D1`mGBHeQ{_Y0VqhCkIA7nEDO*_HW1B=LN1jyz)I;yt8n} z?dL^?wT;K6ZvoB0$Z;iH+G&naLagRqRs0&SzdJj0Z@b zsnWNG*YmjX(T=qnx~iRm);o05PiWjx#pK4}b$Jca$Ng1PnxWMv!?s;Eem(CMibbzcQGF-wOpDnE2_jabZZ+XdG=mYt z|6Eh-*FG&S?cedoi@)-*fB&Df68;m)l>z_PZH4sz&!+ja+Ry)U$KwBn=x4WSn6zJe z30p|LtCuU*(%~d_36#rL)91W}jR#9Lj*(jOU&Ql~NZjlY-C(tRt?|M>n|o=*?-98l z0%IPhqkkiWC;tf)tOdTS2GOHkWgz25 z27E~Lq;hpOK<(u^q6qkM>-ZP0Xyh<9F?=NoQQGvx-D7;;n|qszl&~lkM=&O{{q+IS zfZX;&_O0WN=Y@=)f4;{Q8ItLU-1_hM>id6(S!L!k@9a|COEs+G96HQ zUl%9h*wgDcbET2x6(`~7)$x>Sv!XBK=ez2wF7-ZgmM@>Xw~pguUX!tiLS(>2fk@B#Yj2;og;-wt zQ1QMA{54TfwrDdh0hbi*rX2rd4V)Z0Rq z=&6p_b(RUaDcm9*ik-)48u?Ph3ZLWrH0Y+3fMlK z=Ln?^AL7dtzPX*Ukf6E2#KNe#c^+$PuIjq48tzj3#wPpDUCB3T(Z5?~ZIWnb=mdfRVEm{wmwe`sa*&oCX8RUp&(Yzn#Dfm4{>JluJ z9vM`pNi@J_Jqm{`J~m7q{Qc{#cBxRqeWcYk?G&_`zh$qq&Xk#4>b}Cx3i+wsQWE{X z=-2A!!D{Hfa`z-Pj?GDpw{OjVfIBE(I8c$3b?QBOaJ8wsm!>R+po}aL)&Ie+$@1jM zv71vW)#&y7Xsy@x6dl$O!1JXG8O6m(is0dzTlBYXnxi|T>46qFd~MM^D$weJuRjaQ zaO5NZWUHgCiDIww6`oPtOUg!d#AKZ=#X97dL}6=8hxBo5#%aoK zJS&M{wYX1DyWFeSSt+B%2KD`p5B0>mfA{;TM~62uQX{`nBc4h8+e2;WUdfGn|Y;~{Tq02K|;wQM%C<3`l!=u*dn_@ve@Q)0GxCfM=s2up&-=;v zXFp*Je-p~eV{G0(r-jRt$(F4DHf=stJ>;frV0^*;Dj=PIJ4uW{Mvw8$f3N_Q{k76M zWsE4|_aKFZhB_`S*g)WFJ$(ap({4;99AiW^VQM&54<9-xiRv9%LVNrQg0$ui(l5{4 zn4cwtkCkM0yrAIs!hc?6lBm$eZkI1oX|%fA4z|e84Z()36Y@vrm_?J3kOEtC`jXg1 zK_&A%a>onvIU2frn}rUXAcOQvn^Bf1+0&c$+HZG|oOzJQ+U~MjBJAC{sm)ISHnNT( z?D-lt2TeJH;1$-)it{P9TmpPAjs%f6J=L1?CUYr=&GcNE;!_=#^g}FuW!nAc@5+P_ zeXQM6qA<$=pBI~Tq2)%qjH^Th1RhVQCyq;JG8um+?mTMJk-s{HMZ{EG<-Ho_oU_KNOw*g$R> zdz^1V)Uu}n_^ACXVpTO=5a-7Dcpf^!2kGxAS%DanHSfzi!}~Kp#noAf*isumY1d^Y zVkymyWl7ap0Tnk`n_7B5ajx}twN+@NfF0AMT?@1E8ZqF_GBJdQr`-uF1aQ0SVQN3aRuY!P*Dj?D-ND4?xi*yZ0H!2Mh(mf&q z($d`}EzJzw&Co~;9Yf4eLkNMPxf`~gT2q@WX)V_&3c~aj_>z#*Rw#Bsm{2%PnPX2hR;kn+q?ZzWUd z7dspO)kiY33t@$Zi$(a%!daJL$o876RfUSU=Ue`Oi2`5qh?+Ku=AHbHr(N(?YMbVI zC&*bIbb|D9Dj54Ea5b@WiqxV9sS<Bn%_?CQ&~FXpJNXpLV)dfjLFF+WuVVYb9E_$x_)gc8WU0e>4| z3AEuuW`NQ+JBJD|Yi_NAFL+rwf&tC-^4VJ7tHog8QIQjR&HAgpp_i3Q_@2ZrXK!DK ziOw7z;+l?n5+SSXU{Ix-?_@z@h(Q-Wa(=n(;l5yZlP8{b8lRYP>PM!fSDN0~3GfqOPhOEX2OE|Y_39=6 zd9rFV5hVFf4Cq79BhA8~S5riE%qxRo z5SywYQ>mr$L*l=`S~*CU_UAAEJ-PM3-S}H!zQ+6F8nCJIgg^6yUmkZ!VsKOaMS7W$ zW0gRAEtcB<-O{MS#hVxfOcZ#3U|~aKkm-jQug%1n=AD8zufE4t&*fjok6E|qS)BuC zPuLT%EMwZ^35lMW_qIFC6}^c&!WDi75joveJxY>qoYi^c~|eH!N9;L ze`>4k38-e@+aV34^Yz$(gUVviXU(3~4q^CKNaNxyIS)2<_AiK z`uUb=(9o;X5jwO4?&Zwun+#dYN%pIHi?@ewN86ZW?`#ccD_#Y10nnfFqP&`gVYvIh z?+gOQ`kD=v7stQfuZ(1TfEagbSQtF=Y<)4=JwG=;vC2f~P>`f^?EJ1euJ+1y&=QX^ z8Y(BuGCkvJ7%IuR4w`fq;$>8OU19EeBIjc=Zl2;eg7`hwUlVs5C2@N_zDrzgv71Pq z*@^@Fhf`6hE0#y|Ep<^!R49bd&p<(7r${HX&@8Ov)(NBY;$HTn`FCt02p} zWYl0O$D-R=7d<>Q4DX?i(dYpPi*WZ|Qi7*+8-yhj@*g4ve;BA+%IS0^GS5cC;r?DO z25W(l@8BsjkE}VEXW;gkTP`BF_V%Mek|{ff2a**shv2G=KXFPBUO~cn#t8)$g>(5+ zl6_4@gGr_N)Tp@byJ-fqmyo||hAEYgG8@<4ReZ>8q96~_q)B^N-1|xJRjdY3AkpEt z-_AYG5{nK9zexl%sr z#R<@ri~2?sJrYhcBZLsf|qMG z6a()(Rxkff$VjwSm4)7%oE_Rft6K54%8xN?=G^jdT=2J8c|`Mgpe#Tc$byOr}GdNBnL1l{1*tkj?Y;}4U0D|eZamR*3%6_g42>o*f3wgaOUa$6; z98DK9-#qH}o8vCCpUb!`>wEc*<3eIXK_ z+uKX)mEuwRrA8P<4B1~3`yqpCyJ;rH{ms=g6MQI+WpDSoSUi~|bWEwi<_91C73vXI zb)MQ76Z2&F_tzm^|4oL7|H-(ixd&HyVZF@U9x0uOfYl`%PZceIa50CW#^}Z5-0fOX zP*b1%sB~)>wV<26Klya>tpvfj)Y(adl;818B)gi#MbJ4h*Siio(GWbPf|`|N2LtpW z3(9FOcZ$9{h`y)D_j~?d)T~2uSy`#EiHTn2yxV?eOhQspZHVvs1SaVQ@_2$Io(;+? z`D!&AG2JYj`SucXs!8a-X@h=9S#Q|tJ6yTm^+iE}6$SHiLMDlMUtTs>-NXnQ*nK$( zG{K}|iJU#M7jj|OJ+1 ztw|3>py-Q4zLIjskyw7cjVdS<($m``qxO4eaT9$6^W3N@Siy+&&CR(+& zD^%D2TMIxmzMd)qz4P7^pV`|PO+{@LLQJJ&lj~_4dwX94l9zztmQ?Psv5_qJl$Z-B z`S*cxSm)(qVFk}nA9c@dxc4v`!jJBMb7ybRU-@yXw@{C~YAi#TKhK<5_!a@^&SEl8 z&?hN;zJ`kW52FmQhow2cSBFl*H_HZVw@1SdrgL9ZeU~>4i`E&SlnS`QRpYnV9Dm6q zV1moi2iWG?^tj`rG6gDEa&85-|8?dY?51WmdrGuitPULK6PPt8DDcn!b;$&O`mQI-(uvx=Y;(5#<6m^a)Z;7 z$#1Q3>-UFY{Qa)vRX6qyp_Q>)ueSytu}|%&g(04g)zO|O)r&o?Vs=M7=RIw(9kUWX zaAoC=%;vK?Jjdmw`a(du4~wFETX$#A*rtdJgWnBp>nvK0q%ZisSHI4${cI>!)p8+j z&zZF+mD|)1Zp%>huOb`Vls`VX<2C|yzgC;--?G>mr53y!Id%nhbbTxgx_b1f^64$+ z0!&6L@zdoivYi%328WZALn}^`ot8;V&N=(pHswSIbc>b@De?3v1K-X$HFZg<(Hv^k zY8h-}R+(UQJeT(SC})_ea(t*zaq1_#dGo~tx=rcZAd=Q&XKV9<{$KOF(KG$nn06Q~ zW4kKuO2EZpTDG3@>q!Vb#sTZ!ZKjYsJ~004lOvJv#&j(I@SQOhD`l3Jy4{tEASX~a zRa5*pkO-WQv{9+PJ6}7Ei`?@6`S)u}=qza3nrR%Y&V3u>{~1#CoL_Vh%@J`sjxj?tUya8Lr37L#9DV)h(n zRYq(<{DI%^wZ}+#wbsWfz4%cXJEh+Dfh=WMF%5nble-UJsMV1aLe*sLP(~Ohi48AN0Wf{f6 zqM5q)y9bf(z7c(F&3H3xL;VulH8#gQS9odtTs%g#KCn*QwcOlBc)9IAO+&+m!=u2T z1!ei6WQ>v)fTUr+@heD4C4O2tnn4PbEWx&D=5tNmhcqw}>VM7R7Wpef*g85Q9<*2|5?@pEokdfxz05sRE1Ktxp_BAHUSFc-Kl2=^i;M)$K|O6nWVsjik@5*!gA z1ZvkTxjEl~&g!gv{!GurME%|zXlu{PCSM2P(zr&&ej!2ctyPNf8dm#svu5+Oc#omA zthwJ9K&?)%Uk9`;1N5jTguyV03R|wbUOlPN4Bjx?N?SdXaEPX^;WOIg%T4nO*Wz1> zv!=7L(4DcYy|uOTo8iM200hT$^8{`b)M+?k81Up^@q#G1OU^skH}HmYj`M=R`+~O+NVrMM7`*-mvmp z?;fh0XNl<>X}Ml~5XiKdJdVS+k)+QTowQ%tY6{(6k+Qq7v8LMTe~ci5u_&#?x4uh372$*VhPw+vsZ@g{h}I6H|7~tL`fIow0*6ktPW1AoVd>NORA=g~ zO~>Ly@U1@XjJ7?YfTx3+)5Z{&w*M9moeJ1w7li`dj~=yen6o>N9bXz*+5(p^yL;3& z*s9|6{* z=h}UbAeb3MCu$jxw*F)NUxXgV5T}mvYm)I4rMbLEbqQTJT^W(kM7jNFmH`-70kE-5 zs*+#ADCJG?LnKu@7?V68jXreZ47j;S&&?-DUouuJE&Wp@(JQ4I+_7oyut!)ayC`fwzTx*vhfDzT+Q`d>#T%93xD6U zfb)7ihSs}IR>lBkK?$s;YMpWJz}V=PZPtQGGLokqI~&LpDo;$`VA+3O(dFdi6A4k?-6&Qk-J4^)PijN>;9bYq&B?wLr>;YeiZB*) zPE+3cy*;4&902e5AB}Okoe10XBy=l)#@a2nrw7T;4u|1VhE&FBAc4X&BC z@vP$4<8TZqoi_lfjfVBunv>Tong=-bfd@#&!-GZTM=y~t#x-%Vd=c6-^b z#&Rk#yH)cO32{brpi|rZV4buKvk+oJtBT*L?-KS`_+P zsE%3>Wbve;|0>>TzR{d9O5Agg&gACC8r%Ma{?#)04BmxRc>ea8KZ?)fz_8Yd z-Gs#GauBvSi=5U85I9?ATrOiPOA&WI56leR)x2v%5=dU6z}gTRDTf1@)2xB9fub^3 z7VGrbG$pEIU_m8%2x1SyPGj1RUI=HEdNa11*bdE1b5dgRMvqm0>!&k{k@;yagtv74UwLux>l8vt@# zMm%zbRHciP|MlCo0!pl)49T6H{i#;_9TZ$NTim~G^uartP78KfyE6NB%#KR6zS~X$ z<{bGBc;+6mqRlvRJSQ!XM58|+iiE(=>QOP zyQsXh#QSm?BTq`dy|%Wty9M#-_5tn%DTp6U>yF`S6u<3|SxTt0c37$1Z=G8)etXw| z8%n07&&(uN)>cHlFXYtbJ$pd5?2~?89%!z>AnDLrHT0KAap|UXSc8aPUTYcmNQFZ-T`8TJj?H+;7!xGZe^h8#QM?7XNA7&I4SQSuAhFU=(WPYfq z;*q)K#frbb#_b#e&o^qEntZ(cKQIZT9&YUy&MSn|PGNuFcSHi|JW*XV!o}Y9Begx} zv|)ldzhf3(N#KPI1tkS*FDuoy{g59`jvn;Y5Y50zVq$DuY;rz3K0V$3Y(M}=+S%sC z+&a6!s}$PZ^>yRldY9MnhZN5!5|ee>^&R6KHP~aBE4_|Oiq$~7dj}bMzwf4p zdA6u10s1rh9$4F3$+pA;Ho0`x-TI7zVw!4|jqT0A$dIT%s@w_|H<6{|1QVo~doHTz z%K6P%0_<#*cQqk}zii5SWSa`!A>gP`>BFyGa#`=gX2{ zp{QKZnGx!EMt|q~!hu0SMOK1dpUj{gHNGortpw37qr!U|d+RNJgFN#h-v5DB-^s~Y zZZ$i#GEYi!{=^vsfGK=os$ZuM*`s#27ZeN9a{9!aTHocEnOH9N7Iu@T)9T)kdG5weJGvfDrz21crxUBiX5Y?>Fk4N>e^;qQs?WrW8 zmVin8hxPFH8l>a1D#`gkX~Jt?LfDm72=7HkM&{;I$bfce8y5fU^IWMCPy2;&_I-ES zhFbg93q+R4H)-al0cXn>0&kKBc{1C@-3qn|M^>NULL}eiNRnHF5c5@-rHRJFn79;tgn=Af?5N}73nHN0|be4%1v zF;Ln*$Bpr~^yjbJpW&b&lqa5Y%ag6=DdIXx-F{IvPhYUWni5`bDXGSiXtz8mhqqO4 zm@&wIe;9t0Q*}7at`^gE2)?P8eZ|SmUbw%8=E5H>aBNi(C~L|q|FY93u~8I#O!oCi zrf4DLG?|+auS>GkN8emQU8!B9gI~{$(uxk7~~LwYP#jB@E`vr$2>(sTd`^{U#cT;1c3lK1$?XmiM^G z)IZ+G$WS>Hsiht*n%zyZzi35HmGw`U7u(q}r_Ouxv|Tfp0K$Z zmbtTnl(Z!8_09RqOJ*8L|8sGYVT%*Mb0~Rru&=#M$}la(%=}jtWAQAFwUztYU&+nw zpszvNlEiwwAmeWo>Wy?kX_ulbm2aEPA(f(90Q~i1`IXMH7 zRzd!6vi*vp_jvB?=jX|-!-)jXkPKL#K2vB$Vk%(dkpdsq#)rntUBElLL&tTF!C*5w zPZ88A3b!1)JE2!Q!F_9K0F;ZXma&fA;amwXC9ZAcfh=Yc2*w+n7G`7?rwWt;?zaU5 zwuO2y7Li~sbK|qIhqO9a+ViV;szdMz>Wn~d+)UpB0Rf!9=`{s^n6GcPY9?#;O6_O{ zV750}#0!xftKT0@^!?O*QL>f(bk3jx?XQo9}ntl17v6>wOjX zJo#YgB09Cq?Y4ahDR`&G?s+>cM^mIZw&`hWt}(Dha89>I^nml$PzGF%TQ?}okV_f&PKB?#p_nS(mnq#d# zjRl63i%X`{>`4>6(ZP|zptST*+L=~$21$STSElZB2eJ3I>B5>+n7@Mj@|@HW}XJja$2 zWY++H1po%O-yB`FW!leGP1Y^7IP-?|_4o9dLE;o~0k-~_eSaN!U*T_R{PZ#RR`*_)u^7H3#+B)}Z-o$A3^3nM=-wUj| zgvaJ3Z@62AsIRDadF5SBPRDx%h0rZ~y=-w;77@Y3J_{@BQ*S>qVb4@qz!L6mtw7(! z&>x4&L+}_mmQ`75uiJB%_C9-%e zFV1IJ=^o(!y4Q?eZS^cDv_vhq{tj93Iy0zN6u2&ekcpodH#(Y#di>$U7OST|rcHkS zjAjY5kUF$pSauk&y35l(xq8{rb-*e;J?~Y@XgrmMW+mvutI&?%hwQlYoVpc0I z?k;<~LbC#7FM7!1fzVO(G|50J0CE&7#vtmUary~j&^VIC=embIMWyoE*{SJ_4t&es z!&I7mXB-6&R^7FnTt@igH}t17As!splbJ33{c6HOfYk9Bu%RIa8*+Mjh7>Godni)RdA)y3iJfT zZ%?}W$ufOzqOI9e+&FLO$ za{Wd3TlDK8!lB1BMI*VNOTVP12Aq_qH)I;a-n_kto`?Imdn1ncD8AP0~ zTi5|hA+4JC`uOfO%l^2C%UKpUG=|~isP-cC=Nvqb&vJ~JP+^SLmq1PedcHT}bq9ZR zIdDqGwn=y`=OmH8yImAjF&n(%mynRax08e+Wsp3E>oICZ{gPjHovX+~p-!p94RuX( z?L|MXq~62xkh)wc15WC;{o7&`^ib(Kd@vSJm#Sw;Dhwj#^Esy^<6jFfBYJE{8_+#d zRT8Ip+aIY8{n2MPVv7@Mod2`P?ENK;FS&b_QCY{UV`{!D*lV>I`xtm3{5;jyZ2cC* zD5hd=>Wv;1&YBe`ydL&!&o?Kucg^xfR|m9Si=#)h8sXron8phup7x2cQL0~VkorpMblYZ^DrkzM&_Q! zhytp$9a`kGni6}5xeUt1CD;{Z6a?Mvo?5d9lZh7^gqd;QWQD|Jiw@qS31*FDe_ogO zf8?fQM65}Ql+mQKEm4XbTEFBzw0@}JW$@lAyWiTpBxEmcucR|02(TPl`ic_U#-{C{ zrRL(xGrf8JZMwR;5D28ks%C#Y6}Nv3j2(*~14X0LAN;V2mXoK_AvOs>jK)f!P?Up) zCJt&`CP%htb3ue%x?!QqpF6K|nK>1J-r*ASRV>rcF!5%bd6w@sTI%*+V4;e&_`-@* zh9ChnTvNvYx$W3wsXKN1Wj;jBtoT&VYEi!8(!%1?^tEkFZPGD%jk3L$A|kAm+KX_;pIO}VS!?=B2x8#JC2 zYjUWl3^6t%ON>xizANOOt{e7tb{Sm0#E{e(s4#ZO6_f0gal48BWm+DH$SYT^bbh?D zT30YncFjW8Q(ym-HQ&D=%o?ZsB>{H3Pz=%B4F9yt2Z=k!3BUz!6t0(dmPvWLB1W2h zh|N9nYVw9IS7(M8;8=A#gU<`C*?Tbp+z~X$CEeXV^)jcs9k_#oy&Y&uE$ZeRm_o=yofD8KLTR5R3}!xk5$Rhp4* zTwdTfvY@TXNOI9C(y`7Pq}FUQe*>SmP7{WHjzPHfY(C11=%sByDhMwW%!WC>MLwH+ zIzeI+-k9xw*fG{kfrFANI6S!GciZ5Kbo?vSXsE{UD^nH8q!y#5{~CIq#Xti3SqxFv z-^HJe-}}Uvi(B(e_T*;te9HvMciR7P7j@{i+)k*#+RhT1)61HR{f)B$Fw|fA|FLWQ zBXlxza{AAv8WjkV{~yQhz5kDsqy9hZ^c~c`xD?59SbieeQCDD`2cIar;n?S7j2O?p zCoDXfo&aE%#=jLU&_ZJT7pqz32D>6a8!`=OQ9inEei}cp0F7HeVe*AdtQ-eXIlcSl zXqD@z&k^fj>i+%$$TAbQe{X}DhmCk`hZ0(RJAx0`A#)%q9B6d~7WlonphFcf603L2hebln}&ndLhnR5_=YNKPna&qNr1=?!Tux2%QyDv*-*JoqJJU3Ji}2PTc9{0c74lN8 zBe;SYfQH-59#nl;g>&-+N-52lm}mzI(&hk=ExWn?{kuA^c%P)^9WRBybw+K<3403P zy>Cw;s;+w)b0Eg+Y_pO=q(?z02k08~Eglv!*JwSr-yc%upwFPcCP6LxzPEN%^)^W4 z&IZN~WsXd6X7Y()j?kL$$nsGSMsHO4CNv&SCWZc3_$CAW< z*efh}VIk+fAzuG^_MucAW{XIP5Q)+?(NSSvlPshUFCAU-QB@f#qU4Ha(~RfaH4>nX zDlaK5v@B$?oLC$Rx3jtvkSb__Hpp|#Wi120ouOy%i9hr?RU0&8>!^&4QPhzmNqi@` z@O1(v>{AHQNzf}%D<_vPq}G{>>QAOf+Sy4;NSsalS_j&7i+|cNI{t|^XOQqzCA|JV zDK|+%3iOI1u`%kOma?X9cAyEn5w}^3a#b{lG_zUZVA#+-5C-OpK)TL_ytkp$^@|qJk$3)Y|=ks_D$>LTQ0>?b`ehZ z)5iR>5ACthy>85f4vEzC`nv?rp3PxLO7{#MX++tys^5q1R(@Q|mA+j{a69-@nJC*2 zjM^cJ7>20OBviYx@s#}$fCSl)%3D%G8+!}4>bz)j1jgsiq!xTPzuuW<_@1IDqE`yFN9vsf4~sq?J`9dcNJ082l#%7oHGD2w=hG{`qlLn|9) zs-~y*T3Tw8R^OfffKqz0OS?veHZ%^|jXD*S7Y*QCe3a7>R5S2J7DRyJREF-1z6BQ+ z*4URRxk?&qe?1Y1+@z#TrBlb?y=IbpohXK_tgI+}z>j1|PD=E@xsfw`FdBbO@2NL; zAMX41f0mi_&X=d>bdt3B688;Te0G94l~iU?d2tfl?EZ^w@nWPIEp*v5>A$nm^<+09 z!iUY*wbE_ zI-J)E&5L22w5SPaOH9_TG;0u+6mq~oyZa*IRkn7b&3IGe5_(3O5D8c@fx&<6SRmcg zLkMy*nSp6v5O`)mT-dMdjPa-X(rt!w-K*7_%Y&N7nEMKyjKKQsPrnp<`DLYt)`ljh zfAGBq-6wT2Bdg9=%+=6j!CZPrXA1n0*?An~G{GSTDmz#WzD&{f!20CE9bict6V~J) z#wgy)q}0}qRi=f{Q(7(;j$%snI13W_FqTZQC&Qx_8{z(SVqf(elG_rqGGy$f8-a3H942|s5P%T9<>dlVg|K3|7n6OO+uqi!b66m`Do zx;5YVW7ver*-krMX4)yWvm*%@h9U_z;wO_US7f@~UP&h#akCbTSG~PV6?)Cio&TcP z3wzQ^VXPRbR`?xWl!)OmYx4P2{29`zrY;?d1)f`?9o9TFqAWf?KHo7*yFfNuJv70XQj;c^!j>8rOlP+>cR%-H zO)&77EG;919V0=i#;xX|j@Kp%(a(|-Cv{rE!cHJ%^%bzD)^^oG^@ghI$Vr6}`?>r? z=!}?$X*fXXQH+NPbQ9^V>wbkR^A|U&G=5c5RyS(!ju?#cSP6?~A%|E@6-68$L-5kJ zRR&X2n`7t~eGj}2X37NAm1REL4sP|x5(WSx`7*;Geg{k5_~Ye(M?lC%BfE0Si6-rL zo`@EZvC!}rz<$Q!{&`qTo{%a`k}csa>*oS(kFmA_1;!-%D(hCZS2b#|{T@yXyj?aC z4W7^`N}~z;4$JRK=3K#`f29dn{jOb(rByAhh%Gm(7UX8hRlm!crxpQ?fnLSFW#x>K z+?y{hizutDjc}E>d*(lF{T}vYBjlWR$%y$`)N`?(;kgJ?cEemLVbL_ll_p^>5%ZPG z?&InZk~rIt|LPxlPAY1%l)QR`Mls3~g1~kp{0~PY|@BgF=Qs1+sc$^}>KW6kn zE^zXd`g$pU(RK9rtdWu}?U_v=oPIb>cAZD=taZQjRazLBrhSS})4_MUB%b5ptf z{UNEzhcZrk`?5m6g!?jT33Zl7~#;~X`%oZc)|60aW%hg^I$@l}t#)dq7RH01yA3|b~!zPOb`vE~A7j$BlzdsaBuiz`%+V=kXh86W7DO@{<{9%gC z4~a%GJ+g|f`$!LW_BT2OJ;s5!A!UDU+h^)eAo`=XrA`d@6TP^}AWF$G={yU_(_+pAa zy2~AHCVeqdOz;g(8kdkJ;ytqZ8CT8BZdOX^xlj&kMRHo2;kAj(wfn{CF`Zb86qYb3d+=*m zOcj9x$aEQ%x_h;JYdTMT)r#*{RFSqgi5@2LNsrB_wV$efG!^ntZjN4zcpISaOIodW z1O!1X3wN4*n=A@8y?mOJll3ObIuq!{LML@c1%vqhm7Wnv1hrbN9x(*mE-%rcrSjfd z0?}Jg_st)_d`%EIl<)EvsSJ4$Da5vKe6xqxN=h8Q6vxl+CoZnc$>}dHK{Tvf98Duq zuFfdhn5WM4BdDL4hJx}5NQ5PR_?%8kx=`6d@u8>Wd%4lS0a%;&%#S1K`MmU3Bq{uz zU7YFu)fVRm$>?UWz-&X}6{4FQ7PQlvYSM%@4JEUAVwHwDInnXb(n;>k7vsR8b$9JS zhvp*FoBJjca*4SdUwnM`oisNW7=jU2VtXsOEaP)QN=C{c<@P6{R?Fu7y~4oz0>Xe1 zmn2Wi4@%R&V-NcN0B6)b^zVys%OgC$!thFqvMcen>?-S}nMhL;v7Xn31lQh^4_u2P z3!e9*WULXNR=0L%%Z!SzYWtcY(DAuoztOA@J37Q8d0IE=hbg(*B?vzDEe{Qw_l;R5 z+auY^jL7)_wi+!jjlWWv-gdeV<|wWV(@o<^xDd|b{wUe&Sv9Rbw|#2MBU@!npJHzM z?PW=(>m^I2in@Zo7G2X5zyR0Ry|2->ur@e8+2JAM>hMBfWvi%ailke|+ffLn4O#pu z{|D|50c*-H1jnPE@J-}Kn``&S;T@L8N4sy1dOB4kFx1;3QQ4x_78<{JTCefFcEQXg zi4&I9-?Rv(!oDhfGq90e?Mdz4a_OCD-LW-4Lc8oQ)OMqd`kIh^g<{{@2G|drK1QMZ4WyOhGoS&QpkubHU0^@yrd)SVecM1w~?(4HgX!0dlcs zySSIhgSN1|M(wL&i%7ba>}Nd(8SxR_2aEmoX|tz-ssF4$B~v#>?oJewla$p9TTpH$ zj%OcJLAc`i#;1KIMwC5cQle8^-`_E%xh%9y#D2^LA}9fb#&_1$Z(8zWtK}`{4mk&r z8)}&RNF=OQ%(*i{_*|Bp>Onoj+&n!uJUm99?w?=p2e8z>UJl3_3`;ffk!4}ExW4kW zb5*6~n7PFXatR^?tMgo(Xio9coSn%ez}z4MM&$3=UEE!ZS|ee?BX*7kOKF1t_rjIW zK31?w8$d`-9++_?TJ5YaYB>zR7RC65VelE93Qb$S(}nXlt9N>`8XZ4eRGA-pL`AZ3 zOw~oXKNedO^Ng-ao?FOlPC2iXA8kZ@jq2y_>(|lNIp13f#&8RF8V zK$nHw)6&bz0{GapzYT9HY>F)^{eMkDL1H4JnkgH8s(JZAO6H_-f_T{=&wQ^mSTRe7ha{Yt4e-K;!11mZaSQBjEeN6NMG72|w)I>4o z%qA?O<*_R-h$Gg=%X_>y^n$_D&4rlo(ern8Jof6w#+lq%N`ETLbNA2Pa=k9LH%ui_ zZ2?(O^~MSb@lQ6MqP^{I+%Kh?z4}9#m{^H({`|aE^*M`JXx(}+)33_?<==DiIinuZ zJXcn8a~{(|qG<+GNA^dl$-rl=nO~qzw_Md1PcuYm)b0ZY2zdlph4~o-+6-jM86V7- zUZYb^l_)I}DeixE_>~_o;}C_OG#K^ay?bIJDB;e$pkw496z|l>#%f!icEiTWRrR)A zKtR0XlOISv@K)&kacpLK^kAV&>E?sbt6~<*Owp$sn|Y8|^vf?1{{o5XtXNfP_f|U& z=o3F`dxl4ViuS5+F9$#`jb`cMrj?7v=q+!!78;0%lrdx|t1BPgTB-tO3xs6eLQm2R zf$P+?5JG0(z>t%@TM55x_8=B>*_*U+*lj)SD48BHu2$66)aA|b+)1Rp*rG}-^-kl^ zEdKSoRbfoIpeB`kwBlFvlTLe~Lv`5L>FN2wa|YQJ!+LLUg{;qT`jS4v4(rdD#<&V4@Z>>iBVz|+;y2aJUYoNkO030ab9cpnGl`ITDYD%)jt!PEJk z#S%u*T7hr9EO@M>Zv6c~rqE5~ZfaIO#Hmcn>t88S%#JzEs2EgIQ8AMp*S`}=07Ra{ zQl277EQ^1wt74M%zBlOL$#HuyNF-%tx?}2g6K8Z3U}k^HD;K{&sD~)Sz2jLXo^ewU zl4VJ%IXPv$n|Q~&5lYI-u)Dq~Ta|vn$W}6r-hYDFcRhD0pQ=BZ?H}f6VznL}GpX&1 zY0gNX$c{7A*L<~DoZ>t60DoNdKPIO%CkI;zA<@xa=PzN}Ylu&yFA}un^;mzl6rGtL z4RD%Ge8V;vY#4BArb3lF_Hd@`;^*v|ylPhsUu1K$KQ|+C5Cn295$A)OxkGU!1uEsQ zwZ+WPKVJ|hGEUJ4-x@#GPHq=wMUf!@b`N+73!3%3$~wa*>g9M&{aN~5K@u0_?)z-o|JB)uk|{t zJ%eu}sX9tU{{Ku$9Qoy*ojhzWJm#MyNDd|B5Sa1#wf7ZQ0bTG|MuzOM z)j3X3%*a9Uc0)!;RdVaDUe;o}-v*ksSV5pkv)BRsU!^}soY#9iS<%AioFQG<|A6G; z2W^q`-3v!=(iD;B20zY66VMqgT~9?_8ASBs-K{)0RXjX!p+UDK=8SH;!T&V@U?bd= z)+DCb!E_nx_vB@xgkj{8h z_wQTMNwmXYM;>Mvpj)7>CNt-QMs8fdPI~wi54qmuIFugN$r$;i-wxy))qioz=bC`^ zS;0Q5H5;^^#wA5N{v!(VbF^^_^74XQ8{4BN{>trF;0)_Eb}lcBBSKo=y7~YEd&U~d zIPCpyBz6hy;0mK39~-0;UdJohS#T8Etw%l?O(9-nE#F!G!+;eP5fMXFNfYt+jF^79 z3b1n=uFgJt_4HBb`TplY(@$BQ(n}|FZ{x3$#+Nj7b&!YqGrW1Ib8h}-ohfh;myM4m zSE|gXzuB6Fb=aGW0ARC1@cgQ^Ztr0{ZE*jk2+4uD?A&uS`0yY&bQ!?kIC{PF)VIDyW@{~sn5a2WuL>Nfx4koKV@Za8tohk}qYrugePQx_giTjyyV zFq^S}Pb4Vh_n?I;X44t+VQ}MEn?ulE7qmc-GdDmqbrlIDXx>!*=Tpxh=;Z z&$y(fkLPa9MwE@mnyS1OG>!Jk%PlOe4^An2zht~GSE5-qqk4Ks;~8rXatFTr&*U?n zF~5&Yvk`{Ax*a?4)rfZp;Vv)%mbQWl^5gtLpVN3MH9b1@muVU0yCwl*dgDJCy!!0_ zS;HUE3-HIz2%U<(|mu7Vx4~Sn_o@qOAz{N>aVB&-5{Rl%!91($%I&}9Pt~ixDxFF{ZCZ6?q!Ofh5-((t=qi~ zVFBfpmPf0n0!ZGpq@PE>zyI7ENr+sEUXvz%qoJ>zl$I(CWT0w4RmeYm;i{%4COi`V zZK|Qcb>=Az?|5Yt=Te|N^Zi~-(jsTG4NO{?B@_I2&IUipAl)m;l;B#SZpml&u=tTU zfC>n`7rLd}pItPU8%Pg$|Bq(GOSKWOigvRUE9pnphle6@fq12xaa@B`V!oHnzk18p zrtL&uYrvg@*K<}hu7Up(R4xH{*VjkB{swP$j$HmoBLrJ};y?SB=Au-ZK!zq0*5~=} zrawN=-|YB8Hh>R580g^R#R!aM{%C$!ZX}0e6f#a#*Tma>J-**Zukc*o3V9xc1`_uB z<*y|cST*xB0{l6$0`cr9hpIq*kceP_Uu?;>J7~HAkYL(U+-J--(9}GvLHMuw89!%@`uBK@I@NjNv@ZYOj=YG_ zA!b2!G{dmrQ_^da8Bqdkzi)Ib+vZ9Je6#}xKpyB>dq5-T4-fcK>I-rkMUyPp0YmiL zzwddsW~{=%1k$onOD}QGfR3Y~aZdI{xe^m$xQd>W$cx1Fwk6ts&>b%y-P?bk{f({{ z<|;CSisi4Jl!k7RT{`$yiAtM1$W{$~ChS)?*u9-3hoh6R)znx=NvVvLM$R)n-2aQV zzly4(i@HToBtUR?4M}i!Sa@)Ex8M%J9TF_KySuwP!QC~uyStwv-`?l``d#JJnU7Y=6^rC&EP*GS5oCNhXwZ8d}{ zfLH1r!rRkX%49Y=45NxYr{u-Ei4~k(9nZ4y$)tkhH3+j#yx$06glbgT>P-WEEd8#Y z8nQ5B{p78!I}=lReu!I()+#VxuGmk|0y-;JB94DzMpH>_UgkUH0Ve?BVjINx34&+P z+u953dd^c)P_;!Twwq7CHkKSjeg7FjlPHcWyroR#2)~joC<6U-EJ42zpXyFiBG$PD z3h^gGYJ|V$V)QoxDcVssqv~q?5S@>_3vf1|mFmGpxQxe^Z#zpfpF_H?)_s~hVNr#INwrizRzJkXG%6k(9pjDia0$kNLqXD?knh{>_5 zz#3d%3$!%cN%syn7q&9e|MrW9hGPc7uJf@D{bsR2MF- zB-pahZWPz{9H5`&!t`x+qzkXh3zQCOH9?qDOAhtdzW)m*J32aK_$_Zh0sm^$FV z9+0(q@H_4Jl(J|FGdntLg%JF>>h;E8iYF{+Y*np4DJf32yNM-Fa}USXRKr^Q6>MG< zfEQGPV^YslsGC{y zl>GzHQSTdFDl!9m$gE1SGfinzC1FGpBY9=b`rKO+v;!JTElqX#zwm;E(@goJZEgK6 z!TP%4E{5?A7FJxW`lU}||<8bK~Ch)W*On^{?Qy2g0t+*Vj%*#~Y;eeOH}BxvbbB)!8A{!4@T@OPY=O ztVx}ZWrL01VSX02sFL)uay33x&t>Zt4U|%~0Uh);qZM;Z+pv1eRIrky!I)zpoU0V+ zGuCxhKmDYg_TNCH#tbrgNRYHclepS0#&UJa#2hBohA8C6VqpM(m9cK~6nuINXbw(x zbJyOY!bIfSUyGCm8j8uU0S8So(Yju;Z##E02X#INsGvENHS#1uIE-xlB8U6sV1254 zc=<$-7Il4HjB1uMXz1AxsuwgOWn2IZBdqX9g)c*8Oeb|>g(MiDo`(jSjUj@ELz~4z zx+)F;&7GF^OV#tT(=zPgp)|>bs#J^_{0BqGewG!|GOh3 zD+=%+Wlvr!ld%#yH|qw{d88ZJCT)=klfi$?t9T^7!ZD_NYYA5HztOk1oq%})1Q1|P zw72IOs^L|;Sc=gv=dWK&n^+y{ji&xm=QZsXWRZxu8NpgOGWIT35a{;*`vzdi2%fh5 zElx!o)CI*-St_te{On})940P${YaUPksK$$S{%k&5Ox0aS*0@IQF8A*(Sg0;dFvXbI!vD4WxqSxgCd;bF>{k;(3q-(aR z(Ll+Q^pQq1@tf^)qE#e1GDS(w8Xlhf4qX?0_1Bs6bd~_S=<4zUXIuI+JvVojJF1t| z7*|S*nDJ@ZeB!aZjBKLMzFdxWcLsWr5S~13+*-H`iDOYeJ&4Mc7gB%nfSNf#OqGlP zAB3USvS-P#zIn{h>WvM}1`Xp`sY|hw^^zU@QWL0}uY@75orYiYmG*JaclgSDXz%2H zN5agyD)-Por-UxSkk8w2c6UZ{X_|hT<;saBn0_>eGJ~@s?t+V&ZG=+=zt>bG!bE(QF$qJhM1;m8c z`S6My+||0Lar}C&pDMfC6t@oczo-f6+bVd&sXm1^Rso*5pOSVqS6G7T_RCKe$v>Edgxx zh=;}q_UTZgK2x1m=VsW?=`RvM%^5{d;KITBD1E}PdG|^y<>3#}y*~{Oc>LY55A-)F zJ)R*`Z))R=-ypcQRT30m@6O@$|6Bj@Kx^c`6%tK;<|{1gMV?=0;fe}wZ&BP>7iR>E zm1q`TL`9MLf`w+NjF!cat9Ge>S(NpZ7@}E|5g|F&XnWo)-_|A~5w!!mL%!%WTM~}H zhWJ%3I6aIB9ozR#mwHyagS_k!VgsZJ26j#D$ESP0N;jIc=ZT60Fr7)VuUm+ zZt&6g7EzIu=;pNnqo|MpfovtyeE9*dX(z3}-JpT#8AR4t`Q`B+C?A_rgJ=gmuX+N~ zdH;NkHcy&z$U&BPyS*MRfS)pTQPYF@XD9)t$GDsgaiW^rVx!;+KJ66wCk)oM@no{7_+V`LifB7ih%Mu})hTno)xq3Fcl-ShIH zr3LB5u7{T0`M4luM1X{g z3lua=Wq!@KdEp|z5uiNRHAUq+_yNMJUru*La}*tA_OLZOca6 znvS-;_7V(Wx}lbt@QU-2Vsm!H_WZ{)MDc&zTy?i%iwzDoW=v$$cTJ{<9N2(@mZ^lG81J}pUd!k zEHX*4fyMzfI1t*2MZJMN{Uo+BJ!DHpYNt-_PY#X`a7Sz)(EO-l9lmjM!wEv z9HbR^iLNm5Y@qlZ2sT z9-bQA8+GPsv!%+V#wm^engGp{(n!3KRSS-|JR`++l3W95(*+^hQVE0}4S;r~oKQy4 zG5#>_px@;nG-V~p%MdCAGI-c?3^=IAhOq?YIjndkJgGU(t~EU=aaYG5>UFO;_>>`P zkPW1x-$Y#SHmYJ%EWX(*OSIM$rhGIvAIznq8w7Uw)+l3 zTL~xYmaEuPgTHtBCX59>Z5GWGv2XQ&o^_v5RA7o?CNkIepSwLVS{+dWlGOh%;5Q#7 z#4p}q0B~qfmeblG!J4d^mZx#B!x%=i{wBw)nv;HR`U)L0nXPpl&H}_c{d<#!!AIm< z%tXC%2)iQvUwUsM6tK@-Vx!-T#|)MgWv&O6B~W!U`9$&+Y#lEj#p2+K%d}IcT ziBX=HK>R!P`vb%a5uBN5=7$N~fXBx)c^Zsh;eey4U!l+jru10wHr%*r@j>Mop>uX& zw;ul0LJdb8Q^)0e%sGJJXdLdy=%4^iBky#qgmRgbHA7O3?*fSpCS075*Vf=R+}AQ{ z-$AXgIZ)cifHZbq%Es!*9Txm7ZHD`#r~HCER)x0fYEA_?lIpTEW8k zs|IS=YH%of#QV)VilgC@|14bQGijI-5sacuQ$Kzc-&z!cJ(IXR(UXqSP9kS|8)}948c-L-`rY51RN6Io{X!g zwlw%>*rGRgK-Ug}C9E)ecv=_`&6nCu6nrFmQJ#~)S8nrI$(QZGRS zW5HD+1U72^C6SxpnUU=1OLOQ6wU4&^TW0$BPReIOUvb~J@lIoZC|8R|(l}~d{+vu? zU}TLS*E1IavUl8tO>f<$&5R*RR(aqNmDQ*vsY_1xYz}m$k8RgL)Ae{eW>0@G)rzq3 zm+y4eJkO}C0$f3r3rBQ*&w_JqsJVX?Xs6PS;_W@Et7 zXwy@KXcSN|*xQ=tf5O=1(1k&TSRfE*FzFQTxhx)o+Yu}GCyzh*rgZ1l3) zRrYJxxJ9gU9{cWiuvMR-+PCGbalL%&TgwAzRXyKJrvx(I37Y{byc z1VVs|mnt<+3*s?eIRn3el8U5|i!mHaPt|hCIFa_^#TvWK>cwzyF7s^gTk`;2VccUf zkIw@Lv^yjA&tSP0a`lw1PJt8Bl%satr!R6ynh&>S^!|0KoytF7#7flpH{eb%*{jZ; z3UvHF84Jzh+xR4)I_?woQ(iZ`@g^Y5?4BERG=}v)74Sxvx)-g}r#`YlgCnKnD-~nF zS@2eBXDMAhNNl;YP$+xwc3@JaB?}jp+IshOC3?ED0^qygN+f2U9HoJz-ToQBjG*o~ zxdeOr9PY}!7U z-U(The~cAI_|LTAq=*I}0?6EF@{FkC%#T!}{7eU}yWg?q(Ir{O9JEd;vY-7Hbqcdw zJbK(q?t*z*_Q?LpSx>x@R?-pSlwjkfkWjKC z*m8XIo9=R7!DEfoA%x0quEKh5oLgL#niguBnG0jpxZ0b~^HH7^GdIr#_evkZD@})_ z)y7)k05_jDlK)}$HDdhg*3@5gLcNKm`sW8zI3alS$TZ!}ozu5~56$K?~Ggxft@Kr_M1=>A$(`DzXKXAYLMOtIbCr)Qoqzpv;B&4D%8KI@9Q}Ka3 zj7icwrogI`@PWi5`Si6#b?@95$(BE61Lz`b{b*yu;#rg?6yw6f)a$}qfbVpq+ApFpaBvwv)D z%tUvV!>#Qnm}T%{6##SZ?gk1j18SF7DN<}sPF*O#t;fQth>@oU<(PXwWxbOE+v`5x znnr*8uoJp6!}s%TN6hBworRJHS%r&H*gDl3@z0+#Ze*d-jbn*)MjJ{q7TA?Ue9T^=8yzq=Em-c|7*<^`MJ_QH3L@K@aI zGENaHSf)y!B_{d!K42%<#kgP-e>JYMA+?PQlx3%Q|?-=HUN7wXZqkuyh;!n8OcqAZAV>;eU3q!jn;Iqm8D z^4TD`#%AqC(`4Ld`LOz=CjG|IK|9G|H{_~?blGFMH#~%#xAODLWwc)mY@X{i+d%Kt z${%K!d;fX%x84hKq9e`#){@-nX9iVz<1o4{;Er~C)G2QMiphgC( z;ixUwK@9UGlqp(Z55cv~)2im9{+XYO^LIsgTaK~2nld4{MnA+p0LE#% zS%pV6@${2ZyIL&g03WFWDCxp7Z1UHwaUTd?nBCtA`|`+2vw?bR=y&E|MT_|V#sXww z(eQYa63`A09jW*nm28!KVp;}u4I{lIz9rSxXV!OVZ*zRf{FXDV`zhvl=(i&(rxeoB zce1+oR~^Q0f;|?l4?SVa!3YJW`NvUC{Y%m2;Vgy_MR8g7PhQ?nAzQLyalrt5jbvAU z{Yl7Bd1`Sf8~U;~&5K|_#^rQ?N}~&(oK21}y|2~HjpYZ!lY)BLXwVp>;B~@I6B*qOq7urn1sFA*zu){ z;kYR+yes$PsJFDgN@|*%p2J-;!K5)YtZYVCcNmHQ3-TKDZFuB4`|Aby=?PmX{_E}3 zD!Z&TO}vuq!a1VzTlfV%li1s2YKbhd&X2q=cPrDHufd?z{p<0C$8Rdi2Y-(J-eIWs z5f~jBlqW#-GwBgD$b^EawJ7z>FhydDFvu?zb{+OD zoU|!@_62K7#!X!tI01qCgK0hj1ZE-O8s3^(8NbLM0aCgYCfjyk4p0>l0utrf5mj z2@ZKC=#*6Ol=mtg=Ze<@z>4Q`5U@s!Nw22H{IU^@iG-@D4o0lfU@orH1-m_u4pz4) zo4;RT;}*PWn5Q+?I(*hdO}LMScHEp2YC4)_^1NJ|qX0R+YXD#s>9 z23Q5hF;p_fvDQI--9hL?`nQ9K)Hx7~Vy`TbU`O;^Lg0x}(Pw^_enU-Z&npJ`bCRxj z*cA`cq@L)vwQ!0Fs=xM3SRWPec$p;pc}GNXyvZ999;F{W?puShRv^<@J=L`62EDS@ zdfM!DP_CeW@aq4GyWC_PW}_c(;_4>%k7fi&=lAH<=NoVS>D3xCs>9gQyHSg_y-Y9f zR(nD4iW`)-|_({{e*k;`UIPBX@n9dBEM50&u10hqBy+sQ~tNV>7|-$os0V;6mYlaaC%6xO5={WLYn3iM|RhmZ$M zJa{ASWS@hO$E|ZRyS23g6(r`gc1WEjJo&>cHTI>MV@dlMr)a*Zh;i$Elf(N~(QvHhP(*P= ze}X6gykDbXpkCO3-9z|Ofo3)|LnRe4y=oLc0K|THas_ex##z82xVDN^qd|bbH3CrD z)U;S$DrmjH|Do)vtW6O5Pua!sODR8-Kj24kT9r5QLF3GR!!(&ZcNi5Q@ zw_B#*&;cd57vXuTZ9!h$9(L8h+=|~1yH3hmi+DM)iA};gI|dd{5B@7FMik7$_t*yo z-maSmfX9b3^mt}n@!NHbNN$D-%;+>pU9E%Ba4bSCxkiJ=uj)eS_;;fxGDMYSq_T7{ zV@P+>IEG)hX^`*EVs#nSVrt`@s9*WXR5^a1Y$;e6do^`5Q2VO*VG)4og&^pIJN&NU zZWbW(cg!G|>vn1Na_~(l^P=%Fi^vyzbquLDY}(C%Br~xX@j%#V`&2X1FUrx^A;$Lt zK6a`QCuom7a$|xJCf4ys;eB6CmNW|cQc;;LDtc`PhZw-D1ZL_>0A*G7qw$oHLi&fI z>3<2#gh*D5{QLdDRp|~CDf3$>Zhi8!!btD<7pS0QWzrMcCfw_4Hr z&3eN7KrhVCbgc9f%hyNDE#(--XDL^t z|00M=M8JOf_D3bSkw}N7EI5fg90^ zopZzn`IRD$n&$HC@pdRTG}~^Ezu)GR#6MC6UrAlt{e0U9nvD$9ao-ikV$7qTH8GDa ztLop!4-Z7M#pYj3m61;t51y4C-FNQ)7Hzbh?sL1i3DK{7Hn_5&_DDPAY4~XSqhKD* ztggWq9`Xn%_nouU`fyViHxMg<35o9u#I6cOGpuz?&}<^*auT@;#ym*+S%9T6ILo^e zpdK;RPPG5zlUm8vSb(canUDe=UYd`-_zhw~R7tGn6y0P-4*$$3_4%&Mi|!#PsBg_S zY2WGJU|7NcrYq%$$1C!k{b3rnSqfw?+sjDMh`A~yu2`a?0DRw@E%mq*gG;VRiL=mp zPD0!+2dqAaGmOLC!=BE*cejw#Gy*qgcmRFyXj@JrB*5_@1n9%Rbpt5g&`$5lg8oty z^^)mYc{%2EW!a$F;y&{AjTg!45@35xWO9{~OW-7Y8Vx@Nc}>qFSf)25;6pB+pC#I1tvy6L>b>XVL*pl1|odrex-I5BP+&sL-PrN_WO(W2+h2 zn>4K#w55d0o_o%CE+%`Qw7DT2KHJo4G@AX(j(x)Tfd_Oi%9qMz8AIx=L8PtN9I%|< z%J@P*ivH(o4SM$p<<~S`MlMVl_~8`T-XM&aj4~BA-u?L<=I*RldJor!-5n70!4ThP zG`}X9DrFP6NtTPTVFnOahQS{kQlK#U821`raXS|rNLHE)h4;IhaD!u@S!qGog75)< zU!-@g_%G9^3_i|M@?KVB$Neo*p@{v7=MNr4$q;qe(nr?nSv@OdfV*%tP-f;NO%((B z{eu$!Z*?MQ)nLMjGFGCwoE}5%gpm(pk>3H5<_pR>W#6At7#L6dT!j)$xI8sKsvs-* z;@=v6{gJ+eUEQ5ojOJgM@|4HrlZWSC_5j=t60A}-0iCHLf0yYMsY_d(P9Hih(LZ*d~lAq8o_|(W%hF6zQC;m*p$oV~e*}UHdQBPTH41 z^VT!{FuOdKc>$8+?Nfj-wv1MzxV~{P07C>`U#&%q$PMP^tsq#XCZNsX@_S-VK~+qB zaelrS{>r(m$*KtWu2nM~NCELbevVub(%u(ZY3?{h?Xj?;SV^`#oxh20Q5IuBXs?~( z(H`h*>z5K?U9Ya3M;$$uN-MUvnhtCa8aiSzdCGHj0_Q&*7Bes_GNR#<3`b|}fdIiC zk!uViSD89Dwl%akx-~f%2$EtBI+RlDxGx;cg;7fae>@^$2?1-s6e3xwh>eG=s8!EG zV>--e`H4t=9EW zI2-q*kIAwoc|EpWmnfUFN`JG7*#2@rrb*zv*>2t4^!+im+WFg%um%NtK=uBbUrfQZ zu|?_|;L3M&eYxf$JZ)*l8_QfPm^9icum;`K#1Td`mG(0X7WVvLsSUD*2&QUcd^qmk zMl(^~)WWrK`va^}H(WpJ#39**1hmogxn#!twl4@#2_~Phf=IW6aYsKY*ZeV_xRD&o z+req6+D{S9|2e(Q`v+=RO2eC7T`S3djP8D!RFPB#jgG^^#9%9ib-j{odeu$faq-l= zOsQ_PZFJu=k^8oH0UPF=ip*MdWXXtR?4?)x_hvkftO~ihXFaE`EtrHU&EPC8s-Z{b zQyk@{qEpYR0U_!Lz&%TrNGn}ck=Lf5UR6T+&Qd?s%NI(%)!=aV%wnf{R(1Tr0hQ(79{98T0H-+-TS}O|ll`DRLQtea4?$k0DMq z1MQ-xsDf8{+Wd#He6O!?-&Pbg6{tff3@E`a79Y}<8z}UvId`UL)1Yl_GPr7=`xAYO zF#XZlyt;R8%RpG-alx`$8e!Co5!hr0B{`Kh>Vr;-|6 zHHbj$P68NDG9m#x{}&7nP%tjAyC(Dki*Et}&Yb$2c3a;EXRpeqkJcmgwfnTp8CX~T zEllM-7$(T)@C9bgu25sA6L%X#IgMt3^vBclTOgE!1Ev{~!SR2YN^i9JishZj*O8Nj zx1HA*8@Qv_*8|!+Cqj|W05+34U&SX32S`15S1n2<%5)}-1}=N1msJ}J`^)4Zi_Cef zyXRS?;M+8G_UY_sqLdOOEP$hJf#U@~njXjiZv7^#A&9(H-7JwSNMbtV`Cj_qi(@4T zpt66yqTV?Zf7*nX3eWP$?6?`kcBom2#`Ao=ZAkOW24;J#JP?QcPx@Oiq4hwv9cbKs z)IU#8VBZf&H&~1_bva&cU%fWgwEv1O>PNm}KT0bV#=+)27<_9s^?ItCBW+4ryqs%u_3S{riwCnlTSRk@6d+IcBd`vkNp%g=z9` zuUCu*f%dI&Z*Sag(ufow1~Lu=VypL&FYJ@7JNhsEu|Mtd3KP85JdOgu1^@-Pbg<25 zBt}a6EI)*O{Aw^)pV62?A1~u&s;M#3BfZvcZ(cLFI5z<7FlSR1b*<&oaI#j8E5h3( z@>GqCzR#cc_^^P83k6JENI;1W!^pOK7EZk?H#q)DaYO*le1}R_PzQbgetA>u;tD+oT9nHm#Y< z$#%Nr^Bp$LZxOI}@)UozaSYP+_ezTu@G?JqNO=qcPB-M^r$Fc~?KVtvphV4B{1N2- zs7MNUc`iibjn-vR#47==nPEub`Zt+*cK`~cdo8#Y1S~Xlo`-Q-ilWxeadG>Y){9^O z;je@P9HpmYsp5cU56QOGYBzT7ROYw?IQpohm}MZGQ+*Xm@PrpWHO$i zRF{AB;4RY_(bvjj+6RbYJ}-MfXmgYKn?0ho{(sBn(9iFk9SJ3_H0*Dd0W!rCBQG*JfH+*L;7)_b$3l1SS0`^+Sv)kUKLQIiH{tBjoK&u(EW=W!tu8}Ss1Lu2!wzhHQG93|ktnjxv4*=o>jAWy+OvE2sT%mg7 zw}JVnMKzXP2{p~_eRq8VAO>n}Jo0kZ^x+^zt6{-Bjhln>lqSZ$2k)jYCcw#LXEEe7 z<`tf#F?nOQnQjR$3_e7fiv8owM5W6LLS-36^Q84Rl>m480ft&z@E45CIG>YEaYH!h zvck+^Ezhg}>t}(ylCBqbW(k7Je;8ecP7Ae2v%jg#w>_v#(W4E`r(8 zxc#G9!7+h43`|LgSYZx&^RTOId~*KL`?(U`hA~%pqcE0=%2o>@p9|4ik0vc)Rt#ev z!K^%L66TKOHT(!)GiB31-={x7wC_C0O3D>02`Z8YDwR_zm7#LZ5eR8sN|Ca6uyn3X zkD$45Q)h^u*Cl)`O@bJ`S&WzV`Fb^%E~9>xI~Ocj098_YaYd_6R8i-I%oVYz=?ZDO zSUvFTLn2+s5Vgg=*v8@UfQDL|QPkwem;Hd<5bkt=yoAF&AopeG#GA>JHV3M6mMg1Q z8vh#>YtnxFa7O-=#D{(8nq%xF*|+k=@q=_}i+~Hf$qXyiaei4C6W<YTj@olNmU?AH7KUg%AGxeJ55{Wvkie`5eX9_o2YyOOA<33eYyiO_21)r>J1bsMKc~h z9aGGGS1PUVQW0Q0HPJMq?Wy=!8}g;76b<7rbvY8K*I@y*Z#eS7;n{Xy=ihsecCp`X zqzhl)Swpd5+M=kT#FrGF9}F_iV4Yq!2UwF$-%x6Z>gtz-E#@`r01?B*e@3H_$f)AYH42*EW&wbRJ$$N7SI_u!y!n zh0f#vP=k^Lq@g~2Il(0oi&V0R4d(q`bKaTJb?BXq&>#<%1@LdIXzF$%UQ!+b1ugak zzca_81WwCuZf~pkK(7_|TbjE(*xUNq29w%F31>@pvO_BwYEyR%wcr2c;8w1gjDRBP z-*6=tmuBy3NnH-nin5<_5~d_lMh%4(aK>b?eXTAS+=ot@%1Tfp5i6oFoM`9#?eC@I z(oDqytzrA`pZRM5@qat zk)st4dI__A$bQ85mb)7V%!4~3@q}{ONlQNgQJE?CC^i@#?7!!>UJf1FGg7|iPed4% z6qF@Ylofzljurvn%|ZuAY<_~hL_&gve7tbK9uqJ1S8ucUCIJ>Qwu==zcZUg{K}>YK#K=uTIwMPgQVPNv1(G}j03pBu zXa)abT5c=`HpUuvC5lHs7%-49AZKB?e`o|CX3C@oKm}<{Cj)2^kRHo|E;(5y8Wdgl z4HNm&$1I#BhD%D!&AWej;QF+^Yx?T$V~^8KmKRxC8N5@csfjC_?z?X*&$5sjeLW1!3)WPFdr$79XAuL_ z17*djZWea8yip0!+S+Wi*$J!Nq3Ma=26%Ts z-wm6kUBqj{tr=6K4bV&M3&Q?K z1;)w)@O2-0E69bc%}M96{#9%%v{@-NPEk2uuEbBOb2Pq-v0M-aQ}ON+=?69lkN)=@ zs?k8wuj`@>9?GcFufUc<_m7%;SLMH78bdY-5d`DXUfZ1=Ny>T1$C^?Gh3Ri28<=rS zgSDgZW?#Zw|H}r)im3>Jbg-NgOc=L39=p}UftEd{Zg4NK?1iSS+VJ|3-i)M*CWGpv z;Z*I5G8HdpgMoOLxOM$Fp?aQ54ZDnGW+7bIU?EL@p-@#Wmo~HBq&B{Aba9fVH$}qS zl#~it+V{Wvou2M*`ALeMn>z+aQe$%@bpSvRI{=JqI;b@my76ITsfwbV#YR%&nmJH) zO7oGnrv6n;N%Q9M;^xhK+D6=5m#5v!U`SYE`sC*n5o`g{&KI6mZ*djJqCqGgN7IK0Mi@nEIC9J90PqE>+Vy`!(MTmsL9 ztnOk)+(w8u@xA++d?+tE^{|?@C?S1jmGnZtL!399&b?-HQ{oCJoEtruaF%e1*nur* z;#~d<@Vt)Nw_`z?x?5&vJ`d#Y+RFcj{&@)H@Q{_P@yd5a)OO9S{7hPj(-|AY^Vh!C zU;G9IMA-VUW2bJ_m~yxFqaVm>6Gfn#Tv}&r(0V`ap4|6tTOukfO|IN+msRk&t*=38 z2ZX~Pbk$0KQIU0xZC5Ud3|q={|2s|Zm_*ipszF0w z3ch>>kodkphrD|z_EA8*jDDqSkIDtmygNj}`mH374`+x;2NWpUG($s0bjVH@dSLZ1 z?}7=WjCLkFJ@%hq(n(;QbYBbhf_l2nNkXiJ0#)ocBs7G6S2P4tLu&r=Z9h@-ydjt^ z1i9SnP>duJO{U-<9Aq{z`yVc#4L5I>MoH3R8olD!`vf#4jT|j>sC@Fixo=)RyzE6k zJKMzV#G|YKayN>O@Amj1L9EzlsF@56s9d`~BtfxGc|fqh2uAu}s%-MCLKVubsc~Rg zaK&`Hsc~fB`5&`espj*v`f}Ilc3h~2G8HS(ZJa`0&a|T?NeD#2bH_3bp!xp04 z%U5T*0EgBq`CsWH*2fPcubA;lg)@is=aR4EtDc<=@~dxLn^Q%G3m}ePS}6Rvz!@y~2@}5T_R}ftKV?VXFZbZR zwTIb~q)Qx_txSf%H5O{#7n1~W-Px_<5q+awm-@329oQ*J9Z-$U&ZCJX(i8FCvY2A6 z@fKl-{#fOdzPhT5>6=jyaQ`(9)`_oK6@2bz^d?QU8z17;H z8Wv<)hl?x&P>AR$qt{lry;OF^uCKW!g2~X9D4=`To+3dN?i&MQ#Y^7 z4{K^IPYpHj2}WNSHu$0V{X2I8>?583B8&1uhVZ^FrJ?WAj(v2IQM^1vpLKqw)L}wn z-w4e6(8|P6>L@RVd#;Mj+TaLx|ExA!8Ii}1b(sCi#Nbn$+1w5^f777DWd3F{GAEpF z=>%hgg1dj0xkf)D{3in&_R$?N&k?kJ`=5_sOhCb3lBfKcBD=A!{ILH$hL)n2{jXL5(vYB217}T z-n<|X`Z6Q|FUybh7~tzAv|%5Z&y2CQ&%ZW_m^OQzBQE(AZp~1B%9i+j9khhfr3}I}+3^0Cc-NTf2>yB6*(7{aP%k?e14k;&a|b2mkLZF!&Wp59cKmSM`~l%j@cf zPajN#@A@<1zrTTjjSxoRs(li&shOZHP=0Aj;@CZ^Ap)8nW%)M)R=UV zxZe<8SMN)+b{nlmZE`-m24pVYG-q8#K4dv(Cq>~^C--j!e=sc+q&WW#7ivaq!)sdg z7YEE|@}MUv**-1|K`8O$Npgvc1wjZPxW8MPTg@Ny*ximsID56_@ z1F%@zoQSz%lJGK8;u50>#<#Rv|60v(^<4U>wi`+8z2F59iR9~pk-l?_?-z;y4c5}& zrTN-{Rx)!q*gJ&wp z0TGPhaNC&7jZsjz3|<^iqWSyb zpELXrmS~S0HV_e7kR9SkWyrv>>q>)^nZW;^=tZ+pfuIfJS84p&(s6Pg*B0(59Oo24 zi|Y+`&uq|?j~;JZz?&u&`zGdR=23Ru6`66a2M@~ey1kcKOQ?``&)AwbXn>X1%_T*Q zn=V^83LZTCw{Zcnty;gONeMF2mbR~hsRL7y7zNJj%ig9uw}*0KwH!JKkGww^EUs^$#!&AGn}1PyEeRmq zqFJiFf4(tEQfvqU)G$0w2muanK8)|E=dSGuh@fUiK~!BDG=}aG*QWv7Rr&eFGDQ*b zr$&auW^aG=xyiB5nGLpM=f)(7uJ(-x>{5U1ZgF^{B?}<_#DU|??%#EpG~RyV0Vn#| zT-brY@rGDUwLgh_fFcefXS^Tkp}if*GlFZ2KnM9kbp3>ViiUG~m7U4N(0G+CKy=;T z4avoa;YjVR%UT7p5@urQUbphhf)}&@ZuoKb_yDmYVNkSxdq7z;shl zJMJ3$^(`44YUtg@5%9};4Xc(~$=LRrUp4E2BIOckF5`Q%kpQHvd3d+I=d2p-(GjEK z>D;@tDeIZ3c>P}@L8DG3^F55OrFU5|d!QClixFYK_YMY!=l|G|gyJ_$adqlmlX!Vw zc3x$zpEn<#>f6LC8itS=x_7I1h>y*=&seL54LMd8F-GQ1JkLdq6U!bh`5G*r&wN3v zPO_Y9vs2cMmYT)(e9twb-|v#`?&9amAC8-Zk6u@?mV@8)-}-fD)86HD0Usm!K21WJ>6-68upp>4w(z3JaECsuEDO_gG6!vYSR{`}_Yvvj`g_7(vfR&O19bN6n} z`VEN#zETdi>bCUPJZw;u@sr5IDFTg`F4Q`r5vh9aJxs6i61HHR@qhxx&$Y>)Qeq>EZSnzih2X$!4uE_~rd+Y2cj z=?8$b)8*jWnvCJ`bgb{HmYL;{<)`sc-2o*yCVkoGvc{*Mt`+*9>UhkPk;_Wmhnkhw z*1WcILZ;z#K`ryn^`Ya|2Xodlr>5Nh%A5UQAqW`qwHqAzCU`$1GWZpWd!Lw$*WuUl zEw#i$z_1u8S}l4mt>$7KL^!qGna#o`UjklueC6CSh{MW98AcheYHb_-HEE+qC9I;Sy6pKnNkTPr_oB^0m$N2N z!g!HfR#D)A?)Thj@_0IEc9r3&n~(No+bmhXezCAehhjy55#FgDW9%NF|4dt+_4Yt1 z7P8Z^#HVfvFZ)GXx>fL(v=kcZaITg%6wVb<^ndBbQx}Fl+_rRQbSQgun$|5}%u-vz zK8?*;Oiu^2AC;&!u*NFZ?f}c-ffnoXFsZFJt3vH*p1%#+ZFJ7L!J)-{*aCx7-{(8l z7)?+}m@!EgAW#RhUHnF#!;rrr1Vf6;Ds3~6bP2>QrxdB4xn%)qjTCw7?a@#`7+v_s zRr@w~yhOIVWB1digpR7)>!R=g%8P@uipB`MbLbM+$>t8lM_gF->uiyh~sJGbg zalbs9Q*tVJ#OVl_`TrMNZy6S4`>uVDN`r{fjYuQi-Jo=LcXzjRBi%7{BhuZ{-5?Cz z-OY1x-)pUB{h#;si`zB~j&sd5=Xvb=@!OB{pqkumE0K0jfhb#k>N(u&Kv91|XJ=*8 zCEvO~rG?W30a}w{=Yx#8;DuU@+@tfIfQz3g_!e_YS^jJ8Zn+Lq#db{q-R;73X#^{x z2*o_JcudXHO8d=(8a%Yuv(0vG{0lVY9j6MruGh>!Zaud^HRqzT1atyL+D|N>juS`jj|-!0Mx&x~yYxDo99Z7P z0MHA_cj%vDaQ%?PLRBma1`F{LBTk$opKbbCGgEt5+OTj~e7FE}!`*XLMCC(9FT=p} zVPV1HQJVIkT#tgpiY^mu>QU%*(~h)N?oBBp`7hKL){||eq)b%3^bfJg@fFY$?M{o* zVLTrV_7NM6cV6BnQ4kkFG$^5Ssnj~6id z^2SvNQfeIKHB(bpFs0gjF4@|LNJM0v79x5@GR1ExWjCvH*}%8s(F zxrGDqEIjxT7QfKPf_0u1>Z+qVrT*T%Ko-2v*mcu?pqsT)=Lt>~LnZ&zjEQ{#)|Mpq zT3af4((18A*%mT#&e0p{0eR>^lA;0XJ_GF6jhj23Dz_ErmD6B6oC&@=o1f z;*z|bp1uguo*0U?o>)H2Us|{IuB+rQhecZ7X1rd9U{uUXt*a-ULk+g{k5pxz;9cyo&yFsbhb-4pbY(}#5s+M@m z*g08v{iQDEfo!FzWZI4DuJbUl?lX_1FuxJ|q>@0Mk*^&-YIoY3#bQ^3W++`OI`wN(cehmE zUTSf3MMXwB>id0evP+1RJFLPxKLs{q@xp`hmIY0%#qC zT*P?v0DQ5mO7`)>mAyBNoqhLR1crPJJrhUK+UA><><`FTQ;DNl{UBk2(&f=^gLQgN z4$Y0P5oh$vWdnCe!UTAiZ$uHpK8F7zvVTE9AYnXnJasD_J_>@wAMlu7kM&&S!y4%f zw6cD&Dp^Hs8!~6HF<6g>=LD%|y)LZPHnE=+?^3=m?1k#bbjZMH3Ng{%Z5C5ABAnpx zjh&P|d)oSsn!0)oEDy^fKJXsjk;wi1^;{>O>IvvExNG6*#+}xwQ<}+_seEUFNah6fPV4Yogem z$_2_!>P<7fKHuQetJ?u=aHaT9L~lV;Gv$>hSdvPoF3ANbHW3!IA+II6tbsr zwG!D!M$o%gs1+1I%f#{w$Zdvh%LqVht7u9(YKzJ%y9>rk`qA>f0qK7I-``@usbx4i zEk;xjw|CXNtV0CFkgC%Tj7ScSiOY#fV5jZ5%Oo#$xkcviWbOyy+{EPP=+0~kE@LIMw)e+WCV-v z*V5jkuG_Mop30vBiVW0n2*{yVYl#feHA%qN;66YTXag3(!`P#?T&M+kYnjJC=`RlQ z%J&LOgptu22MNt<1m;q`gRhzx{<(3R(FKMJp0PF|f&*@9kmmJ2-7+k3?_iAyjge1n zzNpW}?s-B2@8b`&Kf~PE0iO(sIF+(dZk90|^t~GJX0gQE&LXAbytiR}47+|*9J!=L z4$I;eEL>~JItOnMlGmBikQrmSR!sb&?VpmR3Gt75wZ=66>vh^(2wPm9$4A_zy6jcD zD4n`nHFQjZ7U@UoPW%{`%8m9#TW5xm-i@)~%tE{2R6zr^Lc~W`VW4TH>)NW__A+90 zGoGei-ZYhGGijzTJed-@z?|Py=)YJGRIHH;{8r12-$!}hN;^&`IWdoZ9~=OD!z!%k z`Wc#U1BH7D%SU8sPU%#kZNJOGntw2X2RG~p#m3kJ&SyRakIDY5`(XqrUirr?$(0#b59kYU7J#2r3s=!$DeS?GgN0STFr zr(_r;9gw86_x9>%q-G*iG0e$+`>eRd%);EfUKV!hp98r^E!1Ud<|_Lsz@EQDqibf0 zgnt`Y)lPk4tj^Il8+_g#WNr*Q=jJ1&llwF>YGPoOB1xp4sV#YTL*oNsIoJA0SGwF* z-{`kp$6iYzQgEt;B4sx2Bv)nFZ?H|e^LuGmQLKBdE)`G!mVoT(FU@{TY(Mb>K7)?; z!J@$Sr>9t89eWzcQIXtr{0H%arO$(>%1|Y;r+B1W>hIjOzl&i8mj!iVPjk6xyCe7e zaq$Iem1?bPcT*WspE6H9mLN6rR+kf5QI@6?E>meUxZ3PX3zC#Rzb>@e5%aUVbDVq% zdu);j4GUdI5(^$(Zyv0IGA(#LD&(iGH^F0OgD?2^5%x+;Q&q0Z3e)q-X^uCRUPnWV zzv(Onk0H+mkcB$j+BwhbvOk8mcWq9u!k&#O`b6ttFoh?6%_xg|q~cpUv`CeIbDMj@ zTPQ%Tds&W&G3WPLmhJ7`?yW>qeCjE9v011fzxI(#0V}c3%?K)F@}AAmUHkmio0fZ~ zEM?x>AImJCbGEjjFu6FUjY?c&v4uO&hd(!AQ^dyjGP zfQihf)8t<;-o)K@lIyUI5ir ztprE9WaAl;x{EExP?@cE9K*tVrj7oC#%soZvp%cC;aC5q)3>fE! zAU%DDNN0MK`xJK$XgF*YRX~3^0ut6Ed}k^P@LjYK_p7jaxjSnDhHawLs8`SDEAs}F zRPr_a8m|{wF^74v^wA3wID8P4`MT6wZH#V6Y)h?PxFUf%=zlF9O`AWB3|stF zh_5hV&hrFMn4dkMXUy~zfPD^XG9pR^9-i;Ir=_)j#>%Y0=Z@Gv6eQWBolSpYou_q% z*cz#?ZQeS%$9;9;WdO6_E~HQh$MRQSUG+T646~NXOTtfI{<(7kUr-+x>Ux?;*!=`* zca=|RIjsA`tS>Gms`#vfRIT8UP+I=r)Hdi|-eKbPGrsn1SU{A`b>pKM+EsphC=Vvn z{QiaZ|L{{@{!phc3vuGPd;@NU6^d*@%k#Qk6$H6`3kn^PS&(pvIWp5o5 z77rQbfnww|D+F~g)pen@GU>c#YtZ*PTEwjC3_!?8cC|nzfd?g^pwkn0)*&}R@PxjL!l!eU~n3Qyxs8orF*UEakALqGc@!=!Rm z{7Ax{hr^-_vKA>^Mg~tTTV?+migh=>Xx^3cjj7?|XFtG07Anfw@5{T?d@?*xYu8dh z@q&QX0tsM$i=j^Wi7-g#99gu>{QzZ`tNH<&$kfUEUwI{IYq3c!N@6gS=;aw?7bJ~C zkkWEldO-Nm-i@4V-|N**>-oM}NqcuK5q{$SbjbTh=}=-SY__81rOppqXFC2~OST;v zeHcf8@YTqq8CJINQ279~R{p7abQ@Znogv+EiI*|DqJkJ%LmKx3Q;rGGcOsBH$`8^F z=XH@UPjkgbj6Y7#im9>YpdSHyLT5Ifr+QWS-oe{`MJLL-#cE1o&t55;mn*3NlgGt= z>0IU|#%E9Z4P?Rn;{{asB!bQ3x?BFYPmh*1gK78O87I~yTp1LR#&2)0hAk@8Um_yt z(i7t2aPd#rq}rjcF1!xv0Ox4PXXf5ya`lB1%qVsoN)0hN|OjU2_afq`%i;4 zdZWR`5Ssd=#t0o<+t7($3qpy&9C{bd>jrCtm%A|70cWmcF@=gQK*pL{rZ30tFH2Uf zM6v4N33KScj`w8>HhB4X)s~~1?YF*@kcFr{chb-v^*d?F26j!%w60|TkNq76ToQMJ zYeG{O??`X|EH1ZaXf=HO@&g{03Pcsa>m2)$|6#4)M0cXkr`e&ar5AhSEh&ZDRp>s~ z^XARq-A_abcvmB$+oq7Q*5sPyBCVF=V$}Ml6383<5oc4z*GIS%t9D3E zRt!+Yc;ud;>b%5c6I2A}p$1S^k9xFQtt{jLm@K%+Vfb6Q?W@WbJESy>0AmZ6rEG0T!c@;pB3yxw_A$DY%Hy( z&~`{3yoIspHOh$Bb{nL1=5jjyS-&8;y!Mw8a57n$KoQX5U`NPEH0+e=jg{8T(#kO# z5<_hD(T#>8oEP(=KOKck;2=r1j4m!>;x7 z(<95oaS$WxD!Xjnzp=NS!t=#`-eRUm=~tW z9Tr?=b}$SgFT=LgLPECK;QdtbKC1s2Lw6wJi{_B?&gZ|_a6M~S;4+avWN>w~_Rgor zzs@ubijii@0fB!xI_TLGr>ZLt&e?R0V!>A=>MtXhNw?J~xfHayTHS#_s< zjR4uoH5_PBMUOvkfAIMF!J%k{AP5PnntN~t&S;q6S&DwVsekmCQ^=9v5D=avGB1sG zBe|i!P1^?s7jX#|u8$j+vJ8V3v9MF^_Q+)(q$ALWD#kKf$Xpg%dboMVe17Jvmg}@O zJXQ!RNq#Umx_T2GGi2mq=j>s{?TYKQqF5l$3l}K)HAg%c`-ykS zy+^;60k~V=IAS?frY}_QSDPTLc&|^i5+2%AT#CyU9_6u)UFP|+jSkC<(9JP3p;-Ud zmjf0yfS5_m=)I@R*FcR%AtyJzWdG`VZJs1}3z$DRbJgp}9s#^IZ$RTo7(zFQ!12!s z=;$5_$J1%{1yW%WxqCQq+MoAJnYiyS1;r3wyZ7Ay@rtF7Hoppn;KTV|BQ5gau?n+; zg643y9w3}9zS!c2m8^eTZH51wGSBef`|!1;Xn)FFO$)3}EQmA!#LRB;@T{~y$7j(| z5E1}Y)Aw}U8&X6d;~|sFbB#bXNKTt`aX$d|+1T4YNhy<@}n)7dqCLkpjx~ zT`;#g*?;9|09lR1AZ@6r?f>l$`~k=YWYEcmXiWEQz$9oiKk6yj7CQy0O!GzZCnaKh zXt+EAMjjeqAgW9)pA9bXAPKjaHUB)bM?oHa4QE1PHv_qum3=O zuLf*`!C6=dyg6R!&FJ|3c_ub)0X#f z-bjDFZ(260Uiy$xmaLlmIU!5G=#fLI*qTyV4_b=wD9HG=D15& zq7HJ>2=9`TJpPPmv^{6p>ED&4hgQW_68g<(NWtPzzqp=;!~UVu2hmz&=H|2GA#r{H z)NBYqTJTd83E+}q!oH9k1mX8-EH)Q$j5$OSdi1?lK~gAN>si?M@1y&r6*7{U&IhLV zUzxYOuCUHnFpp#WvL6}kveMvboK7|9KrDh1l~r7z->^MsCMHgOpuzbS0~h@p2{#s= zq<~l5(e8BYVLViVN7$(D&_C|6NY z+-+DlZb?eaSD&vqTf3b{E{ijW6$ql>{1O*pIvQD?fzTK~Qf~9SoVwKH%5Ci_$=q7F z3zGoz;60N=d3n;l@^?37-l0x3E?*&6DnenFwbms6&m3!=f}E|F=vuyCPHbMjD~6($ z0#{a_gp3_V{0e_yS)4>~#`5BDysI;W{GA$Xi}Imc8}rT}5H1$fNi_99kV?lA*bwm*gWH4BEvJ zIBO`VNVCH|hf;ITA$G?|$Ve|p2Ay7{Dzcge()P%lac@CzUpNO8MK)SK3U(TSV5BKl zHOiEYQD~=Gv%Xe>*+!1EJfah)(y9|8b&k2c3xJFvkGism0_zcP)dv4UV@UxU?}}OV zLUHTUTGGSd=o~(~-P#a--$Q1*CKdP>v{!zvghyMG+0cqYs`0cE+R>E7dN zxEC7EsnoBFakKE5IwMGNUDUBZIW4s-Jn?Ev!l-|_y;~L=okWB9<>-Ua%}x%z zZ>o7}2Gv_*lsomSX6qft(+J9cOpdEiyiXu_Ku745Md{IHR(Pw9Xi}xfTn4evYXTp2 zzki^B>h37YXG^7|9RO+0W@g?*HV!m~SZh|Ks&gK>j>75IbX1}X`T;zTAT7Gt6`65S zZ?7<23X}Kj=HvY~vh(02d}AqaO08?y#mbK;>)ZkRqxC%%9gYN?VKmB9uDGUxs1Iz1 zJ|`DEabb+Tf&$*glY@Z@B(61(ubxvCvR%mr#?9WvG9PyyL$+**yf)cLw-H+$QgCLd^_^Hfkc92;a6q(VYf`B(B-MF+ zt)O1mjE)1Gtld3Y8CKsfaTBkBFBw=Kv#VE=xb#)ZYEKWGp{my&? z!m7O{pe_stA%P-b^axoIMJc&+-hyRCzL(;1Ndjg*eS9;@gKba4Uq$ySg`$trFPsk> zH48wE#>* z&C;fjo8R-6H#!H#l66o|Gd?8uF+^SmH7D-_eDWO;)=tCzPpef+Tcvp)Qr{s zu^H(?rT{{HZ*^Z5Rpr934J>>;YgJZ%tsZ_k@4ptpXO#aK`q?tB^caFcT!1T!X7o)$ z7I~X&1^DQqXia`)m*;Yg&U_YW&oPW8D3`OLudTDV<*tB?GKL6$m5fqp%Eh&O?7I4M z%n=)oJH|qd0QEIhDHg3#zW<5)L`(r#wLh(+nMblNCipT=RUCsk>YYt@y|TIKGMT*p z^t5ONk6lmPwDETw%*z0lBvd1--c)fX~kP;PR^3@isonD=kno6p?~ zQ~?y9$p()tXM=7XHATh$E`$ZC@Xi;6#LA-)C07=q{a$~pVdGm6u}f%FKy2(3apqgL zZ|Iz1*J<9%R{Z)nno8|8HJqk>dv~1+Y`h%WTP_U>z&A%BH`m9C)uYTpG5)b^6Ig0r zyj;RnNgDRU2D}V)&l|p~PsN#7kVjrXa9<+e8+8uZjjQGWQpe-gVZu)?y<(Iu~dq({WDG@qXbk{Xxm({zMvW^R; zIw?}vc{rk;*7MfOmV-wRIpn>cCb4VaXRSE7T4fX>pX9dQO+qXr$z$_;81o{z-O58B z-eRaxY}k0`*J-p`fL@&}aNh6ReRXTnPc8^rO`0*sgm;6p;qPY`y~u6~3;6N>RnZAJ z16~2L<<2L^O|F{AY`e+SULM(n@t5exCcC*!H5kspJmdXef5^7@=fDG2`mSY`kH=KG z%2;?*tm`(!xc;V@()1xL!0Sl&&7^>+i1>D(o&gBhx@Hw1i(tzSY}nK^OM1&HD;%m#2SNqR9pyA-Br2E2sT+ zE@R8jBuvxuOXFRx->p=ch*sBvl;J)qMSoeaGuxaN`TTH}dDHlIMMxnLO5AqnekUv4 zZu$K3Q+t;7ij$lz_WxGGOsg0DGL^@km#Be~z1XuC#JL0VYLLt{0`jEG39rnHl;gHB z-7jKV;bcJJ+X2`05g#US41byyO>pa*4tA6Qg2!DHHqpvyI_d|cdObFPPS8a3GN@e??^8B2K>rA>q`10k+7D<@=V)TT`{& zc1;j4ofPX6H?mkI+f1$FAW2ToJcXj;!H zG_AX8vq~P@`YqJtI*B{%T;Re;Aam$o6F#bY-UO}Iv2nNZb_0*M@n)dn=NRTaH%kSJ zYxM80pH97O679$x=CPv=$grw@%3n3%|FL%2l`^iR6E}@%jaxW$_8+5Q{S-5P(1}_) zV$JM99v9YHAKz=vbQdvo=+WA1S)1bjO|&`(+g*B%9V=y;9Q%m1PJ5sMsn3P(yxzl> zWL-D*supvC%$AnU)8ixG^isCxYiC)cExHz_9n(!~mta@B=Q(x34e3amq%iRbZtcIl z07C*bkF8Gz z`-!UgmY&vOvc8$VdcOeq0T!r@75}Vcak;Gi1)uxYmE_Ia>|9$R2lC*)k(l1!3Vv?8 zA<|-h$!WECV7yMID63Q{lBinSa*k)y+}ZYwy=#Wwobz9 zrYF;jmaU@%iWBn1V+-%Je0II8_a4o@x$C&sa^aO9Eopos}LjvcpXlQV?#0^Ys zv`W)PiZUgnsW6HZxad&9_=lDtk5OvU2G{xRprwt>=CV28U~!Y5-*Vq*Z_eg2UGBOc z5eRVTPgg=O_ieb=i-_HW)?**7}9tiNS*&d26WKP$f_XRfvv?i{_}u|)Q$ zAbxiBSWYMoL;&}6ve(TfxujkK=$Rt%j;)q^X-Xn5&*vc?W3~E)hN?PAG87sax&mk~ z*O?n>7uF}s6ZLC_!PEOvLQk+`@aVl$!=OuDUQ21d{8SwyzpK8>R3H#;sYxYN#>=l9 z$9z!DbO&~w7ZSW^h~0^-?~vEqUd zu3l}WwaB1>8E7k5Oe;0%lv_@jl{F+v_fq3{kanOKx;_1< zH9v6TC5SRymhpjKiz?t!*a!up`#aXa?|Wh#&XNoQvcZn+`Q%0l5t=dCby|>e9)0PH zAsU%s+|_alhSnm2v9*0DeX`+%Bk|!0^4Hvf{W~E=k?*@Rkl|$2z^}>^J{c&LVPP)s zrKe%Btyv#k`_P zZVlO{#Qm$iX_W2pk>zI*ZBF?rn;N~x$M0d0()$i{B}aSNiPbBEm3w<3N$kym4{H@J zV+-u4-yx01GX=IyN#2QaXS*?wKCUO9CXR4B;8WKaDV{$stE*>SDL=sPZ96DtiYF%W^CHk9&=8ZVgUM;Yz9KcU_BsQ8 zys>g$e7>v4{M+#3`OKtF@!VUJfEGmIelT~rH+z4MYhS?4YIGNSY1huvuwv7kky=#0 zJ?47yxHi+M;M278CG~gP{^o>6=Fd}T0R5vZ`beEP^^hgi8YYMYID10yB~43v5Ei$o zB6;na;}c0+Kr+0+NxfZ4nR{+enS;7V=*3~o(O-;Izj2`To-0y=JWZdCEKJy`7_o~r z-?rRu-dhlSvcJOxKwiI3`4if`>*2=D|C@omqoIJ%tk;TC#l&NXTL>dkxn8J9+VWO# zKl?CMYNadJ5RqoBGcs=hZPYzohykmYoPv6RH4b517ht_m0E9|}8Bn8RZWY)!x~_c4 zCe-3-0)j0-VkN+faUBe=GTHvVi8gTjjy&4o3?XktUmtb6oim)H-%TB#wa!F#t{$i{ zboNrqlgUxe(oHNlOB=h3ypE??-F+O!@#S4dW_fsSxzOI0PXL`~wgcw&EQju1X61`; zqvl;HJIUXZ3G=0@kE7SZ9{A0o04_@Zx%?wKS{fUH3CP8Bzl@AE4p@~JC}j>`dMvA{ zdM7!{Q&#}%jh^!rr3a!VG0AkMOqUHWU*$=4#%s1H*MT-E$Akd%t^DR7orUMFX#Y9&C6(kHWe(YzjD@!c8fxqp~M z;|lj+*0^s%Eb0z>6!6~%t6Ko@9h37f{w2&h{lFZ&hg02&FL_3TaUwDl ze|c4WhW*0TOs7?mnv~uQa0>%V=`N|`xGs#T;05a|ysv*;5CHB9O>vw)9!b=sa!$SV zJJm;LryI`3HCuK!>=l`VS|{_?*fZC^c+neapDUlY8@M8Jw#Pv{LJ;F%%4py&Rk@OqVS>@9CSYUYpmxN%vdrQ}JP`%A ze0Mo8VL`vt?2=bUQd-va>eh-`Z9kQ(H8!8Lm?X)4#`s}%cOnf(qq!y4D6c03s&)UT zbw*Whp-|;v4SS^+b+bE?)qdreGMC3?6~hYjLFlFrg1_ z!OSP4x_i`?F?Tx>Df7&FUYW+x5=$C&5I39^DdW8+cG23Lv1p}RY^X`Wnidh56RASL zeiHqQS~-$hW894hgaqW@Jzx8!L`$h%FI!bQaQr=RAfps{y2S5LkI_DFXY$zbzBKWl zd0d=qPFa0)-(~?)m!f|#N5uyRBAt(Os2Rn#y)Ki0Z5fR>o6q1sVNj|Eny|*6P$MS3 z+jm>GK$0*Ih;U+)vRS#Vg{Mv)?l!n2LJqhz&d*bL&V3q_;BmxTb(+*6)ihDXkmCVs%sUN7AI&vA?(gmVw{uegXd0F9O-|;GKeQu8`wsFiL8c2pbd^y3$}Ls z7S`3kWodASPa2LdIh69#p~}RpeZUWoG<=jE?{g#p)#^pSbj3mIdq3>hNMvsJ+?y+E z$l7Ns=ip8k*Kg5Pvv?Knu&m(xPgE_4!730u<r5F3aKq@ZYO44qRO4G zg?*d)snxQZ`rU>2YVLJGU%vWQU?`1RMAhD3^!5KRZ=~t~wEx4fB=3sfwNEWlv?*8#8 zm-f8pSfsNi4Eo(k31vVbR?)(4EfFLoVEpY(DoyX(HYV$1{#;y16bs;p7r|>7oMqid z^mwAYwwe|Ue8KIMXKy=egF;$_^AL=@DmQI3xMs|%LQ=2GX97T>Y^mNqg-L#mZ9LAz z2C8FNE@q?+?kTu~`B2*wV3sOOWcR?BWY4KIu&c#H>%XzQDFPVSUhM5vPP(sW^sa8UjQ#V zk+8F{@*4mw<+oDA-N4Z%J9U7xiqh_ui%&gYygPWVx~=1fENiQ1udH0AVb9U~kBh;G zMsyQwBgH4qDb3Z}bENmU8j0snF(?mgLH{-8%sAVs=SyP*>+aurLbMrVvMLw6PB-x_ z5^s2<8eZ2qii-&Q^YD2cMK_vM}EV3g+S=~Vixy5vJD^?PTF?2}p38KeC_0@@h6U*3KB zLvW1bc(seGK7CnG(df_73kTIw29U4AdDD5SkWS1Jpk>7AK^8SsyLi}EZHKY}oCEOh z?7+b>>7}-l`MZ)JtQp{dR6V*kzE%9|IPEIAOn-zWuzlYEb94nKa+wgIlDbEy3XTin z5@cbL-eDOa89S&%0|-J07Do7yrxI%Gzu{PGQF(j6!6!49XkIe1rs&GPVl*ur8i3dp z!=_Uia06UwlY|9xFgquRK<+bV>%@s8&?LC`?%N;#sj`P6@?VITHO;@T8P9qGF9|r%H0K&>H;Y(2h!C-Z2%pmq zTu>GHLzd%ypR9L4mr-T5X1ufstVJuB08Jkz7cp6XgXio03g{Rv9&YqIEI6qYq^E^BF%TX z3vz_*6LTKmMiCAH>gImLmm1ca7s0$pu1}YmVOoTQ?n~$q6iIRyl5w)CI8*kKUz6$S zj)*_^ZZ7S9E-lVx#DkOoZm%^VxG7|j$US$!vg+Pj7_nac2rnuDo-hU_a<@Ow3Uva? zQ@g>3PZ{ic;(-Qsw+bMTvvZy&m?fe#^6iE{u$#WK`DgY5obd{p45G@IGxA)vfZp*u z9RQMez|-rEb?g?0v&T>AQIuB6VqPV^k9+ z|C98U!@QEid@ud~hI}^j&!T^q&k8 z22DBMfj$Nu?4#%fxI?W5xn05$xPV$Eq^U*+2ENG)e}6~X;J$|k_8lV}H{)-R&<$W* zwRI-LQ9Nk`b^DKPiT4u2=&rtkm^7cIJ3;&?B>JCQu|Odt(=b>QZOGj`jO)J2${$H{ zRS4l@QT3DG?D)c0#|(gi*X+_WxYf@{=mOv~>MlO?Cr zeG1`Y47M>4yw!=FKnm+v_r zRxIlii*c`%9ezTrCM_yn9wEcO+)f_BX%_`{L5(yk*#{+ia!mftP1WCfHg-h&n7{~% z&p;Z^^X`%WfbT6|*W8bl@rcm79RR6LB#&oN>2dJ46GN!pV=y%89`Fy!_N`4clWuO9 zmC8!FwF{3PYxV<1SoWD%V)-gLYFpRv9?0{-H-Hv4%Xz>?K#=iNwX1oUq`?Aasbnc- zsmI9WpoqWS+8kPBM1b|QT?=_A_^{3bQ0HSFn8-;bxXbXn)Ha!1zpBq#jwVBp30-5q8M71Q2VJV*aB&QLrhD&-^n^ zoKr5T`Me4y(I-@Oyv~0d*{~h3l(KQl9L*!=UdJq-B$VKK*BtPOKL(c8wzzjAnsB92 zl6oaQ=Ut!jXz1iB-zTvc-PriV*#&;aD1Yz>Z+kd8_doP=AO4e?8I^VXR1{q(O|WqF z4A4CLHT!OaPbo(@{wp>WTtaltbwFl~C5xw&0o%LH2EVo&Tc!IMfS=5MB}3Y6Z|^4Y z4{>Q;trMeV&!?-sH~M_o-C=8uPl92HXBA zSp2Ors@cNlr~gL9=i1W0?&8eLf>K#f!I@1vdy*G2b6)x`>$k#V&TUs=0y!WYa43MI zT@!0t!Ra&<2uUs8&V0{pD+U@riNy zo}A9Zg2NHa(b#o`S9gL&>PzZ-x@5~)z+V~{dj@(Vgo{P=1y0Tf@pAIW?q=_HqX#T& z)vXvQ|5&~Y5uVO|0t^&dX=?SKv6T+B19M7v9`>_N%z=Gt)2s*FN!Rb7*?8S}_B0Mh>bf3b51i{}V}aJgYrNs0c)>xRa+ zw9#6*CkdJiObpH63&D?=rLj-6yS3FG4-KD*lNaPs3jc>5uZEmw2$KG)s*4~NILy*G z7<$c2&&O{`O!hrpuikTM-9$^u^gnj?^fK@Gq|e)%_;QJ}&L)gVj3yvHs^lHEvRa%M zOcdzV_XAu_z4hbCYj#uK%`=kv>$=ACL8x9OLq4Z-@$=^pMAhS7 zQS6-t(4cqH@Mn7AORd?A>RJ$6G@oYy<}Ef5=aNu!UN^=q9V2;)A$9cAV~v!!6}{59?isT|+B zUt(*G&kadBg@#$`MaD-H+)<$*>v}H!7gYabOcY;nd8x&^2rLJTPE&N(<$ zX^{nagYiD8&G!p&8pQ(7LwhQaWTuq!7ZItw&RO$&M`!suNWSXPH30qlFkPhbFTfes z$&5BV_x{dMMElfcyF7Su(WnWb)UKY1*AFxZ>%XE)Dd>1=a_UoczAlN_gc-!r zS+@b?`zRkYII$43T0y#It}0wRf#b&;IJSGIgUHTnL!?#sXrPh@;ACq`#x1~na=&P= zeyE$yx=NQ{nGrnkYXAKoNc!<9-yd^j$G?pg7(0@h)d(xtD(?5z=_G?UQ?=+~?Mmzi zl@2yJA@8{IzgLFF_3LPzA0=TxdU@jo+}b!Ty0Ui4+FEsuvuQcn%V;vPV#zmPTdKb% zF95*)e_-cN(r2;6g}<%z!%3AY4E?6`rZeQ&0NM^Qo=B}E`zONI(M`3r>Q7IG1*t{_ zVD?6Mx9zS1Kr350YEKO|urhOz3VgcS-85p($~W7H&6|*1eI&Fh_1eERb{4mjMDW^* z`3_J_K!Fa*#W-Gleg9a?1j)a4XCq&{?uH2{b#9NtJg|2Z(El^eD-tc{lT~&%;O4{8 zbXF%tmp`O*c;%@hF%_Q4)o68B_|mUJ_FDm1?3U|->=81`)L$f1HLuP}U?08z88D%8 zV;m+amnZJ%GPCEburf_}?CGMgyw@W!V)HraWjxAd^KHzidBGo!v=!iPP8S=`rpmBu%wHS)Zt@eIUi z8UefgB%SM9=SS8N)Tzn>8KzwQIKwcby$wz&_eyA>FXX*-nF($2LbZDS%xd#q3e4jE zzm1zOKrvx%7hz2O?n{wUxs;3|RLZ>R?=X=yB*B#7*UE26D6o6&*CPJ#Y4s95-ZB04 zPra(edvD&}lsD4s54*Mv6(xZTuwQ=u_`mIU@zY4a(co&fRTF)SimV7ygwwQU=Q0OB z(YIj#n)uK;!^9VjoB8nErTw;B3llowjfz&D=iXYR1%Xt&$b-~>bm9L9YEA3Fyj6zI z$A3TPdG_~OgYd)U^3Bi(e6uoln>(-JpT@o`XKtWNAu0 z2Ro9vkQ7%ijN9H(d)2%Z8j&u{?_Gd>_xqUn83bXmw_r2Jtn}FLv1;FU@tyZJv8Y`# z!_QB83*}vSi(^_f{Cp~NQr6Yxlk)R=s$9BBdUks_uA43ccA3xuDCRKlZJK>fYg9RcJJ@A zrr-xGjX9cRn)M;3CIJfG$rDe{p}Ocv7!VfCKm017<}cbwA;v*j)G!RGf1D7=n%;oE z-v5y3#cFsj2#l6`{W1c@G(xCqGRM6Qdhjp6eE=TNy~GZ!_@!&<0JSpU-E{ILqu148 z<&ruUv1?K2BZ!~wzbaR8)@J`ck)=;Tfy)yrNaaI$J_mn)yksmVkwj`|FkRs`P8pLJ z12NmRpnqPeqexgvwt1uzzj&gps1tWZ;>sBob;VVBUZMlrVHL?Ecs^3&;%cCHEAI>IssskWY?<7r23MznqkjMO0#t@( z`JNzC%|N#XsFm|pk&%JR<{KlsIFZeIko=RK5X+W6{g-x%{d{-&n=olx*q9$o1;$Dj zZoG7tY5}cK6z?3J7$aP4*_k^24_jv)RaM)ydk_%ml#o&+rMp3pkS^(z?hfga?rx9< zDUt3HklJ)NNOw1!8=vPr-}jzz_8*SHV9SQJ?zQeU=e(}pWy@bMrnhy#alDw1=z9NU z2wrh@6gMA-R+gmpb-g$A3!%ux>G^zWh`15dbCBhUH->FT4X@<|11s3J`B~W2Tkys! zaMHSv&hT|u%T0WZWlDxCXZu$ZZn* zC>@rE3j^gR2W(%}Nl9{Cc<_{IxQEfu2Ftt1an99M&uy^+Q=@u@RLFSQU9Jf>FTlC% z1iFyFf9la3{uEP|9(>IUH?+i@hS-sIfO>%-*NN`eTi+4@QqZvV4QIt2u=g$fPUq*~ zN(>JJ_&BIeL}=6({);9XTv@Szz5oTaMK1BWh24A=xMy(+BG&9}8(u)Y1qjX;B95`# zT-q4qFaH{~p^)FM9;+CI=>QVS!^=}xaQ1>gh4SvD82%JX$% z=~cj96%E_`(3a$MH4gXhs^E45CUE?JR>d1IN+TITfeHdhw6-MWv0fISaR99m>RTJ`_H}Q zk>T$@3mNv=BECBY+Xf*qM*;&v+_D?F3N{s%3v^9f=Sms`VaX`W8@Vn)U>rZmGo30g ziZU8L?QqqNOpiLTXI}s&&ilcB*@*fD*3-#O<$se1?fv@K_iWI!feKUS+(Ls75w?LJ zoz+g}YB_{mqR}3n>iHZgr3mJaUr2tn!`YZq59avM|@ z+S9oQjVL&0SZkwUjX_8%jBXszR#Crzf6870FWoj?KY|4#{YLq@&*My;Ib*q**X<<9 zf+oX`_q7(dSg8Nhu`bfNUr^$c2APB+z0~)e)CrrBl_eRsP5n@rtqD;<*X#K|_ZX#fKIyrBA?}&b8*#Kr2XUH~ufIS6URE+Ykz)E509V`+WyaL)6$BMceXjGS{ag z;WSeMz_7{Y0XPy-eFyC7^D&W`H_qD^x}#oh{f{!mV%c?20XR26vcDB>l!5ik;OTd7 zyEE!$JF|XBmHi?E3P)$wG#WVyh{S+VLELwO;>NkkoV6}@Pb-I}Lu~l9X-#KQ%W=9P zstAnU`AXMj_s7)!gU?HfO}ZK%TmpEFwC(64I}LHGDv$5Rufp`=E2jdGQrL?-l@}JG zDOAEE#j~hEe{x&nfcU*DZTFg`Ba*@izHxu+fQ)K zmHv^MS&<^RUIqU{-*JisFp>U1Hv#Hssc33yx46C7?^vh-$r(}GT$xit2Rxp;<*@Ui zewa0{Tus6y^c1G&V*tPlTSqlTJB}*&0(elH&eOeS5qHZykNii8xQl1(x#@t*8fGwd zfe^GIif>pdR?7jyr`lcK-b}*1yS^*|D45)Fg}p#mL4?<{K)jW+Gz#m%Q$knjgZJC) zWIA?=5?bZdCH|=5S3EJRadt&P_(rIWejm7AED>3uioqIqBN#_2M}(#uvUE}=LA&fZ zb>o!zxDld?)sbB1kqCWZ(M7u~6#vZNBmW6^WRaUtAOZB8;9_A~FU{wCr}?ORb!(A! zNXJE@RdBg@mS4D6hx(!dBA1O$?@KSvpDX$EML;I8D5ofK2*@kPU4h4cv5*ATUo%)oD$ITFljON{geRbRj>|&$I)EOJH_(|j9z`t|pUDA22ek#?v<4i1-uZ`f?jnj2|Y%SLzQ}of- zrMZWVU=1(n)5o!Blv><@Y^a`zOuj~LV~JSp%9_1_&jq(~OSK27a4bcv{H5H-iTbHl{h5MDH#Y0{m@RF9PkJ-h%Ah`MUr@6UBd`WY zC7y=8TG+&{7DIurDzoI0RkKVD$7t{WY@7e2Aha%byPa~X$x*{vg= zWqO;Pe|C5}sX419RDQYjE7FM-NNR2|21m@Q{VxlsaI!Fn>VH_0rpUD+9UcavY6w9u zT{8Bq*ig~)KGT99NhS*_*z$~4T)4G&LCHGQMx()^Yjy!bMX+O7xj1H)djMStUto9ryvK- z#U`jcbN{?xfI&Qvl1#SKQXL>II^WW+tDhh$s^r=d|p# z=0Qi?vzyhJs%(Hu7-G0Fir?Li1gZ|Is5+B{rTemxl3#m{#VzGb_ymqxpy1|Z{2YDg zOPtxHMpnTk!IU_F#i1;^c0;OP+Lhn+@jy6gYqt0aQcXDa?RmqZ~PZBKdBGK`T8# z4%_eH{<_RIBJBH=(7mOu=IkubQ& zAI5D-HMX0_F)UH7 z;cZTm?v}}l`g*&K$1pDJ^?3IgFG8%6ps%rhBsi{>YB4PXQuxdXq~aj z+j`#ondLpf#}4NQ>eb_!0-rnjAUary(`z;X-GFCZ3PSRG?4_ zqriG9uvWeaJS#+zqBD3iHS-I&y#I?+o&PUh%g)C{@_q(j<*w6X{);EgDt-O4#=%n} zBh2f#cZ;H#LWb1Kv9~s|cIxqB*%i@d*cX5R^CBZ^CIG+T@%WEnyMd#;Sv%kqQZ64) zE4%*u^kxN#x)xhDi~Qyu(eNA;stRA%DcuBi^dWl0tqb1_bKXeDzgC8b6)+lf4jJBFl8$~1LyKz zKl>KqRunu1ZG+>QmkxiWSRZanR)@?tl$kQKNpoNR!_|+e8F5XVt@js zU=)=T;9tXd>E7cIs-h%(Bd11v)l9ZhE0e*G5r=Co>c-DI=HcPz%C$Kgu?P;3d21@; z7_j+S`2^&AtxFc}=Vtu-nK6@WY%X?iFE$tVKSR6+4;b;JU7M-j&`A0alX8wYvyn@S>Ry4%+i_Dq2oQV`WjX&89l|I0Z z?kNPaoV`UD&7M(mLi!vIb}t=mr0fo7w8M@E@ygOMCr{@&f<~1`vMV?)H<;>~WVw;D zb>|BRKPT-A;7 zxnRZ!O7{fD-f4jonRrg-NgWSG6&!RJ)LsfYVv(u|%B7s;(#;NG<3<5}<}+xuB2 zjoxc_(SvnWYFjg0fg!vjuC~=$XC3p7x`KXIk76@ZITQS$t(7o9_L+AD!c&1lH?vGo`N&%l|1Z89c4^_E zJC>zPBSU-jQW05==q_l)oP$_*NiOLv58oRO7HaZ06mqMwkKa@O>7S7N?niSJ_)B6F z?ueRz@@RYe4n1UtqI%K5NVIjRhPXo25*Z-T%8Kp*0Sgp+h5mm0VbY?p>i~E)R72>p z8=HO`nQp#2%m|gp@C0modf6n8ZA()QO%BsYPykTYz~DzP<7L7S|Gn8m{g%}l{r|?O zywIzdmPt^#l`$sqM_7U(O%#9b>JYG2P`pi!gQyUrmoNR>kTmS$@5JDLQN8-JKd)o2 zwiKaWzbFc>K&WUBIU)E@F95V1bjLdcy|9@yO2uT9m>FMSBW`n`>al91s5ib!oj}e3 z{@lL|ZXCKqMksVx=*&Q3QE1&yo#6jOiwj>a)C@RtbK|45L=NFD&CK@{RD3T4dW87_ zvieU_UI)fi$Zdwuf6H!ArS@ksOQfX6$E8M>ge5RTB?1HeYizY%CSGlwDLbv4EHpuf zR3c@*ur)bbtzGmg^Cwb-XxS@YtLf~|~^9-xkCO0mM&s67q&{>Bz~m+C`X zZv~K`-r~(Anm^b4jMdorx$yC8) zWcsI6)3myC(qmRX+Y0}`9KwJD2_A2xRe~I(8r;7pNRt@!rSQf$SG-=pi^4aL%omM3 zwS|=xB@2iaWTAm?@~Lm-{ZQ@XkX~A1{KPA7?&-5+f5P4+GMu$TXMHoT=Pl5MF<@_8 z(5t98ncqvcx6 z;T?oML!U@EJu{x+BUFSGm#0aXE`{LpP-??snaa;j{NW( zDooFTxeb(+hA76x=!pD@Jj1EHu~?rtXj4}nDqGY_gJOhx$xs7xvTOYH5XU#H_lFDF z8geJy!a{ldBIwf>=OSEz_$&crLo<k8_{+7`sy@eA{-J7_{)(tMi~{LiO>4#`Z`&>&y4t7ksdA zTjp)&5ABo?)hrcxx}F)y4CH`(KZ&Za7AwXSW%{%ZQI3zbkT#>CL#c7C*+_O`6BTFc zIUUzKsp=(G!_8fRCC{@n{{ZPm*^FYdTJe-zWQgk{ywS!EFr*<-ouO-zFL^P*#Q`HM4bu?N1FZ8hVXv`;pk=LD z(Y9#DyYna6n(4<`$1+`##g)!W&jQpJ>hZw4K%HGV(K9@u{32#QdnK2f*N8R{*q-{y!Sga1oU}k2qn?x%j-qi zTEfX~X;#DIG=v59`^U+HX_qZzf0$_lcxqvxnYnd=J~_3i6zqZ|)i|yS#@Lf>4rwK= z{uE=*3XExu%7wVOTNegcPO8q&4uKK)e)4f|(!Xg%Ir-Nt=%#B1f$ zLFWu?jBkw4hCciB<9gNdRKI9Yq}5o9zbuY-gf~WHa%!+RoB1%SyDr3RW52rka@syH zel>u-sdXv2DYLbP@iKH`b|ObWU0M8)Me%+qPu3Q;Wp_pUAy3R5Exk^+W;WYEFGTOk zBRf!e#;UTilCD=)UueDYHKLbIJ>ff!Cz{RNjBob#nRV1>Y^Wdu-hfV`8GC_haa`a5 zk~w7Dp(1|s=Oo9!{i1I?5P%NbXInEG_NN3v!(o_(vUX8}SBE}mn1I|S6vaEyU1Sv~ z^x***M8(|FSuDe@&h>-e`&H&TwjR2!(7PT38Z-^PvHE$8y|Aj$tJ+J)m1h=@ zoGj!>QlDcR&rS@w`_z|d&7rEk)I_53ET8o8~ErLz$e`>d~kA5s!CcGuL<9B9)Z5WL?GX zIV@!S6e)I++d$oShZDL4cfHZ7wV+=)r@_N|mI3W84>?q-0YKtTUal z-)uSGT-LO@oF+bAPi`dgQMT9_9p2(bFv46eUVi|VmvzPI%A_^wXPr9 zX!1MfKp_Wfoa8H3Ih<2Ix^50U_zlJ%Ol1Th4UsH4ZQ?RK5&IF}K$Jvh=jVQ%8z!84 zjb_a0m(f%==){ZB@;n${?Z7Sk3>0<9dEEqz&fsx2JA04pyPL0oy}60}cwg8TR70NsVJJz%5-g1uz_rgE{gQqT-!N;4!MRRgC9KMA87G_B^OW`-T z+!pT)aMukE#)Vot8%OV2XYK7Sqbm{X9o9RjpYfOHzP4P*_lrBN%1ufO6K0=j7=)kU z00#fQeyNibaZlwF|CEhKkE(QEQWXgOacZr&NHQ2&ffNU!tU-?% z1}ZTTBst^}g;UP$3Y6G5HQMV#42T0Yij@vcI90w$rNt*nW7SS(rsE~zP$nn}gAQ|l zM8urBj%Q)s4M-dSll7)Q^9Ds7&Jb*#X*or1;IbofI7--OD$vFp+zxoxvp2eYmR}I@N#KTE9o!N&;j=Kr|no_!}fNP%+Ec z^Ou|QjcB)$=Hy1!3@26_uIVeFR!?fi%L}QU3<{Y3g>C|ghQ+Aq2HE-*{cj*9no0-S z1po)0nFGqf+ruVM$^tKBEVz(BDo`-~xQa0lStZPCm8HafS$<|6T zM?#plGQ|BZ%i&uvBuS7%7M{a_#;@-nR~C!S45D4e;q&(dgqzcrFKpij0p%L{v5RI1 zhANSuBb&tF7grZ);JM(tDt&n%psytFy!gfcR4`KVL!sy6#rj_ATv_s_47;-#bo0EI zHk1DRov8>R% zkczpzM%2u7g)|Yxgu&F0lE<$I03hKs|D_!lwDm8LEn=}P`(%blpg^K_c;&%&8ygTkwjS3 zQ9JLX`&Tv&1d!~xUxw#7dzqj1Gtk~70D9xE=c##uQ-&3D`Q64>>8GoanGJ7@Pl_U* zrxw=~P&7|jc(f|ajg6R&?v}cz2>2tIJdrv}CWaLYr8EJH?VjV2b{OT=-(K)XI>OdW z1^cJ4u~l;5vg)Vm#CF!5y3r}9(TR@9d>wppTMF;oK2d~m8YEPGitp(X`7Vc>?+XnrmWtGNgSRx%?|_`zzc z0EaMaf@mW$gOOd(>VHD#$;|ve@d@&ho{o?>*>{mkck5mNhs6t!m!op4z{m=O?pD#v zy@wX&uH%?3%f^c3%(Jw>&$b4d%S+k1&|PrZ{xP=_I6oADs3gv}j?ZWemn{#w3y&mr z)!DW@eZfs-gpk4nJ1%PqKv+F;vp6A-sV?D3l$?v&ONC=s8(#Jc_#qCwoS!jXc0G|l zd1C)}5Cm(Nt4S7iIkf`0RwCav2sj99Jqi5%$*IgrQyW0-#IR#$6vl=j5%%!WZ)xE@ zQWxaqr$ob%!ZM%vf%!HvVqho65moo+9>wmkU3!G)%glKrJ1Ocs7|VEcXEDc$}@Fi9ULNy)76AqU0&jHwQ zCRC?q8|QgTpYPUNdn`VMr0o`>!?{C5tl3&sYeE;Xd&nw-Gt(UJLk)SXm(F6oGHBMG z+`7|u^yGBT^ac2)#bNAIW8CPos)35+O&f-(=)<@2kypSLCH%}&(1?^9&%Ygv4FjOk z=h&*v8>&S8H8BgK5a2i+@z{o;iQCqNjoB*FHFJN*cQH`|^IC)2(jY&_$mj9+QMa3_c-q z#i!b+&M4#{|A>dC#L$S=K8bI#mV!CekYlxG`b!Iou2Aa-FcbqS%8}F)$i{o5|8l;K z&&=2tH9SFEz4$HHr2$iSM*h&Vtw-wtRL*3@gW7Ys?0ADk2z_5(ioOVF2kSgQG;LIk zq}uVKu(4|GQ~?hUWdKLR(9a&qf3NC`_MwIo@EY%Hsc-VIL#^I0GIY94*Pw>iDCS(I zb*$UjjjlGwj6`H@GkuX+IsKwmRFU|wBOo{Qx#hq(uR#U^f>$1*Abj57-QT$T_CLJJxu_t@31|n;5%fK} zpY`j==!jso0ywR7;*tNO#*O6?yiy$Lc1TzZP?;Jk>#_5of+4K9jDu#HD*LIQfDP9? z%G84#d5rddr4xdQmu8&umo?lW8WGI+-3$0uZJx%bHt&sUqcsks!MK0-N$KPhkY@_v zf8q64yLAErcbej3(nl~%JwIjg}>`|vGfCBiD76k&aj$C@x2h6mxsm7BB!~~IZlo2+q2^o4K1X7k!B~fWZ^i%%}QLh5p9E<^J;Y> zi_({LISs$<8L}IG%P)LG1#ZXSmM^rrUJxN-4vBYtvXMP&`ix}%|0sw;Vr;}KmSGvOjO5aV7TE8!Dfj?FWus_TshnTJSf2wYjgxx+B+5 zT<~IEB0Y&6&=JdS>1{$BtPVh3@|1D!pImtt^$^Q7UAp|O6BEqJf*mxEB}9AJFQ~S7 zUAgElmR3^3AR_ZDpGQvqwDb-rr(|tnzeAqMJB=5s$y`N*MUx&fe)gBKn#p73ve6YQ z&s|w@!QZ-RTdz>jwyWXr zdu8zP>r;;5mmcy-xAd9>Yx8y0#d5iwR?otgCCfcD-}q+jZM%!|B#h$A9U4>-6=|)c zOVOUqelU?P`U37B3CyXM8IBm1P)qt^ByRFcy}mP{Cj6gJaWvYRe-E1cRBdub6OcVc zbzu0Zy3dz@f0^B%J2Zh%%f0L?)o2Q03alU&}Rd82-Sa7bG9PBxanTiAot%e6AD7JAlKJIfTOc>tmFU_TuZ95udKz z_Yi^yf7fhpj8YHAdp|p0jY4}X$caM+!3YzD95c5>MIvWfpcMQEjdpA1ln*2<*WAfb z0$+RHEcsRF2wupoyYa86L^ZqIX6z#Kt1ZFX&2srA6YO`jldYZlN{DW9w@{Y10O#J4 z?^5Wmw1?Oc!(!bAZxUeYr7ZCn7kT>wSIr%=;m7oiQP}9yK!CZ|7S965H^$+u=i6@^ z1mlFB^mAw%N9a@y?XZxi!#ZZM{!CunLgE|TNdBcd+$_=6JhX$~)L|r&V>IQsh&E|G z{i}|2%hzu5kEyyz7unIg3@44a*V+V)$dFK|0Km2c9Yu7RGF`zWS>Mx_2(8IXzqHZ- zd9m%qUrmy3Tm{P(@fU|5pCv*6H0(9d;i$4!JKv%XMPnW=Tz{;cEMz-#WsmG%C+l)` zb{?P5Kic692DyL-2fxJ^N;xh(rxmD{yRIFYCl~WrG+g;Cs4-9UUoJM20(W=1EbA;$ znxvM+$6wEs;+)Z3=!p2VJ!pH$Nd4z;BZQWo1;>PdFdG$Gg1IK1!5B$l?Mp<3gcJ|% zK?PCqW@11Qxphi;nG@y07iwNJJImAD=#wjS>dHH6P~&9cpxtYN^@WemoKdamW>Qbn zW5k7zCx<18?{+dCn?t

i0h~aF3g~ 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 diff --git a/docs/architecture/thothii-core-sequence.visual-check.2048x1320.dark.png b/docs/architecture/thothii-core-sequence.visual-check.2048x1320.dark.png deleted file mode 100644 index b9a4894628e1a7efc719922f6efaa446d317f224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193758 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

hs>Z^rm^ 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

-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 diff --git a/docs/architecture/thothii-runtime.visual-check.html b/docs/architecture/thothii-runtime.visual-check.html deleted file mode 100644 index a6db65f1..00000000 --- a/docs/architecture/thothii-runtime.visual-check.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Archify automated browser evidence · thothii-runtime.html - - - -

Automated browser evidence

thothii-runtime.html · visual-check containment pass · perceptual visual review pending

-
-
- light 1440 by 900 -
LIGHT · 1440×900 · containment pass
-
-
- dark 1440 by 900 -
DARK · 1440×900 · containment pass
-
-
- light 2048 by 1320 -
LIGHT · 2048×1320 · containment pass
-
-
- dark 2048 by 1320 -
DARK · 2048×1320 · containment pass
-
-
- - diff --git a/docs/architecture/thothii-runtime.visual-check.json b/docs/architecture/thothii-runtime.visual-check.json deleted file mode 100644 index 7d2356e0..00000000 --- a/docs/architecture/thothii-runtime.visual-check.json +++ /dev/null @@ -1,548 +0,0 @@ -{ - "schemaVersion": 1, - "ok": true, - "command": "visual-check", - "evidenceKind": "automated-browser", - "status": "pass", - "visualReview": "pending", - "artifact": { - "path": "/Users/mp/projects/ThothII/docs/architecture/thothii-runtime.html", - "sha256": "ad19195852c7c643228663e5bf7f3cb273afb0456fedbe295d4df24bc345b6c7", - "bytes": 724277 - }, - "state": { - "detail": "read", - "motion": "still" - }, - "chrome": { - "status": "available", - "executable": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" - }, - "diagnostics": [], - "containment": { - "status": "pass", - "viewports": [ - { - "width": 1440, - "height": 900, - "theme": "light", - "innerWidth": 1440, - "innerHeight": 900, - "scrollWidth": 1440, - "scrollHeight": 900, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 968, - "diagramWidth": 938, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 6.20735294117647, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - }, - { - "width": 1600, - "height": 1000, - "theme": "light", - "innerWidth": 1600, - "innerHeight": 1000, - "scrollWidth": 1600, - "scrollHeight": 1000, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1009, - "diagramWidth": 979, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 6.478676470588235, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - }, - { - "width": 1920, - "height": 1080, - "theme": "light", - "innerWidth": 1920, - "innerHeight": 1080, - "scrollWidth": 1920, - "scrollHeight": 1080, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1172, - "diagramWidth": 1142, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 7.557352941176471, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - }, - { - "width": 2048, - "height": 1320, - "theme": "light", - "innerWidth": 2048, - "innerHeight": 1320, - "scrollWidth": 2048, - "scrollHeight": 1320, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1583, - "diagramWidth": 1533, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 9, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 41, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - } - ] - }, - "readability": { - "status": "pass", - "minimumProjectedNodeTextPx": 6, - "viewports": [ - { - "width": 1440, - "height": 900, - "theme": "light", - "innerWidth": 1440, - "innerHeight": 900, - "scrollWidth": 1440, - "scrollHeight": 900, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 968, - "diagramWidth": 938, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 6.20735294117647, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - }, - { - "width": 1600, - "height": 1000, - "theme": "light", - "innerWidth": 1600, - "innerHeight": 1000, - "scrollWidth": 1600, - "scrollHeight": 1000, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1009, - "diagramWidth": 979, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 6.478676470588235, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - }, - { - "width": 1920, - "height": 1080, - "theme": "light", - "innerWidth": 1920, - "innerHeight": 1080, - "scrollWidth": 1920, - "scrollHeight": 1080, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1172, - "diagramWidth": 1142, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 7.557352941176471, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - }, - { - "width": 2048, - "height": 1320, - "theme": "light", - "innerWidth": 2048, - "innerHeight": 1320, - "scrollWidth": 2048, - "scrollHeight": 1320, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1583, - "diagramWidth": 1533, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 9, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 41, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - } - ] - }, - "viewerChrome": { - "status": "pass", - "viewports": [ - { - "width": 1440, - "height": 900, - "theme": "light", - "innerWidth": 1440, - "innerHeight": 900, - "scrollWidth": 1440, - "scrollHeight": 900, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 968, - "diagramWidth": 938, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 6.20735294117647, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - }, - { - "width": 1600, - "height": 1000, - "theme": "light", - "innerWidth": 1600, - "innerHeight": 1000, - "scrollWidth": 1600, - "scrollHeight": 1000, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1009, - "diagramWidth": 979, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 6.478676470588235, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - }, - { - "width": 1920, - "height": 1080, - "theme": "light", - "innerWidth": 1920, - "innerHeight": 1080, - "scrollWidth": 1920, - "scrollHeight": 1080, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1172, - "diagramWidth": 1142, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 7.557352941176471, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - }, - { - "width": 2048, - "height": 1320, - "theme": "light", - "innerWidth": 2048, - "innerHeight": 1320, - "scrollWidth": 2048, - "scrollHeight": 1320, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1583, - "diagramWidth": 1533, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 9, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 41, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light" - } - ] - }, - "captures": { - "status": "pass", - "screenshots": [ - { - "width": 1440, - "height": 900, - "theme": "light", - "innerWidth": 1440, - "innerHeight": 900, - "scrollWidth": 1440, - "scrollHeight": 900, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 968, - "diagramWidth": 938, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 6.20735294117647, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light", - "file": "thothii-runtime.visual-check.1440x900.light.png" - }, - { - "width": 1440, - "height": 900, - "theme": "dark", - "innerWidth": 1440, - "innerHeight": 900, - "scrollWidth": 1440, - "scrollHeight": 900, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 968, - "diagramWidth": 938, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 6.20735294117647, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 51, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "dark", - "file": "thothii-runtime.visual-check.1440x900.dark.png" - }, - { - "width": 2048, - "height": 1320, - "theme": "light", - "innerWidth": 2048, - "innerHeight": 1320, - "scrollWidth": 2048, - "scrollHeight": 1320, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1583, - "diagramWidth": 1533, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 9, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 41, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "light", - "file": "thothii-runtime.visual-check.2048x1320.light.png" - }, - { - "width": 2048, - "height": 1320, - "theme": "dark", - "innerWidth": 2048, - "innerHeight": 1320, - "scrollWidth": 2048, - "scrollHeight": 1320, - "overflowX": false, - "overflowY": false, - "ok": true, - "readerWidth": 1583, - "diagramWidth": 1533, - "viewBoxWidth": 1360, - "minimumProjectedNodeTextPx": 9, - "minimumProjectedNodeText": "Browser", - "minimumProjectedNodeTextDetail": "context", - "minimumRequiredNodeTextPx": 6, - "readabilityOk": true, - "hasLegend": true, - "hasNavigationDock": true, - "legendDockIntersectionArea": 0, - "dockStageIntersectionArea": 0, - "dockStageGap": 10.21875, - "requiredDockStageGap": 10, - "viewerChromeStageOk": true, - "viewerChromeReserve": 41, - "viewerChromeActive": true, - "viewerChromeOk": true, - "resolvedTheme": "dark", - "file": "thothii-runtime.visual-check.2048x1320.dark.png" - } - ], - "contactSheet": "thothii-runtime.visual-check.html" - }, - "sidecars": { - "receipt": "thothii-runtime.visual-check.json", - "contactSheet": "thothii-runtime.visual-check.html" - } -} diff --git a/docs/contracts/curated-evidence-v4.md b/docs/contracts/curated-evidence-v4.md index 95a94305..496de8ed 100644 --- a/docs/contracts/curated-evidence-v4.md +++ b/docs/contracts/curated-evidence-v4.md @@ -244,5 +244,5 @@ The first installed consolidation performs this conversion automatically when th legacy manifest is present, then validates and activates the result. Preserve the existing checkout in backups before upgrading. The E1 validation used an isolated copy; E2 also converted and indexed all 35 units on the running local preview. -See the [E1 validation report](../plans/2026-09-09-evidence-e1-validation.md) and -[E2 validation report](../plans/2026-09-09-evidence-e2-validation.md). +See the [E1 validation report](../reports/knowledge-archives-release.md) and +[E2 validation report](../reports/knowledge-archives-release.md). diff --git a/docs/gestione-memory.md b/docs/gestione-memory.md index 71a904a9..88e86d04 100644 --- a/docs/gestione-memory.md +++ b/docs/gestione-memory.md @@ -226,5 +226,5 @@ error. Preparation is repeatable and checks migration checksums. See [the M1 specification](plans/2026-09-08-memory-m1-spec.md) and [ADR 0018](adr/0018-use-postgres-for-memory-and-qdrant-for-retrieval.md) for the approved scope and acceptance boundaries. -See [M2 implementation and validation](plans/2026-09-09-memory-m2-validation.md) +See [M2 implementation and validation](reports/knowledge-archives-release.md) for the retrieval checks and real embedding test command. diff --git a/docs/installazione-docker-4-contesti.md b/docs/installazione-docker-4-contesti.md deleted file mode 100644 index 71656380..00000000 --- a/docs/installazione-docker-4-contesti.md +++ /dev/null @@ -1,137 +0,0 @@ -# Docker installation in the current operating contexts - -Rendering and authentication are independent of these Docker contexts. Explicitly -select full/en for the Mac, full/OIDC for an autonomous server, or -embedded/upstream for Omics. The same frontend image supports both renderings; -generated `config.js` and the host page decide the container, while the backend -and trusted proxy decide identity. See [shell configuration and deploy](operations/shell-and-localization.md) -and [server portal authentication](install/authentication-upstream.md). Do not -apply the standalone server authentication projection to the Omics upstream path. - -ThothII uses one Compose topology: - -- `frontend` -- `core` -- `catalog-db` -- `qdrant` -- `embedding` -- `embedding-model-init` -- `catalog-migrate` (one-shot) - -Qdrant and Ollama embedding are required internal Compose services. Only DWH and the LLM remain -external. The fixed model is `qwen3-embedding:0.6b` with 1024 dimensions and cosine distance; -`embedding-model-init` prepares it before `core` starts. - -```mermaid -flowchart TB - INSTALL["Installation descriptor"] --> CONTEXT{Context} - CONTEXT --> LOCAL["Local\nCompose local"] - CONTEXT --> SERVER["Server\nCompose server"] - CONTEXT --> SESSION["Session server\noperator services"] - CONTEXT --> AUTH["Auth runtime\nprojection services"] - LOCAL --> BUNDLE["Common secret bundle"] - SERVER --> BUNDLE - SESSION --> BUNDLE - AUTH --> BUNDLE - BUNDLE --> SERVICES["Frontend, core, catalog DB, vector, embedding"] -``` - -## Short ownership contract - -| Componente | Ownership | Contratto operativo | -| --- | --- | --- | -| DWH | External | External endpoint configured by the installation. | -| LLM | External | Endpoint or policy outside the internal semantic infrastructure. | -| Qdrant | Internal | Required internal Compose service with persistent `qdrant-data` volume. | -| Ollama embedding | Internal | Required internal Compose service for `qwen3-embedding:0.6b`. | - -## Local path: setup, migration, start - -The normal local path is [Install and first start](install/first-start.md). It uses `tht setup` -to create the selected installation-local descriptor and runs the catalog migration explicitly -before application startup. - -If an operator intentionally prepares the descriptor and protected files by hand, the equivalent -foreground launch is: - -```sh -cp deploy/env/local.env.example deploy/env/local.env -cp deploy/secrets/thothii.secrets.example deploy/secrets/thothii.secrets -chmod 600 deploy/secrets/thothii.secrets - -# Copy docs/install/examples/thothii-installation.local.yaml to a protected operator path, -# replace every placeholder, chmod it 600, then set that exact path as -# THT_INSTALLATION_CONFIG_SOURCE in deploy/env/local.env. - -./scripts/run-stack.sh -``` - -Set these values in `deploy/env/local.env`: - -- `PI_AUTH_FILE` -- `THT_SECRETS_FILE` -- `THT_INSTALLATION_CONFIG_SOURCE` (the exact protected host `thothii-installation.yaml`) -- `THT_WORKSPACE_GIT_REMOTE` -- DWH endpoint -- LLM endpoint - -Do not put secrets in `.env`. Runtime secrets belong in the -`deploy/secrets/thothii.secrets` bundle. - -## Secret bundle - -The documented and supported bundle keys are: - -```dotenv -THT_MODEL_API_KEY=... -THT_DWH_API_KEY=... -OPENAI_API_KEY=... -``` - -`THT_MODEL_API_KEY` is available only as an explicitly declared catalog bundle key. A -metadata-generation provider references one audited bundle name from `deploy/secrets/README.md` -through `modelCatalog.providers..authentication.apiKeyEnv`. -`apiKeyEnv` may be omitted only for an explicit endpoint that accepts unauthenticated requests; -hosted/default endpoints remain keyed. -Provider/model/endpoint settings stay in the protected installation descriptor; raw keys do not. - -Compose mounts exactly `THT_INSTALLATION_CONFIG_SOURCE` into `core` as a read-only config and sets -the backend-only runtime path `THT_INSTALLATION_CONFIG_FILE` to -`/run/thothii-installation/thothii-installation.yaml`. Do not set the runtime path in the host env. -Descriptor and bundle changes are loaded only after application restart. - -A private PEM CA remains outside the bundle and must be mounted through a reviewed Compose override. - -## Preprocessing - -Preprocessing runs through the native host CLI and the installation descriptor: - -```sh -tht --installation /percorso/assoluto/thothii-installation.yaml \ - workspace preprocess run --workspace -``` - -Per rimuovere soltanto gli indici e gli artifact ricostruibili, preservando Memory e domande risolte: - -```sh -tht --installation /percorso/assoluto/thothii-installation.yaml \ - workspace preprocess clear --workspace -``` - -The CLI runs the profile-gated `workspace-maintenance` service. See the -[preprocessing contract](contracts/workspace-preprocessing-cli.md) and the -[Evidence guide](evidence.md) for details. - -## Server - -For server installations, use the server profile with the session overlay: - -```sh -docker compose --env-file deploy/env/server.env \ - -f compose.yaml -f deploy/compose.server.yaml \ - -f deploy/compose.session-server.yaml.example up --build -d -``` - -Also see [Workspace operations](operations/workspaces.md). Server deployment, reverse-proxy, -backup, and recovery remain manual-gated operations; do not treat the local profile as a server -replacement. diff --git a/docs/maintenance/2026-09-15-documentation-cleanup.md b/docs/maintenance/2026-09-15-documentation-cleanup.md index a9c54e0f..63f3239b 100644 --- a/docs/maintenance/2026-09-15-documentation-cleanup.md +++ b/docs/maintenance/2026-09-15-documentation-cleanup.md @@ -1,9 +1,78 @@ -# Revisione e proposta di bonifica della documentazione +# Revisione e bonifica della documentazione Data: 15 settembre 2026. Baseline: `6a4634dcf1b1df4ad29510a4da371245abd5c666`. Ambito: 121 Markdown e 23 altri file già presenti in `docs/`, navigazione, collegamenti -locali, build e verificatori documentali. Questa è una proposta di manutenzione interna, -non una pagina del manuale pubblico e non un'autorizzazione a cancellare i file elencati. +locali, build e verificatori documentali. Il documento conserva la proposta iniziale +e registra sotto l'esecuzione successivamente autorizzata dall'utente. È interno, +non una pagina del manuale pubblico. + +## Bonifica eseguita dopo approvazione + +Ritirati 35 file dal working tree: 23 Markdown e 12 artefatti visuali generati +(otto PNG, due HTML e due JSON). Recuperabili integralmente dalla revisione +`5f3a7f5975b96fae1e1cdd0da08b4d60d41064cc`, precedente a questo intervento, +mediante `git show REVISIONE:percorso`. Non eliminata né riscritta la storia Git. + +- Dettagli Compose utili consolidati in [riferimento developer](../operations/compose-reference.md); + README rinvia alle sole due procedure manuali IT/EN per installazioni nuove. +- M1–M3, E1–E3, X1 e i piani Catalog/model già implementati consolidati nel + [record di rilascio](../reports/knowledge-archives-release.md). Test storici non + presentati come collaudi attuali; estensioni e accettazioni aperte conservate. +- Prompt security assorbito nel PRD, senza approvare il progetto di hardening. +- Snapshot di progetto riscritto; overview corretta su Catalog, Memory ed Evidence. +- Verificatori auth/DWH e fixture riallineati ai documenti attuali: controlli su + permessi, diagnostica, segreti, TLS, separazione dei servizi e link. Le simulazioni + del vecchio journal scanner, non più presente nei documenti, non sono conservate + come finto collaudo del runtime. Le suite applicative non vengono modificate. +- Rimandi Markdown verificati; contratti, ADR (anche superati), progetti con + decisioni ancora aperte e runbook/report con rollback o accettazione pendente + restano nel repository, esclusi dal sito. Non spostati gate in nuove issue né + dichiarati chiusi: lo snapshot corrente li rende espliciti. ADR 0019 conservato + senza dedurre dal solo nome che tutte le sue estensioni siano implementate. +- Pubblicazione effettiva distinta dal branch `pages`; procedura ripetibile nel + [runbook del manuale](../operations/public-docs-publication.md). + +File ritirati (percorsi dalla radice): + +- `docs/architecture/thothii-core-sequence.visual-check.1440x900.dark.png` +- `docs/architecture/thothii-core-sequence.visual-check.1440x900.light.png` +- `docs/architecture/thothii-core-sequence.visual-check.2048x1320.dark.png` +- `docs/architecture/thothii-core-sequence.visual-check.2048x1320.light.png` +- `docs/architecture/thothii-core-sequence.visual-check.html` +- `docs/architecture/thothii-core-sequence.visual-check.json` +- `docs/architecture/thothii-runtime.visual-check.1440x900.dark.png` +- `docs/architecture/thothii-runtime.visual-check.1440x900.light.png` +- `docs/architecture/thothii-runtime.visual-check.2048x1320.dark.png` +- `docs/architecture/thothii-runtime.visual-check.2048x1320.light.png` +- `docs/architecture/thothii-runtime.visual-check.html` +- `docs/architecture/thothii-runtime.visual-check.json` +- `docs/installazione-docker-4-contesti.md` +- `docs/plans/2026-08-26-metadata-catalog-from-thothai.md` +- `docs/plans/2026-08-28-ai-catalog-description-generation-spec.md` +- `docs/plans/2026-08-28-ai-catalog-description-generation.md` +- `docs/plans/2026-09-02-installation-model-catalog.md` +- `docs/plans/2026-09-08-memory-m1-validation.md` +- `docs/plans/2026-09-08-security-hardening-resume-prompt.md` +- `docs/plans/2026-09-09-archive-repair-x1-validation.md` +- `docs/plans/2026-09-09-evidence-e1-validation.md` +- `docs/plans/2026-09-09-evidence-e2-validation.md` +- `docs/plans/2026-09-09-evidence-e3-validation.md` +- `docs/plans/2026-09-09-memory-m2-validation.md` +- `docs/plans/2026-09-09-memory-m3-validation.md` +- `docs/research/2026-08-23-legacy-thothai-metadata-capabilities.md` +- `docs/research/2026-08-23-postgresql-catalog-deployment-constraints.md` +- `docs/research/2026-08-23-thothii-metadata-publication-qdrant-seams.md` +- `docs/research/2026-09-07-antigravity-gemini-flash-value.md` +- `docs/research/2026-09-07-deepseek-harness-terminal.md` +- `docs/research/2026-09-07-omp-codex-zcode.md` +- `docs/research/2026-09-07-pi-config-vs-oh-my-pi.md` +- `docs/research/2026-09-07-zai-coding-plan-cli-quota.md` +- `docs/research/2026-09-07-zed-acp-omp-pi.md` +- `docs/research/text-to-sql-products.md` + +Le sezioni successive e l'inventario fotografano la revisione iniziale: la presente +sezione prevale per le azioni eseguite. Gli altri ritiri sono rinviati finché non +si chiudono i relativi gate; non si cancellano documenti solo perché datati. ## Esito e modifica applicata @@ -297,7 +366,7 @@ al sito. «Consolidare» e «ritirare» non indicano cancellazioni eseguite. | `testing/evidence-lifecycle-test-plan.md` | Developer/QA | Conservare criteri ripetibili e gate; separare risultati di singola release. | -## Verifica della modifica +## Verifica iniziale, prima dell'esecuzione dei ritiri - Build MkDocs con `--strict` e dipendenze bloccate: superata. - Verifica confine pubblico: 20 pagine, nessun file interno generato o indicizzato. @@ -309,7 +378,7 @@ al sito. «Consolidare» e «ritirare» non indicano cancellazioni eseguite. La pubblicazione remota va verificata separatamente dalla build locale: il ramo sorgente `main`, il ramo generato `pages` e il sito servito non sono la stessa prova. -### Esito remoto del 15 settembre 2026 +### Primo esito remoto del 15 settembre 2026 — diagnosi storica Il commit `043ffdfa` è stato pubblicato su `main`. La [pipeline 122](https://git.tylconsulting.it/mptyl/ThothII/actions/runs/122) è terminata @@ -326,4 +395,21 @@ Il tentativo SSH in sola lettura con la configurazione locale non è proseguito: manca una host key ED25519 conosciuta per `git.tylconsulting.it`. Non è stata disabilitata la verifica dell'identità del server. Servono host/alias amministrativo verificato e percorso o meccanismo di pubblicazione prima di intervenire sul sito effettivo. -La bonifica dei sorgenti e della build è completata; quella della copia servita resta aperta. +Al momento di quella verifica la copia servita restava da aggiornare. L'accesso è +stato poi risolto usando l'alias SSH già configurato e fidato `contabo`; nessuna +host key è stata aggirata. + +## Verifica della bonifica eseguita + +- Build MkDocs strict e confine pubblico: superati, 20 pagine. +- Otto fixture del confine pubblico: superate. +- Contratti auth/DWH correnti e relative fixture di mutazione: superati. +- Suite installazione/workspace, Compose canonico e contratto comandi deployment: superate. +- Link Markdown locali di README, PROJECT_STATE e tutti i documenti: nessun target mancante. +- `git diff --check`: superato. +- `test-no-deployment-coupling.sh`: resta rosso su rilievi preesistenti relativi + a contenuti locali PSD e route Omics. Eseguita anche la versione dello script + precedente alla bonifica: stesso esito e identico insieme di rilievi, nessuno nuovo. + Non è un collaudo del sito e non è stato indebolito per nascondere i risultati. +- Nessuna nuova certificazione applicativa, modifica del runtime o chiusura di + collaudi reali. I gate elencati nello snapshot restano espliciti. diff --git a/docs/operations/compose-reference.md b/docs/operations/compose-reference.md new file mode 100644 index 00000000..6664bcc5 --- /dev/null +++ b/docs/operations/compose-reference.md @@ -0,0 +1,48 @@ +# Compose reference for maintainers + +This is an internal topology reference, not a second fresh-installation recipe. Operators +start with the [Italian](../install/standalone-manual-it.md) or +[English](../install/standalone-manual-en.md) manual. It replaces the duplicated four-context +Docker guide without changing the runtime. + +The base topology contains frontend, core, catalog-db, qdrant, embedding, embedding-model-init, +catalog-migrate and profile-gated workspace-maintenance. Pi runs in core; DWH and generative +model endpoints remain installation settings. Reference preprocessing and Memory have distinct +lifecycles and collections. See [preprocessing](../contracts/workspace-preprocessing-cli.md). + +## Configuration and migration boundaries + +- Use one physical absolute installation descriptor path, its generated operator environment, + Compose project name, base/profile overlays, transport overlays and generated model overlay. + Mixing a generic `deploy/env/local.env` invocation with a native `tht` installation creates + a different stack; it is not an equivalent lifecycle command. +- `THT_INSTALLATION_CONFIG_SOURCE` identifies the protected host descriptor. The read-only + backend runtime mount is `/run/thothii-installation/thothii-installation.yaml`, exposed through + `THT_INSTALLATION_CONFIG_FILE`; the runtime path is not a host source path. +- Catalog runtime/migrator passwords and provider credentials are protected files. A provider's + `authentication.apiKeyEnv` names an allowed bundle entry; it is not a raw key. Private CAs + are separately mounted PEM files, not bundle values. See the repository's + `deploy/secrets/README.md` and the [model catalog guide](../general/pi-configuration.md). +- Generate projections after descriptor edits. Do not edit generated model/auth/frontend files. + Apply the installation's normal restart process when authored configuration changes. +- Explicitly start catalog-db and run catalog-migrate before application rollout on a fresh + database or after an approved schema update. That service runs Catalog and Memory migrations; + neither normal backend startup nor `tht start` implicitly performs them. +- Server deployments retain their reviewed session/auth/network/storage overlays. A writable + server Pi-state parent must be initialized with the regular targets expected by the read-only + nested mounts; use `scripts/prepare-server-pi-state.sh` with the installation's verified UID/GID. + +## Deployment-specific authority + +For the prepared generic server environment, the base/profile/session override +combination is `-f compose.yaml -f deploy/compose.server.yaml +-f deploy/compose.session-server.yaml.example`, with `--env-file` supplied before +the overrides. Add the reviewed transport/generated overlays for that installation; +this fragment alone is not a complete startup command. + +The current [server handoff](server-codex-handoff.md) and +[legacy upgrade runbook](server-upgrade-gitea-workspace-v2.md) retain maintenance, backup and +rollback gates. Embedded/upstream identity is not standalone OIDC. Local/standalone setup +does not authorize replacing a running server stack, resetting volumes, or copying another +machine's descriptor. `scripts/run-stack.sh` remains a low-level path for an explicitly +prepared generic environment, not the public manual's default startup command. diff --git a/docs/operations/public-docs-publication.md b/docs/operations/public-docs-publication.md new file mode 100644 index 00000000..54012015 --- /dev/null +++ b/docs/operations/public-docs-publication.md @@ -0,0 +1,90 @@ +# Publishing the public manual + +This is an internal operator runbook. Publishing documentation must not recreate +the ThothII application, Gitea, proxy, DWH or other documentation containers. + +## Three separate states + +1. `main` contains reviewed source and the public allowlist in `mkdocs.yml`. +2. Gitea Actions builds and validates the generated `pages` branch. A successful + Actions run alone does **not** update the live site. +3. The live [manual](https://git.tylconsulting.it/thothii-docs/) is served by the + dedicated `thothii-docs` nginx container on the host reached through the existing + trusted SSH alias `contabo`. Its Compose project/service are `thothii-docs`/`docs`. + +This procedure is manual. No timer, webhook, credential or automatic deployment +has been added. Use the operator's existing SSH authorization and known host key; +never disable host verification to make a publication work. + +## Build and stage + +From a clean ThothII `main` checkout already pushed to Gitea: + +```sh +git status --short +git rev-parse HEAD +./scripts/build-docs.sh +bash scripts/auth-docs-smoke.sh +bash scripts/verify-dwh-auth-docs.sh +bash scripts/test-auth-docs-smoke.sh +bash scripts/test-verify-dwh-auth-docs.sh +``` + +The strict build also verifies the public boundary: exactly 20 navigation pages, +five approved source assets, no internal pages/assets, and matching search entries. +Theme-generated assets are separate from those five source assets. + +Choose a unique release identifier consisting of UTC timestamp and source SHA. +Record the current symlink and container identity before proceeding: + +```sh +ssh -oBatchMode=yes -oStrictHostKeyChecking=yes contabo \ + 'readlink /srv/thothii-docs/current; docker inspect --format "{{.Id}} {{.State.Health.Status}}" thothii-docs' +``` + +On the server, create `/srv/thothii-docs/releases/RELEASE/site` only if RELEASE +does not exist. Copy the current `nginx.conf` unchanged into the new release. +Transfer the local built `site/` into that new empty directory with rsync over +the same verified SSH connection. Do not use `--delete` against `current`, and do +not edit routing, TLS, network or authentication configuration. + +## Activate only this site + +Replace RELEASE below with the validated identifier, not a user-supplied path. +Keep the previously recorded release for rollback. + +```sh +cd /srv/thothii-docs +test -f releases/RELEASE/site/index.html +test -f releases/RELEASE/nginx.conf +docker exec thothii-docs nginx -t +ln -s releases/RELEASE current.next +mv -Tf current.next current +docker compose --project-name thothii-docs -f docker-compose.yml \ + up -d --no-deps --force-recreate docs +``` + +Check that `current.next` does not already exist before creating it; stop if it +does, because another publication or recovery may be in progress. Changing the +symlink alone is insufficient: an existing Docker bind mount still resolves to +the old release. The service recreation above remounts the new directory. It may +briefly interrupt this manual only. + +## Verify, record, or roll back + +- Wait for `docker inspect` to report this container healthy; verify mounted + paths and nginx configuration. Stop after a bounded timeout (for example 60 s). +- Without login/cookies, require HTTP 200 for home, search and both + `install/standalone-manual-it/` and `install/standalone-manual-en/`. +- Compare live home and `search/search_index.json` checksums to the build. Search + must contain only the 20 approved pages, never plans, reports or architecture. +- Require HTTP 404 for retired/internal paths, including `architecture/overview/`, + `plans/2026-09-08-memory-management/`, and `operations/compose-reference/`. +- Record source SHA, release ID, previous release and checks in the cleanup/release + record. Do not call the publication complete solely because `pages` was pushed. + +If health or public verification fails, point `current` back to the recorded +previous release using a fresh temporary symlink and the same atomic rename, then +recreate **only** service `docs` with the same Compose command. Verify health and +old site availability. Do not delete either release during recovery. Historical +releases are retained; pruning them requires a separate retention decision. diff --git a/docs/operations/server-upgrade-gitea-workspace-v2.md b/docs/operations/server-upgrade-gitea-workspace-v2.md index df19af91..57cee689 100644 --- a/docs/operations/server-upgrade-gitea-workspace-v2.md +++ b/docs/operations/server-upgrade-gitea-workspace-v2.md @@ -722,6 +722,6 @@ la nuova installazione è ferma ma ispezionabile. - [OIDC generico](../install/authentication-oidc.md) - [Operazioni workspace](workspaces.md) - [Configurazione dei modelli Pi](../general/pi-configuration.md) -- [Contesti Docker](../installazione-docker-4-contesti.md) +- [Contesti Docker](compose-reference.md) - [Database Management](database-management.md) - [Analisi locale della sensibilità](sensitivity-analysis.md) diff --git a/docs/plans/2026-08-26-metadata-catalog-from-thothai.md b/docs/plans/2026-08-26-metadata-catalog-from-thothai.md deleted file mode 100644 index b3e37674..00000000 --- a/docs/plans/2026-08-26-metadata-catalog-from-thothai.md +++ /dev/null @@ -1,695 +0,0 @@ -# Metadata Catalog di ThothII: ricognizione ThothAI e percorso incrementale - -Data: 2026-08-26; aggiornato 2026-08-27 -Stato: ricognizione e progettazione completate; navigazione, CRUD Workspace Database, Catalog -Table, Catalog Column, Catalog Relationship e sincronizzazione durevole dello schema implementati -il 2026-08-27. Generazione AI e integrazione con il workflow core restano negli step successivi. - -## Obiettivo - -ThothII deve introdurre un contesto amministrativo separato, il **Metadata Catalog**, per gestire -il database associato a ciascun workspace, la sua struttura fisica introspezionata e i metadati -semantici oggi rappresentati da `schema/annotations.yaml`. - -Il programma procede per step indipendenti. Il primo step ha aggiunto l'accesso dalla sidebar; il -secondo ha sostituito la superficie vuota con il CRUD di configurazione, il PostgreSQL interno e i -test di connessione; gli step successivi hanno aggiunto navigazione gerarchica, colonne, relazioni -fisiche e sincronizzazione durevole dell'intero schema. Non introduce ancora generazione AI o -integrazione con il workflow core. - -Questa analisi usa come riferimento il working tree legacy osservato in -`Thoth/ThothAI`. Non è stato verificato che quel contenuto corrisponda a una release o a un tag -canonico; i percorsi e i comportamenti descrivono il sorgente disponibile il 2026-08-26. - -## Decisioni già confermate - -1. Ogni Workspace Database appartiene a un solo workspace tramite un `workspace_id` obbligatorio e - univoco; un workspace può avere al massimo un Workspace Database. Poiché i workspace non sono - righe del catalogo PostgreSQL, l'associazione è un riferimento logico validato contro - `thoth-workspaces.yaml`, non una foreign key SQL. -2. Il CRUD non crea né rinomina workspace. Identità e lista ordinata dei workspace restano - autorevoli in `thoth-workspaces.yaml`; il catalogo conserva il loro identificatore stabile. -3. La struttura fisica viene acquisita interrogando il database esterno tramite i dati di - connessione registrati per il Workspace Database. -4. I contenuti semantici equivalenti a `annotations.yaml` vengono generati con l'AI e conservati nel - PostgreSQL interno. -5. Per PSD è prevista l'importazione delle annotations esistenti. Gli altri database partiranno - dalla struttura introspezionata e genereranno i metadati semantici da zero. -6. `annotations.yaml` sarà sostituito anche come input del core in uno step futuro. Il repository è - in fase di test e non è richiesta la conservazione delle sessioni esistenti durante il cutover. -7. La gestione catalogo resta una superficie separata dal processo NL→SQL. La futura integrazione - deve essere esplicita e non deve modificare fasi, gate o semantica del workflow. -8. Il link iniziale è visibile agli utenti con `workspace.manage`, usa stato React locale e non - introduce un router. -9. La pagina iniziale è vuota, segue il tema, nasconde l'intera colonna core e non interrompe una - sessione live. Le azioni di apertura, resume o creazione sessione riportano al core. -10. La compatibilità con il modello ThothAI è semantica, non una copia letterale: configurazione e - contenuti semantici sono campi relazionali mutabili, mentre identità e appartenenza della - struttura fisica derivano dall'introspezione; i segreti restano nel secret store e lo stato dei - job non viene mescolato ai dati amministrativi. -11. Il CRUD amministra il Metadata Catalog e non esegue DDL sul database esterno, che resta - read-only. -12. La prima versione supporta PostgreSQL; il confine di introspezione dovrà permettere di - aggiungere altri dialetti senza cambiare il modello del catalogo. -13. I segreti dei Workspace Database riusano il secret store cifrato di ThothII. Il catalogo - conserva riferimenti ai segreti e nessuna API, esportazione o log ne restituisce i valori. -14. La UI usa AG Grid Community per la lista master e un pannello React separato per il dettaglio; - non dipende dalle funzionalità master-detail di AG Grid Enterprise. -15. Un Workspace Database il cui `workspace_id` scompare dal catalogo YAML non viene cancellato - automaticamente: diventa orphaned e può soltanto essere recuperato, riassegnato o eliminato - esplicitamente da un amministratore. -16. La prima vertical slice gestisce configurazione del Workspace Database, riferimenti ai segreti, - test di connessione e stato. La seconda gestisce le Catalog Table: la collezione e i nomi sono - controllati dall'introspezione, mentre la descrizione curata è modificabile. Le slice successive - hanno aggiunto Catalog Column, Catalog Relationship e sincronizzazione durevole dello schema. -17. Il modello non conserva il `name` libero di ThothAI: nome e ID visualizzati appartengono al - workspace YAML, mentre `database_name` identifica il database PostgreSQL esterno. -18. Database management supporta i tre trasporti già riconosciuti da ThothII: `postgres_direct`, - `rest_api` e `ssh_tunnel`. PSD rimane un solo Workspace Database: usa la connessione diretta sul - server e l'endpoint REST in locale tramite una Database Binding specifica dell'installazione. - Questo supporto non abilita automaticamente `ssh_tunnel` nel runtime NL→SQL. -19. Una configurazione può essere salvata prima di una connessione riuscita. Il test separato - produce uno stato `untested`, `reachable` o `failed`; attivazione e introspezione richiedono uno - stato raggiungibile. -20. Il CRUD e il test di connessione richiedono `database.manage`; inserimento e sostituzione dei - segreti continuano a richiedere `workspace.secrets.manage`. -21. Il Workspace Database e il modo di raggiungerlo sono entità distinte. Ogni catalogo di - installazione conserva una sola Database Binding attiva per workspace: PSD usa `rest_api` in - locale e `postgres_direct` sul server senza duplicare il Workspace Database. -22. Nel modello finale il Metadata Catalog è autorevole per engine, `database_name`, schema, - capacità e binding. Lo YAML resta autorevole per identità e contenuti del workspace; i campi - DWH correnti saranno importati, confrontati e rimossi soltanto durante un cutover esplicito. -23. La lista master è l'unione fra workspace YAML e record del catalogo: mostra workspace - `unconfigured`, database configurati e record `orphaned`. -24. Ogni introspezione registra le capability disponibili. Una capability `unavailable` non viene - rappresentata come una collezione osservata ma vuota; REST può completare con successo anche - quando indici o enum non sono supportati. -25. Il Metadata Catalog non introduce snapshot, draft o pubblicazioni. Configurazione e contenuti - semantici, inclusi quelli futuri generati dall'AI, sono normali campi modificabili; la struttura - osservata cambia soltanto con una sincronizzazione esplicita. -26. Il normale Delete elimina realmente il Workspace Database, la Database Binding e i relativi - record catalogo e segreti. Non modifica il DWH esterno né il repository YAML; il workspace torna - visibile nella lista master come `unconfigured`. -27. La prima versione gestisce un solo schema obbligatorio per Workspace Database, identificato - dalla coppia `database_name + schema`; per PSD la coppia è `postgres + datawarehouse`. -28. I record mantengono soltanto `created_at`, `updated_at` e un contatore `version` per optimistic - concurrency. Non esistono storico delle revisioni, rollback o audit applicativo delle modifiche. -29. `workspace_databases` conserva soltanto UUID, `workspace_id` unique, engine, `database_name`, - schema, timestamp e version. Il nome visualizzato appartiene al workspace YAML. -30. Ogni Workspace Database ha al massimo una riga `database_bindings`. Una singola tabella usa - check constraint dipendenti da `transport` per i campi direct, REST e SSH; non esiste un flag - `active`, perché ciascuna installazione conserva una sola binding. -31. `rest_api` configura il Thoth REST Connector tipizzato: base URL, autenticazione e TLS sono dati - della binding, mentre path RPC e shape delle risposte appartengono al contratto applicativo e non - sono liberamente configurabili. -32. Il test connessione usa soltanto una configurazione già salvata ed è associato alla sua - `version`. Ogni modifica della binding o dei segreti invalida il risultato precedente e riporta - lo stato a `untested`. -33. Password, API key e chiavi sono write-only: l'API espone soltanto `configured`, un campo vuoto - conserva il valore esistente e la sostituzione è un'azione esplicita. Delete rimuove anche i - segreti associati. -34. La pagina usa AG Grid come master e un form React come detail, con sezioni Database, Connection - e TLS/SSH condizionali. Non esiste un'azione globale `Add database`: ogni riga `unconfigured` - offre `Configure catalog`, apre il form già vincolato a quello specifico workspace YAML e crea il - record soltanto al Save; `workspace_id` non è selezionabile né modificabile. -35. La grid mostra separatamente revisione/Evidence del workspace, binding runtime NL→SQL e - configurazione del Metadata Catalog, oltre a database, schema, endpoint e ultimo aggiornamento. - Su schermi piccoli il dettaglio occupa il pannello completo. Il cambio riga con modifiche non - salvate e Delete richiedono conferma, senza conferma testuale tipizzata. -36. La Database Binding conserva `connection_status`, `tested_version`, `last_tested_at`, un codice - errore e un messaggio breve sanificato. Non conserva stack trace, DSN, credenziali o output grezzo - del driver. -37. Le API vivono sotto `/api/catalog`: list/create di `/databases`, get/patch/delete di - `/databases/:id`, sostituzione dei segreti sotto `/databases/:id/secrets`, test connessione sotto - `/databases/:id/test` e list/patch/sync delle tabelle sotto `/databases/:id/tables`. -38. `GET /api/catalog/databases` restituisce l'intera master list unificata; AG Grid Community applica - client-side ricerca, filtri e ordinamento. La prima versione non introduce paginazione server o - funzionalità AG Grid Enterprise. -39. Il Metadata Catalog vive nello stesso processo Fastify come modulo isolato con repository, - service, route, diagnostica e readiness proprie. L'indisponibilità del catalogo non modifica - sessioni, SSE o health del core e non giustifica ancora un microservizio separato. -40. Il backend mantiene `pg@8.22.0` e aggiunge `kysely@0.29.5` per query e transazioni tipizzate. Le - migrazioni Kysely sono timestampate, compilate con il backend ed eseguite da un comando - `catalog:migrate` separato; l'applicazione non migra automaticamente il database all'avvio. -41. Lo stack aggiunge un servizio interno `catalog-db` con volume persistente, ruolo runtime DML, - ruolo migrator DDL e job one-shot `catalog-migrate`. Un catalogo indisponibile produce 503 sulle - sole route catalogo. -42. La prima vertical slice è amministrativa: scrive il catalogo ma non cambia ancora il runtime di - sessioni e workflow, che continua a usare YAML e binding correnti fino al cutover esplicito. -43. `Configure` precompila senza salvare engine, database e schema dal descriptor e i dati non - sensibili dalla binding effettiva. L'amministratore verifica, inserisce i segreti e salva; non - esiste importazione silenziosa. -44. Unit e route test usano un repository fake; una suite PostgreSQL Testcontainers separata verifica - migrazioni, constraint, transazioni, optimistic concurrency e cascade. SQLite ed emulatori non - sono sostituti ammessi per questi test. -45. La navigazione delle entità catalogo è gerarchica e senza scorciatoie globali: `Databases → - Database → Overview | Tables → Table`. Non esistono una voce globale Tables, un filtro globale - Database o una preselezione implicita; Columns continuerà sotto Table e Relationships sotto - Database. -46. Una Catalog Table conserva nome fisico, `source_comment`, descrizione curata nullable, - `generated_description` nullable per lo step AI futuro, version e timestamp. La UI mostra come - tre campi indipendenti senza fallback visivo: source comment read-only, generated description - modificabile e description modificabile. I valori null restano celle e controlli vuoti. -47. Le Catalog Table non possono essere aggiunte o rinominate manualmente. Un amministratore può - però ripulire esplicitamente le proiezioni nel Metadata Catalog senza modificare il database - esterno; `Sync tables` legge le tabelle PostgreSQL ordinarie e partizionate dello schema scelto, - mentre viste e materialized view sono escluse. -48. La sincronizzazione è esplicita. La scansione avviene fuori dalla transazione del catalogo; il - diff viene applicato atomicamente soltanto se la version del Workspace Database è ancora quella - sottoposta a scansione. Una scansione fallita non modifica il catalogo. -49. Tabelle nuove vengono create, i commenti sorgente vengono aggiornati e quelle non più osservate - vengono eliminate definitivamente. La rimozione di tabelle, colonne o relazioni richiede la - conferma dell'esatto piano distruttivo; se il secondo scan produce una fotografia differente, - l'applicazione richiede una nuova conferma. -50. Un rename fisico è intenzionalmente delete più create e perde i metadati curati. Le colonne e - relazioni dipendenti vengono eliminate in cascade insieme alla Catalog Table. -51. L'introspezione vive nel modulo catalogo Fastify dietro un adapter. PostgreSQL diretto e tunnel - SSH usano il catalogo `pg_catalog`; REST preferisce il contratto tipizzato - `POST /rpc/schema_snapshot` e, quando quell'RPC non è esposto, usa come fallback compatibile una - singola query read-only tramite `POST /rpc/run_query`. Entrambi i percorsi devono produrre la - stessa fotografia v1 stretta descritta in `docs/contracts/catalog-schema-snapshot.md`. -52. Test connessione e sincronizzazione sono serializzati per Workspace Database, hanno timeout e - richiedono che la binding nella version corrente abbia un test `reachable` prima di qualsiasi - Catalog Sync Run. La scansione asincrona ha un timeout separato, di default dieci minuti. -53. Il tunnel SSH usa OpenSSH in modalità stdio `-W`, chiave privata e passphrase opzionale dal - secret store, `known_hosts` obbligatorio, `StrictHostKeyChecking=yes`, agent e configurazione - globale disabilitati. Non è ammesso TOFU. TLS PostgreSQL con CA e server name resta verificato - anche attraverso il tunnel. -54. In questo slice `ssh_tunnel` è una binding supportata da Database management per Test connection - e Schema Sync. Il renderer e il runtime delle sessioni NL→SQL restano fuori scope e continuano a - rifiutarla finché non verrà deciso il relativo cutover. -55. I menu di azione a livello Workspace Database espongono separatamente `Synchronize tables`, - `Synchronize relationships` e `Synchronize all`. Su una selezione di - database lo scope scelto viene avviato per ogni database idoneo; non viene sostituito - implicitamente con una sincronizzazione completa. -56. Lo scope Columns è disponibile dalla grid Tables e limita la riconciliazione alle tabelle - selezionate; la pagina Columns non espone azioni di sincronizzazione. La grid Tables espone - `Synchronize columns` sulle tabelle selezionate. - -## Correzione del modello mentale corrente - -`schema/annotations.yaml` non contiene l'intero schema del database. - -- `physical.yaml` è un artefatto derivato dall'introspezione. Contiene database, schema, timestamp, - tabelle, colonne, tipi, nullability, default, primary key, commenti sorgente, esempi, foreign key - fisiche e indici. -- `annotations.yaml` contiene metadati curati: descrizioni e concetti delle tabelle; descrizioni, - sinonimi, concetti, evidence, note e override `eligible` delle colonne; foreign key logiche. -- Il rendering M-Schema fonde questi due input. Le annotations prevalgono sui commenti sorgente e - le relazioni logiche vengono unite alle foreign key fisiche. - -La sostituzione del solo file annotations non elimina automaticamente l'introspezione fisica. Il -nuovo catalogo dovrà conservare una distinzione esplicita fra fatti osservati nel database e -contenuto semantico modificabile. - -## Architettura ThothII rilevante - -### Autorità e revisionamento attuali - -Il repository dei workspace contiene: - -```text -thoth-workspaces.yaml -/workspace.yaml -/schema/annotations.yaml -/evidence/** -``` - -Il backend legge descriptor e annotations allo stesso commit Git. Durante l'attivazione valida il -blob, lo copia atomicamente nello snapshot immutabile della revisione e registra commit, blob ID e -digest. Le nuove sessioni vengono legate a quella revisione; resume e SQL salvato riaprono lo stesso -snapshot. - -Punti principali: - -- `backend/src/workspaces/schema.ts`: descriptor v3 e singolo `dwh.database`/`dwh.schema`; -- `backend/src/workspaces/git-repository.ts`: lettura sicura del blob annotations al commit; -- `backend/src/workspaces/registry.ts`: validazione e attivazione atomica; -- `backend/src/workspaces/annotations-sync.ts`: materializzazione revision-qualified; -- `backend/src/workspaces/runtime-config-lease.ts`: binding dello snapshot al runtime; -- `harness/tht/mschema/models.py`: contratti `PhysicalSchema` e `Annotations`; -- `harness/tht/mschema/render.py`: fusione fisico/semantico; -- `harness/tht/cli/vector_cmd.py`: indicizzazione schema in Qdrant. - -### Consumatori da preservare al cutover futuro - -Le annotations incidono oggi su: - -- override `eligible` prima del campionamento LSH; -- suggerimento, controllo e accettazione delle foreign key logiche; -- descrizioni, concetti e sinonimi dei record schema in Qdrant; -- retrieval delle tabelle e colonne candidate; -- rendering M-Schema usato dal gate F4 e dalla generazione SQL; -- digest della revisione accettata durante il preprocessing. - -Il futuro cutover non potrà limitarsi a rimuovere il file: dovrà fornire al core lo stesso contenuto -effettivo, con un'identità coerente e test di equivalenza. Poiché non occorre preservare le sessioni -di test esistenti, non serve progettare compatibilità con i vecchi manifest, ma resta necessario -evitare letture parziali o semanticamente incoerenti. - -## Inventario ThothAI - -### Modelli legacy - -I modelli sono definiti in `Thoth/ThothAI/backend/thoth_core/models.py`. - -#### `SqlDb` - -Campi di connessione osservati: - -- `name`; -- `db_host`, `db_port`; -- `db_type`; -- `db_name`, `schema`; -- `user_name`, `password`; -- `db_mode`; -- configurazione SSH e Informix opzionale. - -Il modello contiene anche scope, JSON dello scope, ERD, direttive, campi GDPR, collegamento a -`VectorDb` e numerosi campi di stato/task/log per lavori AI asincroni. - -I tipi legacy dichiarati sono Informix, MariaDB, MySQL, Oracle, PostgreSQL, SQL Server e SQLite. -Questo elenco non costituisce automaticamente un requisito per ThothII: il core corrente supporta -PostgreSQL e l'estensione ad altri dialetti dovrà essere decisa separatamente. - -#### `SqlTable` - -- `name`; -- `description`; -- `generated_comment`; -- foreign key obbligatoria a `SqlDb`, con cancellazione cascade. - -#### `SqlColumn` - -- `original_column_name` e alias `column_name`; -- `data_format` normalizzato; -- `column_description`; -- `generated_comment`; -- `value_description`; -- stringhe denormalizzate `pk_field` e `fk_field`; -- foreign key obbligatoria a `SqlTable`, con cancellazione cascade. - -#### `Relationship` - -Contiene quattro foreign key obbligatorie: - -- `source_table` e `source_column`; -- `target_table` e `target_column`. - -Il form admin verifica che le tabelle appartengano allo stesso database e che ogni colonna -appartenga alla tabella selezionata. Il database non impone però gli stessi check. - -#### `Workspace` - -ThothAI usa `Workspace.sql_db` come foreign key nullable verso `SqlDb`: un workspace seleziona un -solo DB, mentre lo stesso DB può essere riusato da più workspace. ThothII adotterà invece una -relazione uno-a-uno: `workspace_id` deve essere unico nel catalogo. - -### Lacune dei constraint legacy - -Non risultano constraint database-level per: - -- unicità del nome database nel workspace; -- unicità `(database, table name)`; -- unicità `(table, column name)`; -- unicità degli estremi di una relationship; -- appartenenza degli estremi della relationship allo stesso database; -- corrispondenza fra colonna e tabella dichiarata. - -ThothII deve applicare queste invarianti sia nel database interno sia nel servizio applicativo. La -sola validazione del form non è sufficiente perché API, import e job la possono aggirare. - -### Django Admin e UX da replicare concettualmente - -ThothAI espone il CRUD tramite il Django Admin standard, registrato da -`backend/thoth_core/admin.py` e pubblicato su `/admin/`. - -Capacità utili: - -- lista database con ricerca per nome, host, tipo, database e schema; -- fieldset separati per identità, connessione, autenticazione, SSH e stato; -- lista tabelle filtrabile per database; -- lista colonne filtrabile in cascata per database e tabella; -- lista relazioni con estremi leggibili e filtri per database e tabelle; -- form relazione con dropdown dipendenti database → tabella → colonna; -- validazione degli estremi prima del salvataggio; -- azioni separate per test connessione, introspezione, import/export e generazione AI; -- azioni bulk sulle righe selezionate. - -ThothII deve replicare i contratti di interazione e validazione, non il rendering server-side o i -template Django. - -### Introspezione legacy - -`Thoth/ThothAI/backend/thoth_core/dbmanagement.py` usa `thoth-dbmanager` per: - -1. costruire l'adapter del dialetto; -2. acquisire tabelle; -3. acquisire e normalizzare colonne e tipi; -4. acquisire relazioni; -5. creare le eventuali colonne mancanti necessarie alle relazioni; -6. aggiornare i campi PK/FK denormalizzati. - -Il comportamento è principalmente additivo: usa `get_or_create` o controlli `exists`, aggiorna -alcuni commenti, ma non riconcilia in modo completo rename, rimozioni o drift. Non va copiato così -com'è. Il processo ThothII implementato distingue scansione, differenze osservate e applicazione -della nuova snapshot. - -### Generazione AI legacy - -ThothAI dispone di azioni e workflow per: - -- commenti delle tabelle; -- commenti delle colonne; -- scope del database; -- ERD Mermaid; -- documentazione del database; -- analisi GDPR. - -Per il requisito attuale sono direttamente rilevanti descrizioni di tabelle e colonne, scope e -metadati semantici. ERD, documentazione aggregata e GDPR sono estensioni future, non prerequisiti -del CRUD iniziale. - -La separazione `description`/`generated_comment` del legacy non offre versioning o approvazione -robusti. Nei passi successivi andrà deciso se l'output AI è una proposta revisionabile o diventa -immediatamente il valore editabile corrente. - -### Import ed export legacy - -ThothAI offre: - -- CSV di database, tabelle, colonne e relazioni; -- export di struttura per workspace; -- import mediante `import_db_structure`; -- script SQL dei commenti per più dialetti; -- aggiornamento delle descrizioni colonna da CSV. - -Il futuro import PSD dovrà leggere il contratto YAML corrente e convertirlo su chiavi naturali, -non riutilizzare gli ID numerici Django. Deve essere idempotente e produrre un report di elementi -creati, aggiornati, ignorati o non risolti. - -## Comandi osservati in ThothAI - -### Backend locale - -Eseguiti da `Thoth/ThothAI/backend`: - -```sh -uv sync -uv run python manage.py migrate -uv run python manage.py createsuperuser -uv run python manage.py runserver 8200 -uv run pytest -``` - -Import catalogo legacy: - -```sh -uv run python manage.py import_db_structure --source local -uv run python manage.py load_defaults --only-level 4 --source local -``` - -Test mirati rilevanti: - -```sh -uv run pytest tests/test_relational_database_operations.py -v -uv run pytest tests/test_ssh_tunnel_configuration.py -v -``` - -### Stack Docker legacy - -ThothAI dichiara `postgres:16-alpine` nel profilo `internal-db`, con volume persistente e -healthcheck `pg_isready`. - -```sh -docker compose --profile internal-db up --build -``` - -Il wrapper legacy abilita lo stesso profilo quando `POSTGRES_INTERNAL=true`: - -```sh -POSTGRES_INTERNAL=true ./docker-up.sh -``` - -Questi comandi documentano il riferimento osservato; non sono comandi di installazione per -ThothII. - -## Cosa copiare in ThothII - -### Parità necessaria - -- gerarchia Workspace Database → Table → Column; -- relazione strutturale fra colonne sorgente e destinazione; -- navigazione e filtri dipendenti workspace/database/tabella; -- test di connessione separato dal salvataggio; -- introspezione esplicita e ripetibile; -- descrizioni generate dall'AI ma modificabili dall'utente; -- validazione cross-entity delle relazioni; -- azioni di import/export senza segreti; -- stato leggibile dei job lunghi; -- PostgreSQL interno persistente con migrazioni esplicite; -- test di CRUD, cardinalità, cascade/restrict, isolamento per workspace e idempotenza. - -### Parità semantica con `annotations.yaml` - -Il modello futuro deve poter rappresentare almeno: - -- descrizione, concetti e note per tabella; -- descrizione, sinonimi, concetti, evidence, note ed `eligible` per colonna; -- foreign key logiche; -- distinzione fra commento fisico osservato e descrizione curata; -- provenienza del contenuto importato o generato. - -L'eventuale esclusione di uno di questi campi deve essere una decisione esplicita perché cambia -rendering, retrieval, LSH o SQL generation. - -### Vincoli minimi da progettare - -- `workspace_id` obbligatorio e unico sul Workspace Database, con esistenza validata contro il - catalogo YAML dal servizio applicativo; -- nome tabella unico nel database e schema appropriato; -- nome colonna unico nella tabella; -- relationship unica secondo il modello, anche per chiavi composite; -- estremi della relationship nello stesso Workspace Database; -- appartenenza certa della colonna alla tabella; -- mutazioni aggregate transazionali; -- gestione esplicita di concorrenza fra CRUD e introspezione. - -## Cosa non copiare - -- Django, Django Admin, Django ORM, DRF, template admin e frontend Next; -- modello Workspace legacy e condivisione dello stesso DB fra più workspace; -- password o passphrase come normali campi testuali; -- password incluse in CSV o export completi; -- token SSO inseriti nella query string; -- migrazioni generate automaticamente all'avvio; -- validazioni presenti soltanto nel form; -- `pk_field` e `fk_field` testuali come fonte di verità; -- duplicazione di tabella e colonna negli estremi senza constraint coerenti; -- introspezione additiva che non segnala rename, delete o drift; -- azioni admin che possono mostrare successo dopo output AI non valido; -- dipendenza del workflow core dalla disponibilità della UI o del PostgreSQL amministrativo. - -## Aspetti di sicurezza da non ereditare - -L'export legacy della struttura include username e password in chiaro. Il modello conserva inoltre -password, passphrase SSH e altri segreti in `CharField`; non è stata trovata cifratura applicativa, -nonostante un testo admin affermi il contrario. - -ThothII distingue i metadati di connessione dai riferimenti al secret store cifrato. In ogni caso: - -- nessun endpoint o export deve restituire segreti; -- log ed errori devono sanificare DSN e credenziali; -- le credenziali di migrazione non devono essere disponibili al runtime CRUD; -- il catalogo non deve riusare credenziali del DWH, delle sessioni o di Qdrant; -- test connessione e introspezione devono usare timeout e privilegi read-only. - -La binding REST corrente richiede una verifica prima del cutover: il renderer emette -`ssl_ca_file`, mentre il modello Python espone `ssl_ca`; il percorso della CA privata potrebbe quindi -non essere consumato. PSD richiede TLS con CA privata in locale, perciò questo disallineamento deve -essere corretto e coperto da un test end-to-end prima di affidare il profilo REST al catalogo. - -## Percorso incrementale - -### Step 1: accesso alla superficie vuota - -Implementato in questo worktree: - -- pulsante `Database management` nella sidebar destra; -- visibilità legata a `workspace.manage`; -- superficie centrale React separata e vuota; -- nessun router, endpoint, fetch o stato catalogo; -- sessione e SSE conservati in background; -- ritorno al core tramite creazione, apertura o resume di una sessione; -- test frontend dedicati. - -Comandi di verifica: - -```sh -cd frontend -npx vitest run src/shell/AppShell.database-management.test.tsx -npx vitest run src/shell/AppShell.new-session.test.tsx \ - src/shell/AppShell.session-target.test.tsx \ - src/shell/AppShell.session-mgmt.test.tsx -npx tsc -b -``` - -### Step 2: contratto di dominio e schema relazionale - -Progettazione della vertical slice completata: Workspace Database, Database Binding, singolo schema, -riferimenti al secret store, optimistic concurrency e capability per trasporto hanno contratti -espliciti. Configurazione e contenuti semantici restano mutabili; la struttura fisica osservata è -sincronizzata e non modificabile manualmente. - -### Step 3: PostgreSQL interno e migrazioni - -PostgreSQL interno con volume e ruoli runtime/migrator separati. Il modulo catalogo usa Kysely sopra -il driver `pg`; le migrazioni compilate vengono applicate soltanto dal comando `catalog:migrate` e -mai allo startup Fastify. Health, readiness e diagnostica restano dedicate; l'indisponibilità del -catalogo non cambia `core /health` e non interrompe una sessione. - -### Step 4: API CRUD - -Contratti HTTP, autorizzazione, paginazione, filtri, errori, optimistic concurrency e transazioni. -Gli endpoint dovranno vivere sotto un namespace catalogo e non riutilizzare le route sessione. - -### Step 5: UI CRUD - -Workspace Database, Catalog Table, Catalog Column e Catalog Relationship sono implementati con -React/Vite e il design system ThothII. -La navigazione è gerarchica e locale al database (`Overview | Tables`), senza menu o filtri globali -per tipo di entità. La grid delle tabelle non offre Add o cancellazione della singola configurazione; -le selezioni espongono invece la pulizia esplicita dei metadati. Il dettaglio full-width mantiene -immutabili i fatti fisici e consente di modificare separatamente Description e Generated -Description. Colonne e relazioni seguono la stessa gerarchia: Columns appartiene al dettaglio -della tabella, Relationships al database. I valori descrittivi null sono mostrati come celle e -campi vuoti, senza fallback visivi o placeholder `Not set` che nascondano quale sorgente è -effettivamente valorizzata. - -Le griglie che dispongono di azioni massive usano checkbox e una toolbar contestuale con conteggio, -menu `Actions` e cancellazione della selezione. La selezione identifica ID espliciti, può essere -accumulata attraverso i filtri e viene azzerata dopo successo, nuova sincronizzazione o uscita -dalla pagina; un'azione è all-or-nothing se un elemento non è idoneo. I menu a livello database -espongono gli scope fisici come azioni distinte: `Synchronize tables`, `Synchronize relationships` -e `Synchronize all`. La grid Tables espone invece `Synchronize columns` per le tabelle selezionate; -la pagina Columns non espone sincronizzazione. Le selezioni database aggiungono `Delete all tables` e -`Delete all relationships`; le selezioni tabelle aggiungono `Delete all columns` e `Delete all -relationships`. Queste operazioni sono atomiche, richiedono conferma e non modificano database -esterno, binding, configurazione o segreti. Test connection resta un'azione distinta; griglie senza -azioni non mostrano controlli di selezione inerti. - -### Step 6: introspezione - -Catalog Table, Catalog Column e Catalog Relationship sono implementate per PostgreSQL diretto, -Thoth REST Connector e tunnel SSH. La scansione read-only è separata dalla transazione; una -riconciliazione atomica crea, aggiorna i commenti sorgente ed elimina, dopo conferma, i fatti fisici -assenti senza rendere modificabile manualmente la struttura osservata. Gli scope autorevoli sono -Tables per database e Physical Relationships per database. Per Columns, `tableIds` vuoto include -tutte le Catalog Table correnti, mentre una lista di ID limita lo scope al sottoinsieme esplicito; -`Synchronize all` osserva tutti e tre gli scope in un unico snapshot e li riconcilia insieme. Tutti -gli scope sono eseguiti come Catalog Sync Run durevoli in background, non attraverso implementazioni -sincrone e asincrone separate. Un run che prevede cancellazioni conserva il diff, attende una -conferma esplicita e verifica nuovamente lo snapshot prima dell'applicazione; se la sorgente è -cambiata, invalida la conferma. Ogni applicazione è atomica e fail-closed: errori, timeout o -capability non disponibili non producono aggiornamenti parziali. - -PK e FK devono essere visibili sulle Catalog Column senza duplicare le stringhe denormalizzate di -ThothAI. La posizione nella primary key è un fatto osservato della colonna; membership e conteggio -FK sono proiezioni derivate dalle Catalog Relationship e dalle loro coppie ordinate, aggiornate -nella stessa transazione di riconciliazione. - -Ogni scope registra la versione della Database Binding osservata e l'istante dell'ultima -sincronizzazione. Una modifica della binding conserva il catalogo precedente ma lo marca stale; -solo un `Synchronize all` riuscito rende nuovamente corrente l'intero schema. - -### Step 7: generazione AI dei metadati - -Generated Description è una proposta distinta e modificabile: un revisore può correggerla prima -di consolidarla esplicitamente come Description. Lo slice AI dovrà decidere e implementare anche -alias semantici, descrizioni dei valori, sinonimi e concetti per tabelle e colonne, oltre alla -gestione esplicita di errori e output non validi. La generazione AI e l'azione di consolidamento non -appartengono allo slice di introspezione dello schema. - -### Step 8: migrazione PSD - -Import idempotente delle annotations PSD, riconciliazione contro la struttura introspezionata, -report degli orfani e confronto semantico con il rendering corrente. Gli altri workspace non -ricevono import legacy. - -### Step 9: sostituzione dell'input core - -Rimuovere la dipendenza da `annotations.yaml` soltanto dopo avere un contratto equivalente, -test di rendering/search/Qdrant e una policy di disponibilità. Le sessioni di test esistenti -possono essere eliminate, ma le nuove sessioni non devono osservare aggiornamenti parziali. -Questo cutover è esplicitamente rinviato fino al completamento del database dei metadati. Il primo -gate successivo obbligatorio sarà valutare l'integrazione del Catalog Schema Snapshot con il -workflow core e lo schema-linking corrente; il rinvio non autorizza a dimenticare o assorbire -implicitamente il lavoro in altri slice. - -### Step 10: operazioni e accettazione - -Backup/restore reale, diagnostica, metriche, permessi definitivi, hardening degli export e -test di failure isolation fra catalogo e workflow. I Catalog Sync Run hanno un solo job attivo per -Workspace Database, sono concorrenti fra database diversi e usano un lock persistente. Un pannello -operativo non modale rimane visibile durante la navigazione del database, mostra fasi, contatori, -tempo trascorso e log sanitizzato via SSE con polling di fallback, e offre Confirm, Cancel e Retry -quando consentiti. Un restart marca `interrupted` i run rimasti attivi; il retry crea un nuovo run. -Le modifiche ai metadati restano consentite durante la scansione e sono preservate dall'applicazione. -Il worker gira inizialmente nello stesso servizio Fastify ma dietro un'interfaccia estraibile, con -coda, lease e heartbeat persistiti nel catalog-db. I riepiloghi dei run non scadono; gli eventi -dettagliati sono conservati per 30 giorni, mentre snapshot e diff completi vengono eliminati dopo -la conclusione lasciando conteggi, decisioni e una sintesi sanitizzata dell'esito. - -## Verifiche del core da conservare per il cutover - -Comandi attuali rilevanti: - -```sh -tht --installation /thothii-installation.yaml workspace preprocess dwh \ - --workspace --json -tht --installation /thothii-installation.yaml workspace schema suggest-fks \ - --workspace --json -tht --installation /thothii-installation.yaml workspace schema check \ - --workspace --json -tht --installation /thothii-installation.yaml workspace schema accept \ - --workspace --run --yes --json -tht --installation /thothii-installation.yaml workspace index-schema \ - --workspace --json -``` - -Suite che documentano il comportamento da preservare: - -```sh -cd backend -npx vitest run test/workspaces-git-annotations.test.ts \ - test/registry-annotations.test.ts \ - test/annotations-sync.test.ts \ - test/workspace-runtime-config-lease.test.ts \ - test/workspace-preprocessing-service.test.ts -npx tsc --noEmit -p . - -cd ../harness -.venv/bin/pytest -q \ - tests/test_annotations_root.py \ - tests/test_schema_fk_annotations.py \ - tests/test_mschema_render.py \ - tests/test_qdrant_cli_commands.py -``` - -Questi test non implicano che la futura implementazione debba continuare a usare file YAML. -Definiscono gli effetti semantici e le guardie da mantenere o sostituire consapevolmente. - -## Decisioni rinviate - -Le seguenti scelte non appartengono allo step 1: - -- lifecycle dei riferimenti ai segreti durante sostituzione e cancellazione; -- criteri per aggiungere dialetti successivi a PostgreSQL; -- criteri per un'eventuale estensione futura a più schemi per database; -- lifecycle e gestione amministrativa delle future Logical Relationship; -- alias semantici, descrizioni dei valori, sinonimi e concetti prodotti o assistiti dall'AI; -- formato e momento del cutover dal file al database interno; -- permission definitiva separata da `workspace.manage`. - -Ognuna sarà affrontata nel relativo step, senza anticipare scelte tecnologiche nel presente -documento. diff --git a/docs/plans/2026-08-28-ai-catalog-description-generation-spec.md b/docs/plans/2026-08-28-ai-catalog-description-generation-spec.md deleted file mode 100644 index ec77692c..00000000 --- a/docs/plans/2026-08-28-ai-catalog-description-generation-spec.md +++ /dev/null @@ -1,251 +0,0 @@ -# AI-generated descriptions for Catalog Tables and Catalog Columns - -## Problem Statement - -ThothII already stores a Generated Description separately from the curated Description for Catalog -Tables and Catalog Columns, but administrators cannot populate it with AI. ThothAI provides the -useful core workflow—generate table and column comments from schema context and small real-data -samples—but its execution, configuration, and interaction model cannot be copied directly into -ThothII. - -Administrators need an asynchronous workflow integrated into Database Management. They must be -able to choose an installation-approved model, generate descriptions for selected or missing -targets, observe understandable progress, stop or recover a stuck operation, review generated -text, and explicitly consolidate it. The solution must retain ThothAI's practical simplicity and -must not introduce a general job platform, model gateway, distributed scheduler, or competing -user-facing CLI. - -## Solution - -Add Description Generation to Database Management as one installation-wide, sequential background -run owned by the Fastify backend. The browser starts a run and remains responsive while the backend -processes bounded requests one at a time. Each completion is delegated to a short-lived internal -Python helper using LiteLLM. Models, their default, and any API-key secret references are declared in -application setup YAML and are independent of both workspaces and Pi configuration. - -Each valid result is written immediately to the target's Generated Description. A minimal run row -and ordered text events provide status, counters, history, and a live log. A stopped or crashed run -is not resumed automatically; completed results remain in place and Generate Missing supplies the -simple recovery path. An Unlock action marks a stale recorded run interrupted only when no helper -or backend generation loop is alive. - -Prompts use catalog context and, when available, no more than five real rows and five representative -non-null examples. Samples are transient and never logged or persisted. A valid inability to infer -a description produces a standard application-localized value such as `Non generabile`; provider, -timeout, and response-validation failures remain technical errors. - -Generated text remains separate from Description until an administrator uses the existing -checkbox selection and Actions control to consolidate it. Consolidation retains Generated -Description and never writes comments to the external Workspace Database. - -## User Stories - -1. As an installation operator, I want to declare the models allowed for metadata generation in setup YAML, so that model availability is controlled centrally. -2. As an installation operator, I want to declare one default metadata-generation model, so that administrators begin with a safe operational choice. -3. As an installation operator, I want each model to reference its own API-key secret, so that credentials are not stored in workspaces or browser-visible settings. -4. As an installation operator, I want metadata-generation models to remain independent of Pi models, so that changing this workflow cannot disrupt the core NL-to-SQL experience. -5. As an installation operator, I want invalid model setup to fail validation clearly, so that the application does not start with ambiguous provider behavior. -6. As a Catalog Administrator, I want generation controls to explain when no model is configured, so that I know why the action is unavailable. -7. As a Catalog Administrator, I want to select an approved model from a selector initialized to the setup default, so that I control which model performs the work. -8. As a Catalog Administrator, I want to generate descriptions for selected Catalog Tables, so that I can work on a focused part of the catalog. -9. As a Catalog Administrator, I want to generate descriptions for selected Catalog Columns, so that I can work on individual fields without regenerating a whole table. -10. As a Catalog Administrator, I want to generate all eligible descriptions for a Workspace Database, so that I can initialize a catalog in one operation. -11. As a Catalog Administrator, I want to generate only missing descriptions, so that I can continue interrupted work without replacing completed proposals. -12. As a Catalog Administrator, I want a full run to process Catalog Columns before their Catalog Tables, so that table descriptions can benefit from column descriptions. -13. As a Catalog Administrator, I want generation to run asynchronously after I start it, so that the browser remains usable and progress is not tied to one HTTP request. -14. As a Catalog Administrator, I want only one Description Generation Run active in the installation, so that provider traffic and operational behavior remain predictable. -15. As a Catalog Administrator, I want a second start attempt to return a clear conflict, so that I cannot accidentally overlap generation runs. -16. As a Catalog Administrator, I want synchronization, cleanup, consolidation, and edits for the target Workspace Database blocked during generation, so that the simple sequential run sees stable catalog state. -17. As a Catalog Administrator, I want to see the run's model, scope, status, counters, and timestamps, so that I understand what is happening. -18. As a Catalog Administrator, I want a chronological text log, so that I can follow completed targets and diagnose errors. -19. As a Catalog Administrator, I want live log updates with a polling fallback, so that temporary SSE problems do not hide run progress. -20. As a Catalog Administrator, I want completed and interrupted runs to remain inspectable, so that I can understand prior activity. -21. As a Catalog Administrator, I want to stop an active run, so that I can halt an incorrect or unexpectedly costly operation. -22. As a Catalog Administrator, I want stopping a run to terminate its current model helper and prevent later targets from starting, so that stop has prompt operational effect. -23. As a Catalog Administrator, I want valid results completed before a stop or failure to remain saved, so that useful work is not discarded. -24. As a Catalog Administrator, I want a run left active by a backend restart to become interrupted, so that the UI does not claim nonexistent work is still running. -25. As a Catalog Administrator, I want to unlock a stale active run when no generation process is alive, so that an erroneous recorded lock cannot block future work. -26. As a Catalog Administrator, I want Unlock rejected while a live generation process exists, so that recovery cannot create an overlapping run. -27. As a Catalog Administrator, I want Generate Missing to continue after interruption, so that recovery does not require a special resume mechanism. -28. As a Catalog Administrator, I want one retry for a transient model failure, so that a brief provider fault does not immediately lose a batch. -29. As a Catalog Administrator, I want the run to fail after three consecutive technical failures, so that a broken provider does not generate an unbounded stream of attempts. -30. As a Catalog Administrator, I want a successful request to reset the consecutive-failure count, so that isolated errors do not prematurely stop a useful run. -31. As a Catalog Administrator, I want a completed-with-errors result when isolated batches fail but the run reaches its end, so that partial problems remain visible. -32. As a Catalog Administrator, I want no automatic fallback to a different model, so that the selected model remains truthful and predictable. -33. As a Catalog Administrator, I want malformed or ambiguous model output rejected without writing it, so that descriptions cannot be assigned to the wrong target. -34. As a Catalog Administrator, I want an inability to infer a description represented by standard localized text, so that every valid outcome is understandable in the workspace language. -35. As a Catalog Administrator, I want technical failures kept distinct from non-generatable outcomes, so that provider problems are not mistaken for catalog knowledge. -36. As a Catalog Administrator, I want generated prose written in the workspace language, so that it matches the catalog's intended audience. -37. As a Catalog Administrator, I want generated text stored separately from curated Description, so that AI output remains a reviewable proposal. -38. As a Catalog Administrator, I want to edit a Generated Description manually, so that I can improve a proposal before consolidation. -39. As a Catalog Administrator, I want to select one or more tables or columns and run “Move generated description to Description” from the existing Actions control, so that review remains integrated into the current grids. -40. As a Catalog Administrator, I want consolidation to retain the Generated Description, so that I can still see the proposal from which the curated text was copied. -41. As a Catalog Administrator, I want selected records without a Generated Description skipped and reported, so that the bulk action does not erase curated text. -42. As a Catalog Administrator, I want consolidation and generation to modify only the Metadata Catalog, so that no external database comment is changed. -43. As a Catalog Administrator, I want prompts to use schema facts and existing catalog text, so that generated descriptions are grounded in available metadata. -44. As a Catalog Administrator, I want prompts to use at most five real source rows and five representative values when available, so that the model has useful examples without unbounded disclosure. -45. As a Catalog Administrator, I want to be warned that real source samples are sent to the selected provider, so that I can make an informed disclosure decision. -46. As a Catalog Administrator, I want sampled rows and values excluded from persistence and logs, so that operational history does not become a secondary data store. -47. As a security operator, I want API keys, prompts, samples, and complete provider payloads redacted from logs, so that diagnostics do not leak secrets or source data. -48. As a support operator, I want concise per-target and per-batch event messages, so that failures can be diagnosed without provider-specific internals. -49. As an authorized administrator, I want all generation, cancellation, unlock, and consolidation actions protected by database-management permission, so that ordinary users cannot mutate catalog metadata. -50. As an unauthorized user, I want generation controls hidden or disabled and API calls rejected, so that frontend visibility is not treated as authorization. -51. As an operator, I want setup changes to take effect after an application restart, so that configuration lifecycle remains simple and explicit. -52. As a product owner, I want the first release to avoid queues, parallel calls, distributed locks, and automatic resume, so that effort remains focused on generating and reviewing useful descriptions. - -## Implementation Decisions - -- The Fastify backend owns one installation-wide Description Generation Run and its sequential - processing loop. It does not delegate lifecycle ownership to Pi or Python. -- A Description Generation Run has one of `queued`, `running`, `completed`, - `completed_with_errors`, `cancelled`, `failed`, or `interrupted`. It stores the Workspace - Database, requested scope, selected model identifier, workspace language, progress counters, - timestamps, and an optional final error summary. -- Ordered Description Generation Events store timestamp, severity, and safe human-readable text. - When an event identifies a target, it uses the object type and qualified physical name, such as - `Column "patients.birth_date"` or `Table "patients"`; catalog UUIDs remain internal identifiers. - No durable per-target jobs, model invocation rows, prompt snapshots, sample snapshots, leases, - heartbeats, registry revisions, or provenance chains are introduced. -- Starting a run schedules an in-process background loop and returns the run immediately. The API - exposes start, run/history lookup, event listing and streaming, cancellation, stale-run unlock, - and the safe list of configured model choices. There are no retry-item or resume endpoints. -- One in-memory generation manager enforces the installation-wide active-run rule. The existing - Catalog Operation Coordinator reserves the target Workspace Database for the duration of the - run, without being generalized into a new operation framework. -- On backend startup, persisted `queued` or `running` Description Generation Runs become - `interrupted`. The application performs no automatic replay or resume. -- Unlock succeeds only when no live generation loop or helper child exists. It marks the stale run - interrupted and releases the local reservation; it is not a distributed lock recovery protocol. -- Each model completion uses a short-lived Python helper backed by LiteLLM. Structured input is - supplied over stdin, structured output alone is emitted on stdout, diagnostics use stderr, and - the helper can be terminated by cancellation. -- A completion request contains no more than ten targets. Requests run one at a time. The helper - performs at most one retry for a transient technical failure. -- Three consecutive model-request failures fail the run. A successful request resets that count. - Isolated exhausted failures may be logged and skipped, producing `completed_with_errors` if the - run later reaches its end. -- Every valid generated or non-generatable result is applied immediately to Generated Description. - Earlier writes are retained after cancellation, interruption, or later failure. -- A response must identify requested targets unambiguously and classify each returned result as - generated or non-generatable. Duplicate, unknown, missing, or malformed mappings cause a - technical request failure and no result from that ambiguous response is applied. -- The parser also tolerates one JSON object enclosed by one complete `json` code fence, because - some supported models add that formatting despite the prompt. Any prose outside the fence, - multiple payloads, or malformed/ambiguous mappings remain invalid. -- The application supplies localized standard non-generatable text. Provider wording is not used - as the standard value, and technical errors never write that value. -- A full-database run generates eligible Catalog Columns before Catalog Tables. Generate Missing - excludes targets whose Generated Description is already non-empty; all-generation may replace - existing generated proposals only after the initiating action makes that scope explicit. -- Model choices are declared under a metadata-generation section in installation setup YAML. Each - choice has a stable identifier, display label, LiteLLM provider/model settings, optional endpoint - settings, and an optional environment-secret reference for its API key. The reference may be - omitted only when an explicit endpoint is configured for unauthenticated access. One identifier - is the default. -- An explicit endpoint may set `disableThinking: true`; the helper translates it only to the - Qwen-compatible chat-template switch needed to keep the response within the strict JSON contract. -- Metadata-generation setup is separate from application settings for Pi and from workspace - `llm_policy`. Raw keys never enter setup YAML, the catalog database, API responses, process - arguments, or event text. Configuration reload is restart-only. -- If setup defines no usable model, the safe model-list response is empty and the UI disables - generation with an explanation. The backend still rejects direct generation attempts. -- Prompt construction treats schema names, comments, descriptions, and values as untrusted data. - It requests output in the workspace language and separates instructions from catalog content. -- A request may contain up to five real source rows and up to five representative distinct, - non-null values for relevant columns. Inputs are bounded before prompt construction and are not - persisted or logged. -- The UI discloses that real data can be sent to the selected provider. A future Sensitive Data - Policy will classify values and exclude or anonymize protected data; that policy is not silently - approximated in this slice. -- The generation UI reuses Database Management's table and column selections, model selector, - Actions control, run drawer conventions, SSE delivery, and polling fallback where practical. - Visual parity with Catalog Sync Run logs is not required. -- The consolidation action copies each selected, non-empty Generated Description into Description - in a catalog transaction, retains Generated Description, skips empty proposals, and reports - copied and skipped counts. It never writes to the external Workspace Database. -- Generation, cancellation, unlock, and consolidation require the existing database-management - permission and are validated by the backend independently of UI state. -- No user-facing generation CLI is added. The Python process is an internal completion adapter, - not an operator surface or a long-lived service. - -## Testing Decisions - -- Tests assert externally observable behavior rather than private loop structure, process timing, - or LiteLLM implementation details. -- The primary and highest test seam is the Fastify catalog API with a test PostgreSQL catalog and - an injected fake Model Completer. It verifies complete paths through authorization, run - persistence, sequential processing, event delivery, Generated Description updates, and final - status without contacting a real provider. -- API tests cover each generation scope, column-before-table order, the ten-target request bound, - model validation, one-active-run conflict, target-database exclusion, cancellation, startup - interruption, Unlock safeguards, Generate Missing, partial success, consecutive failure - handling, non-generatable localization, malformed responses, redacted events, and permissions. -- Catalog repository integration tests verify the migration, run and event ordering, active-run - constraint, immediate description writes, history queries, startup interruption, and bulk - consolidation behavior against PostgreSQL. -- The Python helper has a small black-box contract suite using a simulated LiteLLM adapter. It - verifies stdin/stdout framing, pristine stdout, stderr diagnostics, normalized success and - failure output, one transient retry, secret redaction, and termination behavior. -- Setup-validation tests cover duplicate model identifiers, missing or unknown defaults, malformed - provider settings, missing secret references, safe public model projection, and strict separation - from Pi and workspace model settings. -- Database Management tests use the existing browser-level component seam with MSW. They verify - model selection and default, selected/all/missing actions, disabled state without models, running - progress and logs, polling recovery, cancellation, Unlock visibility, terminal summaries, - generated-text refresh, and selected consolidation with copied/skipped counts. -- Existing Catalog Sync Run route, repository, SSE, and drawer tests are prior art for asynchronous - status and event behavior. Existing catalog table/column editing and Database Management tests - are prior art for optimistic catalog updates, permissions, selection, and action controls. -- One required manual acceptance gate, outside deterministic CI, uses the installation's configured - default model and a disposable PostgreSQL database containing only invented data. Its application - credentials are read-only. It generates Italian text for one Catalog Column and one Catalog - Table, verifies their Generated Description, inspects the safe activity log, confirms that no key - or sample value is exposed, and consolidates one selected result. If the configured secret is not - available, acceptance stops without exposing or requesting the key in conversation. -- Delivery includes a strict MkDocs build executed through repository-managed, reproducible - documentation dependencies rather than globally installed Python packages. A readable direct - dependency file is retained, a complete transitive lock is generated with `uv`, and one canonical - repository command performs the strict build from that lock. -- Successful real-provider acceptance is recorded in a short sanitized report under - `docs/testing/`. It identifies the model and checks performed but contains no credentials, - prompts, source samples, complete provider payloads, or generated database values. -- No tests are added for worker queues, parallel generation, distributed locking, multi-replica - recovery, automatic resume, cost accounting, or model fallback because those behaviors are out - of scope. - -## Out of Scope - -- Reusing Pi to execute Description Generation or changing Pi's model configuration. -- A shared Installation Model Registry, model gateway, long-lived Python sidecar, or provider - management platform. -- A user-facing generation CLI. -- Parallel model calls, worker queues, adaptive rate limiting, distributed locks, leases, - heartbeats, automatic resume, or multi-replica execution. -- Durable target jobs, invocation history, prompts, samples, token usage, cost accounting, - provenance chains, target snapshots, or advanced retention controls. -- Automatic retry or resume of individual targets beyond one technical helper retry and a new - Generate Missing run. -- Automatic fallback to a different model. -- Writing generated text into comments of the external Workspace Database. -- Generating logical relationships or other catalog metadata beyond Catalog Table and Catalog - Column descriptions. -- Implementing the Sensitive Data Policy. Its definition and exclusion/anonymization behavior are - a required follow-up improvement. -- Generalizing the log viewer across unrelated metadata operations. That broader concern remains - related to Gitea issue #2. - -## Further Notes - -- The design deliberately follows ThothAI's proven simple workflow while adapting it to ThothII's - asynchronous browser interaction, setup ownership, and existing Generated Description model. -- The source-sampling disclosure is a release requirement, not merely documentation for operators. -- `completed_with_errors` is reserved for a run that reaches the end after isolated technical - failures. Three consecutive failures end the run as `failed`. -- Successful values are their own recovery record: after interruption, Generate Missing naturally - skips them without needing replay state. -- The implementation is available without a feature flag once the catalog migration and valid - setup are present. With no configured model, the feature remains visibly unavailable rather than - partially initialized. -- The final manual gate is intentionally narrow: one real-provider run covers one Catalog Column - and one Catalog Table, generated Italian text, safe events, and one consolidation. Automated - tests remain the evidence for All, Missing, Stop, restart interruption, Unlock, and failure paths. diff --git a/docs/plans/2026-08-28-ai-catalog-description-generation.md b/docs/plans/2026-08-28-ai-catalog-description-generation.md deleted file mode 100644 index bc41684f..00000000 --- a/docs/plans/2026-08-28-ai-catalog-description-generation.md +++ /dev/null @@ -1,173 +0,0 @@ -# AI catalog description generation - -Status: simplified design, API, persistence, test seams, and delivery tickets accepted. - -## Objective - -Bring ThothAI's useful AI comment-generation workflow into the ThothII Metadata Catalog without -turning it into a general job platform. Administrators can generate editable descriptions for -catalog tables and columns, inspect progress, stop a run, recover a stale run, and explicitly copy -approved generated text into the curated Description field. - -The implementation is UI/API only. There is no user-facing generation command. - -## ThothAI behavior retained - -- Generate descriptions for selected tables, selected columns, missing descriptions, or all - eligible targets. -- Generate columns before their containing table when running the full workflow, so table prompts - can benefit from the resulting column descriptions. -- Process bounded batches of at most ten targets, one model request at a time. -- Include schema context, existing catalog text, up to five real source rows, and up to five - representative non-null values when available. -- Keep generated text separate from the curated Description until an administrator consolidates - it. -- Use the existing table and column checkboxes plus the Actions selector to copy Generated - Description into Description for one or more selected records. The generated value is retained. -- Store a localized standard value such as `Non generabile` when a valid model response says that - a description cannot be inferred. - -Unlike ThothAI, every generation action is asynchronous from the browser's perspective and exposes -a persistent, readable activity log. - -## Minimal architecture - -The Fastify backend owns the run lifecycle and sequential loop. It starts one short-lived Python -helper for each model completion. The helper uses LiteLLM, accepts structured input on stdin, -returns structured output on stdout, and writes diagnostics only to stderr. - -This is preferred over reusing Pi. Pi remains the interactive NL-to-SQL orchestration surface, -whereas description generation is a bounded batch transformation with no conversational state or -human gate. A LiteLLM helper avoids inventing a Pi session protocol for a task that needs one -request and one structured response. - -There is no Python daemon, model gateway, queue service, worker pool, or generation CLI. Python is -already a core implementation language in ThothII's harness and core image; this helper does not -introduce a new runtime family. - -## Run lifecycle and exclusion - -- At most one Description Generation Run may be queued or running in the installation. -- Start returns immediately after creating the run and scheduling the in-process backend loop. -- Requests are sequential; there is no parallel provider traffic. -- The target Workspace Database is reserved through the existing in-memory catalog-operation - coordinator. Synchronization, cleanup, consolidation, and direct catalog edits for that database - are rejected while generation is active. -- A second generation start is rejected with a conflict response. -- Stop terminates the current helper process, stops further targets, and marks the run cancelled. -- Backend startup marks any queued or running generation row interrupted. It does not resume work. -- Generate Missing is the normal manual continuation mechanism because successful values were - already saved. -- Unlock is available only when the backend has no live generation process; it marks a stale - recorded run interrupted and clears the local reservation. - -This is intentionally a single-process policy. Multi-replica coordination is out of scope. - -## Persistence - -Persist only: - -- a Description Generation Run with database, scope, selected model, language, status, counters, - timestamps, and an optional final error summary; -- ordered Description Generation Events containing timestamp, level, and human-readable text; -- each successful or non-generatable result directly in the target's Generated Description. - -Do not add per-target job rows, invocation history, prompt or sample snapshots, provider cost -accounting, leases, heartbeats, registry revisions, or generated-description provenance. The event -log is operational evidence, not a replay mechanism. - -## Model setup - -Selectable models and their default belong to application setup YAML, not to a workspace. Each -entry supplies a stable display identifier, LiteLLM provider/model information, optional endpoint -settings, and—unless that explicit endpoint is unauthenticated—a reference to an installation -secret containing the API key. Keyless entries without an explicit endpoint are invalid. Raw keys must not be -stored in the YAML, database, frontend, events, or process arguments. -An explicit endpoint may opt into `disableThinking: true` when its Qwen-compatible chat template -would otherwise place reasoning text around the required JSON result. - -This metadata-generation configuration is independent of the existing Pi provider/model settings -and workspace `llm_policy`. A setup change takes effect after application restart. If no model is -configured, generation controls are disabled with an explanatory message. - -The browser receives only the selectable identifiers and labels. The selected value defaults to -the setup default and is validated again by the backend when a run starts. - -## Prompt inputs and outputs - -Targets are grouped in model requests of at most ten. Prompts distinguish instructions from -untrusted schema names, comments, descriptions, and sampled values. A response must map every -returned result to a requested target and classify it as generated or non-generatable. Missing, -duplicate, unknown, or malformed target results make that request a technical failure rather than -silently writing ambiguous text. -One complete `json` code fence around the object is tolerated for model compatibility; prose -outside it, multiple payloads, and ambiguous mappings are still rejected. - -For a complete database run, eligible columns are processed before tables. A table request can use -the current Generated Description or Description of its columns. The output language is the -workspace language; the standard non-generatable text is localized by the application rather than -trusted to arbitrary model wording. - -Up to five source rows and five representative examples may be sent to the provider and are never -persisted. Delivery must call out this disclosure. A follow-up Sensitive Data Policy will define -which values are excluded or anonymized. - -## Errors, retry, and logs - -The helper performs at most one retry for a transient technical provider failure. A final failed -request produces an error event and increments the consecutive-error count. The run stops as -failed after three consecutive technical failures; any successful request resets the count. There -is no automatic fallback to another model. - -Valid non-generatable outcomes are results, not technical errors. Successful results from earlier -requests remain stored when a later request fails or the run is stopped. - -The UI shows status, counters, selected model, start/end times, and a chronological text log. Live -delivery may reuse the existing SSE infrastructure with polling as fallback; exact visual parity -with synchronization logs is not required. Logs must not contain API keys, prompts, source sample -values, or full provider payloads. - -## Explicitly deferred complexity - -- shared model registry or cutover of Pi configuration; -- long-lived Python sidecar or internal HTTP model gateway; -- generic catalog-operation kernel; -- durable target items, invocation records, target snapshots, or provenance chains; -- distributed locks, leases, heartbeats, worker queues, automatic resume, or multi-replica support; -- parallel calls, adaptive rate limiting, cost estimation, advanced metrics, or model fallback; -- user-facing generation CLI; -- automatic writeback to comments in the external database; -- Sensitive Data Policy implementation, which remains a required improvement after this slice. - -## Delivery tracking - -The accepted specification is Gitea issue #4 and the implementation is split into issues #5–#11. -Each ticket is a bounded vertical slice with explicit Gitea dependencies. Implementation proceeds -from the unblocked frontier, using a fresh subagent context for each ticket; integration and final -verification remain centralized so later slices cannot silently reopen the deferred platform -features above. - -Issue #4 remains open until delivery completes four final gates: the stale Compose service-set -contract is corrected in its own commit; documentation dependencies are repository-managed and a -strict MkDocs build passes; one narrow real-provider acceptance run succeeds against non-sensitive -test data; and a separate, non-blocking Sensitive Data Policy design ticket is linked as required -follow-up work. - -The documentation toolchain retains a readable direct-dependency input, adds a complete lock -generated with `uv`, and exposes one canonical strict-build command. Real-provider acceptance uses -the installation's configured default model and a disposable PostgreSQL database seeded only with -invented values and accessed read-only by the application. A missing protected model secret stops -the gate without disclosing it. The successful gate is captured in a sanitized report under -`docs/testing/` without prompts, samples, full generated values, payloads, or credentials. - -Delivery is organized as four reviewable commits: the stale Compose contract correction, the -reproducible documentation toolchain, the AI-description feature, and—only after acceptance—the -sanitized acceptance report. A failed real-provider gate does not invalidate already verified -commits, but issue #4 remains open and no acceptance report claims success. Application defects are -fixed and reverified; missing configuration or provider unavailability is recorded and retried. - -After every gate passes, the existing `codex/db-management` branch is pushed to its configured -origin without introducing a new pull-request workflow, then issue #4 is closed with links to the -delivery evidence. The separate Sensitive Data Policy issue is created as non-blocking follow-up, -linked to #4, and labeled `enhancement` plus `ready-for-human` because its design requires a future -`grill-with-docs` before agent implementation. diff --git a/docs/plans/2026-09-02-installation-model-catalog.md b/docs/plans/2026-09-02-installation-model-catalog.md deleted file mode 100644 index d30af71f..00000000 --- a/docs/plans/2026-09-02-installation-model-catalog.md +++ /dev/null @@ -1,248 +0,0 @@ -# Installation Model Catalog - -Status: implemented on 2026-09-02. - -## Outcome - -`thothii-installation.yaml` is the only operator-authored source for models used by interactive -sessions, metadata generation, and embedding. Runtime-specific files are deterministic projections, -not additional configuration sources. Workspace descriptors contain database and Evidence concerns -and no model, provider, allowlist, default, embedding, or vector-store configuration. - -This design does not merge execution lifecycles. Pi continues to run interactive sessions, the -short-lived LiteLLM helper continues to perform metadata generation, and the internal Ollama service -continues to provide embeddings. They share model declaration, not execution machinery. - -## Canonical installation shape - -The following example covers all currently required cases: a Pi built-in model, an authenticated -custom endpoint, a keyless internal endpoint, metadata generation, and the single embedding model. - -```yaml -schemaVersion: 2 -profile: server -projectDirectory: /srv/thothii -envFile: /srv/thothii/operator.env - -workspaceRepository: - remote: git@git.example.com:organization/workspaces.git - branch: main - access: ssh - -modelCatalog: - defaults: - session: zai/glm-5.3 - metadataGeneration: local-qwen/qwen3.6-35b-a3b - - embedding: - id: ollama/qwen3-embedding:0.6b - dimensions: 1024 - - providers: - deepseek: - authentication: - mode: pi_auth - session: - mode: pi_builtin - models: - deepseek-v4-pro: - session: {} - deepseek-v4-flash: - session: {} - - zai: - endpoint: - baseUrl: https://api.z.ai/api/coding/paas/v4 - authentication: - mode: secret_env - apiKeyEnv: ZAI_API_KEY - session: - mode: openai_compatible - metadataGeneration: - litellmProvider: openai - models: - glm-5.3: - label: GLM-5.3 - session: - reasoning: true - contextWindow: 200000 - maxTokens: 131072 - metadataGeneration: {} - - local-qwen: - endpoint: - baseUrl: https://ml-aritmolab.policlinicosandonato.it/v1 - authentication: - mode: none - session: - mode: openai_compatible - metadataGeneration: - litellmProvider: openai - models: - qwen3.6-35b-a3b: - label: Qwen3.6 35B A3B - session: - reasoning: false - contextWindow: 131072 - maxTokens: 16384 - compatibility: - supportsDeveloperRole: false - supportsReasoningEffort: false - supportsStore: false - maxTokensField: max_tokens - metadataGeneration: - disableThinking: true - -authentication: - configDirectory: /srv/thothii/auth-canonical - runtimeProjection: - directory: /srv/thothii/auth-runtime - uid: 10001 - gid: 10001 -``` - -The catalog uses maps instead of repeated IDs. The canonical identity of a model is always derived -as `/`. `upstreamModel` may be added to a model only when the endpoint uses -a different identifier. `label` is optional and falls back to the canonical identity. - -Model eligibility is not repeated in an `usages` array. A `session` block makes the model eligible -for sessions; a `metadataGeneration` block makes it eligible for metadata generation. The embedding -is a single required installation value rather than a list plus default. - -## Provider and authentication rules - -A provider owns one endpoint, one authentication mode, and zero or one adapter for each runtime. -Model entries cannot override provider endpoint or credentials. If the same upstream service needs -different endpoints or credentials, the installation declares two provider identities. - -Supported session modes are intentionally closed: - -- `pi_builtin`: Pi already owns the model's technical descriptor; the model's `session` block is - empty and ThothII does not copy context-window or compatibility facts. -- `openai_compatible`: ThothII generates a Pi custom-provider descriptor; each session model supplies - the technical values required by Pi. - -Metadata generation uses the provider-level `litellmProvider`. A model-level -`metadataGeneration.disableThinking: true` is permitted only for an explicit compatible endpoint. -There is no generic adapter or plugin abstraction in schema version 2. - -Exactly one provider authentication mode is allowed: - -- `secret_env` requires an approved API-key environment reference present in the protected secret - bundle. Secret values never enter YAML, generated files, logs, arguments, or API responses. -- `pi_auth` is valid only for session-only `pi_builtin` providers and resolves through Pi's protected - authentication projection. -- `none` is valid only for an explicit endpoint. Runtime projections may supply a fixed non-secret - compatibility placeholder when a client library requires a non-empty key. - -## Defaults and selections - -`defaults.session` and `embedding` are required. `defaults.metadataGeneration` is required exactly -when at least one model has a `metadataGeneration` block; metadata generation may otherwise be -absent and its UI controls are disabled. - -`modelCatalog.defaults.session` is the only configured session-model default. `PI_PROVIDER`, -`PI_MODEL`, and provider/model fields in installation-default settings are removed. A user choice is -a Model Selection containing only the canonical model identity and runtime controls such as thinking -level. A session manifest pins the selected canonical identity. - -Removing the currently selected model causes new-session selection to fall back to the catalog -default with an explicit administrative warning. An existing session is never silently moved to a -different model; resume fails with `model_unavailable` when its pinned identity can no longer be -resolved. - -## Generated runtime projections - -Before Compose starts, `tht` strictly validates schema version 2 and generates installation-local -artifacts below `deploy//generated/`: - -- a normalized catalog JSON consumed defensively by the backend; -- Pi `models.json` for custom providers; -- Pi `settings.json`, combining fixed product settings with the session-eligible canonical IDs; -- a Compose override that mounts the projections and supplies embedding identity and dimensions to - core, preprocessing, and `embedding-model-init`. - -Generation is deterministic and published only after every candidate artifact validates. A failed -generation aborts start before Compose is invoked. `tht doctor` recomputes expected bytes and reports -differences; no digest manifest or separate apply command exists. When projection bytes change, -`tht start` recreates the affected services so they cannot continue with an older bind mount. -Pi-only restart, update, and rollback operations reject projection drift and direct the operator to -`tht start`, because applying only the core-facing files could leave embedding services stale. - -Generated projections are not backed up. Restore validates the canonical installation descriptor, -regenerates every projection, and only then starts services. Base Compose files and `operator.env` -must contain no model identities, defaults, endpoints, or dimensions. - -## Workspace schema v4 - -Workspace schema v4 removes both top-level `llm_policy` and `semantic_index`. The entire latter -block is redundant today: its engine and distance are product constants, its collection duplicates -the workspace ID, and its model and dimensions are installation facts. - -The runtime derives: - -- Qdrant collection identity from the workspace ID; -- engine and distance from the supported product contract; -- embedding identity and dimensions from the Installation Model Catalog. - -The published index generation records the canonical embedding identity and dimensions that created -it. A mismatch makes the index explicitly incompatible and requires operator-triggered -preprocessing. No existing index is deleted or rebuilt automatically. - -The v3-to-v4 workspace migration is deterministic: set `workspace.schema_version` to `4`, remove -`llm_policy`, and remove `semantic_index`. It does not alter database, Evidence, diagnostics, or -binding data. - -## Installation migration - -Legacy installation migration must inspect all three former sources: - -1. `metadataGeneration` in `thothii-installation.yaml`; -2. `deploy/pi/models.json`; -3. `deploy/pi/settings.json`. - -The migrator emits a version-2 candidate only when it can reconcile identities, endpoints, -credentials, and runtime-specific facts without guessing. Ambiguous aliases such as `glm-53`, -`zai/glm-5.3`, and `openai/glm-5.3` are not silently equated. A conflict produces a field-level -report and leaves every input unchanged for operator resolution. - -After migration, the strict loader rejects `metadataGeneration`, workspace `llm_policy`, workspace -`semantic_index`, legacy Pi source files, unknown fields, duplicate YAML keys, invalid defaults, and -incompatible authentication/adapter combinations with an actionable `migration_required` or -validation error. - -## Final simplicity audit - -The accepted design removes every configuration duplication that can be removed without inference: - -- one authored installation file instead of an installation block plus two Pi files; -- one canonical `provider/model` identity instead of display IDs and runtime IDs; -- per-use blocks instead of a duplicated usages list; -- one embedding entry instead of a selectable embedding catalog; -- one catalog session default instead of environment and settings defaults; -- no model or vector-store fields in workspace descriptors; -- provider-level credentials instead of per-model credentials; -- no generic runtime-plugin abstraction; -- no persisted digest, apply command, or backup of generated projections. - -The remaining generated files are necessary boundary adapters, not configuration concepts. Making -the backend parse the authoring YAML independently would remove one file but restore two semantic -validators. Hard-coding embedding values in Compose would remove one projection but restore a model -source outside the catalog. Inferring authentication from missing fields would save one YAML key but -turn a safe explicit choice into ambiguity. These apparent simplifications are therefore rejected. - -No further reduction was found that preserves one authority, strict validation, explicit security, -session determinism, and model-free workspaces. - -## Implementation surface - -Implementation must update the host `tht` installation loader, setup and lifecycle projection, -doctor, backup/restore, Compose mounts and embedding inputs, backend catalog/settings/session model -resolution, workspace schema and migration, runtime rendering and diagnostics, frontend workspace -drafts and model filtering, examples, fixtures, and documentation. Existing session manifests remain -readable and keep their pinned provider/model identity; only resume resolution changes to the new -catalog. - -Implementation completed after explicit approval. The installation schema, deterministic runtime -projections, migration path, model-free workspace schema v4, backend consumers, operator UI, -fixtures, and documentation now enforce this contract. diff --git a/docs/plans/2026-09-08-evidence-management.md b/docs/plans/2026-09-08-evidence-management.md index 686007ea..abfe72bc 100644 --- a/docs/plans/2026-09-08-evidence-management.md +++ b/docs/plans/2026-09-08-evidence-management.md @@ -5,9 +5,9 @@ manuale con commit/push dell'operatore accettati per la release 0; restanti semplificazioni confermate, con chiarimenti su impatto core e controllo Git; E1, E2, E3 e il collegamento ai gate X1 implementati il 2026-09-09. Il contratto X1 è in [Session corrections](../contracts/archive-repair.md). Risultati e limiti in -[E1 — validazione](2026-09-09-evidence-e1-validation.md) e -[E2 — validazione](2026-09-09-evidence-e2-validation.md) e -[E3 — validazione](2026-09-09-evidence-e3-validation.md). +[E1 — validazione](../reports/knowledge-archives-release.md) e +[E2 — validazione](../reports/knowledge-archives-release.md) e +[E3 — validazione](../reports/knowledge-archives-release.md). La [revisione di semplicità](2026-09-08-memory-evidence-simplification-review.md) registra il riesame di Q1–Q15. Il flusso principale è draft scritta dallo specialista diff --git a/docs/plans/2026-09-08-memory-evidence-administration.md b/docs/plans/2026-09-08-memory-evidence-administration.md index e28fb99e..09a23e1f 100644 --- a/docs/plans/2026-09-08-memory-evidence-administration.md +++ b/docs/plans/2026-09-08-memory-evidence-administration.md @@ -2,7 +2,7 @@ Data del piano: 2026-09-08. Aggiornamento 2026-09-09: M1–M3, E1–E3 e X1 implementati. Risultati e limiti della verifica finale sono raccolti nel -[rapporto X1](2026-09-09-archive-repair-x1-validation.md). +[rapporto X1](../reports/knowledge-archives-release.md). La [revisione di semplicità](2026-09-08-memory-evidence-simplification-review.md) riesamina tutte le decisioni Q1–Q15 alla luce degli ultimi chiarimenti del diff --git a/docs/plans/2026-09-08-memory-m1-spec.md b/docs/plans/2026-09-08-memory-m1-spec.md index da996bf5..2d156f62 100644 --- a/docs/plans/2026-09-08-memory-m1-spec.md +++ b/docs/plans/2026-09-08-memory-m1-spec.md @@ -6,7 +6,7 @@ confini di test confermati dal proprietario il 2026-09-08. Primo incremento del progetto Memory management. Attua le decisioni già approvate nel piano del 2026-09-08 e nell'ADR 0018. Le scelte tecniche di dettaglio qui proposte derivano dalla ricognizione del runtime. Gli esiti dell'implementazione -sono riportati nel [rapporto di verifica](2026-09-08-memory-m1-validation.md). +sono riportati nel [rapporto di verifica](../reports/knowledge-archives-release.md). ## Problem Statement diff --git a/docs/plans/2026-09-08-memory-m1-validation.md b/docs/plans/2026-09-08-memory-m1-validation.md deleted file mode 100644 index cba6693a..00000000 --- a/docs/plans/2026-09-08-memory-m1-validation.md +++ /dev/null @@ -1,103 +0,0 @@ -# M1 — Implementazione e verifica - -Data: 2026-09-08. Implementazione locale della -[specifica approvata](2026-09-08-memory-m1-spec.md), associata all' -[issue 27](https://git.tylconsulting.it/mptyl/ThothII/issues/27). - -## Risultato - -La pagina **Memory management** è disponibile nell'Administration dopo Database -management. Gestisce le quattro famiglie di card, elenco completo, ricerca e filtri, -ordinamento, dettaglio, creazione, modifica, cancellazione, collegamenti e dipendenze. -Richiede un amministratore autenticato e una selezione esplicita del workspace; -non richiede una sessione o un database DWH configurato. - -Il harness possiede l'archivio PostgreSQL `thoth_memory`. Card, collegamenti, -dipendenze e lavoro di propagazione sono salvati nella stessa transazione. -La pagina distingue salvataggio fallito e contenuto salvato con indice incompleto, -offrendo retry anche per le cancellazioni. Recall Memory ed exemplar verificano -esistenza, workspace e proiezione corrente nell'archivio prima di restituire contenuto. - -Promozione, salvataggio singolo e finalizzazione corrente passano dal servizio -autorevole. Le ricevute della sorgente impediscono duplicati e ricreazione di card -cancellate. Reindicizzazione e preprocessing non importano vecchi payload o sessioni. -L'errore Memory non annulla una sessione già finalizzata; il gate segnala anche -una promozione salvata con indicizzazione incompleta. - -Le migrazioni sono versionate, controllate tramite checksum e incluse nel wheel -e nell'immagine core. Il servizio di preparazione `catalog-migrate` le esegue dopo -quelle del Catalog. Il runtime assume il ruolo limitato `thoth_memory_runtime`, -con isolamento del workspace tramite RLS e senza privilegi DDL. - -## Verifiche eseguite - -| Confine | Esito | -| --- | --- | -| Harness, test senza L0/L2 | 1.134 passati; i 9 test dei percorsi portabili sono stati eseguiti separatamente e sono passati. | -| Servizio Memory, PostgreSQL e Qdrant reali | 17 passati, inclusi CLI, migrazioni, ruolo runtime, isolamento, transazioni, outage, retry, cancellazioni, cambio famiglia e rebuild. | -| Gate Pi | 190 passati, inclusi identità UUID e avviso dopo salvataggio con indice incompleto. | -| Backend | 1.345 passati nella suite completa, 40 esclusi dalle condizioni previste dai test; un test di autenticazione ha superato il timeout sotto carico. Il relativo file è stato rieseguito isolato: tutti i 17 test passati. | -| Frontend | 632 passati, inclusi ingresso dall'AppShell, form, filtri, collegamenti, dipendenze e retry delle cancellazioni. | -| Browser integrato | Passato: autenticazione amministratore, creazione, modifica, riavvio del backend, rilettura, cancellazione e assenza nel recall. | -| Build e tipi | Build backend e frontend, typecheck TypeScript e build documentale strict superati. | -| Lint e diff | Ruff sui file Python modificati e `git diff --check` superati. Il lint globale segnala tre rilievi in file non modificati, elencati sotto. | - -Il browser utilizza autenticamente frontend, login locale, Fastify, ThtRunner, -CLI Python, PostgreSQL e Qdrant. Gli embedding sono deterministici e le attività -Pi/sessione estranee al percorso Memory usano le fixture esistenti. Non sono state -intercettate le API Memory. Sono stati usati container temporanei PostgreSQL 16 e -Qdrant 1.18.2, senza accesso a un DWH remoto o a un modello generativo. - -Il test browser ha consentito di correggere etichette accessibili instabili nei -campi compilati e la sovrapposizione del pannello di recupero ai comandi del dettaglio. -La selezione del workspace e l'uscita dalla pagina sono bloccate durante le operazioni. - -Il lint globale preesistente riguarda soltanto: - -- ordinamento import in `harness/tests/test_effective_relationships.py`; -- ordinamento import in `harness/tests/test_p3_dwh_binding.py`; -- uso di `datetime.UTC` in `harness/tht/mschema/catalog_snapshot.py`. - -## Riproduzione - -Usare Node 24 e le dipendenze installate dei tre layer. Per eseguire il harness -in un ambiente con home non scrivibile si può impostare `THT_HOME` su una directory -di prova. I test dei percorsi portabili devono essere eseguiti senza questo override, -perché verificano deliberatamente la risoluzione dell'home e di `THT_DATA_ROOT`. - -```sh -cd harness -THT_HOME=/private/tmp/thothii-m1-test-home .venv/bin/pytest -m 'not l0 and not l2' --ignore=tests/test_portable_paths.py -q -.venv/bin/pytest tests/test_portable_paths.py -q -.venv/bin/pytest tests/memory/test_administration.py -q -npm test -``` - -```sh -cd backend -npx vitest run -npx tsc --noEmit -p . -npm run build -``` - -```sh -cd frontend -npx vitest run -npx tsc -b -npm run build -THT_MEMORY_BROWSER_E2E=1 npx playwright test e2e/memory-real.spec.ts -``` - -Il percorso browser richiede Docker, Python del harness, Go per il bridge di -autenticazione e Chromium di Playwright. Avvia risorse isolate e le rimuove alla -fine. Su macOS il browser deve poter avviare i processi Chromium fuori dalle -restrizioni della sandbox. La build documentale si esegue dalla radice con -`./scripts/build-docs.sh`. - -## Stato della consegna - -Le modifiche sono nel worktree locale. Nessuno stack già attivo è stato aggiornato -e nessun dato esistente è stato migrato o eliminato. Prima di usare M1 su -un'installazione occorrono il nuovo core e la preparazione `catalog-migrate`. -M2 (retrieval ibrido ed espansione dei collegamenti), M3 (integrazione estesa nel -workflow) ed Evidence management restano incrementi successivi. diff --git a/docs/plans/2026-09-08-memory-management.md b/docs/plans/2026-09-08-memory-management.md index 9d7ae87f..3e500d0b 100644 --- a/docs/plans/2026-09-08-memory-management.md +++ b/docs/plans/2026-09-08-memory-management.md @@ -2,7 +2,7 @@ Data del piano: 2026-09-08. Aggiornamento 2026-09-09: M1–M3 implementati, con integrazione X1 per le correzioni persistenti dei conflitti. Risultati e limiti -sono raccolti nel [rapporto X1](2026-09-09-archive-repair-x1-validation.md). +sono raccolti nel [rapporto X1](../reports/knowledge-archives-release.md). La [revisione di semplicità](2026-09-08-memory-evidence-simplification-review.md) mantiene il perimetro Memory e precisa un salvataggio sequenziale e una pulizia diff --git a/docs/plans/2026-09-08-security-hardening-prd.md b/docs/plans/2026-09-08-security-hardening-prd.md index 1f21eb4d..09a1aefc 100644 --- a/docs/plans/2026-09-08-security-hardening-prd.md +++ b/docs/plans/2026-09-08-security-hardening-prd.md @@ -1,9 +1,31 @@ # PRD — Security hardening per Docker personale e server multiutente +## Ripresa del lavoro e limiti di autorizzazione + +Questo PRD resta una bozza, non una specifica di implementazione approvata. Il precedente +prompt di ripresa è stato consolidato qui il 15 settembre 2026. Riconfermare i rilievi +SEC-01–SEC-12 contro codice e dipendenze correnti, separando fatti, ipotesi, rischi del +profilo locale/server e problemi già risolti. Le vecchie survey non provano lo stato del server. +Usare inizialmente controlli in sola lettura e dati sintetici; accesso a server, IdP, DWH +o provider e relative mutazioni richiedono target e operazioni concordati. + +Prima di implementare, il proprietario deve confermare profili di fiducia, isolamento +del runtime Pi, trattamento dei valori sensibili, revoca, retention, limiti di risorse, +priorità e criteri misurabili. I modelli visibili sul server sono un problema separato. +Registrare le decisioni in questo PRD; pubblicare spec e ticket Gitea soltanto dopo la +conferma del perimetro e della granularità. La bonifica documentale non autorizza il +codice di sicurezza, né il rollout di tutti i punti SEC. + +L'implementazione futura richiede un worktree dedicato, test positivi/negativi ai confini +concordati, typecheck e revisione contro standard e specifica. Conservare gate manuali, +evidenze e rollback; un ticket completato non chiude automaticamente il PRD. Non copiare +segreti o dati operativi nei worktree. Usare le skill effettivamente disponibili per +chiarimento, diagnosi e revisione, senza assumere che i vecchi nomi dei comandi esistano. + **Stato:** bozza da validare con `grill-with-docs`; implementazione rinviata. **Data:** 8 settembre 2026. **Owner delle decisioni:** il maintainer di ThothII. -**Ripresa:** [prompt per la prossima sessione](2026-09-08-security-hardening-resume-prompt.md). +**Ripresa:** seguire la sezione «Ripresa del lavoro e limiti di autorizzazione» sopra. Questo documento conserva la survey di sicurezza discussa con il maintainer e propone requisiti, priorità e criteri di accettazione. Non è una spec approvata, un penetration test, una certificazione diff --git a/docs/plans/2026-09-08-security-hardening-resume-prompt.md b/docs/plans/2026-09-08-security-hardening-resume-prompt.md deleted file mode 100644 index 08886419..00000000 --- a/docs/plans/2026-09-08-security-hardening-resume-prompt.md +++ /dev/null @@ -1,100 +0,0 @@ -# Riprendere il PRD di sicurezza con le skill di Pocock - -**Stato:** prompt conservato per uso futuro; nessuna esecuzione programmata. -**PRD:** [Security hardening per Docker personale e server multiutente](2026-09-08-security-hardening-prd.md). - -Apri una sessione nella codebase ThothII e incolla il blocco seguente. Il nome corretto della -skill è `grill-with-docs`, che combina `grilling` e `domain-modeling`. Il prompt apre la fase di -chiarimento; il passaggio a issue, worktree e implementazione resta soggetto alle conferme indicate. - -```text -Riprendiamo il lavoro di sicurezza rinviato l'8 settembre 2026. - -Leggi docs/plans/2026-09-08-security-hardening-prd.md. È una bozza di PRD ricavata da una -survey storica, non una spec approvata né una prova della configurazione del server remoto. -Voglio preparare interventi proporzionati per Docker su Mac/PC personale e per un server -multiutente con autenticazione built-in oppure OIDC. Il problema separato dei modelli -visibili sul server è fuori perimetro. - -Usa realmente le skill di Matt Pocock: leggi le istruzioni installate, dichiarando quali -applichi. Parti da ask-matt per verificare il percorso e da grill-with-docs per il lavoro -di design; quest'ultima richiede grilling e domain-modeling. Se una skill non è disponibile, -segnalalo e concorda il fallback, senza installarla o fingere di averla eseguita. - -FASE 1 — Riconferma delle evidenze, senza modificare il runtime - -1. Leggi AGENTS.md, PROJECT_STATE.md, CONTEXT.md, le istruzioni docs/agents/ su dominio, - issue tracker e label, gli ADR pertinenti e il PRD. Controlla HEAD, stato del worktree - e differenze dalla baseline della survey. Preserva tutte le modifiche preesistenti. -2. Riconferma i rilievi SEC-01…SEC-12 nel codice corrente. Separa fatti verificati, - ipotesi, rischi condizionati al profilo e problemi già risolti. Non trattare i vecchi - conteggi delle dipendenze come una scansione aggiornata. -3. Usa controlli locali read-only e dati sintetici. Per un difetto da riprodurre, usa - diagnosing-bugs con un segnale ripetibile sul comportamento effettivo; una diagnosi - non autorizza ancora il fix. Confronta fatti di librerie e advisory con fonti primarie - correnti quando necessario, senza inviare codice privato o segreti ai servizi di ricerca. -4. Non accedere o intervenire su server, IdP, DWH o provider reali senza aver concordato - target e operazioni. Non mostrare API key, cookie, password o campioni di dati reali. - -Esito della fase: una matrice aggiornata che conserva gli ID dei rilievi, con evidenza, -profilo interessato e stato. Un fatto ancora non verificabile resta esplicitamente aperto. - -FASE 2 — grill-with-docs, con me presente - -5. Costruisci l'albero delle decisioni. Parti da profili di deploy, fiducia fra utenti e - condivisione dei dati; poi affronta isolamento di Pi, policy dei valori sensibili, - revoca, retention e limiti seguendo le dipendenze effettive. -6. A ogni round presenta soltanto le domande attualmente sbloccate, numerate, con la tua - raccomandazione e i trade-off. Attendi le mie risposte prima di assumere le decisioni - successive. Cerca autonomamente i fatti ricavabili dal repository; usa agenti di - ricerca mirati quando previsto dalla skill, senza delegare a loro le mie decisioni. -7. Aggiorna il PRD distinguendo proposte e decisioni confermate. Aggiorna CONTEXT.md solo - per termini realmente risolti. Proponi ADR soltanto per scelte difficili da invertire, - sorprendenti senza contesto e fondate su alternative reali: basta il formato minimo. -8. Concorda requisiti, priorità, rischi accettati e criteri misurabili, inclusi i tempi - di revoca e i limiti di risorse. Conferma con me i confini pubblici dei test prima - di scriverli. Mantieni espliciti i gate manuali già presenti in PROJECT_STATE.md. - -Esito della fase: nessuna decisione bloccante lasciata implicitamente all'agente; -riepilogo e mia conferma della comprensione condivisa. Fino a quella conferma rimani -su analisi e documentazione: nessun cambiamento applicativo o di deployment. - -FASE 3 — Spec e ticket, soltanto dopo mia conferma - -9. Usa to-spec per sintetizzare le decisioni già prese, senza riaprire arbitrariamente - l'intervista. Chiedimi conferma della pubblicazione prima di creare la spec nel - tracker canonico Gitea indicato in docs/agents/issue-tracker.md, non nel mirror GitHub. - Collega la spec canonica dal PRD e rendi chiaro quale documento è la fonte aggiornata. -10. Usa to-tickets per proporre fette verticali verificabili autonomamente, dimensionate - per un contesto fresco. Collega ogni ticket ai requisiti e ai rilievi pertinenti, - indica i veri blocker e includi criteri positivi e negativi. Fai approvare granularità - e dipendenze prima di pubblicare. Solo i ticket approvati e completi ricevono - ready-for-agent; non rimetterli in triage e non chiudere automaticamente la spec padre. -11. Se una decisione richiede una prova eseguibile, proponi un prototype limitato a quella - domanda prima di fissare la spec. Usa wayfinder solo se il lavoro risulta realmente - troppo ampio e incerto per essere chiarito con grill-with-docs. - -Esito della fase: spec approvata e ticket autosufficienti con dipendenze risolte o esplicite. -Chiedimi se autorizzo il primo ticket: l'approvazione del design non avvia da sola il codice. - -FASE 4 — Implementazione futura autorizzata - -12. Prima di modificare codice, concorda e crea un worktree dedicato, verificando percorso, - branch e commit base. Non riusare una directory occupata, non alterare il worktree - originario e non copiare automaticamente segreti o dati operativi. Assicurati che - PRD e prompt siano disponibili nel worktree attraverso un passaggio esplicito. -13. Esegui implement su un ticket sbloccato per volta, in un contesto fresco. Segui tdd - ai confini concordati: un test rosso sul comportamento, implementazione minima, - test verde. Esegui typecheck e test mirati durante il lavoro e le suite pertinenti - al termine; usa fixture locali per IdP, DWH e provider. -14. Esegui code-review sui due assi Standards e Spec, usando i due agenti previsti dalla - skill e una base Git fissata. Assicurati che il diff esaminato includa tutto il lavoro - del ticket, anche se ancora non committato; un diff vuoto non è una review superata. - Risolvi i rilievi e verifica di nuovo. Commit soltanto del lavoro pertinente nel - worktree autorizzato; push, merge e deploy richiedono un'autorizzazione distinta. -15. Consegna evidenze dei test, istruzioni di adozione e rollback, gate manuali pendenti - e rischi residui. Non dichiarare chiuso il PRD intero se è concluso soltanto un ticket - o se resta un'accettazione dell'owner. - -Inizia dalla Fase 1, poi proponimi il primo round di grill-with-docs. -``` diff --git a/docs/plans/2026-09-09-archive-repair-x1-validation.md b/docs/plans/2026-09-09-archive-repair-x1-validation.md deleted file mode 100644 index b88e981f..00000000 --- a/docs/plans/2026-09-09-archive-repair-x1-validation.md +++ /dev/null @@ -1,112 +0,0 @@ -# X1 — validation of session archive corrections - -Date: 2026-09-09. The joint Memory/Evidence repair increment is implemented. -The authoritative contract is [Session archive corrections](../contracts/archive-repair.md). - -## Delivered behavior - -The session gate shows complete before/after content for specific alternatives targeting -Memory or Evidence. The reviewer chooses one correction or rejects all proposals as -inadequate and requests reformulation. The resulting receipt survives interruption; -saved content and index activation are reported separately. Pending activation offers -retry of the same chosen operation. A subsequent curator change blocks replay. - -Application requires an administrator in the harness and the responding browser -principal's archive-management permission. Cross-principal runtime responses cannot -misattribute the correction. A non-administrator can decline or continue the current -question without modifying shared archives. The gate does not advance a workflow phase. - -Memory and Evidence remain separate domains. The integration coordinator reuses their -canonical persistence and activation operations. A session Evidence correction requires -a consolidated archive, preserves source lineage, and cannot publish unrelated external -edits. Existing administration, source import, dependency cleanup and final Memory review -remain available. No automatic Git commit or push was added. - -## Verification - -- Harness regression: **1,264 passed**, one skipped, five deselected. All **nine** - portable-path checks passed separately without `THT_HOME`. Python lint passed on changed modules. -- Backend: **1,366 passed**, 40 skipped. Tests include actual session-response routes - for both target archives, unauthorized response, malformed choice and runtime ownership. -- Frontend: complete suite **645 passed**; the final display adjustment passed all four - focused widget tests. Backend and frontend TypeScript checks passed. -- Pi extension: **199 passed**, including closed human choices, rejection, failure/retry, - forged selections and the updated public tool schema. The modular skill projection is - byte-identical to its updated approved template. -- PostgreSQL/Qdrant integration traverses the actual Python CLI for preparation, - application and recovery inspection. Corrected Memory and Evidence are retrieved from - real indexes, and Evidence activation preserves the Memory card. Session loading is a - controlled fixture and embeddings are deterministic; this is not an LLM quality test. -- Failure tests cover both targets, index outage, replay, later edits, workspace/session - isolation, changed session context, rejection, non-admin writes, and interruption after - the Evidence file write but before its saved receipt. -- Playwright desktop/mobile: **one passed**. The real widget renders both alternatives, - accepts an Evidence choice, displays pending activation and allows retry to active. - No page errors or mobile horizontal overflow. Screenshots are - `/private/tmp/thothii-x1-repair-desktop.png` and `/private/tmp/thothii-x1-repair-mobile.png`. - This browser fixture controls operation outcomes; persistent behavior is tested above. -- Strict MkDocs build and `git diff --check` passed. - -## Local installation and reviewer acceptance - -Core and frontend images were rebuilt from this worktree using the existing local -preview launcher. Migration `004_archive_repairs.sql` was applied to the existing -installation catalog. The new gate is available to session workflows; it is not an -always-visible administration panel. Existing PSD archive content was not changed by -the synthetic validation cases. -All five local services are healthy at `http://127.0.0.1:8080/`. - -The technical increments and their planned checks are complete. The end-user acceptance -check remains a real session containing a meaningful domain conflict, with the reviewer -evaluating the proposed correction. Automated browser validation uses temporary accounts -and data, not the user's authenticated PSD session. Source import retains its E3 -validation boundaries; no broader model-quality benchmark was added. - -## Follow-up acceptance: configured model - -The opt-in `test_real_model_proposes_a_reviewable_persistent_archive_correction` -passed with the installation's **zai/glm-5.3** model. Synthetic Memory asserted an -order-ID-only join; synthetic Evidence required the financial year too. The model -returned two schema-valid, specific alternatives with complete content and the exact -target revisions. The test reviewer selected Memory, persisted the correction through -the real coordinator and PostgreSQL, and retrieved the updated rule. Evidence stayed -unchanged. This test uses deterministic vectors and the configured completion helper; -it does not claim a full autonomous Pi session or human acceptance of PSD semantics. - -The run log is `/private/tmp/x1-acceptance-model.log`. Reproduce with -`THT_MEMORY_L2_INSTALLATION=` and `THT_MEMORY_L2_CORE=` -using `pytest -q -s -m l2 tests/memory/test_administration.py -k real_model_proposes`. -Credentials are resolved inside core and are not returned to the test runner. - -## Follow-up acceptance: both administration pages - -The opt-in `frontend/e2e/memory-real.spec.ts` passed through real authentication, -Fastify, ThtRunner, Python, isolated PostgreSQL and Qdrant. It verifies: - -- Database management, Memory management and Evidence management appear as peers in - that order, with no active core session or DWH binding required. -- Memory creation, editing, persistence across backend restart, deletion and absence - from subsequent recall. -- Canonical Evidence remains intact after the Memory deletion. Its full rule is read - through the real Evidence administration worker; content filtering finds it and an - unmatched filter produces the empty state. -- Requests for an unregistered workspace return 404 for both archives. -- Desktop and mobile Evidence views render without horizontal document overflow. - On phones, both archive pages have at least 380px of usable width at a 390px viewport. - Navigation opens in the shared accessible dialog, closes with Escape or archive selection, - and returns focus to the trigger after Escape. - -The temporary PostgreSQL readiness probe now waits for TCP, avoiding the image's -socket-only initialization server. The browser waits for Memory refresh to finish -before leaving its page, matching the existing navigation guard. Visual inspection -also exposed a real mobile layout issue: the fixed sidebar left only 134px for the -Evidence page. `ArchiveNavigation` now moves that sidebar into the shared dialog below -768px on Memory/Evidence pages. Desktop behavior is unchanged. The frontend image -was rebuilt for the local preview. - -Run log: `/private/tmp/x1-acceptance-browser7.log` (**one passed**). -Screenshots: `/private/tmp/thothii-acceptance-evidence-desktop.png` and -`/private/tmp/thothii-acceptance-evidence-mobile.png`. Reproduce with -`THT_MEMORY_BROWSER_E2E=1 npx playwright test e2e/memory-real.spec.ts` from `frontend/`. -The fixture removes its temporary containers, accounts and checkout on completion. -The TypeScript check, Python lint, strict documentation build and diff check also pass. diff --git a/docs/plans/2026-09-09-evidence-e1-validation.md b/docs/plans/2026-09-09-evidence-e1-validation.md deleted file mode 100644 index 186f3777..00000000 --- a/docs/plans/2026-09-09-evidence-e1-validation.md +++ /dev/null @@ -1,67 +0,0 @@ -# Evidence E1 — validation - -Date: 2026-09-09. Scope: editable Curated Evidence v4 and the persistent local archive. - -## Implemented behavior - -- Parser, renderer, authoring output and normalization share the existing typed payloads. - Visible Markdown edits determine content for all eight kinds. Legacy v1–v3 conversion - is explicit and lossless, with errors for content that cannot be represented exactly. -- Manual declarations record the curator. A correction preserves the original document - as lineage, separately from the current declaration. No source hash is needed to - create a manual file. -- The local archive records baselines, immutable candidates, active revisions and - deletion/source suppression metadata. Unresolved review items and invalid edits block - consolidation. Missing archive directories are availability failures, not deletions. -- Activation failures preserve the previous active revision. Interrupted normalization - replays only unchanged input bytes; later operator edits survive recovery. -- Revision-checked correction methods reject stale workflow updates. Legacy preparation - and resolution cannot overwrite an initialized local archive; explicit import/refresh - integration is deferred to E3. - -## Verification - -The final harness suite excluding opt-in L0/L2 and portable-layout cases passed with -**1,180 tests** (58 deselected). All **9 portable-layout tests** passed separately with -`THT_HOME` unset. The dedicated real-Qdrant integration test passed, including the -optional 35-unit PSD probe. Ruff passed on the changed Evidence implementation and -tests, and the strict documentation build succeeded. No frontend or backend TypeScript -changes are part of E1. - -The integration test uses an isolated Qdrant 1.18.2 container, the actual corpus -pipeline, semantic chunking, vector adapter and active Evidence searcher. Deterministic -three-dimensional embeddings isolate file/content correctness from model behavior. -It verifies that raw edits do not change recall, consolidation updates recalled content -and curator identity, a blocked candidate preserves prior recall, and deletions remove -recall. Existing schema and Memory records survive each operation. - -All **35 PSD units** were copied from the owner's workspace into -`/private/tmp/thothii-e1-psd.bsW4cp`. Deterministic conversion preserved every ID, payload, -scope, provenance and review item. There were no unresolved review items. The optional -integration probe then indexed all 35 converted units and compared their complete ID -set to the original. It uses PSD's actual `max_chunk_chars: 5000`; a preliminary probe -at 4000 correctly blocked an oversized atomic unit. - -Reproduce the isolated real-corpus probe after creating a converted workspace copy: - -```sh -cd harness -THT_E1_PSD_COPY=/absolute/path/to/converted-copy \ - .venv/bin/pytest -q -s tests/test_evidence_editable_integration.py -``` - -The environment variable is optional. Ordinary CI uses only synthetic Evidence. No -source refresh, external document download, DWH call or model request is involved. - -## Delivery boundary - -E1 is a core/library increment. E2 must add the installed manual consolidation command, -connect runtime source selection to the active local snapshot, and build administrative -list/filter/detail with real persistent host paths and manual Git instructions. E3 -adds source acquisition and explicit refresh/conflict handling. X1 later wires deliberate -joint Memory/Evidence corrections into review gates. - -The actual PSD Evidence checkout was not converted. The live Docker preview at -`http://127.0.0.1:8080` remains the previously deployed M3 stack, with no new Evidence -administration page. The corpus conversion and reindexing described here used copies -and disposable test resources. diff --git a/docs/plans/2026-09-09-evidence-e2-validation.md b/docs/plans/2026-09-09-evidence-e2-validation.md deleted file mode 100644 index 272733d3..00000000 --- a/docs/plans/2026-09-09-evidence-e2-validation.md +++ /dev/null @@ -1,86 +0,0 @@ -# Evidence E2 — validation - -Date: 2026-09-09. E2 is implemented locally and installed on the existing Docker preview. -E3 source imports/refresh and X1 deliberate Memory/Evidence workflow corrections remain open. - -## Delivered behavior - -- Independent **Administration → Evidence management**, after Memory, protected by - `evidence.manage`: complete typed content, provenance and original excerpts, review items, - pagination, search, kind/purpose/status and scope/source filters, sort, and refresh. -- Working-file states distinguish active, modified, new, removed, invalid, legacy and review - required. Detail shows the actual configured host path with copy controls. Instructions - cover external editing, all eight Markdown templates, consolidation and manual Git. -- Installed `tht workspace evidence consolidate --workspace [--json]` uses a closed - maintenance envelope. First use converts legacy units. Validation, immutable candidates, - activation and retry run through the existing corpus pipeline without a DWH scan or Git. -- Runtime and ordinary preprocessing consume the active local snapshot. Unconsolidated - edits remain excluded. Catalog/Schema readiness is not advanced by this operation. - Clear preserves curated files, archive metadata and Memory; full preprocessing must - recreate the missing Reference/Schema derivations afterward. -- Immutable runtime lease filenames now identify rendered bytes as well as logical input - identity. This fixes upgrades colliding with old runtime files without changing Catalog - fingerprints or removing the checks against tampered files. - -## Automated checks - -The complete backend suite passed: **1,355 tests**, 40 skipped. The complete frontend -suite passed: **639 tests**. Both TypeScript checks passed. Native Go workspace operation -and CLI tests passed, including rejection of arbitrary consolidation flags. Ruff passed -for changed Python implementation and test files. - -The harness run passed **1,248 tests**, with one skipped and five deselected. Its three -portable-path tests failed because that run deliberately set `THT_HOME` to the test -runtime; rerunning the portable tests with `THT_HOME` unset passed. The final focused -administration/path suite passed all 18 tests, including actionable migration errors and invalid -consolidation combinations rejected before cleanup or indexing. - -The real-Qdrant integration test exercised the actual harness consolidation CLI with -deterministic embeddings: all 35 PSD units converted and indexed with stable identities; -active-only source selection; separate Schema and Memory canaries; Clear and rebuild -from the retained snapshot. Unit tests cover validation, saved-but-unindexed failure, -retry, browsing/filtering, no automatic Git, and no Catalog mutation from consolidation. - -A temporary Git repository and bare local remote exercise the documented manual sequence: -edit, add and remove files, consolidate, inspect, stage the complete Evidence tree, -commit, push and clone. The clone retains changed content, additions, deletions, managed -metadata and an accessible active snapshot. No remote user repository was pushed. - -## Installed preview - -The existing Compose project is `thothii-18998cca7b0a`, at `http://127.0.0.1:8080`. -The persistent editable checkout is: - -```text -/Users/mp/projects/ThothII/deploy/psd/evidence-registry/repo/psd-clinical/evidence -``` - -The original registry checkout was copied from its retained Docker volume. The original -author repository was not changed. Core and maintenance share a nested host bind for -`repo`; registry state/snapshots and all other existing data volumes were retained. -The installation descriptor includes the existing workspace bindings and the new -`evidence-host.yaml` override. The previous descriptor and native binary are backed up -at `/private/tmp/thothii-installation-before-e2.yaml` and `/private/tmp/tht-before-e2`. - -The real installed command succeeded with **35 documents, 35 chunks, 35 changed, zero -removed**, using the configured embedding service and Qdrant. A second run succeeded -with **35 unchanged, zero changed**. Reading the actual archive from core returned -35 active units and no file errors. All five long-running services are healthy. -Only the Evidence stage ran. The strict documentation build and `git diff --check` -also passed. The stack launcher is `bash /private/tmp/thothii-memory-preview.sh`; keep its -worktree image-build override until this branch is integrated into the main checkout. - -Browser verification reached the local login page. The saved administrator password -does not match the current account hash, so the authenticated visual check remains -manual. No account or password was modified. React interaction tests cover navigation, -detail, host paths, templates, filtering, pending activation and invalid files. - -## Boundaries - -There is no web content editor, watcher, automatic commit/push, or implicit source refresh. -The API exposes administration reads and consolidation; the archive's revision-checked -save/remove operations remain available for the later explicit workflow corrections. -These gates are not claimed as implemented by E2. Initialized local archives retain -structural/review checks but bypass the legacy fixed retrieval-evaluation fixture so -its old expected IDs cannot veto deliberate deletions. A general retrieval benchmark -is outside the agreed scope. diff --git a/docs/plans/2026-09-09-evidence-e3-validation.md b/docs/plans/2026-09-09-evidence-e3-validation.md deleted file mode 100644 index 5180a6cf..00000000 --- a/docs/plans/2026-09-09-evidence-e3-validation.md +++ /dev/null @@ -1,100 +0,0 @@ -# Evidence E3 — validation - -Date: 2026-09-09. Explicit source import/refresh and decisions are implemented. X1, -the integration of deliberate Memory/Evidence corrections into workflow gates, remains next. - -## Delivered behavior - -The independent Evidence page now offers **Sources and imports**. An operator copies -a specialist's draft into `evidence/incoming/`, then explicitly imports/refreshes. -Original local Markdown and configured HTTP/S3 sources use existing read-only adapters. -Acquisition retains raw bytes, source identity and versioned normalized documents. -The existing Pi authoring refiner prepares typed, editable v4 proposals. - -Unchanged hashes skip refinement. All source acquisitions/refinements must succeed -before saving a new set of comparisons. Missing sources are recorded as unavailable, -never interpreted as permission to delete. No runtime lookup, ordinary consolidation -or preprocessing triggers remote refresh once the local archive is initialized. - -The administrator sees current and proposed units, scope, content, excerpts, review -items and explicit retirement IDs. **Keep local Evidence** records the retained wording -as a manual declaration with original lineage. **Use proposed Evidence** adopts the -proposal and its source version. Both save and activate through the existing archive -and corpus pipeline; review items block adoption. Comparisons use optimistic checks -on affected file bytes. Interrupted decisions have a durable replay journal and retry -without reacquisition, while intervening external edits are preserved and reported. - -Deleted IDs remain reserved. New model-generated identities from sources with curated -deletions are also conservatively suppressed; surviving IDs can still receive reviewed -updates. Deliberate new knowledge can be authored as a manual file. This mechanical -protection does not depend on the model detecting semantic duplication or contradictions. - -Installed commands are `workspace evidence refresh` and `workspace evidence decide`, -alongside E2 consolidation. Decision envelopes carry a source identity, comparison -revision and keep/replace choice. Extra URLs, arbitrary paths, forged actors and unknown -fields are rejected at the public API/CLI boundary. HTTP requests bind the authenticated -curator. Source operations do not mutate Catalog readiness or run DWH/schema stages. -The Python source worker is internal; the workflow CLI's visible surface is preserved. - -## Checks - -- Complete backend suite: **1,359 passed**, 40 skipped. Complete frontend suite: - **641 passed**. Both TypeScript checks passed; native Go CLI/workspace tests passed. -- Harness regression run: **1,256 passed**, one skipped and five deselected, with - portable-path tests run separately without `THT_HOME`. All **24 focused import, - CLI-surface and portable-path checks** passed. These - cover import, unchanged refresh, access failure, missing source, manual correction, - keep/replace, deletion suppression, stale comparisons, failure/retry and interrupted - journal writes. Ruff passed on the changed Python implementation and tests. -- The real-Qdrant test traverses the actual harness source CLI with deterministic - refinement/embedding boundaries: import is absent from recall before a decision, - accepted content becomes searchable, refreshed proposals preserve active manual - corrections, replacement removes the former text, deletion remains absent after - another refresh, and unrelated Schema/Memory canaries survive. -- Source contract fixtures cover controlled HTTP and S3 identities, exact acquired - bytes, and acquisition call counts. Existing adapter tests retain transport/egress - coverage. The test does not claim to exercise a live S3 account. -- React interaction tests verify explicit refresh, comparison content, exact decisions, - saved-decision retry and failure feedback. Route tests cover admin authorization, - workspace isolation, strict inputs and principal attribution. Service tests verify - the trusted config file descriptor and absence of Catalog mutation. - -## Local preview - -Core/frontend were rebuilt for the existing `thothii-18998cca7b0a` stack. Its persistent -archive and data volumes are retained. The native `/usr/local/bin/tht` was updated; -the previous executable is at `/private/tmp/tht-before-e3`. - -The installed refresh command ran against `psd-clinical` successfully: **35 unchanged -sources, zero changed, zero pending comparisons**. All 35 source hashes matched their -existing units, so this probe required no refinement and changed no active Evidence. -Source registry metadata was saved locally; no Git commit or push was performed. - -A separate synthetic draft was passed to the configured Pi/model inside core. It -produced one domain proposal with one review item, which was not activated. The probe -exposed a deployment issue: Python wheel modules and Pi skills live in different -directories. The refiner now resolves resources through `THT_HARNESS_DIR`, with the -source-tree location as its development fallback; a regression test covers this layout. - -The corrected installed worker was then exercised end to end in a temporary workspace -inside core, using the real configured Pi/model and a synthetic `incoming/orders.md`. -It returned success, one changed source, one comparison and one proposal with a review -item. The active snapshot remained absent. The temporary directory was removed on exit; -the probe did not open the DWH or activate an index. Strict docs build and -`git diff --check` also passed. - -The in-app browser still showed the login page with the prior credential error. -Authenticated visual verification remains manual; no credentials were reset or retried. - -## Operational instructions and boundaries - -See [Import drafts and refresh sources](../contracts/curated-evidence-v4.md#import-drafts-and-refresh-sources) -for commands, local paths, review, retry and backup/Git requirements. Preserve the -complete Evidence tree, including source comparisons, journals and acquired versions. -Local activation and transfer to the remote Git repository remain separate operator steps. - -No web content editor, automatic Git, background watcher, new job queue, general -retrieval benchmark or automatic source merge was introduced. Review/refinement is -sequential and bounded by per-source limits plus 200 documents/100 MiB per refresh. -New changed-source decisions and failure scenarios use isolated test data; live PSD -curated content was kept unchanged. X1 is not included in this increment. diff --git a/docs/plans/2026-09-09-memory-m2-validation.md b/docs/plans/2026-09-09-memory-m2-validation.md deleted file mode 100644 index 2dd8afeb..00000000 --- a/docs/plans/2026-09-09-memory-m2-validation.md +++ /dev/null @@ -1,96 +0,0 @@ -# M2 — Ricerca ibrida e collegamenti - -Data: 2026-09-09. Implementazione locale dell'incremento M2 del -[piano Memory approvato](2026-09-08-memory-management.md#piano-esecutivo). - -## Risultato - -La ricerca Memory ed exemplar usa embedding dense e BM25 in Qdrant. I filtri sono -applicati in entrambi i rami prima della selezione dei candidati. Il core espande -i collegamenti uscenti, deduplica, limita cicli e visite, riordina insieme i risultati -e restituisce il contenuto corrente verificato in PostgreSQL. Non usa un database -a grafo né una chiamata LLM per il riordinamento. - -Il contesto fisico distingue database, schema, tabella e colonna e richiede che -corrispondano alla stessa dipendenza strutturata. Le card senza dipendenze valgono -per il workspace; un riferimento a un antenato fisico si applica ai suoi discendenti. -Ambito descrittivo e concetti possono restringere ulteriormente la ricerca tramite -`--filters`. La CLI impedisce di sostituire database/schema del runtime. Il dettaglio -dei limiti e della formula di ranking è nel [contratto operativo](../gestione-memory.md#hybrid-recall-and-links). - -L'incremento conserva i confini dei gate correnti: F2 riceve chiarimenti di dominio, -gli exemplar restano consultativi. Un collegamento non autorizza a consumare una -famiglia diversa o una card fuori ambito. Il riepilogo finale, i nuovi gate e la -pulizia delle dipendenze dopo sincronizzazione fisica appartengono a M3. - -## Transizione e recupero - -La migrazione versionata `002_hybrid_projection.sql` aggiunge il formato delle -proiezioni. Le card M1 restano autorevoli e consultabili; le loro proiezioni dense -risultano pendenti e non possono alimentare il recall. Un retry esplicito o -`tht memory index -c ` costruisce dense e BM25 dal contenuto corrente. -Il formato della proiezione e la revisione della card sono verificati prima dell'uso. - -Il salvataggio può aggiungere il vettore sparse mancante nella sola collezione -Memory. Non sostituisce configurazioni incompatibili e non modifica Reference. -Il rebuild esplicito ricrea anche una collezione Memory assente; il test elimina -la collezione, ricostruisce da PostgreSQL e verifica il ritorno della sola card conservata. -Fallimenti lasciano il lavoro di propagazione persistito e recuperabile. Nessuna -importazione da JSONL, sessioni storiche o vecchi payload Qdrant. - -## Verifiche - -| Controllo | Esito | -| --- | --- | -| Suite harness senza L0/L2, escluso il file dei percorsi portabili | 1.152 test passati nell'esecuzione finale. | -| Suite mirata Memory, adapter e CLI, con embedding reale | 78 test passati. | -| Verifica aggiuntiva del rebuild con collezione assente e adapter | 54 passati; il solo test del modello reale era escluso in questa riesecuzione. | -| API Fastify Memory | 13 test passati, compresa propagazione della lingua del workspace. | -| Browser amministrativo integrato | Passato: creazione, modifica, riavvio, rilettura, cancellazione e verifica del recall. | -| Wheel e casi CLI | 10 test passati; il wheel include entrambe le migrazioni Memory. | -| Build e controlli statici | Build/typecheck backend, Ruff sui file Python interessati e build documentale strict passati. | - -- Test deterministici: collegamenti necessari, contenuto corrente, duplicati, - cicli, profondità e limiti, card mancanti o pendenti, rifiuti già registrati, - famiglie e ambiti esclusi, dipendenze omonime e filtri CLI vincolati al runtime. -- Adapter: stesso filtro nei prefetch dense/BM25 per Memory ed exemplar; restano - coperti i contratti Evidence esistenti. -- PostgreSQL/Qdrant: salvataggio, modifica, cambio famiglia, cancellazione, - ricostruzione, riferimento separato, isolamento, RLS, errori, retry e transizione - delle proiezioni M1 al formato ibrido. -- Recupero effettivo: client Ollama di produzione con il modello configurato - `qwen3-embedding:0.6b`, dimensione 1024, e Qdrant dell'immagine fissata in Compose. - La domanda sulla chiave commessa fra esercizi recupera la regola attesa e la - granularità collegata, escludendo un altro database, un altro ambito e dipendenze - che corrispondono soltanto combinando riferimenti distinti. Verifica separatamente - dense, BM25 e fusione, poi recall, cancellazione e rebuild. - -Il test effettivo avvia un processo Ollama separato, montando il volume del modello -installato in sola lettura. PostgreSQL e Qdrant sono container temporanei dedicati, -eliminati a fine test. Non usa ID di risultati predisposti. Il browser amministrativo -usa invece embedding deterministici: verifica il collegamento fra UI, autenticazione, -Fastify, ThtRunner e persistenza, senza essere una misura di qualità del recupero. - -Non è una valutazione generale della qualità semantica su un corpus di produzione; -verifica i casi di recupero richiesti da M2, con il percorso reale configurato. - -## Riproduzione - -Dalla directory `harness`, con Docker disponibile: - -```sh -THT_HOME=/private/tmp/thothii-m2-test-home \ -THT_MEMORY_TEST_OLLAMA_VOLUME= \ -THT_MEMORY_TEST_MODEL=qwen3-embedding:0.6b \ -THT_MEMORY_TEST_DIMENSIONS=1024 \ -.venv/bin/pytest -q tests/memory/test_administration.py \ - tests/memory/test_retrieval.py tests/memory/test_recall.py \ - tests/test_qdrant_vector_store.py tests/test_solved_search_cli.py -``` - -Senza il volume esplicito, il solo test con modello reale viene escluso; gli altri -test restano eseguibili. Il volume deve contenere il modello indicato. Le immagini -Qdrant e Ollama del test sono lette da `compose.yaml`. - -Consegna locale: non sono stati eseguiti deploy, migrazioni delle installazioni -attive o aggiornamenti remoti dell'issue tracker. diff --git a/docs/plans/2026-09-09-memory-m3-validation.md b/docs/plans/2026-09-09-memory-m3-validation.md deleted file mode 100644 index 1d847c7b..00000000 --- a/docs/plans/2026-09-09-memory-m3-validation.md +++ /dev/null @@ -1,78 +0,0 @@ -# Memory M3 — validation - -Implemented on 2026-09-09 in the rapid-harbor worktree. - -## Delivered behavior - -- F8 presents an editable summary of proposed additions, explicit updates and links. - Only selected content is saved, including the optional solved-question exemplar. -- Proposals reference effective approved decisions. Exact existing content is reused. - Concurrent edits invalidate an update; manual identities and origins are preserved. -- Selected cards and links commit atomically. Durable receipts recover repeat delivery - and the gap before the session review marker. Finalization does not add Memory. -- F4/F6/F7 retrieve SQL rules and explained errors for the existing approval gates. - Retrieval is consultative and does not write an approval decision. -- Successful Catalog physical sync deletes cards with matching removed dependencies. - The same Catalog transaction marks pending Memory cleanup. Retry keeps the original - removals and does not rescan; deletion receipts and projection tombstones survive restarts. -- Migration 003 adds minimal review and physical-cleanup receipts. - -## Executed checks - -| Check | Result | -| --- | --- | -| Harness deterministic suite, excluding portable-path environment cases | 1,152 passed | -| Portable-path suite without the temporary THT_HOME override | 9 passed | -| Memory service/retrieval with isolated PostgreSQL and Qdrant | 41 passed, 1 optional real-embedding case skipped, 1 L2 case excluded | -| Pi gate suite | 195 passed | -| Backend full suite | 1,346 passed; one auth timing test exceeded 5 seconds under concurrent load | -| Isolated auth and Catalog route rerun | All 40 passed, including the timed-out case | -| Catalog PostgreSQL integration after adding atomic cleanup-marker coverage | All 5 passed | -| Frontend full suite | 635 passed | -| Chromium summary review, desktop and 390px mobile | Passed; no page errors or horizontal overflow | -| Configured real GLM 5.3 generation | Passed on synthetic PostgreSQL data | -| Backend/frontend production builds, modified Python lint, strict docs build | Passed | - -The existing local Docker preview was rebuilt from this worktree, migration 003 -was applied, and core/frontend were recreated with the existing persistent volumes. -The preview remains at `http://127.0.0.1:8080`. - -The browser check uses the production widget in an isolated Vite fixture. It edits -the rule, declines the exemplar, submits only the selected card and checks responsive -layout. Gate tests separately verify request ordering through the production Pi -composition root; service and Catalog tests use real PostgreSQL. This is not a claim -of an automated complete live Pi conversation. - -The L2 case retrieves an approved SQL rule, excludes a card bound to another database, -and asks the configured GLM 5.3 model to generate a query. Order IDs repeat between -financial years; the correct composite join returns 120 on the synthetic fixture. -The generated SQL is validated and executed in a read-only PostgreSQL transaction. -No real DWH rows are sent. Embeddings in this case are deterministic; the real -embedding/hybrid retrieval evidence remains documented in M2. - -## Reproduction - -From the harness: - -```sh -THT_HOME=/private/tmp/thothii-m1-harness-home .venv/bin/pytest -q -m 'not l0 and not l2' --ignore=tests/test_portable_paths.py -.venv/bin/pytest -q tests/test_portable_paths.py -THT_HOME=/private/tmp/thothii-m1-harness-home .venv/bin/pytest -q tests/memory/test_administration.py tests/memory/test_retrieval.py -m 'not l2' -npm test -``` - -The optional generation case requires an installation YAML path and its running -core container. It resolves the model credential inside core without printing it: - -```sh -THT_MEMORY_L2_INSTALLATION= THT_MEMORY_L2_CORE= \ - .venv/bin/pytest -q -s -m l2 tests/memory/test_administration.py -k real_model -``` - -From frontend: `npx playwright test e2e/memory-review.spec.ts`. -Screenshots are written to `/private/tmp/thothii-m3-summary-desktop.png` and -`/private/tmp/thothii-m3-summary-mobile.png`. - -Evidence authoring and the joint X1 persistent Memory/Evidence conflict repair remain -outside M3. This increment does not infer knowledge from unexplained failures or -promise general improvements in SQL-generation accuracy. diff --git a/docs/reports/knowledge-archives-release.md b/docs/reports/knowledge-archives-release.md new file mode 100644 index 00000000..a9a69638 --- /dev/null +++ b/docs/reports/knowledge-archives-release.md @@ -0,0 +1,53 @@ +# Knowledge archives: consolidated implementation evidence + +Consolidated on 15 September 2026 from the M1–M3, E1–E3 and X1 records of 8–9 September. +This is historical verification evidence, not a claim that these test counts describe today's +tree or that every installation has passed acceptance. Original commands, detailed outcomes and +local deployment details remain under `docs/plans/` in Git commit +`5f3a7f5975b96fae1e1cdd0da08b4d60d41064cc`. + +| Increment | Delivered boundary | Recorded verification | +| --- | --- | --- | +| M1 | PostgreSQL Memory authority, administration, durable indexing retry | 1,134 harness + 9 portable cases; 17 real PostgreSQL/Qdrant cases; 190 Pi gates; 632 frontend. One backend auth timeout passed its isolated rerun. | +| M2 | Dense/BM25 recall, scoped links and explicit projection rebuild | 1,152 harness; 78 targeted cases with real embedding; 13 Fastify API cases; 10 wheel/CLI cases. | +| M3 | Human Memory promotion, receipts and physical-schema dependency cleanup | 1,152 harness + 9 portable; 41 Memory integration, 1 optional embedding skipped, 1 L2 excluded; 195 Pi gates; 635 frontend; 5 Catalog integration. Backend timing case passed isolated rerun. | +| E1 | Editable file authority and explicit consolidation | 1,180 harness + 9 portable; real Qdrant including optional 35-unit PSD probe. No actual PSD authoring checkout conversion in E1. | +| E2 | Evidence administration, host CLI and pending activation recovery | 1,355 backend, 639 frontend, 1,248 harness; portable-path rerun passed with THT_HOME unset. Initial authenticated visual acceptance remained manual. | +| E3 | Draft import, explicit source refresh and protected manual corrections | 1,359 backend, 641 frontend, 1,256 harness; 24 focused checks. Synthetic filesystem/HTTP/S3 behavior, not a live S3-account certification. | +| X1 | Human-reviewed Memory/Evidence conflict correction and durable recovery | 1,264 harness + 9 portable; 1,366 backend, 645 frontend, 199 Pi gates; desktop/mobile widget probe and later real authenticated administration probe. | + +X1's configured `zai/glm-5.3` probe used synthetic conflicting knowledge. It was not a full +autonomous Pi-session certification or acceptance of PSD semantics. Later administration +checks exercised real authentication and a disposable synthetic workspace, including persistence +across backend restart. Existing PSD archive content was not rewritten by those probes. + +## Current authorities and repeatable checks + +- [Memory implementation and storage](../gestione-memory.md), ADR 0018. +- [Editable Evidence](../contracts/curated-evidence-v4.md), ADR 0019. +- [Session corrections](../contracts/archive-repair.md). +- [Evidence lifecycle acceptance](../testing/evidence-lifecycle-test-plan.md). +- Harness tests under `tests/memory/`, Evidence integration tests, backend route/service tests, + Pi gate tests and frontend tests are the executable regression boundaries. Run portable-path + tests without a THT_HOME override; optional L2/provider tests require separate authorization. + +Do not equate passing synthetic tests with real-provider quality, live S3 coverage, PSD-domain +acceptance or permission to migrate another installation. Those remain explicit operator gates. + +## Catalog/model design records consolidated at the same time + +The old metadata-catalog exploration and description-generation plan/spec are no longer +current-state authorities. PostgreSQL/Fastify ownership, installation bindings, description +generation and source-sampling constraints now live in ADRs 0001–0016, +[architecture](../architecture/overview.md), [Database Management](../operations/database-management.md) +and the [description acceptance checklist](../testing/2026-08-29-ai-catalog-description-generation-acceptance.md). +The installation-model plan is replaced by ADR 0013 and the +[current model catalog guide](../general/pi-configuration.md). + +Preserve these outstanding questions rather than infer acceptance from implementation: +real provider/DWH acceptance recorded by the owner, licensing review of shipped optional models, +future dialect/multi-schema support, and any desired semantic aliases/value descriptions. +The former proposed catalog-to-core cutover and separate database permissions are already +represented by current ADR 0016 and `database.manage`; do not reopen them as unfinished steps. +The original description-generation plan referred to issue #4 for final delivery gates; +this consolidation neither changes nor closes its tracker state. diff --git a/docs/research/2026-08-23-legacy-thothai-metadata-capabilities.md b/docs/research/2026-08-23-legacy-thothai-metadata-capabilities.md deleted file mode 100644 index 36eb403a..00000000 --- a/docs/research/2026-08-23-legacy-thothai-metadata-capabilities.md +++ /dev/null @@ -1,420 +0,0 @@ -# Inventario delle funzionalità legacy di gestione metadati di ThothAI - -Data dell'inventario: 2026-08-23 - -Ultima verifica rispetto a ThothII: 2026-08-31 - -Stato: **inventario storico verificato; non è una specifica dello stato corrente**. - -Issue originaria: [mptyl/ThothII#6](https://git.tylconsulting.it/mptyl/ThothII/issues/6) - -Fonte primaria: repository legacy annidato `Thoth/ThothAI`, commit -`55855de0f18e5cb4bc72f0a2ab0a7317995186dd`. - -Le citazioni che iniziano con `/Thoth/ThothAI/` sono relative alla radice di quella copia legacy -fissata al commit indicato. Alla verifica del 2026-08-31 tutti i 68 riferimenti univoci puntavano a -file esistenti e a intervalli di righe validi. - -> Questo documento conserva l'inventario e le evidenze degli anti-pattern di ThothAI. Le frasi di -> requisito nelle sezioni successive descrivono la baseline proposta il 2026-08-23; non prevalgono -> su ADR, contratti, codice o `PROJECT_STATE.md` correnti. - -## Stato rispetto al codice corrente - -### Fonti autorevoli correnti - -Per capire cosa esiste oggi, usare nell'ordine: - -- `PROJECT_STATE.md`, per lo snapshot operativo aggiornato; -- `CONTEXT.md`, per il modello di dominio corrente; -- il [piano accettato del Metadata Catalog](../plans/2026-08-26-metadata-catalog-from-thothai.md) - e il [contratto dello schema snapshot](../contracts/catalog-schema-snapshot.md); -- gli ADR del catalogo, in particolare - [0001](../adr/0001-postgres-metadata-catalog.md), - [0004](../adr/0004-fastify-kysely-metadata-catalog.md), - [0006](../adr/0006-separate-physical-and-logical-relationships.md), - [0007](../adr/0007-durable-authoritative-schema-synchronization.md), - [0008](../adr/0008-allow-manual-catalog-metadata-cleanup.md), - [0009](../adr/0009-use-one-sequential-description-generation-run.md), - [0010](../adr/0010-allow-bounded-real-source-samples-for-description-generation.md) e - [0011](../adr/0011-gate-source-samples-with-a-sensitive-data-flag.md); -- l'implementazione, soprattutto `backend/src/catalog/types.ts`, - `backend/src/routes/catalog-databases.ts`, `backend/src/routes/catalog-schema.ts`, - `backend/src/routes/catalog-description-generation.ts`, - `backend/src/routes/catalog-description-consolidation.ts` e - `frontend/src/shell/DatabaseManagementPage.tsx`. - -### Disposizione della baseline storica - -| Capacità inventariata | Disposizione al 2026-08-31 | Evidenza corrente o nota | -|---|---|---| -| Configurazione per workspace, secret separati e test connessione | **Adottata e implementata** | PostgreSQL interno, binding `postgres_direct`, `rest_api` o `ssh_tunnel`, secret write-only; ADR [0001](../adr/0001-postgres-metadata-catalog.md)–[0004](../adr/0004-fastify-kysely-metadata-catalog.md) e `backend/src/routes/catalog-databases.ts`. | -| Inventario fisico di tabelle, colonne, PK e FK | **Adottato e implementato** | La struttura osservata è distinta dai contenuti curati; `backend/src/catalog/types.ts`, `backend/src/routes/catalog-schema.ts` e ADR [0006](../adr/0006-separate-physical-and-logical-relationships.md). | -| Riconciliazione completa e osservabile dello schema | **Implementata; semantica storica parzialmente superata** | I durable Catalog Sync Runs sono autoritativi, fail-closed, atomici e richiedono conferma per diff distruttivi. Non esiste il lifecycle `drift/removed` proposto qui: la sincronizzazione riconcilia la membership e ADR [0008](../adr/0008-allow-manual-catalog-metadata-cleanup.md) consente anche cleanup manuale esplicito, superando ADR-0005. | -| Descrizione curata e Generated Description separate | **Adottata e implementata** | Tabelle e colonne espongono entrambi i campi in `backend/src/catalog/types.ts`; la copia selettiva AI → curato è in `backend/src/routes/catalog-description-consolidation.ts`. | -| Generazione AI selettiva con run, stato e log | **Adottata e implementata** | Un run asincrono installazione-wide, sequenziale, con eventi persistiti e senza resume automatico; ADR [0009](../adr/0009-use-one-sequential-description-generation-run.md) e `backend/src/routes/catalog-description-generation.ts`. I thread daemon legacy sono **esclusi**. | -| Campioni reali per la generazione e protezione dei campi sensibili | **Implementata come estensione correttiva** | ADR [0010](../adr/0010-allow-bounded-real-source-samples-for-description-generation.md) e [0011](../adr/0011-gate-source-samples-with-a-sensitive-data-flag.md): campioni bounded per colonne non sensibili e valori sintetici deterministici per quelle sensibili. | -| Proposte persistenti, diff e versioni dei testi AI | **Escluse** | Resta un solo Generated Description modificabile. La cronologia dei run è operativa: non conserva prompt, output grezzo, proposta per colonna o audit della decisione umana. | -| Relazioni fisiche | **Adottate e implementate** | Sono constraint immutabili con coppie ordinate di colonne; ADR [0006](../adr/0006-separate-physical-and-logical-relationships.md). | -| Relazioni logiche curate o inferite | **Differite/aperto** | ADR-0006 riserva un modello e un lifecycle separati; non sono ancora parte del catalogo corrente. | -| Alias semantici, descrizioni dei valori, sinonimi e concetti | **Differiti/aperti** | `PROJECT_STATE.md` li assegna a slice dedicate; non vanno dedotti dai campi fisici già implementati. | -| Scope AI, ERD Mermaid e documentazione aggregata | **Differiti/aperti** | Restano capacità legacy inventariate, non una feature corrente del Metadata Catalog. Un eventuale lavoro dovrà avere contratto e gate propri. | -| Export CSV e script SQL dei commenti | **Differiti/aperti; varianti insicure escluse** | Non risultano nella API corrente. Export di segreti, CSV incoerenti e SQL ricostruito da tipi incompleti restano vietati dagli anti-pattern sotto. | -| Inferenza euristica e validazione di relazioni candidate | **Differita/aperta** | Non va confusa con la sincronizzazione delle FK fisiche; dipende dal futuro lifecycle delle relazioni logiche. | -| Pubblicazione del catalogo al core/schema-linking/Qdrant | **Differita e richiesta come design gate successivo** | Il runtime NL→SQL continua a usare configurazione e annotations del workspace; il cutover è esplicitamente rinviato in `PROJECT_STATE.md`. | -| Sette motori database del legacy | **Baseline superata** | La prima versione corrente supporta PostgreSQL; l'aggiunta di altri dialetti è una decisione futura, non parità automatica. | -| GDPR e import da installazioni ThothAI | **Fuori dalla baseline iniziale; import differito** | GDPR resta escluso. Un eventuale import richiede una iniziativa idempotente e un cutover separati, non il riuso degli ID Django. | -| Django Admin, modifica manuale della struttura sorgente, password nel catalogo, duplicazione opaca dei database | **Esclusi** | La UI e le API correnti amministrano il catalogo e non eseguono DDL sul DWH esterno; binding e segreti hanno ownership separata. | - -## Sintesi storica - -La baseline di parità proposta il 2026-08-23 comprende un catalogo dei database, l'inventario -completo di tabelle, colonne e relazioni fisiche, metadati descrittivi modificabili, relazioni -logiche, introspezione dello schema, generazione AI di descrizioni, scope, ERD Mermaid, -documentazione ed esportazioni operative. La UI Django Admin è soltanto l'interfaccia legacy: -non è un requisito architetturale da riprodurre. - -Il flusso AI per le descrizioni individuato come baseline è volutamente semplice: - -1. l'AI scrive nel campo `generated_comment` della tabella o colonna; -2. l'utente seleziona gli elementi desiderati; -3. un'azione copia il testo generato nel campo descrittivo canonico, sovrascrivendolo. - -Nel codice esaminato **non esiste un'azione inversa che copi la descrizione canonica in -`generated_comment`**. Le due azioni inverse presenti sulle colonne copiano invece il nome -originale nel nome espanso e viceversa. Non risultano proposal, versioni, diff o workflow di -approvazione: aggiungerli non sarebbe parità con ThothAI. - -La parità deve essere di capacità e comportamento utile, non dei difetti del legacy. In -particolare non vanno replicate esportazioni di password, SQL costruito con identificatori non -quotati, job in thread daemon, incoerenze CSV e azioni admin non funzionanti. - -## 1. Modello dati legacy - -### Database - -`SqlDb` contiene: - -- identità e connessione (`name`, host, tipo motore, nome database, porta, schema, utente e - password); -- configurazione SSH e ambiente (`dev`, `test`, `prod`); -- lingua per database, scope testuale e JSON, ERD Mermaid, direttive e report GDPR; -- stato e log separati per generazione commenti tabella/colonna, introspezione, scope, ERD, - documentazione e GDPR. - -Evidenze: `/Thoth/ThothAI/backend/thoth_core/models.py:298-350`, -`/Thoth/ThothAI/backend/thoth_core/models.py:355-439`. - -I motori dichiarati sono sette: Informix, MariaDB, MySQL, Oracle, PostgreSQL, SQL Server e -SQLite (`/Thoth/ThothAI/backend/thoth_core/models.py:116-123`). - -Il modello `Workspace` collega un solo `SqlDb`; contiene inoltre configurazioni degli agenti e -duplica parte degli stati operativi (`/Thoth/ThothAI/backend/thoth_core/models.py:731-754`, -`/Thoth/ThothAI/backend/thoth_core/models.py:847-877`). - -### Tabelle e colonne - -`SqlTable` contiene nome, descrizione canonica, commento generato e riferimento al database -(`/Thoth/ThothAI/backend/thoth_core/models.py:454-465`). - -`SqlColumn` contiene nome originale, nome espanso, formato dati normalizzato, descrizione -canonica, commento generato, descrizione dei valori e indicazioni PK/FK testuali -(`/Thoth/ThothAI/backend/thoth_core/models.py:468-485`). - -La cancellazione usa le cascade Django: database → tabelle → colonne e relazioni. Nei modelli -non sono definite unicità composte per database/tabella/colonna. Ogni database ha un solo -campo `schema`; tabelle e colonne non portano una propria identità di schema. Questi limiti -non devono diventare vincoli del nuovo catalogo. - -### Relazioni - -`Relationship` collega tabella e colonna sorgente a tabella e colonna destinazione -(`/Thoth/ThothAI/backend/thoth_core/models.py:488-503`). Il metodo -`update_pk_fk_fields` ricostruisce stringhe descrittive PK/FK sulle colonne coinvolte -(`/Thoth/ThothAI/backend/thoth_core/models.py:505-526`). - -Il form admin verifica che le due tabelle appartengano allo stesso database e che ogni colonna -appartenga alla tabella selezionata -(`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_relationship.py:19-165`). - -Per ThothII occorre distinguere: - -- struttura fisica importata dal database, da trattare come inventario non modificabile; -- descrizioni e metadati semantici, modificabili con CRUD completo; -- relazioni logiche aggiunte dall'utente, modificabili con CRUD completo. - -Questa separazione conserva le capacità utili del legacy senza permettere che la UI alteri o -falsifichi accidentalmente lo schema fisico osservato. - -## 2. Capacità esposte dal Django Admin - -La registrazione degli admin fornisce il CRUD Django standard per database, tabelle, colonne e -relazioni (`/Thoth/ThothAI/backend/thoth_core/admin.py:13-24`). Oltre al CRUD, le azioni -specifiche sono le seguenti. - -### Database - -L'admin di `SqlDb` espone: - -- export/import CSV; -- scansione delle tabelle, creazione delle relazioni e introspezione completa; -- validazione FK e inferenza di relazioni candidate; -- test della connessione; -- duplicazione della configurazione; -- generazione commenti AI per tabelle e colonne; -- generazione sincrona o asincrona di scope, ERD e documentazione; -- report GDPR; -- export della struttura e script SQL dei commenti. - -Evidenza: `/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqldb.py:237-274`. - -I campi di configurazione, contenuto e stato sono esposti in fieldset distinti -(`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqldb.py:275-462`). In ThothII i segreti di -connessione non devono essere campi ordinari del catalogo né essere restituiti dalle API di -gestione metadati. - -### Tabelle - -L'admin delle tabelle permette export/import CSV, introspezione colonne, validazione e pulizia -PK/FK, copia del commento AI nella descrizione, generazione commenti sincrona/asincrona e -download dello script SQL (`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqltable.py:133-150`). - -L'azione di applicazione AI opera solo sulle righe selezionate, ignora commenti generati vuoti -e sovrascrive direttamente `description` -(`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqltable.py:165-190`). - -### Colonne - -L'admin delle colonne permette export/import CSV, copia del commento AI nella descrizione, -copia bidirezionale fra nome originale e nome espanso, validazione FK e generazione AI sulle -colonne selezionate (`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqlcolumn.py:167-196`). - -L'applicazione AI sovrascrive `column_description` soltanto per le colonne selezionate con -`generated_comment` valorizzato -(`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqlcolumn.py:219-245`). Le azioni inverse riguardano -esclusivamente i due campi nome -(`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqlcolumn.py:247-261`). - -### Relazioni - -L'admin delle relazioni offre il CRUD standard, filtri e ricerca, export/import e dichiara -un'azione per aggiornare i campi PK/FK -(`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_relationship.py:219-245`). L'ultima azione è però un -difetto: `RelationshipAdmin` non implementa il metodo dichiarato; esiste soltanto il metodo -statico sul model. La capacità da conservare è la ricostruzione coerente degli indicatori, non -l'azione admin rotta. - -## 3. Introspezione e riconciliazione dello schema - -Il factory del database manager associa i sette motori ai rispettivi adapter e gestisce anche -il tunnel SSH (`/Thoth/ThothAI/backend/thoth_core/dbmanagement.py:77-227`). - -L'introspezione legacy: - -- riduce i tipi nativi a un insieme generico limitato, con fallback `VARCHAR` - (`/Thoth/ThothAI/backend/thoth_core/dbmanagement.py:237-266`); -- legge e crea le colonne mancanti, ma non aggiorna tipo o commento di quelle già note - (`/Thoth/ThothAI/backend/thoth_core/dbmanagement.py:269-351`); -- crea le tabelle mancanti e aggiorna la descrizione di quelle esistenti - (`/Thoth/ThothAI/backend/thoth_core/dbmanagement.py:431-481`); -- legge le foreign key fisiche, crea al bisogno colonne mancanti e crea relazioni assenti - (`/Thoth/ThothAI/backend/thoth_core/dbmanagement.py:484-641`); -- esegue l'intero processo nell'ordine tabelle → colonne → relazioni - (`/Thoth/ThothAI/backend/thoth_core/dbmanagement.py:718-891`). - -Il comportamento è additivo: gli oggetti scomparsi dal database sorgente non sono eliminati o -marcati come obsoleti. Per ThothII la capacità richiesta è una scansione completa e -riconciliabile, con provenienza, data dell'osservazione e stato degli oggetti rimossi o cambiati; -non la semantica incompleta del refresh legacy. - -L'inferenza di relazioni candidate combina convenzioni sui nomi, individuazione euristica delle -PK e campionamento dei valori, con soglia di corrispondenza del 70% -(`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqldb.py:605-801`). Deve rimanere una proposta -esplicita da convalidare, non essere confusa con una foreign key fisica. - -## 4. Generazione AI delle descrizioni - -### Tabelle - -La generazione procede in batch da dieci, utilizza lingua e contesto del database, schema -osservato, descrizioni disponibili e fino a cinque righe di esempio; il risultato JSON aggiorna -soltanto `table.generated_comment` -(`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/create_table_comments.py:181-267`, -`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/create_table_comments.py:269-482`). - -### Colonne - -La generazione usa contesto della tabella, nomi delle colonne selezionate ed esempi reali, e -scrive soltanto `column.generated_comment` -(`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/create_column_comments.py:185-280`, -`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/create_column_comments.py:283-487`). - -Provider e modello AI provengono dalla configurazione globale del backend; la lingua è invece -per database (`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/comment_generation_utils.py:156-219`). - -### Comportamento di parità proposto il 2026-08-23 - -Il contratto funzionale minimo è esattamente questo: - -- due campi per elemento: descrizione canonica e commento generato; -- comando AI su elementi selezionati o su un insieme più ampio esplicitamente scelto; -- scrittura/sovrascrittura del solo commento generato; -- azione separata, su selezione dell'utente, che copia il generato nel canonico; -- nessuna proposta persistente aggiuntiva, diff obbligatorio, approvazione multilivello o - versionamento del testo. - -Non è stata trovata una copia `descrizione → commento generato`. Se si desiderasse in futuro, -sarebbe una nuova capacità, non parità legacy. - -## 5. Scope, Mermaid e documentazione - -### Scope - -La generazione dello scope raccoglie nomi e descrizioni di tabelle e colonne, nome e lingua del -database, richiede JSON al modello e persiste sia il JSON sia una resa Markdown. Se il JSON non -è valido conserva il testo grezzo e svuota `scope_json` -(`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/create_db_scope.py:25-163`). - -### ERD Mermaid - -L'ERD è prodotto dall'AI usando tabelle, colonne, PK/FK e relazioni. Il codice estrae un blocco -Mermaid oppure usa la risposta grezza e la salva in `SqlDb.erd`, senza una validazione -sintattica o semantica preventiva -(`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/generate_db_erd.py:18-145`). - -Il rendering attivo usa un servizio Mermaid locale: health check, POST a `/svg` o `/png`, -timeout e file temporanei -(`/Thoth/ThothAI/backend/thoth_ai_backend/mermaid_utils.py:29-72`, -`/Thoth/ThothAI/backend/thoth_ai_backend/mermaid_utils.py:281-464`). Il servizio Express espone -`/health`, `/svg` e `/png` ed applica un limite al body -(`/Thoth/ThothAI/docker/mermaid-service/src/server.js:13-23`, -`/Thoth/ThothAI/docker/mermaid-service/src/server.js:70-115`). È distribuito come servizio -Compose autonomo con health check -(`/Thoth/ThothAI/docker-compose.yml:184-201`). - -La vista ERD renderizza il Mermaid memorizzato in SVG tramite tale servizio e poi elimina il -file temporaneo (`/Thoth/ThothAI/backend/thoth_ai_backend/views.py:227-288`). - -### Documento del database - -La documentazione HTML combina scope, relazioni, tabelle e colonne. Per le descrizioni usa il -campo canonico e, quando vuoto, il commento generato -(`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/generate_db_documentation.py:35-188`). - -Il processo di generazione chiede all'AI il diagramma Mermaid, lo salva nell'ERD e costruisce -deterministicamente l'HTML corrente; l'HTML generato non incorpora il diagramma -(`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/generate_db_documentation.py:767-922`). La UI espone il -documento del database del workspace corrente e le route per HTML/PDF ed ERD/PDF -(`/Thoth/ThothAI/backend/thoth_ai_backend/views.py:86-179`, -`/Thoth/ThothAI/backend/thoth_ai_backend/urls.py:179-188`). - -Per la parità ThothII servono quindi contenuto documentale strutturato, sorgente Mermaid -persistita e rendering locale. La validazione Mermaid prima della pubblicazione è una -correzione necessaria, non un cambiamento di scopo. - -## 6. Export e comandi operativi - -Le capacità utili rilevate sono: - -- CSV di tabelle e colonne selezionate - (`/Thoth/ThothAI/backend/thoth_core/utilities/utils.py:150-195`); -- export CSV generico dei modelli e della struttura completa - (`/Thoth/ThothAI/backend/thoth_core/utilities/utils.py:198-261`, - `/Thoth/ThothAI/backend/thoth_core/utilities/utils.py:399-569`); -- script SQL dei commenti per PostgreSQL, SQL Server, MySQL e MariaDB - (`/Thoth/ThothAI/backend/thoth_core/admin_utils/sql_comment_script.py:25-316`); -- comandi `generate_scope` e `generate_documentation`, indirizzabili per workspace, database o - tutti i database (`/Thoth/ThothAI/backend/thoth_core/management/commands/generate_scope.py:12-89`, - `/Thoth/ThothAI/backend/thoth_core/management/commands/generate_documentation.py:12-89`); -- export globale e per workspace - (`/Thoth/ThothAI/backend/thoth_core/management/commands/export_models.py:19-64`, - `/Thoth/ThothAI/backend/thoth_core/management/commands/export_workspace.py:19-96`); -- aggiornamento delle descrizioni colonna da CSV per workspace - (`/Thoth/ThothAI/backend/thoth_ai_backend/management/commands/update_column_descriptions.py:24-92`). - -I comandi di importazione dalla produzione legacy sono deliberatamente esclusi da questo -inventario di parità: costituiscono un progetto CLI `tht` separato, con mapping, validazione e -cutover propri. - -## 7. Esecuzioni asincrone e stato - -Scope, ERD, documentazione e commenti possono essere lanciati in background. Il legacy crea -thread daemon e memorizza task id, stato e log sui modelli -(`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/async_scope.py:21-62`, -`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/async_erd.py:21-30`, -`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/async_documentation.py:21-30`, -`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/async_table_comments.py:39-87`). - -La capacità da mantenere è: operazione lunga non bloccante, esclusione di esecuzioni -confliggenti, stato osservabile e log. Il meccanismo daemon non è durevole, non permette -recovery o cancellazione e non deve essere replicato letteralmente. - -## 8. Difetti e comportamenti da non replicare - -| Area | Evidenza legacy | Decisione di parità | -|---|---|---| -| Segreti negli export | L'export struttura include `password` in chiaro (`/Thoth/ThothAI/backend/thoth_core/utilities/utils.py:516-559`); l'export generico serializza tutti i campi (`/Thoth/ThothAI/backend/thoth_core/management/commands/export_models.py:19-64`). | Escludere sempre credenziali e segreti. | -| SQL euristico | Il campionamento per inferire FK interpola identificatori senza quoting e usa query costruite come stringhe (`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqldb.py:697-750`). | Usare adapter sicuri, quoting per dialetto e query read-only con limiti. | -| Refresh incompleto | L'introspezione aggiunge oggetti ma non riconcilia rimozioni e non aggiorna tutte le proprietà (`/Thoth/ThothAI/backend/thoth_core/dbmanagement.py:318-351`, `/Thoth/ThothAI/backend/thoth_core/dbmanagement.py:459-481`). | Scansioni versionate e stato drift/removed. | -| Relazioni denormalizzate | L'aggiornamento ricostruisce stringhe PK/FK solo sulle colonne partecipanti e non ripulisce esplicitamente valori obsoleti (`/Thoth/ThothAI/backend/thoth_core/models.py:505-526`). | Derivare indicatori dalle relazioni correnti. | -| Azione relazione rotta | L'admin dichiara `update_pk_fk_fields` ma non lo implementa (`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_relationship.py:219-245`). | Esporre un comando applicativo testato. | -| CSV colonne incoerente | L'header ha sei colonne, le righe ne emettono otto incluse PK/FK (`/Thoth/ThothAI/backend/thoth_core/utilities/utils.py:165-195`). | Contratto CSV versionato e testato. | -| Comando export rotto | `export_single_model` usa l'app label `toth_be` e un attributo non definito (`/Thoth/ThothAI/backend/thoth_core/management/commands/export_single_model.py:19-67`). | Non portare il comando; sostituirlo con export catalogo coerente. | -| Batch AI colonne | Un batch usa la prima tabella selezionata come contesto per tutte le colonne (`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/create_column_comments.py:230-268`). | Raggruppare sempre per database e tabella. | -| Contesto AI tabelle | Il fallback al commento generato è calcolato ma non incluso nel dataframe finale (`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/create_table_comments.py:485-525`). | Costruire il contesto dal valore effettivamente visibile. | -| Duplicazione DB | Duplica configurazione e vector DB, azzerando soltanto una data di aggiornamento (`/Thoth/ThothAI/backend/thoth_core/admin_models/admin_sqldb.py:514-569`). | Se mantenuta, duplicare soltanto metadati esplicitamente scelti, mai segreti o stati. | -| Scope non JSON | Il generatore intercetta internamente il JSON non valido, mentre l'azione può comunque mostrare successo (`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/create_db_scope.py:92-192`). | Stato `failed` o `needs_review`, senza falso successo. | -| Mermaid non validato | La risposta AI viene salvata dopo la sola estrazione del blocco (`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/generate_db_erd.py:88-121`). | Validare prima di pubblicare e conservare l'errore di rendering. | -| HTML non escapato | I valori descrittivi sono interpolati direttamente nell'HTML (`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/generate_db_documentation.py:35-188`). | Escape/sanitizzazione obbligatori. | -| Job daemon | I task sono thread in-process (`/Thoth/ThothAI/backend/thoth_core/thoth_ai/thoth_workflow/async_scope.py:21-62`). | Esecuzione durevole o almeno recuperabile, con idempotenza. | -| Script MySQL | I commenti colonna usano `ALTER ... MODIFY COLUMN` basandosi sul tipo normalizzato (`/Thoth/ThothAI/backend/thoth_core/admin_utils/sql_comment_script.py:244-316`). | Generare solo con tipo nativo completo oppure bloccare l'export rischioso. | - -Il modulo contiene anche un helper verso `mermaid.ink`, ma non risultano call site nel tree -legacy; il percorso attivo è il servizio locale. Non va quindi considerata una dipendenza -funzionale da conservare. - -## 9. Baseline di parità proposta il 2026-08-23 - -### Necessario - -- database gestiti derivati dalla configurazione dei workspace; -- inventario completo del database, anche oltre il sottoinsieme usato dal workflow core; -- scansione di tabelle, colonne, chiavi e relazioni fisiche con drift osservabile; -- descrizioni canoniche e commenti AI separati per tabelle e colonne; -- generazione AI selettiva e copia selettiva AI → descrizione, senza workflow aggiuntivo; -- CRUD dei metadati semantici e delle relazioni logiche; -- scope strutturato, documento generale strutturato ed ERD Mermaid; -- servizio locale per validazione/rendering Mermaid in SVG/PNG/PDF; -- test connessione, inferenza/validazione delle relazioni e operazioni lunghe con stato/log; -- export CSV sicuro e script SQL commenti solo quando il dialetto può essere ricostruito senza - perdita; -- API e UI dedicate, separate dal workflow NL→SQL; -- pubblicazione esplicita e controllata del sottoinsieme utile al core/Qdrant. - -### Estensione, non requisito di parità iniziale - -- analisi e report GDPR; -- importazione dei dati da installazioni ThothAI in produzione, da progettare come iniziativa - CLI `tht` separata. - -### Esplicitamente escluso - -- replica del Django Admin o del suo modello di permessi implicito; -- modifica manuale della struttura fisica osservata; -- memorizzazione o export di password nel catalogo; -- dipendenza del workflow SQL dalla disponibilità della nuova UI; -- proposal/versioning/diff per i commenti AI; -- copia descrizione → commento AI, non presente nelle fonti; -- difetti tecnici e comportamenti insicuri elencati sopra. - -## Conclusione - -ThothAI fornisce già il perimetro funzionale di un catalogo metadati, ma lo realizza mescolando -configurazione di connessione, inventario fisico, contenuti semantici, job e UI nel modello -Django. ThothII può raggiungere la parità separando questi aspetti e mantenendo invariato il -workflow SQL: il catalogo gestisce l'intero database, mentre il core continua a consumare -soltanto il sottoinsieme dichiarato dal workspace e pubblicato nel proprio indice Qdrant. - -La regola di Q6 è semplice e verificata nelle fonti: generazione nel campo AI, selezione -esplicita dell'utente, copia nel campo canonico. Ogni meccanismo ulteriore sarebbe una nuova -funzionalità e non è necessario per la parità. diff --git a/docs/research/2026-08-23-postgresql-catalog-deployment-constraints.md b/docs/research/2026-08-23-postgresql-catalog-deployment-constraints.md deleted file mode 100644 index 698bfb45..00000000 --- a/docs/research/2026-08-23-postgresql-catalog-deployment-constraints.md +++ /dev/null @@ -1,206 +0,0 @@ -# PostgreSQL deployment and failure-isolation constraints for the Metadata Catalog - -Original research: 2026-08-23 - -Last verified against the repository: 2026-08-31 - -Issue: [#8 — Assess PostgreSQL deployment and failure-isolation constraints](https://git.tylconsulting.it/mptyl/ThothII/issues/8) - -> **Status: partially superseded by ADR-0004.** This is historical research, not the current -> architecture contract. The recommendation to run a separate `catalog-api` process was rejected -> by [ADR-0004](../adr/0004-fastify-kysely-metadata-catalog.md). Operational constraints that do -> not depend on that process boundary remain useful, but the status table below is authoritative -> for what the 2026-08-31 code actually adopts, rejects, or leaves pending. - -## Question - -How can a Metadata Catalog PostgreSQL service be deployed, backed up, diagnosed, and made -non-blocking for the NL→SQL workflow across local and server installations? - -## Current decision and implementation - -[ADR-0001](../adr/0001-postgres-metadata-catalog.md) selects PostgreSQL as the catalog authority. -[ADR-0003](../adr/0003-installation-local-database-bindings.md) keeps database bindings -installation-local. [ADR-0004](../adr/0004-fastify-kysely-metadata-catalog.md) then places the -catalog in the existing Fastify backend as an isolated Kysely module rather than a microservice. - -The implemented dependency graph is therefore: - -```mermaid -flowchart LR - UI[Frontend] - Core[Core: Fastify workflow and catalog modules] - Pi[Pi and tht workflow] - PG[(catalog-db PostgreSQL)] - Semantic[Qdrant and embedding] - - UI --> Core - Core --> Pi - Core --> PG - Core --> Semantic -``` - -The catalog module is isolated behind a repository interface, but it is not process-isolated. -`core` owns the catalog pool and Compose waits for `catalog-db` health before starting `core` -(`compose.yaml`, `backend/src/app.ts`, `backend/src/catalog/repository.ts`). Database-management records still do -not feed the NL→SQL handoff, so a running workflow does not read catalog rows; that cutover remains -future work (`PROJECT_STATE.md`). - -## Verification result - -| Area | Status on 2026-08-31 | Evidence and consequence | -| --- | --- | --- | -| PostgreSQL as canonical catalog store | **Adopted** | ADR-0001 is implemented by the PostgreSQL-backed Kysely repository and the internal `catalog-db` service. | -| One Workspace Database per workspace and installation-local bindings | **Adopted** | ADR-0003 and the catalog migrations enforce the model; workspace identity remains in the workspace registry. | -| Separate `catalog-api` process | **Superseded/rejected** | ADR-0004 explicitly chooses an isolated module inside the existing Fastify process. There is no catalog microservice or separate catalog liveness endpoint. | -| No catalog pool, credential, or Compose dependency in `core` | **Superseded/rejected** | `core` owns the runtime pool, receives the runtime password secret, and declares `depends_on: catalog-db: service_healthy`. The old process-level isolation acceptance criterion is not current architecture. | -| Private PostgreSQL service and durable volume | **Adopted** | `catalog-db` uses a version-and-digest-pinned PostgreSQL 17.6 image, the private `thothii` network, no published host port, a `pg_isready`-based healthcheck, and `catalog-data`. Compose contract tests assert this topology (`scripts/test-default-compose.sh`). | -| Different local and server database topology | **Superseded/rejected** | Both current profiles inherit the same internal `catalog-db` and named volume. `deploy/compose.server.yaml` does not replace it with an operator-provided endpoint. | -| Runtime and migrator role separation | **Adopted** | `core` receives only `thothii_catalog_runtime`; the profile-gated `catalog-migrate` job receives only `thothii_catalog_migrate`. Bootstrap grants runtime DML/sequence privileges without DDL (`docker/catalog-db-init.sql`). | -| Dedicated backup role | **Pending** | There is no `catalog_backup` role or backup secret. | -| Explicit one-shot migrations | **Adopted** | `backend/src/catalog/migrate.ts` registers ordered Kysely migrations and uses a pool of one. `scripts/run-stack.sh` starts PostgreSQL and runs `catalog-migrate` before local startup; migrations are not hidden in backend startup. | -| Checksums, drift/pending refusal, and migration readiness | **Pending** | No repository-owned checksum policy, drift report, or readiness gate exists for catalog migrations. The backend can start without checking the Kysely migration head when launched outside the local helper. | -| Bounded runtime connection pool | **Adopted** | `backend/src/catalog/repository.ts` sets `max: 5` and `connectionTimeoutMillis: 3000`, and closes Kysely with the Fastify lifecycle. | -| `lock_timeout`, `statement_timeout`, and catalog TLS policy | **Pending** | The runtime pool does not set query or lock timeouts. Catalog connection configuration has no explicit CA/hostname-verification contract; the server profile still uses the private Compose network. | -| Process liveness independent of catalog queries | **Adopted** | `GET /health` returns `{status: "ok"}` without probing PostgreSQL, and `backend/test/health.test.ts` preserves that behavior. `/catalog/status` performs the catalog-specific availability check. | -| Stack startup independent of catalog availability | **Superseded/rejected** | Compose blocks `core` on healthy `catalog-db`. The host service health fold does not list `catalog-db`, but it cannot make `core` start while its Compose dependency is unhealthy. | -| Uniform catalog-outage response (`503` plus `Retry-After`) | **Pending** | Routes map the domain `CatalogUnavailableError` to a sanitized `503`, and an omitted catalog configuration uses an unavailable repository. PostgreSQL driver failures are not uniformly translated to that domain error, and no `Retry-After` contract is implemented. | -| Catalog-specific readiness and `tht doctor` checks | **Pending** | There is no `/health/ready` for the catalog and no doctor section for connection, migration head, pool saturation, backup age, or publication lag (`tools/tht/internal/doctor/report.go`). | -| Logical catalog backup and restore | **Pending** | Current backup archives omit `catalog-data` and do not run `pg_dump`; server archives include only Qdrant and embedding volumes. A backup can therefore succeed without preserving the Metadata Catalog (`tools/tht/internal/backup/create.go`). | -| Last-good Publication and catalog-to-Qdrant cutover | **Pending** | The current database-management slice does not change the NL→SQL runtime or publish catalog metadata to Qdrant. | - -## Current operational contract - -### Deployment and credentials - -- Local and server Compose profiles currently use the same installation-owned `catalog-db` - container and `catalog-data` named volume. PostgreSQL is private to the Compose network. -- The database bootstrap login is the migrator. The init script creates the separate runtime login - from a Docker secret and grants only runtime DML and sequence access. -- Runtime and migrator passwords are separate protected host files exposed as separate Docker - secrets. Neither value belongs in tracked environment files - (`deploy/env/local.env.example`, `deploy/env/server.env.example`). -- The Fastify catalog repository uses a five-connection pool with a three-second connection - timeout. Fastify closes the repository pool during shutdown. - -### Migrations - -The compiled `catalog-migrate` entry point owns schema changes and uses the migrator credential. -The current ordered series is under -`backend/src/catalog/migrations/`. The local launcher runs -it before the normal stack, while production rollout must invoke the profile-gated service -explicitly. - -This is weaker than the original recommendation in two ways: there is no catalog readiness check -for pending or unknown migrations, and the repository does not maintain content checksums for -migration drift. Until those checks exist, “the migrator completed” is the available deployment -gate; the application itself does not prove migration compatibility. - -### Failure behavior actually provided - -| Failure | Current catalog behavior | Current workflow behavior | -| --- | --- | --- | -| Catalog configuration omitted when launching the backend directly | Fastify uses `UnavailableCatalogRepository`; `/catalog/status` reports unavailable and domain-mapped catalog operations return sanitized `503` | `/health`, sessions, and SSE remain available | -| `catalog-db` unhealthy before Compose startup | `core` is not started because its dependency is not healthy | Workflow startup is blocked | -| PostgreSQL becomes unavailable after startup | `/health` remains process-only and `/catalog/status` reports unavailable; route errors are sanitized, but a uniform `503`/`Retry-After` mapping is not guaranteed | Existing session code does not read catalog rows, but both surfaces still share one Fastify process | -| Migrations are pending or incompatible | No dedicated readiness refusal exists; affected catalog operations fail | No catalog-to-workflow handoff exists yet, but local deployment correctness depends on running `catalog-migrate` first | -| Catalog backup is requested through current `tht backup` | No PostgreSQL dump is added and `catalog-data` is omitted | The archive may succeed while being unable to restore catalog state | - -The shared process means resource exhaustion, fatal process errors, and startup hooks remain a -common failure domain even though repository calls are separated. Conversely, placing the module -inside Fastify does not require workflow code to consume catalog rows: preserving that data-flow -boundary is still the useful part of the original isolation recommendation. - -## Historical recommendations that remain valid backlog - -The following constraints survive ADR-0004 because they can be implemented inside the current -Fastify deployment: - -1. **Bound every database operation.** Keep the adopted pool and connection timeout; add explicit - request query and lock timeouts. Long model calls and source sampling must not hold catalog - transactions. -2. **Make failures component-specific.** Translate connection, timeout, and pool-exhaustion errors - into one sanitized catalog-unavailable response, add bounded retry guidance, and keep `/health` - process-only. -3. **Make migration compatibility observable.** Report applied, pending, unknown, and drifted - migrations through a catalog readiness check and `tht doctor`; do not put migrator credentials - in `core`. -4. **Define a server TLS topology before externalizing PostgreSQL.** If the server profile moves to - an operator-provided endpoint, use a dedicated database and roles, protected CA material, and - hostname verification. Sharing a cluster leaves connection, maintenance, WAL, and storage blast - radius even when schemas are separate. PostgreSQL documents the relevant connection and TLS - parameters in its - [connection parameter reference](https://www.postgresql.org/docs/current/libpq-connect.html). -5. **Keep derived semantic data non-canonical.** When catalog publication is implemented, activate - complete immutable revisions and retain the last successfully activated revision rather than - exposing mutable catalog rows to the workflow. - -## Backup and restore target - -The original logical-backup recommendation is still valid and is now a confirmed implementation -gap. - -### Backup - -Extend `tht backup create` with a catalog step that runs `pg_dump --format=custom` through a -one-shot helper and adds the dump plus checksum to the installation manifest. Do not treat a tar of -a live data volume as a PostgreSQL consistency contract. PostgreSQL documents that `pg_dump` -creates a consistent export while the database remains in use and that custom format supports -selective restore ([`pg_dump`](https://www.postgresql.org/docs/current/app-pgdump.html)). - -Use a dedicated least-privilege backup role, never write dumps into a workspace repository, and -record at least the server version, migration head, checksum, creation time, and catalog revision -identifiers. A filesystem/Qdrant archive with a failed or absent catalog dump must be reported as -incomplete. - -### Restore - -Restore only through an explicit maintenance operation into an empty or deliberately cleaned -target. Validate the archive checksum, run `pg_restore --exit-on-error --single-transaction`, then -verify migration compatibility, referential integrity, bounded entity counts, and an authenticated -catalog smoke test. The controls are documented by PostgreSQL -([`pg_restore`](https://www.postgresql.org/docs/current/app-pgrestore.html)). Keep the old database -until validation passes; rollback should switch the endpoint or retained volume, not dual-write. - -## Diagnostics target - -- Keep the shared `GET /health` endpoint process-only. -- Treat `/catalog/status` as the current minimal availability surface; add a bounded catalog - readiness check covering connection and migration compatibility before using it as a rollout - gate. -- Add read-only `tht doctor` checks for secret-file presence and permissions, PostgreSQL - reachability, authentication, migration state, pool saturation, and last successful catalog - backup. Sanitize all DSNs and errors. -- Use `pg_isready` only for server transport readiness. Its result does not prove schema or runtime - authorization correctness - ([`pg_isready`](https://www.postgresql.org/docs/current/app-pg-isready.html)). -- Add structured metrics for connection acquisition failures, pool use, query/lock timeout, - migration head, background-job backlog, and backup age. Do not log connection strings, source - samples, prompts, or generated descriptions at info level. - -## Recommended closure criteria - -1. Decide whether ADR-0004's statement that catalog unavailability does not make sessions or SSE - unavailable must also hold at Compose startup. If yes, remove or soften the hard `core` → - `catalog-db` startup dependency without reintroducing a microservice. -2. Prove a configured PostgreSQL outage produces the same sanitized catalog response across every - catalog route while `/health`, session creation, and SSE continue to work. -3. Add catalog migration compatibility to readiness and `tht doctor`, including pending, unknown, - and drifted states. -4. Add a real `pg_dump`/`pg_restore` round-trip to local and server backup tests, and fail backup - publication when the catalog dump is absent or fails. -5. Before enabling a remote server catalog, define TLS verification, credential files, connection - limits, and the accepted cluster-level blast radius. -6. Before the NL→SQL cutover, define and test an immutable last-good Publication boundary; do not - dual-read mutable PostgreSQL rows and legacy metadata as competing authorities. - -## Decision summary - -PostgreSQL, installation-local bindings, private deployment, role separation, one-shot migrations, -bounded pooling, and process-only liveness are implemented. The separate `catalog-api` process and -the claim that `core` has no catalog dependency are not current design: ADR-0004 chose the existing -Fastify process, and Compose currently blocks `core` startup on `catalog-db` health. Logical -backup/restore, catalog migration readiness and drift detection, consistent outage mapping, -catalog-specific doctor checks, server TLS/external topology, and last-good publication remain -pending. Those open constraints should be treated as backlog, not as capabilities already provided -by the repository. diff --git a/docs/research/2026-08-23-thothii-metadata-publication-qdrant-seams.md b/docs/research/2026-08-23-thothii-metadata-publication-qdrant-seams.md deleted file mode 100644 index 5097b522..00000000 --- a/docs/research/2026-08-23-thothii-metadata-publication-qdrant-seams.md +++ /dev/null @@ -1,301 +0,0 @@ -# ThothII metadata publication and Qdrant revision seams - -**Research question:** Which existing workspace, snapshot, preprocessing, Qdrant, -session-pinning, and runtime read-only contracts constrain metadata publication without changing -the NL→SQL workflow? - -**Last verified:** 2026-08-31 - -**Validity:** Active architectural research; the catalog-to-core integration described below is -still **deferred**, not implemented. - -**Current authorities:** `PROJECT_STATE.md`, -[`workspace-evidence-v3.md`](../contracts/workspace-evidence-v3.md), -[`workspace-preprocessing-cli.md`](../contracts/workspace-preprocessing-cli.md), -[`tht-dwh.md`](../contracts/tht-dwh.md), -[`ADR-0001`](../adr/0001-postgres-metadata-catalog.md), and -[`ADR-0004`](../adr/0004-fastify-kysely-metadata-catalog.md). These sources and current code -override this research note if they diverge. - -## Revalidation against the current implementation - -| Finding | Status on 2026-08-31 | Current evidence and consequence | -| --- | --- | --- | -| PostgreSQL metadata authority in the existing Fastify backend | **Adopted/current** | ADR-0001 and ADR-0004 are implemented; the catalog is the management-plane authority. | -| Git workspace revision, immutable registry snapshot, and revision-pinned runtime | **Adopted/current** | Registry activation and the Workspace Evidence v3 contract still provide the publication boundary for runtime-owned files. | -| Qdrant read isolation for schema and Evidence by `workspace_id` + `workspace_revision` | **Adopted/current** | `QdrantVectorStore.search()` applies `_revision_filter()` to schema/Evidence; Memory and solved questions intentionally remain workspace-wide (`harness/tht/adapters/vector/qdrant.py`). | -| Physical schema as a file in the Git publication | **Superseded clarification** | `physical.yaml` is owned by the immutable `.tht-dwh` generation selected by `ACTIVE`, not by the Git workspace revision ([DWH contract](../contracts/tht-dwh.md)). Git currently supplies the revision-pinned curated `schema/annotations.yaml`. | -| Catalog-to-core publisher | **Open/deferred** | No current route or service projects catalog records into core artifacts. `PROJECT_STATE.md` explicitly defers the schema-linking integration (`PROJECT_STATE.md:160-171`). | -| Explicit Core Schema Selection | **Open/deferred** | The workspace descriptor selects one database and one physical schema, but has no table/column allowlist (`backend/src/workspaces/schema.ts`); no catalog selection is handed to `tht`. | -| Cross-revision hash lookup used by schema synchronization | **Open defect** | Reads are revision-filtered, but `existing_hashes()` is not. A same-key/same-content point from an older revision can suppress the required upsert into the new revision (`harness/tht/adapters/vector/qdrant.py`, `harness/tht/cli/vector_cmd.py`). | -| Deletion/GC | **Current for Evidence; open for schema** | Evidence has generation inventory, retention, compensation, and exact-generation deletion. `sync_canonical_records()` never deletes schema records absent from the new canonical set, and no revision-retention GC exists for schema points. | -| Annotation consumption | **Current but incomplete** | M-Schema rendering and schema embeddings consume `Annotations`; `tht schema columns` still returns only physical comments, so F4 does not display annotation descriptions (`harness/tht/cli/schema_cmd.py`, `harness/.pi/extensions/tht-gate.js`). | - -## Conclusion - -The lowest-impact **proposed** publication seam is not a new writer inside the NL→SQL workflow and -is not a direct CRUD-to-Qdrant path. The existing core consumes an introspected `PhysicalSchema` -from the active immutable DWH generation and a curated, Git-revision-pinned `Annotations` -document. A future explicit publication operation should project the approved catalog subset into -a new Core Schema Selection contract and the curated annotations, activate a new immutable Git -revision, and then invoke the existing `workspace index-schema` preprocessing operation. Qdrant -remains a derived, rebuildable projection. None of this catalog-to-core handoff exists yet; -`PROJECT_STATE.md:160-164` deliberately defers it to the next design -gate. - -The proposed flow would preserve the existing runtime path: - -```text -approved catalog data - -> explicit Core Schema Selection + curated annotations projection (future) - -> workspace Git revision (annotations and selection contract; physical.yaml stays DWH-owned) - -> immutable registry snapshot - -> revision-bound runtime configuration - -> existing tht vector index-schema - -> Qdrant records filtered by workspace_id + workspace_revision - -> existing retrieval_pack / schema render / F4 review -``` - -The complete database inventory remains in the Metadata Catalog. Only an explicit Core Schema -Selection and approved semantic fields should be projected into the artifacts used by the SQL -workflow. ThothII does not currently model or publish that table/column-level selection, so both -the projection contract and its operational publisher are new work. - -## 1. Current authority and publication boundary - -The workspace descriptor identifies one PostgreSQL database and one physical schema, plus one -workspace-owned Qdrant collection; it has no table or column allowlist -(`backend/src/workspaces/schema.ts`). -Consequently, a full-database metadata catalog and the subset eligible for the SQL core cannot be -represented as the same current descriptor object. - -The existing public contract makes the Git workspace repository curator-owned. Changes occur in a -separate authoring clone followed by installation pull, and the API does not write workspace, -schema, or Evidence paths -([Workspace Evidence v3 contract](../contracts/workspace-evidence-v3.md)). -Therefore a browser CRUD service cannot silently make its PostgreSQL state authoritative for the -core without either: - -1. exporting/committing a deterministic workspace projection through the existing curator flow; - or -2. deliberately replacing this Git-authority contract. - -The first option preserves current architecture and session reproducibility. - -Registry activation validates every descriptor at one exact commit, validates and synchronizes -the commit's `schema/annotations.yaml`, and rejects duplicate ownership of a Qdrant collection -(`backend/src/workspaces/registry.ts`, -`backend/src/workspaces/git-repository.ts`, -`backend/src/workspaces/annotations-sync.ts`). -It writes the candidate snapshot into a staging directory, records file digests in -`snapshot.json`, atomically renames the directory, and only then moves active state -(`backend/src/workspaces/registry.ts`). -That is the existing atomic publication boundary to reuse. - -## 2. Canonical schema inputs already consumed by the core - -The harness separates source facts from curated semantics: - -- `PhysicalSchema` contains database/schema identity and tables; table facts include comments, - columns, physical foreign keys, and indexes; columns contain type, nullability, primary-key, - default, source comment, examples, and eligibility - (`harness/tht/mschema/models.py`). -- `Annotations` contains curated table descriptions, concepts and notes, column descriptions, - synonyms, concepts, evidence, notes and eligibility overrides, plus logical foreign keys - (`harness/tht/mschema/models.py`). - -Rendering already gives annotations precedence over source comments and merges physical and -logical foreign keys. It also applies column eligibility before producing M-Schema context -(`harness/tht/mschema/render.py`). This makes -`Annotations` the natural narrow projection target for approved descriptions, synonyms, logical -relationships, and eligibility from the new catalog. - -There are two current compatibility gaps: - -- `schema_records()` embeds table descriptions/concepts and column descriptions/synonyms/examples, - but does not include physical or logical foreign keys in vector record content - (`harness/tht/vectorstore/records.py`). - Relationships still reach the model through deterministic schema rendering, not through schema - candidate embeddings. -- The F4 widget loads columns with `tht schema columns` - (`harness/.pi/extensions/tht-gate.js`), but that - command still returns only `PhysicalSchema.comment` values and does not merge - `Annotations` - (`harness/tht/cli/schema_cmd.py`). - A publisher that writes only annotations would improve vector search and rendered M-Schema but - not the table/column descriptions displayed by this existing reviewer widget. Fixing the command - to use the existing merged description helpers would preserve the workflow shape while closing - the inconsistency. - -## 3. Existing preprocessing seam - -`workspace index-schema` is already the supported operator seam. It creates a revision-bound -runtime, checks collection compatibility, and runs the harness command -`vector index-schema --json` -(`backend/src/workspaces/preprocessing-service.ts`, -[`workspace-preprocessing-cli.md`](../contracts/workspace-preprocessing-cli.md)). -The full preprocessing operation performs DWH preparation, FK suggestion/review, schema indexing, -and optional Evidence preprocessing as separate resumable stages -(`backend/src/workspaces/preprocessing-service.ts`). -Metadata-only publication should normally use the narrow `index-schema` operation after its -workspace artifacts are valid, rather than coupling catalog CRUD to the full pipeline. - -The harness indexer reads the active immutable physical schema and revision-specific annotations, -constructs schema records, embeds only changed content, and writes them through the configured -vector adapter -(`harness/tht/cli/vector_cmd.py`). Its -machine result carries the physical/annotation artifact digests, workspace revision, collection, -and counts -(`harness/tht/cli/vector_cmd.py`). This is -the right place to retain publication evidence and audit linkage. - -Preprocessing state is already revision- and binding-aware. A resumed job must match operation, -workspace revision, descriptor/catalog blobs, runtime config and binding digests or it fails with -`preprocessing_resume_mismatch` -(`backend/src/workspaces/preprocessing-state.ts`). - -There is an important operational gate: every preprocessing operation calls -`assertSessionInventoryCompatible`; a non-finalized, non-archived session pinned to another -revision blocks preprocessing -(`backend/src/workspaces/preprocessing-service.ts`, -`backend/src/workspaces/preprocessing-state.ts`). -A catalog publication UX must expose this as a pending/blocking condition rather than report a -generic indexing failure. - -## 4. Qdrant identity, payload and collection contracts - -The collection contract is fixed at the descriptor's dimensions/distance and eight keyword payload -indexes: `content_hash`, `document_id`, `kind`, `record_key`, `record_kind`, -`vector_generation`, `workspace_id`, and `workspace_revision` -(`backend/src/workspaces/qdrant-collection.ts`). -`self_heal` may create a missing compatible collection or indexes; `require_existing` only validates -and refuses an incompatible collection -(`backend/src/workspaces/qdrant-collection.ts`). -The publication path must use this shared manager instead of inventing collection setup. - -Schema payloads include both the workspace and workspace revision, record identity, semantic kind, -content and content hash -(`harness/tht/vectorstore/records.py`). -Qdrant point IDs for schema and Evidence also include the revision, and upserts use the same -revision in the payload -(`harness/tht/adapters/vector/qdrant.py`). -Reads always filter by `workspace_id`; schema and Evidence reads additionally filter by the bound -`workspace_revision`, while memory and solved-question records intentionally remain -workspace-wide -(`harness/tht/adapters/vector/qdrant.py:125-145`). - -This means an approved semantic change needs a new workspace revision if old sessions must retain -their previous view. Directly overwriting points under the same Git revision would mutate the -meaning of that supposedly immutable revision; adding an independent catalog-publication version -would require changing the current runtime filter contract. - -### Qdrant synchronization defect to resolve before catalog publication - -The current incremental schema synchronizer compares canonical records by content hash and upserts -changed records, but it has no deletion step -(`harness/tht/cli/vector_cmd.py:77-99`). More -importantly, `QdrantVectorStore.existing_hashes()` filters by workspace and record kind but does not -apply `_revision_filter()` -(`harness/tht/adapters/vector/qdrant.py:266-286`), -even though point IDs and reads are revision-scoped. Therefore a same-key/same-content record from -an older revision may be classified as unchanged and never written under the new revision. This is -an implementation defect/risk inferred directly from the two code paths, and it should be fixed -and regression-tested before the catalog relies on `index-schema` for multi-revision publication. - -Deletion/GC must be stated per record family. Evidence cleanup is implemented: the corpus pipeline -retains the configured number of published generations, protects active/job-referenced -generations, and calls exact-generation deletion for evicted or compensated generations -(`harness/tht/evidence/corpus/pipeline.py`, -`harness/tht/adapters/vector/qdrant.py:350-390`). Schema cleanup is -not implemented: `delete_kinds()` exists as a workspace-scoped adapter primitive, but the schema -synchronizer never calls it, it is not revision-scoped, and there is no retention policy for old -schema revisions. Publication therefore still needs exact current-revision deletion semantics and -separate safe GC for unleased historical schema revisions. - -## 5. Session pinning and why the SQL workflow can remain unchanged - -Normal session creation acquires an immutable registry revision, passes its snapshot path, -workspace ID and commit to `tht session new`, and only releases the retention lease after the -manifest has been persisted -(`backend/src/routes/sessions.ts`). The -manifest stores `workspace_id` and `workspace_revision` next to database/schema identity -(`harness/tht/session/store.py`). Resume and -saved-SQL paths reopen that exact retained snapshot rather than the current installation default -(`backend/src/routes/sessions.ts`, -`backend/src/routes/sql.ts`). - -The runtime renderer places the same workspace revision in `runtime_identity`, points the harness -at the descriptor-owned Qdrant collection, and supplies the internal embedding service -(`backend/src/workspaces/runtime-renderer.ts`). -The vector adapter is constructed directly from that configuration, including the revision -(`harness/tht/adapters/factory.py`). - -At session bootstrap the backend invokes the existing `search pack` command -(`backend/src/routes/sessions.ts`). That -command queries schema records with the existing schema kinds, ranks tables and persists the -candidate list -(`harness/tht/cli/search_cmd.py`). The Pi -extension reads the persisted retrieval pack through the CLI -(`harness/.pi/extensions/tht-gate.js`), -and F4 starts from those candidates while loading full table/column context through existing schema -commands. Thus catalog publication can improve the inputs without changing phases, gate semantics, -or persisted session artifacts. - -## 6. DWH reuse across metadata-only revisions - -DWH preparation uses immutable generations selected by an `ACTIVE` pointer -([DWH contract](../contracts/tht-dwh.md)). The effective-configuration -identity deliberately excludes `runtime_identity`, so a content-only Git revision does not force a -database re-introspection -([DWH contract](../contracts/tht-dwh.md)). This is the key enabling property for future metadata -publication: a new Git revision can carry updated curated annotations and a future Core Schema -Selection contract, reuse the compatible DWH-owned `physical.yaml`, and rebuild only the -revision-scoped schema projection. Today only the curated annotations part of that statement exists. - -## 7. Constraints for the Metadata Catalog design - -The following remain proposed requirements for the deferred catalog-to-core design gate; they are -not claims about current implementation: - -1. **Separate full inventory from core projection.** PostgreSQL may hold the complete database - catalog, drafts and AI-generated text. Only an explicit Core Schema Selection and approved - semantic fields are exported to core artifacts/Qdrant. -2. **Publish; do not live-link.** CRUD changes are not visible to the SQL workflow until an explicit, - audited publication succeeds. A failed projection, Git activation or Qdrant index operation - leaves the previous revision active. -3. **Use a new Git revision as the publication identity.** This preserves current snapshot, - retention, session resume and Qdrant filtering semantics. A separate mutable catalog revision - cannot be safely introduced without changing runtime reads. -4. **Respect artifact ownership.** Keep introspected physical facts in the immutable DWH generation; - project the future Core Schema Selection through an explicit contract and approved semantic - edits into `Annotations`. Keep Mermaid and long-form database documentation outside Qdrant - unless a separate record kind and retrieval policy is designed. -5. **Reuse the operator boundary.** Trigger `workspace index-schema`, observe its schema-versioned - result and persist its artifact identities. Do not call Qdrant from browser CRUD handlers. -6. **Keep runtime read-only.** The session/Pi process continues to read the pinned snapshot, - retrieval pack and Qdrant projection. AI generation and catalog writes belong to the separate - management control plane. -7. **Surface publication gates.** UI status must distinguish Git activation, incompatible/missing - collection, resumable-session revision conflict, embedding failure and completed publication. -8. **Repair and test cross-revision schema synchronization first.** Scope `existing_hashes()` to - the bound revision, delete records removed from the current revision's canonical schema, and - define safe schema-revision GC. Reuse rather than duplicate the already implemented Evidence - generation GC. -9. **Close the annotation display gap without changing the workflow.** Make `schema columns` read - the same merged descriptions used by M-Schema/vector rendering, so the current F4 widget sees - the approved catalog text. - -## Proposed decision summary for the Wayfinder map - -- Keep the Metadata Catalog as a separate management subsystem and source of editable metadata. -- Keep Qdrant derived and revision-scoped; it is not the catalog database or source of truth. -- Publish through immutable workspace revisions plus the existing preprocessing service. -- Preserve the current NL→SQL workflow, Pi extension, phase model and session artifacts. -- Add a new, explicit Core Schema Selection contract because no table/column selection exists in - the current descriptor. -- Treat direct same-revision Qdrant writes, implicit CRUD publication, and bypassing the Git - snapshot boundary as rejected integration paths. - -This summary remains design input. The authoritative current state is that catalog-to-core -integration and Sensitive Data Policy enforcement in schema-linking are deferred in -`PROJECT_STATE.md:160-171`. diff --git a/docs/research/2026-08-31-relationship-management-thothai-to-thothii.md b/docs/research/2026-08-31-relationship-management-thothai-to-thothii.md index bdc68283..b2b88ddd 100644 --- a/docs/research/2026-08-31-relationship-management-thothai-to-thothii.md +++ b/docs/research/2026-08-31-relationship-management-thothai-to-thothii.md @@ -114,7 +114,7 @@ La review dei join durante una sessione è distinta dalla curatela globale: il r | Retrieval | Le relationship entrano nel render M-Schema ma non nei record vettoriali | Va deciso se e come influenzano selezione tabelle, ranking e descrizioni, oltre al rendering finale | | Drift | Sync fisica è autoritativa; annotazioni sono una revisione separata | Servono semantiche per endpoint rinominati/eliminati, candidate stale, orphan e riapprovazione | -Le analisi già presenti nel repository trattano l'integrazione catalogo→core, la selezione pubblicabile e la riparazione degli indici come questioni ancora aperte; le loro proposte non sono decisioni implementate (`docs/research/2026-08-23-thothii-metadata-publication-qdrant-seams.md:20-43`; `docs/research/2026-08-23-thothii-metadata-publication-qdrant-seams.md:239-301`). Anche il piano di migrazione rinvia il lifecycle/admin delle relationship logiche (`docs/plans/2026-08-26-metadata-catalog-from-thothai.md:681-691`). +Nota storica: questa analisi precede il passaggio PostgreSQL catalog-to-core. Per il contratto implementato usare [architettura corrente](../architecture/overview.md) e ADR 0016; le vecchie ipotesi di pubblicazione non sono istruzioni operative. ## Direzione confermata nel grill diff --git a/docs/research/2026-09-07-antigravity-gemini-flash-value.md b/docs/research/2026-09-07-antigravity-gemini-flash-value.md deleted file mode 100644 index 3620b6ff..00000000 --- a/docs/research/2026-09-07-antigravity-gemini-flash-value.md +++ /dev/null @@ -1,122 +0,0 @@ -# Google Antigravity e Gemini 3.8 Flash: convenienza costo/qualità - -Verifica effettuata il **7 settembre 2026**, privilegiando documentazione e annunci -ufficiali Google. Le prove indipendenti su Gemini 3.8 Flash sono ancora limitate perché il -modello è stato pubblicato il 2 settembre 2026. - -## Giudizio sintetico - -- **Registrazione gratuita: decisamente conveniente.** Il piano Individual da $0 include - Gemini 3.8 Flash, l'ultima versione Flash, oltre alla CLI e alle funzioni principali di - Antigravity. È difficile ottenere un rapporto costo/qualità migliore di un accesso gratuito - a un modello di questa fascia. -- **Google AI Pro da circa $20/mese: probabilmente conveniente per uso regolare**, ma solo dopo - aver misurato il consumo sul piano gratuito. Google non pubblica un numero fisso di prompt o - token inclusi, quindi non è possibile calcolare un break-even affidabile contro l'API. -- **Ultra da $100 o $200: non lo comprerei per il solo Gemini Flash** senza aver già dimostrato - di saturare Pro. Il piano da $100 offre 5 volte la quota Pro; quello da $200 ne offre 20 volte. -- Per il server dietro CyberArk, Antigravity ha un vantaggio concreto: la CLI ufficiale `agy` - funziona direttamente in Linux e prevede esplicitamente un flusso OAuth remoto tramite URL e - codice, senza tunnel né port forwarding. - -## Accesso e prezzi - -La [pagina ufficiale dei piani Antigravity](https://www.antigravity.google/docs/plans/) e la -[tabella dei modelli](https://www.antigravity.google/docs/models/) indicano che Gemini 3.8 Flash -è disponibile su Individual gratuito, AI Plus, AI Pro, AI Ultra ed Enterprise. Il piano gratuito -include anche completamenti Tab illimitati e tutte le funzioni del prodotto, inclusa la CLI, ma -ha un limite settimanale di base. - -Google AI Pro costa normalmente **$19,99/mese** nella pagina internazionale di -[Google One](https://one.google.com/about/plans) e offre quote Antigravity superiori, con rinnovo -ogni cinque ore finché non viene raggiunto il limite settimanale. Google AI Ultra è offerto a -[$100/mese con quota 5× Pro oppure $200/mese con quota 20× Pro](https://blog.google/products-and-platforms/products/google-one/google-ai-subscriptions/). - -Il problema è la misurabilità: Google dichiara che i limiti dipendono dalla capacità disponibile -e dalla quantità di lavoro compiuta dall'agente, possono cambiare e non corrispondono a un numero -pubblico fisso di richieste o token. Pro e Ultra possono acquistare crediti per continuare oltre -la quota base, con consumo ai prezzi della piattaforma Gemini. - -Usando direttamente la Gemini API, Gemini 3.8 Flash costa fino al 31 dicembre 2026: - -- **$0,75 per milione di token di input**; -- **$3,75 per milione di token di output**, inclusi i token di ragionamento; -- la metà in modalità Batch o Flex. - -Dal 1º gennaio 2027 questi prezzi raddoppieranno a $1,50/$7,50. Esiste anche un free tier API, -con limiti, nel quale input e output sono gratuiti ma i contenuti possono essere usati per -migliorare i prodotti Google. Fonte: [pricing ufficiale Gemini API](https://ai.google.dev/gemini-api/docs/pricing). - -## Qualità del modello - -[Gemini 3.8 Flash](https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash) è GA, offre un -contesto da 1.048.576 token, output fino a 65.536 token, livelli di ragionamento low/medium/high e -strumenti per code execution, computer use, file search, function calling e search grounding. - -I risultati pubblicati da Google lo collocano molto vicino ai modelli flagship su alcuni test di -coding, ma non su tutti: - -| Benchmark | Gemini 3.8 Flash | Claude Opus 5 | GPT-5.6 Sol | Lettura onesta | -|---|---:|---:|---:|---| -| DeepSWE v1.1 | 73,7% | 74,0% | 72,7% | Prestazione quasi flagship sul software engineering end-to-end | -| Terminal-Bench 2.1 | 89,4% | 89,1% | 88,8% | Eccellente nel terminale sul benchmark più maturo | -| Terminal-Bench 4.0 | 19,1% | 51,8% | 37,3% | Forte calo sul test nuovo e più difficile: non è universalmente al livello dei flagship | - -La [metodologia ufficiale Google](https://deepmind.google/models/evals-methodology/gemini-3-8-flash/) -precisa che diversi punteggi Gemini sono calcolati internamente e che i concorrenti provengono -anche da risultati auto-dichiarati; inoltre DeepSWE usa mini-swe, mentre Terminal-Bench usa un -harness diverso. I numeri vanno quindi letti come indicazione, non come garanzia. Una -[ricostruzione della tabella e dei confronti](https://www.vellum.ai/blog/gemini-3-8-flash-benchmarks-explained) -mostra lo stesso andamento: molto competitivo sui compiti di coding già ben rappresentati, più -debole su alcune prove nuove e aperte. - -La conclusione qualitativa è: **ottimo implementatore quotidiano e subagente veloce**, con qualità -da modello molto più costoso in diversi task; per architettura difficile, debugging ambiguo o -lavori ad alto rischio è ancora sensato affiancargli un modello più forte come pianificatore o -revisore. - -## Perché Antigravity è particolarmente adatto al server - -La [CLI ufficiale Antigravity](https://antigravity.google/docs/cli/overview/) è una TUI interattiva -con editing multi-file, cronologia, tool calling, sandbox e subagenti. La -[guida d'installazione e autenticazione](https://antigravity.google/docs/cli/install/) conferma: - -- esecuzione nativa su Linux, macOS e Windows; -- binario `agy` installato in `~/.local/bin` su Linux/macOS; -- quando rileva SSH, stampa un URL da aprire sul Mac e richiede di incollare nel terminale il - codice ottenuto; -- nessuna porta in ascolto e nessun port forwarding sono necessari per questo login. - -Questo risolve meglio di ZCode il vincolo CyberArk, purché il server possa effettuare connessioni -HTTPS in uscita e sia consentita l'installazione del binario. - -Per consumare la quota della registrazione Antigravity bisogna usare il client ufficiale. I -[termini Antigravity](https://antigravity.google/terms) vietano di riutilizzare il login/OAuth con -Pi, OMP, Claude Code, OpenCode o altri client. Con questi harness si può invece usare una normale -chiave Gemini API, pagando o consumando la quota API separata. - -## Privacy e codice aziendale - -Con un account personale Google registra le interazioni e può usarle per valutare e migliorare -prodotti e modelli; l'utente può disattivare l'uso dalle impostazioni. I termini Enterprise sono -diversi e la documentazione dichiara che codice, prompt e trascrizioni delle organizzazioni non -sono usati per addestrare i modelli Google. Fonti: -[termini Antigravity](https://antigravity.google/terms) e -[integrazioni Enterprise](https://antigravity.google/docs/ide/extensions/). - -Su un server aziendale protetto da CyberArk userei quindi una registrazione personale solo dopo -aver verificato la policy interna; in caso contrario sceglierei l'accesso Antigravity Enterprise -tramite il progetto Google Cloud dell'organizzazione. - -## Raccomandazione finale - -1. Creare l'account gratuito e usare `agy` sul server per una settimana con task reali. -2. Tenere disabilitato l'uso automatico dei crediti extra e osservare i due indicatori di quota. -3. Passare a Pro soltanto se il limite gratuito interferisce con il lavoro. -4. Non acquistare Ultra finché Pro non viene saturato con regolarità. -5. Usare Gemini 3.8 Flash come modello principale per esplorazione, implementazione e test; per le - decisioni più difficili, mantenere Codex/Sol/Opus o un altro modello forte come revisore. - -In breve: **sì, oggi Antigravity gratuito o Pro offre uno dei migliori rapporti costo/qualità per -Gemini 3.8 Flash**, e nel caso specifico la CLI ufficiale senza tunnel aumenta ulteriormente il -valore. Il limite commerciale da accettare è la quota non numerica e modificabile da Google. diff --git a/docs/research/2026-09-07-deepseek-harness-terminal.md b/docs/research/2026-09-07-deepseek-harness-terminal.md deleted file mode 100644 index 471cd1ad..00000000 --- a/docs/research/2026-09-07-deepseek-harness-terminal.md +++ /dev/null @@ -1,154 +0,0 @@ -# DeepSeek Harness su un server raggiunto tramite CyberArk - -Data della verifica: 7 settembre 2026. - -## Risposta breve - -Sì. Il progetto che ha attirato molta attenzione è **DeepSeek Harness**, comando -`dsh`, pubblicato da DeepSeek nel repository ufficiale -[`deepseek-ai/deepseek-harness`](https://github.com/deepseek-ai/deepseek-harness). -Può lavorare direttamente sul server senza SSH port forwarding usando il profilo -ufficiale **headless**: - -```sh -export DEEPSEEK_API_KEY='...' -npx @deepseek-ai/dsh --profile headless \ - "Esamina questo repository e correggi i test che falliscono" -``` - -Questo profilo esegue un incarico, stampa la risposta e termina. Non avvia GUI, -browser o server HTTP e, soprattutto, **non apre alcuna porta**. Lo documentano sia -il [README del profilo headless](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/bundle/headless/README.md) -sia il [riferimento della CLI](https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/reference/README.md). -Pertanto il port forwarding non serve: basta la shell che CyberArk già consente e -connettività HTTPS in uscita. - -La limitazione importante è che non si tratta, per ora, di un'interfaccia terminale -interattiva come Pi, OMP, Claude Code o Codex: il profilo ufficiale headless accetta -**un solo task per invocazione e non permette follow-up interattivi**. - -## Che cos'è, e cosa non è - -DeepSeek lo presenta come un harness open source in *developer preview*, basato su -un'architettura in cui modelli, strumenti, skill, sessioni, sandbox, storage, -subagenti e UI sono plugin componibili. La pagina ufficiale descrive inoltre -modalità Standard, Code, Minimal e Creator e la registrazione append-only delle -esecuzioni. Non è semplicemente il modello DeepSeek e non è uno dei numerosi wrapper -creati dalla comunità. Fonti: [pagina ufficiale DeepSeek Harness](https://www.deepseek.com/harness/en/) -e [README ufficiale](https://github.com/deepseek-ai/deepseek-harness#readme). - -L'identità del pacchetto è verificabile anche nel -[`package.json` della CLI](https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/package.json): -il pacchetto pubblico è `@deepseek-ai/dsh` e installa l'eseguibile `dsh`. -Il [record ufficiale del repository](https://api.github.com/repos/deepseek-ai/deepseek-harness) -ne data la creazione al 13 agosto 2026; alla data di questa verifica la release -più recente è la prerelease -[`dsh-v0.1.3-alpha.2`](https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.1.3-alpha.2), -pubblicata il 7 settembre 2026. Questo conferma quanto il progetto sia giovane e -rafforza l'avvertenza sulla stabilità delle interfacce. - -## Le tre modalità rilevanti nel tuo scenario - -| Modalità | Porta/tunnel | Interazione | Utilità con CyberArk | -|---|---:|---|---| -| `dsh --profile headless "task"` | Nessuna | One-shot, non interattiva | **Sì, è la soluzione semplice** | -| `dsh web` | HTTP locale su `127.0.0.1:3080` | Web interattiva | No dal Mac senza forwarding, reverse proxy autorizzato o browser sul server | -| `dsh --profile acp` | Nessuna porta; JSON-RPC su stdin/stdout | Persistente, pilotata da un client ACP | Possibile, ma l'integrazione attraverso CyberArk va provata | - -La Web UI ufficiale ascolta per default su `127.0.0.1:3080`; il README afferma -esplicitamente che, durante un lancio SSH, il forwarding è responsabilità del client -SSH o dell'editor. È quindi inadatta al vincolo descritto, a meno di cambiare -l'architettura di accesso con l'approvazione dell'amministrazione -([README ufficiale](https://github.com/deepseek-ai/deepseek-harness#run)). - -Il profilo ACP ufficiale è invece un server di automazione persistente su -**JSON-RPC stdio**, senza UI. Un client ACP avvia `dsh --profile acp`, crea una -sessione indicando una directory di lavoro assoluta e scambia richieste e risposte -su standard input/output -([README ACP ufficiale](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/bundle/acp-app/README.md)). - -Da ciò segue una possibilità tecnica: un client locale potrebbe usare come comando -qualcosa di equivalente a `ssh dsh --profile acp`, trasportando lo stdio -senza alcun port forwarding. Questa è però un'**inferenza architetturale**, non una -configurazione dichiarata compatibile con CyberArk da DeepSeek. Banner di login, -MFA interattivo, testo aggiunto su stdout, divieto di `ssh host command`, timeout o -riscrittura dei flussi da parte del proxy CyberArk possono corrompere JSON-RPC o -impedire del tutto l'avvio. Se CyberArk offre soltanto una console web/interattiva, -ACP non collega automaticamente Zed sul Mac al processo remoto. - -## Requisiti di rete e di sistema - -- Il repository richiede Node.js `^22.19.0` oppure `>=24.0.0`, come specificato - nel [`package.json` ufficiale](https://github.com/deepseek-ai/deepseek-harness/blob/master/package.json). -- Il primo `npx` deve poter scaricare `@deepseek-ai/dsh` dal registry npm. In un - ambiente bloccato occorre un mirror aziendale o un'installazione preventiva - autorizzata. -- Per usare il provider predefinito occorrono `DEEPSEEK_API_KEY` e traffico HTTPS - in uscita verso `https://api.deepseek.com`. `DEEPSEEK_BASE_URL` può sostituire - l'endpoint, per esempio con un proxy OpenAI-compatible - ([adapter DeepSeek ufficiale](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-deepseek/README.md)). -- Se la rete aziendale impone un proxy HTTP, il riferimento della CLI indica - `NODE_USE_ENV_PROXY=1` affinché una versione Node compatibile rispetti - `HTTP_PROXY` e `HTTPS_PROXY` - ([riferimento della CLI, sezione Source execution](https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/reference/README.md#source-execution)). -- Le operazioni richieste dall'agente possono necessitare altri host in uscita - (`git`, registry dei pacchetti, documentazione). Non sono necessari per il - trasporto DSH in sé, ma possono esserlo per il task affidato. - -In altre parole, serve **HTTPS outbound**, non una connessione in ingresso verso il -server e non un tunnel dal Mac. - -## Limiti pratici specifici di CyberArk - -1. **Accesso alla shell:** se CyberArk consente di aprire una normale sessione shell - e di eseguire Node, `headless` funziona concettualmente come qualunque altro - comando. Se applica allowlist ai binari, servirà l'autorizzazione per `node`, - `npx`/`dsh` e per gli strumenti che l'agente vuole eseguire. -2. **Egress:** firewall e proxy devono consentire almeno l'endpoint del modello; - CyberArk non sostituisce questa autorizzazione di rete. -3. **Durata della sessione:** un timeout o la chiusura della sessione privilegiata - può terminare il task. `headless` non lascia un demone dietro di sé, ma incarichi - lunghi vanno confrontati con i limiti della sessione CyberArk. -4. **Credenziali e registrazione:** evitare di digitare o stampare la chiave API in - una sessione registrata. Conviene usare il meccanismo aziendale approvato per - iniettare il secret e verificare cosa CyberArk registra. -5. **Approvals:** l'headless ufficiale non ha un interlocutore umano integrato. Le - richieste di escalation senza un *answerer* vengono negate in modo fail-closed; - le normali scritture consentite nella workspace restano possibili - ([contratto delle approvazioni](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/interaction/user-approval/README.md)). -6. **Sicurezza:** DeepSeek dichiara il progetto non sottoposto a security audit e - non pronto per produzione. Può eseguire codice generato dal modello e accedere - a file, processi, rete e credenziali disponibili al processo. Il progetto stesso - raccomanda privilegi minimi e un ambiente dedicato o usa-e-getta - ([Safety notice ufficiale](https://github.com/deepseek-ai/deepseek-harness/blob/master/SAFETY.md)). - -Un dettaglio importante in un server aziendale: la sandbox corrente descritta da -DeepSeek governa gli effetti sul filesystem, mentre rete e visibilità dei processi -sono fuori dal suo vocabolario di enforcement. Non considerarla quindi un sostituto -di firewall, container, account dedicato e policy CyberArk -([documentazione sandbox ufficiale](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/subsystems/sandbox.md)). - -## TUI interattiva: stato reale - -Il prodotto ufficiale offre oggi Web UI, headless one-shot e interfacce di -automazione SDK/ACP. Una TUI a schermo intero chiamata `dsh-tui` è stata presentata -nell'area community del repository, ma il pacchetto e il repository appartengono a -terzi, non a DeepSeek -([discussione nella community DSH](https://github.com/deepseek-ai/deepseek-harness/discussions/3715)). -Non va confusa con la CLI ufficiale e, dato che DSH avverte di possibili cambiamenti -incompatibili durante la developer preview, non la considererei la prima scelta su -un server aziendale protetto. - -## Giudizio - -Per il tuo vincolo concreto la risposta è **sì, ma in modalità one-shot**: -`dsh --profile headless` è utilizzabile dalla normale shell CyberArk, non apre porte -e non richiede tunnel. È una soluzione tecnicamente più adatta della Web UI, ma -meno comoda di Pi/OMP o Codex CLI per un dialogo iterativo. - -La proverei inizialmente su una copia non sensibile del repository, con -`workspace-write`, egress ristretto e secret iniettato secondo le regole aziendali. -Se vuoi un'esperienza persistente dal Mac, ACP su stdio merita un piccolo test di -compatibilità con il gateway CyberArk; non lo darei per funzionante finché non si -verifica che il gateway permetta un comando remoto non interattivo e mantenga -stdin/stdout completamente puliti. diff --git a/docs/research/2026-09-07-omp-codex-zcode.md b/docs/research/2026-09-07-omp-codex-zcode.md deleted file mode 100644 index f7ddfbdb..00000000 --- a/docs/research/2026-09-07-omp-codex-zcode.md +++ /dev/null @@ -1,127 +0,0 @@ -# OMP con GPT-5.6 Sol, Codex ufficiale e ZCode CLI - -_Verifica effettuata il 7 settembre 2026 su documentazione e codice/fonti primarie correnti._ - -## Risposta breve - -Se l'obiettivo è usare **GPT-5.6 Sol attraverso la quota inclusa nel piano ChatGPT/Codex**, la -scelta consigliata è **Codex ufficiale**: CLI per il lavoro da terminale, app desktop per più task, -worktree e revisione visuale. OMP è un harness molto capace e può essere preferibile per ACP/Zed, -multi-provider, LSP/DAP e orchestrazione dei subagenti, ma il suo accesso “OpenAI Codex OAuth” non -è una superficie che OpenAI documenta ufficialmente come client supportato. - -Se invece OMP usa una **chiave API OpenAI**, l'integrazione è tecnicamente normale e GPT-5.6 Sol è -disponibile tramite Responses API con function calling, structured outputs e diversi tool. In quel -caso, però, il consumo è fatturato come API e non attinge alla quota inclusa nel piano ChatGPT. - -Per **ZCode di Z.ai**, la documentazione ufficiale corrente presenta un'app desktop/ADE, non una -CLI pubblica autonoma. Esiste `zcode-app-cli`, ma è un progetto comunitario che si dichiara non -ufficiale ed estrae il runtime distribuito con l'app. Non esiste una garanzia ufficiale che riceva -un presunto bonus di quota del 50%; la documentazione corrente non promette neppure un diritto -fisso “150%” per tutti gli utenti ZCode. - -## 1. OMP + GPT-5.6 Sol oppure Codex? - -### Il modello è solo una parte del risultato - -Usare lo stesso modello non rende equivalenti due agenti. L'harness decide prompt di sistema, -selezione e schema dei tool, raccolta del contesto, compaction, gestione degli errori, permessi, -parallelismo e verifica. Non risultano benchmark first-party che confrontino direttamente -GPT-5.6 Sol dentro OMP contro lo stesso modello dentro Codex: un vincitore assoluto non è quindi -dimostrabile. - -GPT-5.6 Sol è il modello flagship general-purpose della famiglia 5.6 e supporta Responses API, -function calling, structured outputs, hosted shell, apply patch, skills, MCP e tool search. -[Scheda ufficiale GPT-5.6 Sol](https://developers.openai.com/api/docs/models/gpt-5.6-sol). - -### Accesso tramite abbonamento - -OMP dichiara un provider **OpenAI Codex OAuth** e consente il login dal proprio harness. -[README OMP](https://github.com/can1357/oh-my-pi/blob/daf07999c2fee9b22edc7bf8fea1fb6272e0df5e/README.md). - -La documentazione OpenAI, però, indica il login ChatGPT per l'accesso in abbonamento soltanto per -l'app desktop ChatGPT/Codex, Codex CLI e l'estensione IDE. Non include OMP tra i client supportati. -Questo non prova che OMP non funzioni, ma significa che compatibilità, continuità dell'accesso e -interpretazione della quota non sono garantite da OpenAI per quel percorso. -[Autenticazione ufficiale Codex](https://learn.chatgpt.com/docs/auth). - -Con una chiave API la situazione è diversa: l'accesso al modello è ufficiale, ma è fatturato ai -prezzi API. OpenAI specifica inoltre che l'autenticazione API usa il pricing API invece dei crediti -inclusi nel piano ChatGPT. -[Pricing Codex](https://learn.chatgpt.com/docs/pricing), -[pricing del modello](https://developers.openai.com/api/docs/models/gpt-5.6-sol). - -### Confronto operativo - -| Priorità | Scelta migliore | Motivo | -|---|---|---| -| GPT-5.6 Sol con quota ChatGPT e supporto prevedibile | Codex ufficiale | Login, quota e aggiornamenti sono first-party | -| Esperienza terminale, scripting e CI | Codex CLI | Loop locale, `codex exec`, review e handoff cloud | -| Task paralleli, worktree e review visuale | App desktop Codex | Gestione visuale dei task e isolamento mediante Git worktree | -| ACP/Zed, molti provider, LSP/DAP e Agent Hub | OMP | Harness più estensibile e ricco di strumenti | -| OMP con stabilità contrattuale dell'accesso | OMP + API key | API ufficiale, ma costo separato dal piano ChatGPT | - -La CLI ufficiale è consigliata per terminale, automazione e CI. -[Codex CLI](https://learn.chatgpt.com/docs/codex/cli). L'app desktop è più comoda per task -concorrenti isolati, diff visuali e passaggio fra checkout locale e worktree. -[Worktree Codex](https://learn.chatgpt.com/docs/environments/git-worktrees). - -CLI e app non danno due quote separate: quando si accede con ChatGPT, fanno parte dello stesso -ecosistema Codex/ChatGPT e consumano la stessa quota del piano. Il consumo concreto dipende da -modello, lunghezza del contesto e complessità del task. -[Pricing e limiti](https://learn.chatgpt.com/docs/pricing). - -### Giudizio - -Per un flusso principale basato su GPT-5.6 Sol sceglierei **Codex CLI**; affiancherei l'app quando -servono task paralleli, worktree e review visuale. Sceglierei OMP come harness principale soltanto -se le sue capacità specifiche — soprattutto Zed/ACP, routing multi-provider o Agent Hub — valgono -più del supporto first-party. Se OMP deve essere affidabile nel tempo, userei una API key anziché -fondare il workflow sul login OAuth non documentato da OpenAI per client terzi. - -## 2. Il “150%” di Codex non è quota aggiuntiva - -Nella documentazione OpenAI, **1,5× indica la velocità del Fast mode**, non un aumento della quota. -Con GPT-5.6, Fast mode consuma crediti a **2,5×** il tasso Standard. È disponibile nei client -Codex ufficiali quando si accede con ChatGPT. -[Fast mode](https://learn.chatgpt.com/docs/agent-configuration/speed). - -## 3. Esiste una CLI ufficiale ZCode? - -La guida ufficiale ZCode offre download desktop per macOS, Windows e Linux e descrive ZCode come -ADE con terminale integrato. Non documenta un comando autonomo ufficiale equivalente a `codex`. -La presenza di directory chiamate `~/.zcode/cli/` riguarda il runtime/config interno e non equivale -alla pubblicazione di una CLI supportata. -[Installazione ZCode](https://zcode.z.ai/en/docs/install), -[FAQ ufficiale](https://zcode.z.ai/en/docs/qa). - -Esiste il progetto comunitario -[`zcode-app-cli`](https://github.com/kingsword09/zcode-cli), installabile con npm. Il progetto si -definisce esplicitamente non affiliato né approvato da Z.ai e dichiara di estrarre il runtime -dall'app desktop. Va quindi considerato non ufficiale e soggetto a possibili rotture e problemi di -compatibilità o licenza. - -### Ha il 150% della quota? - -Non c'è una conferma ufficiale corrente. Le pagine ZCode attuali descrivono quote Coding Plan su -finestre di cinque ore e settimanali, quota MCP mensile, crediti e reset card promozionali/dinamiche; -non dichiarano un moltiplicatore fisso 150% applicabile alla CLI. -[Statistiche e quota ZCode](https://zcode.z.ai/en/docs/usage-stats), -[connessione al Coding Plan](https://zcode.z.ai/en/docs/configuration). - -Alcuni benefici sono esplicitamente legati all'app e al login ZCode: per esempio le reset card -richiedono di essere connessi a ZCode, mentre gli idle-time task gratuiti sono una funzione -dell'app in rollout. Questo non autorizza a concludere che un client comunitario riceva gli stessi -benefici. -[ZCode Usage Stats](https://zcode.z.ai/en/docs/usage-stats), -[ZCode overview](https://zcode.z.ai/en/docs/welcome). - -Inoltre, i termini del GLM Coding Plan avvertono che l'uso tramite strumenti non autorizzati o non -supportati può comportare restrizioni di alcuni benefici. Di conseguenza non userei una CLI -comunitaria con l'obiettivo specifico di ottenere quota extra. -[Termini del GLM Coding Plan](https://docs.z.ai/legal-agreement/subscription-terms). - -La scelta prudente è usare l'app ZCode ufficiale — incluso il suo terminale integrato o Remote -Development — e considerare valido soltanto il saldo mostrato in tempo reale nell'app. Se Z.ai -pubblicherà una CLI ufficiale o una regola “+50%”, servirà una dichiarazione esplicita applicabile -alla versione e al piano usati. diff --git a/docs/research/2026-09-07-pi-config-vs-oh-my-pi.md b/docs/research/2026-09-07-pi-config-vs-oh-my-pi.md deleted file mode 100644 index c4af4e0d..00000000 --- a/docs/research/2026-09-07-pi-config-vs-oh-my-pi.md +++ /dev/null @@ -1,148 +0,0 @@ -# Pi + `pi-config` di Amos vs Oh My Pi - -_Ricerca aggiornata al 7 settembre 2026. Fonti: esclusivamente repository, documentazione, sorgenti, issue tracker e release ufficiali dei progetti._ - -## Risposta breve - -**Per la maggior parte degli sviluppatori che vuole un agente completo e pronto all'uso, sceglierei Oh My Pi (OMP), ma non con le impostazioni di sicurezza predefinite.** OMP integra provider, routing per ruolo, LSP/DAP, subagent, web, browser, sessioni, memoria, marketplace e una UX terminale molto più ampia. È un prodotto coerente, installabile e aggiornabile come tale. - -**Sceglierei invece Pi con pezzi selezionati di `pi-config` se volessi un nucleo piccolo, leggibile e fortemente personalizzabile**, accettando di assemblare, verificare e mantenere personalmente ogni componente. Il vantaggio non è avere più funzioni: è sapere con precisione quali funzioni si stanno aggiungendo. - -La prima distinzione è fondamentale: - -- [`amosblomqvist/pi-config`](https://github.com/amosblomqvist/pi-config) **non è una distribuzione alternativa di Pi**. È la configurazione personale di Amos Blomqvist: una raccolta di estensioni e skill da copiare selettivamente sopra il [Pi ufficiale](https://github.com/earendil-works/pi). Il README invita esplicitamente a non installarla come un unico pacchetto e a non clonarla sopra la propria configurazione. -- Per “Oh My Pi” qui si intende [`can1357/oh-my-pi`](https://github.com/can1357/oh-my-pi), il fork integrato di Pi che si presenta come agente “batteries included”. Non è un semplice tema o dotfile pack. - -Di conseguenza il confronto corretto è **Pi ufficiale + componenti scelti da `pi-config` e dai repository companion** contro **OMP come fork/prodotto integrato**. - -## Confronto spalla a spalla - -| Area | Pi + `pi-config` | Oh My Pi | Valutazione | -|---|---|---|---| -| Installazione | Prima si installa [Pi](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md), poi si copiano singole estensioni/skill in `~/.pi/agent/`; alcuni componenti richiedono `npm install`, Chromium, Python o tool di sistema. Il [README di `pi-config`](https://github.com/amosblomqvist/pi-config#installation) raccomanda la selezione manuale. | Installer shell/PowerShell, Homebrew, Bun, Nix e `mise`, più binari multipiattaforma nelle [release](https://github.com/can1357/oh-my-pi/releases). | **OMP**: onboarding e aggiornamento più coerenti. | -| Filosofia | Pi è un harness terminale minimale, esteso tramite TypeScript, skill, prompt template, temi e pacchetti; evita intenzionalmente alcune funzionalità integrate, inclusi subagent e plan mode, per lasciarle alle estensioni ([README Pi](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md)). `pi-config` porta questa filosofia all'estremo: si prendono solo i pezzi voluti. | Fork “batteries included”: molte capacità sono native o integrate e configurabili da una superficie comune ([README OMP](https://github.com/can1357/oh-my-pi)). | **Dipende**: controllo e semplicità a Pi; completezza a OMP. | -| Provider e modelli | `pi-config` non aggiunge provider. Eredita da Pi login per Anthropic/OpenAI/Copilot, numerosi provider API, servizi cloud, OpenRouter e modelli locali/custom ([provider Pi](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md#providers-and-models)). | Dichiara oltre 60 provider e modelli locali/remoti; assegna modelli distinti ai ruoli `default`, `smol`, `slow`, `plan`, `commit`, `vision`, `task`, `advisor` e `tiny`, con fallback e credenziali multiple ([model routing OMP](https://github.com/can1357/oh-my-pi#sixty-plus-providers-a-thousand-models-one-model-away)). | **OMP** per ampiezza e routing; Pi resta già provider-agnostic. | -| Prompt e istruzioni | Pi supporta `AGENTS.md`, `SYSTEM.md`, `APPEND_SYSTEM.md` e prompt template. `prompt-snippets` aggiunge piccoli frammenti attivabili per singolo messaggio, poi azzerati ([sorgente/README](https://github.com/amosblomqvist/pi-config/tree/main/extensions/prompt-snippets)). | Stessi concetti di personalizzazione del prompt, con override globali/progetto/modello ([documentazione](https://github.com/can1357/oh-my-pi/blob/main/docs/system-prompt-customization.md)); aggiunge ruoli modello, advisor e agent personalizzati. | **OMP** per orchestrazione; **pi-config** ha la migliore micro-UX per regole effimere per messaggio. | -| Subagent | Non nativi nel core. Il companion [`pi-interactive-subagents`](https://github.com/amosblomqvist/pi-interactive-subagents) avvia agent asincroni in pannelli tmux, persistenti e pilotabili; include `scout`, `researcher` e `worker`, loadout a allowlist e nesting esplicito. | Subagent di prima classe con batch, modalità sincrona/asincrona, output strutturato, Agent Hub, steering/revive/kill e ricorsione controllata. L'isolamento del workspace esiste, ma è **opt-in**, non una proprietà automatica di ogni spawn ([task](https://github.com/can1357/oh-my-pi/blob/main/docs/tools/task.md)). | **OMP** per orchestrazione complessiva; **Amos** per pannelli tmux e minimo privilegio più semplice da verificare. | -| Tool di coding | Il core Pi espone un set volutamente piccolo; `pi-config` aggiunge soprattutto browser, fetch/search, guard e UI di domande. | Lettura/scrittura/editing e AST, grep/glob, shell ed evaluator persistenti, LSP, DAP, code review, security scan, checkpoint/rewind e altri tool elencati nel [README](https://github.com/can1357/oh-my-pi#thirty-one-first-class-tools). Alcuni sono disattivati inizialmente. | **OMP**, nettamente, per intelligence sul codice e debug. | -| Web e browser | [`browser`](https://github.com/amosblomqvist/pi-config/tree/main/extensions/browser) usa Playwright/Chromium headless ed è spento di default; è una singola pagina senza download/upload. `web-search` usa Google Custom Search e richiede API key/CSE ([sorgente](https://github.com/amosblomqvist/pi-config/blob/main/extensions/web-search/index.ts)); c'è anche `web-fetch`. | Browser/computer integrati e ricerca con numerosi backend, inclusi servizi a pagamento, locali/pubblici e motori specializzati ([README](https://github.com/can1357/oh-my-pi#web-search)). | **OMP** per copertura; `pi-config` è più piccolo e comprensibile. | -| Skill e plugin | Skill file-based native di Pi più quattro skill incluse: analisi sessioni, PDF, web debug e trascrizione YouTube ([inventario](https://github.com/amosblomqvist/pi-config#skills)). `learn`, dictation, memoria e subagent sono repository separati. | Skill caricate progressivamente tramite metadata e URI `skill://` ([skill docs](https://github.com/can1357/oh-my-pi/blob/main/docs/skills.md)); marketplace per plugin Git/local/catalogo, con skill, comandi, agent, hook, tool, MCP e LSP ([marketplace](https://github.com/can1357/oh-my-pi/blob/main/docs/marketplace.md)). | **OMP** per distribuzione e composizione. | -| MCP e interoperabilità | Dipende dalle capacità/estensioni del Pi base; `pi-config` non offre un livello MCP proprio. | Configurazione MCP utente/progetto e discovery di configurazioni provenienti anche da altri editor/agenti ([MCP docs](https://github.com/can1357/oh-my-pi/blob/main/docs/mcp-config.md)). | **OMP**. | -| UX/TUI | TUI Pi pulita con editor, fuzzy file search, immagini, shell, steering/follow-up e alberi di sessione. `ask-user-question` aggiunge un dialogo strutturato; snippets e pannelli tmux sono distintivi. [`pi-dictate`](https://github.com/amosblomqvist/pi-dictate) aggiunge dettatura Deepgram. | TUI più ricca con card dei tool, preview/accettazione edit, picker, Agent Hub e time-travel; include sia sintesi vocale sia STT tramite scorciatoia `Alt+H` ([README OMP](https://github.com/can1357/oh-my-pi)). | **OMP** in generale; la semplicità di Pi può essere un pregio. La voce non è esclusiva della configurazione Amos. | -| Sessioni | Pi salva JSONL ad albero, consente resume/fork/clone/tree e compaction conservando lo storico ([sessioni Pi](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/README.md#sessions)). | JSONL append-only, struttura ad albero, blob esterni e ricostruzione versionata ([formato](https://github.com/can1357/oh-my-pi/blob/main/docs/session.md)); dump/export/share/fork/resume sono documentati come operazioni native ([operazioni](https://github.com/can1357/oh-my-pi/blob/main/docs/session-operations-export-share-fork-resume.md)). | **OMP**, di poco, per operazioni integrate; i due condividono una base concettuale simile. | -| Memoria | [`pi-observational-memory`](https://github.com/amosblomqvist/pi-observational-memory) è opzionale e spento di default: observer LLM paralleli distillano i turni, una compaction deterministica crea un ledger e un consolidatore produce file Markdown per sessione. È auditabile, ma aggiunge costo e complessità. | Memoria spenta di default con backend `local`, Hindsight, Mnemopi e Sharpshooter; sommari/lezioni possono attraversare sessioni e alimentare skill, con esplicita avvertenza che la memoria può essere obsoleta ([memory docs](https://github.com/can1357/oh-my-pi/blob/main/docs/memory.md)). | **OMP** per scelta e integrazione; **Amos** per un modello per-sessione semplice da ispezionare. | -| Sicurezza applicativa | Pi dichiara di non avere un permission system integrato per filesystem, processi, rete o credenziali e consiglia container/microVM ([security Pi](https://github.com/earendil-works/pi#permissions--containerization)). [`bash-guard`](https://github.com/amosblomqvist/pi-config/tree/main/extensions/bash-guard) intercetta euristicamente solo chiamate al tool `bash`: non protegge `write`, `edit` né i comandi `!`. | Ha policy per tool e tre approval mode, ma il default è **`yolo`**; in tale modalità gli override di comandi bash critici non forzano il prompt. Anche quando si approva un comando non c'è contenimento di filesystem, rete o subprocessi ([approval docs](https://github.com/can1357/oh-my-pi/blob/main/docs/approval-mode.md)). L'offuscamento dei segreti esiste ma è spento di default ([secrets docs](https://github.com/can1357/oh-my-pi/blob/main/docs/secrets.md)). | **Nessun vincitore sicuro di default**. OMP offre controlli migliori, ma sceglie un default molto permissivo. | -| Isolamento | Nessun sandbox OS o worktree per-agent documentato; l'allowlist del loadout limita i tool, non il filesystem raggiungibile dai tool concessi. | Gli spawn normali condividono la `cwd` del parent. Workspace separato e merge patch/branch richiedono `task.isolation.enabled` **e** `isolated: true` sul task; l'opzione non è disponibile in plan mode ([task](https://github.com/can1357/oh-my-pi/blob/main/docs/tools/task.md#inputs)). Neppure questo è un sandbox OS. | **OMP** per isolamento anti-collisione opt-in; **parità negativa** come confine di sicurezza. | -| Portabilità | I componenti sono piccoli file TypeScript/Markdown copiabili, quindi il lock-in concettuale è basso. Però molte estensioni Amos importano ancora il vecchio scope `@mariozechner/*`; il Pi attuale usa `@earendil-works/*`. L'[advisory ufficiale](https://github.com/earendil-works/pi/security/advisories/GHSA-r95r-rj6r-c39x) depreca il vecchio pacchetto, quindi oggi serve una verifica/possibile migrazione degli import. | Binari e setup multipiattaforma; importa varie convenzioni esterne. Tuttavia si è allontanato dal Pi upstream: scope `@oh-my-pi`, runtime/test Bun, moduli nativi, auth e API proprie sono differenze dichiarate nella [guida di porting](https://github.com/can1357/oh-my-pi/blob/main/docs/porting-from-pi-mono.md). | **Pi + selezione manuale** per lock-in ridotto; **OMP** per portabilità operativa immediata. | -| Migrazione delle estensioni | È l'ambiente nativo della raccolta Amos, salvo la transizione di package scope appena citata. | Non tratta `.pi/extensions` come root nativa. Può leggere dichiarazioni `pi.extensions` nei manifest, ma il caricamento e le API non rendono la migrazione automaticamente compatibile ([extension loading](https://github.com/can1357/oh-my-pi/blob/main/docs/extension-loading.md)). | **Non è drop-in in nessuna direzione**; verificare ogni estensione. | -| Aggiornamenti e manutenzione | `pi-config` è un piccolo snapshot personale, senza release versionate; il [registro commit](https://github.com/amosblomqvist/pi-config/commits/main/) mostra pochissimi cambiamenti e l'integrazione è responsabilità dell'utente. I companion hanno cicli propri. | Distribuzione versionata con release frequenti e asset per piattaforma; al 7 settembre 2026 la release più recente è [`v18.1.13`](https://github.com/can1357/oh-my-pi/releases/tag/v18.1.13). | **OMP** per manutenzione di prodotto; le release molto rapide aumentano anche il rischio di churn. | -| Maturità pratica | Il Pi sottostante è un progetto attivo e maturo, ma `pi-config` non è testato o pubblicato come distribuzione unitaria. L'autore di `pi-dictate`, per esempio, lo presenta esplicitamente come tool personale mantenuto per il proprio uso ([README](https://github.com/amosblomqvist/pi-dictate)). | Repository ampio, migliaia di commit e cadenza di release elevata ([storia](https://github.com/can1357/oh-my-pi/commits/main/), [release](https://github.com/can1357/oh-my-pi/releases)). Più integrazione e utenti implicano più validazione reale, ma anche superficie di bug e regressioni maggiore. | **OMP** come prodotto; nessuna garanzia che “più grande” significhi “più stabile”. | - -## Approfondimento: gestione dei subagenti - -**Sì: OMP ha una gestione dei subagenti paragonabile e, come orchestratore automatico, più completa.** La proposta Amos non è però semplicemente inferiore: privilegia un diverso modello operativo, nel quale ogni agente vive in un vero pannello tmux che l'utente può osservare e usare direttamente, con un loadout strettamente autorizzato. - -| Capacità | Pi + Amos `pi-interactive-subagents` | Oh My Pi | -|---|---|---| -| Esecuzione e fan-out | Sempre asincrono e non bloccante; più chiamate partono in parallelo e notificano il parent indipendentemente ([README, “How it works”](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#how-it-works)). Non è documentato un limite di concorrenza configurabile. | `task.batch` è attivo di default e accetta `tasks[]`; con `async.enabled=true` gli agenti sono job in background, altrimenti il parent attende. Un semaforo `task.maxConcurrency` limita sia sync sia async ([task: input, modi e limiti](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/tools/task.md#modes--variants)). | -| Messaggi fra agenti | `subagent_message` corregge uno spawn in corsa al prossimo confine di turno o riapre quello concluso; `ask_question` permette al child di parcheggiarsi e interrogare il parent ([messaging](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#messaging)). | `hub send` consegna steering/follow-up, anche agli agenti parcheggiati, che vengono riattivati; la messaggistica peer è disponibile anche ai child ([task, “Notes”](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/tools/task.md#notes)). Limite documentato: lo steering è testo libero, non uno stato condiviso strutturato di goal/todo. | -| Supervisione e intervento umano | Widget con stati `starting/active/waiting/stalled/running`, tool corrente e completamenti espandibili; il pannello tmux è la sessione reale, quindi l'utente può entrarvi e scrivere direttamente ([status widget](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#status-widget--configuration)). | `Alt+A` apre Agent Hub: roster/albero, attività, modello, costo/token, transcript live, steering, revive e kill; l'utente può mettere a fuoco la sessione del child e scrivergli ([Agent Hub](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/agent-hub.md)). **OMP non manca quindi della supervisione interattiva**; Amos la rende più concreta e terminal-native tramite pannelli separati. | -| Resume e persistenza | Registro nome→sessione persistente attraverso i riavvii; il resume ripristina lo snapshot del loadout originale. Supporta sessioni `standalone`, `lineage-only` o `fork` con contesto del parent ([resume](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#messaging), [session mode](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#session-mode)). | Salva output e transcript (`agent://`, `history://`); agenti idle/parcheggiati sono riattivabili anche dopo il resume del parent ([Agent Hub, “Persisted agents”](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/agent-hub.md#persisted-agents-and-advisors)). Eccezione importante: un task eseguito in workspace isolato viene smontato dopo merge/cattura patch e **non è riattivabile** ([task flow](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/tools/task.md#flow)). | -| Definizioni e routing modelli | File Markdown in `.pi/agents` o `~/.pi/agent/agents`, con modello, thinking, skill, tool, `cwd` e modalità sessione; il singolo spawn può sovrascrivere il modello. Include tre profili (`scout`, `researcher`, `worker`) ([custom agents](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#custom-agents)). | File Markdown `.omp/agents`, agent inclusi e provenienti da estensioni/plugin; routing con override per nome, lista fallback e alias `modelRoles`, più effort per task, prewalk e advisor opzionali ([agent definition](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/task-agent-discovery.md#agent-definition-shape), [routing](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/task-agent-discovery.md#model-and-structured-output-precedence)). | -| Tool e sicurezza applicativa | Allowlist stretta: il child parte con `--no-extensions` e riceve soltanto i tool e le estensioni esplicitamente elencati; lo snapshot preserva il vincolo al resume ([tool access](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#tool-access-control)). È minimo privilegio applicativo, non sandbox OS. | Ogni definizione può limitare `tools` e `spawns`, e il limite di profondità rimuove `task`; però i child headless forzano `tools.approvalMode: yolo`, perché non hanno una UI locale per le conferme ([task flow](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/tools/task.md#flow)). Di conseguenza la qualità dell'allowlist/deny policy del parent è un confine essenziale. | -| Agenti annidati | Solo se `subagent_agents` è presente; la lista autorizza nomi precisi a ogni livello e non esiste uno spawn senza profilo nominato ([tool access](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#tool-access-control)). Il parent attende anche i nipoti prima dell'auto-exit. | Supportati con policy `spawns` e limite `task.maxRecursionDepth` (default `2`); al limite il tool `task` viene rimosso ([recursion gating](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/task-agent-discovery.md#recursion-depth-gating)). Agent Hub conserva la gerarchia parent/child. | -| Filesystem, worktree e conflitti | `cwd` può assegnare una directory diversa, ma il README non documenta workspace/worktree isolati né merge automatici ([role folders](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#role-folders)). **Inferenza:** più worker scriventi nella stessa checkout possono quindi collidere; separare le `cwd` resta responsabilità dell'orchestratore/utente. | Lo spawn ordinario usa la `cwd` del parent. L'isolamento è disponibile soltanto con configurazione globale attiva, `isolated: true`, repository Git e fuori dal plan mode; può applicare patch o cherry-pickare un branch ([task modes](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/tools/task.md#modes--variants)). Verifica l'applicabilità della patch; in caso di conflitto lascia l'artefatto per intervento manuale e preserva lo stash in branch mode ([gestione conflitti](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/tools/task.md#notes)). | -| Output | Il risultato è l'ultimo messaggio assistant, inoltrato al parent; non è documentato un contratto JSON Schema né un merge di file ([auto-exit](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#auto-exit)). | `outputSchema` per item, modalità `permissive`/`strict`, risultato parsato e artefatti completi tramite `agent://`; il child deve concludere con `yield`, con fino a tre reminder ([task outputs](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/tools/task.md#outputs), [flow](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/tools/task.md#flow)). | -| Portabilità e prerequisiti | Questa variante è esplicitamente **tmux-only** e richiede Pi + tmux ([requirements](https://github.com/amosblomqvist/pi-interactive-subagents/blob/c3e8b53c0754ae5ccc19fdab5a7481ec039bc2f7/README.md#requirements)); l'upstream HazAT supporta più multiplexer, ma non è il componente qui confrontato. | Il runtime OMP è multipiattaforma; l'isolamento seleziona backend diversi per Linux, macOS e Windows e ricade su copia ricorsiva quando necessario ([backend di isolamento](https://github.com/can1357/oh-my-pi/blob/4c6feacddb6ff26e5219df7283bc371ad7e1de55/docs/tools/task.md#side-effects)). | - -### Giudizio mirato - -**Per orchestrazione di subagenti sceglierei OMP**, perché combina fan-out controllato, sync/async, Agent Hub, messaggistica peer, output tipizzato, nesting con limiti e isolamento anti-collisione opzionale. Quindi la risposta alla domanda “ce l'ha anche OMP?” è **sì, e sul piano funzionale offre di più**. - -**Pi + Amos resta preferibile in due casi:** quando si vuole entrare fisicamente nei pannelli dei worker mentre lavorano, oppure quando si considera prioritaria una politica child “deny by default” molto leggibile. La sua gestione può essere ottimale per un power user tmux; non è però altrettanto completa come orchestratore automatico, soprattutto per output strutturato, concorrenza limitata e gestione/merge degli artefatti. - -Due caveat impediscono un verdetto semplicistico: - -1. in OMP “subagent isolato” non significa “ogni subagent”: senza entrambi i toggle necessari, gli agenti scriventi condividono la checkout; -2. isolamento e continuità sono in tensione: il child OMP isolato evita collisioni, ma dopo il merge/cleanup non può essere riattivato; uno non isolato può invece essere parcheggiato e ripreso. - -## Cosa include davvero `pi-config` - -Nel repository principale ci sono: - -- `ask-user-question`: richiesta strutturata con popup TUI e serializzazione dell'interazione; -- `bash-guard`: conferma/blocco euristico di comandi shell pericolosi; -- `browser`: automazione Playwright su Chromium headless, disattivata inizialmente; -- `custom-header`: header TUI personalizzato; -- `prompt-snippets`: regole brevi attivabili sul singolo messaggio; -- `web-fetch` e `web-search`; -- skill per analisi sessioni, PDF, debug web e trascrizione YouTube. - -L'elenco e i prerequisiti sono nel [README ufficiale](https://github.com/amosblomqvist/pi-config). Le capacità più ambiziose sono in repository distinti: - -- [`pi-interactive-subagents`](https://github.com/amosblomqvist/pi-interactive-subagents), subagent interattivi in tmux; -- [`pi-observational-memory`](https://github.com/amosblomqvist/pi-observational-memory), memoria osservazionale per sessione; -- [`pi-dictate`](https://github.com/amosblomqvist/pi-dictate), STT con Deepgram; -- [`learn`](https://github.com/amosblomqvist/learn), ambiente didattico con quiz, log e agent di ricerca/visualizzazione. - -Questi componenti **non formano automaticamente una singola installazione testata, aggiornata e versionata insieme**. Considerarli una “suite” è un'inferenza utile per il confronto, non una promessa del maintainer. - -## Dove OMP è realmente superiore - -1. **È coerente come prodotto.** Installazione, configurazione YAML, schema, tool, sessioni e aggiornamenti fanno parte dello stesso rilascio ([settings](https://github.com/can1357/oh-my-pi/blob/main/docs/settings.md)). -2. **Il routing dei modelli è molto più sofisticato.** Non si sceglie soltanto un modello: si possono assegnare costi/capacità differenti a pianificazione, task, vision, commit, advisor e attività leggere. -3. **L'intelligence sul codice è integrata.** LSP, DAP, editing AST, evaluator persistenti e review non richiedono di costruire un proprio stack di estensioni. -4. **Subagent e memoria sono parti del sistema**, non componenti companion da sincronizzare a mano. -5. **Ha più opzioni di interoperabilità**: MCP, marketplace e discovery di configurazioni da altri strumenti. - -Questa superiorità è soprattutto di **copertura e integrazione**, non una prova automatica di qualità superiore per ogni singola funzione. Le quantità dichiarate nel README di OMP sono affermazioni del progetto, non benchmark indipendenti. - -## Dove Pi + la configurazione Amos è migliore - -1. **È più facile capire il perimetro.** Ogni estensione è piccola, selezionabile e sostituibile. Si può usare `prompt-snippets` senza accettare browser, memoria o subagent. -2. **Ha meno lock-in architetturale.** Le skill Markdown e molte estensioni TypeScript restano vicine all'ecosistema Pi, anche se oggi gli import verso il vecchio package scope richiedono attenzione. -3. **Alcune idee sono più eleganti che “integrate”.** Gli snippet effimeri per messaggio, gli agent visibili nei pannelli tmux e la memoria in file Markdown per sessione sono facili da osservare e modificare. -4. **Favorisce l'apprendimento del sistema.** È una buona base per chi vuole costruirsi il proprio harness anziché adottare una piattaforma già opinionata. - -Il prezzo è tempo operativo: installazione, dipendenze, compatibilità, aggiornamenti e test ricadono sull'utente. - -## Sicurezza: la conclusione scomoda - -**Né Pi + `pi-config` né OMP forniscono, da soli, un sandbox di sicurezza.** - -- In Pi, `bash-guard` è un buon guardrail UX, ma non vede tutte le scritture e non contiene il processo. Le estensioni Pi hanno accesso al sistema con i privilegi dell'utente; la documentazione raccomanda esplicitamente container o microVM ([Pi security](https://github.com/earendil-works/pi#permissions--containerization)). -- In OMP esistono più policy, deny list e modalità di approvazione. Tuttavia `tools.approvalMode` parte da **`yolo`**, i safety override bash non diventano prompt in quella modalità, un comando approvato conserva accesso ambientale e le estensioni girano nello stesso processo ([approval mode](https://github.com/can1357/oh-my-pi/blob/main/docs/approval-mode.md), [extension loading](https://github.com/can1357/oh-my-pi/blob/main/docs/extension-loading.md)). Anche la protezione dei segreti è opt-in. - -Se scegliessi OMP imposterei subito almeno: - -1. `tools.approvalMode: always-ask` per un ambiente sensibile, oppure `write` come compromesso; -2. deny/prompt espliciti per evaluator, browser/computer e tool non necessari; -3. offuscamento segreti abilitato e configurato; -4. esecuzione in container, VM o microVM quando repository, credenziali o rete sono sensibili. - -Con Pi farei la stessa cosa a livello OS e tratterei `bash-guard` come seconda cintura, non come sandbox. - -## Raccomandazione per profilo - -| Profilo | Scelta consigliata | Perché | -|---|---|---| -| Sviluppatore che vuole essere produttivo subito | **Oh My Pi** | Meno assemblaggio; LSP/DAP, modelli, agent e sessioni sono già integrati. | -| Power user multi-model / molti provider | **Oh My Pi** | Routing per ruolo, fallback e credenziali multiple sono capacità native. | -| Team che vuole una configurazione ripetibile | **Oh My Pi**, release fissata | Installer, Nix/mise, config e release versionate sono più riproducibili; fissare la versione riduce il churn. | -| Hacker di Pi che vuole costruire il proprio ambiente | **Pi + componenti `pi-config`** | Superficie ridotta, sorgenti leggibili, composizione libera. | -| Utente che vuole solo snippet, guard o browser | **Pi + singole estensioni** | Non serve adottare un fork molto più grande per tre capacità. | -| Chi apprezza subagent visibili e interattivi in tmux | **Pi + `pi-interactive-subagents`** | È una scelta UX specifica e ben distinta dall'Agent Hub. | -| Ambiente ad alta sicurezza | **Nessuno dei due senza isolamento OS** | I controlli applicativi non sostituiscono container/microVM; OMP va inoltre tolto da `yolo`. | -| Runtime Pi già integrato via RPC, come ThothII | **Restare su Pi salvo progetto di migrazione dedicato** | OMP offre RPC/ACP, ma package scope, caricamento estensioni, eventi e semantiche del fork richiedono test contrattuali: non è una sostituzione drop-in. | - -### Nota specifica per ThothII - -Per usare un agente nel terminale del repository, OMP può essere valutato senza cambiare l'architettura. **Sostituire invece il processo Pi che ThothII avvia in modalità RPC è un'altra decisione.** ThothII dipende dal contratto degli eventi RPC, dall'estensione gate, dal resume e dal comportamento di sessione. La [guida di porting di OMP](https://github.com/can1357/oh-my-pi/blob/main/docs/porting-from-pi-mono.md) e la sua [documentazione di caricamento estensioni](https://github.com/can1357/oh-my-pi/blob/main/docs/extension-loading.md) mostrano divergenze sufficienti da richiedere almeno una suite di compatibilità end-to-end prima di considerarlo un sostituto. - -## Verdetto - -**Il migliore in assoluto, per me, è Oh My Pi — con una release fissata e una configurazione iniziale più restrittiva del default.** Vince quasi tutte le categorie funzionali e riduce drasticamente il lavoro di integrazione. - -Non lo sceglierei però “alla cieca”: `yolo` come default è un caveat serio, la superficie enorme rende probabile qualche regressione e il fork crea più dipendenza dalle proprie API. Per una workstation con codice e credenziali reali lo metterei dietro approvazioni esplicite e isolamento OS. - -**Pi + `pi-config` è la scelta migliore quando l'obiettivo è un ambiente personale minimale e intenzionale**, non quando si cerca il maggior numero di funzioni. Installerei solo i componenti necessari, controllerei gli import dopo la migrazione da `@mariozechner/*` a `@earendil-works/*` e aggiungerei test prima di usarli in un flusso critico. diff --git a/docs/research/2026-09-07-zai-coding-plan-cli-quota.md b/docs/research/2026-09-07-zai-coding-plan-cli-quota.md deleted file mode 100644 index 3a3d1019..00000000 --- a/docs/research/2026-09-07-zai-coding-plan-cli-quota.md +++ /dev/null @@ -1,44 +0,0 @@ -# Z.ai Coding Plan: bonus di quota e client CLI - -Verifica effettuata il **7 settembre 2026**, esclusivamente su fonti ufficiali Z.ai/ZCode. - -## Risposta breve - -**No: Z.ai non documenta un bonus permanente del 150% (+50%) per un altro harness CLI.** La sola pagina ufficiale che usa oggi l'espressione “150% quota boost” è quella di **AutoClaw**: lo presenta come vantaggio a tempo limitato per piani Individual e Team, ma non precisa se significhi quota finale al 150% o incremento del 150%. AutoClaw è inoltre descritto come applicazione desktop per macOS e Windows, non come CLI da installare su un server. ([AutoClaw](https://autoclaw.z.ai/)) - -C'è però una promozione temporanea più interessante e formulata senza ambiguità: dal **3 al 20 settembre 2026**, ogni giorno fra le **23:00 e le 09:00 UTC+8**, GLM-5.3-Flash consuma zero quota in ZCode, mentre negli **altri agenti ufficialmente supportati la quota disponibile è raddoppiata**. In Italia, nel periodo della campagna, la finestra corrisponde alle **17:00–03:00 CEST**. La promozione vale per tutti i piani a pagamento e soltanto per GLM-5.3-Flash; GLM-5.3 continua a consumare la quota normale. ([GLM-5.3-Flash Usage Campaign](https://docs.z.ai/devpack/notice/event-glm-5.3-flash)) - -## Quali alternative CLI sono ufficialmente ammesse - -La pagina corrente dei tool supportati nomina espressamente questi client utilizzabili da terminale: - -| Harness | CLI/server | Stato nella documentazione Z.ai | Quota | -|---|---:|---|---| -| **Pi** | Sì | Esplicitamente incluso fra i Coding Agent Tool | Quota ordinaria; **2× su GLM-5.3-Flash nella finestra della campagna** | -| **Codex** | Sì | Esplicitamente incluso fra i Coding Agent Tool | Come sopra | -| **Claude Code** | Sì | Supportato e corredato da guida CLI ufficiale Z.ai | Come sopra | -| **OpenCode** | Sì | Supportato; guida ufficiale intitolata esplicitamente “OpenCode CLI” | Come sopra | -| **Droid** | Sì | Descritto da Z.ai come agente che gira nel terminale | Come sopra | -| **Crush** | Sì | Descritto esplicitamente come CLI/TUI | Come sopra | -| **Goose** | Sì | Incluso fra i Coding Agent Tool, con esecuzione locale | Come sopra | -| **Oh My Pi (OMP)** | Sì, tecnicamente | **Non è nominato** nell'elenco ufficiale; Z.ai nomina Pi, non OMP | Bonus e conformità **non confermati ufficialmente** | - -Fonti: [elenco ufficiale dei tool e endpoint Coding Plan](https://docs.z.ai/devpack/tool/others), [guida Claude Code](https://docs.z.ai/devpack/tool/claude), [guida OpenCode CLI](https://docs.z.ai/devpack/tool/opencode). - -Z.ai espone endpoint Coding Plan per Anthropic Messages, OpenAI Chat Completions e OpenAI Responses, ma questo **non rende automaticamente autorizzato qualunque client compatibile**: le condizioni limitano la quota ai tool ufficialmente supportati e avvertono che l'uso con integrazioni non autorizzate può comportare restrizioni. ([Subscription Terms](https://docs.z.ai/legal-agreement/subscription-terms), [Usage Policy](https://docs.z.ai/devpack/usage-policy)) - -## Implicazione pratica per il server - -Per il caso in esame sceglierei **Pi + configurazione Amos direttamente sul server**: Pi è ora nominato ufficialmente da Z.ai, funziona da terminale e, durante la campagna attuale, rientra ragionevolmente negli “other supported Agents” con quota raddoppiata per GLM-5.3-Flash. La configurazione Amos estende Pi senza sostituire il client; resta comunque prudente verificare nel pannello consumi che le chiamate vengano classificate come Pi. - -La seconda scelta è **OpenCode**, perché Z.ai fornisce una procedura CLI esplicita (`opencode auth login` → `Z.AI Coding Plan`). Claude Code è altrettanto documentato, ma la scelta dipende dalla preferenza per il suo harness. - -Non sceglierei OMP confidando nel bonus: benché possa usare endpoint compatibili, **Oh My Pi non compare per nome** nell'elenco autorizzato. La risposta ufficialmente difendibile è quindi: **Pi sì; OMP non confermato**. - -Infine, ZCode dispone oggi di pacchetti Linux, ma la documentazione li definisce sempre **desktop app** (`.AppImage`, `.deb`, `.rpm`) da lanciare con interfaccia grafica; non documenta una modalità CLI/headless equivalente a Pi o OpenCode. ([Installazione ZCode](https://zcode.z.ai/en/docs/install)) - -## Verdetto - -- Se si cerca **esattamente un +50% permanente**, non risulta alcun harness CLI ufficialmente documentato. -- Se si vuole sfruttare la **promozione corrente**, Pi, Codex, Claude Code, OpenCode, Droid, Crush e Goose sono alternative CLI ufficialmente supportate; nel periodo e nella fascia indicati ottengono **2×**, non 150%, usando GLM-5.3-Flash. -- Per questa infrastruttura sceglierei **Pi+Amos sul server**, oppure **OpenCode** se si desidera il percorso d'installazione più esplicitamente documentato da Z.ai. diff --git a/docs/research/2026-09-07-zed-acp-omp-pi.md b/docs/research/2026-09-07-zed-acp-omp-pi.md deleted file mode 100644 index 46cee69d..00000000 --- a/docs/research/2026-09-07-zed-acp-omp-pi.md +++ /dev/null @@ -1,67 +0,0 @@ -# ACP di Zed, Oh My Pi e Pi - -_Verifica effettuata il 7 settembre 2026 su documentazione e codice sorgente primari._ - -## In breve - -ACP (Agent Client Protocol) è un protocollo aperto che standardizza il collegamento tra un -editor/IDE e un coding agent. Il paragone utile è con LSP: LSP standardizza editor ↔ language -server, ACP standardizza editor ↔ agente. Il client (per esempio Zed) ospita l'interfaccia; -l'agent process conserva normalmente runtime, modelli, autenticazione, strumenti e configurazione. - -ACP usa JSON-RPC 2.0. Copre inizializzazione e autenticazione, creazione/ripristino delle sessioni, -prompt e cancellazione, streaming di testo e pensieri, piani e tool call, comandi, richieste di -permesso e — se entrambe le parti lo supportano — operazioni su filesystem e terminale. - -Fonti: [introduzione ACP](https://agentclientprotocol.com/overview/introduction), -[flusso e metodi del protocollo](https://agentclientprotocol.com/protocol/overview), -[External Agents in Zed](https://zed.dev/docs/ai/external-agents). - -## Confronto in Zed - -| Aspetto | Oh My Pi | Pi | -|---|---|---| -| Tipo di integrazione | Server ACP incorporato: `omp acp` | Adapter comunitario `pi-acp`, installabile dal registry di Zed | -| Collegamento al motore | ACP è una modalità dello stesso motore OMP | L'adapter avvia `pi --mode rpc` e traduce RPC ↔ ACP | -| Output e tool call | Streaming e tool call ACP nativi | Streaming, tool card, posizioni nei file e diff strutturati tradotti dall'adapter | -| File | Può inoltrare `read`/`write` al filesystem del client | Nessuna delega ACP `fs/*`; Pi legge e scrive localmente | -| Terminale | Può creare e seguire terminali del client | Nessuna delega ACP `terminal/*`; i comandi girano localmente | -| Permessi | `edit` e `bash` possono usare `session/request_permission` nell'editor | La UI riceve i tool call, ma non ha la stessa integrazione nativa di file/terminale | -| Sessioni | Implementazione diretta di sessioni, comandi e configurazione ACP | Mappa le sessioni ACP ai file di sessione Pi e supporta `session/load` | -| Skills/comandi | Carica skills, estensioni e slash command OMP | Carica skills e comandi Pi; l'adapter aggiunge comandi per l'uso headless | -| MCP configurati in Zed | OMP contiene il plumbing ACP/MCP nel proprio server | Accettati nei parametri ACP ma non inoltrati a Pi dall'adapter corrente | -| Maturità dichiarata | Funzionalità first-class del progetto | L'adapter si definisce “MVP-style” e centrato soprattutto su Zed | - -L'integrazione OMP non è solo una dichiarazione nel README: il comando ACP è parte del sorgente e -il `ClientBridge` instrada `read`, `write`, `bash`, `edit` e richieste di permesso verso il client -quando Zed annuncia le capacità corrispondenti. Fonti: -[README OMP](https://github.com/can1357/oh-my-pi/blob/daf07999c2fee9b22edc7bf8fea1fb6272e0df5e/README.md), -[comando ACP](https://github.com/can1357/oh-my-pi/blob/daf07999c2fee9b22edc7bf8fea1fb6272e0df5e/packages/coding-agent/src/commands/acp.ts), -[ACP ClientBridge](https://github.com/can1357/oh-my-pi/blob/daf07999c2fee9b22edc7bf8fea1fb6272e0df5e/packages/coding-agent/src/modes/acp/acp-client-bridge.ts). - -Pi è comunque supportato esplicitamente da Zed: si installa `pi ACP` dal registry. L'integrazione -è però un progetto separato e non una modalità presente nel core Pi. L'adapter corrente conserva -molto dell'esperienza utile — streaming, tool call, diff, resume, comandi e skills — ma dichiara -esplicitamente di non delegare filesystem o terminale a Zed e di non collegare a Pi gli MCP server -ricevuti dal client. Fonti: -[scheda Pi nel registry Zed](https://zed.dev/acp/agent/pi), -[manifest del registry](https://github.com/agentclientprotocol/registry/blob/9ec416a76f69c9ff8a8316931e38f4c74ad41fa8/pi-acp/agent.json), -[README e limiti di `pi-acp`](https://github.com/svkozak/pi-acp/blob/d1cffc047ab37a096ee70ca39cfc1de463db8d12/README.md), -[RPC di Pi](https://github.com/earendil-works/pi/blob/9211da172325117dc59e6f9f25f248dc628b3f81/packages/coding-agent/docs/rpc.md). - -## Giudizio - -**OMP si trova meglio con ACP perché ACP è una sua interfaccia nativa e il suo livello strumenti è -stato progettato per delegare operazioni all'editor.** Zed non è soltanto una finestra per la chat: -partecipa a file, terminale e autorizzazioni. - -**Pi si trova comunque bene con Zed per l'uso quotidiano**, specialmente per conversazione, -streaming, modifiche, diff e ripresa delle sessioni. Oggi, però, l'integrazione è meno profonda: -Zed controlla un adapter che controlla Pi via RPC, mentre file e shell rimangono dal lato Pi. - -Per Pi+Amos, i subagenti tmux non diventano automaticamente thread/subagenti nativi di Zed: ACP -espone la sessione Pi principale, mentre l'orchestrazione Amos continua nel proprio runtime e nei -pane tmux. È quindi una combinazione possibile, ma per osservare e pilotare direttamente quei pane -l'esperienza terminale/tmux resta più fedele. Questa conclusione è un'inferenza dall'architettura -dell'adapter (`pi-acp` avvia una singola sessione Pi RPC per sessione ACP) e dai limiti dichiarati, -non una garanzia esplicita del progetto Amos. diff --git a/docs/research/text-to-sql-products.md b/docs/research/text-to-sql-products.md deleted file mode 100644 index 99399ae3..00000000 --- a/docs/research/text-to-sql-products.md +++ /dev/null @@ -1,33 +0,0 @@ -# Prodotti text-to-SQL e natural-language-to-SQL - -Ricognizione di prodotti e siti ufficiali che consentono di interrogare dati strutturati -in linguaggio naturale e/o di generare SQL. Sono escluse pubblicazioni accademiche, -benchmark e articoli di terze parti. Le descrizioni riportano solo capacità dichiarate -nelle fonti ufficiali collegate. - -Data della ricerca: 2026-09-09. - -Nota di verifica: al 2026-09-09 SQLPilot non è stato verificato come raggiungibile. Il fetch -del sito ufficiale `https://sqlpilot.ai/` restituisce `502 Bad Gateway`; anche -`https://www.sqlpilot.ai/`, `http://sqlpilot.ai/`, `/download` e `/signup` non risultano -raggiungibili dal controllo diretto (risoluzione DNS fallita), senza redirect osservabili. -La pagina ufficiale indicizzata in precedenza resta una fonte storica, non una conferma di -disponibilità odierna. Non è stato individuato un URL ufficiale alternativo funzionante. - -| Prodotto | URL ufficiale | Descrizione verificabile | Modello | -|---|---|---|---| -| [Vanna AI](https://vanna.ai/) | [Sito](https://vanna.ai/) · [Documentazione](https://vanna.ai/docs/index.html) | Framework/agente SQL che permette agli utenti di porre domande in linguaggio naturale su un database. La documentazione descrive un flusso RAG: si addestra il modello con SQL, DDL e documentazione, poi `ask` genera SQL che può essere eseguito sul database. | Open source; disponibile anche come servizio/soluzione hosted ed enterprise. | -| [Wren AI](https://github.com/Canner/WrenAI) | [Repository ufficiale](https://github.com/Canner/WrenAI) · [Documentazione CLI](https://github.com/Canner/WrenAI/blob/main/docs/core/reference/cli.md) | Layer semantico open source per agenti e applicazioni GenBI. Il progetto dichiara supporto a text-to-SQL su oltre 20 sorgenti dati; la CLI conserva coppie natural-language-to-SQL e usa il contesto semantico/MDL per scrivere ed eseguire query. | Open source (licenza Apache-2.0 per il core dichiarato nel repository). | -| [Dataherald](https://github.com/Dataherald/dataherald) | [Repository ufficiale](https://github.com/Dataherald/dataherald) | Engine natural-language-to-SQL per domande su dati relazionali. Il repository descrive un’API che espone un database in modo interrogabile in linguaggio naturale e include componenti per engine, API enterprise, console amministrativa e Slackbot. | Open source (Apache-2.0); include componenti enterprise self-hosted. | -| [DB-GPT](https://github.com/eosphoros-ai/DB-GPT) | [Repository ufficiale](https://github.com/eosphoros-ai/DB-GPT) · [DB-GPT-Hub](https://github.com/eosphoros-ai/DB-GPT-Hub) | Framework open source per applicazioni data-driven e agenti, con un workflow Text-to-SQL documentato e un progetto Hub per dataset, modelli e fine-tuning dedicati alla conversione testo-SQL. | Open source. | -| [Snowflake Cortex Analyst](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst) | [Documentazione ufficiale](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst) | Servizio gestito di Snowflake con cui utenti business pongono domande in linguaggio naturale e ricevono risposte senza scrivere SQL. La documentazione lo descrive esplicitamente come sistema agentico che genera risposte text-to-SQL, usando semantic model/views per il contesto. | SaaS/enterprise gestito nella piattaforma Snowflake. | -| [Databricks Genie / Genie Agents](https://docs.databricks.com/gcp/en/genie-agents/concepts) | [Documentazione ufficiale](https://docs.databricks.com/gcp/en/genie-agents/concepts) · [API](https://docs.databricks.com/gcp/en/genie-agents/conversation-api) | Funzionalità Databricks per interagire con dati tramite linguaggio naturale. La documentazione dichiara che Genie converte i prompt in SQL, restituisce quando possibile la query generata e i risultati, e può porre domande di chiarimento. | SaaS/enterprise, integrato in Databricks. | -| [ThoughtSpot Spotter](https://www.thoughtspot.com/product/spotter-semantics) | [Pagina prodotto ufficiale](https://www.thoughtspot.com/product/spotter-semantics) · [SpotGuide](https://tsa-guide.thoughtspot.com/) | Interfaccia di analytics conversazionale: l’utente descrive ciò che vuole in linguaggio naturale e il motore genera query SQL deterministiche tramite il layer semantico. La guida ufficiale presenta Spotter come esperienza “no SQL” per cercare e interrogare i dati. | SaaS/enterprise analytics. | -| [Seek AI](https://www.seek.ai/ai-data-analyst) | [AI Data Analyst](https://www.seek.ai/ai-data-analyst) · [Product Overview](https://www.seek.ai/product-overview) | Piattaforma/agent per dati strutturati con un Dialogue Agent che interpreta domande in linguaggio naturale e un Semantic Parsing Agent che genera query; l’offerta include anche un’interfaccia embedded per prodotti SaaS e un’app nativa Snowflake. | SaaS/enterprise; disponibile anche come componente embedded e Snowflake Native App. | -| ~~SQLPilot~~ | [Sito ufficiale](https://sqlpilot.ai/) | **Non verificato al 2026-09-09**: il dominio ufficiale non è risultato raggiungibile (502/DNS) e non è stato trovato un redirect o un URL ufficiale alternativo funzionante. Una precedente indicizzazione ufficiale descriveva un editor SQL assistito da AI, ma non costituisce conferma di disponibilità odierna. | Non verificato. | - -## Note di perimetro - -- “Open source” indica un progetto il cui repository ufficiale dichiara una licenza o un core open source; non implica che eventuali servizi hosted siano gratuiti. -- “SaaS/enterprise” indica un prodotto gestito o venduto come piattaforma aziendale; le fonti ufficiali non sempre pubblicano prezzi o dettagli contrattuali. -- Le capacità possono dipendere dal database collegato, dal modello semantico configurato e dai permessi dell’installazione. diff --git a/docs/testing/2026-08-31-metadata-privacy-description-test-plan.md b/docs/testing/2026-08-31-metadata-privacy-description-test-plan.md index f60a8b93..01e056d6 100644 --- a/docs/testing/2026-08-31-metadata-privacy-description-test-plan.md +++ b/docs/testing/2026-08-31-metadata-privacy-description-test-plan.md @@ -60,8 +60,8 @@ Il comportamento da verificare deriva da: - stato corrente del progetto in `PROJECT_STATE.md`; - [contratto Catalog Schema Snapshot](../contracts/catalog-schema-snapshot.md); -- [piano del Metadata Catalog](../plans/2026-08-26-metadata-catalog-from-thothai.md); -- [specifica della generazione descrizioni](../plans/2026-08-28-ai-catalog-description-generation-spec.md); +- [piano del Metadata Catalog](../reports/knowledge-archives-release.md); +- [specifica della generazione descrizioni](../reports/knowledge-archives-release.md); - [ADR 0007: sincronizzazione autorevole durevole](../adr/0007-durable-authoritative-schema-synchronization.md); - [ADR 0009: un solo run sequenziale di generazione](../adr/0009-use-one-sequential-description-generation-run.md); - [ADR 0010: campioni reali limitati](../adr/0010-allow-bounded-real-source-samples-for-description-generation.md); diff --git a/scripts/auth-docs-smoke.sh b/scripts/auth-docs-smoke.sh index 092c4f96..557711e1 100755 --- a/scripts/auth-docs-smoke.sh +++ b/scripts/auth-docs-smoke.sh @@ -1,207 +1,5 @@ #!/usr/bin/env bash +# Current public guides and internal authentication contracts; no retired runbooks. set -euo pipefail - -script_root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) -root=$script_root -if [[ $# -gt 0 ]]; then - [[ $# -eq 2 && $1 == "--root" && -d $2 ]] || { - echo "usage: auth-docs-smoke.sh [--root DIRECTORY]" >&2 - exit 2 - } - root=$(cd "$2" && pwd -P) -fi -docs=( - "$root/docs/architecture/authentication.md" - "$root/docs/install/authentication-local.md" - "$root/docs/install/authentication-oidc.md" - "$root/docs/install/authentik.md" - "$root/docs/testing/authentication-manual-acceptance.md" - "$root/docs/architecture/overview.md" - "$root/docs/install/local.md" - "$root/docs/install/server.md" - "$root/docs/install/psd-workspace-setup.md" - "$root/docs/install/reverse-proxy-caddy.md" - "$root/docs/install/reverse-proxy-nginx.md" - "$root/docs/contracts/tht-pi.md" - "$root/docs/contracts/workspace-preprocessing-cli.md" - "$root/docs/guida-utente.md" - "$root/docs/index.md" - "$root/README.md" - "$root/PROJECT_STATE.md" - "$root/mkdocs.yml" -) - -for path in "${docs[@]}"; do - [[ -f "$path" ]] || { echo "auth docs smoke: missing $path" >&2; exit 1; } -done - -corpus=$(mktemp) -trap 'rm -f "$corpus"' EXIT -cat "${docs[@]}" >"$corpus" - -required=( - "tht auth" - "groups" - "TOT Admin" - "THT_OIDC_CLIENT_SECRET" - "THT_AUTHENTIK_API_TOKEN" - "Remember me" - "oidc_mapped_group_missing" - "oidc_callback_failed" - "session.read_all" - "workspace.secrets.manage" - "auth.diagnostics.read" -) -for term in "${required[@]}"; do - rg -Fq "$term" "$corpus" || { echo "auth docs smoke: missing required term: $term" >&2; exit 1; } -done - -canonical_compose='docker compose --env-file deploy/env/local.env -f compose.yaml -f deploy/compose.local.yaml up --build -d' -rg -Fxq "$canonical_compose" "$root/docs/install/local.md" || { - echo "auth docs smoke: missing canonical local Compose command" >&2 - exit 1 -} -if rg -n -F 'docker compose --env-file deploy/env/local.env +' "$corpus"; then - echo "auth docs smoke: noncanonical local Compose command" >&2 - exit 1 -fi - -nav_count=$(awk 'index($0, "architecture/authentication.md") { count++ } END { print count + 0 }' "$root/mkdocs.yml") -[[ $nav_count == 1 ]] || { - echo "auth docs smoke: authentication navigation must appear exactly once" >&2 - exit 1 -} - -python3 - "$root" <<'PY' -import pathlib -import re -import sys - -root = pathlib.Path(sys.argv[1]) -architecture = (root / "docs/architecture/authentication.md").read_text() - -user_row = "| `user` | `session.use` |" -admin_row = ( - "| `admin` | `session.use`, `session.read_all`, `session.manage_all`, `settings.manage`, " - "`workspace.manage`, `workspace.secrets.manage`, `database.manage`, `pi.manage`, `auth.diagnostics.read` |" -) -if user_row not in architecture or admin_row not in architecture: - raise SystemExit("auth docs smoke: role-to-permission map is not exact") - -diagnostic_heading = "## Diagnostics and ordering" -diagnostic_start = architecture.find(diagnostic_heading) -diagnostic_end = architecture.find("\n## ", diagnostic_start + len(diagnostic_heading)) -diagnostic_section = architecture[diagnostic_start:diagnostic_end if diagnostic_end >= 0 else None] -match = re.search(r"```text\n([\s\S]*?)```", diagnostic_section) -expected_codes = [ - "auth_ready", - "auth_config_incomplete", - "auth_config_invalid", - "auth_session_store_invalid", - "local_user_registry_invalid", - "local_admin_missing", - "oidc_secret_missing", - "oidc_discovery_unreachable", - "oidc_issuer_mismatch", - "oidc_jwks_unreachable", - "oidc_group_catalog_unreachable", - "oidc_group_catalog_unauthorized", - "oidc_mapped_group_missing", - "oidc_mapped_group_ambiguous", - "oidc_groups_claim_invalid", - "oidc_device_flow_unavailable", -] -actual_codes = [] if match is None else [line for line in match.group(1).splitlines() if line] -if actual_codes != expected_codes: - raise SystemExit("auth docs smoke: diagnostic code union is not exact") - -for relative, language, forbidden, required in [ - ("docs/install/reverse-proxy-caddy.md", "caddyfile", "forward_auth", "forward_auth"), - ("docs/install/reverse-proxy-nginx.md", "nginx", "auth_request", "auth_request"), -]: - source = (root / relative).read_text() - direct_start = source.find("## Direct ThothII-managed OIDC") - deprecated_start = source.find("## Deprecated upstream migration mode") - if direct_start < 0 or deprecated_start <= direct_start: - raise SystemExit(f"auth docs smoke: {relative} does not split direct and deprecated modes") - direct = source[direct_start:deprecated_start] - deprecated_end = source.find("\n## ", deprecated_start + 4) - deprecated = source[deprecated_start:deprecated_end if deprecated_end >= 0 else None] - blocks = re.findall(rf"```{language}\n([\s\S]*?)```", direct) - direct_code = "\n".join(blocks) - if "/api/auth/oidc/login" not in direct or "/api/auth/oidc/callback" not in direct: - raise SystemExit(f"auth docs smoke: {relative} omits unchanged public OIDC paths") - if re.search(rf"(?m)^\s*{forbidden}\b", direct_code): - raise SystemExit(f"auth docs smoke: {relative} applies external auth in direct OIDC mode") - deprecated_code = "\n".join( - re.findall(rf"```{language}\n([\s\S]*?)```", deprecated) - ) - if not re.search(rf"(?m)^\s*{required}\b", deprecated_code): - raise SystemExit(f"auth docs smoke: {relative} omits scoped deprecated upstream auth") -PY - -if rg -n -i --pcre2 '\bthothii-admin\b|\bthothctl\b' "$corpus"; then - echo "auth docs smoke: forbidden obsolete host CLI wording" >&2 - exit 1 -fi -if rg -n -i --pcre2 -- '--password(?!-file)\b(?:[[:space:]]+|=)\S+' "$corpus"; then - echo "auth docs smoke: plaintext password option" >&2 - exit 1 -fi -if rg -n -i --pcre2 '(?:^|[,{[:space:]])password[[:space:]]*:[[:space:]]*\S+|"password"[[:space:]]*:[[:space:]]*(?:"[^"]+"|[^,}[:space:]]+)' "$corpus"; then - echo "auth docs smoke: plaintext password field" >&2 - exit 1 -fi -if rg -n -i --pcre2 '(?:unmapped|additional|extra)[^.\r\n]{0,160}groups?[^.\r\n]{0,160}(?:generate|produce|emit|cause|trigger|raise|create|result)[^.\r\n]{0,160}(?:warnings?|alerts?|advisory|advisories|notices?|notifications?|noise)|(?:warnings?|alerts?|advisory|advisories|notices?|notifications?|noise)[^.\r\n]{0,160}(?:generate|produce|emit|cause|trigger|raise|create|result)[^.\r\n]{0,160}(?:unmapped|additional|extra)[^.\r\n]{0,160}groups?' "$corpus"; then - echo "auth docs smoke: misleading noise claim for unmapped groups" >&2 - exit 1 -fi - -# Projected server authentication documentation contract. -projection_docs=( - "$root/docs/install/server.md" - "$root/docs/install/authentication-local.md" - "$root/docs/testing/authentication-manual-acceptance.md" - "$root/docs/testing/psd-server-project-a-manual.md" - "$root/docs/plans/2026-08-20-psd-server-project-a-standalone.md" - "$root/PROJECT_STATE.md" -) -projection_corpus=$(mktemp) -trap 'rm -f "$corpus" "$projection_corpus"' EXIT -cat "${projection_docs[@]}" >"$projection_corpus" -projection_required=( - "canonical authentication root" "runtime projection" "CURRENT" "generations" - "root:root 0700/0600" "10001:10001 0700/0600" - "THT_AUTH_RUNTIME_ROOT" - "auth status --json" "auth publish" - "candidate or recovery" "Mac, Windows, and local direct-file authentication" - "explicit authorization" -) -for term in "${projection_required[@]}"; do - rg -Fqi "$term" "$projection_corpus" || { - echo "auth docs smoke: missing runtime-projection term: $term" >&2 - exit 1 - } -done -if rg -n -i --pcre2 "(?:useradd|groupadd)[^\n]{0,100}10001|10001[^\n]{0,100}(?:useradd|groupadd)" "$projection_corpus"; then - echo "auth docs smoke: runtime projection creates a host 10001 identity" >&2 - exit 1 -fi -if rg -n -i --pcre2 '(?:^|[.!?]\s+)(?:(?:mount|bind)\s+(?:the\s+)?(?:canonical authentication root|auth-canonical)\b[^\n]{0,120}(?:core|/run/thothii-auth)|(?:core|the core service)\s+(?:mounts?|binds?)\s+(?:the\s+)?(?:canonical authentication root|auth-canonical)\b)|auth-canonical[^\n]{0,120}:/run/thothii-auth' "$projection_corpus"; then - echo "auth docs smoke: canonical authentication is mounted into core" >&2 - exit 1 -fi -if rg -n -i --pcre2 '(?:(?:operators?\s+)?(?:may|can|should|must)\s+(?!not\b|never\b)(?:edit|write|modify|prune)|^\s*(?:sudo\s+)?(?:vi|vim|nano|sed|cp|mv|rm|tee|printf|echo)\b)[^\n]*(?:CURRENT|generations)' "$projection_corpus"; then - echo "auth docs smoke: runtime projection permits direct selector or generation edits" >&2 - exit 1 -fi -if rg -n -i --pcre2 '(?:^\s*(?:sudo\s+nginx\s+-T|(?:sudo\s+)?(?:printenv|env)(?:\s|$)|(?:sudo\s+)?(?:diff|cat|less|more|head|tail|yq)\s+[^\n]*(?:secret|auth\.yaml|users\.yaml))|(?:may|can|should|must)\s+(?!not\b|never\b)(?:dump|print|capture|attach|include|run)\b[^\n]*(?:password|auth\.yaml|users\.yaml|YAML|raw environment|nginx\s+-T|secret-bearing diff))' "$projection_corpus"; then - echo "auth docs smoke: runtime projection documents unsafe evidence collection" >&2 - exit 1 -fi -if rg -n -i --pcre2 'Project A (?:has been|was|is) started|legacy[- ]stack (?:has been|was|is) changed' "$projection_corpus"; then - echo "auth docs smoke: runtime projection claims live Project A or legacy mutation" >&2 - exit 1 -fi - -echo "auth docs smoke: required terms and forbidden wording checks passed" +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +exec python3 "$root/scripts/verify-auth-docs.py" auth "$@" diff --git a/scripts/test-auth-docs-smoke.sh b/scripts/test-auth-docs-smoke.sh index 6275427a..3f23c206 100755 --- a/scripts/test-auth-docs-smoke.sh +++ b/scripts/test-auth-docs-smoke.sh @@ -1,96 +1,4 @@ #!/usr/bin/env bash set -euo pipefail - root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) -tmp=$(mktemp -d "${TMPDIR:-/tmp}/thoth-auth-docs.XXXXXX") -trap 'rm -rf "$tmp"' EXIT - -files=( - docs/architecture/authentication.md - docs/install/authentication-local.md - docs/install/authentication-oidc.md - docs/install/authentik.md - docs/testing/authentication-manual-acceptance.md - docs/architecture/overview.md - docs/install/local.md - docs/install/server.md - docs/install/psd-workspace-setup.md - docs/install/reverse-proxy-caddy.md - docs/install/reverse-proxy-nginx.md - docs/contracts/tht-pi.md - docs/contracts/workspace-preprocessing-cli.md - docs/guida-utente.md - docs/index.md - README.md - PROJECT_STATE.md - mkdocs.yml -) - -make_fixture() { - local name=${1:?fixture name required} - local fixture="$tmp/$name" - mkdir -p "$fixture" - for relative in "${files[@]}"; do - mkdir -p "$fixture/$(dirname "$relative")" - cp "$root/$relative" "$fixture/$relative" - done - printf '%s\n' "$fixture" -} - -expect_rejected() { - local name=${1:?fixture name required} - local fixture_text=${2:?fixture text required} - local expected=${3:?expected error required} - local fixture output - fixture=$(make_fixture "$name") - printf '%s\n' "$fixture_text" >>"$fixture/README.md" - output="$tmp/$name.output" - if "$root/scripts/auth-docs-smoke.sh" --root "$fixture" >"$output" 2>&1; then - echo "auth docs fixture unexpectedly passed: $name" >&2 - exit 1 - fi - rg -Fq "$expected" "$output" || { - echo "auth docs fixture failed for the wrong reason: $name" >&2 - sed -n '1,20p' "$output" >&2 - exit 1 - } - echo "auth docs negative fixture rejected: $name" -} - -positive=$(make_fixture positive) -printf '%s\n' \ - 'Use --password-file ; never pass a password value.' \ - 'Additional unmapped groups are silently ignored without warnings, alerts, or advisories.' \ - >>"$positive/README.md" -"$root/scripts/auth-docs-smoke.sh" --root "$positive" >/dev/null -echo "auth docs positive fixture passed" - -expect_rejected thothctl-intervening \ - 'Run thothctl --installation --json auth check.' \ - 'forbidden obsolete host CLI wording' -expect_rejected alternate-admin \ - 'Run thothii-admin users list.' \ - 'forbidden obsolete host CLI wording' -expect_rejected password-option \ - 'Run tht auth user add demo --password example-value.' \ - 'plaintext password option' -expect_rejected yaml-password \ - 'password: example-value' \ - 'plaintext password field' -expect_rejected json-password \ - '{"password": "example-value"}' \ - 'plaintext password field' -expect_rejected unmapped-warning \ - 'Unmapped OIDC groups generate warnings.' \ - 'misleading noise claim for unmapped groups' -expect_rejected unmapped-alert \ - 'Unmapped provider groups trigger operator alerts.' \ - 'misleading noise claim for unmapped groups' -expect_rejected unmapped-advisory \ - 'An advisory is emitted for every unmapped group.' \ - 'misleading noise claim for unmapped groups' -expect_rejected compose-plus \ - 'docker compose --env-file deploy/env/local.env + -f compose.yaml -f deploy/compose.local.yaml up --build -d' \ - 'noncanonical local Compose command' - -echo "auth docs smoke fixture suite passed" +exec python3 "$root/scripts/test-verify-auth-docs.py" auth diff --git a/scripts/test-canonical-install-compose.sh b/scripts/test-canonical-install-compose.sh index 586c70aa..66f4669c 100755 --- a/scripts/test-canonical-install-compose.sh +++ b/scripts/test-canonical-install-compose.sh @@ -110,18 +110,13 @@ if (JSON.stringify(config).includes("fixture-model-api-key")) { NODE done -for manual in "$root/README.md" "$root/docs/installazione-docker-4-contesti.md"; do - grep -Fq -- './scripts/run-stack.sh' "$manual" || { - echo "${manual#"$root/"} lacks the canonical local launcher" >&2 - exit 1 - } - grep -Fq -- 'docker compose --env-file deploy/env/server.env' "$manual" \ - && grep -Fq -- '-f compose.yaml -f deploy/compose.server.yaml' "$manual" || { - echo "${manual#"$root/"} lacks the canonical server base+profile command" >&2 +for manual in "$root/docs/install/standalone-manual-it.md" "$root/docs/install/standalone-manual-en.md"; do + grep -Fq -- '--configure-only' "$manual" && grep -Fq -- 'catalog-migrate' "$manual" || { + echo "${manual#"$root/"} omits explicit configuration or migration" >&2 exit 1 } if rg -q 'local-compose\.workspace-registry|server-compose\.workspace-registry' "$manual"; then - echo "${manual#"$root/"} still references a superseded standalone Compose example" >&2 + echo "${manual#"$root/"} references a retired Compose example" >&2 exit 1 fi done diff --git a/scripts/test-deployment-command-contract.sh b/scripts/test-deployment-command-contract.sh index 1c97be7e..2740ffe9 100755 --- a/scripts/test-deployment-command-contract.sh +++ b/scripts/test-deployment-command-contract.sh @@ -13,7 +13,7 @@ targets=( deploy/secrets/README.md docs/install docs/index.md - docs/installazione-docker-4-contesti.md + docs/operations/compose-reference.md scripts/build-local.sh scripts/build-local.ps1 scripts/docker-smoke.sh @@ -43,7 +43,7 @@ case "$rg_status" in ;; esac -for document in README.md docs/installazione-docker-4-contesti.md; do +for document in docs/operations/compose-reference.md; do grep -Fq -- '-f deploy/compose.session-server.yaml.example' "$document" || { echo "$document omits the required public-server session override" >&2 exit 1 diff --git a/scripts/test-no-deployment-coupling.sh b/scripts/test-no-deployment-coupling.sh index 67a6f0df..02f92a4a 100755 --- a/scripts/test-no-deployment-coupling.sh +++ b/scripts/test-no-deployment-coupling.sh @@ -40,7 +40,7 @@ if [[ -d docker ]]; then done < <(find docker -type f -print0) fi -for file in README.md .env.example docs/installazione-docker-4-contesti.md; do +for file in README.md .env.example docs/operations/compose-reference.md; do add_file install_files "$file" done if [[ -d docs/install ]]; then diff --git a/scripts/test-verify-auth-docs.py b/scripts/test-verify-auth-docs.py new file mode 100644 index 00000000..8df2f931 --- /dev/null +++ b/scripts/test-verify-auth-docs.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +"""Mutation fixtures for current auth/DWH documentation; never contacts services.""" +import importlib.util +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +SCRIPT = ROOT / "scripts/verify-auth-docs.py" +spec = importlib.util.spec_from_file_location("authdocs", SCRIPT) +module = importlib.util.module_from_spec(spec) +spec.loader.exec_module(module) +mode = sys.argv[1] if len(sys.argv) > 1 else "auth" +assert mode in ("auth", "dwh") +relative = next(iter(module.AUTH if mode == "auth" else module.DWH)) + +with tempfile.TemporaryDirectory(prefix="thoth-auth-docs-") as tmp: + fixture = Path(tmp) + shutil.copytree(ROOT / "docs", fixture / "docs") + for item in ROOT.glob("*.md"): + shutil.copy2(item, fixture / item.name) + target = fixture / relative + original = target.read_text() + + def check(expected=None): + result = subprocess.run([sys.executable, str(SCRIPT), mode, "--root", tmp], capture_output=True, text=True) + if expected is None: + assert result.returncode == 0, result.stderr + else: + assert result.returncode != 0 and expected in result.stderr, result.stderr + + check() + mutations = [ + ("curl -k https://example.invalid", "TLS bypass"), + ("curl --insecure https://example.invalid", "TLS bypass"), + ("verify_tls=false", "TLS bypass"), + ("DWH_API_KEY=synthetic", "raw environment secret"), + ('curl -H "X-API-Key: synthetic" https://example.invalid', "raw key header"), + ("tht auth user add demo --password synthetic", "secret argument"), + ("password: synthetic", "plaintext password"), + ("chmod 644 /protected/demo.key", "world-readable secret"), + ("sudo nginx -T", "raw nginx capture"), + ("git diff /protected/secret", "raw diff capture"), + ("docker compose up dwh-auth", "Compose coupling"), + ("thtdwh_v1." + "a" * 16 + "." + "b" * 43, "credential literal"), + ("secret_sha256: " + "a" * 64, "credential digest"), + ("auth-canonical:/run/thothii-auth:ro", "canonical auth root"), + ("useradd --uid 10001 core", "host runtime identity"), + ("nano /protected/generations/one/auth.yaml", "direct auth projection edit"), + ] + for snippet, error in mutations: + target.write_text(original + "\n```sh\n" + snippet + "\n```\n") + check(error) + target.write_text(original + '\nDo not use `curl -k`.\n```sh\nDWH_API_KEY_FILE=/protected/demo.key\n```\n') + check() + if mode == "auth": + target.write_text(original.replace("`memory.manage`, ", "")) + check("role-to-permission") + target.write_text(original.replace("auth_ready\n", "auth_unknown\n")) + check("diagnostic code") + target.write_text(original + "\n[broken](missing-file.md)\n") + check("broken local link") + target.unlink() + check("missing") +print(f"{mode} documentation mutation fixtures passed") diff --git a/scripts/test-verify-dwh-auth-docs.sh b/scripts/test-verify-dwh-auth-docs.sh index 3ba12059..1da9261d 100755 --- a/scripts/test-verify-dwh-auth-docs.sh +++ b/scripts/test-verify-dwh-auth-docs.sh @@ -1,319 +1,4 @@ #!/usr/bin/env bash set -euo pipefail - root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) -verify="$root/scripts/verify-dwh-auth-docs.sh" -temp_root= - -report_pass() { - printf 'case=%s status=PASS\n' "$1" -} - -report_fail() { - printf 'case=%s status=FAIL\n' "$1" >&2 - exit 1 -} - -cleanup() { - if [[ "$temp_root" == /tmp/thothii-dwh-auth-docs.* && -d "$temp_root" ]]; then - rm -rf -- "$temp_root" - fi -} -trap cleanup EXIT - -[[ -x "$verify" ]] || report_fail verifier_missing - -temp_root=$(mktemp -d /tmp/thothii-dwh-auth-docs.XXXXXXXX) || report_fail fixture_root -fixture_root="$temp_root/fixture" -mkdir -p "$fixture_root/docs/install" "$fixture_root/docs/operations" \ - "$fixture_root/docs/testing/evidence" "$fixture_root/scripts" "$fixture_root/deploy/psd" - -for relative in \ - docs/install/dwh-auth-server.md \ - docs/install/dwh-auth-client-enrollment.md \ - docs/install/dwh-auth-tls.md \ - docs/operations/psd-dwh-auth-rollout.md \ - docs/testing/dwh-auth-manual-acceptance.md \ - docs/testing/evidence/psd-dwh-auth-rollout-report-template.md \ - docs/install/local-workspace-registry.md \ - docs/install/server-workspace-registry.md \ - docs/install/psd-workspace-setup.md \ - docs/guida-utente.md \ - docs/index.md \ - mkdocs.yml; do - mkdir -p "$fixture_root/$(dirname "$relative")" - cp "$root/$relative" "$fixture_root/$relative" -done -cp -a "$root/docs/." "$fixture_root/docs/" -cp "$root/deploy/psd/workspace-bindings.env.example" "$fixture_root/deploy/psd/workspace-bindings.env.example" - -"$verify" --root "$fixture_root" || report_fail positive_source -report_pass positive_source - -expect_rejected() { - local name=$1 target=$2 addition=$3 - local case_root="$temp_root/$name" - cp -a "$fixture_root" "$case_root" - printf '\n%s\n' "$addition" >>"$case_root/$target" - if "$verify" --root "$case_root" >/dev/null 2>&1; then - report_fail "$name" - fi - report_pass "$name" -} - -exercise_header_file_curl() { - local v1_header="$temp_root/synthetic-v1.header" - local legacy_header="$temp_root/synthetic-legacy.header" - command -v curl >/dev/null 2>&1 || report_fail header_file_curl_command - printf '%s\n' 'X-API-Key: synthetic-v1' >"$v1_header" - printf '%s\n' 'X-API-Key: legacy opaque value /:[]' >"$legacy_header" - chmod 0600 "$v1_header" "$legacy_header" - if ! python3 - "$v1_header" "$legacy_header" <<'PY' -import http.server -import pathlib -import stat -import subprocess -import sys -import threading - -accepted = {"synthetic-v1", "legacy opaque value /:[]"} - -class Handler(http.server.BaseHTTPRequestHandler): - def log_message(self, _format, *_args): - pass - - def do_GET(self): - self.send_response(204 if self.headers.get("X-API-Key") in accepted else 401) - self.end_headers() - -server = http.server.ThreadingHTTPServer(("127.0.0.1", 0), Handler) -thread = threading.Thread(target=server.serve_forever, daemon=True) -thread.start() -try: - for header_file in sys.argv[1:]: - if stat.S_IMODE(pathlib.Path(header_file).stat().st_mode) != 0o600: - raise SystemExit(1) - result = subprocess.run( - ["curl", "--silent", "--show-error", "--output", "/dev/null", "--write-out", "%{http_code}", "--header", f"@{header_file}", f"http://127.0.0.1:{server.server_port}/rpc/ping"], - check=False, - stdout=subprocess.PIPE, - stderr=subprocess.DEVNULL, - text=True, - ) - if result.returncode != 0 or result.stdout != "204": - raise SystemExit(1) -finally: - server.shutdown() - thread.join() -PY - then - report_fail header_file_curl_synthetic - fi - report_pass header_file_curl_synthetic -} - -# Build synthetic only-in-fixture text at runtime: it is never a provisioned credential. -fake_key="thtdwh_v1.$(printf 'A%.0s' {1..16}).$(printf 'A%.0s' {1..43})" -fake_digest="$(printf 'A%.0s' {1..43})" - -expect_rejected credential_literal docs/install/dwh-auth-client-enrollment.md "$fake_key" -expect_rejected opaque_legacy_header_literal docs/install/dwh-auth-client-enrollment.md "curl --header 'X-API-Key: opaque-legacy-fixture' https://example.invalid/dwh/rpc/ping" -expect_rejected credential_digest_literal docs/testing/evidence/psd-dwh-auth-rollout-report-template.md "\"secret_sha256\": \"$fake_digest\"" -expect_rejected curl_insecure docs/install/dwh-auth-tls.md 'curl -k https://example.invalid/dwh/rpc/ping' -expect_rejected tls_disabled docs/install/dwh-auth-tls.md 'verify_tls=false' -expect_rejected secret_in_environment docs/install/dwh-auth-client-enrollment.md "export THT_WS_PSD_CLINICAL_DWH_API_KEY=$fake_key" -expect_rejected secret_in_argv docs/install/dwh-auth-client-enrollment.md "curl -H 'X-API-Key: $fake_key' https://example.invalid/dwh/rpc/ping" -expect_rejected curl_config_artifact docs/install/dwh-auth-server.md 'curl --config /root/dwh-auth-provision/request.conf https://example.invalid/dwh/rpc/ping' -expect_rejected world_readable_secret docs/install/dwh-auth-server.md 'chmod 0644 /root/dwh-auth-provision/client.key' -expect_rejected sudo_raw_nginx_capture docs/operations/psd-dwh-auth-rollout.md 'sudo nginx -T > /tmp/nginx-full.conf' -expect_rejected raw_diff_capture docs/operations/psd-dwh-auth-rollout.md 'sudo diff -u /etc/nginx/sites-available/policlinicosandonato /root/backup.conf' -expect_rejected git_raw_diff_capture docs/operations/psd-dwh-auth-rollout.md 'git diff --no-index /root/old.conf /root/new.conf' -expect_rejected raw_nginx_capture docs/operations/psd-dwh-auth-rollout.md 'nginx -T > /tmp/nginx-full.conf' -expect_rejected compose_coupling docs/install/dwh-auth-server.md 'docker compose up dwh-auth' - -expect_replacement_rejected() { - local name=$1 target=$2 needle=$3 replacement=$4 - local case_root="$temp_root/$name" - cp -a "$fixture_root" "$case_root" - [[ $(grep -Foc -- "$needle" "$case_root/$target") -eq 1 ]] || report_fail "${name}_fixture" - sed -i "s~$needle~$replacement~" "$case_root/$target" - if "$verify" --root "$case_root" >/dev/null 2>&1; then report_fail "$name"; fi - report_pass "$name" -} - - -expect_global_replacement_rejected() { - local name=$1 target=$2 needle=$3 replacement=$4 - local case_root="$temp_root/$name" - cp -a "$fixture_root" "$case_root" - [[ $(grep -Foc -- "$needle" "$case_root/$target") -gt 0 ]] || report_fail "${name}_fixture" - sed -i "s~$needle~$replacement~g" "$case_root/$target" - if "$verify" --root "$case_root" >/dev/null 2>&1; then report_fail "$name"; fi - report_pass "$name" -} - -exercise_header_file_curl - -exercise_journal_scanner() { - local journal_source="$fixture_root/docs/install/dwh-auth-server.md" - local journal_code - journal_code=$(python3 - "$journal_source" <<'PY2' -import pathlib -import sys - -source = pathlib.Path(sys.argv[1]).read_text(encoding="utf-8") -start = source.index("if sudo python3 -c '") + len("if sudo python3 -c '") -end = source.index("' \"$since\" \"$v1_key_file\" \"$legacy_key_file\"; then", start) -print(source[start:end]) -PY2 -) || report_fail journal_extract - [[ "$journal_code" == *"process.stdout.read1("* ]] || report_fail journal_chunk_reader - [[ "$journal_code" != *"enumerate(process.stdout"* ]] || report_fail journal_unbounded_reader - - local fake_bin="$temp_root/fake-bin" - local fake_journalctl="$fake_bin/journalctl" - local data_file="$temp_root/journal.data" - local pid_file="$temp_root/journal.pid" - local stdout_file="$temp_root/journal.stdout" - local stderr_file="$temp_root/journal.stderr" - mkdir -p "$fake_bin" - python3 - "$fake_journalctl" <<'PY2' -import pathlib -import sys - -path = pathlib.Path(sys.argv[1]) -path.write_text("""#!/usr/bin/env python3 -import os -import pathlib -import sys -import time - -pathlib.Path(os.environ["JOURNAL_PID_FILE"]).write_text(str(os.getpid())) -data = pathlib.Path(os.environ["JOURNAL_DATA_FILE"]).read_bytes() -for offset in range(0, len(data), 997): - os.write(sys.stdout.fileno(), data[offset:offset + 997]) -if os.environ.get("JOURNAL_HOLD") == "1": - time.sleep(30) -raise SystemExit(int(os.environ.get("JOURNAL_EXIT", "0"))) -""") -path.chmod(0o755) -PY2 - - local key_file="$temp_root/synthetic-real.key" - local legacy_file="$temp_root/synthetic-legacy.key" - printf '%s' 'REAL_SECRET_SYNTHETIC' >"$key_file" - printf '%s' 'LEGACY_SECRET_SYNTHETIC' >"$legacy_file" - chmod 0600 "$key_file" "$legacy_file" - - run_journal_case() { - local name=$1 expected=$2 data=$3 exit_code=$4 hold=$5 - printf '%s' "$data" >"$data_file" - : >"$pid_file" "$stdout_file" "$stderr_file" - if PATH="$fake_bin:$PATH" JOURNAL_DATA_FILE="$data_file" JOURNAL_PID_FILE="$pid_file" JOURNAL_EXIT="$exit_code" JOURNAL_HOLD="$hold" \ - python3 -c "$journal_code" synthetic-since "$key_file" "$legacy_file" >"$stdout_file" 2>"$stderr_file"; then - actual=0 - else - actual=$? - fi - [[ "$actual" -eq "$expected" ]] || report_fail "journal_${name}_status" - [[ ! -s "$stdout_file" && ! -s "$stderr_file" ]] || report_fail "journal_${name}_output" - if [[ -s "$pid_file" ]]; then - pid=$(cat "$pid_file") - [[ ! -e "/proc/$pid" ]] || report_fail "journal_${name}_reaped" - fi - report_pass "journal_${name}" - } - - local python_bin - python_bin=$(command -v python3) || report_fail python_missing - - run_journal_case clean 0 $'INFO clean\n' 0 0 - run_journal_case oversized_line 2 "$(printf 'A%.0s' {1..1048577})" 0 0 - run_journal_case too_many_lines 2 "$(printf 'x\n%.0s' {1..10001})" 0 0 - run_journal_case child_failure 2 $'INFO child failure\n' 7 0 - run_journal_case actual_key_across_chunk 1 "$(printf 'A%.0s' {1..65530})REAL_SECRET_SYNTHETIC" 0 1 - - local empty_path="$temp_root/empty-path" - mkdir -p "$empty_path" - printf '%s' 'INFO spawn failure\n' >"$data_file" - : >"$pid_file" "$stdout_file" "$stderr_file" - if PATH="$empty_path" JOURNAL_DATA_FILE="$data_file" JOURNAL_PID_FILE="$pid_file" JOURNAL_EXIT=0 JOURNAL_HOLD=0 \ - "$python_bin" -c "$journal_code" synthetic-since "$key_file" "$legacy_file" >"$stdout_file" 2>"$stderr_file"; then - actual=0 - else - actual=$? - fi - [[ "$actual" -eq 2 ]] || report_fail journal_spawn_failure_status - [[ ! -s "$stdout_file" && ! -s "$stderr_file" ]] || report_fail journal_spawn_failure_output - [[ ! -s "$pid_file" ]] || report_fail journal_spawn_failure_child - report_pass journal_spawn_failure - - chmod 000 "$key_file" - : >"$pid_file" "$stdout_file" "$stderr_file" - if PATH="$fake_bin:$PATH" JOURNAL_DATA_FILE="$data_file" JOURNAL_PID_FILE="$pid_file" JOURNAL_EXIT=0 JOURNAL_HOLD=0 \ - "$python_bin" -c "$journal_code" synthetic-since "$key_file" "$legacy_file" >"$stdout_file" 2>"$stderr_file"; then - actual=0 - else - actual=$? - fi - chmod 0600 "$key_file" - [[ "$actual" -eq 2 ]] || report_fail journal_key_unreadable_status - [[ ! -s "$stdout_file" && ! -s "$stderr_file" ]] || report_fail journal_key_unreadable_output - [[ ! -s "$pid_file" ]] || report_fail journal_key_unreadable_child - report_pass journal_key_unreadable - - python3 - "$key_file" <<'PY2' -import pathlib -import sys - -pathlib.Path(sys.argv[1]).write_bytes(b"K" * 65_537) -PY2 - run_journal_case long_key_across_chunks 1 "$(printf 'A%.0s' {1..65535})$(printf 'K%.0s' {1..65537})" 0 1 -} - -exercise_journal_scanner - -expect_replacement_rejected missing_exact_gui_label docs/install/dwh-auth-client-enrollment.md "Validate workspace source" "Validate workspace" -expect_replacement_rejected server_transport_contradiction docs/operations/psd-dwh-auth-rollout.md 'server PSD: `postgres_direct` read-only' 'server PSD: `rest_api` read-only' -expect_replacement_rejected missing_mac_local_marker deploy/psd/workspace-bindings.env.example "Mac/local/remota" "server PSD" -expect_replacement_rejected missing_private_ca docs/install/psd-workspace-setup.md "TLS_CA_FILE" "TLS_CA_REMOVED" -expect_global_replacement_rejected missing_socket_path docs/install/dwh-auth-server.md "/run/dwh-auth/verify.sock" "/run/dwh-auth/other.sock" -expect_replacement_rejected rest_transport_flag deploy/psd/workspace-bindings.env.example "THT_WS_PSD_CLINICAL_DWH_TRANSPORT=rest_api" "THT_WS_PSD_CLINICAL_DWH_TRANSPORT=postgres_direct" - -expect_replacement_rejected wrong_key_output_path docs/install/dwh-auth-server.md "key_output=/root/dwh-auth-provision/psd-mac-primary.key" "key_output=/root/dwh-auth-provision/psd-mac-primary-primary.key" -expect_replacement_rejected wrong_legacy_key_id docs/install/dwh-auth-server.md "legacy_key_id=legacy-shared" "legacy_key_id=legacy-public-key-id" -expect_global_replacement_rejected missing_header_file_transport docs/install/dwh-auth-server.md '--header "@' '--header "X-API-Key: ' -expect_global_replacement_rejected missing_legacy_header_file docs/install/dwh-auth-server.md "legacy_header_file" "retired_auth_header" -expect_global_replacement_rejected missing_safe_restore docs/install/dwh-auth-server.md "registry_staging" "registry_overlay" -expect_replacement_rejected unsafe_restore_overlay docs/install/dwh-auth-server.md "sudo tar --acls --xattrs -C \"\$registry_staging\" -xf \"\$registry_backup\"" "sudo tar --acls --xattrs -C /var/lib -xf \"\$registry_backup\"" -expect_replacement_rejected missing_guarded_registry_publish docs/install/dwh-auth-server.md "if ! sudo mv -T -- \"\$registry_root\" \"\$registry_previous\"; then" "sudo mv -T -- \"\$registry_root\" \"\$registry_previous\"" -expect_replacement_rejected missing_candidate_check_guard docs/install/dwh-auth-server.md "if ! sudo /usr/local/sbin/dwh-auth --registry-root \"\$registry_candidate\" check; then" "sudo /usr/local/sbin/dwh-auth --registry-root \"\$registry_candidate\" check" -expect_replacement_rejected unsafe_registry_publish_target docs/install/dwh-auth-server.md "if ! sudo mv -T -- \"\$registry_root\" \"\$registry_previous\"; then" "if ! sudo mv \"\$registry_root\" \"\$registry_previous\"; then" -expect_replacement_rejected missing_key_file_byte_guard docs/install/dwh-auth-server.md "key_file_bytes=PASS" "key_file_bytes=SKIPPED" -expect_replacement_rejected missing_failed_registry_publish_target docs/install/dwh-auth-server.md "if ! sudo mv -T -- \"\$registry_root\" \"\$registry_staging/failed-dwh-auth\"; then" "if ! sudo mv \"\$registry_root\" \"\$registry_staging/failed-dwh-auth\"; then" -expect_global_replacement_rejected missing_rollback_registry_publish_target docs/install/dwh-auth-server.md "if ! sudo mv -T -- \"\$registry_previous\" \"\$registry_root\"; then" "if ! sudo mv \"\$registry_previous\" \"\$registry_root\"; then" -expect_global_replacement_rejected missing_exact_header_bytes docs/install/dwh-auth-server.md 'dd if="$1" bs=65536 status=none' 'dd if="$1" bs=1' - - -expect_replacement_rejected missing_actual_key_journal_scan docs/install/dwh-auth-server.md "journal_actual_key_scan=PASS" "journal_generic_scan=PASS" -expect_replacement_rejected missing_journal_actual_key_match docs/install/dwh-auth-server.md "any(needle in searchable for needle in needles)" "False" -expect_replacement_rejected missing_journal_returncode_guard docs/install/dwh-auth-server.md "if process.returncode != 0:" "if process.returncode == 0:" -journal_contract_source="$fixture_root/docs/install/dwh-auth-server.md" -if grep -Fq 'result.stdout.splitlines' "$journal_contract_source" \ - || grep -Fq 'enumerate(process.stdout' "$journal_contract_source" \ - || ! grep -Fq 'max_journal_bytes = 1_048_576' "$journal_contract_source" \ - || ! grep -Fq 'max_journal_lines = 10_000' "$journal_contract_source" \ - || ! grep -Fq 'max_chunk_bytes = 65_536' "$journal_contract_source" \ - || ! grep -Fq 'process.stdout.read1(' "$journal_contract_source" \ - || ! grep -Fq 'remaining = max_journal_bytes - bytes_seen' "$journal_contract_source" \ - || ! grep -Fq 'searchable = carry + chunk' "$journal_contract_source" \ - || ! grep -Fq 'process.kill()' "$journal_contract_source"; then - report_fail journal_streaming_limits -fi -report_pass journal_streaming_limits -expect_replacement_rejected missing_socket_legacy_probe docs/install/dwh-auth-server.md "socket_legacy=PASS" "socket_legacy=SKIPPED" -expect_replacement_rejected missing_https_post_revoke_v1 docs/install/dwh-auth-server.md "https_v1_post_revoke=PASS" "https_v1_post_revoke=SKIPPED" -expect_replacement_rejected missing_https_post_revoke_legacy docs/install/dwh-auth-server.md "https_legacy_post_revoke=PASS" "https_legacy_post_revoke=SKIPPED" -expect_global_replacement_rejected rollout_post_revoke_status docs/operations/psd-dwh-auth-rollout.md "v1=2xx post-revoca" "v1=204 post-revoca" - -report_pass summary +exec python3 "$root/scripts/test-verify-auth-docs.py" dwh diff --git a/scripts/verify-auth-docs.py b/scripts/verify-auth-docs.py new file mode 100644 index 00000000..d1f3b6d1 --- /dev/null +++ b/scripts/verify-auth-docs.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +"""Validate current authentication documentation, not retired rollout transcripts.""" +import argparse +import re +from pathlib import Path + +AUTH = { + "docs/architecture/authentication.md": ["## Diagnostics and ordering", "HttpOnly", "SameSite=Lax", "authRevision", "401", "403", "direct, non-empty", "ignored silently"], + "docs/install/authentication-local.md": ["tht auth", "--password-file"], + "docs/install/authentication-oidc.md": ["groups", "THT_OIDC_CLIENT_SECRET", "THT_AUTHENTIK_API_TOKEN", "/api/auth/oidc/callback"], + "docs/install/authentik.md": ["groups"], + "docs/install/authentication-upstream.md": ["AUTH_MODE=upstream"], + "docs/testing/authentication-manual-acceptance.md": ["Remember me", "403", "Header identità inventati", "non sostituiscono"], +} +DWH = { + "docs/install/dwh-auth-server.md": ["/var/lib/dwh-auth/", "/run/dwh-auth/verify.sock", "key create", "key revoke", "encrypted", "401", "503"], + "docs/install/dwh-auth-client-enrollment.md": ["rest_api", "postgres_direct", "ssh_tunnel", "API_KEY_FILE", "TLS_CA_FILE", "/rpc/ping", "401", "503"], + "docs/install/dwh-auth-tls.md": ["SAN", "TLS_CA_FILE", "openssl x509 -noout -fingerprint -sha256"], +} +CODES = """auth_ready auth_config_incomplete auth_config_invalid auth_session_store_invalid +local_user_registry_invalid local_admin_missing oidc_secret_missing oidc_discovery_unreachable +oidc_issuer_mismatch oidc_jwks_unreachable oidc_group_catalog_unreachable +oidc_group_catalog_unauthorized oidc_mapped_group_missing oidc_mapped_group_ambiguous +oidc_groups_claim_invalid oidc_device_flow_unavailable""".split() +ADMIN = """session.use session.read_all session.manage_all settings.manage workspace.manage +workspace.secrets.manage database.manage memory.manage evidence.manage pi.manage auth.diagnostics.read""".split() + + +def verify(root, mode): + requirements = AUTH if mode == "auth" else DWH + sources = {} + for relative, tokens in requirements.items(): + path = root / relative + if not path.is_file(): + raise ValueError(f"missing {relative}") + source = path.read_text() + sources[relative] = source + for token in tokens: + if token.lower() not in source.lower(): + raise ValueError(f"{relative}: missing topic {token}") + for target in re.findall(r"(?&2; exit 2; } - root=$(cd "$2" && pwd -P) -fi - -python3 - "$root" <<'PY' -import pathlib, re, sys - -root = pathlib.Path(sys.argv[1]) -docs = { - "server": "docs/install/dwh-auth-server.md", - "client": "docs/install/dwh-auth-client-enrollment.md", - "tls": "docs/install/dwh-auth-tls.md", - "rollout": "docs/operations/psd-dwh-auth-rollout.md", - "manual": "docs/testing/dwh-auth-manual-acceptance.md", - "evidence": "docs/testing/evidence/psd-dwh-auth-rollout-report-template.md", - "local": "docs/install/local-workspace-registry.md", - "server_registry": "docs/install/server-workspace-registry.md", - "psd": "docs/install/psd-workspace-setup.md", - "guide": "docs/guida-utente.md", - "index": "docs/index.md", - "nav": "mkdocs.yml", - "psd_template": "deploy/psd/workspace-bindings.env.example", -} -text = {} -for label, relative in docs.items(): - path = root / relative - if not path.is_file(): - raise SystemExit(f"dwh-auth docs: missing {relative}") - text[label] = path.read_text(encoding="utf-8") - -requirements = { - "server": ["key_output=/root/dwh-auth-provision/psd-mac-primary.key", "legacy_key_id=legacy-shared", "v1_header_file", "legacy_header_file", "random_header_file", "--header \"@", "registry_staging", "registry_previous", "registry_restore_rollback", "journal_actual_key_scan=PASS", "sys.argv[2:]", "read_bytes()", "subprocess.Popen", "stderr=subprocess.DEVNULL", "returncode != 0", "max_journal_bytes = 1_048_576", "max_journal_lines = 10_000", "process = None", "except OSError:", "stdout=subprocess.PIPE", "max_chunk_bytes = 65_536", "process.stdout.read1(", "remaining = max_journal_bytes - bytes_seen", "searchable = carry + chunk", "max_needle_length", "process.kill()", "process.wait()", "socket_v1=PASS", "socket_legacy=PASS", "https_v1_post_revoke=PASS", "https_legacy_post_revoke=PASS", "key_file_bytes=PASS", "dd if=\"$1\" bs=65536 status=none", "manifest", "journalctl", "systemctl disable --now", "trap", "/var/lib/dwh-auth", "root:dwh-auth", "2750", ".writer.lock", "0640", "/run/dwh-auth/verify.sock", "0660", "systemd", "key create", "key list", "key status", "key revoke", "check", "backup", "rollback", "disinstallazione", "rest_api", "postgres_direct", "ssh_tunnel"], - "client": ["Workspace management", "Validate workspace source", "Test workspace connections", "Save entered secrets", "Forget stored value", "API_KEY_FILE", "THT_WS_PSD_CLINICAL_DWH_API_KEY_FILE", "TLS_CA_FILE", "/rpc/ping", "rest_api", "postgres_direct", "ssh_tunnel", "401", "503", "rotazione", "revoca"], - "tls": ["self-issued", ".it", ".com", "SAN", "TLS_CA_FILE", "openssl x509 -noout -fingerprint -sha256", "fuori banda", "rinnovo", "curl -k"], - "rollout": ["v1=2xx", "legacy=2xx", "v1=2xx post-revoca", "legacy=401 post-revoca", "file header curl protetti 0600", "PASS/FAIL", "no raw diff", "Task 9", "Task 10", "IN_DISCUSSION", "postgres_direct", "rest_api", "legacy-shared", "nginx -t", "204", "401", "503", "Qdrant", "Ollama", "rollback"], - "manual": ["credenziali reali", "sintetici", "/rpc/ping", "204", "401", "503", "TLS", "registry", "postgres_direct", "ssh_tunnel"], - "evidence": ["ID pubblici", "owner", "mode", "timestamp", "checksum", "approvazione"], -} -for label, tokens in requirements.items(): - lowered = text[label].lower() - for token in tokens: - if token.lower() not in lowered: - raise SystemExit(f"dwh-auth docs: {docs[label]} lacks required topic: {token}") - -for path in [root / docs[k] for k in ("server", "client", "tls", "rollout", "manual", "evidence", "local", "server_registry", "psd", "guide", "index")]: - source = path.read_text(encoding="utf-8") - for target in re.findall(r"(? {target}") - -nav = text["nav"] -for relative in (docs["server"], docs["client"], docs["tls"], docs["rollout"], docs["manual"], docs["evidence"]): - nav_relative = relative.removeprefix("docs/") - if nav.count(nav_relative) != 1: - raise SystemExit(f"dwh-auth docs: navigation must include once: {nav_relative}") - -corpus = "\n".join(text.values()) -for pattern, label in [ - (r"thtdwh_v1\.[A-Za-z0-9_-]{16}\.[A-Za-z0-9_-]{43}", "credential literal"), - (r"(?mi)^\s*[\"']?secret_sha256[\"']?\s*[:=]\s*[\"']?[A-Za-z0-9_-]{16,}", "credential digest literal"), - (r"(?mi)^\s*(?:export\s+)?[A-Z][A-Z0-9_]*(?:API_KEY|SECRET|TOKEN|PASSWORD)\s*=\s*(?!/|<)[^\s#]+", "secret in environment"), - (r"(?i)(?:curl|dwh-auth)[^\n]{0,240}(?:(?:-H|--header)\s+['\"][^'\"]*X-API-Key\s*:|--(?:api-key|token|password)\b)", "secret in argv"), - (r"(?im)^(?!.*(?:non usare|mai usare)).*curl\s+(?:[^\n]*\s)?(?:-k|--insecure)\b|verify_tls\s*=\s*false|insecure_skip_verify", "TLS bypass"), - (r"(?i)chmod\s+0?[0-7][0-7][4-7]\s+[^\n]*(?:\.key|secret|provision)", "world-readable secret"), - (r"(?m)^\s*(?:sudo\s+)?nginx\s+-T\b", "raw Nginx capture"), - (r"(?m)^\s*(?:sudo\s+)?(?:diff\b|git\s+diff\b)", "raw diff capture"), - (r"(?m)^\s*(?:sudo\s+)?curl[^\n]*--config\b", "curl config artifact"), - (r"(?i)docker\s+compose[^\n]*\bdwh-auth\b", "Compose coupling"), -]: - if re.search(pattern, corpus): - raise SystemExit(f"dwh-auth docs: forbidden {label}") - -server_direct = re.search(r"server PSD[^\n]{0,100}postgres_direct", text["rollout"], re.I) -psd_direct = re.search(r"server PSD[^\n]{0,100}postgres_direct", text["psd"], re.I) -if not server_direct or not psd_direct: - raise SystemExit("dwh-auth docs: PSD server must remain postgres_direct") -template = text["psd_template"] -if "tht_ws_psd_clinical_dwh_transport=rest_api" not in template.lower() or "mac/local/remota" not in template.lower() or not re.search(r"mai .*server psd", template, re.I): - raise SystemExit("dwh-auth docs: PSD REST template must be explicitly Mac/local/remota, never server PSD") -if "TLS_CA_FILE" not in text["psd"] or re.search(r"(?i)nessuna CA|HTTPS pubblico", text["psd"]): - raise SystemExit("dwh-auth docs: PSD setup contradicts private CA TLS requirement") - -restore_steps = ( - 'registry_staging="/var/lib/.dwh-auth-restore-$run_id"', - 'registry_candidate="$registry_staging/dwh-auth"', - 'sudo tar --acls --xattrs -C "$registry_staging" -xf "$registry_backup"', - 'if ! sudo /usr/local/sbin/dwh-auth --registry-root "$registry_candidate" check; then', - 'if ! sudo mv -T -- "$registry_root" "$registry_previous"; then', - 'if ! sudo mv -T -- "$registry_candidate" "$registry_root"; then', - 'if ! sudo mv -T -- "$registry_previous" "$registry_root"; then', - 'if ! sudo mv -T -- "$registry_root" "$registry_staging/failed-dwh-auth"; then', -) -restore_positions = [text["server"].find(step) for step in restore_steps] -if any(position < 0 for position in restore_positions) or restore_positions != sorted(restore_positions): - raise SystemExit("dwh-auth docs: restore must stage/check then use guarded same-filesystem renames") -if text["server"].count('if ! sudo mv -T -- "$registry_previous" "$registry_root"; then') != 2: - raise SystemExit("dwh-auth docs: every restore rollback rename must use guarded mv -T --") -if re.search(r"sudo tar[^\n]*-C /var/lib[^\n]*(?:-x|--extract)[^\n]*registry_backup", text["server"]): - raise SystemExit("dwh-auth docs: restore must not overlay the live registry") - - -journal_steps = ( - "subprocess.Popen(", - "[\"journalctl\", \"-u\", \"dwh-auth\", \"--since\", sys.argv[1]", - "sys.argv[2:]", - "stderr=subprocess.DEVNULL", - "stdout=subprocess.PIPE", - "max_journal_bytes = 1_048_576", - "max_journal_lines = 10_000", - "process = None", - "except OSError:", - "max_chunk_bytes = 65_536", - "process.stdout.read1(", - "remaining = max_journal_bytes - bytes_seen", - "searchable = carry + chunk", - "max_needle_length", - "process.kill()", - "if process is not None:", - "process.wait()", - "if process.returncode != 0:", - "any(needle in searchable for needle in needles)", -) -if any(step not in text["server"] for step in journal_steps): - raise SystemExit("dwh-auth docs: journal scan must fail closed and check the actual key bytes") - -print("dwh-auth documentation contract passed") -PY +exec python3 "$root/scripts/verify-auth-docs.py" dwh "$@" diff --git a/scripts/verify-public-docs.py b/scripts/verify-public-docs.py index 1f6830bb..b2fab69f 100644 --- a/scripts/verify-public-docs.py +++ b/scripts/verify-public-docs.py @@ -24,6 +24,7 @@ INTERNAL_PAGES = { "disambiguazione-iniziale.md", "gestione-memory.md", "installazione-docker-4-contesti.md", "install/authentication-upstream.md", "operations/docker-refresh.md", "operations/shell-and-localization.md", + "operations/compose-reference.md", "operations/public-docs-publication.md", }

>kixZ9GwW8_MjI3eg@Who^3=faNKy|-C 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%0D@zMY2&Om_`Rk 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