From 792ce89b8f634a8d6fb843d0f0bc794e46109737 Mon Sep 17 00:00:00 2001 From: Jaixii Date: Wed, 5 Aug 2026 01:13:14 -0400 Subject: [PATCH 01/14] =?UTF-8?q?feat:=201.5.0=20release=20=E2=80=94=20sch?= =?UTF-8?q?ema=2011,=20governed=20recall=20recovery,=20embedding=20provena?= =?UTF-8?q?nce,=20reproducible=20release=20evidence?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- .claude-plugin/skill-assets.sha256 | 4 +- .env.example | 18 +- .github/release-constraints.txt | 8 + .github/workflows/ci.yml | 87 +- .github/workflows/release.yml | 183 ++- .gitignore | 1 + AGENTS.md | 23 +- BENCHMARKS.md | 65 +- CHANGELOG.md | 95 ++ MANIFEST.in | 3 + README.md | 81 +- docs/ARCHITECTURE_V3.md | 4 +- docs/KILO_CODE_INTEGRATION.md | 18 +- docs/MCP_TOOLS.md | 28 +- docs/PUBLIC_BENCHMARK_RUNBOOK.md | 20 +- docs/RECALL_RECOVERY.md | 64 ++ docs/SECURE_ERASURE.md | 2 +- docs/WRITE_REVIEW.md | 40 +- docs/images/context-efficiency.png | Bin 187813 -> 156820 bytes docs/images/context-efficiency.svg | 26 +- .../images/evidence-backed-agent-examples.png | Bin 1172784 -> 266488 bytes engraphis/__init__.py | 4 +- engraphis/app.py | 7 +- engraphis/backends/__init__.py | 15 +- engraphis/backends/codegraph.py | 6 +- engraphis/backends/embedder_api.py | 31 +- engraphis/backends/embedder_st.py | 68 +- engraphis/backends/encrypted_db.py | 22 +- engraphis/backends/extractor.py | 90 +- engraphis/backends/model_source.py | 75 ++ engraphis/backends/postgres_schema.py | 17 +- engraphis/backends/reranker.py | 75 +- engraphis/backends/retention.py | 10 +- engraphis/backends/vector_numpy.py | 118 +- engraphis/backends/vector_sqlitevec.py | 137 ++- engraphis/cloud_features.py | 16 +- engraphis/cloud_session.py | 70 +- engraphis/commercial_manifest.json | 2 +- engraphis/config.py | 22 +- engraphis/core/consolidate.py | 206 ++-- engraphis/core/engine.py | 593 +++++++--- engraphis/core/graph_scene.py | 74 +- engraphis/core/grounded.py | 10 +- engraphis/core/interfaces.py | 56 +- engraphis/core/poisoning.py | 112 +- engraphis/core/recall.py | 241 +++- engraphis/core/retention_policy.py | 82 ++ engraphis/core/retrieval_policy.py | 4 + engraphis/core/savings.py | 157 +++ engraphis/core/schema.py | 15 +- engraphis/core/scoring.py | 19 +- engraphis/core/store.py | 1023 ++++++++++++++++- engraphis/core/sync.py | 155 ++- engraphis/dashboard_app.py | 4 + engraphis/device_connect.py | 10 +- engraphis/engines/embedder.py | 28 +- engraphis/inspector/app.py | 30 +- engraphis/mcp_server.py | 15 +- engraphis/read_only_api.py | 6 + engraphis/routes/v2_api.py | 182 ++- engraphis/service.py | 363 ++++-- engraphis/update_check.py | 96 +- eval/EVIDENCE.md | 7 + eval/__init__.py | 10 +- eval/ablation.py | 81 ++ eval/adversarial_memory_security.py | 300 +++++ eval/datasets/locomo10_repair_manifest.json | 9 + eval/external.py | 519 +++++++-- eval/harness.py | 41 +- eval/longmemeval_v2.py | 14 +- eval/metrics.py | 6 +- eval/reinforcement.py | 62 + eval/vector_scale.py | 42 +- integrations/hermes/engraphis/plugin.yaml | 2 +- pyproject.toml | 65 +- requirements.txt | 4 +- scripts/approve_memory.py | 4 + scripts/cli.py | 191 ++- scripts/consolidate.py | 27 +- scripts/graph_cli.py | 6 + scripts/init.py | 12 +- scripts/install_shortcuts.py | 58 +- scripts/migrate_to_v2.py | 161 ++- scripts/normalize_sdist.py | 146 +++ scripts/release_evidence.py | 89 +- scripts/repair_embed_dim.py | 7 +- scripts/smoke_entry_points.py | 203 ++++ scripts/start_dashboard.py | 10 +- scripts/sync.py | 40 +- scripts/verify_distribution_contents.py | 42 +- scripts/verify_release_artifacts.py | 28 +- tests/conftest.py | 7 +- tests/test_adaptive_context.py | 18 +- tests/test_agent_connect.py | 60 + tests/test_artifact_smoke.py | 150 +++ tests/test_backends_factories.py | 246 +++- tests/test_benchmark_evidence.py | 157 ++- tests/test_benchmark_longmemeval_v2.py | 1 + tests/test_chunking_extractor.py | 8 + tests/test_cli_entrypoints.py | 179 ++- tests/test_cloud_features.py | 61 + tests/test_cloud_session.py | 92 ++ tests/test_config.py | 25 +- tests/test_consolidate.py | 227 +++- tests/test_core_store.py | 301 ++++- tests/test_embedder_threading.py | 87 ++ tests/test_embeddings.py | 33 +- tests/test_encryption_dependency.py | 12 + tests/test_engine.py | 276 +++++ .../test_eval_adversarial_memory_security.py | 38 + tests/test_eval_external.py | 75 ++ tests/test_eval_external_locomo_evidence.py | 156 +++ tests/test_graph_explorer_v2.py | 46 +- tests/test_hosted_plan_resolution.py | 97 +- tests/test_inspector_pro.py | 38 + tests/test_install_shortcuts.py | 141 ++- tests/test_mcp_server.py | 49 + tests/test_migration.py | 59 + tests/test_packaging.py | 39 +- tests/test_planned_recall_eval.py | 3 +- tests/test_poisoning.py | 35 + tests/test_postgres_schema.py | 11 + tests/test_private_state_boundaries.py | 23 + tests/test_provider_error_redaction.py | 5 +- tests/test_railway_runtime.py | 3 +- tests/test_read_only_api.py | 19 + tests/test_ready.py | 26 + tests/test_recall.py | 191 +++ tests/test_recall_recovery.py | 614 ++++++++++ tests/test_release_artifacts.py | 123 ++ tests/test_release_evidence.py | 60 +- tests/test_release_infrastructure.py | 100 +- tests/test_reproducible_sdist.py | 86 ++ tests/test_retention_policy.py | 59 + tests/test_scoring.py | 8 + tests/test_service.py | 63 +- tests/test_start_dashboard.py | 56 + tests/test_store_v4_migration.py | 76 +- tests/test_sync.py | 193 +++- tests/test_sync_cli.py | 9 +- tests/test_sync_dashboard.py | 17 +- tests/test_update_check.py | 66 ++ tests/test_v2_service_binding.py | 57 + tests/test_vector_numpy.py | 204 +++- tests/test_vector_scale.py | 40 + tests/test_vector_sqlitevec_backend.py | 117 +- tests/test_workspace_ops.py | 29 + 149 files changed, 11003 insertions(+), 1194 deletions(-) create mode 100644 .github/release-constraints.txt create mode 100644 docs/RECALL_RECOVERY.md create mode 100644 engraphis/backends/model_source.py create mode 100644 engraphis/core/retention_policy.py create mode 100644 engraphis/core/savings.py create mode 100644 eval/adversarial_memory_security.py create mode 100644 eval/datasets/locomo10_repair_manifest.json create mode 100644 eval/reinforcement.py create mode 100644 scripts/normalize_sdist.py create mode 100644 scripts/smoke_entry_points.py create mode 100644 tests/test_artifact_smoke.py create mode 100644 tests/test_eval_adversarial_memory_security.py create mode 100644 tests/test_eval_external_locomo_evidence.py create mode 100644 tests/test_recall_recovery.py create mode 100644 tests/test_reproducible_sdist.py create mode 100644 tests/test_retention_policy.py create mode 100644 tests/test_v2_service_binding.py diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index e2eebe60..45e50ae3 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "engraphis-memory", "source": "./", "description": "Discipline for giving agents durable, scoped, explainable memory across sessions and repos with the Engraphis MCP tools.", - "version": "1.4.5" + "version": "1.5.0" } ] } diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 88751d85..557c0612 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "engraphis-memory", - "version": "1.4.5", + "version": "1.5.0", "description": "Give agents durable, scoped, explainable memory across sessions and repos via the Engraphis MCP tools. Use when you learn something worth keeping, need prior context before acting, or ask why/how a fact changed. Covers remember/recall, why/timeline, forget/pin/correct, sessions, and code search.", "author": { "name": "The Engraphis Authors", diff --git a/.claude-plugin/skill-assets.sha256 b/.claude-plugin/skill-assets.sha256 index 9220bbd0..b3606486 100644 --- a/.claude-plugin/skill-assets.sha256 +++ b/.claude-plugin/skill-assets.sha256 @@ -1,5 +1,5 @@ -e7e4ecd111d9b04c290ddd60e0fadb90e3afd8c67e39dcb8fbce0b50b5e3ce42 .claude-plugin/marketplace.json -65bff1596f3db2bc75b74c6970d87e806d46ef1cb3e612cd2002f19c3a8f6acb .claude-plugin/plugin.json +5d315146fd0bdcd5bb803bab482504c51e6c8e94d9666cd4910ca8f4a645b564 .claude-plugin/marketplace.json +a51eb5baab17efb66193759be7f68df32451594b799476e7ec6e3b076b7fdff5 .claude-plugin/plugin.json 56be8d078a2a8fc6e6cd1c2be5716605d8621dab953caa8cfcd20e2dce474305 skills/engraphis-memory/SKILL.md 45dd73ca6afdd9e12ecd38c48e4a612b7646c25a07a75a80ca0e68d0e0b85f0e skills/engraphis-memory/references/CONVENTIONS.md 529fff3bdbe73f83209087fd10055fad77c5e5224ad8a9e6b0254052aa50e109 skills/engraphis-memory/references/SCOPING.md diff --git a/.env.example b/.env.example index 4acc32d3..a8a0caba 100644 --- a/.env.example +++ b/.env.example @@ -74,12 +74,17 @@ ENGRAPHIS_API_TOKEN= # ── Embeddings ────────────────────────────────────────────────────────────── # Local sentence-transformers model (downloaded on first run, ~80-400 MB). ENGRAPHIS_EMBED_MODEL=sentence-transformers/all-MiniLM-L6-v2 +# Optional immutable Hugging Face commit for the embedding model. Required for remote +# models when ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS=1; local:/paths remain permitted. +# ENGRAPHIS_EMBED_REVISION= +# Reject mutable remote embedding, reranker, and chunk-tokenizer tags before loading. Off by default. +# ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS=0 # Embedding dimension is auto-detected from the model. Override only if needed. # ENGRAPHIS_EMBED_DIM=384 -# Vector index backend for the v2 engine: "numpy" (default, deterministic reference -# index), "sqlite-vec" (require the accelerated ANN backend; needs the sqlite-vec -# package), or "auto" (use sqlite-vec when available, fall back to NumPy). -# ENGRAPHIS_VECTOR_BACKEND=numpy +# Vector index backend for server entrypoints: "auto" (default; use sqlite-vec when +# engraphis[vector] is installed and compatible, otherwise NumPy), "sqlite-vec" +# (require native exact-KNN acceleration), or "numpy" (force the reference index). +# ENGRAPHIS_VECTOR_BACKEND=auto # ── LLM (external, you choose the provider) ───────────────────────────────── # Provider: openai | anthropic | google | openrouter | custom @@ -130,7 +135,7 @@ ENGRAPHIS_RETENTION_SUPERVISOR=none # Standalone MCP-over-HTTP server (`engraphis-mcp-http`). Loopback-only by default; # any non-loopback bind (via these or ENGRAPHIS_HOST) requires ENGRAPHIS_API_TOKEN. # ENGRAPHIS_HTTP_HOST=127.0.0.1 -# ENGRAPHIS_HTTP_PORT=8080 +# ENGRAPHIS_HTTP_PORT=8711 # ENGRAPHIS_HTTP_TRANSPORT=streamable-http # When running under Docker (auto-detected via /.dockerenv), the self-updater skips @@ -310,6 +315,9 @@ ENGRAPHIS_LLM_MODEL=gpt-4o-mini # decayed transients, and distills recurring episodic memories into semantic digests. # ENGRAPHIS_LOOP_CONSOLIDATE=0 # ENGRAPHIS_RERANK_MODEL=cross-encoder/ms-marco-MiniLM-L-6-v2 +# Optional immutable Hugging Face commit for the reranker. Required for remote +# rerankers when ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS=1. +# ENGRAPHIS_RERANK_REVISION= # Workspace allow-list: comma-separated names. Empty = all allowed. # ENGRAPHIS_WORKSPACES=acme,personal diff --git a/.github/release-constraints.txt b/.github/release-constraints.txt new file mode 100644 index 00000000..e55ea13c --- /dev/null +++ b/.github/release-constraints.txt @@ -0,0 +1,8 @@ +# Artifact-affecting release tooling. PIP_CONSTRAINT is exported by release.yml so +# PEP 517 build-isolation subprocesses use this exact backend/frontend toolchain. +pip==26.2 +setuptools==83.0.0 +wheel==0.47.0 +build==1.5.0 +twine==6.2.0 +pip-audit==2.10.1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d7425b9e..6388ad88 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,13 +36,34 @@ jobs: - name: Unit tests (full suite — extras-gated tests included) run: | python -c "import fastapi, httpx, mcp, multipart, pydantic, uvicorn" - python -m pytest -o addopts="" tests/ -q -rs + ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest" - name: Retrieval eval gate run: python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5 - name: Retrieval eval gate — CodeMem (coding-agent wedge, incl. conflict resolution) run: python -m eval.harness --dataset eval/datasets/codemem.jsonl --k 5 - name: Ablation (vector-only vs hybrid) run: python -m eval.ablation + - name: Reinforcement state-transition gate + run: python -m eval.reinforcement + - name: Adversarial memory prompt-boundary gate + run: python -m eval.adversarial_memory_security + + typecheck: + name: core + backends typecheck (Python 3.11) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "3.11" + cache: pip + cache-dependency-path: pyproject.toml + - name: Install typecheck dependencies + run: | + python -m pip install --upgrade pip + pip install -e ".[test]" + - name: Typecheck core and backends (Pyright) + run: pyright encryption: name: encryption driver gate (Python ${{ matrix.python-version }}) @@ -66,7 +87,9 @@ jobs: # extension during the long general suite. Keep its real driver contract in # this dedicated, short-lived process rather than skipping encryption coverage. - name: Encryption at-rest integration tests - run: python -m pytest -o addopts="" tests/test_encrypted_store.py -q -rs + run: | + python -c "import sqlcipher3; print(sqlcipher3.__file__)" + ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/test_encrypted_store.py -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest" core-py39: name: core floor (numpy-only, Python 3.9) @@ -81,13 +104,59 @@ jobs: - name: Install (numpy-only core — the minimum supported runtime) run: | python -m pip install --upgrade pip - pip install numpy pytest + pip install numpy "pytest<9" - name: Unit tests (extras-gated tests skip; the core must pass) - run: python -m pytest -o addopts="" tests/ -q -rs + run: ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest" - name: Retrieval eval gate run: python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5 - name: Ablation run: python -m eval.ablation + - name: Reinforcement state-transition gate + run: python -m eval.reinforcement + - name: Adversarial memory prompt-boundary gate + run: python -m eval.adversarial_memory_security + - name: Build and smoke installed core artifacts + shell: bash + run: | + set -euo pipefail + python -m pip install --disable-pip-version-check "build==1.2.2" + dist_dir="$RUNNER_TEMP/engraphis-py39-dist" + export SOURCE_DATE_EPOCH="$(git show -s --format=%ct "$GITHUB_SHA")" + python -m build --outdir "$dist_dir" + index=0 + for artifact in "$dist_dir"/*.whl "$dist_dir"/*.tar.gz; do + index=$((index + 1)) + venv="$RUNNER_TEMP/engraphis-py39-artifact-$index" + python -m venv "$venv" + "$venv/bin/python" -m pip install --disable-pip-version-check "$artifact" + "$venv/bin/python" -m pip check + ( + cd "$RUNNER_TEMP" + "$venv/bin/python" - <<'PY' + import pathlib + import sys + + import engraphis + from engraphis.core.engine import MemoryEngine + + package = pathlib.Path(engraphis.__file__).resolve() + assert pathlib.Path(sys.prefix).resolve() in package.parents, package + engine = MemoryEngine.create(":memory:") + workspace_id = engine.store.get_or_create_workspace("py39-artifact") + memory_id = engine.remember( + "The Python 3.9 artifact marker is indigo.", + workspace_id=workspace_id, + resolve_conflicts=False, + ) + result = engine.recall("Python 3.9 artifact marker", workspace_id=workspace_id, k=3) + assert any(chunk["id"] == memory_id for chunk in result.chunks) + engine.store.close() + PY + "$venv/bin/engraphis" --help + "$venv/bin/engraphis" --version + "$venv/bin/engraphis-cli" --help + ) + done coverage: name: coverage gate (Python 3.11) @@ -104,7 +173,7 @@ jobs: python -m pip install --upgrade pip pip install -e ".[test]" pytest-cov - name: Coverage run (all extras-gated tests, tracked modules) - run: python -m pytest -o addopts="" tests/ -q -rs --cov=engraphis --cov-report=term-missing --cov-fail-under=60 + run: ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest" --cov=engraphis --cov-report=term-missing --cov-fail-under=60 hygiene: name: repo hygiene gate (no stray DBs/logs) @@ -239,7 +308,7 @@ jobs: rm -rf "$audit_dir" } trap cleanup EXIT - python -m pip install --disable-pip-version-check --no-cache-dir pip-audit + python -m pip install --disable-pip-version-check --no-cache-dir pip-audit==2.10.1 docker create --name "$container" engraphis:ci >/dev/null docker cp "$container":/usr/local/lib/python3.11/site-packages/. "$audit_dir" python -m pip_audit --path "$audit_dir" @@ -277,9 +346,13 @@ jobs: - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 with: python-version: "3.11" + - name: Install pinned build and audit tooling + run: >- + python -m pip install --disable-pip-version-check + "build==1.5.0" "pip-audit==2.10.1" - name: Build sdist + wheel and verify a clean install run: | - python -m pip install --upgrade pip build pip-audit + export SOURCE_DATE_EPOCH="$(git show -s --format=%ct "$GITHUB_SHA")" python -m build python scripts/verify_distribution_contents.py dist/* python -m venv .audit-venv diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eb36c213..52609886 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,6 +21,9 @@ jobs: if: >- github.event_name == 'push' || inputs.release_tag == '' + env: + PIP_CONSTRAINT: ${{ github.workspace }}/.github/release-constraints.txt + PIP_BUILD_CONSTRAINT: ${{ github.workspace }}/.github/release-constraints.txt steps: - name: Check out source @@ -35,8 +38,8 @@ jobs: - name: Install release gate and the production dependency set (without SQLCipher) run: >- - python -m pip install --upgrade "pip>=26.1.2" "setuptools>=83" - build twine pip-audit ".[all,test]" + python -m pip install --upgrade + pip setuptools wheel build twine pip-audit ".[all,test]" - name: Require tag and package version to match if: github.event_name == 'push' @@ -59,24 +62,70 @@ jobs: python scripts/check_commercial_manifest.py python scripts/externalize_dashboard_assets.py ruff check . + pyright python -c "import fastapi, httpx, mcp, multipart, pydantic, uvicorn" - python -m pytest -o addopts="" tests/ -q -rs - python -m pytest -o addopts="" tests/test_public_research_boundary.py -q - python -m pytest -o addopts="" tests/test_compact_recall.py tests/test_eval_performance.py -q - python -m pytest -o addopts="" tests/test_eval_harness.py tests/test_benchmark_evidence.py -q + ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest" + ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/test_public_research_boundary.py -q --basetemp="${RUNNER_TEMP}/engraphis-pytest" + ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/test_compact_recall.py tests/test_eval_performance.py -q --basetemp="${RUNNER_TEMP}/engraphis-pytest" + ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/test_eval_harness.py tests/test_benchmark_evidence.py -q --basetemp="${RUNNER_TEMP}/engraphis-pytest" python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5 python -m eval.harness --dataset eval/datasets/codemem.jsonl --k 5 python -m eval.ablation + python -m eval.reinforcement + python -m eval.adversarial_memory_security python -m pip_audit --local - name: Build source and universal wheel distributions + shell: bash run: | - python -m build + set -euo pipefail + export SOURCE_DATE_EPOCH="$(git show -s --format=%ct "$GITHUB_SHA")" + python -m build --outdir dist + python scripts/normalize_sdist.py dist/*.tar.gz + python -m build --outdir dist-repeat + python scripts/normalize_sdist.py dist-repeat/*.tar.gz + diff <(cd dist && sha256sum * | sort) <(cd dist-repeat && sha256sum * | sort) python scripts/verify_distribution_contents.py dist/* - - name: Validate distributions run: python -m twine check dist/* + - name: Smoke installed wheel and source distribution + shell: bash + run: | + set -euo pipefail + dist_dir="$PWD/dist" + index=0 + for artifact in "$dist_dir"/*.whl "$dist_dir"/*.tar.gz; do + index=$((index + 1)) + venv="$RUNNER_TEMP/engraphis-artifact-smoke-$index" + python -m venv --system-site-packages "$venv" + "$venv/bin/python" -m pip install --no-deps "$artifact" + ( + cd "$RUNNER_TEMP" + "$venv/bin/python" - <<'PY' + import pathlib + import sys + + import engraphis + from engraphis.core.engine import MemoryEngine + + package = pathlib.Path(engraphis.__file__).resolve() + assert pathlib.Path(sys.prefix).resolve() in package.parents, package + engine = MemoryEngine.create(":memory:") + workspace_id = engine.store.get_or_create_workspace("artifact-smoke") + memory_id = engine.remember( + "The artifact smoke marker is indigo.", + workspace_id=workspace_id, + resolve_conflicts=False, + ) + result = engine.recall("artifact smoke marker", workspace_id=workspace_id, k=3) + assert any(chunk["id"] == memory_id for chunk in result.chunks) + engine.store.close() + PY + "$venv/bin/python" -m scripts.smoke_entry_points --timeout 20 + ) + done + - name: Store distributions uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: @@ -103,7 +152,7 @@ jobs: run: | python -m pip install --upgrade pip if [ "${{ matrix.python-version }}" = "3.9" ]; then - python -m pip install numpy pytest ruff + python -m pip install numpy "pytest<9" ruff else python -m pip install -e ".[test]" fi @@ -113,10 +162,67 @@ jobs: if [ "${{ matrix.python-version }}" != "3.9" ]; then python -c "import fastapi, httpx, mcp, multipart, pydantic, uvicorn" fi - python -m pytest -o addopts="" tests/ -q -rs + ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/ -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest" python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5 python -m eval.harness --dataset eval/datasets/codemem.jsonl --k 5 python -m eval.ablation + python -m eval.reinforcement + python -m eval.adversarial_memory_security + + artifact-core-py39: + name: Python 3.9 installed release artifacts + needs: build + if: >- + github.event_name == 'push' || + inputs.release_tag == '' + runs-on: ubuntu-latest + steps: + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "3.9" + - name: Download exact release distributions + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 + with: + name: python-package-distributions + path: dist/ + - name: Install, verify, and smoke wheel and source distribution + shell: bash + run: | + set -euo pipefail + index=0 + for artifact in dist/*.whl dist/*.tar.gz; do + index=$((index + 1)) + venv="$RUNNER_TEMP/engraphis-release-py39-artifact-$index" + python -m venv "$venv" + "$venv/bin/python" -m pip install --disable-pip-version-check "$artifact" + "$venv/bin/python" -m pip check + ( + cd "$RUNNER_TEMP" + "$venv/bin/python" - <<'PY' + import pathlib + import sys + + import engraphis + from engraphis.core.engine import MemoryEngine + + package = pathlib.Path(engraphis.__file__).resolve() + assert pathlib.Path(sys.prefix).resolve() in package.parents, package + engine = MemoryEngine.create(":memory:") + workspace_id = engine.store.get_or_create_workspace("release-py39-artifact") + memory_id = engine.remember( + "The release Python 3.9 artifact marker is indigo.", + workspace_id=workspace_id, + resolve_conflicts=False, + ) + result = engine.recall("release Python 3.9 artifact marker", workspace_id=workspace_id, k=3) + assert any(chunk["id"] == memory_id for chunk in result.chunks) + engine.store.close() + PY + "$venv/bin/engraphis" --help + "$venv/bin/engraphis" --version + "$venv/bin/engraphis-cli" --help + ) + done encryption: name: Encryption driver release gate (Python ${{ matrix.python-version }}) @@ -138,7 +244,9 @@ jobs: python -m pip install --upgrade pip pip install -e ".[test,encryption]" - name: Encryption at-rest integration tests - run: python -m pytest -o addopts="" tests/test_encrypted_store.py -q -rs + run: | + python -c "import sqlcipher3; print(sqlcipher3.__file__)" + ENGRAPHIS_INDEX_ROOTS="${GITHUB_WORKSPACE}:${RUNNER_TEMP}" python -m pytest -o addopts="" tests/test_encrypted_store.py -q -rs --basetemp="${RUNNER_TEMP}/engraphis-pytest" browser-accessibility: name: Browser accessibility release gate @@ -257,9 +365,42 @@ jobs: if: always() run: docker rm -f engraphis-release || true + code-security: + name: CodeQL ${{ matrix.language }} release gate + if: >- + github.event_name == 'push' || + inputs.release_tag == '' + runs-on: ubuntu-latest + permissions: + contents: read + env: + CODEQL_ACTION_DIFF_INFORMED_QUERIES: "false" + strategy: + fail-fast: false + matrix: + language: ["python", "javascript-typescript"] + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "3.11" + - name: Initialize CodeQL + uses: github/codeql-action/init@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4 + with: + languages: ${{ matrix.language }} + build-mode: none + - name: Analyze complete source tree + id: analyze + uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4 + with: + output: codeql-results + upload: never + - name: Require clean CodeQL results + run: python scripts/check_codeql_sarif.py "${{ steps.analyze.outputs.sarif-output }}" + release-evidence: name: Generate public release evidence - needs: [build, python-matrix, encryption, browser-accessibility, pi-extension, docker-smoke] + needs: [build, python-matrix, artifact-core-py39, encryption, browser-accessibility, pi-extension, docker-smoke, code-security] if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest permissions: @@ -289,17 +430,25 @@ jobs: --tag "$GITHUB_REF_NAME" \ --sbom "$sbom" \ --verified-check ruff \ + --verified-check pyright-core-backends \ + --verified-check codeql \ --verified-check pytest \ + --verified-check reproducible-distributions \ + --verified-check installed-artifact-smoke \ + --verified-check installed-artifact-smoke-py39 \ --verified-check privacy-boundary \ --verified-check token-efficiency \ --verified-check benchmark-schema-evidence \ --verified-check encryption-at-rest \ --verified-check browser-e2e \ + --verified-check pi-extension \ --verified-check dependency-audit \ --verified-check container-smoke \ --verified-check retrieval-sample \ --verified-check retrieval-codemem \ --verified-check retrieval-ablation \ + --verified-check reinforcement-state-transition \ + --verified-check adversarial-memory-security \ --output release-evidence/release-evidence.json - name: Store public release evidence uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 @@ -320,6 +469,9 @@ jobs: steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "3.11" - name: Download distributions uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: @@ -409,6 +561,9 @@ jobs: steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "3.11" - name: Download published distributions env: GH_TOKEN: ${{ github.token }} @@ -531,11 +686,11 @@ jobs: shell: bash run: | if gh release view "$RELEASE_TAG" --repo "$GH_REPO" >/dev/null 2>&1; then - gh release upload "$RELEASE_TAG" dist/* release-evidence/release-evidence.json release-evidence/*.cdx.json \ + gh release upload "$RELEASE_TAG" verified-dist/* release-evidence/release-evidence.json release-evidence/*.cdx.json \ --repo "$GH_REPO" \ --clobber else - gh release create "$RELEASE_TAG" dist/* release-evidence/release-evidence.json release-evidence/*.cdx.json \ + gh release create "$RELEASE_TAG" verified-dist/* release-evidence/release-evidence.json release-evidence/*.cdx.json \ --repo "$GH_REPO" \ --verify-tag \ --generate-notes \ diff --git a/.gitignore b/.gitignore index dfa4de02..1d45ea37 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ build/ .pytest_cache/ /.pytest-*-tmp/ .ruff_cache/ +.coverage node_modules/ .playwright/ playwright-report/ diff --git a/AGENTS.md b/AGENTS.md index 56e9bbf1..08718b10 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,8 +2,9 @@ Engraphis is a **local-first, open AI memory engine for agents** — Ebbinghaus decay, interaction-aware reinforcement, bi-temporal facts, hybrid recall, and a native -`workspace → repo → session → memory` hierarchy. Python 3.11 / FastAPI, SQLite, local -embeddings; the external LLM is optional and pluggable. +`workspace → repo → session → memory` hierarchy. Python 3.9+ for the core (Python 3.10+ +for the server/MCP stack), FastAPI, SQLite, and local embeddings; the external LLM is optional +and pluggable. This is the canonical operating manual for any AI agent working in this repo. `CLAUDE.md` imports it. Read §0 before editing anything. @@ -20,7 +21,7 @@ most common mistake here. | Status | Primary scoped, bi-temporal, interface-driven implementation. | Compatibility/reference implementation with flat namespaces. | | Model | Scoped + bi-temporal + typed; interface-driven. | Single flat `namespace` string per memory. | | Code | `engraphis/core/`, `engraphis/backends/`, `eval/`, `tests/`, `scripts/migrate_to_v2.py` | `engraphis/app.py`, `config.py`, `models.py`, `routes/`, `stores/`, `engines/`, `llm/`, `static/` | -| Data | new v2 schema (`SCHEMA_VERSION = 9`) | `engraphis_v1.db` | +| Data | new v2 schema (`SCHEMA_VERSION = 11`) | `engraphis_v1.db` | | Entry | `MemoryEngine.create()` → `core/engine.py` | Internal reference only; never a public launcher | **Rule:** build new capability on **v2** (`core/` + `backends/`) behind the interfaces. @@ -42,6 +43,8 @@ python -m pytest tests/ -q # unit tests python -m eval.harness --dataset eval/datasets/sample.jsonl --k 5 # retrieval eval gate python -m eval.harness --dataset eval/datasets/codemem.jsonl --k 5 # larger eval; covers conflict resolution python -m eval.ablation # vector-only vs 1-hop vs PPR +python -m eval.reinforcement # bounded retention trajectory +python -m eval.adversarial_memory_security # poisoning + prompt graph boundary ruff check . # lint (line-length 100, py39, pinned rule set) # ── External benchmarks (real numbers need torch + the dataset; see eval/external.py) ── @@ -93,7 +96,7 @@ query └─ SearchFilter (scope + valid_at/known_at anchors) core/interfaces.py └─ optional QueryPlanner (off by default; original + at most 2 routes) core/query_planner.py - └─ 4 retrieval arms (run in parallel, then fused): + └─ 4 retrieval arms (executed deterministically, then fused): • vector — VectorIndex.search (cosine) backends/vector_*.py • lexical — Store.fts_search (FTS5/BM25 + LIKE fallback) core/store.py • graph — Personalized PageRank over entities+links core/recall.py + core/graphrank.py @@ -171,8 +174,9 @@ is distilled into discrete facts first; the offline default is passthrough. Recency (`c`) is used only by the separate queryless proactive agenda, avoiding a second age penalty alongside retention in ordinary recall. Default weights: `r1.0 s1.0 l0.5 g0.7 i0.6 c0.3 x0.8`, overridden per memory type. - **Ebbinghaus retention:** `R(t) = exp(−Δt_days / S)`. -- **Reinforcement (spacing effect):** `S_new = S·(1 + α·ln(1 + access_count)) + boost`, `α = 0.3`. - Stability grows sub-linearly with use; this is `Store.reinforce()`. +- **Reinforcement (spacing effect):** each event adds + `(α·min(S, 1) + boost)·ln(1 + 1/access_count)`, `α = 0.3`, with a 100-day cap. + The cumulative trajectory is logarithmic and bounded; this is `Store.reinforce()`. - **Interaction boosts** (`scoring.INTERACTION_BOOST`): view/read 0.05 · recall 0.15 · react 0.20 · engage 0.30 · reply 0.50 · create 1.00. - **Reciprocal Rank Fusion:** `1 / (k + rank + 1)`, `k = 60`. @@ -182,7 +186,7 @@ These are pure, unit-tested functions — change them only with a corresponding --- -## 5. Data model cheat-sheet (`core/interfaces.py`, `core/schema.py` — `SCHEMA_VERSION = 9`) +## 5. Data model cheat-sheet (`core/interfaces.py`, `core/schema.py` — `SCHEMA_VERSION = 11`) - **Scope hierarchy:** `workspace → repo → session → memory`. Scopes: `session|repo|workspace|user`. - **Bi-temporal validity on every record:** world-time `valid_from/valid_to` + @@ -202,8 +206,9 @@ These are pure, unit-tested functions — change them only with a corresponding ## 6. Gotchas - **Offline by default in core:** `MemoryEngine.create()` uses a deterministic hashing - embedder + NumPy index, so tests need no model download or network. Real models load only - when you pass `embed_model=...` / `vector_backend="sqlite-vec"`. + embedder + NumPy index, so tests need no model download or network. Pass `embed_model=...` + to load a real embedding model; choose `vector_backend="sqlite-vec"` separately when you + need native exact-KNN acceleration. - **First full-stack run downloads `all-MiniLM-L6-v2` (~80 MB)** for the ST embedder. - **FTS5 may be missing** on some SQLite builds → `Store` auto-falls back to `LIKE` (`self.has_fts5`). Don't assume BM25 is available. diff --git a/BENCHMARKS.md b/BENCHMARKS.md index 649d1480..512e7e83 100644 --- a/BENCHMARKS.md +++ b/BENCHMARKS.md @@ -32,21 +32,28 @@ frontier-model QA score. sub-file `ChunkingExtractor` (`chunked`), then queries both through the real recall pipeline. The checked-in corpus is explicitly marked trusted eval data so the measurement isolates chunking from the production trust gate, which excludes arbitrary raw imports from normal - agent context. This is the first cut of the context-reduction metric (item 3 below). On the - deterministic embedder: - **recall@5 1.000 for both, at ~73% fewer context tokens (809 → 219) and ~4× smaller - tokens-to-evidence (162 → 42).** Pass `--embed-model sentence-transformers/all-MiniLM-L6-v2` - for a real retrieval number (recall should then favour chunked on larger corpora, not just - tie). + agent context. On the deterministic embedder, **recall@5 is 1.000 for both modes; mean + retrieved top-5 content falls from 740.3 to 214.1 tokens (526.2 fewer, 71.1% lower, about + 3.5× smaller), while the smallest returned evidence-holding memory falls from 162.2 to 42.4 + tokens (119.8 fewer, 73.9% lower, about 3.8× smaller).** Pass `--embed-model + sentence-transformers/all-MiniLM-L6-v2` for a real retrieval number (recall should then favour + chunked on larger corpora, not just tie). - **Full-pipeline latency + quality**: `eval/performance.py` times the shipped semantic + lexical + graph + fusion + scoring + rerank + packing path after warmup, with reinforcement disabled so repeated measurements do not mutate their corpus. It reports p50/p95/p99 latency, - retrieval quality, and packed context tokens in one JSON-safe schema. `--filler-memories` - provides deterministic corpus scaling, and every report records the runtime, architecture, - embedder, vector backend, corpus size, warmups, and iteration count. `--candidate-k` and - `--retrieval-profile` make adaptive-depth/routing experiments executable instead of changing - production defaults from an unmeasured hunch. -- **NumPy vector scale envelope**: `eval/vector_scale.py` measures the production + retrieval quality, packed context tokens, and full/compact JSON-shape payload proxies in one + JSON-safe schema. Payload proxies are sampled once per question, independently of the number + of timed iterations; they are not serialized MCP envelopes or transport responses. In the + documented CodeMem run (`--iterations 10`), 26 payload samples total **23,810** full-proxy + `engraphis.regex.v1` tokens versus **10,202** compact-proxy tokens, avoiding **13,608** proxy + tokens (**57.15% lower**), while 260 recalls are timed. Packed context across the same 26 + samples averages **85.38** tokens and reaches **108** under a 1,500-token cap; Recall@5, + hit@5, and answer-token recall remain 1.000. `--filler-memories` provides deterministic corpus + scaling, and every report records the runtime, architecture, embedder, vector backend, corpus + size, warmups, and iteration count. `--candidate-k` and `--retrieval-profile` make + adaptive-depth/routing experiments executable instead of changing production defaults from an + unmeasured hunch. +- **Exact vector scale envelope**: `eval/vector_scale.py` measures the production `NumpyVectorIndex` directly at requested corpus sizes with deterministic normalized vectors and queries. It records a corpus fingerprint, result hashes, environment, and observed p50/p95/p99 search envelopes. It intentionally has no pass/fail latency threshold: the output @@ -134,13 +141,45 @@ python -m eval.proactive_ranking # Canonical latency/resource protocol: requires >=1,000 queries and five processes. python -m eval.performance --dataset fixed-1000-plus.jsonl --acceptance-matrix --processes 5 -# Real retrieval numbers (downloads all-MiniLM-L6-v2) +# External retrieval diagnostics (downloads all-MiniLM-L6-v2; not QA/leaderboard results) python -m eval.external --dataset longmemeval_s.json --format longmemeval --k 10 python -m eval.external --dataset locomo10.json --format locomo --k 10 +# Complete external-dataset coverage with an immutable embedding revision. This remains a +# private diagnostic; it is not an official benchmark-harness or public evidence artifact. +python -m eval.external --dataset longmemeval_s.json --format longmemeval --canonical \ + --embed-revision <40-character-model-commit> --json external-longmemeval.json +python -m eval.external --dataset locomo10.json --format locomo --canonical --no-resolve \ + --embed-revision <40-character-model-commit> \ + --locomo-repair-manifest eval/datasets/locomo10_repair_manifest.json \ + --json external-locomo.json python -m eval.context_economy --dataset locomo10.json --format locomo \ --embed-model sentence-transformers/all-MiniLM-L6-v2 --token-budget 512 --k 10 --no-resolve ``` +Canonical external mode requires an exact lowercase 40-character embedding commit and a semantic +embedder; dependency or model-load failure is fatal instead of silently falling back to hashing. +Every report records `embedding`, `dataset_sha256`, `source_cases`, `normalized_cases`, and +`configuration` provenance so a result can be attributed to the actual data and retrieval setup. + +The official ten-conversation LoCoMo JSON contains delimiter-packed IDs, two mechanical ID +typos, and three references that cannot be normalized syntactically. The adapter normalizes only +the unambiguous forms. The checked-in repair manifest is bound to the official source SHA-256, +names every remaining replacement/removal, must be fully consumed, and is recorded in the JSON +report with its own hash. Any source update, unused repair, or unresolved ID fails the run. This +repairs retrieval references only; it does not claim to correct LoCoMo's semantic answer labels. + +The pinned full-dataset private retrieval diagnostic run on 2026-08-04 used official-source +SHA-256 `79fa87e90f04081343b8c8debecb80a9a6842b76a7aa537dc9fdf651ea698ff4`, repair-manifest +SHA-256 `7bb74979b98778aafbbe72d44a93593743ff5ba166c9c95cd4702ab7376d7c2b`, and +`sentence-transformers/all-MiniLM-L6-v2` revision +`1110a243fdf4706b3f48f1d95db1a4f5529b4d41`. With `k=10` and conflict resolution disabled, +all 10 conversations, 5,882 memories, and 1,986 questions were processed; 1,982 questions had +gold evidence and were scored. The result was recall@10 **0.6045**, hit@10 **0.6625**, +MRR@10 **0.4138**, NDCG@10 **0.4424**, and answer-token recall **0.4607**. Six questions used +mechanical ID normalization, three source-audited manifest repairs were applied, and four +questions were explicitly excluded as `no_gold_evidence`. These values measure evidence +retrieval only; they are not end-to-end QA accuracy or an official LoCoMo leaderboard score. + ## What we do NOT yet claim - **No official end-to-end LLM QA accuracy.** The deterministic productivity agent measures the diff --git a/CHANGELOG.md b/CHANGELOG.md index d99f17ae..17598d7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,101 @@ All notable changes to Engraphis are documented here. Format loosely follows ## [Unreleased] +## [1.5.0] - 2026-08-04 + +Minor release advancing the v2 engine to schema 11 with governed recall recovery, +embedding-space safety, reproducible release evidence, and stronger offline memory-quality gates. + +### Security + +- Add opt-in immutable Hugging Face model provenance enforcement for remote embedding models, + rerankers, and chunk tokenizers, with revision plumbing across v2 services and local front ends; + model loaders now explicitly disable remote code execution while local paths remain supported. +- Refuse redirects in loopback startup-health and PyPI metadata probes, and treat shortcut icon + paths as data across PowerShell, macOS shells, and Linux desktop files. +- Add an offline release gate proving that quarantined, review-pending, and caller-self-approved + external content is downgraded and stays outside prompt recall, including direct poisoned + edges and pending-memory-supported edges, while trusted graph evidence remains available. +- Reject control characters in hosted access and refresh credentials, including credentials + returned during rotation, before any network or persistent-state use. +- Restrict the Inspector API to loopback clients when no API token is configured, and exclude + pending or quarantined memories from managed-cloud snapshots. +- Harden update checks with bounded, link-safe cache reads, atomic private cache writes, strict + version limits, finite timestamps, and validated HTTPS or loopback-HTTP URLs. +- Route private credential and state-file reads through one bounded, race-resistant boundary that + rejects links, reparse points, non-regular files, invalid UTF-8, and oversized input. +- Raise the optional `cryptography` floor to 50.0.0 to exclude known vulnerable releases. +- Require the patched pytest line in supported release environments and give every CI pytest + invocation a private runner-owned temporary root, including the Python 3.9 compatibility lane. + +### Fixed + +- In schema 11, migrate pre-review trusted memories to explicit approval without releasing quarantined or + ambiguous evidence; recover the exact historical local-agent service-gate downgrade and expose + content-free eligibility diagnostics when review gating causes zero-result recall. +- Replace per-backend vector version checks with one active embedding-space fingerprint, make + Sentence Transformer/API spaces durable, rebuild on every space transition (including + A -> B -> A), and disable vector recall throughout interrupted or mixed-space rebuilds. +- Describe the stable sqlite-vec backend accurately as native exact KNN, add a dedicated + `vector` install extra, require the upstream release containing the vec0 delete fix, + and let server entrypoints select it automatically with a safe NumPy fallback. +- Make contradiction supersession failure-atomic so a failed predecessor invalidation cannot + leave two live facts. +- Bound reinforcement stability and migrate existing out-of-range retention state to schema 10. +- Preserve v1 graph endpoints during migration and publish migrated databases only after a + validated staging database is complete. +- Reject partial API embedding batches instead of persisting zero-vector placeholders; give + semantic embedding spaces durable, secret-free identities; and batch SQLite vector hydration. +- Prevent CLI metadata from overriding trusted local provenance and honor the selected namespace + for grounded chat. +- Keep service replacement atomic when the prior SQLite handle cannot close, and make + authoritative cloud denials fail closed in-process before their durable state writes complete. +- Keep tag publication reachable by defining every workflow-verified release check in the public + evidence manifest, including CodeQL, reproducible distributions, and fresh artifact smokes, and + bind the evidence provenance to the completed code-security job. +- Repair GitHub releases only from the frozen, hash-verified distribution set, excluding any + publisher receipt or other unverified file left in the working distribution directory. +- Exercise both the exact tagged wheel and source distribution in clean Python 3.9 environments, + including dependency resolution, pip check, core CLI startup, and in-memory remember/recall; + declare the CI build and vulnerability-audit tool versions instead of relying on runner images. +- Eliminate duplicate NumPy vector writes and commits after ordinary remembers, embedding rebuilds, + sync application, and title re-embedding. Store-backed indexes opt out only when they share the + exact canonical Store; separately-backed and injected indexes retain explicit synchronization. +- Replace row-by-row NumPy scan hydration with one filtered, fixed-width matrix read while + preserving temporal/scope filters, malformed-dimension isolation, deterministic ties, and + immediate visibility of newly written vectors. +- Surface best-effort graph, entity-linking, evolution, conflict-repair, and index-audit failures as + per-engine rate-limited, payload-redacted warnings instead of silently suppressing operational + faults. +- Honor the configured embedding dimension, vector backend, model revisions, reranker, and encrypted + connection path consistently across every v2 front end and the sync/consolidation CLIs, preventing + an operational command from accidentally rebuilding a persisted semantic space with defaults. +- Commit standalone entity links without closing a caller-owned transaction, and make the Windows + shortcut installer retain its redacted Desktop launcher fallback when PowerShell is unavailable. +- Serialize and make Store shutdown idempotent, add context-manager and weakref-finalizer cleanup, + and keep the offline suite from loading production embedding/reranker models merely because a + developer has optional semantic dependencies installed. + +### Added + +- Extend `eval.vector_scale` with input-identical NumPy/sqlite-vec exact-KNN comparisons, + explicit backend identity, deterministic result hashes, and setup-excluded latency envelopes. +- Add `engraphis-cli review list|approve` for content-free, scoped bulk review. Approval is + dry-run by default, requires a reason and one batch confirmation, excludes quarantined records, + and supports explicit ids, source/repo filters, and the legacy-agent signature. +- Add embedding coverage and prompt-eligibility health to service stats, stamp service ingress and + writer-policy provenance, and document recall recovery without direct database surgery. +- Add deterministic reinforcement and adversarial-memory release gates plus a hash-bound LoCoMo + evidence-repair manifest and complete pinned-dataset retrieval diagnostics. +- Pin the Pyright contract for core, backends, and external evaluation; require it in CI and release + evidence; verify distribution contents; generate a reproducible CycloneDX SBOM; byte-compare + normalized repeat builds; smoke fresh wheel/sdist installs; and bind complete-tree CodeQL to the + tag gate. +- Smoke all 14 installed console entrypoints from their distribution metadata and generated wrapper + paths for both wheel and source-distribution installs, with bounded timeouts and diagnostics. +- Add opt-in semantic-confidence calibration for retrieval-arm experiments while preserving the + existing default ranking until paired external non-inferiority evidence is available. + ## [1.4.5] - 2026-08-04 Patch release aligning the package, runtime, commercial manifest, and plugin metadata at 1.4.5 diff --git a/MANIFEST.in b/MANIFEST.in index ce0b1dff..6cb5a360 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -9,6 +9,8 @@ recursive-include engraphis/dashboard_assets *.html *.css *.js *.png *.ico recursive-include engraphis/dashboard_assets/vendor * include engraphis/commercial_manifest.json include LICENSE NOTICE README.md CHANGELOG.md BENCHMARKS.md +include docs/RECALL_RECOVERY.md +include docs/images/context-efficiency.svg include pyproject.toml include .env.example requirements.txt include docker-entrypoint.sh Dockerfile docker-compose.yml docker-compose.lan.yml @@ -18,4 +20,5 @@ include eval/BASELINES.md include eval/EVIDENCE.md recursive-include eval/configs *.json recursive-include eval/datasets *.jsonl +include eval/datasets/locomo10_repair_manifest.json recursive-include tests *.py diff --git a/README.md b/README.md index ebeb74db..4bb2bf00 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ ## Measured token and context savings

- Dark chart showing Engraphis using 98.21 percent less long-history context, 73.0 percent less retrieved content per question, 73.9 percent fewer tokens in the smallest useful memory, a 55.38 percent smaller memory response, and 47.8 percent less repeated-memory context after consolidation + Dark chart showing Engraphis using 98.21 percent less long-history context, 71.1 percent less retrieved content per question, 73.9 percent fewer tokens in the smallest useful memory, a 57.15 percent smaller recall payload proxy, and 47.8 percent less repeated-memory context after consolidation
Less repeated history means more room for the task, tools, and useful evidence.

@@ -42,11 +42,11 @@ | Retrieval mode | Mean returned memory content | Recall@5 | |---|---:|---:| -| Whole documents | 808.8 tokens | 1.000 | -| Engraphis structure-aware chunks | 218.4 tokens | 1.000 | +| Whole documents | 740.3 tokens | 1.000 | +| Engraphis structure-aware chunks | 214.1 tokens | 1.000 | -The chunked mode returns the relevant passage instead of the whole document: **590.4 fewer tokens -per question**. Under the same model-context budget, that leaves roughly **590 tokens** for task +The chunked mode returns the relevant passage instead of the whole document: **526.2 fewer tokens +per question**. Under the same model-context budget, that leaves roughly **526 tokens** for task instructions or other relevant evidence. ### Measurement details and reproducibility @@ -57,20 +57,27 @@ boundary. | What is counted | Comparison | Measured reduction | Quality held constant | |---|---|---|---| | Cumulative reader context across a 1,986-question LoCoMo diagnostic | Full-history replay: **49,915,394** tokens → Engraphis: **891,857** tokens | **49,023,537 fewer context tokens** (**98.2133% lower**) | Focused retrieval used far less context; uncapped full history retained higher retrieval recall | -| Retrieved top-5 memory content, averaged per question | Whole documents: **808.8** tokens → structure-aware chunks: **218.4** tokens | **590.4 fewer tokens per question** (**73.0% lower**, about **3.7× smaller**) | Recall@5 **1.000** in both modes across 6 documents and 18 questions | +| Retrieved top-5 memory content, averaged per question | Whole documents: **740.3** tokens → structure-aware chunks: **214.1** tokens | **526.2 fewer tokens per question** (**71.1% lower**, about **3.5× smaller**) | Recall@5 **1.000** in both modes across 6 documents and 18 questions | | Smallest returned memory that contains the reference evidence | Whole documents: **162.2** tokens → chunks: **42.4** tokens | **119.8 fewer tokens to evidence** (**73.9% lower**, about **3.8× smaller**) | The same 18 questions had a returned evidence-holding memory in both modes | -| Serialized MCP recall response across 260 timed CodeMem recalls | Full result: **17,172** `engraphis.regex.v1` tokens → compact result: **7,663** tokens | **9,509 response tokens avoided** (**55.38% lower**) | Recall@5, hit@5, and answer-token recall all **1.000** | +| Full versus compact recall payload proxy across one 26-question pass within a 260-timed-recall CodeMem run | Full proxy: **23,810** `engraphis.regex.v1` tokens → compact proxy: **10,202** tokens | **13,608 proxy tokens avoided** (**57.15% lower**) | 26 payload samples; 260 timed recalls; Recall@5, hit@5, and answer-token recall all **1.000** | | Repeated-memory consolidation fixture | 12 related episodic memories: **230** tokens → one digest: **120** tokens | **110 tokens removed from the active digest** (**47.8% lower**) | Original memories remain available for provenance and audit | -| Small histories across 26 CodeMem agent tasks | Always retrieve: **2,194** total agent-facing tokens and **26** memory calls → adaptive: **1,942** tokens and **0** memory calls | **252 tokens avoided** (**11.5% lower**) and all 26 unnecessary searches skipped | Both completed **24/26** tasks with the same deterministic offline task agent | -| Packed prompt-context usage in the same CodeMem performance fixture | Hard budget: **1,500** tokens; observed mean: **87.73**; observed maximum: **106** | A hard cap prevents a recall from exceeding its configured context budget | This is usage accounting, not a before/after savings comparison | +| Small histories across 26 CodeMem agent tasks | Always retrieve: **1,883** total agent-facing tokens and **26** memory calls → adaptive: **1,942** tokens and **0** memory calls | Adaptive uses **59 more tokens** (**3.1% higher**) while eliminating all **26** memory calls | Both completed **24/26** tasks with the same deterministic offline task agent; this fixture demonstrates bypass behavior, not token savings | +| Packed prompt-context usage in the same 26-question CodeMem sample pass | Hard budget: **1,500** tokens; observed mean: **85.38**; observed maximum: **108** | A hard cap prevents a recall from exceeding its configured context budget | This is usage accounting, not a before/after savings comparison | -The compact MCP response avoids duplicating full memory bodies when the packed context and source -list are enough. That can reduce what an agent must inspect or pass onward, but the fixtures do -**not** measure model-provider charges, end-to-end task time, or customer cost savings. +The LoCoMo context-use row is an **unpinned, noncanonical retrieval diagnostic**, not official +LoCoMo QA, answer-quality, provider-cost, or leaderboard evidence. It is not reproduced by the +small offline fixtures below; [BENCHMARKS.md](BENCHMARKS.md) records its exact limitations and +the separate hash-bound canonical retrieval diagnostic. + +The compact payload shape avoids duplicating full memory bodies when the packed context and source +list are enough. The evaluator tokenizes JSON-shaped full and compact payload proxies built from +recall results; it does **not** serialize the MCP envelope or measure a transport response. The +fixture therefore does not measure model-provider charges, end-to-end task time, or customer cost +savings. The measures are deliberately separate and **must not be added together**: chunking counts the -content of retrieved memory records before `ContextPacker`, whereas compact recall counts the -serialized MCP response returned to a client. “Tokens to evidence” is the size of the smallest +content of retrieved memory records before `ContextPacker`, whereas compact recall counts a +serialized JSON-shape payload proxy. “Tokens to evidence” is the size of the smallest retrieved memory record holding the reference evidence; it is not latency or end-to-end answer accuracy. Chunking creates more focused stored records (24 chunks rather than 6 whole-document memories in this fixture), so this is a context-efficiency result, not a storage-reduction claim. @@ -81,6 +88,7 @@ Reproduce the quality and token/context measurements without a network connectio python -m eval.harness --dataset eval/datasets/codemem.jsonl --k 5 python -m eval.grounded python -m eval.chunking_eval +python -m eval.adversarial_memory_security python -m eval.performance --dataset eval/datasets/codemem.jsonl --k 5 --iterations 10 --json python -m eval.productivity --dataset eval/datasets/codemem.jsonl ``` @@ -89,7 +97,8 @@ These are small deterministic correctness and efficiency fixtures, not official LongMemEval QA scores or a third-party leaderboard result. Compact-response counts use the exact `engraphis.regex.v1` counter; the chunking evaluation uses its documented deterministic normalized-character estimator. Chunking measures retrieved memory content, while compact recall -measures serialized MCP response size. See [`BENCHMARKS.md`](BENCHMARKS.md) for definitions, +measures a serialized JSON-shape payload proxy, not an MCP transport response. See +[`BENCHMARKS.md`](BENCHMARKS.md) for definitions, limitations, canonical external-evaluation requirements, and the no-unsupported-claims policy. @@ -119,6 +128,7 @@ continues to support Python 3.9+. |---|---|---| | Local dashboard and REST API | `pip install "engraphis[server]"` | `engraphis-dashboard` | | Coding-agent memory over Smart MCP | `pip install "engraphis[mcp]"` | `codex mcp add engraphis -- engraphis-mcp` | +| Native SQLite vector acceleration | `pip install "engraphis[vector]"` | Server entrypoints select it automatically | | Offline Python library | `pip install engraphis` | `MemoryService.create("engraphis.db")` | For MCP clients other than Codex, configure a stdio server whose command is `engraphis-mcp`; see @@ -134,12 +144,17 @@ selection, set `ENGRAPHIS_UPDATE_EXTRAS` to a comma-separated list (for example > **Upgrading to 1.4:** `engraphis-mcp` now exposes the nine-tool Smart gateway. Integrations that > require the former 33 direct tool names should run `engraphis-mcp-classic`. The SQLite schema -> moves to version 9. Existing v7-to-v8 databases already contain `confidence` and -> `pinned_at`/`unpinned_at`; v9 adds the `memory_tombstones` repository-scope column/table support +> in the 1.4.0 release was version 9. Existing v7-to-v8 databases already contain `confidence` +> and `pinned_at`/`unpinned_at`; v9 adds the `memory_tombstones` repository-scope column/table > and performs a one-time entity-canonicalization repair, then migrates automatically on first > open. A tombstone with a known `repo_id` is terminal only in that repository; legacy repo-less > tombstones remain global. See the [1.4.0 release notes](CHANGELOG.md#140---2026-08-02). +> **Upgrading to 1.5:** schema 10 bounds legacy retention state and schema 11 backfills explicit +> approval only for eligible pre-review local memories. Pending and quarantined evidence remains +> gated. Existing 1.4.x databases migrate automatically when Engraphis 1.5 opens them; see the +> [1.5.0 release notes](CHANGELOG.md#150---2026-08-04). + --- ## What Engraphis gives an agent @@ -229,6 +244,7 @@ pip install "engraphis[documents]" # PDF + image OCR bindings pip install "engraphis[transcription]" # faster-whisper audio/video pip install "engraphis[postgres]" # PostgreSQL schema introspection pip install "engraphis[code]" # tree-sitter code graph indexing +pip install "engraphis[vector]" # native sqlite-vec exact-KNN acceleration pip install "engraphis[cloud-sync]" # Cloud Sync client crypto/runtime pip install "engraphis[encryption]" # SQLCipher encryption-at-rest extra pip install engraphis # core library: numpy only, fully offline @@ -244,10 +260,19 @@ or newer for the `server`, `mcp`, `documents`, `cloud-sync`, or `all` installati The default `NumpyVectorIndex` performs an exact full scan. There is no universal memory-count cutoff because latency depends on vector size, hardware, filters, and the rest of the recall -pipeline. Measure your machine with `python -m eval.vector_scale`, then run +pipeline. Measure your machine with `python -m eval.vector_scale --backend numpy`, then run `python -m eval.performance` on a representative corpus. If exact scans miss your latency target, -create the engine with `vector_backend="sqlite-vec"` and remeasure. See [BENCHMARKS.md](BENCHMARKS.md) -for the reproducible commands and reporting limits. +install `engraphis[vector]`, create the engine with `vector_backend="sqlite-vec"`, and remeasure. +The stable sqlite-vec `vec0` backend executes exact KNN in native code; it is acceleration, not a +claim of sublinear ANN scaling. See [BENCHMARKS.md](BENCHMARKS.md) for the reproducible commands +and reporting limits. + +Dashboard, REST, and MCP entrypoints default to `ENGRAPHIS_VECTOR_BACKEND=auto`: they use +sqlite-vec when the `vector` extra is installed and compatible, then safely fall back to NumPy. +Programmatic `MemoryEngine.create()` and `MemoryService.create()` retain the deterministic +`numpy` default unless a backend is requested explicitly. +Use `python -m eval.vector_scale --backend sqlite-vec` for an input-identical direct-search +comparison; setup/index-build time is explicitly excluded from the timed search envelope. `sqlcipher3-binary` publishes CPython manylinux x86-64 wheels. On that target, `engraphis[encryption]` installs the driver. The cross-platform `all` extra deliberately @@ -392,6 +417,12 @@ print(hit["context"]) The same `MemoryService` backs the dashboard and the MCP server. +After an upgrade, `stats()` reports prompt-eligibility counts and active embedding-space +coverage. Zero-result recall identifies a review-gated scope instead of silently looking empty, +and `engraphis-cli review list|approve` provides a dry-run-first local bulk workflow. Embedding +model changes trigger a guarded rebuild; vector recall stays disabled until every stored vector +matches the new fingerprint. See [recall recovery](docs/RECALL_RECOVERY.md). + Agent hosts can avoid retrieval when their existing history already fits: ```python @@ -463,7 +494,7 @@ print(merged["compaction"]) evidence for historical reads. If a credential was captured, new writes are blocked before storage; for a legacy leak use the explicitly destructive `MemoryService.secure_erase()` or `POST /api/secure-erase`/`engraphis_secure_erase`. That flow removes the one memory and local -FTS/vector/ANN and derived graph/link rows, runs SQLite secure-delete, WAL checkpoint, and +FTS/vector-index and derived graph/link rows, runs SQLite secure-delete, WAL checkpoint, and VACUUM, and scans recognised local SQLite recovery backups. It cannot erase exports, filesystem snapshots, remote peers, unknown backups, or information a running/compromised agent already read; rotate the credential. See [secure-erasure limits](docs/SECURE_ERASURE.md). `forget` @@ -561,6 +592,10 @@ plaintext. Generate a strong key: python -c "import secrets; print(secrets.token_hex(32))" ``` +When using `ENGRAPHIS_DB_KEY_FILE`, provision a regular secret file readable only by the +service identity. Engraphis rejects links, reparse points, hard links, malformed text, and +oversized key files rather than following an unexpected filesystem object. + > An existing plaintext database cannot be opened with a key: migrate it (dump → import > into a fresh keyed DB). See `.env.example` for all encryption options. @@ -602,6 +637,10 @@ All via environment (or `.env`): | `ENGRAPHIS_HTTP_INDEX_ROOT` | First `ENGRAPHIS_INDEX_ROOTS` entry, or current directory | Single root for dashboard and REST `POST /api/code/index`; submitted paths resolve beneath it. An explicit root (or fallback entry) must be absolute; an explicit HTTP root is included in the engine-approved set. MCP and CLI indexing continue to use `ENGRAPHIS_INDEX_ROOTS`. | | `ENGRAPHIS_DB_KEY` | Not set | Encrypt the database at rest (SQLCipher). Or use `ENGRAPHIS_DB_KEY_FILE` | | `ENGRAPHIS_EMBED_MODEL` | `sentence-transformers/all-MiniLM-L6-v2` | sentence-transformers model | +| `ENGRAPHIS_EMBED_REVISION` | Not set | Optional immutable lowercase 40-hex Hugging Face commit for the embedding model | +| `ENGRAPHIS_RERANK_MODEL` | Not set | Optional sentence-transformers cross-encoder reranker | +| `ENGRAPHIS_RERANK_REVISION` | Not set | Optional immutable lowercase 40-hex Hugging Face commit for the reranker | +| `ENGRAPHIS_REQUIRE_IMMUTABLE_MODELS` | `false` | When enabled, require a 40-hex commit before loading remote embedding models, rerankers, or chunk tokenizers; `local:` selectors and filesystem paths remain permitted | | `ENGRAPHIS_EXTRACTOR` | `none` | `none` = verbatim; `chunk` = offline structure-aware chunks; `llm` = free-form LLM facts; `llm_structured` = schema-validated facts + graph metadata | | `ENGRAPHIS_CHUNK_TOKENIZER_MODEL` | Not set | Optional Hugging Face tokenizer used to enforce chunk budgets with the downstream reader's real tokenization; requires the optional `transformers` package | | `ENGRAPHIS_CHUNK_TOKENIZER_REVISION` | Not set | Optional immutable tokenizer/model revision recorded in the chunk-counter identity; pin this for reproducible benchmark artifacts | diff --git a/docs/ARCHITECTURE_V3.md b/docs/ARCHITECTURE_V3.md index 01652bd3..87763939 100644 --- a/docs/ARCHITECTURE_V3.md +++ b/docs/ARCHITECTURE_V3.md @@ -81,7 +81,9 @@ selected layers are never reclassified when a database is reopened. `sqlite-vec` is installed, so the default remains portable and deterministic. `sqlite-vec` and SQLCipher load incompatible SQLite native libraries in one process: with `vector_backend="auto"` Engraphis falls back to NumPy; an explicit `vector_backend="sqlite-vec"` fails with an actionable -error. Run accelerated search in a fresh process when using the SQLCipher extra. +error. Packaged dashboard, REST, and MCP entrypoints use the `auto` setting, so an installed +`vector` extra is selected without changing the deterministic constructor contract. Run accelerated +search in a fresh process when using the SQLCipher extra. ## Query planning diff --git a/docs/KILO_CODE_INTEGRATION.md b/docs/KILO_CODE_INTEGRATION.md index 176ffe2d..49971445 100644 --- a/docs/KILO_CODE_INTEGRATION.md +++ b/docs/KILO_CODE_INTEGRATION.md @@ -62,13 +62,23 @@ These are the properties that matter when you're deciding how to use it well: ### 2.2 How recall actually works (so you know what you're getting) -When the agent calls `engraphis_recall`, the query runs through three retrieval arms **in parallel**, which are then fused: +When the agent calls `engraphis_recall`, the query runs through four deterministic retrieval +arms, then fuses their candidates: -- **Vector**: cosine similarity over local embeddings. +- **Vector**: cosine similarity over local embeddings (disabled while the configured embedding + space is rebuilding or does not match stored vectors). - **Lexical**: FTS5/BM25 full-text (with a `LIKE` fallback on SQLite builds without FTS5). - **Graph**: Personalized PageRank over an entity/link graph. - -The three are combined with Reciprocal Rank Fusion, then ordinary query recall is scored from **retention, semantic similarity, lexical match, graph centrality, and importance** (minus a staleness penalty), before the top results are reranked and packed into a token budget. Retention measures time since reinforcement; it intentionally does not apply a second age-based recency penalty. Recency is reserved for the separate queryless proactive agenda. The upshot: recall is hybrid and principled, not just nearest-neighbor. You don't have to do anything to get this; it's what `engraphis_recall` does by default. +- **Code**: symbol/file/call-graph matches bridged to approved repository memories when a code + index is available. + +The four arms are combined with Reciprocal Rank Fusion, then ordinary query recall is scored from +**retention, semantic similarity, lexical match, graph centrality, and importance** (minus a +staleness penalty), before the top results are reranked and packed into a token budget. Retention +measures time since reinforcement; it intentionally does not apply a second age-based recency +penalty. Recency is reserved for the separate queryless proactive agenda. The upshot: recall is +hybrid and principled, not just nearest-neighbor. You don't have to do anything to get this; +it's what `engraphis_recall` does by default. --- diff --git a/docs/MCP_TOOLS.md b/docs/MCP_TOOLS.md index 5ec78878..ae1e66e6 100644 --- a/docs/MCP_TOOLS.md +++ b/docs/MCP_TOOLS.md @@ -42,11 +42,15 @@ The following inventory applies to the Classic compatibility server. Start with Retrieval responses (`engraphis_recall`, `engraphis_recall_context`, `engraphis_recall_grounded`, and `engraphis_answer`) always declare -`degraded_mode`, `semantic_support`, and `embedding_mode`. A `true` degraded flag means -the active backend is not a declared semantic embedder (the bundled deterministic fallback -is feature hashing with lexical overlap). In that mode vector retrieval and semantic-cosine -evidence are disabled; recall remains lexical/graph/code based and grounded answers use -lexical support only. +`degraded_mode`, `semantic_support`, `embedding_mode`, and `vector_search_ready`. A `true` +degraded flag means the active backend is not a declared semantic embedder (the bundled +deterministic fallback is feature hashing with lexical overlap), the persistent vector space is +rebuilding or does not match the configured embedder, or the vector index failed for that +request. `vector_search_ready` is the authoritative vector-arm status. When +`semantic_support=false`, vector retrieval and semantic-cosine evidence are both disabled; +recall remains lexical/graph/code based and grounded answers use lexical support only. A +request-local index failure instead reports `vector_search_ready=false` while semantic support +can remain available for exact support scoring from the configured embedder and stored vectors. Trust boundary: normal local-agent memory creation is prompt-visible immediately after validation; it does not require owner approval. The default `agent` source covers `engraphis_remember`, @@ -57,17 +61,19 @@ prompt-ready MCP recall or context, `engraphis_why`, or `engraphis_timeline`, no resolution, links, graph/code backfill, or derived prompt context. `include_untrusted=True` is inspection-only and must never be copied into a model prompt. -MCP deliberately has no approval tool. Approval is only for external or quarantined evidence: it +MCP deliberately has no approval tool. Approval is only for external evidence: it creates a fresh, audited `approved` successor while retaining the reviewed source and its provenance. In the local product it is available only through the CSRF-bound dashboard review action (with `ENGRAPHIS_API_TOKEN`) or the interactive TTY command `python -m scripts.approve_memory MEM_ID --reason "..."`; the command rejects redirected input -and requires a typed confirmation. Hosted approval is an owner/admin action of the private hosted -service. Direct in-process `MemoryEngine` use is a trusted-code boundary for code that already has -local database authority, not a transport permission. +and requires a typed confirmation. Local operators can use `engraphis-cli review list` and the +dry-run-first `engraphis-cli review approve` for scoped batches; quarantined records are excluded. +Hosted approval is an owner/admin action of the private hosted service. Direct in-process +`MemoryEngine` use is a trusted-code boundary for code that already has local database authority, +not a transport permission. -For the full memory trust model and existing-store migration procedure, see the -[memory write trust model](WRITE_REVIEW.md). +For the full memory trust model, automatic schema-11 classification, and operator recovery, see +the [memory write trust model](WRITE_REVIEW.md) and [recall recovery guide](RECALL_RECOVERY.md). | Category | Tool | What it does | |---|---|---| diff --git a/docs/PUBLIC_BENCHMARK_RUNBOOK.md b/docs/PUBLIC_BENCHMARK_RUNBOOK.md index 94a3fd1c..f7f0ee9b 100644 --- a/docs/PUBLIC_BENCHMARK_RUNBOOK.md +++ b/docs/PUBLIC_BENCHMARK_RUNBOOK.md @@ -91,13 +91,23 @@ token accounting, exclusions, complete baseline coverage, and resumability. Only holdout. For external datasets, use the complete dataset and canonical mode where supported: ```bash -python -m eval.external --dataset longmemeval_s.json --format longmemeval --canonical -python -m eval.external --dataset locomo10.json --format locomo --canonical +python -m eval.external --dataset longmemeval_s.json --format longmemeval --canonical \ + --embed-revision <40-character-model-commit> +python -m eval.external --dataset locomo10.json --format locomo --canonical \ + --embed-revision <40-character-model-commit> \ + --locomo-repair-manifest eval/datasets/locomo10_repair_manifest.json ``` -For `eval.external`, `--canonical` enforces complete source-case coverage only. Its ordinary JSON -is a private diagnostic report, not an `engraphis-benchmark/v2` public artifact, and must not be -passed to `eval.benchmark --canonical`. +For `eval.external`, `--canonical` enforces complete source-case coverage and a pinned semantic +embedding revision. Its JSON records the source-data SHA-256 and selected embedding provenance, +but remains a private diagnostic report, not an `engraphis-benchmark/v2` public artifact, and +must not be passed to `eval.benchmark --canonical`. + +The LoCoMo repair manifest is SHA-256-bound to the official raw file and covers only three +otherwise-unresolvable evidence references. Mechanical delimiter/zero-padding typos are normalized +separately. The adapter rejects mismatched source hashes, stale repairs, and every unresolved final +ID, and records the applied manifest in its report. This is reference-integrity repair for the +private retrieval diagnostic, not correction of the benchmark's semantic QA labels. Execute each frozen point from its locked manifest rather than composing a new shell command at release time. The point runner currently accepts only the in-repo canonical harness. Keep the diff --git a/docs/RECALL_RECOVERY.md b/docs/RECALL_RECOVERY.md new file mode 100644 index 00000000..1d4fdf81 --- /dev/null +++ b/docs/RECALL_RECOVERY.md @@ -0,0 +1,64 @@ +# Recall recovery and upgrade health + +Engraphis upgrades should not require direct SQLite edits. Schema migration, vector-space +validation, review diagnostics, and governed approval all have operator paths. + +## Zero results after an upgrade + +Recall responses now distinguish an empty scope from a review gate. When memories exist but none +are approved, the response includes a content-free `eligibility` count and an actionable `note`. +The same counts are available under `prompt_eligibility` in `MemoryService.stats()`. + +Inspect and approve local batches with: + +```bash +engraphis-cli review list --namespace vault +engraphis-cli review approve --all --namespace vault \ + --reason "verified against the local source" # dry run +engraphis-cli review approve --all --namespace vault \ + --reason "verified against the local source" --apply +``` + +Do not edit `provenance` in SQLite. Schema 11 automatically preserves the old explicit-trust +contract and recovers the known historical local-agent downgrade. Unknown and external evidence +stays pending; quarantined evidence is never included in bulk approval. + +## Irrelevant or identical semantic results + +Stored vectors have one authoritative active fingerprint derived from backend identity, model +version, and dimension. Sentence Transformers, deterministic hashing, and API embeddings publish +durable identities. Any configured-space change, including A -> B -> A, rebuilds every +non-quarantined vector before that fingerprint becomes active. + +The engine commits a rebuild gate before replacing the first vector. Until the rebuild completes, +the vector arm is disabled and recall safely degrades to lexical, graph, and code retrieval. +An interruption leaves the gate in place, so mixed embeddings are never queried. + +Check `MemoryService.stats()`: + +```json +{ + "embedding": { + "configured": "emb:v1:...", + "active": "emb:v1:...", + "rebuilding": "", + "ready": true, + "vectors": 570, + "current_vectors": 570, + "stale_vectors": 0 + } +} +``` + +If `ready` is false, stop other writers and restart Engraphis with the intended embedding +configuration. `MemoryEngine.create()` resumes a full guarded rebuild. A model load or embedding +failure aborts startup and retains the rebuild gate; fix that model configuration and restart. +Do not clear `embedding_state` or rewrite `mem_vectors` manually. + +## Provenance audit + +New service writes include `writer_policy: service-v11` and an internal `ingress` label such as +`mcp`, `intent_api`, `cli`, or `service`. These fields make a later trust decision attributable +without relying on the caller-controlled `source` label. `trust_origin` remains the authority +decision: local agent sources are approved, external sources are pending, and poisoning matches +are quarantined. diff --git a/docs/SECURE_ERASURE.md b/docs/SECURE_ERASURE.md index 8251672b..bbe8586d 100644 --- a/docs/SECURE_ERASURE.md +++ b/docs/SECURE_ERASURE.md @@ -12,7 +12,7 @@ compatibility aliases only. For an already stored credential, use `engraphis_secure_erase`, `POST /api/secure-erase`, or `MemoryService.secure_erase()`. This is intentionally irreversible. It removes the specified -memory from the main row, FTS, vector/ANN tables, memory links, code links, graph evidence, and +memory from the main row, FTS and vector tables, memory links, code links, graph evidence, and unreferenced extracted entities. It removes the record's old audit details, records a content-free erasure marker, enables SQLite `secure_delete`, checkpoints/truncates the WAL when SQLite permits it, and runs `VACUUM` to rebuild the live database without free-page/FTS tombstone diff --git a/docs/WRITE_REVIEW.md b/docs/WRITE_REVIEW.md index b8bec9a4..ef750365 100644 --- a/docs/WRITE_REVIEW.md +++ b/docs/WRITE_REVIEW.md @@ -13,7 +13,7 @@ records remain inspectable and auditable, but cannot enter model-ready recall/co links, graph/code backfill, derived prompt context, or public `why`/`timeline` history. Corrections, promotions, and merges fail closed when their inputs are untrusted or quarantined. -Approval is only for releasing an external or quarantined record. It creates a fresh `approved` +Approval is only for releasing external evidence. It creates a fresh `approved` successor and preserves the reviewed source plus an audit link; it never relabels the source in place. There is deliberately no MCP tool or general REST approval endpoint. A local owner can approve through the dashboard's **Approve for prompt** action after configuring @@ -27,8 +27,40 @@ python -m scripts.approve_memory mem_... --reason "verified against the owner ru The command rejects redirected input and requires typing its displayed confirmation. Hosted owner/admin approval is performed by the hosted service, not this local package. The direct in-process `MemoryEngine` remains a documented trusted-code boundary for code that already has -local database authority; do not expose it to untrusted transports. Existing stores can be -inspected without writes, then migrated deliberately: +local database authority; do not expose it to untrusted transports. + +For a local batch, use the content-free review CLI. Listing never prints memory bodies, approval +is a dry run unless `--apply` is supplied, and one typed confirmation covers the selected batch: + +```bash +engraphis-cli review list --namespace vault +engraphis-cli review approve --all --namespace vault \ + --reason "verified local import" # dry run +engraphis-cli review approve --all --namespace vault \ + --reason "verified local import" --apply # typed confirmation +``` + +Use `--source web` (repeatable), `--repo NAME`, explicit `mem_...` ids, or +`--legacy-agent-only` to narrow the batch. `--yes` is available to an already-authorized local +automation. Bulk approval always excludes quarantined, retired, future-dated, and already-approved +records. Quarantined evidence requires individual inspection and is not eligible for the approval +primitive; preserve it for audit or create a separately governed replacement. + +## Upgrade classification + +Schema 11 automatically classifies rows created before explicit review state existed: + +- a non-quarantined row carrying the old explicit `trusted: true` authority receives the + equivalent `review_state: approved` stamp; +- the exact historical local-agent downgrade signature (`agent`/`intent_api`, + `service_review_gate`, `trust_downgraded: true`) is recovered as approved; +- every ambiguous or external row remains pending. + +The migration updates both provenance copies, records per-row and summary audit entries, is +idempotent, and runs behind the normal verified pre-migration backup. It does not approve +quarantined content. + +The poisoning rescan is a separate security operation: ```bash python -m scripts.rescan_poisoning --db engraphis.db @@ -37,4 +69,4 @@ python -m scripts.rescan_poisoning --db engraphis.db --apply The dry run opens the database read-only. The applying pass demotes historical non-approved records to pending review, quarantines detected payloads, retires their derived bridges, and -records an audit event. +records an audit event. It never bulk-approves records; use `engraphis-cli review` for that. diff --git a/docs/images/context-efficiency.png b/docs/images/context-efficiency.png index bd6543f4d4475d6fee0f1fa5ff87c4997b3b17f9..718102ae42e85cefd7b2c5bb7e6dfab94dcaa097 100644 GIT binary patch literal 156820 zcmZs?1ys~s_s5IUC8#t~qI7o+9ZEM+14=j23@}ItDk2TiAW{+oL&p#z9Rt$c9Yf5} zamVNR`@HwAb=R6TtOe(H=A5(l+55A}BExl8sNa!NWC}?up1gQhmXOuS>)T`^aeUsc1=Wg!PS_ zpGcNgDPA^-;zQ0YJyM-tk!)I(I*Jt-_kUwQRl?)eRp`Bs@4&a13ahH}-5IKV)^>6C zbA4}GQqcEcE)`}s1UQpW)CteIa9uvzop6%^b8Y%P@HiH`^<7!JIN8LO(>_JSVPlMt z7?a8(^GW14^aO*3*=OI1SwFYwzONQ!DUhAEy`S&5-5(t@=w}4de1$d8Qn})o;I?6xf_|!Af;+hYWV}3!Ka9 zo;T_2w&#f?0JNmaoNvmC_oi#MM*0P^X?8Dg@1^veHRYo}vIIzRS1LG4JNH%uDLuM` zsOLP;6hhd%y`ca;P9(~j)!`1%(;5_{R)j2QCug4|gNz?cyAd=gl%asB!4s+59nS-@ zBl-D9UVi-e5r6#9;*C6tMmT<^w!v1mb%9i9?;$B(p{Hl-9eCQ8u;uRcwASX(`b8Cc z6LjLT&AMb0GH3ZbG=6$iqwwsBp^*>}PC2LwM@awbJX6>}c$O`Ac7u>22R>T)Q^Wnm z*PKp_RUJ6Y0ogIlEPkoo>K4GmyxvPrLgm59W_D9y;r?to@ut)kGMlX5Er+)NZh&t& zuwxTBm0TdeOqI%;ow_jeSVk5mw=>>s6s zq|pkbmju-WQp-HuUtI)HY17($NJcOCZaK=KfJDCbWYl_id-dcHlr19%gw-0Yw(eDC zpy#N^F-$gu%aD76w2m&$#th4zJ=tfO6NqsM!b6Bj`hHW{NKZ^%sC(jfw7T*p;B3#w z>P|WcWWm6I2!Hnhef{i$A0F7NC*`Rf)6 zYH7r4IzCrt#?iV@Xh;!_YTIsC=j~q*wet`zLLJcPSPQ~Pj4Q?n8>K)nMw6}flP`+? zy9E=peU^F%{}}9r4Ahn56dR|Lsfa9ICyhaWKxLl0Csn1jD8}5 zr3R?ItrQI$ULV;F>icGHjLgUNriX0eicMdYnUIK}9I3D4OHT!~Tt%$Pc4P9u;+r3@Fnm4!Mknq6#7UO%m& z(c1>8P*pd!uw3A5$&m#`&~`|Q5+UH#wp^yl%aDXM1YoTCa~5EQ$GTE!z$^;0AIHO0*9B)*Vm91W52}@I=!g0 z#lT%ax`-S0-4R^jYmM*X)Lr`d_$1-=OrIt{hN34d$JHp}@|~{S1+jM4&zy-X31`_( z9T5G!ts3a>XI#jg(ccFP>I^UXu5OT*q~94AdqDt6rCXO&H$--7mr1a(l?SVds0KP< zKz81QH9Ya^tC-le$xn?8!d=Fkh?wKyH>qI1AdOA9|$qiDBHT zpiW(3vi}(AsJIRwgq$^d9?dlZ0q8L24WMBD^HVJkV7!YG&`PcC_wZpoK2@^ptkwx+ zlCQV1Y`qHrdx1ch718D-uYFE)Bk6;_DU~>F2BYYzaIg<3f4-o&j#E;D9g9Sb64JmJ zpp|ga&o^KksJ#L&!|*GLuwl*{9Jfe0ux7}P3pE5clb-0<{qmijPRTt@h!k~LY`Z>5 z2E7-EFA+wg?eH$(Hgpq5{|X~4uKmU7X*&6|IwA>M&=^l2eOJs*j@KT-KssX^mARAo zmh4xW*jC0Z=@??u>W~z{ns2b75U!if@HL0C*80AB+Y*tdP5 zj{&3C7r^2P1L9afEfs3B6M92|wJD!Ksfh7+Es?8rM9HAx^<`wJ2KD^}Y^9Bx@IVfl zzWaW`JXj1MHRG`zwEMo=9fuYgtp=U^-1QI6Df%5IN1s5(h05vAn+QuKGBJjXToDCr zUEE+$_1yR6q`ks40JXm&2?bKzPg05|;xI-s5&BqHjD>xKlj{2`!ia#zSc@P{3f@mA zt;SP76yPd%7khDe-EH)>QsGe)ys*ud;0!C4LE3;_2*uj*N# zmqSqIln%*nNPL&8b(@Yv9Uqe7!_4yhC%4&*@B}{hX)EHizP(paF24h5OjsYTy-IDs zc*jVDs$T6gbzid_VY}A4$3Ip~vka3slI+w2I)+LGTL9s_8la#<7vF3^z)(qiFgaE_ z^kXnQl51)>KyO4oqM~=Nyq2{e&JqBY0Yy8&TXO0i+d{ zY${^g-Kehy5cC!)Z;7~mdDc3PxF|H}kB{r71T4R*%Kk*nPWuQ@*6| zu1Y=+#LEvL5$Ic7uPnzA6n8GZld%bXFQcu!P_<acN#8jiunLV4?npTTdSJMB){sJ;3jIx5EFe6eG>51FRFNpR zzJ9XRKt?1Kx?JZ7OCoAPhDyYo)sAf5Q!wTmB@F5NRyiQdD`Rc$Sd6QgmjWx!8O87w zP2FK)q;5`GG^4nVZI4)B<^)O}nmNN36e+lEbU1hQcHM-FNpncF^|#x#d4C{VtlPB_ zg5>fnQ8dQd*4jef0vD-wZH%iE6|zEGrDcb=W8 zEme(11|qQAI6Xn|(chl9*xX_H=(tfa92R7JSWGDnJ7eusr%3#SuTN2m`nCv7l8HS* zY+K9dk_KJetQCG!&YLW;u85Cr!CnOMCCkNOA0!K(;vR!Yk?5pLi3FJn^g!_(vvW;& z`=GxAmJhVc7W8q{sGWPi0dW?g9{f^J03h(T6%uet?fg*Jeve6U(Xx*Irp|dVJV$#* zy~hT=s;FP%sR)gKIPnX?5+YF%TXaEk3PIbm%#6+ck_kRh5_kcuul>(WKnT;wRw zS*79-m=s{{1_9n;-1epnXFihNt1}jywoAA97Z3SwH1Hc~z7`=gQnxYpY>r@*fzF=yKvk!9u^z%dVq{6xNOj_ zll}<@C|3jFrAoc=G15l{17s zM4=XG9U(M5ROFuZS>~e8kPXuvs>;i@2yz2NFUV3LLG9MzypbH*PqpVz@P$Cl^ z%qHP455k>Z62hK_r2?0D_d=N9r*7ac<)pugQJeg`bn9!}(#U@n<5 z#B#lJgBjr%Q|N#mtBbVC6-{iHMPr2!Sblgd zF8BaRv($>}!|3vF<29~G#EvGi1r1Hw6^O=S(}GUOng!fJ7Y7O1wk#kRQ5X8+Sr(lA z6FDtQQKq%G{42R5mf<0hhvSolUv64Il2Rm!SQU|&aTnAsNLD1=s!X)sUz}N#`68_DqbV8!g+~MQ zyc5QEI>v=;29Q#>JN?X;-H-oJU79wXH8~K|j4oB9OTh;B&pn-F>P11IXm!I~bQ% ztJ#%a!70N3qzIK|I$5%*CkWfb-(JX1eNvwIx)qSxD`hit8|voBRICQu)8ZdotDwkM z>y8Py{MgO#n@nSu>H4_D?GCZXOE?D!jpM@Nh(deI_PVc0ZX&F>2xPjEgldt_T!cpg zrE@B|F3WJ4jZYCDKRFltANINGy%YYc1)vd-6O%Wpy+22aGa8lC+hMJ}Etik0$=lzi zo7u%oc(2Fu86k-JI{pv-X&ZvT3w3XrfmnmH0^X1@RYX$z_eg@qF?F{L0w6WfA2#BN zF+!W12sx)jY=(oGdV;v%j7o;uKQ}FC)`F)KaNN=R*)V`*M)XOTl7b3C7oqk)a1H1~ zMhO=-%RXi$Oy8`)uEszHjs<6NP}baH`f7iSb21_SW)NO95r{glSDqBwUe^YArKI@} z{O#_4$c=5+C25q(09M2@`Jn^)f>uxAHy#_*>NuV>G8wuxUZm>@v;V5HyC^tXRmcXx z4U=L)BR~tf>}of`QJQcX@Bq2$0dbPh4&8Mt3nU4x;W}rIN(Sk~g^Y%&x;^^?eTirQ z5J5u!MZQd;0_bZF@~!uj7B{cAd2^K4nWQ{Vokwl=wKBx;L-M3zh5KCILGg3MccUF0~oqrEVjk z=CWZRAy3~vS`~-Dju@5>L3kwe*CodNn(yDgCw+sCR&0^nI)s}N^kV1qwZ z-?A$9NS_u}DA}5%*;T}V=g#c~20k5&?;A#qQB9LigNe(Kz~VO^bYbPHAt%(w1}s=> zm}{fMiI6ef_3?0*RF_iZo1os~E*6g$x(Q8MEuT}S>2xl`cj>Edv^g1G8HJ@jsU2H@ zrxeBvS(5@pBPS57vsMvM26oBBq(z9AZba*Tsab8St}F2KlH<3}2YA^I>R!k%WhDvm zk6yiPrvHimn3Z!PhtUr{!TblmR4If&aidpEgwiPbbkqH_RU5uo1NN!m*`ykZ{^l0#ZWrODFI|Y$}GUW+VEUUu|P2 z(G#IK{wXeP%BL@wc6Bq+ioh1KtJty>SCa$>g!cjmu`Zf|Eo03$%qcCQL0<#p8%yu` zmd|CuOF??R6mcRvG~^0+jeoINH`rsrf30{xo{{R*+OwpUnjM%nQB7T z9*U(d8ZNmSm$O>25Q1Pip%Jqy|Ff$M%_5j09k9T!y9HqQD)6I9##X4 z4K6Q5V!v17ZMnwriw%C}vv*ykapg+MWA;w=AI57qr?0X9L1N|;C5>$Ca6CQ)DWon2 z*+(H_21JRNVN3fC#WuC?i2;b+)e}7B7U@3#rE;vYA&kyzYP7e?I@>6XQHyE2$95(b z8phyHsk=5c|fCs6sqQAf5Om}Ml-*Bz- zSAm~5hXOKX!&&9|&co@yxA$+csQa_*a=IG@Cvcwzlq%Nj)jTq02SBeX=JZBhKoTxW z>t(}5s zxg%0()PR^R@$oHS$=aBgYG-}%5sV8f_pG2f7_QDxKLD02Lt&s5!|cer)Qyu53kwlC z^fe2S&ijI7dp&`U-zf*JD~ivgp35b4mz=dQVH!Zl^wG$-C~(fqsbvj`&@up_RSwuc zSQj$7Yhyq#0UA-~rRiIW1deTSrsN3r32axpCpKV5v_g0y)VZdRF7eY5(p9AoxS}H%-4P}+- z)j8am0P5jB%{rG6&D)V zy@T4*N6*`v(7m-o<1mOaqWFYbzg==!G1Sn`{8PX;_Bx{EL^UF6fV?MWsv04|MBAu# z=^t1_oIMUywxC!ZkF@8Okb*kK)frnGS(LN|<*PUaEpF>x zJlZ}`y*=JRD}>vc_zd!|5NLHz5@y!;Z;0JFYE4<+PH_tE!%7N&*y4jMJH|2X1o3?e9U;I zBrbbv{%U9(JXQ+;(m9J5h@^M!`^Js7uY&RE)&C3R-sxq+N&lqWuwr_&jD?0bX>u=` zLlJM|4HV|0VW)X+8R*B=~YNEy*x8oykj=T zD@HF!eB5bGUuZZWK=|oafLK-&i~awFTk5_3&@(R$R0fgB^!yKTm}SnHR;ZZ&% z@rnIS00^*k{H~S#L(6rDA^X=}OYSf&n4IQtzva?yRS9kwFqX84%VbAM2}hHJ1BO;4 z;@Wj_lF+v%;D80f75bhY>F)(f(C16UR%#jJ>jxw(QvJ!+)B6HsJ*V&5?Jrd<-&MHHnz~Rpb@oTaU@L(HTX_YsS{#m%Aqa5}#nDGb&3eV-TlHBw@4TbPbacY8e?drsJWY37zuITl_t0pir=O>cjoK^t@D{_molXazd zBTFjTbFHltBc=ZTmWmfzuP%E=b(`s(shIs*-8p~lGJ3?U&ok4|^zDpJ-hENgM+nU7 zyv=nKt%&%8Cq1@G_*Qd_AIMiT#+~vvvL!vw+p=ZdG#3j{W z)`Uo(4y|Q9bBg`Dx1X%`61m17D9lkb-l6E{4CZp;1!R_Q!-5TpNU3){v^cB+qUC@T z2I#g)=NgVtws)pfwlB`VM*QqRJ53+I^F4DA@N$Cj?}LhMIcMeHzt^kQ{5tWsi(bLuwqA62t@9RJMgPfpWR07) z>gr=hi+XoC4*tK7U_HdzV)c5lOWs96zA^iW6-#CfFJ_C=HTDeGq>I?Fbd8KdY$#Kl z_&?WC9M15}e8i!s*!^pJ6@z#Mzx@jrpSZl?m6@A%b*^v!xKqJKobZdkMtvwT-18$@ zU$O#)6K&o5L~$BmtuNzSWD}V4zQrSOrIV17a3~w|KZ8A0%z4c7EwtkywYi!50(dUR zGC$=u%JRxK5`$rvn1EuJ7+US9yD!)v{y(<~PZTWF`emd=WC@cq#*~2VF;zD$x*P*MeR8VC!miM*v>yNRez?nrvKSz@OWs{ zQs?i2J{)StW*f1$q-9rz+Cs?`*r>zXOGS%%bVm3oc@xc=-S7Qp?hkzK_gu=OD4*ti zgYkzjP9QFaQ+mG{^4GgU@kq!y#5nXnBy#h%-__ub7u(Xw zk9ff3M&!Sgk!dAFJ^Fj(;Yp#A=~n`OwSep9srtSp{JqCSf$wZVb?Al%rGk9`Ob)%@ zuB;XCuP91;3F`mWU!iNJ@BXl?0OjGOr;Oe$sF(52iB5}d#W8b;@gyex&p#j9@+2oJiao*EB@W#Nh3)8TBO9sY zX?KZtY$BPDSCjze_&3PE$9u?g|9>uPt9bM#ob)xT>u}+dWkKm- zAi>|WB2{G1JtanmiciXK!_uhagXVG=psepbv^+MKS2ww@Z4kFI59sDSbuVV`x);jS zk^?2ciiOrEE|Ec1QM1;Q84qPiZDhNK>n2LCW78NOf^;vnGVc20*|jgJ>UNerPd!L> zU?-6wL7~$V1eZ*IjM+yWQ5kxQUgoq1oqSZi+=2pIqAyAA*z#1(^(?;csl9nO^<%n@ zV9Lk)>Z(qoH$y2Kyo*i8Wv|&~N!K41x3<{!uH7?wu7oKUPPUET;M~`v>HR}?TfQvq z&+MU0AJ9{3v1xEH<3Y{4pJH~(>asz+QtRE1dnP{mKqY7&_yrk= ze&)w4_qZdtzIsP&JNwjQAXfBb=4+Uc*UdflLx|` z?%@_8;|9yrKxB&8`NEqD>`rEkMTOI_v2;X;(qG)zK2`q=cD80UMfA&Sh?$~3H_;4W z{IPNU^%2@iLSL8??Wj?buEQ@PJYJl|uxypK3kH|pdR%`9Xqr%mdmyS&Y$1mYF|W;I=LNEPvnbL0jWJ;RF~G$82@;v;W@sxg z&cInH6=cz^d^R+1-m_Uc5;Udw-*sYxU_BJ=>F?SlO)C@K8hXQ$!mAuj?M{9-UE_0| z6FhL)!H4KmIS51!bo8!Y!e{%~>%e}I%Po?yy3}-p>s6u2qLpglYr#3s zY|!!bTl+~~HEEil?s3Z$O}C>+v4&gNP{edsa6o+jX+P(su|fJA{|4;&t|;A1Yb57D zn(&DQwXN>ghbN+MujY`0?&e?E)zk$KEnXVTSdXcwoq`?&*-ys%uU^fjt!(ZvL4qz@ z2b;zcx-U7zB^O`oZIn*0mtDY2TQdP&LE0|U$Y;Lvx5+=sPwy&yZ|-bks1slNvE4k- zn~C|#LY~ff81E0U7YVkBMvk9M9y9M|>|4Z(8XrG6U&>6HX`m2{XgMD26AplNE>v%f z^4IxsNURr(RHdYXoeZPFBDCZ4)wTrmUf1zu>50s)7N^M|1(}kW`*-PPUHf@k5zhN?eV|Wuq72xR392IgfrOYn5^S+g1OBRlU-PD=Nz7VqDea()c0tR*?usQ=bteCx)YAV zAz#eNNoEfHK+6T+CH->XD=gz;z8p~}{5r%DYNv5~!OJG*>3nu-K^ZIo{soKqjA_A@ z0lnl!6n=M#AQJ5v^Y=^8M-*lZxNUe^u#jABr7Uj9$n*ftidCrTR!c_<5IuL-^|rl! z0XHAVJw*=-lYd()vWA&GmK0u>cCkPqnQmvv9G*@fZcpqXBJ2ilnora$Uq6EE2%V!C z?xwD{@mjAIZ-;GfGu{S`W@IUJi;YUuxyJ81l^m?z)!lUCpZU0@?&xdL?{YW16b8!J z_D&#xt*{#dO}9bGgtXIOuRgckMOs_H`s=>f>D}OSpPv{8=ADX?dM4<<9Uqt7rTYQS zEw=*FjfVWUZHuSOLPkMzg8umQ05iRL7A>=S+l#gKNfC7~P?Y)lkApLCg-5UCWRvMC zGVVsuYmw*bR5(G9K(4CzxUZSrxAx_aZ%-DwZ-e?a`y$sKp0xVG+~`hvZywD`i487D zZq%#>&kO~Xjyn4Vm}l{4Ufh~&%<#{#?hSHfI|JGkyd2M1Q%VE#CBtzyg>NJrz5xgY zDO)$JIQPNyHo42+k$EQY7q9ok zRP?)E0>sj#04+w2pSMT4HK=i3w@vS8j&A!{{f-zgcb%a@hf%t_PYe4`;%yT^H}6V> zRM4xwbo6uB$p=F+9nMzjOmD8>m@ zQui-AGjwP&2qkUsBK7h(z~v$64z|LS><5StIWl^w+woM z5e@<2R^<*`H`?{fc09_uv+3d|o0E{+G8GUi%^dd!0VY2&ZZMyW`ay}k3t|Fw704hG zctuU};}dLowGgK^X@g)#Vr~4Q3GOcbSkQF`9;8k$x&IPeZ*s4Nm#UK^cqV50_eIyQ zuhdMv%mq?DWoKy|-rlPn3=n|fl8#kM&~d;<<|;=#?>ELxBf}+nt)OcD$h(>8AFYK< zfO(y?n=PerKikQf&8fr}!dFuFZ6nd^D zBr$~6J3+$kLt1ppk2|xQA6FvyFAYpBN7fpfPl|uMXRF&34$Hc<_x@7%=5T9N=zu+N zM9}7i0^((ZDWzd?06__)s$N2?*=HcKV8Yp+H~HZxZcV(&$fj}gF&u6@s_MpPpIl0C zbHcP_7##^735v0z)i!vczI$(V@0F{>n~eBDL_F9L zFx!hK^Z!IjCdPO5au6V26w_EI?$77c3RAoa9bL!m#TJo@oZKqk zmWD#;WE|JdV^VI@E>cP`zT6<+WEXBiJkEX!1ZPQK59Mc^P&j@!+q@ax?v*POXZ}^= z6L{C896ZEvS2H{FCBtnbX&1TnVyMjPa91a*apq`x)EAXnKM^pmTOKgeXV!mlwEac2 z^8Ouvu-9E7#W8O5OD93HpP^0p8Wur#yaz_Bx8fGNxbU<9M4O6j>0pKO^4m_Hshjor!AkG4Bpw7BJU;J@dUF{af2}s{`pjRGBkxlgntLt9Kp@&29htS> z(p^b>z2A_1KFQ`yvw#tz6MGT2d8sNa?%rj)@JwB!F6*ty)d2?N923xe^AG&!a8Pv; z5KO!c3!Tu~G9qH4+Jb@Q+2Hja6gx>f_&U|W%AOol{BMm}CWGuJ(#|M|XcF6rmHV!P zKK)dLZY+a#n zGr(QpC7}rTvgfnH4jm+LZ95+q#_%|RhynBUGDL~lrelC*x+F!z|B^uzwKtIi1dU2= zmbA{kowI2+=-Us}XLY{1WcPO8?pubGiP<)@&mF%AK-6NVZ^r0H6ZB{Cql^&c-vlqe z;0Ow&NFO!qFF$|C?Hwk*N9{zCy=o4N&P3D|& zu)P(4Z){-tdTMP(Yi~$tmcsegK5=69WVGmQlo+`T`_WYHeuJ-U@Qv7kL$pgQV6~im zt||TN=X(&^fD?J&f6XxLm0cu(vcHM zTA~uc(R7&OZaxsYR+`X)muI%SOTN83zlW`_Vg)N@u;hmh;KFGNJh!J>KddC=JEp;;3=t-= z!oJ_v$87#E`$G>jp^g0_oiVl==5npb=puD2iW4CE*=3iFSbC!BJ>zHQ$?V$N<%B9$ zc5qa#o}jJvgr2Sar0h z(VHEis)xC2yyY2mAwKzOXt+-DKc2x@ym343Vfy_&&o(t7K|ev}$&97@nDKNsaov7? zqboZmcv3vsVny=9P`HTY=iGjYYqBh3my7+k6)#_;M=x(Ml{gZ9PM;(0ZN|KKb;{M@ zQYEP6Zm8hZH}2}RR#3ps-*Or=a319=S6F})>LdHVlhJ^;A4(F9kP#8@%69c+Rl|Fogj>pX!zATqOAujip)S(z3wSA!#itW4CH|3{3 zuVTuwB;U_Itx+Y%!(=Jg##?Y&zO-UTe0h7U@YtNSmKyO&FMDK!<-`*w%osi!zh(-& z@Ij2ANpx$8ey8T%fQ~5*n0|$Wgj{`|myB!Ty#$FFmc?CiXjxPB#CGXS6X|HzNucE9vA-tQJNJmE?0L!J2-Tq~Vc! zlM}8@fU?wUcK+4VTjn=u?g<}``$<%t`^5!+HT^Q4Fbkd};j`ICMhByel>LR9H@3;9 z=2K{SL4nsovLiJuSJdrop^FdMuiZ-p%VpYFGCL+KwWwt@YaV$G)xry7{54Y3 zt*1m+iA7C8*8?Y{IcG0D_WX>jW^ZgzJX#&(FYD7aj15sog4pM6u`*wAJs&_ic;B(Z zt**PN0||2zX8^iE$s=7F=WqM5?L2atAKelL73-aEZf4WBE(4#x5l3CJvKEv+QHTpi z-y_BCrH^}~v-T#`&$Mz^y=ft{>8y|ZH(K#$fxY$-_8TeOyl+dI}h40?7tMiyO7#>af(E-%Y8TRhaEm6faeH(W0O0HtKW1U*zL*OYg)Me*+M5OxF zqT=IpzV!nB#Zm@$a;z_o{{6L7Fv#~)V8%i zj%`V=WOAZ<|4>?@NXrV294)^+l>**FmR*80h-gtt|0Y-7^yBW}gwFKvC1-Ju1BP_U z7GWQIO529-UOVE>1E!0mbI2=X07L`d)qPdc(}-I0q>Wdmh;Ox@*lc5LSEWQU)7%!a z=xINhCfvU<0JizXJ$WU}Jd`_9QWqd2UgFo3)$KcQqnvW%IsRFUzYGy*SKlSOb3DWe ztM{k$G#uQp&3_vMImvp__@ni!K%hr!1StzxU!1k%d+kQ_&f3Gg*}^pEuQwMDz`%A} zQ7!sh4rHu9N$qF;X`jo@)|1gwBvsx4gT>v#MqcpVeB)Zm1p;>Z;_kpm;R9Rvv2yHS z7mkhoc+WNa97hi6=vP*=gWOk<5TY@s z$kx_mPb0$ypP#-?1<~$j6$z4y(zoelqvuH}<|T!TT`EjN3;nc4Qx+MbF0bsih0wyx z@&2Rn6>27yfIP?N2V=AgX`;$M+CJ~947|F?bkw*XOYxYtpr_W#QZ#vBue~|48xTHOWhB@-MD_E7U6Gt0wpESM=R`}{80}liYH-ktqaSae0ap3 z2K|;|=;b7S7M?@IG5N|GKQybVRG8MU`Sl~N>YVyxMrKyGLX1aiN}MbF!by5L%*foS zaIRN;VbOoTWZtZj_Q9<+XDv^$&ChXjWernkMk_l3w1q~r@^iQs{mWyGWmj`gA`_!_3&QUCvlppNxOUDmV(qkFXcOKdj`Pk`e;@D`!hK};fBNM1 zTa`S>NK#m|Xqt4|XFc^>OB%|Sff1l%Dc;kJsaICRvOe9!z=!a zR^joSyOZ#4pR!4A3@7b3D6>J1&9rsg@tjHt$C;g0g0_s%R&d}^dAjX6Kzt{0+9}3C zf4UVefB@Yhk!>Mb+~=c?nGu4)U_hVBX>`ljH5%(M9>7(<6Muy zg^yG4v{q(u??#|tyXIQ4e0pm2&OWSH)wNp$To*aRElnr0*0mFTIVa@k%7Qg8 zb0qWjD4=m2*SqwIV3BF$!%+&?>wW|6BKF^q>{hV~wYu4b>3jDMFGAI8YCPRn&31jq zUn$YidIv4-W49g*z4hNMtY||`Ms$wSAB_B1?P=(Ox$fPHw4y#jM6EhKOl@v1QPsGO zNa|Y+G3NK+tf|7yqB;sUnJzk$;>O&(H<0Y;IvXBznX16R|Jn@|jrG6_vW2g=ZL z$P$y~n1+s~>PA~EX(4F6@>9CYrLKIp=*CL9l;9x&$-2Gweom}sR97Qfzk`;!>+7a` zsb9t0{Ic_1xNN)PydBF}&EmR!_$Zms9BAsDQyR3ENj{feza>(qRZkY#`ll zLlcigKZRw&K}<8$dU?rqVJ^4~WXJU1UOOHu;N4Rs@c_%SNAUTPFm;k93-=06@G@8n zNiMc`p4B#s=DgJ7HJxd#I#vK52@#r=SnNsIPvlGVV*k72x2bQQDA-eI6-CjGb&+1y zEaXVI#=gPp$B!h4W@+%X0bgPnhnY-Bdu&D#Rt0GVg9c#bG{#~7o|mHkFVMbRf4v;= zfis;vDY5l8uIbo8NPyv%L`%@}Y+mE(6UwDW?kS?vo{_ct0QbE@8P`NZGVS!=@3G4> zWQ=(IoD?Su?(ycR{NIk2yUu39ELAAJagJkjwssS}K!3|iqGbGo`*7_4nx_@a#MI=S z=Sn3%Y;Xk9gm_ z4oem6Jz;XbKeC<3o(BFR4z-zM>?HlKyP7D?6)|iymouSNl+?}`F^qP_!2j<63G{$d zP}nJ2EU?%m{w?vp)!Td$jTn}49gcYNno}BWi~ky#eI&O0;VnU7mShU{Gz|9CqA&RW z_f&q2M8q(5`rzw;HgH;ydW-hvEab?s?)A zwi}Bq@vE?hgE>O6Uxd#ZZe{J+2TPU!-!5t@eDj~w;C%TiRLhFhH4jgM&~{I6)uv?A zE{yE$evXvJLkM%+h{#eg3ipfB@8B8n=wqU7XT%Xm#KgeBcK(Gn(T2}FlGM5HjeiW2 z`T&)-X^GQBjgA!QucVi&rZ}}FbhP*>xR|&kMJetL8AShVAv~Cmgz42U+_Wy@V`zt0 zw4CJIunezL% z$=5;PPYtd^B0MgTq#JuP`1=w<`{jA2 zZ1k@dkisX+^SM!Et>o-f4cRBAAm83^=Thl*#oD)0ME##DptWnyYTRDOF%jBk(erMOoM49G=B zXC|<`=y@vUNc=>i*{uobcP8gqH360k!pVZvstT{SSNUD%?*4w1_jElE4z^oJJ6Xbv zvZ{n~U!G;*keE-3=}44ZcbIOph&Z6|YaN`!X0xc@26cpsIdo*o49v}*e+1*3E(AL3 z7A(iDfaU-P6GI1>#XA;_5?P!!zlkotqz5=PR!5oI!C~GcPSI0`$_u_~Q9{1$pFAIw zT{+G~wjR7?c)6%ef=Zj`b%`l_ts=55bbZTI7B4*c(@3)V-8@TwE1RpQQ-TGTUY@=^-kk2(2fdZ0 z!~zZ04Z?j2=M-~~Es_0A>a>;2I?|R(*IlY#ARPyRnHrYTzrS z=1Q*@3{pgZ@O7>`J~7qsOdNjl^o7&4&LXMim`luE;GWwx4HuI#C+9B2`G8G26H&Vv zFL=XOi-&G;^xNj}V(0qegP_%jYAY>U2e|5$uSnzm$EzugGXJbIqq^S!73NVViaQaM z1)^L>b>0Wr&796~yK-wsNl9yzHZtG$c!@X7hOqJ^&vt?9k62T|^sXD|d4=iH+c>r% z5pKzzGHR?$!ZQt)7j&#PDC~Oc-(*O?Qe{IF9JCU~{pi>iVp8Ee(l>uG6mfHlKs_9s zqyH5i$9ru7w;e)P$|>9?6@l|vW-m%75z}^!jlpVy^q`H~2Om3e>$uD-oVVS?<7!Oj zWDY(ipZ0C+4Of{To#qoxxXo7ERC!ZB#g!I!uy2})V-?}CsJ8C^IF{apd?_?r<{$TF z_6vC9mZvxF076kV2mUTrZWx)XMeOvTVl`buoHS*j0Z_+)%#+vLh%akoR;+y@Qf;%g z>`jjP%1%~@3j9&0d-DHK_0@4vwC~p{Qqm&bD%~wD zUD93BUDCCHg!IylbW5{zEg{X4!qVN{9q;mde^0!h&-^z#vvbc~*LALQ&X7n(5X~}W zUz7X%m~?+_<$}+)nN2ET9_`Z`NPWxMOQ;W);{EZ!6k^Z6Jl0!buI8{10zJ`j^&fW#Tk@K2<58StKh0 zEEZx-OI$@}ze{@MYm?B~w!@{T^JqTFa&H#xW_Fbln59?I z4(Z5UQ*+{p;}iOH+4#6KP|kstkh|s`*R!H@x}ae-Ic#KpmSOzWm+Hf|4%~S2VrnYr z4ZYO_ZVN|2eNV?^IPNkU`VHbd{HH#yNNesa@e?i^zd7!wI^9~Gtpx>n?^69Zshb?K z2-Whj)6C2D60&!Zi*gfLG<)?UGNnX$zD09|9v*;2=Bl#82C(RTN5X#W)C}EKqe4{(k69bERO$Ixp%41%;f(_8>-MCx&enMpP z(6~vMT#XDfyleboKU_2wB7AJ(lE!E)1?(7JgtW{}myblYf<+zIk!=zOxigCdOmquh zmx%U9F%*lF^f__u-1G%XGvBvfhSn+{q=$U5yISt+VE8k?8|EJFY&7BM(PbFb`f10{ z_1iMuNCsJwH3QdLwzRtn-vZEe$38d=yK$@WHB=@Eke-4v+@r_d0)IHi!}!a+H!~vK+ivX9vKYWMi7CN%Tdshs_1=Y{$5AWWM6pPL+aG4y|r69wN zW0Tu2#QXMgMA5ISw9{)JWto(I7?(y{0 zy1>p^3*SD)j#5XwKfzumtFPHS-JID))Yc(icZnzPCX#`O-L>GZ>}JSioM@xz@S)e0 zWRabb&TXMY;mZz8yKo->@8-wAr|%JR<8RmpaN=D~@nq)y z0g-wEwV%kiY+-&Xot&#9 ziJ^@9dJ34l&|*+nY|p+TN#`MrWtGbE>me1IDK~PcluIK%%Q6 zq|9VKf$7FHV(U0v` zcYt~*9E$$z%7$@9N{=pObKaDu26X*PTE}@UJGAz2y3y{i+=D%zzD$4@z*Bf6q)#?$ z(;l6OLfyAXwxrm>m;NPT4#7=+Xzub6+x}tT=L>f8da}FCE=GhUWj?2`3t4t(eOkPi zGb71!Z*+=h%2-`Dt36!i&@2c&Odv^TEsF{FWtpukrmTE+64poZI_P_|pXkhYCPo08 z4yry5&_Dg&^H7U}-Sn>1x>G?KBd^+WM2|V&n;FS~*Fr0^)PmAOgDU%LKA{l4F;Xyt$w!-ZdjL02kXUm*#V{bYMMm7=7GT1It$a5)m`7@ zZ%N{)&W(T{qwmCXoRZG_avt;}yj@wX1<$N7GLAjLO|?WX_f2_n!nnQcY5EP*rtl$U z3gosXU@E0+8Y1>b>?^(RQ&81&xU}Y+2Fa7**;3b1#}Xz;=B-)gy2LfpKH?y5 zwY1L1tDsQiRDr@;i`PPjGDIG3!Pl#B15R(-uC3NlDx6J6oG!07bSwil-D>t?7aIvo zs(Edes2I`pB>*K(!dDH(pIiG{4kk#`Dl-fbN?Px^qBcg?%hnk(~5b%{?zz~(9`XVX4F};~4SHdgH_xN{#c*>{xu(UTI#Isd( zxAk2wa{tn~x@=H!E(JHrdm+y?{Z06L@4G3XHnj~GTcOlBc1|wz zrN;~h#$o)W>8_cch)Mk3SlYWLK?s+FB8a`)OVG=#&s>5pxU@dgciA?ei#eID)l27_A*JZxf`zTtZ*4T5z599Rw0xkFZ*dEat$zeUNuPzH$`bI$P0>G8^ z&hE6ktPcBu4mnW5ty{f>`V#3+{C@)&t>c3H=$ z=-y3r)O*yrKNc%jJoIMS0q46?P7Sp6>kG%GBwZP}2!}lMnrlAwK|=T0Oe(KFhK;f& zPi23wxplZ0rYO_)B7GMVpi?0F*fXg-QEe0L(^;=Dcsg|A0^ZjWnDEMle61~{znq;D zj?)I_n|HrIMBw4IzZl-Lx0<&yNbs1@B#4;H?k1TnWla3z^0E4iaZwgiNB6bEAvc!a zJoDQ@{btF7c7c{XsjuKB2YKfy);W1kr!Ah|RRL-z3PuV7`?CO&UCPg6b(ERzhyM3N zJVcSs+g2-88>Cu|Tj6S6f}o4a5{36tkF0yRIgH~ex&X?gz5@@B%g}7d&+%huJk#M@ zrsU%JLP|+9=7li_i#S|mIAifu?VZI;*UatlI;Et@N;%K&(ONH0n=wBZ@a`fqryYe} z$WmgN#$hk^LxI8P6Xu2JPZe zA@r)~h;#2U}{Y%;2c zHBicCA-;!kHop*Rqszz1srAdIxMwcUD0XjvYfk0|JKLL61!BdS8ZG4t?w4++N*Qua z;OX0;(M>t~hpjxF?7jpia;J{fMj@SEF)h-;w~|ISc_!4yYOSlwp}sZjOT!J1YSVTp zRWUJ&&PGwYB1Zy0!^=7~I&?lth>4yqinl|%xvY^~*d5QT~r%8+D zcl_Mr!RO^&x@pVV&M14bqtdUj=yZm9LHU0_8sw#pcW@uD%#6c)@S zCLD8H&2ry?e5%zSeZ0$E%p|{=wJVc3WHrsKb)RcBSeWlMyPs79r^Q_`5C-i&aATTk zT>{9p8%vr7+DKyXF5o|^!6tlrc)it-mfD#9vRhpIru?U^SC(4SJ~7Qq&|<(0?ScIP zv`{=(6%aGeUM8BRKAuc)Oa@|eCeDU#;HAxo;ffF7bM3?&hT1#^-M0WVrVc+?q9w?S z_G9R{E-EvZiDGD`9g!Z@n-%L%yp$^V0e_PMA|>Lf@R)n~;90AnAos>$C$QfVxwh3C zHZ$#HoLEv&ak0JW{O-YiJogdw9tzk@Q^ak*zdTP8xR1xTs$(1&vK(u4SfXR82YIz@ zTX~dLhzFn=d)O>7zv;eKL|R2)1%H^=_oAX_`xM-Mh$jh>)W@GJ#!V}vuISs~jdp3U zGhV6+4tj?-=P7LhH$ne)it@3JX(4f<(QCogGCF0JicyA;*(!Q4s)T5nSsNc|As=Tj z(c^C{fC3gxqGCC-1{!eNjj{x>L^pJtl8VxFNB|42953ah!+EPLXTDxQ5%s1;<-S;c zC92yYF{;uFzOu#5tUt&tp7329SoF|nw1#<_r8#O`&ZbP{ceqrk%?h1#cFF1FjF{*| zo&(th;mLJ|6Pa3l1Pyh?2HA+C+njTt@bR>tOY*3-hb;_M^X|`^o2ffjChgn!*(bVr zH@u&2GN9yvtM*XS3)}eyl|i#^;3|c6zwXm3p?T&V>wK=VSM>2{?7P3H!Tn23KBSM* zkpp!YK(d)8=_PB5GjlcE-V4!SjwmPFhfRo^5bS#ANB|b!_FL;}dHyM;g_O6*i*^o2 zN#=`*4VFD{gD&uN5{1GddX}F{b7bSbRyE5LA8Td2g@$dgt4rNQ*!uK>6wYPr=a?_z z6wv)=`tJl2k?qVYHpkt*paE+Qr`aY+ z`32s=@N7z&cB!}eXOjiG>&j2D0U6mn%P3tRGWvSY$|v)f88}E#cDEkPgJ(^6PSi>Wnd)(gHzL8AIAp16oOPn*_vMC`l1dPNiFVdb6!qp~i{P*RYg3kAGXALzcn! z&zDrnXF$zR%*0smFNp@y(uv=uLjYZ4%X=WMII;cu!rpcKIOFc`{t+0m;&hs};lw&>OA{sc_> z6B*c|C(EC1A5zAXRcusSKIegy_0>F|j@Iy%#|A_L3=!+%TTduU{*;&v&aiO2Jyc^DIf+S=+{(b2BJ$r{QgZ z1WO(s=g7G;zMWfeN#CN`KJ(ZF&NwZRPC}zzU3Z>N9fx-hx@{I8e%L7o*v{@ZKDi~8 z&d|%rL|}yBT1KZeiXA%XaQBf{(nXEjQL-I0b!5~dMD~1W&KGrTz)o*dS_5Hz-4 zoGNyBN8GP%+bR__i3Kh1iS6M!WSzdtc<+527-jBrJWEphs#!l8m-B?c)g;^q&8Tbd zr`e#6j~Q%aVotiZKV#$d_q=3?ohI}sGw5%cHPd)?v}DQ2SFsy zK8YSKR=VNSAkxX>t2f#318I%a4S;e|&P)4*syAqo=#TX|$gUri*ew&EBj!(4+QFle z^I0%#yN58KO@*enQYlxCP-J*l|D3t(c{eVDtdVH*KQ8`}6SC(a)M+*a71XYVR|`HF z2@ppLDE}#!4ws|?K8UB{w%RqTqqSD#ocZdyRhnzZrBNwZB{%L=4r(=<((lu5mTQyW zd{(y|+?i@!iI!fQm?HiDhwC6!)Q9O4M8-l5;X99hsr5yaD_l=oY?JANu*EmqxgIlw z0P&d9y^Qak#c&0JJGvk!PReM5xNMyf>BtCC^&#OnzHhgijsC{fr%Zq|ma|u`c{6pP z`jc%JlZMgYUfR^D^YQRg)59|31>q9kMfc_$H<<&Eb*;q=FP0;ed8!p@sd4R_LvYZ6 zgq(|kz&k#bS#Hx3LbhSR#X*zx(^&b)w1$Hn=dy1EJI;JX-apIt@Xu1!TQgKiOdPKn&?b} zLpy&M1qd9c=-~#-i1G-ps%;DeBc@zEhI?NTc}E@gvv5hseGyJ zVHGL9w5CCyfzCwMRUTZ^BtR{+rt3L00nT&@W&?8BxnGf4z``4~1=0 zGEF)gvO;d?Z7s`RroQ`*0V=z$qEe+nuRVTreLC~&eVzo%*RZl&H*a8%H7X%YuF7Rs z38)a=7A8audP<+J8`{45By_ewO~o|ro%5+mEi>bxDa&|kwCRdkF462_NdIwmF5Gop zUd4gL}p5pg=8DZW6lR|wgBfyKkut#OjnDPmc4?H z?_f+zLyw;4CDCYYKKoVDQ$%KKF48JCp@;7{_`%d1t8cL4W+XHP`>EB&T;4=GxcuRk z0|?RPy5b)BOa-Nm>y-&7p{nUo*`8^vW%uo^?jLE%KH^Tg=eIn41pptG2ft)g4#xnT zjPHThr9>OGtADw#UWn_!AWa7$JsryRBi-X$74|P?TA%z7)0?dn92gl!zSlv1-tZ*> z$b-4G;?3uXj2E@jH^Sr+>UL+DI8T4uJL$XMV3WaFFh*{K$DQ@a{Z@&Tvx63zSD3|U zp|oiwp>!BdvVrhQ7ZZsRMq8}G&7NGbRGjI@op*bnQ|viuw2JJBTHhU=40!oc*szy( z@OO4|mbhCvPE0YTW)NJ-ec@x|VclNc4JI9kDuH^m%fZdv%}#_WeDyTD{3Xy>B{$nt zVN)vGv<*wNy#y!u&zkvAh~<4ib_Huq*Z zYU|mEgC8<F1%F{148axOi!MEvz$Y~z1)o^_He(O_q{{P z5&)S5JL7sFs@tqPpKl8x#ZMMn+FVBaL!XCEW&O=YS{w$meP>QE zziNvuKKWKq`&f>M;?q1{YYhGzFNz-gA!S+C9k^8RxTgn()-xdLDnnw)kyai5SMtw! zz|n+NG)4Q2kUBH~S>p3qM%amaG$J|gEF7=)oC@V`liaq=)?LPJ@*AmLV>m5@cXKO- z9A#Z&lDk%RF?#RW;--TGW!@R4IHEAL{A= z$8^v2#%U2E(QV0j^6yq8ouAhbm=o|taySgIsBFnRyziT85p`oifwT2ePKf2vPVHd< zgZT}$Ods?eTy@<>Nxn>Wkc4s{ogUyxTpsA|9pf=SAte#*JP>v{?c1#}e$UBp$XoJpb`Og7kpH?OO~JUP;}cDHCtHbzt!ddAdEoQAPg%hgZI!J z+l0d?p0Vb?4jQ;=3%NLakv$kMAo2yw<&7agAmv|0B_n^EpjZt>KsGVObOg>hB{pn{ z``?itlsOh)KqJ}En?QJrfOg>@${YjuPlfvjzx>3(33jWG&|l_|TtS$CivO<$ZW{i= z2Syz!#e=|xKpTT1>c6FJ+OC`1`*5Q3zEg%=pK|V^$?#YIE!Q)_u0uj_0uF#8!V1p9 z-@vNlML-JGoqvVZG$j0M9E>nQuJ1Fmc8V~-)#N{PfN1Dn@^GLFlHY#{_DpE6B4L8$ z?^6`(Ysj=g|9Al8{CS=vg3n4>3*%Pd4!Vs0mic7}1cOFDsz>YFk4`JlB==y3`3(N^ zj>LA_dogb#aNc#m&fQ{((rE7X|A(>Qso8_54cjBsP_rwZ#Ry`j|KTLC1)cb{og=UY zK9+G8T@l0v|NB7kCsm8&WZX30Zs2WE4KW=8{!4?vy~g6EalDyy3_NHM?tnQY{HKWn zufRs|9dtpMs;q%j4gtJc>HjLKm9)2~h+cR8jDzTf4Cm-jIz4ngoElvlz6ccLz-<*Z6 z?N;xa$>TY0?*fTdf}xMi%2>77Hc&abey-B1;c-ab030h6&w-1&yy&)@H(C80-Md+2@Cp*(vTXxs#&{W zTn7wO;S^1jI@%Je(Bg$MZK%fBVw{bTbcdP9D+9Mk8ifw}hw!p@ljo^@){SzGYky+_ z1?z3sVk;FwI{Tn_LeZPHtV-K)aL`|Uue-T!_i!xq#0Rgzpob8(gZ4PnE>@hArvL6f zg!-K+u&d5~RGCSEw6g%B!iNu!E#%77qJ05 z+DTCG&h%W65h1O?TLrvPv!^)n-~e{hska{7Q7^w^tV)L_O`d=B*~g?#QrRerw zD#tD+EyjR?&kJ1RV_ZQmp=4Bo3*nz8M5rXO$Rv_qy!WRZ+?Yv^n1Z~r)*dubi=Ff_ z924#@W+^Lk{C@==#(Ht}#vMXYxXDJiGVh4pZ91<#E!q~r(Y9VsAqm#k>>@-vQ-O^3 z=;!$);j z9F+UalyNtD+OEB$`>Vo`=jJ4ZM&IppjX<(F>Jae`J@1cO5~Q}@z0z8FsnE_@1BqJ` zT6CJv#_i@P$<6RKs!&QYFT1YXrYLQ7-K}W0P}zP19Xv&}ZW5F9p?&EBp<>hp30gXv zk~DQ|CvB7XGdjFXf{=GR9^p+BXSCC(B#YW&Q-$W$Z5+g_J>@%7Lga_rKTZ!^Ds@S? zf_L2+4X*X`Xnt5rt0yx~=8nGh{C|{g*sPKFa%Ih5B9DKQ++N~fbQ=sVH3!>{D_@`` z*N&}`h|oJ18Rg1QUga$6mJ`=M>X;EQ&1b+n#IBh5bL6lM^#s5?w#UwfJJ%-6a?^zy zx#PJhb4CbaJIC;y;~(L>l_Ak?eBS*&Queb@AIpXK&i{3RGG*J1w=q?O`XlM14rhIn z_LA^{o=^*y!@f1P(ATsyM?L+kDC0rIBkP2_^gQCb^pYEI-=ogU6&p3qiMTU~sMx}` zv-9BOmq5xRQo*k%HW*%y(_VFtlZR#6T*Zld342?IccSJw_{1d}0o=UxK7BGSS&nyy zdNmtvm!$LK$Lm+6_ahj0EmP?iR2F#`<#jv8v|Ty-w+|V+%0%+EGh4sr@?y?ylTf#` zDs->*hZ##zVwDf_T0%jS_Upr8@)#)Bi%I|jGw*2}Ch-CT5EC=rKTcFQ-aD`yd9IbZIR6za3j z=p3$BEzNmd!zs!YcxV}OX$1|O!vcd3WVFHMA3r&?@7eSV!agX1gefFRD&t^BU1vVa zU*pE`UXYl706SPU4K#2fzS%qoGP@F02_}0_Bp5cb4-B)V8u9t9`Zcp|l_GvAvXUPU z{qU-Bj)en(B;QxqgYPnH5Pqi^(oUTZ5dLcuQDqIK;IDN*wXW8rmv&VX&Ml#2CUau) z2>Kuslw&=iVCOO7kaQxf>&2ZperPx{FgbH@mknR*2p!Y4P*hef z?XJC|_U=H9ti5@F@<-Nwyg$%5cj0p_Zgt!+thw#+mt){6UZ{3x=^dK8pO}@u;;@Tp zb37SSQ4}iX+V@YL)U{S`;FWPi>yLjRkeeY)=JbL;djr#0`@83gX6W5b$V>`i9I=)H z@_Y)xYIFBsl>v8+VyTP=vd5(`IP7vKdpqZMxt?)f4$H`@e>sr}u2x>&ehvh^Aw|kLyx{VMuCm3jHfvRv>disQs%0KK8yU^6Qlh? zs)p;%5L`MEd~Z#WX232b=pjuAph1(dxmurhHH_rtt9NppOs$v=qd4C_+w@uY0w>uS zH~eO%d5${cQSy*kROZLEl8AFDQgq5&CCR^ixvcc)ZSx_iC{IU6TfWAKj0GwN3lWWYh;qVZrSv@Y1d|{UlnDt5|6gxv{sFPbMjpg=#$KY- zYATw$_%F3RUpR^YHA+H3!AFhuU!1Na?AX83DGvaRsphvAbQmAS8#pJedPD(XEu!4z zsXLe4%$y9H=(UkV=X^oYnJRxQ7L~GfJ&-U+=Iif+;j{HzJAuu;Pm0jM>!10g+(@^E zo|E1Mrk;!C758B;jrVy{P=LFxucPbbq(cJ6MNS+{wMltJPu+?)@lIm17UvIGYSunF zgUoJ?tqYos$45i7TQEDtI#%@MnV&TBaj!nbj+4&{ykGhlbiCTgPT7083At+B4@`^Z z4l+RQfd3)ZPuV9=J-K6oE=nXX!kzE@zd=eIy_l~OM!gAXoes#0XGpx9w1ziiPd*T4 zD`B(BA|Hrb@TdJ!K3rEsy3!tlOOKVTDZeJEV#7xc zP*szxpky=LU-js*UO=EKl^9L+Ewjjc;5S)e^M{Z)1Ld3LI^^D_yKl<#%gb$P<~AMg zJHkF|lzsXUIWzCQ;Tx$nmI)*6njpf^lV!?kbP7WEOB?>DXwQ3~8r&;(jYB_boxBaZ z8?NXWN9zJ+g6(wI{HMYCf~_(ywcTRb^gHxZ{zL){7dcU1^gzP?-i;LUyczb^;{?fa zY5AxXYB{n_FhQt2Yo(A0)9b5E$A0ge)X%lP6CBPoKW5x%KGnQ^BL5TE#QIw981G#k z=G4xd;E7nheC^sc{R4{3bIP;vk{UFx?P^cPjL{VzLB`b=2Vt6c0YQEW!gutF9wIe; zVKv+jy5MthZk&?p=^vZ7O5g2Tyz#-OlediDDW3IhE@%4Q95AGC;?LKcemkEQC5LXm zm@@YhZO0kfKU1s2Z!CQ0(!#{;_QQmRRA6I&db*BwPvQ;Md~NblA;%jHjhlOCKFLU9 zyzOn$PpEuOM={)P=0$b=nc{?$y*5XCI*$sog>!?RzjT?vE3lB9x77xY*FTJiA&E6` zMRfPX%_62Y5CoXVmakjO+4(dY`sZkhdW-AUb{9OfkHzIs#4(DlN}-98`H*ulue0C@ zwGW@#xGZ7XO5%Np8hLCd*Blf;4AnLznYieet)K#*tQ)iQ@o#?3C$G@+@6a-7<8xa0 z)4MKkq;ohnVj8`O#yZV zJtB-Q-LUg{L^_zS1z<7kD0^HX2cK-oX1hcjDIeO&Nrto*0JK+F23^<_44*GsvgP&4 z9#I#}~07+F+<_ZlrD(+8nQ@f7RSyJJF*^*lX&MJTZ5t!G~*LW~6vSbC8lym*1lKA!$B7pomA6Z9Z)Z}Bfw9k=Ds90my63RdY z{r{2K)sQ@j+So zmhXKGw%Omk)+5y-!}>ED@G}$hZ*T%8(-%3UK?{5TNuGIL_M-V~p=N8%XOR&6=Wdmut?Ei%C3Q&hH~(ND1R`e86gqe*6_hy=} zQ*eZ0a6}QU0|GV}gJ3Rz(*4H$%c+LB$6P9wDFsPBZ^|(2p(p$=-rK}UC!Oti`a99ND&b)z^q(;*vZ@t5#Ekg96@%`_h;B0}KrM<-!D+FqcCZI@1F1 zfXP-^lvOwITegc*eufo1g{nyYGXpyV)@kVIc=Y3gFS9{1lY|LBB{4|ey*D|Ear=~~ zdDs&fWJ1#UCT1)_;PLbMV|Lo#SimwMz<`k3B3`1m2N??|?9H$!!EzU&Sg!$a{SU~a za0KV)zgCRcZ%|OgPDFs(w0O)R;^JTTdiVgUrU;2Ca`+_J;g%~mfTQ~yzXGgO53vm% zE9bM2+xTpoV^cKsGE%kT@tB|cXX5aGxB9gqG9kK!U>25NB&9g5V-JEPK`+E(4S|yu zDW_jI_m-m*mY&J2SNHtp#>Y|VciH^cmT(#Yh*U49sWz589cUVA2gBfuT7}`X*lujf zMf+g0izF19q=shksL_qqqoMHrAN$Ub7oSz$w|UBO(7ywYd2X6ok`R{DTfjbJu`tmu zh7V!3YFx}R*k=zMmjKIutiZCKl7qNx{9|z__Bl&fiJd2bTfihY7l2A!TQ#0#P@FU# zVgSPxg(%{2Brf!etwbDzS-a8xmJ(sHSSY>|b;ut;Mp#M+@XP(BDZJJoJoeFZbZ;yC z*zFlctlT$3Dw_{5GI7?;|5biJ@z49gdR@+5xVBm%A+D~-v0=Vk^xRPS`7DV@mI#>K z>rLu!v_u$!YX}KXpyvrkdGpUmcyBS<5b{fPq5YD^nmQZCA9i`Z2=iXcUQy_%NE0SQ z`YLv@iVgFd4VMY~OOyXR#s0b~EL44tc*CH*Xo)q@A9iyxhXB)7^z3dxMJ(Mo7Ml3_ zKS1&OcklF~zn~(cP#Y2?hj2|1)m#$%GDfm3=hhT7LTU|}t=;+Xfh1-t`}IHb*MF1$ zT?3j(RSOUD0c<&5a6z&y<+dPC!U(2iN6a<;AS=@+@V9(RtnV{6Y%UKoCSuP?cKXbd zPiqD%R>JycI0jq-7`d&u-Y}L7f>27=5iB<-dp-13OmBnhS9T$>0;gDqZhXZp-0h?=_U5tbI z5Xs-axQ4!Ww|8Fad~ErOvgwVQ^g+{DGZU9U#PRT6{#EnqjhC5a^vgppN3%`mj@s^* z6l8JFe2atyUca6*WbvXArD{9&y+%wlXLVnOEcsqR=4U{JQ^hDNh*AE%o#CgW$17g~ z{2lY(;THy1NQEOrIbD zmQo2I;eaHEBqBO-7NF%~O4!qD4HE(l(L!Op5tPdqI?Lc+(Q>V=q??c$w z-C4xrc0fFtAhsGSCkV<~X0P|*Ox(qCR}>B3?}rGl!>7uyWL-_o9 zb2XO5?}%&ydaV|;U7TvICSRd+MRv;M)Nc%(W_bi55T)9dzKy@v1SZgHur>Rm)&(=S zC4-$$FiMBxRAPxXiS0+Td|;;PCBCk0n#Ke2hhEF1{6AOF6N3E8kXn8BM*-F=*0B|s z{3P$Du@cxtfRC?snBQ2lg!usr&kiFhKP^6oA~WMCOhC-`XRBF7|M#-~6XH6TychO>TRHiIPIMk!T9tU{OA9BWNbt0tZpqFTmZ9F$V43deq=$P;)B# zgDn@P{7izlWrs;$kusOJ&$l#88G>spw`9;@?SWEASeO_XmyekRkwj%cUU5nzOZj6P z|2>w&Q-y+0wj(9&V*Qw!Wspnf<8{~uM%A~)-cz;dDq;O68RUdjOBVX%k<{}U`Qs4H zV9huh8zLlUt0=Ag>g2be$ckxnI})6KbAYRwBllwp-gT+oZnktrz3Q;t zwlKT4y{`KqYchLgiUnNF%>jRcA(u2H+UoWSjJ>V?bp?z{|5FyIoz zMng4oC$|6_N`F33-kU7p(+*gswm3j--eTf!4nV}vHWAesE@al|cVc2bYBcXTm~RY! zs`E5@i;JOfnJ>Kt=?Tv%n`~9k?*@$PGyhm$pZ#JmEDA9F&WXx3`U$n_l7muOz8Hw( zpR_h-k7rRT{7s*nYd*=)T`2=_DZRK528`Q*bt@AJhq2fo?vgd?tTdcfFlNLi;SYM8 z{qEt1ZGrOuTEczly}SA3l_g_IP&wD#_4t!O2_QUO)r`-t7too0&ChXo5b7JLdKsE# zaXZ>jve??hM!$NzlAGy$mkt@HtNhyb+`U{ainMSIkc1bvGYymJ^u5aMV8ze$HoX;`^BL4iRRG9$o$Si+2Mr_H)#ar%cEY92^!PPG6z9!&_{fPG_k9}} z)H71)f!rBpgu1+Ro-$E60XR0`+H->b(psCYGX8K#7JB)@Q~S8&t9NU_i!sIk&l=WI z@b8~t_jWVeGDF{epKeB+IZ%^L{Soj7VBhCmb}-LQDJ1agKi}?Bx?IYaH8<7StX!?< z92~g}N;7y_$@27I!9~b!@sx%0doFHU*vLoZOE4;l>;5%z9mO2QoeZlBM`gM(j-j|A zfz=ImGkw1tNnZFSmPBqHj4 zbGPz@*=63o7YO2LV5A2%2y$dD`q9wg z4fHjPRdyW>o&)lilWB*GTLoS1tGas)i-OK(az&CJyP@lIz~*e801@>6m4Xx9qC0XjkMT^nYH5!7qi)acA4|uXYYljbJUqQz!Z8X^jD31Rezn)pFL}Ry(=KPrd z3TI#6Um1>X!{(fX9cL6tj9zKygx(eFvMh-~E9liMzD~XA>4F_87cCO#OELl)3rE-J zpWhXuJ}l>Btj(|VB;0j5)T{PJN(oKp7NKsEPo$}6OWvTq_d;`Nt7EI)5t`bfI;t<- z+AO<{mRYNY4EW5w%m_D~R0ir`%f3b8ccHB85SWKBFpUE@+(?q5P(Hm!=%LQ_^tjS< z+1AU|@|-8-M^s_xf!~d6Rr+$!zRtM`n>qPxSN)==lY`P&FxhmvWEjDgrmUuh!JiyO zGl^P9Mom5wS7xtpKU*9fhC6j%rRXK!rJUpn4p}sqUxR=tUq!_Bh-ZM6)^Q)^%8_Tl zhC4|o+Y7IfX>)PIgC@D5*^YOnqZdI{dpE<)WI5mKejkC&bG~~o-Cj^)=h*I9C&ygQ zv{Y!6Y6Yj(FQ#?y&QBeuEe~@dpnjmY78+cJ4T|Y81=*6|&b9|cEuZ}3qF(zkub!r5 zaH-}G$qu1+mG~B_nsYv$qc1+EA^uR?o67v;@n$}tf?>191pf2OgZKOMI+|$%S_TP5 z-Tr(`SbIRN&KB11sTV}P=GBe`VGEIX^s@^iiwz#(-J$rnuwg-$rt`eu_#V0{4g~Ra zxaP;pS!$FLeE*ZK7by8#9cVje6f9$FLdKgnRw>gX@TZjaLM0*ba-oxQh_H96Gor`3 zyuTeKFL_T!w9_V8OCLv&Sy)q;=mq0TGt}=Dv=YfX@P~p;+3-c}RO`eS*IiG9oT(m2 zDPOAwU{cP=y5R0>QPQaejk<${X1r8P$w*Rm6t6W19BFrNh%fG%xGW;a;wY-|X1)Ka zfyop)QFVA76Vcm#t`0Di3QRzPI0xeOAnW;cEOs?HBG zY=?zmNo*UPuTEi{g<1wrlaOPW@d3**cGHChRTyI-{@dl91v+o7o*B><`WF72yRBip>^ zuto?9aM3a|i>KS<1tXf)FON{tz>ij^UYro`JJFvwmZp`X5}5k7T;vR?kGE(^#Kf}) zFHs2P#WiNfS0t-VwR&;yClTFlkCwj}c_9LMAymhRqA!*iHF8gw9ECN4^<*=f^Vm5= z$6rfiA1fij0*5T}Qs{R)Fy;4UMX>;%hx@eW+o4&L4BnP)_nidPX_nDrb@^aDXY~~u z2=bJ6^5Sfo6+#KC>F4S;@hTpBbkZU9(@MB1irj(BbZMiWmSg*&{+~sHg&NO=(^v0d z44sjdTnU&p1dMHg{Y0@Mz7xdeMGL@p9lcp(wEvZYrD+-9paTz=n#ykWn1pd*NRjj? z;cwW=8b?%8qBYU;rMOt3TO)KT1UhNP@s%UlKfy=tbc@t(BpDpMyre%pWOL2b#XOM5 znhRg+kh}i#$V=3IKb~FoGXYze@Ak=BUslNE-&nxb%I7p0f*eaTT~_WSGryN+34UJl z#o1AjTHZEDMP?5C3?B&*+R=7uhAaHYB#P?At7^92SWl0-Ro1{ajKHEv8wL=jzdffcoN{FMNXedpdjY(wtB)u+{kw-T$GNU zw_0e5JOS_7>t9R?8D_iD>=Vcvgy|nM_;RCLq4?96``rbE@7d;E`gn2aIW;^zy>X2jj{ODebDjHG{#eD71s2GVL8TMGp-Peuw%LvK4Ow@w; z2Ymu;9kpL7PoPpCSn}CDS)(S@OXz8)jsH$#jmmA<3NS4I8psUlN?VMx2t~D-SGbMw z^X;xkJ~}Mn>3jFCHgpD83ud#`=gn-3IiD{$%t2tOoI$qHJ_D*G{;nZs5Fa?(%`N;S zNANim>=I+yvLo9x>A6MDlqEj+)*?B5tk*4CLSPMimFQ=WFffQ-IhNdocKOR57VCWN znpbI&SYp7 z+wuuWMV$1mJNI-d9zy^=4_L4eJA?(R+6BqG8;!6Vb9a3ZpG!^%-1f6NIgRZXCIkVO zrQi#}uOYn^Y}}F{0ge4;(22_cAan}f&S<6cw7%vmUWz%Bq-i=g*Mg9?qzx63>A=9F zx0g|Iy!ZzZ&LRb2Eo4Ql0D0rZ?OxH{5s?%eY!soRaC=7d!atg|zfQShc!^3gSx@h6`#Q8Oe}!Ti7OdpZu+|ir*eawX$799HexqG=LTj%ys+$r= zGNf?5kJb*qvG+GWZcl4=11~<7W|-D0Jmb0p5C-9kEN_yuiYRT`n7lNe zZZs(graxny6;9bzNr}pX#chy?8#9`;%Hflh54~;ou2_NPH3NV`8&>B!%%5z{#cVOT zM(oyM*{^AGLbshR@%U(*WUEh)3)_c?Oa)2R*==a~AzCyl88j;D+JEpt?>`G5TE2h> zl}lIp8U3oVR64Iyml|I9Mm@DXhohscoHEPde$FW8i)5Ok$5jtB8xuk5rfgVux48aR zC;#0?>&Le)s-gYqs;(;IUNdhNluiWRg6r(MDN)S;#FCRK3b&xCWz=55=gy-KXkSAR z#S`tjL9Wo$T*qfez^A$6o7l|C?nX-lAwAN<=4ZeEQBw`bzK+2Pr&E%o-Ph0ntAGzcK)hKYN{(lJrTVip?Zhlv~7I`%RxrmySA5 z8}F=(xs$>Vs-RJ;Rv1T=BKbF_$c$rXFbmyF4H*V(LW+w$X;60{fKL zfzdz0lY}ih00Cb%p{!sw;koMrC{^`0zGL$+^1tqeR22xD7@ zgu|)cF}`b7q|TWw`QcPbzQ%hmGZ>W3G*U~gMEua;5g3f zZ(LUxGe6jO4^77PrwjrW-+d&}yK_NN*aLUsUhEZ6QWvVqN&UjdLxjC*4Z5wfQ~AtK zKHG|yZE#wjF~zc8lXCa-UDbB}e^k9?R9(N*2HKY5Ufc^5cXuyP z+}&LcTHK3MT#I{gcZUMS?cnb2?sj+E-~YY$vi3TQ4@q{ilT0Qv^E`8)U8BkjOuF{@ znp9P&{WWN|EK^aydgwr}HeYYnVvZnboL^m- z1Yzg$4V9(4V;W|T#@h`IRq9JNE+O6K`;Lx^4HJq91YG&~`5?ESy177v>01klWdllw z3-vODO=Vx7x8PzTH~hLLwQj9Etbc&U-afBzx1B4G*jUqtZe*XTRS>a2K4m`^#BJiu z8eNR*v6sHg8h;#20+)*H{WF;V3t&Bxr^)00WB(;z6JcJ0TAz+uo?eT@BQeUsK*Tkj zPGJr4F)%JWIc67Nx%O0en@KcMS+69n2Kqrr4D&>Ot~OnEakmO`vTl3%PPIEWr@31? zQ&**8ZI@?IB5gDL2ky2*BTWbC=m>Eoi+r5LGgk#@z8`;+YTRa>hku=QY3cJ$QA zf$V9-{qyQ%)Kjy9O6=i+YFj=NTws>qNJwGH^(-rhrOYtGBAW*5$DY>6~nMxd{(J2HTXGQVq zQIP>INWQLw98pu&73Nqj_mn{WqPgL!aLq31xWh1kdawJpl1KrO`>{9vo%+eBS8Thx z=R!0dYx3c$r~FFt=XUU~Ef^qX>gWGB#zLe5f6w3yJXh3J7J;dy zjvQq+v!5|!B%|t87FkVZ)&gT=y9LU1maN~uWPc-?C!b#AklG(d^|Zh4?@%dL>gJBB zv0sLAxgMtmk?B0XBmw`Hp%7S9Sqrz6(2z?J!(zd~MLkuIUeAsj(Xi_@+P!58`Cqi_G0LYOc~? znZm(T!}elKTwJYK+2X+`f2&YDCw0GDT)$wr@v+=sx`eFt`UW)Pc91{Q%@X>(Zm(E;nBIwL@v!x$*3+R_5AJr#m_GE|`UYz>02FJXUU^Tl|$5SD*OIYoCAUp=OG9%CD!2T~No-V!Pd`Vz>h@X3% z4v+0GI3Ys;AAu7ux=aKHU8H}qUUYHsq!oa&t?GH+L!MnNR1F>0bl_pB?bq|1zKqot zg+h5$UE{I#b9v*_i&sbCyV@MZ$@5dnD1j+b$bW}-Cz7{5thAi!=TXf!J9QA2b-1r1Ooo>)YnUl zbzXWieX9f-k1hN@&u^CxUdmjw+cft;CXrxxNYTLZnkFrm)1>n}?@(p4vY!vP%Zir^ zpq%uCdFe7N23^`w9-kMmy<@`z&*|Z|aG@y=EOsX^GR{GFp%Uyw7W@vc0Fhs0{om!pc4FA=vo`Qk` zrufvaqp?Ow`xM?FXi=8B#zsmmuE1@*#=0$eqwoKpU}{V2^-zAz>I5@*Zz99d!4+w0=ffR z>&ps_7RAQK!i~q6JM>P4h|9#+eBfNVQCYcvic?Iat#T3*enfDzz|0sDV0@*3f%rax z%Z|rWEvZS+gA*p~m>?-ZkfLI{9FPvf5ml1gU6O05yQ<3a5p$$>Ne)CG-MfHESfctff60ZBFMlNpsT)f$ei9+4741yVfn}vI30z_rZKgv-y z?HDs$Gqx~2R@=k=-ri#JJ#;3HN5dGufMyj` zDr@^g-9W`!5RdbVFM;Zj8&J+#G__b_lKhDD1nv{f`Oj-qw!CJuxwb|vGGxNhhpg)Z z4nYr$>$#GXnKE%{ZH$2*Jl^;%`=M;EYir(st>4wrlyhCpyvVt|oMwu07&B%$=ka>Idr~IquPN@Tr^I~B%omB7$`D+Y0p^eE zvW@T*CW}>GeK*I+5)y3aZ3bnQxCpv_q~gfAD+{=vwR9${kk>}U(}y}bpXtQ`KC+=d=xX!zVyt|rA2$1%L`nGQ>FGg zH0-~xmfA&z$5d_QkugQTkM#B5Y|L)tER6?LI5w$h=T7mS$TRuY6Q6e@w zgSj3vUd6PJyrg)zFmv&8SitJ`bczd#7EdXy(`X)X(_>(e-h_f2Ny}+&6cUA^3IdM- zm!S>V3Vh9aYa%?n+w;<>U&|VL)#k*PZ&hUqBc0r*eiQgEYaFc^_9b$0x4)j?IbNLE z5Y>KKbUNy9?vG$8@6~M?Bc*OfCqu3wV~k=po!-bYpRM9s%T8q6S`~s?OQS ztkteLYBpPr@nmAFr7&7I^+r^n6Nsrp)z4XM-hkgZp2@7mncz=hY0(9@o42_G6dX1?*80OK3mv3&-z-b6|giZwr$PC5w6_K;Lm2xBibG&-`u_o zBld@!(<1ps=8rJ6uev{psNm+S+HopEX$Si}@sAPkHgD%4-;Ec%D86R+Vt|H#T!(xv zu07=2B^b96bsa>sA~${*_9sp-AZL)jPxXtj&5ZVK*sN&;Se&8>`f`-$&Xgm`vtv2+41A>(4j;6)-ibNG@$>Q(iB_1Sc@Syc(nK3a+s3;_@ps9VJpz-Bo!JT|7}emv(!M@@azgmJS|)mvpY#&4*m zg`?5;i=O!=scJXEqg-TDw~@X;nV}`c-_TQ2L&~*qY<;OQ#IiE52nXm zp=4Wv)hjjGg?JOH7?W7~ri z4Xb_q<~tazK-NLH6aZW5ZRe1Aoo_*hd(^-UXvrIrZ>-BwmKSTTZ^2ey4#2H_W+PrU z+Yb(_z2g-Pp7%^WNy_~KUkxui3XGs&;!DI=GMFoAE;n`1dp1G!@6l!(9y?ak7kz36 zNE=kjGs90B0rjK6Tb0_$a<-0(~5-HCFvALvbkMVEowGO@N|%PdGbPtyRKF6!ci@$J(6(@DCv$* zi4oB4dLz{;vL(6FB@P$2Iu|ch!Ik_Di&89F9aoey>jNV^$UYqh{V6ooH&gNe;j!%7 z@;hu{5mp;~pH5wdoA7bOE__aNB5EiDjqKluDJH+#dEO%)E^SunK6Nl%9~9&=zzYX& z`2Nn#viGwQ9)Fp9>oCn1LUI_*Qr$+_nDHl?_~+#{pH=8 z5uI=-ggd#*z877e5ErM;C4n2$c4j=k&HjqRbGZr^T@`_SW@w@ zB)7Pqr6@zd9e}oL-P_(5O;{qN3wp`Lr)#Um|1oCsG`>9W27GiRZ_3SMN|2s8$05=MRBVM=%S0P77&`&=? zxbacwDP(nLOKg@T=<;ZOQ&5Nn;mI_%wmO*ioZkd}h^aGrL@K2}nrGo_cBED*{&^>c zZ4RfqTB9cIcomZy?8Y*D6oQ#&m<79jnZ+&_2W{=2FT<=_rafNo6}-Y{Q@M8qa`r37 zlY!bfeK;+RQqP;-lpGz6*O+yM^F+uVgV-;Dp~K%kJWdZufsLSTE|{H|||E}BdN}WOUvB@nfx!6U)W$2DH z`HORO+P{u=Hq7rCsH7I;4xI=~4BU%wwFo?zt~U6N zv39qdZcH9rJ#RzQq+u8u8CsHU(`q@`tY)i^?Je!iC8f;P^>%bQ+?(AR6KPalR6x?O z#>7!@980%X(bQ0rl8{j6%~)Oi%DOUufR9Qa)M&9DYbEkKpV8eg-++RUCJo<&aspB> z>oOES1*jpV&Q|n{(x)o;%fP!G%_$sZSAQ$n8L2RcvwPE^j&I}Fc2B_bD!+r<1Vntr zM+-pKLW3b3RC38vC>d%<4=%IlI{9-*AzzR1r$#OO7CGH4x=O4Jk!gS35F}sj_|!Wc zo(_)EId@40ntoD^5*P8xKEl8yV*OqtTIF86Ot>qZa&_KXt zO^23m!nc$g+i+P+7q+lTk;_KKWlfy1rNy&T4&kiN%9T7G_1)_s67i*z)=K=MQtFp< z3m&kutd=)V5X(O99g}!++3Urg3D27;BCB*AS&@WYU47&f(*#qS4{~}Z&)3SgRCnud z+qHqf$B*iVe@-hPSwLg>_-~;q1v@LUH<)HUQ5D_%9I5N_u$>#}T$K8mNj)_<<(40V z1BCdz2NBn12*E@#W0!!Y6faUUp5csC%_G{QYZ^?OA zCk5m3PH~;^=5$f3&XVmVBne;xFO3Zg4gK+Q#+UMT_&dk$X0q!bZ3vUY;*b9R{@k5I z=p+@?)SZBI{ua-{Rt8CngmitK_4z8&YBCf*J|#e6z8P43WpkZ77*PNl2`rT!*0-c)lcs%YBp;c6=PQ?FS?9ouQXNr z`hZo`&C-kfv~y^=G1qyP-HM>KKj1E4$6|iysML1L{PBV`H0)xdC#+A+cK+$9wvs+B zs}Wj<=l1mR0Smpn`IemhQ3^1o;bpqlynub3Y?}xpx*vQFy`K8&%1QHT<Dr~Wi33&!d?-5$+iWcbo_1rdY)dapC&jstw5AHj$+UV}Ev_717=*7^;1&{~H zhZLdvohy$Xum${Q(hqrhT^X?YtT3)xtjaTpx@nsD3Z{y^jVujrF_^ z0F)lk`QJr)|7C3umV5SHX3l75m}vX@9N4vSd^)_$XXabuE!o$Q`TbfN)MR$!S7z&G z^kiArkw3kqFrKivC6n(x$dG8}w}n?a`Ksw=IkFK8q4#nJ1pHZxU9r9Hg0He6lG1!Q z%|>$LSZOeEbJ7A8zpy$kc041nz}$}Ngp;e5fwUUj_Z1vRFftkXJ-55PR$mO;#!fP2 zBW<;#2E={lD3>U+v_|wzra8+bw4NdEXU#j9jVlp$X z@-(VNngu=uxH_6D?bK}C?aUp{J)#OruRYbPdKqumJ8`t?3V+@$QPrb-^9cEAmW=2o zhH+XsFo7+o0eCDl1=ACe{g!SK!2yx8j35-M!J)AcR_rz$jUtlQ zDn&^|@t?dz!#!bGl2)ZO9wSO37@*3=EW6uU2A9zn+%D;7Ef29-yB6qMeEmZ*F*22i ztGOySABoXlv6D?$qgcXub0LNOa|>)AKWaZBlYK9nhYL_p*#M)|8C6hkm5%)uAg5pl zDV~<&S-RK`9Z++(1A0I{u0IOFH}fTCQf+1=j|Q2RQ&Y^CJ>7^(Vr`9n8aSwR;&?0W zVEd)4JOnjo1Y!laGZBf-F`+0x1Og8n8DwA#?D@ETwa)BbcE>i+paIM8sgoU@>bs-z zXD+RulwPy#q>$w`p~2w!Cu&ySc;ArovQ)~*(hY~*F_U}7j4+$D|Jee(72WkxJ&n}n zIn)(npRdRA^bxs1WMn!tbaFn~gWe?_B zg-xcjyulAMObi}ry2E-G~miLl_l$nt_?ue@<*#^&R_^IOOsUCXeV zeyn*!Cb-kg7%AT}gweb_S0JYT z`Z(pbJC-K1znncDA~Zg|`A6aXsClHDrEalc#0)e)+twyN{Uaiw3q9SrGeL9?$VZ~2 zq0FlLKgO0pygi~J-O8McZWl_aR|~Cq!>jUEgj9%nNyf@ zQR0&Ggwb8Wd{OPp(}MN9K)I0H>Z`Xo;8eL7E^K^FZQ0Ch$KRF997yrVyZ`W{Web*% zvUs1G(!)X%CXQ(}_+}+p_n)s3CTFSYu_NsD!5ahD`=Np!9rHA`W$SjJIB$I{ldJ81 zpCiilZW9phK|G&9c8dWx{A%G}%qLly!P!Y~H=U3PdB3h5VuY?Zt${6~1Zp&gdPlk0 zK)2>Z`!~9n8FuNK9R%;T`z!E#UT?3Sa`S2EjMy^NJG?I8S-|e`2hK+=6zr$0C0ajT z?}}F&q@#l~PF_x30F^Hv?1VHd1hU(We>Id?8x+Wh!I_KnN|E@f5jKqJv?(~@@0+*evy7x_2 zLv+ z)%!MhRmT8cmXUS_k2M5?HIn#u+h?`nY`}S~l-nr8?{v6nG5;q#{m(FB7F^Va!Ael+s7V_3KK9gJT5kO{@_nx+E3WWD&A z|8wN}oypv52cH4x$Qu9?CPn%#3h)053ast~;3MCfj?Qe`gmUji|1$Y>r95~+*ShZ{ zCpB_Ly!0>B3GnfL7z}yI^ufuT`FMC(;q771TVa+bYB2dz;t`YK+uGjQQ)6u^V8ODP zSqW@F-ieA77Shew5vrRQk3Je(=to4)nysfxx9|C zN|!P8u_5yZc+hZrSspjqi?f&ig;h~X{fW?}^_Ps4H-z+cAoQyf0Dt+z-9(QJhI*_% zth>W%WedSnw(NL2C|*00v>aGu*p!_fenX*|JxH#z;!RO5hFIfuu}ISBv-Ez+*-Bbw zvJ4&kvecmO>z!G*&;b4CJ2%ENrt3`wBc#2ed_v9+aBmZmqkbU%BO_<_bPNzoBhr?t zNa@)y%5pbyHU!K@9-g0F<{O3&0|))XFhAWMc&#sSIm-2XB4eT;^!~gE%V(QP-r=Xq z))T3ira!|Yj*mgJ(t75xBu|ymE7IR`cM(Z&ImCq-7Z2RbcCd{f0ZMM&O`c%G;`o4s zO0h%L!KyPF+VFXP8uCwmeN6q-1)A^{LdIs2mVy10E3gCdvOn%`k?5X<9AMEwC`zSp z&VHda3VKEes>*p2bEC;LibbA1xs;e#D#dYKK0U2jgVz&}7Jn917gp~f+=5i6If1ax zCe#22;MYOrF6OZ4>W$A)P&m!^HD`RYizq^->2H2^ma6YV+1j7@~8w`h{ z0dkoki}K@s>@b=jR;qg1>fLT_)s zAxU42GIfysh_KE}ibuF9Q_N`gB5T2tDs-{U8H${yb67P{`JMNZvRq&XwsgKKPLaBm z+oItGaYSGVuf=mO$C&8cZn$G`*9_}nt{1WNBH_?*$K$WA>XB4RV@_%VKBU+(gdt<) z7lddN^ak*|A(eKfuimvPU@Jie%*jfoX!9Yaf|+(mcvc9i^UbP=R98e?c60Z0V(0K& zkm}~>IWnaDqU@f|@2Lc@GhzFfcI8su(8UPRHw(}aB&^H{QLfysij-My--Ga#G9GF0 zWJn($ji+-wmBZCdDEHIY>6k=utQGRG&9kZ4ED&o>WX(*OQ*k&t5tF}yu+d-ixxJ{{kJbW9HilF;Kb6WE^>cu0e2l~RD5$wM~ z5r6Z+0E44&Hf)Om7%>b=?W$@NLD&x5W9n>?4osWKUarU_$!ovCQjH;q%DmO=Mu=tS z@P$LaDw%FD=je)%m-Xzd(Ou6Z?(sw<6We{|Y*An((-+r-m3Hy{YoztuxBT&YG%kGz z_6sz~B|MujkKX4^1y&P5B}7E_9@WnsAmwSxy&tt`&;3wYno7~BG>99=JhC#tla?9-;Ykdz8PZg>LMNU9cCw3y$0!JOH6t_IFcVir)d6?V;U3`*#nj$JBK(PEq~eDjCWzg z@$6%xy_dz~%@_v>oPwGDT=&==`Q0Zy*7tWJyl{BY8ew5lzni(QHlt`EG{c`@a|=7Rrw#tHm6 zc1oOJj_)D7exv=_;l$9#MC>nUWsRk;qf7{w5DojT=KILfVw;w`1(`X|-5zPOCv%-Z z7%ZBRAK#yI=u(f#jzVk2t?#88EoB6Q1@?NdQPn50dTkTgH&qq-Ff`)V`)g0SAbKUl zlsoAcl*STZ$z&5D4$1m*!JZ4ca`tE^YKO$>RdM2H&}J~3URutS=b2FaIe`V3v;gq> zEWoUn6%&{w$wq9RHVuOLL-{Bt?23B-DtanjQKng>c}yw(ljfE6y^JJA(yOPCCSAhC zl}6)nLQ({DmX({2vBVG*nZIuM06#=_VEVNg4SofKU4W4Y?R{Cglzh@%ll|!8LZURT z>cudv_>4kdYXSU<&d-sVW_s*{1jOAkrzC=A8$*dqSSI<%bGHYBu2Ru^D+~UTbQq|f zsGq~$1DJJ}L!KL6AUmqb*Gq=+U@=uR;FhC6&S_MFnSh?j)AJ5L9)|ZuNZv8)N0<2a z-GTXY8lRV91`KP+l&@(*YuEc4@_DsbWQD8#>Wp-DAgSOG9!pCg%o|qR@n#sMgd8DZ zc8PvBJ6u(&Y0Ko!A7k8E z-~$4`yHYY~)3Q52+edDr3?(EW4>m2nDx81ReVb3)9a{x?SI|#OaRTSkFIZynY^)LW z&U*?U^>&qWzESxh7vx-sk9+&$UbQpL=f@eOd|Hl?4TC}IWx)WJ78T>r*?IzA6I%+1-CAMnfypx;ZH|;kv5S4ElR0b<-)fz?Ca1(aE;$emt7^2e>R?vO&`JDHw zP=hHuV0DZXLU7ga9?jUqi03!1QJ_M603>kWcOlabk1Ti;@jSeP7+Y{B{`^<9xcF~@ zd-X!&9zsrQ=c=JwO>IPJ5lo*%?q7RKNA2id?r(cYuG|flH0)h$kWW*KgasQh0(8?0 z-HLK4$;PR-k{-W0l+4!s6(Cbc`Cr;e%bdR(6kUm%0SL=1MQ&9S`G<4!H`*#K?-TA^ z4)9x9Yd=0BAh4Tayxlbgx%mU zFw_eHKE~lf_73xafl_sn9JsGID?MMTf~uTT$5W?pB~edeP~`$L&0-*g1ykf~b!zrZ z8s7j8B@{drfTE&azm2pFlhLb>oJ?J35)0&I;`#EkxOdvbRp;zfuOU9%Q(Uz=<;rbl zh+Rqz5jo(>3idqVV-KG{Dd9Wh+aY#nUF|#tiEB@cO7?GMVQhr$`nZ;A!BIcB=7OFV ze^BO=LkJl9p3@AU&BKX{@trn|E7-Lc0#19?{y840IThE!Ozm#h6y)36lgeckvN3Pk z<6zHIXZ;d>N(VJ4ee^0f+6rkFfJ+t78bMY7f26`vmJNaMIFO(cYTx99;a&=rHz8SX{DE$50@sO8mU@hOgGgl){_98)UZX)l= zGl(=kXH@X3{&-5ATPEIKq!tI<8A6V>=tgCv^A(bocgCN52Tks61(q&be&2%Xk=9o5 z$k*i@uRy92x7v23^!MF!fLBYy2}c*}Nvd5SD8gQp%*H&JjR$`>Y>Q-ChF0hilP|9{ z+Wd0U`$0Oy0P%am>y^eaA%e9N)WSh&bfbY#wv{EdKBDnS;uunmi9IAetzWW$tK56| zpv29{!&bKNf+nl5&6kz0h(!EU=`eq6Ccq_z4ECX(p_Zc&&a$ zFjYfg&$cEh5l8q}(b#)sLWedhlVn;iO5YZ9CZpz|A`S#K=>+p)BaU&d&6V+QhZAZJ z8O-P3luGr0t&*IkV)V>i(g;sbbfnE;X>faf{o)o<`e_RqFj3x7Ix-h@fGms2W034& zZ}qfbld7yU^T6!v#pQ9D(H9tQ?Sy;pqCy#ziDNo#GENO<_PG=qxDCm2+C@`Urv2am zo1@~XVXZh?6V1xlHlEE3H87kfc*Ktg2;we?rF~-2O>72>we6>|hStXh+A00(a zVpnLd<;8xqu`HvV_++-wMTM3my2qj(cu;t;`gR(L{o|yWcjk0nRvJ2s#&MrqHA$Uh z@MRzp?S#y+l#Mw}9il3)DO?WmU{Lm`hvo|1r9`#=#v#<>HUd;i^!LAKCP^9)B5O_> zgd%MSIkH8A;FxgMjjr^;H<<>vjUef|tNC;}B_Zn&S%-%9OSpJ02WvM%RQWtgx>41* zK3do$An91u9cL8%^=qR2>$NYQnP>|q7+9cK8eBPd&Lk`vNs*f+&U@v9K5xKoSm64p zV(QL&xDP-umob&li}2z3;t1jsusl7~`KAZ|BuQtW-k(9Z2>T>Z#{9j+JD%2m`je@= zA?dNdnXjxcxz-dm1mDD7B7I=ue|d=2m;pQeLJ0BuICUYGdpM&9!(e7NDCbh51GS4y z)gtlHD_SJ^iLwf6^jALbL=H=&Y;nRN{G%^vF240rf+fOD}Z>am9!IyDdCdd&OC^-_q- z(egRd3WvjD28YZKzN|f9@M4(hGLykz-H$dr`g&aaCHPolB9otn;7eH|)cf+sNreLU z@9oM#;zU=5;jH6@9>M&5aMc!?cF5-J`m*)iN+;h~*?(X_*0RQHC}yP6CBT(^ph2xSQZEBS3W`A90VWC;TRF6>+(f~Ad890-zSVTGIo zCCuS46i*50=~(UHJv-SWWBjP#x2%M%a{KN{GM1|(LH{8`c?|O_@2AuOF{)pSt6UFt zG4#-?FcoU$xqA8pIdTbskQ;=|w>(H&>f3$(ITqZj@EFdrmL{!P7~aP2Yj`?xQ{^CJCg zUS5Q&0DH2z3DAwMwAc*?px8%&|JaV+ea!~!Og+H7nxaiVLJf@l5Y^pM5Bxh_Z3o8`4>7X{x@?!>H3yP~gC zaFb&y)pi{9BBm4|jeAgEgkERZ=jCWJFqqiVCgQ|9ms_ zLimw;eyt9EE-&#HjCRV^U2}tIIcCl{J^2nG$D8yR{w``8`8*dnc1vs#b@$6bn5Wlw z*xJZKl+^T8f&TXi z$r9SkDg1^Lfa{|_Z{*V^q(gmC6F$gu*|xHlSBYeB&ZTCI;P!t>ykXv&Yp3z;`hESL z4upm0stutoGzuO5A@k~F4k51nr4`hbbLrMpkX|+Y|8n`jq^T6|rt{FDpC3}i<0U4w zT|<>^!|)s;;`ZmL1F%uk%fUjihzy=MG#sUDLuG{j^qBWT@89F1$H=cQ72#J%n)t-8 zhcjQiwf>EGVB(uddKKf#@98g3Zv^9nKkxIApC9$#fPmk3B>e5Y;~hw@{0ZVMea!q| zY0NSsm_Wg;ufD~fP*HoDC?a!$vHq|4({Bwjs@vZN#5w9^^m?Y*<{yYCfplM*K^ln7kW(F`sP#}j-l?&{SPFPbuaCeKC z`NkW(A)X7vdk;|0jmlAS4sSqN_n`goWix-Hxl0l<2)!ox38qV9_Ipi}ndM9go(jtD zpaASYWeE5c<1A5*3V@r};CUPRenhbUVu#StsCp$U>The@OF=omN_nmxAt@6vEHC9$ z2X?Zb(m&pFg+&t1=`^`33fHCdKn9AEiOM^!^P>MBZsPfw;3z7%H6sHBO*m9-HqmO0qdhaalQzv}L zF{Bn#4UKg9{39M669XMW8^HYhn}u>pd{l+VFTteEjR4cxmZyTy`uE(v0AY(Zp)$6@ z4+zWtCdRnMn^0au`X70g6j9ncCv=15gMH(o)h@h+QQ*SHFbU6%KNxLLi*p-xqW<6K z&{jZ4-%Z%U+DeD?wv?RaR0wO58VvRTZyq|Nnz+xa9 zWhef|D-&te2?y!63%8bL7FUfN^w)p`be81lNx;MG9g&LD%`3}*akXuLRRBsCd4Icq zRt}{h2FFzWL5Vp?r=-53&Z$f@@rUMN`;=;tPn|6twI94@9XghAf(|;9m2dPLi7&#j z5?xQ3$!0rS!^=CPpNK^+9=-DuSXaD&YS}5!zTd$ui_h$ZiD!B@V00k?$w80Z+{&}B4Gh%)@<{H zK;c8w&@9?UpMM1%`S6BAeY8Kg=Jj zdir7xihIoI;+&6&P=j-TuwAePqgn%fQ*h41T4vD1Sd*pJIyrh?sIBvRBq`*&(#4VqAMa?nl8nZwXeLjOhd zUpL=0e>yPoaZpln@Y-A_UpJ2>x-^9>Lk-mQXIx-402+hZ3Mixb4psC!ekx-CCs_v3u?BDH7N0{*s(@(YCClzO=A^b>h(7CILB6G^{%Y%-y!6{X{Yw1nmm>fd(caA;DFGc*0g8$Y2X8q;!9jih9Fw=NIdRX6!x4-E=wk=;7VHV7S zL=GF>vmh!fNZGMmWN-W#51k_^CINyC=3m{AH?bdZG~7PX7)SOA!aJ99Pu=+vcGrS; z!)BhaH@zUQ3A2DGnpmJ_8}foaNkyTYiqn6a>dm*1k3unOVDSV(!eyx4^kUeE8La7J z4oYcWktOobrIL#rZgQ??Kn04%{m;v}yWKb2b9I%Cl z{vyW5=a~Y6NKYkXBy26s|812wZ@{Ksv>O$x5o*PEQv>qt{Rx4xYy?IqG}zoWjJSp{ zTIcU=`PU`CIC8Z7Z(?h4K46sx-06>?VxWluSy>2v*!u&0q65}RzrX`i0Onzvd(B4L zc^6{vf3pWBY}9J~&>a>iF-P@*sjE>a47*Dn*hGCOP$O)|pIC1`?ssyUX}6hU{x=S= z>4B)f9Ey9+*r#yLAg}?Zh&eWmIibkj{tI;es}&s!*9pkz$I?Qw)d9X(4N3bd2`z>46BXrG3}CbmqAY8dI0*A z!F^LNPAqB`-Suo`bwb>+R!=}hSY=?LD^RQT<)Eae3gY@luY4^|JL-WHOE_=+LE9!i zy_IunA!B-%$uQK+C|T|KC?KrN<-Qn3gHgKlXUxrlP{pu03cnL0)b(X)Ea^J}{DPbd zxjq|H-#=klWAa;E1UO~BdMpf3z`S`EP3v}11g|F|D}wtDKq*=;S01mdi*f=Fp5_rb4u+xwovx?VV$J6p zZ1pVmb-Sak3gU>xK7@R*tZ2-<-0ip@hG(#wtaEa@T{>SxH4;obuv`7Pokg0vhvMxm`>yhwc^x~Vm9|QP|-hrH~-gcGCaqgVt4ry?aVz>hv_;`_Q zt-6^a$+PptSGnx7RAvMKg5ZvqJ`e7uL!=by#;XA3gv3Oo~OY@X&6 zs*}>9#Tcr|`?J3 zq@9(ozb>gR1F>EA>+bh`CZPbQjIeCITuKo*pz`u4(Df$BkNBi`Fi>$w5^)p?Y)dt0 zwAs~2v6RMDgjnXXPD`)k=1YY?1wHNLADW1`S1cZZaw8X8Dqfe59KFbt#a3*ZDZ9_r z;IWaa+lfbh+PFm_yvmtznkZjBPq7jQA3o49B=#UcvwwQLQHfS1Zeyx+8Bby&m3Z>J z7>I3NSnz%hr3!`=5fu%jl|w$E6)oHf#L5si2^dw)VSeBW#)S`~9+v|t)0HkQEioBs zzD5=;gv-754P7=msmRK|r6xC1&=kC`Ny}9#RM6m>9&S(07me5@m!s&7B*?X8;-J{w z(Oddhk*M`u-;WH`At&&hcBGAp9qKU3<*_@O{xjKxsa@&Q>3*Z>v}Uuvr`&Y$7wk;; z-eg6aaWB0ZQ=R^qvQsM|1BP}Jc&zqZ1%F|eM5;_6o~}1J^5O$UeT}j6Uzroe;0h5W}>v%AsqQ~_h+DdRj#A}0{LcgxUeK298zX`05 z`?X4G3Qv6Pi*I^{~&;XqJ6+Ed^~Aa!OU%FczqzRSw$VDTvl1waxVBpfrWe|M-u(H>twlQ zKq5D-^eFA<$ST6>BkI=?x$?G6j@#(1HRhk(vb^?iUY~XGfy_yTa+$&rVul`}wB*zx zZ1Q}hLCBLZpO}e@5I8zbw#3cS>~V{bt{r2I3o^O zUFC|lzmWMJFZ}mGuby#F-Sderj$^v+&fj?shbJi=4u&u16+R)}?`@7@ArO{~!so>* zXN=|;rl^*d=+s-WX(Sd)ak*WnyDR6ZeyIrJ)p?(fHTZ7JZz0XH-)jdh@bupG)z|+@ zb>`Q^5a>$Bldz7mA_n(^Z&5v}a-r@N$EuA{!;cSF&Km(tDcpG#JjPG8BdHx2og2xg zS@<-F$`~q?S~1JmY?jzkkQtF*V4G{cTJ0Z~){KJ9VcYj{)soxaym~CQX;W|rx#-D~ zBqa70^ox}pe$wFiI=Ih^>v{YvCcU!?No$jXFW8(mzxyOOcen86Zec$!GnlGEbOo{< z;Nsf#yy&^m$vW-r!O9?QJsCm1!?Y9F4m`8dc+HHAS(TfAPe3Ij1Ab)-7`Ge1EAvjY z68>OfJJ0VPlF4YmD-kj{I5_tDIDfmEC_ie!B0DlR^#4%ymSJ@)!P+QM+%>p+aDwZ? z-CaU(cUxG3yGzi;!X>zSkl?Ptg9Vr1&NpQ5eZG62=iDE+|IT#Jv{hBVRrU7FYqUv8 z6ZJSX(usZ^ir&c4;o-!bAbPzHqufZ@#FHr@Pmw&otfxh1%55nHEG(QNQ>~dw0tsfT zh%=tXxat0!hE>e=aY_1a*HaG7y~|rpLuC|8`1Ejp#WlpZ9L)>SCicx3M7O zPX>Muz7)~5r0fAKa;c6f9M!C)6r?efqtDiCo=9d!{q6wT6BM27HFLc6$h0k52vCzqdIR( z`;Q9=6?s*3c6@7MyQw4t+KD|q=gH-?-b4`##1kKBAOAUf=z-tZvCP`cS(#HYict=X zG2lpp?v3>;byHACRD3Kmavik8lg_1q_=pPCoSSnkNtymMm|_PANij z>%>!LnTBd#!U%Iw%U~%12h{pr3W$Bhr@EokVvk9?d3&(85c=;BQjUI_xhr_h{aP-joli4L~EB| z{fM)9nTm>!XWM^B*H4}+!%l{(m|wp_B0Y84P$1~d3eCqXY8mDSN%U#UV6df=g9VKJ z^}yDwApyRv53<=@4tkWgbCAFev7;h)ugXKHA5rY8y7p(2Ln3zp6IEmc%#^Qv8o5{B zm}dn|qN9lTf?G+^E5ZG>JkGz7KKPx>fL@hyW_@p(Y4AoITT5gMUP~L9O*bkkd-3Wv zp_x=RypOI>JxKEagja2uMgAEJ2$E&TI=#fJ1V|H81%&?a?{lQ*!X=rFfNc? z401sJ9;>98Uz?yb=5<{gPL{@8V}vXTn_O`2C%hMP3wp(O1E|IV$SSxnHEiL#;D1=a zJ~2iyJ12Ro{zrLnu=ME8hG*WZx35Ruas<#g#3OCsn#WUaY|R z=_n?H^UDwtZshk)7F@$$mRFJZn{DO$^At9@Q8Fc#ASaJ(Eh z6443A_Oi%;bu@}ghx4J3{%ppJnM>27_a*A)Q3|P>K6c|{Uk75vOO^h=kT@3qFSBC#_yO7f= zaB%qUu9V+37QtqrQQKFHJn%e>k0l_EqZ<&@-GvG7#NQ9bw=PjpJs%YGl7mweu-CFJ z<4SHfy8UVegRtUk9Q#J~_by6^YNYM#>U}g-*;}2GaQE534H|8)jgChr#mfxZf}_Ov z+_eLKU(UZX2P{Tvv7~o6MoZagy@G*8-(#R$2JYAbYzBbU#fC}SHw?9+_)u!PAzSW8 zOT!w>zw8j6>y2-RyRd8%mq1{Ol|N3$%FaqUMg*wiv81}tmCb>uy-35!CzrnYchv80 zawEoaS-0Vf^x%`G6+4j;y9dIF0)fp;&V>AH%FpYj4>xo5lDXzl$3!k$o+G+6sJDP` zXf<%rzWvKnhvnIw#N$a1yfFuQnNzhjpUw{bZJ~FYnv%1J5ypk83Q9177_ZK4L-5IT zr-Kk%MsUe--mvDr@{q+ItBrDkr2r#Y#oWtovO0?)2M^9RWKTr$mYO|MybsWU>FF?2 z@fR@J44>NjvJZ{r0CBj?794y2{l1}95pqr_UGkX*_O$xW$x*baCRMLPu-g0~b|(Bg z+xv{!;V-p<`ppq}-aij*uF58*x#JLN5~+l@Bpi$mk+XA}XwkJ8)b%5%Hk({1`c=U` zkD@j4t!1IDKhD$KCb7V>-~gt;9{4cnHTGP)rcnZ2+PTu&a*d!jF-m4*)gg3=`7&EL z-eA53q~u((0L>Zu3O$?TzP`~0CdymuxczE2rx#>RdWCw+YB=La)l1Mg_x^Fz=-ws7 z8$aHME7fu)2F>cfC~2sjKlaCKE2SflMO(DR{seUO%lO3MC0XJ=)u5z$YWKcw>z_Tt zoB0&YO!OBOa@Wb469+A}g=95WL8nWMF3zN&ET)u{JOkwyuCT3cBIRuZ2{y&>(bw@2 z&Jv%0=j{BT7iGe-{Gvuj?xBq@;8Z7Vpev4&ISoJUH@ilokZIv&{Vgs$H2vDd*~W;2GAFLeQGA{@VFF`^ffUI7l5y0bFGu=%>8%F}6YE;WvT;Z?<^UxoLH9c_CJ z5zLgEPrK)bD0mJz#2RlSV-isiWW4kq>7m;$I8o)iXz*>&(pBV| z6w3`E^P6C}DVo~yWFtOVyb)l&GP4$r8~33aQMK-?h|KL>>UFq#!CpvVQ6Ju-O^Q3R z&~$7?sA#_61f}J4nJ~LzmnhkaU)L`uRC%}VLYf{I@=Fs=Q74wqv;+#e83Op_)61VA% zHtuyNy@Vk$>52P;ef0QRKTLt}3jjQQ@fEJ>kYWZlF^uqeY*yl~on47Qf2lv8mNfiU zl*L7Vbg*u6TAcV^VZmN@vq6zthlm%ulrcGQMJI7crI)<+8+0cCwZgi(;5C~)1Gd9+ zffK2Piv^(FX`-M`Kq3$kwfi8p%+Tll!rS^2a-2kF<(3Tj=gnVQq>&GAM`kIasv-%H z4p@tLzbtrk9pQoCqTg@clK0#<;25=&|7~;!!{gu>fHx=g$%Du3mC1wu!~Y&FjN!yf z8D^V+{F$8BWig}u8*g)I{(B75OteNX3{~t4tXa)w8G`-W77UDoi}I(JphK=5%S;VA zD!o#Wg>#1pG>QOe6L9-ff*h5f{QbLzvv|S=1^|WH%y8lAnshfLE9;(g@RJ$_CT;`X zxI-kt+ngX5wrY?TfWFC=llV^q={#@VJijk+o~!lA$+045y=(n(zx}#(L7xVwg$Af) zw@b1}4lo)kU=E{&SJ5a0-~(tr@_9(yBR>L+aNy5XdnJHXalrvD>ESI;Hz_g<%y<7U zKVEtL-h4(Rd3VMr9^#gCs@26{Z!jgJQoWqLt#-m5-bcx&Lp*Hvg;qH4T@Li;u(JHD zBD;y=!-=3EIz+F?DlwOuue4T&d`v1u$O!Q;g1NGzEH!>X!JTM{ptUyAGpNhC*GkcfW46aBk5#>%cKn>ZN#*ZY6ba&)#}r6^R6AxR`MVCm#n z?|n32(?|rmX1o)V7m9z$WO#Qppo#CR#%Q!#EU*UGuUO{{<`v8@Bq@74oav2zI z#~qXEAFf$udZC$_z~%GFTSc_L3w~Z8L-6TD%2~F%onEG~)LQ%uT_l`^hn0>& z6``vgHzWCLszlhH>uMMAfhgWF*G^^I5p5EO3!MBF!2uAiHE)?Zx8!gZj&10B{pXXT z3*9ht^U*Cq3ggZ74wo(D-ITe)SC-wILXrx&dpeWH?MWVO0kGiZCIz|NFg;S(qrx8; z>Ozn1PTBS+LI2U(H+4dpP7F=2<~wD-swJjKvee@&ou29LN*T+#w-zZH%5Np|*e$)j zsV}cTnm5l{sB;g|rnz{-K{fISDVoh)*>^bOON%dC-NY6~dkOQI^;}X#OaNHa4;8$S znUAU<9nZ$7p0D!RPQb2w_e)68M_xXKJt5&6Td2mYZL?f+#O0^vOWOCgUu$Z%R#7v#rTwaTPaiw}jcy`?5AC!i@52 zBt}+Y)3WM4@=@LopD$S-QOBocv6hiR316}T01$7??RbU9=2{B_f}B#%vB@Ox-#w`b1K%XObOd%9JEx6!H961Kj%C|+ zOBN*phI0qqTcJm2xVb}65rfkKKMw3ui~fp`A9KA9JLCb)GOyTd7hJ4Ho1I3sl#HS% zH||VlV^b+)3T@^a!`|v4R1RlpPuJGrbF_BQyI?vypY0$rSH#Jg?XeV(RGuzQaMyiY zE=ii_@vL&J0`!9L=idbd$n8%ik~}x6eZL`sVVTXh0W-RWo^wjRu?W1iwpYQc0^4#j z)FQMC!m_GoSx?`VJjQA^1$3~ii@1L-EfErs;BG|9_m5-~YJ$TZZqL>AAJ$&2JbgEf zA)0kwXQ^f&utq)hIK!NHVS-A+eSc&1ynFvIXw2}#D*=DipwpXl1?ZGv>J^4SwQ3r1FK{~c z?H_`#8rpn?Ia`^R7)G{Qd5`mDxAg{A-2@$bLY2?ou&5SJ-&8c%tjC$ZlP-xlx=5s> zX+OJsiSN)%i<6(1%+AhE@^r@D<=tMi_MlFtF6|ez$pvYz8W^CC*e0;dE{CP%?Dofc0o&z3#ZXhTsiU>lMROq9b{+5g{8KzT4@?ZD;Z3|c zcBw0?hh+5h5hH`=O=g+FkC_Z1$HdUY-@(17*y-(_w@>sR0<)xB{C-eZ_pifZ|Df*K zR!nzr7)f4A=&f`pdrxNyDLZ~MwZQ{+=$_RlVa7a^zs+8sKwU|ks*_REHD)iI87Qt(#k`V7f3Y$>%lHZN_vz{N$m`C*FBStPpdwiYk&9~My4 zck+VbxP5QP@Il&zkKFOi!`-lRGzQ25pTvS@xeQOhm;9ZQALJ_jBo&FI^@_=w-gl7l z-FI+s&np4vDdRuCj6kyP$7Y>pGlN@sp69OBc2F8iUus|D$Bt|GucyWQ0upCuT35R+qY-K=Cg4lqGhW7k!c$tNO#`5esuB|(=#)Zs%%_hy(pSeBgzfM zWOkZacNf1aq&ZYPjb4F|NXGq02VjWNj_zw!70IULk}WqP2OCzkzatl?P7@a6PTDYj zm`+WIC+kCnQd|X=$CW1r#)^Ynrgj@WCKm6L?a=1IE>kmXlU%u-({sX^lXgTluDCv3KPIOf8!Jv8v^${k7#g6+iUfD?o0Tbza71!&@5NAmyV+GeeiHeB zz?<2gKaG4llU-aa9j=(%hc9p8;l~+!T?m2U*8lDLi-2NC$Z9-yjP>*!Fk!zdu0=}k zcEdU~Lvx(A7iG^)XNCSCw266Do|m*7;+6}!Sj_RsCRB8A17?{00yp^P3{}ncF63&B z%QPGxtl}ZC%mJOk>o;+DU zD@bCzre&p}iJ>gDC(FQbKRdb-T)tl-xY*hPRQ0Rv4E6I|c8@O_@v9Gh{0VQ2j@cEY z4w6PL=8k^eUDP}+T#z*lj?8a_AU|zwz3aQc7L@FBX`K0pNZ$R*&b@_*|XP{xzY z8fdljQE7pMYX@#+FlSMCR6=Vk@%)z;!1bswRl_VmwLf&i*ym$vdY>%7&2F_8>hlkTTMA%I26qocA~d5|Y-o8yYPk<}Z$a9XZ02 z@J+Y~z9cmX9-dg9AuYYp^GpH+El;MY*)P8%PUJE1hKJ5a#%ktHRiuh&y%*N2k3LY+p2#SibtZITq6xV7Eldw4r8 zKcP@y*#`S4tlede(`E`97x+?^NlHY$Bx3!9<<%9r<}-nph4Gj(xs{MU*WdwzTmbjx z!AwL0KuHjR*NRlPX}y?w|a^R`ufVAAw9xp^K^GD;5>SX}4ks!NA?$szIc zs;io$^U3W(RQk~@wn1xDVmn&>)^8Na`UCIyrjvf7`WG?tRXz;?d~jaL-v-lJc?7A# zCZ*e)YeFvFHD_z5xk6ozhrjh?y#r1zZB8=<@mxY{`F0vYC#~6!}tP? z=iSWhep|05V<|^*$C{O0+zD;@$%9#J`cnwlJc=I7WiHRTLG!reez$$ zK45j2b|}35CYs9Z9kUR8W1F|kfYrY3dmF4Z%)FHvOE_l6JyN|fzSI+oTTWN;)P9KgG#QCHW8fU44vDk3lsQwlqZ5g-QySZq1SPsP~zrn|rqp*pi z{L9u(VuC_BfHzu}?k%u;Biz)I%k_^@Y9?%FBN$2<>FXa}#vcdTcWzalJ|EOU2ny+h zBo4J!?TdB$8@cFiD+X9&g73)+VX3Uz=MAdI?^f5(Ux;_xXD0A`g3)$+KQeNWkF9G6 zZZR?1WEd&B)R%Z#F=x6d)gJhn7Z`Y-5gwB~lblGsbpwgoNWeH%z?WslSmbE+TD@_( z;*(9%O2JMfL(_|qqq+fAaYDa5zKJcW*{o#9&q?T9N+xw;q!*YD(h1NQ?X zCH|o{Mg!q7oi{2jSY8I&;L=2CwMh<5{HoPbYR;EA8fa6&yL@tO zUB_4FsF-&Jj^?$y))x}ENa)Bo*|DY6+mdV%G|*_?>3Ao+v zot@$q|M(?!@#wzH?3C=7NmyqcI8&a2RfRg#4=D{%+~Z-B-^LQKm9pqb*(gn!2>(IO zas2i11NI~gU~^!k{IT;@G8mN!F8r$UL}zFx38iCBRA?vZD( z>inEgNR7#SQcYFTH<8;d_VVLJ@*x#sveKvVr0vr^W_4W|jn&KT^`S93-X|=KkRP}s zv`-$M7b{MVYNR0h8&_1M##{eZRqCEXYt4%@aPU;GsRCZX5r5TX470kQzKZt%stWA+ z?>Cl|2k%fGewZ%1ZiiJ;yuC2Up&;WF+M(!WEX&y}yy|!C;k7P7361`d`?zoEvme() zCjf5BaGVLry($$(?WBbJgNLtPbcc*E{?_9Rqb8HmGX!}aHw)koHN>Nkyns{0IL1bTy>;IGpf9v=_IAJvej_GS~! z{+h`ML>i%+^gM(4>WlLn|1ibJ;5TbmPaY6TjmPOKW8zyLZD;ulWP+!YPXk?4v#wdU z3rmrmK0NyMCNsDl8M5$BXPc7+>bmuQP6M{&gw=hh`_8?I=W%`cIGZPKXYt*4D2y$h zJ&-dn*oS+j#YO)P{Mq7i|>Dg`Y~#h1T`SNR|a2sX_- zCml(qF}?Q#(~*oSLY(Tb;^`ttMj^T3$Sab%`YW$Kmj`l`UySlRV5y9^xDy;20;BQE zBK|{V%#vlBTOV<{6$?IX`$_G!9z@`JIePinR|Z~F!Aws$d-m|sK+4%vUDhX8N;=%} z2i3)3)HmqfVLne*6~9b*tqDes+j&VIfMJ0hdA+V<+fzmlT=zUKVK&$&oqCBY&;w0i z;u}p}53xhod#^h7_@kxH4<)#jTqOD3E(z2oUl8F+8IyFOND7srq4s1WcFXn;`jAoq zH|N4N{dh(i(F9`ilc!r;cS9Bqy?(HYf_)W6)s8RE-yi+1_G7LP+SGqqdbdG2l856= z;)ZDWkvJ(*KGb3U5R~3-UsAe_ZMg2t7QxKxbGU^2evqaa1FUdXP7bICQt8GScYeBt zKSe)J0ObBUV}Rn5Y5;XmeE)$@FT6HpaQ-C&?VZKV-gmY<14r(s?gLDT0V=CzDu7Mg zPX}PM6zFseNW<%r+IZU{iDa}GcL)2q=ncEaB9Vm<@Y{X7lPZ{knq|I*UcC}^8yPAB zZRU{VpF^c_R`n@IS|=oXKh5=vm>yz+^|nDy#j9yppVo<1SuSr;dIjC4!wHn0nYL zaO~52NxH^VVN+5Zp{N)Z6(f7e0~sBT{3%w!>d~|8;xQ(OPByY=;3eex5z_Mw2@FcY z)n~~xunN0Y?z_O_q4iOk!0qrpze`yi%VKHmt9-my)>-xc)6o%TkS5dSHNw1FxxZnW z$aFIo5>V0cvxAL(#&4zgeDW%{{dBzE&t*&;0WfBIuaN~IbGQaNuW>xT&;lSfQ1m0Y z3-vgA?qHUt$)n%s9Cl`Uxif0fpOv~NYS=CG?h@z17G90+bNYPJb0TlET{84>*fK+> z^Agf+yKLV^O-Vf}_ulM}dtl)5b3I1PBi=_<_jSEuzw1~KO~u(75;AN#a(^r?)HT$u zy~uAMD76ma$$Q(t|A=rQ1}yBo321ojY^}rB!bLm~?E^@T;GeK!{g9p|#?xHxWfkXZ z2Tw`n!c`QH!%kJ2>%&ge_VI(xlS5g1bCg5KBp;Wt!=LjYMF%rg5QVmb?UJ*9qSlOO z`db4pqm}cpu=&(h0}EMaXJ=c`MRL6DQ-jCxy4_8)oksBxY&3S zz=ayGFxFKMgwj737iv(&-Na{xF)|Q4(6X84kpzNi!07n^fQFq{6q1nmt9dW z_NEIVHQK(@W91#!5!i>W*!*JWIe`|MjS&9dX{EVYs!zxSTN9Oyyb;dttQa;w)*s^m zAKR%6H1hcm3rPOCY(LIOlzRa~q41n-qx_bxT*UczPt*O7=%!+Zl#HUU%X)$$)%Neb zG4d!)hg+n5tC3MtDFhYW=l|Yu;IEJAR4^bt#4@`>2u^=?5lDmdm(y0C+BYBEIc_#l z=Q5RMD<6c`Qm^daXukAo6C!9wWYukBF-& zy*-o5{?ITBT`-8^thCS^_3w}V6)F%@~ZRL$_zuG063CRq|8CFQB%8Ha_~z&Sq{q1 z7_aYWl6O_G7K8zdQ%ch5sj=I8jr_WOr!?tRj*K=>WyWqf|Bj_o;W?9Uhd*``@9JNZbNZg0`5cs{LqIMSsT(JksWu$;3M2ltJv&XmxkdIe9w(2 zm4Vpg9lu?wye%~z$ymm<;z%n`UYrc?c%!=8De1+2#o}#o^WjaGu?geGZL$Gk&hUH` zb=f`H2ii7wGS_s$<(n10ytJY&K_PBkTf1S~4xD=FgH-vK2fvyx5(Qi5S}=qk9uXcx z6Auf8I;!$DTB@*-QDilEC%);_IFH0yDP128jYIUynv&WS1XGz3be1mntnoQ%{iEd9 z2wrOhh`w{i$C;_hTd-MqPG#!jcDo{|eFvhI1F{Q0*o{MQfQ)$<7~R-wo;CN51lGX& zP(zpBa^Ps1jr|1ca!=PK3pQ`5w^(uz1*`Y=r|@0o7fOOebR$Q}oF=S3j#tYr2yH9e zp7g~LOI5~2mL;i9Mc7sh&Oce=J(p@370LT5yVh&Q3Z`~d=|NP*-l7KONEsB!HM`8r zC%e;Uff-p{Z}kWa)%0YlBeNr-oG&^KRF2B592`A;E$^k#;kH|V^$&&@3o;ZkdI>K} ztVoAa?BpZRW!@RrlkwFVN^+C~7m-*^@ZfmonpN<1TK~5PrCB^JznwjyF zPhAmtZ*g82C)f+bH0fmZW!UHQ{ysGrkEqajp7Pu0eL^3s^fL@wEe3^R4DfskUsv`r z=w7~23}E!!CIa8mL?!ZBV(h+_Io55HxE2eA;;2CJQEXS4Obhi&DCs&rBS9)ok{h8Vlicy+-&N7am(qi_L*157%!_DV| z1Q6^2yR3>~dMp0}&Te%h8**E%;>O|d3xTVQWa_Kmp3GsF0W+C|+eF9A)MS!eTx2vM zh~reMFOCVPPaiV6jTN$3^x2l>>9do!S+^J8>q5y)kK+_}L+d<&?ujvU`pa8Hi}+@b z%AWu3scrVo8n5yvHd=oUWr7RZTb_s@s;qQLB*uWJ#NO0BEy$abyxs1hfv{z8S*#9P z^Q9372TFwH#c}jVUB(XdGNr)!jxW-2Z}7%maEl6A6^Ym23+ zvZOPvr2b>HQv1d12@dCp;@bncQz|V*7C?lItFvI(m-UefDQ#1Moj)<&e-~arXN!7v z4u&FWAgVl_+z%HlH2WC(&a3FkS`MO1++kLR^-PIyy2i)RnnU6Re#oCBDyv632`Z8# zv8!EFnrsp4$c;`LPk`7xq?4NUTUw!E=A(%>z&9zSHO*p{sy1viEDVv|2siKIdbS*K zUd&5#H9%W45XZ&KZl)kRU-h*5Ukw?Ls!DXHy&UX-`w967#NTEkqKN=8H*RSMtQM`S z+4x*QG7gZl!N<2^D5n#F^^$p-&O7d7K8c@Px#m1zb^roU@nSQ^?ba;0T4h~3(MmmS z#;~y@V1HKgctINwu64u)rK%s~?c&8zWmh~ydLkD zG#YqWQ`z-cd#=<#j(V3la5OQ+oz1c>R5vY@HT~6dZz9k|mOiFmk)02Sga|+TMQgED z-ca&LZJy{>_iH>J`Cj@4~lkr@in~8daKDKH||m?_mta2Awe$gzW(O+od9t^9r>KqlS1P@V51-l+y;o>aB>|ih=-T!sP8GcIJyd|G|d5 zt#Q0P8c~Gg!`#$uz3ZNpOpF1Ox!%Q^%s)0949ua(zb6LLkf74=!R=Uh&cGv! z*HigsCULjL#k{l&a&kS60i7#pUGLq4L6JYKdaoMqW_$dEp#=v~el@|jN z`L_1}sXyZzu+Z2!%Rvat`QO4lhE*LbeJ(%@i9e8+br{KFhj#bh>%!)k&x

p23cV`|$64{C(L4W#QrN zE9qPyXk&7;a{X<<6!HJVh{)!3mUwmtt@WTG1bByxzt{RVi5BKp(eq+GCQ;zaFzP`D z9>)A{54|!7xpw|oiW)A6G-Vhkeh}<>{z*Q{-;lMz^u0memDHb8cUezvz1J8hhN9O~ zBcj|y(ZBI-*$*w;JX$S7ghm(N?OWiKQ9UrDyMTARC9OYyK6Qc%xnGN!>XbYl#*j?c ztr~T|-dG^&%5xoMEiQBFxJ#EmGKI`CYd@z#elCv!!IPKQFP^r7JfwEQsrFT(6m;VOt|M-*_g5< zE}q@Yi2YtY$=dm}eDeD7j?^_p(C}fJ)bRCV?k|fn?jqOVA=oRK`g}|Mkras4-Ef(Q zSWH$qrh=P1&%Em%(v_<7{?O3#JdLZf{&@&I#1mEA!4pMid+(P7n6@8f26tK#oO)qb z;=&Q{tEgT3cm#t$ma`sR8?v(UJ8*8Wk$uX_;4tVE-$nQzE@?3Cb+DDm|~Ct=Y~>8 zoT(Btn~T{=oOvV!n>PF4b3!``HQHBsx2KCMQ;|3uGzqR0+U50Ze*S7REy}VV>R}#H z=M5|QWTVLQ;{PnKXZf%@X6tPImVs+x53RlgxQJvALQw(^VEc3ux(*9|39g=@!W`8o z!#)_T13QwR6rUQxZ&h??Aj<72&{Hy+Xl6MM=w5N zUiSfB=o=KDcF+jd|9nbuf2;v`8tF)~K>yM@+)1G{xdt25Pn>OvM7C|MU;SN~B7$EO z7ewmJ94#i zCScXBjRbAWU8OnyMWgjRg>BYxLcu4YPh*bzHj2QV#Av~+f#2}>c!QNLcEr2@(c-gD zJT=Stm}j}4rJ+t2IDubSR@SoWr3*9+qn{Z2=S%Vp3K>yXKOmk2x-A^w$N+h)EaP)C z`TK#P4lo}jWh;(`0o(GKXa6#qOpTux>fu5L3 z;IPV8Mbi^=?e7q_80NINbM?qkc#dIBAHVh($>*)iBy)Q$mJ+0UwI;s}HXm^1)^y`T`7P;@PmbAeWm z1^(aKhhG?G8CY|$(}BGE{JJ|duuTtgIBg`EOYP%^U6DJF{>$gT1IhwY7^3?tMA0Y` zJZyk9W84S>pfm%T26u>1txlye=KvIL7A0lTvY(&#(sQwZmC~D@)`-~YwlEaQ^;X<3 z50H81*WL!`;^gBKIPq9F>ay_K34KFN_0+7yzoP)u%0|vBG@Y5z;9a_qF{u4&Byoq3 zw&fKljs(qY6iKMvF6u)|D`UXqu&%vS64w*8$zc%r`!!%6h{a}yVpi3`GU(L!1FVMS zv=ju9ACI52q}lDpd5PYjK$F`R-AznP{^NKE4ULRks$S-Md7Q)OrWDw)nk{r#Ndm$< zc%f66YwY5Gi-tL+R@V_pXz=f7!5GD7C9Br?#ZVN`ar1?nKtE6`rGMZB*IJ%E_sZ?- zH@*d)uOs+WRwzUcbF-6C|7CA~Oh2e4bhqV%4;K!0^HG+>q6OuC73Q?v$HN3%el$PO z5ajWoe(7=PjFikmO^&p zMp>&sux9iuvSfD5e^|f|g}OhHE0=>@mds9ey-tls5)mHKZ3LAhayHdUZ&Q4Pp6( zrsEX=oy;tbMxL>-F4)6FkTh16-&heQQxtWw%3zn~-gwpoK*`pf7+0I~ZiJRoTUZWe zd*B?6Ek>2aWe`q%07>{+gVO6Q`D2bMkQ zScn>tBhD=RTXPv{XvR3lxw@$15I|!CjN!WH?UkYk4yN%$A3lDy6kUt)RzrMa0zIjy zK(PNOT=%nGum>+Yf9Kj(4- z7THcGx=sxDfuEfwvfC|Nu9bJTJw{Pmqe!m0#Ni=V(U7}~!814EYnmvI|4WJzc9Z|l zKN9Za9Z~+niGr1OA^yxLkOoMYRodWjZ-5-c*c>&4NS;>56gmzLB&S6@BKfD9K5Bpf zr9V5N#I{%|{=ru~QGM@hPe3;RKr5k5Q=+ZUKCP@6(zA^ zF*xfEkqJ}aB!kH)6Tk?fLqtx3GFzf!!gc&R2FBfz$r`HMo-}q6wED-OCpltw!OM7ajR;Muq zK#$^@;*TsAD*R8EnmMwvgQ!MuzfNReHOm#E^V*FEo9|$`eR=~bkKY#rHAx9bHcpjd;DHL5mr$&(-xbT}DPoqk`Dk#Wn!H5SqAsj~=fB%*M*cdDX z$^V^~Wdw6k8Bx?i_V$5NBw%xfEZ4y<%a4d^4SlCg6I&=}4ZH-HB`%S2-v?K^QcYwV zWB25z>l1Hxh}+6 z2^#hAmI#QR^$lTJYJ<&nOj7<|2vYw3)&CbMin4WR2F>2@==ul{-hQMa_LoeWm+7|G z#&3c!xM=+!ghTv@H2io4S?AF)0X2u4DGbN?H9jp#cf7Emyt*E$@o$$u!$(CS6D!Kv z`L4y`#4IkC*bxpY1R-P=z;9s2@BEay9cu866ynNpiB!5I1At!9{GgqCfHK31g?%U~ zzPjO)W?RdD>gh8TC83mHY$&O*v>6zy3OYXE=p6msD#up3PptLoqYFS3vX0!0p;CfM z^v}`;&LjjF=s@%iowFQ=(YBFsj7UK35#Gj3(2G^(9gAdp7d7_-?r;y6r?)?l%}lnQ z^Q-FVwR_bp+D7>8#7|mL*Pe zy0E1AzmxB?676T$$(2Eku?sj;ms!xcj##|MIx&HRw z2}K9_=SXt^)6H?sh(H~^5Q%-R^?Na#%tdP}ViaHjs)iMC{4+q8IupVGoV5Oy+An*c zB!E4qyiqF^Qvg%a6*%f{yd5!ylLwqq!4m<|8j#9_PjJYRD+y`wE7Rk&|JKVMiEVVq zH+g3fGx`DkpGuqnTMBSgH(AP7baVTJWWUpvRyy)J&%}_8o;m^y4`fMru|9k5-7WCI2}~H@j#Xq)Md!ZDs&;g zfkr;7^61QON*73kt;IZUeY_&cWS4cpIK|%;hX)g!V&S{d-#^@%X8t@h&eVkXO^zy& z_;9S=l=ppK5eIzUE9>I+V}jfKqc=lSiaw{EcM&Vsb9oaRoNtI*uNuzLi4Nx!la$n} z>mAl`Dmreh91n!s@>#LgKr~jtDX_os9s_7`>YbRe!EK?G0hYX(P~Wnl7m3}Smo zp=5!b-zG*8DQeNVc31&6AmUW!Ps8i4S>8G#B zRNl&csKk`K@bPs*&DZ=X4AH9}{^qN`*^#<753;0zkP4eux?V-6rRk&$C8ejo_eLNS zVot#rprbSHjmiFMn|Tee=?Vzd_I4wc=i{ zfuN?CFRIRZ4jFIUZ@MThk%^Wu)VYbfBRd`pb$U)izFN*Kikv zYXCN0dpW9BH(qUOxZ-*2b6c+!s1%e~!0YGM9d*lQB5vSwk(8%=b-1Xh(>!-V@vv)> z9cPjgxWI6$0FT;Xz^Taq33 z2*`j^FN6m35vh$*Y~jun_?9U2t1)cX^siwF%HM4oqvGpi-VUTzH&l~dOd^>(rCr2g zOfwDH?7=H`&Wzz9x#!rJxOaZSqbOB+y{bK8qjfU@PzMcgCfYuf*zD`b3(U?j@ku0| zWDj&|rfZDlqno9q>&+Xkcq3m8u4kR*SzNsLqiTel?mIptr3}SQ_`R48o4wVZ-NRF% zDlXPv6`F6T@W(=bz!HtQGwzL~6gU~6k=?VhzPn&3AWROz#>TGZ7Z^|Yg}&1A8(5EL z9!xpC?{e90EfY$7(FAAmAU-mtzx5pHtT8Z%f%@?z#ZEzrDePqGsUmNRzGl3zelauV z6s-W2Fx^sP_i{|b$(JnT$;9Jxi_F9sAvL-=pBnSK|Km3;M||^4Z=$ECVqKW!NIgVz z>QpSd>Sri=W3m|UDNBDPEbe)dAH(@5JeaE%n{q+=(%nuc79a7g@l1zq5 z9+p-#N6O*(%7%H42|X4zUC9K*W%X}?gs7NqjK*uJnCzYL=>&wI6?uzU+&|&so4eyDB*)G;I>(`5Z)uU7Ia`zm|Vq+`ilvmZ<-CLmg6zjtG6e=tf z^i8iVnZ5YwYT2ih@EzFeuEJi$&s~W|$J$I=bsY+O6l*M%G)`K&`jZJBF*tE^bN$PM z^y_%;r8Y0FUD&~a!O?-y(Si(4>)C3B|wcB-K#>JIU2EI|-nhK(8-&Q#lqhN-N?d zN&_W*y8;~vVQCdj9QzHZP;n83E|y|Vi|kE4PGV0)FhvcfBUkX7-kz&UbtylRkUZvQ zwhU|(MALK^o(zpkJiBi=S)x&qWW11o1IZ^iR{*n@9aF+9_@UfoBc6()oOjNspt#v} z_5HTD)GsOK0$0zMQ#=$@1so8~bi5b+mOhHIP*hatgXU0Vt-DUUgB7x7SDFKit6gq zvnOAP+b>QE>5f*u2IbVBWAoq4%Twa>NGd4ZU)_;71?_X$Bszv+XuR1(k8AaOv>%IG z0fapQ0^&4Vp1;_4oLtS{B8b#-Py9&cI?5)_|%3_Xdtaday zusU-hA83@u^%}ams`#qwrIvvHp-BtKm{wj2!x*1+pq=*4mFP^7{y!|hjPoZQ1!IV2 z^4jhF&N0eShyh`<#95z4K4yS!=Gf zW{ffB_-7JqasXZBN8 z7M2`UN4g?Lk1*91bQiau{r$)@WTu3l)?+>!EW6&G$_fZzM$2xTK9~J@G>*TeHc~pw zbhp-PK*f(G)}|oAmBh3A#$plrCZ$@P=#f{_NS1Ax>hfEdP8?2|T5@`9^>pV1%NA$G zN=8N&bypHE^V)x&`7Ete;L@W%T?XDr-%c}qpH{P0BU;?$;6X?CJ4w6c5tiEhqI{)0 zMUiOZXpK2r&==d>d$}?nS=O<#XIdXdng|1|o)o2zWQj`96ja-XAKn|j3rjr~r_<QG6K9fqV)FJOdu$F*`K_>RtFTi!_Hx0TJM&MeI`gJ zhXkjF_xIhlI>*N!Os$zj@ar3L7b;@zz5hAS-LM};sPp})vWkF!z&7T7wtBKA-ZFyH zP5MxE^?t^t*zOW^QcAUM#yCge^qgWvxb=%bk+V7C7jll#LU!{Bc5^ zX%QKP98UGHzR5EtrirUGV*Gk0?z2c;CgYT%w7D7nLz}CyA5l&26Y1snI_e*n+ng44 zZ;3*eag3A6cNe4uO`e!yJHwY!e*)IBJww~9wH#Fzh*0Yp#LC}YXEwTx z5p<6oI*!LR#k$3wpqc%M{2MPG+F~xSmw33R{=svYaeO>e-7$GGGoC~L%>9SJ5LV4) z1Ak}ko&}P&R}FKGcvJqE0q!K;X)(R=^%3_d)U#$Z4P|J*LqtJFx6951QsK=JUHAFC z#GlC=-o}Ww$n@R?UA44;yn*&Ld;bw7l&Hdc`HQ47k2&w*<_=}+^bC(x0b-F-O^JcY zD-6hZo@X)TZ&J7&cd-YBXGT=VH-QmeBv~%sq&vF4z{cogsAeWNeWMiWJ_nqYhoU*ac(R3 zRAsAoTcvhon_-zqf$G^zW0V!phOPc7Vogp_9&hW9u8T~PIV{4BLnYMv$?@Fnihq&` z4@SKOuxJb>!b-(o>XnAJl_Q0%@K>HRXBX%k-gW(1Q`Xl;V&nKOrxZWZJtPw4_zWW2 zy9O3<1^PM$)T%CfY(~)CDU2W*;Tj@};d;S|QagGT;T}(r{QK>lzm=)<>C9-gj16@L z{W|c|=qh(jlo}M)QzXnnJ>wt^fAMz*eO4hQ_9;++e%-&(t&*Af{L3HqLhIgmhk)NgFXO!6>WL<)P! zsqDre$UDA7wPz#+SUS2>(S_V0J7isGs-I3v4?Vvdn%#E5avj9VT+%9fyW`F2t>m|N zbRkFAL_O=*$a+9K_)NvP$Kr^1T#SC!=$?L-y?&U1ZMN;?XS!LXm`P1u5L1a zGjsmaQoC)eJW|ZVbX6qf3!OoQ=PUcnt}uQbO_22+gz1G9BLlT`ThBGGP+ND@29+Q! z8AY>aoC`Jv*Re%Yl}aCQinlU$pIBS|Bo11In<`xpdtJVtu`Dbe`KGA^hSKr*<6{`c z9rM1j<-vditQmLmuiNlz)stE4e zUzNx{xL(}d#&KOiCAK6+L^NJ5&Fw4KS&=Zjxe=WGazPN2c3kRY+gF5+($+zdeZA3I zBUYjXF!={htT`zt3N$W;Un;vQTGBUP1|^_d(-UtRiscS*>%MjyELTgP9kI9&9BGfIp34YQoQ^xz@_UHajY^np{q0nRihGTFF1jGQOTfK2d1{XTr!1;FBb)8Z8 zU)sfYQLYk3+({re=haiyHbVcB^+jvn_uIo{rWHi-Z{)c=n4}pX7b`p|iNlD{ATH-Gu0G$sqe7z3IQ{N}oP?iNgxw2=RM7DVxl0iV{tIM@HZJ9=KO^{vPO(Qgr*uN?L03o(ouMs!co3pS;nU z#pf}pMafvG=kH_^dQ9l?`LG)}mJR}N@1Nc2W%GrD8$c1Q!U%S}g2w~A?Xhk7qd)m7 zU!b1_zc?T0eLP07A5Ig!CTXZKEDAtArU=7jy7+xLKK$xN6E}&K?`U??v$<%EixbSrCOjc*_7^%fX3L#u*=lYRq!xS={)a1+tI^+$Tv%Bw%gDhS62!H)sMSDWF6r?71S;`G$`cf&|H-oXY> zn@}UTCHrPS?lSGE$>?+7a8nCwO>f$CZ;CyO@_i}`<3pJ zQ`ObgaxxO1_^-bZJL{ic>TQv{kk15Z>E~>GXz2(aK)`tp1oc;8?u_B3|30&vy2Cqq z9GX6`RQ!QQAi2huxnHc&An{Qrv+8y5Om!G%D>VKufQ|fLr-8Pkzn6phq{AVN4}3J& z+FVUb;U8^1iu-5mMqyF8=M?>!T(|Sp@}ifRC&w*axAtC_(aLa?n)J{=3}uvvM*YR$?+h->)9qceHkCm=Oge~BJ;jxsXZmJ3xsxogZ1kVi_< ze`9Go-GxfVx!o>z2MaU*z=G&^#*bIXY?0oj1%!q3Tm>ZJ)U;1z#8}*smp$X5xM&-xwjoS4Paj-mwbn{_GN zA;Jc?4UGt%<9d*XFLTmJulbuc-Tuzc+RXZXY^`-MmLXm4@^|`2#GQi^heU(b6(5pn zCc*O$KjGSa*j&nM4S#q(-$Y{%F#z>(kqUV;mU(@0Z;)`a?<@mK{oR5lg7c3^x`Pc~ zHbztp@#bYVYYpNs=#SH!=n%ga+d83dt}kwGUO0=AzF#Uj5$YbU`}|%@Yo5gJVOTvL z6KS|+=@W1)M}$eBo0ypIJ9Bb|!QPN={IfKryTda*yvf7yIs%f+Tkf_xsk&%=H?W`t zv3F=6hU$gpAaEM{NNhrRre?Lv5V%dw?;*+i?vRs{hkx(*(T9#JB%5VX|)J*5`hwbONBLaCnj@5rwpp0U0lD= zuX#@j~r7WA_)OH~Mbpo13=_ z3-`#Dt*z?!zmYCE2Xh;**kohDDognsO5gPDPgby2@+;lt;vEbo?zq zdGJp$?u{!N`W}}f*MXy7t&^W6Ru3vj-wEY!5VsmaxrUiXVPn9O%c zDC|OZE~CZm+a8IAKa^{|84}?5=6AK7Q-CGFR#aO0arl$q=0h$L(wV8Lsgj@7X_V|e z$y_F*wDi80m%x5fv7$zSTiMMSo{5R~&Ouoh+#2tgCd-mVJz^{EM;@it(Cr84@rRpy z->e{qB9)IDYn@%4AQ$He6gb3ZExrWwnZN7~D%Qyxw&wc}XJA+;uZx~79@m5qjHLI)ob$wa>|oYf+p{T`W%nczs?m4|MmTKozL<3&EToxj+Z!$SepxV;KTDWFz*jl}6|m|bmX z`dlnbfj32Lk$gP~slZ1gqp*;gra)W8`(tcUhII^mbg7qrPHkGZv29_}ZvJg=W2(K~1!K+b9RFD7rNwzQ(^$8x3f@PrcLb&g(f zDp+p`_buUEMk;h3-dim;M?y%o;I!E>((wn?{o0Mxl7vwTxI;ZBg3h2#69+CS_j)ktHNH`JzwC^eSC5+ z)aUG-zWCxowbz_5^zL#;(@RV5aRZkK=xFJkNjenh21OGKpk$)EB=MB8&xtJM2(QS= z$tM$b@4~n4F_Ln4UZ2z_batO z^=6B7#W7%Zj-7Aw8lwokzmtY=l&v3!G&~z!3+{Y0L{!%)W5u;AYp)WISEch2NKSMuV51M(aGyJ z4Q0_a{+7ojf+ZQ2ADZCvrH;%P)#%tS_%o!)a8av8!0%~bm6*1U8Esl**nF0v4A3v8 zaFv|u-%M97E|*hNn;TfS;R;CfkZZWoAHF*+>U=+wyXz+83vm%UkD0{@ZV0C8HGM@c zrP1m^%O$MU4rK4Y>&AP_ROqmH`J$QMfBgBjmhDW?3|2c#c>Uuh-UMPl-pPY-;(Vc> z-0Ns0TAj5}mOK!H%eTItE9}p^SJQ%ZClnZJAu9WZU_Dd6bxG8I?8eE*#H6^$HTs>D zoyAyvUKbbVTKenkI$R^O%JJK(WyYe=^&&kKaph5KLao%`Bc2?o(qtJNZVQth*V(|B z-DweeU>yCL&ammqK3#ssu^=bkaI!~6BrAVmg9S1A$U2ZhVSqfCfA`V&?!NHy6y0NP zC!|*zFvW&WaE;onTA0n}k19!fg~M2j|KWPL-@N=SjVDS^C+C@NHpk~S=IKW$N{})| zP+YWhbnYqq;@#2R!D>E546Zg$J-jLQ{EGyGS@8|Lup(cx5erxXhO2z zYip5)XS6CvWhgaE!z< zA`?z7)6yb29BTOaTt>X#@))N%oO7&pNy||rGHz%0MIE%VS$J``*x=QCamTZb-qcI9 zi2I}U)=uzQV?O3H%6cn7OP!tPSjjA|qeEUAldxtbf0zAYvu(?Wy+AoCCNZG@nbz&r*}KE5d=iU#?qBC~}rz;Aij71RYjpTacti$EhUL9d-u2 zfupCmZ>1L*kBYi_0ky*8XC2J+KQ#{K%>8J)emfDB@bTf|(Z~f%+WF|!=vN%>zlvxv z@C4p|6%31`DRJ1AyZf;XJm7|lDhFcp?0w|Y>4;gjG+N#$k!Qb?1?hLH{=Z=#?#YL< z-h{OeyIKuN(EN#Zt0eRX*N038NymN@7kr|A#>-cEQ5sq1RLKr#aBVS}$@Sk?IQIo> zxRx{&4qVUk`IH*&165Z>qfTU!)J_1|D{6uZ^QP`pY;P&)g%A5*+DGyKNc;F$lvnG7 zm{9_3h-RT(LF|y4SyU*dh?*ts3!a|!9Q3tAim+z0ZV{xBOIFss%7}=dcUmPexA-`% zqQ}ZeUFIZyg4CH`^7qs<-!-)+v00Nw+ia$1oaSigap86p*V+Vvig)1cb#wkVUWZ`n ziiD&cX*JzU#59Tf=AJ5s4!1%3L2A)-`NZ|Sb*gRzgPR=60db~Y`Tq;oL#c4-y7Jjg zt5%suqj7IxGfwoXViaY{I2W6%iKmm1w4}TDVMBT#4-+}JtLu89G?}$Wo8&^V$1i98 zvJbd@noeZk_>#rNX3JmK?V;~QHj#KTeX2v&X6bl$CBRZ~c%6eiG95BSrp)pg43T)RFREY&2?dD3Ah>>4afd$VVsHVGNbfyuf3 zdr8$|Hj<~gb)N5?!TaUS8!I)BcEJhPe%c|j$did@o;Ww(Lv8uxdzX*B7ok~KSAFPX zD%Qm$ds6>0Km6-9mMrMiH&f^ndDBfUOY9g$5#RKe<}@@ws`Ymyt>fQ@xaHtXK>9bA zZU)FaS!i&QVj@5`=+Q{!Y}9Br_k*1z;1n*38*B;dC;2%YaHZ{g7#CFDhQvQJuSFl= zOi(tGl9G~0YhLwmfx^iPy+KxayL6aR`5;=Cl>*?Ia1Gt*bS}fcz}r>_#J07kOl@pL zC#7=-%0?(TRHAfr0%6IB7c2fAyppXCdYZT_-p{+hKH`r^&`0fyE(weg{IdKwqB_yI z1ovfOTaK3w{E2|x(RRhnqC`!|$$Q$wr!dG!^mK@n#WMec`3|ytup=+dtOT5{g%BnS^K5+QZfEqn zP<^hi>yJb@Gd?avEIo})7d$)QBDP*&aC?>u3LmWHaH1#bJ;EMl1^yv*l%O9lX5c}p z3@Rg23#O|>C89iQ_U||F&abnG&=Blg0eod`i_|(!+i}C`1e1Vn&eP}cGcL-+{%6-- zHrYE}yQ)@)@TM7Uc_VF<8EX>Umj#q>&EXHkeVPnA#oQgrm{&&Co zzQzxtMWVejcRI7k8%v1TQ_jO9@GNo6V}%Ji)%hvkjnul6m*;UD|B9d`)TijyWU9Mg z0_(1hj6KSiGfgQ%(f-G&qK@n5E-wnV_+RJ?AvPCy;~QLF7ev)HOX+lk$a*hNzh49M z3AhlW-QCV4*Qb#N&6~lwPslLoU2YQbtROp(7rxf_8->a=Yh!kEcs0KOZ84l6#kys0 z>h^rW33Hp`ATmSr93eiV&*%%WEW`Sf@=(0V-j?V2Lz*5QMH&=8*EK8G3~)Aur+Q9= zXH-_Eg=>U4Z3nkip8I`6D!>7TAK2n~Y}FulAA@uU*vL>-x(kp5r3fhy;ns)r+3Z%b|dWL7%6ws!#A zQRC@WaJ>_?BIyyqneJ4~Bz9S0%zla$@6et?(Kh2R_bul1H&Cy+!iB*h@-niXjJd3_ z>l^&fRF9?^a#B%*K@acr*YXz>)zM2MhXmg|-IwXRJ3jsZL-oDryA>?e)27`QyDujJ z#cPWNWfJesko#~Y0eT}j`CBwbbj+}Va@B5J!!~4FF|C2ic+^Hl)pF*(m#i)@0Q=#) zv@hScK2t`N_=VFKcl&!$rz>r}0PNvo@|OleVic>R^zNv4sr=3DJ>fxgM_(GJwOJ zzP4Q6TH`ayKF{L}19T6w{M_R&OV7}C7}l0h-wjmjA!fKdMl~0nhR&whj`k*Y3V_Z3 z%f1NU-rHKY%)WNrmL`AM;F6t3I2A9rrI9>z8{I8l5XW;{AL9XCncY+su(2|wUGvT_-!JS~+SyOaD zN`L`)@8n&b_EEzcOYPO8bSD72ay-gqqo=NB?jkYvt!_)fPvN|ip|c7)ub@gXn&-uC7LL=6V|}ExVXMSqT0+*hc5E-fkUScAJXKVw9W=e==1PZnb+bUNVtG) zN%wGI7Azsg^IPi7N>-Mv|GuU9K7y@w3E{)jk^jU3{x{snnJ|XP_YCPJwuy<8Ao?SY zgifp!h~s`R=K3pbIG#Lb)yUq{lA5aPFp70n0t`HeBLpLj$yvz4Y&csEEurNnJCS)? z`M3wP5h1PaYc;=d8srVnZ|-fB4MNgRBp@$6gNkGq1oT}?wO3gjcB6FlfohmQSP^_nLPZqy7P#&B#zBjF~ho{O1zGW3p{YJ~rX#&#u z^;l^Z2T~Of7Kw8In8n0I!a8D(Nbrg6^)S~R`X$ppZa|?xaVJxYCS$69ehWV zrEs^AB0=xYw@rg$c_YepqdnI};O#idARyK)m%mjW_D?$P`*^SUs`pParkf2ygdq%tTT8y--idx!qq1$~R>k$*v{>v6-8h?V1Z7&w7hi^{*tNVY|8wS4FP6 z=|v}2)t~=Q+6l82AgLvF$$b+vv*}+glam#y1F|#6v9@=6h&Y6QRNvrx3@?Zc46bPZ z3XDr^_wN^co7d{JeqD&*$#OW0;5x`n1ThvV9-A4R-z_breXt*NqHi|!RP^6|-4v(& zsV+CQ>rUB~_tthNIJme@88{hvGKX{Cgl-vBw}0U%vaBDweywaFr2Uerr0exEUrl|L z-BCC+C*(eq#LK|I6+MNJW5qVbs$@+?WNv>j8oLcmch}3~%aj`xDOQ`oMD|rRl7U9n z!ddTr(J2n|;pYs8qDc3JRJf$np%Vo1b=+dcQ^gNIfi7?c;`Q4!LkNv}%V*r}1|;Un``_<#$eNd57%a$BfHG3?m!*buPzDk|5~E~k^vM@D!Lj+XS$2i zXZH$F0;r*LGM|Mk9gGY=d0Wo<5C7VHX__$oZwX13z)5#l6p`ACbkE#8Uccd2>fA&s zIRE5*f5{RD2}YV5uJB8aq>m?RUyySy2da!8E|^^8z3h&=W!MiEI5p&av^tGPnWt~0 zBXtKb){Nf~0(i{EGRgg|qk{Jxfghv3Nu1;Jh=xCPCE9Nx3gx49IKhUDO2?(uLFb+HsF;TN{{YG13l z{^vl#X&fJ!!}vq!?X7TL#T@zn&iO1}N*NLqAy|YA*OFiBkX0z~h^iRuz z5^ay4Ja8NwF}Y72xST#B;pnR+9X7a)(>TMmv3CD#h~lE!Vz7N)z`u`;B0PB*dHt$) zc*k|0LxIgqt~+9$uQ8&fNVO+pa{g&mkz7szKIM?TD#0mpgQ5#oA)$Oc`J$(%ZK-Dx zBZ1W83ltLhc7wz@a86X+FqRHv?tjrJ5i;119F+5j?~fc5?gk|ZbT4?h3de-{{6c=O zL^%rOD19nU1M<9Hy(*@H*g}1lo*L7)O*#~5^BXUWqx)t7utcwbKgv=`vvan_zH~qe z@K3B!N;PG-+Fe_I+@0OfoNk0Q>`j#p5ZITN`*V)lBlz9#n(Y*ovr?NPsssHoVu7Rr z5}J~x;VZw#e$rb8;GzE+O(x!MdGz~`n~6_ZTW4LpisH5r7Lq;vC3AHLfNqi@#hBQv zus4uk$R@9GSxiCQuvGgy5}g)%0N-H4cJ;9pSg{@5G4bc* zYir-Mp~LkaPKNR{1=+&j^VgjbuZH?mOl+oIvlYiN{6N3Iz?Q!vG)cAM>AG}EQ?;A8 zd|&0}Po66G_(<4{#n~+)#D9n*Nm4zW9bS&|A(Q0_HM)?D!XO{HAE#T_;bM%D{CO9B zJ+L{SK152v2g&5sQE*>V22&QmAhjP(KNu28dr4n@tk9r;)u$*+0)hAI@)7CEgxRL% zYH7=Rw>A1!CE#(r5%|DlC5Qd{1&2@E(N|(h82M1V@yC)B@3JzQn{#U8n4g$p4C(z4 zL{>X1O{ts)({9k~tIrE(l~YuV2t|>r9NjWsJr;pPiV|yGRQTHa&p`%icpu7V4f&*} zy{}t;%X(%S*y`yu`3$HR{pfkK6h7ZNpx3TubA2FVNxQ&Km);6bAeai06wu``AGm2I zY&h^iufAiluEO{NfCJE~hhYG{lu;4**MVOJ-q{St6f({B6RM1@85V@y@P(4iu)5hZ zKOA1jFR7$dT2G4x=e2A{{ep`2PV?4MoWyR+{ku2}WfW>Ky+Th>&V

&H632C0;=>wYOIDUe^7ZLnqOf+VEM#6wA7=AWMJIabvn4LK$!dzO@xATdW+$P1T0sM#sUVhlS;+yIks+Z^?{Q%X5;Q$S-=^{O;{auSJR1iU zf+IGP@_7EFM`%V!=qZW`jQXBEgX2RZ1&iJ>2@aMh^k;$sa=!f337Xp0mWZk4Y%qzM zlzarnGNVEH*?!ZaQ)QyU#sp#cs*n7jseW$q*{A?VeOyj@ zoxhcj;wh7WFJru7nzcP*4T_%me7az~gOk-p|u@I zwYrEz{{;uhlBoyu_T6Pu|-j1;yms zuqMsrql+Yutdw#={d=5J9YyVgZmw6Z*AKQ`m*nc~Zg9(Y!SlO^>|5BYpMu_V+MqKa zKg{YOXSf$A2fnx59??5L_CtG~hZMdyt$%5GwDZg3qAqE^pSMJ}5-=wpZEYnTy*9nkU`u{8H&VizyZhp%qhO zIB?r^#ek9b_tRwD~2vB)3D4ycd|H32~ zx%Ba~6K&yJfyNiu8&OJ1;Be4r9n#yMO28*E9~s9(Y|@_U9eW(b!`g7m@bDvzOX)_O zA}-z_?-2f9o=3}Kx~Muw*M)UaW-!AEOl&>>0Zxz~BEI`fTfr^XcO23(FXPYfOsz6b z7Rpv_Z)la%eiU3|##Y0&YJ2+CYO6j#JuWw!rR)MAWud|gh>lmW+up6hKtCEJ-&v7c z*|70}YX2on=Sx=q03viu1|M!3mgxc}`@Oc1^+y^BtK~?hiKVK~QYpXYtsv?B9M}fZ zZ}gd5-d%3Wt-NCfr5ER35DldsW1iA97c-H6p@b4nEFJ`#1aA2nDTw+^}4sp&tl0PNxmVyn9Q z@|!KbM_J>qe10@<9}(t^qbIM)2|o1Le~6MVVxzR^MiMbV)KffJMmNp{k3^Yue;9U+ zA|pG%*FIrh*uxEoLW;1$Bax%4(%Y~7@MJE-3$2(B;SA8N--*~&!@gsSvHzM?h{qxt zo(zR&6-;gk*TRPF#$CR2w?|&aR&Q7V?)@Z;7*L%7V zQ!*ynPh_9}!0Gej&W3$ndQdvB?cddZkTl3A_qT{JQtb*XW%Oi7mhd!S<8P%Kgy@R; z1>sf8h=vPNHdl$@`67`2v*xDr*mSy(iNuV=)$>27L+nH3LCUJmeEKO|)*HX!k?ZiL zjKy{P$I15COqfXN=8@jQvUq$jMq{*kr^KD%KjsH88$Mee-akyk1KQkSlgx@%(H`BB zKW!EY4U45_g18SBY_2&Wf`j3orf2`)HhQi`%KJ=;NGwkRsDHlk@9E5^MPn#L~f8}OSNy)f)FJ@C@RCvC-GPP=PvKRW#_Fc?Jcban8FW*VXB(|NoxrA`yKm`79jP$ zt_}zTC6Cp!ga$L7?ayj7M*j0Mo>)Yu#I2T=kn^MV442YxZ(10c&;XmR8>#S$0jSMS zH^(yV01bvbWcZRq*Xv$YQG36%WZ);25cfZy>kTO>{;^$@BdG!JE40MY5U4cD4z#V)AY^=Z>*Xm1~G)jgay9|r1F3Y#ptC&!DEQ+bXP zad8(0t(L6{u>PaZ9&Qmwhik*wv29#ITiGe3Mp24KNDF{Utfdf7; zqw>3u%=BS-x{C!Vy~x9G%?0#6V$?!V?#ZVW{D=SPln_eTuvdrPgI$wZIa5vso!>kB zv|(nycWWNr0y~5-$6TmMiE__1ebMe}F&t+@!qWa@!$lg@NBaoIV>y_~VRyXrLuH$W zV(>```Tsy-WZ|Oo-@L@_e4){Wtm!&_uMA%MvP%5#AH=t2?^N6aAo{Nr1?Q|cF5?8|YFwKul{fA80b zP0lsUp`q*}I5-s-{PfY*#24J$ddlEKjawv_fVFLUNA=yn>el&xqGIsp3B@a->$}U( ziROh~em9_fq++D~U#S=yANG;pK}9#|#{Q0%5;59azK#chDoyXyo^ZZn_>0l`vLB#| z{Txw%46{@juCNJBD0=tk{M{&a+Z%8k)A<7TfGt0e2wfgT+P&;kt-lyb6g_QO2oIJG z3brGMH`a=Hl)^kVd-3t^dr&;;_jOmhblV6i-|s9My&s|1@;TZmeZzm(|oD4w6p)Ug?oaLqrCabeyF%WxvpUzxMrE@BQ45 zM8!rQs-=io0*FF3H|-z6Li?Lz(IXgMQ;kt3a&-y{uH?pstSrNWRyIvVJHl0eulB@V z6WJ97Y)@K8bjAX0_@j)^~uqR|;3y8+g_z!=7sWg$k5x`WI zjw1eW_u>!P?(sU$4{?R}f4exn-fBOs9+;0gtsG4W!)|p&kC1gqE3YDxtG{`fh;INA zK&62n+JzV5@M`XF$YA%TWWN+>4OBNaV3z~vlesJQ|& zVIMN@FZZ0oga7DjV)eVe15$y49|LbyCHfYFw9oecLxp$}7h&_}>OC=WA4>+G-|&UC z<|sqt9%sH}uuNA6o;_K%5+UcCzc&I#94RqKX;J+B&7@6+1bB0=C4hq*V(M_)#tyHo zVGl#F(8~YG8%Lc(?w{%X1@;Y9WMr&prNHmch}9qR3fjN(`s|)jnT7`vZvI5!<+Nw; zAx^IUA+z8=oaIVb{X5xGX)Knuog)X^2bmRbtnR*}jW1NN&B?Bp7ohV9}$$J0fbX_r-1FOk$H_)iz3r=&~ zywsTSPOZOOi;*g(dQ2Js&4gsapE{a}QTtN`BZUN5b2^bYeM0N`WqlZY1h9d`LMDWW z8Q)pfOu|J`FzfGc{^3!{bnvHVDD$*B zfyQBBndXd7wApxro3m_qmPvFR$o8Ycr1&1@hbT__*jxwKCu(YL+{ zgZ~F}p%`qRUA;STu@ir{nXJB&ZwJb###pH@jF7yKReUx6l7-?4`*{Mh%WWpx{aNpe zgQ7CeW^U^b2gJcuk2njZkg&v4h7R3Sk0AOux-^)tOcNvTnlfiLlIuX}sgKV(vp(HT zsP^M?IVj*1N;tMR{xn+${r;k=A2Iy0?Zc!Ag)eF?z?pIceS7rzbGg#8EEiJQ9f;wW zz;OHiTtVd-%;|=`twbM40R3wJx`mS8n#1#WP2A;9B++sRBfe3K&I2T~-W1JwcA9dg z2)$0pq4M0&t}AfZUdN9Y7ngbb3hy-ogVeJ!Ks46XUV@^WR&<1xYJblEw#c8*Qv>t{ z34jF%-9GHc>y{`n^};t@Z_|Kw(6Cyk>2&bMLCEFf{ViLX^N%>VpX+Rv^YeAqgbG6c zg_M}&Q%bKb4SPP}v}AcRgTxk<*!Ylfvsp5Wlh9x>6YsR>N~kKfK2@siwCsy@7^sv= z8h6b~I{x*xSe z5)b!eY=~4jxTwnR>-MH^atQ7*uF+S3NQs(L)@0r(OirOe=*Oo%KduVj+UVP+IDI-y zh4>nrN4`cQT`TETkBsR(4j)e`gt^LcJ!lOULKTm>I>CyF!e?;9hWl1w&>fNOd{pMC zTV+N|mW^f*D10`(ix%A2Vss;h`#PVJLVI@2F@B$#tb)@HfIlE^VKE|(+u36UKoxbA zcrBg|;?`UQgbY`!mjD(iGdHPDRH_ni@MBZC~f!k=A!9e7b<>`nrUyD}~ z`$lq=5!A#6*!*k;G80H<6TlS1j=?nJe4LBYQ@DFFfPyf&hpf@)XV^=|*Zdx`7n^ny z9-kTu?_<;+s7TTGw1BGDGtreEE1d)+1$js)oW!%~3Koh~Lv8>3 zW+U4P;c@M2zB`DeFhT=~#bldVk2sX2h~){Mt7-4b2O|0iwCzoK<-~nqo6v!fG1=da z7liDWS3$9p+S-j4oewQC;hoasEmcF@p|(~H`(}-?Z8zx+M`iS_BC&Ffo(~X(8|j31 z5Mvb-35&Vf6d9~1Y61#hcd2j$r^DpU)_5Nw3;=Os=8MmCh1#I^h`YeiH|&liUyh0q zEX9KR#x!*3F(ID)Sb1HBlq;BV322ZD*j*x%N#sRGWoF$;>zDxyV7MkiZFH^b&|oe! z>EkC#gkh@j!ITw<-b$47sEf#zx>I-yXifaop1- zGBq1>t8Gid^rZ>q=lOh&?YzIFh5Nsx1z7CV?M>6ZXsc|uMtq4P+nAFpqcN>VOL7;m zeLuXR9k&m0N0B3B`#f#{JE#)FF&h*U!as@_Gp(#a?dIZV)NB6W7Jb`36Mt|2bJ1Nv z307Fu28t6tjdJCwR?;aEq5G|~N|G-$bS9D6KL3?)-$V zv!^~q0<-h6T4~{A74?5&0sd&k1(zf|$J_M+5K#4eryuE3os?VvFO@xatHZ&Fnd_y9TL@hHGbKPal;9o<^Oh!c@FLTc zB4v%E)szmb$Z82!C&gP-+jOsevtDjka53ZM&T1Roqo{x|966dT4pf$Di#j$}6QnZN zq2HwL=fEcPeiEl>FgZCj6X~sPh2JWkHRMhw&TXF1%y%{uvp_qwx7Unyah;lOzui3= zi|lEov`#V1*|r!9T&Ho?r>4s`I{}?^^yJ{hyDzWBW|jlWAx&v3eH=XIBVYBo2k|bf3%b+)l~gGGp{YIpLeUyu6;Wx9p*uzz`}1 zl=E1b?$KKBEAd#Ip}p*)@brGzICWb$o2ci5q$@_yPRIC zTtAzpHnh4q>AmwUMfRKIlYu_9rMHbb$4m_mZFS?)Jq|`-FT>}uhddwMeUEJmm|)do z=fEfW_B(jLmpJVUQ35|-1;P^Z2%FAbk;WIYxWfeNwhKw79eBI|LoNi)+NQ>=;WI-I1|dGM;=p5;~{lc_8B0%v?{=Vzdq0z^Zy;Z9d>1Aq{k!%lGO6_N zO%z6LbX_WKh{rr8otuBy_yf}r`(CIoLcagFY{PkYIno3lz_Z|g?;XY3=>wzD1Pg3g za)3*CQqgBJ9bxahJ%hFPmQI3^gq}W$)Zc+Y`E8`77;8*|20~GEAz1LT3i*$l_Um_u zlpkPqeb&G{`#edh+(z7I0m&yKCE3yoHhV)R)wUJ4Q)+dAPz@2eQc(_ZY@|;4E}!N1 z35A8Fd>1_3_{&%zvmF*uGqw4g5rCfB*JH}GF2WgM7_Jc|RgS`YDfV3dR;;1rbhMwZ z^@tPA!Z0`z9u1NZ(HtdFe=m<+0GqxA+Neo6tBPnimOaZ(Y-2}$ z%H!eJlQse1hkiyZX2CT8sM>N=Hf-&imqB4CmMlN4Khi*U|FUG1u}E^J2J4p0wK;m3 zMhT8j5$LSbgvps31N5MUkHd3@9@oUYPi8^x5Ph<;R7S^BF`Rp2cHMEr%Ass3iLJ2u z_j=BuZLDUhIsKxn>ElIXGKraVgc7T7j6;u$H3qPtEq$toZ-VbQeV(@`vP9lO%1u{4 zrpAj=8v!l>i;|V0RAiH|^r0rT=K&AOAq+-#?q&zr+ubhHWGAhs#Z-uJ{46;7(%Elz zf*E(meRutqJy6DJMm5ICJn(GWVH!Rnwvx5vrG-fvZH^8krd#DBr1h1Kev|WxU(E1O zV7Q`E55NQkKFG(8ahVVu4vzTvkX(V|5$2xRiD(Y8`@d6!3=^S$Wfy!X9@&R#@?z6* z!r1zX@H0)g&D&N?I3n)lRYNmn@cmmslyf#%C6~On zHre;n{W$W)3#9FCmVOMAd<`ADoKUIccYYTiBH%?Q9BhryL+|xI>mpIND-ticKafEZiVas@XW;&e%Tgu>7s(`HS)n<(FaPAa-c+FXfA+l(7$MSUe zEP}`xwU{0k(@^RDvKxzD*a`<+v+=+lNFXS+~XyP(~4saz$~R62GRD zq=SE(bTwT?A3-C$E}P6LPg`!dwQ<3Be3_5hPMJ2vh_UxV)-ngHHMUU(rpJ^si+GS( z&p;x3W}>%$16#NXA)7IpBD`hIAIs)zIn0k;T$265`FJneROhYrRhYA^up=u>Mza|7 zx2CG8ie?#nQ0$YDcrz!wXPMqaKb)7t>Howk%0>Sl&fYShuBF=&jo}a=Sa5fDcXtmE zEVx5(hY&2dySqEV-Q8V-dw`8^WWSY@@7(U&ukW9(f3WsiB+Kr^v!{z^!R)DEzpYKX8gR0 z9ptXTQ)?#roBNhs)rG>hcL@)GoRg)CYP4x;H8Xi^mBKn-bRNUrUT~WbO-ZIgR;dw2 zH@n1wdhP4I0sl7PA8X^^^E<+E3SI-sOGniUE3dOjo31t<75I1LPT&e+y3u$`Kw5Q- z$L4V(c3*V7+%J2Qc6`)ixiqcST4(=m9NVu}C)&Ap{+E6+Z z3G>kw(Ll*7+XqmRy%FbKCpy(r{S*c5aHdL^QxYsH1hpUb4?gXroh$Us91#8lbRS{P zM5(+SK721f5wZ+UQr>F>RFWde*~n*7&^fj-{(=sNT&Dvlr9RmLn+BMo=66(Ljp4+n zJ@N6U)`-?)H$XS=nuwUrseJlGY{UqNK2WWg&is?lx8ME@fCmV0qh^CWQIrSxRMFW^ zk*p5`0;ypim;?T_7jXQ$l>~5$H~X4weJBk!gd#>pb_<{{=C*B{}|GemZ>Hf1-0a*LRcmhxX2qjDL;~(V@q0a$--|b#P zD-s4E^Ka1LUMXJ!s8>W@pYMnf0m8sgkCOC@-N+8+kX6x4nP*K@UIVI zUZia4muYxnPh&&}pN|sz2#!plaIB6O)^6`N_N=b{ufhkkJq8zwri89Hrj-L|DA%{rOV25ZP}?CS37Q^`*7nw!0)y|8t9T}e)j!?P)6p^xdj5%bwlK-^sVx$Gc-UVy`SR~RlVo)3Lwqa)%q5s*X4=V=B6 zZ%mDSpp2NrV^97Nq0YXF@0J=X$sf0WFq-wg1Y`K3roRx*u;}1Gaffpzk z3%EKP>DcG04igA`Jr(6FxSl}LVqxwqs+I%@6oAKR3@q7flum2ZWOIq7YzU_yZ5|}b z%o6_pr&YjJQ5FteflpIDE0S~$AeG&=fU|^w&$RR6W^(#=2CEXli3W)9um@&ECVGy& zY zvUdWEbiIz$PRsdF$lWoYcc5T9*zCNm{mWiU!j5EQ=dWDCj)yAWKcc6NPfwqCMtofG zKpl7V1XI5?{>(x=Z6Fx4&8B0W^vyy>>*jNh>6TwoCjVg(R$oz309}fnT6A;<_35-@ z&s5)=b2JNC(VY!)+EUk~Gwl`%=P!gUOYz&^fw*xF+vfj=V8X8@$vVKP*WSNW@vt5U z{-$pg@Ax#x07n}PPvlhJ4xSPyr`pQ6 zKXeTKzCC7``QkJx*Lbl_+vmt~QoCM_&1=I4@Ad;CR@EbWZ$B@Cc~Kz*UruUyO-T1AP0F04 z5u%}yTK^gu4o47U0thdir-gzaCEl{YE%T=>yy%M-h4u>&OCk=jV;YH!5-qZB-WJ5vjG+o|aSBiLX(!GK6vfd^!K>C+0$ z%e?@&I4R}m&DgXwNgo7Sq4s{VHw?1?5q>~1eb=E`EjSc?NXsm%w|`038sHAfm<~>y z=_J(8b!b;5m8ag8AL= zG6HMkf{esN8=Le68L}J7Boj}$%y2)d)ZV1Ey@3@0e9MAfq(UPD_&7B@Xo}L(QY~Fi zF}C886PF>SS6WB_l$_Z1VsO()PCSWozrz~Yc@(?k2C<$eHO_bATNq)=EAGNR-)1Xm zJwBJAhaVj1Uv|f&^sGJzFzCVM*VL~4CHTe(u8mV*j=(=>2d+TW{O2Hm24e*hbgP#{ zrzH)BboT}=%+K30K1_hGo46K>r;W1QPA9L&n=m9&_!ng(qWC0UWZdU>9dIN!xZdwL=K5nUoS z|K@mCbG}l|4sDdLo#;AJQDFjnV|DOyMBKp(aLEst zw=BxY6Xs}FbCb(76eWd(I8N6UaTZD^ z3MqK&ZorwG83ooii>tQ`XVJ@wA(a6>juX^eCw+Zw-A`3m1cR<00Li=PEY&XmfB8@sp)0?;cInzM<0{q!D|H>#~$b z6GO&5Q-W!lS9Kh&_9LuEQgj`(y0Y@ivUdP=x~o;reMp#7QfX6w!mq%MdUS- zLK9Cq>>ABRN$og7nKAj`P_8Bztz)7R+XEdm!EvaxQ1Lk>BMu99aRL>9fWOL#`m6_G z=!d?SxLK1Di0FW{Tnl?k*VnVLFUH3ww%z&+_b8TI4Q26gK(3|n0yTZBJx*xPgJ=cc zC!K9x4<;eoFp>+K>$3c0Vx+hTKa-QqeAr-x&WVjcO{N-cUAH~SEY^*!%wQ7njgqQV zwZY@0;#Z&cIg}(SlT-v7^1U3G83Wol_y=V)@e28PVX4D@WY3BcS?Me^UYlqWMXeTY ziRm(yub(A^^28d6)=HYQb&Cab9tNJ0!ot8<=;)@mW72Z(+j{|%$VvUb8JbRfr3Z;> z(Q#_OHa{k^84P6S#@s#8`K~lo`CJ9$YO--X>N`-t{EE3$?=V*Hw_Ig*qnA7$MUL-y zTn6;3RGyFe1BoZ2w<5(RnMI9x1jwn)Ktm;@QLDE}oDFTKkU(!psJwAZKQc|I{2zgb ztzW71&6E)aTc5R6MrLZxp=NiuJ-+rX=n^uboymiG&Mb-sf0xir>*Fu?KZ z*FbdcR8Np*n0wtH#U~#RpR>x^_NIH(hQ6kw4#R6dbs!=NAhJb#MBeApW{_IrQOm6j3}tzeXv8-FfUU^<5b^7i}*yWc-nZkY4NFIi$7O3+7zGL zb2m+y*&{7Bwnx>GTHb@5VS;=G`Q*O6ddkY^cPByOcQOIOlt&m3Sy5uSY=gF)-}*Ho z9o7>G2a9^)Og(wX{9wF{qCeVdALborMMuaEc56rp+q&fx&?l1P1-yugaA{~<~ZchM&B*KF_C}F5Xg=4vv5s*X!%-ItcmcR$=^FP~IIIkUiAJnOD+P7x!i@o1zFx zvRloJ#q9D(D*%=WNwOC-F&unzUC%Q{wMDP14uK~`XPC34^R z>QfY7>qnqV4p+!90+zs&w3HN4bOM81r@8-4If3UZTzY=nX_Jz+YP2!U%QW`UgHM*@ z32oS?^;@y|M&8eMvhBYIi(9zt0Z98Dk>;2%+tLg zcBgxqi`h!<9Zy@eSvIkZmr(R!K7845ZgoW^nm9m_Iga(1MKX|$`;7ymse+`2JU{Tz z1|NB`z8p;GW;`^7N|OEHu8Nd-V)f%R7FJ5wnfy<{wQSi~J)J`ttLLbloU;O2->bef zBZi0T(AH56YaWMP*n_yMPhSVfo{#>Utb@2@>`YbH5lB(r(!!SE@%%W-_uA_COyf?# z)lD&wE^&#L5^_BZI@_51^k z@M}(GCYEv>fauQePazKN;G<0Pvee^a?*C2Vq21Tg)^IW$ZgRt?$Eb5caJaL$?-(Z2 z*L6i*wyMQ*bQIzEt$`%cUPWtcbZL6cuaKNY2-Wl*pXj#NWjU@O-@!qd@8k7`iB;=r z3riy436WeFC=kTd)6~sCC@NL!msuf=F0D(ZaqRnYG+5QVWg3ZDr>Ry5hzyDDH-%r& zmxxe0m=51`q<_-XHEi=>GskxF&S}!zotv2jWnxAZ4nHiqR%QT2R3*J+-BYGObgn5cdT88yr z?EbI-6BQ+tPBkYaBqWVDJ6x3J+!j!0-TxQ;9?F;by}E;da}dig$$Kq~n@~1_n=KZ5 z^1C<;#)C4WpH9oZC&+|}5i|6-0$%Z^j7TBin;j+*0BZ(ZDsC*y%Qc&+9s9oBuVp&( z-g-HoN^<{SWzpZeRwIJgcFov)>n5=`DzwKcv> z`eNC9I~@TS@DjGXm+PbF<-VsTk41`)zQ{Kpj~D$OJ6A*$vemWyLn#G)v{h_Bsfz9l zH2X4YU7+sCdF>_vv3w6_=_lJdZW6>v(EksiN|o&ZNxL||u!VXy4jZ5CpA`_d#np)B zP9j}1&G50Y5e!^T{wqai=6U7LmfFLfS)-kFFlhIZU_)1r1+t0XekJywFt)!4He0h3 z)OKHxUPlg)jr@Th8w*SE)fDA^+za`3Ozk7c`y}aU?iWXAB&K97($dNP^(m@{aurV) zJkvmBwpTC{Ne5d@UW)EHPyoE&UC9uIKo8p4iN1FyJu?L58@27m-5+ESfnckj{MEH( z1OyHW&kua(W@fe{q}t4b!ln4&qjMUcT3}r0?(=I_zL=R-nQ_^y&AE5t-tW{I@2?1U z)W5j;maNof=*Y{v-y#OTY}dx^uP1%9jEG_g0vHP)2hbW6aF8O25qEh-`(Tb2P>~q& zj*x$#Y$$romtrja^-<2o$9B6M>sc-$k7WyWY*3r0Yc;8~qexNSj05?%Oil` zoyM1Moaj18tU+{u&EI<>IaUDFH1{2E!#0yxYY76X8`ZE&oE4Vc&=O&c^=hBwA-?Nl zF7XEg+Lj~jv~C9>JGM<<&w3eu*#5y~VdHMZy`h|$1N^+qfbhc=mMDfwFjePvonG1; z#!(-7+Kqvg9e`I~!DY^Mw7WGJgw3Y-g1D$*rFD(py@3r08WEk}gn~jTL^>tCD=S{F zDe7peh@~bAS?1r3pQ!KdU+#^H3roe!WMN=N@o??iDOp!GRaU$VEb2c1pLU?~jxwf+b>N(RV^+j}vG~ay>jPBF*TcVrl790?eI<86Jx? z%GabA70i$cXYOWF+7<98(^P;8?uGN~p%H5O7CW2>Zs-;LQBwJf1?=&kv~PbMxPQ^e z7(@*bkmpizq7*q7HTOX@=dt6VIDLk8&Ll4U3ygm|-0eEHTVr=lk96i9cE#~nkNThs z2Oyb)FE2siUGTZ|^z;~`3uVIQ#wFx8wi!}dt=?6KZZwO&viw_4Dhg3Cce>hK-Yo9^ z0Ok38`wi&6D-s=mG~3Dohyg(dZq@eH*~X@{e{>C|h)0|TxTIN2`qzTjdm2@t62foJ zUa(#Vb9gf@qDD*(({&s=oq*Utz^B4}e-&aQWTiJBQmeFq@xM zu2%>%ueZ-9K7+QGS}S8703`=Vuc&rI*l(FbATnr_NIf_}p4V}m$I0;>S>N~j!wuCp6fTKdxGY7N&R@8Ly|n{%QuwYafY9+K70>KBzO_2?@<1V>CP z^yc*&VH9q4pJSM z(n8>^Y1t}tbon~78JzxT$2h-#Y>O*;Aob|D5f<9Z0|z^AjzGBu54Ux}BguLN=TLc% z-u+*e#5X3h$8_YK)go-u#dvB)YW|BYnO@C737gLn1NUt!Qt9ZX+(^^qG{uOIn~>a{ zb02&YyINjPGP8p=au;oB;h%VGNog=q4Env}{$g4Rw(i2H%O6kr#n_eTvtpzpj{B)4 zx%EH!+#cFvl3+Yy`D|RwEZEEAOk<6-jb8{~Qx^Sb2GtH|I7yvOnXboGJ%N573~RVr zt<4{d7gKE{5#$Mq7Ls`=dUvv0&3nKT-hT}&Mj?k7a86}4Gj#8q0iwY#anAr@Fui(#M9^MSI()wtVY;7?AMp4hd69r4v0HJ$>8?W+PLbAi^CN|sFPGyoy(}A>cLf& z8nNf*OP_;`%IlJD-8#q-Q+R_yE*Rz56bMq)9|dxHTKJy zOV^)G&H8e25;wUd($4Xj)Lbbw-jnJ5?lAQG!XZ`*eS)tox|i#?u{^qM1Xnk~i(6G4 z=b%ruH3dmXwsqXaFKbjK1s;DVK|wgmR~hn>VeFb#%m|(w@JkroPcjho!wbrW}DNOM&F>t?#49Sv`OH zl6aS%%|mXiSE8+kqNPlGhwe26!oqbu3>Vv?YLhB#AJcNEpIZmn{&^0EQ1{(2CnFv^82BX3_JP>uowGVKiJ;Dqa&d}Gl#tg z@#hymzbELuYD$J2@-jBKh&X=K8=`+B(>X^mp$9mveP>NjlBRY%L@8mC#7k|gEq;%d-F zHz#1%K3i>hVhcXN@Dvp^Je-{q*r1%J72OXK`rZ$EBJ9d@a}Vl!Kbyq7aNY^d6*{*J zt)&e5LeRZOT7w0h79jk$TP9g_305J8&f-=2o34-%4E=J=n?T1loh|V|abL(PuGTV4 zN=Yeq7X4!*aqn(GzI~M3{Z=qi&^=T4S7$#SxmE3;+xs0tBi#GSrPK3H$Z^ai-P0lK z!!pHs<^5?UYI%cwZ-n%g5SD0q91CK8a8l=SS_-P!kBM^5F{ zJVFnWmiSkxmbKgN?XR=C`Nk_qtyg0&`kECYn9gtf-xR?Y)uDZ!c94X>PQDhr&RaUO zy2q!#Dlc#b?&`8#a&T+0^MOdT_#(cAwhOp@JOLTJuH^VA}&2D{Y6YcL1~}*gRZDAdpJ!_uL(X<>nH`U9yBWHsA)=XFtYRM zig>zi(L}~XCjAF(Y3?{2bPD0`Ag{Jd)n^z)wk2F{bm_EIb~^^czLZ#{qIX!R(>)o*phagWnsXDc^2RAdPpY3MDPmOZ{GLsD20F7TaobL;TMn6?3WC^S{ z*&D$NGGAIeunFV)t4V^ZeiLC3Bg*KovPsF3`qk`JbcTG))Fayg<l31P=zH)p>nINgjegpmu8X&nM=wBYm2#N1pM~= z;vbYKiIt9lflfqvG+JCC4)6*6$b+o;B+TksA+`3RS)K@`Lk+uQDN7O&VqSHb{D6-~ zMi!3N8R8?yiMzU!ijnQde5M5M26xtxDcj8f4Zx>cQcpoNGtt@nVQ1vxIQP|ahZFyh z!<>>QIu(yov2>9Fh(g(dk8Ti{zQtvS!Pd}vc2iilAA7s2M2Dh$P#;k;dAwu6mvco} z%vBvPEQGz%hCu?-N5ejB^3Mz5Kq-Y+*>@kSMa;tI(FMR^Y7Y<~-4wb@ww zYpVC&a9Bu(+%3V)g}OrsD4(ye4O|V^UbL z?OMYp$wT^KcQ(^AX!}S`S{oFrIzroe=XEx()h2)eml|!XMa<{;p?G;PQswDNl~T34 z*sadA1D0Jg7`4>sz-zNqhAg;v(Z~FOr4Gk9^-{@;JfYu&Ksv_dZj&+qQ~LeNbb7c& zA}xG$yKF-m``LzneelB%^u#&`qK6UMhiU0boy)^KGA?&M?>!ivpEs2L*byV#r*(`} zHlsR~^rlDKA)|2hI-QqAckXiu@u~9B|$%?*gfPoSEE{Lb>7fcJ0XWtd;Lc z!2(fsYhr+wM~5F(b=4BJd`bF4N(!(V4UO_RRknrK(hLvRta4Ub)KaZ3Tbo$=ZO2ij zkM2M1dY{eYtae$)xsyGe^Dw^6m_KTA$ zm{gPM1j%Drd|#AGG&Ql-i0%#j$+YdT>&t^ zwZuP29cuCxI}BN-ZZz<#l9LZtynXa8D~v77t;+98u_~4+F)V>jk2_nciGV3KrFfa# zX%l#8=E}-L)P++!>#3DF81*GxDHHa0;~@=(&l!7*`C*RSc%GPKIH)%mCw7d;uTPD2 z-BZJv(m)jCkBjUsqe8U0nL4;5jhw#L77}}j8luxUG;EI6*la(FfgfmiPk1KMpWX8@ zQYwp&KOs1ndT-lrQIn@(nnGDhr8(cZpCS|2WX55N$W|h+NHr|sk(tO>JHeNt}Y5HR; zINGR~Pli}MPIom&w8Z0K(zuav{-6`AD_x3kgid0(u|Qls*I(BZo#PJ)~x*#zO2JaI(zq&;&L zn5F|_R~@qF(`XQ2J5b~is%IGBF=kL_Fe0ly94$y$u8{4*zjnr`8~6qLxYa$Gz^jWL z!0kkZ?IqQmuuFAUr6g(GMiUjf4^*g46p4JOoGK|mss&&ych45svS_c!lfoG9N80Gju(k9=< zrGzV6OgyW|jSoq!=zXz-M6M@#^dZl7c1*9{2)9InuWLn&O54N4@Q0BFRASU|L|?Y4 z$Z(tFLxQ!)e?dzeuo=7jml3C2KV6IUYAbs` zUIZyrlHQ z2Sr98b%w_mZ=s}roq&vIv-w*k*f5$smW_b$*di%NCLuoldJ@WRl=LH%h*Ah@a&A|- zOintr?-r62OY(+i>vD`5CR}HS_v6fO=s4=5UckHxvM;)xm3x`Z>i460JAWM08%)V} z*_xftm~^ss5Di&#Ds<}bvbu^#_jnY!?TV&-H^+Y;EftHBF%Z7R>`fsk>*4PSwud5z zR*wygIQ1k8ZE~ODH+)4&2-eio6iXDcEhk0z5E4OU6M^X?CL>Cn!jm^#wfNk%{`7_* z(265iBsO39eT4}_P>}<|$1|x0x=fYy+G3JYG;kdrBhH(rA8lP;coZ08`r)jBS^)GoqB@mAhZ#d6pSGP4{$9K2VSmzHx_ ziX(1am=v_Lh&Lv-mU4^*?MhOH>H9-pP5^Au=nE5El01@r3T7yUJH2*k7@w>8MdPt} zv!5|h>ey6f?%%OZgvvkD+uo9IEkagas|^QT=g&GgME>!D4c)#R*6_VI5LK^Op=86| z8-rQnA+l2L#S?MDzPNvR3r!&C6YjG%q6S-RbYT!DhYKU+>y?Q5fp~5jOPe~D<0g$K zVK?|AZ=}Q?W;m2 zEsB2k>CGQ@i%K!4x8%~3Wib%VYqMlxiApLScxfk2L53=3Te96?%p~|{sJY{O3volA zAF)P*H4VhCUd`E@E?^*{pYMu(tl#{yeoMT2BK?(7K%gsj5VF$_B^tR-_gFD3;Db&S zDD=kkmTt3GPcL}`k&x@y%L#LcQ2|yN3^4Aro3{~W2n^|AY8hh1^4~Z%axzG5Xk9c= z<+sgwn*2fw4YlqMQT4L5Wx&YZiPAkS{Z11xLKlUF5gie4oLme~Q=u6*MNWo4EFzmA zs@`&+hrB1R1{o2FDdpYs)Az|?;Z+PEEyB7Po{dZ0yWF;{DMJ}`%(@LaXf4&(;%L+Zz_bn89dkQY}NxDMblAm+d0X z4Wd2M1~L1eMtUya%NSSe2fsH;SJvaP{ZLaq2$pa>>XD29y()uuYXEJ7OnGtjC3^Nc zyr9)EVMXy<9_&j7ipj{{3`-5ohKcgd)d`jRb$8C#wM*mw!8Eep@6_D{?gGXOzdani zR)Ms6`e{h9#@BuH)@rvsNc&5b53PyU4(4=>vb$N?fQuT;uROhV#+g?l-xwK%Q`CpAyU%rvoRN*)4K4N{)a$5#w&R0dl=lt4GP|vK_8>V$lnHrKd z3FqVy91cs7L3%EuDi6LHB89=P0q0?CyR-cs{sd`?K*5N_nravzJ(G+wBX#{0I;!o9upo#A{1}#VEYr^v zBE)H+Xx*Eb1E@3kE27~Pxsi}C8KVQwfuwW?+e@71l-<*&v*_cW8p+x(`N{H3SnJE1 zzt3M4V_r9Od;^TSf@%hV9`|-(?M`7ve`H`Z{*&flU3~n1Kf|R=1}m9e7~4KW^CJob z{O6$(>CyvI3yAXi-iX9_HT$G`5YO~Kk6x8RWgsbOf)E>oeV6hO9?t@Z!6+W%2GIX` zp8a|1@tsFGAPnFI+wMUql9@IQIPw!7?*FORpCt4XWz55$Z;Z|h7GuoE|4%Km{yus2 zsx&Zrfgm1$DZb|0A;AZBogi6W5>Vr6nF5viO2Tkcc(}hP#`zl$dvT8NBnC&>W-SQ9 zDw0(Gy+$gk=({^9>73$z$%T0q-v(s(ZcqCLhQ*7=4kInSv1KGHO1}ntT^#ix%H2xo zL8BvJg8f(R(+U@X?^3_ALKfX>d%N|sYrnp4H&B>wLia(=EqZoJp^JgK4=5vVW{nI4 zue(HmUgR1*0_`;X?j-e!`@Zl;nX<(B zH4|CV=X~yP-g_D{dl<)`eWWb*G#YpkH_O2^sy-)d0{y>dBji&h?r>4oeZO2IiH_)H zDW^Mz1B2<+?R}OX0RGh@Xg{DpKf@saz5R};;}JazC;wKZSQsh?dj4wwW?nIG;i2fy z6!p2((hqxXodZUt{LygaB|s$3Lbt+!N2iS1obR2w*I?_Yo?P;x%bhxpkRFeMJHMG? z^s3w81mxMC7q(bS!&ns%zAgg7Gqs@8)8%$`p=9#lMdgf@vX5dmh;?!AE}`4`p}?bo z&ev(OERRxP^iRuvTY7{Ux%$B~;OUms=hNQ(OTY@YSoxKZ8(NZwwsBtNX&YEvv+~JO z9?W;XXgzYMH2-<1(c!Eppxv@OfuNtk?gQW+3a?WjEHBF}N{+gPwA^_wm=;sSa zo=$W z<6tsG7Dy4V9Zg_D zjMoR``pPq(GT&BLc-74@SsNA~up#%WZ;xu=0o$^gsKtPHPp~sEx{Mv8a;lzD0Ha6? zHX(kEV~A}v`{G0WHS(PM2bRtW^ehpZQY4>z$e@SAcNSTuz^@umWZ3B3NF~ zNU3%g;7!WXD`NuwL)+AHp$+@?0mTwi#EeixzirW&a@S*KI#}r^5=)kiQouSOP?T&N zPt8i54u~p*L!F5pnh4*cv`}>pD*3brPMJKkgF&pppiv%G-txi1C*YexLf4bnRRv)RE%|MW!s-nsee}bxMkJ8poj?G|hEb+feDe+QuJ-dStu1c7 z`{F@k#StOvv2TZBM&S6#q3Dp#GPJXRo8PJ3SZTmMh&8GV6Y*Pa9d#tM*gtSPULM~}XFmu!8K*V#~qYG8kdY!4j zngT1?Bkm+sTMh=+bH5$~A#v_F9Y3gv&*Il?+a73|OUq5uM_X@_HP%5JC@=TQ-#(V+=z^{D%?4{J zes=Ex!kpw3)U0VVFw5l0JtKdpVuM74`<8*zFAJEL2bblI}_ zb0Aqto|FdSKI~!c<^*+#jTw)gAjuJB02DP5-ON|o_fJ2)`WZSjlpLEY619nxv%iN- zXwoyEUb-WKC~3Z}{7`>|>xADi<+cmqAKSjWa2pw+9of+&1KQ+I`X+-mXgEqM!%u*K zdWgCKPm)`dZTVPR4Bi^-}a#j=XRep{U0jXlH}XqD4SKYmoW0#GOzCZ8-%7mtE#xD+J|3 z1P(i|%YF7OJsqMyPx+b8m;+$p5Q?xzYNR7T*hq?F82gQj!X1uIOaeEi4kFs_*p2z#QRq00cLS?o2~3eJap0TU>9 zZj->~5^9T!Kb)mM>0Lm8sHIF=PmfOQ2Z}8N6(aUSp`q{Bxb?8KsZ1*4!v&k!S7s4g zG4k=?S~tGT?`?5VW}vj9#t;UJXxCfx|1|U~+7D={Vl^IGkFLz0_Ad|F^|(@Cyx-Mr zWUo_V1xPp_Twb8&L|*EsE|eqZ1fpYrrW)m`S!sD)zS{LtP|M?TGBQ%rmr)s+9E589 z+j%-`eKnexx{N$5JTx4IhjPD5+VJ+%m;y-8j)fkuQF7 zc5v5HKERce6@mdumJhE1k^#5gJR$WeTuM=WTQ-}v>~4h36cbG?aOVcB9)Hreu+Ugg zZfG63I8;jsweyY`{ysyA!BsXgZJ2&_7Br!V?4*#S{9y$(VULi62!u0=shC9_6U@d2 zobWLct3_;*js^b+Cjd$4W~T;rwHfgk2Jn~2Gh?SlY8Ni&G;csk^@1hO63Xz+-sLpM ztxWkm#g+r{g^?e!HqJ@M{rm1Ol3x4UkC;CG;@q{!IT^lRlrTk*S-~(Yb(`6Iv*C>t z-mvmZmLi4LQ)%!i6bRUm-+?y&P!)j+Am+Wl?w5h!o_>oYl`6wu)|i?QjAqW`pTc`T z96Ys>sHuAMMdzzX6hbEgCRrnZ=~;57aL02AW=wzjA>XSn1{-P=fr07NXgR zQceeKnpJeg4}VBk;>^(d1J2?W%xD_&7LfpF0cW@IY8Vfn!^xf0rj z5j)csycxqvLn5*!#nAW)uWv>EzHdoN@Q5@Z&*RFvv;P&Bnx^;@p-7c;TjRbrEEE{d z$Z4}JRZD60c*BwDN$=lvh9)qfkI~5*7cTj0pZR1c1l>L2FId@y;_S$ zNIy{g{+4UbqOB!_{ERZ0`4pW?etc_11Nd1>bslogjfa2Y)`c+ofDyU}fdvk>cTDea z&wpeVi#gB@vaw+c`uCn>rbxvDQ!JZ)2?T6p_iTOBAiPd{9YLc+?Vu+2TwFZFg^69D z8uK@^Z#*GuXH`^;Ra6Z8+7oa2q9w!i>*J=lXp81Bf zgO+D>A}Kx~CN80_7N4jdUl;nn&q!RtRW25mLLKFx0uyqxQFz6q1P!Kry0^V1C?%E< zc*AyKyDn!~n`dCwYbAqGz-AxjOZx7EA3niJ-m(H^FPThAz_*LJ-uyj0mjR$W`*cs+eUUdwX;i4YJU$A zRhjVl!_YpxcHFg~JNV=-% z#U^z+r%vHQcETyFfzS_X4gsSXzWCJ84Bi!)Fh{;jG{=cp9s*9bBL`^=K%+Q+6AY$7b*XaT` zz86(MI|mTcs)u1Yaf>3Bzu94buDZgto+E>@{5$<$p}Zj@$6>cns1@mRqYqGwC>6zB z&GwzZ!rFoj2KMC^H`60UO-G=IXI;4mR@>xHSlucAcx?Yk0q@{KfhHWC>80f9G5lqI z;p6`)E9U{Fw)&E|z7leuU${rUcY*t#eJKDDF4W-@!De+yf5X>{RD=b)DHt$4HNXc;X20hJABUrN!Ue|I;r@CeeLAN;ZX%fm()lIZ5zpr07){H`wX?=4cza6AW^Eh%%(gRL4qcu&n#Cv4-l3=-4@WEhs3t z_q4uLLl?f~?3qIwcYGG6D7Ynvrylm>K;8I-y=2CX@61HwAb!7sbMq^oHG2j=u-$h3 zQ_tl7;%OX5QbgN!;n}BL^*zy#&~@RZYObi2?S-yN{BsCMB~6r+;bCE6CPe8(%Z}$& z!QzsVmsJHOCNS^uNK8QBvRPbmGA5<@ujB6PT|VU;Q$zy5MPXF5f)N%0&j%w9hjw*)XFO!z-YEy$k zryq|A5H)K&o{=@K3CApdU=EMtaD*3i{pNqHYJN~COl`C6JfnbCbIVX8j)J&Yhs~Lq zn7r8UpuJq1fsM9=l?}G8Em)gux8UiisgFPe>vseKQq0D5mYW?J#Mn`5^%k;=l^N2X zhti~sqTdkXi)?v6-U>bq+% zYW;D)GZ;n49cv?ipbWBEb-6yYC*Sn$hG=&oqgDs-LDtsRW@cslOWA6;MX#3sa^6vr%L!AuN~V~)`i$5Om=?uMfvO{ zXejYPo(}WKX$AGWPx4JZ%QkR}_Cahm_+Aihn~r6)szQ6FC~99WV@Jv3eNkUm@xUuZ z(7)WNaL&`3kuMfe5de*@RA$etqPAe0c!}CGasb?hSz%3D;#B?aEG@{cKD>((jPn}a z+dgk)-(=luw^OUi)Ce^;G){GQ%KeCSH#q1sIM}K6-j9?vYpC13Ed5)gY=f|^KS^r= z-~KGODD%fCtR{nA=v(JsPVk^;sor8fX0fTZgro=;FMAMKOweMQ4%5}WdUIw!tXyy5 z-G0Y}WA-~=Pxlu0p<>Z)M6+Gf@)8{~ZvMu19N`)?x3%xj%x5RU?Ou3xCLO}>b$9DH z(vym5c^LJWf|(ORTxO2L_?C(UtaOyDPw#?Grk>soQ-1jRt`_*()2x!0hexUbR<9i; z#48?m{f%5Z=TYG=N^@@GxtwTF)52zik5Y#u!(p^h4s=SwUbGXIhOJ>79dvRj?LC*o z%v;wrX0=l(xPhlTs;jM2IlXxLlsY#)YM9D9x*Rq`tI14$y_9Db4V>*CF66sPh71}_ zujSE$VlQJq&LQkw9bi$68Zlb9t^~$UzO+Az<&RndP{fM`iKD!O0}I@ue40=0MGUFr z(N$jv+O;&!X;7LiYHcX|)m7oRnu7O8zYY*cNVhY8U@i(;0P7BgXsRYK_h$na&hm*08|`C3@h$V*j@jVb%N(`ZV@fz z*TWp>vFJC93Z9?QgW&mG#@-ql=i%?GF16eLjLv(f{{7Hp_DGdnX~NKT#d4~ko)ljr zKd0+^b6udZVQF6i?@5ry{d|mE@o^b=qbKv*K@c3;H8fS#(7iU>j>)iXO26_zS8;A zR1V!nvm$WeJoahl#flH^|6}Ye!{S<^Hf>@AcPBt__uvk}-6cry-~oa=H16*1?rsV0 z?(Xic&1_E2dFT7_&0Mp8=At`$*Y2uXwbt|83yx`jEbmV}95Pqbv;Rgqc(a;>xj{aX zMkWR~H^*@y_@=exo9ckSP4oSYjy%b8>-~;q6yuVJG$f;hkPcOOmGkdkD=K4udf3GWgu4_Z4~z(5_Q&_WNGM=HK?h) z%HEpfzhaUto8&*GTH)NU3H92_1c~kXT$pZobl6Y`;S5a}N1-T|DlAVp$qPeU_YtaJ zKdkC(#!9L5lJ!%b!-t&CiYW}}hzngbWf3j&Zdfv{E7VEVE(Gf2*d2Z$oXbL+e}dp+ zDdSsKq7Tn^Hk+YQ58Gw=JsJQ6QU%@b>sK-;OG4PME5=-*hV2Dac;<#F6qkuo;e1+j z((JaN6d&VTFx$?2NDcTtS-*G?4CfjDoU*82`Y{)|VM3id-zvI)D~D;@g;&pHlCnr$ zy*r`8Bo?I}<($>tc8HK?@BOVtPDCWqFe;hi{$%RVG;+zjBONT|V(m463g_{&#MZAX zyB)XFrKx3z+bh{NUubY2mz-sTF$<2TnOZ*=beh6$$cZ%BGoN$_QpHhZfhc5uph6fg z(`sU9ICtI=MY|pYb_G9fU-{c0uuuKT9I2HJ9hOC_CBMgg{KhV+YAPWcRhlM=B~Msj znB`&}%k!5F8b@!L*0RUW9KJ!u*(KL}tgohhTYxqRM=6&g7HHiHP7WeSH71fcX}d|V zS3XNZZl@&8*3g@<>q8`TSF|R|0y`o6qMZ29ulc+Dn>CcRGStJ(F=cvo!AeX_o)n(v zKyVjo&C%Q>cNSNHAWoTm6THvF{hQ1czIamFNevOo)*GW76!D0k^Ww6{t%-y^d6p$AN>};h|+?8QX%3o)<8Rotw)cLpVwVnqD#F9UA{-#>EX9@ z&2O0gFBgz*a8fjT1{+lxb&*+|^+5gwFxqoUg^p080&O9NIYEGGF~;1dNmeC36M-vz5skB*&XSVxAdqgR})=H(^FzfqGomP+Dm-&m)Le~i-grg4Ii z$9cn1Kp^u|^^HFqij7ok;jaL&>aFQQ4x?Lc(OSM#Y^Pln_lOEf247lcKqgTnUWiGP z>J;-d?lit^fAM%pD=qwwPw^kJzr;knRr1QAcHB<3-9!k|%awD8|CI(^h^K9HTT5OBqs=V!C@uV!aGcVZ(;>6@E>O<1 zj8yw21~ER>$l6Rqv;NnZ>Py)if6U;TjwC#S*G529=BS+D$0baKsn`a$qZ9Vqh#bOA z#QGNo>B~7nbBQX3pPuBK(Yi8@8dyGM zbqQ1SeWT^>r^JJPQSE>NybWCTC!x=!xf8JQ;Xmd`)-X&YhuSHpqY4VB3V9wf_jmJb zf+SPjOW44?I%?~noh^Eaua;NU7cO35eMiW%w6PL<+SYQBA-^)#{b6BleRK5KG1(3J zz}0K1w>@Ea!_V6V$s^Yg>UKv)oa+;jpx*7}rYNeXGLkDTDd; z9Q>czUl+GOIwC5o_)JB*IbQ_7F2z37@sdxJT5fq|+opV1dG76?yBXixf<7b#n zjF1d^1ZPO)A@rF>3_0%*P=6_^i?CFCI?W|%?US(^92R1IZV(m=ZhT?$CttI*3bGD# zEg?oE;B$Z4l};8f9dC2($_OCm>F=~@fg@maoRnq*7Bmm%n?%``OLo5pa6mCMOgDC4RsiM2Bq)WJ5z4k(z zf!~r49X<6SUBOrXOkuIc1eV}Qd_wQ0gsmS^7$-_f#1$gv(`fZ}q`^oQw=ZP~iGN=N z6FD*wWXuE|^9xh7$&93R$?>9ngPl- zxu9VgRUOOHLYP)G)gnR^$mukKF9h9xWt?{7$F$mDjmky>`K{IOVaxw_6(A%)LRlwt zLlXqx24zB6UCut3x16As=22P_hh-+L+SFY5JAWYB9FM=WS3oN_e(C2NK zUB5+V?ME7^ml#sqS&jKdUuY!8-dMNjX`$M{KM2^{0E3aSV=cS zOe+T{r@ky*ok0|wi8;gWqtWh&p`U1jK1`GQ&ApitcvbL@?6!4r%~&#`ybi#@D&K+k zmB3dUu{MMIOT(Wb;2N^i92s)rW9+f-%yHrugUg`3n?vB-Jo+McH~uBR!4ipB|Bb$FLcRLXDD z38KC!ZZ|4)y^kXNt~$E3SD#5Tu&3;hw}p64k%Rs|Ht_XDsFLjh_me>76x7N~Ac)!K{ifsJ5*Q$Y(%on4Te^cESQp!A>B;ET z!b$>$OLMGFx;c(^GAb#ri{-~}pktO^ZbJdZt-(knvHC}Z6JrQZBxrz24>ZTUCLhIk z)oUTW4;+Ut+na57GL;0j6il8g1)4H}MGT9DyjqLf$);K-Lt!`wq%VI;*?zF;NWF(O zZ58Nz$~t>}G>5B}8_og&04~N4Ps|by{27ebEEZ6^iP zRJ>$hW2CyHdMj-cU3ENmxUj^NBhakEcx9H)v#z-4DXee1I8s-&r+Czj$YT`m(2 zZqi+h0}OtHk`lHaEA`jgADkW$lB&0bc}}nK@Ab5Ln5)$pmMVUVWQXl@yB;MI%<^#f zc;Sd#zJu$Rq4=Wp_2(gc(!_T>pjHGWW~%Y+^>+O<#>MO(mdg+8O?!%b`goaNes-t# zvYpJN6$^OBXuE1u-yklJ-=YW$O16DK_Y4M09kB4g z-{&Fh#r`rBg#p}$eVR={UK+AMYF*oBIO5(2`})opdz(y@qo+8%ZYn|~*w`)+aHaKo zJX}Tyumva7OtI3-q;j~-tnQtjukv*ZZUfG@uN;6q5_*q+l#i=*7QHpWtbjX~QUOYC zm_5DQH}64q{v-o)<6~>a8Fix0;u}~3^ATOUJQf*+>>l8^q+=VLPb5jHZiZey+dV-0m0__P7^9vu7DMCfA#6iGIL`mxIL`COvb$Cx{^(1p;J z`3kE=-PztRLHWP?3F=b&=6d)`Mfut(>cQf=IxSE8x;uAbE-(DW*N~+aes)fA@&^Rr zE(U^CUuJ@xo7$h3v$-5BUI0Jeoyvi@VuDw2nuZ(p8V)e%5H#Xa(v4S{i@ud~1_P23 z)o~uXDSjm$!{w*S^a_>Nkv&|khPSfxL)3%3*7N$eb=Zsz+EQrUGBhlS%v+)G-}FW@Q!~=XKz^f$`oLly*`)@wpwJWbi-x*`K3{Hwu_omE`yzo&$izK zs{mH*4hiS!-E!A!{SuHDfrf z$H&!`42acjFMknoTC*y>X-v)FBxXXcq4LvaK2FXgdv2Gyf(jtbL1zO7e2Q$_A};Xl zk7=X??h)sTko1=x;ckxe*qw?`|}RfY>}t0f!vYDSi2bjZXb zFxWM3ZbSN_nzSUEYpfo_RuQVgl9Y+nS5jFL&Y|XUbPUQ&Bm0ptdL9#Pivb^0%69AKH#~ z_4X?6ev^@UKKdhM3EuUtr+kAKsVA~z$A;%kGLyKZ8HBmDtT#k zn4bFqaeM{a>VwmU@p*>DDpyS28--vXQk39jpS1o(V*LcgH}*TI)DEQ zhRDlsCvN%&yCS3*)#>suFyrQsMnVk$|FHt(6_iEAUM}L&M2;+5o7GC0PxG$pr=Rf+ zTRlr~Vktb%L{_73Dk(jz;-F@&_AiY}Fwwg;V?u{~fC)E%cKWB|on*UFMi>&Xt5&@p z`ljsbb@a!E$%~U+tIR1Cxwh@0f1qBMisSd~2>c1dYpbW9UH-{~9qc%opy1y4#LPs{ zKR-b>Zk0Fkg_L#IC?1-!sfF2?)!23Pa(}6@SXcC*DjGf-reBx_8^R zVXQC7j>U8+&yp8C3{@9`E`n-{+tGc^CmJZLz3fRy&7Cj|zHR2_N{MMOD|^Xpy*kK< z3kyiNKZX5p7(lo_(zI!;A)KxD^0ezN?r@#i(DD(&$-}vI)U`jE6OR;^PG)}^BNCDj zYG>bPOEWqbC5T#!kwjnp?1d5_wTC9=#PnDku<}_=g_wc=dgi7ta)(xz1lT8uMXM3| zN82ih=m_^GUfP)R1U@MmV;Ej@yE5eCqHxt%uwBFz%wfUA@1UP}JVxskpJaL2lIHG? zq!M4I*;Z9Ce`vef-sVN56P@sf4>FmGcbgk>~iif*QD!u(UGH^sfNFQLq`yMLLncqvL>EH&1 z2L#!K_@6#Aj@?8_8jU_A2SoN}z-(2HY7unwa3pClTGC{8N)Y7CxM-|5IRNj zdHxD+uCq8@Dl~Imys6~i5EmEM{M|rPip}d87uL}`AGDt8R~;c~hMnkgq2%P0*y(j7 z!%+~m7|XiljDW#rjHfgVyaB&2fahsbr@uhbTTw=?UDs7f2@Nm6gC{OpQCsCCqA{5O z@2C3%BQZy=Q)_|q>ozAM>~udvz*_NhyJ|J`$6Vcq4}LD*H*v@Z_DyaR{NVLC>!cfKc&>YRvBO(6UB~SNz16J7)+hIbu)enn=)2<8BXNG7 z%E(Pl!RGSk42$qyq93#zk=m6?sr*Hbnk^C?#{QcNYKrGQ z@mq#`KZgC}`u1=pz_{e{^Khj^`A}V1sHpbws&~U;X6v(=?%*Fcz+XSZa}UF|p#|=G zMwl!>0m8+_7XXo~-dis%%eMo5tj@ctECADU~3YIMQRU( zA%Xe=V;VF;N3aCyMcXOhU9#q2Bvy~^>XRCLPtqUuiT7wJv<~P8XvO-?nmQu4ocI_p zqU5n!{pk&6!pwyi>ygF2>eU*7)BjA%%=VRx#R3H#{Wzk1nbKdyM#w~{Z1=mh?To;5 zNGGC2yx-#U)_Y@EnEh!8;8#paD^1&wJOn@8=LtV`4ZXX92rSGpnt}?=N*E>- zv{WlEBUM2gOtUVcb=dZJ1V1EZT2Rec)8`IW#H;i!(|4~^kY}%oWJnSf9yEFP^i%sN zc~k3cXZS7=?w+87FE6X(N-fWtbws;+zOK^ z&40)kyleKwq2YBhT7CIu%27v1M%H|)0N4}t zuriY;H1zr!ZFkEI1XvtD^yQ-OZxbtAM`a<&SjNqz+Q^aCQ(N?1f1urC*jgRh zq$QMoh~sJg;Iarg&_H|P_#Fk(DjBK7wGqj{1uUZ5lXNBLE=TJ1X!-Ny-UUnUy)SwF z(aQNjN9gG2W{}zF_sK-tpp27HAhWUOaAgc-L?TJGURMeG*&zh!{NjJSKGDn?aI|#bjJfWut3{A zhUqJu*_!cbj~B(0@I^$L`yg4nYU>3}5f5hxo2O!cU1&bhx*3Un=zhN&pF`Mx_0WAB zUKJbB0sO)KS?yA|6L_mzS69C@4h3@FOv1sDCmYdi6G_6)1HfyV8MoEpj z>med|lTLSYYNrsW`GO_caH))Q3x#H|^%W3@j|h@xr7g}^ z6B85bN8>7fKRojF^$)|Yi&`;r-Zoq&d%194L zVRV;qhzU0Ao0y$a{K@sk9FGX7lNq)PP!n_@Jweg~;#Y_R23L~f?RcGkk_+Y1hrdcl zfN8Lnl{H`6Mky;M!P0(Gw4RKCuzE%RaQJwe-{=)qfQdS7u|W~k;xwOZFd6M&wa{$V z`XimGf7MoQ2)q$xu%H#KcHfN9S3SPv`eG}r%ZMn-WE)mL!`HIv+I|>uLd26_t1fzcdWFI2{kG!X+AV!Lk+kLzN`M%BO#9bGPTIV>vib7i**d%##&QtCQ-=x_+;!mAR8`yYuxo*;D! zAksVnfc}fxrc#2y8$Uda-Y=#UGi7VkvYI!2THnA-;aXo`MGr@STUDz}h=TXt`G!nZ z@O9$8s%51Gn^mq++&D|K8m_MDBajHXc28J=GgXJsGM|L74UqQ4Xiswda6X5`F#13jJ* zl10u`7bxx!)odrx{<4F?cC~@AkRSq0$-{;F^e*_)_LlA;#Knqg3aPycv(5du+MFfMLyBEPD_|OYG zDmF(sP`x@6OpVDNnm;5?2Z=Y`yeqPDXgpR4o25_`6&1?l9>X3yh<1;#VtfBGQ|E|ao9*8>E? zfY;T{rEp!WtzQ>%oIky2IO2870Mtu|l|bWnqquQDlVRc-UI%seNT1Rny85H(K8rsr5TtW*bbOSr4@Pa=xIb^+rNMw5u751o5jLp~REdfIzeDe)?!R*w zHaZ<`bWqQ~Yh6&2>C7K~K<4GjM9ID-{B?tVrPkv@UuX9(1dIW7u_X{HehXBEzvz{_ znuD+x$u!0WRXt8hTb_DbLMXkT=>7asAG7#86ya^k(Lm3Jh_BTqLP9;*PfJe`Bpy-@ zEGQYVOukYE3fa!qK^NTrKcqWGyQWmu&X42iDMUL1gE%_lgq1?ccCu|3gU#vWI?JWj zs_AU{g3g25^gJRSep0c32W>T}*0fcDoS{8I1NkPLNuE%`?@P5h|?@3(jTOPtotlTRW zSFP~5W88l3noQa*>JaaEKxb$|Z41a?=z{}+%jY}KiO0D$qmAFX?{g#&QqJnc| zy7qK`NzQC<4!-2>u4dwMxQuB}U1|v?!kgGFS-zN@x_>$Z4&F_-$Fel}B0XVRzryRa;NiNbUG=mgk~p#rI^89*%p^q=zzlM%?JXQAQ*l<(x;Xewx`M4k7l z1N*l*+rdqjj72uiOn5+m+>9f0D@W&mGlz5B7q=Nq;*lAU|uNUxGc|=X+YPl90 z{fDqKa1y6XTmy(@?&b_4M=l6nzLw^x=M;Fp-Tj#QgFHP zq@Sjc-&ZDFk)GZQb%Ub`)aD(xm{xPU#Z@@z{Z*bk6FsGrQTghY2GG<|WjXWB$V<(g zo+c?ZurXZ&#_$$^GN-)l2K8U`lBw3?^XG5)lCJTeCBM=f=bvfU(6D#0=&~5z=5wX2 zyEA@D;51HiiLzL~e={W{9$z0G6iWC;#dWJ|q#ncAtu4umpJYass+fYF+fC`23{v@m z9v`{)Dic<;Q$%{N!Pm*y`wX{c{8w5-mkL;1kY~t3?IkfH=E&q3v;g1nMepxDA|Aogdf^eCIuaI)bUf{V{ZFts&38xnSWK2e z2)?{bQ9f|!>FeQzS*mta6p8$E8*;$`p+Q^@U{`f(uZPl|54uw3Zk$r;CV_c`v`kP!z2(hLdhi$FUN4(oU&{hnZdjo;T zlK?NLA`8{%ybZNtsVOu(s^bXvx1h!Ys$5)o6_uNE-&4b<7y;6k(@I3Ezi_yiSPJfA zq6w@p(o@_snj;wVL}+^34@TT?6)lLmDM3=OOk(GDkNzGU_%eBNG|tow<9azab9U+q#PXc zxOUZVFTTvLdW^mfw%i$DngJY-%lVdg9T|Y(Urf<>mQc!Su}#3|PHQnF*u6~a`534t zY>K>6)_y(`Dhk8O@_TWeKCq}pX;yBfa_GmtkZSrzFg2bu32-?a(NGSMvxs5KJPxKO z7OBy-KMiOvI^#wELf&q%>Bh{-ZV_n$X@K9dqiaFs3VES?(=sEZ>;tNT_nWcSbhm8ehxGSd($=%XlS=W^=!IU8tiMPoY&R)ifY}gxH7YAhn!fed+NGf% z5j0B&B1sizrD1SN2&N|q{7aL^e(y)V7eRxS?e)sg@`e27gKam(Y|RJm{E^k5QTM>T&-ip8qa zQ)z@*O&r5$(<%vSa}Pux@DcK)4m2A7@!rJs*m|f|A1yWzppZ%A?SJT%1?}=jy6U*= z_MI`Kv==_b{W()iTWG8nIGj-;w^6YXp2q_;0{q8>z=~>@-ed>mqhU2hH+1kBNMc7U zq3cQg)=x4MX~E;F!$$dau(W?PpGD6LRLpW>faI2WB44-dut-ugRWuWcwV*@I-B`I-<&3o$_NR^&yagb~U|B_NP}2x^mg zO7C?7#~cCK`FLYOE4#!%&!RBi_WJ{~Hu^wQ|E`h5==(@mZj>{UBk`4B>5=KTzkNNs zAjIEJkZ|ojswfjZ^H2DKLe=4!h8-!|6cAtQt?%Cv#EYd1!e2P@-pQ%>xUOm|rrF`+ zQyRy*ZpZ5B3g(YE}2Yuza5q%b0Yw+yk}-;H7@){WFL zbh7trz@QwpS+S0X>>086eNKazUn(^{Dx(sg{5iZ>8s2I{U>im{w?Mjab$Cx+&Qx$X z{UDFDX@r5cyAfF|2WxJjEf}~HTas2&Eb2wQHGY5{X!E%G?T4I?RIAa})vrHioSE-| zYD|#n9SdceJKnC>A7K7<;HndX^oXQ*;ZWyG6v<#q>}`qOF@Q& zXjst8H+?WPG_>KS{8W{;%zB0Jzy(wg1vwW4E=t^eAQ8F0JiKAm_^RMEL`h4WXjHXH zEGWALYTyrjlqxt7lZ?)d@!)Yk!kRx6l#;t)6uEE!ct$+9Ko7(PNkqZBbG8k)p6&9nxqD%~Uyq>xBFjTIRp( zUhFZ&;BHeMc%`FR5hPz9={o&t%Qk1&!h*4)2w5i6t%xPwepn~n+F)QTW!ay$eNc?> zU`fj~&&fs2*U?M>-@(2u!d_<+gQ;HDa+p;9%JO?qBu@;itjTQStbKe%=6w)-LmH}) zRp(`op$`mlEfO%uIL9D?2c&^lm-|)!!RH)`hW04Bw-Km_!9GC5?BMy0ZyEz zE52G?2nYtd>L`z7eTRngeXdgVb0nO^^;LQ0R%Xb~r-mtH()E5ZwDU`JQbM6bb)+T^ z&Od-qC}=9$hL>|RC}?>oii1 zwtCeTXK^-|MVmm4bncY$RyU;Uev4Qo`R6>DT)y)GPvF#2P|N;+#CZ?MNT6^>`2j~U z$5E^s)FFQ2#~Xl7Y=5-SjkN0V`}fk4=0^|aDzkI>_$RaIo;QBb&|>Q(q@(~tcJY;< zc}YUSM6Ke+xE{C~i9`fVf?yzm)vI=P=2e~}nfk$a+DK4YwcXw475qqz4JS0nO+}@V z!UFBs#0dHmpE2K&l zFko-0RART&^5`7%8TB2d()&lF&VwG^Vz;(Z0N_BWg{6F%5U@Pfec<4S0lkNd=cyb{ z9&gjs2pIQqT{3dgjZCEtAV{5%lgJBY-%f7Wk9zE|R!lQQcnUD^Caxp|_i6U$Qql)v zUG9VTm^Ah7i^X^-ce5``HCb(02951?m4npbgQ7S5QBjB3Uy`0;y|9i34!xKt$3?Q` z?%AHN%dh%-QJAIgqYc$kY9%Qj=Xr=J7^kuNC99-f6EC&s08NTA?ZXA(6(F|IC;{BY z=Y&^N)&znI$Ohz}fM9IC+BJOc9UyfCit{5bkt=t1*&fdiZI8w}*Y!YHH}tMOVn`7~ zX$(#Wfy@1JnCgT`O+}>+2sKDF`o20H6@RjQtDWE($0or~bVF%D^`VUkluVc%6Y?H+ z_57>Mh-$HlrtPs5tpLy@_HQ2nyM2qrk1Q%Pbf`sYD2o#4!wN+|26sY%__9w489d@$ z@A23y>cp+A73FT~$m;}`%4_&|a7e!xThY>Tba#H#KPtPMyyCL^vZMt2Zp~Xj@8}f@ z*%d9y$~4^>Dv8;qj1Lw~F0egi*!Ab`E&%f1h~iKa-$}?V6S(4gqbEM2>Qoq_VpXA> zyKbN|sU54G)p0wdxyj<^`2KLmoCE68eumnKTBD zUYgv;z7J;*e+JGe0HTw_i<=-MCBY!DMCz;B(GRijJv7L}wxd`QbmS42Y)5zfRk?m0 zbE&?a;G(p>xf| zvt_59jj6o=zSeU{HZiii+8t(Hg&Z}G&h7Ex-9asE%Hro2*Kz=H%0-Zh`TJCdJXV6v z)$ntmu!{Pi^hG%_frcNfku^_59BjkU`)TE9OVz&O*nmKh?hoJnGqa!=`)PsTStAIb ztpl_+4BhKV)cCo9)3+2^%WlqJ$~!ez^VxqWDVsI~m>xN56D%xEw+ zY%u>S`T6`oPt6N3z4Ai^)PC9O7aO#Z)z^5nNKXs>mzrMMUaaRNxO6)YV9!I;Vh5OU z8@k9JoRl-1i4wmp0xt76d>8EEe(M3i+cFWmj>W{NG-{gv3P0!wd<_I9wsw2rh&lN$ z7&A^8c$W>77)n{!I^I|a-BybTf835&6xo^}Q3&X%xVrrl@Bz8nDHB*i*lDY?jek;e zNCoYr;`l)~MoDs>ECy38&_%LV=CkA^4;2f!(SD_SI--{_S3#~Ci@ ze?#ivyv%*-+% zgTehBJj>C!lAPj5C$ee6IaaSMX)ZXxlGjJVyx!%f`n^ce`%B7|FbzL?enKIRaw@*n zfoF<**|_5c?K*JtMtS>p;C4+B)4tE(UOhZPw)*{SEtq@1n+lhXKfEZ1(A&lG*-%YI zVaPOTufgw{=pZ&Oo&nf#$TzZ**%~fJ;TM;2(O1ccs^08ZLg|DrZ6dl%F@%S$oiF6a z3r}7CWC6Ok_EH~=94a~t>^g~GpF5sY{`%~Dc(0JAs+e|bx(-EI;trhbOqsvW<(O*v zmGZV~*qs?mfv#E@L9~303RSTFS%mKn%GO3z9m2wP4=-BYrk8Izb$3sjrQ$DJ@hk0G zA}_iZQBWBG&vDfy(w)lX(N@yH|4deUP*jETPobo%YbJj)E-r2_3}Ye^SRld<;TMKk z27nK+Bd@wiJm|$R3|#u$y-c<}lm9eRI2DOBq6CKRVyzBZW=YO4zSWJV8Do zGq=tv8=3V8OG6rsY~&TCuVz?IZfU6g8`GWN?97n6I^i@gNDZJo7gMp z!PLya?5mERnqA*CI)3OHHiQ&*V&k+FTF(d!&j`pLg7FT%C>#U0Iahl88{io3+$um> z68sV97cTiL_^>pK)FnebFqMt6=F&NJC-N9{Kq1$@JemQWE1%6tAeg-acUD*p-_+T! zva>V!2Y>Hw-+C57AOc8-A|SYAOP!79|AI(B$T7()xHVv6Z( ziwR*IcJG5rAF@J>=^R3v2{2$yI5xs>uBeD*%wCqltWyvjq8obB82l7BGEQKWR{^`3 zv3U>q@XIL-f7cey0QbsSD?OX7X*m~IB={}(=OD3d@2-+~?ar6{$2#!$=vDxwB`^m< zddH+70qW8>D4wBG#LQ8_zLtl1L(My+gJUncCrCrCOsH>Sa8_#-xurDx>=C6y(h2)^ zl(ulV*4Elh=ZU~vx7W?afjek1aLFJ)<9O(F9EJsAjd!|-(MO;gT_e0OhD8V-NZil1 zs6gf9yQDf;J9rLiXT)Fb61@h%+6?f5cwq@I=R$D|hkE=Y<{yzR-VW#*!39@GjEu0F zD^P-E%cGZv2H(yN|ALWFP#FSRz|6z#8v1uT&8O(crqbKiz&CN1L$vG9(?9+l{df~z zue7ySA|+@Za*t&WA~6}5?GWDvs(5Qd;zcx?t_fqzJ*8Bf%K$uD<{eTI^ssFZWh0e0|!(Il+KDrXxyujOf3wWmSr)?t=n`Pgi7q zgpH~Nkbg>1=_3Tci4Ng_%P~;dVKTyu3$@Ct_!R~QCPHa#TxjLghU+`GCT`L2OAcpm z1~JYQeR1pg3R|Bh}@MhkM?iuC1)z&7{M{+3KwkK`9fMpMp?OOV(F z@ZyFjcwH(SyVw4Q=VoglrD&*tZAYuNn!|)oOG6eLD2JXTnxsV5(b<*5M3m;=X`q08 z&M-DY@l$Q@OL(u{obFl9A%p&n54p51G2KY8I91F(y2;)y?v#`G^ZVd8l?r!Pg;iRM zgEJngPuG~Q$}x0+{wj=ate%irkK~Nk*(5tJgSB6Op}Z6A3ri}z9XYHIyk`(;_q@&o z!Rv0xUrGc}aB>R9HVL3nFy8iUxdETD@I z%SW?|W~eRH;%hPXvR`P(3qrVKF)>lM9#35AdXNT2;-5>&y9-1n?Aw@DrAJApIiyPn z@Mm?qJ5&Mo;PFoEcqk6-5Fax7H+nkGxW9!n2!64Mi~zlB7}@kQ(fun?=@E)fs&%%$ z94ArYk{R@0yFk-=e}<*L5$-tv3I96Gz~ve7W2#`jvh!oDmF_lqJ`(U8y(|6^i}1_9 zarT_%(^xFg|DD|?hN1C@)O3b>HA6}u*esv@RRCOA)gkym_+Nz6K*m9sTfz|j-WNkR zMP~{Xa^TfC;k){|7})ZL)LT$9b6ZPHvrbirhx!1Q2|orS|j0 z#&;?qXIfzT2;&X;u=w<{DNGq3UM?PQVcE9ue%c>V9YdvPOET-Ecy9-A%~Zruom)TT z+g!lfqHZLM^!5mM18V<}q5=w9YD(iH?tfp0rqWlDuc9KtB0VvxG4ZNs@v$*!-1bX~ zMF8ha$*0LP*QvrNClj!M&c?nff(<58vTA_^o+cDzlVeV9kT!AQJz-88$yO)OSMVAL`bFWu{4L61^SG>UUclk-Zs}jgu-9C38z2n~tCqe}# zf-f%!NfGmXf*fpr|N6JE-{ukHI)|DPR~HhZ zZMX#P-#2E5_y1+BnRx?AbpyL8e>og>)6)MFUM=WfyxOKnr3A3a0UXSVo{VH!jGLs0 zeQDpfmsRMNVS(qlfA46@o<=q5EMcQV9-c|H&D%LSQ<=Sk&3%eGl#~UevHBX(@9f9Xn(>Y!G!@VhTi-zhV&?DcN&6<k^_RxC^G{&Su{u|GO-DdizS9ftqm)fP-i& zD=$b7Pf!++2Kw!Cf;g{w1P-A(6;QFT{x+ff-R(`@fb6YnDho4j6|wIIMZF8$1uw{m zTjYiBv778W^S=+c(T%!Mm(;y2;WGmUK@xQ6l79rw8h>*EpZV0)9*~k4)gj@(y=VB_ z+YRF9`I_aqHO7kLav9qm5X1r2E34F6B$%)JEnd-o9}I%d)HIa!XT@V9qA1QTCVb7x zcUm?7F^osX?7x5D862-+^0^3vn7Jy01uQB`YEL;8-1!9-uC$%{5C2UixG7}X&pjSY zo!nXW=irJ}A}s7JXP??Ze+G&S=zo82wUC2$AC3W-)gq)DM#tw_fZ6=-#~})MX=c%{ z7JwH}1Fvz9v;f?0ez+y~nJZw~# zgWs~s&w0?tKv3riyMW+Wi1))q*okuC4TR?h%mxC5Za~4+)ky?%VRP;7a}Y50S+%$v z6FXW?9f<0BdRRWYN$}8O7|B5&vRTG1fd@LG=W~4k?x^8q&uX0q=s&o0S0E??R`Jb@xI6RtzZ0L_FjAS zIDlK{&_X_h1*v8UNrT;d~+X8E_eY7)kme3l<==^SFG z=QKErUTi)Bp2hz}T|c9kd04nP?B9nQ|7{_=Z$)-~9FK7E>7uG1q8)?zky50O_rL*& zOX-%C9Y48JEI=I_yTVab=pPk)U#gI;ou>N==q-s-T%bKN^9p_-H{X#=f&-?JQa|Fx z6@UKq@xCMwSpAVa(e!JTM-b>Qd%+Zl2t6xftr`#M6C1o+1vr@i2r>CI&cUzfwiBw# z5Hx1~H%=r*Kl}Hp-$|g79Z!A4@#wRV1m-wE&X!sVyc-B~tjR-!B}S&)A^@P=wq!F`Zgmg9QT3 zRuoz#jp=>k9frVoBuQoCEG2uk7W%b>nccMkA9%?QIZ(}8eA4&#Rrvm-SXP%zmclck zZ?gbz*cDs4a3w`C6SbaOw>-YOZ4Q`|q%^8T0o7~7`=@%39ncz%cUJ^#uoRC2;V-I= z=`^k15YhtvaBT9OPSWphNmyp42(fZ3L&1ORDEe<5O&2ok7%TwgC69k-bjI!dz)E&? zGFs(NA{OJXIyr#o6Y&J%7C zU=9Xo#;Qpzjw#9it((?Ab$bYKLOfPSK;H#>s=mIs#&zucXdxQ$^_!SqSt{`4=kE3s zga?eT{-3wFYzp)>^Ycq#D7NQ8-)Tp=Y5ucVNz^=Xj*tYrsMCml+P6s}9{mjs|5G#> zw09qJBY+d+NJzQ*|Jv&lda)65_r3```=%$;oqr_H+ryI)1X%r{wgf&-FKy2!T&Kar zP}7o2$OA7?tSL5-fmZDJM96QwT-J)vp?Q0$5Ib8ksu;N`Oi5e^nj-;~xxU6>GZsc| zM|sMn;ED3tOSBr6^S5~)AJe!@hq7~50||ki&yOR%x|8bACYTF}iC7xu_tvy5tz+qa;lz8orP|{ zVEO44nz`@EJTJaajF`2b)Z?>43I#Kpq}%r?HpcC0^|8!cOX$|(nOQAW2Et1@R9ZKo z8ARvX+P9F{OZpjVWt6*{Q~T=-XzTMtXjFF*SxyakN)zts7=g3#P*FpsX%+tmzm2kqHiKN zVB7j>=5bx4eMSXZc=s_PN=@Z^k!JDT+{b>-+H3q6GXrM7pn%A8Tn^GFLZTNb2mHj4 z(zf%!!})R>-gh0BKc-1${MI`u_{s7ai>sRq*pEs!H5Ltr_Cv&`Kymw_cbR`GRXHEg zs(kbU#*@XEp3Ga53elo!+3gd5UXoMo7q1$P}L}phD6W7Kbe`4X! z&jc76?TuU5nBELF{W`klHeR<&_*0GL_#^O%bBWMt#=jJN`Cy^0Y$?ex%JNiplnZ$s z;H5%d8%dUU@ctNM6Sojz_4!m?fv*~GAwh4^_gAN*_V(#-@yaP^hS?VbBRD!6>M6Z5 zKfV(i$6r(d3yvGg7jT4ITk z#5|oePF=3En`>R|*@x8pKJ)>bSgnb z(w>J?Vh3k=TCJYWQ$;nGjd$>@#x(4*U)OXrEhh_kG3~mbjHrh#HIxXG;Elc{+9lP9 z$xCy|N;|k1DXS*NQuZ3}JT3DYuy;f(rsYp8;2E(xt5pJ|PV>P9$?dO;j-Sx2PRJ(v zDKeRohg^o^xCP=xo)@qAJ$x=Cv!f$~+~5Za9}cIY@4YbbK9z=wA#gXJ>G)2kuuS^yQ@T;o@xEj2-JMA2*S8ge)KDk{k?TtBDK%O8Jr(26p(<oQ3ea$H~{PnpubHo!~zXTrX^`R0(wuAPB;c=tImd*+@(?) z^T`f}W_{jt76l0sy(#kCzLdbiq0A-{ENpG8`upf!P1M{}r_e-fQ*yS_Pep=$9 zU^0I_i5ndPb{vj5WaYR9#btRRPkw9UT*6PkdrtMQitlg#;IB9www$IGvkRg$Sd^VC zX{h+Q!Ks1viK_Q$U)OwxV+Z2?IWhJ?rEppyMEEyyGFHF|vz(aWQI+xQ7rUxb0oe*d z%VDXOp`;Q-p75i{VX>pY;x+A;}DuwkZf@S@V zwrnx~G_NDjyrwT`-vK89GS3sLk|wdh$=GUJe)|`pT$rUdpCl-rzdJ0BjeNSDtLFvh z-ODy|WvCZ4hc8LtRe0>^`Wx@hjY#7qEk|VDsB$0oKh_RF81Oo!z97C01+rZqao%jv z4pGzu3Y!qFN>jHyVOYrPPK;#852F&u>kau>;&VLDskHBV^-He`ci{0AID5ndro48C z_&J}pvacAm*d$$Y&ORQ$y&N(7`Q5sEJ1-dBpNI?LVQxuSE$xAtMk#G5J#(A=1fkX7 zG7=X#14qO2lMo~8B}Yo5xk{JC?TI*YM9JCZ`bt`R>{x@|A3>CAaO1u2dHne@oFfi0 z>bF!a6KUoGv01xbF(<*A4Sd?A`oe!C@nxTgcLpQB3b(Lyt~l|Ex+QhuBxl?GPz-DO z^8vFR7#Kf}Gnsb}|Fc_^G}n2ZUwPXq=t&8WG_VqFT^zjtV==kv^HJKw$$ajrZGH}b zoZw1Hb@6S2VC_ph?Bjy(z_P*AmB#2+Jg&$hC6WIIQCv15h=CS5B_WrW{;o{zad6Yj z(GP>?xJklo?LvS*eXHu4*-Q%L(?&x$VF6s#-olXui)^33Cdx;t#=m<-RHCd-z|O7bW}FKdGKv`VjJU# zsNcpY{Fr0QKG{k=ypgRwrn@U)zMV2SKS~Kk8BwH&o2`7ET&YsXO7ZL7U?X1M)JO~R zZx+A9i!bjck1g~JA0E+bddnB$4ZU@rx_Dc$i_EfXY`)=|UdI>@HDfe%HkLYNGGCKt z!W}&Be{ZXT8CU&Eg%7@8w5l-?;iOvwf{%S!f`S&b!VjGbGqkr2j41?OwjS-MYcekj zeJOwSH+0nz-Olk?pC3+Ut%&Uyx{z_!=^2Ukf={{F26G#qN!g`? zD+bU_TQiWmm+dGy7znnCQXxma|Gp;mzV2jd;=pq@ zciyzAXh-O2pL=K8?O2k%obb+L!ZXwZUoj)PTL+Kxil*r0DJ(dQjL4q4$Su$b`G|jI zZW;av>`2G0nL;MaZlUEzZB#b5e11KVmuuMlLxNt^V}GqYY>M;v@b{#*JjE?CN=p%< zFngE=^h7}so5SscjMe%wnHeVvN8TP*3uZx%>D{SmF4@~8W!JSlY9JD;P?|`Rtp9ZP zEvJ*JrK0$NM7n++rSVlCXm#wiA8^yObGn=azbb+l zdey4#Nt$Q0CzySbC$v`FF;Q<@7%kGkgc?0zR)N#9yp8XhD9&;f9SRhAi!#V%o=&PY z>j{e={ieidJYtY8wDt^a@M1ezJC*c%lh~Tk^s$4|?@Rl&g{xqwn)xX*T9K>UE0-m62{}G^b6# z%JwXt6jiCBe|q7KeRq=IQn-v2in|`%okRjzobhn#nDR61`* z-osDxC80S}!s|X9c4=3lCi~N@3GXA`z>s=~EGh2?@PZ@ zc;~&Enm0{<{;tzmZXw(AV)fT%B2huor#sD=E)mp7SEF}gob=~8(BP*V zNDHStCcgCKtH{vvPpSghnXG*OjKyk;3QP@*J1%Uvn!Z&pmZlD>vToqhZRV4=eYs(f zJi6JERsCTXZrW?r zisPb!iMkVcZAkEZ6H~YQ_AX@h?*{%U(WzC{Z%= z7xgi1+6X;1rpwmSsC@GbPu$!hA3EK-MoP1jcbwYl(P%Z?XmFWFAndYdejNR5vi#)i zVfz&;bMaHws+q4pImeR&wJ!|&r{33 zPj*mzPQbZJQ(C@8oJp(6R-K|mjJRZ_vuwQEOCvk_&?H8+`;UAVj16v#q3W&I`K&Nc zBi1+$f@&V55m-h`V9ypT_8*0 zS9p|;CA*}D==0e6MhNg^#HkAr@QL)@+4<9`Td2{RZgD-imtew+__F$ zJBnu>BG+OlqZd=&flczP_)djNx!?hL@qw8QjXbKSe0%i3HUi{s8G8i#CXSD$i;7aP zd3A{=e;PJ_NyrM>f!?Q3P_!GMr++w-YR0GJQ+4*WV74k>N^j%#tw$r1pv65OZ@HD@ zq0cP8fvd6(a8>5GACL|XYze=&@rCDLA!Fy~$81I#Qnf_CydvoRq*C~c)804c%|-t~ zxe6TJ+w5;G5b)i%V*;WG`ejmEo-OTR=6}t3fa1)R8NO_NYf|}|L4fU;LXVrYfA2LXL*JqS8=`@Xnw&%ZZ1Aa6WJQ#<&FP>CQ^pmsKv{NANasz|Cy^ds#K(4+s8b+6!| z>L$rn`EsVwTkc=rfN(vSXkSUEM;Hyh_Gn9P+<9#a?Rlfs53K$C7?ZUk`C^sP#QSr5 zIbTF$)N(Sfqa`WM)KHbZZ^Ml`Uu@k9jQRiq=Q;-RRA2w}^QTcxjh=?htmur(0{D zUk}Bqp^$Paa$nWj5)f&9%NK=(!`r-e?e^Jao3A+8XPZ_dqDkV(DRbeR#ykxW0=A`_ z=?G#)!45+%@JKp~sJDT&&4bP#M8qTM80U^vdzrRTR_WXmil(DtTPS5w`w)t=0dfbY zCY%GMlp)v(O3-fg{OnYadb4Y-?1NZJ3l5Y#dtPEI_-Us)B*Y`XX~8SAg(|*9t^$>)^^`pWXl(Mu zR?7k;p0P^ZK6kqGym~c9T6-v@`T~-?SqE}CXPzuk^zt^JA;sDKAO#%7%M-MkXl6mGWv^mfdy>K%85NVN zjh3Xk{QRzRc~z~;&-35ri3qmm2H-?vgmL5EeM7G@I4RSLRCa4OO_c^A2|mcxP8>eI z0-CMyFAST${C+#PpaZu@%k)n2g`4pC`X)X9R0`)0!>>GtYm|Tecw9w$a4_bX6KV9; z?*Igwn0%q(JK%Xkx(s*s*k=eW)EGGRZjce87uaT9Z1I+WY4iZrFesHL38)TqwLM07B&hYU`GmB=?FdrNj#u2?bk@p=@O3iF$kR5UL}u{1*(n@PVNO)3 z{KANs>fgR873h0DO+^5Z2R08nK;=&8M?_R(Jxr%WuzL9k@>P}as}Ct-b;bPp<_of; zaA!Ff6{DZqhr#vnFWJG{u1Ziu4e?Bg&-58RQ;o?X5rBWoHTV}L01Q50lc>*6q zTiLHXCiz2zcwfx^HLLkbOsBs7#+2>FUJ$Ka6B|oiS*oaqO%c~zI5G4=?GOb7KE!8m z9YS*Wej-?`!Dd6Jl>zg^#d$D9!HVFpWATX%YI2T^=h|}YZ~-*J)T-3x)7pp1@$rm^ zpGprx&C~X^T2-$RrHDX=sj`eb7PgFse~qCC;`=0c0yzdbjr`+1nq zK0Uh2!2&YM`lJ5uXu#jwT;`=XeM)g@pTBthjA>>#@y!j|p$F;n#&SqFrAAruT}+ws zWlxvQOmMeYNQ9koNHHgjvU4Do^{zqbqYZuwSk zoW-utnu5D&CZ*nJxy2%n;B?FvpC)ng<8eG;3gJrEfv=VeKG9qc-la4g2)=$@FYY+Bn8JtUJ;j$Q9hsMRSKtUsSG7gsNT=!iXlDx_!_cZ%|&YijhYQ)yd8yT zGT2Z^NawD~rSd#W6`jxH;~`iIkc|(cP7r13Zt`|tZn6mLt390T){n9r+#F=G=P!HV zR1EAONOAQVCfL>kpPDYy*QK?1Y#t9teJc@s3%9BDD}Nf*c=-rYAw+X7{0=Tn{jt&# z@|!=!n*1$%M&^!sq(Gnnb>Y+rfz-2ZMqc*=aOm>W^T<8$dl6&aPaQh}ujp(uL+E6y-Cbc@P8^ zP9F}MJo+;Z_7*kWXuirh2v{Jp0EL#9ntbySrQMSC`rbX6fc5j3P0-Dr3a|yE&@^4V zifXteeu-Sx_2*xw6NyOj4f6?;zx|}HJ1xn>Xq;!9LA1LVb5L!&DuX(sK4a4OyJo1p z1Oc0<&OoBNEqx>nG1}q98HeY>ZX{HHcvR#0hr* z@Zf0_Z&0ClXDelcJM1jZu`Tw>461D6*7J^J`avxq3{zH3=Ja=h5KX`Ku^RhhAmrYd zH}}d*W$a*p7u%Wj!a9s}(VKNtuz394=03(c%V&FB1L3*-@eElR!Q_*|u`j0WrJ=Yt zCrw3FbG)EaJ)23J#v+v`zG$>t@sihqNr2@GFdkd0bVf3~o3POX8O?)C{1(&JMo{AE z3Lfm4a|UUv#vmtig@Tt!qc+byh)$UAP@YFfO|kOqGwr+AzZF#8=yX+6SspxAGjW;S znj5rcJ=PcMKD{1-}$3vo<-b8f(;U3UIU_Ttw}b-xOceg51p0ZvK*o|G>|FUnz= zGyLfdM|2inI*bK}cF3iK?-zcbWnF?bX-4hy5w%LOL&DQ|tP`zt`{tVWjIgzqAZQ8; zWzejrloe;9nEA@{{_vxjm9;iYrw=xETy>J~Ms2kZv$g;fQ~@qKnk1Z;GVF{@oR&(j zMuva0W#${srP65z^wl0%%XmyoMQK^e)jY#(A*}%ku#tyfAWny(sTK*CHJ4#;a?SYXQw(|S( z<7P(2Yt@H~qu{G=>%fkl@&JBp_fwUpv7#%`9oxOgtAEWM+CM#AU%?}LcJ@l>a%wNs zr0RuQ$de<}k-AeF{eAe!l}&D2LGzdK;iw4p#{XggddXm0|9UfM%Y?UZ{a44tX^6A_ zAOy6M;BJc)su|?+?C>a>Vmm#Z(^|LNt>xR|vQ8dFv4BE^u9O9KSQst;6i_huD^aNb z9c&R73c8i%$MyCQz9!E_d$UyMccW?~N0=s#H=qrgQU>2S(J(D3`TUs)PC1AF{z!wGR7(;?_JX}p9!D6SH1PlHADzKP<^~09Vr-< zTr5iB)_OBYm~dw2xo}E*2v~|&?3bZi4wrT-i9Kzm^F5c+f5gu6K!t3oN)Il5@;JEz zWv$KpV=+fpUWoEcr((#mFLK!v!DQK)ZhocjE^fEgo?PeG-L=qK0cA>jt(l}e+5)+V zC3X1WnQ?`U?%qYBv(&Fd8YR5DGY#oRZ7?Ar{B3Qq4fOmCg$<>7%6*G0q~|fS*6Tbi z-2w?ZMCQdAN!9Nl(Ufj;qCAIM!7X1=Ik`=6=$?{dn7-CsL-RM}KpJrKR~;VV)$Q9z znqR=-hYuQ>+l$;1gtVpzJAOS(Q|-s7&{CCF89+t14?@JoZ9CMGDTn5cW+Ww(9{Vu# z9g?GL^A3hdyqLaIsaBd3Jn{^uaqF`2&`z%U(j*lg?g(1n6Bn ztuW_SPQi-kCW8+nreLs&pDtQW7juB}UTuR7{%-sUsOu-eiN4$YHH*W0hrTnM(?y-4 zS-+}eAIjbVzfhAWuYSU$?0B_U!M9aJmcqvcF<@lV&-v&4BghHsO4Hh^_*_KoC(Ai?*EOfUU zavZCDAmj7-&F225wJ#)A+?u2*Div+ib3D2gN9fn-dQwa=sz^57JO(D325vKhZQ|*! zX@{kjwg@x{lg}Uc6((?Q*C(nRIE=R;57*k7QS&!Tlf}vDl%TuiEs8XI5Ob}@^U~i6 zvByB}=m?W~rTQ0n?k7RQ*{_%+Ca6YPod_kVzfPJXKeh=EsShZjV z5Br=*TBis(yx_#J1uiEmQMRQw^lpN|*lI!{oKO8LpxBYnm#5_RzqOjdZqSWKCQ%uv zI7Syat+Hg{Me(&B2+8hh^E97~Dqt<_7~o6$4zWeM^+$lYcZRD>#q?Ef?f}jU@zXVm zsAIsA+Tm@X9B1XVVx7&r&}GPZ6$uqQO?1?O;*HHaA`fmSLRZzf+NhplhQ6uiA z;>H{6IvQGDckCprK_craH2Z+l&?GDJ%HVMA;8BWLBDd9IKE_K>K&3LVxX9vkb%jUZ z5`PY2p~7`^v!H`ph>6jIw+WtbaVcj?kN!rw8Q-fypT$9Z_z<*w^K0z~^Phg-P~{7I z*x?cHzD}nAj&Ne>O$N*(rl)nuvMy&-OIj02nn}cpe?qO5$(fctYId&5$y3*>FRz_qJ|K z1W@a2q{TirISH;NPD&nZmfh*H%u5tC#Ytfjz0Eo15Q7Roq%+p?5o5SW$Yi({*#7wp zq)2==sn`TUJZZaqy$&3Za;T4QRv6$HK5hJ(h1I5q`F;&rP-&0R>MusnZb*pMgP+y7 zgpg$cr~}A^jK_X_$+4_?BN@%8oLuGG#N~xzSyBtNQthpLu;ddHbZysc;~yD&1-R=b zvX(e~7X_VN$YoH{E}rQli|0sWTK5x->42Ni_8${(|1?ANvH>S-+HnL7={V|VLsFX9 z$J1PSF1KXkcrfLO{z=))n@F4~tLd zV-i38(j1?SUa&KpLC$BZ+j%b2ieJRRUI!~{w+Bp#+kbASn)~LBS{na&bn!r|iE(`= z0XM=&YUkv#Z=u3wpgzH$;#=1Fv$^z{R~4ma(K5=KLQF4Dwf8E>5j&UxHC=w&$WP+S zS;e11%K;BWTk_ZXad!bwX_U|Ip*@fq@iQ#*AM^8aBAC?0!InwQw!0El;})zLB68@t zXUMJs@X&ku(+tyrs!Y0^3;>u43` zrcu40HJ|4TelIh;$8%o@_KqZOb7JXO^Xp}tGh($z^z7#eHHzs$jC7J)lq$tb43d)8 z@M~>AT&krnb|GzXC#tP;n>nyHa&%ok`}Wymf$D}6ow`Wh?enRfm~1a_C305C{Zo*; z-J!!IN87CD5{<9i>-s1IVSUHWbt zhJiW{G7Z9gkx7q56_s+)vF&O}R%7wX(2xl1ntu?j)6#0j7u?BbS0l!kEB19M+UZ|y zT{>T;aoXF6;@JnwA13HcV9bpTPj4LNpa)kJv}H+xUDYS=6?eZxam?hqGnS%$;W3Fd z*&H)LO323Md7)ByoCOh-H#eq^&0C?Rv^JfVQak&~s3+?|!mP+lTh$xJnmC zikAC4d1WNT)78J-YJHIfm$?>Zo6#^Ra+Km=>BUBC*2~(tl>k_n*m!@XdauYGBf*Dy zAo0VDqi~Jn2KN*EUGf6?66pPw_8@?Xs(VcW=AOi2kr{n!D@#U{Wpx9Nz_9GcP(@2^cFzK(RfeRUB}KIjaSNEev%`~ z&_KUG5XDjW6;p~3W-v_P{ssw&`GN<&6AC3hySJNg`gb=b;biavrLJ8U^@HsmJqy!7 zs-T`s>{poN__rWTWSJRz_V8U;?djZdLi=Vl2}IMVzSY*8e{WD9wh&pI%U})uV)p{F z3^nf=HmL(@_A_=Y4BH2K{SXrh`HiWL0a8Fn+;e&D3bP=6{f(ojLO^7!o}uQjjg+3t}?Pm1&r{6IPq8*FQ~yR+&2iw!X?&HO zRT_(5^oR;8v3vdxDLNVmV%U7-vG9me!`CJ{oGFqcXknkP$Q-_pRqgkEkj#?~5@VJZ ztX6QflMkoMy-H4kzu_`_ZW}enW-ZT2Y4TH60o{MP8M%!x2%~R+cO{`lnqc1;Z>s#0 z({01OFq5d*#=153Cyq@G+UsFt+xP7Am)~4Fl0I)gX#F%-D|e%5FEvrdAhU7V6E;9% zyx_uWf@W9b5LGfW-y4i;bE$Nq@0DLwB@ku0UK1dKf@NV3$n9vY`objBW{cqbmHEiZ z28-UF8ND%)*TDH03I5>_KpUnel*{x?HczljMC%}lUw2m%x0It4Wdufha zN)uOM`oUfd)j4GCPc=@mzTXU8;hA~ulQ;NTEn9}TxfK#J{othN$#y4WcyjqwnyE%( zeo=C}Z;T8QH7Bls^1Zt5d%&h8iP=kLX}#;sR5S^_KS|(gB6cO2>&1b{Z$_sF@U>-} zu85|k5#=8Q->yWW1lc#C;7MI3Iub{zc7BS$h&869Zox95cS(l zCe(*$@aFrT9F=F(P6@wK8W4?}iB}(kAvLw4lu>n4p51&>P0@$uiri1cW(TSX%!xUs!$Xzw0>!`9bK)PiS58}D<c(Z z<;#2xT4|-ZQxyHj!L#>aJ)b7Vhv#V zkS^sRC0~{ys@hB?T#Zfn@INx%JpA{ZtPO|z}nSuk*5tLAAmtnB_=EK zdBG!vz2%F-DJ*Aw^R#n*ke^#RSfmj8*~~qWF3Eqw%IA~w;HEw4NGew=tg>vkQdF-a ztZ=D7zER=Jz|kKEOS!Xvfub!8%iRNtF&V}D2CsAZC8BKMukgVwx7}}$Zh6){XM}r` zCQgo}=80Du&jD$I-57{wvEs)lw1_<`t;KPkruK>uzW2DlP%=vRVIkja>s6XucJCSe zZn0Ca3Tet1<9e)9L6OxF&GFklI5HBp@NkDaw6yUuKhV~ehGnxAh>{q;i%}RvX}te0 z7GS^^o{JjfqP{{~H^-92aYcWhpTMdrIPUAD6D>koob?5pef?9W&FAHZpM&QJ=QXo} zr_zgdes5!H_3N;)iKUz4?dnw%C(9oZQ=A>h_QtDNggJ{qy69ESxbjNZZ`c$zw|%cL zL7pVbIOEZ1QK%^_b+UqocA8O#^I0~K{6Va;fK^!MbAu6(33o+`d6mH*_{)^4BwH+y zE#X^@ml+4d`M08_e^Y!wK8G)olq-fNqa}^~QeTmnWMUr`hW(_%Wcm5rUs~#><)Q7j zAQ+PtNh?@)>k8aL+t5^FDA6}hLrQOPz>Sp!# zFqb*e>#Xtkq;E<#VB3sc8Kq<~Ef-Gj(^Kks=_&7mLjm=f#QDb4;!?Iv&SasTD`f&r z9JFrrd`q^h=@mP^tcMy$il7Fb-CA$XgJ*AV!1>?i#H!9T?lfk3jq>hGtB5kdTA2ZuOwzvD7JWrTW`LVrAW)*ZnQbT+0GJ!SzdowgpW+lE2g$u%rQYc zeGd*vn0b84X06C6cf@kp^8=^oD~v`zvg;+>-Vsj7Op#3Sxy$uCt7kmV^HG&aR~PTc z%;_qJ3|-&6sb6z$llDy$V{>jHp3e@NTAQYz0Kns=gP%W_n7+1I990A$)k$tq&aT4E zA?Q75xrvC9{vvmbxRTH!k2ylrj9y7e`Yye`$ViTkk%cj@Vg))9Te#j?Kd&(*E`+nJ z&C|AYFhj0Vrmlml9$CNj8$$|O?>uj36-bBn6cyup)>|Vpu4jfKEqy%Ny#!J?iF27w zlRv$z$X*DbE`BD&QI`69ROu;O^mB}72gGdpAWuN?m+OF*9H5a_Z)It1wy0963_^i1}?ZfL7UhAzQmc`~rG2^|Ork3A(*bb&c=6G)=O6#uU?TdmF zmN6kwAZ)IaL(C1;E|S=GN!bUb@@aplks@rG=&ZDpG-c6k zatI|OIQy*4&wLy4CF(d-^vU>PDmQ9`#mpeA465(Gzs%^_i9`4LXO)w`Cc&w+^d1&r zS;OZCMPA{N8Rm~9n_orDdo=wtsw*p1_UQZ?hCkXEM1@*j_V;@K1TAtk#Tg|}r6AyY zHja07cJdMr?ckRINpLte!gavr597A|fzvBNzE}C>Zj9Vmg&(0j%*GFmzPrG+0O*x0tNMk4u$&I%6++W~pGD%dyhqE1k*0s>rg`G4n{>6m}9S0A~%%*g=K0!m;l7TCkx+DB> z7zZ;pKDQ}Bc{=?bPeMskaSAAzBWy5W!%>$%$Ve49^#pTJa&jbQXQ=pEZST;`5KnR( zY6G#Vi8>use5N}P-lh!M%G>e`AC{oF#($ODgwsZ}@4&=215!L){zc%}x|6ldP?>!+ znas$n&63{${3bG$Tci&Rxvsx7a1`>{`FC^t0EAN>2}WYPu>N|!xe7CYj)R(9DZfD<{BznguKyg-`FoHSwAkVeVsC%pM+lHr08u+ z5mri>5Vw{ZW7*d`xg?q(EJMopJK&a{>Iq$@)y(ggv~pgcdfWCB=!qE=oxW_7?A+SP zwefPyFceQ1FEwLL!^)?K-IUyI zd!G|?F$jSzc_cNvN|?FgW%H?27W3=^n;POb#iZkT`xe>9LT)qEJGhp;FK4PF@b6>XW>4YGB1oDBRztXltvx1x5UUWUm&CXN1Tqq!9 zu9T~)4*iowMtrX@pyPHETM`V|*7KeTL@F%gFlZKlRWM8^F{6T$Xn7Oif8GNSt- z{3Hnv1@klFCgw=1GKMzxx>KJnyI9Il zL+X4*E-_B1pzq`H-Xz$QX$WSK{l;R?gK^F&G1tOy zs{s{~#ydt!l*K0Gf-b-3J5O+;4<^uuPs94^b}z$SdIl|NzuvC!EEd)3&*rILu)7It zH=o=&fsP6{AD8y_5Qx7<==~mEB`G7;t|_hhG`0w;Z=B@ls_)Nm5`8)2?2FJj&1khc z!k<#}P0$(noTT!gijJZuXx#W_DCgO@%_hsJ*&mx{e=I%i3AjT(!FYjmvPeKzcq;GK z5lE{1;s58PMe*E{SjzHUv)UX~co=1ks~GC}OQLNq!>8m^uUs<$*7%D4mNOiqNlZw^cU=C}znO<-xTIIhA3))L-qLVLE<|#l&2C~vzKd-(9#76^x}{AlGA2h(JWWFbY7tnN-tI+ zPKvwEHy0J7XO9tu8dMawJW>I^*T!hyzy)9qX!9@YOjY#xkToHv!ANK#Uyl3M(Qc3PWJ>7o*Q!!l9YcDidqhN z^XH$5be~6Tu)qO_fPQZ(=s!~Tsdv*0YjJXB1gFX@8a0+>H(Q)_M4x(YhTLvV8v7eU zzUu`uNC9e4aW3P(CPjeh0F&O}vX9MN3c=^FM4-~8KzfKPK&MoI0xWj^EvoEq=Wm_^ zBDEPh3(r=6AfHU@C*uEQvgxn*e%7`p*1seK1GeBSVjY_<1y&TP@Jt7~|MlT`Gd1|~QS)9>E>KPE&Spj~|a*K-6nVu8j6SP8&Z?BYLq-CGibj{w=M z)k5Zi$9=+GLcj#@A7`V#)%#5O%ai&Yz>F7-#{?=K(-91S#)?m=G}l)Cx}yA3rj*|7 z5`qb9B?E{*nwm%gxfli0|D(OVRlwnoqN+ZpBk0iiKlHoKyA8{k{TXAMQo5Yn{J$9h zSCx-Zf_pCad#6DX@WFq5f#H1`oR!V>U$ves$%y&-)lE>y|5R`?N-fWGeXo}}}aL0Shq z30}tbTBa{VIn|c}=Z?lN`3y^D%9##Y8V)zki!!zDPJIJJir~Nc)^{Z(C0%UWq90NC ztk2Z|nkD9%>FqK7 zgJAl2L~f!3BbOU*gbsW!62ND8D)cwsAJ+cy`F33ro~)0 zXPph^6m3n5rQKGw)GcGP*%h#%7;TPDjvHm0d(c9f@h!4CB7~T(K)#j(?7@bU$^Rv6 z`iuGC=BQbmKRA^^n9;)0nlVp4I*n7|^?ZwHjK4ikCFFc3wTs&g81;9j81qqwamm=z zAG!KhqO{PN%TRkfPlML#BK`C0>+5PHwQdj1xq-U;J6~;n1qD;UX9K*Dxs+eD=CCFj z?F4|Fw^w(+1N?}wnY;J$3{8>-E0=A4 zl`dExr;y;`nVD~_zJ7e&ZrbHw%pv$B*|2o>jIu+qfv_96lRDV#YPb`*LIk~}Nz zUhVO(!-^Gey$doi65m8M8a}4OKuoNQ#t-lt|I~zO8-7bV>#JjIz$P+HJ&QKCiSPEIw#ntC?ST-~TUI9G*8}Wu_X1uXpDdzDU55!lK`}*Zp_Sx68rIY+E4SS3T|w1&N1d z-x`7oXMC2+K&Qe))!+iXB^!0A=!CTG#%fYMJr6qOB>fS4+P1L54KB-E{-^r21Jga? zpls5BfeHKdw~V6R5qf$kPu_J0cJ+DQ$LcACSflspb}1#e+*RrmQyCI={d_q(3X~KI z)|XTUgEF&uX>|>nuBd(G`dT-ET3N?qp}LPvJSQA6cYkg?b7fnIiyl*hsPEZ#^)vk! z3)tNooU07FOU5M$U~nXd5%>SHlufBShH6gR1}B$>3KJ?gXa%=Vr zG@AY{yRN1&D}Vov(jc2aQ1?f40=Rg}H1sU6*^Bu$$gcZQ5Oy6!DOefMn6_?XZuuzo zhua#}^4+&%F_a{h_D=-n=>CAiSxId1O6LX(#-$Bzs* z^>L9>{y+6YrZWHC3cFuI~{4bE%OBl8(BtsCo9*a z3Y6{|u?k0)}VX>YDG9E6?A*EAl9_rHz)%l z;ZPB-*m@@RUA@8n&T{D_OdVqGeio&tFXYy>Q#Lsz=RZ%H5r@3uTVqLWD@a>b-e=?g#ux3Q2y)E5P z`4MHgzXt6Rr7gU&+ie}{svapS-%GXnM3_fUtJ&YyZfP`*lct*k4fVPa&8D=t;(0HSK0nJqMD`My{GDSnbfv*7;fACV zCA(2Y_Rp>}ck2zN#0p>^8jATXxtU5184ocmmfW>;pftLrhYDh28K>^1YcKM0zdM=msXu8%}Z!o=N zI!5wi-12hBiUISPOUd%Jn;(3uHclKa9-*=8PDxQ-@ARD zNG-q1uTDWSx^=sD;j%FEEM)@Z^J5tl`B#ngR4nF!Y?waKQX z0ik@$!;23~^n~2~vThHG!m~)`Ey474Uyt*v`5VV~%qHNUsJ0xY za+n21wo?@+FoaLG#^l?0I$dqteak9twJ(;A%r3?iBU(FqA}B9&uI?=Q4tcsVD@Bl) zB^F@1pWo67zLB&_j>uyJUde%Ps6S}@1wXb#b0wec6Qjnx9lmeW zqx-+4bBSXTEcN^Y-^auLr>e7zifdWgFu`4dy9Nj{kPvKeClK5nf(Exi2AAL(EP>$e z?iMUK4DRmkZr|jbd(XMwuUU&;yLWe2@1pkGyPk@wp3UB8O!1C=L)Vy8@vh4&G%^6k zU*zs?d~*4#dx|No^~A`+%y-z@>req8w}N@tW47e2`W?1k88*yM`yFlz%mYE%R1HG( zLj_GFFDUx@aoTF!xy_Ts&C%(+F!TeL(J)^MDSdOidLxrUi2g@q(wr)D*Xz<&ple3i zP6yjvIKbVrWlIDuJ3@?fxlxCWUiAm-J|An`f^x>&mUyRrAq$dYHgNrtCU{!#cyn$o zISQpI_69~31>@VEnequ5*s1*YZ62i}o9tAzM3TM_9HQ#m;W*L@ZrW+NFvktuyvyMC zSIzjQEa}bJgAGdc%S~O4Sahh^-AnrsPkJANCe&nv8(&TNYaJd(aG7T2FboNV=$ZrQkTvdtOMG9&M`c8n=0`K2%|q;CmkRFe1V?bo7lme!G%Z>tdQ> z5Kl^V-X-^$mDDK3Wx4J*&wlZp)&2V_8m6*uG|z!4%h8aq%8)t(Tt3gcat7|UFjGFiIf0-2YilWwlk2XT|*eD`rd z2azakYXCA3d(eEPS%$o5J=fBzt+KiiUxvFE<4i(D=^MI2?sms&qKRVej8Qm6Vs(>H zY2i|&8$xAvZm2WaaD|y3T}x};mu;>ksA-lQEBmY)*R@oHzCNz~Jx4^qlb2~)c8ukg z;bVOZ^H$Z{Jk=#%#!&1O64FT*VNkx3TGLn856~FYmCq3BV(dN?lXfg^j9w~Mdp{O_ zJ>%_XhQlM5Ee28N==&|wH}E>FmF1cAcrD-weXKj!xN}PI%LZs9#Qg3qVvSgiyqi6b z_AzUcEpTU21js3RG0Ncy0bj<`p2cCD}0ZYtXAps&v6Ug#?$e{fl11(LCf-p~ zE~d_Iy*g^RKHENcLdHgt$oq`4gm0pW_edEseTjPvw1YCzLS`-Fsv70WbO>AH z-rL68K}4_5wI1bC93}U@sH?QIZ-{WbT!an21tugVC%Kvc?v28H?(`HaH-u}H3!9_C zG!AzqS1hNEF;C(xZYm@YeH(Fwd2WA+ej&S=^Yn0Ao9qy=OUwhJ*f9r*9t5cAl=y`4 zOsgoOg&bJpP9PD7`rP`(;$~j?&Y|e#%XbpRQN)9z19cP%X$d{HUgr)giw>PqV_6@^ zmUsrfGn!TjvJ&dQUP%G{cucnx|vHq z$Y9aHETsL7-;Af6@haziH%s%J&SVz>x{dsg_#MJNYGL;oqBzGoN-bD($%!OFALIYlmCpn($*Ay>v z##AldJuOkrbiriRsKk1AFMpq|Pzs;6T$DQcVdncY<_91_A! z{zLIw+oXgRdig{BOV^TYT@I@n2P?fp-&M@7oY$+hj8Q?qql8b|b>B&5G|fVEw*0!JuJDs*@OTHY^}>Rs*8-cW{l&>x(V9_(K@ zCFIhlLQMXSQtn+SF}3&#k+`~!_}q;^Uh#_~)``5ubn+`0OJ0=W`Av%X4u7OS!$$mj z*qczWkA3rUMlY{m=My+!=v~@Z;y30|(6SPx>5~!At5}`U(wW%+{b&v`e}=dZ^Y@ay zSx85VT7aJA|8}E?!lP+wv?R44-T^G1ypR#xgI&iy(&y9|LD{y*t#R2w%qOR|>L`Es zL&b$vE>xWp*w7?JVRqGz4^BoXyWEUE$)3nlZd>i(vC7aP?qe0DpkyrS2_LYhy2wjD zK#-m*%8`Znt(lSJm*tA3j(Z;TDN$QWk`y2|7g$9(2L-|k{T#m2i zUrpD@C7q8~?+gw?F^{t7USg-{gI*xTYGF48$d2n3!SL za_K}DfJ?4v&C05|Tx@)wE2XL42?Mi+)S40YAEFn&)BZ04g#=82zc^N_opo^f)0=;Q zQ7~2jiwBi0#zFatkj_UA05qrS^zAgYGn6w?3I(b~HAoJBew{4d!x<3~Rm%8QeHkaM z+z`5H=xO{(mhWRLuL^zC^>u~W&coSe4ZWZp1~N>|VRm!Lgvwcjxj;+i6^>lzqmGq| z6|9>biA)_SOgLz3)?xz};PgD{gX+IR0vVV9X=(5{N@IU8XFu84vajn~8Wh39su<8E zp^EqqCavJ9kR|ym`)IDd(`^Jge|v#Xt4RLn=}(Q{h~@XigzPZCdj3$XVE$}H8~Q$I zb*qc;`z{SdN`a?f;qyHj9Gr*^J z@bCMDVtza!!UfSDKK-ev*!fSUswGToc?J|H_{%;J`bElr6gc0P(dC)meYKx=0#06$ zHm6(na6a98ksh(kRM=A2LV&SkR=NW`?q#|L3mufN{&A^TTvBV##-#Aj$Rj?1ouMC2X+PY}Muyyl zj;-9hX%xJlTX)hpRt!dmc+nA!ePeE0MbgvlLx9{w_sbbx7(T%<9fs^g=!gN(pZkbD zrvUF2svOVYiu+}%S##uKk9YrRgZ^X-ou-qP2?rIeuH?&7x-^~XGS8>Kb8qZ0*jb|(d7i^wV&OLpkx%G5e-aSygPlG zq4Zck%V((2PKZ%+^|@+0n@RI@UV)aIB0ZjKLrC+nz7gDoze}Bon%}?lzR=S1{Ol5^ zgXuKUA&sPl2E%3RWrCaID(P%gM)4}S1OkdlId~;3hC3O~Popi}8 zl09JAYe6c~|hb=fc8;a=>m9ad8o0RSg+M{59XDh;yBMv=98x8v=J;E8tb-7zE!c}>;m!W~Kv zUA43l(&aY%d+rLWi7Y)o3&P>!A&mR4%*-_(cirFS_I8u6Zca42@Gr&jO=wnoI^SRF zK;CM9y%y6wO&+^=wBdbcdq&mfUHCpu_IX}|ie72KAwridk5yQJe$^Dav{2U4I9vqcHY@G(#e5(Nz$hZPJi$S775rWN z0Ean}y}Y*BF+*?EKfpPxAur!`-^^9!=%ZPE#$o&;r7~HaeD3M7Qo_p400{>w#*#Fi zO-xNxuUT;2aFl5}?v!ry`aG}C?VXJ-ws!ku)3T8zYsZhW9#sf5e0jXRXdZBf4qIp+ z`?JON`KJRrtfHH6Cc&Rz^_a~hHoYdxWlti!pFjZ=(kdp0iV`|p4@$3+`^xJETSFXhN#8T7(evKVUYJ zJG}TwkcPEVx=95-Kt45M$p6}Z*J?v+P)#Of1k(};FXZY(FkE@IZfn^UimzR3Qjn%| zBrVd+nO808<5_drh!g$m0T>lGLYdFfI7ThQCRzy=h($2I3SncG9qSjopa*Zrcp=dy zZdzrMCcG=%YrlYZqy*aw=a@5Du@&4 z`lb-wbs(htR&2{`vy{tLVozADhQ??On~5uqjY89z58%dAy9Rk4tCf&6xp}!`H6>E4 z2+aVW*8oPFScsRSEh~kv*3JuYH;Q{FS6)Xe`nVZ7cHKV)-3g-}E6-#kk2CeC^Z4bg zjY{#=^w={!?3h`Rrye6DFW?$`;MZc5%j|40L}g-2)#wp1a|<@;?RcD(fCmc#K);uj zinTZfx=aXiD&LfAxU2dVsQ9hUg?=KWtCzAr@3dI~GHN$KxPC{G5H&y_>r~R?LJ=%F zMT)iMqp1{7cG&vsL!M;caEqMaYF<^_upffuKVksPG{7+~&4jvi|q1LQ+W0zLt zWM3trxv%4s^qpu@i$*IPe4kaGr@9#GJk6F~^Jt^9+74`cdsJ1bKY1K;@L$Jy;o6n{ z)Q|zQQnYtosSdVnv6~Rn5;Ca~&(J->wImgu-dwu*^+k_Za>l%Lv(7vWW%=o*r4Vsg zM-oe*Qf$=ac(y@7ty98S>*iXMx3)o+@8Cj+rH=B@^RsCyF< z3wgcfDTxKC`0hkuLb|cTU+HfS-Bji32U-9Wm79ku(MN*X{Oe_r<@`-p!CZr>!{OIL zjdC|zu8S2nyEtkv!e29qZaxvXYD@8VGBN4Q991J?sA^SZZLqc?({3ozsZy-S?Z0Kr zJQpTFF*Tv=B;lB`U23p2h@Eu)@bt!Hg+pO_qMbB8k!`VTI8pv4m0$btM?WI`!!Ezf zF4b6ic9l{V*^~9ef#79;GwM#|tmEi!S_yZ}I%kvhQzZr4v~z*UR(yG+s_tWt$G3e0 zV(QNZTJ<1-Lm$VTQTa{}SpgkMjp(kp1q$ZmLe}WbQRO2^E$!)8)082VYW@k*ILnCW zwu|nlR9t7v0^um@K154C7XlQ=lW7(Q7c$mul%hO3IzgGrl3xt)-}-uiHK4Axle3*9 z53V|#R^M`g!t{ z#%y5li91OymOzZKyEE;sw9Rtb&0uplGsn$XM}B7E2K&3JwYDSDOCcbiJOSzy{1h>9 zV`EucfYNnAmc%uiN%Y4Nm%fl0;u?#ir|6PWwhu`h?`I6SIF*e{Ntg+uJ2&@)xoeup z^rwFb{%VnHP#eCqZE!!FT}!p+XyUPZBi|A)bi9`oW!GMMh>fynFXc^!bE5o~ps-qy zP~+v7{S2y;*a{BG$vZ?Mr=Vbt^q=QfC^)8G7tNWcjUtptapsvnID~OUYg5e@jQQ#W z91OwEPpw!2RbIvW8P!wC{bFoI$v&rFpW^N)j$ij00JLMWAH2V@`Y*?08CCa(ULUbg z_P7e271{EgZx>oGI`y`~)#ByYep_+Byayd)`W3>l;VtR6jdNVxcRa4g*~tfx4BiVG~Pq18Mcmv?|ra3YVoy+G=N0zYV_% z@t)U7EZT*aDNj)}!|C*+L(4=&)meVaCC>&?`Q;=Ve*=Nqn*F>0$kM}_TZ68f&D z9|I=_K}>esc>D;_Ln?j2imrHk;rqY4(NZ7$_OsFS^}PnVf4Hdxv#_4MQ-f5BGt`#>0nB9H7;_hfX66obQs!o3F$Vb?D zXJndI#JIDJ3EYs?dymWq#%?iZ>`EO5?A|TM6`=@NN1|MOvEkBJd)eanKsG;>a%_O5 z5@$STndBg~Vn2fk-Ey(BDIAChKe%npwjIZB5WT!R&snn_+C*yi;vsCKx=dyTaKWB2 zt@WB03qQ-H()xqW!+)PTj>Ruq2!gIv-)=?DtpCg)$5Dw(L&~txnB=_c^Y*;Bw#KjP ztYT5c#u_E>t1uVi3Je2RZucVjy9?VFQ?4VMLlI^hVq&NDhA%!3B@I*D_?;tCZGv3RXMda<+?`sv z%hSvQ_)NfF3Z4bIn$0}hJS`jWLeL9 z9`?jFxY)ILJ@qlJ(mSKyF%(;Dw>7^3FBd31Cbz4(;Wo|;ksRm!RJ56Z8XJCY^I*J3 zw(^1}CV_2iDmcI#ft8$JP%I|NJSZq=Tc7h}9f{CzdhMrJu{y5P`;XRfgU{Ses#s!I zG~nZMseHaVYy~C-ij(mZaMM^@hNkb`M+P*|C3%a{gbtusGV_Yo5S5GP%Qu(c&qn1$ z9b2WOm0zb&O50I%a&&e+$6l4(Wc~(Hj+N|O^uN6s8bY=B)x^ieGTwX??xn8QZC7J% znkKb-O|n}b%$fMcV9y4gSQ<-x$!o!K<1)%4xKrdlD$L9or7(sSdcbouL0S!XsWm_7 z*+|lEH=u?%QTn*g9D4$lY^$;;#YN@`|Iq@lK0{uKawJD$VRWpJY%YMRI@afdY?d)j z@%VuXnS%H#M*v&z+@cd4IiI9&xAZ@S>1%RTml58P07lz9M{h(|JO-O0W84#5N!y_| ze)`;stm*ztI}f0&%0=~^fV?7+wbMS6mocfAD)8Z$U?RbhV7@q6OL}OoybuId1*7I^ zb_-{{>WDISS>1~eoIW*o7L9$9J&PBV&^>Buxw@8Nm*-~O-RN*Qy69%^%{y-X!W<#j z`rHYxfBcrem}lv{AQRV@#M0?K6y2)|Xv=pMsMoaXz`$@-fs}EZ4+(CMq@>HWg`wzm zLZ9M$MNm)$*p*TGa#=|mN#kYeVd8?2B~av7M>?fW&GqwqaT->wtexAL%3V=`b)cWu z!4@L5vqR8WLeF)bwfL5o_PZcOT*RAR&uHB%n!=K8p-aQvTxGmRSNqOHkoHu$ghy&K z&$$2v&~ox1x;2`|@iuU|Ldlvz8q?(Le&fCS1;L7=a%|?6m>vAUgw_#nsPsaMR=Epy z!dgG~my-64ASU$a?i2iehFnt=5u6zv!Se*6+;7o+Vg-XHX>X^#35iy)AjsMwyHM?= zs&Y>1Cw(RhI8ppv0FZe5CPy-sCxz?NUMk3)V(a7?@Ep6N)H=n0$P<20rS!@MNybf) zK&s$aMf@TU$X)$;`c#q9^Nl(=hljI9n?toCmX&I#=<4-8P$YA~9m?qH!4xL<6pazUAGZsYwh*?6lO{(e#v#A*e*8`m*Pmyic_vBkoWU+7R8cS#-;sCwI=qdcg)w5B+vL}@9a3@ zY5^qaJeKv4gh@j&F|75<CSmfftNhwVNrA3Jgz0?vrTjECXQB#~|;D;j6VoFDH5dVA~eWLfUkA@_$^ggcnIt$f2lwDBJ@57!tKAMIJZp zZ~3hQ?qYw8m(4{vS&Dx7cDJp2Z{UcBg4w;N!1%@EGVvQ&0$x>Zg^DlvAM5c4^f zQ?_zz)W!q<;Lh*iU4cQI&88AQzt2Y)z9mRH>B(zGN)1~ipmLjBHyE4OWr&|Qu3Y`* zontkN83xu>P8WxGDC=^g#&nc5e1?IA5@Aa`K>&-JNgBma;txtU>GmLMHd%MPuu}Dd za5r+H8Xre%_f6VlhY!HBNW5%Vtrp?;jtdBwMe5`R*u*W2{1_JIRnpdW<4}MT9SuQ?#os zzX&h$EO=)QqJ=vW{No@f>;Y8Ab_JM~ypHq5a3lP2o?RPbUb)sZrQgH@` zx%=C*!U^WuV{mTTO()$7KP^Q=Nyx;bDH`-)vC63*emLEhHbe8-wAu(5N$yx&yRNq9 zi7m)?J)Jgu;=$D>2x4&!ooiRD^7vNb&st7DV$+asc*+rOAl zK20F?zEwoz0ZW91h};Sk6thaH^He|b^Zww+VA3k8*t{8xBwMA~hQI;l3B4d+rTJ?6 zJl>V0HDbUR^|U|*zKhGl;2`C&K9#A{dxog@lJ7wPoj_` z5Z=em@^i=33{1cnN%1tRkVi%J)k)iWkVg@@Ob=H=HHuvY^m5jiJAM5vlusTe-f*or z^|N(JO*lz^)Ya;!J2Zl{6mRaMMZ*|w&tUc*Q7-Do+uO*Uyt#!Ti|{xFAr6>w#c-)g z^1iuas0<1YqHQ)_PUtz!oFyu`nc+M^HiZg}zcWNa#(D=RGbfq|Q96C)oZc9s$0d z0p8@NoP;CkDL;N_x!J7WT>qmbBL;{VnKOne}G>v=a;xGE39lc`K>D3qPnJ z`)&t?!~43FTau71h0pHQzuGNgHhx)h{px(rApMG<+}*wSsb|K`qG69zIXSU*{UGw?w{pg+W z3bE+TBGpy$gul5{XE9+EfNbmHe}wQ@-`KI-Ig|Y(mG)13ltd1;73a8SaUGcn%!%0? zex2K$8*mYIxOT0vb5?`~+#iD5CH|c>5k_C0{0v~^(M2rITp_^gbIdvJ{Rk>}1Vi1s zb5X28*BzPq+SBl-?d)EE{b)L0{iCrDN3_}<%>SH9e8>Lmd{$+>f7x+|H6kYmd)6v~ z3_V;><|)yQ^*~M;#TM;u6nRDcvi9|2N1ptpSe8&ovlcweNgKXBM2z@99pQcF;QuKX zuO3<2=;^+F*^f)9>(<`9LYl+FV&JlLIr1fE>bL`EG z*C8$kN787!&++5KiQeNX|G$>`ErsQ@Go0RTxCVXR!!k3SPTD;7yV(NMzM6XT8)=s` zlPxIEr0{+r-<(%iq66sO8eS!XPTKfVk@88a+obtims{M?2=u*%`yzh+;4nWP+6qr{ z(*5R$`0s|>=t8Crg3e{+(GMyqnFI6&w*8?05nnp*oRR?gj{1`*X@qXtF-Id?kr6EX z*YgU&+4_92!$F>mpA8FP^$2VNhn6F zgIN6TdD)I8o3z+ol|f%$`{c&YA6sC zJ5%b})ay8(?)hPLpEq=U%ct+nzWdDD6q8B!Ep!BAJj83QYP4`}PIY9_lk6MMEw8HQ;P$Ag z3**Dej?cz5w7!xksB*yNmk2@y>`JHqphQf#w0`8dv3o2fP038lm?&N_71FnWPpjCQ z5Ci}_p$NbdkkwH4KC)O1ci0OU0!9pJREK$*7f4&7ROX2%v&IB}*JEXE1Oo|0j%y(q zgPLUngzJKO7m{dtTR7@5WS(T4edOmwFI2pyxm~#@8b7*C1NBQCxEwNgYc?Q>aQ(&e zQl}<5Gdy8v0b0CvT+~t{tP81%w{8JHy;schAzVpi1W400m_IuC!T=rd*4~(Z~ z@f16;E#~U*orf<8??FDbBg_pX`?VxXFFONtW z{DH)6^-p{f>~u0#q5eA)4h~c_Z_xE(fE}-#a54$WV0D4eTJ}`VMtj2hFw{O&bWWQG z6F~7j%Pq+RwJ-0T{Xj{0~nrAAJa$=vC+DtBR?P)PFYu9r}o?auHml#b@s-Z~ilqdwsWt8OI(Apbwl8mveFiUfQ-w3~ z0i*F3Ko$?Yvxu&WmH^nV%1o(gSnT;1*yP(lC97r3FA5=zkJZ@gR_&C? zV+AU@9}cj4K*I@&wPjm!R#B`ujs-kaa4-PeFQNhQUH*kI8DOK+`%z*qt5EkkpRD*=@oNp7ex#yT z6IgxNfzcBTmOI2)Or`-(JKwp9xfV2`h8>L1=PZz86%y_u^zPdIzQ>;UaDT}YCB-J# zNx$brvzm766TKM%il1BuPsN3Ky!!>+HQLmrVC< zct`5&9l0@!v^((;GqH>$tVw|8$s5)|dfR`xL+{DaS-AK!wca-}U2=aQ&rFTw=hx7O zIYI3eowKnb9T~ZflxriEv!AokZdI99P=bgp9dhdoJ-hSSvLkVr!wsTuad z4T|kF4V1rw^8ydQAt8@_78afn4zy)*yYv_EtHsoB-Nc^EQ~|&>Av;VZqRt~RTDPa8 zACTKmpw3Vt?~;U!VPH-z>FUi0798h+*vozh`7FEE3&4}WHe6_(`_Bm_Hxb#A;ryPI_b;fK+dt%_#X0T1?~n|a7CuEE(-6gS~nh&3f3L^ z*T%Z_v5R(DiX+1l%3&`VZq&TO1%#M!J$bxe7OlBz8MLeVVrn4m6B%FKWiQVozw*cB zD5)YJ%(a#0JD~@4E`!OAE-hBtFvByANm-Cc8aFzk zse*2DGTspWmcGnCyv)AVi`^A{A8vVw-!*s@n^88SxIag}zTYTPcKo_WM5FuoLinw< z`PGp}_h8A9?+mRHmd0oiFXmST%J}46D?`ur>$r{N@7m5E%S$)rrwJk z_(stPA;^~ZXr@kvSvWVrW)#|Oi9|*Xh^lEg?u$l_qBpUVk%Kcrm|Mi=C%tUD2Uy03Pay^j71ADz+^JNGJ@yGop3fs_6bchMUpCY6UyNMaKkc5Zdv&F!BjJ&9VRSOX77o zzndWD_rVXx5BMQUkx61PV)^{4F%lugbszi#j^GXfN&5QQzsQ<;GL>m~JueOnYRv+C zZ8eO|%(j;wd>*7;uG*7q3{F^fh3OqgvmzLV&ELU#N$}t+-&t!;(cin(uu4V3vmIca zpBEy}c#EbGF4cEcUhP$D)0&}q0aQ=}(ip3;e&Vkg6gyD#^VPxLp&wM%&X{XPBO>eT zr}dR<7Gn<&e!8+R^TOP>4&$PFM+DtAPI(?0j&j0NH~oK;Meh$VxSG3uPRG!`YKcdF!Z@FDug7 z=VjQCdd-oc;jAY(YwRSL<@Pd>j0y8q*|+BD+MQR}H+wiOENE|T_TZsGh>rc~o+1Oh zHgy-!W(u`98*Y4Xe`mjx$E{IOmr8FI4BwkLZF(myq8;iEQJAevsDqVuJ(w<753ZuF-1CW3$Hhn>%&Pgfi;=Ay{RKe^><(Tk7h9a## zM9?dTI^E_H{Jq_4plnD$bn&~OXfauRu5@K{M`^-DOrzETpkIT+jT7>&e?wjs_!741 zHx6*?CN2mNyPRmO1FgYu`us)**^L4JK=&#dKz@tZ&h_Oo6txvr6xY zIW+o>)~ADRM5wpywQIZ!O7(dx;3I{A8LzwH z6e6~6dxa1|KO^VH#yq2PvVN&VsEgobMVX z-ICMw?Uy3wK-dR#GpTaYH!l3&33mfGbU7~l#G3tMI&InwZrsMQfMi+-ozT#NyllrV z@3jsDJba|2eqm8G#VA|vw?$&1LF-$}CQR;to=)*Kx?KBiqtz!->wJcKCH*Nfx*T{* z$o4$FWKgxBxL0SDhp9<8&FK%3hy!@(HUPzUIg@G?M%8u6VQ8Ft6&N#>%2}Y!`pKKR zH54r!Alg!(IU@7DFePzZ;7`1h6aZX1=$cUlexHc}uFe^*YAD)Rw61TBVd&SjNW6OI z41t5YAkje5h~Dtu7A^_&%N5H3*pxxxmPjSC&DQh4203)M)C8>P2CM$a-DQr z7g3|7RaC|q^e5WL@9T#9vopcr0Rnd$hc;H0LI?W*FtB!OEj^ zMpz!zO5yx=}N(Kz7@Ay9RoB2E_gY&+f1MH{AO2uuPazRvH|H(_F!az zQI|NeK+LPp{=tK0(5Rb;3z?3>d*ush!6VQdU%neYv zmR#-&>t|0_=4kY`f0j6a6^WP2&nrZN}DK>1MiIa^Z1?G13XPB`X2VA2voZKa$tDC#9>7~V1R$K zSIKXo#ylf{NfiS~c1F46l<6f1ERCPe4?uQ8hDKngj#Lf1sKLoIkt$l$u{1dfu8nk{ zsWC}y;>k)@E1HZZWBU*YM%izo5K>^xmar2QbZ_Axg@v17zS7s;W0bh2`72g>H(lOw z`6?NVL}oHe`Q19x(hd~+!I`RjjP^$cCZOC>F*BSlb-mADdh89%Jw8io9fb8b!jhkC z-jV9AudnmvadIQFT142-;#VQ}%6(G%jg-Puf4W|iCrZ(DMFccrl4<7A7pF^(t82zN z&C&}&`oXP*bNLFWd!s-he+vh4u;{W{p?X%UH|TE>MnCzOc~D@82njwPckgZ@Uh5E* z`UogeBJ2=oPduR2FYD#DKrh;|C_5&ChD(s+iw1&{%$Dm0vZT4WH~P_v0=feA+ZxJp zpKJn^Uy9ynfaC;bMl%ngLeUK{b5q`G)i-V~-}QGTRz-7*g@l+c^>51E9nsky*0zkR z_n2S1nDU1KwOT5pA&ysX`LUr$i3T;;Nb zP%qUcA`Gw7d<(};LTO=Sp-GG*Xd%#lFxh;;>5s)rU%Aln6)~BDRVaIqknVO?qDXGHBsz`jZCGbbl>Ka04Lg zQ7vs&l{xI`1~u$x%>6o(k?En16yp!ZgGOltb~b(xgmF$JdoQnHsJ^4ORTUc0)6v@{ zD7JP^hej9tZJ}-wmy~)(!;V|aek^fN8^u0kvkF>gHFB3gp&ENL>MIwSDQ%qvUG|`l z4%7unuO}#s_P%nOiy90Ic=y?l2zry$b43xCr@*Xj?7>$LFwLW+tcFl`^y^vp)WM1W zB6sDn+2<~$`CD7IRpfbxew91_;kan#C7y3q3qC>LD^;z#GsA}*j#>o#NK3cCaf zRO#r2#!gRF|51)eQ1sPtza2~?At5s#mscw`AeKS2cE#jWi7o?)Sj0Jzz=0ZjSC_~T zo?2Swpgm`yQjd$5!jC#Kg^0n*EgP+bC||ID6r)S)Sz9tc*m4T$! z3=dZK4G-uvig~olWmFP2{aG>=U|?YVK8lN|{_RiVhjk&qIx36QIwK*Yngo4JrUYqQ z@U?Ew6F&ZrinPwmb?jB9#xa^$;cyWQ;Cg2#2^6WH)0uCgD})`tIIv&N`)41(zgG2CTDf z2>T}k8{WtMWX&S^(qrE$xXySh^PxGw($jcX#-*X@qo&PYE%S5L#_{az;b;^@H?L-bZPX-u^ACYdQR9Yio&J3ka zLX6!O#t|-d3|yDKnGPlbngK6%TVbX?9$oix=?|b?q8CaSn3oro9FQ86a)bD1Gs402 Xy2zVX6bOm^;of|dkQXl#HT3^KBF2b9 literal 187813 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