From b4b61c1eabd05389f704140ab457bdb49065c1d2 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sun, 8 Mar 2026 23:16:38 +0000 Subject: [PATCH 01/28] feat(pyramidize): implement full Pyramidize feature (ENG-01 through ENG-12) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Go backend: - New internal/features/pyramidize/ package: 18 files - 2-call adaptive pipeline (detect + foundation+self-QA + optional refine) - RPCs: Pyramidize, RefineGlobal, Splice, CancelOperation, SendBack, GetSourceApp, GetAppPresets, SetAppPreset, DeleteAppPreset, GetQualityThreshold, SetQualityThreshold - XML-structured prompts for EMAIL, WIKI, MEMO, POWERPOINT doc types - Platform-specific source app capture: xdotool (Linux), Win32 (Windows) - 47 unit tests — all pass - settings/model.go: add AppPresets + PyramidizeQualityThreshold to Settings struct - main.go: register PyramidizeService; capture source app before clipboard grab Angular frontend: - text-enhancement.component.ts: complete rewrite as Pyramidize editor - 3-layer canvas model (originalText / pyramidizedText / canvasText) - Trace log with peek + revert, collapsible right panel - Step indicator, cancellation, error recovery with retry - Global instruction bar (Ctrl+Enter) + selection splice bubble - Hover copy in edit mode (mouse-position overlay) and preview mode - Copy as Markdown / Copy as Rich Text / Send Back actions - Module-level state survives navigation - text-enhancement.service.ts: rewritten to wrap all pyramidize RPCs - markdown.pipe.ts: new standalone MarkdownPipe for preview rendering - settings.component.ts: add App Defaults tab (presets + quality threshold) - wails.service.ts: add all 11 pyramidize RPC methods - wails-mock.ts: add pyramidize mocks - 108 Vitest tests pass (0 failures) - Binary builds cleanly Co-Authored-By: Claude Sonnet 4.6 --- .claude/commands/refine-requirements.md | 165 +++ PYRAMIDIZE.md | 693 ++++++++++ .../internal/features/pyramidize/index.js | 18 + .../internal/features/pyramidize/models.js | 404 ++++++ .../internal/features/pyramidize/service.js | 140 ++ .../internal/features/settings/index.js | 1 + .../internal/features/settings/models.js | 60 + .../internal/features/updater/service.js | 3 +- frontend/src/app/core/wails.service.ts | 67 + .../features/settings/settings.component.ts | 123 +- .../text-enhancement/markdown.pipe.ts | 114 ++ .../text-enhancement.component.spec.ts | 341 ++++- .../text-enhancement.component.ts | 1151 ++++++++++++++++- .../text-enhancement.service.spec.ts | 129 +- .../text-enhancement.service.ts | 124 +- frontend/src/testing/wails-mock.ts | 28 + internal/features/pyramidize/api_claude.go | 60 + internal/features/pyramidize/api_ollama.go | 62 + internal/features/pyramidize/api_openai.go | 66 + internal/features/pyramidize/capture_linux.go | 41 + .../features/pyramidize/capture_windows.go | 78 ++ internal/features/pyramidize/json_parse.go | 43 + .../features/pyramidize/prompts_canvas.go | 65 + .../features/pyramidize/prompts_detect.go | 24 + internal/features/pyramidize/prompts_email.go | 58 + internal/features/pyramidize/prompts_memo.go | 64 + .../features/pyramidize/prompts_powerpoint.go | 68 + .../features/pyramidize/prompts_refine.go | 69 + .../features/pyramidize/prompts_selfqa.go | 27 + internal/features/pyramidize/prompts_wiki.go | 65 + internal/features/pyramidize/service.go | 408 ++++++ internal/features/pyramidize/service_test.go | 311 +++++ .../features/pyramidize/source_app_map.go | 47 + internal/features/pyramidize/types.go | 95 ++ internal/features/settings/model.go | 17 +- main.go | 8 + 36 files changed, 5000 insertions(+), 237 deletions(-) create mode 100644 .claude/commands/refine-requirements.md create mode 100644 PYRAMIDIZE.md create mode 100644 frontend/bindings/keylint/internal/features/pyramidize/index.js create mode 100644 frontend/bindings/keylint/internal/features/pyramidize/models.js create mode 100644 frontend/bindings/keylint/internal/features/pyramidize/service.js create mode 100644 frontend/src/app/features/text-enhancement/markdown.pipe.ts create mode 100644 internal/features/pyramidize/api_claude.go create mode 100644 internal/features/pyramidize/api_ollama.go create mode 100644 internal/features/pyramidize/api_openai.go create mode 100644 internal/features/pyramidize/capture_linux.go create mode 100644 internal/features/pyramidize/capture_windows.go create mode 100644 internal/features/pyramidize/json_parse.go create mode 100644 internal/features/pyramidize/prompts_canvas.go create mode 100644 internal/features/pyramidize/prompts_detect.go create mode 100644 internal/features/pyramidize/prompts_email.go create mode 100644 internal/features/pyramidize/prompts_memo.go create mode 100644 internal/features/pyramidize/prompts_powerpoint.go create mode 100644 internal/features/pyramidize/prompts_refine.go create mode 100644 internal/features/pyramidize/prompts_selfqa.go create mode 100644 internal/features/pyramidize/prompts_wiki.go create mode 100644 internal/features/pyramidize/service.go create mode 100644 internal/features/pyramidize/service_test.go create mode 100644 internal/features/pyramidize/source_app_map.go create mode 100644 internal/features/pyramidize/types.go diff --git a/.claude/commands/refine-requirements.md b/.claude/commands/refine-requirements.md new file mode 100644 index 0000000..41f6558 --- /dev/null +++ b/.claude/commands/refine-requirements.md @@ -0,0 +1,165 @@ +# Refine Requirements — Interactive Requirements Engineering + +Take a plan file and refine its requirements through structured exploration, interactive Q&A with ASCII mockups, and play-pretend walkthroughs that surface gaps naturally. + +**Input:** `$ARGUMENTS` is the path to the plan file (e.g. `PYRAMIDIZE.md`, `docs/plan.md`). + +If `$ARGUMENTS` is empty, use `AskUserQuestion` to ask: "Which plan file should I refine? (relative path from project root)" + +--- + +## Rules + +- **Max 3-4 questions per round.** Never wall-of-text the user. +- **Never assume — ask when ambiguous.** A wrong assumption costs more than a question. +- **Never copy v1 blindly.** If there's prior art, question whether old decisions still apply. +- **Always show, don't tell.** Every question with a UI or layout implication gets an ASCII mockup. Abstract descriptions are not acceptable — make it concrete. +- **Stay in character during Phase 3.** Narrate as if the feature exists. Break character only to surface a gap, then resume. +- **Requirements and design only.** Never ask about implementation details (JSON parsing, HTTP clients, DI wiring, test scaffolding) — those are the developer's domain. +- **Capture decisions immediately.** After each round, note what was decided before moving on. + +--- + +## Phase 1 — Deep Exploration (silent) + +Do all of this silently. Do NOT output anything to the user yet. + +1. Read the plan file at `$ARGUMENTS`. +2. Read `CLAUDE.md` and any architecture docs it references (`.claude/docs/architecture.md`, `.claude/docs/testing.md`, etc.). +3. Search the codebase for existing implementations related to the plan's feature area — look at the code, not just file names. Check for archived or previous versions if referenced. +4. Read any related Angular components, Go services, and shared utilities that the feature will touch or extend. +5. Build a mental model of: + - What exists today that this feature builds on + - What constraints the current architecture imposes + - What patterns the codebase already uses (and should be followed) + - Where the plan has gaps, ambiguities, or implicit assumptions + +When done, output a single short message: "I've explored the codebase and the plan. Starting requirements review — Phase 2." + +--- + +## Phase 2 — Structured Requirements Review + +Go through the plan section by section. For each section that has decisions to make or ambiguities to resolve: + +1. Present 3-4 questions (never more per round). +2. Every question MUST include: + - **2-4 concrete options** (labelled A, B, C, D) + - **ASCII preview mockup** for any option that affects layout, UI, or user-visible behaviour + - **Your recommendation** with a brief rationale (1 sentence) +3. Use `AskUserQuestion` to collect the user's choices. +4. After each round, summarize decisions made in a compact list before moving to the next section. + +Example question format: +``` +**Q2: How should the error state appear?** + +Option A — Inline below the action area: +┌─────────────────────────────────────┐ +│ [Action Button] │ +│ ❌ Step 2/3 failed: timeout. │ +│ [Retry] [Settings →] │ +└─────────────────────────────────────┘ + +Option B — Toast notification: +┌─────────────────────────────────────┐ +│ [Action Button] │ +│ ┌──────────────┐ │ +│ │ ❌ Timeout │ │ +│ │ [Retry] │ │ +│ └──────────────┘ │ +└─────────────────────────────────────┘ + +Recommendation: A — keeps error context near the action. +``` + +Continue until all sections have been reviewed. Then announce: "Requirements review complete. Moving to play-pretend walkthrough — Phase 3." + +--- + +## Phase 3 — Play-Pretend Walkthrough + +Walk through the feature as if it's already built and shipping. You narrate in present tense. The user is the product owner / architect — you ask them requirements and design questions, never code-level implementation details. + +### How to narrate + +Speak as if you're a QA tester or product reviewer using the finished feature for the first time: + +> "I open the app and navigate to the Pyramidize page. The left panel shows a doc type selector set to AUTO, a style dropdown, and a relationship dropdown. Below them is a large Pyramidize button with a Ctrl+Enter hint. The canvas area is empty — I see a placeholder with ghost text showing a sample pyramidized email..." + +### When to pause and ask + +Pause the narration whenever: +- The spec doesn't say what should happen → surface the gap +- Two requirements seem to conflict → ask which takes priority +- A behaviour feels wrong from a UX perspective → propose an alternative +- An edge case isn't covered → ask for the desired behaviour + +When pausing, break character briefly: + +> "**Gap found:** The spec doesn't say what happens when the user clicks Pyramidize again while the canvas already has edits from a previous run. Should it: +> A) Overwrite canvasText with the new result (edits lost) +> B) Ask 'Re-pyramidize from original? Your canvas edits will be lost' with [Yes] [No] +> C) Create a new trace entry and overwrite silently (edits recoverable via trace log) +> +> Recommendation: C — edits are never truly lost thanks to the trace log." + +Then use `AskUserQuestion` to get the decision, note it, and resume narrating. + +### Minimum scenarios to walk through + +Cover ALL of these angles (not just UI walkthroughs): + +1. **Happy path** — the golden scenario, start to finish +2. **First-time user** — no config, no presets, empty state +3. **Returning user** — presets exist, muscle memory, what's faster now +4. **Error / timeout** — API fails mid-pipeline, what does the user see and do +5. **Interruption / cancel** — user cancels during processing, closes mid-edit +6. **Edge cases** — empty input, very long input, mixed languages, rapid repeated actions +7. **State & lifecycle** — navigate away and back, minimize to tray, close window +8. **Hotkey vs manual** — differences in flow, what's available vs hidden +9. **Architecture choices** — new service vs extending existing, separate route vs same page, shared state +10. **Scope boundaries** — "this could grow into X — is X in scope or deferred?" + +When all scenarios are covered, announce: "Play-pretend walkthrough complete. Moving to gap resolution — Phase 4." + +--- + +## Phase 4 — Gap Resolution + +1. Compile all remaining gaps, open questions, and ambiguities discovered during Phases 2 and 3. +2. Present them as a numbered list, grouped by theme (UI, behaviour, state, error handling, scope). +3. Ask in batches of 3-4 using `AskUserQuestion`. +4. For each gap, either: + - Resolve it with the user's decision, OR + - Mark it explicitly as **out of scope** with a reason + +Continue until all gaps are resolved or marked out-of-scope. Then announce: "All gaps resolved. Updating the plan — Phase 5." + +--- + +## Phase 5 — Document Update + +1. Update the plan file (`$ARGUMENTS`) with all decisions made during this session: + - Add/modify requirement entries + - Update scoping decisions table + - Update out-of-scope table + - Add any new sections needed (e.g., new user stories, new NFRs) + - Add a "Last updated" timestamp +2. Present a completion checklist: + +``` +Requirements Refinement Complete +──────────────────────────────── +✅ Plan explored and understood +✅ N questions resolved across M rounds +✅ K scenarios walked through +✅ J gaps resolved, L marked out-of-scope +✅ Plan file updated: [filename] + +Want to do one more round? (e.g., "walk through the admin scenario" or "what about offline mode?") +``` + +3. Use `AskUserQuestion` to ask if the user wants one more round. + - If yes: return to Phase 3 or Phase 4 as appropriate, then repeat Phase 5. + - If no: end the session. diff --git a/PYRAMIDIZE.md b/PYRAMIDIZE.md new file mode 100644 index 0000000..203de47 --- /dev/null +++ b/PYRAMIDIZE.md @@ -0,0 +1,693 @@ +# Pyramidize — Requirements & Engineering Plan + +> Mini project plan for the Pyramidize feature rebuild in KeyLint v2 (Go + Wails + Angular). +> Check off milestones independently: Requirements phase first, then Engineering phase. +> Last updated: 2026-03-08 (post second interactive requirements session — all gaps resolved, REQ-05 signed off) + +--- + +## Status Board + +### ✅ Requirements Phase +- [x] **REQ-01** User stories finalized +- [x] **REQ-02** Functional requirements reviewed & agreed +- [x] **REQ-03** Non-functional requirements reviewed & agreed +- [x] **REQ-04** Scoping decisions made (see §R.4) +- [x] **REQ-05** SOTA prompting approach reviewed & signed off +- [x] **REQ-06** Architecture decision recorded (2-call adaptive) + +### 🔧 Engineering Phase +- [x] **ENG-01** Go backend — new `pyramidize` feature package scaffolded +- [x] **ENG-02** Go backend — prompt templates (detect + 4 doc types + global refine + splice refine) +- [x] **ENG-03** Go backend — `Pyramidize`, `RefineGlobal`, `Splice`, `CancelOperation`, `SendBack` RPC methods + tests +- [x] **ENG-04** Go backend — preset storage + quality threshold in settings struct + `AppDefaults` RPC methods +- [x] **ENG-05** Wire DI + bindings regenerated +- [x] **ENG-06** Angular — Settings: new "App Defaults" tab +- [x] **ENG-07** Angular — Pyramidize page: full layout, state model, trace log +- [x] **ENG-08** Angular — Canvas: textarea + preview toggle + hover copy overlay +- [x] **ENG-09** Angular — AI instruction bar (global) + selection bubble + keyboard shortcuts +- [x] **ENG-10** Angular — Vitest specs passing (0 failures) — 108/108 +- [x] **ENG-11** Go tests passing (`go test ./internal/...`) — 47 pyramidize + all feature tests +- [x] **ENG-12** Binary builds cleanly (`go build -o bin/KeyLint .`) +- [ ] **ENG-13** Manual E2E verified (all scenarios in §I.7) + +--- + +## Phase R: Requirements Engineering + +### R.1 User Stories + +| ID | As a… | I want to… | So that… | +|----|-------|-----------|---------| +| US-01 | knowledge worker | paste an unstructured email draft and get a pyramidally-structured email with an information-dense subject line | recipients can quickly extract key information | +| US-02 | German/English writer | have my language (or code-switching mix) preserved in the output | I don't need to fix translation artifacts | +| US-03 | user | select communication style and relationship level | the tone matches my social context | +| US-04 | user | select the document type or let it auto-detect | the output format matches my use case | +| US-05 | user | provide custom instructions | I can guide the AI without starting over | +| US-06 | user | edit the AI output directly on the canvas | I can make manual tweaks without re-running | +| US-07 | user | give the AI a targeted instruction for the whole canvas or a selected section | I can refine specific parts without losing the rest | +| US-08 | user | see a trace log of every AI operation | I can compare versions and revert to any previous state | +| US-09 | user | copy the result as rich text (HTML) or markdown | I can paste it into Outlook, Teams, or any editor | +| US-10 | user (hotkey flow) | send the result back to the source application | the formatted text goes directly back to my email/document | +| US-11 | user | have the app remember which doc type to use for each source application | I don't re-select every time I come from Outlook or VS Code | +| US-12 | user | cancel any in-progress operation | I'm not blocked waiting for a slow/wrong call | + +--- + +### R.2 Functional Requirements + +#### FR-01 Document Type Detection +- System SHALL auto-detect document type + language when AUTO is selected +- Returns `{type, language, confidence}` — confidence shown as indicator near selector +- Supported types: EMAIL, WIKI, POWERPOINT, MEMO +- **Detection is skipped** when user manually selects a type (saves one API call) +- If detection fails → default to EMAIL, user can correct + +#### FR-02 Foundation Generation (core pyramidize call) +- System SHALL generate a pyramidally-structured document for the detected/selected type +- Output fields: `subject/title` (embedded as first line), `headers[]`, `fullDocument`, `language`, `qualityScore`, `qualityFlags[]` +- **Information preservation**: NO essential content from original may be lost +- **MECE rule**: headers at same level are mutually exclusive and collectively exhaustive +- **Email subject format**: `[Main] | [Details/Status] | [Actions/Deadlines] | [@Persons if needed]` +- **Header rule**: content headers ("Login failure on server A"), NOT process headers ("Next Steps") +- **Priority rule**: business impact before technical detail +- Communication style and relationship level injected into prompt +- Custom instructions appended to prompt (not persisted between sessions — security) + +#### FR-03 Self-QA and Optional Refinement +- Foundation call includes self-evaluation: `qualityScore` (0–1) and `qualityFlags[]` +- Flag values: `MECE_VIOLATION`, `INFO_LOSS`, `STYLE_MISMATCH`, `SUBJECT_FORMAT` +- If `qualityScore < 0.65` → trigger a targeted second API call with specific flag remediation +- If refinement also fails threshold → return best result with a warning badge in the UI + +#### FR-04 Canvas Model — 3-Layer State +The working surface has three distinct layers: +``` +originalText — immutable source (what was pasted or grabbed via hotkey) +pyramidizedText — snapshot of the most recent foundation generation (checkpoint) +canvasText — live working surface (starts as pyramidizedText, user + AI edits it) +``` +- Canvas state (all three layers + trace log) persists in module-level variables +- State is preserved across navigation (Settings, Fix, back to Pyramidize) +- State is cleared only when the app window is closed (minimises to tray = preserved) + +#### FR-05 Trace Log +- Every meaningful state change creates a named entry with a canvas snapshot: + - `"Original"` — when text first arrives (paste or hotkey) + - `"Pyramidize"` — after each foundation generation + - `"AI: [instruction text]"` — after each global or selection AI edit + - `"Checkpoint"` — manually triggered by user via [+] button in trace log panel header +- **Peek mode**: clicking any entry shows a read-only preview of that canvas snapshot +- **Revert**: "Revert to here" button restores that snapshot AND creates a new trace entry `"Reverted to: [entry name]"` (audit trail is never destructively modified) +- Trace log panel is collapsible (right side), collapsed by default + +#### FR-06 AI Instruction System — Two Modes + +**Mode A: Global canvas instruction** (instruction bar, fixed at bottom of canvas) +- User types instruction → Ctrl+Enter or [Apply] → sends `{fullCanvas, originalText, instruction, docType, style, relationship}` +- AI returns entire new canvas → replaces canvasText +- Creates trace entry `"AI: [instruction]"` +- [Apply] button and Ctrl+Enter are **disabled** when the instruction field is empty + +**Mode B: Selection-level instruction** (floating bubble on text selection — EDIT mode only) +- User selects text in the **textarea (edit mode only)** → floating "✨ Ask AI" button appears +- User types instruction → Enter or [Apply] → sends `{fullCanvas, originalText, selectedText, instruction}` +- AI returns rewritten version of the selected section only +- System splices the rewritten section back into canvasText at the selection bounds +- Creates trace entry `"AI: [instruction] (selection)"` +- Selection bubble does **not** appear in Preview mode (preview is read-only for review and per-paragraph copy) +- Note: context-aware splice may need iteration/testing; if section coherence suffers, escalate to Mode A + +#### FR-07 Subject / Title Field +- The subject line (email) or title (wiki/memo/ppt) is embedded as the first line of the canvas +- In both edit mode and preview mode, each line and each paragraph/section block shows a **hover copy icon** (grey clipboard icon appears at right edge on mouse hover) +- Clicking the icon copies that line or block to clipboard as **plain text** (markdown symbols stripped) — this is intentional for email subjects pasted into Outlook/Teams + +#### FR-08 Hover Copy Implementation +- **Preview mode (rendered HTML)**: per-paragraph/section `` with CSS-triggered copy button — simple DOM +- **Edit mode (raw textarea)**: mouse-position overlay tracks which line the cursor is over; a floating copy button is positioned at the right edge of that line + +#### FR-09 Output Actions +- **Always available**: `Copy as Markdown`, `Copy as Rich Text` (HTML + plain MIME types) +- **Hotkey flow only**: `Send back to [source app]` — button is hidden (not just disabled) in manual-paste flow +- `Copy as Rich Text`: converts canvasText markdown → HTML **client-side** using `marked.js` (same library used for Preview rendering), then writes `ClipboardItem` with `text/html` + `text/plain` MIME types. If `navigator.clipboard.write` is unavailable (WebKit2GTK limitation on Linux), falls back to Go-side conversion at implementation time. +- `Send back to [App]`: calls `SendBack(text)` RPC — Go (a) writes to clipboard, (b) restores focus to the captured source-app window (`SetForegroundWindow` on Windows / `xdotool windowfocus` on Linux), (c) simulates Ctrl+V to paste + +#### FR-10 Input Sources +- **Manual paste**: user opens page, pastes into Original textarea (Ctrl+V), or clicks "📋 Paste from clipboard" button in empty state placeholder (small, low-emphasis button) +- **Original textarea** is always editable — user can refine the original draft at any time. The trace log's "Original" entry records the first-arrival snapshot; a user can always revert to it. +- **Hotkey**: immediately before clipboard is grabbed, Go captures the foreground window handle and process name (Windows: `GetForegroundWindow()` + `GetWindowText()`; Linux: `xdotool getactivewindow getwindowname` — best-effort, empty string if xdotool absent). The captured handle is stored in the service for `SendBack()`. Text + source app name → Pyramidize view. +- **Hotkey + in-progress session conflict**: if Original or Canvas already has content when a hotkey fires, show confirmation dialog: "New text received from hotkey. Replace current session?" / [Replace] [Keep editing] +- **Re-pyramidize confirmation**: if user clicks Pyramidize while canvasText is non-empty, show: "Re-pyramidize from original? Your canvas edits will be saved to the trace log." / [Re-pyramidize] [Cancel]. On confirm: auto-create trace entry `"Canvas (saved)"` with current canvasText snapshot, then run pyramidize from `originalText`. + +#### FR-11 Source App Presets — Full System + +**Auto-detection (built-in mapping)** +When text arrives via hotkey, the source app name is captured. The system maps known apps to doc types: +- Outlook, Thunderbird, Apple Mail → EMAIL +- Microsoft Teams, Slack → EMAIL +- VS Code, Notepad++, Sublime Text → MEMO +- Microsoft Word, Google Docs → MEMO (fallback) +- PowerPoint, Keynote → POWERPOINT + +**First-time app eyecatcher** +- When a source app is seen for the first time (no preset saved yet), the doc type selector is highlighted with an eyecatcher animation + label: + `"Detected: Microsoft Outlook — suggests Email. [Set as default for Outlook]"` +- Clicking "Set as default" saves `{sourceApp → docType}` — saves **doc type only** (style + relationship always use smart defaults per session) +- On subsequent launches from that app, doc type is pre-selected silently; no eyecatcher + +**Preset management** +- `"Manage presets"` link/button at bottom of settings panel → navigates to Settings › App Defaults tab +- Settings › App Defaults tab lists all saved presets with edit ✏️ and delete 🗑️ per row +- User can manually add a preset entry if desired + +#### FR-12 Progress & Step Indicator +- Steps shown inline where the Pyramidize button was (or in the canvas header area): + - If AUTO doc type: `"Step 1/2: Detecting document type…"` → `"Step 2/2: Structuring…"` + - If type manually selected: `"Step 1/1: Structuring with Pyramid Principle…"` +- Cancel button always visible during any in-progress operation (Pyramidize, RefineGlobal, or Splice) +- Clicking Cancel calls the generic `CancelOperation()` RPC — cancels whichever operation is in flight +- If cancelled: progress indicator disappears, no error shown, canvas state unchanged + +#### FR-13 Error Handling +- Errors displayed inline below the step indicator area +- Format: `❌ Step N/N failed: [reason]. [Retry] [Change provider → Settings]` +- Canvas is not cleared on error — original text and any prior canvas state are preserved +- **Retry** re-reads the **current UI state** at click time (doc type, style, relationship as set in the selectors right now). If user changed doc type from AUTO to MEMO during the wait, retry uses MEMO. If detection already succeeded in the failed run, it is skipped on retry. + +#### FR-14 Empty State +- Original area shows ghost/placeholder text: a greyed example of a pyramidized email +- Placeholder prompt: "Paste or type your draft here, or use the global hotkey" +- "📋 Paste from clipboard" button inside placeholder (small, low-emphasis) +- Pyramidize button is disabled until Original area has content +- If no API provider configured: amber inline banner `"⚠️ No AI provider configured. [Open Settings →] [Dismiss]"` +- The [Dismiss] closes the banner for the current page visit only — it reappears on the next navigation to Pyramidize. The banner disappears permanently only once a key is configured. + +#### FR-15 Provider Badge & Detection Indicator +- Below the Pyramidize button in the settings panel: a muted badge showing `"⚫ [Model] · [Provider]"` +- Clicking the badge navigates to Settings › Providers +- Badge text updates reactively when provider is changed in Settings +- **Detection indicator**: after AUTO detection runs, a small badge appears below the doc type selector showing only the detected type (e.g., `● EMAIL`) — no confidence percentage (user already knows what they sent). Badge disappears when user manually selects a type. + +#### FR-16 Keyboard Shortcuts +- `Ctrl+Enter` when focus is in Original textarea → triggers Pyramidize +- `Ctrl+Enter` when focus is in global instruction bar → applies global AI instruction +- `Enter` when focus is in selection bubble → applies selection AI instruction +- The Pyramidize button and Apply buttons show grey shortcut annotations (e.g., `Ctrl+↵`) + +#### FR-17 Settings — App Defaults Tab +- New tab in Settings alongside existing tabs: `[Providers] [App Defaults] [About]` +- Lists all saved source-app presets: `{sourceApp, docType}` +- Edit button opens inline edit row; delete removes preset +- Empty state: `"No app defaults saved yet. Use Pyramidize with the global hotkey to detect apps automatically."` + +--- + +### R.3 Non-Functional Requirements + +#### NFR-01 Latency +- Detection call: < 2 s +- Foundation generation: < 8 s for ≤ 300-word input +- Total pipeline: < 12 s (< 15 s with refinement pass) +- Global canvas AI instruction: < 8 s +- Selection splice AI: < 5 s (smaller prompt surface) +- UI SHALL show step indicator during all operations + +#### NFR-02 API Call Budget +- **Minimum**: 1 call (user selects type + quality passes threshold) +- **Typical**: 2 calls (auto-detect + foundation+self-QA) +- **Maximum**: 3 calls (auto-detect + foundation + refinement) +- Canvas AI instructions: 1 additional call per instruction (not part of pyramidize pipeline) + +#### NFR-03 Error Handling +- All API failures surface actionable error messages (not raw stack traces) +- Canvas state always preserved on error +- 30 s default timeout per call; configurable later + +#### NFR-04 Provider Compatibility +- All pipeline steps MUST work with: OpenAI (`gpt-4o-mini`), Anthropic Claude (`claude-haiku-4-5-20251001`), Ollama (`llama3.2`) +- JSON parsing SHALL strip markdown code fences and trim whitespace before unmarshal +- Ollama note: complex JSON schemas may degrade with smaller models — detection prompt is intentionally minimal + +#### NFR-05 Architecture Compliance +- All AI calls through Go backend (no direct webview → external API calls) +- Go structs define the RPC contract; `wails3 generate bindings` generates Angular types +- Canvas + trace state stored in Angular module-level `let` variables (not component props) + +#### NFR-06 Testability +- Each Go function unit-testable via table-driven tests (mock HTTP, no real API calls) +- Angular Vitest specs: state model, tab switching, trace log entries, keyboard shortcuts, mock WailsService +- Prompt templates stored as Go `const` strings for easy review + +--- + +### R.4 Scoping Decisions (resolved) + +| Decision | Choice | +|----------|--------| +| UI: replace or coexist | **Replace** `/enhance` route with Pyramidize. Grammar fix remains silent hotkey only. | +| Document types | **All 4**: EMAIL, WIKI, MEMO, POWERPOINT | +| Pipeline architecture | **2-call adaptive**: detect (if AUTO) + foundation+self-QA. Optional 3rd call if quality < threshold | +| Quality threshold | **Exposed in App Defaults tab** as number input (0–1, step 0.05, default 0.65). Stored in `Settings.PyramidizeQualityThreshold`. | +| Prompt format | **One XML-structured prompt** (``, ``, ``, ``, ``) for all providers. XML tags are ignored by OpenAI/Ollama but don't break them. | +| Canvas model | **3-layer** (original / pyramidized snapshot / canvas) + trace log | +| Canvas AI scope | **Full canvas** (global instruction bar) + **selection-level** (context-aware splice — EDIT mode only) | +| Canvas editor | **Textarea + preview toggle** (`marked.js` for preview rendering). Hover copy (plain text) in both modes. | +| Trace log | **Collapsible right panel**. Entries on AI ops + explicit checkpoint + auto "Canvas (saved)" before re-pyramidize. Revert = new entry. | +| Settings persistence | **No** — always smart defaults per session. Presets for source-app doc type only. | +| Source app presets | **Full MVP**: auto-detect + eyecatcher + Settings App Defaults tab | +| Source app detection | Windows: `GetForegroundWindow()` + `GetWindowText()` before hotkey fires. Linux: `xdotool getactivewindow getwindowname` (best-effort; empty string if absent). | +| Subject line | **Embedded** as first canvas line. Hover copy (plain text, markdown stripped) in both edit + preview mode. | +| Hotkey conflict | **Warn dialog** before overwriting in-progress session. | +| Re-pyramidize | **Confirm dialog** if canvasText is non-empty. On confirm: auto-trace entry "Canvas (saved)" then run from `originalText`. | +| Original tab | **Always editable** — user can refine original at any time. Trace "Original" entry is always revertable. | +| Error UI | **Inline below step indicator** + Retry (uses current UI state at click time) + Settings shortcut | +| Cancel | **Generic `CancelOperation()` RPC** — one method cancels whichever of Pyramidize/RefineGlobal/Splice is in flight. Silent (no error UI on cancel). | +| "Send back" | **Dedicated `SendBack(text)` RPC** — writes clipboard + restores source-app focus + simulates Ctrl+V. Hidden (not disabled) in manual-paste flow. | +| Rich Text copy | **Client-side** `marked.js` → `ClipboardItem(text/html + text/plain)`. Fallback to Go-side at implementation if WebKit2GTK blocks `navigator.clipboard.write`. | +| Preset saves | **Doc type only** (style + relationship always default per session) | +| State lifetime | **Preserved** across navigation; cleared on app window close | +| Settings tabs | **`[General] [AI Providers] [App Defaults] [About]`** | +| Detection indicator | **Small badge** `● EMAIL` below doc type selector (no confidence %). Disappears on manual type selection. Selector stays on "AUTO" after detection. | +| Empty instruction bar | **Apply / Ctrl+Enter disabled** when instruction is empty. | +| Banner dismiss | **Session-only** — reappears on next visit until a key is set. | + +--- + +### R.5 Out of Scope (this implementation) + +| Item | Rationale | +|------|-----------| +| PowerPoint `.pptx` file export | Text output only | +| Version history branch tree in UI | Trace log covers this; visual tree is deferred | +| Cross-user learning | Privacy + infra | +| Streaming output | Single-result model for now | +| AWS Bedrock | Already deferred in codebase | +| Thread/conversation context | Each call is stateless | +| LangChain / orchestration library | Go-native HTTP only | +| Input validation warnings (short/long/structured) | User is trusted; they clicked Pyramidize deliberately | +| Selection-level copy in preview mode beyond hover icon | Hover icon is sufficient | +| Style + relationship saved in presets | Doc type only for presets | +| Per-feature provider selection | Global provider setting; per-feature is future work | + +--- + +### R.6 SOTA Prompting Research + +#### Key Findings (March 2026) + +**1. Single comprehensive prompt > chained specialist calls** +Modern frontier models (gpt-4o, claude-3-5-sonnet+) handle multi-criteria evaluation and generation in a single well-structured prompt without quality loss. The v1 architecture (6+ sequential LangChain calls) was designed for GPT-3.5-era models. One call with embedded specialist criteria equals or beats 4+ specialist calls at 1/6th the latency and cost. + +**2. XML-structured prompting for Claude** +Claude benefits from ``, ``, ``, ``, `` XML tags for complex multi-criteria instructions. Reduces instruction confusion when rules overlap (MECE + language preservation + style + tone). + +**3. Few-shot examples are critical for format adherence** +For MECE header generation and subject line formatting, 2–3 concrete examples (DE and EN) dramatically improve adherence vs. rules-only prompts. All v1 prompts already had strong examples — carry these forward. + +**4. Self-evaluation in the same generation call** +Modern models reliably self-evaluate their output in the same pass. Including `qualityScore` and `qualityFlags[]` in the JSON schema replaces a separate QA call for ~85% of inputs. + +**5. Iterative refinement only when triggered** +Replace always-on 4-specialist pipeline with a conditional second call triggered by specific self-reported flags (`MECE_VIOLATION`, `INFO_LOSS`, etc.). Adaptive quality without fixed overhead. **The threshold (default 0.65) is a settings field in App Defaults tab** — not hardcoded — so it can be tuned post-launch without a code change. + +**6. One XML-structured prompt for all providers** +``, ``, ``, ``, `` XML tags benefit Claude (attention mechanism). OpenAI and Ollama treat them as plain text and parse correctly regardless. One prompt file per doc type to maintain — no per-provider variants. + +**7. Context-aware splice for selection edits** +For section-level AI edits, sending the full canvas + original + selected section gives the model enough context to produce a coherent replacement without rewriting everything. The `rewrittenSection` is spliced back at selection bounds. This may need iteration testing — if context reduction causes coherence issues, escalate to full canvas rewrite. + +#### Selected Architecture + +``` +User selects type manually? + │ YES │ NO + │ ┌──── Call 1: Detect + ▼ ▼ → {type, lang, conf} + ┌─────────────────────────────────────────────┐ + │ Call 2: Foundation + Embedded Self-QA │ + │ (doc-type prompt + MECE + style + examples) │ + │ → {subject, headers[], fullDocument, │ + │ qualityScore, qualityFlags[]} │ + └──────────────────┬──────────────────────────┘ + │ + qualityScore < 0.65? + YES ▼ NO ▼ + ┌──────────────────┐ Final result + │ Call 3: Refine │ + │ (flags as input)│ + └────────┬─────────┘ + ▼ + Final result (with warning if still below threshold) + +Canvas AI instructions (independent pipeline): + Mode A: {fullCanvas, originalText, instruction} → new canvas + Mode B: {fullCanvas, originalText, selectedText, instruction} → rewrittenSection (splice) +``` + +--- + +## Phase I: Implementation Plan + +### I.1 New File Layout + +``` +internal/features/pyramidize/ + service.go — RPC service: Detect, Pyramidize, RefineGlobal, Splice, AppDefaultsMethods + types.go — all Go structs (request/response contracts) + prompts.go — all prompt template constants + api_openai.go — callOpenAI(client, systemPrompt, userMsg, key) string + api_claude.go — callClaude(...) + api_ollama.go — callOllama(...) + json_parse.go — stripFences, unmarshalRobust + source_app_map.go — built-in sourceApp → docType mapping + service_test.go — table-driven unit tests + +internal/features/settings/ + service.go — add AppPresets []AppPreset field to Config struct + +internal/app/ + wire.go — add PyramidizeService provider + wire_gen.go — regenerated + +main.go — register PyramidizeService + +frontend/src/app/ + features/text-enhancement/ + text-enhancement.component.ts — major rework (becomes Pyramidize page) + text-enhancement.component.html — major rework + text-enhancement.component.scss — major additions + text-enhancement.service.ts — add pyramidize, refineGlobal, splice RPC methods + text-enhancement.component.spec.ts + text-enhancement.service.spec.ts + features/settings/ + settings.component.ts/html — add App Defaults tab + settings.component.spec.ts — update specs + shared/hover-copy/ — reusable hover-copy directive/component (canvas + preview) +``` + +### I.2 Go RPC Types + +```go +// ── Pyramidize pipeline ────────────────────────────────────────────── + +type PyramidizeRequest struct { + Text string `json:"text"` + DocumentType string `json:"documentType"` // "auto"|"email"|"wiki"|"powerpoint"|"memo" + CommunicationStyle string `json:"communicationStyle"` // "professional"|"casual"|"concise"|"detailed"|"persuasive"|"neutral"|"diplomatic"|"direct" + RelationshipLevel string `json:"relationshipLevel"` // "close"|"professional"|"authority"|"public" + CustomInstructions string `json:"customInstructions"` // optional, not persisted +} + +type PyramidizeResult struct { + DocumentType string `json:"documentType"` + Language string `json:"language"` + FullDocument string `json:"fullDocument"` // first line = subject/title + Headers []string `json:"headers"` + QualityScore float64 `json:"qualityScore"` + QualityFlags []string `json:"qualityFlags"` + AppliedRefinement bool `json:"appliedRefinement"` + RefinementWarning string `json:"refinementWarning"` // non-empty if still below threshold after retry + DetectedType string `json:"detectedType"` // only set when AUTO was used + DetectedLang string `json:"detectedLang"` + DetectedConfidence float64 `json:"detectedConfidence"` +} + +// ── Canvas AI instructions ─────────────────────────────────────────── + +type RefineGlobalRequest struct { + FullCanvas string `json:"fullCanvas"` + OriginalText string `json:"originalText"` + Instruction string `json:"instruction"` + DocumentType string `json:"documentType"` + CommunicationStyle string `json:"communicationStyle"` + RelationshipLevel string `json:"relationshipLevel"` +} + +type RefineGlobalResult struct { + NewCanvas string `json:"newCanvas"` +} + +type SpliceRequest struct { + FullCanvas string `json:"fullCanvas"` + OriginalText string `json:"originalText"` + SelectedText string `json:"selectedText"` + Instruction string `json:"instruction"` +} + +type SpliceResult struct { + RewrittenSection string `json:"rewrittenSection"` +} + +// ── Cancel & Send Back ─────────────────────────────────────────────── + +// CancelOperation cancels whichever of Pyramidize/RefineGlobal/Splice is currently in flight. +// Safe to call when no operation is active (no-op). +// RPC method: CancelOperation() + +// SendBack writes the result to clipboard, restores focus to the captured source-app window, +// and simulates Ctrl+V to paste. Platform-specific: +// Windows: SetForegroundWindow(capturedHWND) + SendInput Ctrl+V +// Linux: xdotool windowfocus && xdotool key ctrl+v (best-effort) +// The source app window handle is captured when the hotkey fires. +// RPC method: SendBack(text string) error + +// ── App Presets ────────────────────────────────────────────────────── + +type AppPreset struct { + SourceApp string `json:"sourceApp"` + DocumentType string `json:"documentType"` +} + +// ── Settings additions ─────────────────────────────────────────────── + +// Add to Settings struct in internal/features/settings/model.go: +// AppPresets []AppPreset `json:"app_presets"` +// PyramidizeQualityThreshold float64 `json:"pyramidize_quality_threshold"` // default 0.65 + +// RPC methods: GetAppPresets() []AppPreset, SetAppPreset(preset AppPreset), DeleteAppPreset(sourceApp string) +// GetQualityThreshold() float64, SetQualityThreshold(v float64) error +``` + +### I.3 Prompt Template Structure + +Each doc-type prompt follows this structure (see v1 archive for full text; polish for v2): + +``` +[ROLE — XML tag for Claude] +You are an expert communication specialist applying the Pyramid Principle. + +[LANGUAGE RULE] +Detect and preserve the original language. Never translate. +Code-switching must be preserved. + +[DOC-TYPE RULES] +{email | wiki | memo | powerpoint specific rules} +Subject/title format, header rules, MECE principle, priority rule. + +[STYLE INJECTION] +Communication style: {style} +Relationship level: {relationship} +{customInstructions if non-empty} + +[EXAMPLES — 2-3 concrete, DE + EN] +{v1 examples carried forward, refined} + +[SELF-EVALUATION — embedded specialist criteria] +Evaluate as: +- Subject Specialist: format compliance + info density → confidence 0–1 +- MECE Specialist: mutual exclusion + collective exhaustion → confidence 0–1 +- Completeness Specialist: all people/deadlines/actions preserved → riskScore 0–1 (0=none lost) +- Style Specialist: language consistency + appropriate tone → confidence 0–1 +qualityScore = avg(confidences) - (completenessRisk * 0.2) +qualityFlags: list any of ["MECE_VIOLATION", "INFO_LOSS", "STYLE_MISMATCH", "SUBJECT_FORMAT"] + +[OUTPUT — JSON only, no fences] +{ + "fullDocument": "complete markdown with subject/title as first line", + "headers": ["H1", "H2"], + "language": "de|en|...", + "qualityScore": 0.0-1.0, + "qualityFlags": [] +} +``` + +Separate prompt files: +- `prompts_detect.go` — minimal detection prompt; strict enum EMAIL|WIKI|MEMO|POWERPOINT; Go validates + defaults to EMAIL if unrecognised +- `prompts_selfqa.go` — shared `selfQABlock` const (4 specialists, qualityScore formula, flag enum); appended to all 4 doc-type prompts +- `prompts_email.go` — email rules (subject format, MECE headers, language, DE+EN examples) + selfQABlock +- `prompts_wiki.go` — wiki rules (H1 title + H2 sections, content headers) + selfQABlock +- `prompts_memo.go` — memo rules (**TO**/**FROM**/**RE** header block + pyramid body) + selfQABlock +- `prompts_powerpoint.go` — PPT rules (`# Slide N: [Main Message]` + 3–5 bullets per slide) + selfQABlock +- `prompts_refine.go` — `buildRefinePrompt(original, failedOutput string, flags []string) string`; human-readable remediation instructions per flag (switch/case); `originalText` is hard constraint here (restoring completeness is the goal of refinement) +- `prompts_canvas.go` — global canvas instruction (`originalText` is **soft** context only, user instruction takes priority) + selection splice prompt + +### I.4 Angular State Model (module-level) + +```typescript +// Module-level — survives navigation and hide/show cycles until window close +let originalText = ''; +let pyramidizedText = ''; // snapshot after most recent foundation call +let canvasText = ''; // live working surface +let sourceApp = ''; // captured from hotkey; empty in manual flow +let docType = 'auto'; +let commStyle = 'professional'; +let relLevel = 'professional'; + +interface TraceEntry { + id: string; + label: string; // "Original" | "Pyramidize" | "AI: ..." | "Checkpoint" | "Reverted to: ..." + snapshot: string; // canvas text at this point + timestamp: Date; +} +let traceLog: TraceEntry[] = []; +let activeTab: 'original' | 'canvas' = 'original'; +let isPreviewMode = false; // canvas tab: rendered vs raw textarea +let traceLogOpen = false; +let wasCancelled = false; // set true before CancelOperation() RPC; cleared on next operation start +``` + +### I.5 Angular UI Component Structure + +**Left settings panel:** +- Doc type selector (PrimeNG Select): AUTO, EMAIL, WIKI, POWERPOINT, MEMO + - After AUTO detection: small badge `● EMAIL` appears below selector (no confidence %). Disappears on manual selection. Selector remains on "AUTO". + - Eyecatcher overlay when new source app detected (animated border + label + "Set as default" CTA) +- Communication style selector +- Relationship level selector +- Custom instructions textarea (placeholder: "Optional: 'Use formal Sie', 'Mention Q1 deadline'…") +- [Pyramidize] button with `Ctrl+↵` annotation +- Provider badge (muted): `⚫ [model] · [provider]` → click → navigate to Settings + +**Canvas area:** +- Tab bar: [Original] [Canvas] — Original tab is always editable +- Canvas tab: mode toggle [Edit ●] [Preview] +- Edit mode: ` - +
+ + +
+ + @if (!bannerDismissedView && !apiKeySet) { +
+ ⚠ No AI API key configured. + +
+ } + +
+ + + @if (detectedTypeView) { +
+ + {{ detectedTypeView }} +
+ } +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + Pyramidize + Ctrl+↵ + + + +
+ + {{ activeProvider }} +
-
- - - + +
+ + @if (isLoading) { + +
+ + {{ stepLabel }} + +
+ } @else { + + + Original + Canvas + + + + +
+ @if (!originalTextView) { +
+

Paste or type text to pyramidize.

+ +
+ } + +
+
+ + + +
+
+ + +
+ + @if (isPreviewModeView) { +
+ } @else { +
+ +
+ } + + + @if (showSelectionBubble && !isPreviewModeView) { +
+ + + +
+ } +
+
+
+
+ } + + + @if (errorMessage) { +
+ ❌ {{ errorMessage }} + + +
+ } + + + @if (refinementWarning) { +
+ ⚠ {{ refinementWarning }} +
+ } + + +
+ + + + Apply + Ctrl+↵ + + +
+ + +
+ + + @if (sourceAppView) { + + } +
- @if (error) { - - } + +
+ @if (traceLogOpenView) { +
+ Trace Log + + +
+
+ @for (entry of traceLogView; track entry.id) { +
+ {{ entry.label }} + {{ formatTime(entry.timestamp) }} +
+ } +
+ + @if (peekEntry) { +
+
+ {{ peekEntry.label }} + +
+
{{ peekEntry.snapshot }}
+ +
+ } + } @else { +
+ +
+ } +
`, styles: [` - .enhance-page { display: flex; flex-direction: column; gap: 1rem; padding: 2.75rem; height: 100%; box-sizing: border-box; } - .hint-text { margin: 0; font-size: 0.875rem; color: var(--p-text-muted-color); } - .enhance-textareas { display: flex; gap: 2.75rem; flex: 1; } - .enhance-textarea { flex: 1; resize: none; min-height: 200px; } - .enhance-actions { display: flex; gap: 0.5rem; } + :host { display: block; height: 100%; } + + .pyramidize-page { + display: flex; + flex-direction: row; + height: 100%; + overflow: hidden; + gap: 0; + } + + /* ── Left panel ── */ + .left-panel { + width: 280px; + min-width: 280px; + display: flex; + flex-direction: column; + gap: 0.75rem; + padding: 1rem; + border-right: 1px solid var(--p-content-border-color); + overflow-y: auto; + } + + .api-key-banner { + background: var(--p-amber-100, #fef3c7); + color: var(--p-amber-900, #78350f); + border: 1px solid var(--p-amber-300, #fcd34d); + border-radius: 6px; + padding: 0.5rem 0.75rem; + font-size: 0.8rem; + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; + } + + .detection-badge { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.75rem; + color: var(--p-primary-color); + font-weight: 600; + letter-spacing: 0.05em; + margin-top: 0.25rem; + } + .detection-dot { font-size: 0.6rem; } + + .form-group { + display: flex; + flex-direction: column; + gap: 0.3rem; + } + label { + font-size: 0.8rem; + color: var(--p-text-muted-color); + } + + .custom-instructions-textarea { + width: 100%; + resize: vertical; + font-size: 0.85rem; + } + + .pyramidize-btn-full { + width: 100%; + } + .pyramidize-btn-full ::ng-deep button { + width: 100%; + justify-content: space-between; + } + + .shortcut-hint { + font-size: 0.7rem; + opacity: 0.6; + margin-left: 0.5rem; + } + + .provider-badge { + display: flex; + align-items: center; + gap: 0.4rem; + cursor: pointer; + padding: 0.35rem 0.5rem; + border-radius: 4px; + font-size: 0.78rem; + color: var(--p-text-muted-color); + transition: background 0.15s; + } + .provider-badge:hover { background: var(--p-content-hover-background); } + .provider-dot { font-size: 0.55rem; } + .provider-name { font-size: 0.78rem; } + + /* ── Canvas area ── */ + .canvas-area { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + padding: 1rem; + gap: 0.75rem; + min-width: 0; + } + + .step-indicator { + display: flex; + align-items: center; + gap: 1rem; + padding: 1rem; + background: var(--p-content-hover-background); + border-radius: 8px; + } + .step-spinner { width: 24px; height: 24px; } + .step-label { flex: 1; font-size: 0.9rem; } + + .tab-panel-content { + position: relative; + display: flex; + flex-direction: column; + gap: 0.5rem; + } + + .empty-original { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + display: flex; + flex-direction: column; + align-items: center; + gap: 0.75rem; + pointer-events: none; + z-index: 1; + } + .empty-original p-button { pointer-events: all; } + .hint-text { font-size: 0.85rem; color: var(--p-text-muted-color); margin: 0; } + + .canvas-textarea { + width: 100%; + min-height: 320px; + resize: vertical; + font-family: var(--p-font-family); + font-size: 0.9rem; + line-height: 1.6; + } + + .canvas-mode-toggle { + display: flex; + gap: 0.5rem; + margin-bottom: 0.5rem; + } + + .canvas-preview { + min-height: 320px; + padding: 1rem; + border: 1px solid var(--p-content-border-color); + border-radius: 6px; + overflow-y: auto; + line-height: 1.7; + } + .canvas-preview ::ng-deep h1 { font-size: 1.4rem; margin: 0.5rem 0; } + .canvas-preview ::ng-deep h2 { font-size: 1.2rem; margin: 0.5rem 0; } + .canvas-preview ::ng-deep h3 { font-size: 1rem; margin: 0.4rem 0; } + .canvas-preview ::ng-deep p { margin: 0.4rem 0; } + .canvas-preview ::ng-deep ul, .canvas-preview ::ng-deep ol { padding-left: 1.5rem; margin: 0.4rem 0; } + .canvas-preview ::ng-deep code { + background: var(--p-content-hover-background); + padding: 1px 4px; + border-radius: 3px; + font-family: monospace; + font-size: 0.85em; + } + + .canvas-edit-wrapper { + position: relative; + } + + /* Selection bubble */ + .selection-bubble { + position: fixed; + background: var(--p-surface-overlay, var(--p-surface-card)); + border: 1px solid var(--p-content-border-color); + border-radius: 8px; + padding: 0.5rem; + display: flex; + gap: 0.4rem; + align-items: center; + z-index: 1000; + box-shadow: 0 4px 16px rgba(0,0,0,0.25); + } + .bubble-input { width: 180px; font-size: 0.85rem; } + + /* Error row */ + .error-row { + display: flex; + align-items: center; + gap: 0.75rem; + color: var(--p-red-400, #f87171); + font-size: 0.85rem; + padding: 0.5rem; + background: var(--p-content-hover-background); + border-radius: 6px; + } + + .refinement-warning { + font-size: 0.8rem; + color: var(--p-amber-400, #fbbf24); + padding: 0.4rem 0.5rem; + } + + /* Instruction bar */ + .instruction-bar { + display: flex; + gap: 0.5rem; + align-items: center; + border-top: 1px solid var(--p-content-border-color); + padding-top: 0.75rem; + } + .instruction-input { flex: 1; } + + /* Action row */ + .action-row { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; + } + + /* ── Trace log panel ── */ + .trace-panel { + width: 260px; + min-width: 260px; + border-left: 1px solid var(--p-content-border-color); + display: flex; + flex-direction: column; + overflow: hidden; + transition: width 0.2s ease; + } + .trace-panel.collapsed { + width: 42px; + min-width: 42px; + } + + .trace-icon-strip { + display: flex; + flex-direction: column; + align-items: center; + padding: 0.5rem 0; + } + + .trace-header { + display: flex; + align-items: center; + gap: 0.25rem; + padding: 0.5rem 0.75rem; + border-bottom: 1px solid var(--p-content-border-color); + } + .trace-title { flex: 1; font-size: 0.8rem; font-weight: 600; } + + .trace-list { + flex: 1; + overflow-y: auto; + padding: 0.25rem 0; + } + + .trace-entry { + display: flex; + flex-direction: column; + padding: 0.4rem 0.75rem; + cursor: pointer; + border-bottom: 1px solid var(--p-content-border-color); + transition: background 0.1s; + } + .trace-entry:hover { background: var(--p-content-hover-background); } + .trace-entry.active { background: var(--p-highlight-background); } + .trace-label { font-size: 0.8rem; } + .trace-time { font-size: 0.7rem; color: var(--p-text-muted-color); } + + .trace-peek { + border-top: 1px solid var(--p-content-border-color); + padding: 0.5rem 0.75rem; + display: flex; + flex-direction: column; + gap: 0.4rem; + } + .trace-peek-header { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 0.8rem; + font-weight: 600; + } + .trace-peek-content { + font-size: 0.75rem; + max-height: 120px; + overflow-y: auto; + white-space: pre-wrap; + word-break: break-word; + background: var(--p-content-hover-background); + border-radius: 4px; + padding: 0.4rem; + margin: 0; + } `], }) export class TextEnhancementComponent implements OnInit, OnDestroy { - inputText = ''; - outputText = ''; - loading = false; - error = ''; + // ── Component views (mirror module-level state) ── + get originalTextView(): string { return originalText; } + set originalTextView(v: string) { originalText = v; } + + get canvasTextView(): string { return canvasText; } + set canvasTextView(v: string) { canvasText = v; } + + get docTypeView(): string { return docType; } + set docTypeView(v: string) { docType = v; } + + get commStyleView(): string { return commStyle; } + set commStyleView(v: string) { commStyle = v; } + + get relLevelView(): string { return relLevel; } + set relLevelView(v: string) { relLevel = v; } + + get traceLogView(): TraceEntry[] { return traceLog; } + + get activeTabView(): string { return activeTab; } + + get isPreviewModeView(): boolean { return isPreviewMode; } + + get traceLogOpenView(): boolean { return traceLogOpen; } + + get sourceAppView(): string { return sourceApp; } + + get bannerDismissedView(): boolean { return bannerDismissed; } + + // ── Component-local state (does not need to persist across navigation) ── + isLoading = false; + stepLabel = ''; + errorMessage = ''; + refinementWarning = ''; + apiKeySet = true; + activeProvider = ''; + customInstructions = ''; + globalInstruction = ''; + detectedTypeView = ''; + + // Selection bubble + showSelectionBubble = false; + bubbleX = 0; + bubbleY = 0; + selectionInstruction = ''; + private selectionStart = 0; + private selectionEnd = 0; + + // Trace peek + peekEntry: TraceEntry | null = null; + + // Retry state + private lastRequest: (() => Promise) | null = null; private sub?: Subscription; + @ViewChild('canvasTextarea') canvasTextareaRef?: ElementRef; + + readonly docTypeOptions = [ + { label: 'AUTO (detect)', value: 'auto' }, + { label: 'Email', value: 'email' }, + { label: 'Wiki', value: 'wiki' }, + { label: 'PowerPoint', value: 'powerpoint' }, + { label: 'Memo', value: 'memo' }, + ]; + + readonly commStyleOptions = [ + { label: 'Professional', value: 'professional' }, + { label: 'Casual', value: 'casual' }, + { label: 'Concise', value: 'concise' }, + { label: 'Detailed', value: 'detailed' }, + { label: 'Persuasive', value: 'persuasive' }, + { label: 'Neutral', value: 'neutral' }, + { label: 'Diplomatic', value: 'diplomatic' }, + { label: 'Direct', value: 'direct' }, + ]; + + readonly relLevelOptions = [ + { label: 'Professional', value: 'professional' }, + { label: 'Close', value: 'close' }, + { label: 'Authority', value: 'authority' }, + { label: 'Public', value: 'public' }, + ]; + constructor( private readonly wails: WailsService, private readonly svc: TextEnhancementService, private readonly cdr: ChangeDetectorRef, + private readonly router: Router, ) {} - ngOnInit(): void { - // Listen for shortcut events from backend — auto-populate from clipboard. + async ngOnInit(): Promise { + // Load source app name, check API key status + sourceApp = await this.wails.getSourceApp(); + const settings = await this.wails.loadSettings(); + this.activeProvider = settings.active_provider ?? ''; + const keyStatus = await this.wails.getKeyStatus(settings.active_provider ?? ''); + this.apiKeySet = keyStatus.is_set; + this.cdr.detectChanges(); + + // Subscribe to hotkey shortcut events this.sub = this.wails.shortcutTriggered$.subscribe(async () => { - this.inputText = await this.wails.readClipboard(); + const clipboardContent = await this.wails.readClipboard(); + sourceApp = await this.wails.getSourceApp(); + + if (originalText && !confirm('Replace current session with new clipboard content?')) { + return; + } + + wasCancelled = false; + originalText = clipboardContent; + pyramidizedText = ''; + canvasText = ''; + traceLog = []; + this.detectedTypeView = ''; + activeTab = 'original'; + this.errorMessage = ''; + this.refinementWarning = ''; + + if (originalText.trim()) { + addTrace('Original', originalText); + } this.cdr.detectChanges(); - await this.enhance(); }); } - async enhance(): Promise { - if (!this.inputText.trim()) return; - this.loading = true; - this.error = ''; + onOriginalChange(value: string): void { + originalText = value; + } + + onCanvasChange(value: string): void { + canvasText = value; + } + + onDocTypeChange(): void { + // Clear detection indicator when user manually picks a type + if (docType !== 'auto') { + this.detectedTypeView = ''; + } + } + + onTabChange(value: unknown): void { + activeTab = value as 'original' | 'canvas'; + } + + setPreviewMode(preview: boolean): void { + isPreviewMode = preview; + } + + toggleTraceLog(): void { + traceLogOpen = !traceLogOpen; + this.peekEntry = null; + } + + dismissBanner(): void { + bannerDismissed = true; + } + + // ── Original textarea keyboard shortcut ── + onOriginalKeydown(event: KeyboardEvent): void { + if (event.ctrlKey && event.key === 'Enter') { + event.preventDefault(); + void this.pyramidize(); + } + } + + // ── Canvas textarea keyboard shortcut ── + onCanvasKeydown(event: KeyboardEvent): void { + if (event.ctrlKey && event.key === 'Enter') { + event.preventDefault(); + void this.applyGlobalInstruction(); + } + } + + async pasteFromClipboard(): Promise { + const text = await this.wails.readClipboard(); + originalText = text; + if (originalText.trim()) { + addTrace('Original', originalText); + } + this.cdr.detectChanges(); + } + + async pyramidize(): Promise { + if (!originalText.trim()) return; + + if (canvasText.trim()) { + if (!confirm('Re-pyramidize? The current canvas will be saved to the trace log.')) { + return; + } + addTrace('Canvas (saved)', canvasText); + } + + wasCancelled = false; + this.errorMessage = ''; + this.refinementWarning = ''; + this.isLoading = true; + this.stepLabel = 'Step 1/2: Detecting…'; + this.cdr.detectChanges(); + + const req = { + text: originalText, + documentType: docType, + communicationStyle: commStyle, + relationshipLevel: relLevel, + customInstructions: this.customInstructions, + }; + + const doCall = async (): Promise => { + this.stepLabel = docType === 'auto' ? 'Step 1/2: Detecting…' : 'Step 1/2: Structuring…'; + this.cdr.detectChanges(); + + const result = await this.svc.pyramidize(req); + + if (docType === 'auto' && result.detectedType) { + this.detectedTypeView = result.detectedType.toUpperCase(); + this.stepLabel = 'Step 2/2: Structuring…'; + this.cdr.detectChanges(); + } + + pyramidizedText = result.fullDocument; + canvasText = result.fullDocument; + this.refinementWarning = result.refinementWarning ?? ''; + + addTrace('Pyramidized', canvasText); + activeTab = 'canvas'; + }; + + this.lastRequest = async () => { + this.isLoading = true; + this.errorMessage = ''; + this.stepLabel = 'Step 1/2: Detecting…'; + this.cdr.detectChanges(); + try { + await doCall(); + } finally { + this.isLoading = false; + this.cdr.detectChanges(); + } + }; + + try { + await doCall(); + } catch (e: unknown) { + if (!wasCancelled) { + this.errorMessage = `Pyramidize failed: ${e instanceof Error ? e.message : String(e)}`; + } + } finally { + this.isLoading = false; + this.cdr.detectChanges(); + } + } + + async cancelOperation(): Promise { + wasCancelled = true; + await this.svc.cancelOperation(); + this.isLoading = false; + this.stepLabel = ''; + this.cdr.detectChanges(); + } + + async applyGlobalInstruction(): Promise { + if (!this.globalInstruction.trim() || !canvasText.trim()) return; + + const instruction = this.globalInstruction; + this.isLoading = true; + this.stepLabel = 'Refining…'; + this.errorMessage = ''; + wasCancelled = false; + this.cdr.detectChanges(); + + try { + const result = await this.svc.refineGlobal({ + fullCanvas: canvasText, + originalText, + instruction, + documentType: docType, + communicationStyle: commStyle, + relationshipLevel: relLevel, + }); + addTrace(`Refined: "${instruction.slice(0, 30)}"`, canvasText); + canvasText = result.newCanvas; + this.globalInstruction = ''; + } catch (e: unknown) { + if (!wasCancelled) { + this.errorMessage = `Refine failed: ${e instanceof Error ? e.message : String(e)}`; + } + } finally { + this.isLoading = false; + this.cdr.detectChanges(); + } + } + + onCanvasMouseUp(event: MouseEvent): void { + const sel = window.getSelection(); + if (!sel || sel.isCollapsed || !sel.toString().trim()) { + this.showSelectionBubble = false; + this.cdr.detectChanges(); + return; + } + + const textarea = this.canvasTextareaRef?.nativeElement; + if (textarea) { + this.selectionStart = textarea.selectionStart; + this.selectionEnd = textarea.selectionEnd; + } + + this.showSelectionBubble = true; + this.bubbleX = event.clientX - 100; + this.bubbleY = event.clientY - 80; + this.selectionInstruction = ''; + this.cdr.detectChanges(); + } + + closeSelectionBubble(): void { + this.showSelectionBubble = false; + this.selectionInstruction = ''; + } + + async applySelectionInstruction(): Promise { + if (!this.selectionInstruction.trim()) return; + + const textarea = this.canvasTextareaRef?.nativeElement; + const start = textarea ? textarea.selectionStart : this.selectionStart; + const end = textarea ? textarea.selectionEnd : this.selectionEnd; + const selectedText = canvasText.slice(start, end); + + if (!selectedText.trim()) { + this.closeSelectionBubble(); + return; + } + + const instruction = this.selectionInstruction; + this.closeSelectionBubble(); + this.isLoading = true; + this.stepLabel = 'Splicing…'; + wasCancelled = false; + this.cdr.detectChanges(); + try { - this.outputText = await this.svc.enhance(this.inputText); + const result = await this.svc.splice({ + fullCanvas: canvasText, + originalText, + selectedText, + instruction, + }); + const before = canvasText.slice(0, start); + const after = canvasText.slice(end); + const oldCanvas = canvasText; + addTrace(`Splice: "${instruction.slice(0, 30)}"`, oldCanvas); + canvasText = before + result.rewrittenSection + after; } catch (e: unknown) { - this.error = e instanceof Error ? e.message : String(e); + if (!wasCancelled) { + this.errorMessage = `Splice failed: ${e instanceof Error ? e.message : String(e)}`; + } } finally { - this.loading = false; + this.isLoading = false; this.cdr.detectChanges(); } } - async copyResult(): Promise { - await navigator.clipboard.writeText(this.outputText); + addCheckpoint(): void { + if (canvasText) { + addTrace('Checkpoint', canvasText); + this.cdr.detectChanges(); + } + } + + peekTrace(entry: TraceEntry): void { + this.peekEntry = entry; + this.cdr.detectChanges(); + } + + closePeek(): void { + this.peekEntry = null; + } + + revertTo(entry: TraceEntry): void { + addTrace(`Reverted to: ${entry.label}`, canvasText); + canvasText = entry.snapshot; + this.peekEntry = null; + activeTab = 'canvas'; + this.cdr.detectChanges(); + } + + async copyAsMarkdown(): Promise { + await navigator.clipboard.writeText(canvasText); + } + + async copyAsRichText(): Promise { + const pipe = new MarkdownPipe(); + const html = pipe.transform(canvasText); + const plain = canvasText; + try { + await navigator.clipboard.write([ + new ClipboardItem({ + 'text/html': new Blob([html], { type: 'text/html' }), + 'text/plain': new Blob([plain], { type: 'text/plain' }), + }), + ]); + } catch { + // Fallback: write plain text + await navigator.clipboard.writeText(plain); + } + } + + async sendBack(): Promise { + await this.svc.sendBack(canvasText); + } + + goToSettings(): void { + void this.router.navigate(['/settings']); + } + + async retry(): Promise { + if (this.lastRequest) { + await this.lastRequest(); + } } - async writeToClipboard(): Promise { - await this.wails.writeClipboard(this.outputText); + formatTime(d: Date): string { + return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }); } ngOnDestroy(): void { diff --git a/frontend/src/app/features/text-enhancement/text-enhancement.service.spec.ts b/frontend/src/app/features/text-enhancement/text-enhancement.service.spec.ts index 1d5110d..3269e78 100644 --- a/frontend/src/app/features/text-enhancement/text-enhancement.service.spec.ts +++ b/frontend/src/app/features/text-enhancement/text-enhancement.service.spec.ts @@ -2,17 +2,28 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { TestBed } from '@angular/core/testing'; import { TextEnhancementService } from './text-enhancement.service'; import { WailsService } from '../../core/wails.service'; -import { createWailsMock, defaultSettings } from '../../../testing/wails-mock'; +import { createWailsMock } from '../../../testing/wails-mock'; describe('TextEnhancementService', () => { let svc: TextEnhancementService; let wailsMock: ReturnType; - let fetchSpy: ReturnType; + + const mockPyramidizeResult = { + documentType: 'EMAIL', + language: 'en', + fullDocument: 'Body text', + headers: [], + qualityScore: 0.9, + qualityFlags: [], + appliedRefinement: false, + refinementWarning: '', + detectedType: 'EMAIL', + detectedLang: 'en', + detectedConfidence: 0.95, + }; beforeEach(() => { wailsMock = createWailsMock(); - // Default: backend enhance succeeds - wailsMock.enhance.mockResolvedValue('Backend enhanced text.'); TestBed.configureTestingModule({ providers: [ @@ -21,71 +32,99 @@ describe('TextEnhancementService', () => { ], }); svc = TestBed.inject(TextEnhancementService); - - fetchSpy = vi.spyOn(globalThis, 'fetch'); }); afterEach(() => { vi.restoreAllMocks(); }); - // --- Primary path: Go backend --- + // ── Legacy enhance() path ── - it('delegates to wails.enhance() and returns the result', async () => { + it('enhance() delegates to wails.enhance() and returns the result', async () => { + wailsMock.enhance.mockResolvedValue('Backend enhanced text.'); const result = await svc.enhance('bad grammer'); expect(wailsMock.enhance).toHaveBeenCalledWith('bad grammer'); expect(result).toBe('Backend enhanced text.'); - expect(fetchSpy).not.toHaveBeenCalled(); }); - it('propagates backend errors to the caller', async () => { - wailsMock.enhance.mockRejectedValue(new Error('Anthropic API key is not configured')); - await expect(svc.enhance('text')).rejects.toThrow('Anthropic API key is not configured'); + // ── Pyramidize delegation ── + + it('pyramidize() delegates to wails.pyramidize()', async () => { + wailsMock.pyramidize.mockResolvedValue(mockPyramidizeResult); + const req = { text: 'hello', documentType: 'auto', communicationStyle: 'professional', relationshipLevel: 'professional', customInstructions: '' }; + const result = await svc.pyramidize(req); + expect(wailsMock.pyramidize).toHaveBeenCalledWith(req); + expect(result).toEqual(mockPyramidizeResult); }); - // --- Browser-mode fallback path (Wails runtime unavailable) --- + // ── RefineGlobal delegation ── - it('falls back to direct OpenAI fetch when Wails runtime is unavailable', async () => { - // Simulate Wails runtime not initialised (synchronous-style error message) - wailsMock.enhance.mockRejectedValue(new Error('Call is not a function (wails runtime)')); - wailsMock.loadSettings.mockResolvedValue({ ...defaultSettings, active_provider: 'openai' }); - wailsMock.getKey.mockResolvedValue('sk-test-key'); + it('refineGlobal() delegates to wails.refineGlobal()', async () => { + const mockResult = { newCanvas: 'Refined text' }; + wailsMock.refineGlobal.mockResolvedValue(mockResult); + const req = { fullCanvas: 'canvas', originalText: 'orig', instruction: 'shorter', documentType: 'email', communicationStyle: 'professional', relationshipLevel: 'professional' }; + const result = await svc.refineGlobal(req); + expect(wailsMock.refineGlobal).toHaveBeenCalledWith(req); + expect(result).toEqual(mockResult); + }); + + // ── Splice delegation ── - const mockResponse = { choices: [{ message: { content: 'OpenAI fixed.' } }] }; - fetchSpy.mockResolvedValue(new Response(JSON.stringify(mockResponse), { status: 200 })); + it('splice() delegates to wails.splice()', async () => { + const mockResult = { rewrittenSection: 'New section' }; + wailsMock.splice.mockResolvedValue(mockResult); + const req = { fullCanvas: 'canvas', originalText: 'orig', selectedText: 'selected', instruction: 'rewrite' }; + const result = await svc.splice(req); + expect(wailsMock.splice).toHaveBeenCalledWith(req); + expect(result).toEqual(mockResult); + }); - const result = await svc.enhance('bad text'); + // ── CancelOperation delegation ── - expect(fetchSpy).toHaveBeenCalledWith( - 'https://api.openai.com/v1/chat/completions', - expect.objectContaining({ method: 'POST' }), - ); - expect(result).toBe('OpenAI fixed.'); + it('cancelOperation() delegates to wails.cancelOperation()', async () => { + await svc.cancelOperation(); + expect(wailsMock.cancelOperation).toHaveBeenCalled(); }); - it('falls back to direct Ollama fetch when Wails runtime is unavailable', async () => { - wailsMock.enhance.mockRejectedValue(new Error('wails runtime not available')); - wailsMock.loadSettings.mockResolvedValue({ - ...defaultSettings, - active_provider: 'ollama', - providers: { ollama_url: 'http://localhost:11434', aws_region: '' }, - }); - const mockResponse = { response: 'Ollama fixed.' }; - fetchSpy.mockResolvedValue(new Response(JSON.stringify(mockResponse), { status: 200 })); + // ── AppPresets delegation ── - const result = await svc.enhance('some text'); + it('getAppPresets() delegates to wails.getAppPresets()', async () => { + const mockPresets = [{ sourceApp: 'Outlook', documentType: 'email' }]; + wailsMock.getAppPresets.mockResolvedValue(mockPresets); + const result = await svc.getAppPresets(); + expect(wailsMock.getAppPresets).toHaveBeenCalled(); + expect(result).toEqual(mockPresets); + }); + + it('setAppPreset() delegates to wails.setAppPreset()', async () => { + const preset = { sourceApp: 'Outlook', documentType: 'email' }; + await svc.setAppPreset(preset); + expect(wailsMock.setAppPreset).toHaveBeenCalledWith(preset); + }); + + it('deleteAppPreset() delegates to wails.deleteAppPreset()', async () => { + await svc.deleteAppPreset('Outlook'); + expect(wailsMock.deleteAppPreset).toHaveBeenCalledWith('Outlook'); + }); + + // ── QualityThreshold delegation ── + + it('getQualityThreshold() delegates to wails.getQualityThreshold()', async () => { + wailsMock.getQualityThreshold.mockResolvedValue(0.75); + const result = await svc.getQualityThreshold(); + expect(wailsMock.getQualityThreshold).toHaveBeenCalled(); + expect(result).toBe(0.75); + }); - expect(fetchSpy).toHaveBeenCalledWith( - 'http://localhost:11434/api/generate', - expect.objectContaining({ method: 'POST' }), - ); - expect(result).toBe('Ollama fixed.'); + it('setQualityThreshold() delegates to wails.setQualityThreshold()', async () => { + await svc.setQualityThreshold(0.8); + expect(wailsMock.setQualityThreshold).toHaveBeenCalledWith(0.8); }); - it('throws for unknown provider in browser fallback', async () => { - wailsMock.enhance.mockRejectedValue(new Error('wails runtime error')); - wailsMock.loadSettings.mockResolvedValue({ ...defaultSettings, active_provider: 'unknown' as never }); + // ── enhance() propagates errors ── - await expect(svc.enhance('text')).rejects.toThrow('Unknown provider: unknown'); + it('enhance() propagates backend errors to caller', async () => { + wailsMock.enhance.mockRejectedValue(new Error('API key not configured')); + await expect(svc.enhance('text')).rejects.toThrow('API key not configured'); }); }); diff --git a/frontend/src/app/features/text-enhancement/text-enhancement.service.ts b/frontend/src/app/features/text-enhancement/text-enhancement.service.ts index 9129797..893456b 100644 --- a/frontend/src/app/features/text-enhancement/text-enhancement.service.ts +++ b/frontend/src/app/features/text-enhancement/text-enhancement.service.ts @@ -1,104 +1,58 @@ import { Injectable } from '@angular/core'; -import { WailsService } from '../../core/wails.service'; +import { WailsService, PyramidizeRequest, PyramidizeResult, RefineGlobalRequest, RefineGlobalResult, SpliceRequest, SpliceResult, AppPreset } from '../../core/wails.service'; + +export type { PyramidizeRequest, PyramidizeResult, RefineGlobalRequest, RefineGlobalResult, SpliceRequest, SpliceResult, AppPreset }; @Injectable({ providedIn: 'root' }) export class TextEnhancementService { constructor(private readonly wails: WailsService) {} - async enhance(text: string): Promise { - try { - // Primary path: Go backend handles the API call (no WebView network-policy issues). - return await this.wails.enhance(text); - } catch (backendErr: unknown) { - // If the Wails runtime is unavailable (browser dev / Playwright mode) the call throws - // synchronously before returning a promise. Fall back to direct fetch in that case. - // In the real Wails app this branch is never reached — backend errors propagate as-is. - if (this.isWailsUnavailableError(backendErr)) { - return this.enhanceBrowserFallback(text); - } - throw backendErr; - } + pyramidize(req: PyramidizeRequest): Promise { + return this.wails.pyramidize(req); + } + + refineGlobal(req: RefineGlobalRequest): Promise { + return this.wails.refineGlobal(req); + } + + splice(req: SpliceRequest): Promise { + return this.wails.splice(req); + } + + cancelOperation(): Promise { + return this.wails.cancelOperation(); + } + + sendBack(text: string): Promise { + return this.wails.sendBack(text); } - // Returns true when the error indicates the Wails runtime is simply not present - // (browser dev mode), as opposed to a real backend error. - private isWailsUnavailableError(err: unknown): boolean { - const msg = err instanceof Error ? err.message : String(err); - return msg.includes('wails') || msg.includes('Call') || msg.includes('runtime'); + getSourceApp(): Promise { + return this.wails.getSourceApp(); } - // Browser-mode fallback: calls the AI provider API directly from the browser. - // Used by Playwright E2E tests (with page.route() CORS proxy) and ng-serve dev. - private async enhanceBrowserFallback(text: string): Promise { - const settings = await this.wails.loadSettings(); + getAppPresets(): Promise { + return this.wails.getAppPresets(); + } + + setAppPreset(preset: AppPreset): Promise { + return this.wails.setAppPreset(preset); + } - switch (settings.active_provider) { - case 'openai': - return this.callOpenAI(text, await this.wails.getKey('openai')); - case 'claude': - return this.callClaude(text); - case 'ollama': - return this.callOllama(text, settings.providers.ollama_url); - case 'bedrock': - throw new Error('AWS Bedrock is not yet supported. Please select a different provider.'); - default: - throw new Error(`Unknown provider: ${settings.active_provider}`); - } + deleteAppPreset(sourceApp: string): Promise { + return this.wails.deleteAppPreset(sourceApp); } - private async callOpenAI(text: string, apiKey: string): Promise { - if (!apiKey) throw new Error('OpenAI API key is not configured. Go to Settings → AI Providers to add it.'); - const res = await fetch('https://api.openai.com/v1/chat/completions', { - method: 'POST', - headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' }, - body: JSON.stringify({ - model: 'gpt-4o-mini', - messages: [ - { role: 'system', content: 'You are a professional text editor. Fix grammar, spelling, and improve clarity. Return only the improved text.' }, - { role: 'user', content: text }, - ], - }), - }); - if (!res.ok) throw new Error(`OpenAI error: ${res.status} ${res.statusText}`); - const json = await res.json() as { choices: Array<{ message: { content: string } }> }; - return json.choices[0].message.content; + getQualityThreshold(): Promise { + return this.wails.getQualityThreshold(); } - private async callClaude(text: string): Promise { - // In Playwright/browser-dev mode: read key from localStorage (injected by test). - const apiKey = typeof localStorage !== 'undefined' ? localStorage.getItem('_e2e_apikey_claude') ?? '' : ''; - if (!apiKey) throw new Error( - 'Anthropic API key is not configured for browser mode. ' + - 'In the desktop app the key is read from the OS keyring automatically.', - ); - const res = await fetch('https://api.anthropic.com/v1/messages', { - method: 'POST', - headers: { 'x-api-key': apiKey, 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json' }, - body: JSON.stringify({ - model: 'claude-haiku-4-5-20251001', - max_tokens: 2048, - system: 'You are a professional text editor. Fix grammar, spelling, and improve clarity. Return only the improved text.', - messages: [{ role: 'user', content: text }], - }), - }); - if (!res.ok) throw new Error(`Claude error: ${res.status} ${res.statusText}`); - const json = await res.json() as { content: Array<{ text: string }> }; - return json.content[0].text; + setQualityThreshold(v: number): Promise { + return this.wails.setQualityThreshold(v); } - private async callOllama(text: string, baseUrl: string): Promise { - const base = baseUrl || 'http://localhost:11434'; - const res = await fetch(`${base}/api/generate`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - model: 'llama3.2', - prompt: `Fix grammar, spelling, and improve clarity. Return only the improved text.\n\nText: ${text}`, - stream: false, - }), - }); - if (!res.ok) throw new Error(`Ollama error: ${res.status} ${res.statusText}`); - const json = await res.json() as { response: string }; - return json.response; + // Keep enhance() for backward compatibility with remaining callers. + enhance(text: string): Promise { + return this.wails.enhance(text); } } diff --git a/frontend/src/testing/wails-mock.ts b/frontend/src/testing/wails-mock.ts index fff209b..b89d480 100644 --- a/frontend/src/testing/wails-mock.ts +++ b/frontend/src/testing/wails-mock.ts @@ -15,6 +15,8 @@ export const defaultSettings: Settings = { debug_logging: false, sensitive_logging: false, update_channel: '', + app_presets: [], + pyramidize_quality_threshold: 0.65, }; export const defaultKeyStatus: KeyStatus = { is_set: false, source: 'none' }; @@ -56,7 +58,33 @@ export function createWailsMock() { checkForUpdate: vi.fn().mockResolvedValue({ ...defaultUpdateInfo }), downloadAndInstall: vi.fn().mockResolvedValue(undefined), log: vi.fn().mockResolvedValue(undefined), + pasteToForeground: vi.fn().mockResolvedValue(undefined), ngOnDestroy: vi.fn(), + + // Pyramidize mocks + pyramidize: vi.fn().mockResolvedValue({ + documentType: 'EMAIL', + language: 'en', + fullDocument: 'Subject | Details | Actions\n\nBody text', + headers: ['Header 1'], + qualityScore: 0.9, + qualityFlags: [], + appliedRefinement: false, + refinementWarning: '', + detectedType: 'EMAIL', + detectedLang: 'en', + detectedConfidence: 0.95, + }), + refineGlobal: vi.fn().mockResolvedValue({ newCanvas: 'Refined canvas text' }), + splice: vi.fn().mockResolvedValue({ rewrittenSection: 'Rewritten section' }), + cancelOperation: vi.fn().mockResolvedValue(undefined), + sendBack: vi.fn().mockResolvedValue(undefined), + getSourceApp: vi.fn().mockResolvedValue(''), + getAppPresets: vi.fn().mockResolvedValue([]), + setAppPreset: vi.fn().mockResolvedValue(undefined), + deleteAppPreset: vi.fn().mockResolvedValue(undefined), + getQualityThreshold: vi.fn().mockResolvedValue(0.65), + setQualityThreshold: vi.fn().mockResolvedValue(undefined), }; } diff --git a/internal/features/pyramidize/api_claude.go b/internal/features/pyramidize/api_claude.go new file mode 100644 index 0000000..f4937b1 --- /dev/null +++ b/internal/features/pyramidize/api_claude.go @@ -0,0 +1,60 @@ +package pyramidize + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + + "keylint/internal/logger" +) + +// callClaude sends a system + user message pair to the Anthropic Messages API +// and returns the raw text of the first content block. +func callClaude(client *http.Client, systemPrompt, userMessage, apiKey string) (string, error) { + payload, err := json.Marshal(map[string]any{ + "model": "claude-haiku-4-5-20251001", + "max_tokens": 4096, + "system": systemPrompt, + "messages": []map[string]string{ + {"role": "user", "content": userMessage}, + }, + }) + if err != nil { + return "", fmt.Errorf("pyramidize/claude: marshal error: %w", err) + } + + logger.Sensitive("pyramidize: claude request", "len", len(payload)) + + req, err := http.NewRequest(http.MethodPost, "https://api.anthropic.com/v1/messages", bytes.NewReader(payload)) + if err != nil { + return "", fmt.Errorf("pyramidize/claude: build request: %w", err) + } + req.Header.Set("x-api-key", apiKey) + req.Header.Set("anthropic-version", "2023-06-01") + req.Header.Set("Content-Type", "application/json") + + resp, err := client.Do(req) + if err != nil { + return "", fmt.Errorf("pyramidize/claude: request failed: %w", err) + } + defer resp.Body.Close() + + body, _ := io.ReadAll(resp.Body) + logger.Sensitive("pyramidize: claude response", "status", resp.StatusCode, "len", len(body)) + + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("pyramidize/claude: error %d: %s", resp.StatusCode, body) + } + + var result struct { + Content []struct { + Text string `json:"text"` + } `json:"content"` + } + if err := json.Unmarshal(body, &result); err != nil || len(result.Content) == 0 { + return "", fmt.Errorf("pyramidize/claude: unexpected response: %s", body) + } + return result.Content[0].Text, nil +} diff --git a/internal/features/pyramidize/api_ollama.go b/internal/features/pyramidize/api_ollama.go new file mode 100644 index 0000000..d9ec768 --- /dev/null +++ b/internal/features/pyramidize/api_ollama.go @@ -0,0 +1,62 @@ +package pyramidize + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + + "keylint/internal/logger" +) + +// callOllama sends a combined system+user prompt to the Ollama /api/generate endpoint +// and returns the raw response string. JSON output mode is not enforced at the API +// level for Ollama; unmarshalRobust handles any fence stripping needed. +func callOllama(client *http.Client, systemPrompt, userMessage, baseURL string) (string, error) { + if baseURL == "" { + baseURL = "http://localhost:11434" + } + + // Ollama /api/generate takes a single "prompt" field. + // We combine system and user content with a clear separator. + combinedPrompt := systemPrompt + "\n\n---\n\n" + userMessage + + payload, err := json.Marshal(map[string]any{ + "model": "llama3.2", + "prompt": combinedPrompt, + "stream": false, + }) + if err != nil { + return "", fmt.Errorf("pyramidize/ollama: marshal error: %w", err) + } + + logger.Sensitive("pyramidize: ollama request", "len", len(payload)) + + req, err := http.NewRequest(http.MethodPost, baseURL+"/api/generate", bytes.NewReader(payload)) + if err != nil { + return "", fmt.Errorf("pyramidize/ollama: build request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + + resp, err := client.Do(req) + if err != nil { + return "", fmt.Errorf("pyramidize/ollama: request failed: %w", err) + } + defer resp.Body.Close() + + body, _ := io.ReadAll(resp.Body) + logger.Sensitive("pyramidize: ollama response", "status", resp.StatusCode, "len", len(body)) + + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("pyramidize/ollama: error %d: %s", resp.StatusCode, body) + } + + var result struct { + Response string `json:"response"` + } + if err := json.Unmarshal(body, &result); err != nil { + return "", fmt.Errorf("pyramidize/ollama: unexpected response: %s", body) + } + return result.Response, nil +} diff --git a/internal/features/pyramidize/api_openai.go b/internal/features/pyramidize/api_openai.go new file mode 100644 index 0000000..cdfcf99 --- /dev/null +++ b/internal/features/pyramidize/api_openai.go @@ -0,0 +1,66 @@ +package pyramidize + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + + "keylint/internal/logger" +) + +// callOpenAI sends a system + user message pair to the OpenAI chat completions API +// and returns the raw content string of the first choice. It requests JSON object +// output mode so the model is constrained to return valid JSON. +func callOpenAI(client *http.Client, systemPrompt, userMessage, apiKey string) (string, error) { + type msg struct { + Role string `json:"role"` + Content string `json:"content"` + } + payload, err := json.Marshal(map[string]any{ + "model": "gpt-4o-mini", + "messages": []msg{ + {Role: "system", Content: systemPrompt}, + {Role: "user", Content: userMessage}, + }, + "response_format": map[string]string{"type": "json_object"}, + }) + if err != nil { + return "", fmt.Errorf("pyramidize/openai: marshal error: %w", err) + } + + logger.Sensitive("pyramidize: openai request", "len", len(payload)) + + req, err := http.NewRequest(http.MethodPost, "https://api.openai.com/v1/chat/completions", bytes.NewReader(payload)) + if err != nil { + return "", fmt.Errorf("pyramidize/openai: build request: %w", err) + } + req.Header.Set("Authorization", "Bearer "+apiKey) + req.Header.Set("Content-Type", "application/json") + + resp, err := client.Do(req) + if err != nil { + return "", fmt.Errorf("pyramidize/openai: request failed: %w", err) + } + defer resp.Body.Close() + + body, _ := io.ReadAll(resp.Body) + logger.Sensitive("pyramidize: openai response", "status", resp.StatusCode, "len", len(body)) + + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("pyramidize/openai: error %d: %s", resp.StatusCode, body) + } + + var result struct { + Choices []struct { + Message struct { + Content string `json:"content"` + } `json:"message"` + } `json:"choices"` + } + if err := json.Unmarshal(body, &result); err != nil || len(result.Choices) == 0 { + return "", fmt.Errorf("pyramidize/openai: unexpected response: %s", body) + } + return result.Choices[0].Message.Content, nil +} diff --git a/internal/features/pyramidize/capture_linux.go b/internal/features/pyramidize/capture_linux.go new file mode 100644 index 0000000..a6bed53 --- /dev/null +++ b/internal/features/pyramidize/capture_linux.go @@ -0,0 +1,41 @@ +//go:build !windows + +package pyramidize + +import ( + "os/exec" + "strings" +) + +// captureSourceApp returns the name and xdotool window ID of the currently +// focused window. Returns empty strings if xdotool is not available or fails. +func captureSourceApp() (name string, windowID string) { + // Get the active window ID + idOut, err := exec.Command("xdotool", "getactivewindow").Output() + if err != nil { + return "", "" + } + id := strings.TrimSpace(string(idOut)) + if id == "" { + return "", "" + } + + // Get the window name/title + nameOut, err := exec.Command("xdotool", "getwindowname", id).Output() + if err != nil { + return "", "" + } + return strings.TrimSpace(string(nameOut)), id +} + +// sendBackToWindow focuses the given xdotool window and sends Ctrl+V to paste. +// This is best-effort on Linux; returns nil if windowID is empty. +func sendBackToWindow(windowID string) error { + if windowID == "" { + return nil + } + if err := exec.Command("xdotool", "windowfocus", windowID).Run(); err != nil { + return err + } + return exec.Command("xdotool", "key", "--window", windowID, "ctrl+v").Run() +} diff --git a/internal/features/pyramidize/capture_windows.go b/internal/features/pyramidize/capture_windows.go new file mode 100644 index 0000000..961c4f4 --- /dev/null +++ b/internal/features/pyramidize/capture_windows.go @@ -0,0 +1,78 @@ +//go:build windows + +package pyramidize + +import ( + "fmt" + "syscall" + "unsafe" +) + +var ( + user32 = syscall.NewLazyDLL("user32.dll") + getForegroundWindow = user32.NewProc("GetForegroundWindow") + getWindowTextW = user32.NewProc("GetWindowTextW") + setForegroundWindow = user32.NewProc("SetForegroundWindow") + sendInput = user32.NewProc("SendInput") +) + +// captureSourceApp returns the title and HWND (as string) of the currently +// focused foreground window using Win32 APIs. Returns empty strings on failure. +func captureSourceApp() (name string, windowID string) { + hwnd, _, _ := getForegroundWindow.Call() + if hwnd == 0 { + return "", "" + } + buf := make([]uint16, 256) + getWindowTextW.Call(hwnd, uintptr(unsafe.Pointer(&buf[0])), 256) + return syscall.UTF16ToString(buf), fmt.Sprintf("%d", hwnd) +} + +// sendBackToWindow focuses the window identified by windowIDStr (a stringified HWND) +// and synthesises a Ctrl+V key sequence via SendInput. +func sendBackToWindow(windowIDStr string) error { + if windowIDStr == "" { + return nil + } + var hwnd uintptr + fmt.Sscanf(windowIDStr, "%d", &hwnd) + if hwnd == 0 { + return nil + } + setForegroundWindow.Call(hwnd) + + // keyInput mirrors the Win32 INPUT structure for keyboard events. + type keyboardInput struct { + VK uint16 + Scan uint16 + Flags uint32 + Time uint32 + ExtraInfo uintptr + } + type input struct { + Type uint32 + Ki keyboardInput + Padding [8]byte + } + + const ( + inputKeyboard = 2 + keyeventfKeyup = 0x0002 + vkControl = 0x11 + vkV = 0x56 + ) + + inputs := [4]input{ + {Type: inputKeyboard, Ki: keyboardInput{VK: vkControl}}, + {Type: inputKeyboard, Ki: keyboardInput{VK: vkV}}, + {Type: inputKeyboard, Ki: keyboardInput{VK: vkV, Flags: keyeventfKeyup}}, + {Type: inputKeyboard, Ki: keyboardInput{VK: vkControl, Flags: keyeventfKeyup}}, + } + + sendInput.Call( + uintptr(len(inputs)), + uintptr(unsafe.Pointer(&inputs[0])), + unsafe.Sizeof(inputs[0]), + ) + return nil +} diff --git a/internal/features/pyramidize/json_parse.go b/internal/features/pyramidize/json_parse.go new file mode 100644 index 0000000..7a019a4 --- /dev/null +++ b/internal/features/pyramidize/json_parse.go @@ -0,0 +1,43 @@ +package pyramidize + +import ( + "encoding/json" + "strings" +) + +// stripFences removes ```json``` and ``` code fences from a string and trims surrounding whitespace. +// Many LLMs wrap their JSON output in markdown code fences despite being instructed not to. +func stripFences(s string) string { + s = strings.TrimSpace(s) + + // Remove opening fence variants: ```json, ```JSON, ``` + if strings.HasPrefix(s, "```") { + // Find the end of the opening fence line + newline := strings.Index(s, "\n") + if newline != -1 { + s = s[newline+1:] + } else { + // Entire content is just the fence marker — strip it + s = strings.TrimPrefix(s, "```json") + s = strings.TrimPrefix(s, "```JSON") + s = strings.TrimPrefix(s, "```") + } + } + + // Remove closing fence + if strings.HasSuffix(strings.TrimSpace(s), "```") { + idx := strings.LastIndex(s, "```") + if idx != -1 { + s = s[:idx] + } + } + + return strings.TrimSpace(s) +} + +// unmarshalRobust strips markdown fences from data then unmarshals it into v. +// This handles LLMs that return ```json ... ``` despite being instructed to return plain JSON. +func unmarshalRobust(data string, v any) error { + clean := stripFences(data) + return json.Unmarshal([]byte(clean), v) +} diff --git a/internal/features/pyramidize/prompts_canvas.go b/internal/features/pyramidize/prompts_canvas.go new file mode 100644 index 0000000..a92197a --- /dev/null +++ b/internal/features/pyramidize/prompts_canvas.go @@ -0,0 +1,65 @@ +package pyramidize + +import "fmt" + +// buildGlobalRefinePrompt builds the system prompt and user message for a +// full-canvas instruction-driven revision. The user instruction takes priority; +// the original text is soft context only and may be overridden. +func buildGlobalRefinePrompt(fullCanvas, originalText, instruction, docType, style, relationship string) (systemPrompt, userMessage string) { + systemPrompt = fmt.Sprintf(` +You are an expert document editing assistant. You revise documents according to precise user instructions. + + + +The user wants to revise the canvas document using the instruction provided. Apply the instruction to produce an improved version of the entire canvas. + + + +1. The user instruction is the highest priority — follow it exactly and completely +2. The original text is SOFT context only — it may be referenced for background but the user instruction can override or contradict it +3. Preserve the document type (%s), communication style (%s), and relationship level (%s) unless the instruction says otherwise +4. Preserve the language and any code-switching from the existing canvas + + + +- Output the complete revised canvas — not just the changed sections +- Do not add explanations or commentary — output only the document +- Maintain the structural format of the document (subject line / headers / body) + + +Respond ONLY with valid JSON (no markdown fences, no explanation): +{"newCanvas": "complete revised document text"}`, docType, style, relationship) + + userMessage = fmt.Sprintf("Original text (soft context — may be overridden by instruction):\n%s\n\nCurrent canvas:\n%s\n\nUser instruction:\n%s", originalText, fullCanvas, instruction) + return +} + +// buildSplicePrompt builds the system prompt and user message for rewriting a +// selected section of the canvas. Only the selected section is rewritten; the +// replacement must be coherent with the surrounding canvas. +func buildSplicePrompt(fullCanvas, originalText, selectedText, instruction string) (systemPrompt, userMessage string) { + systemPrompt = ` +You are an expert document editing assistant specialising in precise, in-place text revisions. + + + +Rewrite ONLY the selected section of the canvas document according to the user's instruction. The rewritten section must: +1. Follow the instruction exactly +2. Be coherent and flow naturally with the surrounding canvas content +3. Preserve the tone, style, and language of the document +4. Match the structural format expected at that position (e.g. bullet list if replacing bullets, paragraph if replacing prose) + + + +- Output ONLY the replacement text for the selected section — not the entire canvas +- Do not include surrounding canvas content in your output +- Do not add explanations or commentary +- The original text is provided as background context only — the instruction may override it + + +Respond ONLY with valid JSON (no markdown fences, no explanation): +{"rewrittenSection": "replacement text for the selected section only"}` + + userMessage = fmt.Sprintf("Original text (background context):\n%s\n\nFull canvas (for coherence reference):\n%s\n\nSelected section to rewrite:\n%s\n\nUser instruction:\n%s", originalText, fullCanvas, selectedText, instruction) + return +} diff --git a/internal/features/pyramidize/prompts_detect.go b/internal/features/pyramidize/prompts_detect.go new file mode 100644 index 0000000..0cb6259 --- /dev/null +++ b/internal/features/pyramidize/prompts_detect.go @@ -0,0 +1,24 @@ +package pyramidize + +// detectPromptTemplate is the system prompt for the type-detection call. +// It is intentionally minimal to save tokens; the user message is the raw input text. +const detectPromptTemplate = `You are a document classifier. + + +Classify the document type and detect the primary language of the following text. + + + +- type MUST be exactly one of: EMAIL, WIKI, MEMO, POWERPOINT +- language must be a 2-letter ISO 639-1 code (e.g. "en", "de", "fr") +- confidence is your certainty (0.0–1.0) +- If unsure, default to EMAIL + + + +Respond ONLY with valid JSON (no markdown fences): +{"type": "EMAIL", "language": "en", "confidence": 0.95} + + +Text to classify: +` diff --git a/internal/features/pyramidize/prompts_email.go b/internal/features/pyramidize/prompts_email.go new file mode 100644 index 0000000..fd876dc --- /dev/null +++ b/internal/features/pyramidize/prompts_email.go @@ -0,0 +1,58 @@ +package pyramidize + +import "fmt" + +const emailSystemBase = ` +You are an expert business communication specialist applying the Pyramid Principle to transform unstructured email drafts into clearly structured, information-dense emails. + + + +CRITICAL: Detect the language of the input and preserve it exactly. Never translate. If the author mixes languages (code-switching), preserve that exact mix. + + + +Transform the email draft into a pyramidally-structured email following the Pyramid Principle: +1. Lead with the most important information (the "so what") +2. Group supporting details under MECE content headers +3. Place background and context at the end + + + +Subject line format (MANDATORY — first line of fullDocument): +[Main Message/Decision] | [Key Details/Status] | [Required Actions/Deadlines] | [@Persons if needed] + +Header rules: +- Headers MUST be content statements, NOT process labels + WRONG: "Next Steps", "Background", "Action Items" + RIGHT: "Server A Login Failure Blocks Deployment", "Q1 Deadline Moved to March 15" +- Headers at the same level must be MECE: mutually exclusive, collectively exhaustive +- Business impact comes before technical detail +- Priority: decisions → actions → information + + + +Example 1 (German, professional): +Input: "Hallo Hans, kurze Info: der Build von gestern Abend ist fehlgeschlagen wegen eines Fehlers im CarService. Ich hab das gefixed und einen neuen Build gestartet. Geht ca. eine Stunde. Das Release für morgen steht trotzdem, wir müssen nicht verschieben." +Output: +{"fullDocument": "Build-Fehler behoben – Release morgen wie geplant | CarService gefixt, neuer Build läuft (~1h) | Keine Aktion erforderlich\n\nHallo Hans,\n\ndas Release morgen ist nicht gefährdet.\n\n**CarService-Fix erfolgreich deployed**\nDer gestrige Nacht-Build ist wegen eines Fehlers im CarService fehlgeschlagen. Der Fehler ist behoben, ein neuer Build läuft aktuell (~1 Stunde).\n\n**Kein Handlungsbedarf deinerseits**\nKein Verschieben nötig, kein weiterer Build erforderlich.", "headers": ["CarService-Fix erfolgreich deployed", "Kein Handlungsbedarf deinerseits"], "language": "de", "qualityScore": 0.92, "qualityFlags": []} + +Example 2 (English, professional): +Input: "hey team, just wanted to update everyone that the Q1 review meeting that was scheduled for next friday has been moved to the following monday at 2pm because the CFO has a conflict. please make sure you have your numbers ready by sunday night so we have time to review. Sarah and Tom need to send me their slides by thursday." +Output: +{"fullDocument": "Q1 Review Rescheduled to Monday 2pm | Slides Due Thursday (@Sarah, @Tom), Numbers Due Sunday | Update your calendars\n\nThe Q1 review meeting has been rescheduled.\n\n**New Date: Monday 2pm (CFO Conflict)**\nThe meeting originally scheduled for next Friday has moved to the following Monday at 2pm due to a CFO scheduling conflict.\n\n**Preparation Deadlines**\n- Slides: Sarah and Tom → Thursday EOD\n- Numbers: All → Sunday night", "headers": ["New Date: Monday 2pm (CFO Conflict)", "Preparation Deadlines"], "language": "en", "qualityScore": 0.95, "qualityFlags": []} +` + +// buildEmailPrompt builds the system prompt and user message for the email foundation call. +func buildEmailPrompt(style, relationship, customInstructions, inputText string) (systemPrompt, userMessage string) { + styleSection := fmt.Sprintf(` +Communication style: %s +Relationship level: %s`, style, relationship) + if customInstructions != "" { + styleSection += fmt.Sprintf("\nAdditional instructions: %s", customInstructions) + } + styleSection += "\n" + + systemPrompt = emailSystemBase + "\n\n" + styleSection + "\n" + selfQABlock + userMessage = inputText + return +} diff --git a/internal/features/pyramidize/prompts_memo.go b/internal/features/pyramidize/prompts_memo.go new file mode 100644 index 0000000..68416b8 --- /dev/null +++ b/internal/features/pyramidize/prompts_memo.go @@ -0,0 +1,64 @@ +package pyramidize + +import "fmt" + +const memoSystemBase = ` +You are an expert business writer applying the Pyramid Principle to transform unstructured notes into clearly structured internal memoranda. + + + +CRITICAL: Detect the language of the input and preserve it exactly. Never translate. If the author mixes languages (code-switching), preserve that exact mix. + + + +Transform the provided text into a pyramidally-structured internal memo following the Pyramid Principle: +1. Lead with the key decision, conclusion, or recommendation (the "so what") +2. Group supporting details under MECE content headers +3. Place background and context last + + + +Header line format (MANDATORY — first line of fullDocument, all on one line): +**TO:** [Recipient] | **FROM:** [Sender] | **RE:** [Precise subject that states the key message] + +Rules for the RE: field: +- Must state the key message or decision, not just a topic label + WRONG: "RE: Project Update" + RIGHT: "RE: Q2 Launch Delayed 2 Weeks — Scope Reduction Required by Friday" + +Body rules: +- After the header line, leave one blank line, then start the memo body +- Open with a one-sentence executive summary of the key point +- Use bold content-statement headers (not process labels) for each section + WRONG: **Background**, **Next Steps**, **Action Items** + RIGHT: **API Rate Limit Requires Architecture Change Before Launch**, **Three Mitigations Available — Recommended Option Needs Sign-off** +- Headers at the same level must be MECE: mutually exclusive, collectively exhaustive +- Formal but direct tone; avoid passive voice where possible + + + +Example 1 (English, professional): +Input: "Need to tell the team that we're switching from REST to GraphQL for the new client portal. The decision was made because of performance issues with the current approach - we're making too many round trips. Timeline is 6 weeks starting next monday. Jake and Priya will lead the migration. Everyone else needs to attend a kickoff meeting on friday." +Output: +{"fullDocument": "**TO:** Engineering Team | **FROM:** [Author] | **RE:** REST-to-GraphQL Migration Starts Monday — Jake & Priya Leading; Kickoff Friday\n\nThe client portal backend will migrate from REST to GraphQL over the next 6 weeks to eliminate excessive API round-trips impacting performance.\n\n**Migration Addresses Critical Round-Trip Performance Issue**\nThe current REST implementation generates too many sequential round-trips for client portal queries. GraphQL's single-query model resolves this at the architecture level.\n\n**6-Week Timeline Begins Monday Under Jake and Priya**\nMigration lead: Jake and Priya. Start date: next Monday. Duration: 6 weeks. All other engineers: mandatory kickoff meeting this Friday.", "headers": ["Migration Addresses Critical Round-Trip Performance Issue", "6-Week Timeline Begins Monday Under Jake and Priya"], "language": "en", "qualityScore": 0.93, "qualityFlags": []} + +Example 2 (German, authority): +Input: "Ich möchte alle darüber informieren, dass das Budget für Q3 um 15% gekürzt wurde. Das betrifft vor allem das Marketingteam. Reisen werden auf das Nötigste reduziert. Neue Software-Lizenzen müssen bis Ende Juli beantragt werden, danach gibt es eine Freigabesperre." +Output: +{"fullDocument": "**AN:** Alle Abteilungsleiter | **VON:** [Autor] | **BETR.:** Q3-Budget -15% — Reisestopp + Lizenzanträge bis 31. Juli\n\nDas Q3-Budget wurde um 15% reduziert; Reisen werden auf das Minimum beschränkt und neue Software-Lizenzen müssen bis 31. Juli beantragt werden.\n\n**Marketing trägt den Hauptteil der Budgetkürzung**\nDie 15%-Kürzung betrifft primär das Marketingteam. Details zur Aufteilung werden separat kommuniziert.\n\n**Freigabesperre für Lizenzen ab 1. August**\nNeue Software-Lizenzen können nur bis zum 31. Juli beantragt werden. Ab dem 1. August gilt eine Freigabesperre bis Quartalsende.", "headers": ["Marketing trägt den Hauptteil der Budgetkürzung", "Freigabesperre für Lizenzen ab 1. August"], "language": "de", "qualityScore": 0.90, "qualityFlags": []} +` + +// buildMemoPrompt builds the system prompt and user message for the memo foundation call. +func buildMemoPrompt(style, relationship, customInstructions, inputText string) (systemPrompt, userMessage string) { + styleSection := fmt.Sprintf(` +Communication style: %s +Relationship level: %s`, style, relationship) + if customInstructions != "" { + styleSection += fmt.Sprintf("\nAdditional instructions: %s", customInstructions) + } + styleSection += "\n" + + systemPrompt = memoSystemBase + "\n\n" + styleSection + "\n" + selfQABlock + userMessage = inputText + return +} diff --git a/internal/features/pyramidize/prompts_powerpoint.go b/internal/features/pyramidize/prompts_powerpoint.go new file mode 100644 index 0000000..1087704 --- /dev/null +++ b/internal/features/pyramidize/prompts_powerpoint.go @@ -0,0 +1,68 @@ +package pyramidize + +import "fmt" + +const pptSystemBase = ` +You are an expert presentation designer applying the Pyramid Principle to transform unstructured notes into clearly structured PowerPoint slide outlines. + + + +CRITICAL: Detect the language of the input and preserve it exactly. Never translate. If the author mixes languages (code-switching), preserve that exact mix. + + + +Transform the provided text into a pyramidally-structured presentation outline: +1. Each slide leads with its single most important message +2. Supporting bullet points provide evidence and detail +3. Slides are ordered from most impactful to least (Pyramid Principle) +4. The deck tells a coherent story when slide titles are read in sequence + + + +Slide title format (MANDATORY): +# Slide N: [Standalone Content Statement — the key message of this slide] + +Slide title rules: +- Each title MUST be a complete, standalone content statement — readable alone, like a newspaper headline + WRONG: "# Slide 2: Background" + RIGHT: "# Slide 2: Current System Handles 200 Requests/Second — 5× Below Target" +- The first slide is the executive summary / key message of the entire presentation +- Slide titles read in sequence must tell the complete story of the presentation + +Bullet rules: +- 3–5 bullet points per slide maximum +- Bullets provide evidence, data, or supporting detail for the slide title +- Use sub-bullets sparingly (max 1 level deep) +- Prefer specific numbers and facts over vague statements + WRONG: "- Revenue has increased significantly" + RIGHT: "- Revenue up 34% YoY — highest growth since 2019" + +Slide count: generate as many slides as the content requires, typically 4–8 for most inputs. + + + +Example 1 (English, professional): +Input: "I need slides for our quarterly business review. Revenue grew 34% year over year. Churn dropped from 8% to 5.2%. We launched two new enterprise features: SSO and audit logs. Pipeline is at $2.3M, up 60% from last quarter. Main risk: we need 3 more engineers by Q3 or we can't ship the roadmap." +Output: +{"fullDocument": "# Slide 1: Record Quarter — 34% Revenue Growth, Churn at 5.2%, $2.3M Pipeline\n\n- Revenue grew 34% YoY — strongest quarter in company history\n- Customer churn fell from 8.0% to 5.2% — retention at all-time high\n- Pipeline at $2.3M, up 60% quarter-over-quarter\n\n# Slide 2: Two Enterprise Features Shipped — SSO and Audit Logs\n\n- SSO launched: enables enterprise customers to use existing identity providers\n- Audit logs launched: compliance requirement for regulated-industry buyers\n- Both features directly address top enterprise objections from sales\n\n# Slide 3: $2.3M Pipeline Driven by Enterprise Momentum\n\n- Pipeline up 60% QoQ, driven by enterprise segment\n- SSO and audit logs removed key blockers in 3 active deals\n- Average deal size increasing — shift toward larger accounts\n\n# Slide 4: Roadmap At Risk Without 3 Additional Engineers by Q3\n\n- Current team cannot deliver committed roadmap at present headcount\n- 3 engineers needed by Q3 to maintain delivery schedule\n- Risk: slipping roadmap items could stall enterprise pipeline deals", "headers": ["Slide 1: Record Quarter — 34% Revenue Growth, Churn at 5.2%, $2.3M Pipeline", "Slide 2: Two Enterprise Features Shipped — SSO and Audit Logs", "Slide 3: $2.3M Pipeline Driven by Enterprise Momentum", "Slide 4: Roadmap At Risk Without 3 Additional Engineers by Q3"], "language": "en", "qualityScore": 0.94, "qualityFlags": []} + +Example 2 (German, professional): +Input: "Präsentation für das Management: Wir haben die Serverkosten um 40% gesenkt durch Migration zu AWS. Das hat 3 Monate gedauert. Wir haben dabei keine Ausfallzeiten gehabt. Die Einsparung beträgt 120.000€ pro Jahr. Im nächsten Schritt wollen wir auch die Datenbank migrieren, das würde nochmal 60.000€ sparen." +Output: +{"fullDocument": "# Slide 1: AWS-Migration spart 120.000€/Jahr — kein Ausfall, Datenbankphase bringt weitere 60.000€\n\n- Serverkosten um 40% gesenkt — jährliche Einsparung: 120.000€\n- Migration in 3 Monaten ohne Produktionsausfall abgeschlossen\n- Nächste Phase: Datenbankmigrierung (+60.000€/Jahr Einsparung möglich)\n\n# Slide 2: 40% Kostensenkung in 3 Monaten ohne Ausfallzeit\n\n- Migrationsdauer: 3 Monate (Januar–März)\n- Uptime während Migration: 100% — kein einziger Produktionsausfall\n- Technisch umgesetzt durch Blue-Green-Deployment-Strategie\n\n# Slide 3: Datenbankmigrierung als nächster Schritt — weitere 60.000€/Jahr\n\n- Datenbankschicht verbleibt noch on-premise\n- Migrierung zu AWS RDS würde weitere 60.000€/Jahr einsparen\n- Gesamteinsparung nach Phase 2: 180.000€/Jahr (60% der ursprünglichen Serverkosten)", "headers": ["Slide 1: AWS-Migration spart 120.000€/Jahr — kein Ausfall, Datenbankphase bringt weitere 60.000€", "Slide 2: 40% Kostensenkung in 3 Monaten ohne Ausfallzeit", "Slide 3: Datenbankmigrierung als nächster Schritt — weitere 60.000€/Jahr"], "language": "de", "qualityScore": 0.92, "qualityFlags": []} +` + +// buildPPTPrompt builds the system prompt and user message for the PowerPoint foundation call. +func buildPPTPrompt(style, relationship, customInstructions, inputText string) (systemPrompt, userMessage string) { + styleSection := fmt.Sprintf(` +Communication style: %s +Relationship level: %s`, style, relationship) + if customInstructions != "" { + styleSection += fmt.Sprintf("\nAdditional instructions: %s", customInstructions) + } + styleSection += "\n" + + systemPrompt = pptSystemBase + "\n\n" + styleSection + "\n" + selfQABlock + userMessage = inputText + return +} diff --git a/internal/features/pyramidize/prompts_refine.go b/internal/features/pyramidize/prompts_refine.go new file mode 100644 index 0000000..0413113 --- /dev/null +++ b/internal/features/pyramidize/prompts_refine.go @@ -0,0 +1,69 @@ +package pyramidize + +import ( + "fmt" + "strings" +) + +// buildRefinePrompt builds the system prompt and user message for the optional +// refinement call. It is only invoked when the foundation output scores below the +// quality threshold. Each flag in flags generates targeted remediation instructions. +func buildRefinePrompt(originalText, failedOutput string, flags []string) (systemPrompt, userMessage string) { + var sb strings.Builder + + sb.WriteString(` +You are an expert document editor performing a targeted quality pass on a previously generated document. + + + +The document below was generated from the original text but scored below the quality threshold. Your job is to fix the specific quality issues identified by the quality flags while preserving everything that is already good. + + + +HARD CONSTRAINT: The original text is the source of truth. Every person, deadline, action, decision, and piece of information present in the original text MUST appear in your output. You may never omit content from the original text. + + + +`) + + for _, flag := range flags { + switch flag { + case "MECE_VIOLATION": + sb.WriteString("- MECE_VIOLATION: The headers are not MECE. Restructure the headers so each one is mutually exclusive (no overlap in content) and collectively exhaustive (no major topic left uncovered). Every content point must belong to exactly one header section.\n") + case "INFO_LOSS": + sb.WriteString("- INFO_LOSS: Content from the original is missing in the generated document. Cross-check every person, deadline, action, decision, and piece of information from the original text and ensure it is present in the output. The original text is a hard constraint — nothing may be omitted.\n") + case "STYLE_MISMATCH": + sb.WriteString("- STYLE_MISMATCH: The tone or language style does not match the requested communication style. Review every sentence and ensure the register, formality, and vocabulary are consistent with the requested style and relationship level throughout the document.\n") + case "SUBJECT_FORMAT": + sb.WriteString("- SUBJECT_FORMAT: The subject line or title (first line of fullDocument) does not follow the required format. Fix it: it must be information-dense and follow the prescribed format for this document type (pipe-separated fields for email, # H1 for wiki, **TO/FROM/RE** line for memo, # Slide N: for powerpoint).\n") + default: + sb.WriteString(fmt.Sprintf("- %s: Address this quality issue in the output.\n", flag)) + } + } + + sb.WriteString(` + + +- Fix only the identified issues — do not restructure content that is already correct +- Preserve the document type and overall structure from the previous attempt +- The original text is a HARD constraint for completeness — add back anything that was lost +- Language: preserve the exact language (and any code-switching) from the original text +- Produce the complete revised document, not just the changed sections + + +`) + + sb.WriteString("Respond ONLY with valid JSON (no markdown fences, no explanation):\n") + sb.WriteString(`{ + "fullDocument": "complete revised document text with subject/title as first line", + "headers": ["header 1", "header 2"], + "language": "en", + "qualityScore": 0.0, + "qualityFlags": [] +}`) + + systemPrompt = sb.String() + + userMessage = fmt.Sprintf("Original text (hard constraint — preserve all content):\n%s\n\nPrevious output (to be improved):\n%s", originalText, failedOutput) + return +} diff --git a/internal/features/pyramidize/prompts_selfqa.go b/internal/features/pyramidize/prompts_selfqa.go new file mode 100644 index 0000000..7952243 --- /dev/null +++ b/internal/features/pyramidize/prompts_selfqa.go @@ -0,0 +1,27 @@ +package pyramidize + +// selfQABlock is appended to all document-type foundation prompts. +// It instructs the model to evaluate its own output through four specialist lenses +// and compute a qualityScore + qualityFlags before responding. +const selfQABlock = ` + +After generating the document, evaluate it as four internal specialists: + +1. Subject/Title Specialist: Does the first line follow the required format exactly? Is it information-dense? Score: 0–1 +2. MECE Specialist: Are headers at the same level mutually exclusive (no overlap) and collectively exhaustive (no major gap)? Score: 0–1 +3. Completeness Specialist: Is every person, deadline, action, and decision from the original preserved? Risk: 0–1 (0=nothing lost) +4. Style Specialist: Is the language consistent with the requested style and relationship level? Is code-switching preserved? Score: 0–1 + +qualityScore = (subject_score + mece_score + style_score) / 3 - (completeness_risk * 0.2) + +qualityFlags: include any applicable: "MECE_VIOLATION", "INFO_LOSS", "STYLE_MISMATCH", "SUBJECT_FORMAT" + + +Respond ONLY with valid JSON (no markdown fences, no explanation): +{ + "fullDocument": "complete document text with subject/title as first line", + "headers": ["header 1", "header 2"], + "language": "en", + "qualityScore": 0.0, + "qualityFlags": [] +}` diff --git a/internal/features/pyramidize/prompts_wiki.go b/internal/features/pyramidize/prompts_wiki.go new file mode 100644 index 0000000..dc29aec --- /dev/null +++ b/internal/features/pyramidize/prompts_wiki.go @@ -0,0 +1,65 @@ +package pyramidize + +import "fmt" + +const wikiSystemBase = ` +You are an expert technical writer applying the Pyramid Principle to transform unstructured notes and information into clearly structured wiki articles. + + + +CRITICAL: Detect the language of the input and preserve it exactly. Never translate. If the author mixes languages (code-switching), preserve that exact mix. + + + +Transform the provided notes into a pyramidally-structured wiki article following the Pyramid Principle: +1. Open with the key conclusion or overview (the "so what") +2. Use H2 sections for major topics — each section leads with its most important point +3. Group supporting details within each section in descending order of importance +4. Place background context and reference material last + + + +Title format (MANDATORY — first line of fullDocument, plain H1 — no pipe separators): +# [Precise, Information-Dense Title That States the Topic Clearly] + +Header rules: +- Use H2 (##) for major sections +- Headers MUST be content statements, NOT process labels + WRONG: "Overview", "Background", "Details", "Next Steps" + RIGHT: "Authentication Fails When Session Token Expires", "Database Sharding Reduces Query Time by 40%" +- Headers at the same level must be MECE: mutually exclusive, collectively exhaustive +- Most impactful/critical section first +- Use bullet lists and code blocks where appropriate for technical content + +Structure order: +1. Opening paragraph: one-sentence summary of the entire article's key insight +2. H2 sections in order of importance (not chronological, not alphabetical) +3. "## References" or "## See Also" section last (only if there are actual references) + + + +Example 1 (English, technical): +Input: "so we had this bug where users were getting logged out randomly. turned out it was because the session token wasnt being refreshed properly. the token expires after 30 mins and we refresh it on every api call but there was a race condition in the refresh logic. fixed it with a mutex. this affects all users on v2.3.1 and below." +Output: +{"fullDocument": "# Session Token Race Condition Caused Random Logouts in v2.3.1 and Below\n\nA race condition in the session token refresh logic caused users to be unexpectedly logged out; the fix applies a mutex to the refresh path.\n\n## Mutex Fix Resolves Token Refresh Race Condition\nThe token refresh function lacked synchronisation: when multiple concurrent API calls triggered a refresh simultaneously, the 30-minute expiry window was hit before any single refresh completed. Adding a mutex around the refresh critical section eliminates the race.\n\n## All Users on v2.3.1 and Below Are Affected\nAny deployment running v2.3.1 or earlier exhibits this behaviour. Users on v2.4.0+ already have the fix.", "headers": ["Mutex Fix Resolves Token Refresh Race Condition", "All Users on v2.3.1 and Below Are Affected"], "language": "en", "qualityScore": 0.91, "qualityFlags": []} + +Example 2 (German, product): +Input: "Das neue Feature für die Batch-Verarbeitung ist fertig. Man kann jetzt bis zu 1000 Dokumente auf einmal hochladen. Wir nutzen eine Queue im Hintergrund. Timeout ist 10 Minuten pro Job. Fehlerhafte Dokumente werden übersprungen und in einem Report aufgelistet." +Output: +{"fullDocument": "# Batch-Upload verarbeitet bis zu 1.000 Dokumente parallel mit Fehler-Report\n\nDas neue Batch-Verarbeitungs-Feature ermöglicht den Upload von bis zu 1.000 Dokumenten in einem Vorgang; fehlerhafte Dateien werden übersprungen und in einem automatischen Report aufgelistet.\n\n## Verarbeitungslogik: Queue mit 10-Minuten-Timeout pro Job\nIm Hintergrund verwaltet eine Queue die Verarbeitung. Jeder Job hat ein Timeout von 10 Minuten. Dokumente, die das Timeout überschreiten oder ungültig sind, werden übersprungen.\n\n## Fehlerhafte Dokumente Erscheinen im Abschluss-Report\nNach Abschluss eines Batch-Jobs listet der automatisch generierte Report alle übersprungenen Dokumente mit Fehlergrund auf.", "headers": ["Verarbeitungslogik: Queue mit 10-Minuten-Timeout pro Job", "Fehlerhafte Dokumente Erscheinen im Abschluss-Report"], "language": "de", "qualityScore": 0.89, "qualityFlags": []} +` + +// buildWikiPrompt builds the system prompt and user message for the wiki foundation call. +func buildWikiPrompt(style, relationship, customInstructions, inputText string) (systemPrompt, userMessage string) { + styleSection := fmt.Sprintf(` +Communication style: %s +Relationship level: %s`, style, relationship) + if customInstructions != "" { + styleSection += fmt.Sprintf("\nAdditional instructions: %s", customInstructions) + } + styleSection += "\n" + + systemPrompt = wikiSystemBase + "\n\n" + styleSection + "\n" + selfQABlock + userMessage = inputText + return +} diff --git a/internal/features/pyramidize/service.go b/internal/features/pyramidize/service.go new file mode 100644 index 0000000..e3ad111 --- /dev/null +++ b/internal/features/pyramidize/service.go @@ -0,0 +1,408 @@ +package pyramidize + +import ( + "context" + "fmt" + "net/http" + "strings" + "sync" + "time" + + "keylint/internal/features/clipboard" + "keylint/internal/features/settings" + "keylint/internal/logger" +) + +// Service implements the Pyramidize RPC methods exposed to the frontend. +type Service struct { + settings *settings.Service + clipboard *clipboard.Service + client *http.Client + + mu sync.Mutex + cancelFunc context.CancelFunc + + // Captured source app from hotkey trigger (set before clipboard grab) + sourceAppName string + sourceWindowID string +} + +// NewService creates a new PyramidizeService. +func NewService(s *settings.Service, c *clipboard.Service) *Service { + return &Service{ + settings: s, + clipboard: c, + client: &http.Client{Timeout: 90 * time.Second}, + } +} + +// CaptureSourceApp captures the current foreground window before the clipboard grab. +// Called from main.go when the global hotkey fires, before any clipboard operation. +func (svc *Service) CaptureSourceApp() { + name, id := captureSourceApp() + svc.mu.Lock() + svc.sourceAppName = name + svc.sourceWindowID = id + svc.mu.Unlock() + logger.Info("pyramidize: captured source app", "name", name, "id", id) +} + +// GetSourceApp returns the captured source app name so the frontend can display +// the detection indicator and look up a saved app preset. +func (svc *Service) GetSourceApp() string { + svc.mu.Lock() + defer svc.mu.Unlock() + return svc.sourceAppName +} + +// CancelOperation cancels the current in-flight Pyramidize, RefineGlobal, or Splice +// call. Safe to call when nothing is running (no-op). +func (svc *Service) CancelOperation() { + svc.mu.Lock() + fn := svc.cancelFunc + svc.mu.Unlock() + if fn != nil { + fn() + logger.Info("pyramidize: operation cancelled by user") + } +} + +// SendBack writes text to the system clipboard and pastes it back into the +// captured source application window. +func (svc *Service) SendBack(text string) error { + if err := svc.clipboard.Write(text); err != nil { + return fmt.Errorf("clipboard write failed: %w", err) + } + svc.mu.Lock() + windowID := svc.sourceWindowID + svc.mu.Unlock() + return sendBackToWindow(windowID) +} + +// Pyramidize is the main RPC: detects the document type (if AUTO), generates the +// foundation document, and applies a refinement pass if the quality score is below +// the configured threshold. +func (svc *Service) Pyramidize(req PyramidizeRequest) (PyramidizeResult, error) { + ctx, cancel := context.WithCancel(context.Background()) + svc.mu.Lock() + svc.cancelFunc = cancel + svc.mu.Unlock() + defer cancel() + + cfg := svc.settings.Get() + logger.Info("pyramidize: start", "docType", req.DocumentType, "provider", cfg.ActiveProvider) + + var result PyramidizeResult + docType := strings.ToLower(req.DocumentType) + + // Step 1: Auto-detect if needed + if docType == "auto" { + detected, err := svc.detect(ctx, cfg, req.Text) + if err != nil { + if ctx.Err() != nil { + return PyramidizeResult{}, fmt.Errorf("cancelled") + } + logger.Warn("pyramidize: detection failed, defaulting to email", "err", err) + docType = "email" + } else { + docType = strings.ToLower(detected.Type) + if docType == "" || !isValidDocType(docType) { + docType = "email" + } + result.DetectedType = strings.ToUpper(docType) + result.DetectedLang = detected.Language + result.DetectedConfidence = detected.Confidence + } + } + + // Step 2: Foundation generation + foundation, err := svc.foundation(ctx, cfg, req, docType) + if err != nil { + if ctx.Err() != nil { + return PyramidizeResult{}, fmt.Errorf("cancelled") + } + return PyramidizeResult{}, fmt.Errorf("foundation step failed: %w", err) + } + + result.DocumentType = strings.ToUpper(docType) + result.Language = foundation.Language + result.FullDocument = foundation.FullDocument + result.Headers = foundation.Headers + result.QualityScore = foundation.QualityScore + result.QualityFlags = foundation.QualityFlags + + // Ensure QualityFlags is never nil in JSON response + if result.QualityFlags == nil { + result.QualityFlags = []string{} + } + + // Step 3: Optional refinement pass + threshold := cfg.PyramidizeQualityThreshold + if threshold == 0 { + threshold = 0.65 + } + if foundation.QualityScore < threshold && len(foundation.QualityFlags) > 0 { + logger.Info("pyramidize: quality below threshold, refining", + "score", foundation.QualityScore, "flags", foundation.QualityFlags, "threshold", threshold) + + refined, err := svc.refine(ctx, cfg, req.Text, foundation.FullDocument, foundation.QualityFlags) + if err != nil { + if ctx.Err() != nil { + return PyramidizeResult{}, fmt.Errorf("cancelled") + } + // Refinement failure is non-fatal — return the foundation result with a warning + logger.Warn("pyramidize: refinement failed, using foundation result", "err", err) + } else { + result.FullDocument = refined.FullDocument + result.Headers = refined.Headers + result.QualityScore = refined.QualityScore + result.QualityFlags = refined.QualityFlags + result.AppliedRefinement = true + if result.QualityFlags == nil { + result.QualityFlags = []string{} + } + if refined.QualityScore < threshold { + result.RefinementWarning = fmt.Sprintf( + "Quality score %.2f is still below threshold after refinement.", refined.QualityScore) + } + } + } + + logger.Info("pyramidize: done", + "docType", result.DocumentType, "score", result.QualityScore, + "refined", result.AppliedRefinement) + return result, nil +} + +// RefineGlobal applies a user instruction to the full canvas document. +func (svc *Service) RefineGlobal(req RefineGlobalRequest) (RefineGlobalResult, error) { + ctx, cancel := context.WithCancel(context.Background()) + svc.mu.Lock() + svc.cancelFunc = cancel + svc.mu.Unlock() + defer cancel() + + cfg := svc.settings.Get() + systemPrompt, userMessage := buildGlobalRefinePrompt( + req.FullCanvas, req.OriginalText, req.Instruction, + req.DocumentType, req.CommunicationStyle, req.RelationshipLevel, + ) + + raw, err := svc.callAIWithContext(ctx, cfg, systemPrompt, userMessage) + if err != nil { + if ctx.Err() != nil { + return RefineGlobalResult{}, fmt.Errorf("cancelled") + } + return RefineGlobalResult{}, fmt.Errorf("RefineGlobal AI call failed: %w", err) + } + + var r canvasResult + if err := unmarshalRobust(raw, &r); err != nil { + return RefineGlobalResult{}, fmt.Errorf("RefineGlobal parse error: %w (raw: %s)", err, raw) + } + return RefineGlobalResult{NewCanvas: r.NewCanvas}, nil +} + +// Splice rewrites a selected section of the canvas according to a user instruction. +func (svc *Service) Splice(req SpliceRequest) (SpliceResult, error) { + ctx, cancel := context.WithCancel(context.Background()) + svc.mu.Lock() + svc.cancelFunc = cancel + svc.mu.Unlock() + defer cancel() + + cfg := svc.settings.Get() + systemPrompt, userMessage := buildSplicePrompt( + req.FullCanvas, req.OriginalText, req.SelectedText, req.Instruction, + ) + + raw, err := svc.callAIWithContext(ctx, cfg, systemPrompt, userMessage) + if err != nil { + if ctx.Err() != nil { + return SpliceResult{}, fmt.Errorf("cancelled") + } + return SpliceResult{}, fmt.Errorf("Splice AI call failed: %w", err) + } + + var r spliceResult + if err := unmarshalRobust(raw, &r); err != nil { + return SpliceResult{}, fmt.Errorf("Splice parse error: %w (raw: %s)", err, raw) + } + return SpliceResult{RewrittenSection: r.RewrittenSection}, nil +} + +// GetAppPresets returns all saved source-app → doc-type presets from settings. +func (svc *Service) GetAppPresets() []AppPreset { + cfg := svc.settings.Get() + if len(cfg.AppPresets) == 0 { + return []AppPreset{} + } + // Convert settings.AppPreset → pyramidize.AppPreset + out := make([]AppPreset, len(cfg.AppPresets)) + for i, p := range cfg.AppPresets { + out[i] = AppPreset{SourceApp: p.SourceApp, DocumentType: p.DocumentType} + } + return out +} + +// SetAppPreset saves or updates an app preset matched by SourceApp name (case-insensitive). +func (svc *Service) SetAppPreset(preset AppPreset) error { + cfg := svc.settings.Get() + found := false + for i, p := range cfg.AppPresets { + if strings.EqualFold(p.SourceApp, preset.SourceApp) { + cfg.AppPresets[i] = settings.AppPreset{ + SourceApp: preset.SourceApp, + DocumentType: preset.DocumentType, + } + found = true + break + } + } + if !found { + cfg.AppPresets = append(cfg.AppPresets, settings.AppPreset{ + SourceApp: preset.SourceApp, + DocumentType: preset.DocumentType, + }) + } + return svc.settings.Save(cfg) +} + +// DeleteAppPreset removes an app preset by source app name (case-insensitive). +func (svc *Service) DeleteAppPreset(sourceApp string) error { + cfg := svc.settings.Get() + filtered := cfg.AppPresets[:0] + for _, p := range cfg.AppPresets { + if !strings.EqualFold(p.SourceApp, sourceApp) { + filtered = append(filtered, p) + } + } + cfg.AppPresets = filtered + return svc.settings.Save(cfg) +} + +// GetQualityThreshold returns the configured quality threshold, defaulting to 0.65. +func (svc *Service) GetQualityThreshold() float64 { + cfg := svc.settings.Get() + if cfg.PyramidizeQualityThreshold == 0 { + return 0.65 + } + return cfg.PyramidizeQualityThreshold +} + +// SetQualityThreshold saves the quality threshold. Value must be in [0, 1]. +func (svc *Service) SetQualityThreshold(v float64) error { + if v < 0 || v > 1 { + return fmt.Errorf("threshold must be between 0 and 1, got %.2f", v) + } + cfg := svc.settings.Get() + cfg.PyramidizeQualityThreshold = v + return svc.settings.Save(cfg) +} + +// --- internal pipeline helpers --- + +func (svc *Service) detect(ctx context.Context, cfg settings.Settings, text string) (detectResult, error) { + raw, err := svc.callAIWithContext(ctx, cfg, detectPromptTemplate, text) + if err != nil { + return detectResult{}, err + } + var r detectResult + if err := unmarshalRobust(raw, &r); err != nil { + return detectResult{}, fmt.Errorf("detect parse error: %w (raw: %s)", err, raw) + } + return r, nil +} + +func (svc *Service) foundation(ctx context.Context, cfg settings.Settings, req PyramidizeRequest, docType string) (foundationResult, error) { + systemPrompt, userMessage := buildDocTypePrompt(docType, req.CommunicationStyle, req.RelationshipLevel, req.CustomInstructions, req.Text) + raw, err := svc.callAIWithContext(ctx, cfg, systemPrompt, userMessage) + if err != nil { + return foundationResult{}, err + } + var r foundationResult + if err := unmarshalRobust(raw, &r); err != nil { + return foundationResult{}, fmt.Errorf("foundation parse error: %w (raw: %s)", err, raw) + } + return r, nil +} + +func (svc *Service) refine(ctx context.Context, cfg settings.Settings, originalText, failedOutput string, flags []string) (refineResult, error) { + systemPrompt, userMessage := buildRefinePrompt(originalText, failedOutput, flags) + raw, err := svc.callAIWithContext(ctx, cfg, systemPrompt, userMessage) + if err != nil { + return refineResult{}, err + } + var r refineResult + if err := unmarshalRobust(raw, &r); err != nil { + return refineResult{}, fmt.Errorf("refine parse error: %w (raw: %s)", err, raw) + } + return r, nil +} + +// buildDocTypePrompt dispatches to the correct prompt builder based on document type. +func buildDocTypePrompt(docType, style, relationship, customInstructions, text string) (systemPrompt, userMessage string) { + switch docType { + case "wiki": + return buildWikiPrompt(style, relationship, customInstructions, text) + case "memo": + return buildMemoPrompt(style, relationship, customInstructions, text) + case "powerpoint": + return buildPPTPrompt(style, relationship, customInstructions, text) + default: // "email" and any unrecognised type + return buildEmailPrompt(style, relationship, customInstructions, text) + } +} + +// callAIWithContext runs an AI call in a goroutine and returns when the call +// completes or the context is cancelled (whichever comes first). +func (svc *Service) callAIWithContext(ctx context.Context, cfg settings.Settings, systemPrompt, userMessage string) (string, error) { + type result struct { + out string + err error + } + ch := make(chan result, 1) + + go func() { + out, err := svc.callAISync(cfg, systemPrompt, userMessage) + ch <- result{out, err} + }() + + select { + case <-ctx.Done(): + return "", ctx.Err() + case r := <-ch: + return r.out, r.err + } +} + +// callAISync dispatches to the configured provider synchronously. +func (svc *Service) callAISync(cfg settings.Settings, systemPrompt, userMessage string) (string, error) { + switch cfg.ActiveProvider { + case "openai": + key := svc.settings.GetKey("openai") + if key == "" { + return "", fmt.Errorf("OpenAI API key is not configured — go to Settings → AI Providers") + } + return callOpenAI(svc.client, systemPrompt, userMessage, key) + case "claude": + key := svc.settings.GetKey("claude") + if key == "" { + return "", fmt.Errorf("Anthropic API key is not configured — go to Settings → AI Providers") + } + return callClaude(svc.client, systemPrompt, userMessage, key) + case "ollama": + return callOllama(svc.client, systemPrompt, userMessage, cfg.Providers.OllamaURL) + default: + return "", fmt.Errorf("unsupported provider: %q", cfg.ActiveProvider) + } +} + +// isValidDocType reports whether s is a recognised Pyramidize document type. +func isValidDocType(s string) bool { + switch s { + case "email", "wiki", "memo", "powerpoint": + return true + } + return false +} diff --git a/internal/features/pyramidize/service_test.go b/internal/features/pyramidize/service_test.go new file mode 100644 index 0000000..b20fd57 --- /dev/null +++ b/internal/features/pyramidize/service_test.go @@ -0,0 +1,311 @@ +package pyramidize + +import ( + "strings" + "testing" +) + +// --- isValidDocType --- + +func TestIsValidDocType(t *testing.T) { + tests := []struct { + input string + want bool + }{ + {"email", true}, + {"wiki", true}, + {"memo", true}, + {"powerpoint", true}, + {"", false}, + {"auto", false}, + {"EMAIL", false}, // case-sensitive + {"pdf", false}, + {"blog", false}, + } + for _, tc := range tests { + t.Run(tc.input, func(t *testing.T) { + if got := isValidDocType(tc.input); got != tc.want { + t.Errorf("isValidDocType(%q) = %v, want %v", tc.input, got, tc.want) + } + }) + } +} + +// --- stripFences --- + +func TestStripFences(t *testing.T) { + tests := []struct { + name string + input string + want string + }{ + { + name: "no fences", + input: `{"key": "value"}`, + want: `{"key": "value"}`, + }, + { + name: "json fences", + input: "```json\n{\"key\": \"value\"}\n```", + want: `{"key": "value"}`, + }, + { + name: "bare fences", + input: "```\n{\"key\": \"value\"}\n```", + want: `{"key": "value"}`, + }, + { + name: "JSON uppercase fences", + input: "```JSON\n{\"key\": \"value\"}\n```", + want: `{"key": "value"}`, + }, + { + name: "leading and trailing whitespace", + input: " \n{\"key\": \"value\"}\n ", + want: `{"key": "value"}`, + }, + { + name: "fences with extra whitespace", + input: "```json\n\n{\"key\": \"value\"}\n\n```", + want: `{"key": "value"}`, + }, + { + name: "no trailing fence", + input: "```json\n{\"key\": \"value\"}", + want: `{"key": "value"}`, + }, + { + name: "empty string", + input: "", + want: "", + }, + { + name: "only whitespace", + input: " \n \t ", + want: "", + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got := stripFences(tc.input) + if got != tc.want { + t.Errorf("stripFences(%q)\ngot: %q\nwant: %q", tc.input, got, tc.want) + } + }) + } +} + +// --- unmarshalRobust --- + +func TestUnmarshalRobust(t *testing.T) { + t.Run("plain JSON", func(t *testing.T) { + var r detectResult + err := unmarshalRobust(`{"type":"EMAIL","language":"en","confidence":0.9}`, &r) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if r.Type != "EMAIL" || r.Language != "en" || r.Confidence != 0.9 { + t.Errorf("unexpected result: %+v", r) + } + }) + + t.Run("fenced JSON", func(t *testing.T) { + var r detectResult + err := unmarshalRobust("```json\n{\"type\":\"WIKI\",\"language\":\"de\",\"confidence\":0.8}\n```", &r) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if r.Type != "WIKI" || r.Language != "de" { + t.Errorf("unexpected result: %+v", r) + } + }) + + t.Run("whitespace around JSON", func(t *testing.T) { + var r detectResult + err := unmarshalRobust(" \n{\"type\":\"MEMO\",\"language\":\"fr\",\"confidence\":0.7}\n ", &r) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if r.Type != "MEMO" { + t.Errorf("unexpected type: %q", r.Type) + } + }) + + t.Run("invalid JSON returns error", func(t *testing.T) { + var r detectResult + err := unmarshalRobust("not json at all", &r) + if err == nil { + t.Error("expected error for invalid JSON, got nil") + } + }) + + t.Run("fenced invalid JSON returns error", func(t *testing.T) { + var r detectResult + err := unmarshalRobust("```json\nnot json\n```", &r) + if err == nil { + t.Error("expected error for invalid fenced JSON, got nil") + } + }) + + t.Run("foundation result", func(t *testing.T) { + var r foundationResult + raw := `{"fullDocument":"Subject | Detail\n\nBody","headers":["H1","H2"],"language":"en","qualityScore":0.85,"qualityFlags":[]}` + if err := unmarshalRobust(raw, &r); err != nil { + t.Fatalf("unexpected error: %v", err) + } + if r.QualityScore != 0.85 { + t.Errorf("expected qualityScore 0.85, got %v", r.QualityScore) + } + if len(r.Headers) != 2 { + t.Errorf("expected 2 headers, got %d", len(r.Headers)) + } + }) +} + +// --- LookupDocType --- + +func TestLookupDocType(t *testing.T) { + tests := []struct { + sourceApp string + want string + }{ + {"Microsoft Outlook", "email"}, + {"Thunderbird", "email"}, + {"Apple Mail", "email"}, + {"Microsoft Teams", "email"}, + {"Slack", "email"}, + {"Visual Studio Code", "memo"}, + {"VSCode - main.go", "memo"}, + {"Notepad++", "memo"}, + {"Sublime Text", "memo"}, + {"Microsoft Word", "memo"}, + {"Google Docs", "memo"}, + {"Microsoft PowerPoint", "powerpoint"}, + {"Keynote", "powerpoint"}, + {"LibreOffice Impress", "powerpoint"}, + {"Firefox - GitHub", ""}, // unknown + {"Terminal", ""}, // unknown + {"", ""}, // empty + {"OUTLOOK 365", "email"}, // case-insensitive + {"slack - #general", "email"}, + } + for _, tc := range tests { + t.Run(tc.sourceApp, func(t *testing.T) { + got := LookupDocType(tc.sourceApp) + if got != tc.want { + t.Errorf("LookupDocType(%q) = %q, want %q", tc.sourceApp, got, tc.want) + } + }) + } +} + +// --- buildRefinePrompt --- + +func TestBuildRefinePrompt(t *testing.T) { + originalText := "meeting with alice on tuesday, budget approved for $50k" + failedOutput := "Meeting Notes\n\nBudget discussed." + + t.Run("MECE_VIOLATION flag present in prompt", func(t *testing.T) { + sys, user := buildRefinePrompt(originalText, failedOutput, []string{"MECE_VIOLATION"}) + if !strings.Contains(sys, "MECE_VIOLATION") { + t.Error("system prompt does not mention MECE_VIOLATION") + } + if !strings.Contains(sys, "mutually exclusive") { + t.Error("system prompt does not include MECE remediation guidance") + } + if !strings.Contains(user, originalText) { + t.Error("user message does not contain original text") + } + if !strings.Contains(user, failedOutput) { + t.Error("user message does not contain failed output") + } + }) + + t.Run("INFO_LOSS flag includes hard constraint language", func(t *testing.T) { + sys, _ := buildRefinePrompt(originalText, failedOutput, []string{"INFO_LOSS"}) + if !strings.Contains(sys, "INFO_LOSS") { + t.Error("system prompt does not mention INFO_LOSS") + } + if !strings.Contains(sys, "hard constraint") { + t.Error("system prompt does not include hard constraint language for INFO_LOSS") + } + }) + + t.Run("STYLE_MISMATCH flag", func(t *testing.T) { + sys, _ := buildRefinePrompt(originalText, failedOutput, []string{"STYLE_MISMATCH"}) + if !strings.Contains(sys, "STYLE_MISMATCH") { + t.Error("system prompt does not mention STYLE_MISMATCH") + } + }) + + t.Run("SUBJECT_FORMAT flag", func(t *testing.T) { + sys, _ := buildRefinePrompt(originalText, failedOutput, []string{"SUBJECT_FORMAT"}) + if !strings.Contains(sys, "SUBJECT_FORMAT") { + t.Error("system prompt does not mention SUBJECT_FORMAT") + } + }) + + t.Run("multiple flags", func(t *testing.T) { + flags := []string{"MECE_VIOLATION", "INFO_LOSS", "STYLE_MISMATCH"} + sys, _ := buildRefinePrompt(originalText, failedOutput, flags) + for _, f := range flags { + if !strings.Contains(sys, f) { + t.Errorf("system prompt does not mention flag %q", f) + } + } + }) + + t.Run("unknown flag included verbatim", func(t *testing.T) { + sys, _ := buildRefinePrompt(originalText, failedOutput, []string{"CUSTOM_FLAG_XYZ"}) + if !strings.Contains(sys, "CUSTOM_FLAG_XYZ") { + t.Error("system prompt does not include unknown flag verbatim") + } + }) + + t.Run("empty flags still builds valid prompt", func(t *testing.T) { + sys, user := buildRefinePrompt(originalText, failedOutput, []string{}) + if sys == "" { + t.Error("system prompt should not be empty") + } + if user == "" { + t.Error("user message should not be empty") + } + }) + + t.Run("original text appears as hard constraint in user message", func(t *testing.T) { + _, user := buildRefinePrompt(originalText, failedOutput, []string{"INFO_LOSS"}) + if !strings.Contains(user, "hard constraint") { + t.Error("user message should label original text as hard constraint") + } + }) +} + +// --- buildDocTypePrompt dispatch --- + +func TestBuildDocTypePromptDispatch(t *testing.T) { + types := []string{"email", "wiki", "memo", "powerpoint", "unknown"} + for _, dt := range types { + t.Run(dt, func(t *testing.T) { + sys, user := buildDocTypePrompt(dt, "professional", "professional", "", "some text") + if sys == "" { + t.Error("system prompt should not be empty") + } + if user != "some text" { + t.Errorf("user message should be the input text, got %q", user) + } + }) + } +} + +// --- isValidDocType edge cases --- + +func TestIsValidDocTypeEdgeCases(t *testing.T) { + // Verify that auto is explicitly not a valid doc type + if isValidDocType("auto") { + t.Error("auto should not be a valid doc type for isValidDocType") + } + // Boundary: powerpoint is valid, ppt is not + if isValidDocType("ppt") { + t.Error("ppt should not be valid — only powerpoint") + } +} diff --git a/internal/features/pyramidize/source_app_map.go b/internal/features/pyramidize/source_app_map.go new file mode 100644 index 0000000..45f16cf --- /dev/null +++ b/internal/features/pyramidize/source_app_map.go @@ -0,0 +1,47 @@ +package pyramidize + +import "strings" + +// knownApps maps lowercase keyword substrings to their default Pyramidize document type. +// When LookupDocType scans a source app name, it checks whether any of these keywords +// is a substring of the (lowercased) app name/window title. +var knownApps = map[string]string{ + // Email clients + "outlook": "email", + "thunderbird": "email", + "apple mail": "email", + "mail": "email", + + // Messaging apps that commonly carry email-style communication + "teams": "email", + "slack": "email", + + // Code editors and text editors → informal memos / notes + "vscode": "memo", + "code": "memo", + "notepad++": "memo", + "notepad": "memo", + "sublime": "memo", + + // Word processors → memo / document style + "word": "memo", + "docs": "memo", + + // Presentation tools + "powerpoint": "powerpoint", + "keynote": "powerpoint", + "impress": "powerpoint", +} + +// LookupDocType returns the default document type for the given source application name. +// It performs a case-insensitive substring search against known application keywords. +// Returns an empty string if no match is found. +func LookupDocType(sourceApp string) string { + lower := strings.ToLower(sourceApp) + for keyword, docType := range knownApps { + if strings.Contains(lower, keyword) { + return docType + } + } + return "" +} diff --git a/internal/features/pyramidize/types.go b/internal/features/pyramidize/types.go new file mode 100644 index 0000000..96df075 --- /dev/null +++ b/internal/features/pyramidize/types.go @@ -0,0 +1,95 @@ +package pyramidize + +// PyramidizeRequest is the RPC request for the main Pyramidize call. +type PyramidizeRequest struct { + Text string `json:"text"` + DocumentType string `json:"documentType"` // "auto"|"email"|"wiki"|"powerpoint"|"memo" + CommunicationStyle string `json:"communicationStyle"` // "professional"|"casual"|"concise"|"detailed"|"persuasive"|"neutral"|"diplomatic"|"direct" + RelationshipLevel string `json:"relationshipLevel"` // "close"|"professional"|"authority"|"public" + CustomInstructions string `json:"customInstructions"` // optional, not persisted +} + +// PyramidizeResult is the RPC response from the main Pyramidize call. +type PyramidizeResult struct { + DocumentType string `json:"documentType"` + Language string `json:"language"` + FullDocument string `json:"fullDocument"` // first line = subject/title + Headers []string `json:"headers"` + QualityScore float64 `json:"qualityScore"` + QualityFlags []string `json:"qualityFlags"` + AppliedRefinement bool `json:"appliedRefinement"` + RefinementWarning string `json:"refinementWarning"` // non-empty if still below threshold after retry + DetectedType string `json:"detectedType"` // only set when AUTO was used + DetectedLang string `json:"detectedLang"` + DetectedConfidence float64 `json:"detectedConfidence"` +} + +// RefineGlobalRequest is the RPC request for a full-canvas AI revision. +type RefineGlobalRequest struct { + FullCanvas string `json:"fullCanvas"` + OriginalText string `json:"originalText"` + Instruction string `json:"instruction"` + DocumentType string `json:"documentType"` + CommunicationStyle string `json:"communicationStyle"` + RelationshipLevel string `json:"relationshipLevel"` +} + +// RefineGlobalResult is the RPC response for a full-canvas AI revision. +type RefineGlobalResult struct { + NewCanvas string `json:"newCanvas"` +} + +// SpliceRequest is the RPC request for rewriting a selected canvas section. +type SpliceRequest struct { + FullCanvas string `json:"fullCanvas"` + OriginalText string `json:"originalText"` + SelectedText string `json:"selectedText"` + Instruction string `json:"instruction"` +} + +// SpliceResult is the RPC response for rewriting a selected canvas section. +type SpliceResult struct { + RewrittenSection string `json:"rewrittenSection"` +} + +// AppPreset maps a source application name to a preferred document type. +// Mirrors settings.AppPreset — kept separate to avoid circular imports. +type AppPreset struct { + SourceApp string `json:"sourceApp"` + DocumentType string `json:"documentType"` +} + +// detectResult is the internal struct for parsing the detection response. +type detectResult struct { + Type string `json:"type"` + Language string `json:"language"` + Confidence float64 `json:"confidence"` +} + +// foundationResult is the internal struct for parsing the foundation call response. +type foundationResult struct { + FullDocument string `json:"fullDocument"` + Headers []string `json:"headers"` + Language string `json:"language"` + QualityScore float64 `json:"qualityScore"` + QualityFlags []string `json:"qualityFlags"` +} + +// refineResult is for parsing the refinement call response. +type refineResult struct { + FullDocument string `json:"fullDocument"` + Headers []string `json:"headers"` + Language string `json:"language"` + QualityScore float64 `json:"qualityScore"` + QualityFlags []string `json:"qualityFlags"` +} + +// canvasResult is for the global canvas instruction response. +type canvasResult struct { + NewCanvas string `json:"newCanvas"` +} + +// spliceResult is for the selection splice response. +type spliceResult struct { + RewrittenSection string `json:"rewrittenSection"` +} diff --git a/internal/features/settings/model.go b/internal/features/settings/model.go index ddf2970..333fd93 100644 --- a/internal/features/settings/model.go +++ b/internal/features/settings/model.go @@ -14,6 +14,12 @@ type KeyStatus struct { Source string `json:"source"` // "env", "keyring", or "none" } +// AppPreset maps a source application name to a preferred document type for Pyramidize. +type AppPreset struct { + SourceApp string `json:"sourceApp"` + DocumentType string `json:"documentType"` +} + // Settings is the top-level application settings structure persisted to disk. type Settings struct { ActiveProvider string `json:"active_provider"` // "openai" | "claude" | "ollama" | "bedrock" @@ -25,13 +31,18 @@ type Settings struct { DebugLogging bool `json:"debug_logging"` // writes debug.log to the app config dir SensitiveLogging bool `json:"sensitive_logging"` // logs full API payloads; never share the log file while enabled UpdateChannel string `json:"update_channel"` // "" (auto-detect), "stable", or "pre-release" + + // Pyramidize settings + AppPresets []AppPreset `json:"app_presets"` + PyramidizeQualityThreshold float64 `json:"pyramidize_quality_threshold"` // default 0.65 } // Default returns a Settings with sensible defaults. func Default() Settings { return Settings{ - ActiveProvider: "openai", - ShortcutKey: "ctrl+g", - ThemePreference: "dark", + ActiveProvider: "openai", + ShortcutKey: "ctrl+g", + ThemePreference: "dark", + PyramidizeQualityThreshold: 0.65, } } diff --git a/main.go b/main.go index 1415a62..4bd7abb 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,7 @@ import ( "keylint/internal/app" "keylint/internal/features/enhance" featurelogger "keylint/internal/features/logger" + "keylint/internal/features/pyramidize" "keylint/internal/features/shortcut" "keylint/internal/features/updater" "keylint/internal/logger" @@ -62,6 +63,10 @@ func main() { wailsApp.RegisterService(application.NewService(services.Clipboard)) wailsApp.RegisterService(application.NewService(enhance.NewService(services.Settings))) + // Pyramidize service — captures source app on hotkey and exposes RPC methods. + pyramidizeSvc := pyramidize.NewService(services.Settings, services.Clipboard) + wailsApp.RegisterService(application.NewService(pyramidizeSvc)) + // Log service — forwards frontend log messages into debug.log. wailsApp.RegisterService(application.NewService(featurelogger.NewService())) @@ -109,6 +114,9 @@ func main() { ch := services.Shortcut.Triggered() for event := range ch { logger.Info("shortcut: triggered", "source", event.Source) + // Capture the source app window BEFORE copying from foreground, + // so SendBack() can restore focus to the correct window later. + pyramidizeSvc.CaptureSourceApp() if err := services.Clipboard.CopyFromForeground(); err != nil { logger.Warn("shortcut: CopyFromForeground failed", "err", err) } From 4defafa477405fe7a0d870ac9809f24b07f33482 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sun, 8 Mar 2026 23:26:30 +0000 Subject: [PATCH 02/28] fix(dev): start ng serve before Go build to avoid cold-start race condition wails3 task run was starting the binary before ng serve finished binding to port 9245. Reordering background/blocking executes gives ng serve the ~3s of Go build time to initialize before the binary connects to it. Co-Authored-By: Claude Sonnet 4.6 --- build/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/config.yml b/build/config.yml index 139c55f..1eb695e 100644 --- a/build/config.yml +++ b/build/config.yml @@ -51,10 +51,10 @@ dev_mode: - "*.ts" # The frontend directory will be excluded entirely by the setting above. git_ignore: true executes: - - cmd: wails3 build DEV=true - type: blocking - cmd: wails3 task common:dev:frontend type: background + - cmd: wails3 build DEV=true + type: blocking - cmd: wails3 task run type: primary From 708221ffd718945deb9edf42834e56a9032ef428 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Mon, 9 Mar 2026 23:45:32 +0000 Subject: [PATCH 03/28] =?UTF-8?q?feat(shell,pyramidize):=20UX=20pass=20?= =?UTF-8?q?=E2=80=94=20sidebar=20polish,=20model=20upgrades,=20clipboard?= =?UTF-8?q?=20resilience?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Shell sidebar: - Collapsible sidebar with hover-expand popover (overlay, no layout shift) - Collapsed logo shows "KL" (K white, L orange) matching brand colours - Nav icons centred in collapsed strip; SVG pyramid icon colour-consistent with icons on hover and active-route states - Version row hidden when empty-collapsed (no dead click-strip) - Collapse button taller (0.875rem padding, ≥40px tap target) - Layout switched to position:absolute sidebar + margin-left on main to prevent scrollbar flicker on hover-expand Pyramidize: - Upgrade default models: claude-sonnet-4-6, gpt-5.2 (was haiku / gpt-4o-mini) - Provider + model selectors in left panel (replaces provider badge) - Quality threshold moved from Settings › App Defaults to Pyramidize panel - Error messages clipped to 2 lines with copy icon; removed "Change Provider" button - Trace log full overlay replaces peek sub-panel - Canvas textarea/preview fill available height (flex chain fix) - Cancel propagates through RefineGlobal / Splice via aiOpts struct Clipboard / Linux: - Read/Write try xclip → xsel → wl-paste/wl-copy via LookPath; no crash on missing tools — clean error message instead of raw exec error - xdotool calls (focus, paste, source-app capture) are best-effort; missing binary logs a warning and returns nil Tests: - 80 Playwright tests across shell-menu*.spec.ts (centering, hover-expand, colour parity, layout dims, click targets, logo, active-route, scrollbar) - 13 Playwright tests in pyramidize-layout.spec.ts (tabs, canvas height, provider selectors, trace overlay, sidebar collapse) - 108 Vitest unit tests (0 failures) Co-Authored-By: Claude Sonnet 4.6 --- PYRAMIDIZE-UX.md | 275 ++++++++ frontend/angular.json | 3 +- .../internal/features/clipboard/service.js | 9 +- .../internal/features/pyramidize/models.js | 44 ++ frontend/e2e/pyramidize-layout.spec.ts | 224 ++++++ .../e2e/screenshots/01-enhance-dark-mode.png | Bin 20601 -> 68698 bytes .../e2e/screenshots/02-body-background.png | Bin 20601 -> 68698 bytes frontend/e2e/screenshots/03-enhance-full.png | Bin 20601 -> 68698 bytes frontend/e2e/screenshots/04-settings-full.png | Bin 38718 -> 57145 bytes .../e2e/screenshots/05-settings-card-bg.png | Bin 38718 -> 57145 bytes .../06-settings-shortcut-value.png | Bin 38718 -> 57145 bytes frontend/e2e/shell-menu-deep.spec.ts | 246 +++++++ frontend/e2e/shell-menu-deep2.spec.ts | 208 ++++++ frontend/e2e/shell-menu-deep3.spec.ts | 162 +++++ frontend/e2e/shell-menu-deep4.spec.ts | 230 +++++++ frontend/e2e/shell-menu.spec.ts | 310 +++++++++ .../features/settings/settings.component.ts | 7 - .../text-enhancement.component.ts | 641 +++++++++++++----- .../text-enhancement.service.spec.ts | 6 +- frontend/src/app/layout/shell.component.scss | 109 ++- frontend/src/app/layout/shell.component.ts | 96 ++- internal/features/clipboard/paste_linux.go | 26 +- internal/features/clipboard/service.go | 68 +- internal/features/pyramidize/api_claude.go | 7 +- internal/features/pyramidize/api_ollama.go | 7 +- internal/features/pyramidize/api_openai.go | 7 +- internal/features/pyramidize/capture_linux.go | 10 +- internal/features/pyramidize/json_parse.go | 130 +++- .../features/pyramidize/prompts_selfqa.go | 3 +- internal/features/pyramidize/service.go | 59 +- internal/features/pyramidize/service_test.go | 89 +++ internal/features/pyramidize/types.go | 6 + 32 files changed, 2695 insertions(+), 287 deletions(-) create mode 100644 PYRAMIDIZE-UX.md create mode 100644 frontend/e2e/pyramidize-layout.spec.ts create mode 100644 frontend/e2e/shell-menu-deep.spec.ts create mode 100644 frontend/e2e/shell-menu-deep2.spec.ts create mode 100644 frontend/e2e/shell-menu-deep3.spec.ts create mode 100644 frontend/e2e/shell-menu-deep4.spec.ts create mode 100644 frontend/e2e/shell-menu.spec.ts diff --git a/PYRAMIDIZE-UX.md b/PYRAMIDIZE-UX.md new file mode 100644 index 0000000..a01b03e --- /dev/null +++ b/PYRAMIDIZE-UX.md @@ -0,0 +1,275 @@ +# PYRAMIDIZE-UX — UX Polish & Model Upgrades + +Companion plan to PYRAMIDIZE.md. Covers post-ENG-12 UX improvements and model-selection work. + +--- + +## Model Strategy (all providers) + +### Anthropic +Official aliases (documented, forward-compatible — no snapshot date = always latest snapshot of that generation): +- `claude-sonnet-4-6` → Claude Sonnet 4.6 (best balance; **default for Pyramidize**) +- `claude-opus-4-6` → Claude Opus 4.6 (highest quality, higher cost) +- `claude-haiku-4-5` → Claude Haiku 4.5 (fastest, lowest cost) + +**Change from:** `claude-haiku-4-5-20251001` → **`claude-sonnet-4-6`** (hardcoded default) + +### OpenAI +Rolling aliases (no date suffix required). Current generation is **GPT-4.1** (Apr 2025); +GPT-4o is the previous generation. GPT-5 exists as of Aug 2025. + +- `gpt-4.1-nano` → GPT-4.1 Nano — fastest/cheapest +- `gpt-4.1-mini` → GPT-4.1 Mini — fast/cheap +- `gpt-4.1` → GPT-4.1 — balanced +- `gpt-5.1-mini` → GPT-5.1 Mini — fast, capable +- `gpt-5.2` → GPT-5.2 — **default for Pyramidize** (Dec 2025, pinned: `gpt-5.2-2025-12-11`) +- `gpt-5.2-pro` → GPT-5.2 Pro — most capable +- `o3` → o3 — reasoning tasks + +`gpt-4o` / `gpt-4o-mini` are old generation — do not use as defaults. + +**Change from:** `gpt-4o-mini` → **`gpt-5.2`** + +### Ollama +Docker-style tags — omitting tag defaults to `:latest`. Models to surface in selector: +- `llama3.2` (default) +- `mistral` +- `gemma3` +- `phi4` +- `qwen2.5` + +User can also type a custom model name directly. + +--- + +## UX-01 — Inline Provider + Model Selector (Pyramidize) + +**Goal:** Replace the "Change Provider" button in the error row with a persistent, compact provider+model selector visible in the left settings panel (below the Document Type selector). + +**Location:** `text-enhancement.component.ts` — left panel, between doc-type selector and comm-style selector. + +**Design:** +``` +Provider [Anthropic ▼] +Model [claude-sonnet-4-6 ▼] +``` +- Two stacked `` dropdowns (small size) +- Provider options: Anthropic | OpenAI | Ollama +- Model list changes based on provider (static map in component) +- Selection persists as module-level `let` vars (`selectedProvider`, `selectedModel`) +- These are passed into the `PyramidizeRequest` (add `provider` + `model` fields to the RPC) +- Remove "Change Provider" button from error row entirely; keep only "Retry" +- **Fix page** gets the same selector (UX-01b below) + +**Go changes:** +- `types.go`: add `Provider string` and `Model string` to `PyramidizeRequest`, `RefineGlobalRequest`, `SpliceRequest` +- `service.go`: pass `req.Provider`/`req.Model` to the api_*.go call instead of reading from settings; fall back to settings provider if `req.Provider` is empty +- `api_claude.go`: accept model as parameter, default `claude-sonnet-4-6` +- `api_openai.go`: accept model as parameter, default `gpt-5.2` +- `api_ollama.go`: accept model as parameter, default `llama3.2` + +**Angular changes:** +- `wails.service.ts`: update `BROWSER_MODE_DEFAULTS` to reflect new fields +- `text-enhancement.component.ts`: add provider/model selectors to left panel; add `selectedProvider`/`selectedModel` module-level vars; update `pyramidizeParams()` builder + +--- + +## UX-01b — Inline Provider + Model Selector (Fix / Quick Fix page) + +**Goal:** Add same compact provider+model selector to the Fix page, above the Fix button row. + +**Location:** `fix.component.ts` — below the textareas, above the action row. + +**Design:** Same two-dropdown layout as UX-01. Module-level vars `_fixProvider`, `_fixModel`. + +**Go changes:** +- `enhance/service.go` (`enhance()` method): accept optional provider+model override (or add a new `EnhanceWithOptions` RPC) +- Actually: add `provider` + `model` to the existing Enhance RPC call (or a new `EnhanceOptions` struct) + +--- + +## UX-02 — Collapsible Main Menu + +**Goal:** Sidebar can collapse to icon-only strip (~48px), toggled by a chevron button at the bottom of the sidebar. + +**Location:** `shell.component.ts` + `shell.component.scss` + +**Design:** +- Module-level `let sidebarCollapsed = false` (persists across navigation) +- `.layout-sidebar` gets class `.collapsed` when collapsed +- Collapsed width: `48px`; expanded: `17rem` +- Nav items: hide `` text when collapsed (CSS `display:none` on span in collapsed state) +- Logo: show only key icon when collapsed (hide "Lint" text or show abbreviated "K") +- Chevron toggle button at bottom of sidebar (rotates 180° when collapsed) +- Version text hidden when collapsed +- Smooth CSS transition: `width 0.2s ease` +- `pTooltip` on each nav icon when collapsed (shows label on hover) + +**No Go changes.** + +--- + +## UX-03 — Error Message Clipping + Copy + +**Goal:** Error messages from the AI (sometimes very long) should be clipped to ~2 lines max with a copy icon. Full text accessible via copy. + +**Location:** `text-enhancement.component.ts` error row (lines 283-290) + +**Design:** +``` +❌ [truncated error text, 2 lines max...] [⧉ copy] [Retry] +``` +- Error text container: `max-height: 2.8em; overflow: hidden; text-overflow: ellipsis` + (or use `-webkit-line-clamp: 2`) +- Copy icon button (`pi pi-copy`) next to error text — copies full error to clipboard +- Remove "Change Provider" button (replaced by UX-01 inline selector) +- `p-tooltip` on the error text showing full message on hover (with `appendTo="body"`) + +**No Go changes.** + +--- + +## UX-04 — Quality Threshold in Pyramidize UI + +**Goal:** Move the quality threshold control from Settings › App Defaults into the Pyramidize left panel (advanced section), so users can tune it in-context. + +**Location:** `text-enhancement.component.ts` — bottom of left panel, collapsible "Advanced" section. + +**Design:** +``` +▸ Advanced + Quality threshold [0.65 ▲▼] (0–1) +``` +- PrimeNG `` with step 0.05, min 0, max 1 +- Module-level `let qualityThreshold = 0.65` — loaded via `getQualityThreshold()` on init, saved via `setQualityThreshold()` on change (debounced or on blur) +- Collapse/expand section with a small toggle (module-level `let advancedOpen = false`) +- **Remove** quality threshold from Settings › App Defaults tab (or keep as read-only display, or remove entirely — remove is cleaner) + +**No Go changes** (RPCs `GetQualityThreshold`/`SetQualityThreshold` already exist). + +--- + +## UX-05 — Checkpoint Tooltip Fix + +**Goal:** "Add checkpoint" tooltip wraps per-character because the tooltip container has no min-width and appears inside a constrained flex container. + +**Location:** `text-enhancement.component.ts` trace panel header (lines 369-377) + +**Fix:** +- Add `appendTo="body"` to all `pTooltip` directives in the trace panel (and ideally globally in the component) +- Add `tooltipPosition="left"` or `"top"` as appropriate +- Add `[tooltipOptions]="{ showDelay: 400 }"` to reduce accidental triggers +- Add `style="white-space: nowrap"` override via `tooltipStyleClass` if needed + +The core issue is that without `appendTo="body"`, PrimeNG renders the tooltip inside the nearest `position:relative` ancestor which is the 260px-wide trace panel — causing the tooltip text to wrap. + +**No Go changes.** + +--- + +## UX-06 — Trace Log Peek as Central Overlay + +**Goal:** When a trace log entry is clicked (peek), instead of showing the preview in a tiny bottom-right sub-panel within the trace panel itself, show it as a full-width overlay/dialog over the central canvas area. + +**Location:** `text-enhancement.component.ts` trace panel peek section (lines 410-432) + +**Design:** +- Remove the inline `.trace-peek` sub-panel from inside the trace panel +- Add a `` or absolutely-positioned overlay panel anchored over the `.canvas-area` +- Dialog has: + - Header: entry label + timestamp + close button + - Body: `
` with full snapshot text, scrollable, fills available space
+  - Footer: "Revert to here" danger button + "Close" secondary button
+- The trace panel entry click sets `peekEntry` (existing var) — dialog opens when `peekEntry != null`
+- Markdown preview option: if snapshot looks like markdown (has `#` headers), render via `MarkdownPipe`
+
+**Styling:**
+- Overlay width: same as `.canvas-area` (use `position: absolute; inset: 0` within `.canvas-area` for a native overlay, or use PrimeNG Dialog with `appendTo=".canvas-area"`)
+- Prefer native CSS overlay over PrimeNG Dialog (avoids z-index issues with sidebar)
+
+**No Go changes.**
+
+---
+
+## UX-07 — Canvas Preview Height / Scroll Fix
+
+**Goal:** In preview mode, the markdown preview expands to full content height and pushes the instruction bar and action row off-screen.
+
+**Location:** `text-enhancement.component.ts` canvas area
+
+**Fix:**
+- `.canvas-area` is already `flex-direction: column` — but the preview div has `min-height: 320px` with no `max-height` or `flex: 1` + `overflow-y: auto`
+- Change `.canvas-preview` to use `flex: 1; overflow-y: auto` (same treatment as `.canvas-textarea`)
+- Wrap the tab panels + instruction bar in a flex column: tab panel content gets `flex: 1; overflow: hidden`
+- The instruction bar and action row must be `flex-shrink: 0` (already are via fixed height, but verify)
+- This ensures the preview never grows past the available viewport height
+
+**Specifically:**
+```scss
+// In text-enhancement.component.ts styles:
+.canvas-area {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;  // already set
+  min-height: 0;     // ADD THIS — critical for nested flexbox shrink
+}
+
+.canvas-preview {
+  flex: 1;           // CHANGE from min-height: 320px
+  overflow-y: auto;  // already set
+  min-height: 0;     // ADD for flexbox
+}
+
+.canvas-textarea {
+  flex: 1;           // ADD (was min-height: 320px + resize:vertical)
+  resize: none;      // CHANGE (resize:vertical fights flexbox)
+  min-height: 0;
+}
+```
+Also ensure the PrimeNG `` component itself is `flex: 1; overflow: hidden; display: flex; flex-direction: column` and its tab panel content wrapper likewise.
+
+**No Go changes.**
+
+---
+
+## Implementation Order
+
+| # | Task | Effort | Go? | Angular? |
+|---|------|--------|-----|----------|
+| UX-07 | Canvas preview overflow fix | XS | — | ✓ |
+| UX-05 | Tooltip fix | XS | — | ✓ |
+| UX-03 | Error clipping + copy | S | — | ✓ |
+| UX-02 | Collapsible sidebar | S | — | ✓ |
+| UX-04 | Quality threshold in Pyramidize UI | S | — | ✓ |
+| UX-06 | Trace peek overlay | M | — | ✓ |
+| UX-01 | Provider+model selector (Pyramidize) | M | ✓ | ✓ |
+| UX-01b | Provider+model selector (Fix) | S | ✓ | ✓ |
+
+**Suggested grouping:**
+- **Sprint A (pure Angular, no bindings regen):** UX-07, UX-05, UX-03, UX-02, UX-04, UX-06
+- **Sprint B (requires Go + bindings regen):** UX-01, UX-01b (model defaults upgrade included)
+
+---
+
+## Files to Change
+
+### Go
+- `internal/features/pyramidize/api_claude.go` — model param, default `claude-sonnet-4-6`
+- `internal/features/pyramidize/api_openai.go` — model param, default `gpt-4o`
+- `internal/features/pyramidize/api_ollama.go` — model param, default `llama3.2`
+- `internal/features/pyramidize/types.go` — add `Provider`, `Model` to request types
+- `internal/features/pyramidize/service.go` — route to correct api_*.go based on `req.Provider`
+- `internal/features/enhance/service.go` — add `EnhanceWithModel(provider, model, text)` RPC
+
+### Angular
+- `frontend/src/app/features/text-enhancement/text-enhancement.component.ts` — UX-01, 03, 04, 05, 06, 07
+- `frontend/src/app/features/fix/fix.component.ts` — UX-01b
+- `frontend/src/app/layout/shell.component.ts` + `.scss` — UX-02
+- `frontend/src/app/features/settings/settings.component.ts` — remove quality threshold (UX-04)
+- `frontend/src/app/core/wails.service.ts` — new RPC method for `EnhanceWithModel`
+- `frontend/src/testing/wails-mock.ts` — mock for new RPC
+
+### Bindings (auto-generated, run after Go changes)
+- `frontend/bindings/keylint/internal/features/pyramidize/` — after types.go change
+- `frontend/bindings/keylint/internal/features/enhance/` — after enhance/service.go change
diff --git a/frontend/angular.json b/frontend/angular.json
index ebc82fb..7fa7ef9 100644
--- a/frontend/angular.json
+++ b/frontend/angular.json
@@ -2,7 +2,8 @@
   "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
   "version": 1,
   "cli": {
-    "packageManager": "npm"
+    "packageManager": "npm",
+    "analytics": false
   },
   "newProjectRoot": "projects",
   "projects": {
diff --git a/frontend/bindings/keylint/internal/features/clipboard/service.js b/frontend/bindings/keylint/internal/features/clipboard/service.js
index f1011b5..748e692 100644
--- a/frontend/bindings/keylint/internal/features/clipboard/service.js
+++ b/frontend/bindings/keylint/internal/features/clipboard/service.js
@@ -4,7 +4,7 @@
 
 /**
  * Service reads from and writes to the system clipboard.
- * Uses xclip/xdotool on Linux, native Win32 via Go on Windows.
+ * Uses xclip, xsel, or wl-paste/wl-copy on Linux (tries each in order).
  * @module
  */
 
@@ -15,6 +15,7 @@ import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Cr
 /**
  * CopyFromForeground sends Ctrl+C to the currently focused window via xdotool,
  * then waits 150 ms for the clipboard to be populated.
+ * Best-effort: if xdotool is not installed, logs a warning and returns nil.
  * @returns {$CancellablePromise}
  */
 export function CopyFromForeground() {
@@ -23,9 +24,7 @@ export function CopyFromForeground() {
 
 /**
  * PasteToForeground sends a Ctrl+V keystroke to the currently focused window.
- * Uses xdotool; intended to be called after writing fixed text to the clipboard
- * so the result is pasted back into the source application.
- * A 150 ms delay is applied first to let the clipboard write settle.
+ * Best-effort: if xdotool is not installed, logs a warning and returns nil.
  * @returns {$CancellablePromise}
  */
 export function PasteToForeground() {
@@ -34,6 +33,7 @@ export function PasteToForeground() {
 
 /**
  * Read returns the current clipboard text content.
+ * Tries xclip → xsel → wl-paste. Returns a clear error if none are available.
  * @returns {$CancellablePromise}
  */
 export function Read() {
@@ -42,6 +42,7 @@ export function Read() {
 
 /**
  * Write sets the clipboard text content.
+ * Tries xclip → xsel → wl-copy. Returns a clear error if none are available.
  * @param {string} text
  * @returns {$CancellablePromise}
  */
diff --git a/frontend/bindings/keylint/internal/features/pyramidize/models.js b/frontend/bindings/keylint/internal/features/pyramidize/models.js
index de989f4..94e83b6 100644
--- a/frontend/bindings/keylint/internal/features/pyramidize/models.js
+++ b/frontend/bindings/keylint/internal/features/pyramidize/models.js
@@ -93,6 +93,22 @@ export class PyramidizeRequest {
              */
             this["customInstructions"] = "";
         }
+        if (!("provider" in $$source)) {
+            /**
+             * optional override: "claude"|"openai"|"ollama" — falls back to settings.ActiveProvider
+             * @member
+             * @type {string}
+             */
+            this["provider"] = "";
+        }
+        if (!("model" in $$source)) {
+            /**
+             * optional override, e.g. "claude-sonnet-4-6" — falls back to provider default
+             * @member
+             * @type {string}
+             */
+            this["model"] = "";
+        }
 
         Object.assign(this, $$source);
     }
@@ -271,6 +287,20 @@ export class RefineGlobalRequest {
              */
             this["relationshipLevel"] = "";
         }
+        if (!("provider" in $$source)) {
+            /**
+             * @member
+             * @type {string}
+             */
+            this["provider"] = "";
+        }
+        if (!("model" in $$source)) {
+            /**
+             * @member
+             * @type {string}
+             */
+            this["model"] = "";
+        }
 
         Object.assign(this, $$source);
     }
@@ -354,6 +384,20 @@ export class SpliceRequest {
              */
             this["instruction"] = "";
         }
+        if (!("provider" in $$source)) {
+            /**
+             * @member
+             * @type {string}
+             */
+            this["provider"] = "";
+        }
+        if (!("model" in $$source)) {
+            /**
+             * @member
+             * @type {string}
+             */
+            this["model"] = "";
+        }
 
         Object.assign(this, $$source);
     }
diff --git a/frontend/e2e/pyramidize-layout.spec.ts b/frontend/e2e/pyramidize-layout.spec.ts
new file mode 100644
index 0000000..b969818
--- /dev/null
+++ b/frontend/e2e/pyramidize-layout.spec.ts
@@ -0,0 +1,224 @@
+/**
+ * Pyramidize layout tests — run in real Chromium, no API calls.
+ *
+ * These catch CSS layout regressions (flex height, tab visibility, overflow)
+ * that jsdom/Vitest cannot detect because jsdom does not apply stylesheets.
+ *
+ * Convention: assert rendered dimensions with getBoundingClientRect() and
+ * getComputedStyle() rather than snapshotting pixels — snapshots are brittle
+ * across font hinting / sub-pixel differences between environments.
+ */
+
+import { test, expect, Page } from '@playwright/test';
+
+// ── helpers ──────────────────────────────────────────────────────────────────
+
+async function gotoEnhance(page: Page): Promise {
+  await page.goto('/enhance');
+  await page.waitForLoadState('networkidle');
+  // Wait for the component's initial RPC calls (getSourceApp, loadSettings…) to settle.
+  await page.waitForTimeout(300);
+}
+
+/** Returns getBoundingClientRect() for a selector. */
+async function rect(page: Page, selector: string) {
+  return page.locator(selector).evaluate((el) => {
+    const r = el.getBoundingClientRect();
+    return { width: r.width, height: r.height, top: r.top, bottom: r.bottom };
+  });
+}
+
+/** Returns getComputedStyle property. */
+async function style(page: Page, selector: string, prop: string): Promise {
+  return page.locator(selector).evaluate(
+    (el, p) => getComputedStyle(el).getPropertyValue(p),
+    prop,
+  );
+}
+
+// ── Tab switching ─────────────────────────────────────────────────────────────
+
+test.describe('Pyramidize — tab switching', () => {
+  test('only the active tab panel is visible', async ({ page }) => {
+    await gotoEnhance(page);
+
+    // Original tab is active by default.
+    const originalPanel = page.locator('p-tabpanel[value="original"]');
+    const canvasPanel   = page.locator('p-tabpanel[value="canvas"]');
+
+    await expect(originalPanel).toBeVisible();
+
+    // The inactive canvas panel must not be visible.
+    await expect(canvasPanel).toBeHidden();
+
+    // Switch to canvas tab.
+    await page.locator('p-tab[value="canvas"]').click();
+
+    await expect(canvasPanel).toBeVisible();
+    await expect(originalPanel).toBeHidden();
+  });
+
+  test('both panels are never simultaneously visible', async ({ page }) => {
+    await gotoEnhance(page);
+
+    const panels = page.locator('p-tabpanel');
+    const count  = await panels.count();
+    expect(count).toBe(2);
+
+    // Measure how many panels have height > 0 on the initial render.
+    const heights = await panels.evaluateAll((els) =>
+      els.map((el) => el.getBoundingClientRect().height),
+    );
+    const visible = heights.filter((h) => h > 0);
+    expect(visible.length).toBe(1);
+
+    // Switch tab, re-check.
+    await page.locator('p-tab[value="canvas"]').click();
+    const heights2 = await panels.evaluateAll((els) =>
+      els.map((el) => el.getBoundingClientRect().height),
+    );
+    const visible2 = heights2.filter((h) => h > 0);
+    expect(visible2.length).toBe(1);
+  });
+});
+
+// ── Textarea height ───────────────────────────────────────────────────────────
+
+test.describe('Pyramidize — textarea fills available space', () => {
+  test('original textarea is taller than 200px', async ({ page }) => {
+    await gotoEnhance(page);
+
+    const r = await rect(page, '[data-testid="original-textarea"]');
+    expect(r.height).toBeGreaterThan(200);
+  });
+
+  test('canvas textarea is taller than 200px after switching to canvas tab', async ({ page }) => {
+    await gotoEnhance(page);
+    await page.locator('p-tab[value="canvas"]').click();
+
+    const r = await rect(page, '[data-testid="canvas-textarea"]');
+    expect(r.height).toBeGreaterThan(200);
+  });
+
+  test('textareas do not overflow below the viewport', async ({ page }) => {
+    await gotoEnhance(page);
+
+    const viewportHeight = page.viewportSize()!.height;
+    const r = await rect(page, '[data-testid="original-textarea"]');
+    expect(r.bottom).toBeLessThanOrEqual(viewportHeight + 1); // +1px tolerance
+  });
+});
+
+// ── Bottom controls always visible ───────────────────────────────────────────
+
+test.describe('Pyramidize — bottom controls are not clipped', () => {
+  test('global instruction input is visible and within viewport', async ({ page }) => {
+    await gotoEnhance(page);
+
+    const viewportHeight = page.viewportSize()!.height;
+    const r = await rect(page, '[data-testid="global-instruction-input"]');
+
+    expect(r.height).toBeGreaterThan(0);
+    expect(r.bottom).toBeLessThanOrEqual(viewportHeight + 1);
+  });
+
+  test('Copy Markdown button is visible and within viewport', async ({ page }) => {
+    await gotoEnhance(page);
+
+    const viewportHeight = page.viewportSize()!.height;
+    const r = await rect(page, '[data-testid="copy-markdown-btn"]');
+
+    expect(r.height).toBeGreaterThan(0);
+    expect(r.bottom).toBeLessThanOrEqual(viewportHeight + 1);
+  });
+});
+
+// ── Left panel controls ───────────────────────────────────────────────────────
+
+test.describe('Pyramidize — left panel', () => {
+  test('provider and model selectors are visible', async ({ page }) => {
+    await gotoEnhance(page);
+
+    await expect(page.locator('[data-testid="provider-select"]')).toBeVisible();
+    await expect(page.locator('[data-testid="model-select"]')).toBeVisible();
+  });
+
+  test('doc-type selector is visible', async ({ page }) => {
+    await gotoEnhance(page);
+    await expect(page.locator('[data-testid="doc-type-select"]')).toBeVisible();
+  });
+
+  test('pyramidize button is visible', async ({ page }) => {
+    await gotoEnhance(page);
+    await expect(page.locator('[data-testid="pyramidize-btn"]')).toBeVisible();
+  });
+});
+
+// ── Trace log panel ───────────────────────────────────────────────────────────
+
+test.describe('Pyramidize — trace log panel', () => {
+  test('trace panel starts collapsed and can be expanded', async ({ page }) => {
+    await gotoEnhance(page);
+
+    const panel = page.locator('[data-testid="trace-log-panel"]');
+    await expect(panel).toBeVisible();
+
+    // In collapsed state the width should be narrow (≤ 50px).
+    const r = await rect(page, '[data-testid="trace-log-panel"]');
+    expect(r.width).toBeLessThanOrEqual(50);
+
+    // Click the history icon to expand.
+    await page.locator('[data-testid="trace-log-panel"] button').first().click();
+    await page.waitForTimeout(250); // transition
+
+    const r2 = await rect(page, '[data-testid="trace-log-panel"]');
+    expect(r2.width).toBeGreaterThan(50);
+  });
+});
+
+// ── Sidebar collapse ─────────────────────────────────────────────────────────
+
+test.describe('Shell — sidebar collapse', () => {
+  test('sidebar collapses to icon-only strip on button click', async ({ page }) => {
+    await page.goto('/enhance');
+    await page.waitForLoadState('networkidle');
+
+    const sidebar = page.locator('.layout-sidebar');
+    const initialWidth = await sidebar.evaluate((el) => el.getBoundingClientRect().width);
+    expect(initialWidth).toBeGreaterThan(100); // expanded
+
+    await page.locator('.collapse-btn').click();
+    await page.waitForTimeout(300); // CSS transition
+
+    const collapsedWidth = await sidebar.evaluate((el) => el.getBoundingClientRect().width);
+    expect(collapsedWidth).toBeLessThan(70); // collapsed to ~48px
+
+    // Expand again.
+    await page.locator('.collapse-btn').click();
+    await page.waitForTimeout(300);
+
+    const expandedWidth = await sidebar.evaluate((el) => el.getBoundingClientRect().width);
+    expect(expandedWidth).toBeGreaterThan(100);
+  });
+});
+
+// ── Canvas preview mode ───────────────────────────────────────────────────────
+
+test.describe('Pyramidize — canvas preview mode', () => {
+  test('preview div has meaningful height and does not overflow viewport', async ({ page }) => {
+    await gotoEnhance(page);
+
+    // Switch to canvas tab and click Preview.
+    await page.locator('p-tab[value="canvas"]').click();
+    await page.locator('button:has-text("Preview")').click();
+
+    const viewportHeight = page.viewportSize()!.height;
+    const previewEl = page.locator('.canvas-preview');
+
+    await expect(previewEl).toBeVisible();
+
+    const r = await rect(page, '.canvas-preview');
+    expect(r.height).toBeGreaterThan(100);
+    expect(r.bottom).toBeLessThanOrEqual(viewportHeight + 1);
+  });
+});
diff --git a/frontend/e2e/screenshots/01-enhance-dark-mode.png b/frontend/e2e/screenshots/01-enhance-dark-mode.png
index 8bead049fbf25ccd3fa650698a28eb0f9778fc3b..bf5f5929c5a0c160120b27496bfbeca52609e0bd 100644
GIT binary patch
literal 68698
zcmb??WmucRvu|1olmexN(&DtGKyeGME$+qL-Q6WntU!SR#oY;Rf#UA&F2&t7kmQE`
z&pG#gzR%e&$+P?JytBKrGxN@GCiI(}IQ9#o7XSbNTT((q5dc6%{(U<3{3-HBh+OIk
z0PqSRDe^_xJ@s%ILuk?kfqu$V5sraH!m9l23+bmH?tanwg&vpB<&*V;-o){d(WqJ`
zCz(QjiyLk!SgI@jph>>;L%iX8_3e#9eL&uO6a!(jMZZeSTLj0qGc4KP8?Z3vd(zca
zJ0q@@d+*j&^5KOBrYC+J_Rh`%ZjAG7ehn7(v$QBEC{F=4YkygI7>=-zEcqSp&%;^u
zB>-y*K=x%f13Y9OvNsa@3Bel6`{PI60nP%?+W=8mTe|;-MxG;wqTk>DXGryN2wjrk
zaVRr3>-FO=a=tC#$-gcDpaJ!n{=YuJ?%P*>|EL2pwS)j@|2q9_pZtG4=vUAV`aXR)
zdzglP$$anyz{BK0+F!3&w=vt%Np1V;kp)+iZCoz5u#cY7G79_=2kU$MOY`lacB?6}
zZ?a>&{onIaa8t@>`{Yu+_It9h%tXvDCMei7VEe}46zk_Nzbw2B;8cX`E1dNLxwJ&$
zCi;j+erw2iLIxo~j+~UU-rynZwaG!Yn01OsRmH)z;PLhm$)t&M>iVpLA*N9`8$ESh`V?HL#LCKY>l|#I9${&Vslxeg}wF~
z3(nOg>*{RhZLtUy#8dVo*J5gA09oHue-!bs=$x8$-2`7s4~zLcICXh-CN(Uoy$o)G
zd~8vcB@1c4V7dyu*56I$_JYNUTrHEE6O5ZRTi=nbGBZIO6^i!J{=@xl*gob)y&vWxvei?6qhr3Ml(6Gl=;|t34&X((?CTus?7y9@%a7eMv
z8T*tFj4)guz)Sb`rKA_zvygF*ePZlKF+&R43$r1m;u5XB6h53cghH=38_AXWf3aUje?jL+L4Z^F@-XP~_J6o_idsOb@Hb3>x6U
z0^s}(a~A>Vj)?&#>^W_Tl-J3JX^QEJ`QQS+i5Qddz2oa^lIQBE|%j>v)?(BklO6G9IgaapVIt2--DWt)B(JtF!40t
zqw>$J7Dl}#-?&__Su%V{!1w1JoAAm6V%~ACmHOq>@-OmxnuIQiTk%tHAFLzGn9?agGmG-!<4GWSm8
zu$|c{kMf|qJFDc5FQ8C%Exhv*_JM8)NQE8vbNeMT`=91Ssn!I$)VG$yhhD#I{fsOL
zc4blwt$-5~LaOt>7_EN{Op}4@5j`?So#n8^@+x8wR2ZWDuqGCP^|Y6TbCEbVRbgbn
zCMH_E2guHIi8dHMfr0Ter5=cL2j5cN+I%M
zl4RfrTs!G=tQuTruUEk1=W~at;ka)xfO(BmER6g&t$aSLN8;1I=vWsP
zBdvJ_2)Eun~*h5UF9b2OQ!Xz*RSgSxtx(-)hW
z_O)Mna;nj_Wb6CmcayE!N$NgUl1CXV2n_gMq55QegbOt@EY=}5rBziHbW(5>YSIu3
z9?&ALauD{!-cz?!^yT>@Z%y3f4t<~rKtET{)naC4KO-FeYq39?9D<$e52iP4tIm}r99iN`;~ss0FIFc82Ml3rSa*KO$AKkG
z_UY&5y$(0!3N-8ckcQpaGt9IpIvNctyp&$fOR|SXUY>)N$8pJjpa6vG`~VNnK0D#~
z-n14&Q<|xKZreqOeZb-Un~D6loS&&;!TGqSCO&)mZQ-%HsX&>Gcv6uDAfB`B
z%jF+m%kJnEGT6)swhE+N@K@?VESl~9!Jy!Ccb?E;_Do)m_D`9#i=Gil@SUd;%MH)j
zuhIRPFgH~iEKI$>+=<_EM&uv=isPvIorUo6&8dmvQHk&Xj#1o+j)mvk&aeHR(T)Ap
z@bVkM<@cY`Fe7-EX6KU!8YW^k`{pt@y2&CNJ%yzcVIj@8O`-`P$;YdPd5QP!HKPAJ
zer3@+FYHD9u_)RdsLzAJVZA)AZJ}}?^rJFb%WKl}^6s;nP{@$eS%L`@)V@y$;lTl|
zQpSL6qWK>eUyqisximxZXD%tWs4wpP%Ww+ES!B?##?l|oy5LHs)osp~0wu{?cnvc#R4}5F
zTDO81C1Rq#ePZ3?x9y?3&{Kw=wx`c2em!qJmrgu)`F1s{W!rSt&AZ`FqyVkN)|zB3
zRv*2?I=(YA7!A4*sCiwY?b+dZ)^s-tN$rWFx#0Nustk7eW2`-!qt$aQ)x%2fJ)w9c
z>{aZIS!w9~Pw=4b#!c?}H_7emQt?PQ`0y^Z*(ENXZv+tRnmyX~>FnpB^+d$M_JW~9
zfCi^zE7Z29{CeD{k8VhriOIa={bo7czG!@~LuZ6K-$L=W=7)%M=Ct-%4w8O5BG$ei
zPC8fRY{s3=I-{Ej$zD{%gfb3hB~BbwCL9<+*uA0SjkUoYsnCQG;BZPCbZo(|;m9YS
z=G0`vr50_ybxQo_&-_Iq2O^@#9m{w<^V?$o7k`Z(gnB}RBg7Ob%~du~v$j*5a1Q-o
zKmv`MYDhj@^&PeDP_v?VTGmJYjjsq_grk9a<7F+EnvSIBB_Vg0kuiCC9*ZnZV|qr0
zYg0u@ZS)b)v*!Tj^?8snzu0COdc|t-OOH+_qR~5Vri0G-{F}65TDm=R*;iThYd8X$
z5MEge^g*OQ4a!@#&u9;T-T;l*r$PtLl~@_K`dl({$A=DmmX>s&m#mxY)O20Kh3Q^XY>;jWp9vT#-s%L8~sgR+ioblm2`Nlcr)l=Z)pX+@dZMS`$}h9>LJ=
z)dTOv!}6t*7+zc%TFGj#N&e`gqMWt8Q(JsUc;X)^trPFqu;BCcWIsmp0HagVa|MO2
z1}lD1dDY>Q)%|M&n*+42cdfdhhJk5BNMY2BTvm55%+pS7zo1Gcu012Yxxol3E$3@zM7It{~dM)S>rm;!|QelN5@Vi
zFzwGofZ)uR6o=Ye)pt}EtVIlBjmfK)vN|!fALvJoH6@g%mhN6|y*`M{Rhc#ufkRyy
z_J|R%-8DBQv;;DZdN!r0CdjQAzTHDGc|3^JIL2YkIXM~e*Uf3wo|O=GCf>^tS(~?N
zc`-4oRZW0+v4F>7*J3q{Um4FQW5Zx{yKqEadX;7Ja67s1?5ocZ{?+O@Re@10wW^ZB
z-P+9RB)#qf&qEG2n|=7rQ#TWoV4bjh6?-GIfT&&%PafeUd4Gpqf*v+de+h=Z^)y4awI
zJVMzUQ&THpAM4p~NlInRl@}Q2M1Mu{^dMmbR~5&c9iWl~yere*sw>iargC3psLFJa
z1r`5M`pspUrCFH#<`cl0g%H43aVqa@)jMr2)gAqr57&uD^?=j(ncC$|DU}WME(9^+
zb(1z)3xoFhs|<45LER1YbUv!a>B3j*7x4>6S{jxS?K$7
z6u?BA(A5ErCbBO9^N3oWm^$kJjs+lHn_c_DWaEVl6fuuenfo(Ojf=x(XdKC)r+sN(
z2Ry<}XBy#Vyqa;vX~e2R)9l=BcnkWDws>7*pR!JTsO+sqmz3XtsO4{hxxv>l9MtcMPlT;C2BOTECzmwubdiCmzwEesk
z$1t&9z540kqrP$9GE&>04gs|#e_9$8+^UbobV5s_opDI={g1t}Y;fspnUrahjT=B%
z*j$H;m?j^GXQ_Xmq+5NqXcp`|B{iccLd}za+5Ya}RrUG%x0+44sNe)#x2S{gF~Pf9
z;mM795<-CW7uUd~^K8mv(d*wY$3{RU3HKj%N``-E2wijYgs8McZz#J!+JSRj9*=
z`H!$LBChhu4^~m}V}mqhu$SAX;!|bn5-)9;&~kbfz-sbn%L`7-cPwfi1;R*f_+)FIQ5(&9d4pDSg7VTKwv`LCP~E~Eq=P<7vk
zMU<+8P7aRBRJfjx+TYfKH+m1@mTk2mmGGt-$U1btqdNRybY-cn$t=zP%Bc)xx&Ub!
zZ=}mBuWRaBbSNfg;y+8`IK^&L{?ye~@{BGTQfD8AZab^~OmCKz@K8BQ(@?8}p@dgL
zAes{!GkDXc`^gIp3z!CavM;SPgvb>r;$~(hWWBC;Glj#6Yi1b_Oq;7n^zXh3+ISWL
z`BlD(Ic2c*7G%@`MbZ>NWr&Bs`F(1CBLkqwjikYb-43u-VZKz%D>wPr7S<*QT;K0$
zbr!Ueed>W%nfsIjzm+&AMp=QA^Op+83rL_i+uFBsUevu`HRlfjz2|l-#f+uOugGG@
z=4%#-fA3LIn=4COfmKX_XelOzZ*>|ONsSF`4XlhlnriH?Hy4Vi&lk>^b{+NonVxfr
zUg%E!Vx$m-T=k-m53c^v*5AD0(bkyz-pHT5^_TnrK-&gVi^Xhuptr6ZaLTwH>E&NE
z4w{l-!r}MxO6Abe7s-1kY(i?1g?+s58gCkx(MRKI194UM>Ww_kB~_)0;4{
zm+bWjnq`oY)wzT@j7mn2V|^4`kn};XwGM_pCId}6*A_2q9DXJ8F;OEswvyJoh3EtoKz9y568I_nE
zbq>d(S7N6DlSs3zDRk>v41RsPD5Q667X#CIW`BWXk_v9IUxWBG&aKkA*xI$_{Ohd;xZ^k4S!!A>WJRTJ?8$q`P%>o4H
z!_e#Rv8o{3m*%ith|8UW1s^DCr^JJ?h3}oEe+@kw7pCaja2jk~7k
zsU!45^9~$eH~XG~gd&C^aG?1S&j17Kc8J6xPQi7VR7Cjannbwm$zo&CpnO_cZ5qqX
zftyyDqL$0`>>V%oH}BlRN<4YfnKAN&sW_U^pj<vRxkUQ#juJ$V=Vr
zNogPU3s6CvEt?oNMZJn@)efpx62DI6-WLTArm@+-tD>jhbLAzWAN(z
zxJssEMqc|vP?MxCRfmt@7FY+i?1`(mFymC^>O%T38U2Ie0f+h$H%%axYGyzE30`>m
z&xIyIyQzljGTGMOs@X>#v$j+)s%G;hj%}IX17l7x7tM|&x~6e>S%CP(#I>j{(e1H*
zY;l26_3z2
z5q9Z-X7Cf7O3o@us5+gUqTnU=x9QBm(LhuEMOr~YB8mXFp2`+7FQ$~l6dwg-A>Q5mnxlKdYS8l2GKt?lS8wb+X6a$M(+;LI`;2b7u#IML2B-4d
z^d*Hv!x0GC+~}PLHTs|cMgB{gMF%-`Y2>Ho0^!rsYNPGbhl_v^*nL2z?-Z$ut+zE9
z52c%0G98AQ+*V2$h26_9zz^#v4rb1EH4sWlGr7i>=@UC&xQllBBrgyue^?=RBWriz
z#jPuZ7a1rJtduW^msbe4VrGpL5KUgg%_T-1g@e2rPB~dCnRJ5Z5}W^pFb5fD3?EOC
zI={<#L8~w6UWLK&51a(6x|4@?yXJ{5i?L1cMhadnB(|8iTw;^E@4BqWS}@8a+^S`z
z(&e0p!LI9ctvi;lQ1jsTtYC@2AJ}Ahi$V(D4x8^*W5awR`QL<{^Z*2&W|e`svHmBk
zw!Rhq6!K3wHcQLjC*kf5};8?!SQjpB&Luhz`{g~
zsdZ^Z(LaZ$T~>IPnUp8fiLckr$`ai!<-8rrcyon)m&ZG4#}-^4db3Ma^fL9XAba(K
zO2_>xeVp<=48Nf<_5O(92Rzd7M~@4ajPO3R4_
zbYYhW)X=<*;s|{oU~sFbC#+Mj`*axkol2LyGpfHj|E&()8}5h-Q?91Xzx1+$t*Y|K
zgFnvp3hEP`cIk<~ZaBCFckgLva9b)-H*&P_y~$obfS?S?a5cb3o1dB&tb
zb(f0kaZ-i`t`|le6wi#w)p5$-V
zZap^vYaMm6ZBcsNx(gW#P(#48OHQ%4d3Z8-6Q=lLYyII-GgjDG#}|VRvI|_D@QhdH
zu|-3WjC9fpu21%DlSk6pE)H80)wSU}@SXZHm(Vq_qGy)YQjI6n)Yww83|S892xraP
z9xJ_M&s6VR9X>v>g1od3@~D$jyS-}aO28+`<2uRN)yy@
zYx637=`>7l5jw1AQ#xppTCRqRd)^ilUTYVV0ceR9-J!g4+xzRbgVRxkrNyJ9{O-zM
zn^P*&#NxRl6@pJ
z!kE6zgmTlt_j&ZEl#4K9P7xNTBi;?8rxnHole5#62ZmYsX|UIo7cEVV>Z$PDIB=QS
zKlx{14WF3cjjs+JOc9G4N22u&#amcL!D^(u%H-+F$pCp!1ZO$(;-{7}4<@k$-^KMV
z?&%Wc(r==uQ(|ATw%whm)6lX%+DwjJZeUFBKcH34jKweijsefq>FZk=w0#8p}9lQ>+&B-PI}!|&9S9}nVPPE$;!n2BmH
zZ%${jv(=2wxE3GMo6WP#ug7=|b72v7>qp72M@>;td*ik*(x6^ulBnS*BdKy$Kb06D
z(Ta=;IA=b^8dEI<)Dc5YL-PJ2D9SG0wX)vPppJVQtVd(>GQl)tH|iVEMw3`QgtSa+
zf*YMrUz`e>7>Z`Dd1#m7^IhhSbg`a0kw~^XYP5NGWNtJ>oq}8%XfekEIQ8I>cg)
zxEM}G{3__5o9P8LMhQM~&x{`VxvUF(YY_u>R>PlRD4K$Q5`iL7-QBJ+R3ZRiO<=-l
z`b1|UEc8j7Z(LaLZ<#G=mShToQe<>|EGg?L764!`h%MWirlg?v2z@lX_+NrT+kXLs
z8o>&`@`HJvj^VSjPYs;yBT+IxIn+mRZ%a?EJ^DCXQzAwPH9F7;u<&k9V*Vqj^aV-K%|Cp!@KAwN0n|H0h;!Nz_sWudw_Pu*}qpWY+KNdt0x^d>ysBT+!15L37gsehyQ
zY?ALZa%h+9e-Cg*l6$21|3KKxpOA+uzI7(SAvgVpR6SrnOd#W_L&3v3m17Z;
zj`AP+NBM|+xaz;jk%i2UX=KF$L);!xZ`|+yftJpLe^7@0I~HK~2pG#~dHlVHG_q}V
z&3RVr{I-~UixzveN*!La8QqU6p1mm&c!~MQ$*DSWZRzoz3M>5tkr%J@(4{vN%Y(9V
zfO$k##IpM{SK~1&8&3m#(rl2S<)z%h!asvyzVPs`Xt}l+yfiboYzb?k?L7_$ITAuY
z$_-DpmpvSfyiV5EEOJUDO$?%key%t^BeI*TA$*elup;6}!$`ZHE7VS0=RW_*6TCDL
zoJQJWz$w-H$jVq65`yJp=+TDvfj16AKR0L#r#?>;X1eq3yh-RLvO4j=q$bRWnybkB
z&CkcoW&9Rnk;qLzjbmVVo>h`Qdl9Ry0COYkQ&&qKWp(?L_DSpT>{(mx<>PG9
zmTZjocnw*l4=}i0)^>l1Zis7;hs%xru5ZNtOV!V1iy~q0(+}zfrUVc#{^2HkM;a>4
zkQ=YV<>5=R8mc+)*XvBub?PshsB+Scv3Hi1UrNLo#(rkDH1#jvEG8zqRGa+SN0Z
zC{c(d!?xjQ9_APtY%V%a7!yj-8(}h8PWIU{Ed#&GGomtyGUd(Gs%~LvLf>Y#(raSh
zw@bQG8xa(M<=7z9gd*5S81hvQrBzk9T3YB%7wN1T?0ft6r22klvN37OePo2pE``_$
zgXFwMRi&T!^Ky07ct)DP&5!zUHSc=wkzQ>;Cou1>9%x$9Uuu^H-2YL4T?Xlfz84h=
zmN|E3rs_)Mw6<((MN4_@XFE6$Mjfa6n1Nu9l2j7bTTQhLplt(;rt+~ty=;Z-Ppd+$
zW%J&%8{UNC!hYzKirBYEn9|h0Z?ZZ!_0VX)&ke}NIh1TmC_`h^Jo+v+w#-@NjShnp7_5u#=w`N
zk!eBo_AUK?bRpn$s>Tg9aoX$Dsb_0GXnH{vQ}&K&)U)MqCu3CEd~qeF|Hqb>tK12w
zx2kHc`^1_8vzGoC57EE=BUSUiNZ5mpi2XEP#-ar10f!@?*E^WQvze{NCH1njJ2
zfF~^`F6&Wqm|Ib=zN@gmy9p9CnO$nq(@IxT>iiMK+cnH6{%G=$%`e1!7BIBGacC?G
zJ7OMcU+)n0c{-!I^WgA4tm$gzn+d$zX+A2(*Tr(6N=ZH=eyN_>Meo^v0DORZ;WbuU
zNsBQ0O$k$D{?Rn3Frd48`F}$>uOM8FyXELEH63
zVTpAx9=FS5k^&FJ6|0SY(ZG8W`hBCfsCmW5cULHU2$K{2sg<2JpJM=@MNGI?ZI4%(
z@4e0Flnuo0S!>&$KQ3x~NUscQdKz~>9N_E-Buayl6d*5mXlT+mbz^;fp@yfW4O}ej
z(o;g_SQq{Q!I30atg=qK`VPZ6E{cZO-Y`9ZnxC-fAog4x0*yvloJyL-3*`4w#3lwC
zkeqvDwLrjkk??O06-f2u-HxY5K6$ug^eW-YMHq$$Yt7Z{q!aP)>7o$poRT5I1bL~0
zXx}FQp4RKu4Ik8_N#)luwe+Lr3J@
za+8|t=gTygcXs6}2?fUsuC6=h^WlX1uYI0*2}Hen5AUd+o|>9c!F}o%sahO8m^Y=i
z+EVN4`m(z_NM{4Ttn77YkQ#7`!N6BiV=EBM#66#qV5}l=mWo08ODq{A3O$vrap|~x
z^gSBBQxo}F0B#|-{G|QT|FILKa_DN{pEC#jA;^cD#ve8>&gs|zvH&xxAqa^JDDj+kQBa(
z>zK+(2+~AvMa_ZkuPE}bYVv<}5$~W>py*s^-=OUEhk3EaRUHt%lc$bf)loFn;JOz$
zIi9LUS5VWtr=w(){%ixRBID!ll8jdBcir!7a)gexZ~N9?3bY`SIVJ)drs*~#{JCi)
zA;MIDl;M>dsTHa>^%tjgdXA;Cys2{=d39+-Wy(ZXCq_13_oXnE3@6Hgz3%&|8E#JG
z^SukHebUm5-8w_~7MgMa3;dgU=`#%}zT`JFk$0_vtouJOX8X10lzqn{;a^_O{(P=J
zz`h^2*VG@I&!YlAlg@$>Z&=fnt7u&xNWU=ZV4|}=zDQ$r@!Es*UmnZ?<6$1A^pFQl
z14~cXd!}Vm5!w;K^!TqfVr))6UK8Ie!r)*Ipc~=##YASyRJHR_@-G5NYI1#m-49}J
zUwXz>>!t4wqe(S9R(pCOZn<$Z*u!bs{5~Yk)bH^T(@U&R0Ddob`_c62#CLX(X$3y1
zMPM-PJ6)#Ynbtas;=#aKudB)fBk5+haW5V$lBHg*I_V}Dw
zd|t|Tvjbrv04yD(Gl3s9n*yy4cX47iPQKB9WfD>4Z?FNaY7OAoFdX{Ay=c=FuGITW
zlQx)LJ@PVncjg!9Qr$Z*DZIQ_1QDFbPsoB`uvy-i?Q>k~datHA(k-}7+b>iX8q3co
z9o4;4_re>9sfMT|+s+I9TQKl^)TgLmb+Kgb)M?hG_~#KCkqMbRO_QpJlX6i${qYUy
zUR|RQn>Bs0_ySgqDMtC{h@nzz2I8)rE=X7V4-;zxMZ#9<(wH7%foY?r)&?p*;S!U1
zIWo4g)(6FZywwR1Go6SHH41GGEk)o${bBhwzdTSLlYo%A?!fK=)TWDc=4U52^
z4HI?gN;fs$Hr7aTJd5(KT$-3Z5m=?s>EJYUkjbN|h-&x
zC31OmWll`ql?u>vR=E-hPWOLxX6LT_uFi`ETA7n@-YFK=@O7MAiG`+M5p%ZIr6sDB
zNyY`|Gp75-4hM!7L2NI&Fj#%H5H0SKWROQgTwnw~q#@UHb;^#6URNf(uX
zB6#aQa_dW<+&$)&K%aC`G%J*RI)wPxqS@#PYYCr@iuOg2b=n&4E(%-X8KExiVdgg`
zzVb5*A3pv9X!snI9XWh#h!~mJ-9|~%^#+rdURoNM7zNbaI&YpKcs1$EN*Ja3@n?uG
ztbay4@0`jw_<0urXT(g$68gkZIw?zZuVs#?s}
zX!VzNw+FjhbRYA+Tkh=YO;h=#-d8&x)LenO^YU{O;#DlkobxTm*$wg>^xk1|uo&N*
zn3drpTuSdKb{1L{;kc^%3o^W#B^5P<#x@c%?jv$NCZX@D%lfQn2boA=(zbidW9R;@
zPrmJJ8#A^#16w7O)r8~nm1qg&Q0O&sv#L(Dr6BdQ&&&I5YX{byXks{UfUGt4gx1n@
zlKh^c^eR&2#%XdTxmV=IR=%^`z{0XEy#a6;xRg$M^pCRTRBwctrk2l^Ccl?H2=nb#
z<Xm2Mh0F=tOKUWGu~;Y1
zno~D=I8QMZTHIMHNp-ynb=|!T52tV(!y!ulFm#8dlPH$6M_X>694bAAm7wL8M;R)P
znK!jl1A$<}(t7U~t{@x+`?E{>3Rz+vFl}FxF$qMy&kHvAz`*B0srtIHUSnTwxPX(2Lxepdcrap8Mu$(xnKkdn7?p_b?xn#9B^xH>PV;5rBm8<%nXr10>x
zy!zB5c^C>nR%oCc4$pkm&83KKXnE_8QcfgNhUV{E#HnxVA
z9Tys>!J|i=?1_~UNmZ4s8;&iDfv@GRK=5Qr??6sZIaCOq2OC!p?MVqh^P@;i71Cz0$Q

OF36qc;1HC>MxGgj51TV%01Xmj z4%tV8)n)nvaZ97eNn24_=C*$ZOF877Z%5)hFjiRWo!i%zv{X>5&2FVkcTOzLWg`L+ zKbx9GA(Sp?iL69`OccvjjZDZ^y%{D|6Z@Ri&j5x}zQ5K7oKl!AjW$aa?`DrA84?ONT)XdWJb9;>T+RfrP|=VctVI&4X6ZD?=iGB5uvmr`mh3X05B1F- z+=LoLSV^#Y3)hWky04Rqh3*h%UacI*wcH5Py*r0?JqhSkYAa30!vaWq26utF_YVsU zVJ|E+v>rT636UAN{_Gh@UEhxmNJUd6*5LdRwa+8Hs^kdFl@l)IC8kKOZQ){(<(zc6 zpqMGb&qgQzX*!kp#;j*6e);Ej%~CPX`{7HB-yW(pNHP3RjR42u)U#3(I+s26tf`Ti zyr`Lm5a@!5j*tmt<=B4}EG|%73sdYO+uh$Xr5Es}s#bP#>P7RA^OWi-?OMz%`fWre zhqQlS{&Ey;tyB-l%CHUBxc0rC!Sqp`PwbN%-E@wcuXI0K9-i}OSuvGeko%k%x_CT< zfqD<@wwIc|MCU4Ml|SaDgAT6g$4Uv37SzXbyYKF%8yt%0DRQ=_#10I2Cq|T&6H}t8 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 K#41F-`TsBCE%-SA literal 20601 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 b1TZtK(X!$Asrz38D8k_B>gTe~DWM4fZzsby diff --git a/frontend/e2e/screenshots/02-body-background.png b/frontend/e2e/screenshots/02-body-background.png index 8bead049fbf25ccd3fa650698a28eb0f9778fc3b..bf5f5929c5a0c160120b27496bfbeca52609e0bd 100644 GIT binary patch literal 68698 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

OF36qc;1HC>MxGgj51TV%01Xmj z4%tV8)n)nvaZ97eNn24_=C*$ZOF877Z%5)hFjiRWo!i%zv{X>5&2FVkcTOzLWg`L+ zKbx9GA(Sp?iL69`OccvjjZDZ^y%{D|6Z@Ri&j5x}zQ5K7oKl!AjW$aa?`DrA84?ONT)XdWJb9;>T+RfrP|=VctVI&4X6ZD?=iGB5uvmr`mh3X05B1F- z+=LoLSV^#Y3)hWky04Rqh3*h%UacI*wcH5Py*r0?JqhSkYAa30!vaWq26utF_YVsU zVJ|E+v>rT636UAN{_Gh@UEhxmNJUd6*5LdRwa+8Hs^kdFl@l)IC8kKOZQ){(<(zc6 zpqMGb&qgQzX*!kp#;j*6e);Ej%~CPX`{7HB-yW(pNHP3RjR42u)U#3(I+s26tf`Ti zyr`Lm5a@!5j*tmt<=B4}EG|%73sdYO+uh$Xr5Es}s#bP#>P7RA^OWi-?OMz%`fWre zhqQlS{&Ey;tyB-l%CHUBxc0rC!Sqp`PwbN%-E@wcuXI0K9-i}OSuvGeko%k%x_CT< zfqD<@wwIc|MCU4Ml|SaDgAT6g$4Uv37SzXbyYKF%8yt%0DRQ=_#10I2Cq|T&6H}t8 zhx&|gynP!Gegg49ac)>|Rn*jG@T?kYtF-6%TA7E(c1`OQ%N0HpsaAL{YEFh<_L`{Q zRB|YUi$HA32|1MG->Eb-+;efhIt#U`n=FZDYHMZyAreIlb(qqTHat~&0a1i#Y@@oA)T9@Krq2fXWdGx6s1UHB(5NiV7SJ# zU^4*#3oypQKhDzTR{Yvj7o4>cJjjG;`_{|iZRgYNA;QJpKLv|g7pp{*DWb@Y<;g^I z$(!h#Fuj!^Ui5eE^byBmE!b~Rj->nvm(x|^&v2_`h8*(Se~KzCRr^eQ#cxgQe4&6{ z!<=V9%l3j!1J;Wk;Yw<5%01>__#-1DLG*wtj}b=KIx%OmA3oY>&yco61?5eW3U`ub z$Kj>0@d=ojn*hs`OEgBMti`#szZ3uA$u86KT&DF{)sS^s3B4>9ejW&4lAE!-6=?fucByCk zE)#^>a;z^!AvP1h*X;QNmnomDSzQ9^ad$ZrVL9VM%VD^9Sqs@~|8s!R1PcVJ?jR_$ zuWme+JHf3%M;E$G_v%Gu4=S!V(;+_-IXZjpcut3gkzRR&dhwuRa>0{Hn95^H=!9$+tg}dVl@a(yd>Yc zf$Do%RSQsLWHjiH@|vErAqU<*;)`5c@DseZCUo6)$2GJE#AJhnLhy~m$BBT=C za*nU>p=t6GdAT*p!-QO8!&awG9Aa@A7StQkCT1;Zg|!YDhuemwuc`8> z%=&@Qf~+s4+g$Ukm~4|5`^n`Z(;#_CSgW}Ga}gWU9Z38^+ojp!bwVv(hFUxhQF z@uYfk3dO96c|0oUkIQ6SEAlhzYza-1E(o+eU1U`(O}9G}fZp)u3SwUJnchf!tmvH0 z_A^04gydfp|0Tz%%_rI%z3oOnLZXU~2aBVmzNyoH#+M>Q&WSj6tT_VHN=pf5=*{XI z@(-*U`86C`ibiF@(;2PLRHDJX#bnp}tp4BTMUeMD`Q;7SvH(^|>3vMWNN$F7#)9`3 z_H`y_s>sNZoe@e1KY){+J%VT}4jDp1iW3=G&S-|bM=n6-=-k=&bNYgRI%VzT?p`dh zV#g@{9$g#M>NyTB0tzZ9H<#GSX?Ou@juAbk${sP(&lZtYh&f&<1sDQneTVs{!{_ZlF34z42YD0Ka@}Hjjvk@FX z`m1=tQH#^?*!x09c*6>0$1}Hb=zg*OzClw8(@E+v*sw<4!S%-PWuOIT`|4t9g*FVP zy_m?%y+X{W7S}VhUZ=L%9R7!^_&pt+^uzPm>8EXYy|sjVXD(`k151-p_ADzS{kc)I z2fB<@>zLw*jz2U2z-{k>(_3?ZJ5Z(<15Q@5KJ+v)C!^d--LdMYGtw5HsVGI^?WTU; zVPIq5IE0!;Xu2TenRl^ze%7rt>UuJqnPd4!$~bH-F%^$4Ln^-fc3W%p$gNgcS~;tb zq0!qtf+?eab5u}M!`HfnV$geiMtVBP%iAWU&TL**-Kpj(9@=Bp{aY30;chn6T~#zN z#oiz=BLlx=5O*3ZvcwM?=;$J?w!LoLmbu+_oSsf(Snbko(ab9>rEUBJ@|Dgo%Rlf6 z<#a1JZCVYNn6}9&Y)EbZMb{lE6$y84D9p^xW7|KBqSJvhy-qZVA_VB1gHl53Trzx- z>i}fZeFdQHe&#B}d(hTE#psR2dznvjRA|Uter4%2`wFD1dTUlK+==`9Si08xxEHUx z%o|o3SNSn}2nz%fv!6q)^p%dc>U*IVQ{%OjAJE-|(ZFE0tw>8KuTKf8JUz;bewuf5 zsnaSR_$SP$u9+OFVEmTJ{NSW@q?Ow}v3p$>>s*yG(C1A9EzjW6Nio0H_hY#_<@^=G zN)|sgl17U?@x>UGWY|fQFCA60qI(T;75pwU2Z0zbF~s_U6-2N1nOuba#i^m8re8PQhyeW_@o+`n2J7 z;z+vD$CGHU-IM%YiMBhbAEW;%zQMj#+xlG4h1kJe#of1k3nkLaDYX}DoC$dA08OswC>z&6gQC@wc>8YIsJUz=kz=Mnf`K1l-DK;Ae`d2?4XW*}sdVE=Z?<^!65#d!^4zgOAXfLCHU%&^* zTXc#Q4tk>YCr_vY(w&9}8*VQm%L|A9p=@e_FPMdT+Z?bH+o)0dF*I1SY2_lD-$O25 z{>hQ9l%cmJ#4Ax8P!8<&`c|rLz>dEj9goiZ0v^eBA&d1 z>q%rze2(+;K)8P^-EWcBpf57XD^Yi~V*C`ROs`tWrL5j^^NW_2lTKrsWG0Ql{@C)1 z`-i``sDEKN&q>ko9YFK-G#g)E#QB4FiTUhk;(XaAN8dkU2SN!UjAH;&|2T2Ka*C^) z?}7vGYBUdz1bdG4bN%={r1BD96p`@idyfUKjy&B&Mq1R5{7MU|CL?Nd(q(qx=q%U_$OSzXZn6G{dWEew##X}x*LDz zP{&wdC15(mo zy)x-_8JzMo5^ujn&px!whl=0bPUXu|?XE`SN-6?BUT|? zl)L#gok)|3?AUj^Rbv{_By{0b&4&A#H>y$=n$F(`yw21x-9-~;y_Xl8gyn6>u-xL4VZ0fJ`eE@4f~GMD15-&~bn#1avSP z{@4!?dUw?Z;4_lIx$&icI+o@>N2FBl{U3}*XB-8kVpSjS=@@J+4w>7Fgj7}d?XfD@ zqL9I(4C?y-!d+tF<*jQ-iybZ84_)JaW`|)mn%Q=1+G7CVoa-RRqi=nia z$k}Naii|?MMTM_k`!N=o$xAnNAVHW+Cl(}NZCg}KiA(^fs;r#0giKGX{IeMskH)W= zfPetV&W@ZCC|6KD&tJGuu3G&1MfeZ6i`*kiJQzqJy`E0>XQ21g)X=D&r@}(ZPY95c zDOII=12L?WpcOrO6lNZB~*$F4FT9s%n#%%{vk_m*kbC;5_c$9Pd zhs2eUAn+e0fV<}c3xL@38J-FQ3v;F|FyERws+6h@%q$8z5D~VB8!vtm?21B6dm+(i z`HJ1-7?xu5hEVn$+oNtrHfOY>w|=sv*vqB56kot zw=~QNRpfqPk0Q_@{=)zy`D@cwVnHisYsf5-1~;~TM=VP=-L-t(+qu;YFF2DZ-%%O{VBps&lfillB36l`g4wr3ILQ!Id%^quJLY#)Ss|P> zEAzi%#pi6%ytQH~MQ0sNq>LPadn^NO4b=aERQ=4dbQ*++@4V+OXE7Xw$Gqz#e@jpM zgM+ZgFZw8qi1_Lvua`<2V|sE)W!E*o2Ffa9k+H0_t+Q4VOW2AWK)Ve#7tM5>k>mExvKG z7oLE=5TmJVq!~%X5XT@g7pSdyQEI{Mi5ccbwl-NG8_XkUa{j|u#8z#Wxi*I*&vry9E}79ZhYfUIJ955LkYqB35jTJl3M_nM(oRcT zt10JdfED~v;z6}wH+f!yz*v^<>{LIaJQ1oQr8cQ(;dv>5f+g?JCA)9q(D zD=}s6)8TM-SY*5FZ1A24F#5+o)bg45hL5a8r|sez2dJ5Ty9`{m-XT?xhKYfKAx#gs z*rJPN?@8J0UW01u{?W-7?zvC-x*=A;ZIjuAh5ryr_ELBi&=L3;cC2Ueg)fJV3kh*x zGdvL9ed325ark{-^zCoH!R4s{4DINc#TZBMW@~_|WlBXZmip@phpgkl$GXSYp%RjX zDW7sZe;+M84Bjlo*VlUXF`a3cibOKPMPQ4=aw*~}OTt$%C+lH_#A@kgHNB0<-kjI* zpsvr6H~Er@)gM1o`uo6v|ExB1O&Uuc;ay6CPCJ<-%Simd!I!`J0}hH$OZtMnU^m&t z8ZxGn9~Qd}%D#Gxu^02!N%}yb9iIa2Wo$9MXRqxO1ou=|fV(G_lh?4PiieF$Cw}@Iy+RgMVgG zjsqZVe3^VsdevS{jm-?1zRoG2b+QEnC=87BICxXB$OU!LhdeFCOvR_nM@OV-#iVQi zjxVp@wo$0OrHJ38#lL&ibDmg7I#qD8|@0(Z%Ns;c8pU2?LUblh=^wPrz z63l6MSQ>*u?h`DeBb@Hf4Pi8pgIkHR3q%dpZYmz_wg@zil>p~IRGP3l+9rn_G#;9c zCc6=6i}>Lmt+#CEEA_v_@bh;@{62iVRhfe8$c}?fua*@b#!2rcTR_h%Z-pU zaQR(iuH?ow#4vF2D13q(xbd#C*UbJIN!OtlCqZe+fe|jUnio<@P(`%e@Rw>Qh9f>1 z*+UgoLc>a%9k=$k91f2idr?yT>0GxmbJ4>2?DzAmZOAYd3N;f`XqT7MCxRAoj5kiB z-g1uft2_ApAJ`udjowPei5{`_epFqfb(FYhvu>t!i!H1G0lUqYDmKgs{g#Li+F*;` z7ySwhI`N6m|N2V;zz*Ylg(Yeh_)WGsHWj|it#s@t51#&)qhLe5nw0NUEG8;kl&6ut z8lt2OC`aZGqYbxh!XL2SHy;U5q?-R!F-L*I7Sjgm^W_XtfrQlo3y}Masr3(G%9#>> zj!RR_QT(^Wr%X-;C4DZposZlx5C)gKSZEV<+?qymCh#(?CC;J*5B7w&M@}2<>t{Ee zU;9V949%l5nz2qAYix=UKdFZ+A6g;}gxm+;y+PDq4ll_0@LOn)TZV6aHLdzEo$d4m zx@kP`hcuKpp>%V;_YJF172CDAYJ{Krqyp=RM^Qk}FNX&+U2)}s^CDUd`o*rEm&4on zfnY$+O-*vCzWy)VCe5CkkX{w+yVE={j13G>kQyBs2)no(dvcE%VzP<6+=8|996-y1 z`*QhRiTkN3z9<1PFODN-WG|n+_rHAPBJnlFK>-MEBXwTcj!~xk)eA~z#VWsectA2n z*uW*eW|^sB(hxjdJ^n+si&GS0{10`D0f(`wlEN548I2; z<~t?2=3=K9tlvsfiY(PMCyZ@)PH3G^;aIy&D-Me=H7X=0Q#$x~mpy@Vz z?VzKi#Dm^S%gxKn&(D{63B2AOQZIp3YX&)C{yR|fgBQe2Fy(u?8#~fdQ0>i@l8P{D z$oO{_-~}KK&&R*#l07kEpN=O3h5tCQ5a#U=uZ7w@%U>lY1^K9lI46hn$M=ZaVGaw} za+GKaWEgey_{FaxH@P9=ebYR>6nUV-qmGKOr>6O(V|WQr!0ubIgPQIRvkqZ@6!X(DRcFpA}yVG^fE)uzK_qVx0_mXi;deZ^7m8KjvGHIltAuaAYqnXI;dok61^?oA@-3SEo^@i%vTE)X2#k z;b9S)IyZB@E#lnwF5?lQldkN}E<6)N%#f9n&KONl@*nD;#q;$Tu+FQugRj8M{dig@ z&A1=!8o^RYGuOGe{O&QgD+Z4oW%kgT_R{Lnxb9nDSD2o-|8FGFL)!?&;v{Stc5`3C z%{IP42t{M=`atS_6P;e8r%(YesHe3OqH;h@q8f7P+pCZvTxBwqlDo^HuHe9|UBV)* z#H3$K!>yuVXV=@w72qCC@u5O52C3+HeKDVm!4Y*KNTiQiZj7SGD%31as$fa-YGZJx zULCbxC4``>hY}T|ZZYesZ|$~7WsiXSs)Kj=J9m3&5-sH)8T7jSPb22Azw?XAu$Qh< zkQ8NkFBd8pv0N3m;8~E&ce(HXs(78P!O-?zbj0{#Vca2~gT;ITOb6rVs(Gv^jS*H6 zv(#ip7+ZgC!MNXvn#|8TajCx0Kf_;cBg3e2E!9$2G<{ z`I7AR()?^ySJ3V3Ayc^o@@GJuaxP({F@bCK{z!rZnIzw3_dGQ1)#ZoexI2$Qr5`dv zMRSRyZeJhPSwk?j3qO=C+?@~7&wtzK6*lj(b=W|>yHj@?Sbu;?q)y))QQsyglMe!?s`ECU^&)zVJW?B0&S3cAA_+qaZLB1s_F4O9KVd=oMOXAPSelFD%Gns>tmst@p=Av`V?nmJP zUb;c|4i}{DmMV=n>#rgmyWUh2_;q*si1QD;d|o4`$Y1HyhnA|h{wXdG|_yVsL%MW zE_}CnAI0NRrzWssvWjrj>Zhf*JoEP?_kqhg=)t1K)=VjPS} z?=_B`ArE_1cfzOCHbw~@);3!?RICZktHUpfZ)T?XF(5cFReRIrTfqS!K+J6FC}pel zJM|SIW<@7XBaOg53j!M z{q88y%k|>&q`7leHy+28WRMX4@vXhc+4&~1I4BbpgT`&PLtt|CW`8jH_Pj`R?o>}% zpmO`o;6vt3a7}V*9!67k8Z(j_ip@l$06TD&o9~Ir6e-TGj*o4`}oy z)g*s%f6}9!uXYhg;H4N#+Ym5I<_}KFpR4Xr|yy zynyd1{qO+obt`%pH3+|~zZs#OO+L##yE7(H5J+M-m@uT2bmhWiZFclG9b>tr&ntw7 z)C&#VOkK=$tPYo8^v=Y8AMdct!-yE_D079uxP1vCjl#Ihzm3Rkj94JbbdFb>L$8!( zNsan8$sB{h>?mb37a2L<=^IeHVKSC{6(o;a#Ys4E=)-bzNvEf_%P{OG*0jrg%_*g{ z$fe$SZ)EFk495f zzWik-R_KSLR3-Kq{R3kbB#i=?AVtWgYG+FPi-{yR#tUSSFJqDt09!c=>&vvXBE|I7 z5p(^UxQ6A$zsm8G7XmQF0g;2fcn!Iu4;aoX+8VDE0<0_mpM+nT=nnvQEuC<=em59&8xjY6{KJ zdmJw@P+FWRKEawi3-2kdI>{?!`SiWzQ|25u>CQ=z7dTR&>aGAJ9UPeQu)e}2!yQm! z>9?{{sV;EgfBpA0MCA+LZcWb$XO}Ap2^$fyYIXn)rFZ&!E0*RxOZC zudxpB9SRN(HexI&=`P@pJKLM@8tC~c#CSf#eEFTZ#2QmO2VEC|*tkN#f_=rBmu>nw zZc`v;iu-KwjLhRd+QMdoxb1hoyFMJWIp zFQvx0+3Ocv4?=fd1X!CWs0{+@&h_~hz~Xi6e*hK}I_jEABVacw_1c=l9&Z36 zlMD^@o{ue6E3U6HjL)m4#PyI1HAx}6puIivy|{pLou z`)fpvsd=E9~t>G%p!GVLLshQrQ1@aD*jt7$AHoeGOv{y zU$j}Y@nQw`0x_&oAt&+IoR=jDMEr;}Qzxd!7_b>GO<`eh`Q^n&x&)qxpD&uFpUd;J z4y|QhD8(b(5bHRvf=N6PrO@;5B2LP9%xVGK#~uDWia-6Iv(hMoCwsjVHQ%4E4jSO= zVNvBCIgxW8^;R{#VF+fmsg&qgYowi@4F744=I@<56~vSW!(yuKYZ??ab=~jgEHGU; zG`QLe8E2vpdPJsiK#vT<2vVppW?BY@t58_bD|hGm8OZVREyY-U?dA(`N5$s4R z%$tU6Vs6(;=|}Fmi}slF%cORef*NuoXEHO7+eke>*e0rrl=V%Fa=Jg`s!BK1A&X}h ztuzs~OsdPN(?#!(qnUUS8eJnZKIq}Sb%ksnbT#!AihZmyIiYN&#@_UES+Dw{ni!2! zWwRY~Gh!`hb#-tB2YE43xa{&%@YND?Mb`?elY{g(c;*tsZFZyHh$aU}yvhFNX_bI7 zsu8d36a=A3qVvPh)7Tt>{-_MTB$575aCyacN;WK8Y0jhS(&R0^%j7h07ZZ$Hf-i7gh>w4Y)TVw-JPE!;B(7LlET zwet^k_1lA)#+)3ZG4i7Fas~h#0>noDBh2gmDbCi~xwGf`xf!}q>g({XV)Tu+8@EMe z;u$8>J~fZQ>Pg@4w*|f4$ekGWZm8gqRI*O3*jU=J+QzZkt^1t`u2kJg913BgT{}%6 zskH|LopJ~+Y<%xQ?ma=!7IcGEn7`+blDkLcRy zlmhkL^(iw066XTDH_c8xJMgZZ1*|C!j)uSdtox(nV71SnOK*fWs|gKz1^ocx*VADG zw~yvwKB8!FFdJ3_L|o4Yr`$g7-*sdt_Lomt_-{p>6~?X7EgN=?W#E*dnkQ)?5kT<< zGIl_aF^ZNB`NlD3e&A~gXdpdaqkl9v{SK#-N7=SMM4*x zKS}13;KB#*((99Ru;h#fRB-Rldiy=rT__vD0>-t#;la!g2#yVAdJqw17(Wy=j+9`W^o)Dp* z30ABW>~gKgiMPkZj#s|fUQT>vNXiUVns=SlF?;-quVdlFw_y@*EkBUNM9B8u24nVC zWm1ZjN(%|&j8+KZep?wcLY==US@*hXK&Ep;9>1nQnh@lZ0ol8i~wO1F(!s0{~D$`{sh6V zEjlj+3D(_i`28Cy=q?ymm5eFRpc zONYTS=3YRV7uk_vyNSg&fAhmRe+5eJTkfd0NQq3t8=m;G!_y{$PGd6}DLxqy1d*<= zZ_*U0)oYohv^k7+vNtmM{`&%PZRVE#gb8oo3>sxCC~UcL6}Cr*`_@7{P{iu9%Qh^M zc+&?_H{;Y!{cKdFm;zWN#qt$pV2>e$kL|`SF zEWFvPW{(#AXRKu@&Y1%3Tf9%3KZa{E{>D((4-HKP3lPQ5mI4X%mhXpBr+0K4#YPQ& zA>|*E-f)DIjiAWPc`n=y$(T)Sip{|ey&5Jv6|f>?M@BCE*iCQ-%ajrRMwUL1_*@_w zl#Mfe=pvN*TZ6K@m+CTUEP;PrZIGZ-P*__QfmoH0CytBMp_+>WT%~l7W8-O7)JGU+ zz$4BcY$$@=9W+v8Z1A>fGnvNf<3N-_SJW6PL_N1DES@^rutRj1Y>xW^XQs{|2O~vS z7?)d4VBA%@6QlN3_4LQh^;A@*rx%=4XCL1~GBLB?@zRk}Rxac5d{SACDBmej#YRGi zYO&1P>2ZT2H=dq%CArwNXR){d1>5fPCsSB2h29WGc934HlZZSu;^9`HmM6!W^m=W&w`;wZ_cul z{7!T6?Xgr8`a4{;WTuVH9+A06U3sS4^+0#JDN8b~JJdUnlHF)sYfNw2+gs{*t~BLI zi+2@i7pfOJOmBu>CqnZV1Z-u0P5l=1p*^lQ6PfLN^$SBKBN4r)04Nf&rH?~FwG%-R z3>gijrU|d8;hT-;BaIOS37AYJO;DW02NOU3xHEPN*Z1B0z^o)^BRlzc9pcVwXae#p zB+t(Y|6B0f*{AZ0;8C61bhNL!k+ZyoNZS z$?A9gJwYHflDlOWNw=GVo1$qCx>dhfi<&z+=v7nQnz&YY-awDHackSZoIloU$-zAM z&^13d0CKtctEqCbK|W`$hT=3u6&L<%zM|wzM%mO1tK;k{{RZ~-@&zgelB^rL)6BJ% z)a=B7)JUPT5K53Ds_%SI8UJGP7Ta&694e6?Q}x$hr~PT%RR`u-$Qb#Qh?s{j<EsX_UvN#C+sWrM$`DHJh6!R4yab3`->(%SQ zdpj&)q8`=?7QmD}FM|ZP+ZI9P;{1aTd6P)0p$>1g1^}RZ0R-g$g2IQ({`nwc4_cjO zM|^+`?Oj}@NmBo1o}Ix%zfJ$i$mxr2a_5%o+4~fxQm2D<$2_pUC%2*i?#79y#YK6u zBesFEvB32g7l&LWOHXeKNy15)Y#pm~OXm zEaC*h^mdToUecY?puU>Zfk@~q zr=~iOTE|yX&8undjG4u9H*rXwUi)HaUDIqmf-R+M^60RsULjI#aA-V8lZvDKVE-zf zpd|<+Uqc<0os19`x%#%&mUrISh{TaDL8)u5qP&sO@e-rE?r`d>i~eOGL*3z=ROxE^ zS;B6RHaFM~;Bsy15bzG>2C0O%G-J#Cj z+I8IrMyp$UKM847Vyu%v=D9I`!5B?~h8WfFn3&5-e<7RNn(?XChD~ulj`V5_hR>~j zZgrBB6g=m_B+Ldhodj>?NZWp2`fn$bVqALfb5N6`w;#@+Q*N)a4QoWXvV%=GS4R?f zKe`HCokgqt7&MYQx4*H8iEl5Mb?g01GZ-+7j&2{!(Q5y4@&>vWY}=AK@S7**4T=t` z^~)ST<{|`+pUQ=9eV`dAT;zWJH30)jJ7YMZ%cp4d%jT#Xu;_Fw<(OY{38N+tP>rge zil|sIJ55d-#v2uBbhc~X)wPskXMtkwBl8I8fWR(5^_MKFxEsEB??ax>U}0lL=?PYh zigmbHbC3%#CRy`WJYF0uE|v?0Iaz}PmP|a`C&PJ~6|EN6T|XY@Cfw%s z%B8Plxz{*I|CH7?nMY&FkJP` z;~VOk=}e9{EkC|`tL~*}W3_r$=OhLRLUb$fdYU(&Y~c5iJy^7zJGV`B0|4-;gkC)3%TNv*$qrC}wRv-$Ctjv~mZs?eK2Hi|9+`lg z`>K=ZxsJZ(C^tW+CNY!5K^R7sw7X|`HPc?$ml$iBPK|sO+-f6K1`}|8`+)hyEKyIT zj~lSuMz0a;=e6DWs&SO(6`X5!cT~4SP+?-+bC~DRirg$O2%8qx{aQg{0=c&|=4c){ zxo7^{Wv(}u(-mZm`Avt!jYj=~aD}LqNhOu!@%^Yx`)r=@77eTm9UT=TVWFNZrLE=Mj?d0?5XKetBAdE;wCly!smgXM z*Xby+W{h5!F$~n%g~ytUl|pH5vLJ(9ES-s;>OXEcO_XxY4q>U9xOx>#2O7uoB>4?) z-6}UtNp0hS>{Jf?7rF1Bxivhbx%?VIh&=Rg&h@v#O;ncfK4+rJeds7nGsDI|vE=_? za`InP{1c3g#lT^w`&TQ6(2h188`T-ikq1EU0K78K6wZ4A%4S9#IUULCj^6c~v)$8) z#28qhNVz4iB%V$4VyJuA&}PRvF`26dkn-?p4Y%=JK1Cc`hRKFdiW-B|qf)2w8^R|> z{9U1YBs>@;49rN|7_~*2nWV%ox5Ua-gVjJ8jW-t+6=l}sAW%Cc4)9}kWd4(vMtKZK z!bwHNP7ivEsreB1yLw#UhinK4;(!U0dJ~9|k+HaVOB6UAianH!6E3=voy<;2iV7M^ z{YgYl7L~TiU?T~TE;%*Kccedf0{`k)nPKQI6wDU{<~mpa3H}hs&OGb=bO9T@r~K`W zH8(#-=CI)rJS>ps3;^yj^4&|WGBu9Y?x%CUZ2AHTYdEdx_lp>c+yRiCxx%UL zi2*LP!d;Edi=uPi(Mya8bRmhV{mr`5K~H%+};FO&0{aHDmu$As9iJcU{xCAmv? z?v@Kr$B6Dr&AQf#rJ#&umE1a|8XB?uTnV+khYxMpV(%MF^y2p;n0Wo0pKg4F1lR}J ze3Gbxdsx`;Uf(&~oSD#QDlOkH(@de`zhrWjEB#46+PcZOn1p<%=cO#@umEwB=DLW& z-)+4J)o*G#`4(NXxN?6xSspT4Fwi_<-a)o7@?8tIOkwSqRvjZHKbQR)N&6&;I@=p= z_9BprTLraU_z7)?@^F6<`3>3z=f7x6^51dfP?ScjmY%UVwkrww`j1ASu6VPoQg%5X z`@Yf}9W}c6=xd zQ^B+Bjp+DmsXu=5GSi~HMt$L143FsRqxp5F;lq-a-~(Go-r`Gc(b>kGZx{U{c_{5> zA${_QNwoLL6byccEG;r|=n3*Jd3U|18s(2xIeao;1qZ9i1pB>~wcEmJ_mja~RY8UA z_1HmI)3}?E=?H5GmoimoMHY!3UD=r+nAE)089AUvuNHBtMz~6%NugVBrm>uKLz`gS zE3K5)vWv<-@3!g}N~R#0IIbqVMTd##T8hQB46+C<)pJad72E_3M5t9gX)7sz-#pW7HI41E&IgE4TUpOT)MKcsGOc&F) z7bzcz$#lE@b6MFgyv7DNnrAO^&^ZB^zz@EQUcq|D1oQ@jOgKw{u_#8&hk7}(+uF85 zFCbEuZ{E^ z?=Gd+O^uADUmO>$<$C1BCBab-n}i{f_d- zN}2U#v=X?1g7;a3EHU)9;Lkp#&P1Ps+E!yx>%ta;R6#ZJZcfKv(R&l^rHf3X*(y>i zGzHvjPopD#6fBHgPsv0X?d1Q|E;*aXq~|?3Uds=J?c**OOM12I`CTbB7z?Z1xe=V= zx}Dg-4I?)^`Nuy~8c-JAWGKoI#63-NHZof;-VGruJHEVPmvyJPN_XMS>sWZu*+UdU zr_5Q&D&*|dT{tM|8#&ih{H&1cr%@n6g0347g;!W;m$<4@fR$@av63$qgWKdeYZPMeU@W)g3tx)3 zPvYIDa?Ct|mBUF&TM;S-9?+sjWc))T~E zsdS9^RZ;Z@2BUdX#Wj(VvpL+pa?M|_e(j3F_*0>H|Lcr;x=|E;?o@ATV4Z~enW@wu zaXUwI8-)tb>#4c9=t<6(N+f+f6pA;eHcY!4inh>6B$3@`KDudnB)g6B^4Q%k)<1HD z?D462T}}9oh5OS}gRxe)JEN+=pT?*wlNu>4vmkT3+z63i06efOU9s@bujad`jv@1% z_@5wmSTAUs%M5l4dYg>!O+z_jT`3po%3@LPi0)o!SpB#IQCc~hG!L-2KeU;(wrnw$ z%zu3R1%-6#byWP_tEu;U>Dqp8rQ;s>WIU%AIy}5Yd*S7y2c2EM*Abi6rP{8NN+L;E z$rZoDhQKd`JT#*w6X}!1kEIM=COomCzAyWbN_0M-(>bRXiWfTI)%b?65MpnA5xJHU3zoS2tWzQ5-3X@E6 zIFIz=-xF4zCN$aZcD`Cj%r~`map4wuUzLhSA*FFX)0^7#JLl>_d;;WV{Z<;M$+Z*G zdr(#+mWZAJNYo^XO)(j$>W-+QD!tr{go%Zg#Dj(V%yOvh$-}2W+L-tG#4i#L)U4Zl&=L_Dfl@uFFq` zqfkSV&sY)E(CfeCxH3FUW2P|o_yv<#A3x4ja4BeEGxbmcTPSV|IMA4~)f({4sHON= zu7r$ES6}CsE~GHthP_w+#esqpI=nfUHFvw>eg%@=^jpcn1?I0`kS)@~;cOuAqg+`t z)#`3PjO@Tu{GGm34ePoxSX2C&3h`MO2K4}lZlDY$N&Gb`>7y~rk0aqYN02S*F-o!g~Wxyi|IIcGTD#-zV>pySH_zM?cMgq#B;cc706+}zsijOPNb@Fg=%UxT9BaZXXEF7 zx_&}m(!qjDJ3ACM=stz8>(8Ku8t_arO4fW|G!3`3-#>vtzZih$cfblme|l!9WHz8- zpO61{(BiM_{QH>vpD+mE*$QQYqEE!%q|5~=#(Zvihqu5xP|l)rYe~=&>8otL1uyEh zF}&5*?PE0pJ#-VCz%t0D(|g%XXbQfhtGvX45Q&PS|G|e`av%<3v)jfO#aQzohDRZc z=peRd1nk274U>G9yi*Q-4*WS^0_*yIPb`n^@f;oTXYKKkj9z=3g7V`e4B7~B_7|p( z8_P#+aZ#aRj7B)vg8@3P!6SI)mx@2Gp-;Vphpp3@i*Zcr={R9M@5a`#3Y(>s6Q zkB9!nU{7Y1e^J~6>+lN6u0%n5y8f0h_C4*{&yavDAd6$X2)sA zzeQS?Pl3%Dl}4qLCs{*rbDEMYsVH`S5AB&VlM`Q zd;O9IVFUgo;FP>EE{zz#V&wV4Gpp>6`25Ds!BT;5COcSYEq*YJhtLv%2q|iclixEu zczbw!HoKn+jJO-C_OB+K4MRhiXZ1c(a_bMhIgEB0OsIn#o+|eV4XCpPC#xHB&h>jz z({SQrpoOdEHr%&Qy`_y-3*?9fN_V0tsDiAX16=!>_bv+pU}M`qo#tvfr6ye$qBFG* zx;fFExLoGj@`7VCTNBdzO966OlE0;-LH>)_$dP2c-OriZ!|SK+@E@=)%~U{-rZ5AA zZ3?=SYYWFG>Pz|zit1k@V@KytAxqEk>tC~fWI5E9h)KM1J0Dp`b~FJBSA8Jwq6dra z31FAd-#G(w%%(>ka?3~6>%vu3Dkazci98*X1>>2FyL2rC2Z2`w@^s7_xfO@?&8hm{ z98{ky2)T@UchI!Dh#R^FV|&PA?DLfyl|E6j)n2p(!&TLh^Bk27_2*A}#a2)%daHkG zbM4}&z^cuQ`l%5G4t*DQ8J*RD8C;vt=nN5%-7rsattJs9uKCb-_8nh31$hiydu%(d zA98O2*&jbko8{{2e+}#F`-4Pu@$s^(7&TCa0Y=F3*a+`wwA|r70jUC6qi`}~kOPp^ zNVU`fbLrVuY@cj^fW=PpaGqL~%*4%DcKBM>M)aTcv^fMNl8C(RIG+gY4YcVh?_rVodg7$0C>M7!2mo~J=c z!7hz;>QaG6LS9j_&^P7q;Ur$_5F8mvTLi}@1+4MaP?hD6=A)|M(?dK~g8^9}E zQIVo(a&feWgr0gnLYyqn8N2$PMd7Al5&1#?`|a?$rLkQ9ek1|BqpP)85sjoY`S?67 z>4hA>m){iF+NQwx1b=MmJ6>-?mZNh^GVmH4PP-DbN zzDpbfzi%KRRLU++t|ixP{%%(kv-nuTX_HA)mI_TkL^6y_CSHC{;z&lccD4{Cgjm81 zdS78yvsV9wyT^J?nYqU4SN3_|G<=*IY0di*EqhhJSZVC1w}c%I&`}r)s~%^dI<`~O z>W+Ma=uqGwCesHal)dXa?9#@pBNEi@(vL-G?PJJ&#bZeDB0YF zA4vWSwBq|0I&xHX#6k3>F2VrsP0-Q1vv(>i!38q@g_-yd4;HoFs^OUTTr8hh9i{~; zGiAfDN^S)LE=2D*jY(ocGD4ED>y5y_@&!Kqq@4MxI1v~@*xLUBM#&^WI7Uq}^!DLP zX8pp|ADNccxD+>*?|F3dRWwE%FPnYxFa#g%#V_`|98$WpFOK*FBbye* zUVP7@zO(T?XiPhjA6xh^FEBu|85!s+0j?a_xK#jrr_;{FNp$K3wv`TZ&n6Jk>~Ve} z)|kP@h`^Ucu7J9S?lGUb<{{+2df)z|rU&gw)<3nt!#H&^wSgPAwL7Qq@3dIMfPp$Y z1=ghLoJH-Yj5mLUJIODB9``^D*hQ{oY!|}8M^5_wEFOlEehCz?Y(yf;3wlSMCAH0w z-~TCU_;*gaKv?kfNB>ek95E^@TR5Mu02=9!Z(l=im5&)$@X6S(`exVG1_H~ndFOWn zSN89F^Yt7^F_eErH2+fp$dHg)=n&dz;&i_~V`;?RSoK!5M0jQYyV!RZnB9%>@fxzy z$+2YfnI#QbF%?@bJ49;D_l(QauKkx$v=$U~3Gn5Sh zU(WtWnT!e-P2B3>9JcQG7Xr$*)7UpUWsg!HE*<%hcIR_^fs{5Tss|R$tLd*3c z$+kqRL|3PrrO(O@c=$Zm|GJL^h!q75_wm;t9A4woU7l9za37xx`M_2h8(u(-v2zF1k}BKmeB0%!-^Mm&L_B4Q#+SI0S}xjDz| zo)t^xq6B8S>twC-X>G?XL^jH=DQ!z=i|A0LxO1YZpWnFnu6wf^O~!1VsyJ-&AZVI+ zt&@L_&C4176*7^~OOh6ejNAop^GanE7H7s}YVLU*XU)I$dc4Qr7-8f@TEvv&x{i*I zIHf~I&OsUYvlN0G zniI4wj&OFlV z*_+yZ`o!Tt{ZlglO%O@Z#&SrR%TkGtfwISucr)<<4O!<#VTa1BFt`d)1$ED5_w=Qp zS$i%(DOs&chP9l{dw@Dx1NI0Q(#T$kjY10rf@h#K3{ZN=U%+s_j#p_))yb^2)bq)p zZ#{qW_F^Patx0=3w@rIibhO@qvDFsgsG^9o{`x*6A=HrbJB*sh$;Ksf;(IarR;Bza zm0#N|W($0pWqS>e>W$ageU3uK9EWzI--Vby(nnDOf;DYN2MSCKPV>ZIGwP&)3HY=| zyq2bV}Ia` zji?#*^EXa!*wBG1-dDF54w+Aj-hWnB{p#Q9Y~aFhtJ3L`o@Fk4i<49H{@7Jbra{s2 zT=^<`3xUL{MkI_^f!?&{=Bpq>WjUP=L~L+R<9_(yjDsC@IN$HbTDR=#%4vIA+S%1x z!Nb&h)~X4st8^U380{5MjF^BUS(>z%Q>e{>q#h{v&e+&0WQ}*c%Sp@kilcyY$Ob0i zm@?wewLBni;n-J$Z&X;~K$H@pA?y~J<>Np=MB=Bz;W&*HY0j)>D3s-vG1?^>Uqa{i z=Txu1MS?O?gwX_)^{(k?97AsnqK~+FNi;AKI9F{&jcL(UL&<0Z>e|!tYy3`^&{l$1 zdITv-K}TF{7E@6FlKco(Dog$8tsXG>%cOZyx1 z{j~5XapG&TO7En4X*dPS7^GLy;*$e`2;T z){tZxLm*m*6lrth4UlYtn%xcaG%8NgK0v!($!j8E7oIO2L+ezp=foi)HnYr*ik5KNx-y#ZGs4S8AJ9df{BOF6T6=}23N$&A943Z0C6xAhbY zb26OF#p)1Yz`8&17iY?T%9j5Kwh9(KDLMLRchon|^YvJQfVFg0mmn%jU_0yO0CW)d zx=WLmy_Enf7p+6bm8l5!4PF9*R zNNZ?DBvT*Tpy9h*%F=LC`Sc!BDrxef3#f$|J2@ z)0c?yhbEbrLpQvg;M-uh*v?=Y3W=Y;C>fjO48EDpKkdcB`d@rrd$+F^@}3)+zrnAPXLf`iSHP8D>OjxHjN*?M3tb_XIcoglyaY~G#zRz&7Gr0%?Bb%PSm;KRP0F!($B+P@Epz$ zOn97^LF1l@b6e2|0C~LN+gsW%u&KmpYf*W27$R_5$2eqHe)VjR2Erj$Bey`^9j-(o zc^6PWT`i5U^`f+|iK1W_py|dL1VjO7SuIX?TtU#mUO4$+fbu=^_R@iU#JM9!v=0iD z$L*708?AhY3Y=ws4%5LmU6Yxj0PsD=m8tYp@;y0RY{#;NzdV)e2%7>4ccbx+<#SdjTPvgM6+XzLjsh&itcI)0W36I701{}ssC}3)|0B+2k?HoV z7t;H{S!3;HjSaA#0NL=@u95ThMhBZ-Dto{vck&V?k3w#;y2{3L<855U>2I^&C1#gA zl~=Qdx_tPpji zw2){{IX;|L34i^sJcy2bwf(;ZLx%Vnt#cC?b}OCY zs=Qk6?x0T#N*TG*E5kTI%RXDSK9&$R+S{942pO9Xl_0-5-w2l15HCAVMR@(0Zowy(qa=(BvUgkQ z*(~v&nrQo;C2>o5wO>qyriCYQYrOd)ggTV}cY#zG%SHnUDqCDaW<#Y|)uq|aS2{ob zjlmOt_2~RX5BAxm={j2j3_#oXNYvgI)m8tMYG9%A=$xiBqO84^dmfH&A@&|HC}e~6 zp?@LW;hECJK*wNjg^7Oh&~s!yX*{+A&ddI{PJlob!~O=n1mU_tga^UKc6l2Ha>uH& zT(+nY_caxqBiqwXALm9+8@YJ^*eZ!FBz!W&!^)?S@~{82QX~DbwXQCU6!x!xqp>HWNEMwgN#E{j5pzFuoN67*wm`3hm6DzJ3r+*qRbqkxr5QIkOVy~AlF*on>6Sfa&4eDaxlNeKo`rs_e^%i|nk308s#5!wLr&Tr(y@HZDxq?MVLrI<^Op_M z&CaIW^?Hpk%YaGaRs^frG^DI;RC$2_?9Qcb^WV7p>aeKZc3ngaL;*nrM7q1Xq#L9g z1O%kJ2T&A{5Co*VySrvUO1dQnknVot$Ej4?|Rp> zp1AM(IXk``_Jt4lsC<%2{kfM_p+heFUm9?_W;$;z-x#!Jqeevi{|Y1Rx=boSE6>mG`vLb?Ulp-!jJ|_N{C?( zYvpfxSiSNS9M1Ii*dX|Dz}C0^I*Nc@LHn7Oroq?i$C-Ll(T z66R{b6QS!HLpdksfF%c+69!FY-|R$pkPK#68|Uc6#0$JzC22hlJl}K|Vlligu-ilK zu{&mm7f>^Bh8#0x_UR2^8&&!g0P{P@`8eF$zpJd1WJy+5R>fh_8!|o@nzgZ91vHd2uIurqBS1$Et=8it=l<@D2gdNqAIkw> zG|PQ!gyCS{d~^J|M=G(U(1xG>N56Svvj#BGO|Inb;PC{i_ic8-XehI7qoeToMyl=n zpeDNvME059{rjJr>+oJf;m|b<;)~veuiUr49ElIg&%ZlvKmZ(=DRsmBE|itjU8s9O8=to~R$VUY$8_Pb$QJ zg6)NI@bZ%K*b?0PNPF+En93=fM7XJ-;QOYx2$8y`poZ_CUQ-TTfc~`I9m}ZQ($WG@ zRnP%M9Po+k7#%IlAWLsDv9`8&|6UT9Q3(kNb#?V^X)&=++1ZrHQHkA$AMm&>#sbin zYOQ(CQ5X_J?@fpz^c-2H`wtYatT^QGe_`|rvcv%in1VE6=A*x%^niASv#M^jfC#u0 z4^N$5Y296t5xGBdnD})k!T%?ASDR=T3D*(S!neer{m3pzgtgHC}`uI5g^=h+(Go)OYp zd7K*AoB8&9b9Y&v)A`;MYGVbtxiGsnZt77w5Vad@B9qywj1BWZXQE-bJSE1rn!l{| zaUng9zv7WysQXWz0Gulq^GKmp~YlW}vkTPniR@$D(GsN9ATtH+YwT`IGpPn z4AFA=9e6BkA;)C-hq3e+@q5ic4JW?uAMxB8(H0$cc%8nHincmnmSh^1;l|8qXj0R2)uT9y{gW9xdhtxh`O@NJ5tYnrGEpVzC}B zY7`zfo_TI|2@K|}bFT$T9=XM^TOUP8xC}dBLZ#L>n{YQ$S_TN#Mo8h)kp(8ncFk9h!bOZn(zhC=at?MZ1Zd#r z65nq1P&RsKx%u#4@u}15CE>vJ`(Jg{avsI!KRempS)Pwy5J0Kl$4u=Xfw^cIM<`Kt zv=qol3TLQ`+J`AN8(P#mrk!tbK^bcIsdy2tdFHYF{(XX%oThJw#l>cCQ$_1eIe^Z< zk*Vy1QxdRW1?xjS#9zaQW364Gr7@4C{&{hhk&E z{8=hW8z-<#fF*J`LC@jdir6mmd0E|SHa=LTlixqMp1o0`yK0_UM#q;G=--%Z4QhOPg0W|lsZ)&@h%$ScUfE$wFd6WJlYWD-VApb= z-Ey$Uth9j48_4#G4w#Q+jJx-sSU=&*tVn@*1t!&CaFwq^aHNhB;Q zEsycaA53j;4v8^pU(UufW%Y053SV>>fbjiiC8|OCdJ1Lc(~+sulpDuu{c5*t;IM3)gpfRVfrSYSs%C4vOvLQ z$e4D*$V_6Ys<+3O)+is#dv9FDxYqKm$}rr(bWO;1zWH1$X$>$Bi=cN#O&b|p^;uGFk*b5slqxZL+XTK@?R(_c_Z@spY_04grl^XQWevzBxWe&?m528%iSt*-U5z7=u=teu(bXN?{mW>Ysf`L<*#w|CkPh&=Yz>jrhTC?_}Ow~2U9IjyX=bJVyiw@i)-4BJWN z)tO7jdGqL+QuO~=noXuVNI77(xlQR0=`zUnmJ(Q+PeLGg!6J$tAw^l8>H+JT{P|<@ zJ@8pRpXq8BmvU|F_$dp>Rc7lqsmS&9$#9Z-0p4Q9&@x`qFmId!EaGiv^|4dpU)&Q< z=>H@Gbu+EMY_C9WoNh*;PHqFatf2dM_$!t7mWMjjC@vtSPI#v z*62a{QikHHwl23y9n!$k-iD<8h54WMuD7eq%V#+moRx20dNuws-E9`@@SZ=Ab!EU? zgi`@#3*Z0%W^077Ht9hVw+lWiK8Biy-$u~0Cd~d;0`-X)`?B$QS-}=|<_HFbh%~-l zj}q+>4wtjzTA4EFOhBG;`tKrEnOg#F*Q;geB%%PB#<3{rQr3oZw)!mR3h}9TSQv~& zr-fRwq%Mz3vcw%*Bc^puNhiWmY3#g~)=9#6m`}D`ZJ%xW45^&xY(9fcG>u5 zI$Bt=3MxRK4Y~u~H-#p1D?K#yA8%n@Y{@0!nzL(&-?P>if$V(>(Rr z05^@T5ua%*NtI;;0APwM&aw@Q%~hkR4>?j(q|EJd<%W67E?66KxMzlbGdHa?nAK#f z-pa~dW;E?Yjh486)kpJlHFq-i}Z`P1jaE_r0o*0tv0dIVP8yzQQ!$>d2c2JIff8(p3dMFU;E; z7n7{EtNe81-fAb^$rUxLYgO<+^?&G@_x8@~-xT0-n+hu{4n7JFEYn|cYYnar`^Hkr zzUkUTv7sYBx~UyJsM|O|T_3REkr4kt7601JQ2TdjvuY`g7K<3;)HA{J@%4_zV1GHn zy6JvKt`fv_%FZhcA4_oT>GW)*hq)~2AH}l#*L-U`%QlGZq*9WAP!bUIx@VFe(q-(k zyWc-n(;Bq_&&&>LB{~PRMDQk)NO+odb)%fgj55gmU3|$OA_lo_44fIJ&pTch%CN`^ zNozXjM;A{vn45sw-Nw>YgbgPcpbf@@Yl{(&g#s>O;_RGW8kn7K=(Ed0*E)h-a-X=g z*IJvJty~>7-AW~aSpuJ&xGW9_6IfQEgxN^pGaea+#{; z+re7(D;2y#^o~9-z9tHF5|L$HsUE3EpB1Ww6RzV9~~Xlt@^Uld%B0fUjs$lJ4%PbgSz z)-ekRy6O$WFhk|T-ZJ(REeG%uoRAa{O1XUR|D5Q``Aaju?L2P%nq@FfE*aWV70@dpFK;n}}F& zaAXx?IT`J*V|pbuu;4N>L<`Z?;B~z z$^O~>rlci98$#h-nc>5#0)=s7LjakXCIsYrBYxVx-{dgvS{Q6TSq1pUGgqt_gx_nZ znRH92hhKf$sCFEkjwas84%of*8JK5@9cyQAui4$ts-Zq0La}e zP_z4orbIqGLY#`vf7#LXc;$f*P*Y%+c#)WYOr`hA!}XT|tLj8tg8Q#fJNpz1PPa9R zTlgRVgE*b(u>?dnB$9~go#c{Pr|+u-oDKxlvr(auwZM=ecW;&tSdD-Ahlf8V!d#TQUppBI z#13bx-%IEw;<1zdNDJYOG6)R|<)i-qJ(xi%O*kIYJ>q<($rT}p9ovt7?K-N%Qfu+Y zJsJpRW&k0gQ}<-F|GG&B?=0t8!fokl+{nUnM2 zkXJfw_h|jdkqJH!9uESKS)8w+qIRp(meVPI3*~bR3D<4;b+R2X_^8l@tqx}Vf`iOW zVOq}1Vc6Pe=HB za80JJ%!nkdorIKtZMtMK?(=h&%40!@eR zkJm6UQt&@eMl4jA_O55gUbh8uCJ|-1c+MYZ>jO|qkmOMM@{Y8*r5V_vP1e~Dwhhxh z0C%Ro=J@7NG8b*vtC@1?cXmaT6?h|*A5qhIBEc?@T-qD4(6U;6puYX+(Zk3Cm`8dd z;hc&gfk0YJqsL_E;HatJ(g1s_dESmYb=<&_*9qtHeu{+UFz-E$<}& zg85k-LFs2Hb{q8`=co+)VlOA7sFJlRxs1)qrV<2cjHIj zv*)SD&B!~|=!E^DMZ=LBh2zSJ|E%Tqd$Z3~4Ranb5CB~$(%0HKYZ$OVXIwtA+_QNv zRY>n;+L%Kns4YI=xx4;w)1tM}LXzfd{wz}>LG|Br0V+6KHf7Ex)@pS+EUb9%!)k18 zcy1!@e|S&5wei5Tk&kuV(VE($02lTLeYycATfdN%vx)0P0qs?9Zg{rztBO<7b^~yY zzWJQMUylZY64xA6h@>nO6)g&LxF|(5JJ+%HzwOhZjBLqL;V38=9;9@4OB+1JngxTu^JOjh3ZT3vEGWGhu8E<6;Hp;yh-?4s5QoY&C&RZY->p*@1K(fCP6T6pwK=)D`$YD`ZQlcK_ zSh+e3b&ifkc~?G1@x%e{Z5n1NAE$^5=oi(nUt^E_HZ@1%rbcH_`h(KEBo3mPYu;}g zgnY5agt%aaY)OkeqBmD%%)d~k}SBLrHj!_O)E@j8wxZ^guD?IQb(wXS`x)S z6uuDtu`vs^caU0vV*{3pS`?u|o4*kq6Juk&>MB4?NRY-)9~xeNaoVR5}g?ugVHHQ)YDe&^f%=PT0KhJlx`XC@~S4*81mK#NR;u{qL# zfbzCI5pvOz)sct_V?&}71*-iKAWWk$W3JbRG0EtGp>_p%b!EFw+Eda2A%ap zgCjE@Ju15}A!)5*gI)J_#9kV%2AqQAM7^8dj5%{WUmQpM42=3y>+yrFBd08HQ)vJj z8!w8ut}fV|Z9W*fJnDhspr0Kif2ypk%p@0;VA-YE0Vlq`J0mshq~Eb42JjQyMA*nP7moVr6A1d*x&O2$j!qX^D3c z$8bM1P#hwd2)+P_MPK( zcwsSc7#Se~Wcy*e@ItWB=)5J~QhK&E+G;!xxP~m?aa+2#?LwjDFA1R|-_2tp0- z%8H7N(L?>0LV&{P^7bU-ge6@tCUIY19~sJF&YyG(;8-7N$z%X|uQ!kW3U+{R{;hzv z(6g5>=Z#uDflTzn&tfP7%>R*{4*U=$^%=k#8-HuaoC$vXhE^tfv~bwT`+PMiApt#5 z3Xt-;qspGJAv^CNQ_FAgvnH)qowsUjw26p__I6+Yli8g?tgEAg^RaC6(k(MH^HZP{ z5V`<+R+q?lBhkK{?t1xGnIhAwt##$$m)wXmOt0N2MocN?SogeCORj?EX?!_7+vXpd*j# zbs_Gs#3MBju+$Am5RzM7E(u^dVXBP28^Ki`NDmVS74b2Wm+{wj6NiT@U2!`VBTylG z=yTPi)c30SUSmdu=Bfzf7j**lTw&!5PK>nrfr;?yon&t7$s1!**N0}^`Ui%rt#O`Q zLC8T}`H>_|_CkP2`uGQvpbSa>Z{FqM*`L{h=lMpZMSajMo7^2vp+6@H{kfW3f{Jl6w5h3rwwz%s{^!@B)(VC@6fDutZC7hz^SbUdJ(+AAfeg zX|nlL%?D`tG-$5;&@+xpT=KHa^N@bUMN=ClV^r_jO)SI*F9w!$%F~LRp-fT zEMXY>7q>D|s77r;%wcZN6MECZHi&vLA+gmym}T(3vMJoJ)+Rfhnc{HVWohH!*o6f~ zy7c1s7D|{P59IP$NS8LFW1`&O4SU=@n2h28$@{-IxM)If&&3OT4WSJ5Scz=@ zD`nJzlwU_I3(Fp-;KAD`eqjN&=RQyrH$NH{N*rcP#@H8r;3EEoSwW}iBuXw9E3rJu zYGd!f#OS(TACOBLkFDj$ZP8|WgW|{YU$Loyh~Jfi;V4k&)5NUL`jYS5Wm4kK&SMWULpNG!*5419Iz*JU?>1DhQeylNnj#nC1T-Q1 zsiX&-Crb+&u;FX?qkzVMhe*DgsCgn8x$c1T84UIz5t_L1=iop-GzJ&VUl5QYur9RW z+`EW){qmD#U}&>OFYlJ;{7k2rh8V%$IxZp?I#Dbci|s+c%}M?4Vh5HeOPvorRp)RE z855J3qXS$sp+cCc_o}$m|Mkh&YijbahRa~I#wXfJK8#I#3IqBT%gM|sgOyhDaWdZ_ zlnN=|nd8EA6V>L*MHUNJZ6opMyjYnJtJR;l?|7RfFWPIRoI>+FA*BlEyS$4esd7RK z2B+(9b$556P3-L{kJ9S-7{xLSRv_mm1BbTF=$xNXg$6>RKVx4j-hm8|CL7t9F*TCU zWRkI*zTWn!-eD}M0zHeY&e^QYT+G3ohn~BM&!NW5>^H`1d4$TUCRPDwvGrqL*8c&hM7&DCrA9w9D5jL6? zF~q*}IMkTzcF?{kpLr!-0PV1ZKseMgyf>}-S$2&YzSlc-4U{$)_&zc1=m;rhj7^BT z^D>sU*noC23V?6+nmBbhRUymIx?t|%rKnyxHyc}n%~f7ro@#c>*w_%@xAb+Gox)G( zVc-i=aQ`?w(-Uwv0e|HcGH1llhO|k5)^Apm)Yj)~%O z>P}vBlM3*-00Q#Ex{6IJbMrxq{+T&l*A#?G`(_1`L~v;Qceu5%(+LP4@Loer3li*lR8B8|Z)3iFe1b5H9eMSCE-AMh@%6u|g2}Sfjn8`2s+^81g zN*j_$@ZHE_a9aQ!+FT$?7 z^*bflXpNsor>_@4SB@I4d8>XV>h;?HDFGL{U8uGPLCueFbFY~AVIc65*h!J=oqaK` z4uWW74<>CT&;6SxX`-}Qp4OL5js#3zl##~3{HP>xj@54^P7=M6grCwgDIYgp{W`Y z2T?KS5EoaxgU?SYk6q8RUsCJ#B zL|RNUpqgmX2FLDqzQgbTO06}#?^-8lyy>(Ws%jWKV7+0=`ntnym$G+XbnS16yMoq; zUvPC0BE8k;lg&!YNg(1Yp<&dQH>ggy>lS1WiEP=H-W&?ku*=!h2Ns;G^GwN&VTvEpkSM?k6o?r+ekSk?Y(dau;Dam^=A=;JZ<)r&ejBEyC~7 z@ucE5_d>w_!L5};y3OzU@7=Kt<3X^S3kNV_wmqc8u$fU)sr+^=(&iye6YP2%W@N`< zm>i=#cTpOz9W!2zfWi=4XD@qK7N=WviFLHW9Dz0a@KG4TUZwfH(&Wl3cGZ`=C4FwM zz4sizunys-Rl{apYsYO&HYnRp}X&1|zXygoA^8-~IzHAK}2NKSmPUrWJQR#zpzELS>X~=G`XRBCdkgFm z-2TOG@n*)q=p8- zwoaD2m{0XUZn77_=b~WE%u{8intXO<)#H#3j?{}(U$-7**bqq^^?Z?!Qr?#KyA){* zO4U9Gow>HTLkA)C@ibmcC%gmy+j_)B*W&)bA3^5Ld(V(3=mD6)C6VJKZ$&B--Q!yF zA8S&J*NdXJ7M0g}bj_kI7teM1|Ih`0g1#s)gM?+ST-KYqpH zQ)FU_P<4duF7xMYqKNf4Otyh99ljcFx46cVL(73Ac5F%XC=KV=kt6= z#c)2^A8H)J`8w3JxRiOi{arN%rN?y#@KF!MF5>o2nmznCR8V^%S*#Kn>60N#_46{} ze|ASP)hc$@nERKz48H5vxhcHdvfr-sY`mZi86NyTUc+JIs|q5U7>h0`(l(l@WzpT` zB78{G&_};Q{V9M&o8?H-8sc^ z694gjJ&(|yU$|tU!Dgk(GuPXE(j}5nMtMlY2;XBi&r)X`HKd| zhKB@8;HnxhY+P8gxyb0&c#hhrM^pZ6ZHBK9D5ZsD%y z{CUS!)#aD*KGe;|7o!fbozq6murpsngYUexqz81fXHZhAUHH*LaTsUNxX(GAhv>#4 z$E|9{qG$f6e#o}2Rv4ks<)sn4tmpu7ZjOEwkurZW8|XuLb$3f`50_VB9;3{E+TESM zywuyT54uXjzu-7gC5ewiVG^XmrIW(4Gc-Z?#v8U6rxxyVI}LdNtD7fRfg!KU;d#n_!tB5JF&!FYdCncn4=`0prN8-R|%0sc9=k%&EJDS z;m9L=c?DGNu56s0Ik>q~u@`=QO;f;px4Q&260;IbfA&y;@4Sd`zv0u7E=jvCMm;dUfhaF(^5wMmaRAYZC za6fi^1p+M``hN}@^@gm?4N{@w)oK)OjWn;B|4>-`xAOq(1^7_^5W2sc*fymP=3D(l z(X*I)qE;ropJ~1hGnMxlCNc47_+LB4sK;s7*h8bK0!!f@!P}2~krRNjv=68rqM-|L z*o`M0qt+To&RduPKD%#BZ~FizM5vVR(+AcwLfW}$(FVOkDP$kCAv%^5> zAWgBRS)S>_+G>wx8sr%qeh1bB+I_vWtI4zC+>SGUA>nsaRRbxq$D!YrKy9qYW zRb7?6Fm0OWd)D|ZmemHg?oCO4%{R6eeEdSKZf|x!(ReJB@+tHX!iGu(` zmEg++e)?D%2v=3Dx}~dch&%_g7XIowQ4cHp{-I&nUAF}xD&Ve)y@_tJ)vUVN-BC)F z_UCb_NfDIquea-yQzh`uWvurVZqKY8dD5sT#$UrMQ_Ska(Vuo@ZB50yQ*A6aAb7NJ zH8gJr%zDJ`218p7U1d!}3m3bV{O;!)%cA5tnHI?(6@QY~7_t}0zeU77`RaA3=%&8$ zmG$kgf$si+nWC=rX}pMo$hcKHrIgGsXRQ)wjcbVf5)Y9;Bv+b!bp;g%(CD%+SNc9K zVQKUe18HVn;lrl}jokj@p?LfZnKrf=;G<5taV0sU485wnqIXtB8k( zH~_vhWT2+H?RALTi6E&c_ZFc|`ko`|%VJsa2fAoAIL;qK3Mm79UjF$Avg1aJZ+mr# zW54ovWsQTr(ppeO%Y)EhzL>VW%mB>ADLtfUU~k3m)k#(ea`t%+n|Kd37Otp_{Ie~mRhXp(VA2C$L52Q_0nI-6P+}M>m?DJoZuj5kfAf(g%kNRSow5?fZQb4>lJ7see}Ki2$Vj^Q0@{p-8J4DV z^P1`ITMKHx1kZRsR#4Lxsb!vVKJJ`jb~jOO?=Ct+T_34b-gkJ6S4ei>U+AZ>gxXqO z5AWLfIqxe;1)f{0O6$YX3Wik&2aaF2{&Wd@Zk{zs|gUv)Lc^; zp*^2^>UVySu4A;omAZ=FczS@V(wbrhLIjyRh>x3wl)}f2p9yFrs(^ggwp-d&lBaXr z0{O=jdTv*~MroB!YqdB*dn1dnuIs8VX6&L$A%dg!r|8k>%sAt9aog#e;o*FiGfcyZ z^jtRexfuG&5PgT|7A(g4y5MfN4+u#3x}UE)_-OTNGMnV5N@MX}HbTv}0%@I=%A^3Q z^)%fl**69}uz|Fi@WBpj2FK7)r>Va$Ch!_pyIWuFP zG@Q%2e!CFPnG+Ja;z;Fuq$xQX8$}3sN!xf#GfAXoV+zRAB%MVD z$ZCFPB4}~U@|&=&CQ3?Dv5}Kk%?j6l7E}uupl9B?LB$Rc%~BL0Ul~(alro=vlc{-F z4V|7@5TTGAh{CWCN~LnMq9_$L>=<0)un|-N+5cE&R*H^pZfock)IZe<@?oWEO_Y5> zVQsDOHOu_Tr#U_Y#N{Wfhy)c5l!-A=$hCa-Ik4dB_)+oAuC6oY@sN!F+tP z-4z}lC2E|7Q|C|RH3+v5pr4YE3~~A6RrPMZt3|Y=XgT^wxSk|TM@EQBg@rtb$l|1& z8NWE>Z706`r2g#{hJKldsb!8rU970l(s0B1P!r{6R8u04hB7dHHB@5tcK0S%KAR~% z;Qr3RtAaw|#zM!lsru6FRPEVWl?hiu+xMAY7@k)WmKiPXaM!sJh9F*aFjccSULlQc zn?!&a`^Vs6n?2s9u;nq0=RsS7H`1|Ui{o~m|;T}ItQAdf4R*)6q)FZm(h1QF$@@VlvK#vR?MNU#oBkdRX^ z`gbW>Q>{(?&y6!f3ELdZ~_Q&~Z?fDDVOq@_KB0RxA-`w+JPS67!+ zk|(ot*yjj6JusCP*Azc{d8PSCQVYn=DnR^IAq#^+jKt}uh@R>r-P-t5DknFulrKKd z3OVwt9Hq9Oq0eWwa+A~kR$T~s8ej1V zYM!h=si^q{2vH6Sz2syJpDM`tf>;9<7#TqQvny;qSuy4PMq7PdAVCHk<{utM5J z_)6{WCTD%ht)hm3(b@aVAJa0IDu~L)R7T3-w2~GHT7B#KOHh?vnhbEeQ#VZgy{B7hf7c@3v!;ZxY8D7^J>_^9b#XY@woaK^|YGD zNj~L1d&L-Ld~x7Jijd(13}8pwtfe+cSZ;W%=LH4z&nTdZvX$}2;P17=Ks>e z{%<^>I2vFdbjTuml#mxG4%Ez1P?(;^`}yDO7~gfZdi$AW1O=r61!#Obx9EqwFF-&6 z82x?9$R3Gt5Nd_afFcAWl0Mgg^d8@A0x?WOVSdPGeKEdCzKU?M}Az@8N+ z<3|rK=|Yv22ET@?9l{$(2*jh`khQo&9c)W3C$;^D_7>*BN@e>S$nzz?m;L7cyhl7M zOj@R=U=kfCM1u?)`{VbuBhS~E$?a^WJlW?Mz2%VUfn8tb(lMet{k2M{kcT7(Vyq<*2IZ*tJt3Y#B=>X-8d?Qp znCTQ>-mQeYaE>%KUqK3#W2}=R3EHlFdMB3oR~#6n*G(IP_O4R?I{;ilu7ox+9TeE} zZcvcaw_r?U42P}vznLS97xz$>1j^%UFOg^4mW5>MV5fnywde2eCkN5P&fIiiTZF90 zrKIy^c8yCAF|u0I-4Cu-<8$LQE}wJB>GCrTr|zf|)#;4o z|H;RNB=#~P8^((T$aDtSHB$Jm9>Nt|-0ny4?#1|n1vm_4NeDzlDWs(JyPlscLN%#! zaLi*uQ0Gx;UEyT}Egka+voxb%Hsj^=PW&go*KpQbYGa3475`8os|;<+K$QWT>4N}; zYP$-$Rm9{0-NDm()rGI$vWII6e(z0+s{p6ATGpwg z(+<5rF5WO~Afx{srx%W1<1@cMjy3H!&aSJ*kiP98G>Mle7wIjx1s^1grxSY<*?0vC zz@Pe6MUn8^sHfMYd`RwvYQUJQldjMpZA|w4ID|{ci#)YUa*uRhwHNesz0s>GO`_n{ zu^HMeS+PHAa^~V0!_^&U(y6Jv;okIvi0tv@B72t_<%>;OKX8(1*==t{gpU93pD&$@ zsbG`oiPNI)9d0>Ud@~+T0!MF^>&lW8%G_~Rmes9#qXgrgWPKLYoEhAgru2FrqC-i> zQk<`Pu%7>Q;^`bO4}J7_lnd)-l^2TurL&n;yAsv~$UP3f7pv*}ZjGmRBc2gU2-udt z(6Sr1U~@~x(+NGA5Bc;|@F7Ef#_kPMFN%At0@4MUyU>U3F%$s`)jZXf32%2y>1Q|6 z^BofCdw+<$RI<9T9p~TiW7MpYY*H5D7ugnYZeM@lR5_ClCWx#z;WJfls!6#Jc=(!j zC{bnPH1x->ROc*Gr{A?RS(Mp*YrN}R!9I(+b6ylW%?1gZD_OPbJ%@1%HPO#C_9>4W zww}k(^aK%Kxq(Y0^|m8*hU$l=gDC@(k2`C+d~=2`)A+V?^;wuPDMZqpe&Q2SCT-6$ zhpvj^bX*#wtv@dxl^WXm)h7woJlI{a?huK7?cYJF5_goC+M?g1Yyq{6q@>W66KyuMZ@Vu?i8tu$Y2T4+fufa>^S7rUIn5f?+p49sY z#PcR}&%of`taGBRyTAFpLh1a@)vWvi*bIMBD!lh+ajuW>Y-(n5+iUs4H=1WFSN1~N z1Bk@imI2d*O+`ake1ZT#;^|~d<%aao7n|oPQLH@OIBye)OUahsHjO`j4lWj_%FdN5tIPo`Hc;jp`xssjl9%gA#EFb}kp5*>!SB@qibRwAo)51bd_3JfGfZ=4ij9 zu$pY?FNmS=pnBdsGx;I&cg~^IZAgqoO!HRXd&M79#O!jN?au??*KWnx{jV1yOtf2v z41I^(sA!IdwZq=JiJl2u5rc}OtFUs?hbR)@9SKPglT+55XnuP zLQ*vqzjj8$E*JxLMS4N@GJQ+8PP9z6kj71W;*B0mFGJO6hygSDLfIB@q9`y-VCH4N z%F1O(8B7lKjjtYV5Go{sUyZdWyH5zq?dzejDl12cIMjE=6UaI}?P$`WXmwL&9d{fp z!woYs=z|!stgCOS8P$)|Mu(Nr6w8%I_F(OAo92k?2yKaouI{dcwq1W6kTjuKBn>zF zTA#V7StH2?3&=VPB@~sBELaItHNq+JbgKMmTUu+@M$fHc9rpysBFDJ6SD5U@6308> z9CZLV=soezOnM3A?!3*L^V2is!>bCLyRvHIJ0GwgOS!8^K=gaCAGn;oT6z#BD~n_P zY}Q)Oc4%NrH6xhTf$%}n#lwfY+-5B$Oi4N|t>eWwQDpfpoKl09uN~4%rg9(SZ1tv* zTQX9DoNB4q3pm-dTktgJHIDN(Tb>FyY+q@}T~3BDa;zh+dT}4PC~3-W^hk1HHI|QD z+p%+=)0Nlj+Bif|h4g!!Unf1E50vB zx9?ZHeBn0c#s>a;_($b1ygg6J7xP=ZC6ZKBhjVE1-XjCAcTRvn)?;^2;U+7C)ZZep*Z*}SwnP(&0*mV3p^WkHr#1Sx#Iv>7fpq7@ z9|8WgFPG^N&eOT4VN-1N!N`2)mpgZV)1`EBUpnOJOWNc)SmSSTV8h?`ceVdDFDE@-#*E)N`c&*c^~j(Z)eB(+{F$~IShzBIS#SNa^N0j^;1&&MEk_7-sU^jAK9MhC;T^} z_UD(cBmhOi{W-pMDd*XC4;Yq74+!6Y!V)rklgoKSh74F7V|!NI`F0<6$R(cy1bhG4B>RQ@9oxVXJ_O`8tg8;B z$3094bxP>aUo`Ygh~B-5zOwb)Fpyh0~8GV2FV!D=sot|@h1u>DdiP;eKQZ5F&! z@^1D5UIW-LEQ0t?#t8V%GlO>;Ww*aQJmL!vmbiX!6blV{)%kW#OijpH#^yZgj?RlA zUDS*nY26@&AU^xg%n`?ytl|#8RWDXegb2N*%8S)4jwZ%e-jSV+gKApczcRWRg84P% z>o?vuKBG5Xrv5@&{)cxDo-TTED+(4)s4(ewE~8)`UaW0a8#}!e^*eY3v5gl3`&{)A zn9r2OlhW3T-sB%3pv70=jl-=iLHcG+?vrJu$K#@ib{GOORrF0>=>>A#qoAM(0;z^a zk?dTpx7$0kGS`F`YuZLSUdfCeR%=yRXzJs-_a##PM{REz6-Ur@jgo{QAxKDY3k3Jz zPJ+9`-~@La90mfx-CcqW?mB1^+}#EX?t{C1L!S3t>)!XrcfY&ty8W-at7~;vRi8Sw z&px}FgEXkk<&zeLIc*^mPC3QV3=4dB+R<0?*V!KV4`p;#>bS|@E!AiC5M{l7jO-pP zJSna`{MM2Gfg7Gv3v%$URJ%DVnYG>(T-dJM;*)EWkRYbovT76O&A+RKM!gF!F1@{Y zy4mx>bJwD>Tt@3nlfeIz0u|=BRVg1)4_!+(?+;GbM#>1#^o-7);cfjlMnBHM^#^~6 z{toP4XKJHL-1Roqj#BX+S<3)w@cB%`r5exuv+u30&OZbjLu%^%Dig4dx}49?`4|;g z4i$fyr_1f5)nF@lv1>5Uq%9MnoCoSd9w3?4HQ1DXBIS9ew;rt{y9KXEN~i+11|hr> z6$*7Ja=NKn%%NchPfNZ!zP2E_Ps(dw?Sv}hQ5k#PGZp^B4?yvRPbQc@ctC@Vk7=?U zUE``}Bfo{Vy=$$)WGI&})J1U|hT?!UNfs5aNO4zHV>dx26$? zOg)jW2Z1+(iQpjI3I|zhdi}Y?0yqU|7Ro5rYBMX`$_nUCJ<)DDW=Qps(XJTpBXLCo zkO^H60#?W}9Lw1<8y01+jiA|0kU2(N*?)igmoZT|&m5UK#;4I-`hNEcAiT0-n`&?7 z(Uay+t7pAkpNc;jh%5Ui&0n+kTeLW&gjOC#7EA97(w>^`T_BQ3*wmp{1GD4ZlVngS z6Y>)5l2%=Jo|S~@CZ>#LugB@h8mQ7p>lpm)7yzhN-&Gnc$Nh2U-k~gQ_<+dFkYsK@ z|FD*3lJ?mJgN;u7HJy>2w&zWn`+qDn%8O?^qboOmLgD*!Dw@A;)G{_Ef!n?sjv8{_6%Z`tyxrh4TyND~!ei&;$NI^)-ZFop87A_#0~wm|NfWpBsR1T=oBz zT=D!W{}YS*ckTaZ;zz81o{Hh+f0tBOM?JeUaMpxX&PDZ`=WB2Od(+7OJGT9=dW8R< zkZdf%+`L3Ox?-d1uI)3pdw_!Z?%g|uLgQ~g?VmALZ%g=Jihy-MO+y2~!Nn_QoAVa0A$$LNme2mGF_7 zr$nonl(|2?_CeY;0|kI0%(@63QAT?c-%XkSU*qjdAA@3Y*tJv#W4SVCws4D2lv6`u#jQ5WdF*f6gXD((hAWs!oQV|9aJvA}Mbc^rh(A0XPA7PNj=!X`WX_%WEDSnqe7cWc zdEBWNzW4MsF5KNC=QrkqY!8!ltbo%0(rw}GOVx3{;1MSg*i)KXq=EKwN#ph1JQ0s{H6TGK}?Ii^U2odZz z^p!B^>`Z|l!Vpn?^DA1Pf6T;Fs{d>+=>wBqt+KI@XDgnI*Z1z8{Uw0)Z8ESznGE&) z^Vd{q&Rs|f7ZvXt$Dhf%sg*CKlsa70w*x?6->+JiS=i#;-Mw`2lpi4c%uBylT5oC< zU9OHv92{Y@>~Iw+z0TJ_3q?+=!057J<;877siMF5+W~Ps;@!RUIFIN<_&O!N_fWsv z;8-(ztE<2iXk6UTnm}OtNz5fo0TBU_pwawj8=T$Xk+D%xEkA55EO>-^V}QCsxt`7u zJ-2Lwp8PiAYt{2A=NnSGB6mb6Fxz8|LH1RnNnihf?A?7NCNrt6uZdgET8{VMamT^- z(*ri_F4AK{wmd->Z7v{C;{L%NQ`v--cw;Oq!-ZudCWfn?%F@&-bnCz`DEvopcR$5T ztckL980mJt$50*+ttNny_S*Ya`AU4Ba`0gybXRi9UsLFWC)H3<%t@_lC_bTVQk7fa zrVrcjK#x6GJq2u@J++*mMa@DI;Cn|Eg%kGlTD9}@^CZM#3t{4-&w{#oUrvT2KJ8I`&3158|b1Y3L7D^=@s zaU|lhtrsa-8{Fu%*w z<;g5M0)OVHOo;|$IpbcFO0f2{!`{(X$N}3T@mne$=jOK_$5ADI$_=hGLq2jkHN0L> z@KIVInmdpkIF;(8Q(XqQ+Q?;`T@Z+ji}-bj-Yo>*t)Dtc`O0QL$rslGY?+kLv-$LT zAEdhW>ROr7&r}L?Pcu0x2Gx9j-m;=LjndjC5&QTFpM6_kG+B9YTMaZFswjZtcA<^z&DesK|d~0qwZ#G|uKLLJrk% z?Mf#5$$DaeMKB4lCP6c^-?nYj&tea*YctEn>k$__@>R!s)p+Ai>>ziYm)Qof&T>b$ zRo&<4{N_7;$zuP*=+eT5{A@~I7OlFD4iKX-?`J9OSHG4{&?DHysC4(v8??Q(s()i$ zdj}Z;h&ovm-~wmTlQ@9zWu20o(D2=Q)jgtD$C1?X5?8DSF?cS6Eyp(pj4Y=LK^9RT z$5CSy3!0Z9-yQ_XSvFDg@LZ52@GRi#$PbGR@6g_LcT1Z~;A$snY3gR>wLC9foZ!|VX-nMEu=e(EK`F^RKHInp_;)U&PRHd5accELS4+L8FO5mhqRPYWZv`$$ zzPF^hrF2AI@ojA$8pJb+q-BbgnnAb2wfFYzuEm01rz${=?bC4YvXIX_&Q;%fy2duj z@USEXS?h-KX1Ui%>NEj1#Z;LO?4~}@(T}^wGpLSQ+~)?k@J5yDtTn;wc*^{U3*$Zd zRYt+<&lpc>SFuAE>DfBjq~b;S>eg=RIFu_NI1ihD9L-Fjqn**uz~&MPY7B0VmpYjM zcl&Ix@gNOz@6|Mt#8TkSs&RJK4D)%jMh|ap?YJ^3{ptlk;P!FV_(9I<1X@TY4|XwM z78Dp1hc>j|Hd-^M=GBl^ZY+o2be$}R-Zb(tF?e1=@J?TvbKtv*csWv@#xg0EfxOi- z%1a-I8?6Wr98J>;4NiU-C);jB5hky?rgvt8z{yDh^{(^}4Iu3Y{q-VR+l$Hc)42J; zY_-ugc}i64Ms=Y~GI3?)n{;{ucgEEokkbt4*XM_yUUe{c%<(eM)9M2HyG>&<#f~u9 zmFvqp^E$OZ&;fKsJZe_xtsq%lgzkdpfo5UUfQQZ5nRPPrf`e?!Xv^l|gJ46`y?KKz zZ8$)GB~DkJo?7AS0#dMT6BfQm`oe-0H36YxvH#n*UX_o#R~N1kPsjP2ne1C+Gx$%B zMIJ{V*N;9P8VdE^nPN zYABO1beVsv(j#g)8D%?gN3pHH&*~xX*}UM=cbd|3ozcIHsAW&iFj;Iz4XSDspxQU{ zViZbROhwTbsW~s$6gi4H9LBi1&V`{xzJYrhj7V?S&G0G0KCDQu$jv$|pqA6@R-0$B zoWRwn+1AC5NXzUG=%g7!Fo(WSmHDjRy!7Q>@;7;Xw(6B>3yte)m2y1IBXX6bkI#Gg zLgCZrohZw@AtFvIr{E3Q>|*-S^WG7Y?f{=?4RdF6Iuty#VM^+w)PXOf6B&r6!>Q!q ziCQHJ(>zei0a^gq>c0Dn@7~WMs%YCqZLA_W=rFK72Go>eE0@;darM6VkDtAY--9BCcfW`Wg_P+cji7)N|YMiPei;{b!|@@h*t?Nb}|zc{rjc>?yt?Q^_I z`h?u;*8vQs+*fja$uKDHoU;ePyz;bH+R^#XsQ0N_kBP&6PS)VKadc9k@M&UYLgB4j z0@XzIs+&uv1RzMwxuwUH_@SN#(>Zprq?g<3ew$Rcvs|(zLwY~kBZsvL&$7#FnRj8# ze0V5+xB*v0-RLDj;uuHi3?=0X2Le9(ozP#3fnS|#izOw+Q4hSzSq9#ObEhJT+r{BX zhPS{`yP=aKWrAYI1EOhL7m${L79s7N%IAVaq6*x8QpYQJ25nz#eTHI zq95ck#9u{rYNEW5P#)Ac690(j*o}VIN%6X1NgdvLZ!XnQ>+dFR?|YPc7^3;8#=-4z z8Wx{W9%GMp4XtlTL%ZDJtg#Lcp?Ixj1Za$Pq5ssS-(YRS#`m>qESC*Vhohu8(XLNY zw9JLj$^koKBV9{)LUBFX7EPoh910lyT|DisyyKaV^rm<{9Q!BmKr@X{Tl;sXYc=9J z$UWKcFtn!kOT91A(F%c-^f^;24DLO7W^K!Ibd4qw^1g4v5+EJ}x6r|d_Z}w{Pv&_X z3Lf=mrIa3)8C8SM9z&UUbZX+tOz1QiR>9~=yX(=k++N$$tTME*3S{ic9P;lPdktj5 zKlEDXZ-j>!d+%%MUWQkH@FJ5*oaB}hN;L@1)$eZJ9C)Gk!Hj|{bwc;Ex ztmJKM^nL!E(@!X;-6Q_~x@4NiFp`aHX_(;9j7Q3ZJ<(;Xvokhc*4yncsIT|*h1A|T9 zi8Y9+@Yz^$RgG9MC!AtWt%*X0C*84*6okS=Xc#I-@^xJ7lw|`v=L?k6Sg~BUVbH%2y ztuxx4E}ez?IduPQnsh1GF^1t{J3y%LsnQLaBSw#@t)Tv_$60IH;F@6|Tk#Gw_#;!~ z2cWECla`aLYfj+Hca12Ww=6Z~6*qE{RHo*Fj}~y5xN`nQ&t6`ec9&=t?|Y94_uQK` z8a>-=rHP0?oH}Ik4{V*TpP9KuX^VGmSEFfVG6gQiGSED9nVH|oRN5nGe~kQ4W&G&v z9^E5gL}16RZ$LM*bs1CL!2OhG+asVB7iis;3c&NywPQ1n3sT-p?8nx#Ts7 zTueoE&IvMF-yM`c-P`m`q8Mkm;b7pkW3rZo7l_5Ob0sK&L-O%k;vo-&Lv5Syw+&*p zM*JKi`&fAb0%A6g8x&#^h}%0917os@#Dz#Mwbui=uNFf>q!Lc|GKKIUp!}VP1;?Juj`j;#!$7zb9lW9TSE;U9gvGFrl?Auo~Oo9R_kgV++a%F zdY5h3SAY{Llc+k2s+iWhBoClA&TWN-NK>?jV+lxW!VtB^oGI^;O?$MBFB=FNb&d4wl5(kXy*S5csjzPLmuF`Op7Ol=ov7(b6@oAFuFzE4A7y9mE9&)Sc`xb>z&Zg3@;zQ z5ToHsg0@%!WB>u!7?DHXj>vC&`SfggBGB-l>?r{&a$OQdYyCY;pJtzr+w~Dj>DMw# zKGb2V_L^m%jCpq^Q_z8P0A01q>1)N@bj4LjxlpRM1NRTBlTREf6IRDPl&8k8yG$;f z`FAF0eeo}E`a~WR&OVI)p{SH(S*ui9?Do7y^0cwnGnzaz;g8=9oUImp^}J&KF76jK z(61WDfQQMsZ>~SPXJ#+x^b;pE^v%pvNoL9jDzmEj9c`$zRFY!iWr*#Rv&)x{*1p?C zI=Q;oz6n9>^oYyXR71Q?Z)vUo9Sb(c9Y6botpLi5rlg$nc7lD)s8m}6^^ajI zQ_&F%KAa~Lr#y*c?76l2pg!p7V-{Hl=r@mINPc&J>LSvCJxLa9ekkQu$3>x-TFa#p z<{^p(q1~_H*8>=Q7Sb5V4E>gi%{IxQ`V{wmZOy(J6suHCDZ!evPmn=s5LP{(c~y!A z(~XoxU7K8s1J2m=;}}#3YE`=3d7)dZ<%Ud3FsM{kc+)qY%JeUpblzP0@uDQoJNk#V z!yZdJ?NVKqv|B!U6sz#<-*dmka5L9=)bLX{n4tX(^GD1X=)K$_(5AYHUn>&Mz6E?# z_$0SKcYeg*IW1i1KCj=R$QX)puOWBa3s(#{ILF}ea9j%^`eTTgSP<33wjp4-zNG$S z{-jzoohv}@RWW)pPi5Yct{vMK9r2Mu8F6Lxajj;SkN3)7I*x5K!Z7y}#nj0kNeVpO zz)Lrbqw03Z+$2lz2wXZG4qlK)Yiw37l{}s2v0yyrvbPnn8cS31Pe3)fC5ponALG^{ z7|CV&bkgU~R`KBKA)}+wpOP1J(t}?^)T6I^$=-CKx?T@09Hq&gz7K_oWX=@pCMFZ~ z2j(?R;j7F#Gz+oG@*9FzMpDCHWMlvUsH40F4nV#=~s^n&N3}W1~s3 z5eES0y@~B|pkO4Y7d2_W;`?+y z7Oo3bk5QANCg{iR0<+O?3*B7wyu7wspn#q040VrTPV_tL6iG5IkyLG>1y8Bd_|p4z zoP{lYP|p--CqZAU3CuAv=}}Uxmr`HA`g>Z-R|HSJ#^(l|JEEXl`m_Hn19im!aZ&u6 zbu=_!U9XVW)z6&k*aQ55#T5;=Q0+T!Q{@E71@GqR%IV<~9`43gRBC4#T0H<;A0TG}dnhIDTZS zk-6(68>G;GG8S|h&MQGzH|UQYzM!Cp{oWM3pyP!jyUxbR&c`#_hB*Y;wA32Oi{@xu zxcz-+Vry99T-H$mnZ;@Jv@Nl@^nr0V+-2zaEL#jV4M{Ze=zkJ@fiIFUyJ=g0I#DYQ z8L(FW6*BQ|v=`~fJ=gb~XEw#y-n{ElZ2(-$y-*Y11pp{1K7Y+fap>fbVJzxPZN?;^(;w&%`V4y9UJJ!d zGXS;2Fcy{v+s}1x))YF3n@daKYTqQk<|)2^lVo_41x?MEbX~J?Q@3L8RD^2HCb~$vWK9=qKMoX)*k9P>$6(BIh@mmU) z`S+U@>%%V7y)P%vWEVR>Q9ND57%*c>vCRV7uzVeyM_!Hubz4>o2}%g1*MPcLF7>8iWk!^fdi6{~HSs^lmP`6l0ear(y(oE~LGr zlHWR19^{dGfPS4-!F<2{d5_t8Hvqn{ZBPc8XY)6%ZQ(>25Yp_;Ug@N4d}%MtW6SdR z`cufe88#KFL7_oIoh+z+;49u^1|yqd8>snZG*LH!N1uvm)goNF8xDH!!&Kx*j$m=#a>~C)-1tl8;YFbp&%H79d6*R;eD*RADXuO3*HNE_L`)^lKybD z0vw?2&5fOHcZy4LWI`^h#1{mSiH++N^OUg#W3x-Y0+lt(=FZ7=?5=A?2~-vQZJqjv zNX6}K=~+68d%c(kz|H9{`NAmkwFN;38z9bQ5C!O6{1E`7u<}t_RCCYqj_+)nSz&K2 z;62Tx3m15Baz8ndMnr%i;CDd;?p213d^c&G+rYqy@oTF*35!5$<9353e@SI1`lrH za%NW_MdR5`1HCgTrm(9PYOm@F=64l4S|(slbK6JWMLJ{mXoC1njmQ1Zfn>}u+Ukw! zjghpT=EbIBoi{5ldKO);BiCm(?pqfT396m5c{ss+3?pKx*9`faB8mjlelAUb$8eKpX>vUf zJ8J}#;7cn?RJtZixa$l*0$SgNCx5&ba_C$%!=(EMt;7GPQ=wVyLpw4*KMJU`%{Kf)~;E-2j)B zn}uWzNqG71UO!GeSqxw_@TxDFuP!{=vOLV@fMy5&%e$sce8(n#$rdpmZTHQ*%SA_4 zxFg{Kif7OPv3^Tf?jZ8K=%b+A|&EP;g_uGuaUm- zH9O22Bu2Migr^O@y?O}uRfpd7R0=nO)qHHtZ$7bE`&P=2xG9XL)?41G7VwS_DV_ED zUN_O0-5Jg@I$KNv~VMTHFdj);hBK0}AA14VdHU z$uwa>Qm)wSN|DbSV7nQWpbUZXh?<5TKEb=WN9i$;#q#%ylxnMmUhb_znn;=wJ;8ba zN+#`kizm|%`l!rc*JsG+!+Laf`t3ab7?Z0@=Hw(1P*p|x4FS($^uIbS_8gGi8sI%> z9@6fh$mos5*aKbS)6j2jNVvT8w)lqMKDmn{9uA>t&hjJJZkirDUuC&;9cpE&saI!N z)_tVSxf2$DfVT!NO0W>TbB?K&x@}|d_rIibx_a=9HyErsmAU*h4jC!eO~%2?tZHp# zl^z;iBedFe0w?2Hiv=Vx(|K4~`!F76*Sbh0wdv;D6IDHPiQva~QG_p~=3j0JN6Y2+e; z>T|hh(bK=M*K?dJJX(n)WrZPHw2Rk{ltr`juB0cwbe8blt{H;B;4{ z=M{DULa~~RvYHs8_{Y9ucY(AmS;`Nc?uV{-w%f@vpI(jQ$={4I*7d_%IUWW6IarHL z=Yu4bz!xdK>rqRnh>67#t0M}>H~xK6yZ7wKX)52r-c7hu&(**E7scdczMbH>9SB0G zh`jbr8{Hn|e3iyFx7hGpBiVlX79k-aSfOG-!7%V!kuz?B=d=NM`aC@7 zs{BEyM5JHfFcAD!!2%Bfh2c6L83Exdx}cfp;Q!_7e;K&{3S@s9|Cvub=$%B-}2h(jv_Q<^HCII-(0fc^CADt9!YSkE`P( zqh%rOw|NUjJJuzo`=l2R3~l%QB`>wTHoh%Yna@x$WPzxYGfT_qx@&0MG$@xm1I!Lf ze2%U^j=(8>-gNj8@R5%DO6I53n8k;eJ$$fZNkn+A>4As&pWAYrRF%EU@bLISF55nJ zSpiWH=oPg_QbLR2<>aUCH!uM6d+{Qn&xXxX9H;3A2S1C0xqU6Fs=oxi% zNbWYw4qak}4ud}R&&9=2y1mUPwIvn@_`qjOIB^rs?j)v?9oFC<1$6jkF)wIuWdCU< z5vyNIU4p2xZzM796Iu~xvU8(;C?>>l#LPHK$?7$R9qq{ueEjpJJ2s9IucER~J{FCj zrMjb_0`{lMxCFW8ThS<^v|JdtX?M7uhEJ}>|Bzn>CkT3l>6)VT)v3Ey9ij#pzU#G* z(6`HrRifg{Z*3QY>)v+J&C&z)hERp(7F z8P)ZDQoYH3n{j=u6s%rGSEiYsPLap>$+PhOwzrk1`e&|D0kyW&;`;4nGZg%_kkWc^ z1l_8$x(&I-Hf~CupW*%6;H&9#IZ!sA{*@t_MuR zFzwA1FKVlurPI!zEe7w)xNVV^qxBV+O7L-fe1 zkvqb7I=HSYoUf}u`%|-Y+`Fx}SkiZI$>4Dh;OFaQRkzM4XwR)AgUhsPOpBGf2Fy4D$YKDM#(I5rf;ld ziU(C3aUemA*YWKYfgQ5|o5n*`qDH>Sb<4Ta4Yw+j^N!0_>2H}BB~2{|y}S*K&r83z z1W4adCXb^ijGLN3U%Pi3TroUUa5fQi31!O?{GvDDXZ~PD?{W@3VKj+K7-tV znr2Jd2xe2Bstkih&r+k$YOSICAt#x-Vll6`Yo9_W)mc3iRf05Cz)4ExtWk;N%60!T zsJG?boN~)b21d7Ol?rLgsaX2524t9F0n|{J`(&W3PpB<6;FV6SQS>)ej0(72q{j6j zJ_1=_snYQ(CY4v*AsyCjzdsE!F6hS6r+d<}QSnE8-U%ubaZ#Ahn|GT~Ho$7EIo++1 zs}`-C-Yfr;kAq`c%(i_D0Sg7Qnr?<67MOLv!4X_`0hc$HH*6imq+^9Qz@#!~!p_kU z9B|+SPy{R(?EsmOW>6*-wUnw;t$N+beK470fpEo)Hl&S$ieI(h@J!fZx46`H%0ud@ z$w5-Rfm+@J{B_ozJ`7Mu6?PYyCPq+wWsP2&zz_)nt*0_fu&FbdxmkhJ8qTi>7Ijbf zs$P~s3M;g?xgygt%DzYnUddIkDU**OvrmA**w&|FA=>y89 z5B|Ps>?$GK;0jP9&ymcu896-VJ`}Ejd=6Ad&!giXc}+?pY@p*7RSLssqT=VanBWLQ zBhg-RhlMq%70mszn$mqd++|;m^QCjtHKJdq{Th6-V!?-8dUdY{hHN-( zZH3+ch8tqOv!1c9lo_6py5ql1A0faVOj5TQiIF{kHUm3JlQ?%SG|X^LG~YHWZx|qa z-~Y$)TCDclkR5*{_EuHH>YI8)4vZ@une4w5_(U=X^E3^UIPCfwqVsv(z=?y5fswdu2!3mqTF| zP(d}fiqW7}Gz3=ee}14_nakqW3B;QHOl!Jgv-z+OGAqlQSuTD$U?l*a>2R}OlE(35SR6u7rM&i}|dzKPB1hX;K1~aC8o_4jIRAJzlPZj$U)tJ)c#!QZhyw9~S zpU=V007#+D->u6q6(a`{jqnB#iY%E)mk#?ZGV1g=-85P^+{-SCnp?9(sDv^wXwdfFHNV7@8r2l{yyb)$Qr5dp&*;^# zP6~SrO}5n(6BxWe_-5CH#1k^kR*Yg!3t!~n@4Hrsh@Ye5g}yOyWE-%}yo%x=t@W7_ zp?IHcs<6TstYU(jSf-goohP92V_tq^k0Y>SpNUF#iq^u2gj)dX(-=?$2@g95}YKR|H#x6``D0nE0V$1xfD)zq>m3*d)l6e~5FmRqcepvR>qM3XZ1T zd5O(taAHr_uswA{%BC$`-iKowRVSDl=B& z9_dqMQ}4=WPk9T?CT6S51Niv}Bghod5SPKFN!R z2R-=NOv=n2Ih%@DG5*FM+L9*;zLDT%H>V+v{;lb6K{7VZk{4; zUai7;Li~DxMh^b8YWzcIm9OI@OIK(JA8p7DUem>b*ShU(M)8GDk2-jGhTzCT6Vr_G z4v)RNQ|IiXPB;2wZ;MskS+w8&cy@#+`L7G}&!pejTcZGbjX%B5br>&qu&_cJ7wwg!8 zR+$2db-u%k<(@}LVlx`isd>}=*VMT(n`^X=Ll>6Ae8e;3e$7#J<{D+RIy1h<{_V0y z3er0DE-f-gF;vu!gSTh3z`9aj0dw(7@Zp=bRI$P$s)!RCz|Wt%tWnz1-WBJ_xhsn-6BaK9yr4w8Sb6Nf3 zVlw@#q4 zq+uPGOR|l5VC`UnTdwwgeSSSy5?DfC3#gpgiMry~jQ+83_ra2Z%q7cy&wb1oo}r4! zr1t$sENza_EbNfL$Q&>UafGv{zw>vewP1Ffm0GV01Kc8`8vz|Bu#@%$l80I_8Ydaa zK1UN3T`KQcpnSgOlbW zp-?DrlDqHZ%Abq9>ocF%({`zV1oI2_$9peh%UDh~;tF2=zcB@yCWX>NNTp9u{hP() zkeaMjpvxiL?C*@*1m<aS{um$G9xJMYLhUsmMA`jkIicDP~p3wEL- z3ztk1hEhO zKIs<5hK}fGmVX%1O$FB1Yky*p9T=KI>1naD-t&b071@I5cP%>RgB7f?sm-?X=|gfJ z=3=P@3$*l7DC(}VTUc#oGWq#8l1%Z+<**#?oO>azu)?|nxr@%dK@0?}fPe6^KPt)H zPDRIDDg)3JbiVJl$J~N~82-PL55%pLl9L;<-TG-V*dS0lFQ_{y@Sc_`{(2le#ym}UChfzPAUTTgdsfFyW(EfKKv5d<`K z2o(cPa~fs`etY4GZbrlI{D9o{eA^wN-Ms3{AL7D<<>ekn;lG1H3V(glO5v~sEVzXS zzbSa^HDA+Mb*Wo>0NmfJ!YZpjS}ZWt$@Z}9j+|UthX!@x$zj&*7k)|AQ>*hYU4+(a zgEYY_ETNqBvs|S!$u6&-jxatsa z8Z?=4_F38AMums*neh=BG()hH%zNJ%O>@;@JTugF*U#h?6tGcnbiIbpu+rF2h9{q4 z9L$#vRaGtr3uoivg*G=8$*#=d5~idG-v|edIPR6$6uolje!PdiM)>pQrNgnq?%wh( zXR_aVm|I63Isrbyx3Iy@^BZqOkr%Tn%(EFwDH#eJremwx0oHgg5wN)6Z4hS76XRFz zXxb9v_X6Q%tA3DS>rMf|eUr`pi90WF_}8_^Si*1PlKv(QayZcS>IKi71Htt$w@~ZO z8ryMrAKVT1ac#*AS62nZtWivSW1ptgB_H3v;32-eF>hEP@dKad(2?c7=7i%(6h9D% z15#Fl8t(~sst+KU-PIxR#~=TitVc~jRB(cn-*D-MI~=b4P3!fMEoy_aSD%l+%g>2{ z&&T)wS2CCX9{E2|^>J|fr(+365#GRaO8q}x{ev0<=;7&Huh+?6!!aH>wD%Ey*76dG!P@_Vi>XDho$p5s;o;>sJWIy_!v}{Ra8ZMWn?Q K#41F-`TsBCE%-SA literal 20601 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 b1TZtK(X!$Asrz38D8k_B>gTe~DWM4fZzsby diff --git a/frontend/e2e/screenshots/03-enhance-full.png b/frontend/e2e/screenshots/03-enhance-full.png index 8bead049fbf25ccd3fa650698a28eb0f9778fc3b..bf5f5929c5a0c160120b27496bfbeca52609e0bd 100644 GIT binary patch literal 68698 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

OF36qc;1HC>MxGgj51TV%01Xmj z4%tV8)n)nvaZ97eNn24_=C*$ZOF877Z%5)hFjiRWo!i%zv{X>5&2FVkcTOzLWg`L+ zKbx9GA(Sp?iL69`OccvjjZDZ^y%{D|6Z@Ri&j5x}zQ5K7oKl!AjW$aa?`DrA84?ONT)XdWJb9;>T+RfrP|=VctVI&4X6ZD?=iGB5uvmr`mh3X05B1F- z+=LoLSV^#Y3)hWky04Rqh3*h%UacI*wcH5Py*r0?JqhSkYAa30!vaWq26utF_YVsU zVJ|E+v>rT636UAN{_Gh@UEhxmNJUd6*5LdRwa+8Hs^kdFl@l)IC8kKOZQ){(<(zc6 zpqMGb&qgQzX*!kp#;j*6e);Ej%~CPX`{7HB-yW(pNHP3RjR42u)U#3(I+s26tf`Ti zyr`Lm5a@!5j*tmt<=B4}EG|%73sdYO+uh$Xr5Es}s#bP#>P7RA^OWi-?OMz%`fWre zhqQlS{&Ey;tyB-l%CHUBxc0rC!Sqp`PwbN%-E@wcuXI0K9-i}OSuvGeko%k%x_CT< zfqD<@wwIc|MCU4Ml|SaDgAT6g$4Uv37SzXbyYKF%8yt%0DRQ=_#10I2Cq|T&6H}t8 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 K#41F-`TsBCE%-SA literal 20601 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 b1TZtK(X!$Asrz38D8k_B>gTe~DWM4fZzsby diff --git a/frontend/e2e/screenshots/04-settings-full.png b/frontend/e2e/screenshots/04-settings-full.png index 4355671980ee38f360ca4a2e46518e8ddf42705c..1f9682b422bb817680bf113c22ce3293877c7aca 100644 GIT binary patch literal 57145 zcmd43byU>R_bxmLf=DVN(kcSdC0!y&hjcSE(#_BVDk3c)ozmT110o$m=g59Ywxb3XgTKIgNa{cJ)$D9aE$q<9Db00`t{rPKg``{?Su zkq7tCA8%>pF#rH!fSiViz`(=-7!Kq`K7ZQ|WFE8w>ak|Y z{xmK72LbR$gk^vI`2}!E&hS?R0I0w~3;iv|B{^# ztMOrAJo{I(yLXTCUu^~p%lKcd0{8z~hXFo6X6+cz-HymS!^g$|qyz)-oyy;?qL*r0 zd>S?U@-gPjb1dV4X6Q|U#t+rcxvHNb39C2!sR4(xIJ z!DwcW+=6?+X|@BR>j+JzUGwmrtpEpCLl@ z(LWv)0S=f&tjERysS4>3(%E)%MsryXQwk?$Q@h!kOptM^`I&2f}={&jmwRpJ%Q_XyVD4eWd%eJHpyp7wS;u+%r z0NO=^OiHn^18|<*a{?}lzPVfg2%M<(%EEvk=qi@?P{K^@vY z_;c?8Gw#@G-Hz~f*frw>83k)bLOq@IfvCTMGA-m9BH9oq;R=P&6$S# zelDbp2<5dm4bI^yjawsLI`X3R7w*1n%rRWbup_4&X1L=b>A_#r^luB=7q-lTSoDX< zv~g(E$LRN@im3~ z?1&A~mTfxQ8+&%>Vw>e8nQ&F{PLWAZKqEMPSg7*SyxM}9`BH5sXNB=9c+T9 zoL>JmdA0>u)leO1$UZ$mT{}VL>62PLJvbBioiv%13W# zDK7qY84&S~zzH}yP>n>^!+XT?4ujW)520ag;*B@5dQ-Fcn~~4Wd(WU~Z4>urHzd1< zQ?DlyU*y0fW3P;+uH&Cx_Z>zRFe=;bN$PPN|1Paa95Hqu3LR) zwp704nMkqB<$OR%GM{gkmm;H2v$Mfi9chrr=l1}yZl}GUK^>%g{Hyrun*>T^{`2}e z8>Jh&Tqf8+Bqw!7+RoL)4j#{cuA}zuOk6kM*pGvodBVK~zgY~9vP9vpsjwPjt+88; zg>sAM)@>h>TkS3G)@LrOc1v&@-us)E*K&MRL%QnwZ2OPc%(QL2JK1?!oBN_>vnu4T z{(zZhUuEBfw;R3@*v$_A;YFi?IE1WPm5P0`ne~||P{ojmT-Pbju7lC96yX*5xU6B> zCd5ntg@sdn&_`ecS&|~do}-XM2-eZtcO=`*!CR+Cok+8E?;vGJPVOsP5YwMy4_)3u zBmix;o^7s+N=8qN{ajYI?5%qt|5QLcz_=>2wr(s?CHd8+lr21 za&unp*+Bm1wpaiD{*qmp?Rd7(t!vAhw&l_N$`AZQ;cEX{r=616=jE5GG+hX5Ca(Gwz)HT zO4$`3KlSV^^(UMKQ%|2_m!&F-n!R8;wylGj>xE?`QT@S$%Dh5(NlZ}ZH(V7cWgpMf zhQlJLXjtk%g^-TM-#eWnYMX`I|E_SEdx!3#EZdR|pR^WHQ)^UKT+Afwy6U89=&G_= zw?;@y&ea7SUkG_E?*Z1#gpV4eRf=p4rjqw^rN`#@YmUkum@L3Ah`JZi?;Rteo9NAf z1+WA7WFpA8B2`X=(&xQG;Yg8j<%Z^K=;XSC<#O}D;_MJ~A>Ds{S4>SKOT_AV{b2e& z{AQ$Nrz|Uj=W@cPZ@=2r$=%tx#;U1_(Ct+{P3M7MWLEpnc*9W>olGZV=l9vsXPCDb zWxt{y{fhoc7lqn7igx9njl9T;9^VWito~}nD8tuicrh#%#esk6GJ&|rpe2f5&_6T< z!Y@QS-N;kUq#C|W(9TxdMirG06Ql2!v!|zLJCE-HM4d7+*h~lgCjylr-BS}8=iu0+ zpw7f{5jba%73#Kf5Ip(pR6oSN%JrD?U{1@V_ma>}(Bt5pO4MjXKYR#BVONoG*ul)| zeK_R-=he!n|NVZF(D`zH9$u>J>t^g1^*^Pj-qO5PF7u}om zl#|TARBk&D_oU-*kRymLE~-WMuS-jB74RL`Ytt)VVYO8wdZGkH1P3Ek6uIB;EfMZQ za$crHk5Y%-J<>x`_QtG`;9g1kA7EE5#F=qAilEp-w zKyz@WmMQ#qCR5p#}Bc!W{{GZF28Sk_oQ zztiN8v_jX56X(ehHa*JJ7RImPL{vgEN$DrP$2)Yhr0$?>)0n*j-ieS!7dB}ezH#^U z2l-V(P0?OHxAO|57T5`oCRoO%GuZluUzb`pjTRi#P!JGUDS(HU8;4If1ii4rUl-NX z)Orv{d`sl@&iU5)W_NFcG$uSYj(~8{)l%%y_FHJT8#TXUJa85&jH2TYZRu7%qZRZe zhE|?eW#z%0Izmh%kjczS431}~DpF1Jwhu4-QdE~J-DDs#Rw$Dzz|D)TpW=fwa{QrU z)4K;e{-H~0Vp;D!hk>@?&i~4p8$Dn#d!(vuE&v=~Us<(=zoch5_=2d0|W8 zxNDe(UXj0Na>Rg6cUy41q6_3)lY>=x51I6pz%C0|#DZUNVjwzwa$|)YMK)F^j&>bj zqG%t>4gk(fV_e7?H*iDtyVqGU6R3muWGpENb(q2FzCRF#0kJ)%v6c5K-cL;CRmk@$`cow0dOR#0QuY(y<^x01^1q$e>%z%Wg`W;QJM5u=W^b($ znj%@giuxpq#>J)-G6h#^bqTOO{@y&eIBEOk+YMw#@q#=kn%JuT(LrPmS$LCH(<8@x z^L{tK*HXRJspfBl8pSW}%sS`_&JYWg=04nx&NGg z@1^DJ?xWH3V&(MZy#>Jun4;B+*dP!d2aZy%;o}87V2boiO53wyu*DIrse6+xlXy z&w{;-A9{1AXFDu@Co)=I8<6{aR$UnBFCHEb8R+Qp3&30$o&{T~%}BoVHhY}+dB6$6 zn4Yn`4=d7~n5@5FJvHE-@WWlGx_bJz*Q2$&g0o`B7Z;dPG;5oRp+|c=2cvTuDx{`< ziWcv4-^obP<%`lj6-b5Fy#lA-9vyk9t_4^3Qcr(gNEhe+fnFI*oW-L6>*}xL^GSWD zx1B$>KL{Zndt0sfyjM&Y?2MR4d>SkrB6#RNuUod67k1)p52(bssH2D6FzILZJ=T+E3*Co_>gCXo9w>MX+=HC0XOFz z%|!^?@UQ639YrH;hH_RdHTNpT%N4P*G;qX3*E~c4X}%R1Zezph^Sd`%yL-`CgFk$T zAb#KaaJ~H%W(yHGN*#1Ha)6K*O5@d}RYdOOBZ{=F z$b$0}$e{6XBrDr>_2(`(eK$tv+XR{e8f-7?sf$m{O?sLj23K%*`ka>b3&XuRjkeoE z>%I)Q*ariUs>y1j3%rkdDt5sL?2qc8&e&h{%Nd?&OWR4a|MJ;lqODwf9$|*0xA~#a zyZtEZVCmD-jg@^!>W2}cJv>4ygXwHawChA2%rF9|`y_OfGnQ9tMcWp(;5mJ<=8&!1 z`zrn2?el?44B$spD37zbK8w$OH_@y2@r6Im^LX4m`4o69SNoS;$s-9pM%}7y#(tSA z;u^mv{yL)eDZe-^zx6y+*>#Z#k)fhHC&+THu2Nqv|CtG>&|OV#*HkyFct9buC@U@$ z2#g=tqnKc`nw0uY%L!B1es!qIqLk;fx@yJXLE+Tcupa(PN?IrVgERl>tA!}`SpK=D zA64p%{crTL1S=sn>!);HWs+YBSW8|P^F$J#6f^-DeN>u?w6xW=^6AZ&dKhQm*1K3STnU{;;!g>f3I3=#M_ZKqcb6*6`V@z_l)PC?6W8!>72V?nb)v<ZM!Z5JmO<$81yP*k%+Qd!6I;M(r%Mxf!B3`wc{>#GHA6~P&vFYzKn zAPf2iBl3fpA=aOCI^|K8k)YbOB|4x8;Y*;3ck8*lkZW?dmF*tg6}z$|;;XRM(iBqdX#||8l_Iu=nIe9f48J>kMEJ5OzM-+~ zo&SE;Y-If4REa|)AII#xa5bxv*R|Nsw7oIv#A!#>sH&AtRq1bj{Y zHE0HEs%K>A;Tfr#e_dqZo~LDIm}_vz^UI_nBf-|g55Y@9c^;o&w=_Ah<3GVmMV-br z^h_`1%#y(nPmz52fO6a4;;~Pjq_!|y+@wrohQL^Cf3TmbN|`ulw;hQwo`>&#Ov$t0 zh|l|06@B@Nf^N9s`t$n{LiRj}Bun8r*Roln2&IU4Rl-P63nAK)GB42{pWP=t+n73H zl{&-i2f`*6#qb+ky}`2%yRhSkG`19>CCEg2GfSe~>$VYvGH1b*F^o*i(qns2vP(ZGJ! zwvuh9C|Ql^n+AQ}7#7lNVk?W?_#K!Y`m~gQjQL4vC(KYrOeA3LIok>IhWmn8{hM*6 zyrf8FyQcZ9VKY5_O8g0c<#;14KX9R*I2PoWu~F(yio>r>t^ZW^<>$+kkv!S8S|xeTG+E*rmbkB!^GK))p#b7_oP-CWm93 zc2Xj3vg_Xjl~lgV+6c-Fp+B%Mk(J)5+Oq$>SRDfMWj_A4`mN+~YwMG1CN$zhZEbJuFj>1Fd{>9~-nXJB zy^~U2A{NQ?2lEQHMK8cR1+%>bi!+lVr<_hQGx#T}2lE{Va*oZBp=?Q2ycrG|eFkS0 ze&0pOSM4tQH7?3VJ@}iXwH<|=(%Hwyp(fGaEB47B(di^{5khD^7k*rXKX+_;UHj{* zuW;&cckr@3uqu1++aqPeNE4zcSFtVE=D7DQ7)czpj=dee-{&JIUa*UC{l5tk| z)RSp->rY$#KZ~)#_R5+gDt;ath%R_l7N^vIdw>5KnQD(kLEeq)q+4m>_|Y-RLW81k zS+5_QHcydo#Slnubtq(Wq3;SbI&XH;j$nl>zuhGFmS&dbK3s3I8WlFoyYM)5wHI#M_S4a= zJ$4X0m~Mxrx}bh6c+sKz=3%3QbCO?kBiK{eYEU>1|Fk+qjpJBh+o_8O<{Q<*&cMX7V( zv5KW0|A*5^Xf@7VqkW>>PXE=)-Q;*}a@cT6iYV?T9X@j)Ps8;%EXfDq5 zP1doKOC!FpxtBg-MBS<trymb^y_>9+JKV<9Ew=nLfqonW`{FYFi3Q9ReFbM-+u z4K(shcuY;jr3(nZalsPzT!b%Q+}p!bPSZ?$pst=hBL3!=#1pPH)XOrX990#duQJ^0 zg*u9(A~@ntFyw~F25qJ9!-mhc!Z*b;IOT=)1Syn)Ro?X6nTyy7Vu?HDcnw3pMpnw} z4!|x{7vg7Ugiy_!;50|^OnYktd$E_U1sUjaNPLnTX!_j-H)EjTLm?_5JUvMKJJ%N& zb>zE&G*4M|_t{34Y0=${4N|wL+KXS`Utr#{r`7XmP|J#W-Wkj*ITvK=x7eZrSL;gV z^|WnwLK13Tm+-?Il~3>YU37N2q(zr0m)-6=U3al4Ii*-6`G5|~M{5YIOF4v-8~5xa z$@1CQwJm9czL!rtqxLMj3tU&5d?eRh7TPU5LloOud@K9N4{H5hVloa77?EIcpVw_N zt6JYDVR)D4dXj7h_w3wC1(~QjX-)6QS)@>!u(2@<+!uE#V_T|YRz_XL<>)N70r^?* zP_cB4e2B3ciyr@e0oOJOsE5bPP@W#PG{@>R!-mMbCf~k5I^Of4Gx{pBf&Nga`ze!k znQ$cp=56AtP;CTigXg1COA5w$(yrLc2-!|fVEckGuGlVHFyDH|VoZl3rkb|5O}hTN zTAPC2!jyX|2&==zyQYgM(D-#H4(PDbt)bs`CNhtoV5_o(un>u)DkH3V}2R;EXA@&m5t2*vBCZfPqG^DE>io|2;m3MpCw!&_4hG&*h)E zZ`wZ-@V5Vx`u{NS*AWRLP-G+{lR<;3e~MGj8Hk`FI|U_~I+qpdZI&O1*%bu^H*D^e zgBy+EUUJH7i&r)S@D*)>;@Q@_pa}Ehn+?h8MT2xTnAE>608LX6jG0j@>36GUmb^R-2GrwaMVf8*&=zabKYH>9;mYswt9rah&*H)90 znDk3I#DJ91qaF;bvb?*nA83_oC^tmI0RXpLamdpT?e);e8?Arlkxwul?26t%O0bHmXPH2=$-B zdQ(pJ(agTDJU<2JT1H9~-d8e&(wt%nY5LZKLv*kPSL#~o3S$(aLhZ81l@2-TqrAxj5(e~*fhVm zy8#kWYu7ED^-h$$9%8X`BU(Mey=^BjFLxpXNYszwv7$*n|JfS0?C25CF<9Y|@ecGkxfCklIZ0A7TUG zfb;)AQ?SF6xr2q$n-ooe_+&NeIVm|fo#pOrEzg;U6!H7jyGqlyoO}PsL=;LG8Xig7 z%(clA?1<()7qPx}Geo=7vD&1axQf2E(MRpO?l`2|mNb8!EF=lQu3(~y8hQRGYyj_^ zWF6tM#ya2zHl3}KI~h96k$0EUPf3XFD*A9KrbdBZ^rEhsXv;Ez&+mFyg(EoKzKw8aw5_%!L_7auD5*b6ZX7QE`Xzgr?R|BsvX04l6F7)>pZxUmxbv>9C zp8G$K!%REAqsUeW_FBp((`TZ1I@oG!5L($Oh!Db2+tX z(n~CQm5#ira?(9XE>|G9hbm}D+^!V6_gUWijh~DSl3={HsY%iLh~!A8Wh5sKw@j^2 zf@)bW>124*mjDV@9)ro5VrUmL52&cfLCe?Pvje##)2b|8e|C?Zc#Y0i;}_C0B;auP zfxilQ4b{a`{320Nkxx|CbePtB@`JqGw~{NUquSK$@CVDi-{aRpE93P}&(P@kq*~N{dx_{Bn%37ZX1*t!4EGbo;K}Ozg2~2QAFL9M zG1s^Y?jajq<~C%p0wHtz=_T>~f}-OjN;@9Z&w%H3d0&V!h0>kV7SS6k5|InyMP*BV*zJbscb zUT5LHOUBVZxgjmCcBEezhNI4Te%w{i@fOEWzS^uV>GbLd348p>O)y1F=UPs$)>h+= zwK6w+SmAFd(D+Ym)D9a8YDp|+eXUOJe)7pBo0GMjLQT+rbfxTM@W%TzP`?tK=nd^6p#(<4OEbCg7g`HS4#ob^Kd_(z`t3Z83O>v)kc~ORvfrfrHEax?P%I~BYY+#fe9w<#nHOr{?ys)5 z&!gpBXlCu!G4#|R72|vRdo-jw6yE}e*_c!cYUCC{8<92s29PV|SSR2_ZYJA6$>Bc{L zHA$|fx#h@F_Fd-9*hM4$*SflCsK@P@mld zGpY7;nbFSuxlHv*Ef!u;qD*Yl9DNCB;uEw3)1o`+Q*MJ&)G2Y;%$9azttovKQB^jX z@@IDk*uO&`Fa#n^sIA@9^}&0!yaX;?D&6l@NgH)tl+yZp$#Aa~3x{R-UlZaJZ49{j z7ao+oHnW%eDa7on_asaf6hF?TtzOJoA)>R}KQUr4rnu)VwfP_iMa zJU~|h^s~#2#OIVC)TQX~75pV`5Er-zkF42=49{n}8sx|<*`>d;$rvEX3QeEAH zvwT>Tfs0{Aa#@UlkBfF|VUZ(12 zs-oQZoSBQg|Fj9q;0Lf&Q!YxYuJ--ZkAo}o@pKml&#}<@cxgOyA2l9t5E!UrvYYp# zQ!hhzK#Mhhto)S)VpwgDyCBggORcmm4`s!o>EB;>#;x@h2K&OeFvc`;)6zsEJO3kwS~J~DohAl%;35s02on8KNNtCr98 z>ihS82>N?~5u!f^q~O;YdLx5wJ`h!82oriQ{PBBxUkGEYCigRZv`jwy0bmADJ*)Uf z!d^OCBHLO3R0cEW_VT)3?!g1xP@w@@B`0TRdbGf0$my1ahX+1cf&>;IQ{~(dkS^lo zVs8Fwhd1BZ5#E2eK5_~4PkhGSK%&k5kj4kpbE*FrGp&sL;JNbM$w)dhuTk)WZT;22 zA&3=^j2KO`bjSAVC4PaPoCfg3G?0Q@>WjQFU|S#INx&J^>Pfo)p^C*AT~EzCMjjPELM?-yOy=jOr0bDti}K=E}>1X5`-{2Ved zE6;xJJwbMB(?$p*H&1OTt-y^IeXlR#&h41yj(#aHsjWU0^XWK+DpJXmwl}UN#mC$> zZvMyVZJGj312_zC^40T|sYN`UP)Gy>aWTKzr63D*a&mE{l%>!l>#wfPkrHuErF1tP z>0tYqMJAZQR@kH{O8)HZ+uNI=o?^cB>b%z5l~2znLB;7Rp1iqQEz8-O)m`>mk7mn^ z2q9&DOe@!#Nwt!U?7Fqao}=CLJXT_mx{urN4QN#JZjljAx%I%3;p2l3XA5&tb;u&3 zhqS|OmZfK1Os=#9wVvh|GPCYEl>&R75sTKaPf=ptmajEW;9vN8G*_+4*w7TjKjk3R zAGcjXLP9-H@%n6BrBtO5XFN~o^z@XjzDweHdfoES{iyG&gK*bS*BH3#t8dEfgr71) zOfMQ)`vjX@G?zSmJBy;!xxwsO6J+@#W%-tF0!O?|wyi3)wpa~K zQY#0YE zXAU)s=SY%FK=r5n=}5n*;7Q&4<20b{M))Qd_sq7u zH9js*Q%lRzPftTbY7$c&6X<*V-eq7$(yDAhxO&Zcq1=`q&hGH?i*h?uT-*TdHLyBy6Jh1bnCe_-g#mL zwUG9)5Iz;N(+9bz3|pI&7S$ys7E8us_=W<_i`n8SOZjsRBU&*HPR@^ByX6DIc^^lK z++ChC*L?bqzNa^00Cjf=k?7e-C~3JnO@lu|yba}lnIjiVNG&Agpd`aFa>JlGBxtSa z<2#WNYc7`o;@)?Mi8l%+ST5%A(KWxr=WufyisCzT?%R;kf)8SBRy8+%o(=367QpFau1DWm=i3njA+TJ;kR==QAIc z*>+$MVf37k!omLO{xWApF(GbRw#)LKti zG5Hwh%JcQJUFp<8D&$&+0soK709UjZktWIkPs(DwG4DvmrvHhOFi zMomF(6+M?55-l=v^ZYM-xV%q;Z!za>cT;7pRt3C=2S-H}6YqL?89Dk64OZ2)(uDkW zCzvc;qqdCk^6$>)%Z<{y#cTJ{=+_4oeYKk^)c!nZ%fHrYFSW}#dv)J>d&%1NRFRj1Z2bpXkq;RkQC!QuX~5EsRR{;un*Ut$nDcFL z<7!T$Dz&<$y#CDU^%Bk9UO`LEcsfsZOA()#*jiePv5&Y(%$Ri^qh zX^q$FsC2~sV9|cF-1=aF>brMwCo3#?V)>^6K4-L-mJn#&pt2~bH1c>{B>{^6REUoS z@6r!B2NZ+G87`Ozi@W$;sGKHGD`y-#82O}I`3xh4gz32tbAvPH`MnW8)6`W&`H!y+ zC&KNZg>sH%22?zA14*xy_vewL^Jhi+`Agj1OSClp){rK9Nou`5ROJ7 z9+8_#tqu6%G*#T2m9q>6vDOIX`MXRnmL;&4vU$a~*W2f}<8v@PEWmQd2`p>c(|4;B z>;qgHbKj$i|15du3KroIPiSS##@UF*C7}`ZK66s>H@W@ZXI{mAOvph7I0zRj#-I_J zV0&Rw_U`9QmBj!7Lv?*U_@HsC?Rrz3jAL=CBjaGjtqlRQsjd8NtiA2mseBwRpp!X>om(pLHCB$eoMLBtOv#}Ash^i@=HGaQ7@wjFTvOhjgzJ>@{!uz1~pG(JE^wJ0H1dnnfQ%)z;jwgJHmQ9d8wb2u~TbiMz1h!5n2?78_-X_=1WpbIIF8k+E zcelHHJe+aG@XnN>r@0|?7)WAaB3rh$A(Y>*Re%- zUhZb0sdN@iANC97NEftv6YT&4$?N9A{7Ss^CQ^@o4YJ@iT%UC(JO)-z;BFOkMeEDR zM7Y3e9U*hhMNLUX{zD51wuLOYjG6~VHujE#i)?Cm94B$e{WOmJ*`+1-}77NyXFU`(HR>(L3N#toaOyYH4ZkQflq zoCCdgbbY!-#$lv*@PnbR$CU<=h-T%lMMb7CGvwFr3+FPh4K+5OQslkwe(!zItOhL9 zVxG5A)lZ&e`>i@-$gex3*`utfyJ@4!|2n1b;|s{X(B0jU0RI~mrb-J!!_S#ji=UvaRyn{dr^HcIk)d!9FJbgRG z90qMcGypyGeDmz59Jd~b3Eb>2_5{r;c(alGi9v_tf)X>VO2gLrAy3cmTg4YqLZ{T_?15k<+^QD8+tV^@V?{=XrU}Zf89vFp zGUV?3Lzy2QBe}h9ig6ge--OH1CnVrlxMj zo2_~3t{E326%qO5lqZhbz4I5-p`({;%~^KBqL{md+RAnkj|~4-%f;DYTPBC3W!Sac z&}rH5&;-x9J4eoJ^x@#4DSZJ~&h;4tbu#L(5vR)5U)S#p2*3&F#YC-i<(hS76>QtS zc~)?ypNJZWT!+vh?zI~RQ=nZ%DFKsVjq=U$`2>;6;H#@TFdiR`trLwn$5=6tnN{Ds z$0f&HL(yQJcn^RqU^-;s~aLw8mglV7z%g?z=1`$k^4ljq zyQx2toYkf6mpndu?MV0j_Hu*WdF}c&-nz)C6spjdFHk4M)SQdM*QtAcNH~YZX2~9) zuhiUkW%P1C78W6V%FphdskP^}xa@_+&C2+m4zhvscJ>48S z7OM5w5u2UFYx;h=61v`t`hfS6*1t_)}ok< z|BzvAYcPdBqKKs2bo@nwM6#=V+LLzOaHT~Vu|Usx7b!6JJzC9h$%>y6WOX*Q0gFqjjoJy2o&1j3$oh}m+> zQO>%cJe}rI7U>Y};KLN%>W{dEw#i>M!xWXy6Wkkj_nzj!Pzg(2PubH^c4Ns_GJ@*P z7j9Eq<*gT^we@s1jTMKTL5{+0mnZ#fJk%-0E*|zGo4g%i6|;6Wh9I;pTSXo+irylp ztO`|=G*~li(iDoO)e^A`OJ`Bdnz-g#o6^SA)$ zd<4CH3v>@osAU(NkF`pF@TCP20F=-znPD@Wy89`C`J(`w$gEMPRbPd8jZ4Gh&vz_7 zE1y20-2#|6HX5RhA_JT?QrCuUIyMx0d{uAQ)Gwm4VC=EvK`WPHl zG$7VtO#Fv@7}(sLKl-tx9P$Si`msRJT?)2&Fvc-MXyb_L8SGe>__B?MhK}w(4eQzx z_VJ0z^lvn;lK+&!3D~w>m;&_R5Ij3vkp`DJ3LvhPG!CO#7G3gwW)jhX9_uBy6cDh@xPZOfq1+((cqR+SAKLTc{vYpX zhBe3F&nG%S^Zz1SxFhn6-z0SbM!OHZOEAn7|F?*M28EkK?3us@&zPs=T;AMSM#eQX zywg!8ir>sM{OlY^A9;`zLZrM+ma(K~M1*O<*eUi?KN9iyQbO@$SsL95UtQ7NzKz?t zt=*LVv*v#a

eRj0u+6n9PMK|2vIM=KId{n=opI(nWvooQ3cqsW&ka-*np+YCvJS zJ_=noJeDO@pjPvneFb%D6HjR#n(M*zTbtsX%x3a$OEMR#gn2dEL+2X()V~v}W{1z; z+Ri;4D`E`AWElH6^%C)SR{~~2{U5YvEzMpFB%X@%RA%r0PS4p@h&^MqMvQ4ZuQ;VJ zXV-JI!L7y%F>io#+NL=C)Jfp-(1=I6#}%TDZSZa$Lue$F*6PVqnBMm~HKe)L-$)pG zs;Lpg0s4hHEYC4DHYFAGtA)QZ4?ZrcizmL72$zGgY|CkY_9DobtODgK@2RWDMeIgfZBa`SxyVK_P4E06T#tp z2*(iX8J~+)y>YNO9}n1y_VQjd4JT1p9p$=lp3PTRzQnkA^Mjj)g&Zu7tQ zZ5j_7eY`uwu9mDZoG@r|!T~ok4eT2vZx_MW=*?&H&l0Ks3k$#+7;v%|mW>NNPD( zKj9{Asby5<^Dz!lA#lo7R8&`!Z&BYrcnh?jWUuvky|~Dq-qtRFs@5vHi2L>|&_t@O zOXKbI@8l>4J|F+z#8J=t(-UAHnPDbk9NAUPg>dIvV-D>3j=?a?hBrxsrQC66r4r7&bURW;^RF5w{&SnoHh)Yrx3a z-TIO2rc%_$Yp>k9`z?mqNXnpi+bq}5Mx(dzJ~mDdk&*G*sR^x>rqR-py(iQI4!1zp ziC2g;!*xra41;k;6c4KI{(izvKQSwGxvUZ+XrD97LjdQLygK~5pPV{6*3byqA=!rD)f31h zd>#`XJ$c10M%-g_MbzNpLWl3Mj;#mu@XPw!ujnBQ_TC}X#=R7XG)t8%l}N}Lp2s(n za}@}b3c$3IKa-5|k5C>EVpi^P+FQ zrbhpy`A2YArkSpv2JH1+Q|ImD436{9l*iwM}Su4-?!XcIys3w{Kh%N=;L`{^%&YM+m!*m z2Y!d}>uGHzt0y_N(K9%lB8RkQJi<cdsN$x?2FoGz)FPrT4t%&r2p`nXtH8l zk)B8Rhb=TjZ?2x_JshZQ-a=Uwjq%WUO%AI|$&%DkY<55Lh>f3XJj-;^0Z;jUEG=9N zd2~}`xGY-@&zaThDOR*y$gtcLbs$60yV{6Y-}Sk{pP~Pm!CyrW{P3ec>Lkz=EuAs6 zt~J7teIHNe33+&8xLmLb=ibpv|2nf$^c{a34(6^6uk`8dyF>h{>mIyh#bLZj?{;f& ze;$}IEB;Oq%ES5p*OGB&aA?W+Rb84RRoAITTg3&plD=-rDqhWmioxgWehg%c0 z%Ba4ub|HaBE@cs)L2tw{6QYu=w>f)F_|k>^5wtr0Uced8c$bd|;)W;vt~Zj36LBNX za|pVK3V(5)GDMLBY>48zANW7Gd+Vq=zHVC(2_%qUK?6ZTaCesg!Cek6!QI^<1PFS9 zyK|6(ySs(p?i$=RICPQU_uY42_kE*p_vkU+7+rs5ggWO`?Y(Q&T64}dw_=rv=*w&5 zdc>M+nMzjjDivcRk3r2-kMB;0FU_&V9OS<=3RW1*k-4AoQbTxdx%*6Sqc@q0y9hYE zK28Cd2atQ{?gzsZGqUIN>pPv2(X$v_)ZIOphOY*?++u8;DNa0she}90ZAdQ@e)7vP zvOdL2cM{cs!TIS)j3$YHR>nmKV6O1;#4qk471{HAk`{SiHwoWjwCp(hobAQFb?|iS zIA4+5csg0TwVEnHG>ep94BcG+DnD(cLSU=lbDxbTbTjO14%C6bVV83I0cPSN_px|W zsIZV^#%B+!X@F98PK&PYJ}xT#&%Ku`dsJmjiLoV8JG?(NGBS?&Yo!_6f&3=x7>Q7< z0o@EDY%;2b1l#o7mWQnmNRMrq(fmUM>(?}p$^I56 zq0jiOv}{R*W^|?Muu>6Hf=BOL(Lrx(#R70q)~%U`g_I4X=CDHCNLWecJ7q>ek#yy_ zQdKVgM`bSi-B69(+*DljZkqe7USC!8jAXXct~Sww`_-5LsgHf076$9ZFc=91zs|36 zj|NMaUga}rG0Vsy-AOq zkeBTgcpy=3azy+4{eia`udu_ozU{c;2v8bUl#jD+jSV&o9eV`K1kLL_7WkHqK zCfffnpnksh%h?RfMyr#gbvndVsr5sr*1vncAcKC2U}=#|UqjnofpK;ifnlg;=?ik`k(}Imys# zIqg{V+=01^j$iWQP@SB0(-2AbRu%eJCzxZV=Wa(Gt#mg?g~+>q9c>zcn|7$>ih@wc>{Pb$~$>+3@} z(SSn}9E*EF|LQxkL0leWJ6#n@L-y{S(mL*uEY10V^VbSk6}T<;pzHDt1W^E|1CCM1 zqYWGi%+(v68nR7zN#vMqeisiJZKrjINd3z#IE!x`nNyl&L!5YT#BdV&jT}VN;R3A6 znoABV#C(LaP~N_(|12vnDmya;R}Y7#mdy>dA}FMmT~LtfGte7<4aMB$4l0;6M`9MW zR0`WI7+Pz3ef`yMGb6}V#;5?@uI46~)+y{O{Nhu}w4w)yX_!u$kt3 z9XDf+CWNJ&>;7oi-yE9-Wq`H4rR0Hmg#Tw6q*S%QwjRAis?->X4}or9Inr|nGbR9` zyI|^_x{T_=XnLA6E8eb@iLANDFW5j!w|hEY3(+^uQ~2<~eM*vH($c%WO6ColG$s*z zWis2$)D*F0pYKfnUWINQ?6m=ABxwf@e}QK!l#EvIH$j`zZt)58U`i#7+cuXnVNHj};{9?4IBd5&ipI|9=ZGoa%n16DeOiw^CsdF`k&z#EY zg&qboo7lX!brC(F6Y1bgNSdIA(V0oaO6SW1HfF-h?XxjoZyj@3t6Pa(#L$n)rsRLi zu`HiSzmQV-(6_?&?HCv1gOa3!)V}Pua>QV<2xq>#u+P)83OcHDEKc{`h4OO9_LkHG z*RFg1jtR0Za$Q}d-Sm{GY0YM`$zs+m`gZNPJ4|bVoz0H8Mbf#>ad*W;DNM zZ;3-X&BiAu&4MGn??ZN&^jxe97wws@Qa2J<@pEb=`*4Hh!%oa-=(r{@dJf$_e(Y>v zr$oip#L>4ZC}z2qP32iGq&c4Lzb8eQG4<*We;0G_wwFD4C>U=pb5Uf;=JpMtW-FJN z&vOnae_=d^tT?oM^Nu^g>@XLCfQ?7-0LDa5>IOF{+!w=W7wSJ!&N`9!>@=%Cqf!@; z+9z$H&*J$~fgNQT@a{l7;zpUCZ#n+6`rVFKh5{3gsU5y}A;*pe-YCHm$&Y@{^VY$2 z7xxGxlkWM&&1&7Kl`g*==bxBkvnn>FaD1p%gEy9pZq;MlvU^B}?SJ<=hWLFG6>};m zIZ4&;vFv%#tp+t(!!7B%WKOU#n;tOLnvpOd1-<<7KTrYtiHQ8qn1Gv#-%BFkDdC&7 z@ezMZgT2W1FCi<;;%^TZX}Ra`dIkUhamzpd{BJmI&EnwVcC2;?Gr0N%1i%APzdm8- z(xc?hSx;E#?X5HbSP%o^o>}CoIX|$X|$Y4GP=3~lVDs}m>p%n z{fnccrzZ}2S5g=SHX9sqP9@|t{i@j>KUeLCQ_bM$d?WctSk zQWZG(Pb;0ktZ?`b5N1y4QUJGmg|ufHHsDMO1LKVhi`P!U#l^MS2t<~8FyIHaSPnoT z|K+f_lEJX*c=hsgoUSnoh`7@&K_0t}U>Qm#_>_9N5(`df zJ=t@W{rwhK{(R5)%1;*5qoNqA7iO6(A*~a2IXBW*^urg{hS2vupK{;g&%NT{^S}c` zpZAE;4*wEKCwyC)hJkHLO~)!P9ku#}Zl2bxBV&&s{@KY3PVsRq=PE|l2*s+T2 z%geGp9N#~iS8W^HPnD*9!6V_AT=lYdRwG%Am_5@3Ke-VYmhE@$T!}F+3hX-SO$8R5 zzcU<+meLR8xpOZWU1Q7nGuv9-JfgSYH%&A848Cr;>Vg-+tJFuq+ z$h@cbPk^3V^QkErz6WwN^t+AjBtReKJ^JZ3GFJvQ>>^ngC9qVJ zC7ZLXWc~QLJboAxvIZ|0(D$(sA6g2XJ6fR(BU7TUyr`(84 z8~wkr0AIoAf0o4&>;t}ElGFX>Nl-mgNJXoWo=I!Cn*iVD>GxoX{>Ltsw5(I%mdFcT zX+y)0_IN*C>>LOfNKMRZa3 zxc?$-cU^G5AqkDySP*x5^oq}-^pV|qzs!8lKj5X~cj=3;kioEEx#`8>r605KFHy-n z%)`>_LxTZh9KD*m84%&e{b8iph`z!X%~tDNb;axU;Cgn#6`DiIhq8r}HFyF@^dEE3 zxSo8Gfmnz)KS&3ac<;y5xIkH}YIHLDUCyQ+L~d|7?MBCBtM~T~4*n7AGe>2zZ%_s; zKD0fKahFZwwSDlt9s;*DdW$wY{aTk#01I5+SQ4;;)0ECB6<}Q_C#lTOf*Cj850s2w zl^e4OI$Wx0#dL$3W=e-XV6JbKq*IWElKx$tqffWgFcZ61J>SH2EPNk%$aAto@IP(p zniyJpSB-tr&NlEB^mpcY*gt?S^tYkH)vdvY?4?4ZhD>7O8}-`euG1jIrmwxNE1;5~ zSWvE>fW0<4QvTVo+W7J^YY5bOdcW!2^7u_*>z{3~USbTp{kkDoR{Lb`D`#@$41+IY z6*4v65$?0hz)_4nm;BMD!7)jgU{5-aXKU2$0nsZ(5sdIe6nu0s0VmE0PhFX9Wcydl+V=@ z?dD6K2Od;!wlzq;*eOq5y-IYewW-|UVYePB9&QY}L@1|J?yXqe1dVridsglB_V4)c z{nd@n$;kz?8d|B&+E2ZMbMOd22iC5}qcxP@wbXvK-mZeAC_WufwsA>i^3c;K)HrcB ztI99VZ#%#3;}aYbIvetB<4(UE5-VHrtu^kKfj%}MBLO!&obyqfmviHAKv`4%uv+EN zDVEF>vSA06vTo0-A3*HeDt#P#{(=Eb1%Sh3Uqnm(HXHhl`&tYUBEA_aT6mOb29`L1oZf_+bBGChm)^GN1bxl_MMFKjBKSo#yjT%;&3a5O{Y&kK_g8~ zGE(ACdc|-3wW=<_^y(ZFC4ZV~`aq%arNOSq?J6Y~^>eQ&P>CBai;9!im?wJR3BW~m zYUK6ca>5%cnrWJpg%plzD*4T$k9E1C$+hdd6BmJP!3N_tBQiUpv zE+#QJHI-R_00B4_&As3IrR_AXAi*0aEwl*Lsrq%DwUtG>r zJp=KJ_(~yofGGqBVB6IsnM2pt znIZR!y>}_l%4zz;?DEp!{V>i}CUe7u7-$A(>+QK1oSm=5kF7MDbXJeAxV{PDt77r`f#~Wm=i)Vt>*p}1tL=qt-=^yneqCOdO{$i>;SAiVO3#i+WhZ>q zq7*_=%&q44;(s;|_Lq#`&{sYXxTYmHx((IodD;vrd58{a@eL(W{mlZ}2}ko`>uL|SWKyWs0+NKfY1 z+Ai`tb`7ctVn^pYx?W|{8EDYE}x;W63A^E*^FQepYM6cu{5F&TjyT$G;e(H!ENSbe2gs zcMTx;@#cVeJ6NW1kC!zUW1t^k%0;b4xc7ZE1%+y9-PPnk0W*V}v^ko8=;xgOg$LZ~ z`7XZ1gUKYIuUxV%!+V&yidKF47{bPxIxOpR1VMAf&O%`O`w%=^-r9-R{A5{i2b2u| zWEJ@UL;L(knE%@Hb}e!_3<2f{r$u+fs1lfkcJHq}28x0}#K@EfJ~{j1S+mXS2Yh~! zvLJ)Lq!wrlxuAY7vhCKs8jO-WtLp3J-{5aZJ-A`O_z65W6kzV{gGx$Dx`N!FDL&8i z|4i{=0aZx=xZ{h0FJLF@>A7{X*6P*D8WySv>i#+ft3Mwrxe=N{r05at2r*A+D zF!lu;$`=tRltx<{5h>6{yENuMC;zpQg(_@pnMb%Vw+PQV`OM+Wlpz!0y1>@|%;Y`W zA8G0HhnM$$dA_7~*#NtT3H;x}R}mmp2RI}RVCeoH{~Mcz{~y{9X9CztlTZL+Lw&si z*L$1+|NiD0cZ!I^IQoi(_i==x(EO0~>}p5n+1Z4JGf;W$ z5Ci>Zz>)cK(BynHizr8oA9$D6!Gns`501CCbe+XMf z=*wiW#u#iXT&YkARm_1*KOJc4BYy8w%W1dO#4fw5<4xqNH z_20$d_cix|DH4uOuKbvzu!-NYbJ@_rXAw@~HJ8jTO^4>Gop^^?R&rLN;j z4Xk=t(1Uc(Smdu+phWfe&+%mW$o>wbCgTyPnOar#+M^53uQjks8n6i)#YYMo_{|am z(W&?g4j&ER5aZjA6!c>*wQ6%?P59-Uq`>dfCP$FzS~XX4ak0|1bg zrKJJ9L|{DT&f!w=II2k_A0M=b+kM7dHAIxR+RX)IKy}@>+`p@eF90{oq&D-x!5!OK zDtR;?5^^aNtko#7JFGWmWMR(sCL)pNkXaDce2jg%DA_4tAG9aEP1ZzCv!ZZ(uGe~g zbhXLT`HuZAE{WBAuT z>h*pNBSL*6n7u-^l1HJ@BR`FCMMWJ>klZlN^tBm4cR)kg!iGv3GHYB9pTV zN7<8j9lWU^P*akN7*jRP&Aq3pGx}xI%9Yr;YTl7rIaz%mh5Z3q&1Tz1o`tcT)D!1~ z;xx8AsJAg`*N?`nD71Fug{r7i<5X&SJDp^MedOo%xumVLE*0>U10L?>?;0&6f4z*x zq8RZ!xJazu>E3+bwKsGFEy`oIU?Vg0P%mZx00N_eYfVw`6$A*JkUTFOK)ZQHmbx-A;>mr6%hpLT8ihZIe?LYFxj@Wu(P7 z3sfZ&ygyo4!p0BMdXEYNQ`i4x)RnK*NpkA;ENEv^zzn)=(17O|H#q(a0QQDB4oa4*OYR+ts3N&PNB&Vc;Kpbm*V4{B`c{#|8 zApuepL;D7fc%?RT_+RaiAaBmDv2ARaPfzt;Hx7Njd2#%ldAv&CKN0`c34wOR*Z++L zK%0f8b5=1U{151~D0qOY2gpBFL>Enw>-c(Q(ZnV^t$;OT2;R3{~ywVkeLm{iWi* zSedSqc6Bh&S1co1QlBe98L1V^1v(();&*92hMtKIrdQS zF^@S4XNcSre5yER=pJ{|Hxetw=s+CmX3?7~F80H*@7LZtF%89j1e^9;1>GCQ=+FU* zMy8mx=;T8}9Ck@7y?8y3O&>7|9p@w!UapObLe{)M6!y67T(2AcmREm9%L`!cD)q>m z`bJ#jme;^HW|3Q1I!RGS2s}L9rrp=&<>CdtJ`8)EgN$u=ki0-md*dV(_EAQwUzp0o z=Pu2FIBwsS60qBCB3NE(goSB8%zRrW!8UoTUS`XjG9(g=+O(^EbK~yd&c0g$g(6!t z>>%L7+@gz+HQprP!YGJEAagm8ZM(oRU8Yz(EOaeU0%_vn>*6-O9I+c-UbIToET7AC zk3Cm7|9zA#r9zbz-wge_u05(xK6PXyDP7?P9IJjz~@INxuLf@Y|QA|9l-$MbJ2qmjFHmmzUmNU{dHOsCq6S z_fq>ud*_#4ISs#m=}}niwEBq%ynV2-(QU%Z!^Jhburlv&Y*`dVlMjJ36c$S6n44Km zIsx$k<^l~!G=ZZYVfu{>etCy+S+7TV8xK0htPh{C#w5l2@*eRo0o&&fL| zpH*S%kN>~xRein!nExFcV6@}B>P%?Pz-w=DDbKR%qvS;xX~QSgxf9Y1{Kr3o@8@%q ztbZe!_ronbov?a#LAUzx*~O#?GW-Xz8f{UEf6(oeXIk`iIR4G9(k-kqZYKNpJsL<) z9M1q=-baa?gA0m-_ zwA5DeVvV_S==fxnWM8a%vId)x z;{Y3iB=RW>i06a@EePLOqg7?#{0}BmQueCk@_deYQXdV7#$0Ysmz$Gh78B_&FLT86 zY@rk&R5Vq~&w{6+O%c7d|r`QQdKy0aO?07OEn53h?@h_3zQt zT7!>6+hq3>L6&x#(GxuXj1T9tDp;-H7_sEwlcr`!qxbjHQYDdQPbS(h$v2^0yc1yP zd^R()g^|U-#`F1n-0ELEgaZ*padGjQO=Z~@fe~WkF+qcxaoV!oUOCOhD#izi*qrbF zJ~2(GGtZxJnhHM0xS}415H*aGD4U9V9g zy+R2+i*BB*=EDZe$^L%!xnb=8&d>_~nI&Eflc9*YE!zpx_@#E$p+oXJMI|;?r|+-x3Uj z)_k*t)Zlh4B1=9W>xMvWqaup1u0>Rj^y|YCO0J(pflAcQkZu8BXay_k7agF%XDWdFVm; ze~e9z=1*^UU+0gwQOk1k?3UTeiN5%|^!^f-ixOc@GYiB=s&2C0E?-BZ{chG1uUdx~ z3dcCi0RwO4_!rhVERl0mj1@woP+g{{6OD1Fxq^X=~@@_ z>obB5UwB`W!SIEgWRRg`e-RpG_m<$!_l);u{Q zy+%_R_t{YFHg&6F7kMRhe&V zv)i!y+AEM+?X)TQR5719;~H+jqQTgFA9P&MKCay7>T`(z3+S4G!ULx66Fom#am-W2b2 zV;o04K3(P471HSK+tEC<)^7|&p+)44AFJtk8L-s61$v}j0J}Qb^lI!Jm<`neSes?* zgU5}`TA+7-8ND0BDWf@vGkI*xe)8Mcu*w@E{$)(uC%C_U42#_G%40Lj>2ur;J;-d!m)rA&-L1ic)0_lO&K0vQXmvvTR=3sM z$(CNi_QO${wl?e=pslOQWL2=a-pNWG3)?#a5kAi6^||j{)V(W^VAStF4+du^&WJ{< z8yxjwT&ic5x4JZZ1)HgfX9PaElhc9E)>hC2w>$TOT626}YPs9c+0PHa6KMq#=ifH> z2mIBrLFK~R?1Bp_?A9mv6a=8NS8xCV)9yU0o0H#Lo^qp`^YQoAP|B*8#qaSE`Ug&0 z`9p!c#CKI5o5X2gZn54WUk)jW>7dY9B&hIS6#9^6%}tXOu1q{$@;)atcO(`9knt_E2z7<_CEUmf!F4 z#dmyJtbVb7W4l+DwnW%+>-TRA_Brz1^?gGE&{mIn%C>UvpGGVi32wm&06>lSPuvDV z5XJwyWGW?d=6UOq_J@ETgSG##;~2GI1kw_}yO#;PpNg!32lgK#U%Nh&1c)S8V4(o* z)87dHQWzAJsbM^y{Ox~2LV*h-@_K{VWySIQO`Zf{J?joH6`b1u2M~%PviJ<3jbzmI zIW-Dohi|HX12}VZZ}M>e=Qy7dDg`n~T_fJ~~ z_H@^)>Oe%`Cy4+50DJylX0jY5RT0Uyg^0XdfVrS33^gyGhzj(sDWgO1^npx&I@$Ry zR%{$M@#{|rt)awT{{9&#cf`JVn+~ulTdDq&*=(!&S9V9l2fQLUy1po2=N=9g8X_&i zb>{alX#SczkqlB1Cwj#*6|x9lX@UKZiK5d0ARQ^md~4?}x!ZrgNUS{V9Zk9^K9s!i z*q-`gLPY|VC`ORPp6L0#a*Ob6Y#OboXt&yZky{P}rgMixF(EuE+B1(CdcQ!7yD+#7i#w^h61jaz6xP0vEFY*Tx?|)gr^q$T3pJEbbfO0Aec1#)FiZy9DqwA@ zIRx}L7g};m4D4Fet6VHX=m^Ruj1#yO@k!lv+YT1_BJw zF5(ZQ-Z^h*l7hl7aZV&5s_(1Vm~(B8BVB9FFJL<<{*49j)$u0>BjN_4#7XQbHKQa5Hd$S@tyPAC; zLf57t86q8TH&e0zlJqKIN7|0tK9DIgx(Sj`@1}GHcFwU0(hH8Im<|w8@Hf`if34Z6)4ilPpGKvN5XKW^kox2;dq^InaKeFKe8#QNEAB;EVRh@FcFBc>;)bAv4;6&m_LZf*KQetgyr zOpHZF_c=G-YCcv|3Pn&;-%bm|I<0koO>KhajMYI3n`Mtx8e(XUhdSq0#U}okSk(L*S6!NgLzs_PnG`#mf8k2)6YM@ z7Vt?eHz={@N&Ni=Sn3_BYm|&V;Wz)h)o3ma)*JZ3RQ(_yPKV>{H#PANU}#L-_!2Na zcGqdHcp9qwaB(Eya4RowzOU9?`UI@=mq4-^VSvPs@L4B&{4LJE&A==cdf(MZ17NBN>Kei6@DlcbEI z*@b%gUU{yjsnHb88#=W3#>$Io$YZ=fzAalN9c34-@5`aEtCYP6I}rj%W_1h2+RJ@smnjJ;ITnA^Xjw znxL63+t$qGVIW^6eDSpdKoin}-w^S+ZTwUm9`-Ud#oaR(5%Crg=}KZ955r}Q*3EJ# z3l2`uUCCCutOTZw;2Do3q>FFoY|oH?KtTn+!k9F%dGtRb)KFuf27$r4jo)%}B`1%@ z>{%BFl&6gqSna&i!@*NT1!U_dlsO1{@PRCZW7N4UI&R$;1)3qD#OVCegT|W}(jUn8 zjK{*Ff1(A_%&hL1liFBI;uf`E;k>k%vK|S?*ATrNd*4%i-7Pv_UG4R(8|sbDmx4x! zIk4$5({tDtx*Y2x&{EO#CKN&Lidj@$`S0^Q_&>tHsB?3ldU=bx@YU4S5wMzQe_1u- zZK4I$kVX+)%G3R!Wnkd*x#t2I%6RlFcz)9@v$aye{1?l|T5wMgT~754Z<57)4UK?< zxN_P0JG$&{q&!CSqG1@f^SgESG0p{(Iy4H(@4v=J|+L6eSObyv=m6Das zRax`XGU$7(FN~>p+evCV%zwB=l+NX$WEYJ^$HmStQozE-`T0U1-aUNjOlN05ii8 zA;T8~7_NUHv*6oF^hST23W1%`7(KK75W79b%O*J@J{i=Qo$z>>q4SJ3(tdi=B}&iD zy0IimP^O}3QpRt>t3T0x*+Z7CS*&iZU7k85KpGj|!tZ!6i$o~sl9iRE(%rJF4M1ia z+uJd^Sw0N%>4U8J$4-6dKmmTs64e4rB!RZB$OW^A@ZSDlpSV;Vj~WN5M;UWV>_o*_ zY3eXn50HKe_*kxCJ_`H0x(OS^rpRfkl+Ag)m1KmtE(N7BGGcbG+QAKt=0Uw2$7*jNrr&w;+FYLR)a~B*0{5ld*t&i()^0}oISR<${o_I7qZ zS35*JSQ0L;N*f!KFOb=rq?}JtpUjk^2-w?U(3t**ar46G2Zsm(++L&F%M4=7^T{6{ z_>tRV=jZ1$d~W?OLdVRweC~G$QL};k`{auVrTX(b$qo}BI0(Tv|7S{o9qak8i(jXw zd7WTG{)NZ?i%JAE>BnwfyV20T^QHOj8Tt!3S6CDnG`@e~b0Gr>i~z!J2&N$=iLC2 zHN#-rZiJ_M*14dYyHiQ-NhiNga1Ovia&vPpwLSPNTOO^hejD7)*+&`X^f4+KX(qiPEGYRqA%`(HIe01ICP#W-Ls^ZHPCap z?9bLg83E7f(u0|_Zfo-grggU>Ti%)m=ILlZ{L zRw{;Y`XO4&`r~7XUMxAU%{1J_0q~!`peAvFj{wmRJX`yQEv-F3G$-^p=M4eYa{p#a z^UJpoDD8j+0D4D$)n=)SP_~^CMvWYSJdQ&|16o?? z52g;6ka%T?lLwKgkx@;{6HlOJ30y;BUal!5E-sriJMP}!j?k!gF#lOYc=~HxP`yRX z=VhIssfx@ZS#*^P$frcJ>vduVdiJn-j8d-B)y3}~tQTSkj?xa1)W=7<=a~mBb-%`U zen(fGlk87qXDcr+FF&K>CW?hB5D0m09e|D3R4-0BR>GW+JQL3dJb@}EZ%#4otK#rG zF(R;E*QdhhJ^EY3MNyypF@mD1SxUgbzBaVh_o!4+HqDK!d!Us4!>#f|Eo*-te(5L~ zwUXa(OV(n!#rr96ze%9RmGCK;yX&mhR3b%!*zPQe#WH$U=hH72h>?o+ktotkbEwvw zw)V*AjwDad+8w`e`HNOkLwAp@R9w!gG5Cg*>Cz{UCp|je+$id+9H8) zrKZAEL7+3Y;psfu$%(rmohqh5beh3^wZR7Q7L`vHTlZa!=0 z4z$9;JDS}9qx7qd`uZIv;`G{QX8k-dS`d6Gj=m z!AT>Q&V8v=ija}(^zemlZ+?o8B8K9|_~sh9-T_lLW5#f_rS?*TXuoAucZjriq>TWx z#~i?g3%^~tbFw-M2I>hNx@1ZpQvK;%nCIL%q{W=t6QV|#c;2o2dp-TlX{MS?bW*g2 zn>-;SC+J{B*LiPEa1bkMLELr~yzR2AjhNAo6v7Oft}UV?DQ97^)gOsFf+2V{T`741 z`6k_VB2a!C<7MGe>ef5Hvq}P62%#LNnjXE(H8lAByR*mUvok3x`{wFUE&XYFmBE^N zgf{KlJLESt?z{bk4cI)WHOJ%)MMm9A;B*eb!+HKt=unt^ILZ~~51v9YL(^MEr#pk? zOWKjwI@d0AMFn43Il6;yf4+yPO44XnvzXIe_DkMgoS($jynPa_Aae%1iYGNFj{7A; zm<>fI2dHCDyS@5vYhEtIOU0erE4^Z$$d>1nS-9z-df8675kk{X}LdRMWK1)P0O*3Rom@;FRF-idLPA`95F| zmXSylIviJ76K8eJ+oI*Q##_q?k;eRtkiwCRZCU2a2t>QA_pER5yl4;Eg$vmL&@cP<$ot z=c2_EJTTDhH$L7mYYR#(jzPKqA&H?IbbtI9ckkV*%J(2?FS5+ceVTr`O^)%W?LfVa zzs^Pdg1A#cGJVnhBDb$uc1C8--mHIjmk#+chmpZ!lx}ydGEeBj zqWV3cJ5ERvm0jPdSGcRp*_34v0tc3lNSy6|p25`}itsSE$KpZT1(i#7dMk9s_ek5j1rHP z(Hw{N?wqlee}3a(786{rx~12U8#Cg1)a(QAMe0L*b=TJ$c-?r4IIBa$53-*d?mu74 z-{NDZ_wp)eQ_$0b)LX5izJ9;YKWJ)o-F;&J5s~c|6f}e?P?hfc>(Z;@pmL7e?9X}B zU{#xrS?%_n=*W$T%*G4B3SToLl0qubPGhUnsEwcJDix)>y@vOKJ%#egC}!K!17;Mk z=^XGjFk-3kU#tiCaqGEuo}`WZ=*Xcd(oh-A$8XAOe}+<6kZXkG$z<$kcokJ`y_LhE zodMi6M}|wZF>3d}x5K)71W9T9y#KWIFDQ}Y^5^77T2tTEBx5IE{|eJ(e_E<#FZs^@ z=&IaO)<{xYWL>nbw0WJ3JRaR9$6I)se$mwD7S|SUvBNK=;!AZoz<3o~PLzB*sV+7) z<`7Y6=<2;U5@Imtn&JDnBw2ISE%>=Uc3WCwO{cioMPetmTz@asmJ?!vQ`tA1%(kID zJiOs_^=~XdKIx7|yANC-t8w{wwOJC-CxG)Q)Q7w9%N-@%ZGfxu{7TzTF3sadiP$>t zImTexh0v4mf*X%ECHiN(Mdd3hIjtpzphjSC8k38g z>b5*A6y$e`R~ew=r^$xR+AlKeW$VLGCaob*2g+=R`vxy#wGK5 z^Os*HNEbm;!cN@Ok|!-|=J)pYSWSnqu+y?1715wY#*?2M2sRv&lr%(+lr9+oCf%)k zjY9&awnJTwn)6jN{|)I1jE%LBq(;`_D$yrF>t>K%elTDxIQS+8QD zR8BO}ufZY!14ByWq|v6jc#Q!)pYY8@R*N^;jGc6DfyLUywot1;%h<*sn@p!tXh86M z?ItW3mDT)Nh#1Ebn-X;c7f`BrnO8dBGhb)(~b>BL;j<29s?=eT-g+qEy` zBHj-lfy`z6SKM5keKf_gv_)IMyjQWWg*!iU*6(S2jM>1VX2)-+meAh_t*2|{5|#;N zneZ*lbpZ!xV0UwNw@lnGS!>B!r{_vY(#Lq@Z)n?>6Yx)FmJSQjKwQD$PW?5WDt0hx z>E|M_E$MRrdHuE_>n@J7KnitpqRGTvACgRMXYAa<%$1EUD7T6B&V6zZlprCuSg_BL zr)5`AwC-ozrj$Oom;`Y^dySz(ov=-~B_x+?N|ZArdM1+fwUwGinT=ynM=MdNEUTGB zI(s$rfxb*dIbFoMm#EH$<0l%#N=kqPG}h!48UBiI;g3S8o{W+~`Bw18q@jw^(NW76 zmYXBERv}PogSEG&f8zw=&QaI+5Xa8m=9_HY`Yf}u4YnGT*M&T5gV{%=@mucV*LZTd z%Al*s{hzW!bovP2?#A=~*q*Q(yI;<H)y-={AS%_OPpFW z#~n4ayHu}`F(x+;__ZZl-b-pqX{u^DUhWHg+^{J}>;$Z~^W_upA|A%G18HiDi(@rk z2tB^=d-Ml3#^eyrr;3Wg6Renx%cstcymdlgQI+|jzS$2-E69x0DdSGgMzc~^ssC+X zFHmu88*WWpO7)v%zcI10i+<36$>H9FUh=JH{pl`THNp(h*gJM9cBEB3?(u!-i9bA2 zuvFQ6N=+>5biAsCNO$Y9rXJ}KSAjbVL;H-@q2z|3!jv%Q@ek<0jPc;GjNICAgw~lp zoFX9FQ+9E&@h+KA!rqY#5n3i4*k_G(R;z7^kucM9g=Ux5#HnDVS-#2-;zssbM1b4s z&c~I@H7sMD(B1gF(LJjI@=%?U`hHd%%18IUoo@wXFM^OO=AgP{L57X6-530W$Pjrk zO$+NSi1qTixq8^AxhY1(kx|OfUWXfyY8di6a9XHXd>jC^lk%IzOTXm9iRoXnZ}^%i znh{ikHiKi=Fv(%<=`vw$ISHLaWVlL>{Zxje-!Lu`VNEMl5~pfdE-(RlbSRI8w!UB3 z{H0fyy!7z3((Qe`T+Wf=m8!NthOvTTSUH1?T0XPOu=It?7pNt>+6<(k-iu*{-eL|{ z@lZr1d3obQj{o=Ux0rBV{4ca`-JKUqHjsC4N-YAX&kFZ$TNF0)t$vetlQ%!r<<`b8 zsOj1y5aZzN9;ue=w50mOvwP*$YFj_36MzC6?h2l`JNLJ1tw^oi?YJmVpFm1rQCPKRztn#@>k?kml-i#yXoncUzb+muwqa{ zUuhV4TPB?)lm0{ANpwo{9hg*c8S0wyHsP*=q3LZVdlM zkBjsnMo>vC1TA$=d5NV-l_vbD)z~w|y)& zHhZIlIp;&(GB1wF&P63N8x-y6X`|4u=txooRdEzu#_U(f@cp4e;tE|UcK8| zdX28tbw}M5Rh%RphjkgGq2L4=(^m^r29+U5`IsHVJPN0e`p$3o*&O$0MP(@1eTA#9 zgbS3*r;5S9hkLOXjeLos8zE#05E24)DKkBnsp-{x)bqiHD%4ocGb+MWZj)Y!abJJQ zm41ln;&WRfdZ^`~R-qr(6{fW8DT5$6RY8UIk1?4&UOjZDA0JWMdY{kaG`7UW#E>fkXtSO;={8K|sp_nn&^=J$VIx4PUcMB*gV-!NV|yCO!OXBl{h-n>S*jU`WC{Y}~_A2I^Q1nkns`n0yTv zutvpN>96KWIZqX9pOATei{!*UviIPEZV1v^X>m%~eZ(%-ji}}^rD?yXk|g})yd%z5lNrQq_1N-NN?ltL6l@ui>DJ^ z-zK+yUw<3%pcub{I&!_gV$OQZPC>xH$>5Rv6bK6Z)sB|ULKMeQvJmy_3v^F!+$DWg zRz4iVvC)gs?E}(lT=H+oi9CVDx5@Z>TKCI4XPX5O@gfbO36a8gNncm%14HC*6^^46 zr4zmUSE0B?QA9M%FM4_f_UO^w#3{N%YsjO|mYvY2E-f7I4c~r6(MaLURS7le3D&CH zL%CXJXq$U8nS@$O)t=C2q{Is<_`dKkP4!EyAxNHBx-8I6xHCJK>dK~-yC7Pa(rpD2 zsm%jNgRMbNpDit)#uJs{yRkFYRd)eS4or?pPNR9&W*z~1(ZbKZF-)sgA{?Tj1*wBK zr?3%fG;IS^d;&_P!p~A=sf)Y6#XV_vLyM@mJ($vvNA3w2^YW_-0 z#G;<0^XJXb5T1ES?c9n~^wz6BUN_V6|6uQ}gW7!ienBeG0tH&66mN^WyR{Tbad#~g zFYW|sp_F2!xI>WuNl35+*HYXHB)EHU3oa-9J+22Ol~ON6mW3n;c>obFFh|4GIRO4%qQ)nadL zmbg}A%duEJJ}>a#;q}#ZCI=HPP;H(?N!`BeB^AX;RwVa%2c#{6jdL zN}^A9Bo);r)Eq>oO&v1tyGKTH7P%97Yb*6u-$NM;6tkzU^sIG;T%~l65FTTMSh3FI z)?`nEsP`N-lU5nJHyU$&nw-6l2MfqlP2gZCBuN4dvg-bJ;&a=;c^h=y{z3 z6Y$ib7Ioi^xF!ElpO6J#IUd#J4>v2l;$C@Vh6Pfl!y?^XL*8w2aG*p#=D6xAZ_J9y zpqC9*c>hdm$AKkyRlT`{JB0c9(NH!=%0xW~H`F_pL#da=R&J@Xh1ne;;1I0Og2`(h zNf+&64Ajr+T66?0eMKeLM}<*^-%;wjIbp&Kvw=!S>l=oNeoZSn5sYeglnrToON3os z)Svz;5&x0Zsq)R}e28gN_sf!7@7H|w^r}AI&$}dI^#S5<=`g>}@$t)Uoq1GDf~;H} zqrL?2XB3Dhzpmhv@tHp+p3U}{-V)2sNqCz3xMur}j8>|OK!PApx(=Kdjj0Vr7%dr9 zv@yx9K5ziOZesm78S~{}1Vg%-+*A{7{+<0O!n9yH_sN;MC6GQrLu7TXz<2Zb`1s{@*Ic|>hKVtVW1h;B zh2Qfwak63h>ZDL8y)D@)MDoNCLL=0hlIZZ7ATq?*r5 zU6pNC!7KV|MFZf%c|BJyw5j*FmUuL1X~y2e(yn^uIYA_CpN`FJd7kv&mX0_!I@-q( z(6@CqRP?F`h}?;itlSqS`Je15m?N}( zX|?AX09cUDC+F9H@#k`6_8V`IG7JCi>RdwTYb~f^p}H5&_9a-&53J<;oltCuPa^V{ zz&3-6yfX$=spa_FSX%gwE%5(sFyZ{4HCX?7@4xzz{;R3<|4a$=zo9(;x$^&;u+jfq z5WvccRRg1U`@cx;Nb_!{uw zm;}JJtv7r2b719{WUi&g3pzoy`}y(5;^vl1kg_i{gaj)=RaoHDLK_xb3Y8u8UG2iQ zRcY?>VHp_nchb=OnAP#MGkX;#+3nOUhs8^U0l$94ntfhn_>4#aXcFm>r)>=7KMY+D zDYr^^A-hLQ!6`|^+GN>9L-k}AD(+rlao5cW(uUOaJW<`TS;1m%YwzB9w$S$VZ+iA$ zRMHHzG_dwr9hKw7in#a$AzJa%MW7$FrM2OUr+5D`7yLURpSZDT{Bj~ZXnc9C6i;Hw z#-^?{g2@J&1=J_2cZP@PnyMZfGJJl`ES=HJC~V=d63$~p)y2&v^zBWUe5r(kx})-i zQh>VS(#DsGp4arIZ@hc*j^Q!d$?=TAyU_4vaT6av%bCZ+Tn_$!OQn(F%YLSB-emx% z`H~t^F}U;=sVu~%x4evOvBO-L;`Ut+r%gEIS!uxZ^*#86z4si{;>;g)0Rps_jw`S= zYcqEtL2lt1Z9A%MLGc&-wo+!subWjLZ*$I8OQ?aDYh|f(A5(6&i?T%>a@Msi)gy&7 z347AQITH=j_dX`LS?f2_=Zl%LKcm@Pb}W&}$jPwcF5jX8R7d@t4L6cXMjXp~G2r|x z(lD_bj7_A*mna2VIj>#TUt$Y8-Z#Mm#@4ouMKeT`0M@JKp84ku&oCRBr4X=<` zm{nDoK2ClnYW}Lj;=P~Mh}U>;jK-W*+hVakb(Tj_vd+DbQDq(doAa=+ z-tRtr)DFRQZ9%1JgPpoy+O77aRi&+O3&Xz^+~=YgM9KoZ+szTD$G_25>Llg_$-${S z>4R7<;xZ!H>2x!6jmJnL-5ftBT zdmgJ5?JtWBP;}z!d{7UznEwUd&!Yc}`@jO{$Y}rEnZPUHkoD&7OB3T1;$fHiZf}zS zU&&5zq#F|Tkg~|ByRigCJyr+^(0pZ;mUgRxZ)Rr-7d@gB7dAY6qpqu2E1CNS9*9*n z6U$08$P>~pEPkA9IGq^o#1W@Yy&T%)Pnz7u*qREGV$yq}g=BKw86HUQ+L#*4LN>i9 zQ^W<>Dr;=Hm_8j6<>=K(t`e!z%wvqoLc%|dlfHQ~p?!3yPL*H`xM zZvS6$=T;p54E~D#uvtB00bDp@Z0?uG()9~*gIGzDdof3}ip;S06)YRB1yT62o zSBolt*36$)Cbu9(WvjGZaxA;UbJgAn*n9G|@2g8M&>|lbV)daSP1RPz?k^4vi?;mB z@U|q73iSKBsSHjS{fAix(y!XapcjKfqq$OEb4vfHRGczTbwYB0K=;j3t&{eq%fbD! zLR?HtFL^jz>OWk6MJ~~QcoPdR&-xvMIe}4lIx&w(FfLZ6{r)M|D0p204hk-KTg1|2 zwQY#IqWgEYu(g9bSb6L~EKQX;GLMdOn;OND{JCS1Obz<0b*TcG4D0|Nw+J|dtD>Bl zxio0c}+C^`+YevF_x{}LO-{t_FI_4W=% z;a6*?D*1Ai+Fjn14Mvdc^t&xMPqg%q4np1>eQsNvAD-0z%J>rvLY2?_{&ix!S=}Z& zzJ*0(VehUv;aC;^%%2=Ry}8Xo!D#K*YcD`ktrQBszwGNJc&G(I3w5Ps0??!h2`pL- zid_S4yc$NQvH6)EVoOQ~GQpw8k0L`E=r{X>pE`gtmN}^=evUp#iOX#<)aQWKZeCcb z`3DO-4f~0r2VXkLBBK)8lSj!&Q@ED4`%6BAcl`bu-<10?p#(PAYWi8MI~Sf>2!WJx zrIMGV%JV8CfxFO^w;jy)pG768Y{f_*3gw%)0<=ia^RNtQT4}Z4Q0}~j2APbqw5OT1 zx(%o0p%mm4%YCS^c=`>@zjo@-KVFa-OWBzTM4rp}WT}JC@u2yQd_m5(#6fM&|0}%F zudSk_UvM=^>t$P}M(HpWy@V8ocY|yw?`AwhgY2U>pM6aOU;3`sW6lkROwuiio*o@3 zZ;uYrB@OCEROXbX|cqdhG4Z8SUL?TLFRHng#e=wQ~ zTcAdwSbaXK4-~HpDhnq1dXQS%GU1ijFaue2r9}Izz@FMV^7!sr2TFJfTJJxrF1!gS z92fk{d1-Bm`oH00SbOo4flpjDU(i@UXei_+im4{cJ9j&o2EF(;+lH@8a(9RMjzZ=* zR?!qw+B!Gz5KA53-q{J46U}ogNgRD8G98aXg)`xWbF}7p`7O$~FZ~0%0 zj)}40)P=UzCtb}l7N(i$DKD5`S9mh|ff+WUW7FwJQ@KgTKkTT=f{)UZpRE=p7V4j} zU7z^8#mdxoT8W=sL`h3GfgS}`u{)@%OU2u>B?sG7_8xkG+J3TPS-W_Do0H+x3jo?K zfK}j3VxA1li#u$|UfHAa3;2dv^}XM(nY4!$pXf_@lxDLU%PJMctN+f>1doBi`*-iy zAT@Lkw7q|Yho4jOa`eoG{dG$ICxG~eFya+);Y}kx;`;kx%XELNuDIRcmCwmGx*=Ki z2^L%Z@h@B-`>Ju;(2R>`WZ0A{tk5dZ9ozIW&fXQkB(+nuu6jf~a;Fjd;Tz^rGQs}z za?7heBLhoH`ZJEjR{lL()wQ(`-^S5TAHWd^ME%8#Fn)D~mfCf}OMZ%E><@RHdB(wJ zuj*N~JHk8@LX30q>|aQuZ$XOv> z2duOl2TB3{1`kWSCw%hv>wccn(oV?bnRJcTORN%&lqKs=%d7b;JCq1ae#AP-|D!SY zcUWr4rUeJc2RZ5}w0X1+@Y><|OXLp>!!Hqtc=W{RG7g&raQ?NV#u^bUY)Z)Ul+|aO z|NM*U3SFj4KknruEUM=u)WEVt`ek{&dL#)$$ywE_?<1sZC*&54RpX3Y8*lGJo|jej z$OnX>rPpIcgNHaS5QiRn1hr1#VYoVv&wGnqc^)p4)A2y}a-lO2g?$#TtFy2|wq{-J z5`hHs_XJ@fw@dlBLpO_PP~PkOF=ddd^>&yQ{^)h2s7#RHoCRRXz9X3~kuq(+v*D;S z;V@J=HO*JnpZRs^U|%BU%({ard4JB1x9g1KkXg81Jv!s6x0hM4Nf(#Z$xGC@fL_g~ z;r?QuOrXAWH8verP~!C%n-o#qmRxqNcCFNymN%7CDKV&8eahV<9moD-QDKKot_A?hV&%mE2Cc^j7M2WFE-X`!tp-Op35 z{(Qb_7zI8a4KmgqNu)1SH+K8=+>Pv^A>K%fAs0`o(j&Z)<>_IM#`fGt6k`C9FtJG&KTesz9 zE_2N!L(Pn`&1a?1cP2Hvigj3U5;C8LY+PF2X&m_U)CO;@K3qNLsnrJxj%oTCf;T(}3Jw=CY#z88Ym%@6eojnI`bxRD zjGY9&h3ZcqCEUTexc~Qw|38CSR5W`m zsm8e7Je))R@#95nvG|<5rxf%|Y~9T~OwaU^yH0j7MCp55gVsJzK8b&hxTifr4qtkpfq?u;_*jWjI&S{pAZ4GKvZd%T1TmIYQ@)&&5YZR=j_y zZJ-5OL+JTw-6LDFjln#5tbom3kTDP%d2A&rxvhN z-xNQW7J1i!3jZP55gc{wGok1TgUl25Z6i-IL^yqnzdbNu9GHqvc%7SU8TD(KtT^H# z%Fq$S^P^{#AZ1>^?k5p@{Q%OVh{lStiHRf?k zJ<5f@voB0FO}L~x4)ODA4CVR_No2GPD77HInu`r?t0Rx=zkVF4)R^@tHBN+V`X%18 zCMC_kJ7cIjaMT8e-?MSHiDuz8Mo7J~-05S>y6BnCo=}aoGplqj?uk)B3C1rmlFD4AyDof zCAA)|F|VdN7~pft4(}ticQMiXi(t+|?@%0B?Q(ScKo=M56Ih^vTfzJs+n{nvE%WaO z4ka1`bC4+SJ=^O@%U{2eqvdoR7)pBtzVL=P!Ax$7e0_8S2F)s@W`1DeLPqBwaKYwd zfLQi&pjyYUs-wBupI>^>a$XT*K|iL>`y$q*g?Scx9y_A+Y{VsXMhGc7Pkdi`pu0Rf zkP-odh6f~V)y~J2Mpp|)t{vfLl^dd>;?fp7{98K|f-{AZb4Iz4lb^oZeAt9oAtZDJ zR?3a3s1-;L<;(u20VeEi29CIl3c?Ab-d^D>E^|elv?I*9jBU=iLQCNSXkZ;(|}E< zWyf3jpZR=&C&*X{V2reIaP&9s6SjWE?_}aqb~7k~8l7*}OM5SU0Uq2)ZKknv@be@6 z{6-tff-|%_$qu;VBN)F&5;7~+KrcqY&aC$Z6RbM2PP8{Rzw7m|>PEfUy16=By9yW~ zRE-ZQDa%{Y3|5aHljbt?x~>yv84Bt@M!%Obt82_G@c3nQ@J?$pBE&fL&9B6iA&*pG z8Ngf3mo66(wu*6|>;A3vd#Oi>n=x~=_fIMfSAamvmlK~_!X`HJ{nigX&J-}E?@ z1tox}XmTIF*nn#_a7CEAe`aM@J$GBBVP~G%PjjHpf)Ta^R2>OO?3_?q+)^hh(>Q6&6ve$FVnH)%a zu)^pKP9*m2Yn|a*grr}7cigu>b@9U>NVLJTP}koB8@)#=j`;3mfCd5a0;^Q6SYkJn zQgorNX`C_K%Vhx(|9Q1@lzyOJ3QT&Y(4l^mXYPKM&+OSQ_0Cx-GR7|^)}q#4VDF>t zCJBWu@#s?^Yw=T`td_jf9-!dwLO$u$SIoYF+xfrU;t|!+yeG>gy%0oT+<|*V-dz?~ zRXJ^|+HxLNX-EQ^N`TQ_|J8JqrZ9w_3z2Uu$tUEll+PTZk8}@uNlMvqUQ-5vNjND6 zJkcArE$LQPA844ELcJ7|;U`QTeCWoAT1Da2e4Pg z2rggQ8@;M$dgl%xail&oxDkl~MUb0ilaP6}+{kk$_7cf2u#)ae-<2}@vZn_0$|;tN zQ(mx9c5=O&|J?OuqCU-inI~06m)_~yX}=EB)HxPjBl*wvPWJc<>iML_ zBZ!l|{Ut?ga+*H+drIGvpX%*3PHE+pI8kC4OwPxM258v zdm_Jcw2bQrN?kgMg!f;At<9pDp^u{@*&B{D_lcOcUX z1aRGt7808C$3?L~{I={^nD1z$iSZw^`#8t^*n;YG$5FLzebMbp0}zL&j-ZO+oyF#` z`@t{doP*a$fXcDT0dm^z!0O};g% zP9JSaa>bbnsGQu$$5}J-D%;4CEs8+z>XW4?ahG6gHuDf~ zgSO~zFG6B(J=*fpu)_~)gIvh~!*AalelX;V+}r_0nOD$KJ@NBM)Ac*ST1Wq22Wf(^ zQaSX{=1MDU(|IV*@yrLNF~~LQ)4O4oY)u6di^mqBM%XwAKS=Q8cGbUL+!0z87gtcG zLwi&SHW(3wf!T_GW^m{vq`zQpezBXybNV*N##&#QcobmmtrZ!y|HafPwE3cG!9M~k z#FPF)9IBg>LdzxK7lWy$oe@kA^u06xlVfnES_b-4(Rm#~&5dw%!=3p&_vFRPeC~JV ziqlEOEO&1o?m6WrSATTvjH?qjV%GIpswMD)ExF0^fM%=C6NzYKCV!Z_EL?;?5aZ)U=pIcGB)U9O8%K~u)l!0t)7OMCr5x&q#&HR}Qyblb9b z%9}<6xTiMlulcqt`;%*I?`EhPrv<>%6E-F)^$jeM%v5%BJc`O>@|NfGX#@aRM%g(y zx4e#3I8*h(^``f`7`c9j*_2?T;k7W~Eo~rPim&~TpV5L^X3ekSUbMYFoALd znSOyn2~r7HMmb)P73(D{aZ=RtsK3YmEovBIZDymuy;vV9eHF@`r?x=1va`c!NwuP# zjsQv^)-uOjfBJlNyoc~M6*m*gv>|x&vZP7Q-SRp^L)I|WL$2@e5k6Lbw3IRVN;t(k zDU}`Spl*^>??1by#!lLo*|$YbX%yIOvx<~BUxW`hHK<^|v?Ka$`0RT@zHZk=@KDao zuk4#vK~saD*bW6pNOq?=*~hi_zJGJlq*XV&?WuPL0R(kU-+>G^HV2)i#W?ydYh6rI zLd$3FU7gYK2L5#QE2qJbYRi~iqcacyFi3~~$z1!DT!{jhSm*NiD^aG0Zedvo%0R}{ zbeH@7LZA~6x>i;5i`r|t>`t@efU7BObl>{nY(7>! z4kaTGT&%1$Ylgx2&ZUUQSx>HGD|X(H+n8GW*m@B7y38bykbUbNnLs2Qf6^+@CQIQ= zwb6ZYb6op{siLga;~BI!@9kI$`Is6p*6zb5vJUY8h>n!~1tyy;G zy9j15Ie3KcMeBIGv9dRnGzQ$gv1VbpU1mylFAI)srN)1QY7~vZfYe9cJg)&MOiwM8K&SxG2TRp#9KMMM=Cp$ zHgR*e*PphCL)M0d_XW@5bqg~>m~pSi{PK2tmdI4cH|O+PHsKZNi#9xe&7Zg*-G1uA zHL0UN29Nw zNk@c_RQ4A`5K{&I51dn_{X4>JV%0C#k6^si30aA^;t?w=fZ*FBS?y!J z01Y)Sl5pAvMBgQ9ZW3inNu@Q?tN#emKF^^^5YD393m@c(-uvhWP)s#pA|CidVleuE z#`js&njJ4dZ2Gde8S&xz{pESz*2#e0lx1&P|IBv&*{HNYpzp=pb9#{f9PvrUJBtwk z*cHigx-bOgpe~Ch9c=s}N8mR?w0BSxD#-bAW_p(}1$BG(>)cPIABmHf-?YHy>*B%8 z9p>phG+&M3UQdk15VB6vS8D;>;5rwZFppxsq;2%@wL=j$CsN;&y2(?>?DA%T}!6sI3}%+lEhiV@(# ziNKBiFy)pVEemqxplJ*FBJLiU%dd2E)blS1O&X46q7r0AI?y$mKaJPTL~I-vt6HS5 zVQx-EU%!+9@g=9AbEuW(r~U25q)Ct7qs%P~~$)Il?hyxcOLsh!VSdS>{(#_J9`eTMeAID^=4y#0^r@Hmbo z_B_naV&^QJq(vaJwlKfooqb&04Qrtt3a8t7tio5aGlvib_qJbf->RaLwqKtw>{`7> zhH*ZLr8=dtyt)Uh${8RueyU7|0YC}Ycn#Tv=u9FoAt#-`h>PD1t611IVdN~tD$=20 z@o#l<@*s_8w@CODe3GP01_@N^ipo)u3WRb+@k=%qHh{+sh`Emi~y3#cN+Gy zTE-O?jxgWH)&T1WrzFBN;2X}S5_JZkj_IPzp{!7R_2rjOf8HKchEkB z@7h-fdRdRKhG5A?^WnuQAskNItXA z>-Rp}H-)cV zx@b%NkK1Zk(Q?_h&nPK*rO!u((3>xD?$!2g+$HKxooy_b%g)FRv1>GEkR3{LbsIAf zo^pNwG4V#%sU$EW;(MYgi_TzwO8z|aFn|ga3=Rzarxq|vQQ(7x{>&LJP_eJq?~IHu zr6Ji6e4*RJ`>XWB^K0<}ZRi3-<$lwmyUW z`MpXmZ3^dmy;I@i;Ay`#FZJuC4JFWL0vFor%&n}RCUf{ z#1NCzdOk@lV?5vps(SBdUpdow+Rt&;4_w`}5@i}x!Y%uGdgndH?_E#v%8wG7N9F^s zU@EtQ4A+hfAgYX#e%g7d*gAi_)3yxT)Z3P~EoCcqCbb!m%`E(A%4hKA;qqOc?o4iH zY3B@w4rQHs^Tkbj2Wc}?eR-C78P3k3^Nfq6Mw>nZ*#l(zq}H$cvX9Y|tB!M8qZ~pG zMZZ?(Q@@{o*pOEofUT)KV9_vuBC!r;<>e*iZZ_}L^GE#M?3`1(c1}(%QFd#YyCU{O z+})w8BxUAWd@9ykqxgaboXUy-h2f(MQ9<ot2pbjkFdG||L(&%_wKrEb|WX!_4i{dfLHl6w`%?H~C+Wt@Y3-rAl>&oRD4 zU%U@FrLXC0NLY%&Wm$$Vs0^uO>X&<93c@EBU7Q;FYF16@Wi!>Ol5LDJ8*hqKv#Vxn z!n50D#H8s`U53P?MzbFl?zpB|f0Nh~zt~PDff{Ok$Y5ZeamGAwwo{Dppq(+A^LvV4-I!G=xTFBmxs#q>B6l#-f&h8ePj)~h_V}RYz%n4O<|zWe6fj)BwOzs z%#o4yIb7*U&5FC)zX`f1P?p5YJ95Os-pt1|D+A+D@zPLxD z(wmY&pf3v{tL_9JE)lp!{y~(LGQGWUxjeSov+sFR(PjEGm z&$G7V2%gc+)j#f5QOTlvkeNN$NAU%Lx2!sBst>46ttu|4uXK6;T0iP$RNq~pa4e-% zCyl_MMYqtsIt@~z|IQ*&8Wsd(=IC(Eng2ldd-DH>JNVY*hiYQa{K#(kWJ#@kFxyA?JTq=Sv|)C>U$JG%j7N6h+cE4#CQHFaq|KXxSE-_Y(>~op z76ntTnZ%}z+@|^47$V&8@S!FcY!GqaaH|}5qe_AT!x&a7)IBz zSRWaC8ja#wK!mkpdBy;A3qdr>y)yQPYo;2bo#Pf>nW~diM?||ko~!jWBIebkJkanZ z19BD}m!e^|EV@h4loVb6dCu5r(Y>ht0p)k;WJVS3QeO1s*RRl9%sE%ggoFl4>7Du( z`WLS~Z@FXzy^*P@d(oWz?}Up~rXjP?xUsiroy_6Vz-&UGuE)1ui^=GS!}duySNXSZ!dP z0}Ba5p8z!Ox$KhS*RM@IZRoRwxl(?$kFE<+ZIYKtneA{&Qc+VGi8WH*tDU#eb8a`t zZwglNkCox&ey{Ga(x&2KKUA@^6@@A?EdX^lR8B#Zzvj*WzW14$n{pj`RuLFDHfGP% zr0S>bq&mdqhCOH+U`W!V*0-e*7zM_G^zC#*--gul!poIfifmZkDc<8ynFDWQ^$`b~ z&N?Z_>j_hB?WoBLDP2LO684x0>=v9BF4|7&XR`x9)F=T(DhRm(EmMcrV$Yvjy1A9- zMZ)7`))uNNZznc&86_NAv^M5oYg|J4M1{$w)kzRK! z$rBQ^PqslxbHcwGWS_nf9i$$h57@|JL$4PqjjOB^HXY&@8Y zCGe+YMk%0zxB2YK7-)e*hPBmc#oZpz^QOX{jArfSY7u<{a@UWwm0HejRGTZSEvDjK z`g)bkYnx`V_iI_Qb}+)RU$@g8v|LOSXHU3oC=h`z-F=#PH%rlBA||J$MrZ@6-zn2O zFc64dq9E;YKnDyZgz>mhGO3XrT~5e8g8InV>|F*&mNuZBojUh-R3i0?}h=`w=BEfSXbU4Tj#1-@hK6u{E;f1 zY=k6r>9`0lWI6W8y0pP3BeDR;EidoBBzahwr5w(gF}9sewQuMPJ0DhGgleyq2K(vn zL_1Z(gOBjF^J2e`h-GG&l+H!}1Y__Q^Q{f4I%K{+21Tk^h|Qxawx}OihVyjRiZ!4u zQRu$9yEr`Z8Mu5h*lQY%Qt$Gx874f1xL4Dcg4sYNbYo^}bPYc@7HL<<#>bn+xvXN( zi?WW>1AJA~6x`8+`l-6O*>)VYcIu(#UdX)(Lt}G*IhN&`NV&eso3i#%6dPw2&Xf*Z zt}?3Rf8moloQ?r|XClMrHAWv+9Ez54&F%LeF-#QjX0!-Jn|P>U&#paCt-fl7PGyW& ze`s9g$Q)yQbz&i_Gv>96f#VaZhS#yXQ~MeO**G|K+<_=&HZK{R_tvvuvf%e)n;cvf z9F$OXeS;S~3YpH3op0(Ikz^-fdNfg@0h9~BY(;DBGW01skflMuMx|%;hD|RKbzX_p zKiSk+xqHgY1(IZ{)`DcsI)KXF!S9>hi_E>!okX1{_TOh7ru;&MN5!_7TR5fCo0VT^ z6`Xfa_BuNR)3B>GANQ~5tx*QGag4EazvvVE(NSHW@B&Rgb_bb?9TlAgZ^6c+W zjSlhfaqH{Df;J;5YYYo0c?JZtn#>DW0?Ze|raLzYOQ#vLT1QdzgV7F?wQH2TNp#40 zog^ns&X-k(o@CrKxwoky{>{H+>_F@)vfF+cB9q6O!+~0LyXmYJGrRq!`aeKUL6_;Q zDg$FF1H4zGWXud9#}~X~`UsO#=w)g|&Uq_!@WB=EahjQ7(&EfTFIkJB&fK%)hC>;)iUN`>!%oT6B#xm6Jyi|1U-1FvgOSan89U2 zhIVR7i=)Fw6(e_tuo_G8u4l`o+`MJZRn@4E(9J*35(Mvu*sO?-q+paXg~%r+(ijO0=j7wJ^| z)tdr)EBZ&@i85(04(VER-5b?odnF;`;0Lovz*k@1`Dp11xi>rI89k->5l}uG%I7( z(Nx$2Ph<%-<`-R%V8tu=fn*4R#gseCXIvBPgV1Z)+rcZvNcz`KSvysctXjv-Iv%mL zVR779=XO%oH>QQ8X#deK;lopj^ zp&X;|oP%$!`Qh3ugAhRRv&=0;Bhgdr!aiffmO?Bx&!lwJ;dLLKm4c!LIb6N9mi}D3 z*a2*mloU^Tfw;ate-K3LwRx z55y#dy1QB1e&+ zrI!urVc!G9&_cYc&3lsNvA@UdMg6OLhd|_}kak|po2ckT2SNdBgx%eY>9OHqLnGrc zYLjv06!A5g`cG}T*n$+aU0b$}Y;B>Ck0XVY zD+5u(TSP~xb7Xed%2WXJJ^6E2Y^naaY_rocC$9^9uzyGeLysSV>>G;4aVoxDQmuXhp`{5D8 z3o*`@iLSX61^+B39Y^b@z{!D3kxT>b%T*_pa44vGmg85!v9ddhL_ldnpGbdTw*U{z z&;Qf{bknAi5+mFtGq|O z*wmQ!tloXhp2rU>?JRceIl?4?1-SFk6FqwLXlJx8iJ$L<)<2TIbaQxO9w;Ck-wmvSoCIWSNbaA^l@3yn3k*58re}I=E zeZ6;j5{z8`du;6>~+rWfBj;Q`$_8|Nu0ftB!~PbFUi(Z z>$8G8ckUGAqSA5#D?}M$T252Sf8d*)HMOq%Y)yXxUSUIZ*1PcgXkQ?R9$nQyimfew z8dxqRR#(EIr**S}6j73)Ntd(qcW?>>u}1=)c|+qnhSSMdv-@Hu58oA)O5%amtDn|hpZxUkl_cN~890jXli5>R8IfSjX&vE!j zF+oSWkn2HiUp%bXFpesY?x#C3ov)kC?q2C-mlw`RT!EL}|8FV}m$)I{C<2!@|CAxkPgA zLfvd&&sbwpksm6;beAaO{iP;VG*uP0Yi-nf@@HBL(fwmb1*UOvkYpE9nE@kj>{to zWH9#b+DwH_4LiS%?5*Fy_19r&a{o=-nGyD=txrLrl39bS(q0||KOF8cFgO7 za&fL{nd`IguP3~Lai&r|k~wJ@TyYhlImN0sksWM$V=NPDdq8#Qd>Dr#BD> z9eQDghb|P{Cb;+JWkpf$^=)mNzeR7|7xQo0W!Wz+M<<+w9zAY?6=OA}syZme$a}M<+vziD67mxgpgYB` zK25f}adrHKtv}%m2-&M@?>9ByA~U5VHHGLCwJU_$UQKHmShu_rDIuk}7jf##19jU* zYjNGAundoyRM#CH;MF{%yz8popD^OOm&ZLxQ*#4fJKDMCm)$R#k9!+Jyx$QThI}$o z5q4vq*+pYBepR+t8bi2MK|5)Sj?PTEFdp0?Y|4h9PG`@v$8G1y(I4l>tkC$eSG(Es z!NNvm6gR9rq_dea&J#W(4IbQGSX5meV)Y~W_8tUsTL|x1Y}&EE9{oJzD|s3AhG;95 zOGp9i+!goHQ5+bZb+D4q!HG%TndCD5&M?agT+zH9phow6MuVbn1!UQUH;}Nkv6R+* zW^Kkqxk7{Uv`Xt8P&z|R?)I$z*=mWY{M{vKi;vI(s1!KJES zRk9PPQoo*%eT#4QCyS5$Ic6`U1^dv#d~`rtWR&)%)0eNOLBJ-Nq+=~DN*p41v)%>T z-n|&@76NF6RsC=k9;!VqR_EzUKJIp|&_Cuzp9{`-+Si)_W5+ipsW;&2t4 zNwWy!pgWhkm?usefgc?|rom7L;ROb&kyn#fTsxnKZYM4dnrLKC)Ss2mxF;}<4U4ew zc`XV#topb@_KrJdn}Z_yy+Mnhcu^o8opY0F^&Vx;XwA!)uBxbSIm@wohE1ar4RPBN z>9!A})lh-em%o~k*WAQ*7ctXgLvc;wLTAVGhL%5f51H5FjTetwg0WBPPOJl*>bq+I zSfXY8@mb;}BYnfcRn2+bF%5t3F(5I!1AZ{0}RbPD21?4 z@430bym_<3mKMptoVM3(*Tr)a`oozHflSQk^;4$nndJ%8{=q0J7G<@f^t%KX4;|WM zEg3TGTR+>>^gTr;o&&M&5h*05Ntbt!!^0zOL9yMmpX@j_lYJ}XI}wWa_8oWQbDRfX zXHtXqoCJlcVT`~B)V`;RQUbE5=Qnta(A=%}n*7-GB^VoE;6W?YAOVYHMHdTpEJg&Bd`HFGseXHNdp&_Q-3LKyEJ<|-*uY5BfUPQiTSDT}eQsTVMDhhJX zVOiQ{{b8kTH6hH9@LUtPpYv+kGt!Nw1n@y=&bOgvzNuhGfD$7uP2ly%cWtf7+i4=G zrn9*MdJugRoawtZh*d6XcK0dyfL1R)C2ea88WZ)=PYNba@YY$nS5p*pIu^cl53qOB z?H#G~7Sb}bCLL$s>8ZK!XAGa1I5trm0vY$IQ)2vOO{DEt4cC{v1Oxz@#A_gn2Th7x z>$bZWa=j<(56}xgyDzPT^H002GplcgnM2>)3t4z#cW*!0OuFy(VscXCrVNHn(mF}- z+U~NHJjQ73#RX#N@YmBR#neGThJb+Rz96)y>m#%QY3Z|%l5Mhv#h_G5r_>%*4wr;dOt^i_0A?;F4AA#bOoN-@h$Oqw5{<0 z4i2%llKgAk9QFph==i?c&&{Z*y@_Dc45f(#6KmH483U{ue-`+$h>A(}mNqo*+u2yg z_KMhW12nG!X5r;iGmcU25R+Cf5Qk29`}8fhU4bBi823 z-<+*A{+V#P`i#8oI2as6PB80)&Uv2i8PV{s7Ck~ZSwPx(-a^LRS5`H+jeO-ZM#xlZ z0-Kux_HvgznkB8@1Lw+Trx+-y5~(*if=)GL5w!lx?~FTRkQf!@bi>8Vmt??Cjupnn z7nc%>87qD*(CJA=IYEJzqu`J2){>49aY!4_oP;R&*R#^7E1L10vs}?l$LfJvr{S3J zJ;gcgb^N|GQZA{Kc{+QHxn_5F|Pu00&8b&aovjY7H*GA7@JF}yRLgX?jG#HnnaT{~K(RrSI&a=;X&OYZk|D5liwdQ@+yzBke z`>pr;*6&^G{iTUYm;o|Xr(!&|$<3I?!6ZCT4g_nP!Buz@>veOYocW=*$A4oFL@e&l z-$he1=QPaJN-X!oCp7&^&t6yr)#@SJj4cQR@u;kq{ZoUlbnmFqwr+Bc@~4Ee$MC-u zeMa4B#x1z#dE3*^#|1fRHXJX>(g_&N9`$99u!JS_77Jgcn1#8AJ!5VT=eb(Dvpfv1 zZ?gQ$wM(~kJy(jdqgUUEKOx3l5LZ}Qd$a3GZV{2!Vwy$9tSnAG%%vE<;RNHRobfhH z=IzwtU^QDWx#1e>uQCgsiYq}`R-Z<@e{e=}>e8!moO+DrP(AU!Lx}ZMpSyslU|;t9DJI1 zq+&&g!Lm{z-FejVH1Tx`esa>|qOCoPGV$?x*~rjJ66S*LDXDy_M!@jGyQ#N}te*!X zii>5Xe!<7R>|Om{qQ?-1{1CcdOd7MOXu7oCuibJ<>*3;9#PL4;xc)cSz2omsHJ%6) z7ja7E_}FtFk9b7#{2VAwJM#{hy8BbwS@`-QN~{W55qx*uC7PO+e*n5_>E_mU%k*Y9 z&9+XSxvIU^MIaE`I|9&X^e2!T^~6m-UvEC6{ex*e{%ydIx)-=6QPZrrwJx)0lw+q> zpUd;wTkx^0z|zrB=hMD%LoSrWwT_yunk1{hbEs zfj~TTQG9tzz7dmh;1xmaUJ{+dE{B!88t}o)($YO=Z_#kxqn-K3r{L#Im0hJPI@3Uj zL-^VF*C|s+=wQI~X#yatu&nk=t#JE*6N|#zZ}?nqL6#LYy%M{c>>CS04%5gE5+aD6 zB~!n2`Hw7t*I6Ny^56K#{)mTB0U}TowXh&6Tbprio+d05>)U48+6;p^Zx!R$4}bx{ z!0>IqO3?J}XR59D`d=%OMIRCVaAJGB5tP0a|MzuLr6BmA&+^>x&<;N8G|zo zO-;e4ZxYrLT}q7f4^hiH`M1ag5wXo(TcDC{3JP7lSa*@xeo_O{zSFo$54AruPiQTo zjAXxOt~YFwiYV1_J;11Gn4IE;C$m%VCi|*?!%-&El}Z=L{vv%$rJlykTKkohyvwQn zRX37mPCU(G|6T^~L!xE#SeTfF*qTG0r4xkv>@9L z;9dyF48ITQ)>7IDy6v-jV94H^GmXm`6onf5B7PcFU4cCSU*lKT*J^v!$O%Erf@U-6 z%sns!;)HLF++9gAsIkXp^gCd9s|L0k^bY)l{tf!|r!eY&@Z^7ma{rGtq>)IH8zZsN zy6jNwy%Uhkcj>$MfadQ- zmJXspspI`V18haem=vip9M2oPLMO-Gvpjd*Czu+y+`YFiWs1k`p~J7x)MpPqDs8ZF zbhzxgdAp7#CVv9Wj{3%#1FnwTSEF@*tjWw`c~@s2Du zhGu3st_f8}+8=eLOb@Ib4G&E?7tDSxcVpDrfvaufJE?bbpK@4T*_iHUExxhL0=@AV zf@yloqPld4eJ(EAC&(pmY%?);SH*PLgM^NPN@e$RR&Cw9FU{S=ks-|xOeax*Atj0& zjojfTgX4)TZ?J#OIqhCm@={27^0oaJcNqu!I+#q zC+%ZT_eQ+#=|;w<_rRl7gN76;ccf*?>CXD;v?p}el$3t;It41XEQM;8ZBTAOBc$)2 zh~1d@IPpl+zrrOE+w93O^*G+3y>fnS*8HG9Ytm$9P8>G$x{l2$nAOk2<;e}iyzs4G zCac$vy+>*a@1_^dl$+Xezx7W1U(etW-{&Ye?Z%dkln>M=|9_eL$=!>H)UdR2hZFhU zAXFwpCeGz2Yw-*1cy3Qd%$>`Pd^uWw8-bzX5&O6tVSbElKE&_*01`P(lR*wDIIF`uz(c&C6T&Ya9)|wMqC9|Fk$h7n`Nw>qtjSp%2_q1K-SdT(SsOvIzo1O>_XTAit%msxp#7ql8gXOIT<`$;VxOG3;#!>K{dlq}L) ze|}M1nHTu6M-^y5pv-I6jj!539?C$#QV^(721I<-ZW0pEUA38{|9jk!3AMGizX#Y8 zLPthSAcMNmDia{POa#hARbPrLJ|=em3L=|>%s|c21~^5oym)xmg(fj5(@IpZ{3vfS zJ_H>^x_OI$u0B0&MEmkobF>U2k|f;*0-fBln)JXGXiE8O9rN+i4U@8rge0(qI7U)} zo;hx5L(m6#w4gw#Y{)Jb{#^L9?JmeYlkJ)_CM_B%{mk7bbqLF?dK*0x4kD1jy)43& zXpZrY0AHAGoyHYzAq4_|m240md^g!Tj-a}$kh8e9)YJXol9z`;RPxnz*5GEBM7%x0 zW{Tg*6C5GPnX$p>(<@?P;udDo)+#Hqu=kfpahtcs=3yJAFBXj$(dXeNA6;jhrqZgr z9dsTU-3u%&2r&Hy1D=A^*2vo86B!wqqa<}8dC}bvQPwVUzrv2#Nlq#wiQ~Ch?LF7V z#%&Z_OppzGG)6eg?kjZ-G`yH^VVuRwcYgW~#C$i7jt8%8SEgm#EGTjE$+2Hj&8Pas zR2XM~^N$K8GRihWFN;WV)JZxtha`_Qv&;I<2f%M2?J}pdbSJ*+!mlGQhc?QZwU{e? zJ1KK$Px3@`bLKG8_q6o6N~qEWz~c=hpW?s0ops|i8qnO3Td?qzc6gO3<{<6LW24PB zYtI8#Yj+b2eyVN-567IIS`KxPL+=&)%Tv-xJrv3kLwy1@_IQxI2>PMgWlRDB?Ww%#%4Yx!dyyCQfRdQWnpkgO2Rj$7U41B)U0!CHInMMaA7&9GxBDOLJs1W zCSXDvNa9~g29m-5r1^*zBqy^pAZxYV7aCN&FDy2!^HR#F1)Y0gG%wtDDr!V;8&2V; z51E*k(AKX(8Am-?>TXhs>JVQ>vN;*)`YB&+M$n%K6_P()xltEQ=(beXviv$|$(-Mx znZ8NiFpT%?0`E}zjSn8G-MjTB^6&?0-(E7Sj>kB!_08HDQq7Nyqo*OOeVWilX$x;I z(G%qQ^{Crtn#}X{E*O~(HxkErCFYjBotcAi;BmZdO3ao57xC7+WH~<={fyA2PU4K= zbZRFetY%}|5GM(0A+}dO{+RSClFo=r`MG!55??%OHX^kz%n<|9O{E{S=&fF*r!H-c znr;T~4&Crv^sk$E!7^;^y>{`(%LhZU<7wvOyy88oB_M{q0a0kSsI_Tt6P6!5d?f1 zi*6gQ307%TyumG~aJ|!(zcI@;RXO~w!5#EzMHE)FZj+W$=+UxOt)S7?z)m#(jRO&C zP$0p_$l+GwiD}vL(hZmy-1{Xx?b|nCFNIYpCWDjtJ9z39@mYr-(|10WNj+{zPIT(|&$46|SH?wEibQG@yqQ8gA3PaQ$f_&3F)DCy-rGb?PYkyUl-VH%{XlN|%DoY&UmBFQb)J&r35(JzQZP=83oskuUjW_+QZs9+3gN z_wXB}Mb*^T9uZFXp)rt0@}z5s$ooiN(fzrPeM7VJbx+zU7vEeN0~%KKaG~VttI@Ob z()?;bJ@a&UF^Qkc+5VvLfe_35iC)HYjRwB+@p$Qz-KWDMrHtCN!p2q8VEY zO5v-}3X*|O&SODEZ_Y=deQT@b?exTV?!?hOEUH0V9%xOBNrEYU#qktOxJvs_659@fCAg*x&w-SvG>JkmGZIda|VS0%i9oH?)*Yy-2dS}W- zArrM=V|-K7HH&>FCdPBG__yRbbNMsaf~%20n+jf>ttnBF`sx_wC~`2DgfXG(IvhX0v^5hWVs~cy z(j-~FpRs6;ZA<>J1{${DdKzr@foo-|)#=97P%`l0N7TkoOmutYG`s`(KWyRse|oq~ zAT|oxzi*lRrlUJDO6cQF6#npv7KfIRgDjViJ6rgkX#ZY(3Om>{NPKVhFn;zp__M^N zdG|`G9A~QS051#t%zO97676%{24y67-=QvraulQ6zD-?7eCHD zzOri6Ogs25jL2l!OukhX=t&W|IvjVyG-Y4Dio$uaO{@Fhc2j}73`tC zN@sQ${;p%@B40SYpw`LP2W^*?p6+q^_{U}LYDKr4S1Iv%>mfW)ey;NUnU8g47qfYF zQg^|71y9TZ1mqg14?2Q!1icWXnX$_&Y)lg8KQ@CqJLUJ9qEuDEXF%7!?_a(Q`epo` zYQ_r`q%_n*3isJt^WsotX*d^D4N{DsZ$3RK?Ni|FAXi+gb5g)iKm13CRVKaO^Ut+W z-oMMPLSb;N*mrL;9x>wwbJR0gn>emn7Uq+vd2Ao-dRi9K+T?~cy1KI!G!aWs|8n+L znLQQQeiN%2mHfw7!v>2!({;p?Ufm%!o=0$ATUeKqV1@)F9cLC{RwLpFH_0SMrYtybsX|@Mg$z|bZNQF zr-q+Sg@fz59U!aKUE0bFE|&OQqjZOc(6hK>HG_2A#g8^WPq5k}UoEh5I$a#0(<@DrHF78TOig#+a5jY956gc|1Oytfc>&bUndpdFw4sS0p0c3rmQhq zeLW@8zV4eL4Fr!v4II_M&IT1MfOBy(X|X^ZdIMxgw+W@07qR&o11TH7M4jnLH}L#% z?Hd32W4SMzr2RxRnxFsUWUNTD;b~tivN@MJMA-<7m3wnDmX!!{_zhLGqczpe9=)tP zGBU)bq?$s>$YZ~j0%xxi$SVHodzxFMZfkS(vVjqH`UbZuzRU}X%=wh;(JGU^cbv2mSf*?6-EY>$zi^?~y{w3!^M^Z3A>%};jb&j^h6b4O z`fp`4Y&QwYjj;pU57YL~hd`+$|7?pR%!QWk>_@?w)w&h&k1jBerp2bi$&X_Ep4})G zPsSvUr^ah97LR^2Vig%*eP6^W;t=^&aB1;_MdUHOA~(V%d>mH_K@ zGST;fYZl3nwMWo~Sh6+f+`EKoVFn8<#rYt0U2?$h>KhMupc3xcXT!PdR^XRAe`rVX+ z7PlFu0onuQ54HdNz^p>O0$gi#Klirzv{%SX#dIth++*bEr9dWNjUa-LO$Q$pFhwM3 zx|kzAs>b()mqBrxt$t0nq3bbbK*kexi!YPnhm`z-UCoHdkOvSexM2IH_i#C01d*r_ zYPE5je{vqPW>+Kq-f~h}d=7<-xqwp}q84>g8gL8>;&I$0ARXXp)@3H^rf@#UImvGbXV>9y? zc^x0s@RsJ6XJ~O0T1IbVq~VzIDgXW-F2KqE zY{65nMU0-$Z@r(=rDRjJ3|5e!CoKkEs!&K!NqXit*(H8E-rrD?-^RcHx{DS>o>IVJ z?uHHnu72%H`_eIML=2l7>TC}iZ@bZhqo%-tdp~r==87Ia4A!`hGpdr~j?JJlgGoBQ z_}$(r&_%@K=yzAx@@N0Y9Bfp8Yo+XsoxKJ^R(9DQI9o}t;?hY2sRtFCN>Uu<`4_!) z7G3pf9C^*{0M`KYZz~$5G)gLN*i-WGWbwYIh0?Q^Wh4`bpQo{cMqttFEc{f8G-$rRUCiLOX8(TPVECR7;I3)G$3De!o6NgD=8a<~Tkp2A?7UrMaOX4~= zH7->p*6^QaedTp-PY@nVU~rM!E@lNvK99&gzBDgAi%1Y;y)7v<0ydK>Rjb)uBi~1# z!EQoSAD_#G&<9_)ZhOZVzFf;7WtT>lkf@SakS((K9DH;n>87wC+IO-cxZpv?EDeOB z!G~uNZfLle=9=$zpDV(n#Eh+*>OB~fohz)UnhFYy_I5~8$5ex z@}iu~yG!?kgyzwH_bsY@e)c283O{BXi|1d){|hwk}q^z+LFuS!NKG>I~UuMfVp`O3p4x`-A- zn`0FEE&9hDvsYV5uhDl~d@)tIq`_gmgS?E=JddBfN}~n>8q*^na=znHEV~@xhYju9 zy|b-C?7(4)-=uhX5AiD1v!>d1cx*}Ii#qzVv$By>O<(cZuu{B%N%rhq=a2+97B~G- zI(5m8x1|9uW9H(sGWXok@(UtJ%ul=cn2~{-LI9BLFpdyfKT4&J$m5-dlUmbh+pixRogsWT<@a}c{|eR zbg&f!$DpmK_Mx7r>aWQZa*vf~@o>1knRd5NM1LVVX@u8pX;ok*ogfD-n4yVVn$+S-|0SB{(ZqpGLQL&YI~So z#!CxX8i6fg9dTYHVGPU~pH$~ryv8MSBu*r~o5sp0sZ5b^HDhAfX+h;L!v~T!6AiR?b|x;>{3dm5q_aB z<(z*?sjuC~`T533Vf%J?dABt}sMTU^%_CMm{99tG2mO8OD}S7ke!Cz_K;kxuQ-^TBe~d+k~sNuI76lVnSYMg z=k+seUk$v=BTct?c+w4U!>9*?-BkRyX zRB6*Zo=|QmlAg6a=Oq&9%y=ehe1;2Xdg?z{ofPl28fqkrQ;6m7@xsw99lIVJC~U0j;o^ z?yEqu&mU)EjqYDeNx5jXgQdOySzb}6;<%=qxJ zfNW2sHV1|e*SqXHTJ4;CAw3(9l-hMWf4QhD%>CRXVJlmp%Zk?w8L&AU4ZUA>pWi~a z*!A#OK_R}-d#xZ!MMWp&`@z9t)bq2E>B8?Wf|hb*RMafH@BP#{51*TAj3N@|o?kY6 zeVakObh%wvnBXJ++@@z<)8aR3C8(?6F2Iqdo8GgQk!DD2hU_61nlud`g`444OfRxS zL}oZ0_X1Fzs^gT^_~V(pg#zv}q4t3r{^zh(EE_|wBBPl7Nr8b7oU5>o1U-OD(dRUF zeP?z^J*0;p5f=%yV`!ryWVuXP9KeZCOnjZ~9igqeIA5@&M$AM>p_Sy1yU%~}jkv+4 zj*SAuoO6A<&)*!=na_A2Od~T^I|RHrw#CF8goihh3`P z!-Tn~8o_WZ-$=Z;C#(Vcn_7CsplV~T&RT1fPEBnctumxZJt0e#yI5yE2(EhcO0LIm zJ&Nb6)HBHFy__^V2bX9!^kr;foO9Zr-3TMFJ$9*(UwuE7NxXLm;)yD)OHU+8y!7;2 zP@pX&Y_nRBwpu85HuAZFj}Oqtc4z)RiafqIkp2!oau&PK0*XV59oSglzVlOUC^M=J z;eaG^n71v7-;4;v+uo%r=6&#Tgghc5V#bSwMaqv5lqqd%ZOum)cZa7M2_mL%l(}}5 z1i60%kzKXJM1*`-tqkpr)~gm|@DJ$!{~K6bn$U7jI*9(Ja3EhzBdtKH(McYPdH7)> zk*1>{&Qj_Cam?eO5A~7-9lTgmZ@ZqtiFc_0GD7yt!3si<#8w+f;&h=PTj6#(*va`9 zOHqwz_CA0bgnaYiUvY<|E((yUOU*FQ@W=0oWjCu21f1M~haIkf?GQ?Ote^il3b^An z;Njs7J6XtuI$dmL)kC&Lq!(o{e^bVjEU6-pDwJOG#J6XwaO&ovTL^MyZI=kV@*66J zIqcK07^6LcEVJ!=+FeMP^ndYken-aHH8QyOF_~TnuV!vtwr|;@J7hL-TMNOL% zH2N5c@1nKT=aQy-;4bC<>k!3=A4kNU>$)aQOUDj7#Fx)g7!1BlN z;G&W|L|JjsUrR*_d!XdveQk^O>au$oilde7SXd%`W0z2J@8gNhv5Gx-KQSk4@?zzp zqVmA6;(W--tBmyIAlZ(BNw-KP!$xNbjO%HkU`avsa>iPvm|uVmuDSx9lqQxDz+5^i zQJQ^*4{{;M2BcC_{BsF0NO65R7LSd}l`U^9p7`g(fCPMZuO}qoZouE_OA2h85L{e- zf*DR~2#{odq5r&QND@aJ;4z)`bYz7YY>~0mPtSk6Wc7CiL0~WPgON4?f-V(0?m_4b zQg~It=UZJIGBDU^Qm9&l@67?Q8TDTsEqUk zYXcL`=Y1!T0Q|-v#>(e1 z`nqF=n;~ zW)7yP*oeppruYTnC-T9ftZ|mAG%4?6BF1S@r22lmFDxJguI%q)KvjtQvDhN1Lcjix=%_K3=kv+V&Rw)Ha` zrk)+sR2@zDA8_n6HAFrxtc~3$WJb=ZS!(h30XPc=-D$WkL2fBO9&;yQ9k5XCA_}j(y$xy~@58;-aQz zxmB^ARlYS!RW^Of+XvcvB^JEhoYi^B_p!<8R4r0t6C$(x!_R{l^TF5A(IMcZ z1O+m$JpygY0LBAu7*JHyU|QAqG-YQX8&Hfe4b(LM}O6$jPwXC!E?c5JQ%Z;=XbU{-QtJZ8p{hf zZ&Mo4)C>{nfA8?zUUx=>{`{0}V<-i`x-)P1m+^MiJM{%+NcbG#P>ay?^b*N9DkD4w zL3Q`;D^&C4D(`LWLprj$O%LPkyTc{~b{5=xP3Ie4F^sPo8X?c3puzzo@sGkrt58Eox` zLMgY-ikbeU{l4m{-`Rsit9L^jO4D7qS89_jQ*Bd_lLA+dmx(-aB>FH3VN*&vfZ~%^ zq>iO8%~lM&=4*_95sr{Y!33QAH4hgM9mi~gWKpRb#n+|9ef%eu>M{__;ZaoZBq7C} z)Qeqn`Y=r=D81D2QZ8(4B~eA{#{e_@WcUZNz^+<9*CrcT7QyN1{(HeLMHF@lk%Ze% za&35;PvX9C;u?jWQqhv7G*^=r2t$MsObre33IY>;iHsnng*iicSzze(S|Pj1ZlYIg zfrb)iPJ{ddAFOlcg!c|*-5l0W)AOGZrT zLlibT$enDD(G~*BwOi97i7EFF>wGx0J?q%ZuLVu3H}Pl~O`XPVYL?wEEnuIm(LMQ` zv0!4ccpLr@uxZ%n#1sTsjfUU4#c(E#KMtEz#SP(CBkA}}rz_X8V)cWJ8zMwcF$>Fu zhq3Y3xngtuHXY>Y^L17hdF`VX=*$nxWt8cXH zIDJgGxuFHGdIqbk6u8`1dHhF;9bJ2{+Mk)(Ete`*5qx*ohymyM&iVTaryZ0|QVuwV zcFN$;)1Uxve&g51dZgzh*ZsXFQhdUg?}D6DPqaXnvv6g&@9B1}!|aUipHoBtaJXYQ`@_QXo! z*@Q#b$BYW!t<~@9;+JdQ78j$knoI^QMZ1Rw6p;JRj(c)_czHve18#sevlxYhR!o=i zo&(ap{jCDHT>L@a*gnik=~Wz1|M{s+==`dksV{*Wb$B>kZ8OH{@Ld&+!AKo-8$~b( z>AI&1+?#YBaYsA#<;CxOW=j9g7ABZgq^FY`Zn9>-@j2xEQI!)1Q*r!K_5JZV?1jK- zZHEd{@CFU0B`-ncrl<#>*;p1+-V0V<57pKgj}k|NuTi#7Of6K-S{^)HU9cA&Yq?$Q znd3Mz_MwP6bq$qEGoCEOo#LQ-&Yon#~sRLZ2UvoKJn$OqPy!LEzY>rSb7a0e2ap z=Aw}E2%{D*&>!Kg_}PEx$)rLkSk6!=r+|ve%E}=rY`-zz4P^Jlv>{@N19gGL#2(ML zIfsR0tPA`7ffZP$I>0D~q!(R18JjkJurdLsZyWo+m2qf}ga_pnvKU#=qzcSsL9m zDToRMOW)S=dnH}7vpK5O6@Q<%dgW;Oe)0RpH${CMU8kdJ$GKbdOvMkql-PNT2=qih z`+a`CHYbX9K5{|847y82IX;QmQi6yRI)j6?jnIfL=moY%&=S9g$9Cb-QFx@5L&>`_ zB$c$k@3MiqIR-b;C!H8}6I8G4`ve4)4!9(dKL5BW{&wlKf3~kXNhZpB%`utEXv}pv zmPA$Z(z}w&vazGH7mQzin$>&vurQ@--|^C2FwZb`-*2e%H-AVr?gucmn&sN#|o=LW?2WrCDDwUTvWxwF}JDsBS9-Ly<{zC|2<^?zZV7P%(jYQo zfQ8tnKc~fC4!PdmqLsmqG@%IguMNQp$ad|;nm>Nb31l|aIzq}?(SR!t;;i}aX`yw> zNYV?rr1uBZ)qlU_h=T7eZ0FXgY6L%vP@ZT`Us;QP=&ye~QmYk3n&>xgl1aAJ?yX&V z+0Q%AIC?m$E+3+i;XQkt?DKX%ZBlgZ@YK5*6e#<)uT|mJ*}N#fn*1X5;!w;MYU&5Y z8#o9PWLN+~<=n=|UE6$|L&u3ndDj&A7JR@AZnLp$_J8QZjUI-@o4P8*>&MT06kQ#+ zla=iyA$Ys7?HEPHT{Jeveoi<{lKjzV2uHyZWHK|4>JDLx^gr3bqrF7cL9Khje>ht~ zzHtHG6m)+KlDa zMQI1mH5IN9>_(uTCH@s?p8^4^WmO1dGiuG$(4*#O>PHOzKy=|_N{ct-@64jfC zk{?<~-^MNaQ?7Zex>eu6WjdeUX8-YaSNom1rAg)Lf=w}GcCUXgjoVOj*;lU$Y&8lbQDCvSNV z9Irg26rkL*y{#@y%?tDGJq=ev=wLrrtwBQrT>Mmo>3&vk&TT4YQ}8VF`~!qi@WB59 zgoDoR)L-ncjO9Tkd$@Cd_V29^E=qClmtF@AhczKDZDoH!kWR_dj~Eyjs=3b&Jqb=C z2&8WS6=&dQ;lE+e0wMcra(DD`K%NxH{NG?`8CqLAJAkCP76OM$Um?loK>kT8By=TS zxTXN$H@ga_ke$;lpLX_Esz5x<*UJC^jZ+tSZ8I;_2N7gPxZd;3vT)j}E+Q$k z7FyJ=Wtf2bT1ar@eMw)Xcki5KWC8(^VKw0+duW;?>S09iV z5*c^;cmC<*ybt_2d~E^sFRAnYocP2%12L}SMy-xs1?AgH9O~m1g8n64V9Squ=jmSd zgM;}*4__ujIwrCsw6BrH3dWH~rQ0QW*8u|qmY_~OiM$(zs8lgzj1SvY8F;}3{m-E~ z0mq4uu`F`VT5KdA{b%co-u>W`A(6idE|9MpuXbSGf*BnvgX)D{TaNA>F?s!&g>t>G z6#e8DiE{4(pJR1#--g=1-h&qWYmDJUAN8LU-3P&6hXaEbc|247${!$Sx7+EUYklO) zt}nlAHm|`J`<{`Fnm|6*CN z`Rmy&#uM53vVdGEj1Df~Qt9tJ5H}g_5;`QI6ckLiVe9&TH`#l*9_U*dxAJnH!R zM(WtjKQHpma!_ZH2)UWS1*Cq=%g{=`EyXv4(u&bQXx1!w-05#7y0_DE>%a@V|Gv}T z@j2G8ZDFymOX|%SIpWrK02&psOaNueID4bZ9*HYns-ur^OTf0z=Y^BDpp1hO9ayk0 z=EUcn;grm-W$*6`=c`9ph@Se)w&Tjs^Fk_8&n^zGLHooR+fAX-M6)fXwy)+S3c3Dp{lnQ|?qK3l`%A~DwfvPGMK zdFuv3)97mkstN;E=rCY8#~swHll<9bz(J4f^1kYCiE9S0c5RYY5 zHA!4sN-{yGtX*a4xQ*fhhNbH2$Fk9zf0?{v7clvb^;N&?2)nC?&NHo9r)I8pXA2ML zflGu1+{xLoPIi5R^%40DWfaf4#^BWmeg4`vEp9;-2LSH=@_ssgW&z z%NQqH4!dXCVAB4*Q_*Q0eAc0XTafecr-uHDRPN?;7W zsRkQp6FmC*DiYbkaz4+=K(D}{b^mS7f4G3F=f>0-G86gkR!Nzew`-F8iV4jq<8=-2 z)oaU%hee~%N*6=HL$9<8BCfN`)>Uj*)?dhueQA<>%}yjPQ2xN$d(1!iWBe>H?p3a% zku34wT<@}oR^g-8=j1pfH4W6Mc?pY~heZ`@hU7KQZbYYVw?V&h8VQFQx7`>KRd@3r z(+8&}V#660KDg;7&*9!&^)64m%kgqm1e}&C9PTdVhPNAZNT(6`OG0N#@2uTAsPJOQ zdxDueO_QCoZ`S9Qmt1wj2V+v{rLqYbc#UYXX|R!ZBM?&7&$+}D=!wL}kRi!4kGiaf zLZK7Lrk7i>{)uNwnk%r5w_naaSelKJNNqnIu9TWfLdmXB7-Y+MHP>`DcaSe?YSV7Z z{kG5y{^#_YV&WG!y5xDw_#F6=FF(xCAPsa-Yps%0>dO47iddT`Ev%^fSUbMACy zjX|{VP=^yY&yzQf1xpCjGjBt%9u6SWQTveMQZxs%HVVB@68XuEah4F1)1kAz_Rz^9 zIN=eM;Ar;e&5z@psRq_#mF~R7Nl7sN0gdmmBhVvJzzE{vh1;#8Tb)DW^-m3L&YyKy z9l5jUBuPeRul9rnMNpdtHsFPz(V7u*v)B2`AIqn{>S5NVo-iHU!zT-zCiky~O8hO5 z_`YVj{)aWf51PNoNzA+^)w+^Kkv3oW@ngq(TPk*SbvamGM!Oooc-O#2CLQRf#cPtk zl_tLp*&^R@op`W2e%bS-Hg1*91XtdAGI6irmC|~Gx!=d^u}b}axV7~9QtAY-`kk2m za>>El{clrqy#zg9l?~a~n38^@-x+&#oH68RP+x;nvY)KS@cpRgT)V2XY`%aJ|M~c~ zVLApxT%SHID&XnJpI6hEF_}~;W8dBV^!>HfqvG-OX|ygTegYx19TQg7Z&%f;Ww{}q zAhM^E99^OU*PSV5tBQeG*cudY<)2obb(X$4xZ|JW~CcT$fZuBQj7&Yd=xgM03ns#3#qv z^I4Q_(0agaZ8cr|)*in)ZBxSHl8;Q`&l92wWjmez1_S20w+TLbo%Nz`l-=%bbkZxH zS!3BlT~TrQ*lZQ9?$;W1rMt%!=~pggeGQPgBwx@92ngRxNhniQwe|a99XsMEjyRbD zs9&X#Z&_e&#I_i=r(~ygItC%UXReW?*3L0vfPEY0v8#G{r-Pr)M8o`QuM`(xr)b# zkBwdJ@z>=6_W)qi%ZOizEx#v4PiP!z`jXB%xx&OzXh$eTNwoN_S968bJ=BA@M*;H! ztpM^ATpkzNU$buBm7S}WKC3I?r5rhxWU~;HE2Yutb~e}Ky%G8QOLFP2v{Znt?N_7e z9!xb+nKe~W=V2ba;%+5MrY0e)@b6R&YCM)P;^mHd2@PA6DV}czI(sI)wl0A}Zr~Yx zXE^=r(u<7@m^vs(cRUR0Rj=fK@iT}-`rbSM^76r`!ym_T6z_?@2=Cc&W&v**-25Lo zUPC~(t6{(v_$y5NJTM^%#*w^K2H5|HsH_oSXbr`AlLklWs#iJnjsJP?sGnwf?}-n+ zWiT9AQkjtE(3&!)7BODo*Px&{|1YFuuX@uX2Ci27AX3{P^Ej*w$z5=#)i^F-I|aB5 zd=3gquX}VT0iX4(DwPEV_0`M-2lyjcudZwc)@h$*)J`aOOQj0iOvN+>D@V}@gerdG z|87uPAnkLwUKXW=TT*WnzPj6Yq~U%lsz(U@InOw$z~UWG$XEkqC4`2q14-AZuOe>bhZae$+>Lv?pgU&wa&GFK=w{ zN@p>Nj^4X3kyU--7WC^MfDrZpr179@DG3m#`9_bk;?wPkx4^c_WQhsLSY;^?w0a99 z37rvP(E-iZK_^eIaQ%-TCY5J?OD~dvsJ$p202}Y>qGS+z4?y;ZKv@rZaUFcJ>0Fve z2qOFEXlQbC#Ox{IwM`xUYh;@*{-y$U02C&8aXEeK)-9U96m}rb_3PK2=XpWKperg` zgbOsh@_)OQzj+MW74fy4$wsL%iH|NCebq~(z`5dTWB<-#py6a4!4$6vdWOv^qFGbZ z7xO#6>0$7s0Xz49G1yWpBVHHpGrUbF500_;9U~MV5PMmcc(I>jbWi^di1_0KQa}HS zy}Vi!oE8i5A93as+MR%ke^7fr3f!`By!%dX;Xl};${;74zy2L`VKl@bbEPZt-Wqlh z{;*JyXCZ}O?79ApC!mnr;>&==6h4jcGz`W_>ZGyaZ^^xRcBQb5aa|hSxEZWqkOm;7fX(u;Ad2KyqoF1@oQ3Ps)W`nfrK*JQ zaxCWxOOo_2B}6Q6zf*TUA!F)xG6Yh{S}yGtYA zTq_;%&`W(^uyubm7XD<+X=@*sBQR(P`=@aqZBZqBpGJ@cq6ON7Y2QYSYly>mnyYjh zU?SKB$~&%3wP|i92z6W84=PD(UZNYDoDOyF)e%xC1#lj=*0WOGl(p?*yP@!5vw8hKqXoLXb*90%=SyHst<- z|D@2yKyKjNvdOHu?D@N}TwRCdVQiViw#me#IKfFkkyreL1TzfT^-EUvh||uffiji( z>vyX7ELWq1w5@F-CRgO$L*8D~G3dSYM`K7uR2;m};o>s6=3q!GrDg41Xr4L z$9rk0%zg$^s&WIql)Zn0TqA?dw`&|({07S3y#0D%)=EyK1@enk>CRh9O`eSi&ILZj ziluU!f)uG#l2t2~4EEdbQ-1{qjzosk+jiUq%A&EQz8&Rz4tw8poMtUc9jIMcz-xY` zPZp#e1b+P0yuI*Uy-c2G=BK2;&&Uaha81o_0aKXpHy&?`3CRa}hHf3}Y1_F=8Y~XD=E^cO-qXKXj6U$;FX3XidA{YIJT|&)e(haEa z1iyKzgR0mrZEED+0f&)AMH}4Nki7Vrkc8tx_MmceOFw-kG+?J(uii78$hD#Mn90&1 z)98aFkA9lirh!~t<%KunkVKA0M1oONSJ-)%fkAqW%Ajh&Y&Ruflg#4wyllBd&fKhH_;bQ?6SS!4d?G-~8VY3lT)2BXMV`mkC%!Ds+!a0x4{O)Qy~=W z{HH$j_Cvb{lO~rQHJcjtMY^`3u~aU(OPa!UQnQtqW?_|^O^&4S%T@meJMAI2OQ@}Y z@=W-3GA17%wa?k9C!7jJNU15b)K!p@;oa;2?b0ITG4q%z1h+_g#lw;8ag_naxFmKn z+xR`&j9?eYWjp;70!}oly)rWOD=Ew3vxoICPslTG|_8FPYdv#$}I`YFv6!W1O7#`$nfYc0Z3!$J+ zl$sgw+wwYBs`0DX?w_r)6k1c&@s3b;B-=eJuEG?K2gaL}G;?)I!R-^QZF}|x+e$A7 z6!jc`24Ss5NMXwqs>lNN74T zB+rmEWzgXxaB+ACh&PxyfPBwKU3EDGC`GPj{QoQ%zkn`;5w-3Ch29+?ie8mr0lI08 zh4;T$tryAzHJO5{hb{Vh=1`2-7<3Mv=yL`6fS*Y0)Fl{ zyM4OodxE#WxdG(^ZL)_0N{a63s>$Ku=%ppE>qJB(*RKOFiD6=AW@b`SwvUc@IXMe( zgqzfW+Lm^eZ4&?pFSba*$;=j4FGU{l1~Myvh)-VlG5+W<2EHbk1rS~@fKR^E0WV>L zhPnTDP}u!XHf-Js`en7+9SvZSmm#-LQ4|NqJ9CVEjg5_Zb+%216^veMSE-XE|at~fW`6U19RY%w2MAa5TPMDE4(YuQ& z+Vv$N$d`Z`m`RX#hdBc^J^h}P)p))d6XS$a!UaYnC_HxF@XTbIVXZ!d61;j(a zTK-$3Pez^)2R-1h)pyuaPAv)J2B7_4B((Vf&EU%b358M}A zzm2A*O?;=}zI(9LX27$$;Ir`=SoK1Vrhi=tI2=jLLf`tWoa3Ef4SQ1BM0=RYvK-en0$6#uD4imR{b^=r3#bH@zX$xJsfb3Mg!!jyJYycZ#F>LIZ27N;RAxO{ISRelI5MYmm)yI znox4du+dm01A?dG{_b~hSC!DG7LKMEdAG@B6`{D48Vj&*%%%$<6LDBPdTTnG@rK%9 zT(5})B*xkY7l>>Ot;kjgVSA!{Xerl_R7@Sl6P-$W^QOf!E|6pxVB$;D>Nj!s-QqR5 z*XJO5rUTNZ)F#p2u5A1KCBju%HHq(6S6310yKBYg&rPqiBktSW1#st;`Y0%8ob`P! zAYZDR;|$BO;XlIn4Xm%}mYL~L4!V2Bc%HpX$XWSP`#W@X^@GX0wsoVnkCbJJ==4iA zThzqf7skmonu1iH&gRUAWzQcd`}H<*Kk~B@_e)8F@pWPxYjfs><&F)D z$F3)-teYos>+b4*k4|#Zdi0ZDhbQ*%Q)7QZWidCYy`${-8|6Z3A9}m-&Uj{oj>Vv& zPXs$@dvJL8!)QP&2Z(gGRVWhA8Po*^*tg^6+R~Y-3w|z^|4xgyZP#=~Vou&SC^qb9 z)zO{ti2|8rX{}{MxYj*-scRn&H0MO@K*C(BYT7xu0CiS` ziCQH3>^GCRxUHm(O4>*Y>XYEqKA^ygO5UCeZ80uNc+I^osbvy+;vP}D!|*39lxRI- z>)T#UvY61MVg0nuAMW0Hb<^-v#XK9(CgbU;N0#cdXXF1hD^^EF-Q82~tabN&em>RF zi9h@RvB-5lqQd@9>9)bm9Gc_F7k5P13igC!A1eRWTGv{U)Lx=N03M8-EYU@rtn~?( zA$I0|mk9S#4ugE@fCT<3;r7gCZ(OrKH8rrJuWjWK1AHOXK3dix$DrwkNUynl-9VOr zUXeg$%W@i^CrYqGls4pIxj?|-V(@RS^Ph~nkp{@PxoN+Vxyenoi{4Bx266tF**lX9 zs~R;e=@Q$0zUQM&+ddUWaj#~~^0MNt*-@dp0$7wCEEoE8Vd$$iXxI)WY#O1P5e*#iPNThBgiY=<9FAqZYW*QBg(Up5uLsAp9PcZL* zcWY}qq!xGrVM~nnC0+pP=MPhx#~Xg@V(OQPvKad6{QR~H{3 zuiBBeB`1$yQ@OubhXjj0Xnd7BtezLTy~BvP4tw3CN-rfSeO_Qe0YET6?w* zMB2R{WTCV?`p*MkN-EuX7Z<>L5}~1r78V=Qm`&b1)qu&hnKJVlh?b`26UQziB|<*F zdKdC5*{Rq+W0^|9)YP;gWH-aZ?Hi+7pTuvfSy<$_zWj9K)?Y~%5DEFYuR*1aeD`!U z?d_YPMnmw3IHA?Cys*8qzE3BlnO=N%DS*D3v%ZW1Cp=(#gKJI*QtdHg+&~P3;Dm#t z6}WnkphZ$zQo_wsOU5E)+Wz(XpFe*dyd=CvNazn1M|D=hU@En4$LkT>+uKFjoWKe- z3O@i)&fkC8GJI2)m}Z;&qd`Fp2_r3N*zVuxaGyKZ(<*J_|Df(GOQQrE`#OP!T~|q*J<^VSpi}yK5-v7(#}U7&!O%{C7XQ=j?g0=hdFK z3=F@xNz{m)2q0r&jhjGS?L@(0EZb_W;@SCZ0voTY~# zy=M;Yi||Ep7z9`!_oFYFvPulCQ58I*^W2i^xDP#^;cgyO>LAZXN`t`CbK$ddjSQ-{ z^&m99OV;_-27A$Hh(;#bBBdVPE$vAh*r{b6wA{UevLn{b4BHZS^s4Ks?*TQ!w*2ZszGsKLr3juz-(Xg--H+?LgdN>WUCU|zYy4IQ0| znQ<-R=6wbC-@XAI3o2e|Qa~2&?z}8$h{3jnk(x%k$%fRw30R_B0vM*uOw!-D0`=gU z(+B)P-O4Uzqv5K!5k1GPDl&gPr972S(K@=t@f433L(1Y;qq23zEuO63xC36pbT}T- zcQ}9;VbisY2$_b^O*a)K9si#VIHBKqEZ7vk!~dlMg%r<$tu$08C7Km{_Wt7Y?WcGo z|I%z8n!p4)9nb#Rww#<(wFrW%K*5Rkvx*mI(Fb$<|3K~l6o6I#4?cUMKLyf%b6|jf z@n44(dEdIjA4*9|^N^4IufL?gOidjfA0HppLpp8r0CpDaC^x`9YgnvT)&+`osmrDR z5)8w=?|$_mobE!Fni=X+Oiu+)3bPoF;nVJ&{({+g1v7g1UoJ%HT+ zF!uC!m)f9QI5EJLh#o_V^}xDHB=ZJTDAu6dzj^zQcvHyAs`$nYU=sPW>yuOLKf-%j zI#cT$ENOt}@%aDQ%KwudtPgb#m9?w6I=Cl<1rW6qFAf+PeJyxK*9ykoo0ovsx5&cy z(GuJs5N;?x@|V=o(5SM8G!BDhOoF~I zAMv>7@m^sgKNb;{r}b{D8DtBvwjyp!_bMr_8RX%x7BAr1@&MxwKhL(L!E3QoZprw8 zmg&XocKu`A$_-R83N~JmE58>6eGWlmgu9j|!o>cV;D}!=n+Kb&JDdX!P7&b3&X;!T zGnQx@kuT$E_nH`w#|(wfhwF{z!~N*V_Oc1^@QeOYEkWWx>?XziMqKXF>Oa!Xo@es; zeb9=`?mRdvi1nQte8~m$UQh6@{c7LCD6Ro1RyNXM>zjX$UbD7(jh&-xkEW^0@4erD zK%2h-0t^L`T~GX&p^1qJ;M?eq0CKUT1&JoSI&KEB*6pE9SI#=8aO?KGY^LskD*2iP zB~CFKht08{8)~;fZEo@C_g5w!^UN8x47=GPC=ZrK^kAVx(C%;S)#`14=l}Y#X}_>I z`i#Gol^m~;@8owloIBl6bfpcouvC3Oj_35k?B|5z<;rlC65RgCbI zrJStM6+A2+7&*wwxqi?aJG4SpjDE5x%0S$IcMo+eCOUsOG8wscZ;=}KL)HhU?QHIW zX$IH}DYhrab<1@)2Rd9UX;ja;Xw9H*0^gUNx+7_&;0nXNDGFy^=e)F{lJqpN3yCxSgc-&o2LeSqpIw z=--ix|6$2)Qe3YpsxsTE#jD7d3wfa^eFkoCa?AI8oiJaJ~ z2Nuz#l&(BX()A6HTe&}A`$mG5FRZ3x%2ewowTt6Ulyv~{z0H@ax@KDV`Uq09Gr?R) zg9=qhd=lF=UhHe|)n2ORm-dvF-ri@TL*}RxgB^OjrqGfS!xt}1+M-Gia_^Pal7R2{!reS<(ki^?s)@?@Z5n#w0?dj0l+rkqh7}A5 z20)d!aR6A>$6&M@0BTgeK2~I62D-3lDzyJJwg;!V|#(V{Fa}LCiDX zN9B81KM5j4BRAAvS0XT+dwV;# zF&z=U+_nh-2=`YxZr%w-OFq_651EQ`_9qO z;KOS+vmKOC-o!=^3$Uh^yx2>V4gfDvGFC2}Y1v}Ltw8gkykd1 zwi)%{Id22j4fAO~(8HZpxW zLGt_e^Sxb&@WlPWSn>#Qn4Zff^i2d`@wY#&b0K-U+V0=qIqfm5o%FR@mLJJdS^;|=F))YOfy=`Cu7=^7=#6Lb@wq^? zFeo)}dmLDBO<)&;xd5OTo~{I{VQLAz!4Cbe8&~fT!TuPk2CsniVxkg&)7T(c;|T&s zmw9HqgPYwi!TP)Y>GV`&h>4PN^PlP%{7B>-TC2$V6l0n=fp&&1Xi;sWpM1YUz@)D{EAZ( z%Gi0RHCkQL&d zSu*jA)VjG^PJZj)sXCbk_UK!7hDn=jI>m5_j8JL2rOHf+B`jkt9k+4)N&K8!J(AW= zu0vw*0HuI#i$TiyTt7Nl%h4x6qp66gMGiV7FBX=&)Edt*!Bnim_LyY_;r+q1=QZ!w zS!>czx}V?wGkI(On*YvKY6~2+nc`7)(!5Kmt6-0QtR`t}@bYU#@$2th{aYc)sMo<2 z6B;Jl5F#lKS7?LA0MYa};F*P3_Y5$O;}G5>*oF@WxA8M&g_NZxR}XKg;Ml)|0o+(a zHUx=sOtG;M=rNewFIf|)rrljERHgCc!frZ0yPWzqEzfop@>=gP&)-jZcu@S8k%|Yo z<>jwxo;*7tm*T<|NfEw?Cyim`q-w)w=tT*i4arm_w>Tu z;gZ);NSJBy`j#B2cqi8F?DynQOC^!lh1Uk$TC=Qd&&NmnQlPxJc;{fl2#GEK3-Bq_ zppc}+glmtOy||UuaH1#1pWSK|$}ddA)c1uKb=2AY`SgoVlviw0dQ|Y%jpF-dg+7^W z%n$m13@x(nKZnkBRr5K6$qI@e4n*9#jhs-viPbGrsQrusoMMGFxhp%Sz*ewC(H#}) zLP@Tx0|h92by1%utW)=RlpZx#8{52caJ$UCKs(w}M8`r=L7>|#TsgWUu0p5qWq~=j zbzheX!SJ~apKa}7o`pxZEyNBnGVPc$Enz-3VxNv&K2Z*izEtD2)A^npnoX;M=E>MM zPp)dK``$FP)KoB$_-jxeS|V#M+8r-gpU4zrt)jCp7M+}YwtKo!jjh}A7q))v+%sO{ zvKAD-`fv(UmZ!4vY@#2!U-hN(QOAt$djGcvOJe#d0&9D3lrWft)heI*yhgnnRm)Kn z;f-8HHP|@aLF_mmX~DL?9chR7%pzo9 zB;HcD{zPr2<-}$w^?Qum@&%V4CTbGk@`!D5%R^~>TJ7CHp>%PIe}JpK zSB*k#_29hC3{8E3Wi(wvjJ+D>ny_Q(!1}JfIex=qFH*H`E=lC@;};zXP0pkujyi6v-u{cs zOv10RWv}{JAE|F90r_HG2!A(zv}THe^J54ag7o;QoB0*3;>@>EwXf^KD!l4b3;2ac zSvqFstT0DMO84JA)C2`Eh<3OIa@(W6OQleaYs?_N-Q+|gqC^%{l((!;?;ieTpzvVmXHn^O0OtQO<)mYIz$s=mc!@ zXBG)zB@3CW9djOK!2BCdf89c2?$6Y-KV&F_a}O~Mlc3& z8Rf}|f_ASV5W{+19Zlyk_^m5=^?uJv@sgQEUfP7m=M$xW12l+-O^y)cZFqbdQTcsR zvq~EK1}vN$Ha5qzBW6aL-T8M1gO{jFEv34-hhDjY(diEgG%^ff&ErTJos?Hxp_3Tz zTlgX_J^I5tjN!Xhs-6oYWWg245}mKy2V==;YcUq@XNAt;#-zbsmsaGq5wzD^RW%c! zVq;F_li4bAiLG7NP~F8b;`>el%kfS$Z`fpNruwga4VWQ*WV#l7Z0NPqMs8T~+PY%3 zSibnYh-a8|_)Jw;{K6PEKa)cMv8uv3q zr&b3hq9+;F)MgxhW_HYXYh7M<_o^pdfpI+L=#)34lkD3opZGk{xDga7woSxlK9+mX zy63f3M21$=yP_#O4gf&4I(?OyNdSvB+H4C5gjTBdu>nFBl zss_+<%(|$0YQPm6GNQSgVAFFRCyoM;x~GihFa;O!x1lgk1wrnfzH+mbHwcEHax?U6 zp$U81w2qxL8*3K$mr`OXNQ0-da5jd<)!!>TQKaQ{oj8)+re1{FSTsEr~5-1I(AQz>Vf!gPX&Z9UvsE+&~@Vl$lCR5&S?&w&JMq? zt8;q1=#AP-e~n!KeQ@-nycbq!gQ&Ta#pv5j7*)EgvXDPJk?2XbIZW8zQZRZFJZN-0 zzz;QjR#1pO8Jo-0n5cHC6o%$?v;zdX69umb4dM*V-5U3=&QqpNOtRtXwJ%8cLp=h@ zn0e(|U{Ysj{3=IEiHZd_c;_^=O_Hx3yk z!%J<|SzG3ObAPVbdGN}Z3cS6)nG>;1jdU#Ykqyq%Z|G4MwY@4;0*Ij6Cl5-r`I$6Z zzkGv6BXoIg2a!6G5q_(8lRJ}6^r*&DbILqC{E$cUdD0=|R?@;cH?mt=`pZzZmh>IC zl^BaYMRF`3VOF~JLxF|(^S`7Dvbtb;qW{x>WjK|(@4#Hme~ z1cGoW7s)jkORC_Rw)fvBTJu^_T&nCf@77zJAIZuA#NVSDE83;PHjb3--k-xoVRVO& zj+eIIpGDf9x7M$29LB_zHN7?>E#lg-@B?Go7IQIq_K1${{gnXD!S_C$JRiA*IbR*sL7~leowjP;S~RTT-}RlqgSUv+0-zk zJ>2j3YDb?;baC9ajYb|h1AE{D#Vpm6mr|;b$NN?NBRf+TW8}KGIQm~j7gi!>3rk}l z_;PB&>cw^5o%Rd1?xu&6pM+D$Q=c;EM$t$XwU0);OVi^J^DR8>1v>8)IQdxE2sF_M z{V9Ma)lXW490{kaIw%sMnyk9@3Nyw6wdz5HHF$mdBe=&ua1k@swQ!d97&XLw2f}QqkFSPb_r4T|Ku0 zNvB`%flC#r!5z2Flvvkl+9dBKFYFy=*9F;l8g$NSES^HLylH$#R#`r z!c3l_`#xNG^Cs;o(R!c*Z)V(6I419v$1RuhIc`Z$>E%;+e@ZA#N4~8LnsjSZdvf(| zwrIt^nGjh;toAI|MrGeS8};Jp^z7w4d!6X+9#p#XL?t${<6WdybWv4ZOoo%roT1mn#fd}wCSA{o{0end z$agi#qso1-G|hPgl{iAgyc-i@=~I19eVpU_8t*`=RxEUM+7ewV{rGmvVD@2GZ4F}S z$IV4*t2`*(bZVYXZb{sBV%u(*6FK=<)@^l3R-s;bF?16i8BZTISJ&N-B6QI0-5AcD z-4V6xn>GuLAL{=>Z3{DZQLWrJ=|GVPglc(V^+R$xKdR#~e z%B~jLPhaWyg-V~&?&$NasKXZ7p_yIG%mdjg&Se~X?{WAXewvQAhn6QE^TDtlY|wP# zYuPrt{&jg_++(Q82NMf!rz!*U2GwthJVK6s)LlLM=yH^PST+E%<>%f~@R}9k{q+C+ zTY-SYhq?9{QcKb2k7PYn-rLN3`Dmw3ct>++Xz7Jou>1OMY~Z%=v>GCAXUauUX&}hw z1$uBArPzqOG=Ip4@t$l zJ3ei)z3hRpAWV-|fL;559i1r5 z)xc6)vhA`ABdmN@Lr{oLK#kWQ1BKeQEV)G!)airlKqQx6M8sfIQyOS_^ayqsoShGO zuv%IMAQj{;-cxyi7f{Rqtfy)F$-J?CgUth6r_T2OE7uGz9&a6FTz@AAs4pU}4>i$# z@M6dtBuDk3dBrND;>sF46Xp9*98Z5tsI52cAoiMdI4tHi4miI*XMxguQaJs1%q(rYbUdN{ z<v?hpi$4t$#rw>r3K{V;_S*9$L^b?1Ufc22C;DPiQDfSstDvq{S9@x#^v7e{qC5WC zEB(QrW}(yUWESdL7B~-(pNQ{DSzcJ(Y|t9Ltq2FS?W0M?pN9u9S|{lmPDr-iS2Gyp zRaR%K!uoee`m$9!u7|~?R$Mdr(YC?B%yUzt(zuG7UD2A|H^seCJx&s?$C1GVSX5P1C_P2X=XlPYg!Uw?-*TgHLk0^Gkz5*kOzZ>S5zedjC!-? zEr}dzt5O@RG&m_A-Zff)rzLm!KA|^c2`yIR(vM{Wf+UKH@uZo9I(Tw(*>dgTqY8H= zT@7UkA4)U01Kx$?k6LeEK$|k1wa%mS1;uz$H;35@{v6TGb1jKQZm5 z)>ZU0M+~gJ7JmSXu`2NIo-zYb2sJC{Ce#GFdTT0r8I?T~Ty4y{c0!>n6C~4$`Gm7|qxN?|~bnxQ=6S-ms9ytLP^u;v4k)K4Ee&&K@q% z@l5}2*}6Jz8}+5PmqV8ds1X&(*O?LKj`Q#YU?CJV+-p+!8gJC&**t~m-%46PjEDC2 z7kO;Gv{i zqv!+(A`!k{(qO|i3KKVS;x|uq0Az0sLCOl|IK>O-hC4mMvI_bJm66i|ObL*WZUFIr zI>>T-#YI1BdX!(cp5)yKwO7%!2=`Wu1MSbrY{q&T41jC_(shTVkzP!UPRQ+d#FGyf z7Z*jbz(F(KmpD;SP|(xE6&35NZfFSXJh5QS{zZm+o$C>ezEUXU}i|cd$(o!0nDXpb{)LY|sNDDV($#T$S@b2B_Mrw$9GZ_Ipe` z4OQ?uqW0)$2&1z6O=4o0^`j{ikaP%4Gsvc29jvIvrvNvjPk#65-(u&)6D>hO7?`gat&RzAkp^p*3NWr+biRdRO>j>O^fF!L)@tHA0+afeW904GVq z`;MlgqthRW<@DY#O*O62c0V~eihTs+y5Qb|fF#6e9zcK?iYJBcY!&BRU}s_kn4KBRYe#Y=MBV-7_D3u(UQeAB>XYFaV=Z(7ERagv3<8fuU8&L zpPa2Z9ZD@XzOm#kGUPzTZ>(!(ZpXQl8kIicPTwHU$EL#wCrTzN8>Qqs!LbhFK_G|y z0fqyG+ajs%kC3-_B8nc(2HoZPhT9aXk}BFxR=gA&g8OvYVWKruXkL#sr$vE4h3R3> z61Mn+-qpF&?fuB3>8NN{m}LC5u>(=5PPOBzUp;eAa9qMcC>8%)iMEEul6Mc@AU&A; z>sMT$dFwH4N|9`ZTkP?t6A$y5@hB(eV?@K*(nV_-knekIa)Kv(UHeOJbH({|a5ft|8uknO$N*JCn zW&Q!7)vcdQsR9tawa}UQyLe54xeF|3*pm%h0K~ zNG+wJO8p&i>L@X<0Z+78?&_@>_us-*{+muV*}_>eIdaZwCTBg=i4I3)PW;T3;!!u2 zZ;%#qCg=|QDuT%^kINzQ?jhoB0hTrfb!N7m4IDodQDcW34;C5bqWMsSm>?OY?uxf< z{%^awWVipW^c`M?@y$ng`l^$Zv{W7Ck7?uOqLZ8==Qs&&>fpm2W)HwBULgv!iN%UJ*E&s z@8k&d(@1N{A1>S2T1%&I%j#M$u?tUElIJ%@rn{>dPdw>h7fd84gGoL*j#%rTRB7bl z@V&kxUN(D1V?Dy)E=-ydUYr-~Y?(+fJWkRXmyRu`wYFEJ_S|_JE4EeRId6m5pSf1w zaP|R(q5^vVk!(LdKfs#0)fkB)o(<2`xoZGLZaN{~cPJ(l<)E8)afq#$y$C z-dZ6x-ZUY(*)g%N*@yZEZZB;khS*eWG}L-NFIK}9ONLeh?7H;7eTAgg9UqROr{ma1 z;8lk~%gRM-M~iv=_=Gaux7|}#zEVC|6$*3O8;y$;-%*f;an{hOP3!e{3CYnbI4XyE zcUH7#TVkC>Pg*cDfiH&xi7p+?RMX@Q(hiTDL_?vM`8{Au_{SsAc6A_!T|m`lytcvB zZCKZanLei}D*Ny@Y{_}uvSg;J{8gV>cP(AX)E6swh+q(i^^8tUW~p^A)(GP+av$)D zttRbnGm0tD53biAO6yB$y2X~XZ#+ComO%O>w4XfsN9CKhAqD)9@2|*o(K2>x<5ZZ2 zuL8v5+uuVJPq*n12L%Fig#-@j@hX;ce@l`mB~j(<6tlc)FiVf7LmbNcK;_o@KD1WX zpQFrlOS|_7-@f)uPTW30Er(feV`AB|=3g&+ex8N7su0|`;n`>uKnQ_AfUW>1fG>H4 z3m=6h-+BUY%fQ4$<_B#bwb3+k{Oys*nwOps$KoF_qTu`W^f+3ni+jZz-EXV~zdhk$ zUSSfCmKVJ;ZBRX{b5Ebb*n2|V{*^=a%(eh=cLi8BWEO}yN?B^;-R)-MTM*v}(GVhu5bKzIt#?y7NFs+}Fo{4Mce9cC4#$%K$-F+^PpI?+kW;2K$w^+>v zcGs#XVPdW^!JQM6WrN)d)-+bTw+&MH);^Cez49GTF$_pK?*8NdR?(5ycMZsB#E5j-V3v=LG|TcUu1YQc9KVnc zuR^^sXCHSN#w`u5v-B+p}3~?I3O-oObT_*C-~hVlP`QcvN6CwirXH;i19S zrF63V92@t2LpNkRr>y0gy6fb+$BCt90kzD&8nSXEMPvPRFq5<+e&Z+aGwYNNwLJXH zo>(@$ksZVftJLuD@UvMz@mi-mKhGQ2q|8BiF~|+I)Idlp<@E_kgH%E&T2!bT@zZ@E zt`9ow@%H8jP{zxmk-CYPB3sne6Z}f~X>J`q9;O0~pQ;43kwjIjdw;P5O4me&JLj1@(w35~HqE(DE(yCws)0eo?c4;RleD${MTAEIvF^ zx1BpbP}4CAuo+k?A-FcD`<};Jwr_KP#$lDobRD+WYd1k?sakWR|rDM7Z8@AL@<|$X95Msl2 zR)+5)J9beE)s@cv8O_`Ngfx-SZF%LV$+Jc>$Mu>)->QtQPW4}Y1-=s=sH&Q6eI~gi z`#`8$c1%@}-r3*<%l>L6+-=xiZ}CYu*khQn1CC=F32>pMxHUD|1dgS)HO78efz>ln z{rDv@m&3LVMJIz_l}3q=gd{yp8}?hi#@%@I1uD*&HF}a9dr`ISHuEa{11a8ff$3~Y|zD7KLAfV~a4TCSM@_GvC&^+Q zgibAwQOe^|-_E#WjFHZ(k-3I#m!BxsGz3QZTy^8h03ZaJvLP?gM~?TiK6}=(Q*CT> z*5`Aw;tzCMIBfw=bfdUIGvjmxiVHTbn@=Zmj5=Q2RF=Dxa;0{{k2xeW_Z=EFAFivp z{&Kr*v-%aEH1g-joK}aDoi=gO!>)n^L;0EUXYMo8$sIFXVYbb|4TIg&Ivt<27zne7 z7`~-cXsrg`?ytX{n84q%yj3@AW2X<{5IGBAlKou6npJKwvttjhL8MUbDQ`G$)zVB4 zF~F(8dIL%9z6Cj}_w=E5X&M^Psj={Khfd^)oIM9(_+zg#+N{yMIg=h?=Ggm)sD<%Q zTKA*Wgz-gC3o;@b7BX4G(_5-aKwLLgBwCAK9ow8}uZPJmoO3xH^SFTw%Pm53vM_X1 z?XEAG(r-VusUWNMiZ6(?^VhoKvZc@y8{?rGQdVBcrh&ldlD1Qve4j1&Tg*;TXTtd} zD5_2)YIvxrAW=RKQRjfoL~XjI&*>`oSo&jKB=;WOtt1{G>-lne>aq4XH8biKJt(QT2Pcj})(qA_w5-2acd24a*;6Pte&Y(R+uMXFD5~IF_9qs! zLYYzU6!XlHZBEBTnp|H%sn&q4>cOe9YU%rvQB^q(G=)R9soqB$=BddK5qam+gM;5~V;6a!GJ`Pn zK}P4T72Bz+^>jdcXFH%+eg!{#Rq$1$UPhGh;5Qw0AUoIHKI+cXFh4mv3+BXiy&bf) zwN4vK&n~VH;!KkX_OvD1MRPAp&^L6sOo7OvSrbYy18O}`=AS+8#W~e`8FcY&XkzC=-z=|6X@YS-ytLhsTDUVhCLQg zs6>8{a96Ae(VQAc7NzfLM4eA3`uqoV6mO+S=}S>w&|3%h)4N<<*ZhN!9#C*J*D5wA z>)*rkApN8G7Z2eh{O-H>`~{wYLLbUVz^+U2(4~P1pph#-s74;hOfZ-g3Q8`Gjf+gb zJC$|+YxVHam%bbVKLb(A`bm&BEXDQxD$)1Uh&?yk^0Fy*&$Nl-(d}Yf>GQT<@o=>% zxFR9Dez<1(@+kYFf(bOb*tuuk2=L_RGAxK??<0Zv)h8Q&s=IbSPDvot!J##ibZS{QgT9A*&-~%_>&1Opz69@ z%ny^7bthWHWyZws-4I6i#sHEC1)WH7W2P76FWAZ4e;eZ7^HGCI#_OZ8u724@dnZa^ zgz{ZqWhy(_E&J}rSWQ{kA%}CHr|j&;I+Wj!oOp z#8f(fO85kV7CiagKqU`7hhb{UvR6dub0sbZmjn-SbEC>UOBrJavk{q;>>CA1^-;zn zSb zV9*36eY4-3>wX!_SjFPVqgAy@!tTn_JXQG8Wf(*pmG$Lc{}GM8@b(_5)Z;#U#9)%Y z-PxI+%qNE#H6xpLErQ0IYYxAW?di?iic^T6w{bpv&7SI^93QX290_r&9-fS=dugLN zQ7$szSRh`u4C8#rq7;?Ur+rr=GPa%p(I;++$`WQYr`IBpY+f}Q$)-^su=*fxkY!L) zlsR8*v>jMQiqP$)sd(xgp(g-j_4rIUYt@$x!e|q#+0~n@JVtGO&M!zaUIJ&F_bctp zq=M_u`Dx8;m@7rit$I*%&hWpC%=oCV@?YLQFJcpc@G)jy$j=tD^O#o)4Bd*EA%8pu zP{19uY`2#+Yv)ifJprZ65i52 z(*82^u*jrSNWFSYn0I2v%+S)gqe^7S7084aMApV_b@``pIN}H~5QSTNG7IL@1a^qC zbkFL((T(`p@ON9xnrZl6`pj0gtcb4mXRAXTeQy!z880MQyb2Dn~8+^YwoBSIk&F=_*e#<6wS@C8HIYGNHsPC&KiiRB!e=~m3-zz0C=?i zoxVeF&6i~p&$nSv3}3cMf<}VNE3?vbatAs=vjhb5l&5|{2x?1g(pGVm-1dvYw2=#S zc>QxuYaXq~`G5$3mQS)K*Xsn}?j4r#Sh{Z}{g!ib zwf<(1RK{$(kl2&g9FW`hY&V@w^(}gI;)_CiZBm9RzleQ}IZ=+cmQLXmhc6d*b!sBn z%sF6tHs<)TFz?WvMTRhu8glCbO^Xh2l~Zi}UpV*Q!AoB`3r1_V{R#A%GXcgQ^4H5I zb#I2UbAnVIC2{lW!)HJyb297O`fHucqy*Kh%?Stqcev_}PnWL)ISb6s!k)_zoF?)1qrlcX^ti~(T9Ln^pjp;* z2|Tmyu%)~y(Hs?NHb)U(!6?e);hkOKS&CZI;iE!VyOUeEvtm-Xak`JkuRO1jvq8I1 zi<^c;p)ZnC>t9uyb&stWbw9EeKLW5d(O1)${W0w3oOmd7x2p{PDmm}puzqS!J(xgyg>Ptcr_{`P=r3|^{_3PCQ589mf1IQ7nrNKM#=v`mKpAn*1FKI8Y>-g~Q z&z}d-o0m@etAJ#yi6A*X zWYt)!&VQ|DI`&;S-|>Jk)k`vf@m($b-|fz$`$ z&2OFt!rZpYL}MBKuanIEup?}_>h(aDfHCY=uc$hUh+4Lxr*un6@%-=dw1sSNbcSy? z#$4YGt@SZ=ehcrC9G00>Nsi;4GSyzadaXBu_xYL%(b3+}grTW>-Tu;N zu0%>Y5lh(n#%FvNN2hnLU{CrEsW2Uq9jOhf;IcqKFVRz9QS;G2De;ChLHtuwFXyQB z%(Kr#CxL{|oRu#Qc1ehE$ttW8xox{)h9>%DAsI zeT&Frf{0gfu}XoD-jo7S^?Ro1)CSjPSB&30<2Ars5K)53en@cP;BE(hPc?t``LyBq zB5Zc$ipiT@Z|n1k{z9)s#rEU=ObQtY#r(z2aj}V5sRH=6gWI?>M~Z#y45pS+PsJ0N zSK-LXuk=-^UN4Pn#&g9mhx*lgbb|ITFRt+%v_+k1sfOLO5fN(a+BYvgnZHI=uOqs= z!yB$_ecRVraGRXiu9pj?&4qt8Uh>jv=iNk0EfxP*Rt|9@Nwm$L*`@T(1wv-8J#oeV ztRJl39pF(p;Q~wI>9G=Uqu%@oVsh)dEms@4r|bfg?2C?OLS?ysUw^UVX|lKcK4DnH zb6&*0IM?SOp>nkAO7z*~y8fwi9t#&|Bj+V81=%BNY_xgojoIIger7|CvP{&8l8&A6 z+qZ7GgsU|kg}NW#NOHgEE4Ho7J_qMpAsd<(7M|FT?4BXIcpIaS+h0Km3S|5fO)y*> zZsuuOS_dI88sLwXQUcpHB4Kz}t^KqL@y5B2G2Vw>IpET))q*=PeohrCrjvBBQgU2a zUo3H6a29odmN~M{OJ`)u??z zkgvmf~yt~NtMT(YMlZPA?$}#!c!YtZg;HY$?_4V~9Rap1N zU8hsq?Dn}r-qPLf-)AXU#Z3Fa)Z79V@x8h5+YN4N@w9dB7eCI7TS73Y%e4uMBy)6sKri8<6>mHoE8ayD!+#6gih;(HlQ}4ldh~6CaFet1;kg zTBF~Usiw+jI%6G@Cvf&uVsCp?-L7(@^i*+f1te;#|8k$T&t@xA zMSpqu?2#>OF&La0tgCMGUbUTdY~*gNKzaA15HD8*=5fvOs!Sh*vZWSZHmYi^UIAPv z_f4{=;7HCB1ygCN0cS?6qEEA=;t{FKS^8!5ubDg)RbOi5V?-(;$w^6ooSnf#v2KI? z^YNhhi4$+*&yiD@BE)0D=+~Fe0yi9GmG3SdG;=jzv<~}(Mpgsl8snJfX0dGulDYec z)ICv+AItsNPEx`WUy(y!WW106&A>n{qqmywp%`ZRl?C5KS{Ba7K4@$`a^TDQhLYo0 zbGkv@=A&we?+f$pnv+gn1+NosO3S@mzn4ESg}JiiWJ)AsH_809NXy0t9{P2s=UFBVKm zY%m^gN%Gweb~o)=mVNII@qrL4wTtyPF&Y<2bNK|xGnCZ5)%;H(N%7KIN<94}$Edrdl; ze-YbVNNynU@~~@`p6Sc9qDp=nZFI7=-IIAa>CY*-g`D@PZz-|Lher2M(Wn1t>syqp zN9Jq6=yuLVq+2(VkGHfC4*8hbMjvKjAB-evQk+dBLmx((mKw^?vXy59-(eZg?EOMT z$2Qz(SZsn>ED4IBJ`PJ2eewpL_4_cbjHDwtv5L1q6%G)+&0x)(kGEGl0w$*CL^TWb zL_|Gy5{IN){YhxfT5=TOC$IN1APt9@tz3c}Du`#pr|K+6=i;vS=8YnK+Brw}Av9!{ zBfmN>V6SEnvb1_`+1j55>Lhh1m4YFb(X%K&!%O(Pq=A99GNzp`#I#rr`#skmqD3So z=e_S9oed=a{*tA9a!(ta7y~p_k3lAakjkk?tMAmnOG`cC`%Fy_I8G>Jqtp^2_|gL zUI$j+>+v&X`F)CX_>y5LOYLl@w*exoZ`_GJ?4#P|dTn#9Q~EPolQKJiCsdX*?VYV;m1W{I9G21?cUEIrvBGaTl22Jn8;0u1?F-N zyohTr!C~%;Rh9PD=RdzYl1~-a@zT8v9M-Tp)vWi)-ZHOf31K`b|HX>u>l}FMSNwIl z-q_)j1Cg4EvRnF;LDxrH^x@}X<)o9Jp90q-(mp&>Wb)wtI~O_;k$O^HYUbr|zDUvz zA%oV@B!Ya$raM-+| zZ8~P^9EI91_BwZ@hOqYdUhe#Qf?(L9p>uD_9<}pbQ&sobT#`&FCygdHtXWL47*Zi8 zzp#VJZuLf2L`Ie6JyUmema@0`0mi2y`in+hxg`7886yul7B#H4a6cYavTLezwnl;QPlc8 z<+xI=O)2hkaENZSKF#O2PuB%`sOh~odDe(DR`Rh=eyW;s>it$y-GHfey=&+YMrb%c zb&{|aL)d+zWvI;lSa@xQ+&+NaHP(>%*l0VAYi@tg@7`kjT7V#{co|oe7PIk7HDU+J zPv~9u$%0%RSK@n`sW7k0$$Sk{ssJK8$~9$d;j>S(duphb_oYM9{tz$kZ!hX=mfv(= zVli@ZY^@QwXN&cEK!Dlw;Wmge5=J-GteK3iTWuo%kvi40OW;G_ZWow)+3GO+itGN` zb+t%_8mTE%k)+ofs5ZG9yc#oK1ky1ID9gQq=6eWOeI=A%%!wO?32?bhZg#~=irAZ8 zu)zoBc-gxV7o9`-1zpCzWNa`5nkqa6d5Lzs;5brN{1TAA=v{U!PN5Dt&oQ#&daGFv z!OZP4ik&8l=3u22yJ!i6=FhxVU3ZesD|SDNxmAL5tu36qyngNp?uZ+oPnEZ240w5^ zmrJ}m&>zAWu3&=88%~kZGV}3IIXo^hnCK1_4bpF;^SfRRnr(8o>m9OYS^Hw?O z7&b=!<9PJP0}c-!$dt8-a=mq*xF*T%c}bslzrt6RXhTwtQRSjXslT7U_`5HZ z&7u4b`)0}IB=c%{Nt*m3?hacK**Todsr;W9B+9AR`pJ z(1x93XS@IUk&zQ}T7o?PtXF;Nhv2Ly6LQ!W?@RCfv_WqqgUzzO*ckb%&}$hWb^!`6 zp1szmCqCV2^6Ns}VE+x$BsG3&-9wu6qr3__!aK{h@#ytlB&(yj4@QT?rG8r);=r=6;1(36F( zV@Cf8#9US|dS24BgzCP;MoLZEA-T+qHfTu$QIL@}z$3}l0XOs}7@XjIYu(@o928@C z5cK!PxwZGDYOl|#UhX^3)L(MN>UYcbZhF$cKiDnJ4m2)rumRXAUoi82?4K{?`E{T} zmkeGI93?1_Pe^E3xhqir%d4#C{d+epJb0p3r$pyS!j4N96o5vA06W_amX#mdF07vX z^t!8hZCrT$^7-o<;*S3K8TIufuX{UNp9FZ$m`-K~GOTf^$5zjV`h8LYAC}Ml_4f?053|Jqcs}Wj`?A~LTgQgpzo7BOMehB(N2~YiZ|e5@b$V^| z*52OxvQiog?EBeS!_3XGpUcBF)ld*tjUv!q$ z-CVhbbEd$1hwGQ|@+dO$xB*W<F|sQIh4+h*&( z-~Z#+MD0b=|CT@d70&cWo`C||npU{v`3<wj`_1O^5w40T!fxB|=w#>4>+~(>H4?`XwT=n*Q_I3saaf7sR_bxmLf=DVN(kcSdC0!y&hjcSE(#_BVDk3c)ozmT110o$m=g59Ywxb3XgTKIgNa{cJ)$D9aE$q<9Db00`t{rPKg``{?Su zkq7tCA8%>pF#rH!fSiViz`(=-7!Kq`K7ZQ|WFE8w>ak|Y z{xmK72LbR$gk^vI`2}!E&hS?R0I0w~3;iv|B{^# ztMOrAJo{I(yLXTCUu^~p%lKcd0{8z~hXFo6X6+cz-HymS!^g$|qyz)-oyy;?qL*r0 zd>S?U@-gPjb1dV4X6Q|U#t+rcxvHNb39C2!sR4(xIJ z!DwcW+=6?+X|@BR>j+JzUGwmrtpEpCLl@ z(LWv)0S=f&tjERysS4>3(%E)%MsryXQwk?$Q@h!kOptM^`I&2f}={&jmwRpJ%Q_XyVD4eWd%eJHpyp7wS;u+%r z0NO=^OiHn^18|<*a{?}lzPVfg2%M<(%EEvk=qi@?P{K^@vY z_;c?8Gw#@G-Hz~f*frw>83k)bLOq@IfvCTMGA-m9BH9oq;R=P&6$S# zelDbp2<5dm4bI^yjawsLI`X3R7w*1n%rRWbup_4&X1L=b>A_#r^luB=7q-lTSoDX< zv~g(E$LRN@im3~ z?1&A~mTfxQ8+&%>Vw>e8nQ&F{PLWAZKqEMPSg7*SyxM}9`BH5sXNB=9c+T9 zoL>JmdA0>u)leO1$UZ$mT{}VL>62PLJvbBioiv%13W# zDK7qY84&S~zzH}yP>n>^!+XT?4ujW)520ag;*B@5dQ-Fcn~~4Wd(WU~Z4>urHzd1< zQ?DlyU*y0fW3P;+uH&Cx_Z>zRFe=;bN$PPN|1Paa95Hqu3LR) zwp704nMkqB<$OR%GM{gkmm;H2v$Mfi9chrr=l1}yZl}GUK^>%g{Hyrun*>T^{`2}e z8>Jh&Tqf8+Bqw!7+RoL)4j#{cuA}zuOk6kM*pGvodBVK~zgY~9vP9vpsjwPjt+88; zg>sAM)@>h>TkS3G)@LrOc1v&@-us)E*K&MRL%QnwZ2OPc%(QL2JK1?!oBN_>vnu4T z{(zZhUuEBfw;R3@*v$_A;YFi?IE1WPm5P0`ne~||P{ojmT-Pbju7lC96yX*5xU6B> zCd5ntg@sdn&_`ecS&|~do}-XM2-eZtcO=`*!CR+Cok+8E?;vGJPVOsP5YwMy4_)3u zBmix;o^7s+N=8qN{ajYI?5%qt|5QLcz_=>2wr(s?CHd8+lr21 za&unp*+Bm1wpaiD{*qmp?Rd7(t!vAhw&l_N$`AZQ;cEX{r=616=jE5GG+hX5Ca(Gwz)HT zO4$`3KlSV^^(UMKQ%|2_m!&F-n!R8;wylGj>xE?`QT@S$%Dh5(NlZ}ZH(V7cWgpMf zhQlJLXjtk%g^-TM-#eWnYMX`I|E_SEdx!3#EZdR|pR^WHQ)^UKT+Afwy6U89=&G_= zw?;@y&ea7SUkG_E?*Z1#gpV4eRf=p4rjqw^rN`#@YmUkum@L3Ah`JZi?;Rteo9NAf z1+WA7WFpA8B2`X=(&xQG;Yg8j<%Z^K=;XSC<#O}D;_MJ~A>Ds{S4>SKOT_AV{b2e& z{AQ$Nrz|Uj=W@cPZ@=2r$=%tx#;U1_(Ct+{P3M7MWLEpnc*9W>olGZV=l9vsXPCDb zWxt{y{fhoc7lqn7igx9njl9T;9^VWito~}nD8tuicrh#%#esk6GJ&|rpe2f5&_6T< z!Y@QS-N;kUq#C|W(9TxdMirG06Ql2!v!|zLJCE-HM4d7+*h~lgCjylr-BS}8=iu0+ zpw7f{5jba%73#Kf5Ip(pR6oSN%JrD?U{1@V_ma>}(Bt5pO4MjXKYR#BVONoG*ul)| zeK_R-=he!n|NVZF(D`zH9$u>J>t^g1^*^Pj-qO5PF7u}om zl#|TARBk&D_oU-*kRymLE~-WMuS-jB74RL`Ytt)VVYO8wdZGkH1P3Ek6uIB;EfMZQ za$crHk5Y%-J<>x`_QtG`;9g1kA7EE5#F=qAilEp-w zKyz@WmMQ#qCR5p#}Bc!W{{GZF28Sk_oQ zztiN8v_jX56X(ehHa*JJ7RImPL{vgEN$DrP$2)Yhr0$?>)0n*j-ieS!7dB}ezH#^U z2l-V(P0?OHxAO|57T5`oCRoO%GuZluUzb`pjTRi#P!JGUDS(HU8;4If1ii4rUl-NX z)Orv{d`sl@&iU5)W_NFcG$uSYj(~8{)l%%y_FHJT8#TXUJa85&jH2TYZRu7%qZRZe zhE|?eW#z%0Izmh%kjczS431}~DpF1Jwhu4-QdE~J-DDs#Rw$Dzz|D)TpW=fwa{QrU z)4K;e{-H~0Vp;D!hk>@?&i~4p8$Dn#d!(vuE&v=~Us<(=zoch5_=2d0|W8 zxNDe(UXj0Na>Rg6cUy41q6_3)lY>=x51I6pz%C0|#DZUNVjwzwa$|)YMK)F^j&>bj zqG%t>4gk(fV_e7?H*iDtyVqGU6R3muWGpENb(q2FzCRF#0kJ)%v6c5K-cL;CRmk@$`cow0dOR#0QuY(y<^x01^1q$e>%z%Wg`W;QJM5u=W^b($ znj%@giuxpq#>J)-G6h#^bqTOO{@y&eIBEOk+YMw#@q#=kn%JuT(LrPmS$LCH(<8@x z^L{tK*HXRJspfBl8pSW}%sS`_&JYWg=04nx&NGg z@1^DJ?xWH3V&(MZy#>Jun4;B+*dP!d2aZy%;o}87V2boiO53wyu*DIrse6+xlXy z&w{;-A9{1AXFDu@Co)=I8<6{aR$UnBFCHEb8R+Qp3&30$o&{T~%}BoVHhY}+dB6$6 zn4Yn`4=d7~n5@5FJvHE-@WWlGx_bJz*Q2$&g0o`B7Z;dPG;5oRp+|c=2cvTuDx{`< ziWcv4-^obP<%`lj6-b5Fy#lA-9vyk9t_4^3Qcr(gNEhe+fnFI*oW-L6>*}xL^GSWD zx1B$>KL{Zndt0sfyjM&Y?2MR4d>SkrB6#RNuUod67k1)p52(bssH2D6FzILZJ=T+E3*Co_>gCXo9w>MX+=HC0XOFz z%|!^?@UQ639YrH;hH_RdHTNpT%N4P*G;qX3*E~c4X}%R1Zezph^Sd`%yL-`CgFk$T zAb#KaaJ~H%W(yHGN*#1Ha)6K*O5@d}RYdOOBZ{=F z$b$0}$e{6XBrDr>_2(`(eK$tv+XR{e8f-7?sf$m{O?sLj23K%*`ka>b3&XuRjkeoE z>%I)Q*ariUs>y1j3%rkdDt5sL?2qc8&e&h{%Nd?&OWR4a|MJ;lqODwf9$|*0xA~#a zyZtEZVCmD-jg@^!>W2}cJv>4ygXwHawChA2%rF9|`y_OfGnQ9tMcWp(;5mJ<=8&!1 z`zrn2?el?44B$spD37zbK8w$OH_@y2@r6Im^LX4m`4o69SNoS;$s-9pM%}7y#(tSA z;u^mv{yL)eDZe-^zx6y+*>#Z#k)fhHC&+THu2Nqv|CtG>&|OV#*HkyFct9buC@U@$ z2#g=tqnKc`nw0uY%L!B1es!qIqLk;fx@yJXLE+Tcupa(PN?IrVgERl>tA!}`SpK=D zA64p%{crTL1S=sn>!);HWs+YBSW8|P^F$J#6f^-DeN>u?w6xW=^6AZ&dKhQm*1K3STnU{;;!g>f3I3=#M_ZKqcb6*6`V@z_l)PC?6W8!>72V?nb)v<ZM!Z5JmO<$81yP*k%+Qd!6I;M(r%Mxf!B3`wc{>#GHA6~P&vFYzKn zAPf2iBl3fpA=aOCI^|K8k)YbOB|4x8;Y*;3ck8*lkZW?dmF*tg6}z$|;;XRM(iBqdX#||8l_Iu=nIe9f48J>kMEJ5OzM-+~ zo&SE;Y-If4REa|)AII#xa5bxv*R|Nsw7oIv#A!#>sH&AtRq1bj{Y zHE0HEs%K>A;Tfr#e_dqZo~LDIm}_vz^UI_nBf-|g55Y@9c^;o&w=_Ah<3GVmMV-br z^h_`1%#y(nPmz52fO6a4;;~Pjq_!|y+@wrohQL^Cf3TmbN|`ulw;hQwo`>&#Ov$t0 zh|l|06@B@Nf^N9s`t$n{LiRj}Bun8r*Roln2&IU4Rl-P63nAK)GB42{pWP=t+n73H zl{&-i2f`*6#qb+ky}`2%yRhSkG`19>CCEg2GfSe~>$VYvGH1b*F^o*i(qns2vP(ZGJ! zwvuh9C|Ql^n+AQ}7#7lNVk?W?_#K!Y`m~gQjQL4vC(KYrOeA3LIok>IhWmn8{hM*6 zyrf8FyQcZ9VKY5_O8g0c<#;14KX9R*I2PoWu~F(yio>r>t^ZW^<>$+kkv!S8S|xeTG+E*rmbkB!^GK))p#b7_oP-CWm93 zc2Xj3vg_Xjl~lgV+6c-Fp+B%Mk(J)5+Oq$>SRDfMWj_A4`mN+~YwMG1CN$zhZEbJuFj>1Fd{>9~-nXJB zy^~U2A{NQ?2lEQHMK8cR1+%>bi!+lVr<_hQGx#T}2lE{Va*oZBp=?Q2ycrG|eFkS0 ze&0pOSM4tQH7?3VJ@}iXwH<|=(%Hwyp(fGaEB47B(di^{5khD^7k*rXKX+_;UHj{* zuW;&cckr@3uqu1++aqPeNE4zcSFtVE=D7DQ7)czpj=dee-{&JIUa*UC{l5tk| z)RSp->rY$#KZ~)#_R5+gDt;ath%R_l7N^vIdw>5KnQD(kLEeq)q+4m>_|Y-RLW81k zS+5_QHcydo#Slnubtq(Wq3;SbI&XH;j$nl>zuhGFmS&dbK3s3I8WlFoyYM)5wHI#M_S4a= zJ$4X0m~Mxrx}bh6c+sKz=3%3QbCO?kBiK{eYEU>1|Fk+qjpJBh+o_8O<{Q<*&cMX7V( zv5KW0|A*5^Xf@7VqkW>>PXE=)-Q;*}a@cT6iYV?T9X@j)Ps8;%EXfDq5 zP1doKOC!FpxtBg-MBS<trymb^y_>9+JKV<9Ew=nLfqonW`{FYFi3Q9ReFbM-+u z4K(shcuY;jr3(nZalsPzT!b%Q+}p!bPSZ?$pst=hBL3!=#1pPH)XOrX990#duQJ^0 zg*u9(A~@ntFyw~F25qJ9!-mhc!Z*b;IOT=)1Syn)Ro?X6nTyy7Vu?HDcnw3pMpnw} z4!|x{7vg7Ugiy_!;50|^OnYktd$E_U1sUjaNPLnTX!_j-H)EjTLm?_5JUvMKJJ%N& zb>zE&G*4M|_t{34Y0=${4N|wL+KXS`Utr#{r`7XmP|J#W-Wkj*ITvK=x7eZrSL;gV z^|WnwLK13Tm+-?Il~3>YU37N2q(zr0m)-6=U3al4Ii*-6`G5|~M{5YIOF4v-8~5xa z$@1CQwJm9czL!rtqxLMj3tU&5d?eRh7TPU5LloOud@K9N4{H5hVloa77?EIcpVw_N zt6JYDVR)D4dXj7h_w3wC1(~QjX-)6QS)@>!u(2@<+!uE#V_T|YRz_XL<>)N70r^?* zP_cB4e2B3ciyr@e0oOJOsE5bPP@W#PG{@>R!-mMbCf~k5I^Of4Gx{pBf&Nga`ze!k znQ$cp=56AtP;CTigXg1COA5w$(yrLc2-!|fVEckGuGlVHFyDH|VoZl3rkb|5O}hTN zTAPC2!jyX|2&==zyQYgM(D-#H4(PDbt)bs`CNhtoV5_o(un>u)DkH3V}2R;EXA@&m5t2*vBCZfPqG^DE>io|2;m3MpCw!&_4hG&*h)E zZ`wZ-@V5Vx`u{NS*AWRLP-G+{lR<;3e~MGj8Hk`FI|U_~I+qpdZI&O1*%bu^H*D^e zgBy+EUUJH7i&r)S@D*)>;@Q@_pa}Ehn+?h8MT2xTnAE>608LX6jG0j@>36GUmb^R-2GrwaMVf8*&=zabKYH>9;mYswt9rah&*H)90 znDk3I#DJ91qaF;bvb?*nA83_oC^tmI0RXpLamdpT?e);e8?Arlkxwul?26t%O0bHmXPH2=$-B zdQ(pJ(agTDJU<2JT1H9~-d8e&(wt%nY5LZKLv*kPSL#~o3S$(aLhZ81l@2-TqrAxj5(e~*fhVm zy8#kWYu7ED^-h$$9%8X`BU(Mey=^BjFLxpXNYszwv7$*n|JfS0?C25CF<9Y|@ecGkxfCklIZ0A7TUG zfb;)AQ?SF6xr2q$n-ooe_+&NeIVm|fo#pOrEzg;U6!H7jyGqlyoO}PsL=;LG8Xig7 z%(clA?1<()7qPx}Geo=7vD&1axQf2E(MRpO?l`2|mNb8!EF=lQu3(~y8hQRGYyj_^ zWF6tM#ya2zHl3}KI~h96k$0EUPf3XFD*A9KrbdBZ^rEhsXv;Ez&+mFyg(EoKzKw8aw5_%!L_7auD5*b6ZX7QE`Xzgr?R|BsvX04l6F7)>pZxUmxbv>9C zp8G$K!%REAqsUeW_FBp((`TZ1I@oG!5L($Oh!Db2+tX z(n~CQm5#ira?(9XE>|G9hbm}D+^!V6_gUWijh~DSl3={HsY%iLh~!A8Wh5sKw@j^2 zf@)bW>124*mjDV@9)ro5VrUmL52&cfLCe?Pvje##)2b|8e|C?Zc#Y0i;}_C0B;auP zfxilQ4b{a`{320Nkxx|CbePtB@`JqGw~{NUquSK$@CVDi-{aRpE93P}&(P@kq*~N{dx_{Bn%37ZX1*t!4EGbo;K}Ozg2~2QAFL9M zG1s^Y?jajq<~C%p0wHtz=_T>~f}-OjN;@9Z&w%H3d0&V!h0>kV7SS6k5|InyMP*BV*zJbscb zUT5LHOUBVZxgjmCcBEezhNI4Te%w{i@fOEWzS^uV>GbLd348p>O)y1F=UPs$)>h+= zwK6w+SmAFd(D+Ym)D9a8YDp|+eXUOJe)7pBo0GMjLQT+rbfxTM@W%TzP`?tK=nd^6p#(<4OEbCg7g`HS4#ob^Kd_(z`t3Z83O>v)kc~ORvfrfrHEax?P%I~BYY+#fe9w<#nHOr{?ys)5 z&!gpBXlCu!G4#|R72|vRdo-jw6yE}e*_c!cYUCC{8<92s29PV|SSR2_ZYJA6$>Bc{L zHA$|fx#h@F_Fd-9*hM4$*SflCsK@P@mld zGpY7;nbFSuxlHv*Ef!u;qD*Yl9DNCB;uEw3)1o`+Q*MJ&)G2Y;%$9azttovKQB^jX z@@IDk*uO&`Fa#n^sIA@9^}&0!yaX;?D&6l@NgH)tl+yZp$#Aa~3x{R-UlZaJZ49{j z7ao+oHnW%eDa7on_asaf6hF?TtzOJoA)>R}KQUr4rnu)VwfP_iMa zJU~|h^s~#2#OIVC)TQX~75pV`5Er-zkF42=49{n}8sx|<*`>d;$rvEX3QeEAH zvwT>Tfs0{Aa#@UlkBfF|VUZ(12 zs-oQZoSBQg|Fj9q;0Lf&Q!YxYuJ--ZkAo}o@pKml&#}<@cxgOyA2l9t5E!UrvYYp# zQ!hhzK#Mhhto)S)VpwgDyCBggORcmm4`s!o>EB;>#;x@h2K&OeFvc`;)6zsEJO3kwS~J~DohAl%;35s02on8KNNtCr98 z>ihS82>N?~5u!f^q~O;YdLx5wJ`h!82oriQ{PBBxUkGEYCigRZv`jwy0bmADJ*)Uf z!d^OCBHLO3R0cEW_VT)3?!g1xP@w@@B`0TRdbGf0$my1ahX+1cf&>;IQ{~(dkS^lo zVs8Fwhd1BZ5#E2eK5_~4PkhGSK%&k5kj4kpbE*FrGp&sL;JNbM$w)dhuTk)WZT;22 zA&3=^j2KO`bjSAVC4PaPoCfg3G?0Q@>WjQFU|S#INx&J^>Pfo)p^C*AT~EzCMjjPELM?-yOy=jOr0bDti}K=E}>1X5`-{2Ved zE6;xJJwbMB(?$p*H&1OTt-y^IeXlR#&h41yj(#aHsjWU0^XWK+DpJXmwl}UN#mC$> zZvMyVZJGj312_zC^40T|sYN`UP)Gy>aWTKzr63D*a&mE{l%>!l>#wfPkrHuErF1tP z>0tYqMJAZQR@kH{O8)HZ+uNI=o?^cB>b%z5l~2znLB;7Rp1iqQEz8-O)m`>mk7mn^ z2q9&DOe@!#Nwt!U?7Fqao}=CLJXT_mx{urN4QN#JZjljAx%I%3;p2l3XA5&tb;u&3 zhqS|OmZfK1Os=#9wVvh|GPCYEl>&R75sTKaPf=ptmajEW;9vN8G*_+4*w7TjKjk3R zAGcjXLP9-H@%n6BrBtO5XFN~o^z@XjzDweHdfoES{iyG&gK*bS*BH3#t8dEfgr71) zOfMQ)`vjX@G?zSmJBy;!xxwsO6J+@#W%-tF0!O?|wyi3)wpa~K zQY#0YE zXAU)s=SY%FK=r5n=}5n*;7Q&4<20b{M))Qd_sq7u zH9js*Q%lRzPftTbY7$c&6X<*V-eq7$(yDAhxO&Zcq1=`q&hGH?i*h?uT-*TdHLyBy6Jh1bnCe_-g#mL zwUG9)5Iz;N(+9bz3|pI&7S$ys7E8us_=W<_i`n8SOZjsRBU&*HPR@^ByX6DIc^^lK z++ChC*L?bqzNa^00Cjf=k?7e-C~3JnO@lu|yba}lnIjiVNG&Agpd`aFa>JlGBxtSa z<2#WNYc7`o;@)?Mi8l%+ST5%A(KWxr=WufyisCzT?%R;kf)8SBRy8+%o(=367QpFau1DWm=i3njA+TJ;kR==QAIc z*>+$MVf37k!omLO{xWApF(GbRw#)LKti zG5Hwh%JcQJUFp<8D&$&+0soK709UjZktWIkPs(DwG4DvmrvHhOFi zMomF(6+M?55-l=v^ZYM-xV%q;Z!za>cT;7pRt3C=2S-H}6YqL?89Dk64OZ2)(uDkW zCzvc;qqdCk^6$>)%Z<{y#cTJ{=+_4oeYKk^)c!nZ%fHrYFSW}#dv)J>d&%1NRFRj1Z2bpXkq;RkQC!QuX~5EsRR{;un*Ut$nDcFL z<7!T$Dz&<$y#CDU^%Bk9UO`LEcsfsZOA()#*jiePv5&Y(%$Ri^qh zX^q$FsC2~sV9|cF-1=aF>brMwCo3#?V)>^6K4-L-mJn#&pt2~bH1c>{B>{^6REUoS z@6r!B2NZ+G87`Ozi@W$;sGKHGD`y-#82O}I`3xh4gz32tbAvPH`MnW8)6`W&`H!y+ zC&KNZg>sH%22?zA14*xy_vewL^Jhi+`Agj1OSClp){rK9Nou`5ROJ7 z9+8_#tqu6%G*#T2m9q>6vDOIX`MXRnmL;&4vU$a~*W2f}<8v@PEWmQd2`p>c(|4;B z>;qgHbKj$i|15du3KroIPiSS##@UF*C7}`ZK66s>H@W@ZXI{mAOvph7I0zRj#-I_J zV0&Rw_U`9QmBj!7Lv?*U_@HsC?Rrz3jAL=CBjaGjtqlRQsjd8NtiA2mseBwRpp!X>om(pLHCB$eoMLBtOv#}Ash^i@=HGaQ7@wjFTvOhjgzJ>@{!uz1~pG(JE^wJ0H1dnnfQ%)z;jwgJHmQ9d8wb2u~TbiMz1h!5n2?78_-X_=1WpbIIF8k+E zcelHHJe+aG@XnN>r@0|?7)WAaB3rh$A(Y>*Re%- zUhZb0sdN@iANC97NEftv6YT&4$?N9A{7Ss^CQ^@o4YJ@iT%UC(JO)-z;BFOkMeEDR zM7Y3e9U*hhMNLUX{zD51wuLOYjG6~VHujE#i)?Cm94B$e{WOmJ*`+1-}77NyXFU`(HR>(L3N#toaOyYH4ZkQflq zoCCdgbbY!-#$lv*@PnbR$CU<=h-T%lMMb7CGvwFr3+FPh4K+5OQslkwe(!zItOhL9 zVxG5A)lZ&e`>i@-$gex3*`utfyJ@4!|2n1b;|s{X(B0jU0RI~mrb-J!!_S#ji=UvaRyn{dr^HcIk)d!9FJbgRG z90qMcGypyGeDmz59Jd~b3Eb>2_5{r;c(alGi9v_tf)X>VO2gLrAy3cmTg4YqLZ{T_?15k<+^QD8+tV^@V?{=XrU}Zf89vFp zGUV?3Lzy2QBe}h9ig6ge--OH1CnVrlxMj zo2_~3t{E326%qO5lqZhbz4I5-p`({;%~^KBqL{md+RAnkj|~4-%f;DYTPBC3W!Sac z&}rH5&;-x9J4eoJ^x@#4DSZJ~&h;4tbu#L(5vR)5U)S#p2*3&F#YC-i<(hS76>QtS zc~)?ypNJZWT!+vh?zI~RQ=nZ%DFKsVjq=U$`2>;6;H#@TFdiR`trLwn$5=6tnN{Ds z$0f&HL(yQJcn^RqU^-;s~aLw8mglV7z%g?z=1`$k^4ljq zyQx2toYkf6mpndu?MV0j_Hu*WdF}c&-nz)C6spjdFHk4M)SQdM*QtAcNH~YZX2~9) zuhiUkW%P1C78W6V%FphdskP^}xa@_+&C2+m4zhvscJ>48S z7OM5w5u2UFYx;h=61v`t`hfS6*1t_)}ok< z|BzvAYcPdBqKKs2bo@nwM6#=V+LLzOaHT~Vu|Usx7b!6JJzC9h$%>y6WOX*Q0gFqjjoJy2o&1j3$oh}m+> zQO>%cJe}rI7U>Y};KLN%>W{dEw#i>M!xWXy6Wkkj_nzj!Pzg(2PubH^c4Ns_GJ@*P z7j9Eq<*gT^we@s1jTMKTL5{+0mnZ#fJk%-0E*|zGo4g%i6|;6Wh9I;pTSXo+irylp ztO`|=G*~li(iDoO)e^A`OJ`Bdnz-g#o6^SA)$ zd<4CH3v>@osAU(NkF`pF@TCP20F=-znPD@Wy89`C`J(`w$gEMPRbPd8jZ4Gh&vz_7 zE1y20-2#|6HX5RhA_JT?QrCuUIyMx0d{uAQ)Gwm4VC=EvK`WPHl zG$7VtO#Fv@7}(sLKl-tx9P$Si`msRJT?)2&Fvc-MXyb_L8SGe>__B?MhK}w(4eQzx z_VJ0z^lvn;lK+&!3D~w>m;&_R5Ij3vkp`DJ3LvhPG!CO#7G3gwW)jhX9_uBy6cDh@xPZOfq1+((cqR+SAKLTc{vYpX zhBe3F&nG%S^Zz1SxFhn6-z0SbM!OHZOEAn7|F?*M28EkK?3us@&zPs=T;AMSM#eQX zywg!8ir>sM{OlY^A9;`zLZrM+ma(K~M1*O<*eUi?KN9iyQbO@$SsL95UtQ7NzKz?t zt=*LVv*v#a

eRj0u+6n9PMK|2vIM=KId{n=opI(nWvooQ3cqsW&ka-*np+YCvJS zJ_=noJeDO@pjPvneFb%D6HjR#n(M*zTbtsX%x3a$OEMR#gn2dEL+2X()V~v}W{1z; z+Ri;4D`E`AWElH6^%C)SR{~~2{U5YvEzMpFB%X@%RA%r0PS4p@h&^MqMvQ4ZuQ;VJ zXV-JI!L7y%F>io#+NL=C)Jfp-(1=I6#}%TDZSZa$Lue$F*6PVqnBMm~HKe)L-$)pG zs;Lpg0s4hHEYC4DHYFAGtA)QZ4?ZrcizmL72$zGgY|CkY_9DobtODgK@2RWDMeIgfZBa`SxyVK_P4E06T#tp z2*(iX8J~+)y>YNO9}n1y_VQjd4JT1p9p$=lp3PTRzQnkA^Mjj)g&Zu7tQ zZ5j_7eY`uwu9mDZoG@r|!T~ok4eT2vZx_MW=*?&H&l0Ks3k$#+7;v%|mW>NNPD( zKj9{Asby5<^Dz!lA#lo7R8&`!Z&BYrcnh?jWUuvky|~Dq-qtRFs@5vHi2L>|&_t@O zOXKbI@8l>4J|F+z#8J=t(-UAHnPDbk9NAUPg>dIvV-D>3j=?a?hBrxsrQC66r4r7&bURW;^RF5w{&SnoHh)Yrx3a z-TIO2rc%_$Yp>k9`z?mqNXnpi+bq}5Mx(dzJ~mDdk&*G*sR^x>rqR-py(iQI4!1zp ziC2g;!*xra41;k;6c4KI{(izvKQSwGxvUZ+XrD97LjdQLygK~5pPV{6*3byqA=!rD)f31h zd>#`XJ$c10M%-g_MbzNpLWl3Mj;#mu@XPw!ujnBQ_TC}X#=R7XG)t8%l}N}Lp2s(n za}@}b3c$3IKa-5|k5C>EVpi^P+FQ zrbhpy`A2YArkSpv2JH1+Q|ImD436{9l*iwM}Su4-?!XcIys3w{Kh%N=;L`{^%&YM+m!*m z2Y!d}>uGHzt0y_N(K9%lB8RkQJi<cdsN$x?2FoGz)FPrT4t%&r2p`nXtH8l zk)B8Rhb=TjZ?2x_JshZQ-a=Uwjq%WUO%AI|$&%DkY<55Lh>f3XJj-;^0Z;jUEG=9N zd2~}`xGY-@&zaThDOR*y$gtcLbs$60yV{6Y-}Sk{pP~Pm!CyrW{P3ec>Lkz=EuAs6 zt~J7teIHNe33+&8xLmLb=ibpv|2nf$^c{a34(6^6uk`8dyF>h{>mIyh#bLZj?{;f& ze;$}IEB;Oq%ES5p*OGB&aA?W+Rb84RRoAITTg3&plD=-rDqhWmioxgWehg%c0 z%Ba4ub|HaBE@cs)L2tw{6QYu=w>f)F_|k>^5wtr0Uced8c$bd|;)W;vt~Zj36LBNX za|pVK3V(5)GDMLBY>48zANW7Gd+Vq=zHVC(2_%qUK?6ZTaCesg!Cek6!QI^<1PFS9 zyK|6(ySs(p?i$=RICPQU_uY42_kE*p_vkU+7+rs5ggWO`?Y(Q&T64}dw_=rv=*w&5 zdc>M+nMzjjDivcRk3r2-kMB;0FU_&V9OS<=3RW1*k-4AoQbTxdx%*6Sqc@q0y9hYE zK28Cd2atQ{?gzsZGqUIN>pPv2(X$v_)ZIOphOY*?++u8;DNa0she}90ZAdQ@e)7vP zvOdL2cM{cs!TIS)j3$YHR>nmKV6O1;#4qk471{HAk`{SiHwoWjwCp(hobAQFb?|iS zIA4+5csg0TwVEnHG>ep94BcG+DnD(cLSU=lbDxbTbTjO14%C6bVV83I0cPSN_px|W zsIZV^#%B+!X@F98PK&PYJ}xT#&%Ku`dsJmjiLoV8JG?(NGBS?&Yo!_6f&3=x7>Q7< z0o@EDY%;2b1l#o7mWQnmNRMrq(fmUM>(?}p$^I56 zq0jiOv}{R*W^|?Muu>6Hf=BOL(Lrx(#R70q)~%U`g_I4X=CDHCNLWecJ7q>ek#yy_ zQdKVgM`bSi-B69(+*DljZkqe7USC!8jAXXct~Sww`_-5LsgHf076$9ZFc=91zs|36 zj|NMaUga}rG0Vsy-AOq zkeBTgcpy=3azy+4{eia`udu_ozU{c;2v8bUl#jD+jSV&o9eV`K1kLL_7WkHqK zCfffnpnksh%h?RfMyr#gbvndVsr5sr*1vncAcKC2U}=#|UqjnofpK;ifnlg;=?ik`k(}Imys# zIqg{V+=01^j$iWQP@SB0(-2AbRu%eJCzxZV=Wa(Gt#mg?g~+>q9c>zcn|7$>ih@wc>{Pb$~$>+3@} z(SSn}9E*EF|LQxkL0leWJ6#n@L-y{S(mL*uEY10V^VbSk6}T<;pzHDt1W^E|1CCM1 zqYWGi%+(v68nR7zN#vMqeisiJZKrjINd3z#IE!x`nNyl&L!5YT#BdV&jT}VN;R3A6 znoABV#C(LaP~N_(|12vnDmya;R}Y7#mdy>dA}FMmT~LtfGte7<4aMB$4l0;6M`9MW zR0`WI7+Pz3ef`yMGb6}V#;5?@uI46~)+y{O{Nhu}w4w)yX_!u$kt3 z9XDf+CWNJ&>;7oi-yE9-Wq`H4rR0Hmg#Tw6q*S%QwjRAis?->X4}or9Inr|nGbR9` zyI|^_x{T_=XnLA6E8eb@iLANDFW5j!w|hEY3(+^uQ~2<~eM*vH($c%WO6ColG$s*z zWis2$)D*F0pYKfnUWINQ?6m=ABxwf@e}QK!l#EvIH$j`zZt)58U`i#7+cuXnVNHj};{9?4IBd5&ipI|9=ZGoa%n16DeOiw^CsdF`k&z#EY zg&qboo7lX!brC(F6Y1bgNSdIA(V0oaO6SW1HfF-h?XxjoZyj@3t6Pa(#L$n)rsRLi zu`HiSzmQV-(6_?&?HCv1gOa3!)V}Pua>QV<2xq>#u+P)83OcHDEKc{`h4OO9_LkHG z*RFg1jtR0Za$Q}d-Sm{GY0YM`$zs+m`gZNPJ4|bVoz0H8Mbf#>ad*W;DNM zZ;3-X&BiAu&4MGn??ZN&^jxe97wws@Qa2J<@pEb=`*4Hh!%oa-=(r{@dJf$_e(Y>v zr$oip#L>4ZC}z2qP32iGq&c4Lzb8eQG4<*We;0G_wwFD4C>U=pb5Uf;=JpMtW-FJN z&vOnae_=d^tT?oM^Nu^g>@XLCfQ?7-0LDa5>IOF{+!w=W7wSJ!&N`9!>@=%Cqf!@; z+9z$H&*J$~fgNQT@a{l7;zpUCZ#n+6`rVFKh5{3gsU5y}A;*pe-YCHm$&Y@{^VY$2 z7xxGxlkWM&&1&7Kl`g*==bxBkvnn>FaD1p%gEy9pZq;MlvU^B}?SJ<=hWLFG6>};m zIZ4&;vFv%#tp+t(!!7B%WKOU#n;tOLnvpOd1-<<7KTrYtiHQ8qn1Gv#-%BFkDdC&7 z@ezMZgT2W1FCi<;;%^TZX}Ra`dIkUhamzpd{BJmI&EnwVcC2;?Gr0N%1i%APzdm8- z(xc?hSx;E#?X5HbSP%o^o>}CoIX|$X|$Y4GP=3~lVDs}m>p%n z{fnccrzZ}2S5g=SHX9sqP9@|t{i@j>KUeLCQ_bM$d?WctSk zQWZG(Pb;0ktZ?`b5N1y4QUJGmg|ufHHsDMO1LKVhi`P!U#l^MS2t<~8FyIHaSPnoT z|K+f_lEJX*c=hsgoUSnoh`7@&K_0t}U>Qm#_>_9N5(`df zJ=t@W{rwhK{(R5)%1;*5qoNqA7iO6(A*~a2IXBW*^urg{hS2vupK{;g&%NT{^S}c` zpZAE;4*wEKCwyC)hJkHLO~)!P9ku#}Zl2bxBV&&s{@KY3PVsRq=PE|l2*s+T2 z%geGp9N#~iS8W^HPnD*9!6V_AT=lYdRwG%Am_5@3Ke-VYmhE@$T!}F+3hX-SO$8R5 zzcU<+meLR8xpOZWU1Q7nGuv9-JfgSYH%&A848Cr;>Vg-+tJFuq+ z$h@cbPk^3V^QkErz6WwN^t+AjBtReKJ^JZ3GFJvQ>>^ngC9qVJ zC7ZLXWc~QLJboAxvIZ|0(D$(sA6g2XJ6fR(BU7TUyr`(84 z8~wkr0AIoAf0o4&>;t}ElGFX>Nl-mgNJXoWo=I!Cn*iVD>GxoX{>Ltsw5(I%mdFcT zX+y)0_IN*C>>LOfNKMRZa3 zxc?$-cU^G5AqkDySP*x5^oq}-^pV|qzs!8lKj5X~cj=3;kioEEx#`8>r605KFHy-n z%)`>_LxTZh9KD*m84%&e{b8iph`z!X%~tDNb;axU;Cgn#6`DiIhq8r}HFyF@^dEE3 zxSo8Gfmnz)KS&3ac<;y5xIkH}YIHLDUCyQ+L~d|7?MBCBtM~T~4*n7AGe>2zZ%_s; zKD0fKahFZwwSDlt9s;*DdW$wY{aTk#01I5+SQ4;;)0ECB6<}Q_C#lTOf*Cj850s2w zl^e4OI$Wx0#dL$3W=e-XV6JbKq*IWElKx$tqffWgFcZ61J>SH2EPNk%$aAto@IP(p zniyJpSB-tr&NlEB^mpcY*gt?S^tYkH)vdvY?4?4ZhD>7O8}-`euG1jIrmwxNE1;5~ zSWvE>fW0<4QvTVo+W7J^YY5bOdcW!2^7u_*>z{3~USbTp{kkDoR{Lb`D`#@$41+IY z6*4v65$?0hz)_4nm;BMD!7)jgU{5-aXKU2$0nsZ(5sdIe6nu0s0VmE0PhFX9Wcydl+V=@ z?dD6K2Od;!wlzq;*eOq5y-IYewW-|UVYePB9&QY}L@1|J?yXqe1dVridsglB_V4)c z{nd@n$;kz?8d|B&+E2ZMbMOd22iC5}qcxP@wbXvK-mZeAC_WufwsA>i^3c;K)HrcB ztI99VZ#%#3;}aYbIvetB<4(UE5-VHrtu^kKfj%}MBLO!&obyqfmviHAKv`4%uv+EN zDVEF>vSA06vTo0-A3*HeDt#P#{(=Eb1%Sh3Uqnm(HXHhl`&tYUBEA_aT6mOb29`L1oZf_+bBGChm)^GN1bxl_MMFKjBKSo#yjT%;&3a5O{Y&kK_g8~ zGE(ACdc|-3wW=<_^y(ZFC4ZV~`aq%arNOSq?J6Y~^>eQ&P>CBai;9!im?wJR3BW~m zYUK6ca>5%cnrWJpg%plzD*4T$k9E1C$+hdd6BmJP!3N_tBQiUpv zE+#QJHI-R_00B4_&As3IrR_AXAi*0aEwl*Lsrq%DwUtG>r zJp=KJ_(~yofGGqBVB6IsnM2pt znIZR!y>}_l%4zz;?DEp!{V>i}CUe7u7-$A(>+QK1oSm=5kF7MDbXJeAxV{PDt77r`f#~Wm=i)Vt>*p}1tL=qt-=^yneqCOdO{$i>;SAiVO3#i+WhZ>q zq7*_=%&q44;(s;|_Lq#`&{sYXxTYmHx((IodD;vrd58{a@eL(W{mlZ}2}ko`>uL|SWKyWs0+NKfY1 z+Ai`tb`7ctVn^pYx?W|{8EDYE}x;W63A^E*^FQepYM6cu{5F&TjyT$G;e(H!ENSbe2gs zcMTx;@#cVeJ6NW1kC!zUW1t^k%0;b4xc7ZE1%+y9-PPnk0W*V}v^ko8=;xgOg$LZ~ z`7XZ1gUKYIuUxV%!+V&yidKF47{bPxIxOpR1VMAf&O%`O`w%=^-r9-R{A5{i2b2u| zWEJ@UL;L(knE%@Hb}e!_3<2f{r$u+fs1lfkcJHq}28x0}#K@EfJ~{j1S+mXS2Yh~! zvLJ)Lq!wrlxuAY7vhCKs8jO-WtLp3J-{5aZJ-A`O_z65W6kzV{gGx$Dx`N!FDL&8i z|4i{=0aZx=xZ{h0FJLF@>A7{X*6P*D8WySv>i#+ft3Mwrxe=N{r05at2r*A+D zF!lu;$`=tRltx<{5h>6{yENuMC;zpQg(_@pnMb%Vw+PQV`OM+Wlpz!0y1>@|%;Y`W zA8G0HhnM$$dA_7~*#NtT3H;x}R}mmp2RI}RVCeoH{~Mcz{~y{9X9CztlTZL+Lw&si z*L$1+|NiD0cZ!I^IQoi(_i==x(EO0~>}p5n+1Z4JGf;W$ z5Ci>Zz>)cK(BynHizr8oA9$D6!Gns`501CCbe+XMf z=*wiW#u#iXT&YkARm_1*KOJc4BYy8w%W1dO#4fw5<4xqNH z_20$d_cix|DH4uOuKbvzu!-NYbJ@_rXAw@~HJ8jTO^4>Gop^^?R&rLN;j z4Xk=t(1Uc(Smdu+phWfe&+%mW$o>wbCgTyPnOar#+M^53uQjks8n6i)#YYMo_{|am z(W&?g4j&ER5aZjA6!c>*wQ6%?P59-Uq`>dfCP$FzS~XX4ak0|1bg zrKJJ9L|{DT&f!w=II2k_A0M=b+kM7dHAIxR+RX)IKy}@>+`p@eF90{oq&D-x!5!OK zDtR;?5^^aNtko#7JFGWmWMR(sCL)pNkXaDce2jg%DA_4tAG9aEP1ZzCv!ZZ(uGe~g zbhXLT`HuZAE{WBAuT z>h*pNBSL*6n7u-^l1HJ@BR`FCMMWJ>klZlN^tBm4cR)kg!iGv3GHYB9pTV zN7<8j9lWU^P*akN7*jRP&Aq3pGx}xI%9Yr;YTl7rIaz%mh5Z3q&1Tz1o`tcT)D!1~ z;xx8AsJAg`*N?`nD71Fug{r7i<5X&SJDp^MedOo%xumVLE*0>U10L?>?;0&6f4z*x zq8RZ!xJazu>E3+bwKsGFEy`oIU?Vg0P%mZx00N_eYfVw`6$A*JkUTFOK)ZQHmbx-A;>mr6%hpLT8ihZIe?LYFxj@Wu(P7 z3sfZ&ygyo4!p0BMdXEYNQ`i4x)RnK*NpkA;ENEv^zzn)=(17O|H#q(a0QQDB4oa4*OYR+ts3N&PNB&Vc;Kpbm*V4{B`c{#|8 zApuepL;D7fc%?RT_+RaiAaBmDv2ARaPfzt;Hx7Njd2#%ldAv&CKN0`c34wOR*Z++L zK%0f8b5=1U{151~D0qOY2gpBFL>Enw>-c(Q(ZnV^t$;OT2;R3{~ywVkeLm{iWi* zSedSqc6Bh&S1co1QlBe98L1V^1v(();&*92hMtKIrdQS zF^@S4XNcSre5yER=pJ{|Hxetw=s+CmX3?7~F80H*@7LZtF%89j1e^9;1>GCQ=+FU* zMy8mx=;T8}9Ck@7y?8y3O&>7|9p@w!UapObLe{)M6!y67T(2AcmREm9%L`!cD)q>m z`bJ#jme;^HW|3Q1I!RGS2s}L9rrp=&<>CdtJ`8)EgN$u=ki0-md*dV(_EAQwUzp0o z=Pu2FIBwsS60qBCB3NE(goSB8%zRrW!8UoTUS`XjG9(g=+O(^EbK~yd&c0g$g(6!t z>>%L7+@gz+HQprP!YGJEAagm8ZM(oRU8Yz(EOaeU0%_vn>*6-O9I+c-UbIToET7AC zk3Cm7|9zA#r9zbz-wge_u05(xK6PXyDP7?P9IJjz~@INxuLf@Y|QA|9l-$MbJ2qmjFHmmzUmNU{dHOsCq6S z_fq>ud*_#4ISs#m=}}niwEBq%ynV2-(QU%Z!^Jhburlv&Y*`dVlMjJ36c$S6n44Km zIsx$k<^l~!G=ZZYVfu{>etCy+S+7TV8xK0htPh{C#w5l2@*eRo0o&&fL| zpH*S%kN>~xRein!nExFcV6@}B>P%?Pz-w=DDbKR%qvS;xX~QSgxf9Y1{Kr3o@8@%q ztbZe!_ronbov?a#LAUzx*~O#?GW-Xz8f{UEf6(oeXIk`iIR4G9(k-kqZYKNpJsL<) z9M1q=-baa?gA0m-_ zwA5DeVvV_S==fxnWM8a%vId)x z;{Y3iB=RW>i06a@EePLOqg7?#{0}BmQueCk@_deYQXdV7#$0Ysmz$Gh78B_&FLT86 zY@rk&R5Vq~&w{6+O%c7d|r`QQdKy0aO?07OEn53h?@h_3zQt zT7!>6+hq3>L6&x#(GxuXj1T9tDp;-H7_sEwlcr`!qxbjHQYDdQPbS(h$v2^0yc1yP zd^R()g^|U-#`F1n-0ELEgaZ*padGjQO=Z~@fe~WkF+qcxaoV!oUOCOhD#izi*qrbF zJ~2(GGtZxJnhHM0xS}415H*aGD4U9V9g zy+R2+i*BB*=EDZe$^L%!xnb=8&d>_~nI&Eflc9*YE!zpx_@#E$p+oXJMI|;?r|+-x3Uj z)_k*t)Zlh4B1=9W>xMvWqaup1u0>Rj^y|YCO0J(pflAcQkZu8BXay_k7agF%XDWdFVm; ze~e9z=1*^UU+0gwQOk1k?3UTeiN5%|^!^f-ixOc@GYiB=s&2C0E?-BZ{chG1uUdx~ z3dcCi0RwO4_!rhVERl0mj1@woP+g{{6OD1Fxq^X=~@@_ z>obB5UwB`W!SIEgWRRg`e-RpG_m<$!_l);u{Q zy+%_R_t{YFHg&6F7kMRhe&V zv)i!y+AEM+?X)TQR5719;~H+jqQTgFA9P&MKCay7>T`(z3+S4G!ULx66Fom#am-W2b2 zV;o04K3(P471HSK+tEC<)^7|&p+)44AFJtk8L-s61$v}j0J}Qb^lI!Jm<`neSes?* zgU5}`TA+7-8ND0BDWf@vGkI*xe)8Mcu*w@E{$)(uC%C_U42#_G%40Lj>2ur;J;-d!m)rA&-L1ic)0_lO&K0vQXmvvTR=3sM z$(CNi_QO${wl?e=pslOQWL2=a-pNWG3)?#a5kAi6^||j{)V(W^VAStF4+du^&WJ{< z8yxjwT&ic5x4JZZ1)HgfX9PaElhc9E)>hC2w>$TOT626}YPs9c+0PHa6KMq#=ifH> z2mIBrLFK~R?1Bp_?A9mv6a=8NS8xCV)9yU0o0H#Lo^qp`^YQoAP|B*8#qaSE`Ug&0 z`9p!c#CKI5o5X2gZn54WUk)jW>7dY9B&hIS6#9^6%}tXOu1q{$@;)atcO(`9knt_E2z7<_CEUmf!F4 z#dmyJtbVb7W4l+DwnW%+>-TRA_Brz1^?gGE&{mIn%C>UvpGGVi32wm&06>lSPuvDV z5XJwyWGW?d=6UOq_J@ETgSG##;~2GI1kw_}yO#;PpNg!32lgK#U%Nh&1c)S8V4(o* z)87dHQWzAJsbM^y{Ox~2LV*h-@_K{VWySIQO`Zf{J?joH6`b1u2M~%PviJ<3jbzmI zIW-Dohi|HX12}VZZ}M>e=Qy7dDg`n~T_fJ~~ z_H@^)>Oe%`Cy4+50DJylX0jY5RT0Uyg^0XdfVrS33^gyGhzj(sDWgO1^npx&I@$Ry zR%{$M@#{|rt)awT{{9&#cf`JVn+~ulTdDq&*=(!&S9V9l2fQLUy1po2=N=9g8X_&i zb>{alX#SczkqlB1Cwj#*6|x9lX@UKZiK5d0ARQ^md~4?}x!ZrgNUS{V9Zk9^K9s!i z*q-`gLPY|VC`ORPp6L0#a*Ob6Y#OboXt&yZky{P}rgMixF(EuE+B1(CdcQ!7yD+#7i#w^h61jaz6xP0vEFY*Tx?|)gr^q$T3pJEbbfO0Aec1#)FiZy9DqwA@ zIRx}L7g};m4D4Fet6VHX=m^Ruj1#yO@k!lv+YT1_BJw zF5(ZQ-Z^h*l7hl7aZV&5s_(1Vm~(B8BVB9FFJL<<{*49j)$u0>BjN_4#7XQbHKQa5Hd$S@tyPAC; zLf57t86q8TH&e0zlJqKIN7|0tK9DIgx(Sj`@1}GHcFwU0(hH8Im<|w8@Hf`if34Z6)4ilPpGKvN5XKW^kox2;dq^InaKeFKe8#QNEAB;EVRh@FcFBc>;)bAv4;6&m_LZf*KQetgyr zOpHZF_c=G-YCcv|3Pn&;-%bm|I<0koO>KhajMYI3n`Mtx8e(XUhdSq0#U}okSk(L*S6!NgLzs_PnG`#mf8k2)6YM@ z7Vt?eHz={@N&Ni=Sn3_BYm|&V;Wz)h)o3ma)*JZ3RQ(_yPKV>{H#PANU}#L-_!2Na zcGqdHcp9qwaB(Eya4RowzOU9?`UI@=mq4-^VSvPs@L4B&{4LJE&A==cdf(MZ17NBN>Kei6@DlcbEI z*@b%gUU{yjsnHb88#=W3#>$Io$YZ=fzAalN9c34-@5`aEtCYP6I}rj%W_1h2+RJ@smnjJ;ITnA^Xjw znxL63+t$qGVIW^6eDSpdKoin}-w^S+ZTwUm9`-Ud#oaR(5%Crg=}KZ955r}Q*3EJ# z3l2`uUCCCutOTZw;2Do3q>FFoY|oH?KtTn+!k9F%dGtRb)KFuf27$r4jo)%}B`1%@ z>{%BFl&6gqSna&i!@*NT1!U_dlsO1{@PRCZW7N4UI&R$;1)3qD#OVCegT|W}(jUn8 zjK{*Ff1(A_%&hL1liFBI;uf`E;k>k%vK|S?*ATrNd*4%i-7Pv_UG4R(8|sbDmx4x! zIk4$5({tDtx*Y2x&{EO#CKN&Lidj@$`S0^Q_&>tHsB?3ldU=bx@YU4S5wMzQe_1u- zZK4I$kVX+)%G3R!Wnkd*x#t2I%6RlFcz)9@v$aye{1?l|T5wMgT~754Z<57)4UK?< zxN_P0JG$&{q&!CSqG1@f^SgESG0p{(Iy4H(@4v=J|+L6eSObyv=m6Das zRax`XGU$7(FN~>p+evCV%zwB=l+NX$WEYJ^$HmStQozE-`T0U1-aUNjOlN05ii8 zA;T8~7_NUHv*6oF^hST23W1%`7(KK75W79b%O*J@J{i=Qo$z>>q4SJ3(tdi=B}&iD zy0IimP^O}3QpRt>t3T0x*+Z7CS*&iZU7k85KpGj|!tZ!6i$o~sl9iRE(%rJF4M1ia z+uJd^Sw0N%>4U8J$4-6dKmmTs64e4rB!RZB$OW^A@ZSDlpSV;Vj~WN5M;UWV>_o*_ zY3eXn50HKe_*kxCJ_`H0x(OS^rpRfkl+Ag)m1KmtE(N7BGGcbG+QAKt=0Uw2$7*jNrr&w;+FYLR)a~B*0{5ld*t&i()^0}oISR<${o_I7qZ zS35*JSQ0L;N*f!KFOb=rq?}JtpUjk^2-w?U(3t**ar46G2Zsm(++L&F%M4=7^T{6{ z_>tRV=jZ1$d~W?OLdVRweC~G$QL};k`{auVrTX(b$qo}BI0(Tv|7S{o9qak8i(jXw zd7WTG{)NZ?i%JAE>BnwfyV20T^QHOj8Tt!3S6CDnG`@e~b0Gr>i~z!J2&N$=iLC2 zHN#-rZiJ_M*14dYyHiQ-NhiNga1Ovia&vPpwLSPNTOO^hejD7)*+&`X^f4+KX(qiPEGYRqA%`(HIe01ICP#W-Ls^ZHPCap z?9bLg83E7f(u0|_Zfo-grggU>Ti%)m=ILlZ{L zRw{;Y`XO4&`r~7XUMxAU%{1J_0q~!`peAvFj{wmRJX`yQEv-F3G$-^p=M4eYa{p#a z^UJpoDD8j+0D4D$)n=)SP_~^CMvWYSJdQ&|16o?? z52g;6ka%T?lLwKgkx@;{6HlOJ30y;BUal!5E-sriJMP}!j?k!gF#lOYc=~HxP`yRX z=VhIssfx@ZS#*^P$frcJ>vduVdiJn-j8d-B)y3}~tQTSkj?xa1)W=7<=a~mBb-%`U zen(fGlk87qXDcr+FF&K>CW?hB5D0m09e|D3R4-0BR>GW+JQL3dJb@}EZ%#4otK#rG zF(R;E*QdhhJ^EY3MNyypF@mD1SxUgbzBaVh_o!4+HqDK!d!Us4!>#f|Eo*-te(5L~ zwUXa(OV(n!#rr96ze%9RmGCK;yX&mhR3b%!*zPQe#WH$U=hH72h>?o+ktotkbEwvw zw)V*AjwDad+8w`e`HNOkLwAp@R9w!gG5Cg*>Cz{UCp|je+$id+9H8) zrKZAEL7+3Y;psfu$%(rmohqh5beh3^wZR7Q7L`vHTlZa!=0 z4z$9;JDS}9qx7qd`uZIv;`G{QX8k-dS`d6Gj=m z!AT>Q&V8v=ija}(^zemlZ+?o8B8K9|_~sh9-T_lLW5#f_rS?*TXuoAucZjriq>TWx z#~i?g3%^~tbFw-M2I>hNx@1ZpQvK;%nCIL%q{W=t6QV|#c;2o2dp-TlX{MS?bW*g2 zn>-;SC+J{B*LiPEa1bkMLELr~yzR2AjhNAo6v7Oft}UV?DQ97^)gOsFf+2V{T`741 z`6k_VB2a!C<7MGe>ef5Hvq}P62%#LNnjXE(H8lAByR*mUvok3x`{wFUE&XYFmBE^N zgf{KlJLESt?z{bk4cI)WHOJ%)MMm9A;B*eb!+HKt=unt^ILZ~~51v9YL(^MEr#pk? zOWKjwI@d0AMFn43Il6;yf4+yPO44XnvzXIe_DkMgoS($jynPa_Aae%1iYGNFj{7A; zm<>fI2dHCDyS@5vYhEtIOU0erE4^Z$$d>1nS-9z-df8675kk{X}LdRMWK1)P0O*3Rom@;FRF-idLPA`95F| zmXSylIviJ76K8eJ+oI*Q##_q?k;eRtkiwCRZCU2a2t>QA_pER5yl4;Eg$vmL&@cP<$ot z=c2_EJTTDhH$L7mYYR#(jzPKqA&H?IbbtI9ckkV*%J(2?FS5+ceVTr`O^)%W?LfVa zzs^Pdg1A#cGJVnhBDb$uc1C8--mHIjmk#+chmpZ!lx}ydGEeBj zqWV3cJ5ERvm0jPdSGcRp*_34v0tc3lNSy6|p25`}itsSE$KpZT1(i#7dMk9s_ek5j1rHP z(Hw{N?wqlee}3a(786{rx~12U8#Cg1)a(QAMe0L*b=TJ$c-?r4IIBa$53-*d?mu74 z-{NDZ_wp)eQ_$0b)LX5izJ9;YKWJ)o-F;&J5s~c|6f}e?P?hfc>(Z;@pmL7e?9X}B zU{#xrS?%_n=*W$T%*G4B3SToLl0qubPGhUnsEwcJDix)>y@vOKJ%#egC}!K!17;Mk z=^XGjFk-3kU#tiCaqGEuo}`WZ=*Xcd(oh-A$8XAOe}+<6kZXkG$z<$kcokJ`y_LhE zodMi6M}|wZF>3d}x5K)71W9T9y#KWIFDQ}Y^5^77T2tTEBx5IE{|eJ(e_E<#FZs^@ z=&IaO)<{xYWL>nbw0WJ3JRaR9$6I)se$mwD7S|SUvBNK=;!AZoz<3o~PLzB*sV+7) z<`7Y6=<2;U5@Imtn&JDnBw2ISE%>=Uc3WCwO{cioMPetmTz@asmJ?!vQ`tA1%(kID zJiOs_^=~XdKIx7|yANC-t8w{wwOJC-CxG)Q)Q7w9%N-@%ZGfxu{7TzTF3sadiP$>t zImTexh0v4mf*X%ECHiN(Mdd3hIjtpzphjSC8k38g z>b5*A6y$e`R~ew=r^$xR+AlKeW$VLGCaob*2g+=R`vxy#wGK5 z^Os*HNEbm;!cN@Ok|!-|=J)pYSWSnqu+y?1715wY#*?2M2sRv&lr%(+lr9+oCf%)k zjY9&awnJTwn)6jN{|)I1jE%LBq(;`_D$yrF>t>K%elTDxIQS+8QD zR8BO}ufZY!14ByWq|v6jc#Q!)pYY8@R*N^;jGc6DfyLUywot1;%h<*sn@p!tXh86M z?ItW3mDT)Nh#1Ebn-X;c7f`BrnO8dBGhb)(~b>BL;j<29s?=eT-g+qEy` zBHj-lfy`z6SKM5keKf_gv_)IMyjQWWg*!iU*6(S2jM>1VX2)-+meAh_t*2|{5|#;N zneZ*lbpZ!xV0UwNw@lnGS!>B!r{_vY(#Lq@Z)n?>6Yx)FmJSQjKwQD$PW?5WDt0hx z>E|M_E$MRrdHuE_>n@J7KnitpqRGTvACgRMXYAa<%$1EUD7T6B&V6zZlprCuSg_BL zr)5`AwC-ozrj$Oom;`Y^dySz(ov=-~B_x+?N|ZArdM1+fwUwGinT=ynM=MdNEUTGB zI(s$rfxb*dIbFoMm#EH$<0l%#N=kqPG}h!48UBiI;g3S8o{W+~`Bw18q@jw^(NW76 zmYXBERv}PogSEG&f8zw=&QaI+5Xa8m=9_HY`Yf}u4YnGT*M&T5gV{%=@mucV*LZTd z%Al*s{hzW!bovP2?#A=~*q*Q(yI;<H)y-={AS%_OPpFW z#~n4ayHu}`F(x+;__ZZl-b-pqX{u^DUhWHg+^{J}>;$Z~^W_upA|A%G18HiDi(@rk z2tB^=d-Ml3#^eyrr;3Wg6Renx%cstcymdlgQI+|jzS$2-E69x0DdSGgMzc~^ssC+X zFHmu88*WWpO7)v%zcI10i+<36$>H9FUh=JH{pl`THNp(h*gJM9cBEB3?(u!-i9bA2 zuvFQ6N=+>5biAsCNO$Y9rXJ}KSAjbVL;H-@q2z|3!jv%Q@ek<0jPc;GjNICAgw~lp zoFX9FQ+9E&@h+KA!rqY#5n3i4*k_G(R;z7^kucM9g=Ux5#HnDVS-#2-;zssbM1b4s z&c~I@H7sMD(B1gF(LJjI@=%?U`hHd%%18IUoo@wXFM^OO=AgP{L57X6-530W$Pjrk zO$+NSi1qTixq8^AxhY1(kx|OfUWXfyY8di6a9XHXd>jC^lk%IzOTXm9iRoXnZ}^%i znh{ikHiKi=Fv(%<=`vw$ISHLaWVlL>{Zxje-!Lu`VNEMl5~pfdE-(RlbSRI8w!UB3 z{H0fyy!7z3((Qe`T+Wf=m8!NthOvTTSUH1?T0XPOu=It?7pNt>+6<(k-iu*{-eL|{ z@lZr1d3obQj{o=Ux0rBV{4ca`-JKUqHjsC4N-YAX&kFZ$TNF0)t$vetlQ%!r<<`b8 zsOj1y5aZzN9;ue=w50mOvwP*$YFj_36MzC6?h2l`JNLJ1tw^oi?YJmVpFm1rQCPKRztn#@>k?kml-i#yXoncUzb+muwqa{ zUuhV4TPB?)lm0{ANpwo{9hg*c8S0wyHsP*=q3LZVdlM zkBjsnMo>vC1TA$=d5NV-l_vbD)z~w|y)& zHhZIlIp;&(GB1wF&P63N8x-y6X`|4u=txooRdEzu#_U(f@cp4e;tE|UcK8| zdX28tbw}M5Rh%RphjkgGq2L4=(^m^r29+U5`IsHVJPN0e`p$3o*&O$0MP(@1eTA#9 zgbS3*r;5S9hkLOXjeLos8zE#05E24)DKkBnsp-{x)bqiHD%4ocGb+MWZj)Y!abJJQ zm41ln;&WRfdZ^`~R-qr(6{fW8DT5$6RY8UIk1?4&UOjZDA0JWMdY{kaG`7UW#E>fkXtSO;={8K|sp_nn&^=J$VIx4PUcMB*gV-!NV|yCO!OXBl{h-n>S*jU`WC{Y}~_A2I^Q1nkns`n0yTv zutvpN>96KWIZqX9pOATei{!*UviIPEZV1v^X>m%~eZ(%-ji}}^rD?yXk|g})yd%z5lNrQq_1N-NN?ltL6l@ui>DJ^ z-zK+yUw<3%pcub{I&!_gV$OQZPC>xH$>5Rv6bK6Z)sB|ULKMeQvJmy_3v^F!+$DWg zRz4iVvC)gs?E}(lT=H+oi9CVDx5@Z>TKCI4XPX5O@gfbO36a8gNncm%14HC*6^^46 zr4zmUSE0B?QA9M%FM4_f_UO^w#3{N%YsjO|mYvY2E-f7I4c~r6(MaLURS7le3D&CH zL%CXJXq$U8nS@$O)t=C2q{Is<_`dKkP4!EyAxNHBx-8I6xHCJK>dK~-yC7Pa(rpD2 zsm%jNgRMbNpDit)#uJs{yRkFYRd)eS4or?pPNR9&W*z~1(ZbKZF-)sgA{?Tj1*wBK zr?3%fG;IS^d;&_P!p~A=sf)Y6#XV_vLyM@mJ($vvNA3w2^YW_-0 z#G;<0^XJXb5T1ES?c9n~^wz6BUN_V6|6uQ}gW7!ienBeG0tH&66mN^WyR{Tbad#~g zFYW|sp_F2!xI>WuNl35+*HYXHB)EHU3oa-9J+22Ol~ON6mW3n;c>obFFh|4GIRO4%qQ)nadL zmbg}A%duEJJ}>a#;q}#ZCI=HPP;H(?N!`BeB^AX;RwVa%2c#{6jdL zN}^A9Bo);r)Eq>oO&v1tyGKTH7P%97Yb*6u-$NM;6tkzU^sIG;T%~l65FTTMSh3FI z)?`nEsP`N-lU5nJHyU$&nw-6l2MfqlP2gZCBuN4dvg-bJ;&a=;c^h=y{z3 z6Y$ib7Ioi^xF!ElpO6J#IUd#J4>v2l;$C@Vh6Pfl!y?^XL*8w2aG*p#=D6xAZ_J9y zpqC9*c>hdm$AKkyRlT`{JB0c9(NH!=%0xW~H`F_pL#da=R&J@Xh1ne;;1I0Og2`(h zNf+&64Ajr+T66?0eMKeLM}<*^-%;wjIbp&Kvw=!S>l=oNeoZSn5sYeglnrToON3os z)Svz;5&x0Zsq)R}e28gN_sf!7@7H|w^r}AI&$}dI^#S5<=`g>}@$t)Uoq1GDf~;H} zqrL?2XB3Dhzpmhv@tHp+p3U}{-V)2sNqCz3xMur}j8>|OK!PApx(=Kdjj0Vr7%dr9 zv@yx9K5ziOZesm78S~{}1Vg%-+*A{7{+<0O!n9yH_sN;MC6GQrLu7TXz<2Zb`1s{@*Ic|>hKVtVW1h;B zh2Qfwak63h>ZDL8y)D@)MDoNCLL=0hlIZZ7ATq?*r5 zU6pNC!7KV|MFZf%c|BJyw5j*FmUuL1X~y2e(yn^uIYA_CpN`FJd7kv&mX0_!I@-q( z(6@CqRP?F`h}?;itlSqS`Je15m?N}( zX|?AX09cUDC+F9H@#k`6_8V`IG7JCi>RdwTYb~f^p}H5&_9a-&53J<;oltCuPa^V{ zz&3-6yfX$=spa_FSX%gwE%5(sFyZ{4HCX?7@4xzz{;R3<|4a$=zo9(;x$^&;u+jfq z5WvccRRg1U`@cx;Nb_!{uw zm;}JJtv7r2b719{WUi&g3pzoy`}y(5;^vl1kg_i{gaj)=RaoHDLK_xb3Y8u8UG2iQ zRcY?>VHp_nchb=OnAP#MGkX;#+3nOUhs8^U0l$94ntfhn_>4#aXcFm>r)>=7KMY+D zDYr^^A-hLQ!6`|^+GN>9L-k}AD(+rlao5cW(uUOaJW<`TS;1m%YwzB9w$S$VZ+iA$ zRMHHzG_dwr9hKw7in#a$AzJa%MW7$FrM2OUr+5D`7yLURpSZDT{Bj~ZXnc9C6i;Hw z#-^?{g2@J&1=J_2cZP@PnyMZfGJJl`ES=HJC~V=d63$~p)y2&v^zBWUe5r(kx})-i zQh>VS(#DsGp4arIZ@hc*j^Q!d$?=TAyU_4vaT6av%bCZ+Tn_$!OQn(F%YLSB-emx% z`H~t^F}U;=sVu~%x4evOvBO-L;`Ut+r%gEIS!uxZ^*#86z4si{;>;g)0Rps_jw`S= zYcqEtL2lt1Z9A%MLGc&-wo+!subWjLZ*$I8OQ?aDYh|f(A5(6&i?T%>a@Msi)gy&7 z347AQITH=j_dX`LS?f2_=Zl%LKcm@Pb}W&}$jPwcF5jX8R7d@t4L6cXMjXp~G2r|x z(lD_bj7_A*mna2VIj>#TUt$Y8-Z#Mm#@4ouMKeT`0M@JKp84ku&oCRBr4X=<` zm{nDoK2ClnYW}Lj;=P~Mh}U>;jK-W*+hVakb(Tj_vd+DbQDq(doAa=+ z-tRtr)DFRQZ9%1JgPpoy+O77aRi&+O3&Xz^+~=YgM9KoZ+szTD$G_25>Llg_$-${S z>4R7<;xZ!H>2x!6jmJnL-5ftBT zdmgJ5?JtWBP;}z!d{7UznEwUd&!Yc}`@jO{$Y}rEnZPUHkoD&7OB3T1;$fHiZf}zS zU&&5zq#F|Tkg~|ByRigCJyr+^(0pZ;mUgRxZ)Rr-7d@gB7dAY6qpqu2E1CNS9*9*n z6U$08$P>~pEPkA9IGq^o#1W@Yy&T%)Pnz7u*qREGV$yq}g=BKw86HUQ+L#*4LN>i9 zQ^W<>Dr;=Hm_8j6<>=K(t`e!z%wvqoLc%|dlfHQ~p?!3yPL*H`xM zZvS6$=T;p54E~D#uvtB00bDp@Z0?uG()9~*gIGzDdof3}ip;S06)YRB1yT62o zSBolt*36$)Cbu9(WvjGZaxA;UbJgAn*n9G|@2g8M&>|lbV)daSP1RPz?k^4vi?;mB z@U|q73iSKBsSHjS{fAix(y!XapcjKfqq$OEb4vfHRGczTbwYB0K=;j3t&{eq%fbD! zLR?HtFL^jz>OWk6MJ~~QcoPdR&-xvMIe}4lIx&w(FfLZ6{r)M|D0p204hk-KTg1|2 zwQY#IqWgEYu(g9bSb6L~EKQX;GLMdOn;OND{JCS1Obz<0b*TcG4D0|Nw+J|dtD>Bl zxio0c}+C^`+YevF_x{}LO-{t_FI_4W=% z;a6*?D*1Ai+Fjn14Mvdc^t&xMPqg%q4np1>eQsNvAD-0z%J>rvLY2?_{&ix!S=}Z& zzJ*0(VehUv;aC;^%%2=Ry}8Xo!D#K*YcD`ktrQBszwGNJc&G(I3w5Ps0??!h2`pL- zid_S4yc$NQvH6)EVoOQ~GQpw8k0L`E=r{X>pE`gtmN}^=evUp#iOX#<)aQWKZeCcb z`3DO-4f~0r2VXkLBBK)8lSj!&Q@ED4`%6BAcl`bu-<10?p#(PAYWi8MI~Sf>2!WJx zrIMGV%JV8CfxFO^w;jy)pG768Y{f_*3gw%)0<=ia^RNtQT4}Z4Q0}~j2APbqw5OT1 zx(%o0p%mm4%YCS^c=`>@zjo@-KVFa-OWBzTM4rp}WT}JC@u2yQd_m5(#6fM&|0}%F zudSk_UvM=^>t$P}M(HpWy@V8ocY|yw?`AwhgY2U>pM6aOU;3`sW6lkROwuiio*o@3 zZ;uYrB@OCEROXbX|cqdhG4Z8SUL?TLFRHng#e=wQ~ zTcAdwSbaXK4-~HpDhnq1dXQS%GU1ijFaue2r9}Izz@FMV^7!sr2TFJfTJJxrF1!gS z92fk{d1-Bm`oH00SbOo4flpjDU(i@UXei_+im4{cJ9j&o2EF(;+lH@8a(9RMjzZ=* zR?!qw+B!Gz5KA53-q{J46U}ogNgRD8G98aXg)`xWbF}7p`7O$~FZ~0%0 zj)}40)P=UzCtb}l7N(i$DKD5`S9mh|ff+WUW7FwJQ@KgTKkTT=f{)UZpRE=p7V4j} zU7z^8#mdxoT8W=sL`h3GfgS}`u{)@%OU2u>B?sG7_8xkG+J3TPS-W_Do0H+x3jo?K zfK}j3VxA1li#u$|UfHAa3;2dv^}XM(nY4!$pXf_@lxDLU%PJMctN+f>1doBi`*-iy zAT@Lkw7q|Yho4jOa`eoG{dG$ICxG~eFya+);Y}kx;`;kx%XELNuDIRcmCwmGx*=Ki z2^L%Z@h@B-`>Ju;(2R>`WZ0A{tk5dZ9ozIW&fXQkB(+nuu6jf~a;Fjd;Tz^rGQs}z za?7heBLhoH`ZJEjR{lL()wQ(`-^S5TAHWd^ME%8#Fn)D~mfCf}OMZ%E><@RHdB(wJ zuj*N~JHk8@LX30q>|aQuZ$XOv> z2duOl2TB3{1`kWSCw%hv>wccn(oV?bnRJcTORN%&lqKs=%d7b;JCq1ae#AP-|D!SY zcUWr4rUeJc2RZ5}w0X1+@Y><|OXLp>!!Hqtc=W{RG7g&raQ?NV#u^bUY)Z)Ul+|aO z|NM*U3SFj4KknruEUM=u)WEVt`ek{&dL#)$$ywE_?<1sZC*&54RpX3Y8*lGJo|jej z$OnX>rPpIcgNHaS5QiRn1hr1#VYoVv&wGnqc^)p4)A2y}a-lO2g?$#TtFy2|wq{-J z5`hHs_XJ@fw@dlBLpO_PP~PkOF=ddd^>&yQ{^)h2s7#RHoCRRXz9X3~kuq(+v*D;S z;V@J=HO*JnpZRs^U|%BU%({ard4JB1x9g1KkXg81Jv!s6x0hM4Nf(#Z$xGC@fL_g~ z;r?QuOrXAWH8verP~!C%n-o#qmRxqNcCFNymN%7CDKV&8eahV<9moD-QDKKot_A?hV&%mE2Cc^j7M2WFE-X`!tp-Op35 z{(Qb_7zI8a4KmgqNu)1SH+K8=+>Pv^A>K%fAs0`o(j&Z)<>_IM#`fGt6k`C9FtJG&KTesz9 zE_2N!L(Pn`&1a?1cP2Hvigj3U5;C8LY+PF2X&m_U)CO;@K3qNLsnrJxj%oTCf;T(}3Jw=CY#z88Ym%@6eojnI`bxRD zjGY9&h3ZcqCEUTexc~Qw|38CSR5W`m zsm8e7Je))R@#95nvG|<5rxf%|Y~9T~OwaU^yH0j7MCp55gVsJzK8b&hxTifr4qtkpfq?u;_*jWjI&S{pAZ4GKvZd%T1TmIYQ@)&&5YZR=j_y zZJ-5OL+JTw-6LDFjln#5tbom3kTDP%d2A&rxvhN z-xNQW7J1i!3jZP55gc{wGok1TgUl25Z6i-IL^yqnzdbNu9GHqvc%7SU8TD(KtT^H# z%Fq$S^P^{#AZ1>^?k5p@{Q%OVh{lStiHRf?k zJ<5f@voB0FO}L~x4)ODA4CVR_No2GPD77HInu`r?t0Rx=zkVF4)R^@tHBN+V`X%18 zCMC_kJ7cIjaMT8e-?MSHiDuz8Mo7J~-05S>y6BnCo=}aoGplqj?uk)B3C1rmlFD4AyDof zCAA)|F|VdN7~pft4(}ticQMiXi(t+|?@%0B?Q(ScKo=M56Ih^vTfzJs+n{nvE%WaO z4ka1`bC4+SJ=^O@%U{2eqvdoR7)pBtzVL=P!Ax$7e0_8S2F)s@W`1DeLPqBwaKYwd zfLQi&pjyYUs-wBupI>^>a$XT*K|iL>`y$q*g?Scx9y_A+Y{VsXMhGc7Pkdi`pu0Rf zkP-odh6f~V)y~J2Mpp|)t{vfLl^dd>;?fp7{98K|f-{AZb4Iz4lb^oZeAt9oAtZDJ zR?3a3s1-;L<;(u20VeEi29CIl3c?Ab-d^D>E^|elv?I*9jBU=iLQCNSXkZ;(|}E< zWyf3jpZR=&C&*X{V2reIaP&9s6SjWE?_}aqb~7k~8l7*}OM5SU0Uq2)ZKknv@be@6 z{6-tff-|%_$qu;VBN)F&5;7~+KrcqY&aC$Z6RbM2PP8{Rzw7m|>PEfUy16=By9yW~ zRE-ZQDa%{Y3|5aHljbt?x~>yv84Bt@M!%Obt82_G@c3nQ@J?$pBE&fL&9B6iA&*pG z8Ngf3mo66(wu*6|>;A3vd#Oi>n=x~=_fIMfSAamvmlK~_!X`HJ{nigX&J-}E?@ z1tox}XmTIF*nn#_a7CEAe`aM@J$GBBVP~G%PjjHpf)Ta^R2>OO?3_?q+)^hh(>Q6&6ve$FVnH)%a zu)^pKP9*m2Yn|a*grr}7cigu>b@9U>NVLJTP}koB8@)#=j`;3mfCd5a0;^Q6SYkJn zQgorNX`C_K%Vhx(|9Q1@lzyOJ3QT&Y(4l^mXYPKM&+OSQ_0Cx-GR7|^)}q#4VDF>t zCJBWu@#s?^Yw=T`td_jf9-!dwLO$u$SIoYF+xfrU;t|!+yeG>gy%0oT+<|*V-dz?~ zRXJ^|+HxLNX-EQ^N`TQ_|J8JqrZ9w_3z2Uu$tUEll+PTZk8}@uNlMvqUQ-5vNjND6 zJkcArE$LQPA844ELcJ7|;U`QTeCWoAT1Da2e4Pg z2rggQ8@;M$dgl%xail&oxDkl~MUb0ilaP6}+{kk$_7cf2u#)ae-<2}@vZn_0$|;tN zQ(mx9c5=O&|J?OuqCU-inI~06m)_~yX}=EB)HxPjBl*wvPWJc<>iML_ zBZ!l|{Ut?ga+*H+drIGvpX%*3PHE+pI8kC4OwPxM258v zdm_Jcw2bQrN?kgMg!f;At<9pDp^u{@*&B{D_lcOcUX z1aRGt7808C$3?L~{I={^nD1z$iSZw^`#8t^*n;YG$5FLzebMbp0}zL&j-ZO+oyF#` z`@t{doP*a$fXcDT0dm^z!0O};g% zP9JSaa>bbnsGQu$$5}J-D%;4CEs8+z>XW4?ahG6gHuDf~ zgSO~zFG6B(J=*fpu)_~)gIvh~!*AalelX;V+}r_0nOD$KJ@NBM)Ac*ST1Wq22Wf(^ zQaSX{=1MDU(|IV*@yrLNF~~LQ)4O4oY)u6di^mqBM%XwAKS=Q8cGbUL+!0z87gtcG zLwi&SHW(3wf!T_GW^m{vq`zQpezBXybNV*N##&#QcobmmtrZ!y|HafPwE3cG!9M~k z#FPF)9IBg>LdzxK7lWy$oe@kA^u06xlVfnES_b-4(Rm#~&5dw%!=3p&_vFRPeC~JV ziqlEOEO&1o?m6WrSATTvjH?qjV%GIpswMD)ExF0^fM%=C6NzYKCV!Z_EL?;?5aZ)U=pIcGB)U9O8%K~u)l!0t)7OMCr5x&q#&HR}Qyblb9b z%9}<6xTiMlulcqt`;%*I?`EhPrv<>%6E-F)^$jeM%v5%BJc`O>@|NfGX#@aRM%g(y zx4e#3I8*h(^``f`7`c9j*_2?T;k7W~Eo~rPim&~TpV5L^X3ekSUbMYFoALd znSOyn2~r7HMmb)P73(D{aZ=RtsK3YmEovBIZDymuy;vV9eHF@`r?x=1va`c!NwuP# zjsQv^)-uOjfBJlNyoc~M6*m*gv>|x&vZP7Q-SRp^L)I|WL$2@e5k6Lbw3IRVN;t(k zDU}`Spl*^>??1by#!lLo*|$YbX%yIOvx<~BUxW`hHK<^|v?Ka$`0RT@zHZk=@KDao zuk4#vK~saD*bW6pNOq?=*~hi_zJGJlq*XV&?WuPL0R(kU-+>G^HV2)i#W?ydYh6rI zLd$3FU7gYK2L5#QE2qJbYRi~iqcacyFi3~~$z1!DT!{jhSm*NiD^aG0Zedvo%0R}{ zbeH@7LZA~6x>i;5i`r|t>`t@efU7BObl>{nY(7>! z4kaTGT&%1$Ylgx2&ZUUQSx>HGD|X(H+n8GW*m@B7y38bykbUbNnLs2Qf6^+@CQIQ= zwb6ZYb6op{siLga;~BI!@9kI$`Is6p*6zb5vJUY8h>n!~1tyy;G zy9j15Ie3KcMeBIGv9dRnGzQ$gv1VbpU1mylFAI)srN)1QY7~vZfYe9cJg)&MOiwM8K&SxG2TRp#9KMMM=Cp$ zHgR*e*PphCL)M0d_XW@5bqg~>m~pSi{PK2tmdI4cH|O+PHsKZNi#9xe&7Zg*-G1uA zHL0UN29Nw zNk@c_RQ4A`5K{&I51dn_{X4>JV%0C#k6^si30aA^;t?w=fZ*FBS?y!J z01Y)Sl5pAvMBgQ9ZW3inNu@Q?tN#emKF^^^5YD393m@c(-uvhWP)s#pA|CidVleuE z#`js&njJ4dZ2Gde8S&xz{pESz*2#e0lx1&P|IBv&*{HNYpzp=pb9#{f9PvrUJBtwk z*cHigx-bOgpe~Ch9c=s}N8mR?w0BSxD#-bAW_p(}1$BG(>)cPIABmHf-?YHy>*B%8 z9p>phG+&M3UQdk15VB6vS8D;>;5rwZFppxsq;2%@wL=j$CsN;&y2(?>?DA%T}!6sI3}%+lEhiV@(# ziNKBiFy)pVEemqxplJ*FBJLiU%dd2E)blS1O&X46q7r0AI?y$mKaJPTL~I-vt6HS5 zVQx-EU%!+9@g=9AbEuW(r~U25q)Ct7qs%P~~$)Il?hyxcOLsh!VSdS>{(#_J9`eTMeAID^=4y#0^r@Hmbo z_B_naV&^QJq(vaJwlKfooqb&04Qrtt3a8t7tio5aGlvib_qJbf->RaLwqKtw>{`7> zhH*ZLr8=dtyt)Uh${8RueyU7|0YC}Ycn#Tv=u9FoAt#-`h>PD1t611IVdN~tD$=20 z@o#l<@*s_8w@CODe3GP01_@N^ipo)u3WRb+@k=%qHh{+sh`Emi~y3#cN+Gy zTE-O?jxgWH)&T1WrzFBN;2X}S5_JZkj_IPzp{!7R_2rjOf8HKchEkB z@7h-fdRdRKhG5A?^WnuQAskNItXA z>-Rp}H-)cV zx@b%NkK1Zk(Q?_h&nPK*rO!u((3>xD?$!2g+$HKxooy_b%g)FRv1>GEkR3{LbsIAf zo^pNwG4V#%sU$EW;(MYgi_TzwO8z|aFn|ga3=Rzarxq|vQQ(7x{>&LJP_eJq?~IHu zr6Ji6e4*RJ`>XWB^K0<}ZRi3-<$lwmyUW z`MpXmZ3^dmy;I@i;Ay`#FZJuC4JFWL0vFor%&n}RCUf{ z#1NCzdOk@lV?5vps(SBdUpdow+Rt&;4_w`}5@i}x!Y%uGdgndH?_E#v%8wG7N9F^s zU@EtQ4A+hfAgYX#e%g7d*gAi_)3yxT)Z3P~EoCcqCbb!m%`E(A%4hKA;qqOc?o4iH zY3B@w4rQHs^Tkbj2Wc}?eR-C78P3k3^Nfq6Mw>nZ*#l(zq}H$cvX9Y|tB!M8qZ~pG zMZZ?(Q@@{o*pOEofUT)KV9_vuBC!r;<>e*iZZ_}L^GE#M?3`1(c1}(%QFd#YyCU{O z+})w8BxUAWd@9ykqxgaboXUy-h2f(MQ9<ot2pbjkFdG||L(&%_wKrEb|WX!_4i{dfLHl6w`%?H~C+Wt@Y3-rAl>&oRD4 zU%U@FrLXC0NLY%&Wm$$Vs0^uO>X&<93c@EBU7Q;FYF16@Wi!>Ol5LDJ8*hqKv#Vxn z!n50D#H8s`U53P?MzbFl?zpB|f0Nh~zt~PDff{Ok$Y5ZeamGAwwo{Dppq(+A^LvV4-I!G=xTFBmxs#q>B6l#-f&h8ePj)~h_V}RYz%n4O<|zWe6fj)BwOzs z%#o4yIb7*U&5FC)zX`f1P?p5YJ95Os-pt1|D+A+D@zPLxD z(wmY&pf3v{tL_9JE)lp!{y~(LGQGWUxjeSov+sFR(PjEGm z&$G7V2%gc+)j#f5QOTlvkeNN$NAU%Lx2!sBst>46ttu|4uXK6;T0iP$RNq~pa4e-% zCyl_MMYqtsIt@~z|IQ*&8Wsd(=IC(Eng2ldd-DH>JNVY*hiYQa{K#(kWJ#@kFxyA?JTq=Sv|)C>U$JG%j7N6h+cE4#CQHFaq|KXxSE-_Y(>~op z76ntTnZ%}z+@|^47$V&8@S!FcY!GqaaH|}5qe_AT!x&a7)IBz zSRWaC8ja#wK!mkpdBy;A3qdr>y)yQPYo;2bo#Pf>nW~diM?||ko~!jWBIebkJkanZ z19BD}m!e^|EV@h4loVb6dCu5r(Y>ht0p)k;WJVS3QeO1s*RRl9%sE%ggoFl4>7Du( z`WLS~Z@FXzy^*P@d(oWz?}Up~rXjP?xUsiroy_6Vz-&UGuE)1ui^=GS!}duySNXSZ!dP z0}Ba5p8z!Ox$KhS*RM@IZRoRwxl(?$kFE<+ZIYKtneA{&Qc+VGi8WH*tDU#eb8a`t zZwglNkCox&ey{Ga(x&2KKUA@^6@@A?EdX^lR8B#Zzvj*WzW14$n{pj`RuLFDHfGP% zr0S>bq&mdqhCOH+U`W!V*0-e*7zM_G^zC#*--gul!poIfifmZkDc<8ynFDWQ^$`b~ z&N?Z_>j_hB?WoBLDP2LO684x0>=v9BF4|7&XR`x9)F=T(DhRm(EmMcrV$Yvjy1A9- zMZ)7`))uNNZznc&86_NAv^M5oYg|J4M1{$w)kzRK! z$rBQ^PqslxbHcwGWS_nf9i$$h57@|JL$4PqjjOB^HXY&@8Y zCGe+YMk%0zxB2YK7-)e*hPBmc#oZpz^QOX{jArfSY7u<{a@UWwm0HejRGTZSEvDjK z`g)bkYnx`V_iI_Qb}+)RU$@g8v|LOSXHU3oC=h`z-F=#PH%rlBA||J$MrZ@6-zn2O zFc64dq9E;YKnDyZgz>mhGO3XrT~5e8g8InV>|F*&mNuZBojUh-R3i0?}h=`w=BEfSXbU4Tj#1-@hK6u{E;f1 zY=k6r>9`0lWI6W8y0pP3BeDR;EidoBBzahwr5w(gF}9sewQuMPJ0DhGgleyq2K(vn zL_1Z(gOBjF^J2e`h-GG&l+H!}1Y__Q^Q{f4I%K{+21Tk^h|Qxawx}OihVyjRiZ!4u zQRu$9yEr`Z8Mu5h*lQY%Qt$Gx874f1xL4Dcg4sYNbYo^}bPYc@7HL<<#>bn+xvXN( zi?WW>1AJA~6x`8+`l-6O*>)VYcIu(#UdX)(Lt}G*IhN&`NV&eso3i#%6dPw2&Xf*Z zt}?3Rf8moloQ?r|XClMrHAWv+9Ez54&F%LeF-#QjX0!-Jn|P>U&#paCt-fl7PGyW& ze`s9g$Q)yQbz&i_Gv>96f#VaZhS#yXQ~MeO**G|K+<_=&HZK{R_tvvuvf%e)n;cvf z9F$OXeS;S~3YpH3op0(Ikz^-fdNfg@0h9~BY(;DBGW01skflMuMx|%;hD|RKbzX_p zKiSk+xqHgY1(IZ{)`DcsI)KXF!S9>hi_E>!okX1{_TOh7ru;&MN5!_7TR5fCo0VT^ z6`Xfa_BuNR)3B>GANQ~5tx*QGag4EazvvVE(NSHW@B&Rgb_bb?9TlAgZ^6c+W zjSlhfaqH{Df;J;5YYYo0c?JZtn#>DW0?Ze|raLzYOQ#vLT1QdzgV7F?wQH2TNp#40 zog^ns&X-k(o@CrKxwoky{>{H+>_F@)vfF+cB9q6O!+~0LyXmYJGrRq!`aeKUL6_;Q zDg$FF1H4zGWXud9#}~X~`UsO#=w)g|&Uq_!@WB=EahjQ7(&EfTFIkJB&fK%)hC>;)iUN`>!%oT6B#xm6Jyi|1U-1FvgOSan89U2 zhIVR7i=)Fw6(e_tuo_G8u4l`o+`MJZRn@4E(9J*35(Mvu*sO?-q+paXg~%r+(ijO0=j7wJ^| z)tdr)EBZ&@i85(04(VER-5b?odnF;`;0Lovz*k@1`Dp11xi>rI89k->5l}uG%I7( z(Nx$2Ph<%-<`-R%V8tu=fn*4R#gseCXIvBPgV1Z)+rcZvNcz`KSvysctXjv-Iv%mL zVR779=XO%oH>QQ8X#deK;lopj^ zp&X;|oP%$!`Qh3ugAhRRv&=0;Bhgdr!aiffmO?Bx&!lwJ;dLLKm4c!LIb6N9mi}D3 z*a2*mloU^Tfw;ate-K3LwRx z55y#dy1QB1e&+ zrI!urVc!G9&_cYc&3lsNvA@UdMg6OLhd|_}kak|po2ckT2SNdBgx%eY>9OHqLnGrc zYLjv06!A5g`cG}T*n$+aU0b$}Y;B>Ck0XVY zD+5u(TSP~xb7Xed%2WXJJ^6E2Y^naaY_rocC$9^9uzyGeLysSV>>G;4aVoxDQmuXhp`{5D8 z3o*`@iLSX61^+B39Y^b@z{!D3kxT>b%T*_pa44vGmg85!v9ddhL_ldnpGbdTw*U{z z&;Qf{bknAi5+mFtGq|O z*wmQ!tloXhp2rU>?JRceIl?4?1-SFk6FqwLXlJx8iJ$L<)<2TIbaQxO9w;Ck-wmvSoCIWSNbaA^l@3yn3k*58re}I=E zeZ6;j5{z8`du;6>~+rWfBj;Q`$_8|Nu0ftB!~PbFUi(Z z>$8G8ckUGAqSA5#D?}M$T252Sf8d*)HMOq%Y)yXxUSUIZ*1PcgXkQ?R9$nQyimfew z8dxqRR#(EIr**S}6j73)Ntd(qcW?>>u}1=)c|+qnhSSMdv-@Hu58oA)O5%amtDn|hpZxUkl_cN~890jXli5>R8IfSjX&vE!j zF+oSWkn2HiUp%bXFpesY?x#C3ov)kC?q2C-mlw`RT!EL}|8FV}m$)I{C<2!@|CAxkPgA zLfvd&&sbwpksm6;beAaO{iP;VG*uP0Yi-nf@@HBL(fwmb1*UOvkYpE9nE@kj>{to zWH9#b+DwH_4LiS%?5*Fy_19r&a{o=-nGyD=txrLrl39bS(q0||KOF8cFgO7 za&fL{nd`IguP3~Lai&r|k~wJ@TyYhlImN0sksWM$V=NPDdq8#Qd>Dr#BD> z9eQDghb|P{Cb;+JWkpf$^=)mNzeR7|7xQo0W!Wz+M<<+w9zAY?6=OA}syZme$a}M<+vziD67mxgpgYB` zK25f}adrHKtv}%m2-&M@?>9ByA~U5VHHGLCwJU_$UQKHmShu_rDIuk}7jf##19jU* zYjNGAundoyRM#CH;MF{%yz8popD^OOm&ZLxQ*#4fJKDMCm)$R#k9!+Jyx$QThI}$o z5q4vq*+pYBepR+t8bi2MK|5)Sj?PTEFdp0?Y|4h9PG`@v$8G1y(I4l>tkC$eSG(Es z!NNvm6gR9rq_dea&J#W(4IbQGSX5meV)Y~W_8tUsTL|x1Y}&EE9{oJzD|s3AhG;95 zOGp9i+!goHQ5+bZb+D4q!HG%TndCD5&M?agT+zH9phow6MuVbn1!UQUH;}Nkv6R+* zW^Kkqxk7{Uv`Xt8P&z|R?)I$z*=mWY{M{vKi;vI(s1!KJES zRk9PPQoo*%eT#4QCyS5$Ic6`U1^dv#d~`rtWR&)%)0eNOLBJ-Nq+=~DN*p41v)%>T z-n|&@76NF6RsC=k9;!VqR_EzUKJIp|&_Cuzp9{`-+Si)_W5+ipsW;&2t4 zNwWy!pgWhkm?usefgc?|rom7L;ROb&kyn#fTsxnKZYM4dnrLKC)Ss2mxF;}<4U4ew zc`XV#topb@_KrJdn}Z_yy+Mnhcu^o8opY0F^&Vx;XwA!)uBxbSIm@wohE1ar4RPBN z>9!A})lh-em%o~k*WAQ*7ctXgLvc;wLTAVGhL%5f51H5FjTetwg0WBPPOJl*>bq+I zSfXY8@mb;}BYnfcRn2+bF%5t3F(5I!1AZ{0}RbPD21?4 z@430bym_<3mKMptoVM3(*Tr)a`oozHflSQk^;4$nndJ%8{=q0J7G<@f^t%KX4;|WM zEg3TGTR+>>^gTr;o&&M&5h*05Ntbt!!^0zOL9yMmpX@j_lYJ}XI}wWa_8oWQbDRfX zXHtXqoCJlcVT`~B)V`;RQUbE5=Qnta(A=%}n*7-GB^VoE;6W?YAOVYHMHdTpEJg&Bd`HFGseXHNdp&_Q-3LKyEJ<|-*uY5BfUPQiTSDT}eQsTVMDhhJX zVOiQ{{b8kTH6hH9@LUtPpYv+kGt!Nw1n@y=&bOgvzNuhGfD$7uP2ly%cWtf7+i4=G zrn9*MdJugRoawtZh*d6XcK0dyfL1R)C2ea88WZ)=PYNba@YY$nS5p*pIu^cl53qOB z?H#G~7Sb}bCLL$s>8ZK!XAGa1I5trm0vY$IQ)2vOO{DEt4cC{v1Oxz@#A_gn2Th7x z>$bZWa=j<(56}xgyDzPT^H002GplcgnM2>)3t4z#cW*!0OuFy(VscXCrVNHn(mF}- z+U~NHJjQ73#RX#N@YmBR#neGThJb+Rz96)y>m#%QY3Z|%l5Mhv#h_G5r_>%*4wr;dOt^i_0A?;F4AA#bOoN-@h$Oqw5{<0 z4i2%llKgAk9QFph==i?c&&{Z*y@_Dc45f(#6KmH483U{ue-`+$h>A(}mNqo*+u2yg z_KMhW12nG!X5r;iGmcU25R+Cf5Qk29`}8fhU4bBi823 z-<+*A{+V#P`i#8oI2as6PB80)&Uv2i8PV{s7Ck~ZSwPx(-a^LRS5`H+jeO-ZM#xlZ z0-Kux_HvgznkB8@1Lw+Trx+-y5~(*if=)GL5w!lx?~FTRkQf!@bi>8Vmt??Cjupnn z7nc%>87qD*(CJA=IYEJzqu`J2){>49aY!4_oP;R&*R#^7E1L10vs}?l$LfJvr{S3J zJ;gcgb^N|GQZA{Kc{+QHxn_5F|Pu00&8b&aovjY7H*GA7@JF}yRLgX?jG#HnnaT{~K(RrSI&a=;X&OYZk|D5liwdQ@+yzBke z`>pr;*6&^G{iTUYm;o|Xr(!&|$<3I?!6ZCT4g_nP!Buz@>veOYocW=*$A4oFL@e&l z-$he1=QPaJN-X!oCp7&^&t6yr)#@SJj4cQR@u;kq{ZoUlbnmFqwr+Bc@~4Ee$MC-u zeMa4B#x1z#dE3*^#|1fRHXJX>(g_&N9`$99u!JS_77Jgcn1#8AJ!5VT=eb(Dvpfv1 zZ?gQ$wM(~kJy(jdqgUUEKOx3l5LZ}Qd$a3GZV{2!Vwy$9tSnAG%%vE<;RNHRobfhH z=IzwtU^QDWx#1e>uQCgsiYq}`R-Z<@e{e=}>e8!moO+DrP(AU!Lx}ZMpSyslU|;t9DJI1 zq+&&g!Lm{z-FejVH1Tx`esa>|qOCoPGV$?x*~rjJ66S*LDXDy_M!@jGyQ#N}te*!X zii>5Xe!<7R>|Om{qQ?-1{1CcdOd7MOXu7oCuibJ<>*3;9#PL4;xc)cSz2omsHJ%6) z7ja7E_}FtFk9b7#{2VAwJM#{hy8BbwS@`-QN~{W55qx*uC7PO+e*n5_>E_mU%k*Y9 z&9+XSxvIU^MIaE`I|9&X^e2!T^~6m-UvEC6{ex*e{%ydIx)-=6QPZrrwJx)0lw+q> zpUd;wTkx^0z|zrB=hMD%LoSrWwT_yunk1{hbEs zfj~TTQG9tzz7dmh;1xmaUJ{+dE{B!88t}o)($YO=Z_#kxqn-K3r{L#Im0hJPI@3Uj zL-^VF*C|s+=wQI~X#yatu&nk=t#JE*6N|#zZ}?nqL6#LYy%M{c>>CS04%5gE5+aD6 zB~!n2`Hw7t*I6Ny^56K#{)mTB0U}TowXh&6Tbprio+d05>)U48+6;p^Zx!R$4}bx{ z!0>IqO3?J}XR59D`d=%OMIRCVaAJGB5tP0a|MzuLr6BmA&+^>x&<;N8G|zo zO-;e4ZxYrLT}q7f4^hiH`M1ag5wXo(TcDC{3JP7lSa*@xeo_O{zSFo$54AruPiQTo zjAXxOt~YFwiYV1_J;11Gn4IE;C$m%VCi|*?!%-&El}Z=L{vv%$rJlykTKkohyvwQn zRX37mPCU(G|6T^~L!xE#SeTfF*qTG0r4xkv>@9L z;9dyF48ITQ)>7IDy6v-jV94H^GmXm`6onf5B7PcFU4cCSU*lKT*J^v!$O%Erf@U-6 z%sns!;)HLF++9gAsIkXp^gCd9s|L0k^bY)l{tf!|r!eY&@Z^7ma{rGtq>)IH8zZsN zy6jNwy%Uhkcj>$MfadQ- zmJXspspI`V18haem=vip9M2oPLMO-Gvpjd*Czu+y+`YFiWs1k`p~J7x)MpPqDs8ZF zbhzxgdAp7#CVv9Wj{3%#1FnwTSEF@*tjWw`c~@s2Du zhGu3st_f8}+8=eLOb@Ib4G&E?7tDSxcVpDrfvaufJE?bbpK@4T*_iHUExxhL0=@AV zf@yloqPld4eJ(EAC&(pmY%?);SH*PLgM^NPN@e$RR&Cw9FU{S=ks-|xOeax*Atj0& zjojfTgX4)TZ?J#OIqhCm@={27^0oaJcNqu!I+#q zC+%ZT_eQ+#=|;w<_rRl7gN76;ccf*?>CXD;v?p}el$3t;It41XEQM;8ZBTAOBc$)2 zh~1d@IPpl+zrrOE+w93O^*G+3y>fnS*8HG9Ytm$9P8>G$x{l2$nAOk2<;e}iyzs4G zCac$vy+>*a@1_^dl$+Xezx7W1U(etW-{&Ye?Z%dkln>M=|9_eL$=!>H)UdR2hZFhU zAXFwpCeGz2Yw-*1cy3Qd%$>`Pd^uWw8-bzX5&O6tVSbElKE&_*01`P(lR*wDIIF`uz(c&C6T&Ya9)|wMqC9|Fk$h7n`Nw>qtjSp%2_q1K-SdT(SsOvIzo1O>_XTAit%msxp#7ql8gXOIT<`$;VxOG3;#!>K{dlq}L) ze|}M1nHTu6M-^y5pv-I6jj!539?C$#QV^(721I<-ZW0pEUA38{|9jk!3AMGizX#Y8 zLPthSAcMNmDia{POa#hARbPrLJ|=em3L=|>%s|c21~^5oym)xmg(fj5(@IpZ{3vfS zJ_H>^x_OI$u0B0&MEmkobF>U2k|f;*0-fBln)JXGXiE8O9rN+i4U@8rge0(qI7U)} zo;hx5L(m6#w4gw#Y{)Jb{#^L9?JmeYlkJ)_CM_B%{mk7bbqLF?dK*0x4kD1jy)43& zXpZrY0AHAGoyHYzAq4_|m240md^g!Tj-a}$kh8e9)YJXol9z`;RPxnz*5GEBM7%x0 zW{Tg*6C5GPnX$p>(<@?P;udDo)+#Hqu=kfpahtcs=3yJAFBXj$(dXeNA6;jhrqZgr z9dsTU-3u%&2r&Hy1D=A^*2vo86B!wqqa<}8dC}bvQPwVUzrv2#Nlq#wiQ~Ch?LF7V z#%&Z_OppzGG)6eg?kjZ-G`yH^VVuRwcYgW~#C$i7jt8%8SEgm#EGTjE$+2Hj&8Pas zR2XM~^N$K8GRihWFN;WV)JZxtha`_Qv&;I<2f%M2?J}pdbSJ*+!mlGQhc?QZwU{e? zJ1KK$Px3@`bLKG8_q6o6N~qEWz~c=hpW?s0ops|i8qnO3Td?qzc6gO3<{<6LW24PB zYtI8#Yj+b2eyVN-567IIS`KxPL+=&)%Tv-xJrv3kLwy1@_IQxI2>PMgWlRDB?Ww%#%4Yx!dyyCQfRdQWnpkgO2Rj$7U41B)U0!CHInMMaA7&9GxBDOLJs1W zCSXDvNa9~g29m-5r1^*zBqy^pAZxYV7aCN&FDy2!^HR#F1)Y0gG%wtDDr!V;8&2V; z51E*k(AKX(8Am-?>TXhs>JVQ>vN;*)`YB&+M$n%K6_P()xltEQ=(beXviv$|$(-Mx znZ8NiFpT%?0`E}zjSn8G-MjTB^6&?0-(E7Sj>kB!_08HDQq7Nyqo*OOeVWilX$x;I z(G%qQ^{Crtn#}X{E*O~(HxkErCFYjBotcAi;BmZdO3ao57xC7+WH~<={fyA2PU4K= zbZRFetY%}|5GM(0A+}dO{+RSClFo=r`MG!55??%OHX^kz%n<|9O{E{S=&fF*r!H-c znr;T~4&Crv^sk$E!7^;^y>{`(%LhZU<7wvOyy88oB_M{q0a0kSsI_Tt6P6!5d?f1 zi*6gQ307%TyumG~aJ|!(zcI@;RXO~w!5#EzMHE)FZj+W$=+UxOt)S7?z)m#(jRO&C zP$0p_$l+GwiD}vL(hZmy-1{Xx?b|nCFNIYpCWDjtJ9z39@mYr-(|10WNj+{zPIT(|&$46|SH?wEibQG@yqQ8gA3PaQ$f_&3F)DCy-rGb?PYkyUl-VH%{XlN|%DoY&UmBFQb)J&r35(JzQZP=83oskuUjW_+QZs9+3gN z_wXB}Mb*^T9uZFXp)rt0@}z5s$ooiN(fzrPeM7VJbx+zU7vEeN0~%KKaG~VttI@Ob z()?;bJ@a&UF^Qkc+5VvLfe_35iC)HYjRwB+@p$Qz-KWDMrHtCN!p2q8VEY zO5v-}3X*|O&SODEZ_Y=deQT@b?exTV?!?hOEUH0V9%xOBNrEYU#qktOxJvs_659@fCAg*x&w-SvG>JkmGZIda|VS0%i9oH?)*Yy-2dS}W- zArrM=V|-K7HH&>FCdPBG__yRbbNMsaf~%20n+jf>ttnBF`sx_wC~`2DgfXG(IvhX0v^5hWVs~cy z(j-~FpRs6;ZA<>J1{${DdKzr@foo-|)#=97P%`l0N7TkoOmutYG`s`(KWyRse|oq~ zAT|oxzi*lRrlUJDO6cQF6#npv7KfIRgDjViJ6rgkX#ZY(3Om>{NPKVhFn;zp__M^N zdG|`G9A~QS051#t%zO97676%{24y67-=QvraulQ6zD-?7eCHD zzOri6Ogs25jL2l!OukhX=t&W|IvjVyG-Y4Dio$uaO{@Fhc2j}73`tC zN@sQ${;p%@B40SYpw`LP2W^*?p6+q^_{U}LYDKr4S1Iv%>mfW)ey;NUnU8g47qfYF zQg^|71y9TZ1mqg14?2Q!1icWXnX$_&Y)lg8KQ@CqJLUJ9qEuDEXF%7!?_a(Q`epo` zYQ_r`q%_n*3isJt^WsotX*d^D4N{DsZ$3RK?Ni|FAXi+gb5g)iKm13CRVKaO^Ut+W z-oMMPLSb;N*mrL;9x>wwbJR0gn>emn7Uq+vd2Ao-dRi9K+T?~cy1KI!G!aWs|8n+L znLQQQeiN%2mHfw7!v>2!({;p?Ufm%!o=0$ATUeKqV1@)F9cLC{RwLpFH_0SMrYtybsX|@Mg$z|bZNQF zr-q+Sg@fz59U!aKUE0bFE|&OQqjZOc(6hK>HG_2A#g8^WPq5k}UoEh5I$a#0(<@DrHF78TOig#+a5jY956gc|1Oytfc>&bUndpdFw4sS0p0c3rmQhq zeLW@8zV4eL4Fr!v4II_M&IT1MfOBy(X|X^ZdIMxgw+W@07qR&o11TH7M4jnLH}L#% z?Hd32W4SMzr2RxRnxFsUWUNTD;b~tivN@MJMA-<7m3wnDmX!!{_zhLGqczpe9=)tP zGBU)bq?$s>$YZ~j0%xxi$SVHodzxFMZfkS(vVjqH`UbZuzRU}X%=wh;(JGU^cbv2mSf*?6-EY>$zi^?~y{w3!^M^Z3A>%};jb&j^h6b4O z`fp`4Y&QwYjj;pU57YL~hd`+$|7?pR%!QWk>_@?w)w&h&k1jBerp2bi$&X_Ep4})G zPsSvUr^ah97LR^2Vig%*eP6^W;t=^&aB1;_MdUHOA~(V%d>mH_K@ zGST;fYZl3nwMWo~Sh6+f+`EKoVFn8<#rYt0U2?$h>KhMupc3xcXT!PdR^XRAe`rVX+ z7PlFu0onuQ54HdNz^p>O0$gi#Klirzv{%SX#dIth++*bEr9dWNjUa-LO$Q$pFhwM3 zx|kzAs>b()mqBrxt$t0nq3bbbK*kexi!YPnhm`z-UCoHdkOvSexM2IH_i#C01d*r_ zYPE5je{vqPW>+Kq-f~h}d=7<-xqwp}q84>g8gL8>;&I$0ARXXp)@3H^rf@#UImvGbXV>9y? zc^x0s@RsJ6XJ~O0T1IbVq~VzIDgXW-F2KqE zY{65nMU0-$Z@r(=rDRjJ3|5e!CoKkEs!&K!NqXit*(H8E-rrD?-^RcHx{DS>o>IVJ z?uHHnu72%H`_eIML=2l7>TC}iZ@bZhqo%-tdp~r==87Ia4A!`hGpdr~j?JJlgGoBQ z_}$(r&_%@K=yzAx@@N0Y9Bfp8Yo+XsoxKJ^R(9DQI9o}t;?hY2sRtFCN>Uu<`4_!) z7G3pf9C^*{0M`KYZz~$5G)gLN*i-WGWbwYIh0?Q^Wh4`bpQo{cMqttFEc{f8G-$rRUCiLOX8(TPVECR7;I3)G$3De!o6NgD=8a<~Tkp2A?7UrMaOX4~= zH7->p*6^QaedTp-PY@nVU~rM!E@lNvK99&gzBDgAi%1Y;y)7v<0ydK>Rjb)uBi~1# z!EQoSAD_#G&<9_)ZhOZVzFf;7WtT>lkf@SakS((K9DH;n>87wC+IO-cxZpv?EDeOB z!G~uNZfLle=9=$zpDV(n#Eh+*>OB~fohz)UnhFYy_I5~8$5ex z@}iu~yG!?kgyzwH_bsY@e)c283O{BXi|1d){|hwk}q^z+LFuS!NKG>I~UuMfVp`O3p4x`-A- zn`0FEE&9hDvsYV5uhDl~d@)tIq`_gmgS?E=JddBfN}~n>8q*^na=znHEV~@xhYju9 zy|b-C?7(4)-=uhX5AiD1v!>d1cx*}Ii#qzVv$By>O<(cZuu{B%N%rhq=a2+97B~G- zI(5m8x1|9uW9H(sGWXok@(UtJ%ul=cn2~{-LI9BLFpdyfKT4&J$m5-dlUmbh+pixRogsWT<@a}c{|eR zbg&f!$DpmK_Mx7r>aWQZa*vf~@o>1knRd5NM1LVVX@u8pX;ok*ogfD-n4yVVn$+S-|0SB{(ZqpGLQL&YI~So z#!CxX8i6fg9dTYHVGPU~pH$~ryv8MSBu*r~o5sp0sZ5b^HDhAfX+h;L!v~T!6AiR?b|x;>{3dm5q_aB z<(z*?sjuC~`T533Vf%J?dABt}sMTU^%_CMm{99tG2mO8OD}S7ke!Cz_K;kxuQ-^TBe~d+k~sNuI76lVnSYMg z=k+seUk$v=BTct?c+w4U!>9*?-BkRyX zRB6*Zo=|QmlAg6a=Oq&9%y=ehe1;2Xdg?z{ofPl28fqkrQ;6m7@xsw99lIVJC~U0j;o^ z?yEqu&mU)EjqYDeNx5jXgQdOySzb}6;<%=qxJ zfNW2sHV1|e*SqXHTJ4;CAw3(9l-hMWf4QhD%>CRXVJlmp%Zk?w8L&AU4ZUA>pWi~a z*!A#OK_R}-d#xZ!MMWp&`@z9t)bq2E>B8?Wf|hb*RMafH@BP#{51*TAj3N@|o?kY6 zeVakObh%wvnBXJ++@@z<)8aR3C8(?6F2Iqdo8GgQk!DD2hU_61nlud`g`444OfRxS zL}oZ0_X1Fzs^gT^_~V(pg#zv}q4t3r{^zh(EE_|wBBPl7Nr8b7oU5>o1U-OD(dRUF zeP?z^J*0;p5f=%yV`!ryWVuXP9KeZCOnjZ~9igqeIA5@&M$AM>p_Sy1yU%~}jkv+4 zj*SAuoO6A<&)*!=na_A2Od~T^I|RHrw#CF8goihh3`P z!-Tn~8o_WZ-$=Z;C#(Vcn_7CsplV~T&RT1fPEBnctumxZJt0e#yI5yE2(EhcO0LIm zJ&Nb6)HBHFy__^V2bX9!^kr;foO9Zr-3TMFJ$9*(UwuE7NxXLm;)yD)OHU+8y!7;2 zP@pX&Y_nRBwpu85HuAZFj}Oqtc4z)RiafqIkp2!oau&PK0*XV59oSglzVlOUC^M=J z;eaG^n71v7-;4;v+uo%r=6&#Tgghc5V#bSwMaqv5lqqd%ZOum)cZa7M2_mL%l(}}5 z1i60%kzKXJM1*`-tqkpr)~gm|@DJ$!{~K6bn$U7jI*9(Ja3EhzBdtKH(McYPdH7)> zk*1>{&Qj_Cam?eO5A~7-9lTgmZ@ZqtiFc_0GD7yt!3si<#8w+f;&h=PTj6#(*va`9 zOHqwz_CA0bgnaYiUvY<|E((yUOU*FQ@W=0oWjCu21f1M~haIkf?GQ?Ote^il3b^An z;Njs7J6XtuI$dmL)kC&Lq!(o{e^bVjEU6-pDwJOG#J6XwaO&ovTL^MyZI=kV@*66J zIqcK07^6LcEVJ!=+FeMP^ndYken-aHH8QyOF_~TnuV!vtwr|;@J7hL-TMNOL% zH2N5c@1nKT=aQy-;4bC<>k!3=A4kNU>$)aQOUDj7#Fx)g7!1BlN z;G&W|L|JjsUrR*_d!XdveQk^O>au$oilde7SXd%`W0z2J@8gNhv5Gx-KQSk4@?zzp zqVmA6;(W--tBmyIAlZ(BNw-KP!$xNbjO%HkU`avsa>iPvm|uVmuDSx9lqQxDz+5^i zQJQ^*4{{;M2BcC_{BsF0NO65R7LSd}l`U^9p7`g(fCPMZuO}qoZouE_OA2h85L{e- zf*DR~2#{odq5r&QND@aJ;4z)`bYz7YY>~0mPtSk6Wc7CiL0~WPgON4?f-V(0?m_4b zQg~It=UZJIGBDU^Qm9&l@67?Q8TDTsEqUk zYXcL`=Y1!T0Q|-v#>(e1 z`nqF=n;~ zW)7yP*oeppruYTnC-T9ftZ|mAG%4?6BF1S@r22lmFDxJguI%q)KvjtQvDhN1Lcjix=%_K3=kv+V&Rw)Ha` zrk)+sR2@zDA8_n6HAFrxtc~3$WJb=ZS!(h30XPc=-D$WkL2fBO9&;yQ9k5XCA_}j(y$xy~@58;-aQz zxmB^ARlYS!RW^Of+XvcvB^JEhoYi^B_p!<8R4r0t6C$(x!_R{l^TF5A(IMcZ z1O+m$JpygY0LBAu7*JHyU|QAqG-YQX8&Hfe4b(LM}O6$jPwXC!E?c5JQ%Z;=XbU{-QtJZ8p{hf zZ&Mo4)C>{nfA8?zUUx=>{`{0}V<-i`x-)P1m+^MiJM{%+NcbG#P>ay?^b*N9DkD4w zL3Q`;D^&C4D(`LWLprj$O%LPkyTc{~b{5=xP3Ie4F^sPo8X?c3puzzo@sGkrt58Eox` zLMgY-ikbeU{l4m{-`Rsit9L^jO4D7qS89_jQ*Bd_lLA+dmx(-aB>FH3VN*&vfZ~%^ zq>iO8%~lM&=4*_95sr{Y!33QAH4hgM9mi~gWKpRb#n+|9ef%eu>M{__;ZaoZBq7C} z)Qeqn`Y=r=D81D2QZ8(4B~eA{#{e_@WcUZNz^+<9*CrcT7QyN1{(HeLMHF@lk%Ze% za&35;PvX9C;u?jWQqhv7G*^=r2t$MsObre33IY>;iHsnng*iicSzze(S|Pj1ZlYIg zfrb)iPJ{ddAFOlcg!c|*-5l0W)AOGZrT zLlibT$enDD(G~*BwOi97i7EFF>wGx0J?q%ZuLVu3H}Pl~O`XPVYL?wEEnuIm(LMQ` zv0!4ccpLr@uxZ%n#1sTsjfUU4#c(E#KMtEz#SP(CBkA}}rz_X8V)cWJ8zMwcF$>Fu zhq3Y3xngtuHXY>Y^L17hdF`VX=*$nxWt8cXH zIDJgGxuFHGdIqbk6u8`1dHhF;9bJ2{+Mk)(Ete`*5qx*ohymyM&iVTaryZ0|QVuwV zcFN$;)1Uxve&g51dZgzh*ZsXFQhdUg?}D6DPqaXnvv6g&@9B1}!|aUipHoBtaJXYQ`@_QXo! z*@Q#b$BYW!t<~@9;+JdQ78j$knoI^QMZ1Rw6p;JRj(c)_czHve18#sevlxYhR!o=i zo&(ap{jCDHT>L@a*gnik=~Wz1|M{s+==`dksV{*Wb$B>kZ8OH{@Ld&+!AKo-8$~b( z>AI&1+?#YBaYsA#<;CxOW=j9g7ABZgq^FY`Zn9>-@j2xEQI!)1Q*r!K_5JZV?1jK- zZHEd{@CFU0B`-ncrl<#>*;p1+-V0V<57pKgj}k|NuTi#7Of6K-S{^)HU9cA&Yq?$Q znd3Mz_MwP6bq$qEGoCEOo#LQ-&Yon#~sRLZ2UvoKJn$OqPy!LEzY>rSb7a0e2ap z=Aw}E2%{D*&>!Kg_}PEx$)rLkSk6!=r+|ve%E}=rY`-zz4P^Jlv>{@N19gGL#2(ML zIfsR0tPA`7ffZP$I>0D~q!(R18JjkJurdLsZyWo+m2qf}ga_pnvKU#=qzcSsL9m zDToRMOW)S=dnH}7vpK5O6@Q<%dgW;Oe)0RpH${CMU8kdJ$GKbdOvMkql-PNT2=qih z`+a`CHYbX9K5{|847y82IX;QmQi6yRI)j6?jnIfL=moY%&=S9g$9Cb-QFx@5L&>`_ zB$c$k@3MiqIR-b;C!H8}6I8G4`ve4)4!9(dKL5BW{&wlKf3~kXNhZpB%`utEXv}pv zmPA$Z(z}w&vazGH7mQzin$>&vurQ@--|^C2FwZb`-*2e%H-AVr?gucmn&sN#|o=LW?2WrCDDwUTvWxwF}JDsBS9-Ly<{zC|2<^?zZV7P%(jYQo zfQ8tnKc~fC4!PdmqLsmqG@%IguMNQp$ad|;nm>Nb31l|aIzq}?(SR!t;;i}aX`yw> zNYV?rr1uBZ)qlU_h=T7eZ0FXgY6L%vP@ZT`Us;QP=&ye~QmYk3n&>xgl1aAJ?yX&V z+0Q%AIC?m$E+3+i;XQkt?DKX%ZBlgZ@YK5*6e#<)uT|mJ*}N#fn*1X5;!w;MYU&5Y z8#o9PWLN+~<=n=|UE6$|L&u3ndDj&A7JR@AZnLp$_J8QZjUI-@o4P8*>&MT06kQ#+ zla=iyA$Ys7?HEPHT{Jeveoi<{lKjzV2uHyZWHK|4>JDLx^gr3bqrF7cL9Khje>ht~ zzHtHG6m)+KlDa zMQI1mH5IN9>_(uTCH@s?p8^4^WmO1dGiuG$(4*#O>PHOzKy=|_N{ct-@64jfC zk{?<~-^MNaQ?7Zex>eu6WjdeUX8-YaSNom1rAg)Lf=w}GcCUXgjoVOj*;lU$Y&8lbQDCvSNV z9Irg26rkL*y{#@y%?tDGJq=ev=wLrrtwBQrT>Mmo>3&vk&TT4YQ}8VF`~!qi@WB59 zgoDoR)L-ncjO9Tkd$@Cd_V29^E=qClmtF@AhczKDZDoH!kWR_dj~Eyjs=3b&Jqb=C z2&8WS6=&dQ;lE+e0wMcra(DD`K%NxH{NG?`8CqLAJAkCP76OM$Um?loK>kT8By=TS zxTXN$H@ga_ke$;lpLX_Esz5x<*UJC^jZ+tSZ8I;_2N7gPxZd;3vT)j}E+Q$k z7FyJ=Wtf2bT1ar@eMw)Xcki5KWC8(^VKw0+duW;?>S09iV z5*c^;cmC<*ybt_2d~E^sFRAnYocP2%12L}SMy-xs1?AgH9O~m1g8n64V9Squ=jmSd zgM;}*4__ujIwrCsw6BrH3dWH~rQ0QW*8u|qmY_~OiM$(zs8lgzj1SvY8F;}3{m-E~ z0mq4uu`F`VT5KdA{b%co-u>W`A(6idE|9MpuXbSGf*BnvgX)D{TaNA>F?s!&g>t>G z6#e8DiE{4(pJR1#--g=1-h&qWYmDJUAN8LU-3P&6hXaEbc|247${!$Sx7+EUYklO) zt}nlAHm|`J`<{`Fnm|6*CN z`Rmy&#uM53vVdGEj1Df~Qt9tJ5H}g_5;`QI6ckLiVe9&TH`#l*9_U*dxAJnH!R zM(WtjKQHpma!_ZH2)UWS1*Cq=%g{=`EyXv4(u&bQXx1!w-05#7y0_DE>%a@V|Gv}T z@j2G8ZDFymOX|%SIpWrK02&psOaNueID4bZ9*HYns-ur^OTf0z=Y^BDpp1hO9ayk0 z=EUcn;grm-W$*6`=c`9ph@Se)w&Tjs^Fk_8&n^zGLHooR+fAX-M6)fXwy)+S3c3Dp{lnQ|?qK3l`%A~DwfvPGMK zdFuv3)97mkstN;E=rCY8#~swHll<9bz(J4f^1kYCiE9S0c5RYY5 zHA!4sN-{yGtX*a4xQ*fhhNbH2$Fk9zf0?{v7clvb^;N&?2)nC?&NHo9r)I8pXA2ML zflGu1+{xLoPIi5R^%40DWfaf4#^BWmeg4`vEp9;-2LSH=@_ssgW&z z%NQqH4!dXCVAB4*Q_*Q0eAc0XTafecr-uHDRPN?;7W zsRkQp6FmC*DiYbkaz4+=K(D}{b^mS7f4G3F=f>0-G86gkR!Nzew`-F8iV4jq<8=-2 z)oaU%hee~%N*6=HL$9<8BCfN`)>Uj*)?dhueQA<>%}yjPQ2xN$d(1!iWBe>H?p3a% zku34wT<@}oR^g-8=j1pfH4W6Mc?pY~heZ`@hU7KQZbYYVw?V&h8VQFQx7`>KRd@3r z(+8&}V#660KDg;7&*9!&^)64m%kgqm1e}&C9PTdVhPNAZNT(6`OG0N#@2uTAsPJOQ zdxDueO_QCoZ`S9Qmt1wj2V+v{rLqYbc#UYXX|R!ZBM?&7&$+}D=!wL}kRi!4kGiaf zLZK7Lrk7i>{)uNwnk%r5w_naaSelKJNNqnIu9TWfLdmXB7-Y+MHP>`DcaSe?YSV7Z z{kG5y{^#_YV&WG!y5xDw_#F6=FF(xCAPsa-Yps%0>dO47iddT`Ev%^fSUbMACy zjX|{VP=^yY&yzQf1xpCjGjBt%9u6SWQTveMQZxs%HVVB@68XuEah4F1)1kAz_Rz^9 zIN=eM;Ar;e&5z@psRq_#mF~R7Nl7sN0gdmmBhVvJzzE{vh1;#8Tb)DW^-m3L&YyKy z9l5jUBuPeRul9rnMNpdtHsFPz(V7u*v)B2`AIqn{>S5NVo-iHU!zT-zCiky~O8hO5 z_`YVj{)aWf51PNoNzA+^)w+^Kkv3oW@ngq(TPk*SbvamGM!Oooc-O#2CLQRf#cPtk zl_tLp*&^R@op`W2e%bS-Hg1*91XtdAGI6irmC|~Gx!=d^u}b}axV7~9QtAY-`kk2m za>>El{clrqy#zg9l?~a~n38^@-x+&#oH68RP+x;nvY)KS@cpRgT)V2XY`%aJ|M~c~ zVLApxT%SHID&XnJpI6hEF_}~;W8dBV^!>HfqvG-OX|ygTegYx19TQg7Z&%f;Ww{}q zAhM^E99^OU*PSV5tBQeG*cudY<)2obb(X$4xZ|JW~CcT$fZuBQj7&Yd=xgM03ns#3#qv z^I4Q_(0agaZ8cr|)*in)ZBxSHl8;Q`&l92wWjmez1_S20w+TLbo%Nz`l-=%bbkZxH zS!3BlT~TrQ*lZQ9?$;W1rMt%!=~pggeGQPgBwx@92ngRxNhniQwe|a99XsMEjyRbD zs9&X#Z&_e&#I_i=r(~ygItC%UXReW?*3L0vfPEY0v8#G{r-Pr)M8o`QuM`(xr)b# zkBwdJ@z>=6_W)qi%ZOizEx#v4PiP!z`jXB%xx&OzXh$eTNwoN_S968bJ=BA@M*;H! ztpM^ATpkzNU$buBm7S}WKC3I?r5rhxWU~;HE2Yutb~e}Ky%G8QOLFP2v{Znt?N_7e z9!xb+nKe~W=V2ba;%+5MrY0e)@b6R&YCM)P;^mHd2@PA6DV}czI(sI)wl0A}Zr~Yx zXE^=r(u<7@m^vs(cRUR0Rj=fK@iT}-`rbSM^76r`!ym_T6z_?@2=Cc&W&v**-25Lo zUPC~(t6{(v_$y5NJTM^%#*w^K2H5|HsH_oSXbr`AlLklWs#iJnjsJP?sGnwf?}-n+ zWiT9AQkjtE(3&!)7BODo*Px&{|1YFuuX@uX2Ci27AX3{P^Ej*w$z5=#)i^F-I|aB5 zd=3gquX}VT0iX4(DwPEV_0`M-2lyjcudZwc)@h$*)J`aOOQj0iOvN+>D@V}@gerdG z|87uPAnkLwUKXW=TT*WnzPj6Yq~U%lsz(U@InOw$z~UWG$XEkqC4`2q14-AZuOe>bhZae$+>Lv?pgU&wa&GFK=w{ zN@p>Nj^4X3kyU--7WC^MfDrZpr179@DG3m#`9_bk;?wPkx4^c_WQhsLSY;^?w0a99 z37rvP(E-iZK_^eIaQ%-TCY5J?OD~dvsJ$p202}Y>qGS+z4?y;ZKv@rZaUFcJ>0Fve z2qOFEXlQbC#Ox{IwM`xUYh;@*{-y$U02C&8aXEeK)-9U96m}rb_3PK2=XpWKperg` zgbOsh@_)OQzj+MW74fy4$wsL%iH|NCebq~(z`5dTWB<-#py6a4!4$6vdWOv^qFGbZ z7xO#6>0$7s0Xz49G1yWpBVHHpGrUbF500_;9U~MV5PMmcc(I>jbWi^di1_0KQa}HS zy}Vi!oE8i5A93as+MR%ke^7fr3f!`By!%dX;Xl};${;74zy2L`VKl@bbEPZt-Wqlh z{;*JyXCZ}O?79ApC!mnr;>&==6h4jcGz`W_>ZGyaZ^^xRcBQb5aa|hSxEZWqkOm;7fX(u;Ad2KyqoF1@oQ3Ps)W`nfrK*JQ zaxCWxOOo_2B}6Q6zf*TUA!F)xG6Yh{S}yGtYA zTq_;%&`W(^uyubm7XD<+X=@*sBQR(P`=@aqZBZqBpGJ@cq6ON7Y2QYSYly>mnyYjh zU?SKB$~&%3wP|i92z6W84=PD(UZNYDoDOyF)e%xC1#lj=*0WOGl(p?*yP@!5vw8hKqXoLXb*90%=SyHst<- z|D@2yKyKjNvdOHu?D@N}TwRCdVQiViw#me#IKfFkkyreL1TzfT^-EUvh||uffiji( z>vyX7ELWq1w5@F-CRgO$L*8D~G3dSYM`K7uR2;m};o>s6=3q!GrDg41Xr4L z$9rk0%zg$^s&WIql)Zn0TqA?dw`&|({07S3y#0D%)=EyK1@enk>CRh9O`eSi&ILZj ziluU!f)uG#l2t2~4EEdbQ-1{qjzosk+jiUq%A&EQz8&Rz4tw8poMtUc9jIMcz-xY` zPZp#e1b+P0yuI*Uy-c2G=BK2;&&Uaha81o_0aKXpHy&?`3CRa}hHf3}Y1_F=8Y~XD=E^cO-qXKXj6U$;FX3XidA{YIJT|&)e(haEa z1iyKzgR0mrZEED+0f&)AMH}4Nki7Vrkc8tx_MmceOFw-kG+?J(uii78$hD#Mn90&1 z)98aFkA9lirh!~t<%KunkVKA0M1oONSJ-)%fkAqW%Ajh&Y&Ruflg#4wyllBd&fKhH_;bQ?6SS!4d?G-~8VY3lT)2BXMV`mkC%!Ds+!a0x4{O)Qy~=W z{HH$j_Cvb{lO~rQHJcjtMY^`3u~aU(OPa!UQnQtqW?_|^O^&4S%T@meJMAI2OQ@}Y z@=W-3GA17%wa?k9C!7jJNU15b)K!p@;oa;2?b0ITG4q%z1h+_g#lw;8ag_naxFmKn z+xR`&j9?eYWjp;70!}oly)rWOD=Ew3vxoICPslTG|_8FPYdv#$}I`YFv6!W1O7#`$nfYc0Z3!$J+ zl$sgw+wwYBs`0DX?w_r)6k1c&@s3b;B-=eJuEG?K2gaL}G;?)I!R-^QZF}|x+e$A7 z6!jc`24Ss5NMXwqs>lNN74T zB+rmEWzgXxaB+ACh&PxyfPBwKU3EDGC`GPj{QoQ%zkn`;5w-3Ch29+?ie8mr0lI08 zh4;T$tryAzHJO5{hb{Vh=1`2-7<3Mv=yL`6fS*Y0)Fl{ zyM4OodxE#WxdG(^ZL)_0N{a63s>$Ku=%ppE>qJB(*RKOFiD6=AW@b`SwvUc@IXMe( zgqzfW+Lm^eZ4&?pFSba*$;=j4FGU{l1~Myvh)-VlG5+W<2EHbk1rS~@fKR^E0WV>L zhPnTDP}u!XHf-Js`en7+9SvZSmm#-LQ4|NqJ9CVEjg5_Zb+%216^veMSE-XE|at~fW`6U19RY%w2MAa5TPMDE4(YuQ& z+Vv$N$d`Z`m`RX#hdBc^J^h}P)p))d6XS$a!UaYnC_HxF@XTbIVXZ!d61;j(a zTK-$3Pez^)2R-1h)pyuaPAv)J2B7_4B((Vf&EU%b358M}A zzm2A*O?;=}zI(9LX27$$;Ir`=SoK1Vrhi=tI2=jLLf`tWoa3Ef4SQ1BM0=RYvK-en0$6#uD4imR{b^=r3#bH@zX$xJsfb3Mg!!jyJYycZ#F>LIZ27N;RAxO{ISRelI5MYmm)yI znox4du+dm01A?dG{_b~hSC!DG7LKMEdAG@B6`{D48Vj&*%%%$<6LDBPdTTnG@rK%9 zT(5})B*xkY7l>>Ot;kjgVSA!{Xerl_R7@Sl6P-$W^QOf!E|6pxVB$;D>Nj!s-QqR5 z*XJO5rUTNZ)F#p2u5A1KCBju%HHq(6S6310yKBYg&rPqiBktSW1#st;`Y0%8ob`P! zAYZDR;|$BO;XlIn4Xm%}mYL~L4!V2Bc%HpX$XWSP`#W@X^@GX0wsoVnkCbJJ==4iA zThzqf7skmonu1iH&gRUAWzQcd`}H<*Kk~B@_e)8F@pWPxYjfs><&F)D z$F3)-teYos>+b4*k4|#Zdi0ZDhbQ*%Q)7QZWidCYy`${-8|6Z3A9}m-&Uj{oj>Vv& zPXs$@dvJL8!)QP&2Z(gGRVWhA8Po*^*tg^6+R~Y-3w|z^|4xgyZP#=~Vou&SC^qb9 z)zO{ti2|8rX{}{MxYj*-scRn&H0MO@K*C(BYT7xu0CiS` ziCQH3>^GCRxUHm(O4>*Y>XYEqKA^ygO5UCeZ80uNc+I^osbvy+;vP}D!|*39lxRI- z>)T#UvY61MVg0nuAMW0Hb<^-v#XK9(CgbU;N0#cdXXF1hD^^EF-Q82~tabN&em>RF zi9h@RvB-5lqQd@9>9)bm9Gc_F7k5P13igC!A1eRWTGv{U)Lx=N03M8-EYU@rtn~?( zA$I0|mk9S#4ugE@fCT<3;r7gCZ(OrKH8rrJuWjWK1AHOXK3dix$DrwkNUynl-9VOr zUXeg$%W@i^CrYqGls4pIxj?|-V(@RS^Ph~nkp{@PxoN+Vxyenoi{4Bx266tF**lX9 zs~R;e=@Q$0zUQM&+ddUWaj#~~^0MNt*-@dp0$7wCEEoE8Vd$$iXxI)WY#O1P5e*#iPNThBgiY=<9FAqZYW*QBg(Up5uLsAp9PcZL* zcWY}qq!xGrVM~nnC0+pP=MPhx#~Xg@V(OQPvKad6{QR~H{3 zuiBBeB`1$yQ@OubhXjj0Xnd7BtezLTy~BvP4tw3CN-rfSeO_Qe0YET6?w* zMB2R{WTCV?`p*MkN-EuX7Z<>L5}~1r78V=Qm`&b1)qu&hnKJVlh?b`26UQziB|<*F zdKdC5*{Rq+W0^|9)YP;gWH-aZ?Hi+7pTuvfSy<$_zWj9K)?Y~%5DEFYuR*1aeD`!U z?d_YPMnmw3IHA?Cys*8qzE3BlnO=N%DS*D3v%ZW1Cp=(#gKJI*QtdHg+&~P3;Dm#t z6}WnkphZ$zQo_wsOU5E)+Wz(XpFe*dyd=CvNazn1M|D=hU@En4$LkT>+uKFjoWKe- z3O@i)&fkC8GJI2)m}Z;&qd`Fp2_r3N*zVuxaGyKZ(<*J_|Df(GOQQrE`#OP!T~|q*J<^VSpi}yK5-v7(#}U7&!O%{C7XQ=j?g0=hdFK z3=F@xNz{m)2q0r&jhjGS?L@(0EZb_W;@SCZ0voTY~# zy=M;Yi||Ep7z9`!_oFYFvPulCQ58I*^W2i^xDP#^;cgyO>LAZXN`t`CbK$ddjSQ-{ z^&m99OV;_-27A$Hh(;#bBBdVPE$vAh*r{b6wA{UevLn{b4BHZS^s4Ks?*TQ!w*2ZszGsKLr3juz-(Xg--H+?LgdN>WUCU|zYy4IQ0| znQ<-R=6wbC-@XAI3o2e|Qa~2&?z}8$h{3jnk(x%k$%fRw30R_B0vM*uOw!-D0`=gU z(+B)P-O4Uzqv5K!5k1GPDl&gPr972S(K@=t@f433L(1Y;qq23zEuO63xC36pbT}T- zcQ}9;VbisY2$_b^O*a)K9si#VIHBKqEZ7vk!~dlMg%r<$tu$08C7Km{_Wt7Y?WcGo z|I%z8n!p4)9nb#Rww#<(wFrW%K*5Rkvx*mI(Fb$<|3K~l6o6I#4?cUMKLyf%b6|jf z@n44(dEdIjA4*9|^N^4IufL?gOidjfA0HppLpp8r0CpDaC^x`9YgnvT)&+`osmrDR z5)8w=?|$_mobE!Fni=X+Oiu+)3bPoF;nVJ&{({+g1v7g1UoJ%HT+ zF!uC!m)f9QI5EJLh#o_V^}xDHB=ZJTDAu6dzj^zQcvHyAs`$nYU=sPW>yuOLKf-%j zI#cT$ENOt}@%aDQ%KwudtPgb#m9?w6I=Cl<1rW6qFAf+PeJyxK*9ykoo0ovsx5&cy z(GuJs5N;?x@|V=o(5SM8G!BDhOoF~I zAMv>7@m^sgKNb;{r}b{D8DtBvwjyp!_bMr_8RX%x7BAr1@&MxwKhL(L!E3QoZprw8 zmg&XocKu`A$_-R83N~JmE58>6eGWlmgu9j|!o>cV;D}!=n+Kb&JDdX!P7&b3&X;!T zGnQx@kuT$E_nH`w#|(wfhwF{z!~N*V_Oc1^@QeOYEkWWx>?XziMqKXF>Oa!Xo@es; zeb9=`?mRdvi1nQte8~m$UQh6@{c7LCD6Ro1RyNXM>zjX$UbD7(jh&-xkEW^0@4erD zK%2h-0t^L`T~GX&p^1qJ;M?eq0CKUT1&JoSI&KEB*6pE9SI#=8aO?KGY^LskD*2iP zB~CFKht08{8)~;fZEo@C_g5w!^UN8x47=GPC=ZrK^kAVx(C%;S)#`14=l}Y#X}_>I z`i#Gol^m~;@8owloIBl6bfpcouvC3Oj_35k?B|5z<;rlC65RgCbI zrJStM6+A2+7&*wwxqi?aJG4SpjDE5x%0S$IcMo+eCOUsOG8wscZ;=}KL)HhU?QHIW zX$IH}DYhrab<1@)2Rd9UX;ja;Xw9H*0^gUNx+7_&;0nXNDGFy^=e)F{lJqpN3yCxSgc-&o2LeSqpIw z=--ix|6$2)Qe3YpsxsTE#jD7d3wfa^eFkoCa?AI8oiJaJ~ z2Nuz#l&(BX()A6HTe&}A`$mG5FRZ3x%2ewowTt6Ulyv~{z0H@ax@KDV`Uq09Gr?R) zg9=qhd=lF=UhHe|)n2ORm-dvF-ri@TL*}RxgB^OjrqGfS!xt}1+M-Gia_^Pal7R2{!reS<(ki^?s)@?@Z5n#w0?dj0l+rkqh7}A5 z20)d!aR6A>$6&M@0BTgeK2~I62D-3lDzyJJwg;!V|#(V{Fa}LCiDX zN9B81KM5j4BRAAvS0XT+dwV;# zF&z=U+_nh-2=`YxZr%w-OFq_651EQ`_9qO z;KOS+vmKOC-o!=^3$Uh^yx2>V4gfDvGFC2}Y1v}Ltw8gkykd1 zwi)%{Id22j4fAO~(8HZpxW zLGt_e^Sxb&@WlPWSn>#Qn4Zff^i2d`@wY#&b0K-U+V0=qIqfm5o%FR@mLJJdS^;|=F))YOfy=`Cu7=^7=#6Lb@wq^? zFeo)}dmLDBO<)&;xd5OTo~{I{VQLAz!4Cbe8&~fT!TuPk2CsniVxkg&)7T(c;|T&s zmw9HqgPYwi!TP)Y>GV`&h>4PN^PlP%{7B>-TC2$V6l0n=fp&&1Xi;sWpM1YUz@)D{EAZ( z%Gi0RHCkQL&d zSu*jA)VjG^PJZj)sXCbk_UK!7hDn=jI>m5_j8JL2rOHf+B`jkt9k+4)N&K8!J(AW= zu0vw*0HuI#i$TiyTt7Nl%h4x6qp66gMGiV7FBX=&)Edt*!Bnim_LyY_;r+q1=QZ!w zS!>czx}V?wGkI(On*YvKY6~2+nc`7)(!5Kmt6-0QtR`t}@bYU#@$2th{aYc)sMo<2 z6B;Jl5F#lKS7?LA0MYa};F*P3_Y5$O;}G5>*oF@WxA8M&g_NZxR}XKg;Ml)|0o+(a zHUx=sOtG;M=rNewFIf|)rrljERHgCc!frZ0yPWzqEzfop@>=gP&)-jZcu@S8k%|Yo z<>jwxo;*7tm*T<|NfEw?Cyim`q-w)w=tT*i4arm_w>Tu z;gZ);NSJBy`j#B2cqi8F?DynQOC^!lh1Uk$TC=Qd&&NmnQlPxJc;{fl2#GEK3-Bq_ zppc}+glmtOy||UuaH1#1pWSK|$}ddA)c1uKb=2AY`SgoVlviw0dQ|Y%jpF-dg+7^W z%n$m13@x(nKZnkBRr5K6$qI@e4n*9#jhs-viPbGrsQrusoMMGFxhp%Sz*ewC(H#}) zLP@Tx0|h92by1%utW)=RlpZx#8{52caJ$UCKs(w}M8`r=L7>|#TsgWUu0p5qWq~=j zbzheX!SJ~apKa}7o`pxZEyNBnGVPc$Enz-3VxNv&K2Z*izEtD2)A^npnoX;M=E>MM zPp)dK``$FP)KoB$_-jxeS|V#M+8r-gpU4zrt)jCp7M+}YwtKo!jjh}A7q))v+%sO{ zvKAD-`fv(UmZ!4vY@#2!U-hN(QOAt$djGcvOJe#d0&9D3lrWft)heI*yhgnnRm)Kn z;f-8HHP|@aLF_mmX~DL?9chR7%pzo9 zB;HcD{zPr2<-}$w^?Qum@&%V4CTbGk@`!D5%R^~>TJ7CHp>%PIe}JpK zSB*k#_29hC3{8E3Wi(wvjJ+D>ny_Q(!1}JfIex=qFH*H`E=lC@;};zXP0pkujyi6v-u{cs zOv10RWv}{JAE|F90r_HG2!A(zv}THe^J54ag7o;QoB0*3;>@>EwXf^KD!l4b3;2ac zSvqFstT0DMO84JA)C2`Eh<3OIa@(W6OQleaYs?_N-Q+|gqC^%{l((!;?;ieTpzvVmXHn^O0OtQO<)mYIz$s=mc!@ zXBG)zB@3CW9djOK!2BCdf89c2?$6Y-KV&F_a}O~Mlc3& z8Rf}|f_ASV5W{+19Zlyk_^m5=^?uJv@sgQEUfP7m=M$xW12l+-O^y)cZFqbdQTcsR zvq~EK1}vN$Ha5qzBW6aL-T8M1gO{jFEv34-hhDjY(diEgG%^ff&ErTJos?Hxp_3Tz zTlgX_J^I5tjN!Xhs-6oYWWg245}mKy2V==;YcUq@XNAt;#-zbsmsaGq5wzD^RW%c! zVq;F_li4bAiLG7NP~F8b;`>el%kfS$Z`fpNruwga4VWQ*WV#l7Z0NPqMs8T~+PY%3 zSibnYh-a8|_)Jw;{K6PEKa)cMv8uv3q zr&b3hq9+;F)MgxhW_HYXYh7M<_o^pdfpI+L=#)34lkD3opZGk{xDga7woSxlK9+mX zy63f3M21$=yP_#O4gf&4I(?OyNdSvB+H4C5gjTBdu>nFBl zss_+<%(|$0YQPm6GNQSgVAFFRCyoM;x~GihFa;O!x1lgk1wrnfzH+mbHwcEHax?U6 zp$U81w2qxL8*3K$mr`OXNQ0-da5jd<)!!>TQKaQ{oj8)+re1{FSTsEr~5-1I(AQz>Vf!gPX&Z9UvsE+&~@Vl$lCR5&S?&w&JMq? zt8;q1=#AP-e~n!KeQ@-nycbq!gQ&Ta#pv5j7*)EgvXDPJk?2XbIZW8zQZRZFJZN-0 zzz;QjR#1pO8Jo-0n5cHC6o%$?v;zdX69umb4dM*V-5U3=&QqpNOtRtXwJ%8cLp=h@ zn0e(|U{Ysj{3=IEiHZd_c;_^=O_Hx3yk z!%J<|SzG3ObAPVbdGN}Z3cS6)nG>;1jdU#Ykqyq%Z|G4MwY@4;0*Ij6Cl5-r`I$6Z zzkGv6BXoIg2a!6G5q_(8lRJ}6^r*&DbILqC{E$cUdD0=|R?@;cH?mt=`pZzZmh>IC zl^BaYMRF`3VOF~JLxF|(^S`7Dvbtb;qW{x>WjK|(@4#Hme~ z1cGoW7s)jkORC_Rw)fvBTJu^_T&nCf@77zJAIZuA#NVSDE83;PHjb3--k-xoVRVO& zj+eIIpGDf9x7M$29LB_zHN7?>E#lg-@B?Go7IQIq_K1${{gnXD!S_C$JRiA*IbR*sL7~leowjP;S~RTT-}RlqgSUv+0-zk zJ>2j3YDb?;baC9ajYb|h1AE{D#Vpm6mr|;b$NN?NBRf+TW8}KGIQm~j7gi!>3rk}l z_;PB&>cw^5o%Rd1?xu&6pM+D$Q=c;EM$t$XwU0);OVi^J^DR8>1v>8)IQdxE2sF_M z{V9Ma)lXW490{kaIw%sMnyk9@3Nyw6wdz5HHF$mdBe=&ua1k@swQ!d97&XLw2f}QqkFSPb_r4T|Ku0 zNvB`%flC#r!5z2Flvvkl+9dBKFYFy=*9F;l8g$NSES^HLylH$#R#`r z!c3l_`#xNG^Cs;o(R!c*Z)V(6I419v$1RuhIc`Z$>E%;+e@ZA#N4~8LnsjSZdvf(| zwrIt^nGjh;toAI|MrGeS8};Jp^z7w4d!6X+9#p#XL?t${<6WdybWv4ZOoo%roT1mn#fd}wCSA{o{0end z$agi#qso1-G|hPgl{iAgyc-i@=~I19eVpU_8t*`=RxEUM+7ewV{rGmvVD@2GZ4F}S z$IV4*t2`*(bZVYXZb{sBV%u(*6FK=<)@^l3R-s;bF?16i8BZTISJ&N-B6QI0-5AcD z-4V6xn>GuLAL{=>Z3{DZQLWrJ=|GVPglc(V^+R$xKdR#~e z%B~jLPhaWyg-V~&?&$NasKXZ7p_yIG%mdjg&Se~X?{WAXewvQAhn6QE^TDtlY|wP# zYuPrt{&jg_++(Q82NMf!rz!*U2GwthJVK6s)LlLM=yH^PST+E%<>%f~@R}9k{q+C+ zTY-SYhq?9{QcKb2k7PYn-rLN3`Dmw3ct>++Xz7Jou>1OMY~Z%=v>GCAXUauUX&}hw z1$uBArPzqOG=Ip4@t$l zJ3ei)z3hRpAWV-|fL;559i1r5 z)xc6)vhA`ABdmN@Lr{oLK#kWQ1BKeQEV)G!)airlKqQx6M8sfIQyOS_^ayqsoShGO zuv%IMAQj{;-cxyi7f{Rqtfy)F$-J?CgUth6r_T2OE7uGz9&a6FTz@AAs4pU}4>i$# z@M6dtBuDk3dBrND;>sF46Xp9*98Z5tsI52cAoiMdI4tHi4miI*XMxguQaJs1%q(rYbUdN{ z<v?hpi$4t$#rw>r3K{V;_S*9$L^b?1Ufc22C;DPiQDfSstDvq{S9@x#^v7e{qC5WC zEB(QrW}(yUWESdL7B~-(pNQ{DSzcJ(Y|t9Ltq2FS?W0M?pN9u9S|{lmPDr-iS2Gyp zRaR%K!uoee`m$9!u7|~?R$Mdr(YC?B%yUzt(zuG7UD2A|H^seCJx&s?$C1GVSX5P1C_P2X=XlPYg!Uw?-*TgHLk0^Gkz5*kOzZ>S5zedjC!-? zEr}dzt5O@RG&m_A-Zff)rzLm!KA|^c2`yIR(vM{Wf+UKH@uZo9I(Tw(*>dgTqY8H= zT@7UkA4)U01Kx$?k6LeEK$|k1wa%mS1;uz$H;35@{v6TGb1jKQZm5 z)>ZU0M+~gJ7JmSXu`2NIo-zYb2sJC{Ce#GFdTT0r8I?T~Ty4y{c0!>n6C~4$`Gm7|qxN?|~bnxQ=6S-ms9ytLP^u;v4k)K4Ee&&K@q% z@l5}2*}6Jz8}+5PmqV8ds1X&(*O?LKj`Q#YU?CJV+-p+!8gJC&**t~m-%46PjEDC2 z7kO;Gv{i zqv!+(A`!k{(qO|i3KKVS;x|uq0Az0sLCOl|IK>O-hC4mMvI_bJm66i|ObL*WZUFIr zI>>T-#YI1BdX!(cp5)yKwO7%!2=`Wu1MSbrY{q&T41jC_(shTVkzP!UPRQ+d#FGyf z7Z*jbz(F(KmpD;SP|(xE6&35NZfFSXJh5QS{zZm+o$C>ezEUXU}i|cd$(o!0nDXpb{)LY|sNDDV($#T$S@b2B_Mrw$9GZ_Ipe` z4OQ?uqW0)$2&1z6O=4o0^`j{ikaP%4Gsvc29jvIvrvNvjPk#65-(u&)6D>hO7?`gat&RzAkp^p*3NWr+biRdRO>j>O^fF!L)@tHA0+afeW904GVq z`;MlgqthRW<@DY#O*O62c0V~eihTs+y5Qb|fF#6e9zcK?iYJBcY!&BRU}s_kn4KBRYe#Y=MBV-7_D3u(UQeAB>XYFaV=Z(7ERagv3<8fuU8&L zpPa2Z9ZD@XzOm#kGUPzTZ>(!(ZpXQl8kIicPTwHU$EL#wCrTzN8>Qqs!LbhFK_G|y z0fqyG+ajs%kC3-_B8nc(2HoZPhT9aXk}BFxR=gA&g8OvYVWKruXkL#sr$vE4h3R3> z61Mn+-qpF&?fuB3>8NN{m}LC5u>(=5PPOBzUp;eAa9qMcC>8%)iMEEul6Mc@AU&A; z>sMT$dFwH4N|9`ZTkP?t6A$y5@hB(eV?@K*(nV_-knekIa)Kv(UHeOJbH({|a5ft|8uknO$N*JCn zW&Q!7)vcdQsR9tawa}UQyLe54xeF|3*pm%h0K~ zNG+wJO8p&i>L@X<0Z+78?&_@>_us-*{+muV*}_>eIdaZwCTBg=i4I3)PW;T3;!!u2 zZ;%#qCg=|QDuT%^kINzQ?jhoB0hTrfb!N7m4IDodQDcW34;C5bqWMsSm>?OY?uxf< z{%^awWVipW^c`M?@y$ng`l^$Zv{W7Ck7?uOqLZ8==Qs&&>fpm2W)HwBULgv!iN%UJ*E&s z@8k&d(@1N{A1>S2T1%&I%j#M$u?tUElIJ%@rn{>dPdw>h7fd84gGoL*j#%rTRB7bl z@V&kxUN(D1V?Dy)E=-ydUYr-~Y?(+fJWkRXmyRu`wYFEJ_S|_JE4EeRId6m5pSf1w zaP|R(q5^vVk!(LdKfs#0)fkB)o(<2`xoZGLZaN{~cPJ(l<)E8)afq#$y$C z-dZ6x-ZUY(*)g%N*@yZEZZB;khS*eWG}L-NFIK}9ONLeh?7H;7eTAgg9UqROr{ma1 z;8lk~%gRM-M~iv=_=Gaux7|}#zEVC|6$*3O8;y$;-%*f;an{hOP3!e{3CYnbI4XyE zcUH7#TVkC>Pg*cDfiH&xi7p+?RMX@Q(hiTDL_?vM`8{Au_{SsAc6A_!T|m`lytcvB zZCKZanLei}D*Ny@Y{_}uvSg;J{8gV>cP(AX)E6swh+q(i^^8tUW~p^A)(GP+av$)D zttRbnGm0tD53biAO6yB$y2X~XZ#+ComO%O>w4XfsN9CKhAqD)9@2|*o(K2>x<5ZZ2 zuL8v5+uuVJPq*n12L%Fig#-@j@hX;ce@l`mB~j(<6tlc)FiVf7LmbNcK;_o@KD1WX zpQFrlOS|_7-@f)uPTW30Er(feV`AB|=3g&+ex8N7su0|`;n`>uKnQ_AfUW>1fG>H4 z3m=6h-+BUY%fQ4$<_B#bwb3+k{Oys*nwOps$KoF_qTu`W^f+3ni+jZz-EXV~zdhk$ zUSSfCmKVJ;ZBRX{b5Ebb*n2|V{*^=a%(eh=cLi8BWEO}yN?B^;-R)-MTM*v}(GVhu5bKzIt#?y7NFs+}Fo{4Mce9cC4#$%K$-F+^PpI?+kW;2K$w^+>v zcGs#XVPdW^!JQM6WrN)d)-+bTw+&MH);^Cez49GTF$_pK?*8NdR?(5ycMZsB#E5j-V3v=LG|TcUu1YQc9KVnc zuR^^sXCHSN#w`u5v-B+p}3~?I3O-oObT_*C-~hVlP`QcvN6CwirXH;i19S zrF63V92@t2LpNkRr>y0gy6fb+$BCt90kzD&8nSXEMPvPRFq5<+e&Z+aGwYNNwLJXH zo>(@$ksZVftJLuD@UvMz@mi-mKhGQ2q|8BiF~|+I)Idlp<@E_kgH%E&T2!bT@zZ@E zt`9ow@%H8jP{zxmk-CYPB3sne6Z}f~X>J`q9;O0~pQ;43kwjIjdw;P5O4me&JLj1@(w35~HqE(DE(yCws)0eo?c4;RleD${MTAEIvF^ zx1BpbP}4CAuo+k?A-FcD`<};Jwr_KP#$lDobRD+WYd1k?sakWR|rDM7Z8@AL@<|$X95Msl2 zR)+5)J9beE)s@cv8O_`Ngfx-SZF%LV$+Jc>$Mu>)->QtQPW4}Y1-=s=sH&Q6eI~gi z`#`8$c1%@}-r3*<%l>L6+-=xiZ}CYu*khQn1CC=F32>pMxHUD|1dgS)HO78efz>ln z{rDv@m&3LVMJIz_l}3q=gd{yp8}?hi#@%@I1uD*&HF}a9dr`ISHuEa{11a8ff$3~Y|zD7KLAfV~a4TCSM@_GvC&^+Q zgibAwQOe^|-_E#WjFHZ(k-3I#m!BxsGz3QZTy^8h03ZaJvLP?gM~?TiK6}=(Q*CT> z*5`Aw;tzCMIBfw=bfdUIGvjmxiVHTbn@=Zmj5=Q2RF=Dxa;0{{k2xeW_Z=EFAFivp z{&Kr*v-%aEH1g-joK}aDoi=gO!>)n^L;0EUXYMo8$sIFXVYbb|4TIg&Ivt<27zne7 z7`~-cXsrg`?ytX{n84q%yj3@AW2X<{5IGBAlKou6npJKwvttjhL8MUbDQ`G$)zVB4 zF~F(8dIL%9z6Cj}_w=E5X&M^Psj={Khfd^)oIM9(_+zg#+N{yMIg=h?=Ggm)sD<%Q zTKA*Wgz-gC3o;@b7BX4G(_5-aKwLLgBwCAK9ow8}uZPJmoO3xH^SFTw%Pm53vM_X1 z?XEAG(r-VusUWNMiZ6(?^VhoKvZc@y8{?rGQdVBcrh&ldlD1Qve4j1&Tg*;TXTtd} zD5_2)YIvxrAW=RKQRjfoL~XjI&*>`oSo&jKB=;WOtt1{G>-lne>aq4XH8biKJt(QT2Pcj})(qA_w5-2acd24a*;6Pte&Y(R+uMXFD5~IF_9qs! zLYYzU6!XlHZBEBTnp|H%sn&q4>cOe9YU%rvQB^q(G=)R9soqB$=BddK5qam+gM;5~V;6a!GJ`Pn zK}P4T72Bz+^>jdcXFH%+eg!{#Rq$1$UPhGh;5Qw0AUoIHKI+cXFh4mv3+BXiy&bf) zwN4vK&n~VH;!KkX_OvD1MRPAp&^L6sOo7OvSrbYy18O}`=AS+8#W~e`8FcY&XkzC=-z=|6X@YS-ytLhsTDUVhCLQg zs6>8{a96Ae(VQAc7NzfLM4eA3`uqoV6mO+S=}S>w&|3%h)4N<<*ZhN!9#C*J*D5wA z>)*rkApN8G7Z2eh{O-H>`~{wYLLbUVz^+U2(4~P1pph#-s74;hOfZ-g3Q8`Gjf+gb zJC$|+YxVHam%bbVKLb(A`bm&BEXDQxD$)1Uh&?yk^0Fy*&$Nl-(d}Yf>GQT<@o=>% zxFR9Dez<1(@+kYFf(bOb*tuuk2=L_RGAxK??<0Zv)h8Q&s=IbSPDvot!J##ibZS{QgT9A*&-~%_>&1Opz69@ z%ny^7bthWHWyZws-4I6i#sHEC1)WH7W2P76FWAZ4e;eZ7^HGCI#_OZ8u724@dnZa^ zgz{ZqWhy(_E&J}rSWQ{kA%}CHr|j&;I+Wj!oOp z#8f(fO85kV7CiagKqU`7hhb{UvR6dub0sbZmjn-SbEC>UOBrJavk{q;>>CA1^-;zn zSb zV9*36eY4-3>wX!_SjFPVqgAy@!tTn_JXQG8Wf(*pmG$Lc{}GM8@b(_5)Z;#U#9)%Y z-PxI+%qNE#H6xpLErQ0IYYxAW?di?iic^T6w{bpv&7SI^93QX290_r&9-fS=dugLN zQ7$szSRh`u4C8#rq7;?Ur+rr=GPa%p(I;++$`WQYr`IBpY+f}Q$)-^su=*fxkY!L) zlsR8*v>jMQiqP$)sd(xgp(g-j_4rIUYt@$x!e|q#+0~n@JVtGO&M!zaUIJ&F_bctp zq=M_u`Dx8;m@7rit$I*%&hWpC%=oCV@?YLQFJcpc@G)jy$j=tD^O#o)4Bd*EA%8pu zP{19uY`2#+Yv)ifJprZ65i52 z(*82^u*jrSNWFSYn0I2v%+S)gqe^7S7084aMApV_b@``pIN}H~5QSTNG7IL@1a^qC zbkFL((T(`p@ON9xnrZl6`pj0gtcb4mXRAXTeQy!z880MQyb2Dn~8+^YwoBSIk&F=_*e#<6wS@C8HIYGNHsPC&KiiRB!e=~m3-zz0C=?i zoxVeF&6i~p&$nSv3}3cMf<}VNE3?vbatAs=vjhb5l&5|{2x?1g(pGVm-1dvYw2=#S zc>QxuYaXq~`G5$3mQS)K*Xsn}?j4r#Sh{Z}{g!ib zwf<(1RK{$(kl2&g9FW`hY&V@w^(}gI;)_CiZBm9RzleQ}IZ=+cmQLXmhc6d*b!sBn z%sF6tHs<)TFz?WvMTRhu8glCbO^Xh2l~Zi}UpV*Q!AoB`3r1_V{R#A%GXcgQ^4H5I zb#I2UbAnVIC2{lW!)HJyb297O`fHucqy*Kh%?Stqcev_}PnWL)ISb6s!k)_zoF?)1qrlcX^ti~(T9Ln^pjp;* z2|Tmyu%)~y(Hs?NHb)U(!6?e);hkOKS&CZI;iE!VyOUeEvtm-Xak`JkuRO1jvq8I1 zi<^c;p)ZnC>t9uyb&stWbw9EeKLW5d(O1)${W0w3oOmd7x2p{PDmm}puzqS!J(xgyg>Ptcr_{`P=r3|^{_3PCQ589mf1IQ7nrNKM#=v`mKpAn*1FKI8Y>-g~Q z&z}d-o0m@etAJ#yi6A*X zWYt)!&VQ|DI`&;S-|>Jk)k`vf@m($b-|fz$`$ z&2OFt!rZpYL}MBKuanIEup?}_>h(aDfHCY=uc$hUh+4Lxr*un6@%-=dw1sSNbcSy? z#$4YGt@SZ=ehcrC9G00>Nsi;4GSyzadaXBu_xYL%(b3+}grTW>-Tu;N zu0%>Y5lh(n#%FvNN2hnLU{CrEsW2Uq9jOhf;IcqKFVRz9QS;G2De;ChLHtuwFXyQB z%(Kr#CxL{|oRu#Qc1ehE$ttW8xox{)h9>%DAsI zeT&Frf{0gfu}XoD-jo7S^?Ro1)CSjPSB&30<2Ars5K)53en@cP;BE(hPc?t``LyBq zB5Zc$ipiT@Z|n1k{z9)s#rEU=ObQtY#r(z2aj}V5sRH=6gWI?>M~Z#y45pS+PsJ0N zSK-LXuk=-^UN4Pn#&g9mhx*lgbb|ITFRt+%v_+k1sfOLO5fN(a+BYvgnZHI=uOqs= z!yB$_ecRVraGRXiu9pj?&4qt8Uh>jv=iNk0EfxP*Rt|9@Nwm$L*`@T(1wv-8J#oeV ztRJl39pF(p;Q~wI>9G=Uqu%@oVsh)dEms@4r|bfg?2C?OLS?ysUw^UVX|lKcK4DnH zb6&*0IM?SOp>nkAO7z*~y8fwi9t#&|Bj+V81=%BNY_xgojoIIger7|CvP{&8l8&A6 z+qZ7GgsU|kg}NW#NOHgEE4Ho7J_qMpAsd<(7M|FT?4BXIcpIaS+h0Km3S|5fO)y*> zZsuuOS_dI88sLwXQUcpHB4Kz}t^KqL@y5B2G2Vw>IpET))q*=PeohrCrjvBBQgU2a zUo3H6a29odmN~M{OJ`)u??z zkgvmf~yt~NtMT(YMlZPA?$}#!c!YtZg;HY$?_4V~9Rap1N zU8hsq?Dn}r-qPLf-)AXU#Z3Fa)Z79V@x8h5+YN4N@w9dB7eCI7TS73Y%e4uMBy)6sKri8<6>mHoE8ayD!+#6gih;(HlQ}4ldh~6CaFet1;kg zTBF~Usiw+jI%6G@Cvf&uVsCp?-L7(@^i*+f1te;#|8k$T&t@xA zMSpqu?2#>OF&La0tgCMGUbUTdY~*gNKzaA15HD8*=5fvOs!Sh*vZWSZHmYi^UIAPv z_f4{=;7HCB1ygCN0cS?6qEEA=;t{FKS^8!5ubDg)RbOi5V?-(;$w^6ooSnf#v2KI? z^YNhhi4$+*&yiD@BE)0D=+~Fe0yi9GmG3SdG;=jzv<~}(Mpgsl8snJfX0dGulDYec z)ICv+AItsNPEx`WUy(y!WW106&A>n{qqmywp%`ZRl?C5KS{Ba7K4@$`a^TDQhLYo0 zbGkv@=A&we?+f$pnv+gn1+NosO3S@mzn4ESg}JiiWJ)AsH_809NXy0t9{P2s=UFBVKm zY%m^gN%Gweb~o)=mVNII@qrL4wTtyPF&Y<2bNK|xGnCZ5)%;H(N%7KIN<94}$Edrdl; ze-YbVNNynU@~~@`p6Sc9qDp=nZFI7=-IIAa>CY*-g`D@PZz-|Lher2M(Wn1t>syqp zN9Jq6=yuLVq+2(VkGHfC4*8hbMjvKjAB-evQk+dBLmx((mKw^?vXy59-(eZg?EOMT z$2Qz(SZsn>ED4IBJ`PJ2eewpL_4_cbjHDwtv5L1q6%G)+&0x)(kGEGl0w$*CL^TWb zL_|Gy5{IN){YhxfT5=TOC$IN1APt9@tz3c}Du`#pr|K+6=i;vS=8YnK+Brw}Av9!{ zBfmN>V6SEnvb1_`+1j55>Lhh1m4YFb(X%K&!%O(Pq=A99GNzp`#I#rr`#skmqD3So z=e_S9oed=a{*tA9a!(ta7y~p_k3lAakjkk?tMAmnOG`cC`%Fy_I8G>Jqtp^2_|gL zUI$j+>+v&X`F)CX_>y5LOYLl@w*exoZ`_GJ?4#P|dTn#9Q~EPolQKJiCsdX*?VYV;m1W{I9G21?cUEIrvBGaTl22Jn8;0u1?F-N zyohTr!C~%;Rh9PD=RdzYl1~-a@zT8v9M-Tp)vWi)-ZHOf31K`b|HX>u>l}FMSNwIl z-q_)j1Cg4EvRnF;LDxrH^x@}X<)o9Jp90q-(mp&>Wb)wtI~O_;k$O^HYUbr|zDUvz zA%oV@B!Ya$raM-+| zZ8~P^9EI91_BwZ@hOqYdUhe#Qf?(L9p>uD_9<}pbQ&sobT#`&FCygdHtXWL47*Zi8 zzp#VJZuLf2L`Ie6JyUmema@0`0mi2y`in+hxg`7886yul7B#H4a6cYavTLezwnl;QPlc8 z<+xI=O)2hkaENZSKF#O2PuB%`sOh~odDe(DR`Rh=eyW;s>it$y-GHfey=&+YMrb%c zb&{|aL)d+zWvI;lSa@xQ+&+NaHP(>%*l0VAYi@tg@7`kjT7V#{co|oe7PIk7HDU+J zPv~9u$%0%RSK@n`sW7k0$$Sk{ssJK8$~9$d;j>S(duphb_oYM9{tz$kZ!hX=mfv(= zVli@ZY^@QwXN&cEK!Dlw;Wmge5=J-GteK3iTWuo%kvi40OW;G_ZWow)+3GO+itGN` zb+t%_8mTE%k)+ofs5ZG9yc#oK1ky1ID9gQq=6eWOeI=A%%!wO?32?bhZg#~=irAZ8 zu)zoBc-gxV7o9`-1zpCzWNa`5nkqa6d5Lzs;5brN{1TAA=v{U!PN5Dt&oQ#&daGFv z!OZP4ik&8l=3u22yJ!i6=FhxVU3ZesD|SDNxmAL5tu36qyngNp?uZ+oPnEZ240w5^ zmrJ}m&>zAWu3&=88%~kZGV}3IIXo^hnCK1_4bpF;^SfRRnr(8o>m9OYS^Hw?O z7&b=!<9PJP0}c-!$dt8-a=mq*xF*T%c}bslzrt6RXhTwtQRSjXslT7U_`5HZ z&7u4b`)0}IB=c%{Nt*m3?hacK**Todsr;W9B+9AR`pJ z(1x93XS@IUk&zQ}T7o?PtXF;Nhv2Ly6LQ!W?@RCfv_WqqgUzzO*ckb%&}$hWb^!`6 zp1szmCqCV2^6Ns}VE+x$BsG3&-9wu6qr3__!aK{h@#ytlB&(yj4@QT?rG8r);=r=6;1(36F( zV@Cf8#9US|dS24BgzCP;MoLZEA-T+qHfTu$QIL@}z$3}l0XOs}7@XjIYu(@o928@C z5cK!PxwZGDYOl|#UhX^3)L(MN>UYcbZhF$cKiDnJ4m2)rumRXAUoi82?4K{?`E{T} zmkeGI93?1_Pe^E3xhqir%d4#C{d+epJb0p3r$pyS!j4N96o5vA06W_amX#mdF07vX z^t!8hZCrT$^7-o<;*S3K8TIufuX{UNp9FZ$m`-K~GOTf^$5zjV`h8LYAC}Ml_4f?053|Jqcs}Wj`?A~LTgQgpzo7BOMehB(N2~YiZ|e5@b$V^| z*52OxvQiog?EBeS!_3XGpUcBF)ld*tjUv!q$ z-CVhbbEd$1hwGQ|@+dO$xB*W<F|sQIh4+h*&( z-~Z#+MD0b=|CT@d70&cWo`C||npU{v`3<wj`_1O^5w40T!fxB|=w#>4>+~(>H4?`XwT=n*Q_I3saaf7sR_bxmLf=DVN(kcSdC0!y&hjcSE(#_BVDk3c)ozmT110o$m=g59Ywxb3XgTKIgNa{cJ)$D9aE$q<9Db00`t{rPKg``{?Su zkq7tCA8%>pF#rH!fSiViz`(=-7!Kq`K7ZQ|WFE8w>ak|Y z{xmK72LbR$gk^vI`2}!E&hS?R0I0w~3;iv|B{^# ztMOrAJo{I(yLXTCUu^~p%lKcd0{8z~hXFo6X6+cz-HymS!^g$|qyz)-oyy;?qL*r0 zd>S?U@-gPjb1dV4X6Q|U#t+rcxvHNb39C2!sR4(xIJ z!DwcW+=6?+X|@BR>j+JzUGwmrtpEpCLl@ z(LWv)0S=f&tjERysS4>3(%E)%MsryXQwk?$Q@h!kOptM^`I&2f}={&jmwRpJ%Q_XyVD4eWd%eJHpyp7wS;u+%r z0NO=^OiHn^18|<*a{?}lzPVfg2%M<(%EEvk=qi@?P{K^@vY z_;c?8Gw#@G-Hz~f*frw>83k)bLOq@IfvCTMGA-m9BH9oq;R=P&6$S# zelDbp2<5dm4bI^yjawsLI`X3R7w*1n%rRWbup_4&X1L=b>A_#r^luB=7q-lTSoDX< zv~g(E$LRN@im3~ z?1&A~mTfxQ8+&%>Vw>e8nQ&F{PLWAZKqEMPSg7*SyxM}9`BH5sXNB=9c+T9 zoL>JmdA0>u)leO1$UZ$mT{}VL>62PLJvbBioiv%13W# zDK7qY84&S~zzH}yP>n>^!+XT?4ujW)520ag;*B@5dQ-Fcn~~4Wd(WU~Z4>urHzd1< zQ?DlyU*y0fW3P;+uH&Cx_Z>zRFe=;bN$PPN|1Paa95Hqu3LR) zwp704nMkqB<$OR%GM{gkmm;H2v$Mfi9chrr=l1}yZl}GUK^>%g{Hyrun*>T^{`2}e z8>Jh&Tqf8+Bqw!7+RoL)4j#{cuA}zuOk6kM*pGvodBVK~zgY~9vP9vpsjwPjt+88; zg>sAM)@>h>TkS3G)@LrOc1v&@-us)E*K&MRL%QnwZ2OPc%(QL2JK1?!oBN_>vnu4T z{(zZhUuEBfw;R3@*v$_A;YFi?IE1WPm5P0`ne~||P{ojmT-Pbju7lC96yX*5xU6B> zCd5ntg@sdn&_`ecS&|~do}-XM2-eZtcO=`*!CR+Cok+8E?;vGJPVOsP5YwMy4_)3u zBmix;o^7s+N=8qN{ajYI?5%qt|5QLcz_=>2wr(s?CHd8+lr21 za&unp*+Bm1wpaiD{*qmp?Rd7(t!vAhw&l_N$`AZQ;cEX{r=616=jE5GG+hX5Ca(Gwz)HT zO4$`3KlSV^^(UMKQ%|2_m!&F-n!R8;wylGj>xE?`QT@S$%Dh5(NlZ}ZH(V7cWgpMf zhQlJLXjtk%g^-TM-#eWnYMX`I|E_SEdx!3#EZdR|pR^WHQ)^UKT+Afwy6U89=&G_= zw?;@y&ea7SUkG_E?*Z1#gpV4eRf=p4rjqw^rN`#@YmUkum@L3Ah`JZi?;Rteo9NAf z1+WA7WFpA8B2`X=(&xQG;Yg8j<%Z^K=;XSC<#O}D;_MJ~A>Ds{S4>SKOT_AV{b2e& z{AQ$Nrz|Uj=W@cPZ@=2r$=%tx#;U1_(Ct+{P3M7MWLEpnc*9W>olGZV=l9vsXPCDb zWxt{y{fhoc7lqn7igx9njl9T;9^VWito~}nD8tuicrh#%#esk6GJ&|rpe2f5&_6T< z!Y@QS-N;kUq#C|W(9TxdMirG06Ql2!v!|zLJCE-HM4d7+*h~lgCjylr-BS}8=iu0+ zpw7f{5jba%73#Kf5Ip(pR6oSN%JrD?U{1@V_ma>}(Bt5pO4MjXKYR#BVONoG*ul)| zeK_R-=he!n|NVZF(D`zH9$u>J>t^g1^*^Pj-qO5PF7u}om zl#|TARBk&D_oU-*kRymLE~-WMuS-jB74RL`Ytt)VVYO8wdZGkH1P3Ek6uIB;EfMZQ za$crHk5Y%-J<>x`_QtG`;9g1kA7EE5#F=qAilEp-w zKyz@WmMQ#qCR5p#}Bc!W{{GZF28Sk_oQ zztiN8v_jX56X(ehHa*JJ7RImPL{vgEN$DrP$2)Yhr0$?>)0n*j-ieS!7dB}ezH#^U z2l-V(P0?OHxAO|57T5`oCRoO%GuZluUzb`pjTRi#P!JGUDS(HU8;4If1ii4rUl-NX z)Orv{d`sl@&iU5)W_NFcG$uSYj(~8{)l%%y_FHJT8#TXUJa85&jH2TYZRu7%qZRZe zhE|?eW#z%0Izmh%kjczS431}~DpF1Jwhu4-QdE~J-DDs#Rw$Dzz|D)TpW=fwa{QrU z)4K;e{-H~0Vp;D!hk>@?&i~4p8$Dn#d!(vuE&v=~Us<(=zoch5_=2d0|W8 zxNDe(UXj0Na>Rg6cUy41q6_3)lY>=x51I6pz%C0|#DZUNVjwzwa$|)YMK)F^j&>bj zqG%t>4gk(fV_e7?H*iDtyVqGU6R3muWGpENb(q2FzCRF#0kJ)%v6c5K-cL;CRmk@$`cow0dOR#0QuY(y<^x01^1q$e>%z%Wg`W;QJM5u=W^b($ znj%@giuxpq#>J)-G6h#^bqTOO{@y&eIBEOk+YMw#@q#=kn%JuT(LrPmS$LCH(<8@x z^L{tK*HXRJspfBl8pSW}%sS`_&JYWg=04nx&NGg z@1^DJ?xWH3V&(MZy#>Jun4;B+*dP!d2aZy%;o}87V2boiO53wyu*DIrse6+xlXy z&w{;-A9{1AXFDu@Co)=I8<6{aR$UnBFCHEb8R+Qp3&30$o&{T~%}BoVHhY}+dB6$6 zn4Yn`4=d7~n5@5FJvHE-@WWlGx_bJz*Q2$&g0o`B7Z;dPG;5oRp+|c=2cvTuDx{`< ziWcv4-^obP<%`lj6-b5Fy#lA-9vyk9t_4^3Qcr(gNEhe+fnFI*oW-L6>*}xL^GSWD zx1B$>KL{Zndt0sfyjM&Y?2MR4d>SkrB6#RNuUod67k1)p52(bssH2D6FzILZJ=T+E3*Co_>gCXo9w>MX+=HC0XOFz z%|!^?@UQ639YrH;hH_RdHTNpT%N4P*G;qX3*E~c4X}%R1Zezph^Sd`%yL-`CgFk$T zAb#KaaJ~H%W(yHGN*#1Ha)6K*O5@d}RYdOOBZ{=F z$b$0}$e{6XBrDr>_2(`(eK$tv+XR{e8f-7?sf$m{O?sLj23K%*`ka>b3&XuRjkeoE z>%I)Q*ariUs>y1j3%rkdDt5sL?2qc8&e&h{%Nd?&OWR4a|MJ;lqODwf9$|*0xA~#a zyZtEZVCmD-jg@^!>W2}cJv>4ygXwHawChA2%rF9|`y_OfGnQ9tMcWp(;5mJ<=8&!1 z`zrn2?el?44B$spD37zbK8w$OH_@y2@r6Im^LX4m`4o69SNoS;$s-9pM%}7y#(tSA z;u^mv{yL)eDZe-^zx6y+*>#Z#k)fhHC&+THu2Nqv|CtG>&|OV#*HkyFct9buC@U@$ z2#g=tqnKc`nw0uY%L!B1es!qIqLk;fx@yJXLE+Tcupa(PN?IrVgERl>tA!}`SpK=D zA64p%{crTL1S=sn>!);HWs+YBSW8|P^F$J#6f^-DeN>u?w6xW=^6AZ&dKhQm*1K3STnU{;;!g>f3I3=#M_ZKqcb6*6`V@z_l)PC?6W8!>72V?nb)v<ZM!Z5JmO<$81yP*k%+Qd!6I;M(r%Mxf!B3`wc{>#GHA6~P&vFYzKn zAPf2iBl3fpA=aOCI^|K8k)YbOB|4x8;Y*;3ck8*lkZW?dmF*tg6}z$|;;XRM(iBqdX#||8l_Iu=nIe9f48J>kMEJ5OzM-+~ zo&SE;Y-If4REa|)AII#xa5bxv*R|Nsw7oIv#A!#>sH&AtRq1bj{Y zHE0HEs%K>A;Tfr#e_dqZo~LDIm}_vz^UI_nBf-|g55Y@9c^;o&w=_Ah<3GVmMV-br z^h_`1%#y(nPmz52fO6a4;;~Pjq_!|y+@wrohQL^Cf3TmbN|`ulw;hQwo`>&#Ov$t0 zh|l|06@B@Nf^N9s`t$n{LiRj}Bun8r*Roln2&IU4Rl-P63nAK)GB42{pWP=t+n73H zl{&-i2f`*6#qb+ky}`2%yRhSkG`19>CCEg2GfSe~>$VYvGH1b*F^o*i(qns2vP(ZGJ! zwvuh9C|Ql^n+AQ}7#7lNVk?W?_#K!Y`m~gQjQL4vC(KYrOeA3LIok>IhWmn8{hM*6 zyrf8FyQcZ9VKY5_O8g0c<#;14KX9R*I2PoWu~F(yio>r>t^ZW^<>$+kkv!S8S|xeTG+E*rmbkB!^GK))p#b7_oP-CWm93 zc2Xj3vg_Xjl~lgV+6c-Fp+B%Mk(J)5+Oq$>SRDfMWj_A4`mN+~YwMG1CN$zhZEbJuFj>1Fd{>9~-nXJB zy^~U2A{NQ?2lEQHMK8cR1+%>bi!+lVr<_hQGx#T}2lE{Va*oZBp=?Q2ycrG|eFkS0 ze&0pOSM4tQH7?3VJ@}iXwH<|=(%Hwyp(fGaEB47B(di^{5khD^7k*rXKX+_;UHj{* zuW;&cckr@3uqu1++aqPeNE4zcSFtVE=D7DQ7)czpj=dee-{&JIUa*UC{l5tk| z)RSp->rY$#KZ~)#_R5+gDt;ath%R_l7N^vIdw>5KnQD(kLEeq)q+4m>_|Y-RLW81k zS+5_QHcydo#Slnubtq(Wq3;SbI&XH;j$nl>zuhGFmS&dbK3s3I8WlFoyYM)5wHI#M_S4a= zJ$4X0m~Mxrx}bh6c+sKz=3%3QbCO?kBiK{eYEU>1|Fk+qjpJBh+o_8O<{Q<*&cMX7V( zv5KW0|A*5^Xf@7VqkW>>PXE=)-Q;*}a@cT6iYV?T9X@j)Ps8;%EXfDq5 zP1doKOC!FpxtBg-MBS<trymb^y_>9+JKV<9Ew=nLfqonW`{FYFi3Q9ReFbM-+u z4K(shcuY;jr3(nZalsPzT!b%Q+}p!bPSZ?$pst=hBL3!=#1pPH)XOrX990#duQJ^0 zg*u9(A~@ntFyw~F25qJ9!-mhc!Z*b;IOT=)1Syn)Ro?X6nTyy7Vu?HDcnw3pMpnw} z4!|x{7vg7Ugiy_!;50|^OnYktd$E_U1sUjaNPLnTX!_j-H)EjTLm?_5JUvMKJJ%N& zb>zE&G*4M|_t{34Y0=${4N|wL+KXS`Utr#{r`7XmP|J#W-Wkj*ITvK=x7eZrSL;gV z^|WnwLK13Tm+-?Il~3>YU37N2q(zr0m)-6=U3al4Ii*-6`G5|~M{5YIOF4v-8~5xa z$@1CQwJm9czL!rtqxLMj3tU&5d?eRh7TPU5LloOud@K9N4{H5hVloa77?EIcpVw_N zt6JYDVR)D4dXj7h_w3wC1(~QjX-)6QS)@>!u(2@<+!uE#V_T|YRz_XL<>)N70r^?* zP_cB4e2B3ciyr@e0oOJOsE5bPP@W#PG{@>R!-mMbCf~k5I^Of4Gx{pBf&Nga`ze!k znQ$cp=56AtP;CTigXg1COA5w$(yrLc2-!|fVEckGuGlVHFyDH|VoZl3rkb|5O}hTN zTAPC2!jyX|2&==zyQYgM(D-#H4(PDbt)bs`CNhtoV5_o(un>u)DkH3V}2R;EXA@&m5t2*vBCZfPqG^DE>io|2;m3MpCw!&_4hG&*h)E zZ`wZ-@V5Vx`u{NS*AWRLP-G+{lR<;3e~MGj8Hk`FI|U_~I+qpdZI&O1*%bu^H*D^e zgBy+EUUJH7i&r)S@D*)>;@Q@_pa}Ehn+?h8MT2xTnAE>608LX6jG0j@>36GUmb^R-2GrwaMVf8*&=zabKYH>9;mYswt9rah&*H)90 znDk3I#DJ91qaF;bvb?*nA83_oC^tmI0RXpLamdpT?e);e8?Arlkxwul?26t%O0bHmXPH2=$-B zdQ(pJ(agTDJU<2JT1H9~-d8e&(wt%nY5LZKLv*kPSL#~o3S$(aLhZ81l@2-TqrAxj5(e~*fhVm zy8#kWYu7ED^-h$$9%8X`BU(Mey=^BjFLxpXNYszwv7$*n|JfS0?C25CF<9Y|@ecGkxfCklIZ0A7TUG zfb;)AQ?SF6xr2q$n-ooe_+&NeIVm|fo#pOrEzg;U6!H7jyGqlyoO}PsL=;LG8Xig7 z%(clA?1<()7qPx}Geo=7vD&1axQf2E(MRpO?l`2|mNb8!EF=lQu3(~y8hQRGYyj_^ zWF6tM#ya2zHl3}KI~h96k$0EUPf3XFD*A9KrbdBZ^rEhsXv;Ez&+mFyg(EoKzKw8aw5_%!L_7auD5*b6ZX7QE`Xzgr?R|BsvX04l6F7)>pZxUmxbv>9C zp8G$K!%REAqsUeW_FBp((`TZ1I@oG!5L($Oh!Db2+tX z(n~CQm5#ira?(9XE>|G9hbm}D+^!V6_gUWijh~DSl3={HsY%iLh~!A8Wh5sKw@j^2 zf@)bW>124*mjDV@9)ro5VrUmL52&cfLCe?Pvje##)2b|8e|C?Zc#Y0i;}_C0B;auP zfxilQ4b{a`{320Nkxx|CbePtB@`JqGw~{NUquSK$@CVDi-{aRpE93P}&(P@kq*~N{dx_{Bn%37ZX1*t!4EGbo;K}Ozg2~2QAFL9M zG1s^Y?jajq<~C%p0wHtz=_T>~f}-OjN;@9Z&w%H3d0&V!h0>kV7SS6k5|InyMP*BV*zJbscb zUT5LHOUBVZxgjmCcBEezhNI4Te%w{i@fOEWzS^uV>GbLd348p>O)y1F=UPs$)>h+= zwK6w+SmAFd(D+Ym)D9a8YDp|+eXUOJe)7pBo0GMjLQT+rbfxTM@W%TzP`?tK=nd^6p#(<4OEbCg7g`HS4#ob^Kd_(z`t3Z83O>v)kc~ORvfrfrHEax?P%I~BYY+#fe9w<#nHOr{?ys)5 z&!gpBXlCu!G4#|R72|vRdo-jw6yE}e*_c!cYUCC{8<92s29PV|SSR2_ZYJA6$>Bc{L zHA$|fx#h@F_Fd-9*hM4$*SflCsK@P@mld zGpY7;nbFSuxlHv*Ef!u;qD*Yl9DNCB;uEw3)1o`+Q*MJ&)G2Y;%$9azttovKQB^jX z@@IDk*uO&`Fa#n^sIA@9^}&0!yaX;?D&6l@NgH)tl+yZp$#Aa~3x{R-UlZaJZ49{j z7ao+oHnW%eDa7on_asaf6hF?TtzOJoA)>R}KQUr4rnu)VwfP_iMa zJU~|h^s~#2#OIVC)TQX~75pV`5Er-zkF42=49{n}8sx|<*`>d;$rvEX3QeEAH zvwT>Tfs0{Aa#@UlkBfF|VUZ(12 zs-oQZoSBQg|Fj9q;0Lf&Q!YxYuJ--ZkAo}o@pKml&#}<@cxgOyA2l9t5E!UrvYYp# zQ!hhzK#Mhhto)S)VpwgDyCBggORcmm4`s!o>EB;>#;x@h2K&OeFvc`;)6zsEJO3kwS~J~DohAl%;35s02on8KNNtCr98 z>ihS82>N?~5u!f^q~O;YdLx5wJ`h!82oriQ{PBBxUkGEYCigRZv`jwy0bmADJ*)Uf z!d^OCBHLO3R0cEW_VT)3?!g1xP@w@@B`0TRdbGf0$my1ahX+1cf&>;IQ{~(dkS^lo zVs8Fwhd1BZ5#E2eK5_~4PkhGSK%&k5kj4kpbE*FrGp&sL;JNbM$w)dhuTk)WZT;22 zA&3=^j2KO`bjSAVC4PaPoCfg3G?0Q@>WjQFU|S#INx&J^>Pfo)p^C*AT~EzCMjjPELM?-yOy=jOr0bDti}K=E}>1X5`-{2Ved zE6;xJJwbMB(?$p*H&1OTt-y^IeXlR#&h41yj(#aHsjWU0^XWK+DpJXmwl}UN#mC$> zZvMyVZJGj312_zC^40T|sYN`UP)Gy>aWTKzr63D*a&mE{l%>!l>#wfPkrHuErF1tP z>0tYqMJAZQR@kH{O8)HZ+uNI=o?^cB>b%z5l~2znLB;7Rp1iqQEz8-O)m`>mk7mn^ z2q9&DOe@!#Nwt!U?7Fqao}=CLJXT_mx{urN4QN#JZjljAx%I%3;p2l3XA5&tb;u&3 zhqS|OmZfK1Os=#9wVvh|GPCYEl>&R75sTKaPf=ptmajEW;9vN8G*_+4*w7TjKjk3R zAGcjXLP9-H@%n6BrBtO5XFN~o^z@XjzDweHdfoES{iyG&gK*bS*BH3#t8dEfgr71) zOfMQ)`vjX@G?zSmJBy;!xxwsO6J+@#W%-tF0!O?|wyi3)wpa~K zQY#0YE zXAU)s=SY%FK=r5n=}5n*;7Q&4<20b{M))Qd_sq7u zH9js*Q%lRzPftTbY7$c&6X<*V-eq7$(yDAhxO&Zcq1=`q&hGH?i*h?uT-*TdHLyBy6Jh1bnCe_-g#mL zwUG9)5Iz;N(+9bz3|pI&7S$ys7E8us_=W<_i`n8SOZjsRBU&*HPR@^ByX6DIc^^lK z++ChC*L?bqzNa^00Cjf=k?7e-C~3JnO@lu|yba}lnIjiVNG&Agpd`aFa>JlGBxtSa z<2#WNYc7`o;@)?Mi8l%+ST5%A(KWxr=WufyisCzT?%R;kf)8SBRy8+%o(=367QpFau1DWm=i3njA+TJ;kR==QAIc z*>+$MVf37k!omLO{xWApF(GbRw#)LKti zG5Hwh%JcQJUFp<8D&$&+0soK709UjZktWIkPs(DwG4DvmrvHhOFi zMomF(6+M?55-l=v^ZYM-xV%q;Z!za>cT;7pRt3C=2S-H}6YqL?89Dk64OZ2)(uDkW zCzvc;qqdCk^6$>)%Z<{y#cTJ{=+_4oeYKk^)c!nZ%fHrYFSW}#dv)J>d&%1NRFRj1Z2bpXkq;RkQC!QuX~5EsRR{;un*Ut$nDcFL z<7!T$Dz&<$y#CDU^%Bk9UO`LEcsfsZOA()#*jiePv5&Y(%$Ri^qh zX^q$FsC2~sV9|cF-1=aF>brMwCo3#?V)>^6K4-L-mJn#&pt2~bH1c>{B>{^6REUoS z@6r!B2NZ+G87`Ozi@W$;sGKHGD`y-#82O}I`3xh4gz32tbAvPH`MnW8)6`W&`H!y+ zC&KNZg>sH%22?zA14*xy_vewL^Jhi+`Agj1OSClp){rK9Nou`5ROJ7 z9+8_#tqu6%G*#T2m9q>6vDOIX`MXRnmL;&4vU$a~*W2f}<8v@PEWmQd2`p>c(|4;B z>;qgHbKj$i|15du3KroIPiSS##@UF*C7}`ZK66s>H@W@ZXI{mAOvph7I0zRj#-I_J zV0&Rw_U`9QmBj!7Lv?*U_@HsC?Rrz3jAL=CBjaGjtqlRQsjd8NtiA2mseBwRpp!X>om(pLHCB$eoMLBtOv#}Ash^i@=HGaQ7@wjFTvOhjgzJ>@{!uz1~pG(JE^wJ0H1dnnfQ%)z;jwgJHmQ9d8wb2u~TbiMz1h!5n2?78_-X_=1WpbIIF8k+E zcelHHJe+aG@XnN>r@0|?7)WAaB3rh$A(Y>*Re%- zUhZb0sdN@iANC97NEftv6YT&4$?N9A{7Ss^CQ^@o4YJ@iT%UC(JO)-z;BFOkMeEDR zM7Y3e9U*hhMNLUX{zD51wuLOYjG6~VHujE#i)?Cm94B$e{WOmJ*`+1-}77NyXFU`(HR>(L3N#toaOyYH4ZkQflq zoCCdgbbY!-#$lv*@PnbR$CU<=h-T%lMMb7CGvwFr3+FPh4K+5OQslkwe(!zItOhL9 zVxG5A)lZ&e`>i@-$gex3*`utfyJ@4!|2n1b;|s{X(B0jU0RI~mrb-J!!_S#ji=UvaRyn{dr^HcIk)d!9FJbgRG z90qMcGypyGeDmz59Jd~b3Eb>2_5{r;c(alGi9v_tf)X>VO2gLrAy3cmTg4YqLZ{T_?15k<+^QD8+tV^@V?{=XrU}Zf89vFp zGUV?3Lzy2QBe}h9ig6ge--OH1CnVrlxMj zo2_~3t{E326%qO5lqZhbz4I5-p`({;%~^KBqL{md+RAnkj|~4-%f;DYTPBC3W!Sac z&}rH5&;-x9J4eoJ^x@#4DSZJ~&h;4tbu#L(5vR)5U)S#p2*3&F#YC-i<(hS76>QtS zc~)?ypNJZWT!+vh?zI~RQ=nZ%DFKsVjq=U$`2>;6;H#@TFdiR`trLwn$5=6tnN{Ds z$0f&HL(yQJcn^RqU^-;s~aLw8mglV7z%g?z=1`$k^4ljq zyQx2toYkf6mpndu?MV0j_Hu*WdF}c&-nz)C6spjdFHk4M)SQdM*QtAcNH~YZX2~9) zuhiUkW%P1C78W6V%FphdskP^}xa@_+&C2+m4zhvscJ>48S z7OM5w5u2UFYx;h=61v`t`hfS6*1t_)}ok< z|BzvAYcPdBqKKs2bo@nwM6#=V+LLzOaHT~Vu|Usx7b!6JJzC9h$%>y6WOX*Q0gFqjjoJy2o&1j3$oh}m+> zQO>%cJe}rI7U>Y};KLN%>W{dEw#i>M!xWXy6Wkkj_nzj!Pzg(2PubH^c4Ns_GJ@*P z7j9Eq<*gT^we@s1jTMKTL5{+0mnZ#fJk%-0E*|zGo4g%i6|;6Wh9I;pTSXo+irylp ztO`|=G*~li(iDoO)e^A`OJ`Bdnz-g#o6^SA)$ zd<4CH3v>@osAU(NkF`pF@TCP20F=-znPD@Wy89`C`J(`w$gEMPRbPd8jZ4Gh&vz_7 zE1y20-2#|6HX5RhA_JT?QrCuUIyMx0d{uAQ)Gwm4VC=EvK`WPHl zG$7VtO#Fv@7}(sLKl-tx9P$Si`msRJT?)2&Fvc-MXyb_L8SGe>__B?MhK}w(4eQzx z_VJ0z^lvn;lK+&!3D~w>m;&_R5Ij3vkp`DJ3LvhPG!CO#7G3gwW)jhX9_uBy6cDh@xPZOfq1+((cqR+SAKLTc{vYpX zhBe3F&nG%S^Zz1SxFhn6-z0SbM!OHZOEAn7|F?*M28EkK?3us@&zPs=T;AMSM#eQX zywg!8ir>sM{OlY^A9;`zLZrM+ma(K~M1*O<*eUi?KN9iyQbO@$SsL95UtQ7NzKz?t zt=*LVv*v#a

eRj0u+6n9PMK|2vIM=KId{n=opI(nWvooQ3cqsW&ka-*np+YCvJS zJ_=noJeDO@pjPvneFb%D6HjR#n(M*zTbtsX%x3a$OEMR#gn2dEL+2X()V~v}W{1z; z+Ri;4D`E`AWElH6^%C)SR{~~2{U5YvEzMpFB%X@%RA%r0PS4p@h&^MqMvQ4ZuQ;VJ zXV-JI!L7y%F>io#+NL=C)Jfp-(1=I6#}%TDZSZa$Lue$F*6PVqnBMm~HKe)L-$)pG zs;Lpg0s4hHEYC4DHYFAGtA)QZ4?ZrcizmL72$zGgY|CkY_9DobtODgK@2RWDMeIgfZBa`SxyVK_P4E06T#tp z2*(iX8J~+)y>YNO9}n1y_VQjd4JT1p9p$=lp3PTRzQnkA^Mjj)g&Zu7tQ zZ5j_7eY`uwu9mDZoG@r|!T~ok4eT2vZx_MW=*?&H&l0Ks3k$#+7;v%|mW>NNPD( zKj9{Asby5<^Dz!lA#lo7R8&`!Z&BYrcnh?jWUuvky|~Dq-qtRFs@5vHi2L>|&_t@O zOXKbI@8l>4J|F+z#8J=t(-UAHnPDbk9NAUPg>dIvV-D>3j=?a?hBrxsrQC66r4r7&bURW;^RF5w{&SnoHh)Yrx3a z-TIO2rc%_$Yp>k9`z?mqNXnpi+bq}5Mx(dzJ~mDdk&*G*sR^x>rqR-py(iQI4!1zp ziC2g;!*xra41;k;6c4KI{(izvKQSwGxvUZ+XrD97LjdQLygK~5pPV{6*3byqA=!rD)f31h zd>#`XJ$c10M%-g_MbzNpLWl3Mj;#mu@XPw!ujnBQ_TC}X#=R7XG)t8%l}N}Lp2s(n za}@}b3c$3IKa-5|k5C>EVpi^P+FQ zrbhpy`A2YArkSpv2JH1+Q|ImD436{9l*iwM}Su4-?!XcIys3w{Kh%N=;L`{^%&YM+m!*m z2Y!d}>uGHzt0y_N(K9%lB8RkQJi<cdsN$x?2FoGz)FPrT4t%&r2p`nXtH8l zk)B8Rhb=TjZ?2x_JshZQ-a=Uwjq%WUO%AI|$&%DkY<55Lh>f3XJj-;^0Z;jUEG=9N zd2~}`xGY-@&zaThDOR*y$gtcLbs$60yV{6Y-}Sk{pP~Pm!CyrW{P3ec>Lkz=EuAs6 zt~J7teIHNe33+&8xLmLb=ibpv|2nf$^c{a34(6^6uk`8dyF>h{>mIyh#bLZj?{;f& ze;$}IEB;Oq%ES5p*OGB&aA?W+Rb84RRoAITTg3&plD=-rDqhWmioxgWehg%c0 z%Ba4ub|HaBE@cs)L2tw{6QYu=w>f)F_|k>^5wtr0Uced8c$bd|;)W;vt~Zj36LBNX za|pVK3V(5)GDMLBY>48zANW7Gd+Vq=zHVC(2_%qUK?6ZTaCesg!Cek6!QI^<1PFS9 zyK|6(ySs(p?i$=RICPQU_uY42_kE*p_vkU+7+rs5ggWO`?Y(Q&T64}dw_=rv=*w&5 zdc>M+nMzjjDivcRk3r2-kMB;0FU_&V9OS<=3RW1*k-4AoQbTxdx%*6Sqc@q0y9hYE zK28Cd2atQ{?gzsZGqUIN>pPv2(X$v_)ZIOphOY*?++u8;DNa0she}90ZAdQ@e)7vP zvOdL2cM{cs!TIS)j3$YHR>nmKV6O1;#4qk471{HAk`{SiHwoWjwCp(hobAQFb?|iS zIA4+5csg0TwVEnHG>ep94BcG+DnD(cLSU=lbDxbTbTjO14%C6bVV83I0cPSN_px|W zsIZV^#%B+!X@F98PK&PYJ}xT#&%Ku`dsJmjiLoV8JG?(NGBS?&Yo!_6f&3=x7>Q7< z0o@EDY%;2b1l#o7mWQnmNRMrq(fmUM>(?}p$^I56 zq0jiOv}{R*W^|?Muu>6Hf=BOL(Lrx(#R70q)~%U`g_I4X=CDHCNLWecJ7q>ek#yy_ zQdKVgM`bSi-B69(+*DljZkqe7USC!8jAXXct~Sww`_-5LsgHf076$9ZFc=91zs|36 zj|NMaUga}rG0Vsy-AOq zkeBTgcpy=3azy+4{eia`udu_ozU{c;2v8bUl#jD+jSV&o9eV`K1kLL_7WkHqK zCfffnpnksh%h?RfMyr#gbvndVsr5sr*1vncAcKC2U}=#|UqjnofpK;ifnlg;=?ik`k(}Imys# zIqg{V+=01^j$iWQP@SB0(-2AbRu%eJCzxZV=Wa(Gt#mg?g~+>q9c>zcn|7$>ih@wc>{Pb$~$>+3@} z(SSn}9E*EF|LQxkL0leWJ6#n@L-y{S(mL*uEY10V^VbSk6}T<;pzHDt1W^E|1CCM1 zqYWGi%+(v68nR7zN#vMqeisiJZKrjINd3z#IE!x`nNyl&L!5YT#BdV&jT}VN;R3A6 znoABV#C(LaP~N_(|12vnDmya;R}Y7#mdy>dA}FMmT~LtfGte7<4aMB$4l0;6M`9MW zR0`WI7+Pz3ef`yMGb6}V#;5?@uI46~)+y{O{Nhu}w4w)yX_!u$kt3 z9XDf+CWNJ&>;7oi-yE9-Wq`H4rR0Hmg#Tw6q*S%QwjRAis?->X4}or9Inr|nGbR9` zyI|^_x{T_=XnLA6E8eb@iLANDFW5j!w|hEY3(+^uQ~2<~eM*vH($c%WO6ColG$s*z zWis2$)D*F0pYKfnUWINQ?6m=ABxwf@e}QK!l#EvIH$j`zZt)58U`i#7+cuXnVNHj};{9?4IBd5&ipI|9=ZGoa%n16DeOiw^CsdF`k&z#EY zg&qboo7lX!brC(F6Y1bgNSdIA(V0oaO6SW1HfF-h?XxjoZyj@3t6Pa(#L$n)rsRLi zu`HiSzmQV-(6_?&?HCv1gOa3!)V}Pua>QV<2xq>#u+P)83OcHDEKc{`h4OO9_LkHG z*RFg1jtR0Za$Q}d-Sm{GY0YM`$zs+m`gZNPJ4|bVoz0H8Mbf#>ad*W;DNM zZ;3-X&BiAu&4MGn??ZN&^jxe97wws@Qa2J<@pEb=`*4Hh!%oa-=(r{@dJf$_e(Y>v zr$oip#L>4ZC}z2qP32iGq&c4Lzb8eQG4<*We;0G_wwFD4C>U=pb5Uf;=JpMtW-FJN z&vOnae_=d^tT?oM^Nu^g>@XLCfQ?7-0LDa5>IOF{+!w=W7wSJ!&N`9!>@=%Cqf!@; z+9z$H&*J$~fgNQT@a{l7;zpUCZ#n+6`rVFKh5{3gsU5y}A;*pe-YCHm$&Y@{^VY$2 z7xxGxlkWM&&1&7Kl`g*==bxBkvnn>FaD1p%gEy9pZq;MlvU^B}?SJ<=hWLFG6>};m zIZ4&;vFv%#tp+t(!!7B%WKOU#n;tOLnvpOd1-<<7KTrYtiHQ8qn1Gv#-%BFkDdC&7 z@ezMZgT2W1FCi<;;%^TZX}Ra`dIkUhamzpd{BJmI&EnwVcC2;?Gr0N%1i%APzdm8- z(xc?hSx;E#?X5HbSP%o^o>}CoIX|$X|$Y4GP=3~lVDs}m>p%n z{fnccrzZ}2S5g=SHX9sqP9@|t{i@j>KUeLCQ_bM$d?WctSk zQWZG(Pb;0ktZ?`b5N1y4QUJGmg|ufHHsDMO1LKVhi`P!U#l^MS2t<~8FyIHaSPnoT z|K+f_lEJX*c=hsgoUSnoh`7@&K_0t}U>Qm#_>_9N5(`df zJ=t@W{rwhK{(R5)%1;*5qoNqA7iO6(A*~a2IXBW*^urg{hS2vupK{;g&%NT{^S}c` zpZAE;4*wEKCwyC)hJkHLO~)!P9ku#}Zl2bxBV&&s{@KY3PVsRq=PE|l2*s+T2 z%geGp9N#~iS8W^HPnD*9!6V_AT=lYdRwG%Am_5@3Ke-VYmhE@$T!}F+3hX-SO$8R5 zzcU<+meLR8xpOZWU1Q7nGuv9-JfgSYH%&A848Cr;>Vg-+tJFuq+ z$h@cbPk^3V^QkErz6WwN^t+AjBtReKJ^JZ3GFJvQ>>^ngC9qVJ zC7ZLXWc~QLJboAxvIZ|0(D$(sA6g2XJ6fR(BU7TUyr`(84 z8~wkr0AIoAf0o4&>;t}ElGFX>Nl-mgNJXoWo=I!Cn*iVD>GxoX{>Ltsw5(I%mdFcT zX+y)0_IN*C>>LOfNKMRZa3 zxc?$-cU^G5AqkDySP*x5^oq}-^pV|qzs!8lKj5X~cj=3;kioEEx#`8>r605KFHy-n z%)`>_LxTZh9KD*m84%&e{b8iph`z!X%~tDNb;axU;Cgn#6`DiIhq8r}HFyF@^dEE3 zxSo8Gfmnz)KS&3ac<;y5xIkH}YIHLDUCyQ+L~d|7?MBCBtM~T~4*n7AGe>2zZ%_s; zKD0fKahFZwwSDlt9s;*DdW$wY{aTk#01I5+SQ4;;)0ECB6<}Q_C#lTOf*Cj850s2w zl^e4OI$Wx0#dL$3W=e-XV6JbKq*IWElKx$tqffWgFcZ61J>SH2EPNk%$aAto@IP(p zniyJpSB-tr&NlEB^mpcY*gt?S^tYkH)vdvY?4?4ZhD>7O8}-`euG1jIrmwxNE1;5~ zSWvE>fW0<4QvTVo+W7J^YY5bOdcW!2^7u_*>z{3~USbTp{kkDoR{Lb`D`#@$41+IY z6*4v65$?0hz)_4nm;BMD!7)jgU{5-aXKU2$0nsZ(5sdIe6nu0s0VmE0PhFX9Wcydl+V=@ z?dD6K2Od;!wlzq;*eOq5y-IYewW-|UVYePB9&QY}L@1|J?yXqe1dVridsglB_V4)c z{nd@n$;kz?8d|B&+E2ZMbMOd22iC5}qcxP@wbXvK-mZeAC_WufwsA>i^3c;K)HrcB ztI99VZ#%#3;}aYbIvetB<4(UE5-VHrtu^kKfj%}MBLO!&obyqfmviHAKv`4%uv+EN zDVEF>vSA06vTo0-A3*HeDt#P#{(=Eb1%Sh3Uqnm(HXHhl`&tYUBEA_aT6mOb29`L1oZf_+bBGChm)^GN1bxl_MMFKjBKSo#yjT%;&3a5O{Y&kK_g8~ zGE(ACdc|-3wW=<_^y(ZFC4ZV~`aq%arNOSq?J6Y~^>eQ&P>CBai;9!im?wJR3BW~m zYUK6ca>5%cnrWJpg%plzD*4T$k9E1C$+hdd6BmJP!3N_tBQiUpv zE+#QJHI-R_00B4_&As3IrR_AXAi*0aEwl*Lsrq%DwUtG>r zJp=KJ_(~yofGGqBVB6IsnM2pt znIZR!y>}_l%4zz;?DEp!{V>i}CUe7u7-$A(>+QK1oSm=5kF7MDbXJeAxV{PDt77r`f#~Wm=i)Vt>*p}1tL=qt-=^yneqCOdO{$i>;SAiVO3#i+WhZ>q zq7*_=%&q44;(s;|_Lq#`&{sYXxTYmHx((IodD;vrd58{a@eL(W{mlZ}2}ko`>uL|SWKyWs0+NKfY1 z+Ai`tb`7ctVn^pYx?W|{8EDYE}x;W63A^E*^FQepYM6cu{5F&TjyT$G;e(H!ENSbe2gs zcMTx;@#cVeJ6NW1kC!zUW1t^k%0;b4xc7ZE1%+y9-PPnk0W*V}v^ko8=;xgOg$LZ~ z`7XZ1gUKYIuUxV%!+V&yidKF47{bPxIxOpR1VMAf&O%`O`w%=^-r9-R{A5{i2b2u| zWEJ@UL;L(knE%@Hb}e!_3<2f{r$u+fs1lfkcJHq}28x0}#K@EfJ~{j1S+mXS2Yh~! zvLJ)Lq!wrlxuAY7vhCKs8jO-WtLp3J-{5aZJ-A`O_z65W6kzV{gGx$Dx`N!FDL&8i z|4i{=0aZx=xZ{h0FJLF@>A7{X*6P*D8WySv>i#+ft3Mwrxe=N{r05at2r*A+D zF!lu;$`=tRltx<{5h>6{yENuMC;zpQg(_@pnMb%Vw+PQV`OM+Wlpz!0y1>@|%;Y`W zA8G0HhnM$$dA_7~*#NtT3H;x}R}mmp2RI}RVCeoH{~Mcz{~y{9X9CztlTZL+Lw&si z*L$1+|NiD0cZ!I^IQoi(_i==x(EO0~>}p5n+1Z4JGf;W$ z5Ci>Zz>)cK(BynHizr8oA9$D6!Gns`501CCbe+XMf z=*wiW#u#iXT&YkARm_1*KOJc4BYy8w%W1dO#4fw5<4xqNH z_20$d_cix|DH4uOuKbvzu!-NYbJ@_rXAw@~HJ8jTO^4>Gop^^?R&rLN;j z4Xk=t(1Uc(Smdu+phWfe&+%mW$o>wbCgTyPnOar#+M^53uQjks8n6i)#YYMo_{|am z(W&?g4j&ER5aZjA6!c>*wQ6%?P59-Uq`>dfCP$FzS~XX4ak0|1bg zrKJJ9L|{DT&f!w=II2k_A0M=b+kM7dHAIxR+RX)IKy}@>+`p@eF90{oq&D-x!5!OK zDtR;?5^^aNtko#7JFGWmWMR(sCL)pNkXaDce2jg%DA_4tAG9aEP1ZzCv!ZZ(uGe~g zbhXLT`HuZAE{WBAuT z>h*pNBSL*6n7u-^l1HJ@BR`FCMMWJ>klZlN^tBm4cR)kg!iGv3GHYB9pTV zN7<8j9lWU^P*akN7*jRP&Aq3pGx}xI%9Yr;YTl7rIaz%mh5Z3q&1Tz1o`tcT)D!1~ z;xx8AsJAg`*N?`nD71Fug{r7i<5X&SJDp^MedOo%xumVLE*0>U10L?>?;0&6f4z*x zq8RZ!xJazu>E3+bwKsGFEy`oIU?Vg0P%mZx00N_eYfVw`6$A*JkUTFOK)ZQHmbx-A;>mr6%hpLT8ihZIe?LYFxj@Wu(P7 z3sfZ&ygyo4!p0BMdXEYNQ`i4x)RnK*NpkA;ENEv^zzn)=(17O|H#q(a0QQDB4oa4*OYR+ts3N&PNB&Vc;Kpbm*V4{B`c{#|8 zApuepL;D7fc%?RT_+RaiAaBmDv2ARaPfzt;Hx7Njd2#%ldAv&CKN0`c34wOR*Z++L zK%0f8b5=1U{151~D0qOY2gpBFL>Enw>-c(Q(ZnV^t$;OT2;R3{~ywVkeLm{iWi* zSedSqc6Bh&S1co1QlBe98L1V^1v(();&*92hMtKIrdQS zF^@S4XNcSre5yER=pJ{|Hxetw=s+CmX3?7~F80H*@7LZtF%89j1e^9;1>GCQ=+FU* zMy8mx=;T8}9Ck@7y?8y3O&>7|9p@w!UapObLe{)M6!y67T(2AcmREm9%L`!cD)q>m z`bJ#jme;^HW|3Q1I!RGS2s}L9rrp=&<>CdtJ`8)EgN$u=ki0-md*dV(_EAQwUzp0o z=Pu2FIBwsS60qBCB3NE(goSB8%zRrW!8UoTUS`XjG9(g=+O(^EbK~yd&c0g$g(6!t z>>%L7+@gz+HQprP!YGJEAagm8ZM(oRU8Yz(EOaeU0%_vn>*6-O9I+c-UbIToET7AC zk3Cm7|9zA#r9zbz-wge_u05(xK6PXyDP7?P9IJjz~@INxuLf@Y|QA|9l-$MbJ2qmjFHmmzUmNU{dHOsCq6S z_fq>ud*_#4ISs#m=}}niwEBq%ynV2-(QU%Z!^Jhburlv&Y*`dVlMjJ36c$S6n44Km zIsx$k<^l~!G=ZZYVfu{>etCy+S+7TV8xK0htPh{C#w5l2@*eRo0o&&fL| zpH*S%kN>~xRein!nExFcV6@}B>P%?Pz-w=DDbKR%qvS;xX~QSgxf9Y1{Kr3o@8@%q ztbZe!_ronbov?a#LAUzx*~O#?GW-Xz8f{UEf6(oeXIk`iIR4G9(k-kqZYKNpJsL<) z9M1q=-baa?gA0m-_ zwA5DeVvV_S==fxnWM8a%vId)x z;{Y3iB=RW>i06a@EePLOqg7?#{0}BmQueCk@_deYQXdV7#$0Ysmz$Gh78B_&FLT86 zY@rk&R5Vq~&w{6+O%c7d|r`QQdKy0aO?07OEn53h?@h_3zQt zT7!>6+hq3>L6&x#(GxuXj1T9tDp;-H7_sEwlcr`!qxbjHQYDdQPbS(h$v2^0yc1yP zd^R()g^|U-#`F1n-0ELEgaZ*padGjQO=Z~@fe~WkF+qcxaoV!oUOCOhD#izi*qrbF zJ~2(GGtZxJnhHM0xS}415H*aGD4U9V9g zy+R2+i*BB*=EDZe$^L%!xnb=8&d>_~nI&Eflc9*YE!zpx_@#E$p+oXJMI|;?r|+-x3Uj z)_k*t)Zlh4B1=9W>xMvWqaup1u0>Rj^y|YCO0J(pflAcQkZu8BXay_k7agF%XDWdFVm; ze~e9z=1*^UU+0gwQOk1k?3UTeiN5%|^!^f-ixOc@GYiB=s&2C0E?-BZ{chG1uUdx~ z3dcCi0RwO4_!rhVERl0mj1@woP+g{{6OD1Fxq^X=~@@_ z>obB5UwB`W!SIEgWRRg`e-RpG_m<$!_l);u{Q zy+%_R_t{YFHg&6F7kMRhe&V zv)i!y+AEM+?X)TQR5719;~H+jqQTgFA9P&MKCay7>T`(z3+S4G!ULx66Fom#am-W2b2 zV;o04K3(P471HSK+tEC<)^7|&p+)44AFJtk8L-s61$v}j0J}Qb^lI!Jm<`neSes?* zgU5}`TA+7-8ND0BDWf@vGkI*xe)8Mcu*w@E{$)(uC%C_U42#_G%40Lj>2ur;J;-d!m)rA&-L1ic)0_lO&K0vQXmvvTR=3sM z$(CNi_QO${wl?e=pslOQWL2=a-pNWG3)?#a5kAi6^||j{)V(W^VAStF4+du^&WJ{< z8yxjwT&ic5x4JZZ1)HgfX9PaElhc9E)>hC2w>$TOT626}YPs9c+0PHa6KMq#=ifH> z2mIBrLFK~R?1Bp_?A9mv6a=8NS8xCV)9yU0o0H#Lo^qp`^YQoAP|B*8#qaSE`Ug&0 z`9p!c#CKI5o5X2gZn54WUk)jW>7dY9B&hIS6#9^6%}tXOu1q{$@;)atcO(`9knt_E2z7<_CEUmf!F4 z#dmyJtbVb7W4l+DwnW%+>-TRA_Brz1^?gGE&{mIn%C>UvpGGVi32wm&06>lSPuvDV z5XJwyWGW?d=6UOq_J@ETgSG##;~2GI1kw_}yO#;PpNg!32lgK#U%Nh&1c)S8V4(o* z)87dHQWzAJsbM^y{Ox~2LV*h-@_K{VWySIQO`Zf{J?joH6`b1u2M~%PviJ<3jbzmI zIW-Dohi|HX12}VZZ}M>e=Qy7dDg`n~T_fJ~~ z_H@^)>Oe%`Cy4+50DJylX0jY5RT0Uyg^0XdfVrS33^gyGhzj(sDWgO1^npx&I@$Ry zR%{$M@#{|rt)awT{{9&#cf`JVn+~ulTdDq&*=(!&S9V9l2fQLUy1po2=N=9g8X_&i zb>{alX#SczkqlB1Cwj#*6|x9lX@UKZiK5d0ARQ^md~4?}x!ZrgNUS{V9Zk9^K9s!i z*q-`gLPY|VC`ORPp6L0#a*Ob6Y#OboXt&yZky{P}rgMixF(EuE+B1(CdcQ!7yD+#7i#w^h61jaz6xP0vEFY*Tx?|)gr^q$T3pJEbbfO0Aec1#)FiZy9DqwA@ zIRx}L7g};m4D4Fet6VHX=m^Ruj1#yO@k!lv+YT1_BJw zF5(ZQ-Z^h*l7hl7aZV&5s_(1Vm~(B8BVB9FFJL<<{*49j)$u0>BjN_4#7XQbHKQa5Hd$S@tyPAC; zLf57t86q8TH&e0zlJqKIN7|0tK9DIgx(Sj`@1}GHcFwU0(hH8Im<|w8@Hf`if34Z6)4ilPpGKvN5XKW^kox2;dq^InaKeFKe8#QNEAB;EVRh@FcFBc>;)bAv4;6&m_LZf*KQetgyr zOpHZF_c=G-YCcv|3Pn&;-%bm|I<0koO>KhajMYI3n`Mtx8e(XUhdSq0#U}okSk(L*S6!NgLzs_PnG`#mf8k2)6YM@ z7Vt?eHz={@N&Ni=Sn3_BYm|&V;Wz)h)o3ma)*JZ3RQ(_yPKV>{H#PANU}#L-_!2Na zcGqdHcp9qwaB(Eya4RowzOU9?`UI@=mq4-^VSvPs@L4B&{4LJE&A==cdf(MZ17NBN>Kei6@DlcbEI z*@b%gUU{yjsnHb88#=W3#>$Io$YZ=fzAalN9c34-@5`aEtCYP6I}rj%W_1h2+RJ@smnjJ;ITnA^Xjw znxL63+t$qGVIW^6eDSpdKoin}-w^S+ZTwUm9`-Ud#oaR(5%Crg=}KZ955r}Q*3EJ# z3l2`uUCCCutOTZw;2Do3q>FFoY|oH?KtTn+!k9F%dGtRb)KFuf27$r4jo)%}B`1%@ z>{%BFl&6gqSna&i!@*NT1!U_dlsO1{@PRCZW7N4UI&R$;1)3qD#OVCegT|W}(jUn8 zjK{*Ff1(A_%&hL1liFBI;uf`E;k>k%vK|S?*ATrNd*4%i-7Pv_UG4R(8|sbDmx4x! zIk4$5({tDtx*Y2x&{EO#CKN&Lidj@$`S0^Q_&>tHsB?3ldU=bx@YU4S5wMzQe_1u- zZK4I$kVX+)%G3R!Wnkd*x#t2I%6RlFcz)9@v$aye{1?l|T5wMgT~754Z<57)4UK?< zxN_P0JG$&{q&!CSqG1@f^SgESG0p{(Iy4H(@4v=J|+L6eSObyv=m6Das zRax`XGU$7(FN~>p+evCV%zwB=l+NX$WEYJ^$HmStQozE-`T0U1-aUNjOlN05ii8 zA;T8~7_NUHv*6oF^hST23W1%`7(KK75W79b%O*J@J{i=Qo$z>>q4SJ3(tdi=B}&iD zy0IimP^O}3QpRt>t3T0x*+Z7CS*&iZU7k85KpGj|!tZ!6i$o~sl9iRE(%rJF4M1ia z+uJd^Sw0N%>4U8J$4-6dKmmTs64e4rB!RZB$OW^A@ZSDlpSV;Vj~WN5M;UWV>_o*_ zY3eXn50HKe_*kxCJ_`H0x(OS^rpRfkl+Ag)m1KmtE(N7BGGcbG+QAKt=0Uw2$7*jNrr&w;+FYLR)a~B*0{5ld*t&i()^0}oISR<${o_I7qZ zS35*JSQ0L;N*f!KFOb=rq?}JtpUjk^2-w?U(3t**ar46G2Zsm(++L&F%M4=7^T{6{ z_>tRV=jZ1$d~W?OLdVRweC~G$QL};k`{auVrTX(b$qo}BI0(Tv|7S{o9qak8i(jXw zd7WTG{)NZ?i%JAE>BnwfyV20T^QHOj8Tt!3S6CDnG`@e~b0Gr>i~z!J2&N$=iLC2 zHN#-rZiJ_M*14dYyHiQ-NhiNga1Ovia&vPpwLSPNTOO^hejD7)*+&`X^f4+KX(qiPEGYRqA%`(HIe01ICP#W-Ls^ZHPCap z?9bLg83E7f(u0|_Zfo-grggU>Ti%)m=ILlZ{L zRw{;Y`XO4&`r~7XUMxAU%{1J_0q~!`peAvFj{wmRJX`yQEv-F3G$-^p=M4eYa{p#a z^UJpoDD8j+0D4D$)n=)SP_~^CMvWYSJdQ&|16o?? z52g;6ka%T?lLwKgkx@;{6HlOJ30y;BUal!5E-sriJMP}!j?k!gF#lOYc=~HxP`yRX z=VhIssfx@ZS#*^P$frcJ>vduVdiJn-j8d-B)y3}~tQTSkj?xa1)W=7<=a~mBb-%`U zen(fGlk87qXDcr+FF&K>CW?hB5D0m09e|D3R4-0BR>GW+JQL3dJb@}EZ%#4otK#rG zF(R;E*QdhhJ^EY3MNyypF@mD1SxUgbzBaVh_o!4+HqDK!d!Us4!>#f|Eo*-te(5L~ zwUXa(OV(n!#rr96ze%9RmGCK;yX&mhR3b%!*zPQe#WH$U=hH72h>?o+ktotkbEwvw zw)V*AjwDad+8w`e`HNOkLwAp@R9w!gG5Cg*>Cz{UCp|je+$id+9H8) zrKZAEL7+3Y;psfu$%(rmohqh5beh3^wZR7Q7L`vHTlZa!=0 z4z$9;JDS}9qx7qd`uZIv;`G{QX8k-dS`d6Gj=m z!AT>Q&V8v=ija}(^zemlZ+?o8B8K9|_~sh9-T_lLW5#f_rS?*TXuoAucZjriq>TWx z#~i?g3%^~tbFw-M2I>hNx@1ZpQvK;%nCIL%q{W=t6QV|#c;2o2dp-TlX{MS?bW*g2 zn>-;SC+J{B*LiPEa1bkMLELr~yzR2AjhNAo6v7Oft}UV?DQ97^)gOsFf+2V{T`741 z`6k_VB2a!C<7MGe>ef5Hvq}P62%#LNnjXE(H8lAByR*mUvok3x`{wFUE&XYFmBE^N zgf{KlJLESt?z{bk4cI)WHOJ%)MMm9A;B*eb!+HKt=unt^ILZ~~51v9YL(^MEr#pk? zOWKjwI@d0AMFn43Il6;yf4+yPO44XnvzXIe_DkMgoS($jynPa_Aae%1iYGNFj{7A; zm<>fI2dHCDyS@5vYhEtIOU0erE4^Z$$d>1nS-9z-df8675kk{X}LdRMWK1)P0O*3Rom@;FRF-idLPA`95F| zmXSylIviJ76K8eJ+oI*Q##_q?k;eRtkiwCRZCU2a2t>QA_pER5yl4;Eg$vmL&@cP<$ot z=c2_EJTTDhH$L7mYYR#(jzPKqA&H?IbbtI9ckkV*%J(2?FS5+ceVTr`O^)%W?LfVa zzs^Pdg1A#cGJVnhBDb$uc1C8--mHIjmk#+chmpZ!lx}ydGEeBj zqWV3cJ5ERvm0jPdSGcRp*_34v0tc3lNSy6|p25`}itsSE$KpZT1(i#7dMk9s_ek5j1rHP z(Hw{N?wqlee}3a(786{rx~12U8#Cg1)a(QAMe0L*b=TJ$c-?r4IIBa$53-*d?mu74 z-{NDZ_wp)eQ_$0b)LX5izJ9;YKWJ)o-F;&J5s~c|6f}e?P?hfc>(Z;@pmL7e?9X}B zU{#xrS?%_n=*W$T%*G4B3SToLl0qubPGhUnsEwcJDix)>y@vOKJ%#egC}!K!17;Mk z=^XGjFk-3kU#tiCaqGEuo}`WZ=*Xcd(oh-A$8XAOe}+<6kZXkG$z<$kcokJ`y_LhE zodMi6M}|wZF>3d}x5K)71W9T9y#KWIFDQ}Y^5^77T2tTEBx5IE{|eJ(e_E<#FZs^@ z=&IaO)<{xYWL>nbw0WJ3JRaR9$6I)se$mwD7S|SUvBNK=;!AZoz<3o~PLzB*sV+7) z<`7Y6=<2;U5@Imtn&JDnBw2ISE%>=Uc3WCwO{cioMPetmTz@asmJ?!vQ`tA1%(kID zJiOs_^=~XdKIx7|yANC-t8w{wwOJC-CxG)Q)Q7w9%N-@%ZGfxu{7TzTF3sadiP$>t zImTexh0v4mf*X%ECHiN(Mdd3hIjtpzphjSC8k38g z>b5*A6y$e`R~ew=r^$xR+AlKeW$VLGCaob*2g+=R`vxy#wGK5 z^Os*HNEbm;!cN@Ok|!-|=J)pYSWSnqu+y?1715wY#*?2M2sRv&lr%(+lr9+oCf%)k zjY9&awnJTwn)6jN{|)I1jE%LBq(;`_D$yrF>t>K%elTDxIQS+8QD zR8BO}ufZY!14ByWq|v6jc#Q!)pYY8@R*N^;jGc6DfyLUywot1;%h<*sn@p!tXh86M z?ItW3mDT)Nh#1Ebn-X;c7f`BrnO8dBGhb)(~b>BL;j<29s?=eT-g+qEy` zBHj-lfy`z6SKM5keKf_gv_)IMyjQWWg*!iU*6(S2jM>1VX2)-+meAh_t*2|{5|#;N zneZ*lbpZ!xV0UwNw@lnGS!>B!r{_vY(#Lq@Z)n?>6Yx)FmJSQjKwQD$PW?5WDt0hx z>E|M_E$MRrdHuE_>n@J7KnitpqRGTvACgRMXYAa<%$1EUD7T6B&V6zZlprCuSg_BL zr)5`AwC-ozrj$Oom;`Y^dySz(ov=-~B_x+?N|ZArdM1+fwUwGinT=ynM=MdNEUTGB zI(s$rfxb*dIbFoMm#EH$<0l%#N=kqPG}h!48UBiI;g3S8o{W+~`Bw18q@jw^(NW76 zmYXBERv}PogSEG&f8zw=&QaI+5Xa8m=9_HY`Yf}u4YnGT*M&T5gV{%=@mucV*LZTd z%Al*s{hzW!bovP2?#A=~*q*Q(yI;<H)y-={AS%_OPpFW z#~n4ayHu}`F(x+;__ZZl-b-pqX{u^DUhWHg+^{J}>;$Z~^W_upA|A%G18HiDi(@rk z2tB^=d-Ml3#^eyrr;3Wg6Renx%cstcymdlgQI+|jzS$2-E69x0DdSGgMzc~^ssC+X zFHmu88*WWpO7)v%zcI10i+<36$>H9FUh=JH{pl`THNp(h*gJM9cBEB3?(u!-i9bA2 zuvFQ6N=+>5biAsCNO$Y9rXJ}KSAjbVL;H-@q2z|3!jv%Q@ek<0jPc;GjNICAgw~lp zoFX9FQ+9E&@h+KA!rqY#5n3i4*k_G(R;z7^kucM9g=Ux5#HnDVS-#2-;zssbM1b4s z&c~I@H7sMD(B1gF(LJjI@=%?U`hHd%%18IUoo@wXFM^OO=AgP{L57X6-530W$Pjrk zO$+NSi1qTixq8^AxhY1(kx|OfUWXfyY8di6a9XHXd>jC^lk%IzOTXm9iRoXnZ}^%i znh{ikHiKi=Fv(%<=`vw$ISHLaWVlL>{Zxje-!Lu`VNEMl5~pfdE-(RlbSRI8w!UB3 z{H0fyy!7z3((Qe`T+Wf=m8!NthOvTTSUH1?T0XPOu=It?7pNt>+6<(k-iu*{-eL|{ z@lZr1d3obQj{o=Ux0rBV{4ca`-JKUqHjsC4N-YAX&kFZ$TNF0)t$vetlQ%!r<<`b8 zsOj1y5aZzN9;ue=w50mOvwP*$YFj_36MzC6?h2l`JNLJ1tw^oi?YJmVpFm1rQCPKRztn#@>k?kml-i#yXoncUzb+muwqa{ zUuhV4TPB?)lm0{ANpwo{9hg*c8S0wyHsP*=q3LZVdlM zkBjsnMo>vC1TA$=d5NV-l_vbD)z~w|y)& zHhZIlIp;&(GB1wF&P63N8x-y6X`|4u=txooRdEzu#_U(f@cp4e;tE|UcK8| zdX28tbw}M5Rh%RphjkgGq2L4=(^m^r29+U5`IsHVJPN0e`p$3o*&O$0MP(@1eTA#9 zgbS3*r;5S9hkLOXjeLos8zE#05E24)DKkBnsp-{x)bqiHD%4ocGb+MWZj)Y!abJJQ zm41ln;&WRfdZ^`~R-qr(6{fW8DT5$6RY8UIk1?4&UOjZDA0JWMdY{kaG`7UW#E>fkXtSO;={8K|sp_nn&^=J$VIx4PUcMB*gV-!NV|yCO!OXBl{h-n>S*jU`WC{Y}~_A2I^Q1nkns`n0yTv zutvpN>96KWIZqX9pOATei{!*UviIPEZV1v^X>m%~eZ(%-ji}}^rD?yXk|g})yd%z5lNrQq_1N-NN?ltL6l@ui>DJ^ z-zK+yUw<3%pcub{I&!_gV$OQZPC>xH$>5Rv6bK6Z)sB|ULKMeQvJmy_3v^F!+$DWg zRz4iVvC)gs?E}(lT=H+oi9CVDx5@Z>TKCI4XPX5O@gfbO36a8gNncm%14HC*6^^46 zr4zmUSE0B?QA9M%FM4_f_UO^w#3{N%YsjO|mYvY2E-f7I4c~r6(MaLURS7le3D&CH zL%CXJXq$U8nS@$O)t=C2q{Is<_`dKkP4!EyAxNHBx-8I6xHCJK>dK~-yC7Pa(rpD2 zsm%jNgRMbNpDit)#uJs{yRkFYRd)eS4or?pPNR9&W*z~1(ZbKZF-)sgA{?Tj1*wBK zr?3%fG;IS^d;&_P!p~A=sf)Y6#XV_vLyM@mJ($vvNA3w2^YW_-0 z#G;<0^XJXb5T1ES?c9n~^wz6BUN_V6|6uQ}gW7!ienBeG0tH&66mN^WyR{Tbad#~g zFYW|sp_F2!xI>WuNl35+*HYXHB)EHU3oa-9J+22Ol~ON6mW3n;c>obFFh|4GIRO4%qQ)nadL zmbg}A%duEJJ}>a#;q}#ZCI=HPP;H(?N!`BeB^AX;RwVa%2c#{6jdL zN}^A9Bo);r)Eq>oO&v1tyGKTH7P%97Yb*6u-$NM;6tkzU^sIG;T%~l65FTTMSh3FI z)?`nEsP`N-lU5nJHyU$&nw-6l2MfqlP2gZCBuN4dvg-bJ;&a=;c^h=y{z3 z6Y$ib7Ioi^xF!ElpO6J#IUd#J4>v2l;$C@Vh6Pfl!y?^XL*8w2aG*p#=D6xAZ_J9y zpqC9*c>hdm$AKkyRlT`{JB0c9(NH!=%0xW~H`F_pL#da=R&J@Xh1ne;;1I0Og2`(h zNf+&64Ajr+T66?0eMKeLM}<*^-%;wjIbp&Kvw=!S>l=oNeoZSn5sYeglnrToON3os z)Svz;5&x0Zsq)R}e28gN_sf!7@7H|w^r}AI&$}dI^#S5<=`g>}@$t)Uoq1GDf~;H} zqrL?2XB3Dhzpmhv@tHp+p3U}{-V)2sNqCz3xMur}j8>|OK!PApx(=Kdjj0Vr7%dr9 zv@yx9K5ziOZesm78S~{}1Vg%-+*A{7{+<0O!n9yH_sN;MC6GQrLu7TXz<2Zb`1s{@*Ic|>hKVtVW1h;B zh2Qfwak63h>ZDL8y)D@)MDoNCLL=0hlIZZ7ATq?*r5 zU6pNC!7KV|MFZf%c|BJyw5j*FmUuL1X~y2e(yn^uIYA_CpN`FJd7kv&mX0_!I@-q( z(6@CqRP?F`h}?;itlSqS`Je15m?N}( zX|?AX09cUDC+F9H@#k`6_8V`IG7JCi>RdwTYb~f^p}H5&_9a-&53J<;oltCuPa^V{ zz&3-6yfX$=spa_FSX%gwE%5(sFyZ{4HCX?7@4xzz{;R3<|4a$=zo9(;x$^&;u+jfq z5WvccRRg1U`@cx;Nb_!{uw zm;}JJtv7r2b719{WUi&g3pzoy`}y(5;^vl1kg_i{gaj)=RaoHDLK_xb3Y8u8UG2iQ zRcY?>VHp_nchb=OnAP#MGkX;#+3nOUhs8^U0l$94ntfhn_>4#aXcFm>r)>=7KMY+D zDYr^^A-hLQ!6`|^+GN>9L-k}AD(+rlao5cW(uUOaJW<`TS;1m%YwzB9w$S$VZ+iA$ zRMHHzG_dwr9hKw7in#a$AzJa%MW7$FrM2OUr+5D`7yLURpSZDT{Bj~ZXnc9C6i;Hw z#-^?{g2@J&1=J_2cZP@PnyMZfGJJl`ES=HJC~V=d63$~p)y2&v^zBWUe5r(kx})-i zQh>VS(#DsGp4arIZ@hc*j^Q!d$?=TAyU_4vaT6av%bCZ+Tn_$!OQn(F%YLSB-emx% z`H~t^F}U;=sVu~%x4evOvBO-L;`Ut+r%gEIS!uxZ^*#86z4si{;>;g)0Rps_jw`S= zYcqEtL2lt1Z9A%MLGc&-wo+!subWjLZ*$I8OQ?aDYh|f(A5(6&i?T%>a@Msi)gy&7 z347AQITH=j_dX`LS?f2_=Zl%LKcm@Pb}W&}$jPwcF5jX8R7d@t4L6cXMjXp~G2r|x z(lD_bj7_A*mna2VIj>#TUt$Y8-Z#Mm#@4ouMKeT`0M@JKp84ku&oCRBr4X=<` zm{nDoK2ClnYW}Lj;=P~Mh}U>;jK-W*+hVakb(Tj_vd+DbQDq(doAa=+ z-tRtr)DFRQZ9%1JgPpoy+O77aRi&+O3&Xz^+~=YgM9KoZ+szTD$G_25>Llg_$-${S z>4R7<;xZ!H>2x!6jmJnL-5ftBT zdmgJ5?JtWBP;}z!d{7UznEwUd&!Yc}`@jO{$Y}rEnZPUHkoD&7OB3T1;$fHiZf}zS zU&&5zq#F|Tkg~|ByRigCJyr+^(0pZ;mUgRxZ)Rr-7d@gB7dAY6qpqu2E1CNS9*9*n z6U$08$P>~pEPkA9IGq^o#1W@Yy&T%)Pnz7u*qREGV$yq}g=BKw86HUQ+L#*4LN>i9 zQ^W<>Dr;=Hm_8j6<>=K(t`e!z%wvqoLc%|dlfHQ~p?!3yPL*H`xM zZvS6$=T;p54E~D#uvtB00bDp@Z0?uG()9~*gIGzDdof3}ip;S06)YRB1yT62o zSBolt*36$)Cbu9(WvjGZaxA;UbJgAn*n9G|@2g8M&>|lbV)daSP1RPz?k^4vi?;mB z@U|q73iSKBsSHjS{fAix(y!XapcjKfqq$OEb4vfHRGczTbwYB0K=;j3t&{eq%fbD! zLR?HtFL^jz>OWk6MJ~~QcoPdR&-xvMIe}4lIx&w(FfLZ6{r)M|D0p204hk-KTg1|2 zwQY#IqWgEYu(g9bSb6L~EKQX;GLMdOn;OND{JCS1Obz<0b*TcG4D0|Nw+J|dtD>Bl zxio0c}+C^`+YevF_x{}LO-{t_FI_4W=% z;a6*?D*1Ai+Fjn14Mvdc^t&xMPqg%q4np1>eQsNvAD-0z%J>rvLY2?_{&ix!S=}Z& zzJ*0(VehUv;aC;^%%2=Ry}8Xo!D#K*YcD`ktrQBszwGNJc&G(I3w5Ps0??!h2`pL- zid_S4yc$NQvH6)EVoOQ~GQpw8k0L`E=r{X>pE`gtmN}^=evUp#iOX#<)aQWKZeCcb z`3DO-4f~0r2VXkLBBK)8lSj!&Q@ED4`%6BAcl`bu-<10?p#(PAYWi8MI~Sf>2!WJx zrIMGV%JV8CfxFO^w;jy)pG768Y{f_*3gw%)0<=ia^RNtQT4}Z4Q0}~j2APbqw5OT1 zx(%o0p%mm4%YCS^c=`>@zjo@-KVFa-OWBzTM4rp}WT}JC@u2yQd_m5(#6fM&|0}%F zudSk_UvM=^>t$P}M(HpWy@V8ocY|yw?`AwhgY2U>pM6aOU;3`sW6lkROwuiio*o@3 zZ;uYrB@OCEROXbX|cqdhG4Z8SUL?TLFRHng#e=wQ~ zTcAdwSbaXK4-~HpDhnq1dXQS%GU1ijFaue2r9}Izz@FMV^7!sr2TFJfTJJxrF1!gS z92fk{d1-Bm`oH00SbOo4flpjDU(i@UXei_+im4{cJ9j&o2EF(;+lH@8a(9RMjzZ=* zR?!qw+B!Gz5KA53-q{J46U}ogNgRD8G98aXg)`xWbF}7p`7O$~FZ~0%0 zj)}40)P=UzCtb}l7N(i$DKD5`S9mh|ff+WUW7FwJQ@KgTKkTT=f{)UZpRE=p7V4j} zU7z^8#mdxoT8W=sL`h3GfgS}`u{)@%OU2u>B?sG7_8xkG+J3TPS-W_Do0H+x3jo?K zfK}j3VxA1li#u$|UfHAa3;2dv^}XM(nY4!$pXf_@lxDLU%PJMctN+f>1doBi`*-iy zAT@Lkw7q|Yho4jOa`eoG{dG$ICxG~eFya+);Y}kx;`;kx%XELNuDIRcmCwmGx*=Ki z2^L%Z@h@B-`>Ju;(2R>`WZ0A{tk5dZ9ozIW&fXQkB(+nuu6jf~a;Fjd;Tz^rGQs}z za?7heBLhoH`ZJEjR{lL()wQ(`-^S5TAHWd^ME%8#Fn)D~mfCf}OMZ%E><@RHdB(wJ zuj*N~JHk8@LX30q>|aQuZ$XOv> z2duOl2TB3{1`kWSCw%hv>wccn(oV?bnRJcTORN%&lqKs=%d7b;JCq1ae#AP-|D!SY zcUWr4rUeJc2RZ5}w0X1+@Y><|OXLp>!!Hqtc=W{RG7g&raQ?NV#u^bUY)Z)Ul+|aO z|NM*U3SFj4KknruEUM=u)WEVt`ek{&dL#)$$ywE_?<1sZC*&54RpX3Y8*lGJo|jej z$OnX>rPpIcgNHaS5QiRn1hr1#VYoVv&wGnqc^)p4)A2y}a-lO2g?$#TtFy2|wq{-J z5`hHs_XJ@fw@dlBLpO_PP~PkOF=ddd^>&yQ{^)h2s7#RHoCRRXz9X3~kuq(+v*D;S z;V@J=HO*JnpZRs^U|%BU%({ard4JB1x9g1KkXg81Jv!s6x0hM4Nf(#Z$xGC@fL_g~ z;r?QuOrXAWH8verP~!C%n-o#qmRxqNcCFNymN%7CDKV&8eahV<9moD-QDKKot_A?hV&%mE2Cc^j7M2WFE-X`!tp-Op35 z{(Qb_7zI8a4KmgqNu)1SH+K8=+>Pv^A>K%fAs0`o(j&Z)<>_IM#`fGt6k`C9FtJG&KTesz9 zE_2N!L(Pn`&1a?1cP2Hvigj3U5;C8LY+PF2X&m_U)CO;@K3qNLsnrJxj%oTCf;T(}3Jw=CY#z88Ym%@6eojnI`bxRD zjGY9&h3ZcqCEUTexc~Qw|38CSR5W`m zsm8e7Je))R@#95nvG|<5rxf%|Y~9T~OwaU^yH0j7MCp55gVsJzK8b&hxTifr4qtkpfq?u;_*jWjI&S{pAZ4GKvZd%T1TmIYQ@)&&5YZR=j_y zZJ-5OL+JTw-6LDFjln#5tbom3kTDP%d2A&rxvhN z-xNQW7J1i!3jZP55gc{wGok1TgUl25Z6i-IL^yqnzdbNu9GHqvc%7SU8TD(KtT^H# z%Fq$S^P^{#AZ1>^?k5p@{Q%OVh{lStiHRf?k zJ<5f@voB0FO}L~x4)ODA4CVR_No2GPD77HInu`r?t0Rx=zkVF4)R^@tHBN+V`X%18 zCMC_kJ7cIjaMT8e-?MSHiDuz8Mo7J~-05S>y6BnCo=}aoGplqj?uk)B3C1rmlFD4AyDof zCAA)|F|VdN7~pft4(}ticQMiXi(t+|?@%0B?Q(ScKo=M56Ih^vTfzJs+n{nvE%WaO z4ka1`bC4+SJ=^O@%U{2eqvdoR7)pBtzVL=P!Ax$7e0_8S2F)s@W`1DeLPqBwaKYwd zfLQi&pjyYUs-wBupI>^>a$XT*K|iL>`y$q*g?Scx9y_A+Y{VsXMhGc7Pkdi`pu0Rf zkP-odh6f~V)y~J2Mpp|)t{vfLl^dd>;?fp7{98K|f-{AZb4Iz4lb^oZeAt9oAtZDJ zR?3a3s1-;L<;(u20VeEi29CIl3c?Ab-d^D>E^|elv?I*9jBU=iLQCNSXkZ;(|}E< zWyf3jpZR=&C&*X{V2reIaP&9s6SjWE?_}aqb~7k~8l7*}OM5SU0Uq2)ZKknv@be@6 z{6-tff-|%_$qu;VBN)F&5;7~+KrcqY&aC$Z6RbM2PP8{Rzw7m|>PEfUy16=By9yW~ zRE-ZQDa%{Y3|5aHljbt?x~>yv84Bt@M!%Obt82_G@c3nQ@J?$pBE&fL&9B6iA&*pG z8Ngf3mo66(wu*6|>;A3vd#Oi>n=x~=_fIMfSAamvmlK~_!X`HJ{nigX&J-}E?@ z1tox}XmTIF*nn#_a7CEAe`aM@J$GBBVP~G%PjjHpf)Ta^R2>OO?3_?q+)^hh(>Q6&6ve$FVnH)%a zu)^pKP9*m2Yn|a*grr}7cigu>b@9U>NVLJTP}koB8@)#=j`;3mfCd5a0;^Q6SYkJn zQgorNX`C_K%Vhx(|9Q1@lzyOJ3QT&Y(4l^mXYPKM&+OSQ_0Cx-GR7|^)}q#4VDF>t zCJBWu@#s?^Yw=T`td_jf9-!dwLO$u$SIoYF+xfrU;t|!+yeG>gy%0oT+<|*V-dz?~ zRXJ^|+HxLNX-EQ^N`TQ_|J8JqrZ9w_3z2Uu$tUEll+PTZk8}@uNlMvqUQ-5vNjND6 zJkcArE$LQPA844ELcJ7|;U`QTeCWoAT1Da2e4Pg z2rggQ8@;M$dgl%xail&oxDkl~MUb0ilaP6}+{kk$_7cf2u#)ae-<2}@vZn_0$|;tN zQ(mx9c5=O&|J?OuqCU-inI~06m)_~yX}=EB)HxPjBl*wvPWJc<>iML_ zBZ!l|{Ut?ga+*H+drIGvpX%*3PHE+pI8kC4OwPxM258v zdm_Jcw2bQrN?kgMg!f;At<9pDp^u{@*&B{D_lcOcUX z1aRGt7808C$3?L~{I={^nD1z$iSZw^`#8t^*n;YG$5FLzebMbp0}zL&j-ZO+oyF#` z`@t{doP*a$fXcDT0dm^z!0O};g% zP9JSaa>bbnsGQu$$5}J-D%;4CEs8+z>XW4?ahG6gHuDf~ zgSO~zFG6B(J=*fpu)_~)gIvh~!*AalelX;V+}r_0nOD$KJ@NBM)Ac*ST1Wq22Wf(^ zQaSX{=1MDU(|IV*@yrLNF~~LQ)4O4oY)u6di^mqBM%XwAKS=Q8cGbUL+!0z87gtcG zLwi&SHW(3wf!T_GW^m{vq`zQpezBXybNV*N##&#QcobmmtrZ!y|HafPwE3cG!9M~k z#FPF)9IBg>LdzxK7lWy$oe@kA^u06xlVfnES_b-4(Rm#~&5dw%!=3p&_vFRPeC~JV ziqlEOEO&1o?m6WrSATTvjH?qjV%GIpswMD)ExF0^fM%=C6NzYKCV!Z_EL?;?5aZ)U=pIcGB)U9O8%K~u)l!0t)7OMCr5x&q#&HR}Qyblb9b z%9}<6xTiMlulcqt`;%*I?`EhPrv<>%6E-F)^$jeM%v5%BJc`O>@|NfGX#@aRM%g(y zx4e#3I8*h(^``f`7`c9j*_2?T;k7W~Eo~rPim&~TpV5L^X3ekSUbMYFoALd znSOyn2~r7HMmb)P73(D{aZ=RtsK3YmEovBIZDymuy;vV9eHF@`r?x=1va`c!NwuP# zjsQv^)-uOjfBJlNyoc~M6*m*gv>|x&vZP7Q-SRp^L)I|WL$2@e5k6Lbw3IRVN;t(k zDU}`Spl*^>??1by#!lLo*|$YbX%yIOvx<~BUxW`hHK<^|v?Ka$`0RT@zHZk=@KDao zuk4#vK~saD*bW6pNOq?=*~hi_zJGJlq*XV&?WuPL0R(kU-+>G^HV2)i#W?ydYh6rI zLd$3FU7gYK2L5#QE2qJbYRi~iqcacyFi3~~$z1!DT!{jhSm*NiD^aG0Zedvo%0R}{ zbeH@7LZA~6x>i;5i`r|t>`t@efU7BObl>{nY(7>! z4kaTGT&%1$Ylgx2&ZUUQSx>HGD|X(H+n8GW*m@B7y38bykbUbNnLs2Qf6^+@CQIQ= zwb6ZYb6op{siLga;~BI!@9kI$`Is6p*6zb5vJUY8h>n!~1tyy;G zy9j15Ie3KcMeBIGv9dRnGzQ$gv1VbpU1mylFAI)srN)1QY7~vZfYe9cJg)&MOiwM8K&SxG2TRp#9KMMM=Cp$ zHgR*e*PphCL)M0d_XW@5bqg~>m~pSi{PK2tmdI4cH|O+PHsKZNi#9xe&7Zg*-G1uA zHL0UN29Nw zNk@c_RQ4A`5K{&I51dn_{X4>JV%0C#k6^si30aA^;t?w=fZ*FBS?y!J z01Y)Sl5pAvMBgQ9ZW3inNu@Q?tN#emKF^^^5YD393m@c(-uvhWP)s#pA|CidVleuE z#`js&njJ4dZ2Gde8S&xz{pESz*2#e0lx1&P|IBv&*{HNYpzp=pb9#{f9PvrUJBtwk z*cHigx-bOgpe~Ch9c=s}N8mR?w0BSxD#-bAW_p(}1$BG(>)cPIABmHf-?YHy>*B%8 z9p>phG+&M3UQdk15VB6vS8D;>;5rwZFppxsq;2%@wL=j$CsN;&y2(?>?DA%T}!6sI3}%+lEhiV@(# ziNKBiFy)pVEemqxplJ*FBJLiU%dd2E)blS1O&X46q7r0AI?y$mKaJPTL~I-vt6HS5 zVQx-EU%!+9@g=9AbEuW(r~U25q)Ct7qs%P~~$)Il?hyxcOLsh!VSdS>{(#_J9`eTMeAID^=4y#0^r@Hmbo z_B_naV&^QJq(vaJwlKfooqb&04Qrtt3a8t7tio5aGlvib_qJbf->RaLwqKtw>{`7> zhH*ZLr8=dtyt)Uh${8RueyU7|0YC}Ycn#Tv=u9FoAt#-`h>PD1t611IVdN~tD$=20 z@o#l<@*s_8w@CODe3GP01_@N^ipo)u3WRb+@k=%qHh{+sh`Emi~y3#cN+Gy zTE-O?jxgWH)&T1WrzFBN;2X}S5_JZkj_IPzp{!7R_2rjOf8HKchEkB z@7h-fdRdRKhG5A?^WnuQAskNItXA z>-Rp}H-)cV zx@b%NkK1Zk(Q?_h&nPK*rO!u((3>xD?$!2g+$HKxooy_b%g)FRv1>GEkR3{LbsIAf zo^pNwG4V#%sU$EW;(MYgi_TzwO8z|aFn|ga3=Rzarxq|vQQ(7x{>&LJP_eJq?~IHu zr6Ji6e4*RJ`>XWB^K0<}ZRi3-<$lwmyUW z`MpXmZ3^dmy;I@i;Ay`#FZJuC4JFWL0vFor%&n}RCUf{ z#1NCzdOk@lV?5vps(SBdUpdow+Rt&;4_w`}5@i}x!Y%uGdgndH?_E#v%8wG7N9F^s zU@EtQ4A+hfAgYX#e%g7d*gAi_)3yxT)Z3P~EoCcqCbb!m%`E(A%4hKA;qqOc?o4iH zY3B@w4rQHs^Tkbj2Wc}?eR-C78P3k3^Nfq6Mw>nZ*#l(zq}H$cvX9Y|tB!M8qZ~pG zMZZ?(Q@@{o*pOEofUT)KV9_vuBC!r;<>e*iZZ_}L^GE#M?3`1(c1}(%QFd#YyCU{O z+})w8BxUAWd@9ykqxgaboXUy-h2f(MQ9<ot2pbjkFdG||L(&%_wKrEb|WX!_4i{dfLHl6w`%?H~C+Wt@Y3-rAl>&oRD4 zU%U@FrLXC0NLY%&Wm$$Vs0^uO>X&<93c@EBU7Q;FYF16@Wi!>Ol5LDJ8*hqKv#Vxn z!n50D#H8s`U53P?MzbFl?zpB|f0Nh~zt~PDff{Ok$Y5ZeamGAwwo{Dppq(+A^LvV4-I!G=xTFBmxs#q>B6l#-f&h8ePj)~h_V}RYz%n4O<|zWe6fj)BwOzs z%#o4yIb7*U&5FC)zX`f1P?p5YJ95Os-pt1|D+A+D@zPLxD z(wmY&pf3v{tL_9JE)lp!{y~(LGQGWUxjeSov+sFR(PjEGm z&$G7V2%gc+)j#f5QOTlvkeNN$NAU%Lx2!sBst>46ttu|4uXK6;T0iP$RNq~pa4e-% zCyl_MMYqtsIt@~z|IQ*&8Wsd(=IC(Eng2ldd-DH>JNVY*hiYQa{K#(kWJ#@kFxyA?JTq=Sv|)C>U$JG%j7N6h+cE4#CQHFaq|KXxSE-_Y(>~op z76ntTnZ%}z+@|^47$V&8@S!FcY!GqaaH|}5qe_AT!x&a7)IBz zSRWaC8ja#wK!mkpdBy;A3qdr>y)yQPYo;2bo#Pf>nW~diM?||ko~!jWBIebkJkanZ z19BD}m!e^|EV@h4loVb6dCu5r(Y>ht0p)k;WJVS3QeO1s*RRl9%sE%ggoFl4>7Du( z`WLS~Z@FXzy^*P@d(oWz?}Up~rXjP?xUsiroy_6Vz-&UGuE)1ui^=GS!}duySNXSZ!dP z0}Ba5p8z!Ox$KhS*RM@IZRoRwxl(?$kFE<+ZIYKtneA{&Qc+VGi8WH*tDU#eb8a`t zZwglNkCox&ey{Ga(x&2KKUA@^6@@A?EdX^lR8B#Zzvj*WzW14$n{pj`RuLFDHfGP% zr0S>bq&mdqhCOH+U`W!V*0-e*7zM_G^zC#*--gul!poIfifmZkDc<8ynFDWQ^$`b~ z&N?Z_>j_hB?WoBLDP2LO684x0>=v9BF4|7&XR`x9)F=T(DhRm(EmMcrV$Yvjy1A9- zMZ)7`))uNNZznc&86_NAv^M5oYg|J4M1{$w)kzRK! z$rBQ^PqslxbHcwGWS_nf9i$$h57@|JL$4PqjjOB^HXY&@8Y zCGe+YMk%0zxB2YK7-)e*hPBmc#oZpz^QOX{jArfSY7u<{a@UWwm0HejRGTZSEvDjK z`g)bkYnx`V_iI_Qb}+)RU$@g8v|LOSXHU3oC=h`z-F=#PH%rlBA||J$MrZ@6-zn2O zFc64dq9E;YKnDyZgz>mhGO3XrT~5e8g8InV>|F*&mNuZBojUh-R3i0?}h=`w=BEfSXbU4Tj#1-@hK6u{E;f1 zY=k6r>9`0lWI6W8y0pP3BeDR;EidoBBzahwr5w(gF}9sewQuMPJ0DhGgleyq2K(vn zL_1Z(gOBjF^J2e`h-GG&l+H!}1Y__Q^Q{f4I%K{+21Tk^h|Qxawx}OihVyjRiZ!4u zQRu$9yEr`Z8Mu5h*lQY%Qt$Gx874f1xL4Dcg4sYNbYo^}bPYc@7HL<<#>bn+xvXN( zi?WW>1AJA~6x`8+`l-6O*>)VYcIu(#UdX)(Lt}G*IhN&`NV&eso3i#%6dPw2&Xf*Z zt}?3Rf8moloQ?r|XClMrHAWv+9Ez54&F%LeF-#QjX0!-Jn|P>U&#paCt-fl7PGyW& ze`s9g$Q)yQbz&i_Gv>96f#VaZhS#yXQ~MeO**G|K+<_=&HZK{R_tvvuvf%e)n;cvf z9F$OXeS;S~3YpH3op0(Ikz^-fdNfg@0h9~BY(;DBGW01skflMuMx|%;hD|RKbzX_p zKiSk+xqHgY1(IZ{)`DcsI)KXF!S9>hi_E>!okX1{_TOh7ru;&MN5!_7TR5fCo0VT^ z6`Xfa_BuNR)3B>GANQ~5tx*QGag4EazvvVE(NSHW@B&Rgb_bb?9TlAgZ^6c+W zjSlhfaqH{Df;J;5YYYo0c?JZtn#>DW0?Ze|raLzYOQ#vLT1QdzgV7F?wQH2TNp#40 zog^ns&X-k(o@CrKxwoky{>{H+>_F@)vfF+cB9q6O!+~0LyXmYJGrRq!`aeKUL6_;Q zDg$FF1H4zGWXud9#}~X~`UsO#=w)g|&Uq_!@WB=EahjQ7(&EfTFIkJB&fK%)hC>;)iUN`>!%oT6B#xm6Jyi|1U-1FvgOSan89U2 zhIVR7i=)Fw6(e_tuo_G8u4l`o+`MJZRn@4E(9J*35(Mvu*sO?-q+paXg~%r+(ijO0=j7wJ^| z)tdr)EBZ&@i85(04(VER-5b?odnF;`;0Lovz*k@1`Dp11xi>rI89k->5l}uG%I7( z(Nx$2Ph<%-<`-R%V8tu=fn*4R#gseCXIvBPgV1Z)+rcZvNcz`KSvysctXjv-Iv%mL zVR779=XO%oH>QQ8X#deK;lopj^ zp&X;|oP%$!`Qh3ugAhRRv&=0;Bhgdr!aiffmO?Bx&!lwJ;dLLKm4c!LIb6N9mi}D3 z*a2*mloU^Tfw;ate-K3LwRx z55y#dy1QB1e&+ zrI!urVc!G9&_cYc&3lsNvA@UdMg6OLhd|_}kak|po2ckT2SNdBgx%eY>9OHqLnGrc zYLjv06!A5g`cG}T*n$+aU0b$}Y;B>Ck0XVY zD+5u(TSP~xb7Xed%2WXJJ^6E2Y^naaY_rocC$9^9uzyGeLysSV>>G;4aVoxDQmuXhp`{5D8 z3o*`@iLSX61^+B39Y^b@z{!D3kxT>b%T*_pa44vGmg85!v9ddhL_ldnpGbdTw*U{z z&;Qf{bknAi5+mFtGq|O z*wmQ!tloXhp2rU>?JRceIl?4?1-SFk6FqwLXlJx8iJ$L<)<2TIbaQxO9w;Ck-wmvSoCIWSNbaA^l@3yn3k*58re}I=E zeZ6;j5{z8`du;6>~+rWfBj;Q`$_8|Nu0ftB!~PbFUi(Z z>$8G8ckUGAqSA5#D?}M$T252Sf8d*)HMOq%Y)yXxUSUIZ*1PcgXkQ?R9$nQyimfew z8dxqRR#(EIr**S}6j73)Ntd(qcW?>>u}1=)c|+qnhSSMdv-@Hu58oA)O5%amtDn|hpZxUkl_cN~890jXli5>R8IfSjX&vE!j zF+oSWkn2HiUp%bXFpesY?x#C3ov)kC?q2C-mlw`RT!EL}|8FV}m$)I{C<2!@|CAxkPgA zLfvd&&sbwpksm6;beAaO{iP;VG*uP0Yi-nf@@HBL(fwmb1*UOvkYpE9nE@kj>{to zWH9#b+DwH_4LiS%?5*Fy_19r&a{o=-nGyD=txrLrl39bS(q0||KOF8cFgO7 za&fL{nd`IguP3~Lai&r|k~wJ@TyYhlImN0sksWM$V=NPDdq8#Qd>Dr#BD> z9eQDghb|P{Cb;+JWkpf$^=)mNzeR7|7xQo0W!Wz+M<<+w9zAY?6=OA}syZme$a}M<+vziD67mxgpgYB` zK25f}adrHKtv}%m2-&M@?>9ByA~U5VHHGLCwJU_$UQKHmShu_rDIuk}7jf##19jU* zYjNGAundoyRM#CH;MF{%yz8popD^OOm&ZLxQ*#4fJKDMCm)$R#k9!+Jyx$QThI}$o z5q4vq*+pYBepR+t8bi2MK|5)Sj?PTEFdp0?Y|4h9PG`@v$8G1y(I4l>tkC$eSG(Es z!NNvm6gR9rq_dea&J#W(4IbQGSX5meV)Y~W_8tUsTL|x1Y}&EE9{oJzD|s3AhG;95 zOGp9i+!goHQ5+bZb+D4q!HG%TndCD5&M?agT+zH9phow6MuVbn1!UQUH;}Nkv6R+* zW^Kkqxk7{Uv`Xt8P&z|R?)I$z*=mWY{M{vKi;vI(s1!KJES zRk9PPQoo*%eT#4QCyS5$Ic6`U1^dv#d~`rtWR&)%)0eNOLBJ-Nq+=~DN*p41v)%>T z-n|&@76NF6RsC=k9;!VqR_EzUKJIp|&_Cuzp9{`-+Si)_W5+ipsW;&2t4 zNwWy!pgWhkm?usefgc?|rom7L;ROb&kyn#fTsxnKZYM4dnrLKC)Ss2mxF;}<4U4ew zc`XV#topb@_KrJdn}Z_yy+Mnhcu^o8opY0F^&Vx;XwA!)uBxbSIm@wohE1ar4RPBN z>9!A})lh-em%o~k*WAQ*7ctXgLvc;wLTAVGhL%5f51H5FjTetwg0WBPPOJl*>bq+I zSfXY8@mb;}BYnfcRn2+bF%5t3F(5I!1AZ{0}RbPD21?4 z@430bym_<3mKMptoVM3(*Tr)a`oozHflSQk^;4$nndJ%8{=q0J7G<@f^t%KX4;|WM zEg3TGTR+>>^gTr;o&&M&5h*05Ntbt!!^0zOL9yMmpX@j_lYJ}XI}wWa_8oWQbDRfX zXHtXqoCJlcVT`~B)V`;RQUbE5=Qnta(A=%}n*7-GB^VoE;6W?YAOVYHMHdTpEJg&Bd`HFGseXHNdp&_Q-3LKyEJ<|-*uY5BfUPQiTSDT}eQsTVMDhhJX zVOiQ{{b8kTH6hH9@LUtPpYv+kGt!Nw1n@y=&bOgvzNuhGfD$7uP2ly%cWtf7+i4=G zrn9*MdJugRoawtZh*d6XcK0dyfL1R)C2ea88WZ)=PYNba@YY$nS5p*pIu^cl53qOB z?H#G~7Sb}bCLL$s>8ZK!XAGa1I5trm0vY$IQ)2vOO{DEt4cC{v1Oxz@#A_gn2Th7x z>$bZWa=j<(56}xgyDzPT^H002GplcgnM2>)3t4z#cW*!0OuFy(VscXCrVNHn(mF}- z+U~NHJjQ73#RX#N@YmBR#neGThJb+Rz96)y>m#%QY3Z|%l5Mhv#h_G5r_>%*4wr;dOt^i_0A?;F4AA#bOoN-@h$Oqw5{<0 z4i2%llKgAk9QFph==i?c&&{Z*y@_Dc45f(#6KmH483U{ue-`+$h>A(}mNqo*+u2yg z_KMhW12nG!X5r;iGmcU25R+Cf5Qk29`}8fhU4bBi823 z-<+*A{+V#P`i#8oI2as6PB80)&Uv2i8PV{s7Ck~ZSwPx(-a^LRS5`H+jeO-ZM#xlZ z0-Kux_HvgznkB8@1Lw+Trx+-y5~(*if=)GL5w!lx?~FTRkQf!@bi>8Vmt??Cjupnn z7nc%>87qD*(CJA=IYEJzqu`J2){>49aY!4_oP;R&*R#^7E1L10vs}?l$LfJvr{S3J zJ;gcgb^N|GQZA{Kc{+QHxn_5F|Pu00&8b&aovjY7H*GA7@JF}yRLgX?jG#HnnaT{~K(RrSI&a=;X&OYZk|D5liwdQ@+yzBke z`>pr;*6&^G{iTUYm;o|Xr(!&|$<3I?!6ZCT4g_nP!Buz@>veOYocW=*$A4oFL@e&l z-$he1=QPaJN-X!oCp7&^&t6yr)#@SJj4cQR@u;kq{ZoUlbnmFqwr+Bc@~4Ee$MC-u zeMa4B#x1z#dE3*^#|1fRHXJX>(g_&N9`$99u!JS_77Jgcn1#8AJ!5VT=eb(Dvpfv1 zZ?gQ$wM(~kJy(jdqgUUEKOx3l5LZ}Qd$a3GZV{2!Vwy$9tSnAG%%vE<;RNHRobfhH z=IzwtU^QDWx#1e>uQCgsiYq}`R-Z<@e{e=}>e8!moO+DrP(AU!Lx}ZMpSyslU|;t9DJI1 zq+&&g!Lm{z-FejVH1Tx`esa>|qOCoPGV$?x*~rjJ66S*LDXDy_M!@jGyQ#N}te*!X zii>5Xe!<7R>|Om{qQ?-1{1CcdOd7MOXu7oCuibJ<>*3;9#PL4;xc)cSz2omsHJ%6) z7ja7E_}FtFk9b7#{2VAwJM#{hy8BbwS@`-QN~{W55qx*uC7PO+e*n5_>E_mU%k*Y9 z&9+XSxvIU^MIaE`I|9&X^e2!T^~6m-UvEC6{ex*e{%ydIx)-=6QPZrrwJx)0lw+q> zpUd;wTkx^0z|zrB=hMD%LoSrWwT_yunk1{hbEs zfj~TTQG9tzz7dmh;1xmaUJ{+dE{B!88t}o)($YO=Z_#kxqn-K3r{L#Im0hJPI@3Uj zL-^VF*C|s+=wQI~X#yatu&nk=t#JE*6N|#zZ}?nqL6#LYy%M{c>>CS04%5gE5+aD6 zB~!n2`Hw7t*I6Ny^56K#{)mTB0U}TowXh&6Tbprio+d05>)U48+6;p^Zx!R$4}bx{ z!0>IqO3?J}XR59D`d=%OMIRCVaAJGB5tP0a|MzuLr6BmA&+^>x&<;N8G|zo zO-;e4ZxYrLT}q7f4^hiH`M1ag5wXo(TcDC{3JP7lSa*@xeo_O{zSFo$54AruPiQTo zjAXxOt~YFwiYV1_J;11Gn4IE;C$m%VCi|*?!%-&El}Z=L{vv%$rJlykTKkohyvwQn zRX37mPCU(G|6T^~L!xE#SeTfF*qTG0r4xkv>@9L z;9dyF48ITQ)>7IDy6v-jV94H^GmXm`6onf5B7PcFU4cCSU*lKT*J^v!$O%Erf@U-6 z%sns!;)HLF++9gAsIkXp^gCd9s|L0k^bY)l{tf!|r!eY&@Z^7ma{rGtq>)IH8zZsN zy6jNwy%Uhkcj>$MfadQ- zmJXspspI`V18haem=vip9M2oPLMO-Gvpjd*Czu+y+`YFiWs1k`p~J7x)MpPqDs8ZF zbhzxgdAp7#CVv9Wj{3%#1FnwTSEF@*tjWw`c~@s2Du zhGu3st_f8}+8=eLOb@Ib4G&E?7tDSxcVpDrfvaufJE?bbpK@4T*_iHUExxhL0=@AV zf@yloqPld4eJ(EAC&(pmY%?);SH*PLgM^NPN@e$RR&Cw9FU{S=ks-|xOeax*Atj0& zjojfTgX4)TZ?J#OIqhCm@={27^0oaJcNqu!I+#q zC+%ZT_eQ+#=|;w<_rRl7gN76;ccf*?>CXD;v?p}el$3t;It41XEQM;8ZBTAOBc$)2 zh~1d@IPpl+zrrOE+w93O^*G+3y>fnS*8HG9Ytm$9P8>G$x{l2$nAOk2<;e}iyzs4G zCac$vy+>*a@1_^dl$+Xezx7W1U(etW-{&Ye?Z%dkln>M=|9_eL$=!>H)UdR2hZFhU zAXFwpCeGz2Yw-*1cy3Qd%$>`Pd^uWw8-bzX5&O6tVSbElKE&_*01`P(lR*wDIIF`uz(c&C6T&Ya9)|wMqC9|Fk$h7n`Nw>qtjSp%2_q1K-SdT(SsOvIzo1O>_XTAit%msxp#7ql8gXOIT<`$;VxOG3;#!>K{dlq}L) ze|}M1nHTu6M-^y5pv-I6jj!539?C$#QV^(721I<-ZW0pEUA38{|9jk!3AMGizX#Y8 zLPthSAcMNmDia{POa#hARbPrLJ|=em3L=|>%s|c21~^5oym)xmg(fj5(@IpZ{3vfS zJ_H>^x_OI$u0B0&MEmkobF>U2k|f;*0-fBln)JXGXiE8O9rN+i4U@8rge0(qI7U)} zo;hx5L(m6#w4gw#Y{)Jb{#^L9?JmeYlkJ)_CM_B%{mk7bbqLF?dK*0x4kD1jy)43& zXpZrY0AHAGoyHYzAq4_|m240md^g!Tj-a}$kh8e9)YJXol9z`;RPxnz*5GEBM7%x0 zW{Tg*6C5GPnX$p>(<@?P;udDo)+#Hqu=kfpahtcs=3yJAFBXj$(dXeNA6;jhrqZgr z9dsTU-3u%&2r&Hy1D=A^*2vo86B!wqqa<}8dC}bvQPwVUzrv2#Nlq#wiQ~Ch?LF7V z#%&Z_OppzGG)6eg?kjZ-G`yH^VVuRwcYgW~#C$i7jt8%8SEgm#EGTjE$+2Hj&8Pas zR2XM~^N$K8GRihWFN;WV)JZxtha`_Qv&;I<2f%M2?J}pdbSJ*+!mlGQhc?QZwU{e? zJ1KK$Px3@`bLKG8_q6o6N~qEWz~c=hpW?s0ops|i8qnO3Td?qzc6gO3<{<6LW24PB zYtI8#Yj+b2eyVN-567IIS`KxPL+=&)%Tv-xJrv3kLwy1@_IQxI2>PMgWlRDB?Ww%#%4Yx!dyyCQfRdQWnpkgO2Rj$7U41B)U0!CHInMMaA7&9GxBDOLJs1W zCSXDvNa9~g29m-5r1^*zBqy^pAZxYV7aCN&FDy2!^HR#F1)Y0gG%wtDDr!V;8&2V; z51E*k(AKX(8Am-?>TXhs>JVQ>vN;*)`YB&+M$n%K6_P()xltEQ=(beXviv$|$(-Mx znZ8NiFpT%?0`E}zjSn8G-MjTB^6&?0-(E7Sj>kB!_08HDQq7Nyqo*OOeVWilX$x;I z(G%qQ^{Crtn#}X{E*O~(HxkErCFYjBotcAi;BmZdO3ao57xC7+WH~<={fyA2PU4K= zbZRFetY%}|5GM(0A+}dO{+RSClFo=r`MG!55??%OHX^kz%n<|9O{E{S=&fF*r!H-c znr;T~4&Crv^sk$E!7^;^y>{`(%LhZU<7wvOyy88oB_M{q0a0kSsI_Tt6P6!5d?f1 zi*6gQ307%TyumG~aJ|!(zcI@;RXO~w!5#EzMHE)FZj+W$=+UxOt)S7?z)m#(jRO&C zP$0p_$l+GwiD}vL(hZmy-1{Xx?b|nCFNIYpCWDjtJ9z39@mYr-(|10WNj+{zPIT(|&$46|SH?wEibQG@yqQ8gA3PaQ$f_&3F)DCy-rGb?PYkyUl-VH%{XlN|%DoY&UmBFQb)J&r35(JzQZP=83oskuUjW_+QZs9+3gN z_wXB}Mb*^T9uZFXp)rt0@}z5s$ooiN(fzrPeM7VJbx+zU7vEeN0~%KKaG~VttI@Ob z()?;bJ@a&UF^Qkc+5VvLfe_35iC)HYjRwB+@p$Qz-KWDMrHtCN!p2q8VEY zO5v-}3X*|O&SODEZ_Y=deQT@b?exTV?!?hOEUH0V9%xOBNrEYU#qktOxJvs_659@fCAg*x&w-SvG>JkmGZIda|VS0%i9oH?)*Yy-2dS}W- zArrM=V|-K7HH&>FCdPBG__yRbbNMsaf~%20n+jf>ttnBF`sx_wC~`2DgfXG(IvhX0v^5hWVs~cy z(j-~FpRs6;ZA<>J1{${DdKzr@foo-|)#=97P%`l0N7TkoOmutYG`s`(KWyRse|oq~ zAT|oxzi*lRrlUJDO6cQF6#npv7KfIRgDjViJ6rgkX#ZY(3Om>{NPKVhFn;zp__M^N zdG|`G9A~QS051#t%zO97676%{24y67-=QvraulQ6zD-?7eCHD zzOri6Ogs25jL2l!OukhX=t&W|IvjVyG-Y4Dio$uaO{@Fhc2j}73`tC zN@sQ${;p%@B40SYpw`LP2W^*?p6+q^_{U}LYDKr4S1Iv%>mfW)ey;NUnU8g47qfYF zQg^|71y9TZ1mqg14?2Q!1icWXnX$_&Y)lg8KQ@CqJLUJ9qEuDEXF%7!?_a(Q`epo` zYQ_r`q%_n*3isJt^WsotX*d^D4N{DsZ$3RK?Ni|FAXi+gb5g)iKm13CRVKaO^Ut+W z-oMMPLSb;N*mrL;9x>wwbJR0gn>emn7Uq+vd2Ao-dRi9K+T?~cy1KI!G!aWs|8n+L znLQQQeiN%2mHfw7!v>2!({;p?Ufm%!o=0$ATUeKqV1@)F9cLC{RwLpFH_0SMrYtybsX|@Mg$z|bZNQF zr-q+Sg@fz59U!aKUE0bFE|&OQqjZOc(6hK>HG_2A#g8^WPq5k}UoEh5I$a#0(<@DrHF78TOig#+a5jY956gc|1Oytfc>&bUndpdFw4sS0p0c3rmQhq zeLW@8zV4eL4Fr!v4II_M&IT1MfOBy(X|X^ZdIMxgw+W@07qR&o11TH7M4jnLH}L#% z?Hd32W4SMzr2RxRnxFsUWUNTD;b~tivN@MJMA-<7m3wnDmX!!{_zhLGqczpe9=)tP zGBU)bq?$s>$YZ~j0%xxi$SVHodzxFMZfkS(vVjqH`UbZuzRU}X%=wh;(JGU^cbv2mSf*?6-EY>$zi^?~y{w3!^M^Z3A>%};jb&j^h6b4O z`fp`4Y&QwYjj;pU57YL~hd`+$|7?pR%!QWk>_@?w)w&h&k1jBerp2bi$&X_Ep4})G zPsSvUr^ah97LR^2Vig%*eP6^W;t=^&aB1;_MdUHOA~(V%d>mH_K@ zGST;fYZl3nwMWo~Sh6+f+`EKoVFn8<#rYt0U2?$h>KhMupc3xcXT!PdR^XRAe`rVX+ z7PlFu0onuQ54HdNz^p>O0$gi#Klirzv{%SX#dIth++*bEr9dWNjUa-LO$Q$pFhwM3 zx|kzAs>b()mqBrxt$t0nq3bbbK*kexi!YPnhm`z-UCoHdkOvSexM2IH_i#C01d*r_ zYPE5je{vqPW>+Kq-f~h}d=7<-xqwp}q84>g8gL8>;&I$0ARXXp)@3H^rf@#UImvGbXV>9y? zc^x0s@RsJ6XJ~O0T1IbVq~VzIDgXW-F2KqE zY{65nMU0-$Z@r(=rDRjJ3|5e!CoKkEs!&K!NqXit*(H8E-rrD?-^RcHx{DS>o>IVJ z?uHHnu72%H`_eIML=2l7>TC}iZ@bZhqo%-tdp~r==87Ia4A!`hGpdr~j?JJlgGoBQ z_}$(r&_%@K=yzAx@@N0Y9Bfp8Yo+XsoxKJ^R(9DQI9o}t;?hY2sRtFCN>Uu<`4_!) z7G3pf9C^*{0M`KYZz~$5G)gLN*i-WGWbwYIh0?Q^Wh4`bpQo{cMqttFEc{f8G-$rRUCiLOX8(TPVECR7;I3)G$3De!o6NgD=8a<~Tkp2A?7UrMaOX4~= zH7->p*6^QaedTp-PY@nVU~rM!E@lNvK99&gzBDgAi%1Y;y)7v<0ydK>Rjb)uBi~1# z!EQoSAD_#G&<9_)ZhOZVzFf;7WtT>lkf@SakS((K9DH;n>87wC+IO-cxZpv?EDeOB z!G~uNZfLle=9=$zpDV(n#Eh+*>OB~fohz)UnhFYy_I5~8$5ex z@}iu~yG!?kgyzwH_bsY@e)c283O{BXi|1d){|hwk}q^z+LFuS!NKG>I~UuMfVp`O3p4x`-A- zn`0FEE&9hDvsYV5uhDl~d@)tIq`_gmgS?E=JddBfN}~n>8q*^na=znHEV~@xhYju9 zy|b-C?7(4)-=uhX5AiD1v!>d1cx*}Ii#qzVv$By>O<(cZuu{B%N%rhq=a2+97B~G- zI(5m8x1|9uW9H(sGWXok@(UtJ%ul=cn2~{-LI9BLFpdyfKT4&J$m5-dlUmbh+pixRogsWT<@a}c{|eR zbg&f!$DpmK_Mx7r>aWQZa*vf~@o>1knRd5NM1LVVX@u8pX;ok*ogfD-n4yVVn$+S-|0SB{(ZqpGLQL&YI~So z#!CxX8i6fg9dTYHVGPU~pH$~ryv8MSBu*r~o5sp0sZ5b^HDhAfX+h;L!v~T!6AiR?b|x;>{3dm5q_aB z<(z*?sjuC~`T533Vf%J?dABt}sMTU^%_CMm{99tG2mO8OD}S7ke!Cz_K;kxuQ-^TBe~d+k~sNuI76lVnSYMg z=k+seUk$v=BTct?c+w4U!>9*?-BkRyX zRB6*Zo=|QmlAg6a=Oq&9%y=ehe1;2Xdg?z{ofPl28fqkrQ;6m7@xsw99lIVJC~U0j;o^ z?yEqu&mU)EjqYDeNx5jXgQdOySzb}6;<%=qxJ zfNW2sHV1|e*SqXHTJ4;CAw3(9l-hMWf4QhD%>CRXVJlmp%Zk?w8L&AU4ZUA>pWi~a z*!A#OK_R}-d#xZ!MMWp&`@z9t)bq2E>B8?Wf|hb*RMafH@BP#{51*TAj3N@|o?kY6 zeVakObh%wvnBXJ++@@z<)8aR3C8(?6F2Iqdo8GgQk!DD2hU_61nlud`g`444OfRxS zL}oZ0_X1Fzs^gT^_~V(pg#zv}q4t3r{^zh(EE_|wBBPl7Nr8b7oU5>o1U-OD(dRUF zeP?z^J*0;p5f=%yV`!ryWVuXP9KeZCOnjZ~9igqeIA5@&M$AM>p_Sy1yU%~}jkv+4 zj*SAuoO6A<&)*!=na_A2Od~T^I|RHrw#CF8goihh3`P z!-Tn~8o_WZ-$=Z;C#(Vcn_7CsplV~T&RT1fPEBnctumxZJt0e#yI5yE2(EhcO0LIm zJ&Nb6)HBHFy__^V2bX9!^kr;foO9Zr-3TMFJ$9*(UwuE7NxXLm;)yD)OHU+8y!7;2 zP@pX&Y_nRBwpu85HuAZFj}Oqtc4z)RiafqIkp2!oau&PK0*XV59oSglzVlOUC^M=J z;eaG^n71v7-;4;v+uo%r=6&#Tgghc5V#bSwMaqv5lqqd%ZOum)cZa7M2_mL%l(}}5 z1i60%kzKXJM1*`-tqkpr)~gm|@DJ$!{~K6bn$U7jI*9(Ja3EhzBdtKH(McYPdH7)> zk*1>{&Qj_Cam?eO5A~7-9lTgmZ@ZqtiFc_0GD7yt!3si<#8w+f;&h=PTj6#(*va`9 zOHqwz_CA0bgnaYiUvY<|E((yUOU*FQ@W=0oWjCu21f1M~haIkf?GQ?Ote^il3b^An z;Njs7J6XtuI$dmL)kC&Lq!(o{e^bVjEU6-pDwJOG#J6XwaO&ovTL^MyZI=kV@*66J zIqcK07^6LcEVJ!=+FeMP^ndYken-aHH8QyOF_~TnuV!vtwr|;@J7hL-TMNOL% zH2N5c@1nKT=aQy-;4bC<>k!3=A4kNU>$)aQOUDj7#Fx)g7!1BlN z;G&W|L|JjsUrR*_d!XdveQk^O>au$oilde7SXd%`W0z2J@8gNhv5Gx-KQSk4@?zzp zqVmA6;(W--tBmyIAlZ(BNw-KP!$xNbjO%HkU`avsa>iPvm|uVmuDSx9lqQxDz+5^i zQJQ^*4{{;M2BcC_{BsF0NO65R7LSd}l`U^9p7`g(fCPMZuO}qoZouE_OA2h85L{e- zf*DR~2#{odq5r&QND@aJ;4z)`bYz7YY>~0mPtSk6Wc7CiL0~WPgON4?f-V(0?m_4b zQg~It=UZJIGBDU^Qm9&l@67?Q8TDTsEqUk zYXcL`=Y1!T0Q|-v#>(e1 z`nqF=n;~ zW)7yP*oeppruYTnC-T9ftZ|mAG%4?6BF1S@r22lmFDxJguI%q)KvjtQvDhN1Lcjix=%_K3=kv+V&Rw)Ha` zrk)+sR2@zDA8_n6HAFrxtc~3$WJb=ZS!(h30XPc=-D$WkL2fBO9&;yQ9k5XCA_}j(y$xy~@58;-aQz zxmB^ARlYS!RW^Of+XvcvB^JEhoYi^B_p!<8R4r0t6C$(x!_R{l^TF5A(IMcZ z1O+m$JpygY0LBAu7*JHyU|QAqG-YQX8&Hfe4b(LM}O6$jPwXC!E?c5JQ%Z;=XbU{-QtJZ8p{hf zZ&Mo4)C>{nfA8?zUUx=>{`{0}V<-i`x-)P1m+^MiJM{%+NcbG#P>ay?^b*N9DkD4w zL3Q`;D^&C4D(`LWLprj$O%LPkyTc{~b{5=xP3Ie4F^sPo8X?c3puzzo@sGkrt58Eox` zLMgY-ikbeU{l4m{-`Rsit9L^jO4D7qS89_jQ*Bd_lLA+dmx(-aB>FH3VN*&vfZ~%^ zq>iO8%~lM&=4*_95sr{Y!33QAH4hgM9mi~gWKpRb#n+|9ef%eu>M{__;ZaoZBq7C} z)Qeqn`Y=r=D81D2QZ8(4B~eA{#{e_@WcUZNz^+<9*CrcT7QyN1{(HeLMHF@lk%Ze% za&35;PvX9C;u?jWQqhv7G*^=r2t$MsObre33IY>;iHsnng*iicSzze(S|Pj1ZlYIg zfrb)iPJ{ddAFOlcg!c|*-5l0W)AOGZrT zLlibT$enDD(G~*BwOi97i7EFF>wGx0J?q%ZuLVu3H}Pl~O`XPVYL?wEEnuIm(LMQ` zv0!4ccpLr@uxZ%n#1sTsjfUU4#c(E#KMtEz#SP(CBkA}}rz_X8V)cWJ8zMwcF$>Fu zhq3Y3xngtuHXY>Y^L17hdF`VX=*$nxWt8cXH zIDJgGxuFHGdIqbk6u8`1dHhF;9bJ2{+Mk)(Ete`*5qx*ohymyM&iVTaryZ0|QVuwV zcFN$;)1Uxve&g51dZgzh*ZsXFQhdUg?}D6DPqaXnvv6g&@9B1}!|aUipHoBtaJXYQ`@_QXo! z*@Q#b$BYW!t<~@9;+JdQ78j$knoI^QMZ1Rw6p;JRj(c)_czHve18#sevlxYhR!o=i zo&(ap{jCDHT>L@a*gnik=~Wz1|M{s+==`dksV{*Wb$B>kZ8OH{@Ld&+!AKo-8$~b( z>AI&1+?#YBaYsA#<;CxOW=j9g7ABZgq^FY`Zn9>-@j2xEQI!)1Q*r!K_5JZV?1jK- zZHEd{@CFU0B`-ncrl<#>*;p1+-V0V<57pKgj}k|NuTi#7Of6K-S{^)HU9cA&Yq?$Q znd3Mz_MwP6bq$qEGoCEOo#LQ-&Yon#~sRLZ2UvoKJn$OqPy!LEzY>rSb7a0e2ap z=Aw}E2%{D*&>!Kg_}PEx$)rLkSk6!=r+|ve%E}=rY`-zz4P^Jlv>{@N19gGL#2(ML zIfsR0tPA`7ffZP$I>0D~q!(R18JjkJurdLsZyWo+m2qf}ga_pnvKU#=qzcSsL9m zDToRMOW)S=dnH}7vpK5O6@Q<%dgW;Oe)0RpH${CMU8kdJ$GKbdOvMkql-PNT2=qih z`+a`CHYbX9K5{|847y82IX;QmQi6yRI)j6?jnIfL=moY%&=S9g$9Cb-QFx@5L&>`_ zB$c$k@3MiqIR-b;C!H8}6I8G4`ve4)4!9(dKL5BW{&wlKf3~kXNhZpB%`utEXv}pv zmPA$Z(z}w&vazGH7mQzin$>&vurQ@--|^C2FwZb`-*2e%H-AVr?gucmn&sN#|o=LW?2WrCDDwUTvWxwF}JDsBS9-Ly<{zC|2<^?zZV7P%(jYQo zfQ8tnKc~fC4!PdmqLsmqG@%IguMNQp$ad|;nm>Nb31l|aIzq}?(SR!t;;i}aX`yw> zNYV?rr1uBZ)qlU_h=T7eZ0FXgY6L%vP@ZT`Us;QP=&ye~QmYk3n&>xgl1aAJ?yX&V z+0Q%AIC?m$E+3+i;XQkt?DKX%ZBlgZ@YK5*6e#<)uT|mJ*}N#fn*1X5;!w;MYU&5Y z8#o9PWLN+~<=n=|UE6$|L&u3ndDj&A7JR@AZnLp$_J8QZjUI-@o4P8*>&MT06kQ#+ zla=iyA$Ys7?HEPHT{Jeveoi<{lKjzV2uHyZWHK|4>JDLx^gr3bqrF7cL9Khje>ht~ zzHtHG6m)+KlDa zMQI1mH5IN9>_(uTCH@s?p8^4^WmO1dGiuG$(4*#O>PHOzKy=|_N{ct-@64jfC zk{?<~-^MNaQ?7Zex>eu6WjdeUX8-YaSNom1rAg)Lf=w}GcCUXgjoVOj*;lU$Y&8lbQDCvSNV z9Irg26rkL*y{#@y%?tDGJq=ev=wLrrtwBQrT>Mmo>3&vk&TT4YQ}8VF`~!qi@WB59 zgoDoR)L-ncjO9Tkd$@Cd_V29^E=qClmtF@AhczKDZDoH!kWR_dj~Eyjs=3b&Jqb=C z2&8WS6=&dQ;lE+e0wMcra(DD`K%NxH{NG?`8CqLAJAkCP76OM$Um?loK>kT8By=TS zxTXN$H@ga_ke$;lpLX_Esz5x<*UJC^jZ+tSZ8I;_2N7gPxZd;3vT)j}E+Q$k z7FyJ=Wtf2bT1ar@eMw)Xcki5KWC8(^VKw0+duW;?>S09iV z5*c^;cmC<*ybt_2d~E^sFRAnYocP2%12L}SMy-xs1?AgH9O~m1g8n64V9Squ=jmSd zgM;}*4__ujIwrCsw6BrH3dWH~rQ0QW*8u|qmY_~OiM$(zs8lgzj1SvY8F;}3{m-E~ z0mq4uu`F`VT5KdA{b%co-u>W`A(6idE|9MpuXbSGf*BnvgX)D{TaNA>F?s!&g>t>G z6#e8DiE{4(pJR1#--g=1-h&qWYmDJUAN8LU-3P&6hXaEbc|247${!$Sx7+EUYklO) zt}nlAHm|`J`<{`Fnm|6*CN z`Rmy&#uM53vVdGEj1Df~Qt9tJ5H}g_5;`QI6ckLiVe9&TH`#l*9_U*dxAJnH!R zM(WtjKQHpma!_ZH2)UWS1*Cq=%g{=`EyXv4(u&bQXx1!w-05#7y0_DE>%a@V|Gv}T z@j2G8ZDFymOX|%SIpWrK02&psOaNueID4bZ9*HYns-ur^OTf0z=Y^BDpp1hO9ayk0 z=EUcn;grm-W$*6`=c`9ph@Se)w&Tjs^Fk_8&n^zGLHooR+fAX-M6)fXwy)+S3c3Dp{lnQ|?qK3l`%A~DwfvPGMK zdFuv3)97mkstN;E=rCY8#~swHll<9bz(J4f^1kYCiE9S0c5RYY5 zHA!4sN-{yGtX*a4xQ*fhhNbH2$Fk9zf0?{v7clvb^;N&?2)nC?&NHo9r)I8pXA2ML zflGu1+{xLoPIi5R^%40DWfaf4#^BWmeg4`vEp9;-2LSH=@_ssgW&z z%NQqH4!dXCVAB4*Q_*Q0eAc0XTafecr-uHDRPN?;7W zsRkQp6FmC*DiYbkaz4+=K(D}{b^mS7f4G3F=f>0-G86gkR!Nzew`-F8iV4jq<8=-2 z)oaU%hee~%N*6=HL$9<8BCfN`)>Uj*)?dhueQA<>%}yjPQ2xN$d(1!iWBe>H?p3a% zku34wT<@}oR^g-8=j1pfH4W6Mc?pY~heZ`@hU7KQZbYYVw?V&h8VQFQx7`>KRd@3r z(+8&}V#660KDg;7&*9!&^)64m%kgqm1e}&C9PTdVhPNAZNT(6`OG0N#@2uTAsPJOQ zdxDueO_QCoZ`S9Qmt1wj2V+v{rLqYbc#UYXX|R!ZBM?&7&$+}D=!wL}kRi!4kGiaf zLZK7Lrk7i>{)uNwnk%r5w_naaSelKJNNqnIu9TWfLdmXB7-Y+MHP>`DcaSe?YSV7Z z{kG5y{^#_YV&WG!y5xDw_#F6=FF(xCAPsa-Yps%0>dO47iddT`Ev%^fSUbMACy zjX|{VP=^yY&yzQf1xpCjGjBt%9u6SWQTveMQZxs%HVVB@68XuEah4F1)1kAz_Rz^9 zIN=eM;Ar;e&5z@psRq_#mF~R7Nl7sN0gdmmBhVvJzzE{vh1;#8Tb)DW^-m3L&YyKy z9l5jUBuPeRul9rnMNpdtHsFPz(V7u*v)B2`AIqn{>S5NVo-iHU!zT-zCiky~O8hO5 z_`YVj{)aWf51PNoNzA+^)w+^Kkv3oW@ngq(TPk*SbvamGM!Oooc-O#2CLQRf#cPtk zl_tLp*&^R@op`W2e%bS-Hg1*91XtdAGI6irmC|~Gx!=d^u}b}axV7~9QtAY-`kk2m za>>El{clrqy#zg9l?~a~n38^@-x+&#oH68RP+x;nvY)KS@cpRgT)V2XY`%aJ|M~c~ zVLApxT%SHID&XnJpI6hEF_}~;W8dBV^!>HfqvG-OX|ygTegYx19TQg7Z&%f;Ww{}q zAhM^E99^OU*PSV5tBQeG*cudY<)2obb(X$4xZ|JW~CcT$fZuBQj7&Yd=xgM03ns#3#qv z^I4Q_(0agaZ8cr|)*in)ZBxSHl8;Q`&l92wWjmez1_S20w+TLbo%Nz`l-=%bbkZxH zS!3BlT~TrQ*lZQ9?$;W1rMt%!=~pggeGQPgBwx@92ngRxNhniQwe|a99XsMEjyRbD zs9&X#Z&_e&#I_i=r(~ygItC%UXReW?*3L0vfPEY0v8#G{r-Pr)M8o`QuM`(xr)b# zkBwdJ@z>=6_W)qi%ZOizEx#v4PiP!z`jXB%xx&OzXh$eTNwoN_S968bJ=BA@M*;H! ztpM^ATpkzNU$buBm7S}WKC3I?r5rhxWU~;HE2Yutb~e}Ky%G8QOLFP2v{Znt?N_7e z9!xb+nKe~W=V2ba;%+5MrY0e)@b6R&YCM)P;^mHd2@PA6DV}czI(sI)wl0A}Zr~Yx zXE^=r(u<7@m^vs(cRUR0Rj=fK@iT}-`rbSM^76r`!ym_T6z_?@2=Cc&W&v**-25Lo zUPC~(t6{(v_$y5NJTM^%#*w^K2H5|HsH_oSXbr`AlLklWs#iJnjsJP?sGnwf?}-n+ zWiT9AQkjtE(3&!)7BODo*Px&{|1YFuuX@uX2Ci27AX3{P^Ej*w$z5=#)i^F-I|aB5 zd=3gquX}VT0iX4(DwPEV_0`M-2lyjcudZwc)@h$*)J`aOOQj0iOvN+>D@V}@gerdG z|87uPAnkLwUKXW=TT*WnzPj6Yq~U%lsz(U@InOw$z~UWG$XEkqC4`2q14-AZuOe>bhZae$+>Lv?pgU&wa&GFK=w{ zN@p>Nj^4X3kyU--7WC^MfDrZpr179@DG3m#`9_bk;?wPkx4^c_WQhsLSY;^?w0a99 z37rvP(E-iZK_^eIaQ%-TCY5J?OD~dvsJ$p202}Y>qGS+z4?y;ZKv@rZaUFcJ>0Fve z2qOFEXlQbC#Ox{IwM`xUYh;@*{-y$U02C&8aXEeK)-9U96m}rb_3PK2=XpWKperg` zgbOsh@_)OQzj+MW74fy4$wsL%iH|NCebq~(z`5dTWB<-#py6a4!4$6vdWOv^qFGbZ z7xO#6>0$7s0Xz49G1yWpBVHHpGrUbF500_;9U~MV5PMmcc(I>jbWi^di1_0KQa}HS zy}Vi!oE8i5A93as+MR%ke^7fr3f!`By!%dX;Xl};${;74zy2L`VKl@bbEPZt-Wqlh z{;*JyXCZ}O?79ApC!mnr;>&==6h4jcGz`W_>ZGyaZ^^xRcBQb5aa|hSxEZWqkOm;7fX(u;Ad2KyqoF1@oQ3Ps)W`nfrK*JQ zaxCWxOOo_2B}6Q6zf*TUA!F)xG6Yh{S}yGtYA zTq_;%&`W(^uyubm7XD<+X=@*sBQR(P`=@aqZBZqBpGJ@cq6ON7Y2QYSYly>mnyYjh zU?SKB$~&%3wP|i92z6W84=PD(UZNYDoDOyF)e%xC1#lj=*0WOGl(p?*yP@!5vw8hKqXoLXb*90%=SyHst<- z|D@2yKyKjNvdOHu?D@N}TwRCdVQiViw#me#IKfFkkyreL1TzfT^-EUvh||uffiji( z>vyX7ELWq1w5@F-CRgO$L*8D~G3dSYM`K7uR2;m};o>s6=3q!GrDg41Xr4L z$9rk0%zg$^s&WIql)Zn0TqA?dw`&|({07S3y#0D%)=EyK1@enk>CRh9O`eSi&ILZj ziluU!f)uG#l2t2~4EEdbQ-1{qjzosk+jiUq%A&EQz8&Rz4tw8poMtUc9jIMcz-xY` zPZp#e1b+P0yuI*Uy-c2G=BK2;&&Uaha81o_0aKXpHy&?`3CRa}hHf3}Y1_F=8Y~XD=E^cO-qXKXj6U$;FX3XidA{YIJT|&)e(haEa z1iyKzgR0mrZEED+0f&)AMH}4Nki7Vrkc8tx_MmceOFw-kG+?J(uii78$hD#Mn90&1 z)98aFkA9lirh!~t<%KunkVKA0M1oONSJ-)%fkAqW%Ajh&Y&Ruflg#4wyllBd&fKhH_;bQ?6SS!4d?G-~8VY3lT)2BXMV`mkC%!Ds+!a0x4{O)Qy~=W z{HH$j_Cvb{lO~rQHJcjtMY^`3u~aU(OPa!UQnQtqW?_|^O^&4S%T@meJMAI2OQ@}Y z@=W-3GA17%wa?k9C!7jJNU15b)K!p@;oa;2?b0ITG4q%z1h+_g#lw;8ag_naxFmKn z+xR`&j9?eYWjp;70!}oly)rWOD=Ew3vxoICPslTG|_8FPYdv#$}I`YFv6!W1O7#`$nfYc0Z3!$J+ zl$sgw+wwYBs`0DX?w_r)6k1c&@s3b;B-=eJuEG?K2gaL}G;?)I!R-^QZF}|x+e$A7 z6!jc`24Ss5NMXwqs>lNN74T zB+rmEWzgXxaB+ACh&PxyfPBwKU3EDGC`GPj{QoQ%zkn`;5w-3Ch29+?ie8mr0lI08 zh4;T$tryAzHJO5{hb{Vh=1`2-7<3Mv=yL`6fS*Y0)Fl{ zyM4OodxE#WxdG(^ZL)_0N{a63s>$Ku=%ppE>qJB(*RKOFiD6=AW@b`SwvUc@IXMe( zgqzfW+Lm^eZ4&?pFSba*$;=j4FGU{l1~Myvh)-VlG5+W<2EHbk1rS~@fKR^E0WV>L zhPnTDP}u!XHf-Js`en7+9SvZSmm#-LQ4|NqJ9CVEjg5_Zb+%216^veMSE-XE|at~fW`6U19RY%w2MAa5TPMDE4(YuQ& z+Vv$N$d`Z`m`RX#hdBc^J^h}P)p))d6XS$a!UaYnC_HxF@XTbIVXZ!d61;j(a zTK-$3Pez^)2R-1h)pyuaPAv)J2B7_4B((Vf&EU%b358M}A zzm2A*O?;=}zI(9LX27$$;Ir`=SoK1Vrhi=tI2=jLLf`tWoa3Ef4SQ1BM0=RYvK-en0$6#uD4imR{b^=r3#bH@zX$xJsfb3Mg!!jyJYycZ#F>LIZ27N;RAxO{ISRelI5MYmm)yI znox4du+dm01A?dG{_b~hSC!DG7LKMEdAG@B6`{D48Vj&*%%%$<6LDBPdTTnG@rK%9 zT(5})B*xkY7l>>Ot;kjgVSA!{Xerl_R7@Sl6P-$W^QOf!E|6pxVB$;D>Nj!s-QqR5 z*XJO5rUTNZ)F#p2u5A1KCBju%HHq(6S6310yKBYg&rPqiBktSW1#st;`Y0%8ob`P! zAYZDR;|$BO;XlIn4Xm%}mYL~L4!V2Bc%HpX$XWSP`#W@X^@GX0wsoVnkCbJJ==4iA zThzqf7skmonu1iH&gRUAWzQcd`}H<*Kk~B@_e)8F@pWPxYjfs><&F)D z$F3)-teYos>+b4*k4|#Zdi0ZDhbQ*%Q)7QZWidCYy`${-8|6Z3A9}m-&Uj{oj>Vv& zPXs$@dvJL8!)QP&2Z(gGRVWhA8Po*^*tg^6+R~Y-3w|z^|4xgyZP#=~Vou&SC^qb9 z)zO{ti2|8rX{}{MxYj*-scRn&H0MO@K*C(BYT7xu0CiS` ziCQH3>^GCRxUHm(O4>*Y>XYEqKA^ygO5UCeZ80uNc+I^osbvy+;vP}D!|*39lxRI- z>)T#UvY61MVg0nuAMW0Hb<^-v#XK9(CgbU;N0#cdXXF1hD^^EF-Q82~tabN&em>RF zi9h@RvB-5lqQd@9>9)bm9Gc_F7k5P13igC!A1eRWTGv{U)Lx=N03M8-EYU@rtn~?( zA$I0|mk9S#4ugE@fCT<3;r7gCZ(OrKH8rrJuWjWK1AHOXK3dix$DrwkNUynl-9VOr zUXeg$%W@i^CrYqGls4pIxj?|-V(@RS^Ph~nkp{@PxoN+Vxyenoi{4Bx266tF**lX9 zs~R;e=@Q$0zUQM&+ddUWaj#~~^0MNt*-@dp0$7wCEEoE8Vd$$iXxI)WY#O1P5e*#iPNThBgiY=<9FAqZYW*QBg(Up5uLsAp9PcZL* zcWY}qq!xGrVM~nnC0+pP=MPhx#~Xg@V(OQPvKad6{QR~H{3 zuiBBeB`1$yQ@OubhXjj0Xnd7BtezLTy~BvP4tw3CN-rfSeO_Qe0YET6?w* zMB2R{WTCV?`p*MkN-EuX7Z<>L5}~1r78V=Qm`&b1)qu&hnKJVlh?b`26UQziB|<*F zdKdC5*{Rq+W0^|9)YP;gWH-aZ?Hi+7pTuvfSy<$_zWj9K)?Y~%5DEFYuR*1aeD`!U z?d_YPMnmw3IHA?Cys*8qzE3BlnO=N%DS*D3v%ZW1Cp=(#gKJI*QtdHg+&~P3;Dm#t z6}WnkphZ$zQo_wsOU5E)+Wz(XpFe*dyd=CvNazn1M|D=hU@En4$LkT>+uKFjoWKe- z3O@i)&fkC8GJI2)m}Z;&qd`Fp2_r3N*zVuxaGyKZ(<*J_|Df(GOQQrE`#OP!T~|q*J<^VSpi}yK5-v7(#}U7&!O%{C7XQ=j?g0=hdFK z3=F@xNz{m)2q0r&jhjGS?L@(0EZb_W;@SCZ0voTY~# zy=M;Yi||Ep7z9`!_oFYFvPulCQ58I*^W2i^xDP#^;cgyO>LAZXN`t`CbK$ddjSQ-{ z^&m99OV;_-27A$Hh(;#bBBdVPE$vAh*r{b6wA{UevLn{b4BHZS^s4Ks?*TQ!w*2ZszGsKLr3juz-(Xg--H+?LgdN>WUCU|zYy4IQ0| znQ<-R=6wbC-@XAI3o2e|Qa~2&?z}8$h{3jnk(x%k$%fRw30R_B0vM*uOw!-D0`=gU z(+B)P-O4Uzqv5K!5k1GPDl&gPr972S(K@=t@f433L(1Y;qq23zEuO63xC36pbT}T- zcQ}9;VbisY2$_b^O*a)K9si#VIHBKqEZ7vk!~dlMg%r<$tu$08C7Km{_Wt7Y?WcGo z|I%z8n!p4)9nb#Rww#<(wFrW%K*5Rkvx*mI(Fb$<|3K~l6o6I#4?cUMKLyf%b6|jf z@n44(dEdIjA4*9|^N^4IufL?gOidjfA0HppLpp8r0CpDaC^x`9YgnvT)&+`osmrDR z5)8w=?|$_mobE!Fni=X+Oiu+)3bPoF;nVJ&{({+g1v7g1UoJ%HT+ zF!uC!m)f9QI5EJLh#o_V^}xDHB=ZJTDAu6dzj^zQcvHyAs`$nYU=sPW>yuOLKf-%j zI#cT$ENOt}@%aDQ%KwudtPgb#m9?w6I=Cl<1rW6qFAf+PeJyxK*9ykoo0ovsx5&cy z(GuJs5N;?x@|V=o(5SM8G!BDhOoF~I zAMv>7@m^sgKNb;{r}b{D8DtBvwjyp!_bMr_8RX%x7BAr1@&MxwKhL(L!E3QoZprw8 zmg&XocKu`A$_-R83N~JmE58>6eGWlmgu9j|!o>cV;D}!=n+Kb&JDdX!P7&b3&X;!T zGnQx@kuT$E_nH`w#|(wfhwF{z!~N*V_Oc1^@QeOYEkWWx>?XziMqKXF>Oa!Xo@es; zeb9=`?mRdvi1nQte8~m$UQh6@{c7LCD6Ro1RyNXM>zjX$UbD7(jh&-xkEW^0@4erD zK%2h-0t^L`T~GX&p^1qJ;M?eq0CKUT1&JoSI&KEB*6pE9SI#=8aO?KGY^LskD*2iP zB~CFKht08{8)~;fZEo@C_g5w!^UN8x47=GPC=ZrK^kAVx(C%;S)#`14=l}Y#X}_>I z`i#Gol^m~;@8owloIBl6bfpcouvC3Oj_35k?B|5z<;rlC65RgCbI zrJStM6+A2+7&*wwxqi?aJG4SpjDE5x%0S$IcMo+eCOUsOG8wscZ;=}KL)HhU?QHIW zX$IH}DYhrab<1@)2Rd9UX;ja;Xw9H*0^gUNx+7_&;0nXNDGFy^=e)F{lJqpN3yCxSgc-&o2LeSqpIw z=--ix|6$2)Qe3YpsxsTE#jD7d3wfa^eFkoCa?AI8oiJaJ~ z2Nuz#l&(BX()A6HTe&}A`$mG5FRZ3x%2ewowTt6Ulyv~{z0H@ax@KDV`Uq09Gr?R) zg9=qhd=lF=UhHe|)n2ORm-dvF-ri@TL*}RxgB^OjrqGfS!xt}1+M-Gia_^Pal7R2{!reS<(ki^?s)@?@Z5n#w0?dj0l+rkqh7}A5 z20)d!aR6A>$6&M@0BTgeK2~I62D-3lDzyJJwg;!V|#(V{Fa}LCiDX zN9B81KM5j4BRAAvS0XT+dwV;# zF&z=U+_nh-2=`YxZr%w-OFq_651EQ`_9qO z;KOS+vmKOC-o!=^3$Uh^yx2>V4gfDvGFC2}Y1v}Ltw8gkykd1 zwi)%{Id22j4fAO~(8HZpxW zLGt_e^Sxb&@WlPWSn>#Qn4Zff^i2d`@wY#&b0K-U+V0=qIqfm5o%FR@mLJJdS^;|=F))YOfy=`Cu7=^7=#6Lb@wq^? zFeo)}dmLDBO<)&;xd5OTo~{I{VQLAz!4Cbe8&~fT!TuPk2CsniVxkg&)7T(c;|T&s zmw9HqgPYwi!TP)Y>GV`&h>4PN^PlP%{7B>-TC2$V6l0n=fp&&1Xi;sWpM1YUz@)D{EAZ( z%Gi0RHCkQL&d zSu*jA)VjG^PJZj)sXCbk_UK!7hDn=jI>m5_j8JL2rOHf+B`jkt9k+4)N&K8!J(AW= zu0vw*0HuI#i$TiyTt7Nl%h4x6qp66gMGiV7FBX=&)Edt*!Bnim_LyY_;r+q1=QZ!w zS!>czx}V?wGkI(On*YvKY6~2+nc`7)(!5Kmt6-0QtR`t}@bYU#@$2th{aYc)sMo<2 z6B;Jl5F#lKS7?LA0MYa};F*P3_Y5$O;}G5>*oF@WxA8M&g_NZxR}XKg;Ml)|0o+(a zHUx=sOtG;M=rNewFIf|)rrljERHgCc!frZ0yPWzqEzfop@>=gP&)-jZcu@S8k%|Yo z<>jwxo;*7tm*T<|NfEw?Cyim`q-w)w=tT*i4arm_w>Tu z;gZ);NSJBy`j#B2cqi8F?DynQOC^!lh1Uk$TC=Qd&&NmnQlPxJc;{fl2#GEK3-Bq_ zppc}+glmtOy||UuaH1#1pWSK|$}ddA)c1uKb=2AY`SgoVlviw0dQ|Y%jpF-dg+7^W z%n$m13@x(nKZnkBRr5K6$qI@e4n*9#jhs-viPbGrsQrusoMMGFxhp%Sz*ewC(H#}) zLP@Tx0|h92by1%utW)=RlpZx#8{52caJ$UCKs(w}M8`r=L7>|#TsgWUu0p5qWq~=j zbzheX!SJ~apKa}7o`pxZEyNBnGVPc$Enz-3VxNv&K2Z*izEtD2)A^npnoX;M=E>MM zPp)dK``$FP)KoB$_-jxeS|V#M+8r-gpU4zrt)jCp7M+}YwtKo!jjh}A7q))v+%sO{ zvKAD-`fv(UmZ!4vY@#2!U-hN(QOAt$djGcvOJe#d0&9D3lrWft)heI*yhgnnRm)Kn z;f-8HHP|@aLF_mmX~DL?9chR7%pzo9 zB;HcD{zPr2<-}$w^?Qum@&%V4CTbGk@`!D5%R^~>TJ7CHp>%PIe}JpK zSB*k#_29hC3{8E3Wi(wvjJ+D>ny_Q(!1}JfIex=qFH*H`E=lC@;};zXP0pkujyi6v-u{cs zOv10RWv}{JAE|F90r_HG2!A(zv}THe^J54ag7o;QoB0*3;>@>EwXf^KD!l4b3;2ac zSvqFstT0DMO84JA)C2`Eh<3OIa@(W6OQleaYs?_N-Q+|gqC^%{l((!;?;ieTpzvVmXHn^O0OtQO<)mYIz$s=mc!@ zXBG)zB@3CW9djOK!2BCdf89c2?$6Y-KV&F_a}O~Mlc3& z8Rf}|f_ASV5W{+19Zlyk_^m5=^?uJv@sgQEUfP7m=M$xW12l+-O^y)cZFqbdQTcsR zvq~EK1}vN$Ha5qzBW6aL-T8M1gO{jFEv34-hhDjY(diEgG%^ff&ErTJos?Hxp_3Tz zTlgX_J^I5tjN!Xhs-6oYWWg245}mKy2V==;YcUq@XNAt;#-zbsmsaGq5wzD^RW%c! zVq;F_li4bAiLG7NP~F8b;`>el%kfS$Z`fpNruwga4VWQ*WV#l7Z0NPqMs8T~+PY%3 zSibnYh-a8|_)Jw;{K6PEKa)cMv8uv3q zr&b3hq9+;F)MgxhW_HYXYh7M<_o^pdfpI+L=#)34lkD3opZGk{xDga7woSxlK9+mX zy63f3M21$=yP_#O4gf&4I(?OyNdSvB+H4C5gjTBdu>nFBl zss_+<%(|$0YQPm6GNQSgVAFFRCyoM;x~GihFa;O!x1lgk1wrnfzH+mbHwcEHax?U6 zp$U81w2qxL8*3K$mr`OXNQ0-da5jd<)!!>TQKaQ{oj8)+re1{FSTsEr~5-1I(AQz>Vf!gPX&Z9UvsE+&~@Vl$lCR5&S?&w&JMq? zt8;q1=#AP-e~n!KeQ@-nycbq!gQ&Ta#pv5j7*)EgvXDPJk?2XbIZW8zQZRZFJZN-0 zzz;QjR#1pO8Jo-0n5cHC6o%$?v;zdX69umb4dM*V-5U3=&QqpNOtRtXwJ%8cLp=h@ zn0e(|U{Ysj{3=IEiHZd_c;_^=O_Hx3yk z!%J<|SzG3ObAPVbdGN}Z3cS6)nG>;1jdU#Ykqyq%Z|G4MwY@4;0*Ij6Cl5-r`I$6Z zzkGv6BXoIg2a!6G5q_(8lRJ}6^r*&DbILqC{E$cUdD0=|R?@;cH?mt=`pZzZmh>IC zl^BaYMRF`3VOF~JLxF|(^S`7Dvbtb;qW{x>WjK|(@4#Hme~ z1cGoW7s)jkORC_Rw)fvBTJu^_T&nCf@77zJAIZuA#NVSDE83;PHjb3--k-xoVRVO& zj+eIIpGDf9x7M$29LB_zHN7?>E#lg-@B?Go7IQIq_K1${{gnXD!S_C$JRiA*IbR*sL7~leowjP;S~RTT-}RlqgSUv+0-zk zJ>2j3YDb?;baC9ajYb|h1AE{D#Vpm6mr|;b$NN?NBRf+TW8}KGIQm~j7gi!>3rk}l z_;PB&>cw^5o%Rd1?xu&6pM+D$Q=c;EM$t$XwU0);OVi^J^DR8>1v>8)IQdxE2sF_M z{V9Ma)lXW490{kaIw%sMnyk9@3Nyw6wdz5HHF$mdBe=&ua1k@swQ!d97&XLw2f}QqkFSPb_r4T|Ku0 zNvB`%flC#r!5z2Flvvkl+9dBKFYFy=*9F;l8g$NSES^HLylH$#R#`r z!c3l_`#xNG^Cs;o(R!c*Z)V(6I419v$1RuhIc`Z$>E%;+e@ZA#N4~8LnsjSZdvf(| zwrIt^nGjh;toAI|MrGeS8};Jp^z7w4d!6X+9#p#XL?t${<6WdybWv4ZOoo%roT1mn#fd}wCSA{o{0end z$agi#qso1-G|hPgl{iAgyc-i@=~I19eVpU_8t*`=RxEUM+7ewV{rGmvVD@2GZ4F}S z$IV4*t2`*(bZVYXZb{sBV%u(*6FK=<)@^l3R-s;bF?16i8BZTISJ&N-B6QI0-5AcD z-4V6xn>GuLAL{=>Z3{DZQLWrJ=|GVPglc(V^+R$xKdR#~e z%B~jLPhaWyg-V~&?&$NasKXZ7p_yIG%mdjg&Se~X?{WAXewvQAhn6QE^TDtlY|wP# zYuPrt{&jg_++(Q82NMf!rz!*U2GwthJVK6s)LlLM=yH^PST+E%<>%f~@R}9k{q+C+ zTY-SYhq?9{QcKb2k7PYn-rLN3`Dmw3ct>++Xz7Jou>1OMY~Z%=v>GCAXUauUX&}hw z1$uBArPzqOG=Ip4@t$l zJ3ei)z3hRpAWV-|fL;559i1r5 z)xc6)vhA`ABdmN@Lr{oLK#kWQ1BKeQEV)G!)airlKqQx6M8sfIQyOS_^ayqsoShGO zuv%IMAQj{;-cxyi7f{Rqtfy)F$-J?CgUth6r_T2OE7uGz9&a6FTz@AAs4pU}4>i$# z@M6dtBuDk3dBrND;>sF46Xp9*98Z5tsI52cAoiMdI4tHi4miI*XMxguQaJs1%q(rYbUdN{ z<v?hpi$4t$#rw>r3K{V;_S*9$L^b?1Ufc22C;DPiQDfSstDvq{S9@x#^v7e{qC5WC zEB(QrW}(yUWESdL7B~-(pNQ{DSzcJ(Y|t9Ltq2FS?W0M?pN9u9S|{lmPDr-iS2Gyp zRaR%K!uoee`m$9!u7|~?R$Mdr(YC?B%yUzt(zuG7UD2A|H^seCJx&s?$C1GVSX5P1C_P2X=XlPYg!Uw?-*TgHLk0^Gkz5*kOzZ>S5zedjC!-? zEr}dzt5O@RG&m_A-Zff)rzLm!KA|^c2`yIR(vM{Wf+UKH@uZo9I(Tw(*>dgTqY8H= zT@7UkA4)U01Kx$?k6LeEK$|k1wa%mS1;uz$H;35@{v6TGb1jKQZm5 z)>ZU0M+~gJ7JmSXu`2NIo-zYb2sJC{Ce#GFdTT0r8I?T~Ty4y{c0!>n6C~4$`Gm7|qxN?|~bnxQ=6S-ms9ytLP^u;v4k)K4Ee&&K@q% z@l5}2*}6Jz8}+5PmqV8ds1X&(*O?LKj`Q#YU?CJV+-p+!8gJC&**t~m-%46PjEDC2 z7kO;Gv{i zqv!+(A`!k{(qO|i3KKVS;x|uq0Az0sLCOl|IK>O-hC4mMvI_bJm66i|ObL*WZUFIr zI>>T-#YI1BdX!(cp5)yKwO7%!2=`Wu1MSbrY{q&T41jC_(shTVkzP!UPRQ+d#FGyf z7Z*jbz(F(KmpD;SP|(xE6&35NZfFSXJh5QS{zZm+o$C>ezEUXU}i|cd$(o!0nDXpb{)LY|sNDDV($#T$S@b2B_Mrw$9GZ_Ipe` z4OQ?uqW0)$2&1z6O=4o0^`j{ikaP%4Gsvc29jvIvrvNvjPk#65-(u&)6D>hO7?`gat&RzAkp^p*3NWr+biRdRO>j>O^fF!L)@tHA0+afeW904GVq z`;MlgqthRW<@DY#O*O62c0V~eihTs+y5Qb|fF#6e9zcK?iYJBcY!&BRU}s_kn4KBRYe#Y=MBV-7_D3u(UQeAB>XYFaV=Z(7ERagv3<8fuU8&L zpPa2Z9ZD@XzOm#kGUPzTZ>(!(ZpXQl8kIicPTwHU$EL#wCrTzN8>Qqs!LbhFK_G|y z0fqyG+ajs%kC3-_B8nc(2HoZPhT9aXk}BFxR=gA&g8OvYVWKruXkL#sr$vE4h3R3> z61Mn+-qpF&?fuB3>8NN{m}LC5u>(=5PPOBzUp;eAa9qMcC>8%)iMEEul6Mc@AU&A; z>sMT$dFwH4N|9`ZTkP?t6A$y5@hB(eV?@K*(nV_-knekIa)Kv(UHeOJbH({|a5ft|8uknO$N*JCn zW&Q!7)vcdQsR9tawa}UQyLe54xeF|3*pm%h0K~ zNG+wJO8p&i>L@X<0Z+78?&_@>_us-*{+muV*}_>eIdaZwCTBg=i4I3)PW;T3;!!u2 zZ;%#qCg=|QDuT%^kINzQ?jhoB0hTrfb!N7m4IDodQDcW34;C5bqWMsSm>?OY?uxf< z{%^awWVipW^c`M?@y$ng`l^$Zv{W7Ck7?uOqLZ8==Qs&&>fpm2W)HwBULgv!iN%UJ*E&s z@8k&d(@1N{A1>S2T1%&I%j#M$u?tUElIJ%@rn{>dPdw>h7fd84gGoL*j#%rTRB7bl z@V&kxUN(D1V?Dy)E=-ydUYr-~Y?(+fJWkRXmyRu`wYFEJ_S|_JE4EeRId6m5pSf1w zaP|R(q5^vVk!(LdKfs#0)fkB)o(<2`xoZGLZaN{~cPJ(l<)E8)afq#$y$C z-dZ6x-ZUY(*)g%N*@yZEZZB;khS*eWG}L-NFIK}9ONLeh?7H;7eTAgg9UqROr{ma1 z;8lk~%gRM-M~iv=_=Gaux7|}#zEVC|6$*3O8;y$;-%*f;an{hOP3!e{3CYnbI4XyE zcUH7#TVkC>Pg*cDfiH&xi7p+?RMX@Q(hiTDL_?vM`8{Au_{SsAc6A_!T|m`lytcvB zZCKZanLei}D*Ny@Y{_}uvSg;J{8gV>cP(AX)E6swh+q(i^^8tUW~p^A)(GP+av$)D zttRbnGm0tD53biAO6yB$y2X~XZ#+ComO%O>w4XfsN9CKhAqD)9@2|*o(K2>x<5ZZ2 zuL8v5+uuVJPq*n12L%Fig#-@j@hX;ce@l`mB~j(<6tlc)FiVf7LmbNcK;_o@KD1WX zpQFrlOS|_7-@f)uPTW30Er(feV`AB|=3g&+ex8N7su0|`;n`>uKnQ_AfUW>1fG>H4 z3m=6h-+BUY%fQ4$<_B#bwb3+k{Oys*nwOps$KoF_qTu`W^f+3ni+jZz-EXV~zdhk$ zUSSfCmKVJ;ZBRX{b5Ebb*n2|V{*^=a%(eh=cLi8BWEO}yN?B^;-R)-MTM*v}(GVhu5bKzIt#?y7NFs+}Fo{4Mce9cC4#$%K$-F+^PpI?+kW;2K$w^+>v zcGs#XVPdW^!JQM6WrN)d)-+bTw+&MH);^Cez49GTF$_pK?*8NdR?(5ycMZsB#E5j-V3v=LG|TcUu1YQc9KVnc zuR^^sXCHSN#w`u5v-B+p}3~?I3O-oObT_*C-~hVlP`QcvN6CwirXH;i19S zrF63V92@t2LpNkRr>y0gy6fb+$BCt90kzD&8nSXEMPvPRFq5<+e&Z+aGwYNNwLJXH zo>(@$ksZVftJLuD@UvMz@mi-mKhGQ2q|8BiF~|+I)Idlp<@E_kgH%E&T2!bT@zZ@E zt`9ow@%H8jP{zxmk-CYPB3sne6Z}f~X>J`q9;O0~pQ;43kwjIjdw;P5O4me&JLj1@(w35~HqE(DE(yCws)0eo?c4;RleD${MTAEIvF^ zx1BpbP}4CAuo+k?A-FcD`<};Jwr_KP#$lDobRD+WYd1k?sakWR|rDM7Z8@AL@<|$X95Msl2 zR)+5)J9beE)s@cv8O_`Ngfx-SZF%LV$+Jc>$Mu>)->QtQPW4}Y1-=s=sH&Q6eI~gi z`#`8$c1%@}-r3*<%l>L6+-=xiZ}CYu*khQn1CC=F32>pMxHUD|1dgS)HO78efz>ln z{rDv@m&3LVMJIz_l}3q=gd{yp8}?hi#@%@I1uD*&HF}a9dr`ISHuEa{11a8ff$3~Y|zD7KLAfV~a4TCSM@_GvC&^+Q zgibAwQOe^|-_E#WjFHZ(k-3I#m!BxsGz3QZTy^8h03ZaJvLP?gM~?TiK6}=(Q*CT> z*5`Aw;tzCMIBfw=bfdUIGvjmxiVHTbn@=Zmj5=Q2RF=Dxa;0{{k2xeW_Z=EFAFivp z{&Kr*v-%aEH1g-joK}aDoi=gO!>)n^L;0EUXYMo8$sIFXVYbb|4TIg&Ivt<27zne7 z7`~-cXsrg`?ytX{n84q%yj3@AW2X<{5IGBAlKou6npJKwvttjhL8MUbDQ`G$)zVB4 zF~F(8dIL%9z6Cj}_w=E5X&M^Psj={Khfd^)oIM9(_+zg#+N{yMIg=h?=Ggm)sD<%Q zTKA*Wgz-gC3o;@b7BX4G(_5-aKwLLgBwCAK9ow8}uZPJmoO3xH^SFTw%Pm53vM_X1 z?XEAG(r-VusUWNMiZ6(?^VhoKvZc@y8{?rGQdVBcrh&ldlD1Qve4j1&Tg*;TXTtd} zD5_2)YIvxrAW=RKQRjfoL~XjI&*>`oSo&jKB=;WOtt1{G>-lne>aq4XH8biKJt(QT2Pcj})(qA_w5-2acd24a*;6Pte&Y(R+uMXFD5~IF_9qs! zLYYzU6!XlHZBEBTnp|H%sn&q4>cOe9YU%rvQB^q(G=)R9soqB$=BddK5qam+gM;5~V;6a!GJ`Pn zK}P4T72Bz+^>jdcXFH%+eg!{#Rq$1$UPhGh;5Qw0AUoIHKI+cXFh4mv3+BXiy&bf) zwN4vK&n~VH;!KkX_OvD1MRPAp&^L6sOo7OvSrbYy18O}`=AS+8#W~e`8FcY&XkzC=-z=|6X@YS-ytLhsTDUVhCLQg zs6>8{a96Ae(VQAc7NzfLM4eA3`uqoV6mO+S=}S>w&|3%h)4N<<*ZhN!9#C*J*D5wA z>)*rkApN8G7Z2eh{O-H>`~{wYLLbUVz^+U2(4~P1pph#-s74;hOfZ-g3Q8`Gjf+gb zJC$|+YxVHam%bbVKLb(A`bm&BEXDQxD$)1Uh&?yk^0Fy*&$Nl-(d}Yf>GQT<@o=>% zxFR9Dez<1(@+kYFf(bOb*tuuk2=L_RGAxK??<0Zv)h8Q&s=IbSPDvot!J##ibZS{QgT9A*&-~%_>&1Opz69@ z%ny^7bthWHWyZws-4I6i#sHEC1)WH7W2P76FWAZ4e;eZ7^HGCI#_OZ8u724@dnZa^ zgz{ZqWhy(_E&J}rSWQ{kA%}CHr|j&;I+Wj!oOp z#8f(fO85kV7CiagKqU`7hhb{UvR6dub0sbZmjn-SbEC>UOBrJavk{q;>>CA1^-;zn zSb zV9*36eY4-3>wX!_SjFPVqgAy@!tTn_JXQG8Wf(*pmG$Lc{}GM8@b(_5)Z;#U#9)%Y z-PxI+%qNE#H6xpLErQ0IYYxAW?di?iic^T6w{bpv&7SI^93QX290_r&9-fS=dugLN zQ7$szSRh`u4C8#rq7;?Ur+rr=GPa%p(I;++$`WQYr`IBpY+f}Q$)-^su=*fxkY!L) zlsR8*v>jMQiqP$)sd(xgp(g-j_4rIUYt@$x!e|q#+0~n@JVtGO&M!zaUIJ&F_bctp zq=M_u`Dx8;m@7rit$I*%&hWpC%=oCV@?YLQFJcpc@G)jy$j=tD^O#o)4Bd*EA%8pu zP{19uY`2#+Yv)ifJprZ65i52 z(*82^u*jrSNWFSYn0I2v%+S)gqe^7S7084aMApV_b@``pIN}H~5QSTNG7IL@1a^qC zbkFL((T(`p@ON9xnrZl6`pj0gtcb4mXRAXTeQy!z880MQyb2Dn~8+^YwoBSIk&F=_*e#<6wS@C8HIYGNHsPC&KiiRB!e=~m3-zz0C=?i zoxVeF&6i~p&$nSv3}3cMf<}VNE3?vbatAs=vjhb5l&5|{2x?1g(pGVm-1dvYw2=#S zc>QxuYaXq~`G5$3mQS)K*Xsn}?j4r#Sh{Z}{g!ib zwf<(1RK{$(kl2&g9FW`hY&V@w^(}gI;)_CiZBm9RzleQ}IZ=+cmQLXmhc6d*b!sBn z%sF6tHs<)TFz?WvMTRhu8glCbO^Xh2l~Zi}UpV*Q!AoB`3r1_V{R#A%GXcgQ^4H5I zb#I2UbAnVIC2{lW!)HJyb297O`fHucqy*Kh%?Stqcev_}PnWL)ISb6s!k)_zoF?)1qrlcX^ti~(T9Ln^pjp;* z2|Tmyu%)~y(Hs?NHb)U(!6?e);hkOKS&CZI;iE!VyOUeEvtm-Xak`JkuRO1jvq8I1 zi<^c;p)ZnC>t9uyb&stWbw9EeKLW5d(O1)${W0w3oOmd7x2p{PDmm}puzqS!J(xgyg>Ptcr_{`P=r3|^{_3PCQ589mf1IQ7nrNKM#=v`mKpAn*1FKI8Y>-g~Q z&z}d-o0m@etAJ#yi6A*X zWYt)!&VQ|DI`&;S-|>Jk)k`vf@m($b-|fz$`$ z&2OFt!rZpYL}MBKuanIEup?}_>h(aDfHCY=uc$hUh+4Lxr*un6@%-=dw1sSNbcSy? z#$4YGt@SZ=ehcrC9G00>Nsi;4GSyzadaXBu_xYL%(b3+}grTW>-Tu;N zu0%>Y5lh(n#%FvNN2hnLU{CrEsW2Uq9jOhf;IcqKFVRz9QS;G2De;ChLHtuwFXyQB z%(Kr#CxL{|oRu#Qc1ehE$ttW8xox{)h9>%DAsI zeT&Frf{0gfu}XoD-jo7S^?Ro1)CSjPSB&30<2Ars5K)53en@cP;BE(hPc?t``LyBq zB5Zc$ipiT@Z|n1k{z9)s#rEU=ObQtY#r(z2aj}V5sRH=6gWI?>M~Z#y45pS+PsJ0N zSK-LXuk=-^UN4Pn#&g9mhx*lgbb|ITFRt+%v_+k1sfOLO5fN(a+BYvgnZHI=uOqs= z!yB$_ecRVraGRXiu9pj?&4qt8Uh>jv=iNk0EfxP*Rt|9@Nwm$L*`@T(1wv-8J#oeV ztRJl39pF(p;Q~wI>9G=Uqu%@oVsh)dEms@4r|bfg?2C?OLS?ysUw^UVX|lKcK4DnH zb6&*0IM?SOp>nkAO7z*~y8fwi9t#&|Bj+V81=%BNY_xgojoIIger7|CvP{&8l8&A6 z+qZ7GgsU|kg}NW#NOHgEE4Ho7J_qMpAsd<(7M|FT?4BXIcpIaS+h0Km3S|5fO)y*> zZsuuOS_dI88sLwXQUcpHB4Kz}t^KqL@y5B2G2Vw>IpET))q*=PeohrCrjvBBQgU2a zUo3H6a29odmN~M{OJ`)u??z zkgvmf~yt~NtMT(YMlZPA?$}#!c!YtZg;HY$?_4V~9Rap1N zU8hsq?Dn}r-qPLf-)AXU#Z3Fa)Z79V@x8h5+YN4N@w9dB7eCI7TS73Y%e4uMBy)6sKri8<6>mHoE8ayD!+#6gih;(HlQ}4ldh~6CaFet1;kg zTBF~Usiw+jI%6G@Cvf&uVsCp?-L7(@^i*+f1te;#|8k$T&t@xA zMSpqu?2#>OF&La0tgCMGUbUTdY~*gNKzaA15HD8*=5fvOs!Sh*vZWSZHmYi^UIAPv z_f4{=;7HCB1ygCN0cS?6qEEA=;t{FKS^8!5ubDg)RbOi5V?-(;$w^6ooSnf#v2KI? z^YNhhi4$+*&yiD@BE)0D=+~Fe0yi9GmG3SdG;=jzv<~}(Mpgsl8snJfX0dGulDYec z)ICv+AItsNPEx`WUy(y!WW106&A>n{qqmywp%`ZRl?C5KS{Ba7K4@$`a^TDQhLYo0 zbGkv@=A&we?+f$pnv+gn1+NosO3S@mzn4ESg}JiiWJ)AsH_809NXy0t9{P2s=UFBVKm zY%m^gN%Gweb~o)=mVNII@qrL4wTtyPF&Y<2bNK|xGnCZ5)%;H(N%7KIN<94}$Edrdl; ze-YbVNNynU@~~@`p6Sc9qDp=nZFI7=-IIAa>CY*-g`D@PZz-|Lher2M(Wn1t>syqp zN9Jq6=yuLVq+2(VkGHfC4*8hbMjvKjAB-evQk+dBLmx((mKw^?vXy59-(eZg?EOMT z$2Qz(SZsn>ED4IBJ`PJ2eewpL_4_cbjHDwtv5L1q6%G)+&0x)(kGEGl0w$*CL^TWb zL_|Gy5{IN){YhxfT5=TOC$IN1APt9@tz3c}Du`#pr|K+6=i;vS=8YnK+Brw}Av9!{ zBfmN>V6SEnvb1_`+1j55>Lhh1m4YFb(X%K&!%O(Pq=A99GNzp`#I#rr`#skmqD3So z=e_S9oed=a{*tA9a!(ta7y~p_k3lAakjkk?tMAmnOG`cC`%Fy_I8G>Jqtp^2_|gL zUI$j+>+v&X`F)CX_>y5LOYLl@w*exoZ`_GJ?4#P|dTn#9Q~EPolQKJiCsdX*?VYV;m1W{I9G21?cUEIrvBGaTl22Jn8;0u1?F-N zyohTr!C~%;Rh9PD=RdzYl1~-a@zT8v9M-Tp)vWi)-ZHOf31K`b|HX>u>l}FMSNwIl z-q_)j1Cg4EvRnF;LDxrH^x@}X<)o9Jp90q-(mp&>Wb)wtI~O_;k$O^HYUbr|zDUvz zA%oV@B!Ya$raM-+| zZ8~P^9EI91_BwZ@hOqYdUhe#Qf?(L9p>uD_9<}pbQ&sobT#`&FCygdHtXWL47*Zi8 zzp#VJZuLf2L`Ie6JyUmema@0`0mi2y`in+hxg`7886yul7B#H4a6cYavTLezwnl;QPlc8 z<+xI=O)2hkaENZSKF#O2PuB%`sOh~odDe(DR`Rh=eyW;s>it$y-GHfey=&+YMrb%c zb&{|aL)d+zWvI;lSa@xQ+&+NaHP(>%*l0VAYi@tg@7`kjT7V#{co|oe7PIk7HDU+J zPv~9u$%0%RSK@n`sW7k0$$Sk{ssJK8$~9$d;j>S(duphb_oYM9{tz$kZ!hX=mfv(= zVli@ZY^@QwXN&cEK!Dlw;Wmge5=J-GteK3iTWuo%kvi40OW;G_ZWow)+3GO+itGN` zb+t%_8mTE%k)+ofs5ZG9yc#oK1ky1ID9gQq=6eWOeI=A%%!wO?32?bhZg#~=irAZ8 zu)zoBc-gxV7o9`-1zpCzWNa`5nkqa6d5Lzs;5brN{1TAA=v{U!PN5Dt&oQ#&daGFv z!OZP4ik&8l=3u22yJ!i6=FhxVU3ZesD|SDNxmAL5tu36qyngNp?uZ+oPnEZ240w5^ zmrJ}m&>zAWu3&=88%~kZGV}3IIXo^hnCK1_4bpF;^SfRRnr(8o>m9OYS^Hw?O z7&b=!<9PJP0}c-!$dt8-a=mq*xF*T%c}bslzrt6RXhTwtQRSjXslT7U_`5HZ z&7u4b`)0}IB=c%{Nt*m3?hacK**Todsr;W9B+9AR`pJ z(1x93XS@IUk&zQ}T7o?PtXF;Nhv2Ly6LQ!W?@RCfv_WqqgUzzO*ckb%&}$hWb^!`6 zp1szmCqCV2^6Ns}VE+x$BsG3&-9wu6qr3__!aK{h@#ytlB&(yj4@QT?rG8r);=r=6;1(36F( zV@Cf8#9US|dS24BgzCP;MoLZEA-T+qHfTu$QIL@}z$3}l0XOs}7@XjIYu(@o928@C z5cK!PxwZGDYOl|#UhX^3)L(MN>UYcbZhF$cKiDnJ4m2)rumRXAUoi82?4K{?`E{T} zmkeGI93?1_Pe^E3xhqir%d4#C{d+epJb0p3r$pyS!j4N96o5vA06W_amX#mdF07vX z^t!8hZCrT$^7-o<;*S3K8TIufuX{UNp9FZ$m`-K~GOTf^$5zjV`h8LYAC}Ml_4f?053|Jqcs}Wj`?A~LTgQgpzo7BOMehB(N2~YiZ|e5@b$V^| z*52OxvQiog?EBeS!_3XGpUcBF)ld*tjUv!q$ z-CVhbbEd$1hwGQ|@+dO$xB*W<F|sQIh4+h*&( z-~Z#+MD0b=|CT@d70&cWo`C||npU{v`3<wj`_1O^5w40T!fxB|=w#>4>+~(>H4?`XwT=n*Q_I3saaf7s { + await page.goto('/fix'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(200); +} + +async function collapse(page: Page): Promise { + await page.locator('.collapse-btn').click(); + await page.waitForTimeout(300); +} + +type Rect = { x: number; y: number; width: number; height: number; top: number; right: number; bottom: number; left: number }; + +async function getRect(page: Page, selector: string): Promise { + return page.locator(selector).evaluate((el) => { + const r = el.getBoundingClientRect(); + return { x: r.x, y: r.y, width: r.width, height: r.height, top: r.top, right: r.right, bottom: r.bottom, left: r.left }; + }); +} + +// ── Logo ────────────────────────────────────────────────────────────────────── + +test.describe('Shell — logo area', () => { + test('logo is visible and non-zero height when expanded', async ({ page }) => { + await gotoFix(page); + const r = await getRect(page, '.layout-logo'); + expect(r.height).toBeGreaterThan(0); + expect(r.width).toBeGreaterThan(0); + }); + + test('logo shows full "KeyLint" text when expanded', async ({ page }) => { + await gotoFix(page); + const text = await page.locator('.layout-logo').innerText(); + expect(text.trim()).toContain('Key'); + expect(text.trim()).toContain('Lint'); + }); + + test('logo shows "KL" icon when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const text = await page.locator('.layout-logo').innerText(); + expect(text.trim()).toBe('KL'); + }); + + test('logo "K" is horizontally centered within the collapsed sidebar', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const sidebar = await getRect(page, '.layout-sidebar'); + const logoIcon = await getRect(page, '.layout-logo .logo-icon'); + + const sidebarCenterX = sidebar.left + sidebar.width / 2; + const iconCenterX = logoIcon.left + logoIcon.width / 2; + + expect(Math.abs(iconCenterX - sidebarCenterX), 'logo K centering offset') + .toBeLessThanOrEqual(8); + }); +}); + +// ── Icon size consistency ───────────────────────────────────────────────────── + +test.describe('Shell — icon size consistency', () => { + test('all nav icons have the same rendered height when expanded', async ({ page }) => { + await gotoFix(page); + + const fixH = (await getRect(page, '.nav-item a[href="/fix"] i')).height; + const settingsH = (await getRect(page, '.nav-item a[href="/settings"] i')).height; + const pyramidH = (await getRect(page, '.nav-item a[href="/enhance"] svg')).height; + + // All should be within 4px of each other + expect(Math.abs(fixH - settingsH), 'fix vs settings height diff').toBeLessThanOrEqual(4); + expect(Math.abs(fixH - pyramidH), 'fix vs pyramid height diff').toBeLessThanOrEqual(4); + }); + + test('all nav icons have the same rendered height when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const fixH = (await getRect(page, '.nav-item a[href="/fix"] i')).height; + const settingsH = (await getRect(page, '.nav-item a[href="/settings"] i')).height; + const pyramidH = (await getRect(page, '.nav-item a[href="/enhance"] svg')).height; + + expect(Math.abs(fixH - settingsH), 'fix vs settings height diff collapsed').toBeLessThanOrEqual(4); + expect(Math.abs(fixH - pyramidH), 'fix vs pyramid height diff collapsed').toBeLessThanOrEqual(4); + }); + + test('all nav items have the same rendered height (click-target parity) when expanded', async ({ page }) => { + await gotoFix(page); + + const heights = await page.locator('.nav-item a').evaluateAll((els) => + els.map((el) => el.getBoundingClientRect().height), + ); + const min = Math.min(...heights); + const max = Math.max(...heights); + expect(max - min, 'nav item height variance').toBeLessThanOrEqual(4); + }); + + test('all nav items have the same rendered height when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const heights = await page.locator('.nav-item a').evaluateAll((els) => + els.map((el) => el.getBoundingClientRect().height), + ); + const min = Math.min(...heights); + const max = Math.max(...heights); + expect(max - min, 'collapsed nav item height variance').toBeLessThanOrEqual(4); + }); +}); + +// ── Version row ─────────────────────────────────────────────────────────────── + +test.describe('Shell — version row in collapsed state', () => { + test('version text is not visible when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const count = await page.locator('[data-testid="version-footer"] .version-text').count(); + expect(count, 'version-text should be absent when collapsed').toBe(0); + }); + + test('version-row height when collapsed is not taller than the version-row height when expanded', async ({ page }) => { + await gotoFix(page); + const expandedH = (await getRect(page, '[data-testid="version-footer"]')).height; + + await collapse(page); + const collapsedH = (await getRect(page, '[data-testid="version-footer"]')).height; + + // Collapsed version row should not be taller (it has less or no content) + expect(collapsedH, 'collapsed version-row height').toBeLessThanOrEqual(expandedH + 2); + }); + + test('version-row has no visible text content when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const text = await page.locator('[data-testid="version-footer"]').innerText().catch(() => ''); + expect(text.trim(), 'version-row inner text when collapsed').toBe(''); + }); +}); + +// ── Footer layout ───────────────────────────────────────────────────────────── + +test.describe('Shell — sidebar footer layout', () => { + test('collapse button fills the full width of the sidebar', async ({ page }) => { + await gotoFix(page); + const sidebar = await getRect(page, '.layout-sidebar'); + const btn = await getRect(page, '.collapse-btn'); + // Button width should match sidebar width (it has width:100%) + expect(Math.abs(btn.width - sidebar.width), 'collapse-btn width vs sidebar').toBeLessThanOrEqual(4); + }); + + test('collapse button fills the full width of the collapsed sidebar', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const sidebar = await getRect(page, '.layout-sidebar'); + const btn = await getRect(page, '.collapse-btn'); + expect(Math.abs(btn.width - sidebar.width), 'collapse-btn width vs collapsed sidebar').toBeLessThanOrEqual(4); + }); + + test('sidebar footer is fully within sidebar bounds', async ({ page }) => { + await gotoFix(page); + const sidebar = await getRect(page, '.layout-sidebar'); + const footer = await page.locator('.sidebar-footer').evaluate((el) => { + const r = el.getBoundingClientRect(); + return { left: r.left, right: r.right }; + }); + expect(footer.left).toBeGreaterThanOrEqual(sidebar.left - 1); + expect(footer.right).toBeLessThanOrEqual(sidebar.right + 1); + }); + + test('sidebar footer is fully within collapsed sidebar bounds', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const sidebar = await getRect(page, '.layout-sidebar'); + const footer = await page.locator('.sidebar-footer').evaluate((el) => { + const r = el.getBoundingClientRect(); + return { left: r.left, right: r.right }; + }); + expect(footer.right).toBeLessThanOrEqual(sidebar.right + 1); + }); +}); + +// ── Active route colour ─────────────────────────────────────────────────────── + +test.describe('Shell — active route highlight colour', () => { + test('active nav link has orange-ish background', async ({ page }) => { + await gotoFix(page); + const bg = await page.locator('.nav-item a[href="/fix"]').evaluate( + (el) => getComputedStyle(el).backgroundColor, + ); + // Should be orange (rgb(249, 115, 22) = #f97316) or close to it + // Accept any non-transparent, non-surface background + expect(bg).not.toBe('rgba(0, 0, 0, 0)'); + expect(bg).not.toBe('transparent'); + }); + + test('inactive nav links have no prominent background', async ({ page }) => { + await gotoFix(page); + for (const href of ['/enhance', '/settings']) { + const bg = await page.locator(`.nav-item a[href="${href}"]`).evaluate( + (el) => getComputedStyle(el).backgroundColor, + ); + // Should be transparent or the dark surface colour — NOT orange + const isOrange = bg.includes('249') && bg.includes('115'); + expect(isOrange, `${href} should not have orange background`).toBe(false); + } + }); + + test('Pyramidize SVG icon colour changes to white when link is active', async ({ page }) => { + await page.goto('/enhance'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(200); + + // SVG uses stroke="currentColor" — computed color on the should be white + const color = await page.locator('.nav-item a[href="/enhance"]').evaluate( + (el) => getComputedStyle(el).color, + ); + // Active colour should be white (rgb(255, 255, 255)) + expect(color, 'Pyramidize link color when active').toBe('rgb(255, 255, 255)'); + }); +}); + +// ── Hover styles (visual integrity) ────────────────────────────────────────── + +test.describe('Shell — hover visual integrity', () => { + test('nav link cursor is pointer', async ({ page }) => { + await gotoFix(page); + for (const href of ['/fix', '/enhance', '/settings']) { + const cursor = await page.locator(`.nav-item a[href="${href}"]`).evaluate( + (el) => getComputedStyle(el).cursor, + ); + expect(cursor, `${href} cursor`).toBe('pointer'); + } + }); +}); diff --git a/frontend/e2e/shell-menu-deep2.spec.ts b/frontend/e2e/shell-menu-deep2.spec.ts new file mode 100644 index 0000000..973fa61 --- /dev/null +++ b/frontend/e2e/shell-menu-deep2.spec.ts @@ -0,0 +1,208 @@ +/** + * Shell sidebar — third layer of visual regression tests. + * + * Probes icon width parity, hover colour consistency, logo area height, + * padding geometry, and sidebar scroll behaviour. + */ + +import { test, expect, Page } from '@playwright/test'; + +async function gotoFix(page: Page): Promise { + await page.goto('/fix'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(200); +} + +async function collapse(page: Page): Promise { + await page.locator('.collapse-btn').click(); + await page.waitForTimeout(300); +} + +type Rect = { x: number; y: number; width: number; height: number; top: number; right: number; bottom: number; left: number }; + +async function getRect(page: Page, selector: string): Promise { + return page.locator(selector).evaluate((el) => { + const r = el.getBoundingClientRect(); + return { x: r.x, y: r.y, width: r.width, height: r.height, top: r.top, right: r.right, bottom: r.bottom, left: r.left }; + }); +} + +// ── Icon width parity ───────────────────────────────────────────────────────── + +test.describe('Shell — icon width parity', () => { + test('all nav icons have the same rendered width when expanded', async ({ page }) => { + await gotoFix(page); + + const fixW = (await getRect(page, '.nav-item a[href="/fix"] i')).width; + const settingsW = (await getRect(page, '.nav-item a[href="/settings"] i')).width; + const pyramidW = (await getRect(page, '.nav-item a[href="/enhance"] svg')).width; + + expect(Math.abs(fixW - settingsW), 'fix vs settings icon width').toBeLessThanOrEqual(4); + expect(Math.abs(fixW - pyramidW), 'fix vs pyramid icon width').toBeLessThanOrEqual(4); + }); + + test('all nav icons have the same rendered width when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const fixW = (await getRect(page, '.nav-item a[href="/fix"] i')).width; + const settingsW = (await getRect(page, '.nav-item a[href="/settings"] i')).width; + const pyramidW = (await getRect(page, '.nav-item a[href="/enhance"] svg')).width; + + expect(Math.abs(fixW - settingsW), 'fix vs settings icon width collapsed').toBeLessThanOrEqual(4); + expect(Math.abs(fixW - pyramidW), 'fix vs pyramid icon width collapsed').toBeLessThanOrEqual(4); + }); +}); + +// ── Hover colour parity ─────────────────────────────────────────────────────── + +test.describe('Shell — hover colour parity', () => { + /** + * On hover the icons turn orange (explicit rule). + * The SVG pyramid uses stroke="currentColor" and should also turn orange. + * Compare two *non-active* links so active-route white doesn't pollute results. + */ + test(' icons and SVG pyramid icon have the same effective color on hover', async ({ page }) => { + // Navigate to settings so that neither Fix nor Pyramidize is active. + await page.goto('/settings'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(200); + + // Hover the Fix link (non-active), wait for transition to settle, then capture. + await page.locator('.nav-item a[href="/fix"]').hover(); + await page.waitForTimeout(200); // let the 150ms color transition finish + const fixIconColor = await page.locator('.nav-item a[href="/fix"] i').evaluate( + (el) => getComputedStyle(el).color, + ); + + // Hover the Pyramidize link (non-active), wait, then capture SVG color. + await page.locator('.nav-item a[href="/enhance"]').hover(); + await page.waitForTimeout(200); + const pyramidIconColor = await page.locator('.nav-item a[href="/enhance"] svg').evaluate( + (el) => getComputedStyle(el).color, + ); + + // Both should be the same orange accent colour when hovered. + expect(pyramidIconColor, 'SVG colour on hover should match colour on hover') + .toBe(fixIconColor); + }); + + test(' icon color is the same before and after hovering a different nav item', async ({ page }) => { + await gotoFix(page); + const beforeColor = await page.locator('.nav-item a[href="/fix"] i').evaluate( + (el) => getComputedStyle(el).color, + ); + // Hover settings — should not change Fix icon color + await page.locator('.nav-item a[href="/settings"]').hover(); + const afterColor = await page.locator('.nav-item a[href="/fix"] i').evaluate( + (el) => getComputedStyle(el).color, + ); + expect(afterColor).toBe(beforeColor); + }); +}); + +// ── Logo area height ────────────────────────────────────────────────────────── + +test.describe('Shell — logo area dimensions', () => { + test('logo area height is the same in expanded and collapsed state (padding drives height)', async ({ page }) => { + await gotoFix(page); + const expandedH = (await getRect(page, '.layout-logo')).height; + + await collapse(page); + const collapsedH = (await getRect(page, '.layout-logo')).height; + + // Height should not change significantly (same padding, same font-size) + expect(Math.abs(expandedH - collapsedH), 'logo area height diff').toBeLessThanOrEqual(4); + }); + + test('logo "K" is fully visible (not clipped) in collapsed state', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const sidebar = await getRect(page, '.layout-sidebar'); + const logoIcon = await getRect(page, '.layout-logo .logo-icon'); + + // The "K" must be fully within the sidebar + expect(logoIcon.left).toBeGreaterThanOrEqual(sidebar.left - 1); + expect(logoIcon.right).toBeLessThanOrEqual(sidebar.right + 1); + expect(logoIcon.width).toBeGreaterThan(0); + }); + + test('logo padding does not cause the "K" to be wider than the sidebar', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const sidebar = await getRect(page, '.layout-sidebar'); + const logoIcon = await getRect(page, '.layout-logo .logo-icon'); + + expect(logoIcon.width).toBeLessThanOrEqual(sidebar.width); + }); +}); + +// ── Sidebar scroll ──────────────────────────────────────────────────────────── + +test.describe('Shell — no unexpected scroll', () => { + test('sidebar has no vertical scrollbar overflow in expanded state', async ({ page }) => { + await gotoFix(page); + const overflow = await page.locator('.layout-sidebar').evaluate( + (el) => getComputedStyle(el).overflowY, + ); + // Should be 'hidden' (not 'scroll' or 'auto' with content exceeding height) + expect(overflow).toBe('hidden'); + }); + + test('sidebar nav does not overflow the sidebar vertically', async ({ page }) => { + await gotoFix(page); + const sidebar = await getRect(page, '.layout-sidebar'); + const nav = await getRect(page, '.sidebar-nav'); + + expect(nav.top).toBeGreaterThanOrEqual(sidebar.top - 1); + expect(nav.bottom).toBeLessThanOrEqual(sidebar.bottom + 1); + }); +}); + +// ── Active route - background width ────────────────────────────────────────── + +test.describe('Shell — active route background', () => { + test('active link background spans the full nav-item width (not just icon)', async ({ page }) => { + await gotoFix(page); + + // Get the width of the active element + const activeRect = await getRect(page, '.nav-item a[href="/fix"]'); + expect(activeRect.width).toBeGreaterThan(0); + + // Verify the background is actually painted (non-transparent) + const bg = await page.locator('.nav-item a[href="/fix"]').evaluate( + (el) => getComputedStyle(el).backgroundColor, + ); + expect(bg).not.toBe('rgba(0, 0, 0, 0)'); + }); + + test('active link background width in collapsed state is appropriate (not zero)', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const activeRect = await getRect(page, '.nav-item a[href="/fix"]'); + expect(activeRect.width).toBeGreaterThan(20); + + const bg = await page.locator('.nav-item a[href="/fix"]').evaluate( + (el) => getComputedStyle(el).backgroundColor, + ); + expect(bg).not.toBe('rgba(0, 0, 0, 0)'); + }); +}); + +// ── Version row padding ─────────────────────────────────────────────────────── + +test.describe('Shell — version row padding in collapsed state', () => { + test('version-row has zero or minimal height when collapsed with no content', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const r = await getRect(page, '[data-testid="version-footer"]'); + // When collapsed and no update available, the row has no content. + // It should collapse to near-zero rather than maintaining full expanded padding. + // This test will fail if the row keeps its full padding (wasted visual space). + expect(r.height, 'version-row should not have large height when empty').toBeLessThanOrEqual(16); + }); +}); diff --git a/frontend/e2e/shell-menu-deep3.spec.ts b/frontend/e2e/shell-menu-deep3.spec.ts new file mode 100644 index 0000000..71cc305 --- /dev/null +++ b/frontend/e2e/shell-menu-deep3.spec.ts @@ -0,0 +1,162 @@ +/** + * Shell sidebar — fourth layer. + * + * Probes: footer dead-space, version-row click target in collapsed state, + * nav item left-edge alignment, sidebar total height, and logo top/bottom + * padding asymmetry when collapsed. + */ + +import { test, expect, Page } from '@playwright/test'; + +async function gotoFix(page: Page): Promise { + await page.goto('/fix'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(200); +} + +async function collapse(page: Page): Promise { + await page.locator('.collapse-btn').click(); + await page.waitForTimeout(300); +} + +type Rect = { x: number; y: number; width: number; height: number; top: number; right: number; bottom: number; left: number }; + +async function getRect(page: Page, selector: string): Promise { + return page.locator(selector).evaluate((el) => { + const r = el.getBoundingClientRect(); + return { x: r.x, y: r.y, width: r.width, height: r.height, top: r.top, right: r.right, bottom: r.bottom, left: r.left }; + }); +} + +// ── Version-row dead-space ───────────────────────────────────────────────────── + +test.describe('Shell — version-row dead-space when collapsed', () => { + test('version-row has no visible / hoverable area when collapsed with no content', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + // When collapsed with no update: version-row should not present an + // accidental hover target. Height > 0 means there is dead clickable space. + const r = await getRect(page, '[data-testid="version-footer"]'); + expect(r.height, 'version-row should have zero height when empty-collapsed').toBe(0); + }); +}); + +// ── Nav item left-edge alignment ─────────────────────────────────────────────── + +test.describe('Shell — nav item alignment', () => { + test('all nav items have the same left edge (consistent margin) when expanded', async ({ page }) => { + await gotoFix(page); + + const lefts = await page.locator('.nav-item a').evaluateAll((els) => + els.map((el) => el.getBoundingClientRect().left), + ); + const min = Math.min(...lefts); + const max = Math.max(...lefts); + expect(max - min, 'nav item left-edge variance').toBeLessThanOrEqual(2); + }); + + test('all nav items have the same left edge when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const lefts = await page.locator('.nav-item a').evaluateAll((els) => + els.map((el) => el.getBoundingClientRect().left), + ); + const min = Math.min(...lefts); + const max = Math.max(...lefts); + expect(max - min, 'collapsed nav item left-edge variance').toBeLessThanOrEqual(2); + }); + + test('all nav icons have the same horizontal center when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const iconSelectors = [ + '.nav-item a[href="/fix"] i', + '.nav-item a[href="/enhance"] svg', + '.nav-item a[href="/settings"] i', + ]; + + const centers = await Promise.all( + iconSelectors.map((sel) => + page.locator(sel).evaluate((el) => { + const r = el.getBoundingClientRect(); + return r.left + r.width / 2; + }), + ), + ); + + const min = Math.min(...centers); + const max = Math.max(...centers); + expect(max - min, 'icon horizontal center variance when collapsed').toBeLessThanOrEqual(4); + }); +}); + +// ── Sidebar total height ─────────────────────────────────────────────────────── + +test.describe('Shell — sidebar fills viewport height', () => { + test('sidebar height equals the viewport height', async ({ page }) => { + await gotoFix(page); + const viewportHeight = page.viewportSize()!.height; + const r = await getRect(page, '.layout-sidebar'); + expect(r.height, 'sidebar height').toBeGreaterThanOrEqual(viewportHeight - 2); + }); + + test('sidebar height equals the viewport height when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const viewportHeight = page.viewportSize()!.height; + const r = await getRect(page, '.layout-sidebar'); + expect(r.height, 'collapsed sidebar height').toBeGreaterThanOrEqual(viewportHeight - 2); + }); +}); + +// ── Layout-main fills remaining space ───────────────────────────────────────── + +test.describe('Shell — layout-main dimensions', () => { + test('layout-main right edge touches viewport right edge', async ({ page }) => { + await gotoFix(page); + const viewportWidth = page.viewportSize()!.width; + const r = await getRect(page, '.layout-main'); + expect(Math.abs(r.right - viewportWidth), 'layout-main right edge').toBeLessThanOrEqual(2); + }); + + test('sidebar and main together fill the full viewport width', async ({ page }) => { + await gotoFix(page); + const viewportWidth = page.viewportSize()!.width; + const sidebar = await getRect(page, '.layout-sidebar'); + const main = await getRect(page, '.layout-main'); + expect(Math.abs((sidebar.width + main.width) - viewportWidth), 'sidebar + main width').toBeLessThanOrEqual(4); + }); + + test('layout-main expands when sidebar is collapsed', async ({ page }) => { + await gotoFix(page); + const expandedMainWidth = (await getRect(page, '.layout-main')).width; + + await collapse(page); + const collapsedMainWidth = (await getRect(page, '.layout-main')).width; + + expect(collapsedMainWidth).toBeGreaterThan(expandedMainWidth); + }); +}); + +// ── Logo vertical padding when collapsed ────────────────────────────────────── + +test.describe('Shell — logo area padding in collapsed state', () => { + test('logo "K" is vertically centered within the logo area (top ≈ bottom gap)', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const logoArea = await getRect(page, '.layout-logo'); + const logoIcon = await getRect(page, '.layout-logo .logo-icon'); + + const topGap = logoIcon.top - logoArea.top; + const bottomGap = logoArea.bottom - logoIcon.bottom; + + // With padding: 1.5rem 1rem 1rem, top gap is larger than bottom gap. + // This test checks if the asymmetric vertical padding looks intentional. + // Top gap should not be more than 2× the bottom gap (otherwise "K" looks dropped). + expect(topGap / bottomGap, '"K" vertical position ratio (top/bottom gap)').toBeLessThanOrEqual(2.5); + }); +}); diff --git a/frontend/e2e/shell-menu-deep4.spec.ts b/frontend/e2e/shell-menu-deep4.spec.ts new file mode 100644 index 0000000..565946f --- /dev/null +++ b/frontend/e2e/shell-menu-deep4.spec.ts @@ -0,0 +1,230 @@ +/** + * Shell sidebar — fifth layer. + * + * Covers the five fixes made in this session: + * 1. No scrollbar on hover-expand (layout-main does not resize) + * 2. Active Pyramidize icon is white (not orange-on-orange) + * 3. Collapsed logo shows "KL" with K white / L orange + * 4. Collapse button is at least 40px tall + * 5. Hover-expand: sidebar expands to full width on hover; collapses on leave + */ + +import { test, expect, Page } from '@playwright/test'; + +async function gotoFix(page: Page): Promise { + await page.goto('/fix'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(200); +} + +async function collapse(page: Page): Promise { + await page.locator('.collapse-btn').click(); + await page.waitForTimeout(350); // CSS transition +} + +type Rect = { width: number; height: number; left: number; right: number; top: number; bottom: number }; +async function getRect(page: Page, selector: string): Promise { + return page.locator(selector).evaluate((el) => { + const r = el.getBoundingClientRect(); + return { width: r.width, height: r.height, left: r.left, right: r.right, top: r.top, bottom: r.bottom }; + }); +} + +// ── 1. No layout shift / scrollbar on hover-expand ──────────────────────────── + +test.describe('Shell — hover-expand does not shift layout', () => { + test('layout-main width does NOT change when hovering the collapsed sidebar', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const mainBefore = await getRect(page, '.layout-main'); + + // Hover the sidebar — triggers hover-expand + await page.locator('.layout-sidebar').hover(); + await page.waitForTimeout(350); // transition complete + + const mainAfter = await getRect(page, '.layout-main'); + + // Main content must not resize (sidebar is overlay, not push) + expect(Math.abs(mainAfter.width - mainBefore.width), 'main width shift on hover').toBeLessThanOrEqual(2); + expect(Math.abs(mainAfter.left - mainBefore.left), 'main left shift on hover').toBeLessThanOrEqual(2); + }); + + test('layout-main has no horizontal scrollbar after hover-expand', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + await page.locator('.layout-sidebar').hover(); + await page.waitForTimeout(350); + + const overflow = await page.locator('.layout-main').evaluate( + (el) => getComputedStyle(el).overflowX, + ); + // Should be auto (or hidden) but must not have an actual scrollbar + const scrollWidth = await page.locator('.layout-main').evaluate( + (el) => (el as HTMLElement).scrollWidth, + ); + const clientWidth = await page.locator('.layout-main').evaluate( + (el) => (el as HTMLElement).clientWidth, + ); + expect(scrollWidth, 'scrollWidth <= clientWidth (no horiz scroll)').toBeLessThanOrEqual(clientWidth + 2); + }); +}); + +// ── 2. Active Pyramidize icon is white (not orange-on-orange) ───────────────── + +test.describe('Shell — active Pyramidize SVG icon colour', () => { + test('SVG pyramid icon is white (not orange) when Pyramidize is the active route', async ({ page }) => { + await page.goto('/enhance'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(200); + + const svgColor = await page.locator('.nav-item a[href="/enhance"] svg').evaluate( + (el) => getComputedStyle(el).color, + ); + // Must be white, not orange + expect(svgColor, 'SVG color on active Pyramidize link').toBe('rgb(255, 255, 255)'); + }); + + test('SVG pyramid icon is NOT orange when Pyramidize is the active route', async ({ page }) => { + await page.goto('/enhance'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(200); + + const svgColor = await page.locator('.nav-item a[href="/enhance"] svg').evaluate( + (el) => getComputedStyle(el).color, + ); + const isOrange = svgColor.includes('249') || svgColor.includes('251'); + expect(isOrange, 'SVG should not be orange on active background').toBe(false); + }); +}); + +// ── 3. Collapsed logo shows "KL" ────────────────────────────────────────────── + +test.describe('Shell — collapsed logo "KL"', () => { + test('collapsed logo text is "KL"', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const text = await page.locator('.layout-logo').innerText(); + expect(text.trim()).toBe('KL'); + }); + + test('"K" in collapsed logo is white', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const color = await page.locator('.layout-logo .logo-key').evaluate( + (el) => getComputedStyle(el).color, + ); + // --p-surface-50 resolves to #fafafa (rgb(250,250,250)) in this theme + expect(color, '"K" should be near-white').toMatch(/^rgb\(2[45]\d, 2[45]\d, 2[45]\d\)$/); + }); + + test('"L" in collapsed logo is orange', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const color = await page.locator('.layout-logo .logo-lint').evaluate( + (el) => getComputedStyle(el).color, + ); + // Primary orange: rgb(249, 115, 22) or similar + const isOrange = color.includes('249') || color.includes('251') || color.includes('247'); + expect(isOrange, 'L should be orange').toBe(true); + }); + + test('expanded logo shows "KeyLint" (not "KL")', async ({ page }) => { + await gotoFix(page); + const text = await page.locator('.layout-logo').innerText(); + expect(text.trim()).toContain('Key'); + expect(text.trim()).toContain('Lint'); + expect(text.trim()).not.toBe('KL'); + }); +}); + +// ── 4. Collapse button minimum height ───────────────────────────────────────── + +test.describe('Shell — collapse button height', () => { + test('collapse button is at least 40px tall when expanded', async ({ page }) => { + await gotoFix(page); + const r = await getRect(page, '.collapse-btn'); + expect(r.height, 'collapse-btn height when expanded').toBeGreaterThanOrEqual(40); + }); + + test('collapse button is at least 40px tall when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const r = await getRect(page, '.collapse-btn'); + expect(r.height, 'collapse-btn height when collapsed').toBeGreaterThanOrEqual(40); + }); +}); + +// ── 5. Hover-expand popover ─────────────────────────────────────────────────── + +test.describe('Shell — hover-expand popover', () => { + test('sidebar expands to full width when hovering while collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + // Confirm collapsed + const collapsedWidth = (await getRect(page, '.layout-sidebar')).width; + expect(collapsedWidth).toBeLessThanOrEqual(60); + + // Hover to trigger expand + await page.locator('.layout-sidebar').hover(); + await page.waitForTimeout(350); + + const hoveredWidth = (await getRect(page, '.layout-sidebar')).width; + expect(hoveredWidth, 'sidebar width on hover').toBeGreaterThan(200); + }); + + test('nav labels are visible during hover-expand', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + await page.locator('.layout-sidebar').hover(); + await page.waitForTimeout(350); + + for (const href of ['/fix', '/enhance', '/settings']) { + const text = await page.locator(`.nav-item a[href="${href}"] span`).innerText().catch(() => ''); + expect(text.trim(), `${href} label during hover-expand`).not.toBe(''); + } + }); + + test('sidebar collapses back when mouse leaves', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + // Hover to expand + await page.locator('.layout-sidebar').hover(); + await page.waitForTimeout(350); + + // Move mouse away (to layout-main) + await page.locator('.layout-main').hover(); + await page.waitForTimeout(350); + + const width = (await getRect(page, '.layout-sidebar')).width; + expect(width, 'sidebar should collapse back after mouse leave').toBeLessThanOrEqual(60); + }); + + test('hover-expand shows "KeyLint" logo (not "KL")', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + await page.locator('.layout-sidebar').hover(); + await page.waitForTimeout(350); + + const text = await page.locator('.layout-logo').innerText(); + expect(text.trim()).toContain('Key'); + expect(text.trim()).toContain('Lint'); + }); + + test('sidebar does NOT hover-expand when already fully expanded', async ({ page }) => { + await gotoFix(page); + + const widthBefore = (await getRect(page, '.layout-sidebar')).width; + await page.locator('.layout-sidebar').hover(); + await page.waitForTimeout(350); + const widthAfter = (await getRect(page, '.layout-sidebar')).width; + + // Width should not change (already expanded) + expect(Math.abs(widthAfter - widthBefore)).toBeLessThanOrEqual(2); + }); +}); diff --git a/frontend/e2e/shell-menu.spec.ts b/frontend/e2e/shell-menu.spec.ts new file mode 100644 index 0000000..d50b3c8 --- /dev/null +++ b/frontend/e2e/shell-menu.spec.ts @@ -0,0 +1,310 @@ +/** + * Shell sidebar menu tests. + * + * Covers: expanded layout, collapsed layout, icon centering, + * click-target sizes, overflow, active-route, footer, and + * tooltip behaviour. + * + * All layout assertions use getBoundingClientRect() / getComputedStyle() + * so they catch real CSS failures that jsdom cannot detect. + */ + +import { test, expect, Page } from '@playwright/test'; + +// ── helpers ─────────────────────────────────────────────────────────────────── + +async function gotoFix(page: Page): Promise { + await page.goto('/fix'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(200); +} + +async function collapse(page: Page): Promise { + await page.locator('.collapse-btn').click(); + await page.waitForTimeout(300); // CSS transition +} + +async function expand(page: Page): Promise { + await page.locator('.collapse-btn').click(); + await page.waitForTimeout(300); +} + +type Rect = { x: number; y: number; width: number; height: number; top: number; right: number; bottom: number; left: number }; + +async function getRect(page: Page, selector: string): Promise { + return page.locator(selector).evaluate((el) => { + const r = el.getBoundingClientRect(); + return { x: r.x, y: r.y, width: r.width, height: r.height, top: r.top, right: r.right, bottom: r.bottom, left: r.left }; + }); +} + +// ── Expanded state ───────────────────────────────────────────────────────────── + +test.describe('Shell — expanded sidebar', () => { + test('sidebar width is at least 200px when expanded', async ({ page }) => { + await gotoFix(page); + const r = await getRect(page, '.layout-sidebar'); + expect(r.width).toBeGreaterThan(200); + }); + + test('all three nav links are visible with non-zero height', async ({ page }) => { + await gotoFix(page); + for (const href of ['/fix', '/enhance', '/settings']) { + const r = await getRect(page, `.nav-item a[href="${href}"]`); + expect(r.width, `${href} width`).toBeGreaterThan(0); + expect(r.height, `${href} height`).toBeGreaterThan(0); + } + }); + + test('nav link text labels are rendered and non-empty', async ({ page }) => { + await gotoFix(page); + for (const href of ['/fix', '/enhance', '/settings']) { + const text = await page.locator(`.nav-item a[href="${href}"] span`).innerText().catch(() => ''); + expect(text.trim(), `${href} label`).not.toBe(''); + } + }); + + test('icons are visible inside each expanded nav link', async ({ page }) => { + await gotoFix(page); + // Fix and Settings use , Pyramidize uses + const fixIcon = await getRect(page, '.nav-item a[href="/fix"] i'); + const settingsIcon = await getRect(page, '.nav-item a[href="/settings"] i'); + const pyramidSvg = await getRect(page, '.nav-item a[href="/enhance"] svg'); + + expect(fixIcon.width).toBeGreaterThan(0); + expect(fixIcon.height).toBeGreaterThan(0); + expect(settingsIcon.width).toBeGreaterThan(0); + expect(pyramidSvg.width).toBeGreaterThan(0); + }); + + test('Fix link has active-route class on /fix route', async ({ page }) => { + await gotoFix(page); + const hasActive = await page.locator('.nav-item a[href="/fix"]').evaluate( + (el) => el.classList.contains('active-route'), + ); + expect(hasActive).toBe(true); + }); + + test('no other links have active-route when Fix is active', async ({ page }) => { + await gotoFix(page); + for (const href of ['/enhance', '/settings']) { + const active = await page.locator(`.nav-item a[href="${href}"]`).evaluate( + (el) => el.classList.contains('active-route'), + ); + expect(active, `${href} should not be active`).toBe(false); + } + }); + + test('collapse button is visible and has non-zero size', async ({ page }) => { + await gotoFix(page); + const r = await getRect(page, '.collapse-btn'); + expect(r.width).toBeGreaterThan(0); + expect(r.height).toBeGreaterThan(0); + }); + + test('version footer is visible', async ({ page }) => { + await gotoFix(page); + const r = await getRect(page, '[data-testid="version-footer"]'); + expect(r.height).toBeGreaterThan(0); + }); +}); + +// ── Collapsed state ──────────────────────────────────────────────────────────── + +test.describe('Shell — collapsed sidebar', () => { + test('sidebar collapses to ≤ 60px', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const r = await getRect(page, '.layout-sidebar'); + expect(r.width).toBeLessThanOrEqual(60); + expect(r.width).toBeGreaterThan(0); // not hidden entirely + }); + + test('sidebar has collapsed CSS class after click', async ({ page }) => { + await gotoFix(page); + await collapse(page); + const hasClass = await page.locator('.layout-sidebar').evaluate( + (el) => el.classList.contains('collapsed'), + ); + expect(hasClass).toBe(true); + }); + + test('nav link text labels are NOT rendered when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + for (const href of ['/fix', '/enhance', '/settings']) { + const count = await page.locator(`.nav-item a[href="${href}"] span`).count(); + expect(count, `${href} label should be absent when collapsed`).toBe(0); + } + }); + + test('nav icons are fully visible (non-zero size) in collapsed state', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const fixIcon = await getRect(page, '.nav-item a[href="/fix"] i'); + const settingsIcon = await getRect(page, '.nav-item a[href="/settings"] i'); + const pyramidSvg = await getRect(page, '.nav-item a[href="/enhance"] svg'); + + expect(fixIcon.width, 'Fix icon width').toBeGreaterThan(0); + expect(fixIcon.height, 'Fix icon height').toBeGreaterThan(0); + expect(settingsIcon.width, 'Settings icon width').toBeGreaterThan(0); + expect(pyramidSvg.width, 'Pyramid svg width').toBeGreaterThan(0); + }); + + test('nav icons are horizontally centered within the collapsed sidebar', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const sidebar = await getRect(page, '.layout-sidebar'); + const sidebarCenterX = sidebar.left + sidebar.width / 2; + + for (const sel of [ + '.nav-item a[href="/fix"] i', + '.nav-item a[href="/settings"] i', + '.nav-item a[href="/enhance"] svg', + ]) { + const r = await getRect(page, sel); + const iconCenterX = r.left + r.width / 2; + // Icon center must be within ±8px of sidebar center + expect(Math.abs(iconCenterX - sidebarCenterX), `icon centering for ${sel}`) + .toBeLessThanOrEqual(8); + } + }); + + test('nav icons do not overflow beyond the right edge of the sidebar', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const sidebar = await getRect(page, '.layout-sidebar'); + + for (const sel of [ + '.nav-item a[href="/fix"] i', + '.nav-item a[href="/settings"] i', + '.nav-item a[href="/enhance"] svg', + ]) { + const r = await getRect(page, sel); + expect(r.right, `${sel} right edge`).toBeLessThanOrEqual(sidebar.right + 1); + } + }); + + test('nav links remain clickable when collapsed (pointer-events not none)', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + for (const href of ['/fix', '/enhance', '/settings']) { + const pe = await page.locator(`.nav-item a[href="${href}"]`).evaluate( + (el) => getComputedStyle(el).pointerEvents, + ); + expect(pe, `${href} pointer-events`).not.toBe('none'); + } + }); + + test('can still navigate to /enhance when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + await page.locator('.nav-item a[href="/enhance"]').click(); + await page.waitForURL('**/enhance', { timeout: 5000 }); + expect(page.url()).toContain('/enhance'); + }); + + test('active-route class is applied correctly in collapsed state', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + await page.locator('.nav-item a[href="/enhance"]').click(); + await page.waitForURL('**/enhance', { timeout: 5000 }); + + const enhanceActive = await page.locator('.nav-item a[href="/enhance"]').evaluate( + (el) => el.classList.contains('active-route'), + ); + const fixActive = await page.locator('.nav-item a[href="/fix"]').evaluate( + (el) => el.classList.contains('active-route'), + ); + expect(enhanceActive).toBe(true); + expect(fixActive).toBe(false); + }); + + test('collapse button shows chevron-right (expand icon) when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const hasRight = await page.locator('.collapse-btn i').evaluate( + (el) => el.classList.contains('pi-chevron-right'), + ); + const hasLeft = await page.locator('.collapse-btn i').evaluate( + (el) => el.classList.contains('pi-chevron-left'), + ); + expect(hasRight).toBe(true); + expect(hasLeft).toBe(false); + }); + + test('collapse button is visible and centered within the collapsed sidebar', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const sidebar = await getRect(page, '.layout-sidebar'); + const btn = await getRect(page, '.collapse-btn'); + + expect(btn.width).toBeGreaterThan(0); + expect(btn.height).toBeGreaterThan(0); + // Button should not overflow sidebar + expect(btn.right).toBeLessThanOrEqual(sidebar.right + 1); + }); + + test('version-row does not push content outside sidebar when collapsed', async ({ page }) => { + await gotoFix(page); + await collapse(page); + + const sidebar = await getRect(page, '.layout-sidebar'); + const footer = await getRect(page, '[data-testid="version-footer"]'); + + expect(footer.right).toBeLessThanOrEqual(sidebar.right + 1); + }); +}); + +// ── Expand / re-collapse ─────────────────────────────────────────────────────── + +test.describe('Shell — expand after collapse', () => { + test('sidebar returns to expanded width after second click', async ({ page }) => { + await gotoFix(page); + await collapse(page); + await expand(page); + + const r = await getRect(page, '.layout-sidebar'); + expect(r.width).toBeGreaterThan(200); + }); + + test('nav labels reappear after expanding', async ({ page }) => { + await gotoFix(page); + await collapse(page); + await expand(page); + + for (const href of ['/fix', '/enhance', '/settings']) { + const text = await page.locator(`.nav-item a[href="${href}"] span`).innerText().catch(() => ''); + expect(text.trim(), `${href} label after expand`).not.toBe(''); + } + }); +}); + +// ── Click target size ────────────────────────────────────────────────────────── + +test.describe('Shell — click target minimum size', () => { + test('each nav link has a click target of at least 36px tall in expanded state', async ({ page }) => { + await gotoFix(page); + for (const href of ['/fix', '/enhance', '/settings']) { + const r = await getRect(page, `.nav-item a[href="${href}"]`); + expect(r.height, `${href} click target height`).toBeGreaterThanOrEqual(36); + } + }); + + test('each nav link has a click target of at least 36px tall in collapsed state', async ({ page }) => { + await gotoFix(page); + await collapse(page); + for (const href of ['/fix', '/enhance', '/settings']) { + const r = await getRect(page, `.nav-item a[href="${href}"]`); + expect(r.height, `${href} collapsed click target height`).toBeGreaterThanOrEqual(36); + } + }); +}); diff --git a/frontend/src/app/features/settings/settings.component.ts b/frontend/src/app/features/settings/settings.component.ts index a8f3543..ad02c7c 100644 --- a/frontend/src/app/features/settings/settings.component.ts +++ b/frontend/src/app/features/settings/settings.component.ts @@ -175,13 +175,6 @@ interface ProviderKey { -

-
@if (presets.length === 0 && !addingPreset) { diff --git a/frontend/src/app/features/text-enhancement/text-enhancement.component.ts b/frontend/src/app/features/text-enhancement/text-enhancement.component.ts index d1e777b..94d6702 100644 --- a/frontend/src/app/features/text-enhancement/text-enhancement.component.ts +++ b/frontend/src/app/features/text-enhancement/text-enhancement.component.ts @@ -6,6 +6,7 @@ import { Subscription } from 'rxjs'; import { SelectModule } from 'primeng/select'; import { ButtonModule } from 'primeng/button'; import { TextareaModule } from 'primeng/textarea'; +import { InputTextModule } from 'primeng/inputtext'; import { ProgressSpinnerModule } from 'primeng/progressspinner'; import { MessageModule } from 'primeng/message'; import { Tabs, TabList, Tab, TabPanels, TabPanel } from 'primeng/tabs'; @@ -22,6 +23,40 @@ interface TraceEntry { timestamp: Date; } +const PROVIDER_OPTIONS = [ + { label: 'Anthropic', value: 'claude' }, + { label: 'OpenAI', value: 'openai' }, + { label: 'Ollama', value: 'ollama' }, +]; + +const PROVIDER_MODELS: Record> = { + claude: [ + { label: 'Sonnet 4.6', value: 'claude-sonnet-4-6' }, + { label: 'Opus 4.6', value: 'claude-opus-4-6' }, + { label: 'Haiku 4.5', value: 'claude-haiku-4-5' }, + ], + openai: [ + { label: 'GPT-5.2', value: 'gpt-5.2' }, + { label: 'GPT-5.2 Pro', value: 'gpt-5.2-pro' }, + { label: 'GPT-4.1', value: 'gpt-4.1' }, + { label: 'GPT-4.1 Mini', value: 'gpt-4.1-mini' }, + { label: 'o3', value: 'o3' }, + ], + ollama: [ + { label: 'llama3.2', value: 'llama3.2' }, + { label: 'mistral', value: 'mistral' }, + { label: 'gemma3', value: 'gemma3' }, + { label: 'phi4', value: 'phi4' }, + { label: 'qwen2.5', value: 'qwen2.5' }, + ], +}; + +const DEFAULT_MODELS: Record = { + claude: 'claude-sonnet-4-6', + openai: 'gpt-5.2', + ollama: 'llama3.2', +}; + let originalText = ''; let pyramidizedText = ''; // snapshot of most recent foundation call let canvasText = ''; // live working surface @@ -34,8 +69,11 @@ let activeTab: 'original' | 'canvas' = 'original'; let isPreviewMode = false; let traceLogOpen = false; let wasCancelled = false; - let bannerDismissed = false; // session-only +let selectedProvider = 'claude'; +let selectedModel = 'claude-sonnet-4-6'; +let qualityThreshold = 0.65; +let advancedOpen = false; function makeId(): string { return Math.random().toString(36).slice(2); @@ -57,6 +95,7 @@ function addTrace(label: string, snapshot: string): void { SelectModule, ButtonModule, TextareaModule, + InputTextModule, ProgressSpinnerModule, MessageModule, Tabs, TabList, Tab, TabPanels, TabPanel, @@ -79,10 +118,35 @@ function addTrace(label: string, snapshot: string): void { [text]="true" (onClick)="dismissBanner()" pTooltip="Dismiss" + appendTo="body" />
} + +
+ + +
+ +
+ + +
+
-
- - {{ activeProvider }} + +
+ + @if (advancedOpenView) { +
+
+ +
+ + 0–1 +
+ Scores below this trigger a refinement pass (default 0.65). +
+
+ }
@@ -170,122 +255,135 @@ function addTrace(label: string, snapshot: string): void { />
} @else { - - - Original - Canvas - - - - -
- @if (!originalTextView) { -
-

Paste or type text to pyramidize.

- -
- } - -
-
- - - -
-
- - +
+ + + Original + Canvas + + + + +
+ @if (!originalTextView) { +
+

Paste or type text to pyramidize.

+ +
+ } +
+
- @if (isPreviewModeView) { -
- } @else { -
- -
- } - - - @if (showSelectionBubble && !isPreviewModeView) { -
- + + +
+
- } -
-
- - + + @if (isPreviewModeView) { +
+ } @else { +
+ +
+ } + + + @if (showSelectionBubble && !isPreviewModeView) { +
+ + + +
+ } +
+ +
+
+
} - + @if (errorMessage) { -
- ❌ {{ errorMessage }} +
+ ❌ {{ errorMessage }} + -
} @@ -296,7 +394,7 @@ function addTrace(label: string, snapshot: string): void {
} - +
}
+ + + @if (peekEntry) { +
+
+
+ {{ peekEntry.label }} + {{ formatTime(peekEntry.timestamp) }} + +
+
{{ peekEntry.snapshot }}
+ +
+
+ }
@@ -373,6 +505,8 @@ function addTrace(label: string, snapshot: string): void { severity="secondary" [text]="true" pTooltip="Add checkpoint" + tooltipPosition="left" + appendTo="body" (onClick)="addCheckpoint()" />
@@ -396,28 +532,6 @@ function addTrace(label: string, snapshot: string): void {
} - - @if (peekEntry) { -
-
- {{ peekEntry.label }} - -
-
{{ peekEntry.snapshot }}
- -
- } } @else {
@@ -511,20 +627,42 @@ function addTrace(label: string, snapshot: string): void { margin-left: 0.5rem; } - .provider-badge { + /* Advanced section (UX-04) */ + .advanced-section { + border-top: 1px solid var(--p-content-border-color); + padding-top: 0.5rem; + margin-top: 0.25rem; + } + .advanced-toggle { + background: none; + border: none; + cursor: pointer; display: flex; align-items: center; gap: 0.4rem; - cursor: pointer; - padding: 0.35rem 0.5rem; - border-radius: 4px; - font-size: 0.78rem; + font-size: 0.8rem; color: var(--p-text-muted-color); - transition: background 0.15s; + padding: 0.2rem 0; + width: 100%; + } + .advanced-toggle:hover { color: var(--p-text-color); } + .advanced-body { padding-top: 0.5rem; } + .threshold-row { + display: flex; + align-items: center; + gap: 0.4rem; } - .provider-badge:hover { background: var(--p-content-hover-background); } - .provider-dot { font-size: 0.55rem; } - .provider-name { font-size: 0.78rem; } + .threshold-input { + width: 80px; + padding: 0.3rem 0.5rem; + font-size: 0.85rem; + background: var(--p-inputtext-background, var(--p-surface-ground)); + border: 1px solid var(--p-content-border-color); + border-radius: 4px; + color: var(--p-text-color); + } + .threshold-hint { font-size: 0.75rem; color: var(--p-text-muted-color); } + .hint-text { font-size: 0.78rem; color: var(--p-text-muted-color); margin: 0; } /* ── Canvas area ── */ .canvas-area { @@ -535,6 +673,8 @@ function addTrace(label: string, snapshot: string): void { padding: 1rem; gap: 0.75rem; min-width: 0; + min-height: 0; + position: relative; } .step-indicator { @@ -548,11 +688,53 @@ function addTrace(label: string, snapshot: string): void { .step-spinner { width: 24px; height: 24px; } .step-label { flex: 1; font-size: 0.9rem; } + /* Tabs container — must flex-grow to fill available space (UX-07) */ + .tabs-container { + flex: 1; + overflow: hidden; + min-height: 0; + display: flex; + flex-direction: column; + } + .tabs-container ::ng-deep .p-tabs { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + min-height: 0; + } + /* display:flex on the CONTAINER (.p-tabpanels) is safe — it does not make hidden + panels visible. The [hidden] attribute sets display:none on each inactive + .p-tabpanel element itself, so those children don't participate in flex layout. + Without display:flex here the active panel's flex:1 has no effect (flex + properties only work inside a flex formatting context). */ + .tabs-container ::ng-deep .p-tabpanels { + flex: 1; + overflow: hidden; + min-height: 0; + display: flex; + flex-direction: column; + } + /* Active panel fills the .p-tabpanels flex container. + We must NOT set display on the generic .p-tabpanel selector — that would + override the UA-stylesheet display:none applied via the [hidden] attribute + on inactive panels and make them visible simultaneously. */ + .tabs-container ::ng-deep .p-tabpanel:not([hidden]) { + flex: 1; + overflow: hidden; + min-height: 0; + display: flex; + flex-direction: column; + } + .tab-panel-content { - position: relative; + flex: 1; + overflow: hidden; + min-height: 0; display: flex; flex-direction: column; gap: 0.5rem; + position: relative; } .empty-original { @@ -568,12 +750,13 @@ function addTrace(label: string, snapshot: string): void { z-index: 1; } .empty-original p-button { pointer-events: all; } - .hint-text { font-size: 0.85rem; color: var(--p-text-muted-color); margin: 0; } + /* Canvas textarea and preview fill remaining height (UX-07) */ .canvas-textarea { + flex: 1; + min-height: 0; + resize: none; width: 100%; - min-height: 320px; - resize: vertical; font-family: var(--p-font-family); font-size: 0.9rem; line-height: 1.6; @@ -582,11 +765,12 @@ function addTrace(label: string, snapshot: string): void { .canvas-mode-toggle { display: flex; gap: 0.5rem; - margin-bottom: 0.5rem; + flex-shrink: 0; } .canvas-preview { - min-height: 320px; + flex: 1; + min-height: 0; padding: 1rem; border: 1px solid var(--p-content-border-color); border-radius: 6px; @@ -607,6 +791,10 @@ function addTrace(label: string, snapshot: string): void { } .canvas-edit-wrapper { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; position: relative; } @@ -625,22 +813,33 @@ function addTrace(label: string, snapshot: string): void { } .bubble-input { width: 180px; font-size: 0.85rem; } - /* Error row */ + /* Error row — clipped to 2 lines (UX-03) */ .error-row { display: flex; align-items: center; - gap: 0.75rem; + gap: 0.5rem; color: var(--p-red-400, #f87171); font-size: 0.85rem; - padding: 0.5rem; + padding: 0.5rem 0.75rem; background: var(--p-content-hover-background); border-radius: 6px; + flex-shrink: 0; + } + .error-text { + flex: 1; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + word-break: break-word; + cursor: default; } .refinement-warning { font-size: 0.8rem; color: var(--p-amber-400, #fbbf24); padding: 0.4rem 0.5rem; + flex-shrink: 0; } /* Instruction bar */ @@ -650,6 +849,7 @@ function addTrace(label: string, snapshot: string): void { align-items: center; border-top: 1px solid var(--p-content-border-color); padding-top: 0.75rem; + flex-shrink: 0; } .instruction-input { flex: 1; } @@ -658,6 +858,55 @@ function addTrace(label: string, snapshot: string): void { display: flex; gap: 0.5rem; flex-wrap: wrap; + flex-shrink: 0; + } + + /* Trace peek overlay — covers the canvas area (UX-06) */ + .trace-peek-overlay { + position: absolute; + inset: 0; + background: rgba(0,0,0,0.45); + display: flex; + align-items: stretch; + z-index: 50; + padding: 0.75rem; + } + .trace-peek-panel { + flex: 1; + background: var(--p-surface-card, var(--p-surface-900)); + border: 1px solid var(--p-content-border-color); + border-radius: 8px; + display: flex; + flex-direction: column; + overflow: hidden; + } + .trace-peek-header { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--p-content-border-color); + flex-shrink: 0; + } + .trace-peek-title { flex: 1; font-weight: 600; font-size: 0.9rem; } + .trace-peek-time { font-size: 0.75rem; color: var(--p-text-muted-color); } + .trace-peek-content { + flex: 1; + overflow-y: auto; + white-space: pre-wrap; + word-break: break-word; + padding: 1rem; + margin: 0; + font-size: 0.85rem; + line-height: 1.6; + font-family: var(--p-font-family); + } + .trace-peek-footer { + display: flex; + gap: 0.5rem; + padding: 0.75rem 1rem; + border-top: 1px solid var(--p-content-border-color); + flex-shrink: 0; } /* ── Trace log panel ── */ @@ -709,32 +958,6 @@ function addTrace(label: string, snapshot: string): void { .trace-entry.active { background: var(--p-highlight-background); } .trace-label { font-size: 0.8rem; } .trace-time { font-size: 0.7rem; color: var(--p-text-muted-color); } - - .trace-peek { - border-top: 1px solid var(--p-content-border-color); - padding: 0.5rem 0.75rem; - display: flex; - flex-direction: column; - gap: 0.4rem; - } - .trace-peek-header { - display: flex; - align-items: center; - justify-content: space-between; - font-size: 0.8rem; - font-weight: 600; - } - .trace-peek-content { - font-size: 0.75rem; - max-height: 120px; - overflow-y: auto; - white-space: pre-wrap; - word-break: break-word; - background: var(--p-content-hover-background); - border-radius: 4px; - padding: 0.4rem; - margin: 0; - } `], }) export class TextEnhancementComponent implements OnInit, OnDestroy { @@ -766,13 +989,23 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { get bannerDismissedView(): boolean { return bannerDismissed; } - // ── Component-local state (does not need to persist across navigation) ── + get providerView(): string { return selectedProvider; } + set providerView(v: string) { selectedProvider = v; } + + get modelView(): string { return selectedModel; } + set modelView(v: string) { selectedModel = v; } + + get qualityThresholdView(): number { return qualityThreshold; } + set qualityThresholdView(v: number) { qualityThreshold = v; } + + get advancedOpenView(): boolean { return advancedOpen; } + + // ── Component-local state ── isLoading = false; stepLabel = ''; errorMessage = ''; refinementWarning = ''; apiKeySet = true; - activeProvider = ''; customInstructions = ''; globalInstruction = ''; detectedTypeView = ''; @@ -795,6 +1028,12 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { @ViewChild('canvasTextarea') canvasTextareaRef?: ElementRef; + readonly providerOptions = PROVIDER_OPTIONS; + + get currentModelOptions(): Array<{ label: string; value: string }> { + return PROVIDER_MODELS[selectedProvider] ?? PROVIDER_MODELS['claude']; + } + readonly docTypeOptions = [ { label: 'AUTO (detect)', value: 'auto' }, { label: 'Email', value: 'email' }, @@ -829,15 +1068,22 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { ) {} async ngOnInit(): Promise { - // Load source app name, check API key status sourceApp = await this.wails.getSourceApp(); const settings = await this.wails.loadSettings(); - this.activeProvider = settings.active_provider ?? ''; - const keyStatus = await this.wails.getKeyStatus(settings.active_provider ?? ''); + + // Initialise provider from settings if not already set this session + if (!selectedProvider && settings.active_provider) { + selectedProvider = settings.active_provider; + selectedModel = DEFAULT_MODELS[selectedProvider] ?? 'claude-sonnet-4-6'; + } + + const keyStatus = await this.wails.getKeyStatus(selectedProvider); this.apiKeySet = keyStatus.is_set; + + qualityThreshold = await this.wails.getQualityThreshold(); + this.cdr.detectChanges(); - // Subscribe to hotkey shortcut events this.sub = this.wails.shortcutTriggered$.subscribe(async () => { const clipboardContent = await this.wails.readClipboard(); sourceApp = await this.wails.getSourceApp(); @@ -872,12 +1118,16 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { } onDocTypeChange(): void { - // Clear detection indicator when user manually picks a type if (docType !== 'auto') { this.detectedTypeView = ''; } } + onProviderChange(): void { + // Reset model to default for new provider + selectedModel = DEFAULT_MODELS[selectedProvider] ?? ''; + } + onTabChange(value: unknown): void { activeTab = value as 'original' | 'canvas'; } @@ -891,11 +1141,22 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { this.peekEntry = null; } + toggleAdvanced(): void { + advancedOpen = !advancedOpen; + } + dismissBanner(): void { bannerDismissed = true; } - // ── Original textarea keyboard shortcut ── + async saveThreshold(): Promise { + try { + await this.wails.setQualityThreshold(qualityThreshold); + } catch { + // best-effort + } + } + onOriginalKeydown(event: KeyboardEvent): void { if (event.ctrlKey && event.key === 'Enter') { event.preventDefault(); @@ -903,7 +1164,6 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { } } - // ── Canvas textarea keyboard shortcut ── onCanvasKeydown(event: KeyboardEvent): void { if (event.ctrlKey && event.key === 'Enter') { event.preventDefault(); @@ -943,6 +1203,8 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { communicationStyle: commStyle, relationshipLevel: relLevel, customInstructions: this.customInstructions, + provider: selectedProvider, + model: selectedModel, }; const doCall = async (): Promise => { @@ -1016,6 +1278,8 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { documentType: docType, communicationStyle: commStyle, relationshipLevel: relLevel, + provider: selectedProvider, + model: selectedModel, }); addTrace(`Refined: "${instruction.slice(0, 30)}"`, canvasText); canvasText = result.newCanvas; @@ -1082,6 +1346,8 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { originalText, selectedText, instruction, + provider: selectedProvider, + model: selectedModel, }); const before = canvasText.slice(0, start); const after = canvasText.slice(end); @@ -1138,17 +1404,16 @@ export class TextEnhancementComponent implements OnInit, OnDestroy { }), ]); } catch { - // Fallback: write plain text await navigator.clipboard.writeText(plain); } } - async sendBack(): Promise { - await this.svc.sendBack(canvasText); + async copyError(): Promise { + await navigator.clipboard.writeText(this.errorMessage); } - goToSettings(): void { - void this.router.navigate(['/settings']); + async sendBack(): Promise { + await this.svc.sendBack(canvasText); } async retry(): Promise { diff --git a/frontend/src/app/features/text-enhancement/text-enhancement.service.spec.ts b/frontend/src/app/features/text-enhancement/text-enhancement.service.spec.ts index 3269e78..b63dc9e 100644 --- a/frontend/src/app/features/text-enhancement/text-enhancement.service.spec.ts +++ b/frontend/src/app/features/text-enhancement/text-enhancement.service.spec.ts @@ -51,7 +51,7 @@ describe('TextEnhancementService', () => { it('pyramidize() delegates to wails.pyramidize()', async () => { wailsMock.pyramidize.mockResolvedValue(mockPyramidizeResult); - const req = { text: 'hello', documentType: 'auto', communicationStyle: 'professional', relationshipLevel: 'professional', customInstructions: '' }; + const req = { text: 'hello', documentType: 'auto', communicationStyle: 'professional', relationshipLevel: 'professional', customInstructions: '', provider: 'claude', model: 'claude-sonnet-4-6' }; const result = await svc.pyramidize(req); expect(wailsMock.pyramidize).toHaveBeenCalledWith(req); expect(result).toEqual(mockPyramidizeResult); @@ -62,7 +62,7 @@ describe('TextEnhancementService', () => { it('refineGlobal() delegates to wails.refineGlobal()', async () => { const mockResult = { newCanvas: 'Refined text' }; wailsMock.refineGlobal.mockResolvedValue(mockResult); - const req = { fullCanvas: 'canvas', originalText: 'orig', instruction: 'shorter', documentType: 'email', communicationStyle: 'professional', relationshipLevel: 'professional' }; + const req = { fullCanvas: 'canvas', originalText: 'orig', instruction: 'shorter', documentType: 'email', communicationStyle: 'professional', relationshipLevel: 'professional', provider: 'claude', model: 'claude-sonnet-4-6' }; const result = await svc.refineGlobal(req); expect(wailsMock.refineGlobal).toHaveBeenCalledWith(req); expect(result).toEqual(mockResult); @@ -73,7 +73,7 @@ describe('TextEnhancementService', () => { it('splice() delegates to wails.splice()', async () => { const mockResult = { rewrittenSection: 'New section' }; wailsMock.splice.mockResolvedValue(mockResult); - const req = { fullCanvas: 'canvas', originalText: 'orig', selectedText: 'selected', instruction: 'rewrite' }; + const req = { fullCanvas: 'canvas', originalText: 'orig', selectedText: 'selected', instruction: 'rewrite', provider: 'claude', model: 'claude-sonnet-4-6' }; const result = await svc.splice(req); expect(wailsMock.splice).toHaveBeenCalledWith(req); expect(result).toEqual(mockResult); diff --git a/frontend/src/app/layout/shell.component.scss b/frontend/src/app/layout/shell.component.scss index d98215a..e648004 100644 --- a/frontend/src/app/layout/shell.component.scss +++ b/frontend/src/app/layout/shell.component.scss @@ -1,25 +1,69 @@ .layout-wrapper { - display: flex; + display: block; height: 100vh; overflow: hidden; + position: relative; + + // When collapsed, main content reserves only the 3rem strip. + // Hover-expand overlays without shifting the main content. + &.sidebar-collapsed .layout-main { + margin-left: 3rem; + } } .layout-sidebar { - width: 17rem; + position: absolute; + left: 0; + top: 0; height: 100%; + width: 17rem; + z-index: 50; display: flex; flex-direction: column; background: var(--p-surface-900, #18181b); border-right: 1px solid var(--p-surface-700, #3f3f46); box-shadow: 2px 0 6px rgba(0, 0, 0, 0.3); - flex-shrink: 0; + transition: width 0.2s ease; + overflow: hidden; + + &.collapsed { + width: 3rem; + + .nav-item a { + justify-content: center; + padding-left: 0; + padding-right: 0; + } + + .version-row { + padding: 0; + } + + // Hover-expand: full sidebar overlays main content without layout shift. + &.hover-expanded { + width: 17rem; + + .nav-item a { + justify-content: flex-start; + padding-left: 1rem; + padding-right: 1rem; + } + + .version-row { + padding: 0.5rem 1rem; + } + } + } } .layout-logo { display: flex; align-items: center; + justify-content: center; padding: 1.5rem 1rem 1rem; border-bottom: 1px solid var(--p-surface-700, #3f3f46); + white-space: nowrap; + overflow: hidden; .logo-text { font-size: 1.25rem; @@ -27,6 +71,12 @@ letter-spacing: -0.025em; } + .logo-icon { + font-size: 1.25rem; + font-weight: 700; + letter-spacing: -0.025em; + } + .logo-key { color: var(--p-surface-50, #fff); } @@ -40,6 +90,7 @@ flex: 1; padding: 0.75rem 0; overflow-y: auto; + overflow-x: hidden; ul { list-style: none; @@ -54,25 +105,33 @@ gap: 0.75rem; padding: 0.75rem 1rem; border-radius: 6px; - margin: 2px 0.75rem; + margin: 2px 0.5rem; color: var(--p-surface-200, #e4e4e7); text-decoration: none; font-size: 0.9rem; transition: background 0.15s, color 0.15s; + white-space: nowrap; + overflow: hidden; i { font-size: 1rem; width: 1.25rem; + min-width: 1.25rem; text-align: center; color: var(--p-surface-400, #a1a1aa); transition: color 0.15s; } + .nav-icon-svg { + min-width: 1rem; + transition: color 0.15s; + } + &:hover { background: var(--p-surface-800, #27272a); color: var(--p-surface-50, #fafafa); - i { + i, .nav-icon-svg { color: var(--p-primary-color, #f97316); } } @@ -81,20 +140,28 @@ background: var(--p-primary-color, #f97316); color: #fff; - i { + i, .nav-icon-svg { color: #fff; } } } .sidebar-footer { + display: flex; + flex-direction: column; + border-top: 1px solid var(--p-surface-700, #3f3f46); + overflow: hidden; +} + +.version-row { display: flex; align-items: center; gap: 0.5rem; - padding: 0.75rem 1rem; - border-top: 1px solid var(--p-surface-700, #3f3f46); + padding: 0.5rem 1rem; cursor: pointer; transition: background 0.15s; + white-space: nowrap; + overflow: hidden; &:hover { background: var(--p-surface-800, #27272a); @@ -112,13 +179,37 @@ } } +.collapse-btn { + background: none; + border: none; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + padding: 0.875rem 0.5rem; + color: var(--p-surface-400, #a1a1aa); + transition: background 0.15s, color 0.15s; + width: 100%; + + i { + font-size: 0.85rem; + } + + &:hover { + background: var(--p-surface-800, #27272a); + color: var(--p-surface-50, #fafafa); + } +} + @keyframes pulse-glow { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } } .layout-main { - flex: 1; + height: 100vh; overflow: auto; background: var(--p-surface-ground); + margin-left: 17rem; + transition: margin-left 0.2s ease; } diff --git a/frontend/src/app/layout/shell.component.ts b/frontend/src/app/layout/shell.component.ts index 3afd9ea..646dab5 100644 --- a/frontend/src/app/layout/shell.component.ts +++ b/frontend/src/app/layout/shell.component.ts @@ -2,56 +2,95 @@ import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; import { Router, RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router'; import { isDevMode } from '@angular/core'; import { Subscription } from 'rxjs'; +import { TooltipModule } from 'primeng/tooltip'; import { WailsService } from '../core/wails.service'; +// Persists across navigation +let sidebarCollapsed = false; +let sidebarHovered = false; + @Component({ selector: 'app-shell', standalone: true, - imports: [RouterOutlet, RouterLink, RouterLinkActive], + imports: [RouterOutlet, RouterLink, RouterLinkActive, TooltipModule], styleUrls: ['./shell.component.scss'], template: ` -
-