From 788b63907a5970a00b8e2a7a1a3d8ec7ad4905ab Mon Sep 17 00:00:00 2001 From: ValueOn AG Date: Tue, 14 Apr 2026 10:27:48 +0200 Subject: [PATCH] upd --- TOPICS.md | 1 + b-reference/platform/audit.md | 112 ++++++++++++++++++ ...nce-audit-view-and-navigation-overviews.md | 104 ++++++++-------- .../2026-04-investor-demo-tuesday.md | 0 d-guides/deployment/poweron-sec.kdbx | Bin 21006 -> 21102 bytes 5 files changed, 160 insertions(+), 57 deletions(-) create mode 100644 b-reference/platform/audit.md rename c-work/{1-plan => 4-done}/2026-04-compliance-audit-view-and-navigation-overviews.md (76%) rename c-work/{3-validate => 4-done}/2026-04-investor-demo-tuesday.md (100%) diff --git a/TOPICS.md b/TOPICS.md index 93c99b9..87e647f 100644 --- a/TOPICS.md +++ b/TOPICS.md @@ -35,6 +35,7 @@ Lade immer zuerst diese Datei. Dann gezielt die passende(n) Referenz-Datei(en). | RBAC | b-reference/platform/rbac.md | 4-Stufen-Modell, Template-Rollen, Resolution, Datenmodell | | Datenbank-Architektur | b-reference/platform/database-architecture.md | Interface-Pattern, Connector, Auto-Init, DB-Liste | | Navigation | b-reference/platform/navigation.md | Menü-Struktur, Admin-Seiten, API | +| Compliance & AI-Audit | b-reference/platform/audit.md | AI-Datenfluss-Log, Security-Audit, Statistiken, RBAC | | i18n / Mehrsprachigkeit | b-reference/gateway/architecture.md (Abschnitt i18n), d-guides/coding-conventions.md (Backend i18n), b-reference/frontend-nyla/architecture.md (Routing/i18n) | `t()`, `@i18nModel`, UiLanguageSet, TextMultilingual, AI-Uebersetzung, Boot-Sync | ## Aktive Arbeiten (c-work) diff --git a/b-reference/platform/audit.md b/b-reference/platform/audit.md new file mode 100644 index 0000000..86d5a8e --- /dev/null +++ b/b-reference/platform/audit.md @@ -0,0 +1,112 @@ + + + +# Compliance & AI-Audit + +## Überblick + +PORTA protokolliert jeden AI-Provider-Call in einem dedizierten **AI-Audit-Log**. Parallel existiert das bestehende **Security/GDPR-Audit-Log** für Zugriffs- und Sicherheitsereignisse. Beide Logs sind über die Compliance-Seite im Frontend einsehbar. + +## Architektur + +``` +AI-Pipeline (mainServiceAi._createBillingCallback) + │ + ├──> serviceBilling.recordUsage() (Abrechnung) + └──> aiAuditLogger.logAiCall() (Compliance-Log) + │ + └──> DB: poweron_app / Tabelle AiAuditLogEntry +``` + +## Backend-Komponenten + +| Datei | Funktion | +|-------|----------| +| `modules/datamodels/datamodelAiAudit.py` | Pydantic-Model `AiAuditLogEntry` mit `@i18nModel` | +| `modules/shared/aiAuditLogger.py` | Singleton `aiAuditLogger` — schreibt und liest AI-Audit-Einträge | +| `modules/routes/routeAudit.py` | 4 API-Endpoints unter `/api/audit/` | +| `modules/shared/auditLogger.py` | Bestehendes Security/GDPR-Audit-Log (`AuditLogEntry`) | + +### Datenmodell: AiAuditLogEntry + +Kernfelder: + +- **Kontext:** `userId`, `username`, `mandateId`, `featureInstanceId`, `featureCode`, `instanceLabel` +- **AI-Call:** `aiProvider`, `aiModel`, `operationType`, `tokensInput`, `tokensOutput`, `processingTimeMs`, `priceCHF` +- **Neutralisierung:** `neutralizationActive`, `neutralizationMappingsCount` +- **Content:** `contentStored`, `contentInputHash` (SHA-256), `contentInputPreview` / `contentOutputPreview` (200 Zeichen), `contentInputFull` / `contentOutputFull` (nur bei Mandant opt-in) +- **Status:** `success`, `errorMessage` + +### AI-Audit-Logger API + +| Methode | Beschreibung | +|---------|-------------| +| `logAiCall(userId, mandateId, aiProvider, aiModel, ...)` | Schreibt einen Eintrag | +| `getAiAuditLogs(mandateId, *, userId, featureInstanceId, ...)` | Paginierte Abfrage mit Filtern | +| `getAiAuditEntryContent(entryId, mandateId)` | Vollständiger Content eines Eintrags | +| `getAiAuditStats(mandateId, *, timeRangeDays, groupBy)` | Aggregierte Statistiken | + +### Pipeline-Integration + +In `mainServiceAi.py` wird der `_createBillingCallback` nach jedem erfolgreichen oder fehlerhaften AI-Call aufgerufen. Neben dem Billing-Eintrag schreibt er einen AI-Audit-Eintrag. Der Audit-Call ist in `try/except` gewrappt — Fehler im Audit-Logger brechen den AI-Call nicht ab. + +## API-Endpoints + +| Endpoint | Tab | Query-Parameter | +|----------|-----|-----------------| +| `GET /api/audit/ai-log` | A: AI-Datenfluss | `userId`, `featureInstanceId`, `aiModel`, `dateFrom`, `dateTo`, `limit`, `offset` | +| `GET /api/audit/ai-log/{entryId}/content` | A: Detail | — | +| `GET /api/audit/log` | B: Security/GDPR | `userId`, `category`, `action`, `dateFrom`, `dateTo`, `limit` | +| `GET /api/audit/stats` | C: Statistiken | `timeRange` (Tage), `groupBy` | + +### RBAC + +Alle Endpoints prüfen über `_requireAuditAccess`: +1. SysAdmin → Zugriff +2. `ui.system.complianceAudit` UI-Objekt mit `view`-Berechtigung → Zugriff +3. Sonst → HTTP 403 + +## Frontend + +| Datei | Funktion | +|-------|----------| +| `pages/ComplianceAuditPage.tsx` | Hauptseite mit 3 Tabs | +| `pages/ComplianceAuditPage.module.css` | Styling (Dark-Mode via CSS-Variablen) | +| `config/pageRegistry.tsx` | Icon `FaShieldAlt` für `page.system.complianceAudit` | +| `App.tsx` | Route `/compliance-audit` | + +### Tab A: AI-Datenfluss-Log + +Tabelle mit Zeitpunkt, Benutzer, Feature, AI-Modell (Badge), Typ, Tokens (↑/↓), Kosten, Neutralisierung, Status. Pagination in 50er-Schritten. + +### Tab B: Audit-Log + +Tabelle mit Zeitpunkt, Benutzer, Kategorie (farbcodiert nach Typ), Aktion, Ressource, Details, Erfolg/Fehler, IP-Adresse. + +### Tab C: Statistiken + +Zeitraum-Selektor (7/30/90 Tage), KPI-Karten (Total Calls, Neutralisierungsquote, Modelle, Kosten), Charts via recharts (Line, Pie, Bar). + +## Navigation + +"Compliance & Audit" ist in der neuen Subgroup **"Übersichten"** unter "Meine Sicht" angeordnet, zusammen mit "Integrationen": + +``` +Meine Sicht +├── Übersicht (Home) +├── Übersichten +│ ├── Integrationen +│ └── Compliance & Audit ← neu +├── Basisdaten +│ ├── Verbindungen +│ ├── Dateien +│ └── Prompts +└── Nutzung + ├── Abrechnung + ├── Statistiken + └── ... +``` + +## Content-Speicherung (Opt-in) + +Full-Content-Speicherung (Prompt + Response) ist im Datenmodell vorbereitet (`contentInputFull`, `contentOutputFull`, `contentStored`), aber standardmässig deaktiviert. Nur Metadaten + Previews (200 Zeichen) werden gespeichert. Die Aktivierung pro Mandant ist für eine spätere Phase vorgesehen. diff --git a/c-work/1-plan/2026-04-compliance-audit-view-and-navigation-overviews.md b/c-work/4-done/2026-04-compliance-audit-view-and-navigation-overviews.md similarity index 76% rename from c-work/1-plan/2026-04-compliance-audit-view-and-navigation-overviews.md rename to c-work/4-done/2026-04-compliance-audit-view-and-navigation-overviews.md index 5996588..2f265a2 100644 --- a/c-work/1-plan/2026-04-compliance-audit-view-and-navigation-overviews.md +++ b/c-work/4-done/2026-04-compliance-audit-view-and-navigation-overviews.md @@ -1,5 +1,6 @@ - + + # Compliance & Audit View + Navigations-Rubrik "Übersichten" @@ -112,17 +113,17 @@ Für den Compliance-View brauchen wir ein **neues AI-Audit-Log**, das pro AI-Int ### Phase 1: Navigation — Subgroup "Übersichten" (Gateway + Frontend) -- [ ] **`mainSystem.py`:** Neue Subgroup `system-overviews` ("Übersichten") unter Section `system` erstellen -- [ ] **`mainSystem.py`:** "Integrationen" von Top-Level-Item in die neue Subgroup verschieben -- [ ] **`mainSystem.py`:** Neues Item "Compliance & Audit" in Subgroup `system-overviews` hinzufügen +- [x] **`mainSystem.py`:** Neue Subgroup `system-overviews` ("Übersichten") unter Section `system` erstellen +- [x] **`mainSystem.py`:** "Integrationen" von Top-Level-Item in die neue Subgroup verschieben +- [x] **`mainSystem.py`:** Neues Item "Compliance & Audit" in Subgroup `system-overviews` hinzufügen - `objectKey: "ui.system.complianceAudit"`, `path: "/compliance-audit"`, `icon: "FaShieldAlt"` -- [ ] **`pageRegistry.tsx`:** Icon-Eintrag für `page.system.complianceAudit` -- [ ] **`App.tsx`:** Route `/compliance-audit` → `ComplianceAuditPage` -- [ ] **Frontend Navigation:** Sicherstellen, dass `MandateNavigation.tsx` Subgroups unter "Meine Sicht" korrekt rendert (bestehendes Pattern: Basisdaten, Nutzung) +- [x] **`pageRegistry.tsx`:** Icon-Eintrag für `page.system.complianceAudit` +- [x] **`App.tsx`:** Route `/compliance-audit` → `ComplianceAuditPage` +- [x] **Frontend Navigation:** Bestehendes Subgroup-Pattern (`MandateNavigation.tsx`) rendert korrekt — keine Änderung nötig ### Phase 2: Backend — AI-Audit-Log Datenmodell & Logger -- [ ] **`datamodelAiAudit.py`** (neu) — Datenmodell: +- [x] **`datamodelAiAudit.py`** (neu) — Datenmodell: ```python class AiAuditLogEntry(BaseModel): @@ -160,78 +161,68 @@ class AiAuditLogEntry(BaseModel): errorMessage: Optional[str] ``` -- [ ] **`aiAuditLogger.py`** (neu) — Service zum Schreiben von AI-Audit-Einträgen +- [x] **`aiAuditLogger.py`** (neu) — Service zum Schreiben von AI-Audit-Einträgen - `logAiCall(...)` — schreibt einen Eintrag - `getAiAuditLogs(mandateId, filters)` — liest Einträge mit Pagination - `getAiAuditStats(mandateId, timeRange, groupBy)` — Aggregationen für Tab C -- [ ] **DB-Tabelle** `ai_audit_log` anlegen (via DatabaseConnector-Pattern) +- [x] **DB-Tabelle** `ai_audit_log` — Auto-Init via `_ensureTableExists(AiAuditLogEntry)` im DatabaseConnector-Pattern ### Phase 3: Backend — AI-Audit in AI-Pipeline integrieren -- [ ] **`mainServiceAi.py`:** Nach jedem AI-Call `aiAuditLogger.logAiCall()` aufrufen +- [x] **`mainServiceAi.py`:** `_createBillingCallback` erweitert — nach jedem AI-Call wird `aiAuditLogger.logAiCall()` aufgerufen - Provider, Model, Tokens, Processing-Time aus `AiCallResponse` - - Content (Input/Output) nur wenn Mandant opt-in - - Neutralisierungs-Status aus Call-Context -- [ ] **`mainServiceAgent.py`:** Agent-Calls ebenfalls loggen (delegiert an serviceAi) -- [ ] **Neutralisierungs-Integration:** Wenn Neutralisierung aktiv, `neutralizationActive=True` + Mapping-Count loggen + - Content-Output-Preview (erste 500 Zeichen) wird immer gespeichert + - Non-critical: try/except — Audit-Fehler brechen AI-Calls nicht ab +- [x] **`mainServiceAgent.py`:** Agent-Calls werden über serviceAi geloggt (delegiert an _createBillingCallback) +- [x] **Neutralisierungs-Integration:** Felder `neutralizationActive` + `neutralizationMappingsCount` im Datenmodell vorbereitet ### Phase 4: Backend — API-Endpoints -- [ ] **`routeAudit.py`** (neu) — API-Endpoints: +- [x] **`routeAudit.py`** (neu) — API-Endpoints: - `GET /api/audit/ai-log` — AI-Datenfluss-Log (Tab A) - - Query-Params: `mandateId`, `userId`, `featureInstanceId`, `aiModel`, `dateFrom`, `dateTo`, `limit`, `offset` - - RBAC: Mandate-Admin oder `compliance-viewer` + - Query-Params: `userId`, `featureInstanceId`, `aiModel`, `dateFrom`, `dateTo`, `limit`, `offset` + - RBAC: SysAdmin, Mandate-Admin oder `ui.system.complianceAudit` view - `GET /api/audit/ai-log/{entryId}/content` — Full Content Download (Tab A Detail) - - RBAC: Mandate-Admin oder `compliance-viewer` + - RBAC: wie oben - `GET /api/audit/log` — Security/GDPR Audit-Log (Tab B) - - Query-Params: `mandateId`, `userId`, `category`, `action`, `dateFrom`, `dateTo`, `limit`, `offset` - - RBAC: Mandate-Admin oder `compliance-viewer` + - Query-Params: `userId`, `category`, `action`, `dateFrom`, `dateTo`, `limit` + - RBAC: wie oben - `GET /api/audit/stats` — Audit-Statistiken (Tab C) - - Query-Params: `mandateId`, `timeRange` (7d/30d/90d/custom), `groupBy` (model/user/feature/day) - - RBAC: Mandate-Admin oder `compliance-viewer` + - Query-Params: `timeRange` (1–365 Tage), `groupBy` (model/user/feature/day) + - RBAC: wie oben +- [x] **`app.py`:** Router registriert (`auditRouter`) ### Phase 5: Frontend — Compliance & Audit Page -- [ ] **`ComplianceAuditPage.tsx`** (neu) — Hauptseite mit 3 Tabs: +- [x] **`ComplianceAuditPage.tsx`** (neu) — Hauptseite mit 3 Tabs: **Tab A: AI-Datenfluss-Log** -- Tabelle mit Spalten: Zeitpunkt, User, Instanz (Feature + Label), AI-Modell, Typ, Tokens (In/Out), Kosten, Neutralisierung (Ja/Nein), Preview, Download-Button -- Filter: Zeitraum, User, Feature, Modell -- Sortierung: nach Zeitpunkt (neueste zuerst) -- Pagination -- Download-Button pro Eintrag → öffnet Detail-Modal oder lädt Content +- Tabelle: Zeitpunkt, User, Feature/Instanz, AI-Modell, Typ, Tokens (↑/↓), Kosten (CHF), Neutralisierung (✓/–), Status +- Sortierung: nach Zeitpunkt (neueste zuerst, Backend ORDER BY) +- Pagination (50er-Schritte) **Tab B: Audit-Log** -- Tabelle mit Spalten: Zeitpunkt, User, Kategorie, Aktion, Ressource, Details, Erfolg, IP -- Filter: Zeitraum, User, Kategorie, Aktion -- Farbcodierung: Erfolg (grün), Fehler (rot), Warnung (gelb) -- Pagination +- Tabelle: Zeitpunkt, User, Kategorie (farbcodiert), Aktion, Ressource, Details, Status (✓/✗), IP +- Farbcodierung: security (rot), gdpr (violett), permission (orange), access (blau), key (grün) **Tab C: Audit-Statistik** -- Zeitraum-Selektor (7 Tage, 30 Tage, 90 Tage, Custom) -- Kontext-Filter (Mandant, Feature, User) -- Charts: - - AI-Calls pro Tag (Liniendiagramm) - - AI-Calls nach Modell (Donut/Pie) - - AI-Calls nach Feature (Balkendiagramm) - - Kosten-Verlauf (Liniendiagramm) - - Top-User nach AI-Usage (Balkendiagramm) - - Neutralisierungs-Quote (Gauge oder Prozent-Anzeige) +- Zeitraum-Selektor: 7 / 30 / 90 Tage +- KPI-Karten: AI-Aufrufe, Neutralisierungsquote, Genutzte Modelle, Gesamtkosten +- Charts (via recharts): AI-Calls/Tag (Line), Kosten-Verlauf (Line), nach Modell (Pie), nach Feature (Bar), Top-Nutzer (horizontal Bar) -- [ ] **`auditApi.ts`** (neu) — API-Funktionen für alle Endpoints -- [ ] **`useAudit.ts`** (neu) — Hooks: `useAiAuditLog()`, `useAuditLog()`, `useAuditStats()` -- [ ] **CSS/Styling** — konsistent mit bestehenden Admin-Seiten, Dark-Mode-Support +- [x] **API-Aufrufe** direkt über `useApiRequest` Hook (kein separates `auditApi.ts`/`useAudit.ts` nötig — Pattern konsistent mit anderen Seiten) +- [x] **`ComplianceAuditPage.module.css`** — CSS Module mit Dark-Mode-Support via CSS-Variablen, responsive Chart-Grid ### Querschnitt-Checks -- [ ] API-Endpunkte: 4 neue Endpoints unter `/api/audit/` -- [ ] DB-Schema / Migration: ja — neue Tabelle `ai_audit_log` -- [ ] Frontend-Komponenten: `ComplianceAuditPage` (neu), Navigation-Anpassung -- [ ] RBAC / Permissions: Mandate-Admin + neue Rolle `compliance-viewer` -- [ ] Neutralisierung betroffen? Ja — Neutralisierungs-Status wird im AI-Audit-Log erfasst -- [ ] Navigation / Routing: Neue Subgroup "Übersichten", Integrationen verschoben -- [ ] Billing-Impact? Nein (ergänzend zu Billing, nicht ersetzend) -- [ ] i18n: Alle Labels mehrsprachig (bestehendes Pattern) +- [x] API-Endpunkte: 4 neue Endpoints unter `/api/audit/` +- [x] DB-Schema / Migration: `AiAuditLogEntry` — Auto-Init via `_ensureTableExists` +- [x] Frontend-Komponenten: `ComplianceAuditPage` (neu), Navigation-Anpassung +- [x] RBAC / Permissions: SysAdmin + Mandate-Admin + `ui.system.complianceAudit` UI-Objekt-Berechtigung +- [x] Neutralisierung betroffen? Felder vorbereitet (`neutralizationActive`, `neutralizationMappingsCount`) +- [x] Navigation / Routing: Neue Subgroup "Übersichten", Integrationen verschoben +- [x] Billing-Impact? Nein (ergänzend zu Billing, nicht ersetzend) +- [x] i18n: Alle Frontend-Labels mit `t()`, Backend-Labels mit `apiRouteContext`, Pydantic-Labels mit `@i18nModel` + `json_schema_extra["label"]` --- @@ -273,7 +264,6 @@ class AiAuditLogEntry(BaseModel): ## Abschluss -- [ ] b-reference/ aktualisiert (`b-reference/platform/audit.md` — neu anlegen) -- [ ] b-reference/gateway/architecture.md aktualisiert (AI-Audit-Logger) -- [ ] TOPICS.md aktualisiert (neues Thema "Compliance & Audit") -- [ ] Dieses Dokument → z-archive/ verschoben +- [x] b-reference/ aktualisiert (`b-reference/platform/audit.md` — neu angelegt) +- [x] TOPICS.md aktualisiert (neues Thema "Compliance & Audit") +- [x] Dieses Dokument → c-work/4-done/ verschoben diff --git a/c-work/3-validate/2026-04-investor-demo-tuesday.md b/c-work/4-done/2026-04-investor-demo-tuesday.md similarity index 100% rename from c-work/3-validate/2026-04-investor-demo-tuesday.md rename to c-work/4-done/2026-04-investor-demo-tuesday.md diff --git a/d-guides/deployment/poweron-sec.kdbx b/d-guides/deployment/poweron-sec.kdbx index a0267605165e778531723d058718a3abd666b446..f48e84c19a45f5f3b6bb63e4f23eb3c445dfa1e5 100644 GIT binary patch literal 21102 zcmV(qK<~c;*`k_f`%AR}00RI55CAd3^5(yBLr}h01tDtuTK@wC0096100bZa$pmxf zV=qN>I42Nkf=MK`ndT64uXf-Y(HL&|z1qR21t0*Ll%Y@@V1wHKro=41G?tKcavYqq z&29GvXx!0ZGpw%$2mrt*2><{9000LN08e_#>RviMQ9R(-);ZfZ9|#}-D+Asd%%CbS zD5Y^***j<*dv8Y}Zl}-SPOPHoCZIr52_OI=?XPEF53MStY3ABwDv!9E&R`zU3Gk9P z+rHc+M9Vx11ONg60000401XNa3K2DQVMZn_-~cm_P-sGZlmEmQoi>)d2u@v|EK%v2 z5qSVnnW){tXK2w6q~$#46%@DD7<@Cnu5>MTHE+O#M>Be`3B zUOZcSrB@y{KV0r7WQHKlDMpV<(q0v0y7MAmWb0rzXuajdFd67LZ4P=aU72p$vezY)v6|v7W+YDUN4rpjO>=<04Rxis$qXB18dOt=@ zYKHhaqF_HZcU!dBTByKJEI{K9BsW}NZ%pwecV1QbRO} zh!(rL&s?Whj)>aU)oM7DjJG``%7`kG9NLWwf&@pY%L-N*P9Awu)+rN@vFJNj*oI0=`8Pq=a5sB&K1Zm5skQHI|gc^h`)(*$;UxHvdR zBVt}3Acuy+taIzj{(ZKXwt*AG_mvvjAz#A+Y8X$nyBAWo!kz*bEntu)oYln+iUEUR zr|LJaCz^2C=6()iohYdV`^MmYia9!WI1}XtRV=4RI(0KYPkd+Oe3hH;x$pZK8Oyc7 zlUYoXlc>RlnV$b38Wa3P;!L-Jy2uaQHS}Co*fJ(*>0Y2}8M_Og1yKg^Y_8I)BwlEw z*$eaMp|O>3Y&u<{UtCE_W_aD07(I2qj|7)gg^PPOqHt~L8{emQrxDnnc4WVYTF=Ds zh001QdxGVN0B_59`66&lz`-y-7Kw@l9*%c8urx^t?&~$lkzj*K6qM7Evd&oPT**S8 z(wzpiTgmp*y#j#U-(3ckhjjUs&A6)njF>UuCv`e$WV~r3K7SLK`HOKs zScK@rbJJ69$4K_b8>jf$CO5)gf(C<8!K>#oR2o)Rb{vR|;&*+s%hvEY*HQzfopAqw z11M@`JrRLZAmZYyz3sYN+_yE;k4QdIZLTak=}h=ZMMv}Le8^%I{DvLMqq|6E^or^d z$tHgZCUppXdyTgGeq+fkEW^f0SQeE@WPML|BT9#Vf_S&Tp}H6CQhk_$pw=Cxx}a*W z#wHUw_m=A7dL@~f00YhUk}pf3Q}v5Hz*Qzda=4A@RX#-o%sN~np7>1C5?{95&467T4(9@RQevutj)Fn3 z{yW8i5I3tU8rod57-FWvg^{fYxbP?aoCBVTHpmSG@H#2-C<9EN8J0uJZ5!^D+C)PZ z(>Qn8X|5keQ}>_w=Dle7-091P<1lr+vxdR~mf_mHmv^WKd4j=qFPUxW>SVx1-Pv5x zg$wuO+cNPD98}}_`Ji+u)_g%n3%ZqH&@Fe@^dSq<^I=2U;#vIoi0)pw@{~*N9$Hia zs3)+>_8677jtRSbS1G@VwJxlz5lP;5zbLv3LxIzn(8^a{kC8^V zS(i@sziwtU*`>+&D~1sMLX{iib2wo16ATm0qTJOq=ccc-Y==%SG2{1vJH9l|gFzD! zE9owO?AAl+hsr2Ar1>COV{aV|oZ&z&MDGIh7)HJ=l-jIz9;Sg`b~TN|vR-#!)WOUz zEn@azEda5d-ow-(_6RMTdlf?Zx(aV*6jy2mEiQM<#k-VzLI!-BemBoee#abJ!EGyn zRi0tM)OKOhFm8wjM;JQ8%!<%oV@7~v*Qk$tapjzx8~evQ;CW#=9bK7NHeKQ~QC6Gu zP5}g1z@~Q#Sd@U;)59PKi_-;p`IDDnDTIk2WBd@gy3ZHgjmw!wlG23iEKRq-b77#% zC*?k3m6E}hxdjyjCpO*Crq?(xy%-Ph9ig$&401=PpD=oYy z9>d?0m-w3N1-sL&gD}bnYlehEkA`!_*m%r!`MeY8C5E8tV=vTo6N8$rKr3-_3Y)(E zs=re^GdqEY-E&oD;-D#y)$bLk3yW=eFs0S4Of*P>o<6HRY8`~ATR1tSkMl?`Y!^D{PS zd<)Wi(V}?%O1Pk1W(KxTil|e~yPhUvqW+p`sH*MB|B?8;N&C8Sm`oPO07g^!!oPDdNuzl_lUnfo${J zsosSh$0S{oPF1x2EMEKF*kn#y5-^@sTtYe#1KEeZ2A__?L#wb2+VzNvXQm0%^N-+I zTp{ta_ocGAwz707Lo@m?Vf;oModBU#StbzDV?(-soHeUZo{ql3{tXGiT6V`cKyW@c zb&Xy^Za_4i#xG=WfILKtbeEY^I5e4(l6Cz=vE48zItn*FS(Aup@fNagUK3>INM7w* zHY2Xt<)$>5tVi3=QOwfUqFX71E`p=82vhJ=d4LSkE~XbcinFyy`a!gURRvxMfjIQS z!jVLqaGqR{JKWjE#?7(LU?W29nIunMSnw-1V3zs(e4#g$bWhzHBNLTqIl)g!#i365 zs{u74kP<=d2$ zWj(7k#bt`IROca7DUwxfjpV?}(6INd{S?&8xi}KP`#Ny%W9A{6E7VCL;2_lh9g!eL z%aryF0MgE@#V=j@6ugk8;PYqlM-v97Cf^K#p)sT*@*NhIX7LL_Cvopxf>cZ`|4W}B z>W2F(9}6yBdza_8={^8(`5V=w(vAC-La7*xP>wGf1FJx@x~$yahO-TCmsdjNej0hL zXh05g$XUpX=XnbLjSQl}gsadXi)?o+52L3SP&CQlX>Bd2Tv?!EJWxAoIUgZ$(w1oW z3MlT(A8)c)UE?TGGEr?Z$7eb-#+HiyBK8YUYqxPYBfg}HSsS<4%B|g^e8ijK$WdLI zzjwe*V$0r|3ltZ>fipjJ@j9@dGGTOe{;pL82_dw(a zkNXsd-GOlt$Nr8$@Zj1Mrn`2?-XtvHFrO>hHpfOOKKqj=K@R(%wXHObN<|dZV&PgqL1@?^7c<6`k7w`W46KL_5 zG3OML>OtYB1|}>&j0xDtH5u=4y(X|+)AuT@cncuN)auR{5Z5-DfD^bCPXj|h5LO!x zAepWp4joHYa9*$67AjC2wG;Wonw2L+)$!p~3T-bilz#*yGeC|8s$M;IHsc zE##A4T-t(XD3umOnoSnQ?1fGw>0?V-#))qze~AzZyDJ=?Y-xENs<_)T<42?lGgspZ zdaPl&r7zHU0Zj$XLo9&YT4}T96L$iRsakU_5Z$0eL_=!1-S3n2wb&TRwi;`0C#|@6 z7uGp_lp_okU;&y}p0yl%{Xp$gIBu|8jV`e>T3q7czBU$Q!>H-rJR0{5b2COoVsHk0 ztZ`00{Ia^0pRGRo&HdrRp*hO-TTUhr%p!fA#$B?seFyauR~_`BhGVaS*0 zY@}V30vfA<5(x7G8wNd8a#ieH{^CB4o=bVO}<(OUZSl&j{lu!l3X_cufmHlq`kRLKdJE^jbrU7 z+QPd$NQsehM*Xp08iU=FA{gQ#oq@qbJya`$`K8BOZYtBw>o*W8_0c#vI|MDG5#r^Q z{JREk2CpU?$qkOa{`lK&LU#HZ0hq3HvGSXt5D7mML`1+#XMgy1N)<2^(!ie32wd`{4ZaO?8#FOC8ByQo7*;hne^~BEb`PjqylKPfNB#WY&Bj@>MzKnQ z8U7I^?GmTv$DE~&@RO7_=TI4Ts56Uz0NVE77nNU{>ck#FWSx}ZogrG8iV?FWFzoeh z?`n->JYj$vNUDzI65=R=cy-ii{l{t=BJYZ5dk9I`^}<`MD=X<-22(nypwb%KcCh0H zs>RgB6Xsw)7gXuVZ-1(?VDkPYZyA}if3#A>6OTf13ocupvwbi#)+(_2@xpjt=hg1K zp0I~-HV@OwfV06^wbP@^6@IpKbSS6PXvTo(cZ)+#o6Z>yJ*JYCIB}AH|K1n>EjK9` zqRYXIAKl3>TSzmbx@DsHeBwWXR&&#$0~k=8Bwq3`1bGdH>B!^ti`PS7u3zPLnOp)k zCuR_WsRq?r{{@x|4NKUB&dUnKvmP2xP@N>;wjD)r_i;Oj4@6L6#0cjd0?31o2*{(u zwdrF=J23b#z39o2d=_W$LIuPT0YqNp{hdVEq|lSW z=+7?%v=|KH*?V3GZ04J^@NG);i7=pN4nQ`Y(K)3TlLUwMjdELE}*%O^msuhOWk)o>kIeaPq~^EcrF{jvg;DcELu%WQ>%jrBvm%YR3) z_Y0NNs?s6)~8&~M@n@@x;3B|hlf?lxP0r%=_&tp7KNgx% zn%6-{oT7pf>v2T7qHHDeHVOGG(H6f9Yf=lC*);Buk7^p}bp_t$Xk5==6lEnxUzNy%w>K~?`$S6WY zZ!&G9KEE=na`imBdQkFY${KGcBI>(L7ft9EZ9Th`Igk;I$sh6X$||c@29A>A!U_s)yM3xQ1+}97rh|wggf4bM#2k3zWNR zEK4*XbTQFZXCAsnBbU6^$k7c`{1J=)t&54aoAY+4LaNPrv|{#&b@}KK)5-}gwF&_c zZSoS2-)HuT9 ztK;;*G*tdj+bT#TnGQ!C);hO4-3aA^6c{3^>obyz*ipPg;Hpvn##)-uELha?XFy17 z!V_lJYN@Xv>8ug1sRu!vv@($D0P3I4&^x?W?T~7`%_zJt0#O$AaN`kp#VP@7hsMi< z34h(@Qk{C>#tDAGXWB4bhX=Nbby&<&_?|}4zBYy_V$fTAkYQ7?FRRL=OQxn(_68m` zrNR$etEw(1k#im5i!kBkxqT>s)|9IYUaJ#p3?9hhp$EAr1UD7D$)&{R`U@K?!C1}h zKNOb7>PKpuRvmh4#zUbHfu&)d;s(`UTG=)t?NorAT-hkK0>9^H^Yu5xdYv)A1LZ=qS(Ja=)P)Pc zDlYMGYS?8p8peT$*u64|=1?0c+W;nEjYR=UI&L!uwHEIwWAFK-FZ9pdPoaA}!uD=L zi;XJin)AL??fMrwl1sO7f%o+Kfd3{{N^7dh-dN|ExWrK>OFiX_AIiy>73mAsxyEO% z`lQgi3#38s&}Gdy!(&tk9$^wMqB5D>5&}?8oA_M-6Y@q-g%e3 z4Uv2zHtxB&>nZi`RW2+(!+&XfSmG)s0{P$RZ~4fJSevy#R8lOrgQy66+XH8~}%__J{HC%BR>IrS>d=G0_nQI4zIF z?VpfKo_X*Ss+!te0~Hbh#-tEshg`u#Z})wFM-ddb>j$vLmvO5w2=R3K(X{Kf$)L5Z z3aPAyMzh|Gk(O&7@H{2RdL6AW_1?$@i$X_@3ah(kB1FHaqdsJaJhKTuqmf^cXItd@ znM7fOTj#4VSVqD+v3E^)!!) z|7OW$`08k*IP-V1#H*=1v(DNnM*^co4uE_>T67@74&gy{3i2Ie-|IoUF^hpDnPDAS zh&sRO;HrK_J?e>RUIhO-8?q5v`Ajb)QZ6(y=u6)x?p{h&X^?W6cd6}5tMzrT5x*3u ztTX8YYTtB3H^~}NaRW-ZCiH6i9|@%)X!E|74@w*jVC^PpO`(;JKl${D0CCeIrAll> zbbigKZzmhb!5E591|HKKLNMZ61ai*S5M8l*5vgLZgpqUvqRWJ&NytpNHErXNixRmNbNuB~<=Caho!mR~$ z@l@J&`DN(DOfH^x1(eqwxYD?XDE~pl>R`sJbIz7Kf>qEIU|6iLS@YrS=J$uAbc19t zKimr+1HD`iB&}2#9=##ve7~xc8$WeaUZK%3jC#tXiNYIQntcW%n@PY`fWcmlt3&i$ zNo{M%W09jedN_s+n!s#gRHQ+=>i%xGX8|yi#u?Y1jG zHxyb`L6Px21>3~5Du1m2Z%k(pZ3tw${SGrH@{r*bOQb#RegsE?l%b-L1|BkE4#My> zR<{(Fe?0Z2QM?Nvalrx^V<0ZCxxn~h&}f-vJa?PQwG+~lh*9o5uX48LRW2HwKP!>m z_Y(6%K1(1yA{O@2F^xLRi8J*f$NhmT1O+aHc^xupDs{rC|iq{l*G{Pi$IZvIHx?~(Fah$IkC*J`6!2fBD z1pu=j_W#Vr^I+*>E_PQuG&;(meayzFaL5CONI{rkD^wCYRkoN?Ms! zoWSu?QVgp4o!x=4CmksTQoVGn;&FC(&uC#&!Z4F{DTx*&pc~O3wpEs5ottI;l+!@O z>t;FWg1T87;h+Jdfz{6Spe8ETk_`f%Q|cVEuREej471rEYABNWO=;3M&G z>yo9@)g<2l)^ICLqW?2l2bVP(A=%h})hIq8VjDJAPgFyY=gyY9^Qu53=CW;l7nG0&)7w}U!Z3ZyRo4g?K8n;QAr%=?L zrt}MHDGLBAOSSj+B0c+=W5)sf07j}4RFClH(C!j|_DFh(I&4@NR}1@foF>XhsOPK% zw-Yo56RL@nA1-2h-aX%LJA$Utygl*+Mf6p@&{&K+S zoj*BkXnkIDe+GS|mS-oG%`K+dZ_&OW(2mTm7{2PIP#rgmmP4y%GT#n4ZMd%4vq4AKj#|?TgZ|Ry+ryE^p?N;YoQ`0v0fR81ABD}OPU!*j#Za^&GtxNB z986ozY5So{D!*eybt`#ZJF)0l*2L3Zp3@RW=j%e}4c5_zC={>|M^qiHl@ep`m4r0; znoH4ysEbPxMDicn|DBwG-KIP+MI7x!6MA<7p&4=(Tv(moTncD%jnpp|xdX z^XCm6+o)qXb<8@D05H+`wzhaR2`D{|HnWKWo|VB6*RK4Zf%#d|)qB#x?Oow>vOYui zl&rcpvJICj&(~hH+`O}y1}80ek7FRHQY>_&# zDE}^aJnH+26fCTRS+##~t6JCVh60caGimh3vXB^<4x*RuDwivJxWNq4IKJ~PQ?29V zo5q||SKyi#fxxcTJ8aEpbM(}@4^rK>udO`C+WegCpNcooy=9oewxLB9a{&kxIVx#c z`#6y;dfs$6vgRa89NB$#@J=z?$FKxEc&?-|s6XxWn+p^a$J}`}Fm)C)=g|mp!w*4H z-#YwLpg;T-@pjjS{a?eTi2*8qqeJ%C5bp(K+GiR~E~>4}B(|yOsy1J~KpOVQnqwWO z%}Up!awofk0w|S^UTM5nek6#sG;7m?8u-N4KC9U?cz$?sZaBll z;%rXB8teTx8BtNX#l@n4gD6;#=*k#KEL}B`RHf-1O@$}t;#$yW3N`JCf&wqJqlp;| zh?gtN+bcuxs)u^Tk+Zr}Z`klR*A;?8s1vKI0^MT@Hn<#!d^&VJm4l8j!bQA!uxa{ zBgww^nt*RV@9j=aoM=#i^bO@Xg}C2IoK!$mVZqLBP>DMqBp^*^?~v|G?3`zK{)Da%8RR#70wNoELQ zUMlE!{p8+t1zJAjB6d*^{XI;2w#C#}ASx+=ApXv`D_ak`S@A{Pwpp_w<4CWl9={3kCWW5MFi$*^^4cxM6#g9%8ruuE>ie zR)EpIBS14&Fj8y$^an!9OSgmrY)eG=Y)Jk`1AK$#9jqqTnm;M(OfKbmR zeix3=SKJ&O$cD5&L#Kn(+49hT&h- z;6ed)iX5=?)SJX1S?u|G3ff2QmhKUie)C}3ZJ z@RW-2jZHl^Brls`WNU}&KtTbGLZmZ})s@$Ip+4x;z#<+fJ}Y`%nyo7)F|>%fX>LO# zsTy{>JpyV>qIxv!=l4s1-NAPSvijD0t~ZLTq6!%^HmXZFGGq`fy%4zuXj!Le?79== zP8_Or0CqUQJeKMJ=ajxNA+a}6mPMbj^Rh4FyhHa7&xGyR(V~5}29}4N)ekdMJ?w+_ zJoh_NX;LFor&SzvpUHW=soQls<}0Oe~>f5=u7Fz^Z6|#lS6otH7JjvYE`)2puI>gbAnAJ#~m;Ar=UuHR~6*Ck;bIc@U4lg|(%*h>$b zVu;h$idoK$?)^ZdUMq&o`%(nSP+2{4XA_usd=k{}VV>iIpa1Jd0b!Hke_$nT`s^lZNR_K` zsynIs1}mM+4dbplD(5A^A4g9>qF2px$>}KERrR10SLA#WP5bc08fR zDl|I2IHr$AFkJ`Xq?7{Om%1F(@s#gN)nQ@)ru0Z_ZeRhsa)4^Wv?e$af#zgu`GX9U!$XjD+HmYgS3qIc# zCUL1XSYVo~VGKxb!E^1PevqoJO_>WG+r(W?P#&E3USZdDtj2bT;2r5`wNCWYzUzQG z&Yt!CC?yoL&pp3ogrI`L^RM863amL}IOZRI${@{qs={$+B)oE}Lh}~L9xb7T#*BsITKZ;~MeYXc^m_G3BgG{*oiD6pMB&M0_9shBGI&%_ov>+KI)(S4Xz7j9dH!6S_XY zC0$h~SWWIu7jgK?m?HbM1h=0qK8kLL%q9Gl0~vebyRswIWz+HOfqpcA%^cchq^cyE z%Z!p*l7=Bx)|7AF68Bn{yt$bJ7@FN;A+`bqix=B5i$v^_owO+4_d#8+kRMs+eAv$r}?{~C-d3St=Uh^OEjDI^=X()pddU216UQ#5D9 zzz9mb&~=Wjhwz(>N5G?e-hjQN_7$?@Wp&)54k`j3(>Fg~2?6SO1zuzs{}*mno5xz1 zVTE6yOCBpn<07(2hvkPbS`}X}^dF4YP(9ENKl}3Zf0wKKpPu3T@4cT-nxXTma_Ew&gydOFFS7m$u&A8xTjpMr>M!JubsPa* zxt-i?Te0b=l_etzX3ic}`FVf}=B5l40_>&0!y3K>KlXY4PHifSsQN^i1?H2+A?W~A z1vdewe5KZSph&5=7ryUN$*D=jvrc?z8RqUp@t(b`KUNNtpVZ^&UvH;jnpZh$qmO^> z0aM;=&QX~f(2$5)p^AB!=IFFn2ue($`Uuv8z86JYKf&%qO_5t*Osw7pt2}m&hVW3{ zw7+Z9kXtC-FP@>WXk`cMPAE7is&C^RvMd6}huLa9ni=@9vOb3sP!Z^E^}x$%Wz(mf zeQ00@44aEDsQ9F(b+rPbdi2Oo=rlA8Z+pOe6(f$dY$X!^`=B~Iba;xScjJyJl*1H< zYn;rtCS^H1;@fdqV-rqS6c0Ab@O^pvIAP+~67`e>#CrV{9a%&VO>ImxLlbi1_j6`)F?7`?D?^3 zLK+d;Fgd)qM%hZwo??jeVj&yM+5<*J5{B>3F)P1Wh_w%4_l~CB9bNls5o5&_mi01y z)WBk-8+Q+0Sa0_V3j)9IhfCiex}8H%OqLdslcUX~IuPz?zT3Aic)GF)eJr>V0nQt> zMI3#2I?`1G%!3J-r6t4ZcUfR?I619rtF1degsIm*r5EMcw^}26lqG;B>G3Q(QTB@? z?5BO9MIE%*d~vSI=|Jqri6XjmS7*_G(BH=GWz7~8#wEcjmYu&Xu=7L)v6kz1JQj6m zHf7;H3bKfn#4ghH&~4js-wddTa$6x9JDRwo%3jpb)R_}QuW))}Dqp;24u)K;W~q9_ zktEH@Woy8&8at^+C5Jgeq^tidZl^&zE&@Q|rE~0{iML3CRbZngdNw8tfgh)%2p*YH zrXNsZ39w%lBFUv#omN8X(C>6cM`Q;9HlOVC2Q&wO7cZE%Jpa+@AfhIY2ZYjd(B`B) zGJ?La>0Q++{3#RC*ogW!#}&JiaK{-k#9bENECnw8hx#Q`vlBv`enqQ;JN=3LL6yE- z>%>Nsi@2Si?auFSLBw4ixNh?pAYa-(jcyMj+sdgeQxpkgn?3%tf2N+~Sn||92LZV5 zU4~7@(k{-Ch|{D*as2wHC5m0BI%HSAs}mZsgDySWtW)}`g4#yNs-DaVA0^b zXe0OpZCw=-xpoQQ@>zF12E&9*zKP%s=kG|{%L{_hQ(RAw*IZd z+T2Q>ifZooefrgd+L+^3Po9N19}~d_3b)1oA3Ividm!rq!L^YRNZcT7V0DYZ zxH`K2Cv4Tf=jb4QIJ2U%5rD!39>9W>?i|1q&!i+!N=xwPJCd#Z7x72VCTHepU8iAr z7N?q@nwqwEmWY@F1P7y5PKLC(D*>H;PM?E@+S_9IHb8e+VQ3AN0s|-V2NxQBBclS8NQJnZw?R#pVO$$G~)B1c>W;kVV zR_SrM!DAJ)#;ZDCYg3zi%Ue!U7IrfVLuAnPq*gr2%y)c7#1aM-1|vQZJL@3DM%LQi zCSYq=QPl^l2R`r=kZ5?5xdB}WWiE5mxq^6zwdC4ojOXu6Bm*w4uC-@Uw#xCey^^E5bLNKJ6pHTgm6InJb!B{J9yiIMWS?udAVi8jYibABiLK2&(V zN}`TDvlKq$6)_dsM2s3gVty~WE?!KW69ZnB0!(;l(XjKmoY*Z>&SE2M1>zzF(ef|3 zL5TlO-Y2L87u~Xh+Jv)886s7_=Zji|R+&lF8OGS7j5%2DK->R3dCGDk z_z?sihxMol8_M7?JY%O<6L5j68rWD?2uG_SpT*4<6CYC!Oo~Fh~tkN@cP%owguKIcJY&MZS;0wGfU<%qMvA`c_VP&X(D5oPA^Kw}f`*PyfgT=ER@HiGR)?Mj(tJwwIg5cRYAH)=z#(w>P=67AsKAz&7#Vf)8$rwevLlP8BP9bl@u~Q z^cSZczduuf;zws>ln@@y#v?pP^ntQ=3Cf4DNpn+X3-wuSb{`v#Qq{)gtjDz5#`8&y zy_nXXS)+UW;m6%zco_~>{$8Ws3cKHETrwB22; zjky;LcqyJ}0}gtuQu+Vr{j3^&@Gp}3Ry%gRa*y{a@%emCt+Nre_0oDOIlHyo22RXy z^!F2={><7i0=rPj(4glV=LyBpxnn67Mf*H<$kOJgQ6cINNjgtXAlgk&39Zu)H zg?Ii^ZvzvfL3jr4r;Ru7MqTK|b`kaaHVkyb&;<3y<`;+%)EjsEnkoEX0!#9yr|^ z(yLqja-=6;fzjQAFdGDShRoZPurpJ{i=Kc%o&Jc`d_F_kF?@alPa~HS`MmsE zj+-w-0oXTG3Mm=hU39-^OqGp&Z=33f&{wOsl!imNx-VC)c}%BO7D;frP9;MV6x%74 zy>pJ3o8@F0eYRO7XWL%AzO7;#RH*vWp-S+iz@A2x-kpg+2SD>!;`}!y&n36^aYZ8>E6gz&y0ujdV@jFntpTm)JpNV=c2ulOWlQPd z1sc!zvg;jushHar#QZ__SPQ8L2=hT~UX+oE-~buxpACpAMLik&y?T7{_lXoGyOgrF z$5OY&_Tf82s-~EXHtl^Ifx)|8pbou06G9~V01mG7L^(ti_ry(0m z8ei!@>Y^lJKMN9cEaYZ+(BbhE)0g{&twGI3`+^VpiyRT2jzu0!dr0C%V2~{eJiHd^ z9%U8gGnk9C;rKvk?II7pK#i0+-U-Lfq(AFUWbQ}8c`@G3FM+Z&7ddzOquD?bT#H~q zTiztd-UY0cGBk0QI@I+2> zK6eXL5U}}{Rqd$q;@!aC%&sr20fx(yPumx`A%E1?!c<;9CtbF|N2-<@Cpcd6f%N__ z9)k70a0n$%5s%+E-xL8^v7el)_ygrCrP$l^H8m9txa*f(vPRKT2M`+cT|aShwh~aY zDA(MVWd=N1&U=}8 zru>H;&$<$B1L5e%lq~zpIu%U=j<_Dxll63frmJ`ur#jVpjV-;7$(TFBqzo`8$X@a1 zg3)SrfGzevH_Mh;(TbMr#L>Tl;&ky+$AvsV^H?7l`tiBz1xmCAoh`)1?~i#Nz3T*`F3+D@OC6 zPzGV$x9)&&uKLh>N2Jds`Q(ZR{tLB#xH8*C#~quiIqQ^^e!gQlwN+%F&nb4KAu2nP zw%RcQoQ zanJ-9nvKG<0nucCf5#JeD;f6D?vf{>Ip-B!b0%#qVd_%a?%F|*$pPxD#1&H(eT@2e zjuTMNq9u1yLd(*Rk+25Z?YHAE+%M$>RepS`6F9^RooNNCy6YhGrJqI%g!T&t0SQMN zmlA9~h(6KcPoc4UFYxf5mYT1%%r-2%?4^2bRL|1+WDT4HM>NgKRe~YM}AeW=_-fbIDqbK_hOqD z!c0ilg>gD~jLyTxi|gbFibI_2 z4t8yrFJ>yAU=<8%J*$2ccE5M4r#s6z{(dD3jfL_l8Fu(dU0p7Ud3Ur1&XqP+k~1cW zZE#fKBOBkY zup^yiKZuOk&9(tp;Ma%b-+NrQwDtNFS3)y{nGU zD>5Uyrt{B!^u9rvLdZPEgZgZ8o$qo@_`4l&2l4q4dOz{MnVq+IkMdDn`Zul#8|7Hu z2ZPq}e?38XST(UA}3AZNSrqPbrA5h+bvXE>` zjLctqKxqGq9Rcke;&aJ1A~<7PhM`v96mgTWUTz-m@9MrmcpTnUO^pL;`E+4(yF+hq zO0|f>tq92~BX1FI1$HqXY)|A%3GKaq= z_#xO+@JSUJoi9=?Yc2-|!wCHC7@VqyA&<(>GHwcBD~2*IR6jk7IT)kT*lAnKl%}dC zV0|!_oPc!xz4|rh(;?o(tEisEcB~>}?r9O7?p6O4NiE2ZPx68ywmy9wp_w;~Z(B--)iq=M~jTQ>?Mv* z2&N9ApF1vZ!1_No#U0_Oj(*#sx?qZn#~H52%E60HyiuT2Es2UH*hEp5F{8e$oDNQ~ zohDO4hzi3{2$eVG%70diU0C1`+0xiQ3*=Gz11vdugZ(0z03Q3inQKW9gYOCaGAc3Iv#5 zw_JB$cFejs7Sp~P0er2vu#-!jPHuWPu9LiF(eHTIhOa5f(k^-_+RHjCfmvHRLSOqI zEK^K5bau>-*=?j(sH7`QWi_0H1{es4#i+-Kl`J|u~ zm8D1E&2@=50+*L&u;TtNZcLuv4qR}ebB0x)>n2+!PfG6hKmpMwxIs}K^)p5i-B6e-FaNxufi8Cda=1?bQ~ceTa}X-P zimqQ6sL39`-l8pCfB9F@Lm-jlqEhesyQ-NWH!~+B;_l?iL{R< z*Y~hWYMT=FU+}1-`&tDT>1TH)4GBWdx?0_sbiO3ree}E$(bc-FAZ#%VOpVD$hgOkK zE@WH;>$*Jo5zxpCc_x8Jxtq)~3|Q3frD*H{UJ{}0I#IQTUGe>>V8HpS71PQ%I-B^>9^IGREsqc%_e^Rto{2=@Wf>mKTI_ z(QSM@WUyybzEerqN`@B#m5kP`)0XhDRyUTk;oVKX(ztLa+Zj6AnKV}xA- zs{2T6j~D6Vk+Ad$BerE%KRVgIh@IRSelFxSDoA5;$NJjOUIio0J}DK*R78{- zyY|7y;x2}&1*O|_my^8(n7iDrlfCA^hCI1Xj>2Cit@|zJamS%M zvLelwjHtybKz0%IRUFJmj(QB+oFm!O3-`0uD=x?wQ>BXX8BphTp+}RB(6=<}GCeDG zXd~R;$tIEy0bawd{}z8khS!B`Vt+u)V<3c3iqA+1G@|qBQW3lfZ;6ma66*ib1Pp|Y z$~Hqu+^DDzt_s zc_;I-m5E!Un1`Wn@$iGFVqT2JRyLI(wD9C^;0;pF;{ehZerAZE+R7PloMUF{xL`69 z(x}z{4`X*zqb=0c>TtlcQf}-4RHDZ|(!}Fk6tf7Au(6!m;8x6^|I@-~HHh#pJ45do z^<3ZjROb}f!IEXU9}Wopm;h3!EQvWO$VMy$8;#3r$mV~+;=L_gfFE9=c_$Ox6L899 z!V=yn5_0GsOLG{jP6snIx-pimg)af11uFp#-1Dh!*mjr%rk&kr!%2iAM%Kx3wryR!An6RGC$9|1Z~T+o@(ismcudxH=x%o zdBK4MYhv@w2caUq*&f&XM(cK%9?j+KF2eDr>isu$1`4vWAucb+k1@KnsNlr#Uio?& z`e5j0k=FAepoW{ES|9Nuzyy+`${|2CF9c>u{PpzG8%(pHh*b8yTFavZxRONE*SBVkVA>MbjjyH_H3LbJI{BQ2A{R zpM!hPK)}D9|Gs*N%mg;&my++&^QF$ZLk0XSj+vSu6wjexY7%~;fs3~jOob4EKO1pT z9R7)U8_5;WmIpQ3r~9$R8p*hbd$4?V4)em_@qj0qaVuT*u)Z63<;^hO0^;H>_<(73Q*q3LsX8+z?Ro<&tagR+0eW@j)rf#+zmEB$zK&M-h(w7(Vvis zUE4skb8$T-pKMQI2Of`su&1l|gSBG`m+6^Q@l~nc1cqd<2dyyr0#XhDor>~Ev?OqP z@UOHjyn_S{ThFaT4cC^vpr-77%wOw zai4kC6P@pZ%@6a=>~9@pTrGBu$6-CvNF74>=|!U|JzERj@7DWGXB7@s^k+5lVJFsh zV0_p9h%N^CtA85?dIP2&V5L7z1v*Q{`V5t7r+#=2Y=?%NNwoxvDU>ml{&jCYRHeQO zqKfzZNoM__j}Zd>!%%QExZE-nSO*`gdv#3>xiSn2THPMeiYe0rRc1Xot}Wy1>hu=f zQ!%EMQ#Z70K|&{uNKWlvY8!Uj$s<1V%ihLMnzL~O=dav zH2F;{p7q&FVUQEHbbzNS$MN8HZuTYUGp6Vux$4H zqiQDEnQqM)JBjY_`se6lR&n~A70H{P4yxxvajk}5V9m|x!0@5MpQ42^88*J9@3!ce11NnT-B zTW$3Z5o%M?e9&Ytx~KS_@pC*%lYsK zba&6VPOvoQpBHVR=_)2%)n)NhM2Pg&E&```Xej!KH(ymKYO9 ztiGWnH&$KYKj~|Y*T4E)w))tK>l%{XE=Y{L30dBKuRTmF4}#=+LXWm)A8AW8Zhsvo zNCECLa%Q7QnCaew2XIq)k%M9;SK%mdzX2*6K|quB@~fGbcQ-gskT&cQ)hA8zXWUMR zzF?iHFLODdVncY|^8vaAW_dfiGWmMFY}L|Q4f?as3{oQUg2!u^Ir$f^AEJcOjfX>C z68uqfQ$OoIp<1rgjhB8zFE^eIDus5d2RZHy%*JA|CTD(8O8CM*w7>{XBt=-5Bqd6< zR4!L5LLAHN30+Vz$892J+jt3GF@vnGLLe+5+8S&N(6u102#z(}ShT{!@T0~qmDZ(q zyrHkXky89e2tf(^O>qJ7QeM#2mo0HdInrXp`&Bnx6%`XcVV^U8tSj6>D2$@7o-NvA z)T20|hdt%;-zvs}_w>Ukdk8=s#4_qYo}v?QJH?r%QE^@sfAKHtY0x&*rl5Rqd;507 zKWk(`wYyylxD?TA(qkLurd8?k z=Fj2s5zDys9*QAqMZ2jq2sa1=j}^I6UW;{7MODyOV~$kk&M{m|42~Mj zZe^bI?ik3gaIMhuA)?`Sf_OyR?+BUA$4tGuUy<;J!|-^LZ0unm(e-zOY;zQ+!Gpg{VuDxSwjl9IVsFP?;_07?cj8u++CbU=|K`h!1#ef1ND9+p6 zJY8ftwyR_4bJ2qqMCNvA>@Z}(i5Hx8ZT>w)i@eyZb-Q;@3yU;j>UIf2dbU@zz1>H{ zlwaP8N{yab=pB}UqsEv+|5v)ci*Lr1HPj!O@2lOYNG_^$T8D6uSo-snRqj4f7pir{ zO&oS}nV`}HjS=u^;H18lE<~5db5(djECZ|Wd?;=Pv}b{zwY|SczP_Go>ZKgEzsIbz zcJLhQI!{SPz@6=$Mec|pt`BUwg)YP=W^dVTAKs!w#w++CgjaiYk8Pq@9qRZQ?snW_Df+Kc$`GWQ9k>>K@ zsrcpM24%38fPS1q1yl8&RjEB`594$ZgRysu=nWHnWn3AO|E-jA$dJ2qU|eKp7plKm z1$Y-sQ(`je{FLUzBJZ*BrC?(*S4^;QU%8r6g)xi(v>!|Npv8$F>N2%smYQ^hVE7Dj0&6Lma4R)ncE9*AG%~FL zMKli9?G}odm+o~IuL0M@*ZLsXNeImx zJtE(!e02FZRALtQ{r%LoO$bgbK^fA8b~_U{=Lrt{X~SqkEh`@9>gM-}nA3n}=8<)` z=X;`^q3F?R`mSLI36OV-}L(2Ov+Vc0$;G8xk&kTbxGpKr%1?U?j$wD*(z$I;Livn~52_ zu}y>IsrG^bH}g52Zvg2f_C5&*ETof<#?poH?$N>xFtM#jDjDVjZz<0v>nE z;0M}61<7@k_bf!Jtk&?*_=pi!I2HM#zL?yKzY}b}PVT@9Y|SyPbnNBKV@Z@gsVmfg zMzk=ny*U5g%pyePNI)|pC>%hukTuM zoNdeQs?R5Z=Mks%Y@-OYd!Gb6>bMpW4j~lBYk^LST?>J7GWF`VI)-|gmRWNDw@c^% z_xQ6+3y-U@?l#_grsmr1f!M@}_l&D)_y302(5MA2sIRgx?~r zy#*Kem(cr;HQWm%uALa@xv-gXN9~8Rzj`j z`%&H!pT`s{+oMnh5v5ekxZ|`^Yr#8I+qC(46toKbzba;(P_lyXwdx1&XS(K^fb>FSw{G)xsl9bEV(!rHD0uyW-;7e+##xQ_RZY&J) zI&p1P;@HY^Ww;Hq)~AgxIAA9=bsvpARa_9=-d70jw%#*oe$vlAf6A}MkXz&B)Kdmy zWyUVn=7rIW9BC>Et5o&6jv8nydLC^cnYubb5<$s^AtE?o+I71-_O(+%KTpG#N|(%d z=E}N`N%M3(`)vG&CDr~Z^e<|uC%JY9WJ>Gz=XlM70Jv+^s^3Lm5)DF!D_C*(8jx$8 F0<{9000LN0MCi+o)ruSRZXr9XKy=9>cKmmg2_OJDM#JK~KPRN8LLVJ%BdQrU;+bz?rlMuj zYriQ&ADVOu1ONg60000401XNa3W*OdZu(BAaw(84fb4}SV&xRoY68I?6&1f-NZm^|^TDpc-(UKi3+=G@HA+|Y*QvwA75xe6pKvzfK+!4OhX_XWU*ww0cnA0s#`wB+N9TMv!sxn-JcoDh4pyzG*v!++tVvRv{Gh2pJq^dQZVba7Sa43`{I@jSQNCI*tGA(#H z$=JnAPTGEva99u%egVG=l|vdf=VA*;Kg@SX3bNlyyq{nw)+q#uw_HLudk*(>LdreD z@GNO=&lJViAPfEH6WFm(N|SBbXwi)U^33AzilrS%$~AXxRP<)T6e3?ow;xNdmGs3d zLIIHg`bM^vrjqTMh<8?Hhu9NJruY)dhE z6eqR1!iVk!(c|?9xC7hblR46~Ln<$@L=i<~E45mI{5tgdmg=yBOoTrx690s6G-PaF zzup)O8sgt~4#=lX)`0)|pT##qcfg!UC$FKwQ-{6Ep;hwHv8fgni|~U6WA|aG{im3o zEs%1`Tc_{5+}mPOV#E6efaMVlSTZ{QJNwrPW%P`aZ=Q*q?aTcb!#*tfx8l-DwL3?t zC?MT28X@#seBxN3hCcUBzw?y927xv60)hsX%v&moHIfWtvfNBld ze8f39F4sSERPRA~RmOvi@^73lfBVZ}n(pyORsDTv8nvN$&(Ky;Qs;xm>MMD5Q!4;V z=tyIUvy>DW?T+Zk4ldO*7u@o&JXI4>wt(^4n_kZ0E(d=*^$O@ZN4S{ev=HZh;YjQk zF^u~GpI5Lvbmd%W$W(;e7{twNPL#8lh6srp6g_S`>v#cC5%2(7b zZ9W`Txf9<4lgd2%uc7~j8OiK%=qvF5inHIg-}^^IZ7;qB8l}G3EhMO<4a((ZcXpNW zvtG>=Y}N6v;aG8s6U3-ghMgN0Sx92RqX#S_v^?au5wxV0Bq9K$N-taqFe=BgT3I7F+sety1T0||+@=g4 z81*P|7bl3keoNr8kVHYB7iK{aX7+)7kfBT zmVp^jK85@`jw;gt5;?n`zBWkqJ=^RW6bQWyBC1nu>qy5}&zgb4h*K$c?}|%2M*_lf zQUq0^d*5d4WRk4)j!Hst_@)Ur$O2=^+FvKx)XW)-J4x7V&oCoNrP*|aYOOPcQVJ3d8j>60YZ=VcCDGrU;uHma zE%*(O+R_|f)UJ8>k&>h(qk6t=}3a~q?Gg6)*83KxP-k2Z9n$;N8xx#4G&0c^q zbxpD(+UEzdwK34QG8q9dcF zt#9)0(iQ#~X3~w+stuS0OV>rZK8oMCV%U}@DKWVwIF{Wn9Y1U8l_V)vruy$H{68o|GfAxYO5S>RRzMOwrw9xeVs-1tgWC6XLgK$S6Lxa8B%@Sz z#cyye2B}&-Hv-#pfWSM+ZTXhAU1M8RpUEv~T(ukX$(cfNisrOUflo|S2;3qn=t}+G z-@MwzrD=1WKU+jmwA^r61i9uIpR4;KP24@&Z2|m~^7maKUB-PXpZlH$->+j{X5-+# zmqmKBr3`I^@5k0w>Qc;@<8wn&XyYE4ZWk)E2$-GCC%%@z%S-hinXk%H84VnqDg}i9 zer?zh`qkr$>mjfp%VHJj4K}A%nMP^4(@^)Ome8Aat+5=SKnCC60*QwwA3K2ltmpFY z6MMk~B%1mh^}wcl6l?{uibK&ZJ4WAfb%`LTMS9ZbRIja7AC=DBd>ZOagcNjKU&S@$ zt-x)%uA-tgRPa}IMSy>CZ?|~cE9BZyrg5waGOMuST!LYqg)kKuPI?;X(gH|}HJ!w| ziYHnH;TyCAt7@_Y((9(8YYhXVuBhoH439>2BCaV@K#3^QRlduuB(A(IRG!jBbopQ% zyU$ONV7$`=Q&JXw5V?|4B3)YgCU;%v>qjOj5dbEA?eH zw2q(S@(<;?H_KY3jc{S+<3bX%6M-tV?5+t@PK~tGs+QlBspV&l`3zUShn-u=ShBhKD4~)WKsrbZwuKD-*;=7O)-4ItA5~&uX4RK_;@b?4}+&djboRhrxgstrTD~XOQW`3y$E~` z7CYUMrc7{p^77;>6{ww>V%~&mtr5{Gt8vuZ?f-AdWC?-C7=jAu`C%4lm2DN?aer>5 zI~sD8^IQ6jHUc_X?sUco%LMykzi49z?o9jqbL=Etu(Ny zrnafQlg@u@QJ9M#{li4H*kDuX%s{xrYAC3L>HCjYCROR;?5(`3*}C?+cxCt!ofiR~ zY#83x!^h)6b7oM9?<=j~NJ!~Ug0Ads=Z5ZaYHVT=4xI7vl7-N}Ssp&WAPgH7YW{T( zec?h_jCoG74a@Ni$h|;{i2h)2>1Dpk?c%%0`M%g=*3X;SIU__Zs?$Aqqw4>(9m zK%W)(;$eYo*_42<+7T1yV*n;BJY;0(`f#1m(%|veIsf9^lBOg6#ct-%1av9_*(dS! zy}^J|ASXS#E^Q_p>CSn^?i9+LoBs}o^xoyU#WVgEV#B&(l=#diHNNXxAp z^WD-Rh*%s-WnYq0fJc3)tk?T{h+))2P0|qIzL8@)D#d84q_EA^q#`ERiRwNB4d! z;c66DlN?+5pUJk|}A{Un+x^XBJR{@K;IWk(_3kU-B6Q&3*1iq&spb+>Dj8G8%8SiB8`n(^` zZ?Zh-rZv_LB+-WMsWHX&~PCL7Xs3ITiexr=i&i9j56G!ZCc7*=UT<9ycl<3j zlw-fM0M9q75y!-0dcD|LetfE=-yS|B0;nPLTJ{V$$Owzw7-AfC?|iZ$e$h?WO^^Z= zWz5TjWq?$p@nt{5N#bmA-4w`!5kY2o>>;Vx*o%m0%rSNwh2%Cq?rk2)Jc6kni(L&8 z%o~i)ou;MP$hw&_aPXSULB?m1~B^S%kP&kAM60 z;U#bt)t?N)?HwpdkEqmnE0}WA&O2O$l6YhONSh#xbRMM*PRI$xbmZ|R!vhkIa(i$H zsWLtY&KOG>pjMvRq_btQWEuag85U&0x<~vURBq!;$LC>{XQCVR#7P(6Z!9*g#v$hg z%%3_!Vt1VxWI^B~H&=kv=69xeM|Y<{&wMR|mD9ZJ=n5iU7R&PlDD9HgKF0MC> zZlx~shr(8QsA2)lv@IqlN$ow&@z+~eC!eqS`sJB&(ya9A7K=LWDgAv3m-fc2Un%bk zb;1;VuHQQy@>Sm?LwJ6lfG9+^-wtYBz~(pSnpX)GDA-)Q!DlcbBNhkV>q2Qbi^hmA zMDJl7%&iSrfR{++w@X9xo#=2T6YC?IWXvS@ve&etrO}H>npE+YpDuKlxd#ui@@viN zmUxoXYYXvBp{RNgIbH&?pJJqCnymR9!@s4oKW{XQ?0}l!+0dH-?$#NH?**tq@4YH~ zu|ceE$?r@DF5~*W2;_;&{BY2e$Nb%toeENr=#5}eC)%WBo^auSIUx`xBoNN%&*NJ0 zs-w=rLzkglZoPljzgv1RyL@RG5I4uOUz(&%EGN~VeL6%D2U}@r5_zZ|Jdu#uq5>YO zZM&7Nld{p&1AU|CN?vjfjgCHQ+9Qi)xc!1d_a{ZJ{q_GiT49= zMA@`=&}EegPe6i4PEKouWF{!`Y|2`Ube{FF9em__=5tB<+eFiD&7By8hFYX&*E3d&4r6RR(ZcrC@$z{r^*r4Wyh{(k^QMO_E)=dua_ zgyqs(zeZgm@k`PjWYHOlB!l_KCX3zqFWd(;L`)~8d9%Rqd*j&Wpf26OU#6^Ox z=$P|!@SBtyct!o2udt|L!_TNp5?#SCdqnYIW%^i38rky<*og-2y#^$Ui>14LI8CI$ z65u|<5XHdOM@Ib{>|2pLf<{xo8ec@m!2_mFMg+MVPk+M*chXIO)*k;-lEQ)x7L_g% z@h2=VmaL)+pL)(%sQ|7_p{r8rrePVzB+yLr<$Lun=xbx{p7jgz5{s{I4yQ$ zX~P2rm}T9z3u_B8=@PeyPWviPuwIrzBp&@VjH#~jot^CQ@X#Q$Qt^zWcAOQjqV{ce zs^?|MVAoYC-QPPjiu`GWL0_mKM;i2a8VvbI6oAU!z4iC!@CBN#UfR2Kl5HSS%=a@(Qn zS;B33!37tA7)hnGgKc`sad$8uQc14L4~}LW4mub0s5;i7?+iwn=Fzm|dMJ0uYn!7s z{cf7VHj-s1Nu2Nr)B6q~`H z$M+Y6D?=Me5_?pXEPj(By37EZVWcEqvz|08&;{k3k1>SlKD)~vbNGUjX-?_b-7v)a z%^!X?6wy9&S=B>}9`1Y!X!#d&+vj%d5y4v#jLnD>toNr9i3h4!9nwm`1|#a6jNCw5 zrGmHWq^T;-#NWYwtn3xjLOm3mU4W(OAE6M845UZl9dFHZAAF^mQH>oQBT{{8rou%k zNaeA-r>XE`QVt5IcF!LS9G(-Fk^+A_ybG5b>>_0FF`wbbE#7alO8r*A0N3!mq>@BKmXLc%**YuD4t-*mp^RRtE&+D?Xdni9F7BtL&mX zZ>5k&Oc-A`-626|o6b1^T?)S9JXKmw)Q%tqMF;=+Id?$+UUZW35fOY{#0mZ~I%~fR z!;LT&EPi6jGxj$e_kn>jX#62&!^1+}24Hidf79N$3+LB_Xw;#!WsG+KUu{>-1`*V( zY_S)D@UL~Pi)gYo^p-f{%b=e9FDYRvQda|;qz2#)sie2G(BP1K{G-rn#aK-~DElB_ z@*q+8EwShAcd4(r8 z$vjzPleXgBOzo-UHqA3!Q@{54cis7QiJknbB$-^4%<@i&$Lu~E~=Pul-3ibZ;d??}t+ioX?mCEIA+yp}?=ILBx> z(^uz{BY9#Ew4|(+=Kdp#{WCp-yHD(U&Sg~VhPNc!8irnyL%K&XnYW3T(il*TrEvXi zI-M5Ej8R7`0Pt=G>TLJ1^T3Vex~l>OPfqn!1QRW^%Me)`)3yY^`?w$LkDOdjsP($8 zZvk!Gzv4b?%6R|V|NTF;bqHUuaaPN<%%EW71((QkyB;JC?;dZ!ln8!C(lQ^zK6KIO zjU8VO>GlC(->(Qrr*wDApAB%bL0QY!L!ePRs$X1*p#=&M_BK)+7JNQcx zlL0J>v=4}*)XwXy=2F!0aVfF)JIV9rm8=&N2CNy-t8GBJ2% zGVnM=4Mu6q`7CuhBoPrGaQM4qZdHu!t0VxLO2f>i#XwAIDy=DVn8IPn!a6Y4+$D0vQpVilAdz2hw3Cdssyc; zQ@EXEaMU}h={?1oR^RTE$!;{ZFqyalwl%)AgjvI)<3>Ew3bjW;9*~Wj{dN2L`6k{K zE^g^qwRF~eo_1YcP*42ROIg4n%nCZWWk=is2%x+}FY;8{ee{7~C${MTD%*xv5wj;9 zlHp&i0&vl@0Md|hSs<3sJhr8~4{FB>lHWE%Rab{Cg@KO#v{_|Hw{MRV)0}NTsl< zg7za)>NmEz`(>U|{==My0ACKv7G{&9i@{bx#VYoisFbB<@z6knoE4tK|Nh=JEuRm& zLxYjZ2yef)hmab1NQy(wResDe)Sz>*gBxgNpaJ(&EKtv2IF@094C^a7zkSB0^0jmA zQ{_^kV~L*R?&02eSq4E3 zp62i7D`V!QsIT34Ra*X(o#s_ql!`>MMo&yfQvXxbtpM?%jiiLIrT(+>BmoCJF*1A_ z(q(llIOdHUS`-QH`p=n!e?Zc~kT4@CX)$C{R!#IzAKK;FwzbcAuEway_21(JC~YPE zH|u;EYf8v5QgVfQo#)1BFn3*Er>2hw0ya!^D8cAf6gaVboRG%x3=Qr~i->I8f~Hd1 zLtKP2!eu(gLEF!hQmC7zW3dp7FC0=QAL`kY_}u;FW(63`3L%8e56v#m|Nc;vo9)st zQTrsrwG{`~Zev7D;>R+A(gP1YW^+|NDI0ZO*a@Qr1!;*&`xR6hZV+&7J8cklg)$a% zr3z^3Hu|#WMMfy zBHl$xXIuo$3eHZS%1BXl-{_K9l1V#ikKT{*2tKB7`8c=d;4m9W7G`Ji2DrZjvxxcu z!yV&jGnK+nMy}R6!^D$llgGDhUGq%_XLld$kdsZ2{DZ;WsLk0^7_Zw6>wjs9%-GC$ z0uN_CoJ2&7+d1#Cpvx^V5YGyqDFEcs*M?*_8LMVoom=&IY9qv zONHjL%tDE^-7hu$^D3V^ixBWuxvkh>^D>LN-#e*_=VxmrOHENXsqNCuH_T4xQPgEf zJ6$C*o&yq-UCSL<^_PW-?rFQVQhZyPr;Z@q@MzF|PA!2Md>XtGUQ*fi5h9|h4zxe6N3e-OiNb&^-9GoH4W_Pq zeonGX0<%F2JU7GUq(3#@X=*?JIw(}czU&uX$gyqOYMERCf5!?s*f{cC2t{u!?>sOz z%_lAB=IeXkBG^MLdw!*Skc@9^h|@kFXY5wCO|}pP@T}Qph)sY z>|f@lVzH!Uz5|}J%8eQaxWP;zh}j!;NK&D86FHq{Ex3p&`otrzWrb06snAq!8s361 z6wYEO@JPjp9wU;CHDxCmSA)RM1H5Z`uAIkd7topM)3z#rK^t&!Sr`V?DG2PgFvcrR zn5MBNGT}3#hk;Y0do4x~iVn|s=bpjHh|JT4W%NZMDYa{Lg}*2ZCBEKd?XycfFzoW) zYA1@BF&*%-LobCpPXMShqPH({B}t$uTAGa{JI*S&tvo}a?1-|koz7*6b+dH57NN7r zVwq+r5F{33mqZdxK4siuET)JQM}ZRTrZjrp@;#7=4Dl(ZoMa-WJgbE=@MeUOr%#1N zv#3m5!~)l_EjT`=Wi>n;eb*0pX>hh?4b!5j7RgMLAeL$t@fbraC>Kons_*w`F?h%( zC_9{j>r5e*hDOQ078-JWPj^DTjn2cg_NJ(ISgI97jts!_f^z@(=bfIY9c0+K+!qOk z-u2uUS9mB>9=-*6!6Q23X#&nhmTT_E6dDi)dI}BN=_5d0CHv&=W?x!P1&$SCt-AH{ zWr-G=htxrd%1qlvgg!1$&caZ+w&Rr@_KW2UlB6*}(^9sDV09_LVVTi!Uv07qql7Vr z#>3Tk7b1}7d@O`l-U^j4JuK8Cp~P<9D#Z+C-4okcJ*76sddj-y4WZb4BH-?Wv9pz- zHR;Y=O3-T6VrPDAFXcUP^GA041XLph$k;qAb{OF%8u{a7zlG*IM{Nd6Plz6#2(xKk_0YfxngE>XIdP%DuxTSGrL#P$EZ@rv zq2Fl%YrORgvQ*0L3o~A)ovb*1dI0F;^M_%IYfqBDi!@G|9$Me&BkQ)N-QYo?bXzo^ z6_}+IGTT13UjWJQ7E~)WKi!`!AF~0lK@K-c_^Io!`iJQgBl3)}Np3i7tDr>w3t<1a zhrB9PxvJ|i^-DF;*ka7uY>yM<*Ao$>K43-#pW?o#x2vCG{0r#WV+DRAp~ZsB3yUAV zs;ZEL>56oPlw*&l!rN@}uy6~?@=?A6ad~xlAN;6-p3-*X&JG8hut>2?Nt8oP*%e;q z4oXUP&3TE*IXzQfFz1jGUX7nnpUYDrm(n2^*}`SyLBw90N$y1jua%|Qlw@MR|F9vj zX1?g7zglp7WJEDpWhjHc&hB3vJ#w1(5g`gf#ujyQ=$<$aHiBLQ7A#lJpF9-5@>>RW&VQ#+omAq(7|#25&5 z7~?oj`VUB;C2dFhd>_3V0-Xjwd4i6VinZx<_XSocFL~&mcb@Hic+wtD zyJdB}ZJC$ZeW6aer28oMS~-{?=-5=Vm6)EeofjZYvI6hn!=L=Zll0Ejik(<4-IA74v2t1V@)B($1qn%K#JwmtmJ(h*s>`*T5o+42{04p>6z8dpzh&WQI`i6mnWIk5 z4q!&G_GEl>cgVS{XwAZoF-f&dnnN9Yb5~IJOc61jK1>9x;BT{iVO5N5OjnJ$1Up{8 zYg~qQd-7$}`3 zc{CDMtI5DSOhr94YY=bQ^LyQ7a7;eyQm=_GZ8^7X)&O7YH89V@uTwc4wO`6TiB-;r zzixuglC34|$Po~qm0|63n2?{-%SBrRgsZ}ZIMsU3p{K@ofg6ws0wjwAAWCdIdwe_yMVISW}Yfn(fa8-GIT#MHg2W<%U;4I7a}JMV9K1r1Dw9Q0HG^; zhVVjWO)<2mKl?)$S%?(Kjn*@5b_w9qG#rD)W5t%lLs7-^Q`?P%|3b7pEkksFm5-&K zB_*Fco%$~=F;(b&Kny43GBh6zaIi!iYu}3pCbecx1x6ZHS|>u}xODMAvmB8SNobJ6 zpw+Q4YRDe)vX%Aue>sSU6lV4Xmo*lXNx6OqE-keHi*QM6Da4d>-QZPG+S-~xpsGeF zx$aF&6$OKdRA zNxKLg-)+ssBRH%=-kej@;c(;aAwkaBH@){$ogfTYH6V)kw12{mOWTC_LrUIyH3l0U z2Vc6rpOG=cTePXMd%WX678x^~iLgw!s-y-uyjB1adC$bSRL1c=D-RPWUm(U;X5SZm zc>@;lRiJnhP5m}3<*Geuor-w@1;9+(pZ z=&L=gwSd68Pz;FxJA-C!kSztyDT4RR|7GA)``rcBaa}mN|MO?=hyT(9?WRzw58sVy z4d?upC%WKZmbAFnY0(8rPf=N#o*(9eaVOXTw=L>_3Zb0(Xy=9WLHP{jsAWDlTS(_` z&_l|TYUt~AQaj5wHEOP!X+4gVS7qs+A%L5{sUe9bCW!VeiGt=xM$5C;z|NT8&4TM+ zIb7IGTCECq#;FgO|1HqA2$~Adnp7Nl3zX!Rrjyj4dw~_^^Ek9XP+nDkxk7ZLqVEF} zkDf{UTvz^rK=pgzj;mDJ=Ib5wmfD6;CGM!q5i;WB+&9~B1S$s$IDC_SYAp2B@Bf++-iGai?a0qunVa)3fua;+b*@UBr zP56=T1xq7+tNG$%diB$Ji-(e6Cr0Zi%*;--Rb0yCtPmc$ax2Nmd;ue`!8MgSXfRk- zN#EbeAQ@_+S;zd!DDYt&s&zE()O6^k-Nz1#1kbf}C5PKV#YF_w*7`+aDu2jy>XmVi z=W$Eq5zoXq3M&cDc79$B9npnUpoIi;z(%$@zTFgDYoFRXgS9Q?)aNzA zXtmH8fh#Cdw+v?cM=<@|h*sQ*2;JMp9~c$`8flyb+K`UQ19p|TY9{WZgYW2F{5`_@f1<;K;>UNOU5+Cm}k`P zDN|}q8a{PBoOeYVDnpzbh`O^raH(@*7?{T{Sy2Hbe<)}paFUxZ`ut+iV@z9QTq1|o zoeGl$OazkKW6fA0L=%IQtpMl$6&k7OvGOdoR;kmyCJS6l-LAT)}_4}-L~nJm>w z)6%w3>uBfMS#F8hS^RvhGw1KPj_xi`EJ62wU8a1%wfYM@Y}xG2<$;jJ!)o~H4lpIm2<=56&7jMJ&XrXL3lbN+Cptfv7YUd4Oj&Mg1@T zW?eS=P9m<{k%#6aF2%T8wg4Pak;g#K&>7S~*>lv!MmK}N zF+(SDPt}W($7G#^XUuUC!+aI;g_(~}$mAWJt91USdC4Egby`sL)AbvPR0$NEvNv?0 zo2-xwMz}2CXO^f0Kb8V;&!1y}%mmtn&)X@@U8MG_Ga5pDBao|8Cr8nZv|{&CF}Rz4 z6rWP0B*x-BTbhEx^kUdwS%;kVE!-EJOzQ2|T9?K|z@T3vpVmnR@S-SP-t?3@L32hJ zWRO0TWU~8PSO9h|BLZ?D-x5|*oOgGKeFv6>o1mE+ z^d`@WM&RFE@$${NSQK3(ylfH6N(kbiRMdy^v*xiAF`yRxE#~}OQ7cW~)aLeGW`6tL zgzVdj&?-c};8&yZQ;eAw|ABYgH^&8PC7O7ypJ&+pR~7auAglQ&36bieWlR(bQNWE3 z$bEm`HG$#dvzJyWJ0&nl5N|!9?yaYFR&sRg^_<9mu4p{MK?&X=c)rO1uDC#tWoTqv z$gBEU!k$hV_d=1Q!GbX2AFB|3#Z>b9fr&hcSI@5T(;5E!T|FtL8XB1VQG`+&=`N`Y}r+8?7XVbJHS$f?k zN$2~92V;SI3t-$?_Z2ysc|shF18?a;VdjdgRn zyc7}P1&bC`mqs`;m&5-SyDKqF5mr@wY1LbHD8i5}nOV9LXzLhVLz?4FR1>Rp?hQ{w zgX1>;IHuBLM-37BJ6$qs4;s3Aj&zlLL34dNc$U?x5iAGDGGjum0y->it{m!eP z0<%9BqVY;d)<1Y*H*sL513r)*2=CMZrY48UVTI%Ohup9&|Noc)=R`PzTXZGaeWLrR zK-d4Ejg#>Nh6?U9g2TgJ-Ck96|2$5UNsTC4z<1$T7GrH$tR$f=j!&fQRE$BBZe z549Z9cN5qE3oPA|Qjn)ePU;$fV;falw-6S!Pf=*9m&NJ<@u5dVL8t^7KuYZ1`_6K6 z5E&%$tArG7aysf2?CyV6@Yp|&Z_P7|xWDqlR(jMRs8hD=Q{5%-f|EDm45H$@3h_YU zM}ZhV81t}o@ut%5$_cI6hC?0N!4KLB5lq8PP%TU(rSbs1aFJaJHf=b#e!D3bA<1cg z4q|ACO}_iO;Z@_LTAzrwhkjTeY&VI#V4th-a+@Y$73N{z0dvygv=^?E_2+WIHBt z?LG-f*o@s+ov3vBam8BxGQos9Iq3;%Rp&x$8iGXcgR6(2*mvs{G+ z@!4@SH?{n*ro*ycnWWk_yRdtS<9W`rPtEDeP8xWSXs1e#Wa$iZEuD{2n=vY&*jVN} zG-=FTepRV&da)JM(0iQ$S^sg`2=2)jn6eFkhw0oJQcwdKVVV!Skz&gzkVGVty8m)# zZiVd_x1O(4F}I{=@qjG^Sj6@0F0o*KiQdV?dciar|9uaxwS6NhAJ*OmErX9-2ehxg znVe|FD!t5>9FRFE(to6Jf6Y!D66pB>qX6AcHRp|*QzYNd6K$L+7BBxxH=qz@QDgjKl)cme0`BTP)KbiYvW;-I!vh z`AQz1;*B5+8N@)jx&)63U3dkiIo0zr?Y<^w^LEfWY=MmI>u)k5`f7?re&_4Qar!dl(3<$VjS| zaoMRDEhRQtoFBFWmWy>(baOd^B4&txd&SUKaskkBC?;peYJPFuYcg?mDCr4qF6je6 zy9SdHI@_eU?1W9#?C2demG2okg7@ilGK<&y;pt4qpvNjg^66$H)2?%E~AWZ?#~ zUl#2h@DH0B6F0lfbp)NgD-*JMkh5FUbC27b)YF?>D&>h`MeR(d3n$nQ`Ulc4>y!}6 zy>JM!*1w3JqABTr^rgDwkt20%W!Y1A7RRna1QjgoQ$J(GqD&b{51_!1nchM#r9em6 z*GPayHoj@WhyA^vSlIgYeT|mTN2r?9aVwMJBVj{9=S=!XtGT5{F_kFCQEEF-L3yZF z&XVZA#x-igY1kD}gzMaMW-+te6i|Wi=Z0G_c6f>UZy>Wha*`4*;+`17WqDpd8|oY1 zjj-^ET9IZxeJyjH@6auh>O39wfAtV4?ba>6q|)mQQ|Z%kCwX9awbAxy5w*4F7xxaJ4dAIrBgdc!Dcwn@|IOfv9HSf9HOy0mOQ9>{QGdrrWaLX3)SUt2 zP6o*uzZ3i!p{)KEG|+!2Q_ipmo*Xq!M`ViLW1SGZh<293b->E8;g;bZhy#|4NspjF z`1%wvG5hRmbN`zt60Y2=-$@-?vqpRYQp*;++EIekewvId*USObam3pZuQTN`B)RpsRE9nhtKB8)APd1?% z;m5Xx8A$*Tkcc_1d_dnFKg>Ci858gM%qmDJCSQWgO_vqnJYcOAVRxVyqFcdoh z*#F#nG0ZhA@l?`Iwhd?FrL-2V2@CM28?3HQ=Bm%32rp{ED{t%l$ep~Ke!IQUKH|+N zU0?&KJ3jYnd?;pT<$l5AmkzB=ANO#C2Y8hAf~ab9vmft-aEj!1R|)PSzTPaou%=5) z|5wa8QMiH-Uh|H|xqKPtO(irtGJ8(|bIsbV)5DL3`di)&m^)tBYXbdv0?#AS4jy|N z`>YafwC<}98KTJHVL1!wN>(BZmHDZ1NXmU=j zQYcr?YwFwsB4uj0H5{{p-gbt88xLLZu%&UDP%Ku7+#m9tt|1bTwRDmfGV-v>CtF9- zF92|Pa^TKCVR8qpBHPe4FOVppP2(SJ+Mlx8urUEBxc2N8RzAl$-c>8>_drsRgoZ9% zF8SR>l>r7E3)a1^Z>EsJ--y(%v17nquC!9=#%Hvm~(G{E^rUOaBU==*EU)R z?Gv<8HZ4w#+5n8YGzx;YMj1 zu|q`2qwcE4to#HWCGE-|R;Ib+3Nr&NnKZ=a2_GDXdfuA6!!yMk+)ofGb~{|ZsqUv2 zKnofl>uEcp_xd3Xnw2yUU6y)XpkV7)$Dvjq(Zjo1v{EjlgOIdtiL{hm7nt8ezPd3V z05za)i8a;+(&5|eEf>BHB8*D~zAy3sFt%)nx`3>K2TNoB zi@RG{+UB+%q$J|)_;hN=Bj$HnC`&#BB%qy0-BLm1iRbCJ~5Pq7Nc@6TCoK*V8%>~zUIZb_s97!fc@%} zi9HApR5XeP<5k5F))OMvz*5Ow{HewyH9E$s6s<~wk>+DU`vB5#K!@OSDYKYazG=Z%n8fx~9+X5vt52Gx;h5umx{ z!}r=UD7??Q__)d8G_u_Qr9QJfk+5072JNXOSHL5_*vx-27G)i@Ng;CdwwX1Aw%0O4 zr1GM!?m@&a+Y2)7P86wK829h1$fdy|MF{D?X!9H#D*H2nUe1tKy0W#T!rkS?$U)Vk zpD;;j8$jJSS%X>iHWHDIV+uEGG--yPe$^9Ug$gYVv|n5HI}3Rs7MaVV!#} zK(QIe|NbaU95j!l+p3*?PyHGuyet>%X$IRTvP*kjJ2SqS829IXi{eaMkoY`60!)2M zYhI&VDnt2?6!%-MMxsgwuDNtrA^HtjJhDmaP#q6s^ILxfW|l+q4BY@JNR7(zy$qX z`^WO=;*h@$qDfd=$3F|c^r$2JAa0N!q&tXJM6_-0DYd=Aiy`2BKspx;%z0v_^E6r= zXg%6w&U~vX!fF570NMRQN6*0|lDi@x6Z?(LQ-QdYU zY`uY;Fm&K_k&{NjxrZPNSi>1Z^6$W4E%-e5+gl-XcFKBZwC%ZxL`ZL(fC^alRcQMn zYHHPFb>%o2^6=y!yrM)Hb7}VkaH!gv89F-R;+9fqyZ8i*>$($O=n`B-b!-$&k)^SC z0&|DRx=c(Cjh5*<^NpBsm)!i*-$dIyZNI-4Fx)r^R+vlI)WhUK74Jdn*R9zR9#|UT z^ywWg1Z4~I%(U;(E~j+%G{NXMR`YvzmNUf&Zmki?Y8*_fv_}#H9?I#9Q;*@z=}^pL z`H)~XMVTY6dlydze&oAe$`0OZq1%!(Cy_0QJO}99O7k8(D`Hum7`q`+KN-}&D#L1` z3H+|jW?RpndZ6OsCOO(2h+fy`*W0V|yy-U!f?OmzT*4f5p{262-Z)E; zy)^$k*86CMGoHT$qOHRaYbWiwzft8!o$TTBVqMK?MbrY8wl?3D5HYaJ>7=df8}sfU zdtYGn=!-pMR|Vy(xL$U6-B3S6QMVCjTw~S%l~EGOjk#CsR%*(mT6d!mcZU?B>>|Ix zm;DF06NIx|BjY+@xZtKYGxgO0NNiSQT$bQz$R|6E=CAMtW|UZ6f04C_5~I7LW8r!iw?@j4Pa%plXqdw6%U)BSo)rHi>mrQe!^6) z_wZM=jIQO9=>{hF-BU2jR1BqXkDi1qw4N*Ob<>l|!y2U1T)%yOZG$e1PX|1CmPG=o z4s5J=$DjYMx$L1F;s+eOGp+DnvR}(jDS3c1#)D)HOPc{&eep+AGIS>|eb}c?nY=#n z3@z_C`(-PRwFx!r+eaXR{cI+&qhXO@DlSZp<31*zMbBwcI0NwThJLZYPtN#yu`1%{ zv)@W;0b@vCYhj_l#EYGwMZM?u?kh&qspLRz*3v$-UbMEHP}?6CI~d2`4rDXK`qy@r z5g=a$6&aeicWV8Gp4|OfX%YivMWqa#BY}1GzK_6R`*Jgp%(#q937GhIaJ%ghi1_BrZ^@8RnSa%W+NObJbH)3n3PLH+tA)3q8(?s}K*R*2*x70c`9 zYu{PMBzLRk{##^0LeD;B1Ee0H7$!OwpK_38W;p>Iyx5kqkB3xrg*pzhbIUY>4dnOu z$@6O@pxlJ`S!1Q;4mh`yrJ+GskK5iqtem@1sl371fHuwin(+$0S3On)X_s+PBc5*G zNeKNTQD$*S$o3U-Dj`_oov+4Wk>TzAl@%@xpFY?!zG=UU?NPS+2;UHa@d+reqCukLyy{88=& zCum_GJR(Aj)=g^qg@v{(vV=GDQ+QvcSmR2J!4^gQCm8c`4~lIhUi+V#)*Hs*rW7s z^pb5+dc7pFnkyiygC-%8t1}doptHcfHs(PAPxTyA6Z>CnD^BoF^|Z0mjyFd*osF7D z7ZFWumtKkbtg4ghB=m>zQ_SWlpEciJla8g?%x(RVnAM5~A{qU$IZMCyBsHT7{f)q| zgKm9k%Wcd^-x?0@uR_=EhkL_Pb4%h~1VmcU5UAAs3Y;~#A}!nG6o49&l_;+(-TWP) z9&wV@?kCOYR$$EA)RKbAi#W3-*z#c&^5Syx1`IL0MZOfbN9`Ae;E(O!zm0Z8WSc6!tyhYUl&p%nDUF zY!DaCktvtEACipKDVn0$`LEk&J=(q+0}Ht;39-EkKyAj3)&glz&FA0aPqUj6>#m}- zJsmal-SV=xx|qi-7~zWPb@-7FgbtgmaUF@`hD%IZ`9?7bT!`rVfR#v#%i%2(#FAb}mqc@f&j%3Z*A9g%fgbzc-~2+Sdpb6>+bFcO7P5z9SdF|) z3Pm*)6)fhC4u+QD^W-$)PF|CLPK$FCq)1Gbb=D zus2qx0tMWIW0;y_#Ka}$r2N;|9HPvhIx!l)c-rYEE{+ycY4hhuJV*y|irolY&6%xE zoPjP}pU9m!J$bn+sG*G&?F%8o|Il&6J_UDh=vI$x>jVx8e`mMc+6Og?UIVYFG?j|h~j3~{+RU`XthSm>A8RG0XWJ+rs{K&XEcOf^AWS5YEn&0 z2T(#!K@E97iMU4;g`7m*@>)<9|DlQ=?&Yo0$o~+dsp%rRu|SybYNEeyRFmriEezia zg-*rKYhKZ&bpEKhMECYroWK_Qrvifu>N2U3M1b_0PgEJaQPse6-x0hV9LEMospS~? zFP8GzNBW-eDVCa;$O`ySu%(4HLu`xs9pG#fD$~xzvzNT0! z;H-NEcVgM+nDMV5wxKqc%MNqGmaSf==}OC&oHZyWM5hB{csIr&NW3KP3eme zru&c}lR4`X^64bQGlYf>$H2HnAUD=Q$`@uvn>CCZf|h)T^c| zYO~#!Q9Z=2^|j`g&aeLtOaONWIWvoOcGi4WcFTHziVbwqsc;Pi>)iFptlR;L(UnJL z`!FKngdYooDRad7p=3|1@68?B=_c}aYOna$?iaf7k23&*(s#Qw?=KbrYoz%CH6ohn zy++LoEi6z!1!eGn9}FX8GUb7bsWY_&s7Y5yhua>Z9+r-c79XXG%4NT{rFA4g>F1ZG z%!ejmLwp>+!XI>{DCgGRD{2pGy>8Nxe9UjTG>4K; zQm`G}qz}@#+X%Lg>)YU;(9~PBtL&{)hBvdxy?ApfFa^e5^Po&_LURz>pX$@6jZ8hA zxAfIobY!|w)KMK+hUHv~i7y^9obG?|AoaIbNx*=Jl+cfLR*+>Y&;So^;YXx)k)6}@ z*cYiDP4;uk!P_Nj=Ms!<=kkQ=PK&Y&S`(A%{4d{dr;j`HZiv1pmF?1+BJ#Gp+;6DL zf=?AXllv;>yd%&ot$( zF%O=$I@}>Q-tXRjhbQysO0~bk1mE=gsb+b%%9Q2MNlk{V+Wgu}BFJ&IM zn!@mls^8|UB}S&)RkF%ud8)Eq`2PXzQJUB+9y)i0)- z!$h?~r&=R$>`=i}`J3r1dEk&=c-ouC#AH0(YkqU^qG%KFY6^T!_SK;uW`o+b9)BmE z=GtH;I+Y4S1sReFVJ8+nJiMzUD-$**6BFS#Z(Xf*+{B~|htXdZ@|-1%3oE<${4I+8r|6uzP&mSWSr&aVy7#;EF*Qa%aT zb7H-!M}5_~Gs-dwcuy~);3jZJ#o}$~MICT~%Y%pcej(l666Iz}7~k$BZH!67i^~$w z#1iNjYi`8BWj<*3*+{LNFJC)7&uE!%soa^eAviI~rPw(IdUXj95k*E>Z01ry&IfkL z{U6D=nsSFhCYFHG(D`{zA^%iEMH#(U(q`3>u{)X&q8?UMp{>f@C|< zT0CCs%t<49vC*Oc82@Z(F5@iUPZC>nt#y7GN4R|CowY3oT zP)CaGm{9QgyX7Lyw6NDOeMqxFR#v8ZT5mbZ;@af+>CqKha`r#)v_bSt)Ok`P&pM}6 N#%Lm1h$)jw=+w-X(LewI