From dd65711ec8f1b9512c0c8c855ff7858838098b3e Mon Sep 17 00:00:00 2001 From: Hanbin Noh <282618027+hanbinnoh@users.noreply.github.com> Date: Fri, 7 Aug 2026 00:32:54 +0900 Subject: [PATCH 1/8] feat(integrations): add Oh My Pi (omp) client integration omp 17.x reads custom providers from ~/.omp/agent/models.yml, so the existing pi integration (legacy ~/.pi/agent/models.json) cannot reach it. Add an 'omp' export/integration client that writes the opencodex provider block as models.yml, honoring omp's profile and agent-dir overrides, and wire it through the CLI, management API, GUI and docs. --- docs-site/astro.config.mjs | 1 + .../src/content/docs/guides/integrations.md | 7 +- docs-site/src/content/docs/guides/oh-my-pi.md | 58 ++++++++ .../client-config-clients.ts | 3 +- gui/src/i18n/de.ts | 3 + gui/src/i18n/en.ts | 3 + gui/src/i18n/ja.ts | 3 + gui/src/i18n/ko.ts | 3 + gui/src/i18n/ru.ts | 3 + gui/src/i18n/zh.ts | 3 + gui/src/pages/Integrations.tsx | 2 + .../integrations/FileIntegrationPage.tsx | 2 + gui/src/pages/integrations/integration-api.ts | 1 + .../pages/integrations/overview-clients.ts | 1 + src/cli/help.ts | 6 +- src/clients/config-export.ts | 125 ++++++++++++++++++ src/integrations/registry.ts | 7 + tests/cli-export-command.test.ts | 9 +- .../client-config-export-new-clients.test.ts | 40 +++++- tests/client-config-export.test.ts | 53 +++++++- tests/integrations-invariants.test.ts | 5 +- tests/integrations-state.test.ts | 4 +- tests/management-client-config-route.test.ts | 21 +++ 23 files changed, 347 insertions(+), 16 deletions(-) create mode 100644 docs-site/src/content/docs/guides/oh-my-pi.md diff --git a/docs-site/astro.config.mjs b/docs-site/astro.config.mjs index f17c88683..740b66e66 100644 --- a/docs-site/astro.config.mjs +++ b/docs-site/astro.config.mjs @@ -92,6 +92,7 @@ export default defineConfig({ { label: "Grok Build", translations: { ko: "Grok Build", "zh-CN": "Grok Build", ru: "Grok Build", ja: "Grok Build" }, slug: "guides/grok-build" }, { label: "opencode", translations: { ko: "opencode", "zh-CN": "opencode", ru: "opencode", ja: "opencode" }, slug: "guides/opencode" }, { label: "Pi", translations: { ko: "Pi", "zh-CN": "Pi", ru: "Pi", ja: "Pi" }, slug: "guides/pi" }, + { label: "Oh My Pi", translations: { ko: "Oh My Pi", "zh-CN": "Oh My Pi", ru: "Oh My Pi", ja: "Oh My Pi" }, slug: "guides/oh-my-pi" }, { label: "Integrations", translations: { ko: "연동", "zh-CN": "集成", ru: "Интеграции", ja: "連携" }, slug: "guides/integrations" }, { label: "Sidecars: Web Search & Vision", translations: { ko: "사이드카: 웹 검색 & 비전", "zh-CN": "边车:网络搜索与视觉", ru: "Сайдкары: веб-поиск и зрение", ja: "サイドカー: ウェブ検索 & ビジョン" }, slug: "guides/sidecars" }, { label: "Image Bridge", translations: { ko: "이미지 브릿지", "zh-CN": "图像桥接", ru: "Image Bridge", ja: "画像ブリッジ" }, slug: "guides/image-bridge" }, diff --git a/docs-site/src/content/docs/guides/integrations.md b/docs-site/src/content/docs/guides/integrations.md index c917fd273..edc225cd3 100644 --- a/docs-site/src/content/docs/guides/integrations.md +++ b/docs-site/src/content/docs/guides/integrations.md @@ -1,15 +1,16 @@ --- title: Integrations -description: Connect opencodex to OpenCode, Pi, Hermes, OpenClaw, Kimi Code and Gajae Code from the dashboard — one switch per client, with a backup taken before every write. +description: Connect opencodex to OpenCode, Pi, Oh My Pi, Hermes, OpenClaw, Kimi Code and Gajae Code from the dashboard — one switch per client, with a backup taken before every write. --- The **Integrations** tab writes opencodex's provider block into a client's own config -file, and removes it again. Six clients work this way, each with a switch: +file, and removes it again. Seven clients work this way, each with a switch: | Client | Config file | Format | When the change takes effect | Credential | |---|---|---|---|---| | OpenCode | `~/.config/opencode/opencode.json` | JSON | next direct launch | `OPENCODEX_OPENCODE_API_KEY` | | Pi | `~/.pi/agent/models.json` | JSON | new sessions | `OPENCODEX_API_KEY` | +| Oh My Pi | `~/.omp/agent/models.yml` | YAML | new sessions | `OPENCODEX_OMP_API_KEY` | | Hermes | `~/.hermes/config.yaml` | YAML | new sessions | `OPENCODEX_HERMES_API_KEY` | | OpenClaw | `~/.openclaw/openclaw.json` | JSON5 | immediately, on a running gateway | `OPENCODEX_OPENCLAW_API_KEY` | | Kimi Code | `~/.kimi-code/config.toml` | TOML | on restart, or `/reload` | loopback placeholder | @@ -75,7 +76,7 @@ changed value and calling it success. You will see the file named and nothing on disk will have moved. Editing that file by hand still works; it is only our automatic rewrite that declines. -**Pi, Kimi Code and Gajae Code only work against a loopback bind.** None of their config +**Pi, Oh My Pi, Kimi Code and Gajae Code only work against a loopback bind.** None of their config schemas has a place for the `x-opencodex-api-key` header that a non-loopback bind requires, so a generated config would simply be rejected — and writing one by hand does not help, because there is nowhere in the file to put the header either. Reaching a diff --git a/docs-site/src/content/docs/guides/oh-my-pi.md b/docs-site/src/content/docs/guides/oh-my-pi.md new file mode 100644 index 000000000..83380a563 --- /dev/null +++ b/docs-site/src/content/docs/guides/oh-my-pi.md @@ -0,0 +1,58 @@ +--- +title: Oh My Pi +description: Use any routed model from Oh My Pi (omp) — ocx export writes a custom provider block for omp's ~/.omp/agent/models.yml, wired to the running proxy. +--- + +Oh My Pi (`omp`) reads custom providers from `~/.omp/agent/models.yml`, so +opencodex does not launch it. Instead, `ocx export` serializes the `opencodex` +provider block — base URL, model list, and the env reference omp interpolates — +and you merge it into that file. + +## Quickstart + +Start the proxy, then print the config: + +```bash +ocx start +ocx export --client omp +``` + +The output leads with the YAML, then prints the destination path, the merge +warning, the env export line, and how many models carry authoritative context +limits. + +```yaml +providers: + opencodex: + baseUrl: http://127.0.0.1:10100/v1 + api: openai-completions + apiKey: "$OPENCODEX_OMP_API_KEY" + models: + - id: anthropic/claude-opus-5 + name: "Claude Opus 5 (anthropic)" + input: + - text + contextWindow: 200000 + maxTokens: 32000 +``` + +Merge the `providers.opencodex` block into `~/.omp/agent/models.yml` (do not +replace the rest of the file), then start a new omp session. The models appear +under the `opencodex/` prefix. + +## Credential + +The config references `$OPENCODEX_OMP_API_KEY` and never holds the real key. +Export it before launching omp: + +```bash +export OPENCODEX_OMP_API_KEY= +``` + +Like Pi, omp's provider block has no place for the `x-opencodex-api-key` header +a non-loopback bind requires, so this integration works against a loopback +bind. Reach a remote opencodex through an SSH tunnel or a local forwarder that +adds the header instead. + +The dashboard's **Integrations → Oh My Pi** tab does the same thing with a +switch, and takes a backup before every write so the change can be undone. diff --git a/gui/src/components/apikeys-workspace/client-config-clients.ts b/gui/src/components/apikeys-workspace/client-config-clients.ts index dca09d856..dc98871db 100644 --- a/gui/src/components/apikeys-workspace/client-config-clients.ts +++ b/gui/src/components/apikeys-workspace/client-config-clients.ts @@ -8,12 +8,13 @@ * with EXPORT_CLIENT_IDS by hand; adding a client server-side renders no row * until this tuple changes. */ -export const CLIENTS = ["opencode", "pi", "hermes", "openclaw", "kimi", "gajae"] as const; +export const CLIENTS = ["opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae"] as const; export type ExportClientId = (typeof CLIENTS)[number]; export const CLIENT_LABEL_KEYS = { opencode: "api.clientConfig.clientOpencode", pi: "api.clientConfig.clientPi", + omp: "api.clientConfig.clientOmp", hermes: "api.clientConfig.clientHermes", openclaw: "api.clientConfig.clientOpenclaw", kimi: "api.clientConfig.clientKimi", diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 7703f6c09..1d028b3ae 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -751,6 +751,7 @@ export const de: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "Oh My Pi", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -860,6 +861,7 @@ export const de: Record = { "integrations.kind.restore": "Wiederhergestellt", "integrations.semantics.opencode": "Gilt nur für direkte Starts von der Festplatte; die Umgebungsinjektion von ocx opencode hat Vorrang.", "integrations.semantics.pi": "Gilt für neue Sitzungen.", + "integrations.semantics.omp": "Gilt für neue Sitzungen.", "integrations.semantics.hermes": "Gilt für neue Sitzungen.", "integrations.semantics.openclaw": "Wird sofort auf ein laufendes Gateway angewendet.", "integrations.semantics.kimi": "Zum Anwenden neu starten oder /reload ausführen (v2 überwacht die Datei).", @@ -1128,6 +1130,7 @@ export const de: Record = { "api.clientConfig.copiedAnnounceClient": "{client}-Konfigurations-JSON in die Zwischenablage kopiert.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "Oh My Pi", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index 9ae886124..4d6fdc656 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -1206,6 +1206,7 @@ export const en = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "Oh My Pi", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -1315,6 +1316,7 @@ export const en = { "integrations.kind.restore": "Restored", "integrations.semantics.opencode": "Direct disk launches only; ocx opencode environment injection takes precedence.", "integrations.semantics.pi": "Applies to new sessions.", + "integrations.semantics.omp": "Applies to new sessions.", "integrations.semantics.hermes": "Applies to new sessions.", "integrations.semantics.openclaw": "Applies immediately to a running gateway.", "integrations.semantics.kimi": "Restart or run /reload to apply it (v2 watches the file).", @@ -1591,6 +1593,7 @@ export const en = { "api.clientConfig.copiedAnnounceClient": "{client} config JSON copied to the clipboard.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "Oh My Pi", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index d5f7a915b..d74056264 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -1154,6 +1154,7 @@ export const ja: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "Oh My Pi", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -1263,6 +1264,7 @@ export const ja: Record = { "integrations.kind.restore": "復元", "integrations.semantics.opencode": "ディスクから直接起動した場合にのみ適用されます。ocx opencode の環境注入が優先されます。", "integrations.semantics.pi": "新しいセッションから適用されます。", + "integrations.semantics.omp": "新しいセッションから適用されます。", "integrations.semantics.hermes": "新しいセッションから適用されます。", "integrations.semantics.openclaw": "実行中のゲートウェイにすぐ適用されます。", "integrations.semantics.kimi": "再起動するか /reload を実行すると適用されます(v2 はファイルを監視します)。", @@ -1536,6 +1538,7 @@ export const ja: Record = { "api.clientConfig.copiedAnnounceClient": "{client} の設定 JSON をクリップボードにコピーしました。", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "Oh My Pi", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index e0ee1af6a..8cb67f551 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -775,6 +775,7 @@ export const ko: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "Oh My Pi", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -884,6 +885,7 @@ export const ko: Record = { "integrations.kind.restore": "복원", "integrations.semantics.opencode": "디스크에서 직접 실행할 때만 적용됩니다. ocx opencode의 환경 주입이 우선합니다.", "integrations.semantics.pi": "새 세션부터 적용됩니다.", + "integrations.semantics.omp": "새 세션부터 적용됩니다.", "integrations.semantics.hermes": "새 세션부터 적용됩니다.", "integrations.semantics.openclaw": "실행 중인 게이트웨이에 즉시 반영됩니다.", "integrations.semantics.kimi": "재시작 또는 /reload 시 적용됩니다 (v2는 파일 변경을 감지합니다).", @@ -1155,6 +1157,7 @@ export const ko: Record = { "api.clientConfig.copiedAnnounceClient": "{client} 설정 JSON을 클립보드에 복사했습니다.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "Oh My Pi", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index f707bb5f5..ae71c975a 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -1196,6 +1196,7 @@ export const ru: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "Oh My Pi", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -1305,6 +1306,7 @@ export const ru: Record = { "integrations.kind.restore": "Восстановлено", "integrations.semantics.opencode": "Действует только при прямом запуске с диска; внедрение окружения через ocx opencode имеет приоритет.", "integrations.semantics.pi": "Применяется к новым сеансам.", + "integrations.semantics.omp": "Применяется к новым сеансам.", "integrations.semantics.hermes": "Применяется к новым сеансам.", "integrations.semantics.openclaw": "Немедленно применяется к работающему шлюзу.", "integrations.semantics.kimi": "Чтобы применить, перезапустите клиент или выполните /reload (v2 отслеживает файл).", @@ -1578,6 +1580,7 @@ export const ru: Record = { "api.clientConfig.copiedAnnounceClient": "JSON конфигурации {client} скопирован в буфер обмена.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "Oh My Pi", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 14113c611..7199c0974 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -768,6 +768,7 @@ export const zh: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "Oh My Pi", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -877,6 +878,7 @@ export const zh: Record = { "integrations.kind.restore": "已恢复", "integrations.semantics.opencode": "仅适用于直接从磁盘启动;ocx opencode 的环境注入优先。", "integrations.semantics.pi": "对新会话生效。", + "integrations.semantics.omp": "对新会话生效。", "integrations.semantics.hermes": "对新会话生效。", "integrations.semantics.openclaw": "立即应用到正在运行的网关。", "integrations.semantics.kimi": "重启或运行 /reload 以应用(v2 会监视该文件)。", @@ -1148,6 +1150,7 @@ export const zh: Record = { "api.clientConfig.copiedAnnounceClient": "已将 {client} 配置 JSON 复制到剪贴板。", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "Oh My Pi", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", diff --git a/gui/src/pages/Integrations.tsx b/gui/src/pages/Integrations.tsx index 772598af2..27584595d 100644 --- a/gui/src/pages/Integrations.tsx +++ b/gui/src/pages/Integrations.tsx @@ -31,6 +31,7 @@ const TABS: readonly TabDefinition[] = [ { id: "grok", hash: "integrations/grok", labelKey: "integrations.tab.grok" }, { id: "opencode", hash: "integrations/opencode", labelKey: "integrations.tab.opencode" }, { id: "pi", hash: "integrations/pi", labelKey: "integrations.tab.pi" }, + { id: "omp", hash: "integrations/omp", labelKey: "integrations.tab.omp" }, { id: "hermes", hash: "integrations/hermes", labelKey: "integrations.tab.hermes" }, { id: "openclaw", hash: "integrations/openclaw", labelKey: "integrations.tab.openclaw" }, { id: "kimi", hash: "integrations/kimi", labelKey: "integrations.tab.kimi" }, @@ -40,6 +41,7 @@ const TABS: readonly TabDefinition[] = [ const FILE_CLIENTS = new Set([ "opencode", "pi", + "omp", "hermes", "openclaw", "kimi", diff --git a/gui/src/pages/integrations/FileIntegrationPage.tsx b/gui/src/pages/integrations/FileIntegrationPage.tsx index 32f408d80..4783a4ef2 100644 --- a/gui/src/pages/integrations/FileIntegrationPage.tsx +++ b/gui/src/pages/integrations/FileIntegrationPage.tsx @@ -19,6 +19,7 @@ export type { FileIntegrationClientId }; const SEMANTICS_KEY: Record = { opencode: "integrations.semantics.opencode", pi: "integrations.semantics.pi", + omp: "integrations.semantics.omp", hermes: "integrations.semantics.hermes", openclaw: "integrations.semantics.openclaw", kimi: "integrations.semantics.kimi", @@ -28,6 +29,7 @@ const SEMANTICS_KEY: Record = { const TAB_LABEL_KEY: Record = { opencode: "integrations.tab.opencode", pi: "integrations.tab.pi", + omp: "integrations.tab.omp", hermes: "integrations.tab.hermes", openclaw: "integrations.tab.openclaw", kimi: "integrations.tab.kimi", diff --git a/gui/src/pages/integrations/integration-api.ts b/gui/src/pages/integrations/integration-api.ts index 2d6830da6..0d7b0d3ad 100644 --- a/gui/src/pages/integrations/integration-api.ts +++ b/gui/src/pages/integrations/integration-api.ts @@ -3,6 +3,7 @@ import { readJsonIfOk } from "../../fetch-json"; export const FILE_INTEGRATION_CLIENTS = [ "opencode", "pi", + "omp", "hermes", "openclaw", "kimi", diff --git a/gui/src/pages/integrations/overview-clients.ts b/gui/src/pages/integrations/overview-clients.ts index 73811976b..cce205390 100644 --- a/gui/src/pages/integrations/overview-clients.ts +++ b/gui/src/pages/integrations/overview-clients.ts @@ -136,6 +136,7 @@ export interface OverviewSources { const FILE_LABEL_KEY: Record = { opencode: "integrations.tab.opencode", pi: "integrations.tab.pi", + omp: "integrations.tab.omp", hermes: "integrations.tab.hermes", openclaw: "integrations.tab.openclaw", kimi: "integrations.tab.kimi", diff --git a/src/cli/help.ts b/src/cli/help.ts index f76849447..c26ed38d1 100644 --- a/src/cli/help.ts +++ b/src/cli/help.ts @@ -173,8 +173,8 @@ const helpEntries: Record = { }, "api-key": { usage: "ocx api-key ...", summary: "Alias of ocx access key." }, export: { - usage: "ocx export --client [--json] [--out ] [--force]", - summary: "Print a client config (opencode, Pi, Hermes, OpenClaw, Kimi Code, Gajae Code) wired to the running proxy.", + usage: "ocx export --client [--json] [--out ] [--force]", + summary: "Print a client config (opencode, Pi, Oh My Pi, Hermes, OpenClaw, Kimi Code, Gajae Code) wired to the running proxy.", details: [ "--json prints only the config JSON on stdout, so it is safe to redirect to a file.", "--out writes the config there and refuses to replace an existing file without --force.", @@ -313,7 +313,7 @@ Usage: ocx agent Subagents, injection, effort caps, and sidecars ocx observe Logs, usage, storage, memory, and debug data ocx access External API keys and endpoint information - ocx export --client Print a client config wired to the running proxy (6 clients) + ocx export --client Print a client config wired to the running proxy (7 clients) ocx integration client Enable, disable, inspect or roll back a client integration ocx grok Grok Build model selection and apply ocx system Runtime settings, startup, sync, and updates diff --git a/src/clients/config-export.ts b/src/clients/config-export.ts index 0a4a84ed0..6fa4dbfe4 100644 --- a/src/clients/config-export.ts +++ b/src/clients/config-export.ts @@ -139,6 +139,12 @@ export const KIMI_LOOPBACK_PLACEHOLDER = "opencodex-loopback"; */ export const GAJAE_API_KEY_ENV = "OPENCODEX_GAJAE_API_KEY"; +/** Env var omp reads for the proxy admission key (bare `$VAR` interpolation). */ +export const OMP_API_KEY_ENV = "OPENCODEX_OMP_API_KEY"; + +/** omp's reference form for the admission key. Never the value. */ +export const OMP_API_KEY_ENV_REF = `$${OMP_API_KEY_ENV}`; + /** Pi's wire-dialect selector for an OpenAI-compatible endpoint. */ const PI_API_DIALECT = "openai-completions"; @@ -339,6 +345,45 @@ export function gajaeConfigPath(env: OpencodeLaunchEnv = process.env, home: stri return join(gajaeHomeDir(env, home), "agent", "models.yml"); } +/** + * omp's config root: `~/.omp` (legacy `PI_CONFIG_DIR`/`.pi` no longer used by + * oh-my-pi 17.x; the agent directory moved to `~/.omp/agent`). + */ +export function ompHomeDir(env: OpencodeLaunchEnv = process.env, home: string = homedir()): string { + const override = env.PI_CONFIG_DIR?.trim(); + return override && override.length > 0 ? override : join(home, ".omp"); +} + +/** + * The agent directory omp actually reads settings from. + * + * omp's DirResolver computes: config root (`PI_CONFIG_DIR` or `~/.omp`), then + * `agent` beneath it, with `PI_CODING_AGENT_DIR` overriding the agent + * directory outright and `OMP_PROFILE`/`PI_PROFILE` switching to + * `/profiles//agent`. Mirroring the environment selectors keeps + * the toggle writing where the running agent reads. + */ +export function ompAgentDir(env: OpencodeLaunchEnv = process.env, home: string = homedir()): string { + const root = ompHomeDir(env, home); + const profile = env.OMP_PROFILE?.trim() ?? env.PI_PROFILE?.trim(); + const agentOverride = env.PI_CODING_AGENT_DIR?.trim(); + if (profile && profile !== "default") return join(root, "profiles", profile, "agent"); + if (agentOverride && agentOverride.length > 0) return agentOverride; + return join(root, "agent"); +} + +/** + * The models config omp actually reads: `~/.omp/agent/models.yml`. + * + * omp 17.x reads its custom provider list from `models.yml` (or `models.yaml`) + * in the agent directory. This is where a user's hand-written + * `providers.` blocks live, so a toggle must write here — not to the + * legacy `~/.pi/agent/models.json` the old Pi exporter targets. + */ +export function ompConfigPath(env: OpencodeLaunchEnv = process.env, home: string = homedir()): string { + return join(ompAgentDir(env, home), "models.yml"); +} + /** * One proxy-routed model destined for a client config. Deliberately narrower than * `CatalogModel` so a serializer cannot reach for a field that does not survive the @@ -370,6 +415,7 @@ export interface ExportContext { export type ExportClientId = | "opencode" | "pi" + | "omp" | "hermes" | "openclaw" | "kimi" @@ -600,6 +646,24 @@ export interface PiGeneratedConfig { providers: Record; } +/** + * omp's `~/.omp/agent/models.yml` custom-provider shape. + * + * `providers` is a keyed object; each entry declares the endpoint and the + * models the agent may route to. opencodex owns the `opencodex` key, exactly + * as it owns the `opencodex` provider key in every other client's config. + */ +export interface OmpProviderBlock { + baseUrl: string; + api: string; + apiKey: string; + models: PiModelEntry[]; +} + +export interface OmpGeneratedConfig { + providers: Record; +} + /** * Hermes `~/.hermes/config.yaml`. We emit ONLY the provider entry — never * `model.default` — because hijacking the user's main model is not what a @@ -735,6 +799,41 @@ function buildPiClientConfig(ctx: ExportContext): PiGeneratedConfig { }; } +/** + * omp's `~/.omp/agent/models.yml` shape. Same model entries as Pi (id, name, + * input) plus the provider's baseUrl/api/apiKey. omp validates strictly and + * drops the whole provider over one invalid model, so the same + * text|image-enum guard applies. + */ +function buildOmpClientConfig(ctx: ExportContext): OmpGeneratedConfig { + const models: PiModelEntry[] = []; + for (const model of normalizeExportModels(ctx.models)) { + const input = inputModalitiesForClient("pi", model.inputModalities); + if (input === null) continue; + const entry: PiModelEntry = { + id: model.namespaced, + name: exportModelLabel(model), + input, + }; + const context = authoritativeContextWindow(model.contextWindow); + if (context !== undefined) { + entry.contextWindow = context; + entry.maxTokens = outputBudgetFor(context); + } + models.push(entry); + } + return { + providers: { + [OPENCODE_PROVIDER_ID]: { + baseUrl: ctx.baseUrl, + api: PI_API_DIALECT, + apiKey: OMP_API_KEY_ENV_REF, + models, + }, + }, + }; +} + /** Extra headers a non-loopback bind needs, or nothing on loopback. */ function proxyAdmissionHeaders(config: OcxConfig | undefined, envRef: string): Record | undefined { return shouldInjectApiAuthHeader(config) ? { "x-opencodex-api-key": envRef } : undefined; @@ -862,6 +961,11 @@ function summarizePi(document: unknown): { modelCount: number; modelsWithoutLimi return { modelCount: models.length, modelsWithoutLimits: models.filter(model => model.contextWindow === undefined).length }; } +function summarizeOmp(document: unknown): { modelCount: number; modelsWithoutLimits: number } { + const models = (document as OmpGeneratedConfig | undefined)?.providers?.[OPENCODE_PROVIDER_ID]?.models ?? []; + return { modelCount: models.length, modelsWithoutLimits: models.filter(model => model.contextWindow === undefined).length }; +} + function summarizeHermes(document: unknown): { modelCount: number; modelsWithoutLimits: number } { const models = (document as HermesGeneratedConfig | undefined)?.providers?.[OPENCODE_PROVIDER_ID]?.models ?? []; // Hermes carries selectors only; it has no per-model limit to be missing. @@ -900,6 +1004,11 @@ function buildPiContribution(ctx: ExportContext): ManagedContribution { return singleFragment("pi", ["providers", OPENCODE_PROVIDER_ID], doc.providers[OPENCODE_PROVIDER_ID]); } +function buildOmpContribution(ctx: ExportContext): ManagedContribution { + const doc = buildOmpClientConfig(ctx); + return singleFragment("omp", ["providers", OPENCODE_PROVIDER_ID], doc.providers[OPENCODE_PROVIDER_ID]); +} + function buildHermesContribution(ctx: ExportContext): ManagedContribution { const doc = buildHermesClientConfig(ctx); return singleFragment("hermes", ["providers", OPENCODE_PROVIDER_ID], doc.providers[OPENCODE_PROVIDER_ID]); @@ -960,6 +1069,22 @@ export const EXPORT_CLIENTS: Record = { // admission header a remote bind requires. loopbackOnly: true, }, + omp: { + id: "omp", + // The download name uses the canonical `.yaml` extension; the real file + // oh-my-pi reads stays `~/.omp/agent/models.yml` (same split Gajae uses). + filename: "omp-models.yaml", + destination: env => ompConfigPath(env), + apiKeyEnv: OMP_API_KEY_ENV, + exportHint: `export ${OMP_API_KEY_ENV}=`, + build: buildOmpClientConfig, + format: "yaml", + summarize: summarizeOmp, + buildContribution: buildOmpContribution, + // omp's provider block has no header field for the dedicated admission + // header, so a remote bind is refused the same way Pi's is. + loopbackOnly: true, + }, hermes: { id: "hermes", filename: "hermes-config.yaml", diff --git a/src/integrations/registry.ts b/src/integrations/registry.ts index b4c086bdd..b16122fd8 100644 --- a/src/integrations/registry.ts +++ b/src/integrations/registry.ts @@ -18,6 +18,8 @@ import { hermesHomeDir, kimiConfigPath, kimiHomeDir, + ompConfigPath, + ompHomeDir, opencodeGlobalConfigPath, openclawConfigPath, openclawHomeDir, @@ -68,6 +70,11 @@ export const INTEGRATION_CLIENTS: Record join(home, ".pi", "agent", "models.json"), detectDir: (_env = process.env, home = homedir()) => join(home, ".pi"), }, + omp: { + id: "omp", + configPath: (env = process.env, home = homedir()) => ompConfigPath(env, home), + detectDir: (env = process.env, home = homedir()) => ompHomeDir(env, home), + }, hermes: { id: "hermes", configPath: (env = process.env, home = homedir()) => hermesConfigPath(env, home), diff --git a/tests/cli-export-command.test.ts b/tests/cli-export-command.test.ts index 108dbcaa3..ca7140965 100644 --- a/tests/cli-export-command.test.ts +++ b/tests/cli-export-command.test.ts @@ -145,6 +145,13 @@ describe("ocx export human output (accept criterion 2)", () => { expect(result.stdout).toContain(join(".pi", "agent", "models.json")); expect(result.stdout).toContain("export OPENCODEX_API_KEY="); }); + + test("Oh My Pi names its own destination and env var", async () => { + const proxy = fakeProxy(); + const result = await run(["--client", "omp"], { baseUrl: proxy.baseUrl }); + expect(result.stdout).toContain(join(".omp", "agent", "models.yml")); + expect(result.stdout).toContain("export OPENCODEX_OMP_API_KEY="); + }); }); describe("ocx export --out (accept criterion 3)", () => { @@ -202,7 +209,7 @@ describe("ocx export argument validation (accept criterion 4)", () => { const proxy = fakeProxy(); const result = await run(["--client", "cursor"], { baseUrl: proxy.baseUrl }); expect(result.code).toBe(2); - for (const id of ["opencode", "pi", "hermes", "openclaw", "kimi", "gajae"]) { + for (const id of ["opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae"]) { expect(result.stderr).toContain(id); } expect(result.stdout).toBe(""); diff --git a/tests/client-config-export-new-clients.test.ts b/tests/client-config-export-new-clients.test.ts index 9de47024f..28eeaa971 100644 --- a/tests/client-config-export-new-clients.test.ts +++ b/tests/client-config-export-new-clients.test.ts @@ -7,6 +7,9 @@ import { HERMES_API_KEY_ENV_REF, KIMI_LOOPBACK_PLACEHOLDER, OPENCLAW_API_KEY_ENV_REF, + ompAgentDir, + ompConfigPath, + ompHomeDir, OPENCODE_PROVIDER_ID, buildClientConfig, buildClientConfigText, @@ -63,7 +66,7 @@ describe("no secret reaches a client config", () => { // client whose schema has no header field cannot authenticate remotely at // all. Saying so beats exporting a config that 401s. const loopbackOnly = EXPORT_CLIENT_IDS.filter(id => EXPORT_CLIENTS[id].loopbackOnly); - expect(loopbackOnly).toEqual(["pi", "kimi", "gajae"]); + expect(loopbackOnly).toEqual(["pi", "omp", "kimi", "gajae"]); }); test("every client that is not loopback-only carries the header on a remote bind", () => { @@ -266,9 +269,42 @@ describe("gajae", () => { }); }); +describe("omp", () => { + test("with no override the agent config is ~/.omp/agent/models.yml", () => { + expect(ompHomeDir({}, "/home/u")).toBe(join("/home/u", ".omp")); + expect(ompAgentDir({}, "/home/u")).toBe(join("/home/u", ".omp", "agent")); + expect(ompConfigPath({}, "/home/u")).toBe(join("/home/u", ".omp", "agent", "models.yml")); + }); + + test("PI_CONFIG_DIR relocates the whole root, agent directory included", () => { + expect(ompConfigPath({ PI_CONFIG_DIR: "/srv/omp" }, "/home/u")) + .toBe(join("/srv/omp", "agent", "models.yml")); + }); + + test("PI_CODING_AGENT_DIR overrides the agent directory outright", () => { + expect(ompAgentDir({ PI_CODING_AGENT_DIR: "/data/agent" }, "/home/u")).toBe("/data/agent"); + expect(ompConfigPath({ PI_CODING_AGENT_DIR: "/data/agent" }, "/home/u")) + .toBe(join("/data/agent", "models.yml")); + }); + + test("OMP_PROFILE wins over the agent-directory override, default stays unnamed", () => { + // omp's DirResolver drops the agent-dir override when a profile is active. + expect(ompAgentDir({ OMP_PROFILE: "work", PI_CODING_AGENT_DIR: "/data/agent" }, "/home/u")) + .toBe(join("/home/u", ".omp", "profiles", "work", "agent")); + // `default` is the unnamed profile, not a directory suffix. + expect(ompAgentDir({ OMP_PROFILE: "default" }, "/home/u")) + .toBe(join("/home/u", ".omp", "agent")); + }); + + test("PI_PROFILE is the legacy fallback for OMP_PROFILE", () => { + expect(ompAgentDir({ PI_PROFILE: "legacy" }, "/home/u")) + .toBe(join("/home/u", ".omp", "profiles", "legacy", "agent")); + }); +}); + describe("contributions name every fragment we own", () => { test("single-entry clients own exactly one path", () => { - for (const id of ["opencode", "pi", "hermes", "openclaw", "gajae"] as const) { + for (const id of ["opencode", "pi", "omp", "hermes", "openclaw", "gajae"] as const) { expect(buildClientContribution(id, ctx()).fragments).toHaveLength(1); } }); diff --git a/tests/client-config-export.test.ts b/tests/client-config-export.test.ts index 8ab7faeab..817ed767c 100644 --- a/tests/client-config-export.test.ts +++ b/tests/client-config-export.test.ts @@ -8,6 +8,8 @@ import { OPENCODE_API_KEY_ENV_REF, PI_API_KEY_ENV, PI_API_KEY_ENV_REF, + OMP_API_KEY_ENV, + OMP_API_KEY_ENV_REF, SCHEMA_REQUIRED_OUTPUT_BUDGET, buildClientConfig, buildClientConfigText, @@ -17,6 +19,7 @@ import { type ExportModel, type OpencodeGeneratedConfig, type PiGeneratedConfig, + type OmpGeneratedConfig, } from "../src/clients/config-export"; import { buildOpencodeProviderBlockFromCatalog, opencodeGlobalConfigPath } from "../src/cli/opencode"; import type { OcxConfig } from "../src/types"; @@ -74,6 +77,10 @@ function piConfig(context: ExportContext = ctx()): PiGeneratedConfig { return buildClientConfig("pi", context) as PiGeneratedConfig; } +function ompConfig(context: ExportContext = ctx()): OmpGeneratedConfig { + return buildClientConfig("omp", context) as OmpGeneratedConfig; +} + describe("relocated OpenCode serializer (accept criterion 1)", () => { test("the moved builder reproduces the pre-refactor golden byte-for-byte", () => { const block = buildOpencodeProviderBlockFromCatalog(10100, FIXTURE, "127.0.0.1"); @@ -282,8 +289,8 @@ describe("stable ordering (accept criterion 4)", () => { }); describe("EXPORT_CLIENTS registry", () => { - test("covers exactly the six file-toggle clients", () => { - expect(EXPORT_CLIENT_IDS).toEqual(["opencode", "pi", "hermes", "openclaw", "kimi", "gajae"]); + test("covers exactly the seven file-toggle clients", () => { + expect(EXPORT_CLIENT_IDS).toEqual(["opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae"]); for (const id of EXPORT_CLIENT_IDS) expect(isExportClientId(id)).toBe(true); // The exception clients keep their own surfaces and are not export clients. expect(isExportClientId("claude-desktop")).toBe(false); @@ -391,6 +398,40 @@ describe("EXPORT_CLIENTS registry", () => { `); }); + test("omp bytes are a yaml provider block for ~/.omp/agent/models.yml", () => { + const built = buildClientConfigText("omp", ctx({ config: cfg() })); + expect(built.format).toBe("yaml"); + expect(built.text).toBe(`providers: + opencodex: + baseUrl: "http://127.0.0.1:10100/v1" + api: openai-completions + apiKey: "$OPENCODEX_OMP_API_KEY" + models: + - id: anthropic/claude-opus-5 + name: "Claude Opus 5 (anthropic)" + input: + - text + contextWindow: 200000 + maxTokens: 32000 + - id: custom/no-context + name: "no-context (custom)" + input: + - text + - id: gpt-5.6-luna + name: "gpt-5.6-luna (native)" + input: + - text + contextWindow: 272000 + maxTokens: 32000 + - id: tiny/small-ctx + name: "small-ctx (tiny)" + input: + - text + contextWindow: 8000 + maxTokens: 8000 +`); + }); + test("every spec declares a format, a summarizer and a contribution", () => { for (const id of EXPORT_CLIENT_IDS) { const spec = EXPORT_CLIENTS[id]; @@ -428,6 +469,7 @@ describe("EXPORT_CLIENTS registry", () => { test("filenames name the destination file, not the product", () => { expect(EXPORT_CLIENTS.opencode.filename).toBe("opencode.json"); expect(EXPORT_CLIENTS.pi.filename).toBe("pi-models.json"); + expect(EXPORT_CLIENTS.omp.filename).toBe("omp-models.yaml"); expect(EXPORT_CLIENTS.hermes.filename).toBe("hermes-config.yaml"); expect(EXPORT_CLIENTS.openclaw.filename).toBe("openclaw.json5"); expect(EXPORT_CLIENTS.kimi.filename).toBe("kimi-config.toml"); @@ -446,11 +488,17 @@ describe("EXPORT_CLIENTS registry", () => { expect(EXPORT_CLIENTS.pi.destination({} as NodeJS.ProcessEnv)).toBe(join(homedir(), ".pi", "agent", "models.json")); }); + test("the omp destination is the agent models.yml oh-my-pi 17 reads", () => { + expect(EXPORT_CLIENTS.omp.destination({} as NodeJS.ProcessEnv)).toBe(join(homedir(), ".omp", "agent", "models.yml")); + }); + test("apiKeyEnv and exportHint name the variable the config references", () => { expect(EXPORT_CLIENTS.opencode.apiKeyEnv).toBe(OPENCODE_API_KEY_ENV); expect(EXPORT_CLIENTS.opencode.exportHint).toContain(OPENCODE_API_KEY_ENV); expect(EXPORT_CLIENTS.pi.apiKeyEnv).toBe(PI_API_KEY_ENV); expect(EXPORT_CLIENTS.pi.exportHint).toContain(PI_API_KEY_ENV); + expect(EXPORT_CLIENTS.omp.apiKeyEnv).toBe(OMP_API_KEY_ENV); + expect(EXPORT_CLIENTS.omp.exportHint).toContain(OMP_API_KEY_ENV); for (const id of EXPORT_CLIENT_IDS) { expect(EXPORT_CLIENTS[id].exportHint).not.toContain("ocx_"); } @@ -466,5 +514,6 @@ describe("EXPORT_CLIENTS registry", () => { const empty = ctx({ models: [] }); expect(opencodeConfig(empty).provider.opencodex!.models).toEqual({}); expect(piConfig(empty).providers.opencodex!.models).toEqual([]); + expect(ompConfig(empty).providers.opencodex!.models).toEqual([]); }); }); diff --git a/tests/integrations-invariants.test.ts b/tests/integrations-invariants.test.ts index 4178b908b..dae3eabc6 100644 --- a/tests/integrations-invariants.test.ts +++ b/tests/integrations-invariants.test.ts @@ -66,7 +66,7 @@ afterEach(() => { }); describe("the client registries cannot drift apart", () => { - test("every list of clients holds exactly the same six ids", async () => { + test("every list of clients holds exactly the same seven ids", async () => { /* * Five lists name the same six clients, and two of them are maintained by * hand: the GUI cannot import the backend registry, because that would @@ -78,7 +78,7 @@ describe("the client registries cannot drift apart", () => { const guiIntegrations = await import("../gui/src/pages/integrations/integration-api"); const expected = [...EXPORT_CLIENT_IDS].sort(); - expect(expected).toHaveLength(6); + expect(expected).toHaveLength(7); expect([...INTEGRATION_CLIENT_IDS].sort()).toEqual(expected); expect([...gui.CLIENTS].sort()).toEqual(expected); @@ -125,6 +125,7 @@ describe("every client survives a full lifecycle", () => { const SEED: Record = { opencode: '{\n "provider": {\n "mine": { "npm": "keep-me" }\n }\n}\n', pi: '{\n "providers": {\n "mine": { "api": "http://keep-me" }\n }\n}\n', + omp: "providers:\n mine:\n api: http://keep-me\n", hermes: "providers:\n mine:\n api: http://keep-me\n", openclaw: '{\n models: {\n providers: {\n mine: { api: "http://keep-me" },\n },\n },\n}\n', kimi: '[providers.mine]\napi = "http://keep-me"\n', diff --git a/tests/integrations-state.test.ts b/tests/integrations-state.test.ts index 8ef851018..d1ebb00ad 100644 --- a/tests/integrations-state.test.ts +++ b/tests/integrations-state.test.ts @@ -381,9 +381,9 @@ describe("installation detection is independent of config state", () => { * from. Rationale and the per-client table: 020 §1 amendment. */ describe("the loopback-only set is one fact, read through one seam", () => { - test("pi, kimi and gajae are loopback-only and nobody else is", () => { + test("pi, omp, kimi and gajae are loopback-only and nobody else is", () => { const loopbackOnly = INTEGRATION_CLIENT_IDS.filter(id => isLoopbackOnly(id)); - expect(loopbackOnly).toEqual(["pi", "kimi", "gajae"]); + expect(loopbackOnly).toEqual(["pi", "omp", "kimi", "gajae"]); }); test("the registry restates nothing — it reads the export spec", () => { diff --git a/tests/management-client-config-route.test.ts b/tests/management-client-config-route.test.ts index c5fa46912..915809104 100644 --- a/tests/management-client-config-route.test.ts +++ b/tests/management-client-config-route.test.ts @@ -4,6 +4,8 @@ import { OPENCODE_API_KEY_ENV, OPENCODE_CONFIG_SCHEMA, OPENCODE_PROVIDER_ID, + OMP_API_KEY_ENV, + OMP_API_KEY_ENV_REF, PI_API_KEY_ENV, PI_API_KEY_ENV_REF, buildClientConfig, @@ -12,6 +14,7 @@ import { type ExportModel, type OpencodeGeneratedConfig, type PiGeneratedConfig, + type OmpGeneratedConfig, } from "../src/clients/config-export"; import type { OcxConfig } from "../src/types"; import { catalogConvergenceFactory } from "./helpers/catalog-convergence"; @@ -158,6 +161,24 @@ describe("GET /api/client-config", () => { expect(provider.models.map(model => model.id)).toContain("a/m1"); }, 15_000); + test("omp returns the oh-my-pi models.yml provider block", async () => { + const response = await clientConfigApi(baseConfig(), "?client=omp"); + expect(response.status).toBe(200); + const body = await response.json() as ClientConfigEnvelope; + + expect(body.client).toBe("omp"); + expect(body.filename).toBe("omp-models.yaml"); + expect(body.apiKeyEnv).toBe(OMP_API_KEY_ENV); + expect(body.format).toBe("yaml"); + + const provider = (body.config as OmpGeneratedConfig).providers[OPENCODE_PROVIDER_ID]; + expect(Array.isArray(provider.models)).toBe(true); + expect(provider.api).toBe("openai-completions"); + expect(provider.apiKey).toBe(OMP_API_KEY_ENV_REF); + expect(provider.baseUrl).toBe("http://127.0.0.1:10100/v1"); + expect(provider.models.map(model => model.id)).toContain("a/m1"); + }, 15_000); + test("counts describe the emitted document, including models without limits", async () => { const config = baseConfig(); const opencode = await (await clientConfigApi(config, "?client=opencode")).json() as ClientConfigEnvelope; From 3a53748d27b0778691c1ffc33f6a9598931391d8 Mon Sep 17 00:00:00 2001 From: Hanbin Noh <282618027+hanbinnoh@users.noreply.github.com> Date: Fri, 7 Aug 2026 00:36:35 +0900 Subject: [PATCH 2/8] docs: add Oh My Pi integration dashboard screenshot --- gui-screenshot.png | Bin 0 -> 188122 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 gui-screenshot.png diff --git a/gui-screenshot.png b/gui-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3294e59004987be9af856f1a8500917357c35815 GIT binary patch literal 188122 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

(8bPB%*vuNgn(0)eN z3rAr-2?;CUS+_`TpQE1d*tPvWu}`TAQh?MSEXG(yoPSayku`Y=r(dvmufuKpP6eHZ ztMb~PBZ;!qqF$RH5_W4GnbtJMd&~(jEIwHEsz2cpt(Xo9Dzk`k8>PrUWN)hc!=m@1 z*2B1oGo5DXO-Obsk9q^6ZB%178A25Y**~H|?YL#o&T)q401F!N2sV){yUdk8!K%UO z!%EW+r!&{SLFE7tuwXz?c_ecFpY?3oRg+TPSNv$|MjvW z3fsowAA3b3j{M$Zz}s?&Soo1DsvLj9O36vfq|$#a^+#5b@`x2DlCDRL zOO?^LD%?RZZ4U-r5*O5ruVRBJ1RSKi&px9;cxEfUA4&o+WT}Tz7U$$^1$kP5s4V)b!d@&5< zc^tVy990y-D~&ISZHDUQJ$iVtOfm->xX~t4aWH9lV^Ml43pw=w`-z3>eOen+~D4y;J^j-JNW`yP(0DUF2X5{zlZq2-HQQ#QtGE^8| zb9|6qJb5eD!8Cw@qBS0$klIyjzn&Yu8@CPGBM-Pc2V64Oj?eYscs`pAq%$|<;!f1S z?nXi+RKe)@T3G;mPWlVaq7<8S7ZnRd#^oi(5P!Ob%T>FRi_%}L`dQ+?>=53v-|($1 zd)PT<-%7Xg&1p2U#J+sq`rTTdD3~=asQs|pKll}vxjadH<6x~aN^dAHhwKRpnI`_b zdD@z;8G@tF7vt{U_P>_FaV>PQ%M^>9`b$;7%^^(iQMwk45p1=Y;hs~hdsCAkNzmN1>-$uOj41H@ zX(s4))j7ag;iV=iUc`2GPt5=+*BlrBi7w$M5{Lk zLnguYk0gqvP+LGU(QAET_n=wqx6R=hQl?X!G}>P5@QG}cIp>VMv#+YS(I`0`M)tHV zy}JuxLGqXc2QuY|?d>+Ocoa;OU0-ALb$_mHujDP>H*J3%D-o+7##JeL9~mj@=7xc7 zN}A%7{_Wi=Jwrn*(F_9pofvB=LbGAr|NRFJ<&Q%Q2Dj~*N>!u;wL#QzI9NCyI_6ab zz`$7vEyQQl$34d^y@^1{bJm7UAogjJeT`xYa4kDkav0K!7;ggN_J`1yGJN!b$hAu; zP}pQD5N_pUJ9(g@6lARLu98Mj053 z{tmz@>u8ag+Dekn`W(xlg45!iPvIcONhT704=zi^*zLEvurb^+rpBk7E0YO& z`{``bc(L2IA#J}&6mI@_^xOB$Fg!)UqJXqzL}@fXG4&cG<5*(Rm^HBFD);Gl`yWsU zX`p~_hIZwE&FSCv;aj0U%oyDUwSiR<&ducrrgqflR&dmqf&*XT-$-&N8fRD(tRAe{ zM4=LB_+FlFjO9!BuV*}ylEU1RbZ+#~;6*J$!#E44$cum5WO6cp@wUP77T=gu!bhWD2c0B{?|vEup*nR# zgHH~S5kLI}@kGvyXfh37hNB2;|9*l&cj&DeFZ}s{MJ*M^bGe=yYu_})8NG&BRCWp9 z_qjh@;L-hBky1PyDfD}}6}%I!%V^BtX1+%E!6Myv>1Yg)aQP*m=-Tm`P2)J@0uGBW z0gBHIeuOcrlBW&T+;>Fp!hX(s>3 zd8$UV_d^6qeG1fhWy4T4sLvE(0ipKV4%tYe*G6{1|t8 z{+lQfg?l(T+6_0K=$Ya8*>qb2pC~&Eq%(ofZUL?-B<*yIY|S*`oH;O2*&xX%laz;x z?1$!qLH=e}tJWv;A@fWea_UrQMVy8Fc>yKRMp)m9`gWD6UoA4vSXJ5nM_u-{Kd*bd zo+1Kxm`{2f&oz5s7-y}TM2-=zHMj4Je#lSZ1S$f=Fn_S0p}x~3Pg)2L(W>&Vp@F#c~?AyO1+GmFrM7?pLH$v&>M%mFGAD`Auw%USdek2Su*&U!Bu-iiPWRQmRDS z1ywc+p1XLz7#dMBp#|QQypOP$_-r6i7Zm0E-+*$Y;mGIO472-ST2!9XRLgY5qEy@q z$tUcaQ45s1Twe+DA+k=9Uz)$A!LHOD@-||iZu$VR?2Ub`1T4wV^foYe@{y&muLjUiADN|ch0Jc41vz*4*iv<&`c#Vn6{`yQCMLZY-d%vI2+Dbp8}Ie>N73M62{A<@XILh(R*@`u zXqUIG^+SX>=DZS`1+xGaH7QV1JQnO46v`0v%|KpR1)3yaig`rOeAI1(UUfFn4^tQX-zX1Rj*;F^9U^BYZHk122o|L z758;k)2wEM?Anm**o-~n4~m~e$O(w!Xx+IE;QKsIMr`4!7{|Ij&&3|8kss#kg@3SN z>-<6+QVji0Jz#7exoYn-62Gf*h`<0PHCu^P6Ll+hg=T>xYt&(Jw<|;5WV=-6bih`j z*CdifD(LF6n5 z*P(@((*UX8TgF#F78h!wyrypJd_Su85GRMZvFo9?2==q`KA@&7s>nn|5gIcqz z6jr?u3?bW|fTyaC`{PQ3w&ez!jYfmEHvyO9>B5uQ2_c)s5|s>IyFZ#0#LZ0G@FX$; z#F)?vP|_@Brgvo;IEKW&V;t1E#!y4^|A71(!T5i48)OS*=P+&kwx`dzzfFKQ8a)nT zYL9trL{vr`StM@acqoLgRA`Zff3E49(^lcq3WwUh$^TTz9{-UK6ef$Oh&2zB4$@aq z6r+u|(3s|Sranj?b?~dtfCw~9R@XpL5Cv5$GzX*=d+i$Gz&8-iLs)#p72Ym5MoH+^FI%HdMM(Ft<@MssOp&|X16~iUKD!&q)v7s;F{Sf#Y|zBwwJ8U zj^W_QW-}gS&(*dVXQd;0o|&O_`@z8+`^JfTuEv=7{-^@IMbGXW$d;FpH>T0A5VZ%D zvDr6or*|^WMDObsGu{?7i$ z1@_YCS^hgjfTv&VOr#e72gCVysEv+1oGet$3!>ae6-T(dVB2k&FyAOvAyv$3g3{W_ z+*eI&aY@e*$c=+XqDRY`o+*@F^*l97(Dcx*U%Jagg?*=B&<~4+Zqn$iz^wVYgmdRC z^PUiWv?a&wphcq59NfGGMmr$=!y#GEs05~@K+?{FnUKYij^Cj<&p=*tE?N%CdOHIXHjfFHT_4!rf z%QXI&NSrKGRO(ex;-;3IbHRaygXBQNiKP6y*ji^9epd6!dz&He8@;9i9gi z)wm@d|LnsHFYTnlRN}EOE3w5-8y$~3j|l~A#X9+=M)Q^3Ie#)#t()GfPwekC(uN<5 zrfwegNK%sN5j}mje+NiDqGW!&$?YCDgX1H3ZI#Z=^yZV4V~Uvv7lZn)HpYH@Vyvvn znb?MyHK7Wb(9qvZWKYK+8*vsS#UHIx#UI!P6BP@Qk}alW*wmIMd0BDSv(e>E2_2sn z-p$L*T6}X?IPA|?t!Ij22!HHW{%$k$c`6ioeUEUlSum++6I*UT?Xulyv|Dd)nTRHh zK7Xj*3iWwDqL0L9Q)dojiR+%dKU;0NY1FeP<1FzVa;=Ervt5MT0OaYe=kMrr>&`oO z^dxR$oo9Lv{M8F*O=|(2o^dZr#o3weuQjRb7df!+&%bOM!7CxjUOe;~yX!yCTQA$Q z$tVA;h#=m#A7f~RbZ(aGa7_r@)K?nZpDlLY{h*FDtTjWXtJLXuo|f}jd+E+H5OCr1 zm_^R^eb*^j+#N}bA@|_sd^nxj8w6J3xcEGm(uV>_S3B+giiMy(Z{Wn5j=F7lyB$_j z5*Xe7^@Bchz07$x9g0C9uv==cfy9ua^G@f>dD~8mAh_dhUdzy9pug_>Tv>6J=kbK^ z`%RHTMnKZu-(MR(FK2FRE(?!WJ8yFEK};GIs^%vt3d+))`M~erJ$F+l0l~kU2Vn!I z)9JIxZhQ_As{9TS=uJTG@srW=a{e^W4ze`P)LI<0nE^N~1d*cw!AkR+NH3&%nXe3t z)~x*r?|Vt^>Oao$;lo<(8OM2x#c3mCf`7N-#Y9Z$v%BTJo@GsX4l{3J6AbLE;gsYN z>Z}&_t1w#c5EOG&H0<8MwklEu=x=Kc=#!fcMh`aGitHL6fuDKb2K!-F^lP(RHEZMZ&$QJ=Rxocq4-gj5fket5&pb)H^txSX%TKM6gV zp;)kLS8t}~OUh?|JYWJE=V?~h} z-=A)ze!H(eZ1{fsiDc`1KK|&F3`P-p>Z12?8j*N=#%R846x3?~doS6ud+gjT+%H*X zQ^yKCL!NxBUn7Ta4usxn9QQ_t$bG4_kt;@?Dj|^{5Q#2$TFqS5ew`r4mIkS2&vz#> zSz1Qk4H|zm=l&dwx3u3c+w_HE45@Nij6L43*ng1=4vIKiPCov@02Lf43d2E27*jYL z>@kQ)fI*6M81i-5eUN&8^u;M{BnDiK5(YjDi?y!2N`-i7WLXU}b2?|SoqQT*oMKp5P>P}qrXvXh3K`r6T|R5{YIIe4ZTQnjFq%>04(`fSXc;me zP{X{hlR4kSSQZ=fKo2!Y=tjOBha(?feD-w?Ry|*Sr+&I_-s#Hxa*~o^FL09S1e=1& z_Bv;6nHi4v`buyBAf9~a`tW!pI52Q{sc4!l)q9v4$`+5>DM(aG`+T(X@#ShUyXr}9 za&g1Zb>Il{GjarU!rS=_d#~3kDess2w!0Kx@LH?O_KCgA@hpEid2U3DQ&;OtmhW%J zV{68Dk-(SRbC)5zrgfJI?}t?lYnhKtFqJ!E$HLU8+4E0z?A$BdAD z&qOF1aJ}QiN9ps`;wQes)9mtzf4K z1s$j#Y3yCE*Qus4N3*3k1z4f@thyBHDotPmgXN>*>=<6(i;johq!yM&4t~ElMzC{d+X0C2xGhd#?>7n`o4GXeg zZ-<18a2JzC+39)*u*1A^YE*;S@?Uy*Opo6??1sln#ofvL)OF#*-Q@rQ*X2cSC@ERd z-O|L3FBZ~MK(g(mKAYQY|u*3Ff znpLmSc<%AyYUo`L@&Romff%uO^V@jaFLpiG0rOv3F7y0v&v%FfXX_1Wq5hcd+HJ09 zt@Y5BW2sZEE+?N*SDH-*A{y;h5~gug!X&?~oXnQqoVQ(|6LE?+Vd%(CDDVb|p{>T5 zf}A&^U||JYDG|Yk{UfG~IR>pg{KECj5+YKdRBRvB-9><6ZyE_oAQ-B_*!ybWw(ET_ zU5e}}b{%C;4}mH?1pFTwR)Tc@vu)3>KpS2&FWqmkLSUM-6O<$eaz*F`P7(+0*ojAt z<8o^I6gU-x^W-G24v0Dp_wh?wKv9j`3mq6O3o~o?0hCqLhBCMs9LCpw1b13NtlTW4ZA<@KlXA8d5L*yD2niZ~R z%e7*|fgd43Mxb&dA@AkcXdtirlNqNdf=e(LDM|_D^fHglWf$wihy?y@xem@pq~q9)Bl zK+LEFF02iPA5_0{^<0ih&Sk{j-{PV_gT8?XL#`9~q!pq1zynNOyO>)}~pZt4)%JQ`Tg& zpeP-7`xV|?T>3ENyw7QH*lm1%BVcbd!|6f}RI3&7{V)U$fVn8j%UmA$rvifi92~Ob zxAxUsAXAUhPX96lA1Vbe+`*@WIl5R8m@J4&pWhd~AJ*%B>`02B&TtOPIQP|#L3pu! z$K8I%!}`sfmQnEB>0+npR&VfzR~?)*kL}z`4v@?k4pFYn>ToE*jsh}fhJmIAY5$d6 zs!thF?u%VDuHvoPaH&ok5Y5O%28R6%#8O^-S9!xiRMQVZk?efN_o$G5T=<3}IYvEm z@St#Q%b+3gY)NB!m%c!nUBgXx$MH;rwO3O3%3YroekoqyT3lbMU+VZbrD8qpK{N0f z;CX+_WBObVal3gFQLWp0-nS`Yg;zG09yj~{RvPV%I&F2jd|<1al{)OEdypc3v7CEP ziin_yG97kxDRNZ`&f73ZkJuxSzAWo3qsdKhp_=MMP@<6CWDO=CJO>Ls%S;<$}2JNf+u#kQ0 zRr8LL)m#~m_Q>oNlEdeZ*Be${W2XmX`$Iw@A1{b?gj_sPE&M_NmAeQ^sY?D}45{Fx z-OE+1@9VhWMUZ=Rhq`}Q5U;SOJaYD}6IHreI_j$Q7L59?sNs+*1>`OdcVkif*0VfC zXr2O?#1z6dLx65b>*-<08&kA0+^-q?&ZnXQBVX@cWcs4P;v9H84=SWyS3Y=W2YPqR zzhyB*U!KG1$?RuKREiaU2lO$XEjQ@h-eIG7)f;teiTQ-8*$!C_b6bqih4ahdE@Ve& z12+QSAR`mf1rcB39?GmWg9gPb0wm;P2eG^Ahy3$JRefBvptwJU&};iM^cWLa$S}n4 zU{?k6cZyBV6k~3cjid50d_h94i69x>N#D!&pVX2h;o)JV#?QaqRvSI(Xt* z2l!rq`fTh!s8OcgqiQ-7mGyYcj1(jMyf_Te_*bw+#?K84YYr!NZaE^A&96px4jzJ-#~)xN!Kd~`zID)df;Acfr?&!GZ&EXOnN&sJWN zRFUSyXeouLrT~3$1+buQcb4FO_-mmQm@&tr5a8OT`rG$Q=|6`n(9F45r3DSuFpz z)4GWiubXJDOs3JN$N*ABM)kS(?Od;8R+aF3BqjwIg1xgtI?L@ZrFHjc2KnDxKtsYF z%E6E3DKM(mJn~qPzb4xG6P0_jWpZU3RY_PJLSjPdZ8kbBCk#;u*ckq((z>VVG<=_P zm@xv$rG{}8Yn;pnA^;2Sj-RMs4OQy)2f$R6`6r2`C^^TLCoPXiM#QIkfF;R?8C<&qik4=J;Oo&V z2eIrgYZq)lh)#ug1?!c@wZg8B*R!T|uluxOR;F(+Od4#czK@!@5E%(6$pk%5xZD?i z*}K|}djc|MZl4aa6D20yTK7`)CQHR$x9=8=hLWgb__iyW)>|Pa5dv)pU`WPQsd7D& znFT9l8=5!>WA(*A+$cT{p$?lm>5j<$LAU?1TQQHdQN;ODdLgnv*s%4RB#036FhrLC zWBf0nE;MB$HT~!u(Ifzx10n(lj~#P?B1KGQ_oq4)db~ng&88necJ5wWY@0sb*Iw?< z)`}nAd)S$&DZ*Md3VbVwX7rlA`~2h4LUh@(YQJ{-WqLjth)7!P8>{%@3aM6$%53AS zVxi>I6*k3Kp`^>rJ2^7mL`^6 z(W@=Yo@JpzVG1W!=y@uX98Sk`_g=*NIm=^zsfU)pWjanOHF(U#uE6k*X5}jc8m0Jr zcptDCAYgpuixV;(yu}Iyw4L3zp$n8uXc_&po-4b1MvQY6sr zg%FfnZq`ND!#U(@LjAE8my`Jgqm0Eun+5NOHTDv#>s^^cXN^jIkB>JD;Zr(k{ZGE{ z#o0c!5P$$#hvTXIVyjS)p|9Q4LgaFz_0QqzttthtyY6*Fcp>osc59*cL$QAI?+c}Y z60NRhjqXq|)h)C1`9g^E*aTl=+(3O@+%ZHN{-OoQ-kooNojJxWa$WpS|D~ym z3e9bz!+hE&b^KcGv?&c7U zyMxW)Jt&_^4AS>q>tCSr;s1G$B}KMW==7`TU%G+wRMjsQo#{W84{s1df1RX6>0O4( zfhGP$^0(J@wO9zG%$`Cvu80D-<*qUN?et*yvdVYuVMyqejG5GPn6l&NL#0msek6Mg zM7Au)<%$`RfXJ?hgLomXiU`d9FnzjTO}5&s zLxZ(g7xIavaD4}aC4p~faCfr@N%tth{;tBmk&~JJ6{Qc3DJW()s%uf@vbM~B2YhRx zD`AouOwmhL(`3qe`)d$Nz(eaaYNN(zYFVMDPHof2XlceOo?UJBcps^nDMw0YjqZ9A zu-LV|GsP=fP(vXT2ZYBi1pTlPsnv#3tP5CtFXHtmMr^|&2c&4Tm4>yl}C&qUsNPB zKcl0LDCsD@V-#{rPU3uWCR_P(sQT|u>2olQOirB)54mIaZlEg723?5Qhp2p)Woyf^ zbRH*2DUMa#TrsP5`MlkcgN`O^sNZ3utB)a&fXD|=A~`uZmw-Ni zz;3yIz;{cFJ3y63#@t-PRlO|ADhvskR&Ft3@eqMYvqe=WcM1?Ny)Ni2R&e%J<%9i$K1X56Ph4wRY-7YDns4H=55!G(g1eedh3z_Wd7ph~ny7n(|-&Xh-lQ!OPhavU-Gcy7u;q9T=w;`4fMpN-F4s3 zFLCI{7g(I9%wGvbEKLy4$383f`zOZ}5*vT_Y^!*?mB0XX$kwIlRxqOKK(9fY_;1ea{9 zBvVFcwz$bcp#E&+^$=usEb2LTmEkbN;Y#ZIFr>_m&fq-)Q_l*d&#l`8hCP}pOhOs( zf@tfQj!@})WoZ%_CSJ^I&RYIFcGZ+{nLIx+XZe&lZL;U`oVr143+ zv3G~s6aPLehaRD>#{myY2rwa;wE1|$YD|3^AjsX5U_OHomADY3tFGSyF1@l4gmE<` zMZRQXvagfJoJQXozoAK6L(ldgdp*hwL5Kg%omySwivIi>{8J{Lfw)#m&@VXO48xB` zEVz99#k`G7*CfE2$Y!Z*Zu+9j2*O!&dJz9Jfo^Azit~1#VGp6B^N_N3JZCeOEl6;M zWL8JGQa6`tc$oM3=2UyJk5O1kA@I{B*73Yev(MUhlG5PFoiN$OfiQ56$-6|sFoRfY zpa~)vYB8qJjQXY*2~{U#Pdnmn8c?Ze35_Xk0GZ~#j);>!L{MH9#Xdv;^@APynlj@y zVNs{B6z;X0_BVa)pNFE|);**&gOhSDI^Xa=(1^K9%FAt6n+YUi1bw>w)E@^IIr4vO z7l_2^%R?`uU!65=e7PB$sk8j2d;KrLWBQF?^{5Q-!MxsX1wV*kqS0|eQ7)p!N02HZWJaw( zMIsxwP)09LRMpz+%%h$j(VRw!W%d0rdM~Ja=z8qIax@Y}T@1H|xI6yFWgAsOR6pP1 zUpkQ2_R;aaT(`jnWD|n?l0(oA@foAZf77|`mP>w^cHrLpk%H5^ujNS~dGB2s8ru+X z0Yb31HN@9Ld>{&Pgj`!)J=dKczs7bh~n#=9m&4 z?;*gd*EKw$r>PbZ&7Hw$NNAn&+O5R7V;0!AJ`GIx-fu_l94}ODbba_$8njY%W4$+` zV!9`m@SiR>2qN_>vt+k`m((@SM}0qD-gjaJ-ysc_H;BIaxVh|$eSheJkQ*YO!`#i< z5GMIJ>k-~?8Kl%;HS617CE^k}+s$uyo&qn7zockix^kk zji(_8YTj98SLwdO@c2=uYy}uq4A1`RU@iee()jVb-F!R0MWuEp$(Kv@VT1$7YK?bf z-Bp^{!}FxNEL4gCDV-p3?s|?i9(*ePtNgK>$(3rGIQj4B_u2BTkH3t%fwRtXScR?> z;(J)l&>ZJD|0F%MVL-xn2K=--3S9b(Ok33G&V9F@LY7qMNkIXb^4}nb&IDJr66=;b z#X=!l^JSPi_SxfJTABeP@;@yD5yE`Who+T}YsqrI*zBeYWMav_Kw2yoqM*x(#TwJW z=%2X|-2z!@jDUh7FHZBl(PW~uN+af>y9$FgR|u!kt2GOE*O_SA@Q(agt5T!Si*g3dzzfv=j|Hr1R{m6Y>MmtUZ?Y0e(MU~B>flp_?VVvL(&wtjvPjk_RV`}A zuk5ynfVSh43FQ3@Id?&|N{@p1vY;vq4WAl77RRIO`-zs_nHnILJ_UGtmF7GQ+0mR5 zMj;5oa;zl}kSllL?^x-_9gQ-BxgfSGw^A7@HD8t&fHQxvNSXtCJ zFZ=9^q(M)}U?31YSW0F{6xz@K@jF{AU-cTI=3HA!Kd^b^!hi$ zu*o4Lb|dKZ84M%ULESH`hK>4-cGEP8Pl&jP7=(n?#PGZ$e_fRFw@LOr1j;;4<^Nqq zZj|MnhyVZM1i!!yD#~8`s7>2Zyy;w-N(|?z`KL)Y>rV!&Faqs*)pA~C)kOKCWWp(V zK^5^di%33^M6mf~K*>LfEOrGOBfG{}5@*c%Vv_8%(s2=xU@A8ar~6_h&96<<|L4_b zo_{m&dTbo`VzaO}EK$(Ls!SgAYJ*;( zdofGkZe|N!(7NB{^Bm7?8if)L8`$QR@l=Czw>zwMH~)?8X;>UG5R|D4`~u-W9jEf* zFZC-z?|AUDHhrG|8zv9nQ4zGCtK2m5v(ILknJ2l#sJJVFC7&5Pc0s{wT={pc{nPIM zU4J@O7CFsUfkB+)2NN?Hst?z~omV@i=>~Qdx~p6$P<4_dnlgymR?Jw9A&vjvtd{*A zQZ@3h;n02~8XH6i%O9N(>-tu98isPL9`B+<6YuR2!gClCf`@d!$Csl>PDpG>0^70f zN}YNCU*+y^8l7^de6^hBKv;|IerX3VSnX;fGGWs5scdYs^X5jmvG8Tj$YLx3fOwjf zGro?H0>k~g&7__?pOgM(z4S1+vZ!wA%%3BFuM1f&^vNpEOcM}IUjKR={QgVKeR2J7 zZop*QX29cmc|6Hq`!==nl^J$Y=j8_LnbO1@9>`3a^5K6Zd|!;}8vtkl=0a2=Fcpag zZFD3&{$2%!5Lo4a_gkox#(ciogt;0YeO@dZdocN24Mb|=b`R|F;%XM%FLq0X=DQQd z<5dOA`NGcRUjuvp4DJ*^>}Qy=y>G{xA7VB{_*-EZ#2aB~rJ`4}R7JhF1pM%}RmhFea)hj@S@QpjN=Pc%qIP^WS8JuwN2~ zMbC$_C&#(_e?!$7u~rb$+v;P?Htb?F`hakK|E%Dw<6A@>omuVw3M$-~KYXaCu?x!y zY*nvoYd;INeXl)EA}^Nt9xi=8jYv*U7bnRZJ9G^tpn*6;eX4+7CF4suRLRhHlT1UG zOt#pEqqsCnlJ8JaDTD)5wX=bYRtBhCXl=>0PigLw*59)}>mf-iyALH{aH-MOVsBN> z7Q(ZRZZ#@zqQCo?sR|FVy6-GR=Kv}?2mE3^o>GHR)uWPz1_E*ow$u)&j9~GC?K`aC z^y)v$nKesl58A5(r!awRg&N{^QdNO2x`!nrjn$mV>weIWDXtCtIq*#Dmc1r0o2H^1 zR?(G&gP5z&p*xxd-buR#30nV>;aA!wp)0O}bIC+Whe}}l&7x0Qfzv~!3u}fbKxyk; z?~|zmBd})xbtCY1mI5YLDjy1w@SPcabvj88bYUDpJxvUzOK?Y}5(%f<3XBg7DU<N!+2^-;nR> zqm($NdLRTV=*6@Hk_nuh1*?`bhYk zH;lR^!zMJaVf|@hdF39GtpldfPX6EH z0)Ob+-rReBdER?&ybPz4Qhw%KmBYa`zY7ZiW!XZ;o`Mq7RzEexCnc8SK&BeT-|i7K zLn7~D>L$AJE_1aqo*B8J?3Qg#ql|UHCyU*)9r-r7?^d>EC^PN9O6x=oLCs$7UZnB@ zr6SWJ+dKGe5m?6PG93Yl89MY%z_Cc+WI&bzpXi1e`4H#+6G5-=DIw|DV$hNjMFp^Q zaK{vS!6~aiYszyzf^54VO%;Qmrdx3gdxUf9NDhjKLJ*X82y146LvngD#aVUJG2AQCL(EZ)8#{ z+I#&ZkxGe7Ep0n#Cj5|A1FXePgEq#N_6B?JyxFcs!=~lrgGRNL|!J?72{--zA9aS)D><~IB{gqC^vG#M zmqk^2-(%Il6to^#)qH`YZ6IOr$E^>7Te>W^@gh(KLtRI`Ka@u!!K;A;pWnLvW0 z#cfSShQiL(t%HZCo3t~o{n1BJmoaUp+UA{+f;s_Ojt+uIr1=m`?hFHQdoOAfn03AKqN{6V{r?^C@hk%Z)}O2r~!H(^+Whkwjnj<%@@|J_JdmoUc% z4%ustJpCqB@YGpJD^6GD4^}!T_hh75MOn7uZ7Cs1@5crePDamGvh2a~68yO%32zO7 zp|uqg2N_x3z?5hA=vT8;h%Of6Q9hFUw<(nwd2kzd%-c@dGGtWL5!X=|+oWP5&x#w1 zH$A%2DA13fwXV>@CQo>fV>?Ed^>-BhMI$X)lc>DG>-I}!wC(#!xJwX`KOC;@HOfW=Z zVmN;AMZ-G75=|DHyy@S9>6AKra|oYg09TDQK8cC7%BuE5`3G;`)xb+FI7voltt)ty z__{jie{w9~O!vy7;giPtXVNq5Ke3XnNjF^1Q+d+|^V>K$Ok=`qxpera31)dA!K1ZC zDt#3A3jGmurEDjzEWz+o-e%z?6`~8dz#f4rBSc8J8_)%_6OLbJ2{PDN_CNd2*#6h< zA+6x`MEcg7&A}*_iQa<-QSPV-tUE`8l(h9Ea>@(VC1pm zxM{ClQkb{;LWoPy%}&Sb{0oTJ5?O_OZ#AeTNk6jo^k&{%f5murN`*)AwTSCHxfQ{# zQfe@iFLq5SC*6@@06c2ZIX`d>tM|L_xFAKk#8*TaT&x<-l}-Jq1XhaY{{6c$bUXlVsM^e zXoVKJ>)0TaotdRd&RHZe@5qX9*?nW%&}TV>p0Z|lqPwySjWLSoniaB-`vsZ{_pG-S zL0_#T7`Z|<&l@MKPJj>lS9t)IK*W)xeABm-z<3k$~_1>fVa`0zw z{hqC|^6J|N@zOtgc+XftY*dtbU_{*H8d6`85^00iRs=mSE)I$XN6Y;R_4f>Lz5O$0 zaRkaNs)iXC#+)9S!Ug>F`#MJxmF7Q^_w*9leT|AOfZ>&RV05jf4WanR_Z51p%dP}; zp*|JtF!^>lF0yI;o>dd?w4bGC z&bUs%TvhNq3xFZzbd(k79=z%i^GN zXkTHQ`#WcoE?+Pu>I`bi>}_&GVbH12V5^6n=2BPrZ?(o+VD|FDoDZabYNL%nP|zot zN`-=L>_s;qLRkG%+WM;$3WU-VDEEVGWZPi*bH(9M&BW4ShAf%pF#5gT$|8G>6p_$t zM|5eX){!&xA|(+k6qEe${^NIe&i{Iw;rP4ladOr9$NjgU`)hztzag*~x+DH*e6aSV zYv-LE;GBR$O<86oX7eWZXAU1w?|2oSyB%NRAk0jnv;lT+-#4Q@qtqf5eW=85TNsq% zpKxg%fxpM~bG#QyQmoYAMBeTICb^`{3NS`n01Oluu$L@9H9~)&CU$QHga~!B2SC6O zuo)pKV)3G$wtA0I_>{pNvuF?Rr$S7OwR=!x<+^rUZwdz;_7_Q~fcObc zQh4tm8AsVtE%G($+?)s(YS<2zc$GEgF`)%g(Y`8ia@x-J>$gMKc@h|u;e7&Qg;Jm6 zAih+@IIiRTW?p(G)BW#6##1<;l4zNdQPPcUFX2YuRw$R z{{@KiL_Y87%%+J3&_$kN{yeeheMK|ykjAsnkbZAlG6?B-SsC#A?=+Fn6^<%*{0cs@ z+tfS2z#xmw_^J36WfEwrM>pJ)PMck#tw+3b)h5q?T7jutLFW}3L0!KnriEn$8FRGr z>1~pFa9UIWZF>EoWu3tP`Tkc>7yq*P&cLVtPE%mJD0!TgILM#H!uy!+2jhqkNnIoW znQ`eJd+^ip=zx|~yk*U89MCYt{?E(5f^_39`%yc2nSJ2#<8d5auB256x)8mTA9%iY z8}IONm78l0lFGvF=UuU)Wy5hhzkEbuM7TG|VW1kQsk{?)zj8a__n9Xs)mctcc!IKAp%OEZ}Fb$J}wZoay$N;#+q0_8^acH5`SYd zM^+(vVKLu`M_V{UV{)496`FfecqE1ktlv3)tE64os2aOXTzbE!H_w05P*n0F=`hWk zp{k1II`&B8U+Xo zpl39l*9j`7ZEUI z`oJ698H_z$sQn1g$(yrfT+Ktr=6Eu08{NX|tzLQZtcCl_;c4IZN%OwihPDdbH-VRf zuE70}9nD;-(PKZ$vn}{J$E&S=0JK?uz{`7`E!F?&dfYkPp~N=L6u+L}2CyMA-qA*< zFpB?n#2dD@z0W`gFSht+j{i6K2C*kyitz);E4*)Z%Hnq>ClJ3HDG_^p;(l6dw4eRA zqFaxrFD1P`0rHf?3$oc25Ed!I#=p0hqJ>T+IBj>-P%H*C1KC!TkGEqi-@cf1`b}Yx z3IZWg^t^Fy1iPv4=8dVp>&aXdBkqrb;#fAR18_dKe*`p+@-7;M9a}aWkmd5S(~E(a z0Z{LUe?!27gHg2wlm6xTPY{KG%T_9rmbx_0L1N%d3HYv5jUl>&UjP|mhO&abdHbjP z^#yP*|6TtQe|`SD$?v#uHYJTYh^Mg%?oJRxdM~gvWmoACPs|%kt?hGrwrq#!bOoMe zF~%u;FE~zbR}h7XJN+8p7joQ+d6725ur`Bhh_QI;1(=n9OQLVSVGzGZwnvu*&Verj z;YA9A8aUF4;Kkw0#5`HRJMeN%6o^y&_s?fZ6g1R+K?*;`5d_SAglBS}=|xLpQUs*JuehF9ab^dO=!TuFi%r?)f(xB8ISyY4wnpO9$gg%;D2rTKnw*HJA5Nxv>B>J0+iiQt zrQg{sF;U0={AA|L&NIrgD1~ET@%d~~R4Q;vOGTAHkhM$_PwH?K+2(07(lr&cr?S1VXLBTC!Y%if|CP z(6bPdzVg_llF>srKdCK@ZTGM&Sbm=8vbP#Z!H}drpkUb48r8#ej@kUo87D6Hq42wS znaul<>$0*>(TlnWjJfOT7lO#JG+$Ld61e&!o)DS_gZ6>)~5e1z^(-GsW1nK zUAo2m?}{9Czscq9B$@XE3zNPXyT(V_W}}(c`wv1n9K#Zb>U?Rz~NeI|L^!P|FL8h(h1KAb3SPs zh)M}iQhI2C9Efp?NvAneZS`*T%NFck@82`~0FDKu>hi3bs1AU#H#$EaA|M}Pinxd` z#7Zc}Y#*b+`n|237d*^;|J^43-_i<@h|Y(T8jZ8-Uu7OIyE;sHug~97Cy!RB62jIw zl@^GM2M{Uzx9)b;B>2&uM{k-io?ae73SdkmP3HjIq4FZ|0hSX|w!#9TA?JQuA&65= z!T?pD#{RdZdAZ8yJ_8#ZeXG83WQKen>W3#pOd`;;y6jcv=Rb(@^u0GL(__N1b7fr(!jfI=tFn=Ym+p- zKiv%nvVY!$P~pXvP36cU(?1r5#Xv;(wnI@}6!hdAOI#W`7JT~A`Hj4mtrqcxr!0*P+7!Rel*{np!>rBD01mrbhbOpBbDk`X|vC(|o z;_jCOwQ1^DPlC}Haj9T66!Gv$`6NqJ3;53Uj(^L=Ia{><7;R=zikaacJC*Wh&ZRfU zRhRNp5+ma?_jSM)KA8AEDKm;Y`x#UC$%Tj5LMWJd?PW}sC{bzu} zQ+Up4xF1aPhS2Jgy_Gqg^`gk;6Hd6*`d;#Udt>K3RS1nyLE_wT+0y-7%N1Dn1KX@` zIphv0(B~oqG0=NIZ3Gvs@0v}30&zR+uQ3VIYTRN+4+>RB2S-(Hdd;pGyD9tqxy;*ZMt2>^KEUJCE7?a zCgrCNsGmu#I!M>JFmj}lk{SU?1S#W?W2E;K_u=+O^HTYeq;ifd1Q){s{6Nk6jyiM%8>E7xBAl2 zxvBlRpQ^WtMNZn$$q6)SRD%{{tj0sUN}}{XHaGqXC^i9u18sXzl`^UFC=`zb?OT{W ztp8~Nurl2qVO^*+v82$dY#y*$)2vknHR)fhm>sA4A^Mx2S7xSGN zmK5`o0h}~NJGH3at<)mFktn7>oj0%!rqGY3y85pgPX&BuO8YT{Nlm#dEeg5_WS=n+L9@KkTN@V0*ht=~LKZA>5Sq8316|4mbn@YrGb1-o}W zpm+}HO%0P3OcMpv34$NU;XQV;*5ugILnY%(u{pGR>Z*+_+6eALc+Ys!tSZz_RgXog zfa4*MTL9rzer>`CI5}XeV;kbfmJCPyiK#E^#ZQb5EA%z>JEpS|J}M0BQCZqOUu}_p z*5HSuxn1|(Z1gjR4Td_E%B8NX2b+hxuVRc5Y#u{*>s(;-;)+DYKwoU-^lt-3^*l*R zf*(hEgVsGk%)refFnqhi;+h(!inY>~qe?D>xdEC>jO3APba@}>nUkr$S} z+y0u0v-5X)<0TqO-|GRG6yzP(qftxc=?(#Q1^eg6zkjAn5Sir+r5BkqBXz1lmpX-| zm=^|eJ;NN44tlvDMxf^WXbL@r*PVG=1T~9{^N-?EMwuM?pK0`4b4bpXbaZ-(xJm?i zh7+1XUq&MlyGau#_E3D5 z_x4fvBt!1^nWjQw-sbwLnrdT-Xd2PYjL;!5d0Slo^ZRm4ImsaU@k{agimXHaD@+e5 zzboOd+M0YOO9CdL9Q%cnO`L=+q=(p52QU1V^u0;yTbTSc^EkILLLvm#T=s#O zeh{QjdH3@A7I1{;Yecl{CK;4`ZrZlw-$$J3R?<~63z}UQXTrn_aeZ#@S3be zS%^g^Qg#X{`fc=adHYnJbf$!^NEu=Iziq9#ac_jy|hbpAQ&mu492mQX!80v=8 z_701Brix94o)0e+9-$YYD}ftm-taqRB^A6gg=6o@acKgn>h32B3AHfu zL1wJ}tJcx?q}7R4iHM!s8a=!7(G2ykiPbb1`4B@ft!M72f|5MaAxLG=aMw9_f`O4h zSRi8kevhlW1|=7#LpyQC6Zt>hqKxC`pv-*beS+7}3Vn3SEX)Vgic28m9IE`f@C3G$<0Iw6O*f{Qq$+ME7u+^>H>>&6YiKo6pm0W zctAmo9^(SaL0Xwu#8`C%)IK~92-SJYuUtXg^=5XP2_(qFh#|s+ z%wCaYqQZb8Ltc23$mIZTdLJ!=P|wl2YMu~&QT*oX%U?-p^~2pnaWS-?>g{57FJN3b zUHqn|icrFd$YDi$ZHIx3o+E!wxC=>{zjvQQeZeg6Vqpot{^sJuH|aKy)>f%LWsy4e+2~%3OskXWE@Dwni;2S+`SC0i2p%fJo4HUV zq&16KoEGO&1E-nrti&EDXhge&mR`04S_aykI<01{OwPr_LXOv#@(|@wG^wkz^4eBJyEFz35duX6O)#=>u zr@aQ$P+f8%!fz>lu3D(}c%pnGf(mBMI0JCM!eR)x>^OdN>w1s3)F3+!CT9pp)Aue4 znodF%n~f_Yr09c6RZsa)4}N_!De?PB%v)bf$^1iST-WqxRtckSm0Owd5AV?raLHL& zdOZMn=g*D!`a|$Aia7OE{w>d5Xq2*tjgv8;uZn->e?WP!w!+=|RLEA}Ewm8f( zHaNS`c6IPR2x?l7UtO;+AN^U#7w~%(7|__{my)Bn1>wBAWGqE-9W=*m)M z5|Tf=tVGe0;#AhU87ogU7D-0|4M$gSi?W)>Y9t9{HKV(6m~p%~y-Z!$6|GsMqMXJv z*wsu2cVtU>6>2qM#ZGNwdhMFs1ZrvDTwuu9{2BqnF@=MvU8l z!;R2XhvCDLf16FlIkk0yKF47h^u73d)ii`yTmb3t7pfe+d?o_x0vFksOf_DjlRLNC zG`-^57udge*d+^3_niZm9ZH8(o4tAZrf%X02Onumr%v?STG?s#R;kGqzj)gl!n8#H zM~*ac$l4NbuzjEl9g)NTThJ`9yYhU6^=XYB#fYW$b*0}JZRgE_K&6EvYQ^%J`_L7! zj>W5n2H=K-()QI3~ zYd_d^DB|rDC@OAoO&4;~BIIMhmyrOw3!1vUH`;17O%9my5``q6lNHUsD)U#yS;~{Y zP5}kb`_DRH(guJ2{Nt8I_p5}Nbx%(SeJ$8Eb}yQI z{BXHL2aA9P_(oeSv8B$Bi=ZG!P4qvW2=2LRt;1B^Bma#jz;B;saE;8ADYJKKb0KxL zt8uP<;V5;y{tb|BVVRO716;V8_l8_&(V?Upbz?{&tV4teg$3KuX@0=%vOL)AfRD4yWxEfgJ3qWj z%>Acn;d#y|GHkzh4aZNSc>cxxOGK**mFOjhk9|x&jFKe#&1R4I!%>O8GoY_8;Xn2$ zuE@U{e-551bDl2#2RFvP%F0MPtpJI%!R9CNfKn<$0pL$FI*>#=*A@{>RY9aJ$P9vpl!QOl`>5u44Ss z-$BPWeW>h|3LzAs(BBd{DTJfi1em6j7~!HIKncMn6WER8c8mD#CA2d_^Sk|;?d1%c^6@P{S$^cApN zXfbG0J3g%Pb(*#OULQ^%(&86g>3;n!e3aKt%0nm)haUo*2DOQCi=yyo)foYW4jw z#MpIaD!0C==;4?v=X$Md3JG#PdzV;=?E9-yP4e##zegtguU#Sxba!6$I%>aTRHENW z`OXH9YL;^LpWQ_*;N4qArD9B`P5olaFCY7_=D(L2%IN-^;`upJrZ-O>#o1DSv8_d~ znMksi3pME5t_r?(AzV?4veE2v6BpuBP<7E|UHp1ijP8HOLdaCR$A*xSl<66!%pLoV z+SNV%bN_^a{Yrzi`+vlq5*O{BQKaA{66GUS$4yp~rG)uTf)pnGWD1lEuDg)~HS@(R zsydPj`9JH)loh{WNHCTYrLe@<`-S|i$15}Xna%s~-yhRXxp-hp7F{oQZw3RH6_qKm z#t{Jf3*SsP+f_;6=%>WDk2C+3NP(vg#}q}&pQEgjixtn4t<%%3pWH&fz_*dt;B{Cy zT5SnRW7fH#bC|XH2?D6CU%sHV+=0%UeoP=!e^~4yv!J-s#U(4UQOyBi0Z*Mbfik#R z)6PsaxfYPkuK^ifjq52N_8v=}qh->jW)+@MRKD9B<^A6H*#ZFHdTIFqTlF$SUdQGo z+XBiN5?^9or&Kp&0gt1pB8T}owWZ>|qXTp7r#N!i3okt$O~ab<96skGd6Mh@X#qoq z7lT|~ak4FNWKvFC53Bk=EL7r)2&zLiK8_Kct`V^=|L}J9$Pa@^S^E`D<~naScS=Vk zAeMW|efW#*0m)n-I-l(h68G?#iaS~>evPC@Kb2aSvYs+JdMK{NdMhE0`<~dS@)HIJ zAHh0D>L;`#0yg93FSft(dn4W~xoE@IKCBFU@|<~Q7vI;Si3M2Nt+b%yami9F^UVpG8Veg+WNT;4{b^^Ww00==*9 zYL|u)`uusFaAIYcXMh!xSTkMf6rSb)H73- zScH=WiFLeMF4!&u2V!Pe6H+ir6Yxq#qnv*ts4?jjf&LOs zP|8&}rqzFKM`1Xxm-8A5w-)m72pd*?@M@%)44rYPn4PA~x}2rv4@^?u1}TEy8%-q8 z!(k6M$izAoAdGxI;Mqh}9W{bCX_Q;nR#AVik$;~v?8UNLRIVzS$^5F(Z8u7gmWgvQ z;t?YASu(W^#m2@a(gTaXVK3+9LcE>bEXiT6AdAm@Sv)JjT!o;Ya#yL!EB(NxIccdI z%EppAEYjwhMKDV>x-eyKeC5Kt6t4=RdQX{Gb&gPW-o}M+oXbp!hniD#tj4La&-(~l zm8|zhUx6=TaHWu5;k~*Iv8>s`3NuM@QX!wU24!}CZ#{X42I}%2b4p!#wp?nbwC3{K zDBer`DWfYl8T8B;rym+q$IXf(76})L?MXSSa8H<1NvOQiEr}VuOn-ro%u9@X%){Cs z6mbwVdQZ56ib3I}zI<{oHa$wMNmDVTpTMjYhWkzi5f7B6*Fw?7&l)JPnjySN{Yw;H z$#{g2?DX9ucQcd~s@?opxJl@1AQ$52@IK>|eyE+j5q(&_Wfjys=BaGQ#{9H?+P91X zt~)aR^+ARY=xw%X^csrERg*z$KD$8el_Gml(+^3SQtfQ1=4q$+Zz8`rp2cpJ9D%)T1u4zf1O9I0OENwC zCa;gE@N`5!%f&b{uk`H8>xdZK=-%1Hwr%yO{`jyhPg*8UWFM*qE7eY|?3_+3(;R7| zf^ahnJK|jyY7sYmEC}DEYgKBKnW<}ZiC-Ft-HGKV^P&f3^L}j4Pr%-x_E)$G0Z*Dq z@0jJM(Jw1dv6cREYUAq3X^8enRZYswiVyC`N}+Ktb7zG#0x+Wgp~rEppi7HZREycB zGQCT5U!I#-gA=|yyK6~w=fLo!KQ2u0^6cRVfTtn;{A}ldDhLpB`>;NayD+pg9Y`vr zS|!X}ND3|;J!e^JuI)L~wRK6T#D{E!HZ%WpmwhgbVseKnTR3)etQsrx!6YKt;4s*iT+dIu|XCgU{A(tvzd?ai#M#ST2|v}On!ib@c|Xc~5@F3dN;2Cw`(|MNJ}BCc222x3O1_oxJ0sPFwhIGVv>GNbhL zYAvD@CfMMiY)MENSx)8(f+a@A4BoW#eS*yyZ=;9(39Xduqefh@Mg*Kdbm`RJOz|Kw zFQVUt#5{IWyks&5%+>UC@Gg}(dZ!SQJ@l4*7FPm_EhyO!O`~x<3L8*Sh2P<~f~N#i zaNX^p_5pCu0W&sdSfJw{OmnSBd?J`eYwr~-ty&C?v5T9z*3an0cf`)$%i#mVrU)|+ zcj1zggBXcVpk$=^CefHJ>1=%F$o&s$#bSW*B2Q9rBda|Db}K(wXn#cz5_I#Lk# zy5g{agxg{uxv8=6va&RR7L$A`W`LuJHt)TAzr)+M!g>Rb7>o~aw9uqG>1oIIz23X2 ze4Df=W}+#@sAGyWr^&XipwLl6nQz#iaR@;45)%A7#_iZ*flX5F6Ef52!-TrDd)Z9m zbqV^(KmSr0kRL^kqhTo;QV-CS63B$$Joi)?L18#{df;3q?=sXrL1R#oihSa>4~Csc zsF|#WAx-jq_Xtf|l~@{P>xUH~#Ql>+eH~^j11n9FBqyz=KJ@3NC3fJzG%Sr7B`sIs z4+)L*o2`aj*1r@mTO(+g#%jx5)%hwqts?CX6e_;Gzzx&t*WdNrZFr0ph3F~#qLgN0fGtY=OT zH)`~?T-h;BmQ;i6&R?a3vMA&n0qWHHM?Y;f2?1Me1@Bix!Wjs!tN+R*UhqVvUxx_E zoJPkmgH+Kb9espw*9ZL(p&fdZSseh%Ojd?r zXZpc49=@Lo4)E|>dE>fbnXAK}WCkc98v&f}yR;-E;`}npy|Im$l=#HWbEeu24b@AT zl0KA=Q?6MhAwj(4V6Jx(Awl+Q;e(=QBOg{Cu-!LsPG-VB&M`JmjZ7S=S}oksKhZ=v zStYYv{j~^T;!lc^P?e+WHem5i8S6JVL#}*tljGm^Cj`!&JMK*aN_6?xIJAE3d8H>R zZ=!SaAw$wTh)J8~zKf4GVB79go7R7LS6EnNC3StwsF*M{^|v3_t>trC3Kr-Ct%&!l zTsj-fG@(iZU-jxz;qZ{A5O5+z?Z-A2z zLAFSG7(c_VXOtvmi}WcB(@XEZns_{7JeDG{IysogX_XE7%}BJKsfjydB-R>CyF|N~ zS;0)BH~i_G$6YzO4l09A<#%IST+Y>TfCfcWF2`!)ZMHI$x7-j>4Z*@ZTE@skTxH5l zUQK4=Ko&Z~VfDMh{K?OP>&giuiLdOj-xC{ivJJW)6c&0$z=TH*I!o!43A$f5gh4~e zPWUDJWbXYSuyusIkNw7~Dro$;z_X!c)8BHwIt}PD-2%@gpMiE51WacFRwMNvUU`;@ z!d+SwbKjP0jhe2yKK?cYElcM@p6`e~m4*|l3Y>iY=CyzkH0*q}x#`2=%RtJzq4x5? zmt|q+?j`^e0c3gMW-MtG?~mgk?yNhW9}LN~bRcayNfl_t zs%6T;8GMff0yQ{-qhbs+K1#{s4-YG1H3)+a?DBU@if`4z^_gO?9H@QdlbfbyXfEZ` zD5MLXZmbq4`gjOpm5o+hIHvrTEmdmxT^W1iDSKzwForT=FSN+uXyK?QFV)|V_0LyR z(jtyxhYIA%2%lu{lyYccMcKTbF-T)Y$uihr>`X zw@|YwK@;UBz>yG4F~cFBRfWNC-^AlQy)&y;(ZP2)FYy2XC?W6Pp%jK^-!TINpPN1< zB^>B?`px%BM; zlr*BLB-2R5rb%#G`Lay%t@{=E_LnA#`<(y(AfBzYxr6r_aK52R18N^tuIt3eu3_Vn?RhpY z;2{SEjBY9jqI9>-=^_ z!l(u}^DGBE?J`2T2F&&j>ea0RdMaD+66tD?J- zVnI%s(zqIe>o~B$SuN=Y!BUL}fAZ9}VU32&XeOPB6WfHW$2@EQYCI=lj3-y1!B3%Xz zw2T0s`>~Zj2SSekQ9)sexY?&n@APSCm3y*|4{>JySUpnP217!|Y|eHF`{8I}nSE#q zmYf`aI~55h>OOREc=(^no%GO?n15 zrcRL{j=>NJo}gFQ+d}Dgm*WSrWi|YOQKwGX6cbDDDTbjgMex0@&Uxv>O|;^N)mtDd zZpJEKPZSn4m9A4j6m9%|vms^@gG0Q4Q3-=0-EKECeB-j$)2y?dTo^u5N`)347}w4t zvmD=`U!K5Yn7PO7OZ2RHLId0);s6GQus>W6QW+(4$Cfss@+L2;V_SaK%InmQXLQ!8Q2oW28CNBavo%a(Jh!@QHe(F`JHl z*r~Q+4(j!QT+p&Xik9nV$s3kFdCC$99Tq8CO)Rmk{s1glYa6PzZJN#HR}QGb)C!`@ zNQ$FtNik{JnuVR9QbZ@KM$$0n(|#-i z*XqaDPVauC1e>2Z6kKOh|AOHL-w~#xtd%nm9z2g)|9}-ySG5GWOQ-bDT&CEElPuf3 zA8vy&iYa0b-Q6#ppa!_4AV6pYpsX*h!v#JQ^~39K*W#cM`6#vB{Mm1SiI^7>_X^$= zK}=hG0I(4kFyJ3zpe$g_4JB$%+ zu~datuJKMbl11okb<^{IpORA>(Ja#$+4TSW(w#!BY9&?pVq~@lPi@Xb2{+WPhW8nC zK6-gbqsJyK4;Xz-MWf5Hcb4LxvtDVTcQItDo&c|IBByFn7Xt6hpi(4Z%0JX6Fms8dUc&VI$0OQq$C$*9gJU^J~0IM$&U5u!zLvdJeNt zu}U}FN)=W80Yhp*J~G;koOIjOc0UyrMKDd=Cpvcx721RCi|w-) zJavwXUx8Z?`Uzau8x7VhDg&vDrXQPt>K^d;A0j5ut}#ynHN4j!Jl(r;Ma{Oh!0R`_ ziy(x@H>=e+Rc9tda6AJ$jeJ#(^7ZIWhmYfX5McN4LqCBy## zeL$e+^f;<}{N4Ev00H-&{F>DOwmjAQ>jTz{>lpm;dRfW$GAC;>{*J=w)4Y1vQx6 zwh#mYkqDeZNa&r#H@=lw<;Zx;RFiGn#$;=<-S7T9*Yo|it7gts=iGbkz1MoZFZilV zLR<$o(dm)QEO-M6SyMjmN^C zcw}|TKxOjr4$I}R-U2K+oVE*k^%k7J34P9-f#{kl!2Jbe>r76^*f;YOhUH4FYKbVn zcvw6DON)pX|NMY_LBS1a1;FOh#!v9@Xn-nykKYMKuUp3T>pYp2i`{pJ6)*(XRTuF(=jMp?xgZ+87YDY?y5 z=KkN&dQ8TTK-A1ou4pD}F77BDTJ5$LW$HkYJpO#^pf(@JyU!@J7PJqVhEPp7AO;#d zwm6Wv4g5qQIK~)7jJtwx>7}BVQ^lOxmxpSpp2L_(R-GJ{wVN5b8h-@7@MQaI;9s^z z#GOno0X*&CsVNT?nm=0NxVl4#xs3WoY`;gjs22$lG9(asZ`IO6N}BSLZE|M*VzlCx zL9svP72AGY;?gE`L&%WI+-v{JIbj~H_(g#Er^1^^g;38;d5cFBmV|V0@N@|uFwCmIdjKBYX-9M=1uuEbN{iatn|1lmT>OM=nU5J(S(5rZ;wg~%UPk% z71+cxh3!_NuN3KC-UK#SqSn9dgG)oD@VZomljM~if z3_-ahFceM^!>E0z!la1NX`*eS5dt(U2*Q8HuC{k7O2AQTsI+E~GT4Y)@HXP94q4z> zU>vUWwqaOpM8By?Xw>ScRUX4Mw>L{jakF{W;|z*&S4hVf3L3ig%h}zGK*YsowNS&-{K0T-b=0Qft*zas2ww$L8-QGxpd8f1Tcn+j zgmM$+?o|0Dp^_9>@iVHpfghz%TbIG%<3NZUGNJcAMSJa&!OUHCPJ)MK1LL<=#uil} z+mGX!>p~QvmQTY+7*4<2$wW{XA$n23Rj-fjazzkFTdmFF*j1PuJ?89%9i~MmV^m)* zGoA(Zq_9hyFuuiyJ!Z+%z}NVg)f#zp81aSBgjz?o^#_SlSJruPqwTq}Ttn>%ZTy&~_Q>+3e4AB|3et1kYJmC^Y<`HwfDXK88$C*8-JFJnZDlAa z@)eCmTMt_@9b#kn|q&go7f`NS_+n7W>x-A++pE6m`sir*a{tsdP zqD2Fr>YivOJ5_t4-#3L_OB{JpnQi`{VJl&hE7+3KZnF(CvG6BC{2{En<5GuL^MwGg zUuggy=YQ)hm?l3WWrzJ9?U$^lpxNus)36X@deK zDvaD`1ZhlC;})t_nqv3^O;Dq*FABC*;WPBVe;@rxT%cI6P(|zP)L|eTWA8T=ULj$X zfTf1RUNkCDE(^l;`?)ZKQ*y`6&m|KeHIq~}1}f@yt0zrbOh`G(NW^a*{GgLSEP)Jv z2Z1^5pG|8}9MR9urwpMh7>Vl3mgDkLrT2d5`S?KAHKnpL$6(m^$Sszm+f{mq5R3Z|*5M9upaUM?nOz81t#Q-*Tj z)pFc+`>vsyC`;vV$Dt=G>2Pg3w5L=}q&2|DUq_e|Sm_Yb^$dSjqVCOg+(uP^NP573 zZ{*L~E*6huS}j7)t(<|u27cLdI_r1`Lx$5Y?f^q}YVj=sA%Qi;v{bb|X{xD6=&m+Xr;GL7;btYI|Bp~<*-(!AZm8!;Mmv7{&XEB=Qcneca$zgw3JS49!sP%lx@-kC|!mrjlrO}<*)HvNQBx+Ol0$}K%4 zJ$l(be$1(skD;x%@dwKUL}i=2;R;ln3|{7b_MogRHThgW}xs z=82ITH9{FJNZJTn%Ta*bAw%p|~E_>^2hI4C_VU{^N&&U8WUYb91fzzGil zbj8%pIupM5iNlRHq8me*XtZIG*}No&U9zfu--(62`5q6LS+w1EvM$&Vo`E<;S>a{SshVvy|}Tk(J{|G z0XMr7SX&`)+HeZhfbIaumj&6H$5}PG4BKH0Qbq0A(Et}VF2wn2o#ZDh9Ek{;`Q$G) ze&bl-9s>xc{Rk^@2u^f={?!O7v}*7w_cl>3Fgr4W_32Oh@xY6O)S#}WgxEY(Riz~I44(KZSOeMYZ2$o3EB*P{OB_!-H7GCF zUy2)~2abtCFG~vx6`N%{8mngF4w>fN$}aU?6Qn>&N&ngNjmZ02-8McBI2-eVWrAj5-Yp^Y=4}Pq4(n zWr5iJE9@_EMe2UYEwwo zy-tJtTdxr60<~POVTUn`Rvx%ZShC!7tm-MEqUkp0V5h(2DHR>lOms2DM>Ol@QNIS9 zCrf2b&GA-Ne5^z1`ZHEA*a$19^IRpmPy8erK*JUdDf{)Vs|)uU)=vFOdNeCl zX5ehL4SJwGQNaD$J9Hqs`#X(dSP48>fum#*k`re?s0=?>H>5O!fXJmRWHDMjQ`(Ac zqOh(Z!O@zu6mrf?)ukddH%ly5dkxu!7FK|KQ5jhUvURwypKyp;T{#dGgj2A?cwDsd zFFy0_SJ_Gnj4+fQ#U$a=)B3uT92I}0F@i$fEs2l~EDc->ir3rg#^r;$SJu6NXW{nBdFI8o@H;#)^Hr)6I+#omy_0wCx-{BG z^P;d!HxcGZfs1_HRRJ+%x0=AWXdrtnmUfAOtkg(F=NCvZ^N8f+gxDUDM`ICYSYlLB zTkPG&^J$H&!++ZK63O}vIh(C(C+vmDoviDXDU%XA&mdJ)imqp+JQu{u7X+#PikKIl z8hPh5BE-WH6(ym)X-yOhTWhh9yG>1FNR5DS1;h32xq;=ued@zoFKkI_(dOU~R*-c<0x$BdTkC-yWT zT6oOZ7G8z>8oP^zeK{W_Xf{!@ISaAB9nKWo9&m~5wOe0wz zT9JIo3_z0%SagB9Aynj%Lh|roqd3)Sec79Zm-w9f4)yf7UdAg6R)p_5vt=mz*6wV? zUo-*ZX10cYg2^s_)Gx3o9trK}dRz6CY>hqpnbxKY8?=g8?r0m8OevIKRDyX%pzJjd z(I?p`Atm5hOd;zN9dg@-dYO3NW@W_vttoVyDhDoBL!D=Mev_+BIGGS` z|2Qvog*((4YZT%mNVmkrg=vl|indil1wLg+<8VJPKE1}SDXT{5l*mPp94y#(@Y^^N zZ+bX|OX(APqm+h9k(?y$11~ST$8IA6xxjjGR$0Ch65h1SFR(j-_EBdv6=;YuYpS}l zw(nN_i+8jcVEy<))$A=-pQ3Xxf`HeXWY5UCUq|9syC)6)Pf3}XZiOZme~c3i5~g}N5+AvIH{9Mc(p5ONs|rwR}} z{CSnP6U5F+k>dHyT#yrHU|_>h?1e4fBY&jRK0!Nx37``O5o~uUE!2qY@8F+)r(!>^ zsZ?mdPc9?ZqZ=!DC#>MyikEko;-_iqm;abBO zlN7X9aMPBP|9+Tn;hA|(i$k_CD5AT$Xl~%2-kPQsbSy&X0JEyWzB>P|mW$2C0slrP ziwfIWe*KnCpct@2#_k~l=P3_HIE#AQL^{WpC!(mgB>vTWkS82ofhFBq%vQ{c5I3v< zZKHt&rPM6knFN+jEo)tmv7Az@X7r(#C#%SqaJ7U{S3M1Kgw*>FH^34@a>w^he!iK% zV1${dP&OtHeV6Zfb3!8dC*I4+*f@Cn6J7+bgu9QkAWz;Rjzk6=-fAS3lL>>#3iA6K zJ6%^0K~~i&aNld^--O?i|8@D|A2B*0U~Fnd!sws0yS1cxg0kQNe()RDv#KaQAZ}Bw z7KZC~1$h|c6n%Bmdx2c7@7bTjeS^64{<dL%P!LfM$40A8;ea?dEfhpc zqo^%*b21C>lg*#m)bvl>qn5vBCYP=P*$drPxKa;=csRFh?&=t_%93y;%cfPXiC(-y z8oRJ+!eR015!z(YzRJ-+H`(6!N_+LQNSDb|Z&>G12$uu%z}G2k zK-z^|X;`ZOoI~~ti;X?ty=v`BD2e=y=8}Lr59~1_*bKWyrL8*=a5$Hg|J@TG9-y`- zJXIEe{S@IQzm%9$hf@G5z!ftuGu&=WnIL|fSeB51?d-RH#y~*X4LU=f4DZ%a0OnPixT<{Fgkf6R4%BcU5 z#tmCp(bKMCG<1)KPKILDPq>v5%4HWAg|<4f zf0|<9^+j63C<%hw&18w4&OeAi7VRL4vx>4mO%jjid&EpgUFu(aVRtJ^xBg9d@=0?6 zSUh8j?$aR6vhT;C<;vigbU<1a({4l!W@5`tb6{z)gj2L^=h@JPw!g-j&3M0&d+h{! zf^L_!%ylpi;=tFe{lfX+K_}6gzJIgX)X>opSx;t0v1}Ul(%CAkmqw(Jgh7zHI2;4qrEmcWhNh}1C z(77TrHylk3LW4?mQjPQ;f57M{gx~AdtS^vTl*t@IZTV4!0r+GmR+Q*IXlm+sJ8B1J zfX2X>1Ndc`DDQvKB`b}867^5?n&>FKu`U@YGzuYCfkGFIp1QCn3|Q%tO{U2^VDJBC zkK$#+=W*>S)|MYKXs|wI(puG5?;?fcBqmbD?#i02qG)HP*R$urCtt<3f(kw}o+)l4 z+EOe#-!lmT{&2Yep&Xj1J3z;)K4@}%#oV~usHC$;O|!-^Q_^*IE|-f4iP#hA92k2T zXg=bc4K92%V%J;gXzzOe8tNjvqUWHE;xd6=SW3DKTNLi*bd8LB`0@+Ic?FWrSsB#M zbD)ZcZBdT>_D7)zgMrI@%5bF`Z7~%qsQGFJ#tW8>Jy&K24+f(FJV?yJ-{Kn+#y#SC z-Yn86&qcmov>f*Wgi00W4_U5BpTk}=>e-Iig04h_pLBpJi$@<%{a+7}@P3`+GcwTV zYx_e+HLG~MC@xM7t&mMfki9)DljcBDB^Phg^q)+Y;!%-@l;GcN?}O=W#^Fir-sTC# zztMxV=--PziXV)z4b`>Q!F&TVJwxs$9+=0p3BWN&I73?thy&F`dy=h4Hk%-chN~U|uLBX`x?%yx~&^W?0g#-*|3lkhy4lQAjmelp)_(V3?eqp>4n0JXE+&)9l)O zVNx<=Z|JR;jDxo4aX_DJsV0;cy4>eaGSRcSZI#D#xk=CYBO9--#`6x`n!I{wr!PD9 z23PWRS{CZj;lG+iCXJG-+B!F!BC#>Rx1lW(0+b+h5y>Gbm!OC53Sn}!L?w#eFTsv* zZOnsO{0y5a+ zDHY*30!2tuei^-!he+JKf>dfOnaB#?|BF!a5q_18` zN!9wK<#Uc%66ex*q~|GPZXYZydo;J7{WZuLRW0H|T+)QFPl|nL$LH2+W^gJY9c^&% zV^NT9qCh9h<)Fca;!~axHf*^wECG6UoA{0V1R77gkJAL!HvArBnC$~?&b%6Lksm0? zB0w!mPwY7%n=$C~D+DA!A7n|*ypf%iRm<;-xFXJm7X)5p;F(6u+4_C{~sr5<`d4hbVH3Y6lyNhS2igmXUipwlNc2i5@b5q?36sr}$% zROKDcodot9jDK>-<4yEbcGVF7G)ibBT5%3qrWts?je2{#qGgnv6H`GJVqcrWDY~; zh(~QC+MFc7VB=~quljfj5D%mMSy_=s6buzDM;n9qa~9rt)wTrD>vM>0qSLF1iVuGc z^!j~`A1Ys;r-qp@zSrw3l9!}n8?JiH>2x$Vg5=DSz?>Ur6AJA8_8k(aA}+Mf4aDHP zNC}kPw_CgTgu7G-fWiUZWdnwiq($T_s^r$U{xh#!+5y4TzAs!+h%xLCfUPW4+0!37 zwX15)z&sG2PI?Vj)@r9oY7hK|M3oz!byk6zU}AZYH$<~(zqfnYmLX2z<6j(BAvJd zA2J=%ljG-iV?cmD&oYgsOu8Q3GBUvqm!H!(-IYH0o56apnFV?-Zo7a^V$P2;vj;cggq#SeN6?163xuMlXk@sYR=j~HIi2|cPtOg zdxz+0Q)-y&5j;BjcsAgj`WgOL^_Ib5GVN>qa6M&WlP)Y!E$TT!IyCDG z6_@_fOE`Dw&MbZ3C~E^bUfR%QndFPzX}yN*K415M&5d;H0q^0lNWtq*rD*tFQUSj@ zhmmK0_a*r%EKC-i!J6{KuJm`y0_<u)wjRB-xY z(JGk?dKQ+oz%R*1LNKreT60adC^L5C_W@nt4|mYik?2>=n|7rI+?L+#EEn@XsVXx_ zhk_6BEZoVuUTrl+z#wr*>gUEn_S-CXSYF_TJu?AyM4-z+FJXavV;oNC%&T!Oo z{CI}B+7k8BYZGy&eufJd^$9qG0mGEe1)wmJF1WCS6SY1?DkzeBMiBbdLri*n{OxrFMnBFo5B z8H^^_bIx7`f(-t)mK;NYPbc z(2W_0C!wM&IQ`kH?%R}_aK@+FHdeF(dGcHnf)G~046Q%}cnhmPv3gH?q=L9c>^k8= zDFZ}U_iwjBkindrfbsOE6X}ozw4+z+HpjYF38eM9rpVX3s@?#(y%L>)sxqmNXeVKT z4xT5Vj|m_?xHk?+7m4u;6ReZA}sxSixqsd$48%}zFuiyr7urTvG|)qccJk+%u}^_l;4!#ZN=<#?9c#U4I<G;>=m$Rmun3xtu#2R@oj`JfZ^g7 zlvxKuigNRc0G^Y*!}I0NHn>NJCLnU#s@NSgMQ960VIKT!_$0R$p|Ff zV^|#+thwx;ewl2v4B9d@$>@GtC-mgbQpL=#z#T)Ic^vT=8Jx`JE?)Mp59wVTbT#ob zkceIy$TkI(l~l|YF3Y%Tf+k{@1Mz+po(64B*1B`FV<@4MhOk?A##>~MdY6te)ZwQ3 zQfu$!0xJhr$nLt?2E8hcMYBX%?@OA8G=4bbzag0#lnH&T;Z(yg%87<7;MyVh7y*In z|8=l8mHN&#$H(Ce$X7mHs%!_^5-&D<2tC%X0fOTP@C}!1DpDDuU?>XL z$7cZxg+egf;zGTRIvNY$k1A1z!7J%br>} z()8tQ*7TFm&H#p0dc*~Gj_2E#kj+29SgWSy5`g#__lFrTcXK(L04-o)B>tWgZM@f% zW+zl0`?VB6+ndn)jaGNx<)_z^kY%>l;XlU?f8|`k5U3a@$!?C1;wXPVl^#~(zL2}U zp8p4DG;ezO^uOHmAT#rS2KU0EH~>j$+*<)*NX@18R5^d4Z6rQEn!9rYdY=_CxevR9^CjM3zMHi;Wd+2zo?J4o+RS-u*?*6aJ0WY%BX-x8eZ97vD=1 zH#luIJ0g=>9}&`CBb_RH(?aL`jKRZ?X7iFse(?O4!ha z^tuL4i>pa~PHJTG_xNu#iL$aeTumLRSf`FY4j>%-o_b$tvVGxeb!7>s z0z=S{XoK*fDF)%%e(F2Uf)pc>?9G}G52tAH8+v0^}7r(vO9XuqLoJgb=Us+Xir4=47Q9!QkDS1pklq@w>g#gxyDOaCy3 zuSMAbw3PV)AD022KKmmH081TuSFemXM~5u%emDQ)bfNVy!#0>kKR+{zF^1?H_R*># zU_16)3m+6Zh|4bk`WealvD6dz#tEzGklXocN^;KWxvcV;krJ4=?7QLL z-qiy!t8H&6S};mGCApqA2iMHmET@zQ5TGjR99WwB*8 zZsQ3Fe$(f{_)YegN1;W~(C^)lY|oMpM#-T$EtSoG;ud)QUHfsrV3mgK#1V0I%!an* z#e}{@i&@o^3>oK4S$71cE8>13f)z0+kCNNrJyS!Nyt)_^)P(zNd%jKBEvQrH3s*O-K1ElZZqd#EO4EX3? z@wfKFVWLu?SDmIxfx*Yn#m7qaM-}_$hmJTmKVAq01bZSP1VhC!_fRV$?)}tK2 zp<%Pa_wLrx|A7_T|F5e30{Hu5N5w-@i1aP~XVre*at2IQa*2hmyFPBTtTO5}9LFph z4!dP3n46ogto%puc-8y@vdEy%4uEQi*nPzq==1OI(oO&UK^ev;Z{TU zJ^_hxarje;#6MXlV{T9AcIaEM)T9765x|L`GzL_M5&Ob{BQF$HRKPP)48E=WE^F@mz^5q074dwI)qBRmWU(XHiA6scpFE&|53|hN4!BJ~?M>+b{{=howb-A4{rgkiu z;bbB5f`;v@-)?c9R+6jT?cfJ|%F&pQ=PLjCICe+9bG}{mvpimheXg||<~j(pU9NV% z8hWh1k8i!L;+a_dgt4N?XH(+8Sqba~@wu-uOShg6Wd^*4F`#C)Tt2j~HQ2U$&hBP3 z+FS(81a0}D5G?*oLw+j1#Pc;)+{b!$M(4J5ZnD&RY=Hn7GAE%`W4+-7pw*{yaw z_vC|g8?7t3L!fNcapfp`19AlR5JGB^@n@Lj%T?IxRb%|$MuGm-Jsm%zEl?;SA7a=d z5%;>wiAI^L@wDK_0zMgn9Qo1H?6l)*xHlI8kD1drSEXpQDKHdy+nwR_%o%|Atz0MO zl+iEEZTCs*(2o~Z?cv|5`9Q5yszzCz>u{`=f#*s2U)LG9Zypy`$(v~BD_y32w|l9K zI(pUqoscg?3luTfL3Ow`xM6pLkb8OdKz|XfnF8%)Ex#)LJ_|DHJ0$pFo)|BWRpADA zGNenIRa08pq&QbyC;SAsa3LAxfdkq7Urh^w#4@cmH_Ae3f3UEA*5od~&vy@$_0MXc zya!BdW_yMNQVh!xxjn-yR#QH~vuo>x631@SSR(5(@;qMGt_p)fzP?Y?h&s7-q0i?y z&9A!I0P5|o4C%oF44N9B2>eYRO;Y4NPzNm#dbzKlgkVl9HM^537J`A>e{U-$7begq z=5ENZRBJ<36QuD(T*RVtqR0d0xC)k+OH~TvTLDU_rB{@@Q1|iT@$=R2zj%l!3b^1~ zA|d{V;{Y`8An-Js_WGB{C+PS>ktJvW)V_PfXEnT69os&_a%(b zMS812;VS$2KgkEcbfFL+0wHH}0d(3O*hJCZj%|Gs&mm+Kq$v@64S{eziaA%Eo8|Qd zOnv6IV{$ikLBO{MAo{o6DCVJo(IlEZ*fX~?{JT=J_oe`V>^g=tUH*^22exnn+@HV< zXWtO{&^7SQ|Eb=XR6sKB;|Sz|R5%_PF520$jOaUP9xvQB@7Fh*1zJM=r)UHhv>F7| z^au=^-T0?HlF#q;77A|OXhD7AzJ4+8J>q7s!$KdkK&ffAL(o91$frs@g_-5I@~spF zc+L}eLj(0G%gYX5ThR0*ApVgxuv$)Ku}|?p7DMA0K(+Q(lJvq7vYUvw7*UGuFxi(i ztpaV~OyBLBO1{`ijZ^U415eS9tqMD z<&d4VTdS2o_ZmKZG|4VXdpO0DFLnT>CN>h)%`Q*x04ab_ec*iDh)NfB0`U!97hGrU zj#7H<242rtP;As496MPg*{?nCC{Wrw1+lo!1AxK`3MUhtn~o)}JPzi$Ja67;^1jE{ zDT9DZ}_e$UZakQz`p4(jkjsIq<6tmlu1V6f?m^yLSUJnPj zuQUc&DdINTe#kYRF8aG{PCFa$b9+zRO_w0!`H$Qbk9!l<2u*vHs&*dte!TSoW8xjH zu7<>q=n#bA;GK7UQE*Onn+;w&!9M|NRU#0w_Rs2%f3kwmL<0$4^HpjY+F?AZTf>5! zZT($DGe4$Bb_n(F7Q!~3#>~$D3cacn4k=Iv++EX<0ErJrLK1G<&z3_IS%RiLy`VYQ zlE~7by5jMS5*+ZsX5W|E&-`Eh57Yh~#_un~#J)w&^VEP;MsT~pUXttMzJ`2`D${x% zD$htD`UNr+QSd4c66fo8o}Fi$>F#|kbumPv7^8#j!i(&J(6749V_;OI;NT@$t}sQ| zA(bBMPt%+4FXUIX{u^yZ*jX+QCr^fUmqgr~(b`ratZ_n%0V8<^ohVP-S#H;16Or?{@5LS6gP{LCnGpJ2rhaA@p`a9T?_0qa1P`S^aVh z2FsTW8sb^dgheFO%O}heWjw*0MFxYIFos|@OQSF<;{Ac{G4)|kzrSr}>zw_^d?_Fw zdtWFBV7}JW&m{M#kFo=d9gfTr(tp!@K8l|*UT_9Hzmt644VQnc2lNQH!Pi3(IJb(o zF*w0SAdKM{PQX286v?DAYQLS;E3p@DuXp2mpKlcDiV-lzw?l#O<;XBti(O**g23RP zPriv0%}9FB28Az&dw)p7o9(yxZri2dd_gqZhEXo0Y!TC_l5w`p+=&5V*-jkX(rFI} z5RS^#l;UJl7%0{wPM)SP9%G+~2~>^Y)BwgdE>mkga%YWf9p!qX{o1w0YjA_T>lL0} zv`IW*k8)`us9A@cCli-2ek~S(nu4B@! z+y4hpr_ICnb+l}4;AL_g)cM{|`Hoxu$NM3+9DM5Bo1XoEIr!D#7f^=!`VQJ8hD@>W z#qUy3HhgLF@K~h=PRd1VAkB9_i~#lSSgGl9CLb7Le2T?4G#rQVh^HBe#l`r8844K^ zBCQ5!X=v3Vrn|Z(dOpsJ5`(DOU$Q2yB)IuJty~-U-MRUaMnDnA+`9pe?dM$Ld{8AE z5-aeXZ6=9oK}KTr?&ms$S^#p&U2EKrmL-}CYi67G8R3M**Td6p4JfyE z@d@i2lW;QXeNPHFk#&|hPpeZTnJjK{9~r)#i_>7w7hLPNLe#7rS$50GEUMVgzbDru z@jhPHzqJg#?uQ6~2=SKaEcX}d3kc_bl7*E?mpFPYP6_BWFn=GPDT#jEsbEldgxKQ5 zP6JFnqx|JsHA&TqsbrkjZ47s<6kraP97keHrrGtrJ=0`4^<_GC|C~YB4=T1+(TT|% zwbzEP&dL&S#TJZ9Wi*IZ%8)GEoIuP}%>D+;j__*{2t`<|NO@Urk=X+#3-@XUM1mb* zXJI#6{QGar$Nw!55~D2SJeUSvn*FZq61QumB;+_mRn)KUE(G4eMG~; zP6E&hMLf$RL3r;gMg~SElWtb3Nxv2NJkHy!ddWGMTk`ki{&yA-JNLtO`D+??x8erh z6AWP4zrcEA1F_&{{X^>NqBV+%(`Z9%#AqgX8s+NxttQa^4)axCO@1DK3E;JTh&L9S z4H!x>11e46A4k-&wW=M`C)x1?4#Y5a2xe2T%3Ka)SNzhVCwtu&tCCjb@*caK`z2Kv z;Vc%g!DA=30v`Rgg5GNbY70?#N*}fAy9a`5mBv%;*O~|CH2!EJQA4GCTw zoW^sy>MtQhXBU%DJAXt@nOE8Dp z*YKYdsN<^XYqwLcXpv0)0FDu8i^nvKr`IdPk9A#Z)cf}NI^MYW=l5=l)A(YkF$H53 z!^Z7&jKn~Z&i!eB7|CjNz-i43@a7nb#fy<}DjWPk$&-XfS*6oh=l6;%hJv?LFer#3 zcy$SS*?!&dZ<+n?w3_MdKw`{?-q)GW?kPXKS}F6zi_~lND0ey+=x1>YggNxDHyaHM z0_AwU&;cv1Xa5i2g;ls7F||N+UG?3vcc%rFpU3C7P!PdTCCX?E_iSIR*0Ia07qFZY zsSxz)BTgXOvy3p?K=$l3gK!#p!EOYSAdG-u!2u9|UJN;m1JIW&7gD{~WG^?U423WZ z&>u5}R#~gx&1T@&i*{Fo9XV&4hX-134`BvpEoZ7(r5?`!FRw4#IWQtzn-K2Fyhh>_(ERV zFY;_5l!)7@dCG#8gkPgcgbXmzm9G*>#^RKNI8Si=sQ-h5fE2?R#cTmCVqKyqesbe# z<9{c6gIg_I)+UPvfrSv|!HIO&N6emTOV<2rpB9xaz1VN`JK zf-ts@R9yeaF&_v=1ECO~xu#T9iwBAM*8XkMUt`2g9{o7(NBQPT66P?LVm!VM5p&XKOGS1qJ!FgGYTYMy+m@_ph`)@wQ$%kaY#!rGUH0D zHD987*W>R(xK--;s$>+}uc_Aby`4>WA@X@%#b&o(b+_F6oi8o}8tY?W?njYzy~Xwh zswJva|4_^vjd#;->bLknlz~RurQLa62J%94ZEf=`9AFaP$zbC3v^?+6MW=UK5x3m} z3kE8Y z!SPMHt(D61Oin+a#9g-UT>#34$N4M~rk-%3ebG!C5SugzM3Z&Wpd1Syblj!Y^w_)&v-Nnn^C1Wp~Nff~zFuKSaiiran_ajRYMv9UFWqE7iBM)1hV09S<(D9fD#ENch+>+57R{BSfAph0(02o zFdQzLkS<$EugjOWD_Y1b-pf2f9KxzVf zZm$t8z=7HJ&~P?8^&|u$nWQ6>M2_KoG~d3anSE*Ot7KP1^~Ez__&=WBGAgd7i`K>6 zH9!YyTjSMwdP#URI*S7 zZplbkn;N(8%YK-m9SPe`{@N<9m0o&XOF%VUUu8Mo6+*(h)HtIgo+BC>0w>$sO9=A_ zOV)*WO=FS;O|k~X=g>CN^*OoPqPn&6zV7wBqueob+4ZdLe4XwTbIWTweK~Vo$THB{ zGm-rixT#-8iM(uuM>mS*u=P9VgE8FAG-G$|sE}fFs=VdfS9Y;>i`fk_Xn*fb1L+Sy zH}=^75GCu~N^)8aARlbIxY!C1iX15-{@FQ!T8oji*S_E*pT`P>jx6Zv#BF|5RB)F|zIT%%49H?!c01T*mfrT5$m8<6 zTU%~<+1no`^|`5O*yugfl9e^jy03ovLM5Gm$0Ga={4SiW5iW!voHNiLh+sI8fX zTXg8ujlgQiy@u52CYk^1veh|K>TXrtr9 zB4QGovM08~T}k8LVmaZL`;HZ z2?^o;5*W?i* z-y&iLk2=enLa0#1p5^|rkScN!2eCHb)Ptjy+-FWkIiK;NtZf)S*12?#BxXRx1*9$o z8C~SZz(5iTcLhb{u_lE11n9$0ILc`Gi8V)$j>}OyCYv=W2Iyc+zG$|3lD67n(1QrV zrhX4vD5Hg+idP96`Z==VwIW6-6m0%^bKgN{>$)i_s2GB`*&dX`6uBwz-XhQA`SO13 z7!-6Q^7g30cLlqoXDj=+!z=M|tpT`RH~r`d+?Jz5jj@ez!b4sa1g7%IbRIQyLsca^% z?0!naRhiS36?S~O0i>t97C;Mmz?O*~*RelepbiGvv2Ebc$y}6go5n8fu%Co65TEtD zcelC4e*X((!L?ofCK((WWEc(ihJBgx>b{O)s>5>XY0diRck=5$;Z$-uTG;1uh!Duu z6E|&bRY#Tph?S_onMSK;@>&`9TU1khH{q z;{SIi1B4F8K0Q=pm)Rnzuf?q)9i(a~w*jKw zP_8Umiiultv~S?>L+-j+kZ(*X-DeZf)t_`FM_{ghZhD@Uq?Hb`~`*8pSp$ ze+PO!QVH^1w)}4U1v{Jt(BBB$M1P8yA)rhfLvV230P_cOwUlI9XwH zhSkuY{WnD6hnAy1fMUjTFLDvwdW8B4Z=PWQCprDTOD7_SB<6wuSVb}`{PQ2#4lxTO z!Jm6>Yri0K4Xb>3pP09Gi2kr`|4z@U)FULA{hoHt3>ZUE7S*VN{&j8kqdIk7vJiG2 zg*Hs{ca)YM$MdaSBmfU|@{13uw?vMyb&k*P^Pu}@zP#7pC%=RziA4fmLU$7U09hKS z`%SAa(SwGke`Z~Ir|XTA6Q-g7dicL5`yV||Ej`)(gIn7lJ-)c`WP6}7C`p;su%GJa zyqQgP0&Vo$&yU**2Zk4A&jcIU;X2Hp+i%wRa--~Mh|JWXd84nlCkc(I@d&0N5;AC? zyIgO9z_N$G3V-u=V}{o|&RX3rX8OkS^cks9<;CNsMg}mRmsQ>m4l}vJZMJ&zU4I{C zA?R)+|BWwZTidQNW0UOe@ujxot>0-aHC68%tVz zxx1&!_l%(@4>S(=bDkV8NOX6rS|ekh$X(+1^#TUi^}Vk@v%T%TKR=2X+^GN?B&62F z3ReKf*zX~F3sqV7VPoU5FBCVCQ0EH3iN+=fd2YE}Cw{)T&VM^!Ge4*`YO_17{$czw z)zajC$_VLrTI|X7y=lC)U;I+da)8Y;mBn}O)$?#$)7J2ObKLQ-RLeR)Ncnp@fgmZg zvzUhJYW(g$&ZUq~0Gdpn{G2?fcfJ4e_Pr;Q-^+6&FhHlL@v7!}S`NlSm*w}t zT1)3qmhr3STR;4OG};E>b9!nzo)UOJ!3APPBCCH0-G%Smoh?7lbln@@)HSn+5ahI8 zumyDn4zzoOa`>DS%0zG%p3gQUwC#V_K~{0wtr%G7>b|?Elt}kk zb~cUjwdM9~8{#O8b)X0B*bmB;-Kc|*vj#4_GSq)B1>sp743SQ%;VBs+TBSD@BmMgo z>Cxza*N{JM-}g@YNkqMTB3H5~l#~=$HI%84&+o zhF*hyd-H=Vf#LxWBja)M3)NRPpPrC<0|+w-Sh2N+_(}=Z3b$C_p8?4~LT?Y|<+*u* zwXd@>qy(6{+oM_!;@d~^f_lx4mq3zNtILk>-AP-}25`;m@S0j{i&7Cbuz&eYQU`>2 zMsxrvBYA#j1lIL7URS#VLre^ptz2%}tBY0e3IJ(Q`jVS!3HOrT^X1aL%D^oBb1gD0R0H&&>>ia=zA9taC0L$Khr+4v}6-h+UCo z?Iy4bGi4HM?TS-xrSGlH(yfe#e4q|nfTL4;1!YcXeqOUUt+qKEp(>}|+Uv*1e(SlDUgu^> zT@PNdH{EL7&53p9M8p6=R#rY&FlLdKA(X~8hhJ^087bpEq57pHhi2keq3G*X2mpkB z3Ndhck;>rs`-=u)|DSvwKTn)HHUrvAyjvh!Iy&n7@p}I=>`dq~dWD)=zZgE?O8>K+ zC1}6E-1jM3()6l*rTZxqDMPE{cZ{S<2!3D(Iea)BTg?Y9t2lP0)>Lr`(}+VX4(?Iy z7cT25JS|$KEb4IT?2&zz7*iblh@5y5J`_q5K%g_U$11wB#_FP`4O>o06GaPGRat{e z!9p{wY<-SikSgx?+&Vr8GoKXHigNxL@kk>*h%p;euq26V)+t$z93UCH9px+@?u%?qF~JeVCbEvh6~UDs z^d%LPbm#d0i0}@ z^<*62YU}PSa|}x1>)D%>19f}HU@65O$AM+w7~HfSznCYn)&O5)N`*s)KvbF(3grrV z(~|;X|NWr;$1ltIl<;olWAgxpEqASX zO@fh<^iQ%2wUD$Gl2o>aLbNCR4wu_+#aRjfiuW)gBYdUuexov~R3dXvTI5Ifr+W$T zs(3>wc)E_BOKw~K`GuN*pUWP&26iz9Kc=P>^5VnGkWX!w%#gib0A|Ym@;vm%VC-p*fy1)QK;*bm7RGsH)LF%aW>pXC3P%@i0Guuv|%46fubGB zP9o=RTbuj!@Myd7@Nd^Da3Z%aPSvm)>OWx~euuM(cERRS1$);tw?($9Ae#@XWUvF> zL!hO4`nOBw;tCc41IxYBIb&%4s2`U=IRiX9Gub#~hP1nrMHkbOw*8l4ziN{l0iD$S z4gL$UW(RW2@!Wdsnc&;te;KZLmaMIZlcOD7&9xFftHRhdsDLpov&;9Zg7G4SL=F=hzUA=xZ)@b62`xREZx_6Das;JaYGja(sjx8gG)_E{5G4BO~(;l>4ywn-G>BX zYYuBa)wn5Ql=68bZb~vp%zwuRoTe>?ds^pQM{YGuL!o~ZcGx{s`_cUplVRmXFo7E} z1Ulv`*a#n>b6RPYa|Ves71mz8j6y_W&g<@AEBMF0ni!mYP*=z^kM3lt`^?cuAIg`KW_dp~b&F!Z!$1MV{N#5^o zxTZR{o{oV7Eht@L8J^=Y{zuU1{QF%dE05E5n{|HI*@}q&(}u`15bZ7UIEWkc?B$rv zk9uZ4bhURLu<;B(>bmZ+_;%dW46hZV@FytXQKaYUPjh_25Y@_F{_Fkw%UsaMP;3w! zVPU%If`j}wHQ*R+3X4jhj&&v@W8N@bQiE~~`#eS;5x|>0G3G3e0M**EDmrE|XnPBZ z)W)^>WDrnFifFk1665E>3Qf()S_0RxMb#`0v=<~V8n$_^WY{_s4>+q5)}x~jnd$$M z6A901s0ewSZx03C7h*z-hABhszT*E2H8tt}a|`JtaDz}frB;15J?w4l(TAQSgeN!N z*8A&8(DdQ?_xtP9_RxLwJ4^SuQD1_bo^N&>$f@iGd0xNog=PwxOSYNjI-DMsC{X4= zDq28d?vJ#G!hBdiXpCU+o91WHnu<0Ry&~`J*SUlD9g(*lHX54Q4j=(dfR$NgaKG@1 zIEP~bPIW)S&4}XkAQe&ysmaptKbq#>nFA{?~rByKjX%N7rmXie@_UXCpM-TM8-SS=% z*vx)xLG9j|{L-eYdLG)ufo58U1xH}qn~ z@qZ_)YxCV58G!4f_|PX6>qNMVG=4{bb3YUq@I0B}6X!il_x6=gvSs6KaW+)=BUiJd z9(r%Rr2>4|e0fu%i3;4;z}4E8Mu?I0?b-UXYQm<;?{aN5qp(pj=|1=n))Bn#Y0GWq zGUp53ve;9GcqaR{T;pXp9x{#}vYZtpdL7zvF0rFQW5fGHWaVCChK#oHc4;BB*qzJh z2igo)9{Eb@m%Db$=w7E-kMYGgcc&X{b^2etcSvqA>m@y@C@Djp=$WTd3kM=;3O}EE zVX*%wkyj7#7EkZJM3Y`rCA)(DNm$N`?SnjS$bdh-5=u*}obj+cZJ0M~LG;73@51s1 zmhnQY=Sfc*(F^edoY9}X3#@jYGD2Dha|)CLMy4*c!?ZWN#3xupbYh<+S?8?ZqGvug zX&pGBVoEZ!3Y!(k6U>hPVB)+J*J;!Ft+=UbdIRyh%3}KuG|E8fF^DCqLeuI+!4ukV zn|&CHizQ0bWP36zZyf ztB;7VEb__V!8Ta@3McwAMJ}hJL1;Ur_e1|7rHz}b0Vbyc(?Y`PQBXXrS(~fOKv8Bk zt6mbG$?VzMC{q-&12WJ6cT}$6 z<3(Q>LTr0cnAKz+mF`!7!k-Hy3Wa8T;0yG3WC;-I>!fx>sgrC>JC|jvLL(FI{M>R@ zlr|bg_RI71IP?m<6`q2C4x%P?Pu?5_nk|?gIo*M5MsZnJ3H+uN7^HRMq>~#Hv`l!s zCNZn>h@U`CswGaSL>Wo%&a;FZlBRhjdL4i^`dx!oJ~T5%?mFV%`C-;(&t4s>^B#8+ zH7W`1w18bopZ|9A7bWNIUH0+ll%xn&vQ~BdD02dus%_zXGPQG0V@A zs=p!MCf4GpNZJ`Ol1;7fa)~O@z~j%4>7aS|VK#?VawT>ootOK>MPSp(H-2Kv#w3VV z#jP#m!ZxK>_CcoqVLGmiihZ;ld~- z$&Gvyth?_uQ?PJp<&YPw74$ih7&CFv<2R$Zz@~Bp%{P+XdU^QPw9OIoHloZ@?rQp) z{UUqH`u+?xE8W0Tx_bE`Sue_W&XOz52$n8WR<|{v&3eDoPwCo*-qc{38NmoCVAnIw zom8a;*Vr6m+ZCetj!P`cd>Dswh*Ui$5hSP*ojZj(6vxkIIrK606dstA3&J0>!3?G# z7`p9WK-}Xlg0Do{I9$6?I9vMR6KgJJf%-poLU1&UAWjYjK=z=~s#P4J zs*LxBk^+JN#ceW-9vsH+4EqwU@R$P1r{DSX4Mny)qCFIoYli z|A@-0IdiFc9piD(12vhC7I)z+gP}u=1r) zkPAPl>*Kcocot~x9%(PeIOu+V-qgx1F+SdeFEqjWA!@LSpZGHWpyclK3Q|7DiRZ_b zEcd%JK~-_X;jt-Se}i^T7?^?wPeNann7H}`Q1a&N6bx68Ccxe_0_Qafb*N09X9hd6=^L7~Y z04-TyPK}J)`yz+mjWEx-=)e~pp>Gp^^sA^Etr0AY4|;8<+l5`ktdew-_{5!Ks=h{C zYQ6>uDF;AMA`$&XLQ{zjb%C*VA!G<1pd@H*pkAm71pN~Qb_kH=a{Px5Y!@U798h{Y zxDUGhy`SGj#yXwA#dyVG*tJc3qt3i7_>-U=>pj|baKD36>)pla&bZnI=C&v@1`_i2 zrtSl*DAcf85SC0Kf+;+^MCj~kpf+T1?nlqXS85_tzHk$`&{5)wNYtPCgkxmxp0hP% zoJpF+5Y3xTb_68so^r1QkqaIMzFnK7*Mdn28G6K_8K^k7uDcomjBSt zj8?{Px56%#K*80MbTf`<36622cFckx2&vY5W+&2v6j2zvU_m4d!9UJ-{o&zQAQPW- z9s^?bbyD^*_MI;~Vc`DGkJ6ACCbMpXQZZ1kCW%MD$l^>ecYu#vug{y* z-uPP8Mg-|`HMtQ{$;g6GvGgO_ewQy!P=+lFz>mnHhmeo%y&}%3MJ{UE#jb4b4l0e4 zk6jor)WjJXF-SC~rxi|9=HZ|hAj&w4<7rU~?PKA!Zh1JlY4T-vxmRb+^_?JeS4^)U zm42>N$mU1E(DI+nIYCG~k(QJ!7kwC-kVts6I40z?UOoTWXEG##oK{+`UNZmB#n}U0 zFaED+QsB55!^Gs^#WUDTYint`pj8S2KFvj$End@M{yqpZo1?vgWG1U|4A zlhNw(+hPb@)KsWlkIf*1;&L5r3590B!1VEtCLYV5+h2)KdT2^g%VWM4(hp%AB~kpm zTGd-Tt@;x%2akqKskTGl@(Oee0y~MPamFHE^2Ee~F9Bd%5Vg4P z>d|<7hxsA-p_^#!N6tQffk%nE6TZBFYfb?IWK25NVDhrSK@-`)9^T~yJz{!-M)7Xrd615z(A6q-R*cfmKa~Kd5t(Y9X|Nh=Wo3W|zwO9<4z&+7Q4b5MX;S?lOb$v{aGL>6({3R_R7JUj4XrXP-sG7I1PP zr2t}4-DT=Y#xW5*2y<1O2Z0=8VSRJ=q=7#j$oHyqCoe+KP9fAtTtxy%KL?n~@6{Tv zlKi`!k)BnqyJ)shKei+sTVM2OBOFvaxg~mJQ;l@zdH~J`AG{bOl15nEZZ>MA;B#u7 zHpbrk_5-Vijh?2^m_=gU{J0wuv=@o2k{mdkZyhR@k`%C%tp&;|roaL>HKZ$R z70ca#n{cHLq#;PpTAp1={UzdPEau>YgJ$bh^~Kj)Nk9+jGb*1MTE)iO}ivs(^6#3AHR_{=Ub7jK7>Tp@+*ARA1~3a;I5MO zJyCFUK4Lv&9QXqBQmeN*=XbqPd9Sshj zSyo0mM^z||ba|!Q`}aAUh4g`eiF3;Yy80|>ekBw1YRgc%SZD}VC&FkxKx=ADayqG? zQAigMQE^vJy15M15Ci3@1h!$c(qvW{w3wSPEshY&$!Zf@2EL8aB|eziel-ygT% zEs?hDM0l9|>aVQ@Wmbwj{exs#>V2k=SN?}w$Tr|xU9$Ns;v~9>u=G3PF|{Gg8?QtQ z*{0NIIX;q+0NdqTA*8f)3W4}{ejFW;;&R^bIR?S#|LGKO3vzyej0D zU7{AN$Zif=M*Hax>9oC#5%yo5u*hQ7{MkEj=-EV%f-z7sSOHoXb!`JXOtK_vITHr8 zHY*Dny?cU0i`bK%*}&`^C~5^pDHFN~ebNPL4$hXi)yike<$+}6YbHV!-E^P(rWn~b z{}_hfD<^4;ZC-nuR?{TB@=V(G(HOO&12z~?pXNixVVs($<&!_EV|tBhWDNI2@5^xL z{+6?zaP`1&^WSE0RkCUF-;Xh9g?XrvE{tW^^TE|1=@ld_f%@U46vN^?Fp6%wcSHha z7_`?zDI{Ik>f0PN%wG6S@;6KuM-WUURg51SeJEKl9l=SM>WL7@cT=Z6C+?JD%QpHe z|85-HO~l;d{a#J(hl1u-cT=jS(@4^l+&emM#iuUMO^odA5f_?YH)~~KV5DD}s9Bon zsOCc)=lYqya%|LGJ!Fjuck8t!=%qz()BCWp-p9z8o3>X#4I6{_6v^A@dtfNCj~!~k zHdKC#OY9+M&B+JR2JlMd-Nfb}bYILK7zUam1$*j}k4$GkpdQ)`?Nu9$MICsaEZEe9 zNv-Q*{#~cpPpPm?ixf-gb%zqQO<(TVr`)md>%+}36QZY3_W_m>R=>UO2urQD%mwjg z3o-l)Z-1(aT9rsaSOvPOp%aPj>HAu_jRYTVMEJ^udI^^LK|P*zlpjN3d~`L~d%zEC zJQUHoWI0}&nX(ACc*3%TT6bCFS84(cI;u``)W~JW;nh_@+E=K-pn);H9Qqrdjb{R@ z2JS;)S^m=AjHbLO_dPjmmkE^5vVD2e5y=(X!Ce|Jm+k*2=5vPLs^^h=3rvJ+|go2ozC& zF_~WzA(@JA+2veKFzu;fzRq?`IY)ip+)E?2m42ks@D0Q#Ai0+RfYo|ff(Xs zd3LlU-c|bgMy^ynbTwn&oyc7xylF8Zo6+XoAo|Zg#W-3bG$Ty*p?DuBC@PMIz;rAy z5IyFyl=X@m(OJ3^5VQ}N{DS*e;&%(Afgj)Y73U#T%u0zwwDUg+E5>2SwU3vVn9(Eb zY66eQWAG!II2T?h)8;alotStFH8JS6_1eWH%VBs<4h6-LAttk`d_T7Iy1DV}sCv>k z{d_7*5S#ik$(pv@8*a@&De$SHowvka#sXyE_h4!ukqvZdSD?OHQI@yP zpooTnc{=xmS&%Ig%5*^r#@C9_AANFPAqJ^O-+a)d8NMQGWur)@zVwJa_~38TjVBF{B%O9D|g#;${c1nrp=j|x?sd6Q+twH z9DnGuhhB7~Oq{&`p0eoCQv8P&Y;02*v~8#>N0Pj{E?c0c9c^ivOS=72`r5?}MRWwU z^sM-^tH9}#_6?e!SnZAM(yDELZvi<5^PSjgi+Eb_QJgN4E|$#xHy?3cIBNJ=XjepG zys8kIi@wH)jK}l}#NEajaZ;quqMnb89Efpka99MxVng6yQ@kbRlz!HWPfDWv8aD?2 z6rsr__?fw;pY5RPOYe?FESWRzVC?FX)F3qVL=d7eHSQ4fY9oYEb1VLz`{R{`93PG37;19b)Uc#6+ahuev zexO5{i=ogdB-cirQpY&7K&Sm8IkGA;U0i?iT&sv)7i|`E`2!W?onR$IKkhUbz(+}m z;Tmq_A37FgENbwbdOO-65R+8LyyuxpeW7IhuQ<>D>jgw2@!aHs>q)9L^TvaS+Q*?v ziH`}bAVVt?$h&eelyi4-}SKVmua z%IC@7xs2YEvWFjPd9xa%_m@gHX+C9s9h3L6gGx9mJ};^|9B}EF*q@n)vrv;}^(eiCjk#kqeSi5)4y#Dp;=jQsYf|if+_6R_O%o zmg=E#YqWiMqC&PpG{@8XH9)|Xr~WZaL1!iHimGqcpdbU$&Ls0ap%BWb1mT{(Mr&fc zg(?}9-<*{!xx5@hqbFW`9VTOuw5XS1EEpFC9eIpHEt#{j86}m}vIC~G71=fa%2(KP z&rT6I%p<>Q4LZ?#VYkG6)Be|u$Zw*tR7z)l>entU>8^Z8sFELMM>16U-SJygc_iU4GWaAo8_*zTf{qBj=jp z2ijyGM`?XGR8N;|U)Ygo5hngO^pR7^(Bd7nEQo3y@{K4WoV{qnH8KC1yXdLeKxcP6 z4Az|wUJhq3d{t>H1vX4&{GfYczb>ImrQY{`UF;H+pS?tzA6v!ZVa@P_>e2}sXI=0y z?Mfv?GPY;9emhA@Y9?|L7Aj*rTY|37S`9H|;DVcw-)ox;lXpc%pmkkmo|(PjTx{CB zgY-ke;8x#CRVjrT46u!zTMb^aAYE$CVlzB+q9Trs70s*c9kz(_z8LmF?zAm<=&0EWh zgF4~Oyk{n|wr_uhjVG#1#FB#xys$}e>6CaRizf88;2$FBM)pcZ>Zdsn;+Yo%Oufib ztMfO048w%Vn8J_r620*#1PKG;Yr#X0-v_A?G<#hR^M~N)1*G&%5hq=O9Tx*KcQ&Qd zNB4s#b!SeLc3mx8=U{CxJpWRQ=5j~TX%6tO@SETW{q|3fEqiaIESrHKLZdE2uh|nR zsDCOKr0knjRt3YE=N0cbQSr1^6XEF_?#tK(>zCU0QCRTEd$NX@7svZnpueE>CM6S; zRG*1gpj#Pe90qPC#8UCG?SWqScv=4aY1ly!O$#Au|Dc0@5%vBv9ihbntQr4{1REO> zy^~e();M9zz|v8ml~o-J;hh}g`*b9JgD}ZRn}x`{Fv%g2Hh-%_nY>m+24*VK3qh5$ zMsz@dtWhwE|2Ic99G+kL0z&#ZIH5Nmrr*P`{dp5$*J-47?5}{O!t3Thv@ds+1E*^t zK}&hX>_CyYNVtJOwrl+^s%4q5)m%uudoIxN97!hyc_u!lsG%oY`4T4dh$FwNFz*F$ z`)(EBI3=$#Emv4y2d!vFrtcHzd_+{a5r<<;6%n-sgO7r1=>E_);w+3{=ncp^b7RHr zV}UsaJ(7qYUdJn@Fj$RX=jOlp)Jl)4km?lfj#diW!B*oFH$kHjx1>}k;5uoWV)>#g z$qZjdASX{SqO1igcON0>LM~@ge$k4=Q&DE&J$d{&DCj4s##idUAWc&IIB~^0Y1p7D9UGALD>~*uG;}MeJPzaI-bhmYal(a4<3!C+ z>E~)uZg~}!q09a+)zT621Ca*c{bK-8Z-JQDzANDV5%(>DHN!T6m2?B`f*;O@lU|Cz z7zIZp^8$vcIaL_w-?_j}=GygVdyHdHRz7h>OL$pfuuW!C)!|kOM49n}xHWT_w<1TD z5SV(Wh+>-C?lH_b3TxqKcY2>Vz4+~B$4``fYBU)eE4WSzc6{nPn>#!ui~D!NOsqog zg)i-+SwKAvBL|HY=^N-SEn-EpSkhYCj268?-+F6eq>wJp2O;gl76cd5_hr2pBt#$9 z(7OrQfjS$JJ5wQF3imD{%mZQ65WAo9Y|d+0#fM*yekiDsop&O~1mE^J6p_vX;BexZb+jnrhjUf)HDj z8GFDObtT8PPZAa@c53kKmON3~nIXgh{5diNqBSP8R8Mo6i&gFB%dLtz&AP2EkgsPD4ZY>`bm*0S!D;Hq_!X1`wyd!l>7T;!9$HZ2PNWC3R zK&ZnsyVFUFsskH)wvOJX(9Q{7oelxEq0>bzh9lohn%GN0_H1*3E@O?v-B6*8htRbL zVVpC8g{rR-PG%D}PnipBV_PdHk5B%h!k*%7wDe8N@ps>ev3}D;D`k`?TT&Q#!T^MS z^rs8xjOSzesQLtx8?CQ12+}*!4m8T7Rrps}XFT>6u#?DEn)sz3ufW5F%DgmTIZ;gx zJwK|0ITVjzMZTlcDALxXyR*}T32V=#^4MUMqRl@mpLK3ZF-@5f z$7*wfw-QUROWo(-X{F-h#{prm^GL&X1g5;QaS>}J69>yVYtL34Gznl@JlDJuV%1}J z&qg*CxUZYXm-0fjp?q6cw^EY#v4ibID~}xV1Fx~LQw{#E)ex0{mM|dhv@p^yn*Apw z2@;rLYa0|R)*oDT;WIp=6a{C~D7V#RiEA z1|?_-#6dU=eb{-$!HBQzG_3}#R{f%*0X4pMzw;L{wz}M~cAgmSQM{iKuHf`)?^8j$ zjGETHNQDB1uv%SHUmTq>;eAnpAYj6c-r*FhRND~xqqidBL!?K=7*$?_CV}H`dWtIP zPzgly<`3x39`#|fKPSi#x`E2G&P;xU$&=LknivY2f&_jmYFEvS1-`VJ6t#%AV7Vf` zL>t)-whD92IliS7`&4e6g|?;;!!RAj=&ms=5*s@T@5Y`jB$=@GPLd!0m@BT6(xpe6 zAL6Do{!g21(6kt~H4`p<*o`k5!(^geRmwiZ`FCS>8Dj_uCz@8P)G>;abjB*$U;|2v zE2yNpX6&M{8sgsHH%_c>rQ6{GlDD%>2t#xR1gY!0+Yr@KuSo z8d8h;)E{*fO6GeX6%qNWiIkhv!gh$ILkEy%*nP+T#!sNlUmSYXn4*<|tnoEM*UZX8 z9ZH+ny2N?OKaGzbBb8HgeHJ^y8J3rHd?;G4h_4SJA#I)y)7VNN=@p0NBX6vwwdPx) zYNV#56c=Bv)`CB6O&K#pr~i>iKPrT}vsquUxngVj*GUYtrjF`S7-9t%+GVe>DM5j6 zE6b#0WqGvrtwyKMz}^AQaXq4$?V6{NUyyAATdxm2T3ys6p* zL)`1C5`Eiv62exkcx1ZAGh-OtS>j4+V3$Rmh$}GBZHry38if!Xm zIlb!% zYlAQ?9_+IN=_s1lc#3MmP29+?vAO8=wF}Bhb%d%p)S}-N>TLG);&miFNrqUpA9V^%8A)1yw)FE2^(*c^Wb)-NL2j|UYf3=}3QtV&lCV!O~w^x!>% zH2)a*6)+CD6eJdKKQ2SA3dI&tZ%y5Im_HENJbl805_NS$~b-%66i0R@GH^_&fP|Z>} z;S;RL8%o4n!Z%FeZ&I;q^22Gil_{QBM!zm zHgqxxQa6z!2qn!Y!--48JHw;GS@9}mR~#%zVoLyRGj=FVb5y4Gn@|b4n0$%#f)jlv zYLZ#OHe+ic3 zBY6AALEG{^TdH6z^bw2#zKmLxCq;>TsQLRFfVT?z&#B%O<*C;0bsh+KZh+weF$D!w zP4uxf01f~$K08cY>_d%Z9^e3{Uc^he1MoJ!XDvD2BFFx^| z7Xo6=Xe71_R>iy{yu^x*;qe;mP0*IWjwaaA7vR@hco71-n$EiZ%irht;nEQBD**nV z?`P{2|6AXpFlUqLysl8^je5)HShl+y?qAbtGMP>qu5qr=$ntI=#oFL@+&E`38aj=D zQH3_s@awO>c@01EfZIE7OxoF{bm?^P~0;XClgx{>FA;%eSKTF7(gHODHgWOWlCMV?8KnF;6H8 z6y*P%REYflu3s^Q_Z_K3WOPs$U?#dwrXc}{$QviiEU(X*KT=cgGuK{iOxm{gi#R!s zjBnBy_Tow-_MTkZD=Ew?y(H-qkr@2TPOMp}<*I;oY{yS}AM))(34$w9SL@KO%R{_nXnvQ!%A93B6sf6 zgiXH4DCZid zGD1T_opT!8Fe(851we(@8}5AyY+XymGKtt!7hWgR!p{>|ghm$>V7RxVd=UX($f1t0 z-z`AO_uniKb32%5!Yh*o%(CW#J-dAKUzF>{=nd}KvlXY?%POW+?5I_3hQIX_l$5g% zFeW*YcS89tHl?;4rZ7{Zt=Weaj`5*4CAA!?eH%%_|J!7zrI1JpYc&}f{l5>b#P>WQ z#Hq}NqgffRAA0K@?`n>627V>ln0SPE<*=F?69trwaWjY0{Y?u(9FRxqUVLjKR|}8g zpY40#gu$+w{2kH4OH~BI;JBoJx;q3RX-Fgd7*=Z1b_7&~@~)sN6N@vBCX6a|Y2+CW zNf7cL`Yza=1ls+rmzyh~rjAD`S02GIg9z26aEUxSD!7oG_ybGB@RQ*psMO~yL z$?W{;_LEM{2mdt}EbRY2vo(ia5Vd0hwlfYp_s>{S7*j8Vr3ZPOeJ-0tU^wo=#-VjZ zI4JDFJ`SM0!gPu5ni91Q{)6!oYA5^JJgPH)bd)Xvn0CtTOZ2 zqZ?)d)nsv)6Z3-DRx4voL?6r{FAVSRIA{Us-<5C?T+^vbSl|38o+At6_Y0<5nVCxY zWmlp9mGIZUQ_X^)q@$pu+%lHSK>Uci!5C1VjkRDH>#5HBil_~BlD^sM)AaohY$i1t z@g)#dpM2J0vCa^{NzC9kc}qd9Haq&=wOJ=-tu&*#j_*(U-Jbz=ZV`ZLZPI7#u-<-K zpBP}a@wcnz>6VRf-R1enI%oDr&^rMBy?Ka0mHGwnr4J$V!fpPKSHLcWDwZhp23Y+B zU*0ecIIV6n=<@uuSX^WWtXZooRhxh(V{-#*f)v zU4AD^zW_$J>EIMnWTh$&B4H(T{1y+V+T+&~KKgjH<=|cAUOTV$;A2rg4H8wDKecj6 zDW0_k%Wk_Pt(-LfZF)tS6lWS;(g|y~+c687T&oFffrw@PT+)M|oSoeW+Rce!mXA{c z*e8ONxlT~Epg6`x%>Iev7l1KV#qp&p$T?u7iwa}thQ%;a#wpPOyHI^ru_*{~q^=cn z7@8mf)&PVEH50;!!v&ue|BWeW1&N=gFp}LuFG63=u+9Y~{Fhz)4I7sk5lXc^ZxX3d z-)2SD=JvNaeM0qKwi^AUZ|nwZ!hNO9p`^{5{+8{YPrkK@cr>;_A?c>&%ji_L!VRh z2EhGP!THW&C}4H6^v7O1c0(c(1K$!ujTr7F-zo!w> ziQv6znB$Fh@r&~Z zD6>e`5zv+{$C%<0e(7MiAL!u>y0lZhkBg^!==OH6wH2FpXUKsdZF9hlJ5$OUqu4g9D8r|n-GOIC zkm1B?JTML0ff|wE|35TcWmHt*)*iZtkP?Ox1f;tg=?>}c?vQR!gaM>M>2B!`0qO4U zZlv=&-g`fOxR!rd%$fJ>z29d)kzy(b9+%W9&X1C@DXV5ds(m|fr3}qUXCU=42o`Fw z=Rk^2-VPM9GY5DBv@L>CCj^=`6eL&2G`YzYxDsm4#_4WO*PelM@SWr9;Bku}rfOS_ zh24T!z7nlAi|a(;*SC#;E_>)dE!$?=iZ|{u4;a5@78fIHb#=wx_kRJL_TBr}Dc%_a z9CWG{f8+u{A)gAEU;>8w^h-A@{bO8+Iop63y?~STq{v!H;J&BV(a)CY?KBFDQD-0; zQ{#E--_h5_x%TSKUOd2*BV5_4hRez*oivS8=x=`qTw|L6jhdVaF@^VxMs8@7nRBt~ z)OLq-`Q)@DBMX~viSzjx#*h{z1(%I=yQ3k{=>Ip$Hcd>{>;8^D`ogm)L8N=leq{5C;*f7y$ z;2W6c+ENSL_d)7|ArkB*fgthJlPLJpBf?r8acViB@4s|7Sny4LA7_yJq?p4y80rFI zk)w@p??r{5fD|8CgE>NXLFQSavg32*fx=TkxC-haCjEi~;Br?1+ksEp;?|9L6Z+o{ zwu5W>r-qXLDJu+x@2wBne~IOj@O$_Il^XlKR1E3K68g$H&a%6#22`T++vjXi9U-fP%9qiKdsvNJTTr<4l2+?xzOL;wqZawN>lu0M+H{T zP+bLAf_uwo{uD22eiKH32i$AfxBhE`HtBT4x!>J&5rzVmYGc?YjtY9Upvns@%=~!4 z67L;$c(Ud_5;l3r_pqn=X!|CT_Smq#tZ>UQYsz3^$<5^1nNhWiT;4>-D~^;3HV2#k zoye=YR;!j6#^t#o3u}cVPuK+^uZ7{F+sYK=?#E0UDcFx+{v8r~$HGuXSww{p-e!w$ zqRZ6r$yMs_TV$MAecn|Gw5z;RXgpP0-l|7UN}Vm+sgu<^Su(Br8^%ZCXm$JN?mU|K>!Q#uBWn)WA5Lpyn0cTZQ_VpbAH`4*(Nwh1=cs-5vG^DkG`Lh;n1 z0ILA_nKFI6+-WORggNoj@eED)tv)=VQi z?PnTRHxp)V);Tw^naTug&bL#)-AMLat2Ag7nRs}&G46no)rZSsA};jQ0?F0LG_uyvQ~e*E{QVMH$Gi@4}amQ`b%Vm=R^Nt z1mpUI0(FGA4rX;O&S-=_TMNBi;&&}ey4JtSKe=Gofit0$~f{V04k*r^J35q|d{F1Hp9WFZ?V)R2J^;gMe zECw{E)qAjbf}VU&TeD1L@u&U!BG}<(6NwK-TBxU1;HEEg&3IX`d?I|hw!+bY;PFbe zQ$M~uc+N67a;j=Lk<=cB`D`oQE|u_iU1_NtUYCGKPtWtDZU86oy^^4L6872ZT)D32 z4exyV5{`}5b+Kgi>>x$AmBE%EqXtcS?|2=**pe|?H@yxd?dY}(bDwJ(D($Nr15>Oc{F_bQBCo0?(LdQ*kW)106 zIbx;n>tcn%vGwt!Y=P3+QGShX^K@40A?!2qPTs+Q*IV=uYNt@IL_>eXR0Vw0nAAV` zq+E<%P+PPcKBZpK9KJ16@Wuybs(ZE-qdWVzM24**`j}d2UHHGxQ=+*u`-NN7l>30aU z?*fw|+L)*zLsX>`6qwl%BtnTd8>1sUk;{iXU^u$IF897ltLaC$Qa%JwBCs{oAFqHQ z;WF8pAlDFSeW@Ll9NIIz4Bx(cQ(^w$4{W0tuMHmB4o)$jyGdQM^81>Vh~27Tov*vn z+f(}4ZgBk^Nd0*sdGB!hlr=?=_LGuL`P>l9*gsW^ucqN<4J$$xt<9lgbEs``!1b|a z)Vo{T@iUw{ELrdJsut&^DktZ}Of0qvpqYo*}jmpez^VAC}yNxDWEA)9?#QoF;!WJQ}#G9^zvAgWvJ z#vFq03ljA4cb=3<7I>ijWWMD(c1^@r3z(`Ylhk)Sl#p{i%-opz-@iO&-etb>KGFyW z(UHqZP9VGfD+lsUS;0IkW7+4tZ#Q+UCe=|QrIPo!Vz+47SfJf>dNV56@2tVoOeGrt zO1q{APb*6VLAu@Hk>@RWpz0GP#OrYuQP43aqRprZ+XBt(DUrG29f=TgN~HC?*~dnT z{j^!Z+<(ci2*as1qq|3W6_2*947RrigT#)^4yUq#4FW`{zLYVLW@N*l7S=^6aM*1e z7{K8{t+0HcePAN@&;d=sNN^AGr3Aw?e$;(`iPoMAzW}4P7t!`dKE2_UJ{$L8tZ-#A zD~+ee=;r;*^NkMvHtZ1@hXTW-{E23J6UJvseJ1VjMHZq#j$ahPCw`}A;!%4JnnZfeBViu_xIv3^}y|G=>rLzxv5Wh>PU$Fzr)^` zA#Zqlebpx?Q(-tFm(NxI76~|8`l|kP%U1x%to#|JF4KAzJ+;%*n@QNlJx&%O2s%QP zq#fT2Wy=s#vLEya^2f@i*EG^ukQ7I21hjYG#F%PZJMaaDA@sUdzX;GxK)l;NQk%G# zaL$!WN@~QFY19ie7wV&OP1Di9qwjU{dN?cdf1G0{vwj~zTtH-iIAf+NOJ*PqN()B0W6+edo8lvOWdbej3XZS;oqv z0Ud$J`5xu?p%s!av~TO;3|$3_Fv@zpbGcfJG32NzNi`N>#sXd+^?k0>oDT9gZ+qmJ z{dSsQVxERAf8aH=T@IG`oO<2<^z=ALGq`BJwf**I9!O<@GkjbuX*t7JQZ!ZK zJD3l+Pfp4Zbo70FRC@YN@O_4sTi^TONy*n_eIsHo2Y6>bG=3kU*FaC=|Jkvy z|I^D#%VX&h#a}oif1gp_;PHh9(>}7bmzy}(z4nKBQy(rzp+o(%wEHehq011m)~8Om zBOv?bBJ*imq2nQuw&qUG5C>lLs6S51z-=PWbrc&X>2-&BOwaGSLLuFw^~F0AoARS0 zWWM3-VC|XdUek#2IB(pubt1iP4LJ3xl0b?1Oq`v3VmHzIxNsL2)!IfJ3 zC0@;&hbYK>KW0Fq`;P2H^pasfoBRIwRQt>IEH)+T&h1&p(cetN7Bdt8<-2;Hd<9_< zNfI!cq$;;2`%fV`l)Mlb5bz-8bcxq#765<5_50i!vX;!iIK6kbb-An5}ccIpgG3N?nrRAf(TuP=F>Q1_!yVP?&y=lIMY zzN=np0e9kECd+`IS6ZiEi|5%w{YjLgU+Ha?@z|PE_jki509q|QYxntAyiQ*q1IoK2 znA;9Z_=TPi{`%k4OtoJ`^9%n?<^EQHlGPl|d(rcYCX>O13~+TzdU=@p*L_HzCt_~S zR(vk%=57dC){E&Y^$P7zhVSc>4a141ez}hjWv3Y718wDShQNSl>-jA6Ip(zyNcf>- zYPMP~E{tTu47hD6%iq~Ns$6SxFQp~d!s|j3yc+>Rh;BR1RvRj_R34&81zldAk{vqy zw$PY=T=g=8(^%2)eG&ny{`nJq@yV~OV z?0o@u0xw$Ub~d#aE&Sr#Fgx4QaUQk@1lgq~>wQ0JKdfkhA99@_dl{eo#qWvgAeUsv zb;41YzC*e8?=Gn5v`q>yNsZiKxifVe$@(ZXjo#0?8KG7oI`R+=I%g5hWrW3AA#2!7 zp@tLYH`+DnN8KOurqzL{`iwX700Mhe({rRd2(XZXkw_DAs-7B}wn1O}-u>*J_%YO; zK5|-i0M_hYQbkgDNQ8^GxTpjfM6sp?Lo4bEsQKm*)J%veoK_;I5mG%>aN$nG@*)S- zyfk7D7{!>z2i^M5?0z9IWVwBqg%31;i$?31k>uv!=*K*CxZF^POz+Ts zoL2K`a6}?dURk`6+|gsf6+{Ft*P4V$YkTeeoLc*vL0YFz<9&5xiA_tG3d2cV~?G9fdh$S=q z{!w49i-fUQZG&eGogA7p!3I3T<}W**-Wzkvr`{AOxc=LN zGn(qHv~`~jUJr-zyCsDn9qr&P za)TQd^VATEK0+qy%3b9Iq*9^pyREUgg(kLdC(#{PF^W#4-%p_)MN+dIMZ(SS<-3Ec zIeOuXbKWVGSS+T@>Cazn!zDb<_P<))1VO9Y>H{xLteEB88s+9JRto{QEU z9p_?QoL|IUw{WumarWL(`ToFb*DKH>v;=fD9HdODz`FxocKLY?d-$zBkZ>8C)c)*-5Ic-9a zArKk}BzPAVg53ubsXrXmp=_@}wQvI|e;!_oKJrDRHzsX{IXTWd*+|%SBXEWajFv}2lsw(tv&lW-k4}9j0Teuu>^~61G%R&(+1`GBw zmHZt)@20}}+}4B1+HI$(Eg97skburo)BgG#6i-vBQ)@NA9PmN);4#|r|FM9FXp$D| zUeuuoi6_?6X*DEL=N=WH8)j4o+@8*n`d!sl`jtz)z6c_rvvkvHEc@2noe>8-nO>}E z+O8%1N-_0-ZDcVSgmS&>p*Nd(#GRmV}DIb{1WwEXDdCJ zUS}2)1^8a){aKlZBSjaKcY($vnuG{EXhyVud_Bsl0A}fPf;?r!@K9|6u910JcX;^a z&BzX2h5#6MS5)X0bSqKLAG7TXpBw#YFI!R4j1Cm|=NQ)yzF?!ox)@tE*9CFj8oa~2 zh?(`ZCZmvUByJ{a5LXPZL4KD7Hw~^;4iU^W};);PuusU;}Mx_4(AV#e=cskZxn(+iz2RCg0kJg*T^M+25Hz zXMEds7NUaoH$GdsGH@$U6%vu%1TX=w{2?OFkaac;1_;t;U8Dh1UO*(7CyD_TYnyjW~_ z9+u&e02|rDjkL0|nFLb0gg*bvRLYi2fFaWo%7LbVul*xQTK#qLFt`O<;4ABzp9pJe zF}xBY#e8g*%q|6cT!Y_2wNS-~D1t}()nq(SLZcl0YdrDussj3;y?Yt_hdJLuJLtgL za}|D29+QQDr@nsI(F2X8NLY#2i!GWT&VQ0-O1Xt@_108!seigE-U|7_H?jE6mSKzu zP)?`c{))j6x|CLNxnu47@@;oEk-jg}Yq!WW22atyVYRL0W}l+<$ieR+3K&2u+Pv+3 zZx%@5fRfOK@cbwGi1V}4s%$cozBeXW1_Pt9elxO%NIx!yg7+3Ncco69?TOCDo|3?$ zU6H*ttI6n(>zp@|(T9`(ESRs`@Ur!%4oVnw$aUDbwK$)eY=E=svo?{7q?ktaf|1H) zzr{X={M&p`ca1I&Mb6ba$Dv_X!#M74qOFc|0bgAtg~e`Hes+@0>~Q)SK(?2wjPIh} zimewRpw$DQ`__ymf*Om<>9SP&Z5vEH^-tg!llXTbsI6T{gGdup| z%Wq7^yRALGH*9x5RBZDo+kV?#ry`wXC9q#}EX;8JAs8mo9Ahw88!RirBB~+5 zZyZL_Y8c;-tdevj2Q4+hwe8PQHJNVBCGtav>UbZkPnRiUmLu(Q-D^n-GgaTjUCB=% zvky_(Q&e#0BupUA(o$Y?bM_AvsN>O1+d)6*S_ZbjCPifTue4b*!*>~(zav7ei4m8H zRwjoxj5h|1vAe@#64a_0xyT_O&0wSg-i4*?Q6luES9}xPw^JdmZk?-WvbamNY^Lh0 zF?>FR;?YCzH!yd4FfavJr2Q~o``4cJ*Z%Pi3||o5m2@8h{-}@N41f5ZHZcl%m+4lU z0XN^hr)?U0;xfQG<0Hi6^GT9!c>DeDZO$w47L#qfFl)D&q8#R)t?@E@=e=zZ{F0QCe4gOGzGH zB!viMRWQ=$ymKQjhWTj|>Ltlq%P4_z^GEKiT69hV_4~|FrKC*nrED?Au3=Y=g2hMs z1Q9vgqZ80Jq-Y~5N?^d(&Vs`@54F zv4vb3^+@6gjKQ+Z6|lUH@KjSu+VKqThtUl;7lhP?9mulII*>s}R2d5HhOf?A1l>28>5VdPK&l3qHEiHhqas9qe(z8<2Om>bk(zKGWyz z{QTQu@&&g^s7WWv;8)I1@7?d1es$1kIN6rP$F(ww0wx`mYJIYVu;sYo#2TI(dBcY9 zpQ>@`6FzZ9m~=^Zx$R3t23KooyEw4qAQ|)?TCwB{@-FP-*CeN;PJL30*{7Wzuo78d z?b&m+46N>z)Uw=xa(fkUa@WNOD0H zHeQa;T07cV#XlVG(PIy&mi63?u93`>Bp zzRtrj1$xV4ZWRd74!3zAv(9ETirpKYj{K-Z^w~>AP|3p#TT-EeCEGta27YuijsP{n zHsv=5BHsu_Ls6zZABM5AfLFyS9q~`{1x&n2NGu{CI^-j)7f0dl_ZqW-+!JTlaK%@GfYH+uT-y*UWVS zXFQu0z+lKNr0IAQ4n$->6b}>4#%aSO2-!$r27GKG<;xMsLi<=tkn(_OvqklahPR2? zl<0!PM~YyJ6tsRX$z|j6FgEiFDV9s(M943PD`mE!Y+`vVR`~;Y{jg6{Z{YQB7{JC> zh#G#Y2#w??O(xrPSJG&Ebx|Xia!J(X;x5@&0MU@?2$-y!V@k+!55xbKoH?1;zSHje zd#R)Cz#5IML{c`N6qlZN*4{C?&a|KC{^aw}|E z?&IMxuV}XBLN-;K?uN#toWWv@FVp`D<;NZh%w8EIQb@#sf$F;ppN6#F9dy$3ZKM9_ zYZKh=Nx&{HO(kuse|XcSx!~(`xg>s|a9?&>Rv{6~MrHHj^bi?bqCJj=zB2-G)#$3Y(%YK-i&@?I>zjHO5v_3U2@F|g)6OT z;%XS2Iu#rUT|QTq=(MCwF&*2#?FS%G3h@dV`oS!R&7KN3;=GR=s4jI~Apc8JlBbX2 zK9Z1y{jDOrh#y2M&ip}oz*O%o6fW{KDb0MF+}j1BXaBp3$vT)=5_A)_XH35JC;4gF%wv!=C$Lwd-Jqsqy5?SU{evLQrDDk%cN5QtHC@ z{&2E|CvMv8p3Q`xCMBRBF}Bdn1^*$Yg@TKsrZk7E8i9?%T_D{&AC8;OO7K4)HmA*a zwFQ0d7p=@%AFr2)8tBI^PpyyhMS}ovA2L)#8WDykXZ-ME?<&PM2MeyNo39_k)d|us zj@auQ7*;e$wx`a2-6vl$*j3ie3uu$K#(l6jLv1bawg0fN^3KlNd{`HyAN(vTm<_2V zj^$~>9m(c7{7xsp@9fr~C#Y-%uJEi#u%=_2(c}xY6)xw90JgjR&6#y@Q(d2~qhxZ^ zqVN-JotzLo1JlnyNITinU*V-dTHS=vIR1XCdV*qU2!9k9;W=1?^o(N0wVSQx#gP?)DVE_g%PoRpSnE!{W}k} zvSOVRge&&N^_0k!k%Z%M67V;xE({BIf>?(O4#Ti_oNu<4oAUI*Q1^B10I*KVsB@lD zQBenyVubJq;{pOMF$ar^^a9n4fm&toqN;LoskA{GgHkp+2)CvvNDkuHa+|?Z4|*YX z#qGd~&=WMG9_ixTkam=|uofR+T*=wj)G|DR!~{ZRQ@|x~?$vNCe)$IUq8=j1Ya0q) zxMdM{1Snvf3^zn(dKO%rZ}~eM*ippV$dOZULm!yBYVF=_hS-fHBpxagR8CM++hMAl z*U%S1Eo=78`zuQfYL5b8fasyH|JL%|KkenZx`qw%WP8ATI&` zUiSaT0({FOca7+#D4wq{_XDF2&Rxhj3gF77Vc1i_6?Dal{dqqtLzs5KC7 zEli@gb!ipepD@bIx!H9Fg+>iHDDK+t83_#&2L<1Mw4T|h7+d=;Nq%S@})O2IjaTcFM#xTJ2?!;MYHvX4A;be8Tg1fiy58IJ3Y#Z z8`s>AHx4t|`qzzSkd-8V0E**_ByDK%OCBfmvY(192OcSR0ZD2vLYfJt{D3c?li+ZV zbG&{1fin!BtiA!k{oxaKHO$Tp76w=OGL>W~`|+=VLOSi{xyB2A&C1=!oBw^}n$6DD zHhv)3Y47eL>iqr<%i!OJm7^yAPR^iZhS8wL6=M5==2!@lqX;CzSOcJr;aZp)gTJ~G zoLkXwGkR6%DIzKB^N7>Wh!{fQ5{xI+y!hm^xvFd5@MiS(@6i3>5fjpiLf!$HXhQX< z19haXx0@CSe*E}R2kF407kZ2-`E!0OFzM%boh2}`v77;SHEK*ZWjr_;nXUXoDklEj zL8l$_w=`Fi=xC$-esIQZLV>Up{lE2K1f4dDFu@LOrvc^wvK z#8cPR*2A9srRfy-!x6O6{!1Ng$jkts(NWpD6O#0a&e-__qz$wm?U^VRJg*Yoap;3^ z(PQt7In8XLOfi49)X%_6p}g_R_8`t<4j+eoHe2}5l@s;Qa+fx8R>8SVmOlI5n` zFyV#l+hTc-{hvy+-EvuFQt!^Q-tiE^hgzJ|rO_fOL_8pHQ4#?*uigq-%CD!{#aQEC z_ngc!rBF)EMvn8QC84vF(D@FZ+X5-F=$7dJv}q1v@bszjEQYUCvgwr<;y#ao|YOGF~3&?{C}Y=w=*!qHp_Q8%V-_i&V%4 z_vET)+F%ps%VL0clv}5o#dxve%}cK@ZuEX_%D94PP^HuMXAhq{KV462S%A0uGzcH~ zH0;B)Vfj8YMZO)-JEcFTytdJku;=KyJ?>Zk_?xe>O;%{6(E{?Fs&LacLObRSHPP$h z_Q`4u0UyP&cu%&V&P9ZaTwn;nJ&JAz7DmZ1posw!3*k8JbE|NFc@sYKwoFBO)A*sW zB^FC7u6g*g`?@|}u=9Fny}6txgW)QlzwaC%!UBwZ^L;%3dkXf+kJsvK*Xr&6Nw!`l z<=Utft$y<1HPcqYEkVMsguaHop=$Su>)ICX)%D1yj;~3{NH=30m#BYEG+1K4uYBS& z93bbmucBaIa9Tq)?dq0SfSBjX-s2WnX|Nm!Cj|ZQ{=-l<{+Pj5RbMM5Cx@9Zn`(zN zCr8lMdoh79DKEE-p`>TcA;;Rs%bu$D?Vzbi{yN2&4W%?FZ8i|ogl>s5!ggv#AUY3l zv0O2-hsVaNt-%v$mS7C$$oo33gu&6bV%mrr6=nd>z}{DyGbxaRjZl``3eUmcwQ<~1 z(ujUeOrvB(^Vo%^(aWOj7b-)I3^qWhgh^B(7SPM5&gJ?IpFEviKG8 zeg{1{xo`PeKGlRT(GPI^m6T6_E!MU&3e*TE8%3Ne>#w9eXjSjg zU{*L1`I!wFCr_iy^|pHk_3sQUQVjmusZAsj!zt%LirwS?cOlChdD5 z+y#@y9BK&^_IZhSOcCG9AlO2n1LAahzB800%^r`wflampYEXd|+m1h(GpwSIGL_4MAiR#Q*zNpb>l5lIo%M0>EQiGRPCt_!F`KgEkU0?C4#w zE2wPAf%KW@5Z_>uLBvf_6b!MYnukbd%>AzB-zg6TQ}JY3^Mb#xubX9zz<{O=Vfp(+eH2uABep)aoin@SBR=zh z5z`jG2#5Hv3jElj-RSOzAW_y#7o>gPs`__huaDz?biuP7M_uQLFpmsQ+y$n45T8o4 z>+G6uQz+R;c1*DWsEXI_1|@dx>;aB1OQ;}3#iiU&x~Ti}0ge9=0*e;%ej2v)-{xSn z7g=OI&u91BHBUfH<3pqPC0O=$!-K_YF|B)mSP;u4g%>N8q>^ z4|ecT`~DHjbBttq?d?NcXl)xd6$<&UX`|JW!Ka1 zuPt`!xN1o1EwIyoGbRF2Vs09W4kD}Rlz>C}@PL%rgfdhN<6wArteQhE+XOd$f}QV~ z2qjs)?5AAT*O49BsE7pHl*(y@@;8(CW!*nDmA*|PsOrBTYElOs;WtTBP~CTItjnzt zO;%uO%P`UBxe?$_wPO|17VJt(yr~HqP$wE+S6y+t5+f8B6w`Yb6KR(&&01MdNZ%57S9WlE(i3tY}>=^W3uzn@S6?N*az=CF9dG`xj)_$WCRFJYM;~j^=o%;GIvr{K*LUQc(qU(t8J?T-h)c|%sB@>DMc^b` zpIuJY2%<2`kR7_WgOxefE2f_~_X^~D3?z&;Cj09;)pL5v6#xem?Si(Aq(ciA>sDm; zUw!Fmdztq?UZjOJzeY2do8}N|PENv6qD#4aQe$r_@XQIc2}nynM3gm9kaPHzkk5#n z4R=2$SSNhPuya4pddXj%C46^b#)0~)>2F0s9FfFB*nUus@}<)$pC!A}&tr^Yaa;+k z=O*6Lsfa(V@@Zyn*m-U6{cp>)(5pG#>uM^~7vt>=vX~Vj&SZv53eaT83Se1|Y`=bI z53&s4k)n>1OAGxyz1UHa5iBs#;J5|@hX|~HY=N}B7$^|F3FI<6-hIJluGId!C;WN< zHL>3*tfmIO7rj)rCyR9eTaOb+E(J)j zd&Pwr^+sK=akOde4~J_VPnSbL!2#+~D(~ME0cSvU@P=AZU}sxRGUjdk5Rk?=VCdMQ z0EC+|w;Y>}!U!Q#tcf0GVyM3+#zOdTf5?wG;LL>C@i1ki;LJYRZ6*fbxR=D1=qoyr z*l2~o5ThArdZ?T#w=w|VsyY%rPS1pB=S-}c_5wM$JZEZM$E#{zT3R{2hBCZ$e$HH5 zzI4ZR*PBt#2WC{%Z>e(IWqgas?y!(l0hrI#6=Jr?Ti!im*0kLtIj}FNk1#{ww)HF_ zNGV$y(nGz*;s@5$oHTWDVL8qP?VZg2zXTG*@zMm)K4e4W6T=mh3PN4x85pDL5X-5u zA^WBnrIZPjBQwp#8U=(!tvIw35LsFzTw&K=(xgb``s6xQ5r+AfZz%U+7o3@7AM&r! z123{hQZz-RW(zHR@o{em-_K~6>!xa`4kbV@G0dhf@vRm{D+)Ttu`ma;&c9uXhrlS1(onL)q>72G6V*g~N>z2ZgYk`!e8Rias2ZjA=fezVfL_+V>TS z>0q($2s7Z^PsJsmd^;GS@8{>uuiwt}eSr`f|GRFofgM9&(|G1R*U|?iX)zy467P?; zCR5D~J;$LG;fnLc3lqhorcSmjXyraH-5Z?yjP#oJLg$86H*wIg6bLrA1n?8Ej#Hm| zn5OrNXe$YK`UXbzcZIY~0a0o98Oz&kJzpL$n$0TXtxfPoHEm{QNZ8XPFSy(I4}o(L zTN9wo!B0-%R|wDZOi0fMsBWD}rA`EZ`5GW4R7dP`o*y>j+(Y%Vij%CjDEZ?|8}1ak z1)7xaOfCgs`3te5vk5*;k1nQrk!!rktNSueRlqP7_hL0F5Koj)HhYxEW-9?W^MJ|;eU~)N`}>LGJu(Y#Ad4H z&lx~0Ldz4FsQdp|z!cyjkiGEWZcoT#waz{!G_|<+Fe%4;vfRX;%&dAEu;YA3X$VGc@L5_4o862yMzY^m>0gI z3z@;&BXRG#g5f67ltXzJ@_9*q*8F2AtiGzF3crgJWPMjQWsH6>0j+C=YKA?*MvE8x ziA#OR8MpdqH3shKrbPNuj28^@twjB?1xna*O0jO*VmFZk|K6|+<5-sO^;8&Em3h-M z8O$N02GdEI5Ry?#(c%J18CEO^E{lS>JdXis$_^5z?RhFQQNy{-S$A=6? zG{$211H=gaOLSIK6w24EGywEy_}=nAcvSMxbT;ZcR_pIFd=SwIv8aGtCkw&LeM%q& zFNMX~q`?jj3MdS(52mCz;vgPptNQ%}UpJ+GJ8T1!Ld@OSl#=jI$Y{DSK*m_{I`vt5 zZ0E;caqh(ve#>UopP&2^V#K#@B#~Nd9{7n)*v&gAWUl{A7>|7Kvb2CJMP}Z67JVXz z$p%iAeoCVp&I<-8dO?JZz{sV-tJTM-ZhVd4Ob)eu&(}C)`nI`S(acmTkLS0_G%72g zGnDX(@%U?)XIAk|f(QJugf9M=ZRWcE8bs-kebViWJL$^<9mWT-NcJe~IJLMQ)#>H4 z#QQL5!T=lgJsy!E^5w_nU$-bbAhh>1ZxhptSoq0fm;rKsV3P^LFTqc^i(hxE_?J-T zaDnwf6$%8MGm2D%pYAb0UtX#LGU`@@f?pj1^m-|u{#_heh54*uNA1rG>C$vvquypC zZsyAG0j@(w(?LPU^2=PuYRl&f;HCKPdt`RD+Sah*v6Lg>c?@XMfXG(M3@?10iG4IpYhn5#522ms`?!KkS~ z5cRr+7k(`%GrMWKI8v2rlTO)|u*j2kFRn+psNxcTIe!%(M^ zOpVl?mH@5$53~!z>|R2H(5;4;4yUjJ9I$`}K-8)0(4@^m0(9$l7XXbVz{Q60z82L6o)QN* zF{5d$tq>eJ(<7D-V4zkDN#NrbhCN~A$;sK&Glz)JwMz$i8kyjxRBncbt zE)dT5D-a|#0Sf@Ejgnvb(Doi^^dj0NEf4ZZh{|W9xseJVX{B`QS4u5ENZ?hOAjqeM z6x-XB;17h|^Kla>x(237xrI$ivjA6}+0hSI%FVRQa9Evg+lAgT1(ZjUULyG!>R~P` z5ap5-_hAcijz)3&rhWX>OJp4L;FEaYfv(QSs7SieglJb7O|3c2{uTPy7H zt@?-n)u;29&Zs7=d$$+ud_(tf<)Y>xCjfu7_LO$9`gsKPi(oUL%k{5zpt4l zEZL#M#KSL+yTCxrJfp2TxSw_;xj{|OwxcemIWK5TF8bDi^{v3kH9P(=Z=jcKHQA@% zU%wAK>*zpmGpbcYG%-^v`qe+d@4iiGQ+?leoUc)aJ6L2{b|_pbGZ{44zn>cs1)>an z^DMH9-Ik4ac@HZs)R5YSzAgxA3e`R*-|J@1<%z2aw_z#%3+{7IEZ8|3UGC#(ohsSP=8en5c|eOO?z z$tBUq6+xJm^c!^Jp-{$d!7h#lkT8$1y(vb2J^Q0|37M>73V0-rw5?7-q~A!?t=?6S z5jIVd&X8d)!9iC@paUt9o)4Z!B*fZC3G1exr#O? z8?^vVpdu*{N}vOk&OKnaWuq)j78l|l4>E0e1{$4t6<}!)LF#X{y6mMt9W6}hJAo_- zMV1iy9cR31bE;jx-5b_w;x?`DmKD z=gr#r2;-F7NsBps9Ur%2j?m9g`|3LYX0c?xrInx}?$*QvcEa%cZh7HqF2(r8pE2IR zz$5j^z*Ls_OAvJoNz$pTJtDz6JE;+485x;z0e?In{tIUHopW7z2u*rWUJ^CnM{ZB` zSs?d~(q8m7kDh_@?kk7`ND7-`nye8Q5U1AUU?UoJrX>oDOM<}9e{+S9kA1h{1zY*j zBHc|u8V5icX}S6uWuOH(kb=Cch?58sXhMzY4^ojooM8dneunzc)Iz%%(z+Po;*XjS zw$-d@8NkA~h4O6)A}f*08`{OpX(vt_%vq5QYM#R{bAi;T3!TJ~(~_UR=2)RG183g~ zQH#v@U~d7j4%)CGp{|bC0|Pja%Re6VI%64Byc>Oy9uYVd_89BC{4N}|WmKTGY$FGW zU}AsO4O==Ja_%Prf)S`$hgbQcc06upfbb&|=G#>-++zq*g0V+}-EAaZ5uoXAdIKU- zbOkv>;cDqeVDeMJlJr)%7Em28FXrkHbreRM5ftXu)(NzEb^mDZWN^!114pp)`7;oqwdlp;B0q2U)jl&M{YR@ zB`jt1<3;qU4~#g&--oI;MRGw9db(``pt;%E7}0w?AW!G+V})0>fMwJy2jjptko)l< z48@CY#)*OZOn)?Qtc`@bpac=)r}iT=%i08LBfhHDi)Ov#jtbbtwnpSq4J&I+=n*V& zO1#pJw39mKtPvkvS)p8T0Tm}`u*WuK90mHP&o;1krt)){vpAR&up~6&PW$}>c;3hu zFV6k{4v4rHG?$|bM%nsH-DZ!w7!=O+<6`C(=rFpWjeg%aju$Lq2|f&(cyS6G_%4yL z+D=m_o~}D-U|^#OcA9{Qsx3}MG?ZxtJy?OQ0O#BJJ+Ape_{Fq68o9r3GI_trU|4m4 zxW^g7@-)1HBzkn+#pNE&lgtGppQN3pqpu`UF(PaQj%K<(bl9~d#uBlq2Ip>E5P?n_ za1qkT&ET?lHJsF?>_y_WaDgWr6nvvE2rae$Y1e%Xukbbak2A!fn6R&_=(j=-@P!A2 z@PNa;L&C|BOU5vbP}perMP0n%eEoyBtoUd7da$hI5fqFvHmc_ao$rq2H?}q+($OPl zfN~?&PjX&Q!iO;eljJ~A^Og?DcAS5*kgfnun!U^G8r(K%Q3pZzKbp=uEXu8G<1^Hd zBdNp;-65jXkV7{Df^;J(9a17)N;d-1T_Pa}($d`^C7og*Na(lmyx;lrc&^LmJhPv@ z*IxH;-S;k+!=)yz^^BrRXh;J=HuM-Z7aq$fAeLF3HP^pn44TD}Zf~N9c54+KJqV2+ zMy~O4X#HCjaob;nTjvSI8h~))tKZ0GY@N36u`j_H|w#B&r30AE@jQ@JucEKbs6RcsfUf2Q*HqE3@h~32=q6hKxRh^ zww)Z;y5|=ergV6%I_Xhv&y!Y7D_Fb@?c!bIaiOHv+j7C(;e|3w5u@>j^|_c-L~*kR z3;Nw9%d&qK8#=KfY+B{3@T^B_NM{bWT_ZJU)||^65I584nK;!pkF19(TRl&Fg^RV? ziuQaGHrU-#tnqZ|;(aFg5fN1c+}n??)PXjc%cPI$lNyt|1se286f7|W(sFr-_*+E= zbN#8h1vZ)u8^AfwbDf(NEbPk{ZJo=x=#ztHE9_yllQu5QVdd_B-(E!Da$T zKJ~8Kv2fhdO;B`Ew0$9hNj+v8I7e8f5Og&Sf{<`1ZC(&}u9u}8VN7K)&_E*a8%V6J z|7|0?R=G&sxD9*5riOKO9%K)+(0L&M0V@lffeDs_z5LZ6_UC}bnTUO`t`BuY^2H_T z2$H+$Y#T)M1yHjY8c_qpvhMth$uf5i_?pD+Vl!iMF5{$uCpNm?QkJYI3gQX#2z>U8 zgNM`|lh-I&XQ>Ci7;^}D@ez|O%oKKYP!I;!3@(tlQGAk>>%YIYJl!2HH6v1j?kn%f zxM&mCO+c17FCjw=(vIl(qJ%~8CGIBU;(rNj`Fi4neIjV|urHatG;SleiiNI>2p0RA zmceUtO;~K1=F?~AR<3p7TnT47k*tk-o9PrMHE z5ZH9)MmXGHlD`N=UWXpdwRz7wqIrNBr>?Qc14O~eWp!XPkPe59Kv&W*a1B?J`#d1x z3H(H5v6Hda)hA}{^dSv9YTAk%qq(mC-wW`8czYETu5~_i@gPrQXgZc`bfHYPn0y3!aelupusT>BeLjw$f75BtCHt42$d0Ao!}b8uuusZDWbO)-B*ykM~Iuw z&nzOQC8Jf4Ws^yU2%v89zYGzx!p!Wut`W4yq(5e+2G#Wm+Fg_IJ*`27PKO~8Ka(2* zkYC$bGk_Etnt@G;(8bDp{pf~(g+wq2)@7#u!IslxP>(9(1bxAhTY?kC8#5)X#K5B$rrWMqiF zHr!0yKgbpBS2$Sl)Q}O7u0)L0=Tf64?{oQs8tuK@S*4R}LZ%5ZnGLO_`S%3~pPOw7 zBgTp;nw%VRAGsmk4{fdwqmhV+AB~Tx`hrGo6ZAog=RlCy+Sen@Wrmn7;h**_X%#MC zmxZnekOcLR+qPmOLGy5tm+K3dzER5gDD+o6u+e-ayLW11O%@o)@kE9f?u{3&EMtiC zW@So)WMN(S*GJ@RSbr_cs@3_&wgpribSFOy%|6vRo@nsaH$680TcRq=j7`Y6sMNd^l$$04-^30!^EjKOT%tI_x`}dclSV<_ zX6t^iz)tRL@II_B+26`f0}Rmtwr+{SP|UF6Zigm4nhqVq@*;9Eo|g*}BJ zhNp4(UweW_Cm{;nOGS^nZsDUTJE24y!nUUB)n9HSP_f0^!rqvG-#+=%f^XI+YAqM? zYzy+)Yh@ICX0Q=W7ae8{JNUf;e7e6zc_@hT1Ee=P$u%^aWS@jDEb><;s!T&qol$|O z!I3^TNJMD)6tPfEQ1&P=S)Uk@omQK>CRu);+B^WI#_kEhwyN&%$4W zvU^GATKmKAl}4E;(5IOntzvsxhyvrF;6*-V5Ho-lx@qFLcpuB*pUZ`CPdll?AfAFK zdn#&;zBQi_7#&f1nlkMSJbJ9hH#R*yyyef9c0Ms>F_cJ9-Kl_d^?{;cs=wTm&3<3( zu%Jy6i+=f7MMt1<$WF&yyy2y(31KQ2K*7Ta*s@8EN&42m;RfuwAmT5>QrSIJOp|~8 z2>RtY6y|mkKlal5B3}x)Kx8`WrP;i;Gf>wg+JmA+p}BW6yM4TvSq;57p+$xrvk$Dp zJ3a2T>Y3muX-614#I`y?e7qn63my1lc=DZY1~-q6Hq$~TM-(7@!uC|LBAj_CcV&&_ zgNegLEeml%xwxC6h!HV$?OG<7^jb7I-x+Vt4_9`kpBZ)QSTJubDsOrEPH6GN;LV8{ zt_|T}1Vx49o2^S%gxy~87O+8UknA&$xZZkjreB>8hSIVXI@jlQTYlTRcF;8Q!9pMY zp?~vvg)KKu)Ty-X1%#-kqxx-X#qAX%(fi0cM#Nx_X%E(q@``=vPrelMcYKO8`=iqy zSPJPnoYY%e<)sQT_-aG8=oIjzFo#@4P*rEYaT@;TwU(lB=Q z^|k8_@JHu&bs5ANdoLK5R8?YmxNnuDRj}XRBJ6r=HTj|(e=ATXVtXxM$sH1azxyPY zPZcI(uRY)a32@VoSAXv-F;B=`b(>yF2iHg`mC#hCeov3DlVp+Tc7276sZ7}5Yxb=@ zqzHJ&9xs@1;e#i2J)+v7GQo?s>JM(JQIXp)D5#(dkIT(=gwsEW%+tQo8SBxgYz9nw zrM58%F4$_7@9LW0zTbcHG)0VQj_z0W+EJ|$Ho0U{Mp@_`>di?*vpwjm4ZziQ7>$go zyQ6KH|!{h2cluCM#)c?B?;e7T@$Lj?=rl zVJ*(^y~6PjD}xq==Zgdv$S(*!0rR?3Rq{dqePZ=Y(s*#&jw!WlESSczZP_C5%K1`k zp~JZ?EGG85(5PTTIPhmc9tbw}$m|9?0q?H}=~wz@_^@%$_Roe69`p(OCP(oqpJ-|N`z|pM$quB9ugnDq|061rk87t%~q}(q{n*V$S z?XOZR?nl!o3#uyuA{LR4SY0s`C3by3iFwIOwM`)VPn+?B3s7nK=qZsa386O{3IC4Z z$XbxLA&h|sj|4_CBA1c|5SM2m4P<@LaVPbFz=#?`O0xkCeb5Z}75F2Gag>59SMTd8 z-eV9zNtjVr?6Ra}zDHb(?J;d|<~!*zj(~XLcmxi3jAy6b>DHnWUTnBeY4)94ThrkT zqs*X<&2qwa*IZi&WFo1;&z}UsqrB$1{uzCm&Ccvdh^dR~cZJ z$4&>vt^v|U%7ve&2KwLgM&2VCbmjl@-GHsHGi$OVZR6g72wjD!XdhJT1f#%>C2G3{ z4$iEvj7^5U9Stn7_*b{KKC}7+vat2V;BE!B*ut0a%+ELva#8n8+n(FOPmG%|7*-7# z0-Du{s$LbX)+KtkSmjJq=Y%kir%^MFEDqG$uZ{67n17-Q@??eePp^?KHaw=_>}&dX zI?~4JIay`c#QS`2NJDb}utXzyAK`8|4qp?n(kjST=dzI#jY|)r{;TXE`ylM8hleDU zEoH-mN9w=XCjPY}_k`Zp-;^nYFg7!09y-6fJC-w|M9NeZ{6uA7;GxV%15J@c6~-|8 zznwffL%$FE5(dp%^$N|mIekmpH!+m2nI8$r3gGOu9Y!83v)GhIbNCFr3mmQL|I)cg zVJBzJ`MN_-RhI&+hCN&DtCu9RD6=DeOSoMn8S&b_DJx#BuB`dT_DvDV z!ap1=kCNi%?8kMr6LEn8)@1x*+4GK(xA|9-wr)mYW_;y-(6oLC9L;rpJp@DUf9EYL z@NVJJ^pPVG*$D;jz0hH{(puf3!6C26ZE;L6jo2I&I){1^|C@x6y;ljHQPg6pZe*yL zXw|}89pdvd-g)!@SYbBkX{NL1(azBIX>w8A25!GBP*;TS^W_(qxO!y?RvT35zg7Pn ze7AIrrK$b(aQW}%=c6@}>p(TUtw7jw>!NYpBxh04ezA&mZinH% z&gxV2fF~FFlyd%VMavj`v#6JL3Yt2r7Bx&hx~H1US}tjmH+}XY*(aYQh?crV+VWm~ zxK71mJYNg+UnuatoKW$eXGnjkK5YRlq)2j$6b@{y9%Bd(@2^+W|Fb z^F0lOVq%RYBJ82m$N>lD2h3Xxd7S(VW$Q#4!e)vlK4m(2J_VH2N{;*mZ8!B(Hb!(w z-|`*pl|YB;<)xp{KXuC{k^S^3Z{sNgToIxE4WS;|FAxepQb$_xn3jno4MeDyoL`tOTwU{6|Gn1L?7i?XPT? zX=kB(g`ArUjG~3si7U+BLLHu=PuDQ#l|;ob#3M~tYzaF%r|F7XX{2Js&euZTTuqmN zj(fxN%U{44R|b`Qctt)yY~(&NQvwWjCmvX9Gt^1+zrsnTc7MHQrac#s-S0ybzB9w} zo^+o7Q13jG@?Xn6(mL>X*)4h8`4*_!pBdjuWuz1YEwFvh>GD8h!L+PyuN~pfP5NM4 zsk5Z}O0r1h! z&0o$On^rC==1i8}TJ{ZRJmCF!Ud6-1BlOwj`q4vimY*a%ACDZJzfKkn4W@93j(9iz ze=oqfd21W+yI&U@R1|Y0U;MEv$qqQEYWfVETczIsFUl;BNu~TRz&85%L=OOintXn2 zgJI9_%U^xQz6M+_0ov#4&slr>Uh(TcTc&?K_Yzrdl|it-(DfA11IJGJIB-+kSWb>ItYGV++Nxe8~1v8Zc{h*FGi2>7AHimdVLpG!AISC;#}o14yY|?{#aqm!P_>~9=r%C>Iz_uWt|D3pE?EeiowF2LD zu2P~-ByKU97z-Gy9!(VV<%s(|t}@uV-IM2_G8gyaitLuedB;r@#}H3b>si~^*Z0gZ zbXrZ@|8#X}7RZleJh1uweJglPagh|!1JD9fzoP~aInj2pUm@;yN-Dkt0Gm#W$Q9!j zkFqt6*-8_l1~r)+lSU9Q@#Son&oYrR2?(r?%XLqF?oNDprlO)USM9hA43s%NNF(x5 zrC9qENy4xLX9h|ljlv*XY7?dx-htbP(x!(08gL{N!{f$=v8`NBJHV7?9=-+@g&PQ` zm3wL8iXhaj0TCMj;8^U_GQwRGhN#X)gs>ztZGqpxP9qkRf0cInE~bwPJpM8{VMwRr zk0%9Np#+pCxm&Lq^GEU+_18qIJ_L$SASM2F-w-#SdGQOC((79b!#n7C3k!;t?P< zszRL*oAIOqKHfJ*H4AmB>sB*@(ECR;s3+2Mq`8unVzF603OsmD|CgulIlpz1=1L>A z+|_cuUD7X6UgA)&hXhjNwWK1%h#>**Vb=QwZ#yH>H<>t8)&4~?#7n=W=;fRXNIAE;Jcb7sS*gIY8$xc$0p1bV4 z({@bUfcU+5e;K_dOz1rJX5(IY;*r~^KY+lVUgAL%HiJ_(`hN^OtU%kvVrup29J9w? z2VBnSbl~uKGw>%fHIT)xj9Wfb%#?XHlk`;mP#g-bF>5R7A(?~GqeQtV$Wj>a0z39iAV%3!SgPKFXu|3c;su3oMRw9YP)MPt3XX64~1!A^K z{0XYMk+zJXYbQE&L@#~_feUQdl)9+#Rlo+#7;t93%tEq!>@*vSFlN(W*ybbNDVIo#fjd?TuP7Pz@zuPJ7FpaRe|?Li6Sw?C1kUfRu@@3{lZD_;5^XV%TEzM( zhUVGd>$4k|>U8~gP9OJJ8I+UnxP6L663Frj@S|lM%L%EAwZYWUAI2WO*+V4NfBUx# zq7{1QfLNj{Z6mN&dIbT4_MpqT<<%>FLO!On zKBUw7vAQcuG!7#)+>Lobn>}Ko^e;%d=7=wHXVJA&Ek+q>^4tb;;pinqTiQKv>=&Y( zKmR2p_aZRXsNwLZ9sd+Gmz5!zsLc?jH(T2u4E=jtxuT&dTa&})ARD#7s!4U23`1u` z5<30aEM^72(pK6FczK8!6s!3jIKmiY!lVDPno5G}!x&&&#Jyc;hE7hpZ{eA&odd6K zCgyi9%>H0fN?7!)i2DgXou}`QOi~xITl~4l=sJJ04lMpnnw+w81+nJtdCUV}?h7Jn zVGWI2ARmC7uvhMmDYq6@4c}>Lfys*_0Vx}9;bY;1kG?bIHd+%GGU&@oKC z@AG{VKsLuK4Jx%1H`d&I?!~3^ZH7WphCdG%9+4BzBwY(*bxwc^3rrbcuTL(P#L+*J zo%Pvyvs%*da50;EN?fQMikm}1`U-yBbK@iPW>J}4Xn*g%0s9a{?bRm@n!V+=-x=9A zXKe^YKSeq!HjfVhOI5!8tT^%6?brMGeNxtsf*n?xs-VSJ0-5wMX|4g>ywTSjTw<~< zgcahU#a>o_g$BtUNeUYdHQ+v-WU5HpQCYrld@Euj$bajn#UC#D;w9SM--Ex*<4 zWAL2;l#HP?9(-5pbfD~&vd6-c%6~xpN@V%RFRgcNZ^5@h!lWRAuk+B+<&%h1+{L1? z#J_TqF@Gbk752k>?dkXyjSo^6P{FBZegPIE`@@>Zeqne6@ zt+V%zJG9iqzsQNqv%8)qMemW;Mwl0}WhBPf+-q)0P1Q5quBxe~oOmGrCQvZ+ruESB zn2>^Yo)lctD#4wY7{lK@LfK|;|ag_A}pLb{3u3_QJX{*B< zF{`xTIf@T@-4Q%+QEUPZ+v+d zFWPnElkxY?Tdb?>b~cBfn}0NbGQZXCk;5Aa=@>A~w4gkcG;R~C8+y_9-AlW%+l)yV zu495p4R&6Wf5kP`#DXx~bQ|+UzGrJqgHGRPpLe~W52%+luME0_WuTP1;5{g`Ff#~! zUnv+tzVH$XSc}c!pyx5+ZO`g*g5;+VCKCSdCK0(6k9kL+rE?>ZkBxQ`94+?pciq%_ zJpwN$)l6j4jagjKU&UJG=vA5@7TLU!KX1>;Z zWS6_a&o+GVsj=*y+Jq)9yRL{p5#5^^ z@sSDPG?VW;U@AVo((M#)jUOhi#QyPBIwi#~yyOy8pp}U71OlBPwPq!f{`*})I(+<+ z?65HO)JR5)M$Rj6Rsby!tsPjas-0=Nic{bJ>#)i#O8H$u$d~)L6w3J_Y$$|8GuFr5qZK6OU89(xWrn_*oG9?08_XJ zZz*Dj{MSAc-koSgMDV6aSxFCMV=?`{INQf!;X;D2YmETt`JFeYQ4 z`R!n^v>eCoN{s5cbL*CgC5LSNE$e$z!Y z7jCxn$P+2HO<{kIXqVXTU;ej7z`d4ugapt{$%~1Y2!7Zj=1nDrQL%#53djmYCfhCA zK*^DyapKV&O`Dfb!qFcl5V;zN0R9L!qx-p-9>pPqyO2%pir_tVe%o=3 z+ohq0ka`t{H48;$v=xpj=XT0A>28I-W}Y~1tTj<*t_GOyXOU+O1`^D~@6YG*KTM6z z?f<_QKs~+?nRD}~xNMcqi)~4qb3L<(ymGF#ZU~~t4ai_bM2m3j&-qcHJZHeT`hxn? zUWmw`jF38G(G)g2(^Q+2pn`?SiKn|OaBPcQ27B!WdOZ=LfBzulb}iZxytEC`4n_su zJA$3*TZ$2HtYp5m;KGw_f6#TaqBrl0FkRuss#E2Ro7rQE*frh!hO)xzBpruo)3`u^ zKt#y+ZDHTfm~%qF;#ZP;pP%NU%D07c3u$hZ8V^4WKD;dtqG2y$z!IBEYO2}g6Q&;r z1L7#j>ZEOmy%$L~=6Vk5?5AK+6qbn<@w_d(qec~U0Ep{6utie$a0w3rwX9(L*sD-t zWgopQ!^|Rs1YCF;b@nokJysf2$`YwbQVCYM=bGjJnv&VJ`(d2pl(F50=tnMy^rjM$Ko2bf!LAGD%`rh*za(ybdO*P-_tR+z@5>Y^tECAv$aQ>8t^L%s(R z(+m$B#G#Kvj>LB*$d>3CnWXyZ<@xa`J4t+q>I^moZd6P-QZ}|b5zO^rYWy|jGH2Ev zaMi9qV(0I4qnHIiNnp8iNl+pwdNc6rCjtylOsK% z1(czy70f#k36b)LX{-5I-On?z-BI3Q5vEqQLT5}w*|J$-DX_&V+rmsRMI3kj{cg$O zFV_O2a}-rLFgtHenSD!B#PE+UyeNT8`tLDhCcr_qFyA@i8rb`&!53Fm{kzNCR$=&wOKBEd zjNh3Z=6#U?VyIFG>&~=xqbY13XLdI`VaHs2JGhG;)0op=xKdTfQ^R8{leL0{o*>QW zkP14_XgLQ}qKM<0f@4{P7h}NRZYm_tk1fK~IpJ-B`A_X6AxX&fxm}L-`{e2^8TqVS z7(R~BiqnW41Uei-cifjNasy3sFs}ipJD)^M^Wztx#F{26!?zWeDnhpd$3c{w=#-RA zu~Mpv6lMmz)|2~jd39O;yCYM5Te&Rt@4|vC=gD4A4B7J9DTS!jUFs#n5^`fDqHMi9 z7=xMai4Z9>dq zdoaNX#WA3)&9D7Uym<3m`-Hu-N@bw+QIY?P;DUlud;;kR!7pp*A7qFlfC2octuk`k z<_O0s-!2bamcqZIaTomUyot6!2}BKd`X)?FhDaMJKRYLOF+iD_3Ry1KkB>U zMt;`R*7by5%x9Rt%g6uHy`rpZi;+wd9vQhUb;&IU?U#H-`Y`j~1`GQ+HxbFyC3+qn z+~hn}?i51--KM#;APRiWhhKn#ms$Lovh9z*%hDf4@O)Fcp?!cUi0MnN;}llSPHesA zENkX{ah^w3T#K$6I$Anoah?b7kK>v7vrYq;6>_e zNpz}C(fVkjmH4e<4v)p^;vM+c5W5#ceXf*p6cZ*xI#*4b{hSc<=Q61k^u3($ElAaz zSj#BY-+a$Ide+4&GQBm?slNh?YJSGUP_K8n#zm%`i-STawU_Q+411Z7A#rgh&?Z{k zP}5ghq!bE-P#HN($+l7b-zCrfK3XH~-a^p7M))fyDM|P^eZUZ?PFpK231MU$%M%+Vy2l$r(iC89KPzurU$wsLX+FjW6`tf@>1>a-e_*{H;V(iiEjYFTf^^Efa6%Q9 z-safPrYXMKd0;S>|8kJT?ZG!Ykq-IhIIG}-00Jh)MJQ6yrRRSyP93&Mm4J#}9|uz{ z-$_5B{8Dudw_ve-cZLaNz?N2Q)PG z_uF?L7Gt&p%gMDwcW z*M`PSeEF^)U+$Lu3vqeWa$>hlvvMPgLX~UR5r+Zyv{pcnb>)f@LSWoM7p_tHu#o%` zdzy1VGU4%eQoA&EY-ReVmhgVI+ncbm1-EA$jQz)h71Y@2jGPb0sqgy|E(OmW%(S2)}08?GK7A<#A%dZ)N+1T6jm;m#Or9 zm^>02=NVdpKgaWVhtBMX4g2!_gV@#w6Xd3vQIWQsp~jf|Ef&lSG$}@OH@^rY<5Szl zxN>?DnAN3VZ)>s_xmMi-2>Rv?;%H~S7mMi-NvL&?!2PLy9dM3E z0l&aqL>on!*Pmr#6_~FVb@Hoi_D>&X)2A(?aqIfNm&-#vKce{v-pN+mxNE~7vtJ4l z1?r+B$fQh-q0MYkub=I`H6k4vOYnG_NkTpgMOT{h;S!6~VU`mdE5_-`eM4qQe-iHw zfq3@UfBe#`&7+!6j29ajNqz)Kmj9g%i*&&64&E(fUnrrGxG`>paiMou+Y`3|dCjOl zwe~cRN*K=GV1ykR*DoUZs{Gxpeis)FNk&7mQa|;{^Dnf1`+1qiEkCE!+^5?tus6Ti z_sMbjxW;Tl=x3`Gp9W2)PH??4X~Kx&&GBmUTaMOVZuG$BKhTpfp}2>PPeS_sW~5_y z!JL3v2&!P9%F{_s(p(JAD*{48$7mmiq~}M>{bI4wBKApQKK5HSp`ssQFyPU-X#3Da zMnvfVweatgU{vnvbv^O=D5KNmnoc#`?cDT|qt7*P+vqhY0E~Z?jI*iQh`f<)SB%3z)^ASvkthyfxNn}JBnug-z++?O=#xRv0_~JXrg3uWixLnWaL*h{;p(BSq3I4uHkXFl~JWHgO}CZ zYp2IznF#g~k_T|Uq&&xk3w&U= z3U#uSf++^r%zeGL7>c}QER?)KPm#rBKt#mhhQDdHm}9SJ&s)xFtLj?4@! znTms;XRZo8$y0}DLsezHKr7rGaZZBc#_T~fEcrdEI~#Ri^l9>!)T#M`jpi`DbT#e_ z{BipIz{Z?jMkuyWz;;`nhS0Ez0XxR8wRoIX0z@M5^SACh>ZLS5O8$a;_8Cet0=s)n zQ2kip^{eKGy*E`%WF$Nyph?>4MSv0owB4`8Ux`2DQW56^-{-q|w!Mo?QHG8Vp?4&U zI1L!?2k{lZS1SE^ShJ*aa>BM%{9s_=@7w!!1%suOPe~r=;i++q(5U)5#+J!GyE8_9 zKWs>HA3wmT#yMTbj1hJNfPdRMQO2A4{$hp3*sa$fO$r9QBe_4hv_cH zBYJMVTQ>gS6-AdHXnTG5ZmjsWY$f=kg}NstS#J2U{IIOF_UQdxMm=9?xqp`z59(Uh zmm6lbxl(SS`~%M|@2RSEKglJ1fAuRZK8Xr@&7SQ}cf2s1-jZzkyPhUXa`*25fn~FI z)1w6tZ*~QPS94^8L2`P@*Prk)!Qr{b)?HvpdP=F`PVrMPyPw+rDZj$w9tS^otrz`N zBL+tugIMlzadO4~_X04*Fh$UlpM0*(tJC4Rz)CE&s+Q4h-AGtQnL;ji*W~-)r=sZM z$MQUu8m|!B^R1W_0}Ynhn?Lae*X9#uC8IxolJ#dUO zn;!y_g+2lmK8?qaHDD}L;NY|Sn4_JYezV)wh|p>)P%FTS@%*~-{Lj^IfKRorhtmMb zi3Kis5_HS<+nrz&eLxR^d3G@Q&h|&8frVAJJ>VLPf^n1ApnkWDfcG;{ECl9^eq8++ zyG0}TbiFGK?*U_||JjGt=chBeVe>C}KYD-P8~|&zl>NtS(?^|6iIWaY>6n*yTNJNu zbBdpRb_ZfAS-aoq{^|Oy7kXEB7zgt=lX>;kNJuvRZD@>eb(a&uFM;99xKyX7WUb;W zIS3dhbLd8{iWvg78+Q&eymuv3=jU|X*jD<29_mzyCd;rrdq3dHocPlWt4c{M8FM-Z zEse@0;a9l0y&SR)aS+0pLO`${hVC9N=3ovlgf^8<-ueA7nvOfVm^qMlihdko%8?Xtx90JK z%MC?>@Av5v!qzn4@mHB5V6^u2cE4}eTMKLqTR6;SbLX;*gpYY74>#HOE^l&^fo&!3 z7kv(^WqfKW4Z&PYt71%|T}Vt2ft83JL(emXN$ICi*xV2atB5}8+wt-YBgNHz?5j{S zChmCDE#Km7zPGb5AH5>xC0y?ujL#{oU$H{&)9EGXR2lD47M$F`D@pB;c z!~ykP;`zl*4DOX)omJFs83>COU?A{4JI=0rNmAH7S)_7faZ+sz5(_3|Qt8V-yAAOG zbFxWbS_UJct~c)vKdAmNx?Bl*=hGL;r`dd_VzOSrVa~x(4PLH5S+I;v# zvX)Nk1wVcBmkTazeS@pc>TWD70u}2VcwtwgP1X5ruKkZ^Z!|@kiEr8Y^@wx8RF_5T zI+3$5SjqIn!9&EAJ+?FroT*sFCGjXz1HmE;r zWc^WC(Sy(@c?1%gkUxA#hzWsSAa3S($^_nR>&Hs=d)UydP9$WFY&B><%Hd@WfxN_^ zR4A6ORgrLt6g=T?@Esx@Qbb9%m%*Q-nYibNmOlIuQ2?=%7MA^spT9n%YpN#5{v3S1 zi6a8EFRolW^>H(lz@Ym3xJUNqGr(H}AYynDED7{2c7V441{%ceV-lB#fVf-r-iVhA)wy+IrVVNoi5?V_OEsqLO>IYx z(n5KKzxPrjTQuDMFlp%-MF0~9Fk+#|=!UpUwbt#5-ha8-PJGXP4{KH(bocmebe_rU z|4DPZPqY99_|JaEK`)^-(_ie&^>lamg32Ee-OA0d_s6LZj@Z-~!p0GMoHz<;`Pq1s zQ$eT9w)_#t#s}g`HHOgKXS*6UsgOGy=${YZ+}}K- zvdIE&|28JzSi0fpVv(W%n@zC#K_De^vlS?b$pKhG0{D}yzW93$varcj4zNXl74h1_UD?wkKR&;d08r^hU)F zH-c}5k>bBMldw53Nj$rrKlzbD`oE))5iS6(N790q=$?BZBNw`lzjXqXz{sZEz~AeN z6Nfd<>SHbM7~iq)Gje3sIA4|E6jv1~NwG}NT~TUQ>BCiBv(Ncz8fu{me<*i`?DJt3jpbx3cBT>da2dN zorSe!fe{b^&ww{v9pD|`b3XQosPW(8N@)Ibms;WP#S%HQ>)~ z>GCgs>5H&r=yQF)q@QielyG4;LqWEspVfvZ{AL3g_EBy_Kc#U`BW3)}lDb{ogU`Dm z-B_veJ{#9|?G+7M_{Kb*s(xt=X{uC%#A8Z6^Iu+1jCr}181ojbolmBH^f+pm0~>qB z%)#o_$SQwj!EYJKpE9RC(UidDa#q>?2J00)s(-{nT@CE{gg~g6Qli478z^a3L3CgW zmJcwJscGKMykUL8esl+yQQc)t0K5ZL;Vb#O)$Jv0a@R|Z?b~``u`=8*WF7xf@Rw}g ziy0{5^K}-~@dHDBh}>-#vA1`3>V5J(U^|5<`K_M!rlL>p4%4v@IdaTKk&36s){&2` z2mQX=@OdfKEv(vU_gVFJm)(#-{wIT5J9UB&DsH{eaMA7_RpxtT?e713$h6wzKsn&+ zS-@9YWDK(yz+7)w?P_cqlb#~OWYGPatcuvXn^&075ETB$7 zARQDyMkM^^jP+(Zd2-UMw~mu<|EZsYiIc~_#+O4#hzjvm!f)( zD(%(FJOt9scRVUAr6br&s&|9ggpgnCld0QIR1f0U`{9p>km`D9r^N6t)ulPe75$$Tt;V^{L==nQj{47J6RYdx+ zm5k>bh+B=GLh#2eopt?es1v#G({Oi8ay z9GsEo8MIZC?B;|z!je*r0sGlG)%Q7$zImjiaE5jJ=5u)}r(p{et*kFvWQ66VPhYOS z-x^eUyFkL>G+RXZBRoqvpc+|t6!@BfJOVoK1HFipwG-Due_D-@vW2=xV?31g{ zit@zspHbUAnX`-(%grhBm7_RAA-eWoJ-8ADxsn@3Zyy&IG~X?AFo^i3$*oS1tbD!C zKWNt$=k-?WQIUL%QkEC$D2mfi(k7*4ohXxi{P}z}Z7^nPNZFjr#V_!G2H^^u>b^gi zgN)b}5oGRT$X;DuMn*)YkNPf9((EH6*yZTz63N{eLTMa=!ZvrSSD%d*iUZ-<3Q zhA$`66bY154CQ0Xh0?iu@!PfH%3l2B3Yv|E6WY@$Q-}9{$2zg_`8#qZN2EW@yc<`c z(N5q-mzgU-jHrD-{P7`hiH1Ppp}irNy?ZY_hl)H9Uufk?Y;JdWc|}XBmLZNbzyC@r zm#VXmlqlN;i(yJL&yO=A`A->wadxLanrF}KLM2bloqQkjYrUgyX61Cxq^-Lp){3AU zob3CYKgpYC{RduUg?LMCa2Xh=nh`N-9p7NhSWr{3|X7t6Hf2#7l7 z-F}dANNjfj&&G&6Lo#M_@JI~G^sM?Seu%0g%U#Mn$W@g8|6V}nbAIWvMLCxa>HF6h z*kDmr3cq?f!!+fV0A7B;lcrD-yJ9!nk_wNA*J__jDyB_Y)wW70cxEs?)!HXZ+#;3S z>tPFyBNJYT$r(gTW7PuUN!914Ya(UF4)@BoiA(alA7qZTQk1P0Xtf)&ikD`akmyK9 zSP38-bfhy4I{G{!Jtjqf`vadt#hy@RHvg>WDbhlNmhp?^+agVEipjl${NmTzaqRm$$S!3vLL;AKBH6jEmoz>mrJV8B%1j1R{Js4SGLx zaC&Jqjxdg!aN|OTtmmP!9%d6Phr+vCDM;o*0eWkj6OBiu7GaSR|F~I;M8Ah#bieO@ z67o1L*LFGROSC|9!66oxw&!aS?V^~KE(>vwlFsjHr4)3h=N3^D&+TxVkyx;sN74fW znqPjrd`=zyRXEudf$UQ@=6LW>ckh>mKo57Z@}&`%|y&j7MFwA@O5AUcE&}>beXWy-oN%ksC4y=dU#VRK(dit0@HWt5Gc1V?Txp|sEB&;v5qe`3nPpr)6GYVAN zCVQ6jsgSW8vkYh7x$}m4CR6XLlQlmpU2hvC?9U=_^0@4kFbiQZm@4YTB{l{(3bK<_w z`NVw>{}6T0e!#Vkq8};3JU2al}t{6)~m719~j0*~?NH0T(5A=e`Hb3CmQQ{fp zmdWxi-mqPC$^%YeYm!+}Lv!juK74Aoi<*8Vb&>|;x~R;cC~^K|ESm$Sf>Y;Ix)^24 z_%Uv1ob;#ut_XaY7(HX!W@=8W2dfa~A)Ang(HtKv<$)d3y}q8yL-({j=fei!u?S8| zd#Ru#w~Ji0re=g2rMC8sDI$`u^JD~8+P7)%Db1%`S5d$Cg&1nii34=?K&0 zJ()IJKLyi-DHn_@|@u?3q`ZH;GbCq3YP_tG}o;;>fTd90Dk&lN(_r+q7!(R2J z2&YxK__<$kUg2V^9_4<`CM7_ZWhjgmj)raKOcyje=N(wY< zX;O1%I+S3>*Rr8~#+4l^A0O`Q7)B$hGx<@D3cl1+8HhA*_)09YxeR5%ixIrn#VrI| zi$zL?cEfYXKzEY#oqih4(8a;Lj0Ryss_$@5`#1XQhz(?)WfOb)SfVaoh9xh*$k2;^ ziX+a-D;DXoHX$#B3b8DJ~Y9QtGJzHEDPN?oyBb%? z*ty6qhq$*xD9{BzRIz&(AF!DFv689luw)vGy{zx{qkMDe@!tm#c$1LJ#B|buyXyco z!7-0bOgk!Sqor9(aY*WW&b%0lw6VM=xGRATFP_H-{M-+skt2hr{@cDQ1NAhB}wq zIMq4Zk$O=dR9p&QTo%5v#w=zH>rTmf`s>!;wT=2>A`G#g(7wRcmi+yh-0TDAoF_vA z_Cc@FS`0Kz(baQ;X%Fk~M-0eQBsIxMiKrnY4d~{`T|0X!F9cxCg`aw3q#YIHT$HkP z_%JAz-DaEd0PJZSZ)E83WV8at1U#NzADj@bGN`Y;CHb{ByLMRBg?9qc0m&Bk(28w? zO?lNU-4nQ>r(1_Ss?!j~w^-%2^I_G0=~4|gXdbO&Z;#qA{asdm@GeaXJFo-q=T2Ku zv){uZ8>8EMWFf32!Lk3%jIk%Ynl?k;JNxBXvz!$>COYxBXU%ccw*PHLul=VNxX zS8$2>VGqFm>*vE2#-+bJgqFIUU{uAGjg$5 zG;ja)OLR-pe5Q5vyz~92dZ|Ne*Qu&LO4|aT3U8;F7rfzb%hKUGt4e`n$1LRe zV_n%XZlb15zQ&M^0ch}A+2L9SqFuK2OeZ|Rk)xDqa1hL)bjlz!$6;#UY#416&#R84 zrB)xEvK6`!^+7jVSW{9nrxuy;km(5;MhO?zNRPW&9VVQ%C>((Pie4#czwKla$W&qI zh3#};&Ht2baP4mrG<*6Khm4qhb*m-$$7+FUMpgO~rV)EV1#JLd%#ur)LSm8kq~tb~ zW`F5Mr}ms8tRS6VDeiZ|VF=LKGmYDp|BjRG(9NmPZdGC4s8=P{p%8&S?opxaelH_d z?K97!tZhq`p2kF|I>}0y%T&F3?jV!>Of}vM!#iJ$vJnduG|&RYb5(I+c;;&suhiJP z5(%qor2pHcFHLUof|KM_6*I>AvUQ&J1+m9vFokmF7QwgoVqGNsGQOZiGBqG*M)%3O zy{rlw9R9y*bwrwFC--PhG$LgP%A}MVf*Z%r%_1bdpW6s$9y4BCFV^{%MUKe30V@F9 zB=(h>mAEy@#~UFO|6*5L$Ph?+!Vn5?b{RWdY7dDaJH~=O|CX&LL>20vQ>b<|8=7$3 z2`_VGZ>ey*Uj3kj`Q-_xA9#>N`qH_Ownvr1|82#V^LSXwF0fV_TMC=!2uM~_30Y8> zC}4IbYoBKzmt39=GM1M>C|04g6sxac+qHZgOJh>WS*%>Osl0q+i!b>@Qa3}W2a%2Z z=gsvLHvg^i#tH<)o{uq`?QPXc7DzEAm`U1}P!~-|kM0$U77a+uwaLx{89B)!aSgDmzosclwMO8J|99{KbmR~&F4 zYPt@qhB9YEBT*?%P^QUjsI2xZc~jwAD_lx#>WiepseM-6MJtGGY$trGh%~!=j+`W} zJcW}PLIMkS4c{nG_UYsm_-u;k)&2Etg+_I;UKd}anWdqjmhYd8hnW+?^juKK&##2T zn1m+aq6ZLjN!2?ZsN+Y)x?~jc<1(o|dSy6JSdthE(qw8FFyDO;3Di!k_?I*C4%jrg zS(W&_6Lo}SE<$6d$TpbU+ahl-IP1<6N9K;Xg&h(9xdp$~cx$v3u19#4FXvk2H4<2G zZ=$+3w4=W#1|lo?N=gz8QA!EZHY~pgsbJ%Rty;J8vFXpfnfs2_TV}N$Eo4d}L}j=- zCUyI{(uQh_)N6%*Bg6$g$;xHuSdbQMV+-SIgYT;&HuFW;Njp`o;<&Dzx1&h9&Jq4p z)CSU^qvwEz_?xh@2v=n^7#HCzeQqS%=4O~%IL>t+7TQ<7z;U{$4h4m!on8YITLPbEQgWGgQ zUWLRl`n;6!aMEBuu=pVAr;iWc;E8+p@p?kpSVrBWkvDjPO2Di35*4(#P3kLxPTcAR zZ9c=C(*yljp&!`~hac=`i%1&^bO53WfV$;$T$xXdj~Z0mpw&I=JCB3L%RTdJM&)}F zV$?)=6Cwtpiw<7au%^L2+0t1jTF+jzj$(+z)K4$5ioOn&-AZxcYFCQV&|DhIT49hI z&Utv)rBzm2z}jzV>rfqhx@DN)^Pha*#d~~==_9@nynI8Vgg-qS%_%Gm4zUtBT=&hM^vbt4dffgu5e9>s7Nnh5;inEmk29+}d(F`A> z(#m>MqF*{Vq(k5H^I=#0g(Hf@Opgh@p9eC za(mom;uLY-kTO2RkGa}dm-wpk9?RJ+>A99KzK=}b796d@_gEOOoNb}H(fDcD12ym} zVs5Ej&-~DE*kf_ea=eETXD;RFc5Lnzd0(aD`U4t%b5h=k60Q)TEkTuCyOGrKMiwVl zkKR?qVZq5U{ah-C9Rbfi!?9I8MCti_&AT<|Oy`KP!0w#h8Xfc9m!kq%Os7rVYR`;P zW^f1idy3$eb=aC!t*p@p?&sMpzL9~_X*0!;BGn;5TdijgA&J5_<(z3u zl|B2RDNufagWH7U59V1b+;&noqLdv+dDxG#U z-^_C9x*Q7c?5Y=20>S2GqnyH$)m}0-V)EH`TIzD?mm38Fq*bYIY%ijBJr2tT&1g zm5#I)n(cZQ2kzM5sgkleD9fN|(THW|u;&FU%VC2y!5ooWGJ?(|^ZE5Aj{lj*nq$(T-RX{7#x?Yw?+^?1%XMI# zqOs3)$de5DsEObu*nqwi3&r30WK<_6a}ms;bL5@wY?aGm7p!nDTWS>5wYPgnVX3Y= zV3`zTGz69vlQ&tzm=7Q@N^2hTHlSyk^7(9Qtj6NHPT=&@pn^&jULeY6Ghi)K0rzvOA zduMolv*Uh24lvMelZhYw0+J9W;){3R|As>vbjti!avtqmmvP9cSKnoiH4;gfrpFXs za#ETNiFC;ty4RVo;*tu!{FbnaW1fawNGH7cQagV;2d~V$w*W@MvrfL&4-ylNGtsJj zf{LJnmoH|i3*MK@S@^zk{kGJ+8+GXo=bP#JFsmO`y?LBvH+tE)DHIb1g;i~4Y0^{~ zOv)MhS`*hA?us>z=jXFHhmqjoo>wjsc?;?uN=RT*rg0GVaj*_)?6i*4rsi6C$a0tnAt7f{M{@<&dGA<62De3aiJc{wlvYGGTc9Cs1L>J{t=Pk%?Q^Rr=w{(A%gI3^_tNW%xadCqV$EHY<@ut@7L;`ODG5{tvDvQN zgy5&Mp4b8(U_s4JC5ZYtHBm-B?&bnd0Cl`pd$$jHc&tl{Mkk4KM=^gpcs^LY%2YM6Aid>yuj+-ygAB?nX)?)d#Kfzh7fXA zv%=x6?PHNgiEJDxee&kHUfwoUuPXh?DWoJ?D&AUf#u6{zqUjN3jAy`eVY_N;2@CjWO2Cu@auM(3;Q<1L&o)#VRvuw`bkS|&ij&d2{0 zTrKI#@#WA|t)a100xTq`wX&NL_uONOD#;C~%Cv^2i7KdB6%a|Q&qD-%0&P@5knF$$ z;L=VBcHX%~4EP~>%^!Ak$7|rVLE5Z~#Jh6?wttf-ZfSoW4|Wwxq8rf2uBf6zA9jhT z6L-{86+r+@T;F4<=QX_3YLB&J$BZqM$TQ2$(qH7pFDkir1Nc_Uk=kV8Q|jEW>+J9O zFn)@96m5m1=%Z?ym}rQ3c|2GZb{WXK{C7>x1wMQ9gDdGlF>>-k&{B$SjpJ(R_L6^q z5~DK%W0FL~)nVWqhNoaEl1C-g(l?~;1oB|LS2hOi>!_LXXcDQ;cMKM4ZtsoSKn^2w}(x#H?vJbojRPm9d zBNpHqaJ87xp{QK3w-2_SgJ#e2)y(5OQc-A)!t7cf9cAuR{Rv3 z+`>6MX@`JYTCfzK%*98>V;Olm3;fiP0V%6~Npn`bJy0`RE=_8wf%2-+`IJJWXEUi| zl#}m-b~T6d@}mU-Kf{)nB{)>GdOvy#6vop15AFddKZwi6xY=o!o1Q>+ESvswA+3 zuE#(6X;hQ+(02`4EefoDKYZ;d#LP-S-rzo_)z98lk98Mf3jPYQN3D_D>wZGgU!yb&O*2DHSrNYzy1KI ziWAecNr3~%`Mv+y9BrYGG--f-m@3ND;6 z|D3w|E;;OW$%vhinRE4`d;a>4HbZdAlXj%Fs}h|}Gp6p4e0_aWFIp@kOT%j;&`4yX zkqS_pu4l1t+1SDJ$_F_r)piYvY&|rT`f5scc$N-#_KN%+bMob%(ud#pGHX=IZ0>26 z_#BV~wu#pwr*x5}XVbO~mgWgo6PLUcDm6*fo6t1J&j(~(j~%^xp0(-`tZJ^xFOzRP z`Iy?2moIH!;dKRJ^w|F0(395N%x^25_GBY@jancutHdLp3zr^A{K4lsI?o{>x;mYq zW|}y>AjE%)5Az+vR6kD$ znxCKzeN~IB$79A^vHImf&L+&N?8iOn@Bh5wnKNryj0C2D$CW~&$wn=qXiZ#w4cs1K z(F6{K+c{94wkOfmJgPybkzA3@>4~G_o|!_d$JFl*l77|PCG<-G|G7^Zzw~xBugvF7 zsG4}z&XX?-l!MsFbdYMm-F(w}#WlBUS6s8>;rb(Cf5w zA>Sr;M@J&%JkMBwY_eb@U*5`MG^BgU$q!v-gy9j ze}nyXpU@2(mkWxfJs>*rzwaG&Mag@Xa=0F5fBKbBDw5_I8F6XVRwJFn&K_zqcqN-e&s_uLd^M4$QX9KZ)Y&mQ?^6Z}_iZ5RrA4ap@iGRco!mQA zQdx8KmJSM->OpwESaRya&jX?kQV~h9=!6%2@Jf#H5}GM9A<3|GX9eLWUw8J~aeDjp z?$Kist881fNaz~IB1(s3+lO*36D3r}4p5#F4alN3#Qd{boY0567R>>i@pG5GPpn+W0|bxG8YOkZ z4f~Q4Dw*{9k`)&o?DUFxN-Th5LTv35h=JbPW_zu<<_&aq3wZ8$tT#CNw zP=wF1etn!~)CnhvoDZQUfsO12_(3R4N5ZkjOYJi<@VkBRFtcok;bJrY7?f5u{k?)q zS}2S_Y7BY+E-!guu)6NpH*_{KWjbUO7|P%j|9#W^eI8z_O}yd1VLz+#enx(b@dhTL z9lU;+7#?ZBD^=eM(2B!?<- ziQ!Y{YJbDG-UbW7t8MCGcC)G*a;4CJSHm-vmN)b zdlVzNhBSOUOk;ok@AA4LT|FJ*!zUB^Y*w``9YLH|5sSRm6^-vu%vKtLlYkEnm=dW- z7jZLr?{UF=jg%xC+fyks5C`#vJY3f6wj4?k zb1I!Wp&+c*Qwd4?mfxS6BcL88BYPDLRqZz2e+BeYK87k_(oi6-1MX!tP-heh7fy3g zKqt0=72Q*2dP6R50X`ME3>TY-q}^4u8KliJ)QA3M_&!TaRWoB;`qTa22mcQX&^S06 zO!NcFg?7q)i#+VtXU4dL|BmaSz4@slE2#)c@Bl#_{@?T|NDPuw4OQbBdVC6W(vXsN zLhV|Pz1jMMKGY`MFo3QGxFpGpZk78nx2=%ZtfML%Fe!68=2m@Pri)O?+e66sUQwZo z$dOg2r-NzwKZfQ1MqSPaffdY{t+;l$MW?a2k5n=O9NC_L4AU}rbv6SLI~p5{tX7m+ z0Yv^bDU9j4y0&C4Uy34z*YPp5SBSJ65~qkkxk3UfIv}PNnD1T~rT~j{HHvkP@fDqU z(}mk-f9O5%X^0@*;2t+W%o6tL)VqcaJJ9_XXicaPhE30y6QdQ#bSO5G3d4Y;;4QwB zA|0V|E#Ed*>T+B;&vojzEKWf;3HN}qWTH8ng9oVBN&1ACm0Ys;W$w7Pes#s7a<+xH z6a&+AI*{+YU%j^wUs}Hg3piaPxL*CY(z=)c{L!}klE(aHeI+|a9W*wBLRbXwbL95= zuQmF?J5mZ+-}VB*qz7!L_H2%+lYW|a4`56_9AN?98OHPm&rz3&Esu8G5jJzdTOMK- zgxi%aH6CP>HXAoxdvlnzt`vU$AE16GS*Ij37rPbPZk(h>!KxfT#E2IwLP%a!)}v5O zA1deXvK*Jo@x!SGjgYmO2{l$QWux5mF#Tqj9w#hzMW7Y-oVx(O0#gI$6X z+*j_e_EC9dx~mE*xy9HHH z*=Sn~iCwwO2cwJ`gv**?7QBO#GtxEyLFc(ND{W}K2QmCg|Mr&Hh+>s{2q+EmCooFT z+E)gkzUM%9#wsa~#pSddY;Y1|@kw(FDI<3 zt9QbhDK3Yk6(POCg_*luu{Hr1l#N!PSqVc59b@X-Kql|NFSq^>xK9xq_RuM~I1d%C zVN>m>3X?~3z*Ur^(|=cVqD@FAU50QTshTVUnq%ZxV`dtUzg5wyJvbn2eCgGo$2(;}ZtfCk`t z8fIb}cphmA{LDvagnIL0u*=mnBoAQ}HlYCvk+)$orBBXU_QB65 zck*Q&gyb9yLG2%Eol{3Jzn^;`ZXx9X*u}Ov0_z*ArA+08kc!NF>;m|mcY})|k$3=l z>BE_AiJ=T<&wLC=dtquNOeWxw)MO+j3)cUDvKN@*hw^f#`K2J?cp%a2K(N z@3(<#4+U{?zVuNgyCp9kH~Ap!+iUa*3he?7Q+52_)%1Z+#^z0}X>5Mhg}3t(X<^LC zrj$>&`e|e>g_zx>dhIWiCaT0G6;U;@5RgC2TPm!Eug=X0ue8BZ@I2pYk(})f6%(!= zfzi|fC&DuGVrGd4sVqGofgl^)_7jp0f6R~X*6tqni64h=eFOe5Mz^15Nz!u;qkQ+H z^vj-YV4LZ15$uR0ow z(G0qkem+RJU8s3ju)vU}to&n4F}{@{;C;}SR67;G@#LU4s8BLR!rUl#<3Biy`r7STW4s0uq>Q zZBs62?$U4VcE`2<+>I`oT_NgDQK`d5Axn3xXb)216GO4bi7X@J+R*L-)g$UdO=Atw z74YhyC|`j{Qx(u@7x*48E4#O=|KLb;9@GUzKZQBCH;D5H%Dfft{d%YDH5F@eUI)F4AE({I=?SB&;AG#wmuHC@WBxDvRC)F z+{TJTDhq?kqiZ!LlPpy$kLUG%l+}gO@GROXUxxzybf5mj!QjN{@r3V4U!qp*`@A}^I931tR&@%XKk)A;z|~&@B=Gmw zheXQ3x+7C;I~%laolV9t=mDS9<4Z6Nsc4rE*1K7$xY*j7El?2`xYYn6*$_%3nXJzxp&H+0uvcGyrY+|kp`dZ8PQH28*1G03pR;iGrz$3AXf^ItbL z*YxzF6pD?rxxX6q2#G*@#`jTFqA*Smc^W-c)ilXx-(~H7jNwQoO*2f;D7xc{dgOz- zkm>f-g;vV7?&S52+c)I+I%p}bGY(1%J@Xik=h$`j4GhxSN#>!zQ)itx7ica9U1D(i z30Bspjpm!a3mBiQ5gs0DJI~S4vgcz&x1RRY&wh1ffDwB#dae|z;(L~fQ&77-sGmgi z-)v_q6Zo~}hywC~Kq7Mrp!w4c@Q289oM+to49r&Bz|^~MbTmZ=tdU)ehlPx}d5uY6 z(zFLt$1wnx%ulRUm5r2B)9~KI`0inpeKy1KqzLezbEE5yI_eDE!->BH&_}1-?ckdN zi7)C&Gz(640K+41bkGZs?I+Lj@;U|T_7(q7wx87Y2qHN!=FTR2)csf_!c>Y@#b0*&NDU2_L_e&vHgu`z8y{i}mR@Dtq-?NB4@;L4anB(GUcS_Ni7`^1EoWEQMTLS74SQh5_q z``~k+0Hk^DHh?!(wFYSk2L`2l0gj)~UQ#e3YOOwdv592lx~(nv*H=TbNIVOiF&15V zuA*$jP+)FjyXZB3W!Ie}q1D_GIVo%>RVov;Z}_$A4Ijh7Z^$?)@6K z#idR(AQY$DGEFbaDreK8Y;kA>3~55^_BE+r)ikQiPEONV?fm5f<1~c`SeV&P0M_`N zyeipJ;vhFJm0-YLKImFu;ewTSz*Nk*wrZ^QrwaYBm#XI^>zR0ypk*6w&^RN=tnpDu z!H2th^_lb+)oXi1Q?f!hbe_# ziM|t6JsD@AB{ZG7be~!t;7lh37t_M|pN*7&okYZr2{pj&vj->+U%>yAmQ8?Ui7(BL z9S7O->?P9Vr5Jhf&w==@bg}^+xhiP3VUb5) z+$wXn5nB|J-Q&S$kGLP0iC}&@9+2g!@1|hbW+`M{tSxQFWaW|(FNv>QdGX2Q?l2sb z1E?vjvAYxDBCm(hzf)4&fHk_}(y)zIbI*2G!{Bo&t zg6hT76-)8MqNo~Mr-K|5U|ky`8ep;mwCfHA1|l=Xj~5wFeqq2#W1L;7w8lDLXvSk1 z@Be8bB{0Vj|1--gIPa@h_LRsxqU+CTke=RuxjofHX*N0vh`%f~ztg-_Z#mD0sSw6m zb;22tGUA=8fn#l_q5s1IevEurPp(xiB!PtuIrX13Cbm0at%mO49}L4Q)lD5}wl};C zz{PM65|g^QP%?Uza6eu4fc)^RNT{bZH;%M%)AxX` zzy~aFQ0CNnNF1CJHT8+-DV+2k*9x%z;qTJl@rJs5HztzN;aY+qo2>&TNiLSik)+1l zC&pi3Mb;novlLy{#XuceK>>#x>D)?9eQ>rUJkhYr4LbzvARtpg*Hkb#RXLh9`IXwG zo1m$|skZO7w$ZQGbn#xBZFt5{N1GkWAbq0+asmd375>vm^|OQ96~WSk;j7$%J;|q$ zLPp~vU~YZ;Rb|G2QxT;8Y!5Z(g38Gyg0?5)6JroTH7D7BT8jOS$wBA3pS^?k8v(n8 zc*?nTa|As(GV%G?)lAy+axtYzFdRZ%ySijui7!?fxzD+-sd+c>*512piJC7XNO>x$ zTvM@2xjzgloZ6JQPww;MP>!V#w2^TWs7hMDs1RMwUw>zB&+0Yp$!^WEsDZ-z%*gQy zw7yheX)c}hD#tUFoI+24^#!g)L2x)Z*)}>YEjj~Y^16D`K|feY!>Lk29FJej;P3xPkj#b>2Oy6A2gQQWZ^ zo|Kp3E~@fhhQ@0&FCPiH%)))0@##SXW#q;kN7fC_gts(4XGK~*%#I$27RBhlHUpTO{#v+Lp1gSC+4eH z(Ky*Okql%>K*Mh845zReLoJdC-@+-`sI8FMlxC!D|D}2cZSv*Mi8tx=Xr3dKm_e(F znZfI^xd6NQqnvZh7yh6-$Kj3kmt${#$Z%BE?woYL_8+*N%PL^9E!h+>Tb#lUAOx?= z)I0S1cq^ufFn00+Ve+Y_u1f=J(QBqw*Bh| zK-Oj+=*Q821K0l8Za9($76$HUK}EM$9^#j%#>Nsf=FuE}3FEB>WcrLezBR-3EVR%w zqA&jp1EOdq*CFVU-5aoLhG_DRe2zP!%cIs~%_-G5cocQ=Ai!pJ%4&P`gt(vdS&&c9GKvXPAS;^yU6CFU(||GCUw+*T|Z~WHR`H3pqPcXh}gQ)CF?DJSzh`}L#32& z2BC9WH=I{mY%VXWfQp7`ra~Hq+x##FpUfKfA{lcbW(}8!(xkRNp|3@$BL&XXwZ@7{ zw@cSU&dkEmgci>DFWx9xpml%yyPfYZ8u5~x8ixexU&$X1a0kk$PVPsY@Jc^O)f~C_ zYX8>dZ?Q;)jD~1|o;QmNE9hFs$|ur7XjqX>5mEv`==wJMI4!vLEc_h-lkIHS-TOU? zdgA#S|KCM%h8*is8Ndk~iJY4JnCN)|0HC%+?4(xIwRz{w0ANEomGyjFy?(CZ$l&FRnb}-Biple1|J0z5sAaWg$zy!~ ze)$C;K?O(2DFuwO1V%>*pm*j9aD~s>RjmN{m>} zRPSq}*$?J?w%6!6Xd-u?{nh55A^By1Z*Y{U0~*0dDM!?fA7tJ-p{Ok*A6s^cj#?tG z!r7agDMG#u7nU?XTg3Wa)^sezXAoH}CS!8hH~~fZ;-Y-VA^*R@<+TEG+4bujj;_!Y z;dqL`90c=Y2~6f(NQECn)=FrLjTFuD5f$3(gq3g!I&EVXW`48YEf6a0&Khu6c9*2vB@CcjL0tCzvPG-NqH*iyHaD$d{%JXYJU90sY&d!KCe<8$M++w*7(JneW+fq!O z@ImCeUg%W5x`I><9TUwE2Q~O&hK$>02(>m_q1aJ1V8t+Z3A%aj4!dpCi8m%%U8FH~ z7LH>q@gS=lFd(E{C}D&S^{P4F{kM>HRjvw`B9VRFKTN+ThJ%!gtITligscA6YCI&B zior=#b!L#oE6NmO0~g7i>tcm}e>D!RTnPz^flXJO)FOM?$w%k@96%0cXgVcSAS7~j7MS# z(-#t$PcPhTJYYcq)8(Agw5zZXf{2Fb>qH?qQ$k=;Cd1tCYQly?p9S{{9W?Q^e=`s0 z+*B$1{#@XPM^+#^o8}l#|E}n{XdjiO$tRCIao^Tsa1*QpK> zMa*}Wk5&pG-Z^94A%SU~z}k3kv?p$zoUp0$sX)*9j(Jt^py*sdv~r*ggH~o@?hld* zu78i5*v%!z4v#gx46wI-HuV+Q_Jgyc))1l~J8RA^ZO&4taon(`?206+Oy^_NoIE zX0)1S{YzBRqDq&3=u?nXax>#0i+2dfq7DceXoa3&%oNt5Q@S=)@-&xtrF&cdgxM49y~Ws2qdcHcf4p`Yr5wK)76hy9NcvB*Y2 zbW>?6!zErncMh(5&A^`aZZVpdg3mL3^dg3uJ}%Kd`ZE*mE~-Y|zzkz1w-$|ACzpTg zKjMLHXJkI|`PI$HW!c(bsrQ#PI`fr^F!xLQ`jzm`$=Ie41xM7BA4DBZ*9ixKf%yR} zu~>WSm6H^+7bNfk$S-R^NVbnFc@|Tc_msVzDziohUB`P=B;IIf^j$cBn3m3*i53sY zyVOTsRAS*n_Sg~27hIoRK*EcuVc~+8q|?wqhnVo6;vhZglDt!a-sj{e`{R8ef!}$A z8&zFU$`5tZriCTv!l$^O_g24MXqQh9r3yA~-GZ46GTsxJtIzwB`_7!9zd*uxhr{Ax zuP`z6eCemD!*s~yEk>8jsv{KjFshOjcsYS!DG$J$ElP4UA?H#=ny={(l51vqVxxJ) z(h3Ub?%!nkH?EH-PlISkh6Tvt!JK)l#}#Wi9-u=dlqSaa|*?NGHTB&Vd`_xcKKNx!+;j+UxE8bRjdx0pt-lm8uFI=$nV;?in8_`Z zYY+FZEeKXM%D7;^xK@-c`tjLHUjRx>boiIr4E+%de_m=R*~@aXfrwx4zQT5wfL*VcAm-qB@jV zS>}3|+grZ=V1aQRsl#-mgLH7ooCQ_syuejEHyAXIX&_#V0ZL=|XWM8oCcY2DUmSpj z*^URe#o$;w;UGLyqJ>6cktqr-a)DF9j(V7@$}ScD6ohs1Olq=4W%sY+gdbI_ZKB&r zS7yWvP;7!Z>W*J7(m{ddRIW-@^_g$Gdg3N=niiFPD>c8`j#s-A52K)m9FTdhmg#S= z6F^tG(Dz|w~v(C z)B%h@i(y9jbW0h`{SFYL15jWwLR~48=At7}O#Fqzvo)NPc^=z9SnH~7=sZ9K zS%`NRWzUhmKgjXZ&u;nR?Ejs@-}FPLqPr=Ux%#Ej*J*^9H<)0Q=0aL}5qg2iR61tk zMaXlOMS^~X_}&@JS71^uqX|GTo;Up2kWgB;V^eqc-QE&uf#=vVK;X#?W8|0&0Q^F{ zLA<)eV1+9K(8fuN?@@~souNjJ*w2^e*)0pfO?Dk8LHK z+S*^v*lR15kq{v>%f|&kS#VRic;CHEJ_kU8&qY89n)iZJSfE+0a)9Fd_v%h}PeFkW zyF5|@aIYU22mNgpi5N1t6d$|=dU7J(e0n%>3V_A;+hYHHLz0P_RkRRiU5g|`{5tKp zaJ;WwUo8l~7iRuK(gAom_v20B&Cl0uUxLznD>V$fM>sVTvA{L?f}SPYE)K%Hh^6`%z`1jyw9MXwft zI{t@hlI!TRa?sdr6CeUq#P@#rCEUdrBKshqQ-b^bEP@$S6YxtI1U27f69y>`FVJr2 ze?$(XSgJVc7AjkWem{cr+;yN&-AbBGMux)qhtqTxQ+J-@h8f!~v=D2V_Ir&c07L6NLx2i<95tK7Nd>p<8X~e!tOuuQ34)EoG}z9dqK)P&qJ})+Ht}7~ z1R_WL5i3>mlGdH@+Kh&e5*Rl{!_b$*9809fagfl30U=3GcBiS&MlRT-_3nskzhTWG z9<#~sQ@&n}UZ)OI+wXm_n!dwj(-lsF>uE3|g8F*%kRJe^z`OqP&{+YPizn##hfECRyBeFO66F0EBPeAp<3Q~PE z4&bxLFPN_2ZF`Y?c;L_y~GGct81493Gd z0rzP~a=v58Ir&+0pH;7_rkTN+Y>;XB6GmyPw z@Guqk3YsBo=-F>CHku}h1xF2 z+<~#%`~ouiO<>3f`!qvLo%ndU05SK$;zZ}K+$}!<(n#E}?^qIboCmxN|NJWLjnkIA z))Y&})_CB7pd?7KbL)L+bHci1IHS(h4b-iKTmUDEe&zWaF?bA?e<=AQ9YxB*+7Bmf@w-2LuRFkxyjn&XG5QY-tac?4NVY-UnDrbhAS8;oDc< z59aKzj$>@{e~PMH6&d3XogNIXH_g4I>Zqef4HrJfEE{KYGMG19mH6l?r{i*Y?RNUl zGYgmgob4VxXye1AT~C~=ckZ6`xcZI{vj@4-(B*uiFBuZC0KvAeSb@3)jh+#SW3E99 zLmqoWE?jZ?uhWdosQ+x)|Ku}dIf}Z$P1DsMVlQrB<3Da$fNCb;q;zIvj%#LuKh&-C zCSTv@q~u9&N`CSkX$+goz0j}K^rD2;-;F>)@f7(F63E33WFVL~NMT`K_tX}PBhww&E`I>0A|SD4XbW#ny1QcuWyQnvIznG00*ZH*aXXXzO0)X+X@s)3atfdq0#3 z!SIO*p@5lqqs?5fNWP)G9Ku_KOr@vocSS{PzQ}@|s(i1gCW}IqxsAKuEOz_fXFIJ2 zp<#l_$a4x9zGS3F=VAyau&WP?N(nH(TOqfbP`yvd>&PtOj;#U+0`2v%m5>sfh;QdgM}7eVnqU@tPFnvt zNNC=&QKJZ1ljA)I*}uW-zJ-~4!Ond~jl~J|*}e+(4iN*f4}}eKZF34UC#{p$vE2*P zaYr4PU7mNdI8T`>Zt=MB=HJ8p8P-RRtq&-Lz7Es_U9mU;=@ANJx~|2Z&}3a|cAu#& z0)wi*^SES}MJjEu zY3$hDnk#qRuLjg6XxUIO^V}L4;eYs7bav(pi`J*P5KeV%=DiCQap2zlnF;xIB_#f# zu4J5O=+=%xvWSJghUv)%#4YzQu^%^Odv5)k8`k zomPmnPy4~fU=mkk!twoH+|p!0nZ=!d!-PAr?ZJq~Df`KU9|6NRj-bSv&KHHAC|4Kq2WORwU!L0lVN} zkRAaU)(VloT)+?;FCF`wqx=5lk-$xQ*ZP9D9r1UivbKg91GrGozl-t=mPy00VvQC+ zZfJAGHlbHio8OEnPQOB8WE@%qpCq-L{&;Co^}CmWYum$p)8V++5Uy*=X^Qv5=Bb# zZ-QQKHQwto9)cD{kidE;0{)M^ul|bi`@+RSlt!e7Mna@JmF{lo4naz~M7leq8M;H1 zkdW?f>5>wp8}1q4^Syt=UF-UjOJUx5&)L17{p_rx?j;_szwRi(I_X}Cw8!xK7hyKK zBT(7>`E9)ys%{U}mTSb&nD1Y=Q@BA{%qS9My!9IapPo67a0%^qqI4~C(;}~=4G*L6 zm*Ud>Rk3`+Q}=>isPga-rtI>THK$2L4p!rKT(+xbhVBj9sroQ5)Fy!a-2-s0C2WemKp=J9fP1{ zPL#jY_fp{Uq%R{2fHE=S#}^yoRy2+LL6Hm0ipF;a*t}E3T{mevXixm_6gbgxISr}* z6o+(v;3D5YtbQM0SRoj7f#S-s%!1a~J}TW$He@g!W5YR+v4zTe|N05|)4zVYvjlDA zp(k7nc07)=`HV9~(&a81poJi_XKiU)5=a=zW+}^zTlC;Q({H*g=lMu+ZblQ#{Ym(z zlz*@D!(hn(HSk-Mm117+0;TrQM0=QUwuVgS&AL!G8lm@(!g(I&{CZiSyPyZa+1(RR z#BHO_djKm>gjL|yoP+;uHC8pko-xiAH~2q1`J=SBRJ=6UVdc%k(S z%$uFIK0@UozBPUT)Bf^Xog`z)JJYGZ@}^CgtlQZ=Wsm5-SkMTnK{2Jty_m#Hi)~T_ zuxVP;6mHTihDhWS&{{m{p0ceYg-M7c1B%&ONDIh@K2BAvg3xIVWQQvCut`}|js>{A zKTE;%e5)~vx9J)jd^p8>y|GeZuI$bRB~him1*$-Rc>HUGf&@uhMIR1)VB%K2oav8& z78;(8UU`=X%HEK4B^S0{l*168126HRc}aJp@R#1 z43H=x2ceX*22k7F;MRoxPF=+N{Y+9dPQYzcoR$MLUdv?{!)Etxom*YS~9xQqG zTxR!xR^X5Q22mI9;xpMiYz~kUz{o3M?*b#2^gN@#G3xuu3UD8uPVKlRu+hb_IdH18 zFl5gO2pwT`(0@`KwJAgkHbJnBKUNR$4!5+Xpp7F6NGcCNzX*T^ZU^4skZ_{c&@j00 zoVL6s$G8l&D+J*;xygae4_cKh){Q#oIA9vV6`pGwx4Mhjo zoPQuA#xGU1UZ6oIH${sd_ldmKHoI{7(9{!`eo&s1B6IKVp@d z26o6FI1~2U_46&1)GeAAv3{R@trx)m|V^braOmC1AClt2fbQfH#a7M(@5M2~K&3v4h}6 z4ZJ95Q}XY_8oEIGIYB{#5Trsd><egx>8x%<;5?4w;-^Zy*XJ`$~amexGmfCc*a zvG&OzjlS8ZzlmC*rXjNe6(dRd`a^(|n+NRIpyZ(K9175fH>at)XQ@EsPJm)u!75|U z5noWa@`eduzdYz&L4PLYXh?Zmyi|^4_=p z`h3d~C>5YcjmpiV#R59l0m?yCx8I&kN|5P-VeqURyCT^K$<$y#_}mVcfU(EPsLyG<%gwHGoICuTnoI#=HyUob+&AvY8>?+op^>^XLRD z%WxiO?9xOjop0U&6Nm+?9n{Som5jFooAL9k?<1C%++D1ICh{@IK%KQCfU^q)H)c0t zrsYU)R?u!IbUDBOH3tpsr5_6Q=PCYl|1R$2^3|Q<^G3NxJN#lnhN+= z^K-FHymiwhkAOtc)CgA4pw180ik2Ir6K$lC|9+(RNAH5<4xSAM*PbQ0jz&LKJ|p?* zaX07>ezEN{iL_6AaUgqwb0UZp{ny`T;r3SGOe07$1b-g-TAX(*MTHg}qmG_PQd3hgsEl30}TlhM=|Xy(3@Ut0gD5-i!0|CN0U6*ud@I0BBGcq1rFK*OJ`?WI3+ix%*k%erY|94a_ zq>&pDI8&cD5~8G>#ZYBca9feEDfDt_MJFCT>42?N08YT_yt7juHX65r>x-}a}<@7>8&2$|yZDJ9qWL{35FNOoruS*(XD_I@CY zq1lRyd|3hFu}I>-AHhjiJ#+(AQdlD45P2m3K&;QS1T1KS$zXce2$_uFt1>Y)>!8c^u+xawFo9X7s3SJp z!~>V$VZ_s&+j(j@>}@m1T#uO#zl}-+#KtgjZWtkVx;kPY?$hQs|Aoo#mPv3cpX+Xc z8cp$8g`a$4uv93erQ3zV)j5{uK5Gl)GB1#DB&0n&TiCfhEQI!tRVZEity6jCx|d+&%!VOb(M(YPEaX(}5?*kNqJ!rc0Krg#V2~w6L|3!h#XK z>l7>yf>GVWmVv*Y+mDNu<*S*tJzI@;ZQ}&haMz!Jks8qIrW3_|-`j(-EupYJ~1^Aa?gD_6Okqi5SmBwQR zA$eIl_77rbqIM1q?(+iXJzmqci+gS_>=s1~D8?`Bz)pqqFDSJDNd|-O!(vzfsM-a+ zqYyA1pmPR%(wo%F@sC&IFkCr|m76lzx)}yra{Ftc0}Bu4z%mlmI#``={w!raGWJ7o z+IfE3bhXVgqV_*fIIGrG+5^l812BlPDn5HLsKo)_<#9FPc?Ag8T|k{s>t$Yn+x&_9 zJlH_9ZSHz>47d_L(mXi;v>D4Q(Xu7pGvE%v4fFsACYQRnBq&CnMFNc4_v!sMdXMsH zn5R;1yM}QCflHPjE2r7c8-lU^+`{0254-{uVV}EWL5j-gLiy#0l$5a*{tcG^z~P(^ zlIAs$k6w4|oi2x`0S6WGugtKP3b~hpnpA-Lk6Cd<)R-7#(FY5d)I)PMzyjo!j`b2Jno4m@b!z8WxD3KK1vll`Og{v?imDyE)?9UU^0ae zAPbczb9w)oDW{b-UY{5IKm{Q*2vKT4DAaIswOfi(RsbuW!+H}FrT>B(PlLzeP~F!B zVGHd+3UbqNb4sMVC=sJXcP}aM18_$E3*1;i&B$Hi-MM*g8Q$nb#qk! zE%*_1<-ney%TZ9yjEeu6HLctg17Z=Lo3jBJhVu&6GKHbXF?#`{htg4&0?Gdj0NsEd z`uv}MiOXnZC-}b@5ra1Ny8|)a%lm-&2X7Lv{u@2NMI}z}gFb{xDXhu5c?1Ja!kRJV z9fXD5nl^1O8@vt1mm!$$gngvWE%0E890vN7m?fX4I zL3Nqbc$QS~Cw7#9_K*BjVlK}rb?j_J?3T@XhW{Mc$Z_-#M$S~97o=R9WlIE86Gu>A zS1!Ged>-V73oG`7HF3>;_1;x0w$~Du_+bG9P z#$^?P{~!z`U=_eGqRU^U?td*{88Ud_KNyu1$h%zU!OYcPaEiB6L_nEggF1k2Y8s%; zVS_rLBfEhCr13X48f+5)EYJk;@z3)USab~flcKJL;WIZEo;SNNLZiMHHLz|caJFEt z$pqPLGXtrUsuHSz0}Tb|S*-tknhPWcAFCJrq5Ft1mz14!GC$#nyU=n|k_j|!TA zo(=$C1$vFMKmuT0UD&9`C>akpV!+6C{nxR6OH284w@wI~%Fy*8Xi8&yEMmj1NySh9 z+aAnlW&&mz`ogd!SZ|a$buVP|=$k|eZ0!XMbp3j9A7)%ZwStk{<<2nDa(%84{8=Qp zy@a3TRD^K{e>NBbtCJECdB7OX<;)*G)h=Hcm>nkWFbCoZ+k4O+iVx;b25t`cZw_Fd zh1FtQ31#USkSp*u#x}Y@rHj8cgT$v1w2olZP_e9eY{12Z!IE7-dQ%T@)L@PX%ooHC z0cI*NVRU(O-FQ=aZm(>$s$A-#d~^(h7QpD)V08=FZXlonCs%DcmueC1S$YZ^ zf`d3rW|&(5d2|MiwT2NHZspQKCgm;~v6sgn|IF70jnV6Q(Vnl~h$G~9uVDrk)MQ9* z&y9gRGc_LF6x8&d7j|F2OFdBN(I53MId~Wj;&C z?q&b(W&6j=b}-Sh2)yJ1h*2t5ax3s-E%S>yfOk8Fu}1BqcmhXRtO>>R^SaQdfE7`) zGw%vhSdS%bMT4!UB19C4xv^qey`f8`*PEr_3LKS0mZd+sC}!iJfYuSv{4P^)9W_jU9o4N?_Q-Ek+%t=O}RW_ql{zuFgCORk*PKOZM9m2ApodH^R21 z74A&JXTL*`k{AZom;1z@Ou=r(T_v@QaBzJRX2@Iq2@jK5O|9}K26 z;iz7TE+gKer(O@t7D+fj-G>a$`93D~@&PmD;<2KU9-OH0Y)ow55u6ahV9hfiZM_Pg z3I6v%Dr2>cx#G|M^(^FxWPrc}-75>04H({6i_@}{2%|vaaI+*B*X(}E zD{KU$+XXa70S}+e1F=?sK@p$7{c2t{FZc?Dqh!Ss1>yb9OtA$#o%mllfck|i*b$Ua z_;622hX{NL*s#;RlhF0abqbMu{Y8SnF3F_=?Y!l^b!WGax4EVUXIKZ3ryHpJC7}Gv zJpZaz*$jMXXUi=W7o4tqfHKH1C`%4Wh)A>F7SQ=2pr|LRG!5RFbvPAftyPjo6@-54 zfxiPV4wDx!7$f)5iT7KeZ6iKE^3 zhv1qB#GpLJu}5`l|0bt?A_JiR-8H}=d9wt&PzkI%t}3Hx^M?O@exH`Z=~k~}9YxIS z7>qyK@J%q7niKxtX9?(A6GaJmhCHfyne-=!;CEfX!u_YI3AhXsRR*9K*-HH1M;Ejd z@#l~q6aV@}z!m)8Pr|Xf=YBSQUxEFJ}+5` zjNjEtVWdr8{`)X5->3J9HxSu-4FKN=>mK_C{z}VpUo!{QGN=FYYPhn0|E1w@x{LpN zZd3FB|6p)rus{FL9L3bTyDzNr)JRyLRNIHnZmx7yEWwO-Ahi-t-9l>OsrBAeL$5y$;zit=iq&GAE?(AaeB(9^Nsa ze4TYoc=bRK?%t%6+fzniw*N5G)#b+4mvJTK9A5WkyfDxteD*N${%g?UC`Lxk>M#&% zNfgDiPJ89O&l5+h;3s~1_jX>t^wdxU70mpNaFi+#LvEf=T2(K?S1J8)P&sRDAJ~??Hajy)#8Oa(L+;U03--e^Fy~SxVCy)qg z?fV+dCr5bCmhMH6HPEwwOBs=h#EHY$*B*enRs(nU4C1KB9i?H;@I^1mo;1i6(Q5IxviPCe^ZW1mTO7(v9&N2#^h8o{b4;{&@dbrTI*;GI z;;WF&cDjFi@3o&fp9)j~0WHRxmJ&j*>N0_7eVMJA&WrT0UUL3o(IPlN=VOd)MQ< zuCmwUczAypSh10#Z%yF59#Px!>Kj)raPQxl6EEKkE0$I*hID4Qbm^H96@eBi_oo$P zFYitVhmK^+lpLR$VFgZ2nOvj4g;L7>3Wab8FhH%ErOC0#W$N<+ zOw+s!o%j#QFWIf_;o)crrrbMd;vsi05|BCXp9(gI>6(eHa1$7Id|R;Xxqp<;0^^kr z3o;xWcg9w%OR*AH*S4C($lV9RQMx30cn^VnN&i;DnzaoA)A;Uv#S0HaUs6^$xZ&lr znMD;SYpBuCpRzk)NtfnTZ`m)jTKL#3hMa(UM2VH_ZDJ?TcuMK$#2b+vH&t$Z!geR3 z-z zCq%Tu@1!&b$rUT1ws~EYg*LPU#Fk#H(yVDtLDP8swD|IXx;@o+dJGqJ`YXpy!jm*W1A z;(OR{NiWk{%Yl$j)Y48_++x`+c@x> zi?#)5Exp(?9Zj7K{@IBe(YqLT@dsA;d8Jl#Nzt!r{cC%oncwrui|3`bz3gw*BD^F+Y8|R&bd1ZW=PGg0=>&UwK2`=MN*=c%Rirp{NSEpB}H;-$?`fuR}d5 zr%;j+=|M5OxTp5T)s`xhb{aaPZ~d~uRZ5CC(3wr`({sHSLgco-k*ED4h8GpYSgzkl!xwpFGr#q>zBmUF?-xxqi+{2Y_SI0DiF^GRK zPP7r@zh24n4`OpFtIG&hPB=V7ynWwv{>}*;6!lk0hwksHALyPMzBg_u>^r4JHLl9~ z1+WD@T#%6)i5aojGk&TkuK)f!nfkekeOVN$b9eyM>s^qAGNKJ@d-GyS1 zKhAZ3`kD)@Ym!R@p?oE9s+@>N+$8KFw$QG!>O5CP#_mV+=)NA>L3a6f8AQaFAq;${ z&{Xl70FmPt1F=Uf#MDK(6%%%Ui4~D3a9(b02)kjHm+wJrs^5%d(EHw+7BN5f4Y{8p z=Cx*cpI3NS3s1Z?Dk%wM`^%OS{&(pmq<_->OU$8zNOo$)~+ zpT)qxG`AoP9eQiRF`|G|+_G$}WjY#PY9JVAv7KT^JraP4nzH-WVZFTc{to~7QLwo* zbrB_sdpg9gxMVO)J3;I`U&r-_?o9sDQ1l5rpzO6S#+GtyyNG+?%Q%CZd>z&r*!kTV$;SP(FKM&X3R}LXIU66#Z zSIqanJE)%+)XWn@oMR_zc&%WdM;F>((RTn>UHY`s>(BK1KA)i;6K2$TSmz1~6Za_Q ztu^;z<9SKJDGzKHt+e0<)7rS1)gnc^n~m!zQ86y=a{SRlL4qce1IRmO^#};rova$r zN`634l)nt<9u;%Idg{&@^Fr!;i}42yj&%($$O~2lavyysvn4-86>X}36w+7T^hhZ{cNh4QZ8+ikc-XGKI*yXLivBGI7WKzEfFU zR(*MVC*-HwuVbmy+gU=dRr=IUlfq&!m=Q1FUed>iCU&_X*;q-!&o5Se=uqGfx|6WN z;Pt1_1=bI*W9`N5`r&QXwhE2K)aHV?5v@z#w0C5D8mnMxd}r{sPSBP#u~^j6sz*0Q zG$Jn`c*q^IXSnnJMW1I9g;W5$^7?nSPATKf$ehMgd)8GWq{8>`;(C8gOGWjgsn=$& z!kCLK`+j?^d?SQkWkizn-A1^JTqRMc@%4Jm;Jdv-MB=tXNam!SFAV!rtv|Y&@%hI+ zvXNvf$C6+X`D^hKnZDvvL0w#jW~^vXB5g*6fsORjTN4rYqUSVOnN8_29d_*kxZW01 z@-6?5ui9u{`XrX8DUTTqYjNJ#6xCcNABsLFNk`_q!3FC#LS2Sa09 ztS&Kl2kdwx(N;yhXLDUfj1}~$&+F6c9r}7^@gkgifw#Y_1zhHg5M2d@le%9>%$HAA z7;Fr4-O5WDc|^rx@QG~(;%nB571Q1WWAQ-;3(LquYhFLikw49dCH{g3-@S$?ofq$mE^rSzvfprAF-;q(1!S4>7l&@%`f`rAE*&)7f4faz8UdF{z4$k|4%eVT>ivVH=Qq z+@ZJ@5+R&kxC&T0Jv?u*|tCS-(NA0_pC=y2L(k2V3f5&); zu|?=nq5A2KJ5Rr7y~j4Fc04dYOFj~q>>>!k8j^P1OZzumdL$OJBrm(OuI11Q`C_Nh z@%GhSRHOTgf%o`j)zArf%$XQ+@$Y^8CK18J7{+v0Y`b!*YR&vbo_*!mJ#=&4eFEj@ z^Fv>|NZnt4pee&y)y)YDRW-`4uMuyAZkK zHD9S{`eTi7Z46$FHOJmX#&7*Kxaddc>~{x?!__OoXt2+xg+-!HwmK92vmQmZFX2ER zR}JZ3oAtoq4Q5PJ)f*;C7azPw!d?xOELEL11{#NUOqzavkK8JZX=@*C9#B(#4t62${#6E#62zOU{3bbDST1`e z=k7fO$(N?6dUjd&|5(t*jNs*(R*zNFhiDJabw)Od|fm(tSGfu zb$pLAyhm|(W?0YrhDXq#=oTiLIFpd#L+k=0A(hJF1neC)r&UrmdZUxt{t>T3BVN++ z{Q%|{;}O^L7qO5G|6OCTs9x>cWUnbXe?U>Ltai*V<(F%yzO}o3lE~nnXlXwi?AO@H z`Srruv|PR|Il~{`uBG$4loN8T>ha8RFfU?!Vl?z`+~};4xzp`6cy)X*+h~O}X3uiri0$<{#hDzRR~vkNbnl(hms)Z?S97G1kOr9N%BMR$RQG{i*Q&_;FU^jVbF@<6skvV;e>~xj(u8_3%@1*9ZXzq<(u2DXsjZJ5e_@JfHA*QYd0+=rL{4{^BLyGYa+G9I! zG0!<)+0~z6|B23Zb1IHX4eu&{f8a*Eh1o%OxcM%qJ>2FgUi7>6CsAolNYsR>H5l)L znhClbQ6!JQp$w$fP}&!{QQk(E#E4R2>Vx@IkHp6RNsgeYBjsmw_n2C)N9wtC_WCtX zcl`2Dtaj*qWm>e{c#RoYlfri>I^hzdwH2x5Om2h1TRMXd@T-m*qAnxy48pLQWz>uE zkoAguWNteJ1T8F5bux4HkqCIG=`6gj*u10DuARACT^Tvi>4$1Jaw%@)$dNEr#2Z3# z%c_L$@$a1t4PB58X-pLSacmjq6)%D z+7qO|e%Z5rX0ks`|AD$Sq(oTtNW7-nSm0)Xg!^1_D{uZ8?l2dR%U!|Xqe}6#b?lSi zE!O>kXErJQFXjY@uU1X7f(twcKWMC-cR@xcMEFxS#G#mHTtg@+$0Vh*F4O~R?kbY0 z6g&##j@4aZJ{oOgBD}?91KTeZ`EUL0LWjNAwDG4rWW)m%e7k)-8D=@ZHP-WE2j=vf;GhIYRWQCSjTAAb%^V6qNgOdk+H-1Q;7L+}Kh8E-HfR7-7a3RSW#~W$Nn0(**S(`BaJ)y? z4aUVac~%Lcv%X|u8V*YB{iPj@4?cTD)}Mt*QInIKWlyBFgT^61GX0{XR|UiPSh^d$O^qsCyGBy5IId7eJm#V zFHSXNk{zAT_~Y?Y`P|UM;WCr4>?HXL^I6GJoLZvH8PTFsgn@mrZEl6Gu!a6SLBCpr ziD$I#31NFT@Mp=-Zx7a|n7lRu8a9d;&_8A&#Hy`UN22$J93&V#C*;khn2U@RTOrA) zF?}68Z^jlFLJuE?S-+JL`okyCDk@jv=eioVi>A|qHn!+MobC232Ev>D$&dwtGHZIP zXli3css35CKGU7^)w348?CNAjIewlY)dZpI{6Fw;zxMYh>?lTm-Fb`@gTMA zBAP0Bu$tM>B)uaBIeG#CulM~U?npIrqb0wgwo*?CQcONf9oyP zLQm;`kO23F)odZ=a)lOK8mV9|_MuuXUw-Rte>;Kyd0&OydDdC@_^WTx)DnW~7j$y^ zrwkS+0el*chNc=d!td!`7qdKnCU%G*PuQRM?m+`tVmu*!w9|qm`ICs8tp2}C$$g*kZ|Ioq=5K9`+=={1 z?Hq`>+K6XSTyvd-l>U7ci&Aii=`!@UlhqJSu@zR39g(lPJ1!3u@o_(QxHNSJdz($= z50x$Zc+}CXZUufhW`>M-yqh7-j(@77v-NMh-Pba(W5i!nB9G{If3||6Df>>sB85eeKQAvOM@CDt>IA02k2 z>J=iUIU*ABi<)IRPtz9VP){p}5kD_uL+RWT|W)Q-^ zG|f&YB*7cjdAAT(HH|nv8v`$kfa8kpcDbMJno+D8CX>Z;&A7;@@$%TXzKQ|Lzm7*T zd7p6hOXq+5Fs2oB{D7MdeLDVVFxyFpesR&9Y%Ow%5zt!4jx(~1WE9+5bTt9*xZh>F zgeV)M?GLj*APrd@QnR-1GK^p%?Nc{YZz5&)sC5q=n3CQctF||m;v=}_32_8Ah-2>d z%!N~6YgICMsMC*dsTCh}rt=gP#<`rLpyJDatk;=hlp0wq<@_3Zdn!Hcwgck08sqIh zRi;d{Fs0ya(_t3J z8~d`mvbu6MZH-kR>5Cn97V&KIZoH`xq*kYm@1ictH=gAV*wtFxrO;rbjNP~`%+fyF zYz-CS(``U97wA6ZF;T?VC?z2z^R#2&zH$w{&K7}(F2)%Bwb&qeWN}PWbL0pboK|}q9jQ6RIWZ1p ziQ6Qt zFGqMK^}(jQQjCT>hwklfO+dn4RldDGVlPB_XUMS9%3y>0(6YxL13!U6HeR(O%am!8*w5#&PUzkh&KC>K(PN;J}m?} z*Y<%K#QiJEjpBQD$d2Nj`waH?T=MJvG`ZSsJ?iIgl<=`zM6*GJUz@COw3FeaRi6dE z!rRZ*ylWUKBQ~meZ}NHK2n8bp7v9r@%-7}Bsw#>3Ac~1Vw|>?KBvzdk%Fm?IIU==5b%U0sZ!(8& zI?T|u{76EZv*&pwf;x?VUSmKs%D(lWx9oi8BN6@-+A~)ynzx%!xBZWLWu16?Ur6iC zI~o7*4XP^UjP~){M7E6Kl>QahI>}&wav|(`o{b|P?cvD}H&-`?ONG`BODCzdh``=Vwk)_+C+&!FfxD34VaX&@M?jhqen)XXI9ZD#OhwEvY5p) z=s)qJ6}hn=q3-6x;N5;mDr)P`T1m!NOlBY>`rF>n{a^Q?+Gg=>3gjnKV-L<$+S1U} z{F)k{W7guU&uA}#Xcmii}qO*w}$w0(v3f5_Tg=2`C)J)=n;b?(O7`PUMfoQ)-ZiB?oye- z>14`0P{6m*lM-@9wlOdH?jx#MwB3b=l|Pg;w9YqTsLdr9A522Hf%D~B|AB0gYUOBc z_<4fjGT&Ocl_{v>+XeYk)Clfs_vE79*s<768xUw0ypqFIldKP{FGht70C zp1+8cb9kKdDS(wb6V0Z(<{vv`*&;p3-JrvPIT5D5D8N_jZ@Aa6&iajHcCwT;_8ow5i`~F}!Cqd?+Kc@j|50G|#Z6 zh4lgA*x%7_gjZDIUH*lsOOX_f2Ii#X11xbMVwW6wB@GQ;ae1t0q_+@0MS+BH5Y_Ws3@1xhRWtMR^Xn6`sMaVNToThYGln$JRf#68PqXN4CHYb zuqmyo8dl@EU{+M>hSp4_^DxOU$QP@AZF8K=E%!-6*(k|bH0P4AGgKXkd>7*ie_UK zF=v9laOc-%=jfY`wdlDIsqLgp+WFK8j2lq76Ty5QE(_j`$L`Iz>;`1t!DFwDH5>q$x zSO4(lhRHrwhlY+pIW7Dd2AESWezy(G z13l-Q?ACtqKrWV^kc0@4=UT5z7%%JnLi`WAe)?5!CN#N)4q6yXjF*LXU2QBfmh>yi zD6kbEx)WoN|Ldd>*nElr?qS0$@fo5rGmbP_eqXh z{yG&8v?dZ!HvCSAPBbSll-2H-WhyiFW%{Jq^p#}6siGsXzV_E|CL$fq_VUX-n`-~@a0;7Hg-n?bRf+ObBdf9w`j5ai{jTT$VoGQc*7?QH@(|r`CeRVQF zm}e&zkxsTO=T1{`JxMYz8%Ej?ZHcl?4rsO_<(+%oI-~?ZsVVwnjtw`bp+8MAbk3*a zO=c*yj5z){;8-wJRBhMJji$T}h1Q=P#e7B(XTZ)J^J^v0Ks9f1RocyG3mP?Vu^bv{ zc9*3qMSrRIYkgum_NIq|HAF;kDZE|W#EE@L^<9mV=*g$=$0T?iFLro3|9Vhv>aX)V zUN1ohjSRYtfG{;bLG9Hfw&sXjzKqn%EOYPTnsSq=n^RO-&D94`m=30$xcf?F-&1Nai)954T zww2NqPaTP*%z)lDS|hOkmN{o^w-fxyI!vrWSNbg^)-6&r5kYvsirKiamf*t_ix)L& z!I5PqR29qeuB9rOj*KjvOuQo^6c?hq)(_c z-!s*sX9q?!l?G?dipc+#mk3)4%ir#d9FH`A7|fQQVB~Y`!20Cdgvt-)+tMQOYe|MT zMqzde3MQ7FJfnWH5cVo`HJxm>Ag5B2Dz{K;`Apq!MIwyXef&wI*4NgxPd~PzBJCD4 z{}dKkqfZ*P4B(=%n5lCaN=4hv%_G-1%=l+fbz%9tc<}@8WsK<12bN|>%)ju56=YNm z1@*=nqHdEV@07AXIdw7>CzN#}SPC9_?cK+GHEM@u)W_&m^*xK`EqqFZS~5EvG(xv8cKajlWQH5FXsYBI6NX55WKj! zhAcO+!kTOqCNhDLxV%d2g2w9*(uqM4>bxsUJ=$yt{|L<0KPXN@qQfm)lx zyEvbPM_sxi&)*BCjIjuC%d6oj#Q&v2l@I@fI8fbnzKWWQ%OH(uPxUn!o`>7f>EJwWA&o*Lz{cF z*Bx`ZCK6mi$I}GKaBgng3{+ z6i;A7XfhVj5#ol>tdUa!CidE%kxE>g%>-J5Ua??{kGkaR#hIWd&JjC53YgTkD^izY zLiM820T*g3LmGvWgBV#2lrxmVcLV3fv-=rs&eZF<9I~#_SeFjXwY#V?Dx>Vt^gO%Y zzdFY+&b*Y_PpjlP;H|AF<^}NQViD)%P(BBB$~_7Ygo3ucl{+=tST)^V z=R!1gB>~yD>RlS)(T)4>>ZNw?Y(-+^&qR5onc@~@6-Rd2A*!|hBD@LDH57O*ktJR? zlJPu&vRRd)9!M5K_dY-qoV^wS_c0cA-{?z!=hv`)yVv79(IG^A_BB>YiX&Tmm_Hl! z6HRF*e4}mYlk)*{))9S*$P&XP^t+e!b(y+BLAGG4`-`Y_bQc#Taa?po$xQm1VRg*U z#mHN(!_kH*X()7Krk4S>gn2xrN7*OqIzgE>outprtNAS@3cJ&2IDll#`BR#s*Ky*1FeHp zRx*-vD%75=NdVWa-@Ij=RmfX`O-Z{2s~d|ddP0nnwf%<6vq|%jix5pOjTa6a}WHv6H~lo$Y=D9N@#67?N%T>D?TybS7uF~weOQG!j&(-2$@bl zwG&KPLGfhIh=4?!Mv)goBlM3giO?mADe-iCY!p?czJp!xdA_&7olj+TuvN@~B7UHs z_w%Ynjo+e{nE7LVj;jI?6FF_D*d}ZHXC7rAy053gGy?iAt%Ku%ef!2g~VWl z@f_EP3!_haC@IYNre!H$%s9Y#?iQ^_?9--YZ$S6jid@Ueplj4`i!i)JNrako*`BL% z-{e=TcFWldBNU3jERiiuiYqtlzJ=5&+|)NNIR@nC4HB3ll++L5YuuM}RPB8;*FvgU z79dKm`Gk-V-MD-l*Y$>|=SQD@M|;=Mk}xwAs2>A4PmuUpo-@B>^p;BcaBn;IS7O-d z9md6rJ-BXNq(;+D!L|VT&vRea7!&E(3AEixop0K4$0mc*;;XE0_Q*H?!v%yy%dJtf z^1MoQdLG#SiB@pe1+hCTgp?^S3M{tp#T|Dvg-7z1KEye$;!j;;UeDnFwj{`<(^m<} z+=yi@tE-U9(k0)AB+n8VIcCa+c>qGbe83y8Gz(K@8o`g&f-juyMUvarw~|Uq9oE7N zRjoyBc33JUTZh~O=GCf{MJdTz|0ydvIi~NRx6V4|)fJ&|!%YpbKu9CaAmUP@vvL8= z_D+BgyEY?~aqhO@XRQzWQphz2dC2Jgz^W?a`%;Gq6(akOq8bE{a)>3_?z>uMO(YzV zk6JvYut>=AOOTcE8A7PfN8an>A`9;Mr&&yvV87?LuZ8d9lK#h4tXv@Lg0~Q{7{}!N zlaRA%AN|0GZfGHfig)mn`XV&`sf9KoClvcwGp&+ctC&Tpx43Y!CgbYhO7 z%JplvQRSripcys#Yb&2Z+sUgYFrw*8La8@`~jxUq3E73b>C zF!Az;6_k%t8KpB*BTSGb`!p742%Xs1M)eyVD%j@U*Y69 zjFY^W2x#Yz8Ik>1p+AXL^6Om7GOm;FMM??rc3JV9vHH`n6wz|wc*R1;m(si9+{Keq z^y(z*o{%*Z>>n1}7pH^c*11R(j~HP@i8kDnnAFHRLLl9|S2=XmI>vOJ?_?P4GhKTxX*&d70vMSBm?WpKI)24rE z&nnp3U1S#f6Q}#fB8|w2nb}VZh*I;&x=PF-buaa3_BV(=+~65&$ny8N^t+x~;120?jcTFaR75w#Cd z&Bk0pk>iW(u7FDcVVpoA8k6*MxMse^EwbP({)8F&Z`{_>^8*bVGU3s2`dT)#%)BfL z%W=Qxmcb7P12v|Xw*1QYdQzT8p?i2yGZv@Sj29Jnk0S7VRizE`O;Z+0n7Y>la2{dd z#)a#u*GfE9PJi6o%qX;Mpw=$b?c493&?=f=Jo{#Gv_x+_Fgm>K6y=j)_-U_yeEh+VvF03ejIrL=tGpS%#7gvIEh**>+k6>LwyVY386Su&BK!55 z`Hw{yJ|+15;;+w6l}(Jsk2GbO%2~k?!WxQTfw!2kO> zbVBoAG9INqEym%Y1WwuK6~^(=Z~To_II(hBs^TWbxDcxXp6m9bOpCzWW?L)A2|>iX z`XiH8hS8WLo(EFf#CQ94$Pt^F_E}uqF--;H>MBlSY`YHTPWdIzZR(v=nP>h1Y1ZM# z`t8kIFV0aUXU#UzD7?+>cGqM;tlJNj{fo!nl#M?aoR?vD*~ps)&oG@c-ZoWl#MVdgjSiLVB6iD-gSN6STdIh zDVNoNzU=wP2cDZ5lWf76ccybQ*KeqXJoIn7tC@-o zue+IG>73@fqAboVF#pZu)vPGQZXo=P^gL`xvTMX3YLpN8U0tGwNoz;4g0iDkS-?(V zg`O#FU6>s)8@gB{D|{7CaJ$1^HiKkfxzQURyoORf(Rmo9K2ld})R(UjwbJ9FhSkrX z{OP=a>5Ov1y=vXpV^5*n62P-Xtf8)|;HTgL^@TyFuoVqS$DWV9#r_JzAc}$D6pf~Rts$TL9_Plgzj^P_@z}6uwcY2 zqPsR?T(AY4Z!5fJ60<`r8l6X%8R^56)~YVpE4HZo8ow=L%Gw|whJxScy7s!L(5^%C z?Ptx@bj4p9o$4GqIn{*b*)vTcc%A7tjQ+o;!;usqvFGOYBNy@n$n9xiaYXDuCOCXE zy{w-RlNJwijJ?oa6@H79VfaL@yQ@oV2*GKg~RJS^bTBFtkyE#EN!_;LFFa=`$1k#1x;= zi&j~^xE@dsYzbo`T6rV)dm{FH$YG(uR}m;ptRTxAmJ)r07Oz#v-x_f|WThA^qJJXA zwjkfIq4!_8EL$~mx@kA)aVy+bvWgH^pV2qc;QZ0}x=hto9tl;kK%G|9VyRspv5JX+ zrc1u9KZjY{j=>^w<`!4I9p*!+wT|nW?i7r<_6p&7fiXHo*>%lhjH1E zQ@&~BY?}3GB;_lMzOCVwwthV!9xl6lxM?XnJSi5p2!SK^Q{;rVulgug7QbRPPi&l^ zYT6(=G#`U4X4o%0oy_d0-!*3HBp+4F^I%xPR~La6c%3HuW#o)!$0(Fi&@hK4j8C}} z3{Z|Mo#npCJt~A1RF*dKwN(oP_VEl6aT~F}5H%=LRt5Wb)AenM+|xS?j=tf3d(uc1 z*+;<{b!)5-MQ<%%H*<&2i{m$km;ozG#=8AA!7Rb*-3eO*R>*NSi#)RRYotU1=K|6M zNefn|A<6h~$rvVwr$;+8vi>cqHBX$ICw%{^vB_*P)hY?G*?Y{na5RjGzMQfZ;#g}- zn|!u?)VJSm-i{iF0?o%lmQXR2I`YJ$xc%#_=&yi~`#9pEDbnGVg)^^T*Acqx={3rK zSoo>uspUl8x?)#uN{7*%aM)4De(c+GM=5R{<+(~osb(qVP_5rxmtT2;F8ZUPc2rnF zyMkz1tV#xy3TK}WG3~Fo;TDNcVtUYGvrVl?+IJS8SoJ(MWWBl*I(f2U4}UoQ4G~?* zX(}d$u&BqT=t~{($c_@(*YzuU7K4uW2NM?Jxk?Has`75ew?pK#@sChB#PXxaVt%PW zOZqjmm$hKWXY008RqKIe&{@l3NkYJ=6e7O=O51iJd!cS4Q+D)@0PXa+xV<7cc#d)Q z59YxQ!3N+3`%v2HtUX>l4{6w2D+7bfQJnM3-do8TjW_KHb_$0+SDGlnw8oT5+!Qzs zXEuU!9l6@XFs0)1pBhP3wL>toUNRERgX$ zjeOGdT+fa?NRc|ILNy_Gc59*whe6cPbd9Bc? z(&P3DyZ{xD^G)9!5G$-WJ1MvMv<-p;QsyhaQ<5cn5F1=cLni8pNMd zJXjoat2P))BUs)c?KM>OhMCEQo;Va5pA`+yCu<0YCcZxks$rOd9)kQROSBpgiXoB~ z9H&P}&n^YBwP|LwjoTI++!i8UKg5~L8zdTM9KR3sxkq0bMYqk{9d)p|DRh_3;(?-p zm%0AK%q(CPw=Cg?k2RNZrJrPd9AlWXNG7`J5poia(P)4)IJ_h%Tih&3u&3~C!H$Ej zG8lNaegxGzs82_V`y|1G&!$O9bsmuCcA4eHdOgRA7KOq?!)ixGWU)DY3y}buuab@11~hGrQOt$%uCt9+ohc2O zjxk%?Y{;o?sBDpbh$|y=$wI0-LDl`U#|g6S%7u&g(($A|&1r>avxvZMWJTp|tGKPF z<3t${@)WG36mw4Ac|T1TJ3vFsGKkKeJ}BYBS>zl=o`xc2sH@E#20VUbuT@fzS+vdO zT$D1s%?MYdU^*`qs<95CqiuEX`WM6v^wQ@cM;FmE?D;?BQQNnbM1;~0xoD~;uuty) zR|~*aHq=0fc=-IDdRFhoQw_OMKX&@OaCJg}FI~rieAbdxlQpV&1-oQ5szk)PBAVv3C7PT1o89bj))$rpBW62*OpwvPKv z+N-dJxcHrv7?&Fr#$(EFIZS|&C$go7awkv zR7Lf_7vIGI!f_Q-Cj#kIjbjL1s?p5kA6pd;9;&t9 zRwI?SmV8<~uc?S$Cdlt~6kv|nDS)n74iW4M4c{(jUr8hx0TTTQmgA`cu}=z1dMJ!Mk{K1Bg%t!mR?jEr;SC2EebZ5AwvXW%_-H3=;=jP zW=tN@eOguZ!|uk>!mW8eXMY85oy#!tn~!%#W*Cp64nKEQ<*9hT*v9*${Yw3dOblo8 z?mRRRC7HS0CiEM?7rq z@{0WKUK0;miQAYL*T-L=?FfN*`)4j*c9wCQZv1}5z3!0z{FNUVcut>}v|%NHJ^486 zZ5t+?A$fzanG-kl$x_owz8bX!`z=AxqZ+2={j6GtA=%Ji)=<$`6O;vV7aJLc7cS;> z%uXMPvpHpO|Kfb8Wl(NI%rgJ_>lDd3{W#q{NTlcu<$(TiMAzYs%k*#g<@K2vPm6!2 zI(qE4Oe{sG_8QXvK5@=LS!U|NGGPhpu>Rku6>BPUqa1XX!-*%8qP19P^3BgiG_%x&oEyY@29h{AAYW=&IeZ{*TKe8n$ zde(B_gd4l4W})s!x)x1sampcFO8t!Zk*@cwzkN{IJmO2j%;a$RBRd^W*?UYN-K(3` z!ur7WNUCKlg<~32m$MAVea0wz-V+bzkB_fGANcc!&-b zrVI)Rxqn&qd}p>^RW9o^>Dg*7CG#+ih!lkWfR2Jrk`$sN{o2S+#hk{NWg0UFE@x^R z{E+>d@FzC6m&KokBo3<@=^k2wq98v+#URnwq*DG3=6-rxn6n2|trK34&+VEMrwbd8 zFH@}?Cu0*_kDHd0t@|16T%JBJT9ydQQ-nM-Ls6D3dI6&YJY>ExjhXJhn48y)E9fKG zT9rpK!*uLU`%Aw_`_`d8tufQE8Q`+&b!P~6GTgIrE-KOS&=Y~nE zLp?*Mh%lCw$WNA(+9P;s_ej6DdqU0ZFYGB_#;uW8rO>rC>_XakWL2{8+wJl znN@De5>w-#!nP4Cn~MA_Lo+Y0mCq+jCp#hqy1=N$XkK zUyxFtnH`Goor`Ue)QCA-W5+)`WEz?yQ}1nW@q}?4qFPD1^pF`1qw~K65W$(oGZE#= z<7%%qWS|yL3ZIm-tv?kB8lx;L7|=>EvlnfWeyjN!J?0oRK63qf_~~x*iKa{caAo*77oJ2+s|n?26kD1(%isv)P*rs(~?;m5K}+9cUeB;ZA0 zIuegd+rciTG{BHx3?GBUTB8P+Oe3*q6+VWmeGpc@cdt3+t*l31tWG+NG%{PT!fkOubYI73j_}rQB2lv_%mN4D(QMFGG7gFKIF-_!s>irlwlc9 zBBlP=lI2|fyZ_yJB&Pu!Oiz~8&XHWxAnkI+Fv@pB_D%mlAAZn)_??6mew`r?a8%up zALDYSG~$j>IYg9UP;T|958C(pk>ekX6ays~LS0i(bQgffK6|?GeL;JgMkC_1+k#4z zyYF#dcAz}z=*|0R0RGkqMLgFzj75th?D&fHK;N-2H$Ok$V50OCK280J!lj>K@)0gO%9si$k2uCN=b^@Eh#i)K znpZ{;)&AI&28erP5!Y3{m7}$Q7!T}U5^NQ+8|W15wlvVl>Q=xG;yr0a%&Q?3FnygQ z8DG_c@0g~E0>$HkkBszN613hyd=5Qk@X#5|>8bf076LPUc4lHMG_?#a=DUDFV9CeP@HGrX;ONs6&&ni?fXMcXE zetAIf*+PI4Du?>nArn(j{^36;A#m%yK>yn@`&SkbkBi_SrrU@J@vNQZgw#DCK8B$M zt_1|#_S)p7+f#TE>m)PCv#cqHRz6cBtWsHYzS>+bwLq4j^`VwnK6CVnd=aL5mP%b7 z5@~gvi%tPUkH6Gh%ARx~Dd!l2aS+7r4d245j;NLo&`qiT>=Y1Hy0#T*N00PxGE6Ff70aWRlG>0!&S$t8pA zZ|)68?a#jbT^P2}`)+d|!-U%ApiA~}3{yR8XNKN?vncH4k( zmQN_8aHLJ}$OIjkv6NU4=>M$=|y;OvOngX`6#XEfwsXsh-ip+zmza!8j(C` zx!dZrzk4J89M@K!8@+aI3qkY{fr7^YJAulWZE{wD?{fp z!cfDOvp+2A77DNWrW5Y)vzYjRl8%!fh;H_QUMPl^eU)R~NvWTzVYS`$!bUR4r5)oQ z08P38@W=E80`>u|z@GqyvKs)4LV2>C+cYtJw@XyjCWAV^G8UmQPAGnEWuzMrT?a<| zF5toemY_#~Mf=i$#1H+b>5*49Sd`4Z=a(20G&~g-<}1?12dmg3K8w$CO=9_V%S!%TyqumK~BhWT#lyt>_$^RZhe$n z?3HONLfZpT(M~wSkTCIx=BEn#Vuz zb%p9qNAf9Ny!=EhMK8uiVF+$+PsBX1zV=+&_d0|R&4W1BE&~DjrvyOi3w-}~>u+=o z1N83ptrZrj({f#RM)SSz&og*3Lxn2EoS<8b8qTVxNyL3}AFnXkkpYcMzu3FnZ4?wV z=U{Q+I|e?jFo(T0Lid z)BSHO-i)lbqh~aW`?lGy=z3-1`wFqHiNuT~98SoTh|~hLw-JpTTY{=g7& zgdR9ldRg~V=e0g3!2~P`gXnkXP!wy@Y0_&R<5UXHY=Eu_Rrx`s7nx@O5x2W#FGbU5 zhuSB9`MGoRu@j1$g_3*gpWb#~z6D^>iF^xCb9Rg7;5mE;HXvC;${+o-O?U zY5|_7P^4mr2$VDm4k*wTVeJJxm>W<@B1X&a1x>p4TKoocnTg zrTb-3rM6Q+&?KEgu6G8>Us{wdmkKh2?0`01$HzMn?@YafYmPc%7Eg&36C%0<+>ucJ^uFgK z%M|Y~05dAv{$i>7sL{T1_(fIw2O{rH9vYjR_Z?uu1T3kZP&?}T)mL!`fEf=!NDH?g z09!vdu;+Z}{(C*lcWw{hkJa0M0SY)(+qR?P5Lx#jmh2fXE6#YApI5QIe}PDzMrkM2 zf=2Jt<6ZY<@JGT24*)AnxR9wlF5#G)8HYMt1l`Or2+LWNOiXC~z2$npN`MyjYry_2 zY8ImB8lHa}i9R_MPe|DdcnBvPkD1%&*U6QFaI0Z?8)1tNQ!WWuBG{UO<{_ms5K;mU z%RN`&ValAhDNah~v%GwMNxsXpSk(gDf=-*PYJGlolz6%C-gk+5e%Q-%#OgD`-o4v30s^e74-yd z+fdRmbXT@R_WhIU`v-tpUqMX~&9<9~**ArN>}7BL!sqT?_GM7WBcog+T{2Y*z!(ob z8~XI?mqM(^Je0dS^jxLgPC&3nismk9*dbN<88F0Uew6OxQ_t=cr2ZfiVpTcJd=TiP?G85AIdbE|M@i_CbS%K`m>$gX| z;C1OjYI(5QC+jfGp5e`6L8@N_^VL8whMll=lslT_j+3x4HtBtxT` zHl&lER=2)28fGnqliuiIuE83VMNpcC#YCI=E;4dI7BIazo&O4bf>*CvbW0~Yu!M`G zsNx|o(DUv*c+U=qv8R0i9uDX^|70w7>_d60&?E;)03$!N9b&|~4Xke5HbK$;AX~S7 z02GWgmUnaorEAX__8SM$ix28Yt+%^+n$<-_MD)X>U8d87ZZu#iV-d|B&g@`KS7SQE z2G7G6#vZdb!sb`}gvm2fH{UG-%~STg_Zmvbj5v1k&?!K<(x6sy1AUqjv+z?jx0*~t z)FyP|AmLi%yG#!*qUSaWA0hpsA1G)2Co}!)8(bNdicp#ZmLp^2k<~6{v7%x^o4A`% zIhWTvl(GmEM1Rsyhd91#D!XgS69?lM!Aux6kh4r8GRWGoLUX~*r*l_b=O14{@iUW5 z<{SX&*R%s5|0XWLR+e5CU=m_uqd^E0Sd?(`+4Xp8!TxO=XM0Xxjtnf|`l2r6OW5h- zOY;r~!h)@J;If9@Fsos|QU95xb78LD7I>YPvUJ+g&{;UdjR$G~^?7NQEAM@5Lc5Mi zXx&cU8`Q~@`a&I*wU}!>_u*XrOqPlVIUNUA3WsfXRj#E3j__qX=9D=W5&Y*2}WIVS%`f7n28+CQ0Fu7^~DXe zfy3qCgFI49L<9mNVR%H7>pH}gqvzt7*8&dH#n5M?5z?+N58j$;E-qYNcK{n-*D#cV z>~vw-8x_zULl*r4zS%^&f!MC|Q%H#$8N@8cO<7Y4S%Mr#^IEYYB;ppMN_W7)=?2_g zm>=1=aP<-PDu#i1BRwyhE<=nuL(*cn`*E!^=i}4l*)qD!?B+W3iFl7!4ZCCo|LOwR zGQAuuZ%~O`3U~{$&4%KI+d-4`YiT_;SQH$kH+=<}iHg_RNrAUAr6ALQ3C|BoU^QXu z+-#Pq0`@i7oH{2+ayMFV6h~gJ%ozInRh5VZ&(B8W_UR#p#_~5yG~N7rDHU;rTMySl zJk+a~E6Ca9U1zYX9LZnfS6W2p3l4-GzI|sXPp8dz*0bU*!joT&p|35D8k8Sq8igCS)D10*(kIKR6_jj+Z?~BwjovNGAwl|%0p@crn zhS6V|hYetJ|4*F<(v!YX`QEYX+Ib}>jMCQMS8v$>j+|sH0&vI(NZ2)CtbTjPFLl?Z)Jp zNmJ2>oiJD+z4Ixa6V<=x5pPpjIEi5XV8HDW?tgSS8an<4mSszx|7Nq0OPmZ`@A9bx zgohlXcr0$&1ik5iYZXmwbJrF<6uDjh*P9c4jwb8vkZvnO)(3s^Ol7uVo257v3~;!#XpOyiD(KGV9esD2vMia(U)}#%C#9tK}^Z& zf0WVpcpp}T^7_L5_5o!Jn?Qu&W^(%1!i>MmxESG3F%rRuU1Xd+Gk-SZ4hb}}C>(zS zOnQ9RDpf=Y?Q2O>vss6klnL1{{Z~*C8)SzY-ApNMUjT87>LAD%@fGHu!Q&``Ylixw z4_g<8L!xe}$EDN}8ui1YJO|V4I^adi+9Ox=c;wha6F>+mu}RjWAu>KHo#NBfFaAe^ zDZ!j{>H=j9E5-4z&e-|2-o8*_7J@xrg(r=H&;jQ?8E}J~LU{%_urf zQCs_7Mmg7iONF)3Tbdq*Z?lP-ncDqzcu*}9-*UVr%3QBuq`I((nDm2@2F{p!>_$Se z6A@?O>RaZo8obgb$(ZKhJp$KKtgw{l285cDB{g;7DE~-`B@ux`oU{oMSBQmEX-5Q= zIz`_xiyPW=2Ud>ciki(yN=0mqGj^`16v72}|BCVmtfKN27@Cl$qU3K#Qacf*{VrKa z*1pJ2c`OFs)+;$Lg6a8P15XTL4i?k87G=)=?DtUu+M{|r2F?U*Z)Y9LhdIJLI}fco zkv07M;BWu;mb5Q>j5wl_X8$B%rd^NH+9VZe?0R8TaO_QD)s*JuHg`91(Uc+;$JWLC zYQ@H>vos>~gJ9>#S?5Y{e#ug-Q{colCa8uDIbG7jvdldrb_(}L*}i;p%-?8rXC+Sl z9j#^j0 zgbT^;-HANkMWEjq2Nl-qVz?eAe`BQL0=mO32%G{!2>CYsVc7Q%i1&DJ?$i;{kguqe zK2ca0d7DkVIx(Q+geJkXO>a=iT?%@n&fS05j!KuT7x$I4lf6wWDN+ktimp5Gy~|2s zGK*9MZ}FvTjv82qB&CU38%2c&)FnjEmO+3A^H@>ERv4of5d&f!C8O)U(HXMJCoW** z%{^TPhf<)AZ_kM}&YIpEYbJTV(a)wf8p#kqaDQ*c;1K12NoD}auQw#^ zGGsAA`29cvh$%*5elrm*`6Q^Nb(EwW*^Q!cQ@$ahWJS17Igp%)P!aq8FE;8-tG$RBD{4yH zLpNMBV+!EIVs=K92zp&<>)aFB!PzhD=v2v8rT%ie3_^&+*(JXS#8d~c6v??<3QKvi zdZHfG!)C(9ZL-GVN|8Gs8B8@go-{>KRy!89WQK<4^k}}5S6xH)crcHRgzblcJXB1q zvYCyEC{Js^Ni7tqy;0Khr0p-d5YsR?1E#JPpx+gD%L3B4djY@^C8tne#yKU7j8X^`;`bCP(`l!sAr4*2wr{-@ai&xw3Gh!ki{qD`?nm79`rv- zL27V~{#{C$H;wG_@mRaa`72Z6R|?=>D=bZ|s$g}NYX5uzZ``_H%w@2jbOOoQvPxVH zYP46eaST|mFLrScm=iQ1b*qUNx}n%>@4WA~2N&=dtSvS-^QpaWpCnS@v90f@Q7=NV5CoM=aF};Uy(3Fv~EAd?gk?$lKvG z!Rba!)~H8Oo~K*B!swk{8X>@VmGi$^z+WOKR^(yIVu2J&{<_7V(k-j#wqN$nQBT1RBGl!Z5@OKPjsMBUJe&X|| zU-+d}PD_8`d`qzGUqO?tv}G&-(xIzU8*v)YsPq05Go(rFr!YNJIj!$V7Wl`1ALjDo zlu!>spPZx9uuj$gN+4Tt8^~aKH!G`Rgs<64m$0j9yGMT1G zMJgwxN(WwW+WI4_V(w+u#}OdBavoK-$86O9MSxy>XK_iLWR<%xiFcuy`1j+y90mZ(c~VQ744W-3yQ|J8<}2n?Uu=S3#>FfdD7XxhDQOb)q95@vVk7>e zOw(NSNx%suI7nT=6w@dD6rBdMQgaPQcG#{Pp9|JhNJ9777}p7lehOob@aMVmtdOH0 zuX)jblRZr!@>)!$Q!3hP)m=p12?KE#oel4ODjpZ@IjsPu3`TJyVV;MV zp3u6cCt%29f2dyVm=E!VRft*C!=k<-5JpegVpEO~;`?B1D{#aTzx>Ude$tH5Da4D@ z#D#R3dzUMcED1GKnbLU>bUBM~`gLQ>LzV~WU8T8~gyg5B1R^q1*sY9yMP~nCRSZu* zb6JF=NT&uHOw07E*1Jr?tPw$>299QiTrN!N|K{Gc>Pv4UZ64fRyc@w90UFox-Ezwy z);+GH>pqY`$$G`*zSD(c}j`1uzT?GDlF*npB*%!VmEm z4=f2RoM7XW)jDMpjlV=0J5N3NH_QsLpoi5$TeQfRAEB%ZcDVam#A|B3$~ za-8aWA z)f5A=l`*Tuo83_nSt?V3N?Uhe|9pg<0=nKGWM2rmZZG?%Y#KJt+=A-+K!Gclh3-H| z8D$IDC$Y;~x0n`imVz)+!UY*1}*On;c`%Q%1Ar&x{oN+_gMUN{ZA39IwKg}y;M3(X{Tk$JqCxTAFCkIp|m3q|3rHkGkghHOulRZWcKA6Wg@FSl~3pG(%m)&&QP6IWmm8ewO%u#_Jg$;#ez z$3g$iMD-%{8YFe82(FX7Fp?S_YI6gj>{7N#A6r?}iYLU%QL)+C86QW_f0(#z3n_lm zDs@{LL|#RE7a|yZyOTz}0z3gt_aJ%SUMB?^A;_3=9Zw(aiz9mV)MLTW?{xWw2u4~6 zLGWrGJ7Hb&6rNRLJbQOZI)fa0Y)JdR-$i2}YI3kxsvd`4K8S73WmP?9ecHus8RUeF zV8Wr=;vXec>x~X~Ga)4;`Tpmx&ze%!dTa3{;V9lgA%ze&-U!?ztBTact-ZnQAw*mp zOBA%7Ut_F0bHr3@8S;wt3|FDq$q+nKdr2HWmxAmFB!tDf!?>%L-fd(iK}Su7yId<* zS;di*UvF9W;UV8@F3F6*4;B?CxW5 z`5u!n>wSQcqAFA5bLb{kJyoGHy-Ta)erI zwKKVEAX^2kGmfOn6MXIKG~Vn#G@Fy2No82OoRY#Q1BLa4@ms(V&bWM%Oc%CRvzI~$ z2nbai4H>r-yh9&fi44+b=ooS%kuHrJua!zBAjOX-dUMH{fNO@eA{Z-YH&keK1J7*J z$Nk8;Rmb0$I~pLQC!>x@e}d#S5UPFd@AcLsg~%Cyw1{9Dc9$bTZQzvnVwNZ^AWx~j zB2b|=>{WPC9}D{Fu?N-K;p-01Oh%2cfbxYYBV^vnvA^+$QF zY9T&7yE<>V3%53MKkrkrw|T6`>}mT0B!(;q$S=}l=(k8~0;dKnf9Z}*HAy0;ISE}x zu%6!bDQ_fVR_tC_y^z|6&bBq#r+Kbn@~1RK;t26)@NmjOAO+jj7lpiEen*Y&78 zv@lf*5?oDKhuHU?fQd31!Dip{XmX?qlsFlAj5Ux63_6qvtarg8mVSD};nMqsW=-4{ z{k*@Zl&y0aQd$!&|LlZx6q0=Q7!AR(5JHsDXG}~G)K3fA;q@dXp_DPrjf${#-EW1c z^=S2aPa&OASSMbHVeU|HHP)siAWJ?j5&m6nhPwudt+GyvH^m##*ybT1J!l&mOw&&E zxUsazVW_g|lcE>w)S-@0*Wmp?Fz13ByiNJq)>lSCE>*!>$1ak0JJnvD0r!1_=H%Nx zVkONFLb}>P#27dPR8|3JmxA8OuRNJKKoeTY2x|E924+OOQoYb01k*$kp_dtN^Np><>io=iCV+zdc?4 z_5S6j?_a1L(WHI(*Q9ILFF?h`^K>%@t*37~j4?!C0v5xJkd^!CP=4qH3Dia|a0w?c z-QaWI|Gw+`I~|~CTY`4Lro7J`!L`5*Isu)Ri00T>ildrx8)7*J%!DU^vK0970Oq^w zfoU*dV17w#(4j`rVCnK_d4EpP1i@2qtjq2@BahJQ@w~8glEsFkb64~25DCr?YcRp< zabk=ZEG#1SpQP8wg934b%8V!#uvgPp@UnUN#54nidOOn=VX{4Xyb`OCQ@PU`T80R9 z3}2PiA{NBs!FH-{*6e7i+y~nVsY&y&>90xRo<}?OP@ClNZmdE$F*YqR;VcFbR-ULR z-ryyL0-cy32dm+Io?T-et%f(nzL9d3hd4jZ^qJ3;DL=-`r^SeJV&lJYA4~s>zAC6# zz{P1mhLay`*wgP z^9}SjB(nt==FzzZ44puSl;`E|FK~7~{%)7|<0S8|@dLgKcab;4rUH-4&|WOml-O)I z93${hAixcD%!nVChBxeoi9UO-%;`K|r(SGyJ_5eGIq0AfZs(y`^pXTHA@iS|n;wzu z2+7Qn#3c5dA`g%9bg040aHRoj+HufL0#@eBfX#h2kA!V2J#ReLtgTVSRYG7|+*SUX z;VjPns*QyR+VFASl$iCFlLZ_llltqB5=#@r>!apVWh{=*Guj`%c09^KNcEK)D&T_# zf(Qn*FqSa>oEs1@7-%YK_4O2Mwsy2v=vGHx6Yt~Y9zD=vBsPbeezjkOdB^z|aTj5s zAXoSOUfvba+BpR^!sWQp_Grv37yYMVxV}g4J0`g%eEq;961g;v*r!fLN1nvt9$Eog z%D;uvgxeQl<}qD`sJ|Hd0B$(g&(@qq3_b4%w#Ydyr+A&q}XTU zHt=^&F{DbtkYjgfI>WnsV3^NlEI%}X;gs20cU!!9C_7+MnUGlprLPCsA57Rkes#|x zeuW#{@6%X{qHW5~gxSaBw^h!_-EyPdte6}4DT3EOPp4mnAS=}0oPbC|Z+McHN&JT83un11s0xhZw{6v)G?th144O=)Yt}vnHZh zUt4nm`;5&|EyjQW_9kYb5C!b6QWJJ$!J@VGFmen|ta?M4>9_yY0=9vvN8l#lzZsF> zzXtrE>-DC9Rr!~IFR;9J0K#Mfe^b5_^2qYZ2z6bUxNR?vg<*c`GvZxcDg95P}M@3L``_rGdq?(-cm-Q0S`` z(-bS>iC$k|*hBJE*VzY`{LSZNrw!9F?g(3c8_0ca!PH0EV8Pl2??B?yCc9@p%LVka zpaeGxqcuieo)b11xeV-}j?aHhCR(ChiinSIDeo8XHx`$Z(CUxJaSIy6?KtZTKt+B_ z7lu7KpcZ~Rq0_3i3r!X)J z66Zve$Il)1z2-E+ZP`9lO)VsBgXf=I;|-Y|QJf z>Imr^5FfW}`FNxVV7xc#mkj(<@`4hoK8x7rW=#slE=!_Q<2e|FL{I)umkoj!_&C&~ z3DHy2r{FvfRIkn($hn%5$5L>p+|$1zQlG%ODyE7fS|&_!D2Bt^5jd$~kg1Tvp~;@cYN-~}*o;rkmG@Qg#1*}z{q zhss9*8!7X@$g6l4Q5XPpKD+EWQQ7BZ0>1n;y*%3$XhEs;hldwm{=l$okLSudG8%rS=(@fHY{M?)Vn{n<9_gC7cft@@+9%z z`zD+^`@W%suky(am^jl0#-*A!JWincS-u^NShL$KV6F%BWdCb|gX29|WzW?2))eS$ zf8KPOlaq4=!qkU++Kv(!c6n7nb`Nz?H_n~9FVtth`Ioc*68samzLG=9rtAWD-!(v# zedBq*ZN#xM3{y?Pc*OZ}NU{vWgslJEWC?Vozxk;<(9|cB>-hQ=iwZ+y9IF>a@c!9NTum)h=8dZbW;B`%N`YFfCg}uiu#q{-5^KBulDwmBPW)NF4QCl>q-%G2 zAb_}#3HdkTk?F8|i`sUGtY(x4u?1Wk7Y+O?)RAP>%z5~*GrClYsX;;Wco;jZcgfk& zj44)bTT;S!e@aCz;WyDGG-qnik8YPE;g02oFt1$5v|NqCt%xJtgldXL+D$)QGryPG zWDD0BeN!obZgh$>imIOz+l2V-bBFA3sg^@xcsgnwWkEnpVSM82(Q>USGVv%Zsa_3Q zp_r{i!?G$8n^zOHr~yA$H=l2zzrZk(FEH8Z_r-oVkoYE7we$E3h!0k2rUuO8dj2=& z;y#9mr|BqDmzF&Qnvz(FSbZC%2^PbtUk3H}EYyJiEcz*?pcWejI^nl(OSeL3p?M#= z==|lR9)~=$KE-x?w&SOW&=r`PZ|r*Y^YDkJ#X@jQrUi*80l$9{X#MqyUmTE;1YI&> zbdl!Sh+5nQNAgh4--^`){V?X!4B1i3hDgy*lJGA`x}(SjxWrFV@UTxfIW77}?!2d0 zY7xQ08F`z$4-j?RVbt)O#=U-&kQW%p4Ea~iu?{~|f%cXh z^&jiNrKKYdZ%&8OYH@48HF)i{ZrdSNh7EyM;5z24pl^2ljcf3rkA&J`EAoNsir{P{ ze(l&&OkDOx{ZLjMu~?%u&(XF#&YQvznmXGtgQ{1-&7*bU)coRbUo9+nTK8-274pAo zw;B^{40PcU_aAYki`)C4c}tYhCW`#RMZ`}b(VPivrZH`=HMi0fs}srnIQ#8w5F5`9 z(b6}+AuT;fbR}f85v}&TrjJ^U5()3VJD=;phf=>z^-$6pzCh|pc0ky0;D*O_78!Qa za4GqMjqWTuLnGKt@8oN~qCzd|JTg$ivVK#i>X>ympovJEmbK%2if+I$lJy4W#F#_t zP4TvQ;@)0(S{z?K1m57-CL7OW8=h;w(2wYcJpmJ*L7@^@L07o2hv>bXR(o~=$W95Y ztXQ|*p~d&(L%0_X*L-xK{jkiPMZai2N18%$UdW>J`oTgE{sP%tfaIk5_{qbxVD_TM z97q;!Q2P;rrfEr6C0c#{!Bf2JDT`(?U!hER%}dbHt=f8PMcfeqmj zBgq4WvICaBbRW??=Il9R>EE|^hBjRP93tNb%zK#|0v!d-s-*QxzTN@d$yB-6@qtL8T5A@){m*8#j#sG5ugF7!ME zMy)Y_*G^ZI4uvxO=aaYG9wT||?wR)cl~tCR$|^)Ybs$VV&a_%`N2HP$88Ikwt!W5J z{3SijsO7E_Zo9RJS$Jb$yhGZy_#UJ)ECZb!0^>=eeJdOxfml`F#-!$S+{1KiF4AYMO0w>@b)I{b>+YgspZ6S~wDcTXStWA? z?MR>0Tt1^Ez_oj*u4IFXsZg+P_`#I#C)^+jYH$gIa4C*zORo(SfwrdtPZdcgY7}?O z{}eXgCkveu(P&EU!eswaa+ni#ATLCk5B6)Lj~@DJUh99J)s3C0cHtE0ggBN$9(S}c zBt&Q~R9ln(ceG( zmXbb!uzrH&EYc5P1QleX3duMQ?Pl9WL2!^9d053!U0vQ;B~kt@_ELB=d7Svw+* zEQt=(zQ&D4VBS2vXIx|djazk7mJ|!WTEItaifRb6Ag$?e zuPh3G8hAy>HXk(kxlb1*b(J?Hls7~%d=rFZnX;p|&1$NZQo$z#p=S3_&HDCB=#9}* zpPbnn|L7%EXFt}#talnT!ba#T(U|@muh}8OjXBuby7Jv@G#(=+LPbprXdy}1^dl2; z@?Kkm7TBdO%*x|nV>7z94&$d};R0dYS~SW38r=k4$&WB(+R?8_J5^+>FXHZN@RM{5 zU2C6Ut(g3s?C9l)m%gaN1nk~ZFv3*-1-LN6sj5mpk#>|!j@ zW0Yi_<8l6C_>5`c@M?r{v2h>uvXE&+PD~e#p(AeDsU}d5ntFtn25~Ia;RZ^dEW1*8TArx|Lq^X@fs^~j<%Bb!{*t# zEU>RxRb=f!ld1TM*RAsm zPcc|5d3+KCGRu_(F9u6`Nc+D_%!Iz`oECj6Sw2tk^9*0`Xb!a%mjX)*-BeZM_$P!D zR239?8UyOz=R$p9(pla`YWxP0+5n3S=iZmjZPr8K3W49|QBwt(g<5M6{%5gho_Q>0x6cQGJA|;P&ka}vWK9MbP_llyz7D!8e5cKd zIugeew2G|Gc?LU{@S;KAA~dU7z(k>E)UYHoai0}Y!pkepMY>s?MRkYnqVn2&A$=Fw z4_-dRy`TY_n(a2XsM5|h&colSj70gqAK?N!U5*eUOjCfcusCj3fB?ys2*o#lI7!CV zE6p-(7QJNj+B9RSbxDDwS4`I8F?aDi5N#79{) zWwEM}q#W}hb(WxnvC!nExbi3m>3_WdPC^xfXj%kvFG&=VAqO*4UGWjg>rSuP=%E`+O{XSR_lbTakbnZ2B{5!Ti9yf0_GsI|~ z45Pv>V&XL8q9OAIWG^3=f)=wAGL(CL4pk+_ z`3h`gnl|oLw&ysy+q zxL3)85;n`mXrep;w!Bn0R>qp0CSf*Zl>g`bLib)rv6~g*h!0CbbgZ#ST)>(R;GTHl z)CJi#{8w z#?u>S3;NI~%wn{>?e{xc?iC#2mKaCtxa*J3FC7I1@Jrr@-u~IRFC7fzAnT-2Z-Zsd zBbrs@9Z`IIi<#j^;5N|7si|J+#a3DB3Ajc#ezNGaaB2DlQF6Gl6@5!N)I@)n#`0x=&*UZ3udubP z)4t6+3E^&2fiO(yJf`(o1jz(?a{k1ZLDUcbFl2~aa%ld{m?xe?8Y0McRadbpwExV` zB|!5hsvIX`Jwh_k81A+z@@u>TVkO%)2YFhzgm6r&RNq%w41a|p?=I0h+#JD1^%obO$y6sfmiGG$>XQANXYic>+u)q^|=QGb|a2U%X69B2<5aC^z5-$kWYCNF8-a zMIuImCcvPigy1~Kg@282j0)X}aIxOx$KrX01D1J)ZC(vL-%A#x84}r#e8tfPukcl5 z3Xt3GGxwuYa1zQjTvOKle{lP7L@N>&8}rfo-kB%WZkP5s4nhR>@oyv62K~E}cg>|= z$ySv@8ZkCW1Q=B0<$BDSvhB?Gl};IlPOHS=3J4sF+|Rxiu9)-mbq5G8WPBhk`sdu> z8%}dDm6&DArRsJvhtdccm2 z!cVzEZO%kZ!#lbh81=st^ql`5t~iYhNJ0c5F_phEW&t98TxWc)pBED zhSG(k0b4c^VyIjB@L&Qo)dFz!BWQCl4NhI6n014u+eG@1O9UCN=y8zeF&u1p`Xqcd z<*;-9`!rj;=y}`iP3C$;Wz5mtz>_!X#11aH@RNt+j#K@cFIYqldo8p_Wpgog`$I*5 zN^58*85tthanYJvrq4on`+~-j zg@%sfp@n!0Z+X4wxos6k>BKMdFo^9z3&~;LPJ2>0t^{GoQG$$$DYBBjRV3EyArFVqkpKDkU#4;9|>`E7?sGw<qcs|hz zn!+&Fv&keDm;^ZbokTD( z@G#9H?iq#0l-I+BtSIH&3+^XJafyVn$=d98D3)=CH%R_=H8cgh2nwH6`s=3Pu~6&7 z?Qxr4$)hgr$9Y~X?+~-%I=!Z9HxD;1T(96>qI%7-E>@szW^}91bjG0X3~7YG#c4YU zBx4%}L?1yv80v6{cT1ZI)%!;DqW~`hJPhG53+yOJr1T>qi-d#Brmu=a5w}(|4+^)b zEX!6<>H{?5UlD4NGyrdn^zLa=i=_o_gWJEXKK>9nzLHE&2`4NlEy4uWt&m_bT1_CF ziDKJ|%7===j_a6e?L)}y4Ql}S=LEgqSkAUp5wmfD;dcq72ubg0d|MikO&tqADvW7- zMI1a#oVm&PpsX*feT2S{-Nw#BBCB@lyg-*Tp(7fy&X1o{r=x$o6Y(DDY{pFT2u5Nd zuN(HzxctbH;FR$u>9L?gPtc7kq50~btk2uf`v$U+T#AR7n7EsUI=MGTi4D%0uDw< zsGI{z``QSszkz{c!G%336z{>q^VUdBu2F5qHD^=D4l+vblh3y)VEZ{owie?EOx>rH zgGyQhM~e@&CSmTYRl`|hd2x7UvK)gI$5v}C5BHO^MaNX6QMMZS?7$)}2^2b-WXrr6 zRwaZKkq~a_=G~p($YU1=zC;Omq^c7Bvq%`E)a!HdqfOEA9_?zidh%I3{LnVx3&(l! zYS9n|#ELkqn7LcPXcCO~Axd9{XkP$@AoM=ytky- z;lCU&YmJzqx$nd(f9*(xDy4kl{kC56^>$ufDpL)d4H!h26!qelOp%>5MU9V%=_I4; z@-=A#eR5a7qQ(Z_pA3!CiGtS#zN^}PNP|33JsRs&+mlcmx*WDTr9dx+4i|a8D}Pyj z%9dov=X3|tw8a;*AI$iWPJA82`Pa8t?w|EPjJ?I>f-hGqFdgv44&6rW@fI&IOfkg_ zR*}9TWKHp_2CfpEXl_(pM)_?ULQp{*gd@HYFX_Lp#WAO=xGFbLYUNW>f3Z&W>3P+!eMq|X$r$iOb?;H&R|yC=4~WlSe2LgR5V*qjJ^KW>O{3P zz&?gc=tJ!o$`fFX@=O2$5?MnkA8Br@Znv509^<-SnIZ0wj)!6s5{?8_R?e zkbzv+!)Laf%2&T#z{44!Xi>Q3*{2g|&M~dlbv>G)9vtu*YxEV2L0U&c8Vh@&d%k^#qN$dI5fbwYA*cW#OxN z|F6R)js9cPMcIA)30Iv9by?n?DKo87q$zvrH2ED#lktGS9F`7BlTR9%iyvV!!<`JT zYWn+nAI(lQmKrMgiKg{H9(N<^C^6`TiX`RQJH=^58;}Kp7J_eBaW&_j-9St@?*%C+ zU?{*oo)pxI{aQ-qHE#st*Imq$BxJ&xp`GFcZTd!_4LL|e4Ic2wvrkWf z8J(kogexjJ8Qg(I|+ih zG$V~xJ^h?n^^QG6JsCj4*Ky}1->|X3-IfJRn)NQs$)~Gk?D*h$PwvCGT*2PD5P=fG zxbZJ_y~oE$BD6fjlB>#sorYZ8PbAF4>$!G}eXhVDbOuASzwqzV#kR+hn^xzYioW9( zAk6bNIa6@MtB26??F$>FJo1$x^2d`tP1j2qKR{?=H*9r0xksuk2X;kVbjX4Qv^i7(-#+ z1F-7pz>j+9N@ciPnZ;(V0+l+u0c6tHIKG%JKp$Gp#@i1Mfd6OU%UQ_F$(3)i%&(RP z6A`u7uJTgDq#|fac$q?6clWg893lj_xdMsZY6>p}kVf_M5xwBlvNrH9?&5!2*dKAt zNEe6*)WW~s+U!IR5iW=#kBi1&T1R79PQi}Yqm=y`?HgefBs=7QIC4fe@;?wzcy#B^;sy~AacDn=MMsnKj zOE3WOsO46gLg)&K-NI?vp$jYXVdaTG>D%kpgQko-@uxoS=i?JKuZhs7Jt9xI|H;2x zNs6O<7ag<$#qM2`Z-0eTnaw9s8Rwl19?*45G;B6A%ghq%Bdks9Z*Ff*yh4+BxD zx#qFLpsxKf5dxW!xz*o^`qBA0w8zxYHV^4-EHZGGa@nKkQ5WvGu+1=0w&f^Uj{5`C z2TxMZGM6&IJ~U9M}B~;xZR8C~yBWf%lzuB9de_*Ezow%L#*rBoZ0zhr>`U}Kn*GaW z!toq7Jufh&xJVLx|FDqweDb`=Q+YBf?0mQoAS|@v^vdJ%apivIJzj!^xlGxgsPY>;Lc}MNTJ~MWn)bw>cg)qN zzH|-o_Q>5HKB z1zn*EF-N?L8r26q$v*?0;CGLwBF`Pj^H^_k6|D@Rapvre6|P#y1IPh;LV5aeoBQ** z9J&Ey%y4gd)h0v8=CIzk7FCdo>AwFS`>_ElegPD^MKTGOO}mFd{0TBj5$FT4LY=y0 zp!(#6BS_uImIiNVszRVGLRw3o)?b zikz|(eFI;Ik`FDhYg2b$8!?5lLSpCjQnq)+(ct6UJvcpyktP$2Q3}+|;r14%I9L^J z58ED&0|^99p8tqDr`sznyKe3kif?;8ue4n!)FsJ+`$X5!EY2VZSPqB?I3b7NwC*bweH zntI+Pwq1CfxD9&UvGe~~K3Td-9y=w+^|&}6at6C>YJN=rHP^NSEScNL$GIthQ&6zw z^>nG8={`V9|>wm0@vnys1gU7HaZKhsjBVxSigw3`0<4{NrD)ykV;pDjJC;Jqe-`64>K;FpSFIb(;iuTd8n8; zi9$7!*q;z?zlXD75!-9ilHzKR7315fFbv=MsX*`|dUQfd+@pK_P5 zhnV?B_QykgX%}>l7onhw(D3o#hX*2UT-i=KP8fk)UC;R2(dDmw16B6|_CCeUWjC3@ z!wj7L-eGiuN1Av@p!>xPyv)N_@o0Ih>8TKp%DO^L;v~dgluMYSi4#3g}}u_ z8-?@HCmn?H(>!2n3*P`nj|AY4jx=!HI|7U#iU&5@hIgxdV%N8YBKh-TPXp>=$99oT zSFxGawRU|G2K4FE*5HdG`Skndouw2;&jY|L_CVCUI;hP4*b4wq^7z|a`ZVQvg(E$8 zr6av2V^cuKk27`0fU)e;F6Qrsi+=7=i=?<(o{d9_KOF^E_yA^Q%5l1j!qaxl>b=`k z=Ceyx#lz!?_}!$k^D7UYzorxLJtc%(b}k49rkg0e?Gw2!Tn7+H0}@hT>Sbw z|A!hfxl0S>x$s+(;5SZwioxIb4s)_)4vk)Va}wJ4kiH<<$o5$+o&90yufd&^!kG9sR1v42PJ zDSD4tKY<2ve_*C2X=*42Pt-#n77Z1bt8RKH0~~C_t4BfA2)YchrEroceG0jYu&xU| zTosc2s(Gj#2{4jysk?1 zdhd0h|M`!f_}6t=q5#z!j|2U`yZ6+tZ$kd0Z6o5%GhlRG@o@fhAvosp=kxP*#{m0p zio@PRO&kx4A=hg2n;LUG_14W8_O?A$dP8@+MMq$3HJsEg9^e1ofqCu-Q`}97WBqTd zi48kCVz`5P@Dsgc-Uwj7$JF5WQDdE)$C8fG=Im=4oX0F?HRZo$<4DAV_wB+-UBcCW zh!aMIV+KWuWPd2L9QuABqP>d3mO)B0qNr>0f-zpKq)?Zr#`ukmV{Iw7%>T-hX|Iby z1BUsiyVEGid&f3mtB7CH+G7WEnM~MgYjE!(^r^+apOWrQzUZ0Sri_UYE@Z+phY;Hc z`101gUJAcUSE)d1XQ8s}tQqvLw#xsFlcvLOk8m!MWa!Ohg&5QE=ipkxKqoiuR$UsI z-Ozl=lDFBXCx#+${JLs?=r&a>qQfwh$IiO}+X6RsX5!GY*CjM}HTU8z}7h1GCY z`UY}FPm);kWU)eabw*`qR4%b+l#|3U(UXuqBgKjBlK}X(Y@Z(;S0(Cqria*sk1B_# zPn-_tPINvxN^}Vvwme>&?Nk7!=cV_5OjZtj7JoFK15Q<;=!UBh=7_t969uQ^xe5g5 zpNZ<}0hDKTEv{pm7t)pj9# zv*b91rtU`izuohcbn|8(^fFOz4!K6W2m1@d8~VxyKOG(3@DQ4fc=_RtwS+3NBW=+n zehavcHO|E9lbwzMn8N$-k*&tW)GEJ{3B6lwrO~hz1IXrTI>S1{vuPxy_=Os>jEKc@ zz6M5V*7$&ab9RalSPsT2zo5lu;}A8zt+(684JpV0frOS1#yvg@B9A0}doh3z_EFEZ z)%a@zr{2KrE%u!*y$HucVuNb;&(Lh)wS9~}?ldISXAN$;C*~XF8oH*wNTfm0*d;KN z*tuGGMR5UDkPw7*4hJt0lImIc#Se!%Ap@Skf8En-TM|ej}9oCbuo2$0~-5 zfTE%_1yUvGl&BMI+K-fXl>GqrskU8| z>4uPAuWbW0>l^?l+ys2ejn6yJmb-!G8`}WR6CW@*qrA86cxpNp0+=-K@4CcAwxc8e z%&h!T$xcT{_!(y-)EtQDykJFZ{FhJ_F$X*nM`zKU#U7f8O#EJkj>t z+T0P@Nu{`L$7*|MigfQHBVFTufAyXHx%cz*dHCPj2ca5^t}xD#yNklHMpIBwN~q1d zfTJ=Kv+A)cl(v=&$;{l0CweJL`db6i(Vv`M7ZL}Ol-Awe4ip*#?|x5xbZfNo&=yWxWs!>N%i`m_M2Ys*CtQ4>3@Gqj^h~5cg9do8!21X1ld(-ssv_uGA47WrAoT6BrvJrtXhr8~~vks?t1<)E7x z1ZP7{?+Sp)MF4O(gq!7uvCm#jG^ba;apA+?yOEn^$0;9=2cy1-LSQhWPjrjX88~ta+cs&{Z-FvO3(xsT=o(-!ZlqX6 zxc%P9xc=dMByir}-$F0ON&5~I0lfOETAv@jMeaOxvWxtY_qsd={@WsXk@ZgJX44%% z3ilONe$m5kUiHTODKi&OkP#n0G((*j5`iV{_o=k`>k~kgvO?DfN`tQ zFC@vxzOxdMDJJ>%%q*-wyX&`a2W*w&d%%47uc}m*anCZK0Ll`u^-o*szurQSf1{3I z7VmMQ2p2j7SH7KBG-QJ*W?Rv*7X20n-mwsc>m#b%gm+QXk(8m?O->tDm9yfqxwkbfLelup^7wM#I7 z7*EUylz==Q8zs-8?XY-ZF38$=r6+==nHb!`r<@4U79-RfA?62j$-Z4sRD%=>=3~Lp z($2N^rlEN;Ip+HjJg@yDTbp3<yyC19|s$x=8m+nx38uY_u z>7do)*IS~to0cP!G^*prLG7m}S$3hj`7zJVlV`C~xQCO*gWQ$7^s)Hmv`Pk;>yUn{ zN6*W@#ct$N{(Ik$aMPRPrH>gdbihf;f>;>?1syS3vWi)FER1T{Jt8eMRtk-L;HUIJ zpP(@n6mP1yssR!*Q~E!Bf+OLz@Udj1#1gTRkxRFPyD93S3bkQCLyW1y;J0x4g)Hy` zwqL?0K{zD0FRsW%wel80av)H85|w~`ct}r@5Gj}M>UTM-#g1Y22nWttvMsTJUSw%A zKW`Wj)PdVIeBsI3ttt}ne{j*xY<;ce^wVaHSt^)tU-RL!w zddAPZnoSoX>*X)&#QdJ3Egyf&&D3*itB>JNqVszj0Z50vxkLeG?-5U9X@E`(Z#9|A z>=TZOuDKpyOy1nf0`*(hrB5mPWb-P0ZDti#hTXyHtz(d7Uii9BE;AVJP1O&71y#;7g&I>6dc?BNNzNd4lk8bS4<%U~{ajK|7GT1MU>MHE!jyrKN9f z$CIdA>!sJ@d;Z6r=jMz0jlZ{UR*Tz7%U*$p^Rmk|&eLiGfCsz^|Nipge?ljc7Yyg*9-7l;26VtaH%e`^%Jh9Yd|Q6`(%olvSR|r zz&x*m@>6mPT=K5(Xd=E?Ir@&0&Hr&ymW+CDvVP}Ll#+uoK#%y2^2aCuw2-BmxY=?-LH65 z-J-G4#$;@eupos3_BXT7i?2!N@6o_jpfopb3+$>C2nOkvN#`l!pX|imC|*-p*GOwR z+~ZLFsU?qD$%95zz`1#q{Z|$Yr5X^4PqPkZi~6Zg)YLI_H;2V==z=kirCiEigEfc6 z{YzeJst;x{rW-ay0u)8iW; z{gts8MqMOfPvpxu?)d_y0qkC8lW@=}vOPp4YqP@5uPP9VEj}?d0sev({I{ur!f?pG z%zx6=3>yl@yF|ZdNotZs<80fi$Uj6r2QZ4VC|)|no-O1GjlA}v}lS6=>%gT$2 z6TXaI6BRF^s8EaB+aSSe69{m0k1tK@rD(r|7?)A|;>rbc6ixNYQdFo0XidQc7wu?r;V>h)PRUvYPE3PhaV7 z|0Y`sg+$d#y@IoT|MS1Oa#p_w%_%}hC_<@fikM(ezR7K%SjE%4mGV56BuK}ptAmRM zs>dLA)^I4tVL!nPJLPfHLr<+nmIT#(SB5abt- zMhsDz(|#~fsqU8ggrLgF=BdIlk+6SVkU)Yr1h|kUr2u4_GW}xu6v=i4gN!35ov_3% zcA`_KgwwDC-ZhzPE~aq=5vL*?-`3i?aOrx)sc%q!geIQs)ox6nH9SUvUW>bwBBK3( z`LW96vr<3RJYP-v&o_D1UO?EvQeU&^3o<#MJ5Io(*V`*GF~`%VMEN;rsb6(%Z#$(9{j-sok6gl6#PR}Opv2;)lp-xIx!L4#3=3_E;ddO-0071~q^y&=n}#4XWlQ4pO@Qs#egMX?WrfFs+>1|=$4NP{ zM+ae1mfdJ7OQFZOlC^a*AN7&eaNft|Yu5Js%-|?{UCWjmccRdbUCrAF(@Bsa{{1zV zWQ(;Rx9%r5xq)JITK>%}{+Bwv1E+;2JIe>Tjlf^dOjBS@=hv3lfesx!T92o(foyMn z7d4evi(dlj__!r@RUCxQwbw3(?~jn|U-sv^4~lwBGaQAxFSkffuuUWC^V{aEEi?Xi zKeCuDUO9FB>Gd>J8xko7107+0d(lV(#uNbCQ^%dq#RqoO9X7Cou&IOgcveZH@m8%h z5--m;hFF5AUO>jtS>$cPc;I}$&1(2|DRWV8EJF?bCUt2B_)1VPSnCOkjMu96s|L-hX zhr{6!W5*V=OkS`NeDBBYsP7@V0}ZYN z-gc|8b|QF>-xQsHpOsE^hB9U}k=iH^XT0ktq4M6&4;(k1liOh}t(52BfRJ2~U&{2yTquH5JZ({HtgQ9<+0ov;c6rwPyMG-(VbBO>Use{|MCj+$giPHv7 z%sa3=g~WDn<9R=2;A%>^?;k;5%R<3O%6A_hHJvJ2Hq-olV?t=j50wXb!cYgzQG`tU zmHE0p;93TY5*}VTnjiN!>Zuc~zfL-TpI_Q%OCU{NQ}0JF3^mZLCimoqcJ{V;BPjn-=U@ku$$`Zu44iF>^M9RN)rc)9gGHR6pDR^gDds^ zOOZV|J#X|pY*>!Jv*=4r)Bl@da9ENA_Y25z*J4s$V@d@uJD)OI`J5?MU_-@}C*y}` zaXQ05D(3w5FTA;1)91pioBONbGxwP%vWlmmL2=XMBi+kp{ObxvljxtYPmKAu+h~yT ztDBx}3^4!)=^HMxfU~qF{%Ee3NMBI$E~w+bjej(N>+P4$geUQdwShWg>;~3G$cWLi zb3D}0A^V`D2dHXEJIdsD`5Vg^VOhA9M;N#;X1 zD^=$f|Gx%aN!XT?S$XliD_5tU?IKy60*aZ+|Gl1yqrNSTXQmk)9riAm7l1z;bN84PmK z3Md%5q$IFp6e9ai2sxSvZmY&%0q>L!_BS<>_=F2l>?oCl)O$URgk$NS^jeVb*{8qW z2fu>OEL8H6QYCWgNL}rUaNsVHOzK=pVsN(&l*;2Crk#{0V@LI4Z?{Wjgi5PLgT@@I z>q1V$g6T{^(jO43QO#_kh#Wb1!2b9lKfv=TCGp$6hC%rSmxu_^lp%L*)KX_DjyS|MVXt~$uTI^xG)5NV2jh{E8| zCD}#e08Tzi)JMAXAD%&FJZE3Z?Q3z$H*?7L3OZpd=hQlTyKd-jE0=;B?Lk|bT}jqf zICn?1MtSQ=qfBF~g?zY}pSlbxeHL~rIXdqFaLb!Pg>cG3t62V|9t#aE^U8pCa{Xm2 z0a$Mn%k$+)4md}WSG~gsA7gcqfAxp6+|1OxQ<3*PAPXGgAny_(s>$-3b76MZ!l9f5 zgg|jja%Qx(~U?=zW%W?Vemjxtk7PrVroB{q4jZI2b+40OiN^~G1AEj*pPH81-4XhS|taqH!qB zUP9&(SAUT6kCyh9hOhU&vYGstL!op80wm&}VGIX#Tr2VOt&pSQgb-a}*79s~;qWa! zE018$AE&ot_7|{NocJZ;S3mLuGABkU_{ba7MFivIV!-qZACAyw&>Xm7U+0o*bDNXHXHuDxjw1VaS>($yG9tO^TW;WgNInL)VplK|w0YH&i;SC@8{R_^rMXt>O zkYVyD^2S-WUA4uGjqu2tG_+w^J0S9&Ur6 zw(B0%o`xG)=+`CwQY4)|3}!hi)4N*D(H;sMEi0@6TYNEfAADr_Ia)L5&&eNkqe|!3 zOoXWKDL)8-Duw(xBYWP_oaTQN5Gv*YmD7P#&Du}yr)G$BtMWTfH| zkn|ylv}p^SdhEYm08TUrB=5kYG017$IJmzmSWx1aOIN^~^yA-S2jvwowZd4>h?Yn| zc$mH|2b&w^?amWjzWnt8GP)h^>u$@;)&n2qS-K96t*Z z%L~CtW*gDbg5-tMC0cGe2HLmox$QU}$uHj!Fl&%v^Rps*`>X|5pV zt)M?Lt4e~D>^;Q%zo6L1>MwmA8bc<9B1k3E|9(FT`1)j}?ej`&i`xyKchQntCeble!lo*OcU{lvM z`#nj9=JDxDl7IY-bIed7Ha{nPaCPsjn! zaY0^sw1w&BChQHY*xzI_dNG-Wn^NaaNF2C)R7$v(*UzgY8@%dFBVMP9@a2eHlJJ06 zTOqS=q;Ap_fqKtRBj1iWQ4`frrSF3&*zbG_qUaN zsiPn|DJDFkrfFW`jrJ0eJDQk*K1tz@=P*ep3_pr4pU}4wTRV)a0AjgDb9Y_-tOJcY z>GA$-B)pYUCJ{d6TRkaav4M<^Dv{&Ts3j&~hK5--&o*;AE@5p|sxD!~N=IvVUy}L4 z&S~75R^SySz$0=4FhGA(qC|Hk_2$*2)qewhz`s-u04RpFIN%xd_nIM)R#lq4@7}qE zzFD+Nf+uR4U`nNa_uk?=ZUbGRg&4~qEQ(hhZqt#dy1LEg*C=`V5{M5i&}IxKA=V4b zWer}}T~re&q?7AYkr=b&zJ%Q-E{-F1ZiL3DaMpAznTSjW5=MQ^?07)T3~|9a9f}?SKWr+<+-#xr$t4 ziZmuH6uZ@SAAEI@35PMgy2t-@5*XlZO3tw=m|6Hf9AsxR7v11IS`3mMB7dz+sbH3$ zsq4t+PcY?|P<{F}h;(GdtT#4Huw|l~va}lm-3n4O=a1urXZV6OUKhd)i{e2+IqdL- zpuK-fkwwLkx&Z21Vr24dcIq&p%*wniu#={uj1D6Fcd0&R~`C&MEiX zAw_f(e){D7E4pZM3{LV-TsX*66;3G#f$zkwnI`CF6zFysw@$~wQkZ2>Y-s08;jwZN zcgAnLwp&=0ln%g$2n3#FhaU`~ziO zs&8Wa?eyZ$NOC3_9raEDIaz9Lp2&js3gE z5r3oBf*=tLA1FwxnZoY@ghhS8H8UV38PvD=zx!DXb@Ed`6?j>w9a>Jt%-M$kNjxrq zp&lZC{5YOI3frwAqm*)+T(UjtHFL_fiQ&?RCaNN7lsNfNP!50KZ+FLInetBC%6q@7 z)fYD&Blul{Lgi}wK)&sN(-&VacLQ_fK&u&^qoV@$EB3wJoz_I>X9dM@+9rc2-8*RyDj zsLgcVxLWgtrOY2@TbdzFbkOA=@KHZSgjx+`iLVA<$E>gmN7OldF!tRjNQK@1jf^t| zERgG=?4AIhqXyuq0B6BX2af0Ia*G=fRrq}J9zf5i0Z1hN*0XSp3Ot^(l?u~7#OrL? z+*(@=ypF!dIH5R8!4Ta z{LDL=U3|Q~dOs1{W$9zVWbg+Q(i%LO+(-Y$vV?_lm+;ZLoSSS+(=)H=SI`%~kr0jY zPO;^3FWDB7RbT6zMAdTMQjOoTy3&-oTe8hl|5!3-?ksV8HP5+RFmUfFwwF40vgu+R zv)mZN_1^STdMyGb4~kiXC`a_6g~o6*r)9({e=rN5(+LTcjoluso@oRRSFRsZ;Ez83 zH#VCO>$u!36(Bhbhuu-l>?uisz{x z1!ii5_|t9RRsDJhGa$Ks&Tv|=)Tl5&Txn}t!zOi7jGhPXd?3>%jx;1ULTDeLs0p3- zLoQ~UTn|$<4z&Tb0)EU?w6yR&K;uFwuQx7O!j&5hJlv*vy=u;1kBJjwYV7LgYnQ(w zqpIvGO7gP@mZbU)Owia-y3~IG?byC$Df&`4!^O}iG6CY=-;cRUIxRB2~5VjIHQzsPESFfEX zSIK)F1H!w`>NwkicfNlpm4A}Y%BuGxUWVK@nWS5HDSvEH{t`C(da*(1%ZL7CWBo~R z(iEudt#5Vi`1pQp_3>tBLs*n#JUg5&5#}3@seG1du9N7(nf^vsMy0Ha2%9T31EW- zR_kUMUfFfyb&>HOw>>{?TRkVUleGLfA7XFZ%>npJB-mEJU3Sv9zh?p{Ag_ru+P~?O z#r@UbZZ!Hdjt)=hue{e3&$oT*=0iD) zgp;r_{mt%r8zj*KWoJv%lfcrL_ZDiucV8XM(XApx*-=P3zy4SNB6A9B@+)mBRt`}! z;jfp*WNC`7PyUipVhJI~sTP`hYpaQeib1GBps>hE0D3B=5N9{6$(~Qqs9eLva&tZ> zRjCLhrBmhfnRx!H1}|`nw>U|KdWMYh;XBDe2g_N%m0a+ykt!Waj8*3P3U0in1!^*O znFy7J#q-HAVe~-*P4~*Pyf)35N!UQ`mu{WC9Lkgwvx}$(dP8Sy1mwNIJr3 zSI{<4p}vSfFzKZVdO-*0sHWW!@#mKS_8nRgMPbC(qlSz(&}VEIMdOQS0~ zO&!)I+g_57yH2Fkx!F`tXB5w8d9iAZe>qM+Z&pqN`FWaqDW29SS^?aU=O%>01xQZ> z3f(qZMj-4d0no2k?&9Cy#Y;YlKNdba{>A9ob|96Wjk#}gt4^({+8(}_^m=*lH%kkU zbF4;sfh5s8fM2No!iqQ_IJ)X82nlt+9`e^8Hy)&93UzcW`~v-qa|LOPYR@zbjUBWc=IBiMt&KlAVP@vkBu!2TlFFt2EQz6@VPk#*sHG|(qaXt9 zh;WINFCSfmb*7-is))VzEZgtwq+wX|;Aun&k&1wXvx`sOLje79^0(KyCfNsCG9asA zQyuO9YC7wvCIhyOkM0hEjYg!U*~rn|f`CY;bd8pj5=M77DBXzCFuFlN=|)6BKqT~g zc;ENq9M0iz_-8!Zo!5Q+7FzWbUyyWMbUx)rWBlkzrc$b7oSOQ<*k^B*>MC-$5X)C4 z&&)IpxOLCd;#?ua_4G0t%O?JJLgg!q^Jl-dCUHMzsH8i^?xZQ0l$O!?pkfsL<>%UZ zJs)|Ut^UL%o;?fJnNziYe$4K+JT%on|CA&M32qqI(sk^P?g4x(0m003RdgZ&kH3Eo zLQbq11A*`NxdETM)_s5i$o!_<{8j3@RNz&Mwcq_W^9_7qdJ%=uakDGIs?7$s4e92o zy$5tDU=O-9*twNL8D1)D{Z4>}oRs1A_3nQ%t7BRc7E}?v@`aZ)lDli@B%fl*5}PYa z|D6fERRrt2_J}|K1iSD?Fei(nLU8_-SSTKPg{HGFS6A35UlMtshDl|DtB5AXkl|*t zztnU)@@cKDlx~;1b$U?|`%L0zc}q-cT$ThA=YCs zT0L5U#1zB~qjEhgnvQ5e#5uRbtx>e;i<6S7vxx$-asVFO6lSNEL{*I+b`r`VLc|L_ zXwa|{AK~06{IMR6WO|>7P_}vt+;jaQf2$bmBau~tEiiSM-N?cxO^0Rkv1TVcLDk`s{7uLV? zr~l5A&WO{|AFKue4XISUrJnQ!fQH-n6LO?(eiO!cjb@uX-t+fck2GMv`Sjz@e!E)? zK=A|^Jo=suJsRL@?*U+XJ;3b*AgRKte+?+sdlmu!&&QK@w3>qtAD1Zp57uuUIHZ$* zA2_fNth5K#;X_8>1p?bao>xkeXaybm_6Td@!gp;Y*M~G6hIT8^63Ol1U|IZ;K!g2| zbE9E}D5v#8X}yv?!>)&7g=i`(&mUVb)kzEpYI)}wjbJM|@Ecjx+sfK(e58C{t3_GX zDerpTSXE_f!;lZQo-ttXzJ^1(9Sbu8!#_QWN6l49D z&OiIP+7jP|Mb}(B&)L;w9?Us&tgAL11g`*h!k*DNoW_dkH3#z@L1z+CK%>_(b+; zY0E8C)D`z=547LsJvWPh+zmDW`wh@icP&W*msuJAs2EDOKV+N^%efs6SOqGOE(kt- zI#E8S_2w=$b5Wsb(2NwsOErP;)#T^A#d<7#6DZ%CSBcSJaDwf`pC;Spj*SS^R<9JAItVZkxbj&z~!vSiD{??Q7Vcn3@`vM6WiD$Ah&2Qyg^nH`{J+*{653z7CrS2zgC??;j3+~ zQ^YYj`?;KiHiFdpiM@=%zEy{+mZkUyrD*pMkL&$f9)n3)0kmYFxA%>+Ph8_aMRrQZ z!(@!0Lfeh!~6RauwsmUeHblQadh*o{@;VQx4q;J?ZdwwaL@z5-}hfa zZr%QElKd^=Erji7S?45PuJr;$KT`hA$buI&UA~WIzD^ns2k8f^A#5WUI5xgVurdpK z&e~+Af9KDS66D~B@3K9$UOQ28bq{O+pM@#5iX0-Jdf`(2@o1Tx2s_5Xz1#B2pT=y^ z*oq3OX;z76G(=ye=VYK~WYklCzN!iM*5{Fnwvweehx)gtC3cbN!CW2XUsUvQe~6EN z`CCt)mMA*KlVaF7YTk8_Iw`R4;)Y8!d0D-6cNJfQP3Xl-eJw_)GwYi4Lv{vqYAD`{%y$!ubcx`tHo_8+Yd!A&`SVt_1E8ksx|~* zTHiNBOKFIC-W*jv6j#A$s7BzeeOz7nPzUqlP3nO4<9dM$B%kW_-K1e)vRE#d@u=r| zDA9kyx~}`?*!=+Tl|KS*BN~CzH3H-GJE|us_fZ3@K*87S0hD)lBZ+q^1B?J$SNGrk z#$E2!Cm7MEOQ3C>u?A9%6>HW-P-n8%gqvwTQAJEf?iSnIjDqMjrich&>%vc-cYS0& zde=l>w%_})VtI8`Be$DbkXZ2qdw<8GhU;YbxcY^Km^&E)Beghr%$14b1e;@CFI+!d zrs-=RePzV>fCdkHtqmZ*ibT`DT&`~LwHh_lpzk%M9p3UH>pc`cj9^M=NjI+*J?^-Q zW@rqKT*VEfv&?t)J+ZCLb+%!zsy8|+QqO4H4If2on{tD|>vDG zwJ({{lG`AtpB|0)$cF^q^Y6CjACMx>p8$;B|Ddyv^$S0o4TB5+OxTNZo&tPXpS|?w z(#HV&6sRErreFtI6^QSvK%MvL_yH|11Yj_mr^Ep#-O~?1HY>ayd=e#SUl@EPb2lLK zVEQipa*pjg;5;3eC~?{`-2YHKJecx+|NG#SEbzsh0|<5huJvUu_1%}ZWJv;a2Iy4A z>rdCZ+KUq`hNMJfw8f9g_N~V`8XY>~2h(hN@SNpoT89|{-(S&27p;!syh<2;La%S| zXW#6H5|J7$c9bDzT7=*ViZLHgL!v4aP>RJ~NtnoGaftQeJ)8J>@XuGafUu&=7KjW+H4fLHj)o9i8wuHsw|a1I<%sFe~y;%Oi*z?=FBiyntmj0D> z7u?>2kzpckLx8VAGj{4m%iQnOuglf~gu|Jc?2+h4-c*MLw1Q#oggB2U3}CBGdBDzY z&Z#lCPS8UYIbw+q!Lq^rg4J(~YBVxj;V0JiAJYejtnKt(69Ut~HIek~3NU*)?ffoC z^kA!=`}FE*=Po%(*K7$h`|B(FkT%t*+?rc}`5p2Hhyg&gS+cUhPwCS3H7fuJuN!O= zlYbwE1x@381dCw1vf6PdP`%`Oth)~oB?JP~2iaS@`6zqGiPxuIg-+zRVjs7N#!{-H z`RKYW0GNcH6Gi*J#r>lBy}^K#$l0H%A9qvi@!!?mjdr+n7Mb$KsRM1 zv~=F9eDb?|?`7_2>|AJD%wqDpZRd@Kq9^!iX|Hfr8C;moj6Wl(y1$>OgTL8ZsPXnuX) zl+?oP*omnYXPw6f`5lz~+$puKCNgkvccdZ|9ty?7JG6XeMRod;_TU-eTFgS$sDs9y z;MaUt+W4;ST2c)#t*z&hJgbDs%GP$FEJ6bS(p1#(2)dQ`pa_2%E@^lrISu27YIrG7 z-?VME^V{5Fap%9?_ojjmUq*VwU^93@CaRjT1o^FmVw!A~4?G|ZdZzK44jmECKWUqq>Xdt- zDd-M?`E~dptw`Biwtc}-BTy9zFqWmeIh*Sk6X9wZc$@ebDJ5oYh$ze1?Ds-=5CiT4 z!D*t(Qt4~BC%Idc$k&ouYB4_SpA`+^mSQT|*@Bgb2#Kb_&#n)pJVVZPaoC{iMJWcU zP|!CQ&Z$cUUFU=VjPG>XE;MhzXC0C_Qch-RtL}y_k%V$T2`*^fg@r@Uo)Kv1{KEe= zj&fnE6ylLbBJB>zj4$9;RBL}}qSC*VaXku@WM9uon4#N8_%&H`R+Lsc`c;&gzoiWS z91}`@!2CrNFPTrstRly{jE3~&4NMP%bu!uhRO68)I2=$q?GPB2Ikd2*vMee&uBJee zr#sRi$`TWgo5w10fe4vS)agF2DF##w_iL8Mv>sI!2lxQcVLUd%?f?dKKC_CCL@sm! z?IbU&wLbxt`_gBz+6|b>PHg585v~93fVlxsV&itrC`AAabdkcs{)b6H79M$pbW>sG z@$Bq$K%vfC@4#r6d52RFPS+OK2LB;ZO1G!BN$qZwwYv^EleUy%iR11clZEHnyhTJw zV4JyrKV|>UN&FP~qBs}nNceSAT$*i}NMO2M$-ZFV22TU&$Z6@8qzfMN|73L--%oV5 zDqH+k$B1Bx!&J!yw^(IJ(7X&3{>?6t>5M7LN~LvE*es&NGm(5!_0vV6kB4;+ZW!t8 z3gJFG6IYR=bf+=l1Y3RY zB0U*)AJeIaY%CPsicZ^SLT#4@a7K@KQ~{ddGy*B{@xki^E)?0Hco@o~LF(y63{~o< z6BU77Xr$%#xp{8;CE0WH;7ed6jCxJ_<%pRIJODIIA>V4-_l4(ycJ+6u%uVT5!TzD7 zBi7PXfmGnK?{>o#c=X5p`j0o{Di3+U4*e~{jpWe0my3wqm&u#0!ZW*U#`$-gv;Z#} zQc^(E!kDo$LZGB*CT!c0k^`}!Psy@E&Gu4S-v)VXB#bB%!_%ziYdhM8VJe@#aT zmc4eU)~oyKdnd-PO;33i!MH@Y=80o5jMKq1=slHJ?RaxD>tNWg>_k<*>PUxWkz%um zIJ=^%WByBO|KXY`;sWO?zcm0 zpQroTc$uH>bQ5sGmpQH~wct7h=<%!oy5O)hah?2@9Pwj)Qp=~hs>*>`67uUm@6p7y zOA}n;-N5ZHGv2X(6yBz}fr{0H;s4wXb69fz6nmdsPmqR*fpNzo^6yvEoRiA5w34yS zG|(J&Or)w^lh&A8c@$-eCT8HYFGKK+=k?&yzT?2%sA|Y=v+uA~$$gS+55e+t*B7m5 z?=)sINu!_f_+W|%=yLs>@nO{Lf`b~AvB@t(wXh5#WAH_Q1TlychEXP#mX;JxUQ$=X z@II;T@s}r8VmYly;>NaZ#bOxKi56Q$xT@G-r=Srj;RSl{i6&q>FxZA|^}XIA@Be23 zHj!@^2)OvHi_7q?bt%~R1R@@D(hU~yZ}WFyBjUfYK)KrRfL%}9%PxfGi!G~-?%>HI zkL}neuEoLB52|1t_^R)vlRva2h1A;30cSjIW`=4ZlXt_t30x$jN}1;7cmD4%;>Mr{ zf#lc&TiG-;fwO;oDFB*dT4+Ui@9Hwq5w2XJ*rEMX!skp+N=e1PSNN|SS9%|ga)BO; z!H+Gr$wAIBGp6Ih7aM(|jOU3Bj^fWH|VJhK!lbE*x@ieBiOu*>;Q(U{l< zZQ)V|ZuUJ@t;8n8vGS`HM|EVa=2_2h!@uO49DYk?hhrU zs?M%KMm@3bQ~VHnQ3`X94jRc+!{uuBQo=m~FVd&IS+djHrS}^I%!0FUcjqDnDMV0t z?2UJNx+BV)N<*0nL5CGlQsLL|ov-QO9h+36=1UB{faO^|LqZ?-l)V_Y^0 zl{Px-a!pbH{aL?@?1$Wxg{aMu_lo=XC~>}Bh=y~8{DOXPu(#SA{Mef?N4Eowr>n2< z!=0)cvY+TO+-Fji85K!cOoKxtV5SyRP*EZ%%f}n-y(FhV?D&KbgN*{exho@p@`H8v zA>tjiuT*DuM7sq|n4<`NkSq>oN*?6MsyM1XX8>lcxF5!19|>r@YrjTVCJdqDfVzf@ z-PmVX;Wy;7J5_JQi7i-)NivrBpW8aT!$e_V{jPDpm{tB(P7UNfr{!p12h!&KGT!G4 z$-@;7KG|TfPfD;+%K$Gk)IF!Ja1E5dIg?Tj?>E?6mlhwX^%Nuwsynnq6GULl5wcB^ zPu{s7jdD`*N|3_@{7oljQNY|HBAUG`tY-28(=ZBKpIaZ)(oe*(y%P%SD5|*G#&ShI zl6>ye=LrT^h&~LEFwF+yQOQ5gsms_h5ImmU<0#P1oZaL`lj!wB(mH8Zwe&IhYm*Qtf8_44J~)F5Jdqm28R?7 z#DqMEJShJo@;Lpv^4Iw{Bh{`xg}sa%56Dy6~|cu(>wVkg{{U#lSqFZ;mY3Y5%&hY z3+)6=T46b1mrMZcS;5Mn_OlU8QCSX1>1HA?6(&=ud)fC_4Mzf|BPaJn(bb4uXg8-_ zl;R(S(Jn+u&zP>K>>#FDMLI%@z6NzLsgh(`NzKg>o{uOMs%H_CHy`R%l;-V&c!3sL z*w%zxuHFHZz8?c&Uy_6x?u}gbFU5l!B4%D@o|{)i$kbp-L}};A3_(yP$55`mvru_? z;g)aaE#L+d>C!Fw2e?f>cQ2p^lK#(YkGPpUSS`Tjyv^m2eDlJtN{2*5QTF*A;t>r3 zqf8R-B8?LM3QEk=qvVKNW8nI%+WFMMx7uWzCCe7MAaF5ElDT6H>)^6lTBI^ZI+hIme0 zOtgwKx*{TUWB+mQkAYm(eQRjp64u4714Nc{HMZApmejZqEGawL{$O#*9paNbivuyqunew0 zdD#xk5=O zcmy&{Els$_dz7#b!{lbiQo@g%W5pE%3RwVu1;+hzg=mws;DrlJkwp`i$-Y0 zz3kX36WwO2$zNrfo+}<1dym*zb0Nf1#5#MNG)w!qg4m0#9TQg-pZ$2ZRp};xG>c}? z=)Jy1ISWB;&(Q*v78b@AN4eY(D>eRr;wv+Fr^s+?L}ojSP~N6zKO;;&zKiBV^6H^? zNe^9CRJogNN!SsMfCH{ivp{j4fUxWdv-f%3~5vehgZxLs^-A>Mm&Gq0U2O+Dfs-7U?|F&*TNvqJ{z}G*w|M-`P!Q_-Q!Y16y_~?=iL-)b(Xiem!)LLu*+@AWqVGV`#SBOv63sm}OjBk>!Cibw`gyP0rjW`<% zNVqkP=?Jr(tdz5i34RMQ8q_Q-hx~E-&Ko^ zc=e%=KPc>_62~2owA>IVGDAB#_)bUiW_U3zci9^(tZ=O9&1IDhMZ@ER*gHX!%t~F8 z3$zlALuUp}lBm9PPtvDJt0QW#b4xjOvB6@CF-UmSW_|h~ItN7gU}@qrN(qf0hMb_C zfFYTLtK1>2|MC6aovBy1=Czq)DuX1Tkf) zK$3J2e0%M16FS2O9zF5WH2SZsR-Q%a!0)qFR#lH5#is1;FyrGfPxp5q+Xc*RL^RdjhIt1)UaOHdndw|a+2w5h;sAYJ z!dy}*37Tf50}VlMlSj`B+p(SN{CW*hq>eV$M%kUhuwjXX~ zajJO?i-RFA+y{%{2|J^iV*yj_H znfGqfJ|@?UayC)$xS!8~YizUEI82Qej4bHZueiE*@o^l$UC6b8^NB6x$ zmPsmkNODZP)hY`PjE>2kkAZccg~N#W%fzKVNmPcnXr)jkwX22qpezCL1~QpmbFM^` zKa&zY^E<0GK8YK1(C2vhOl3Ly-m9mRMihe7wImvaoEg#OGD6DgcM?z|MV%~S4W7tz zYjOgXNi;lxP`B;$ni|pj0CPh5+V5pn^FL9JlLphM4OLF*0aI>O@PZp@1 z3Z|xIzvx9}3%n+4@_Djk+`*P#{U!bowv}}Dy>*eC2;;2M_uIIFUX5uH!eN`}CLhu; zqVGaZ=pW-V?LoJfifaG$DPr4sLO@%lR3Jw~Ei}|tkT1`)$Nx?TXK>;e+i=YoCva}c z!p6qMRMgxE83i_kRUV^?M!7cNi003GCP`TzrbD*1UVLqI0nwYMT?ue8~boB9;A z5L6vf-*1Be4s3kWt_DPT#$DYHM59dZ&RG4|5_}rK@tjMkCs~~G5sp8?7x_j77;LCq zv*z^-QDi=0ehZ#PSy$^ssQjcL1MoAGCd+kP44;xS5sq>roN8IxCqW3;!j<9l10a%J62ZoF1gZ%*Qp)|MChfeAo~ne ztFH&9M~-`QcUYAxNUr?N+7?Fj20Gq~nb_@#jEI|%S zy#e?8t1E3`D=8^7-n}(9%er{15>CIHlOV{@bqcDQgJHKHB+-fHGoyT8$cbC-SlZPn zcUY@QMh~goI`XLV)6-3ok)fs05^z5v&xyeN{hW$&tc(iM)#^xGumftatBL=Sya*#c z4Bp3bphKY{#YV;;%F^z6lO9Dk($AS{9n!qgQfM{EBJ@pBVgCySyE^>@JcQ;we4H$Q zJ(L8D#NF9pltWpk{n`a}_8D%NYcS>58|89E%BiD{nmRw`_50WJ*9`^?w}(!V({?aiVgT-B8Utk ziKe7Z(V#4K7Yjaia5#swq^-^i>XsbLBp_gf>uFn8!buDo-KK}jMH@nTc(^6%Z4TNx>FQ)ya7C` z!rlZfsK`%gONQnaAMIG3DYehG`?OqQEXsoI9jh8|AS%xR1 zHfDX5alJ*S{FlNOG|LOV1HF04fAZf$!l7bJW@GU|`1$YYIkS`}fcoAN!&txK<4V3> z3oUqOegqCb%^amuXBZI>q7kjy1LG7%_BQ0fC)Vo63f_vb@lcaCB6CX`fB}>ggdO11eF;!PAGKjVwswO2`q<5Cz9JAvbiHSHw zI*iv|Y&FP%w-wy@sHzRQ#;L;rO7@N5$Ud0q;l)~by~mxjAV;P1v}G2p;9?|jc8chn zhxJttt(czUG?4-H(u=NM_T++sub>=T{+=_+?v*&y=4f!NHCR{k6wP|A&!RKyXi#Q1=AJ|asU#?h-9YdFvPL*@vhKkhoizWc z?GsT@nm$-Vee?G=3XK0{D^pxkt3;F%xm;e1652G6F%s#EZCx&gv3 z^NT}0)^QecE}S@jpXOgil`sxc@6I$HupfHmXvc}8t98f}Sq@dCq3HKt2CfUB@4t7jgGbGjFwm~?f4)vjMr6F&|^!%XlN~?KbC$xphYcal)uelSIpv)R89J48QpY@6prA zK+I~-#B=3~F?1$$R0{e@*+w@Z<1H9CmL`mM)KgocJ=tbm%!H4Mu7CCc$Tq8Q?wdMJ zSo@M1SXoM^9QIbb++X2Cm>jxR&*G?8Y1V#?Vz^(@$z9;{G`Mf%iM#>(VMNI94O6rw^afQ@X!{)5%{JlSCYQ}0rWLKy+n^Vrjy8!386f3_X2IfU8kbDHfX&p=uEZ(pa~!DT?Ps< zF_ecxZ{*G+bf4RqFsF=Vd=-#CH-B)K$3GW!?b9??p`ILTpOAC z_v4F6M$*cEWo=h~R4>?@ivpaOtmD|;$2 zi16cx?*n60-G?vB(1oXL?c6PpK2kGWn{>Ah9XoiSYwxaDLp&T)ujffSV{~xW9-;BV zVxWDlNFkLU!|`%|NeA0?L6zxX^fsu{iJMPvs#Mi zP|43g2O=B`QmyxEHv$2y(m6)?&nc>i4r-$+>gvh3j>FD{;Xyt{oS%FwK5lm;*0?k2 zZBFX8O&er}-IL(I4s;}lG3WbcG=?K?x2WvpPT-}(f`Kt98}DmVJ0|;QtTfC>8y{d! zpb01l-xD>JO&b)u*Wt56qWRrx=lzUU>P)#wO*3{vlQ%}ic?zrM7#xl`p8sbsWYslr zxB4>)WSlxTPD!+!xSCo}#foPgtVuAaRl50N=e4bPZ>F9gd@r?(scfBX;a?ZhIz#x~ zldf!VEvQCvX%{Ejtg4vYWXp)0Ao92;KHd18!&x8{#*yd{& zad;YJ&ioEfuoV}%Eeb!~#O93ZJYVUvQ)tAfkyh!m+`XjBAYG3XP1crB&@ZPVr;tYR zsqpa)S#VM}%JCEF9+dHL#s%4P{9v8N%-E7+3-tgj8=MwS@x_D2y#Sy37~>G(lpoTh zs^yS@K$~(st|0-*De*-^YKeQhhAf`9hpR&N6J-}~3s)||)b#fNr F{|7M}jlBQ> literal 0 HcmV?d00001 From 32a409a69970cad31492edf563f20b582af1bfc2 Mon Sep 17 00:00:00 2001 From: Hanbin Noh <282618027+hanbinnoh@users.noreply.github.com> Date: Fri, 7 Aug 2026 00:59:26 +0900 Subject: [PATCH 3/8] fix(integrations): address review on the omp client - Reject a relative PI_CODING_AGENT_DIR instead of silently anchoring it to opencodex's cwd, so the toggle cannot report current against a file omp never reads (Codex P2). - Treat a blank OMP_PROFILE as unset so the legacy PI_PROFILE falls through, matching omp's own env precedence (CodeRabbit). - Register integrations/omp in the app router so the Oh My Pi tab does not bounce back to Overview (the user-visible tab bug). - Make client-config UI copy format-neutral (config instead of JSON) in all six locales and their tests. - Clarify the oh-my-pi guide: ocx export prints, the dashboard writes; openai-completions is the OMP adapter and OPENCODEX_OMP_API_KEY is a local provider key, not an opencodex credential. --- docs-site/src/content/docs/guides/oh-my-pi.md | 7 ++++++- gui/src/app-routing.ts | 1 + gui/src/i18n/de.ts | 12 ++++++------ gui/src/i18n/en.ts | 12 ++++++------ gui/src/i18n/ja.ts | 12 ++++++------ gui/src/i18n/ko.ts | 12 ++++++------ gui/src/i18n/ru.ts | 12 ++++++------ gui/src/i18n/zh.ts | 12 ++++++------ gui/tests/client-config-panel.test.tsx | 12 ++++++------ gui/tests/integrations-routing.test.ts | 9 +++++++++ src/clients/config-export.ts | 7 +++++-- tests/client-config-export-new-clients.test.ts | 14 ++++++++++++++ 12 files changed, 77 insertions(+), 45 deletions(-) diff --git a/docs-site/src/content/docs/guides/oh-my-pi.md b/docs-site/src/content/docs/guides/oh-my-pi.md index 83380a563..445818bf3 100644 --- a/docs-site/src/content/docs/guides/oh-my-pi.md +++ b/docs-site/src/content/docs/guides/oh-my-pi.md @@ -1,6 +1,6 @@ --- title: Oh My Pi -description: Use any routed model from Oh My Pi (omp) — ocx export writes a custom provider block for omp's ~/.omp/agent/models.yml, wired to the running proxy. +description: Use any routed model from Oh My Pi (omp) — ocx export prints a custom provider block for omp's ~/.omp/agent/models.yml, wired to the running proxy. --- Oh My Pi (`omp`) reads custom providers from `~/.omp/agent/models.yml`, so @@ -36,6 +36,11 @@ providers: maxTokens: 32000 ``` +`api: openai-completions` selects omp's OpenAI-compatible adapter, which talks +to the proxy's `/v1` surface. `$OPENCODEX_OMP_API_KEY` is only omp's local +provider key for the `opencodex` entry — it is not an opencodex OAuth or +access-token credential, and opencodex never sees its value. + Merge the `providers.opencodex` block into `~/.omp/agent/models.yml` (do not replace the rest of the file), then start a new omp session. The models appear under the `opencodex/` prefix. diff --git a/gui/src/app-routing.ts b/gui/src/app-routing.ts index 7fc5cfea2..0d7df41ec 100644 --- a/gui/src/app-routing.ts +++ b/gui/src/app-routing.ts @@ -76,6 +76,7 @@ export const INTEGRATION_TAB_HASHES = [ "integrations/grok", "integrations/opencode", "integrations/pi", + "integrations/omp", "integrations/hermes", "integrations/openclaw", "integrations/kimi", diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 1d028b3ae..cb3f1d772 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -1123,11 +1123,11 @@ export const de: Record = { "api.clientConfig.rowsLabel": "Client verbinden", "api.clientConfig.details": "Details", "api.clientConfig.detailsAria": "Details zur {client}-Konfiguration", - "api.clientConfig.copyAria": "{client}-Konfigurations-JSON kopieren", + "api.clientConfig.copyAria": "{client}-Konfiguration kopieren", "api.clientConfig.downloadAria": "{client}-Konfiguration herunterladen", "api.clientConfig.rowMeta": "{destination} · {count} Modell(e)", "api.clientConfig.rowError": "Die {client}-Konfiguration konnte nicht erstellt werden.", - "api.clientConfig.copiedAnnounceClient": "{client}-Konfigurations-JSON in die Zwischenablage kopiert.", + "api.clientConfig.copiedAnnounceClient": "{client}-Konfiguration in die Zwischenablage kopiert.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", "api.clientConfig.clientOmp": "Oh My Pi", @@ -1135,10 +1135,10 @@ export const de: Record = { "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "JSON kopieren", + "api.clientConfig.copy": "Konfiguration kopieren", "api.clientConfig.download": "Herunterladen", "api.clientConfig.loading": "Client-Konfiguration wird erstellt…", - "api.clientConfig.jsonLabel": "{client}-Konfigurations-JSON", + "api.clientConfig.jsonLabel": "{client}-Konfiguration", "api.clientConfig.destination": "Zieldatei", "api.clientConfig.envHint": "Schlüssel vor dem Start setzen", "api.clientConfig.mergeWarning": "Führe dies in die Zieldatei ein. Ein Ersetzen würde deine anderen Provider und MCP-Einstellungen entfernen.", @@ -1146,8 +1146,8 @@ export const de: Record = { "api.clientConfig.missingLimits": "{count} von {total} Modell(en) haben kein Kontextlimit; der Client verwendet dafür seine eigenen Vorgaben.", "api.clientConfig.noKeyYet": "Für {env} existiert noch kein Schlüssel. Erzeuge oben einen Schlüssel, bevor du diese Konfiguration außerhalb von Loopback nutzt.", "api.clientConfig.loadFailed": "Die Modellliste konnte nicht gelesen werden, daher wurde keine Client-Konfiguration erzeugt.", - "api.clientConfig.copiedAnnounce": "Client-Konfigurations-JSON in die Zwischenablage kopiert.", - "api.clientConfig.copyFailed": "Client-Konfigurations-JSON konnte nicht kopiert werden.", + "api.clientConfig.copiedAnnounce": "Client-Konfiguration in die Zwischenablage kopiert.", + "api.clientConfig.copyFailed": "Die Client-Konfiguration konnte nicht kopiert werden.", "api.clientConfig.downloadedAnnounce": "{filename} heruntergeladen. Es hat sich noch nichts geändert — führe die Datei selbst in {destination} ein.", "api.clientConfig.whereDisclosure": "Wohin diese Datei gehört", "api.clientConfig.whereBody": "Der Pfad oben ist der globale Speicherort. Eine projektlokale Konfigurationsdatei im Arbeitsverzeichnis hat Vorrang, und der Schlüssel wird aus der in der Konfiguration genannten Umgebungsvariable gelesen — nie aus dieser Datei.", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index 4d6fdc656..d0911b93a 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -1586,11 +1586,11 @@ export const en = { "api.clientConfig.rowsLabel": "Connect a client", "api.clientConfig.details": "Details", "api.clientConfig.detailsAria": "{client} config details", - "api.clientConfig.copyAria": "Copy {client} config JSON", + "api.clientConfig.copyAria": "Copy {client} config", "api.clientConfig.downloadAria": "Download {client} config", "api.clientConfig.rowMeta": "{destination} · {count} model(s)", "api.clientConfig.rowError": "Could not build the {client} config.", - "api.clientConfig.copiedAnnounceClient": "{client} config JSON copied to the clipboard.", + "api.clientConfig.copiedAnnounceClient": "{client} config copied to the clipboard.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", "api.clientConfig.clientOmp": "Oh My Pi", @@ -1598,10 +1598,10 @@ export const en = { "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "Copy JSON", + "api.clientConfig.copy": "Copy config", "api.clientConfig.download": "Download", "api.clientConfig.loading": "Building client config…", - "api.clientConfig.jsonLabel": "{client} config JSON", + "api.clientConfig.jsonLabel": "{client} config", "api.clientConfig.destination": "Destination file", "api.clientConfig.envHint": "Set the key before launching", "api.clientConfig.mergeWarning": "Merge this into the destination file. Replacing it would drop your other providers and MCP settings.", @@ -1609,8 +1609,8 @@ export const en = { "api.clientConfig.missingLimits": "{count} of {total} model(s) ship without a context limit; the client applies its own defaults.", "api.clientConfig.noKeyYet": "{env} has no key behind it yet. Generate a key above before using this config off loopback.", "api.clientConfig.loadFailed": "Could not read the model list, so no client config was produced.", - "api.clientConfig.copiedAnnounce": "Client config JSON copied to the clipboard.", - "api.clientConfig.copyFailed": "Could not copy the client config JSON.", + "api.clientConfig.copiedAnnounce": "Client config copied to the clipboard.", + "api.clientConfig.copyFailed": "Could not copy the client config.", "api.clientConfig.downloadedAnnounce": "Downloaded {filename}. Nothing changed yet — merge it into {destination} yourself.", "api.clientConfig.whereDisclosure": "Where this file goes", "api.clientConfig.whereBody": "The destination above is the global path. A project-local config file in the working directory takes precedence over it, and the client reads the key from the environment variable named in the config — never from this file.", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index d74056264..2872ace1b 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -1531,11 +1531,11 @@ export const ja: Record = { "api.clientConfig.rowsLabel": "クライアントを接続", "api.clientConfig.details": "詳細", "api.clientConfig.detailsAria": "{client} 設定の詳細", - "api.clientConfig.copyAria": "{client} 設定 JSON をコピー", + "api.clientConfig.copyAria": "{client} 設定をコピー", "api.clientConfig.downloadAria": "{client} 設定をダウンロード", "api.clientConfig.rowMeta": "{destination} · モデル {count} 件", "api.clientConfig.rowError": "{client} の設定を生成できませんでした。", - "api.clientConfig.copiedAnnounceClient": "{client} の設定 JSON をクリップボードにコピーしました。", + "api.clientConfig.copiedAnnounceClient": "{client} の設定をクリップボードにコピーしました。", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", "api.clientConfig.clientOmp": "Oh My Pi", @@ -1543,10 +1543,10 @@ export const ja: Record = { "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "JSON をコピー", + "api.clientConfig.copy": "設定をコピー", "api.clientConfig.download": "ダウンロード", "api.clientConfig.loading": "クライアント設定を生成中…", - "api.clientConfig.jsonLabel": "{client} 設定 JSON", + "api.clientConfig.jsonLabel": "{client} 設定", "api.clientConfig.destination": "配置先ファイル", "api.clientConfig.envHint": "起動前にキーを設定", "api.clientConfig.mergeWarning": "配置先ファイルにマージしてください。置き換えると既存のプロバイダーや MCP 設定が失われます。", @@ -1554,8 +1554,8 @@ export const ja: Record = { "api.clientConfig.missingLimits": "{total} 件中 {count} 件のモデルにコンテキスト上限がないため、クライアント側の既定値が使われます。", "api.clientConfig.noKeyYet": "{env} に対応するキーがまだありません。ループバック外で使う前に上でキーを発行してください。", "api.clientConfig.loadFailed": "モデル一覧を読み取れなかったため、クライアント設定を生成できませんでした。", - "api.clientConfig.copiedAnnounce": "クライアント設定 JSON をクリップボードにコピーしました。", - "api.clientConfig.copyFailed": "クライアント設定 JSON をコピーできませんでした。", + "api.clientConfig.copiedAnnounce": "クライアント設定をクリップボードにコピーしました。", + "api.clientConfig.copyFailed": "クライアント設定をコピーできませんでした。", "api.clientConfig.downloadedAnnounce": "{filename} をダウンロードしました。まだ何も変わっていません。{destination} に自分でマージしてください。", "api.clientConfig.whereDisclosure": "このファイルの置き場所", "api.clientConfig.whereBody": "上のパスはグローバル設定の場所です。作業ディレクトリのプロジェクト設定ファイルが優先され、キーは設定に書かれた環境変数から読み込まれ、このファイルには保存されません。", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index 8cb67f551..8c1c87608 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -1150,11 +1150,11 @@ export const ko: Record = { "api.clientConfig.rowsLabel": "클라이언트 연결", "api.clientConfig.details": "자세히", "api.clientConfig.detailsAria": "{client} 설정 자세히 보기", - "api.clientConfig.copyAria": "{client} 설정 JSON 복사", + "api.clientConfig.copyAria": "{client} 설정 복사", "api.clientConfig.downloadAria": "{client} 설정 다운로드", "api.clientConfig.rowMeta": "{destination} · 모델 {count}개", "api.clientConfig.rowError": "{client} 설정을 만들지 못했습니다.", - "api.clientConfig.copiedAnnounceClient": "{client} 설정 JSON을 클립보드에 복사했습니다.", + "api.clientConfig.copiedAnnounceClient": "{client} 설정을 클립보드에 복사했습니다.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", "api.clientConfig.clientOmp": "Oh My Pi", @@ -1162,10 +1162,10 @@ export const ko: Record = { "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "JSON 복사", + "api.clientConfig.copy": "설정 복사", "api.clientConfig.download": "다운로드", "api.clientConfig.loading": "클라이언트 설정 생성 중…", - "api.clientConfig.jsonLabel": "{client} 설정 JSON", + "api.clientConfig.jsonLabel": "{client} 설정", "api.clientConfig.destination": "대상 파일", "api.clientConfig.envHint": "실행 전 키 설정", "api.clientConfig.mergeWarning": "대상 파일에 병합하세요. 덮어쓰면 기존 프로바이더와 MCP 설정이 사라집니다.", @@ -1173,8 +1173,8 @@ export const ko: Record = { "api.clientConfig.missingLimits": "{total}개 중 {count}개 모델에 컨텍스트 한도가 없어 클라이언트 기본값이 적용됩니다.", "api.clientConfig.noKeyYet": "{env}에 연결된 키가 아직 없습니다. 루프백 밖에서 쓰려면 위에서 키를 발급하세요.", "api.clientConfig.loadFailed": "모델 목록을 읽지 못해 클라이언트 설정을 만들지 못했습니다.", - "api.clientConfig.copiedAnnounce": "클라이언트 설정 JSON을 클립보드에 복사했습니다.", - "api.clientConfig.copyFailed": "클라이언트 설정 JSON을 복사하지 못했습니다.", + "api.clientConfig.copiedAnnounce": "클라이언트 설정을 클립보드에 복사했습니다.", + "api.clientConfig.copyFailed": "클라이언트 설정을 복사하지 못했습니다.", "api.clientConfig.downloadedAnnounce": "{filename} 파일을 다운로드했습니다. 아직 아무것도 바뀌지 않았으니 {destination}에 직접 병합하세요.", "api.clientConfig.whereDisclosure": "이 파일이 들어갈 위치", "api.clientConfig.whereBody": "위 경로는 전역 설정 경로입니다. 작업 디렉터리의 프로젝트 설정 파일이 우선하며, 키는 설정에 적힌 환경 변수에서 읽고 이 파일에는 저장되지 않습니다.", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index ae71c975a..7f24c4e62 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -1573,11 +1573,11 @@ export const ru: Record = { "api.clientConfig.rowsLabel": "Подключение клиента", "api.clientConfig.details": "Подробнее", "api.clientConfig.detailsAria": "Подробности конфигурации {client}", - "api.clientConfig.copyAria": "Скопировать JSON конфигурации {client}", + "api.clientConfig.copyAria": "Скопировать конфигурацию {client}", "api.clientConfig.downloadAria": "Скачать конфигурацию {client}", "api.clientConfig.rowMeta": "{destination} · моделей: {count}", "api.clientConfig.rowError": "Не удалось собрать конфигурацию {client}.", - "api.clientConfig.copiedAnnounceClient": "JSON конфигурации {client} скопирован в буфер обмена.", + "api.clientConfig.copiedAnnounceClient": "Конфигурация {client} скопирована в буфер обмена.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", "api.clientConfig.clientOmp": "Oh My Pi", @@ -1585,10 +1585,10 @@ export const ru: Record = { "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "Копировать JSON", + "api.clientConfig.copy": "Скопировать конфигурацию", "api.clientConfig.download": "Скачать", "api.clientConfig.loading": "Формируется конфигурация клиента…", - "api.clientConfig.jsonLabel": "JSON конфигурации {client}", + "api.clientConfig.jsonLabel": "Конфигурация {client}", "api.clientConfig.destination": "Целевой файл", "api.clientConfig.envHint": "Задайте ключ перед запуском", "api.clientConfig.mergeWarning": "Объедините это с целевым файлом. Замена удалит ваши другие провайдеры и настройки MCP.", @@ -1596,8 +1596,8 @@ export const ru: Record = { "api.clientConfig.missingLimits": "У {count} из {total} моделей нет лимита контекста; клиент применит свои значения по умолчанию.", "api.clientConfig.noKeyYet": "Для {env} пока нет ключа. Создайте ключ выше, прежде чем использовать конфигурацию вне loopback.", "api.clientConfig.loadFailed": "Не удалось прочитать список моделей, поэтому конфигурация клиента не создана.", - "api.clientConfig.copiedAnnounce": "JSON конфигурации клиента скопирован в буфер обмена.", - "api.clientConfig.copyFailed": "Не удалось скопировать JSON конфигурации клиента.", + "api.clientConfig.copiedAnnounce": "Конфигурация клиента скопирована в буфер обмена.", + "api.clientConfig.copyFailed": "Не удалось скопировать конфигурацию клиента.", "api.clientConfig.downloadedAnnounce": "Файл {filename} скачан. Пока ничего не изменилось — объедините его с {destination} самостоятельно.", "api.clientConfig.whereDisclosure": "Куда положить этот файл", "api.clientConfig.whereBody": "Путь выше — глобальное расположение. Файл конфигурации проекта в рабочем каталоге имеет приоритет, а ключ читается из переменной окружения, указанной в конфигурации, и никогда не хранится в этом файле.", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 7199c0974..6b202fab7 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -1143,11 +1143,11 @@ export const zh: Record = { "api.clientConfig.rowsLabel": "连接客户端", "api.clientConfig.details": "详情", "api.clientConfig.detailsAria": "{client} 配置详情", - "api.clientConfig.copyAria": "复制 {client} 配置 JSON", + "api.clientConfig.copyAria": "复制 {client} 配置", "api.clientConfig.downloadAria": "下载 {client} 配置", "api.clientConfig.rowMeta": "{destination} · {count} 个模型", "api.clientConfig.rowError": "无法生成 {client} 配置。", - "api.clientConfig.copiedAnnounceClient": "已将 {client} 配置 JSON 复制到剪贴板。", + "api.clientConfig.copiedAnnounceClient": "已将 {client} 配置复制到剪贴板。", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", "api.clientConfig.clientOmp": "Oh My Pi", @@ -1155,10 +1155,10 @@ export const zh: Record = { "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "复制 JSON", + "api.clientConfig.copy": "复制配置", "api.clientConfig.download": "下载", "api.clientConfig.loading": "正在生成客户端配置…", - "api.clientConfig.jsonLabel": "{client} 配置 JSON", + "api.clientConfig.jsonLabel": "{client} 配置", "api.clientConfig.destination": "目标文件", "api.clientConfig.envHint": "启动前设置密钥", "api.clientConfig.mergeWarning": "请合并到目标文件中。直接替换会丢失你已有的其他提供商和 MCP 配置。", @@ -1166,8 +1166,8 @@ export const zh: Record = { "api.clientConfig.missingLimits": "{total} 个模型中有 {count} 个没有上下文上限,客户端将使用自己的默认值。", "api.clientConfig.noKeyYet": "{env} 目前还没有对应的密钥。离开回环地址使用前,请先在上方生成密钥。", "api.clientConfig.loadFailed": "无法读取模型列表,因此没有生成客户端配置。", - "api.clientConfig.copiedAnnounce": "客户端配置 JSON 已复制到剪贴板。", - "api.clientConfig.copyFailed": "无法复制客户端配置 JSON。", + "api.clientConfig.copiedAnnounce": "客户端配置已复制到剪贴板。", + "api.clientConfig.copyFailed": "无法复制客户端配置。", "api.clientConfig.downloadedAnnounce": "已下载 {filename}。目前还没有任何改动,请自行将其合并到 {destination}。", "api.clientConfig.whereDisclosure": "该文件应放在哪里", "api.clientConfig.whereBody": "上面的路径是全局配置位置。工作目录中的项目级配置文件优先级更高;密钥由配置中指定的环境变量读取,不会写入该文件。", diff --git a/gui/tests/client-config-panel.test.tsx b/gui/tests/client-config-panel.test.tsx index ce2336c7d..d94185807 100644 --- a/gui/tests/client-config-panel.test.tsx +++ b/gui/tests/client-config-panel.test.tsx @@ -190,7 +190,7 @@ test("each row fetches its own client and its dialog renders that client's exact await act(async () => { root.unmount(); }); }); -test("the config JSON is not rendered at rest", async () => { +test("the config body is not rendered at rest", async () => { // The core of the request: rows carry the actions, not the payload. stubRoute(client => Response.json(client === "pi" ? PI_ENVELOPE : OPENCODE_ENVELOPE)); const { root, container } = await mountPanel(); @@ -199,7 +199,7 @@ test("the config JSON is not rendered at rest", async () => { expect(container.querySelector(".awi-clientconfig-json")).toBeNull(); expect(container.querySelector("dialog")).toBeNull(); // Both transport actions stay on the surface; only inspection is demoted. - expect(rowButton(container, "OpenCode", "Copy JSON").disabled).toBe(false); + expect(rowButton(container, "OpenCode", "Copy config").disabled).toBe(false); expect(rowButton(container, "OpenCode", "Download").disabled).toBe(false); await act(async () => { rowButton(container, "OpenCode", "Details").click(); }); @@ -233,7 +233,7 @@ test("row actions carry client-qualified accessible names", async () => { stubRoute(client => Response.json(client === "pi" ? PI_ENVELOPE : OPENCODE_ENVELOPE)); const { root, container } = await mountPanel(); - expect(rowButton(container, "Pi", "Copy JSON").getAttribute("aria-label")).toBe("Copy Pi config JSON"); + expect(rowButton(container, "Pi", "Copy config").getAttribute("aria-label")).toBe("Copy Pi config"); expect(rowButton(container, "Pi", "Download").getAttribute("aria-label")).toBe("Download Pi config"); expect(rowButton(container, "Pi", "Details").getAttribute("aria-label")).toBe("Pi config details"); expect(container.querySelector(".awi-clientconfig-rows")?.getAttribute("aria-label")).toBe("Connect a client"); @@ -434,14 +434,14 @@ test("one client's failure isolates to its row, with no partial JSON and the bas .toEqual(["Retry"]); // The sibling row is untouched by its neighbour's 503. - expect(rowButton(container, "OpenCode", "Copy JSON").disabled).toBe(false); + expect(rowButton(container, "OpenCode", "Copy config").disabled).toBe(false); expect(rowButton(container, "OpenCode", "Download").disabled).toBe(false); await act(async () => { rowButton(container, "Pi", "Retry").click(); }); expect(piAttempts).toBe(2); expect(row(container, "Pi").textContent).toContain(PI_ENVELOPE.destination); - expect(rowButton(container, "Pi", "Copy JSON").disabled).toBe(false); + expect(rowButton(container, "Pi", "Copy config").disabled).toBe(false); await act(async () => { root.unmount(); }); }); @@ -468,7 +468,7 @@ test("no-key state is informational and leaves copy and download enabled", async // Row actions never block on a missing key: an agent may legitimately want the // shape first. - expect(rowButton(container, "OpenCode", "Copy JSON").disabled).toBe(false); + expect(rowButton(container, "OpenCode", "Copy config").disabled).toBe(false); expect(rowButton(container, "OpenCode", "Download").disabled).toBe(false); await act(async () => { rowButton(container, "OpenCode", "Details").click(); }); diff --git a/gui/tests/integrations-routing.test.ts b/gui/tests/integrations-routing.test.ts index ad26e3d50..a0c5564d2 100644 --- a/gui/tests/integrations-routing.test.ts +++ b/gui/tests/integrations-routing.test.ts @@ -84,6 +84,15 @@ describe("registered nested hashes", () => { expect(resolveAppHashChange("integrations/claude/desktop").replaceTo).toBeNull(); }); + test("the Oh My Pi route is registered instead of falling back to Overview", () => { + expect(INTEGRATION_TAB_HASHES).toContain("integrations/omp"); + expect(hashBelongsToPage("integrations/omp", "integrations")).toBe(true); + expect(resolveAppHashChange("integrations/omp")).toEqual({ + page: "integrations", + replaceTo: null, + }); + }); + test("bare #integrations is Overview and has no suffix of its own", () => { expect(readPageFromHash("integrations")).toBe("integrations"); expect(hashBelongsToPage("integrations", "integrations")).toBe(true); diff --git a/src/clients/config-export.ts b/src/clients/config-export.ts index 6fa4dbfe4..75c48c888 100644 --- a/src/clients/config-export.ts +++ b/src/clients/config-export.ts @@ -365,10 +365,13 @@ export function ompHomeDir(env: OpencodeLaunchEnv = process.env, home: string = */ export function ompAgentDir(env: OpencodeLaunchEnv = process.env, home: string = homedir()): string { const root = ompHomeDir(env, home); - const profile = env.OMP_PROFILE?.trim() ?? env.PI_PROFILE?.trim(); + // A blank OMP_PROFILE is treated as unset so PI_PROFILE can fall through, + // matching omp's own env precedence (OMP_PROFILE wins when it names a + // profile; otherwise the legacy PI_PROFILE is consulted). + const profile = env.OMP_PROFILE?.trim() || env.PI_PROFILE?.trim(); const agentOverride = env.PI_CODING_AGENT_DIR?.trim(); if (profile && profile !== "default") return join(root, "profiles", profile, "agent"); - if (agentOverride && agentOverride.length > 0) return agentOverride; + if (agentOverride && agentOverride.length > 0) return absoluteClientPath(agentOverride, home, "PI_CODING_AGENT_DIR"); return join(root, "agent"); } diff --git a/tests/client-config-export-new-clients.test.ts b/tests/client-config-export-new-clients.test.ts index 28eeaa971..1b1652b1f 100644 --- a/tests/client-config-export-new-clients.test.ts +++ b/tests/client-config-export-new-clients.test.ts @@ -300,6 +300,20 @@ describe("omp", () => { expect(ompAgentDir({ PI_PROFILE: "legacy" }, "/home/u")) .toBe(join("/home/u", ".omp", "profiles", "legacy", "agent")); }); + + test("a blank OMP_PROFILE is treated as unset so PI_PROFILE still applies", () => { + // omp's own precedence: OMP_PROFILE wins only when it names a profile; a + // trimmed blank value must fall through to the legacy PI_PROFILE. + expect(ompAgentDir({ OMP_PROFILE: " ", PI_PROFILE: "legacy" }, "/home/u")) + .toBe(join("/home/u", ".omp", "profiles", "legacy", "agent")); + }); + + test("a relative PI_CODING_AGENT_DIR is refused, not silently anchored", () => { + // A relative agent-dir override would resolve against each process's own + // cwd — opencodex and omp could disagree about which models.yml is live. + expect(() => ompAgentDir({ PI_CODING_AGENT_DIR: "relative/agent" }, "/home/u")) + .toThrow(/PI_CODING_AGENT_DIR/); + }); }); describe("contributions name every fragment we own", () => { From 6ac2a16f975a7de66f6ae1e650fa9861aa7bb4ce Mon Sep 17 00:00:00 2001 From: Hanbin Noh <282618027+hanbinnoh@users.noreply.github.com> Date: Fri, 7 Aug 2026 01:23:05 +0900 Subject: [PATCH 4/8] fix(export,command-code): carry reasoning efforts into omp config The omp integration dropped every model's reasoning metadata because ExportModel never carried reasoningEfforts/defaultReasoningEffort and toExportModel did not pass them through. omp only exposes a reasoning effort control when the model entry declares a thinking block, so without this the omp picker showed no effort selector at all. - ExportModel gains reasoningEfforts/defaultReasoningEffort and model-rows passes them through from the live catalog. - The omp builder emits a thinking block (mode effort) per model with efforts, dropping out-of-vocabulary values so one bad entry cannot fail the whole provider config. - Add moonshotai/Kimi-K3 to the Command Code official effort table (high/max, verified on commandcode.ai/models/kimi-k3) so OAuth-linked Kimi K3 also gets an effort picker. - Tests cover the omp thinking emission and the registry entry. --- src/clients/config-export.ts | 33 +++++++++++++++++++ src/providers/command-code-efforts.ts | 4 +++ src/server/management/model-rows.ts | 2 ++ .../client-config-export-new-clients.test.ts | 25 ++++++++++++++ tests/command-code-provider.test.ts | 1 + tests/management-client-config-route.test.ts | 4 +++ 6 files changed, 69 insertions(+) diff --git a/src/clients/config-export.ts b/src/clients/config-export.ts index 75c48c888..a09d62b3d 100644 --- a/src/clients/config-export.ts +++ b/src/clients/config-export.ts @@ -402,6 +402,10 @@ export interface ExportModel { displayName?: string; contextWindow?: number; inputModalities?: string[]; + /** Reasoning levels the proxy will accept for this model (wire vocabulary). */ + reasoningEfforts?: string[]; + /** Default reasoning level, when the model carries one. */ + defaultReasoningEffort?: string; } export interface ExportContext { @@ -636,6 +640,12 @@ export interface PiModelEntry { input: string[]; contextWindow?: number; maxTokens?: number; + /** omp thinking block; present only when the model carries reasoning efforts. */ + thinking?: { + mode: "effort"; + efforts: string[]; + defaultLevel?: string; + }; } export interface PiProviderBlock { @@ -649,6 +659,17 @@ export interface PiGeneratedConfig { providers: Record; } +/** + * omp's effort vocabulary is `minimal|low|medium|high|xhigh|max`; anything else + * would fail its schema and take the whole provider down, so out-of-range wire + * values (e.g. `ultra` or `none`) are dropped rather than emitted. + */ +const OMP_EFFORT_VOCABULARY = new Set(["minimal", "low", "medium", "high", "xhigh", "max"]); + +function ompAcceptsEffort(effort: string): boolean { + return OMP_EFFORT_VOCABULARY.has(effort.trim().toLowerCase()); +} + /** * omp's `~/.omp/agent/models.yml` custom-provider shape. * @@ -823,6 +844,18 @@ function buildOmpClientConfig(ctx: ExportContext): OmpGeneratedConfig { entry.contextWindow = context; entry.maxTokens = outputBudgetFor(context); } + // omp only exposes reasoning-effort controls when the model declares a + // thinking block; without it omp sends no reasoning_effort at all. + const efforts = model.reasoningEfforts?.filter(effort => ompAcceptsEffort(effort)) ?? []; + if (efforts.length > 0) { + entry.thinking = { + mode: "effort", + efforts, + ...(model.defaultReasoningEffort && ompAcceptsEffort(model.defaultReasoningEffort) + ? { defaultLevel: model.defaultReasoningEffort } + : {}), + }; + } models.push(entry); } return { diff --git a/src/providers/command-code-efforts.ts b/src/providers/command-code-efforts.ts index 0f2b88eb9..dd892f2e0 100644 --- a/src/providers/command-code-efforts.ts +++ b/src/providers/command-code-efforts.ts @@ -13,6 +13,10 @@ const COMMAND_CODE_MODEL_EFFORTS = { efforts: ["high", "max"], profileUrl: "https://commandcode.ai/models/glm-5-2", }, + "moonshotai/Kimi-K3": { + efforts: ["high", "max"], + profileUrl: "https://commandcode.ai/models/kimi-k3", + }, } as const; /** diff --git a/src/server/management/model-rows.ts b/src/server/management/model-rows.ts index 71c200574..b5e34075a 100644 --- a/src/server/management/model-rows.ts +++ b/src/server/management/model-rows.ts @@ -98,6 +98,8 @@ export function toExportModel(row: ManagementModelRow): ExportModel { ...(row.displayName ? { displayName: row.displayName } : {}), ...(row.contextWindow !== undefined ? { contextWindow: row.contextWindow } : {}), ...(row.inputModalities ? { inputModalities: row.inputModalities } : {}), + ...(row.reasoningEfforts ? { reasoningEfforts: row.reasoningEfforts } : {}), + ...(row.defaultReasoningEffort ? { defaultReasoningEffort: row.defaultReasoningEffort } : {}), }; } diff --git a/tests/client-config-export-new-clients.test.ts b/tests/client-config-export-new-clients.test.ts index 1b1652b1f..2f0059adf 100644 --- a/tests/client-config-export-new-clients.test.ts +++ b/tests/client-config-export-new-clients.test.ts @@ -25,6 +25,7 @@ import { type HermesGeneratedConfig, type KimiGeneratedConfig, type OpenclawGeneratedConfig, + type OmpGeneratedConfig, } from "../src/clients/config-export"; import type { OcxConfig } from "../src/types"; @@ -314,6 +315,30 @@ describe("omp", () => { expect(() => ompAgentDir({ PI_CODING_AGENT_DIR: "relative/agent" }, "/home/u")) .toThrow(/PI_CODING_AGENT_DIR/); }); + + test("emits an omp thinking block when the model carries reasoning efforts", () => { + const doc = buildClientConfig("omp", { + baseUrl: "http://127.0.0.1:10100/v1", + models: [ + { namespaced: "command-code/deepseek-deepseek-v4-flash", provider: "command-code", id: "deepseek/deepseek-v4-flash", contextWindow: 1_000_000, reasoningEfforts: ["high", "max"], defaultReasoningEffort: "high" }, + { namespaced: "command-code/moonshotai-Kimi-K3", provider: "command-code", id: "moonshotai/Kimi-K3", contextWindow: 1_000_000, reasoningEfforts: ["high", "max"] }, + // No reasoning metadata: the model stays plain so omp applies its own defaults. + { namespaced: "command-code/claude-fable-5", provider: "command-code", id: "claude-fable-5", contextWindow: 1_000_000 }, + ], + config: LOOPBACK, + }) as OmpGeneratedConfig; + const models = doc.providers[OPENCODE_PROVIDER_ID]!.models; + const deepseek = models.find(m => m.id === "command-code/deepseek-deepseek-v4-flash")!; + expect(deepseek.thinking).toEqual({ + mode: "effort", + efforts: ["high", "max"], + defaultLevel: "high", + }); + const kimi = models.find(m => m.id === "command-code/moonshotai-Kimi-K3")!; + expect(kimi.thinking).toEqual({ mode: "effort", efforts: ["high", "max"] }); + const fable = models.find(m => m.id === "command-code/claude-fable-5")!; + expect(fable.thinking).toBeUndefined(); + }); }); describe("contributions name every fragment we own", () => { diff --git a/tests/command-code-provider.test.ts b/tests/command-code-provider.test.ts index 4220cbcbd..cf87c5ae9 100644 --- a/tests/command-code-provider.test.ts +++ b/tests/command-code-provider.test.ts @@ -51,6 +51,7 @@ describe("Command Code provider", () => { expect(registry?.models).toBeUndefined(); expect(registry?.modelReasoningEfforts).toMatchObject({ "deepseek/deepseek-v4-flash": ["high", "max"], + "moonshotai/Kimi-K3": ["high", "max"], "zai-org/glm-5.2": ["high", "max"], }); expect(OAUTH_PROVIDERS["command-code"]?.providerConfig).toMatchObject({ diff --git a/tests/management-client-config-route.test.ts b/tests/management-client-config-route.test.ts index 915809104..cc18ee3b4 100644 --- a/tests/management-client-config-route.test.ts +++ b/tests/management-client-config-route.test.ts @@ -45,6 +45,8 @@ interface ModelRow { displayName?: string; contextWindow?: number; inputModalities?: string[]; + reasoningEfforts?: string[]; + defaultReasoningEffort?: string; } /** @@ -111,6 +113,8 @@ function toExportModel(row: ModelRow): ExportModel { ...(row.displayName ? { displayName: row.displayName } : {}), ...(row.contextWindow !== undefined ? { contextWindow: row.contextWindow } : {}), ...(row.inputModalities ? { inputModalities: row.inputModalities } : {}), + ...(row.reasoningEfforts ? { reasoningEfforts: row.reasoningEfforts } : {}), + ...(row.defaultReasoningEffort ? { defaultReasoningEffort: row.defaultReasoningEffort } : {}), }; } From e80d6f7bd8fa22d3df666e3745730751eb6966f0 Mon Sep 17 00:00:00 2001 From: Hanbin Noh <282618027+hanbinnoh@users.noreply.github.com> Date: Fri, 7 Aug 2026 01:30:28 +0900 Subject: [PATCH 5/8] fix(export): mark omp reasoning models so effort survives omp's resolveModelThinking returns undefined unless the model entry sets reasoning: true, so the thinking block alone was silently dropped and the omp picker showed no effort selector for command-code models. Emit reasoning: true alongside the thinking block; verified with a scratch omp agent dir that command-code/deepseek and Kimi-K3 now list high,max. --- src/clients/config-export.ts | 3 +++ tests/client-config-export-new-clients.test.ts | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/clients/config-export.ts b/src/clients/config-export.ts index a09d62b3d..9707baa64 100644 --- a/src/clients/config-export.ts +++ b/src/clients/config-export.ts @@ -640,6 +640,8 @@ export interface PiModelEntry { input: string[]; contextWindow?: number; maxTokens?: number; + /** omp requires `reasoning: true` before it honors a thinking block. */ + reasoning?: boolean; /** omp thinking block; present only when the model carries reasoning efforts. */ thinking?: { mode: "effort"; @@ -848,6 +850,7 @@ function buildOmpClientConfig(ctx: ExportContext): OmpGeneratedConfig { // thinking block; without it omp sends no reasoning_effort at all. const efforts = model.reasoningEfforts?.filter(effort => ompAcceptsEffort(effort)) ?? []; if (efforts.length > 0) { + entry.reasoning = true; entry.thinking = { mode: "effort", efforts, diff --git a/tests/client-config-export-new-clients.test.ts b/tests/client-config-export-new-clients.test.ts index 2f0059adf..f9433d1e4 100644 --- a/tests/client-config-export-new-clients.test.ts +++ b/tests/client-config-export-new-clients.test.ts @@ -329,12 +329,14 @@ describe("omp", () => { }) as OmpGeneratedConfig; const models = doc.providers[OPENCODE_PROVIDER_ID]!.models; const deepseek = models.find(m => m.id === "command-code/deepseek-deepseek-v4-flash")!; + expect(deepseek.reasoning).toBe(true); expect(deepseek.thinking).toEqual({ mode: "effort", efforts: ["high", "max"], defaultLevel: "high", }); const kimi = models.find(m => m.id === "command-code/moonshotai-Kimi-K3")!; + expect(kimi.reasoning).toBe(true); expect(kimi.thinking).toEqual({ mode: "effort", efforts: ["high", "max"] }); const fable = models.find(m => m.id === "command-code/claude-fable-5")!; expect(fable.thinking).toBeUndefined(); From ee5e195f4b6e0c32810895ccf0b69b4402618691 Mon Sep 17 00:00:00 2001 From: Hanbin Noh <282618027+hanbinnoh@users.noreply.github.com> Date: Fri, 7 Aug 2026 01:39:00 +0900 Subject: [PATCH 6/8] fix(command-code): drop Kimi-K3 from the effort table MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The official Command Code CLI (v1.14.0) marks Kimi K3 reasoning:true but does not give it a reasoningEfforts array — there is no effort selector in the original client. Adding high/max advertised an effort tier the upstream does not offer. Remove the entry; the existing test already pinned Kimi-K3 as absent from the official effort table. --- src/providers/command-code-efforts.ts | 4 ---- tests/client-config-export-new-clients.test.ts | 8 +++++--- tests/command-code-provider.test.ts | 1 - 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/providers/command-code-efforts.ts b/src/providers/command-code-efforts.ts index dd892f2e0..0f2b88eb9 100644 --- a/src/providers/command-code-efforts.ts +++ b/src/providers/command-code-efforts.ts @@ -13,10 +13,6 @@ const COMMAND_CODE_MODEL_EFFORTS = { efforts: ["high", "max"], profileUrl: "https://commandcode.ai/models/glm-5-2", }, - "moonshotai/Kimi-K3": { - efforts: ["high", "max"], - profileUrl: "https://commandcode.ai/models/kimi-k3", - }, } as const; /** diff --git a/tests/client-config-export-new-clients.test.ts b/tests/client-config-export-new-clients.test.ts index f9433d1e4..f80ac50d5 100644 --- a/tests/client-config-export-new-clients.test.ts +++ b/tests/client-config-export-new-clients.test.ts @@ -321,7 +321,9 @@ describe("omp", () => { baseUrl: "http://127.0.0.1:10100/v1", models: [ { namespaced: "command-code/deepseek-deepseek-v4-flash", provider: "command-code", id: "deepseek/deepseek-v4-flash", contextWindow: 1_000_000, reasoningEfforts: ["high", "max"], defaultReasoningEffort: "high" }, - { namespaced: "command-code/moonshotai-Kimi-K3", provider: "command-code", id: "moonshotai/Kimi-K3", contextWindow: 1_000_000, reasoningEfforts: ["high", "max"] }, + // Kimi K3 is reasoning-capable in Command Code but has no effort + // selector, so no thinking block is emitted. + { namespaced: "command-code/moonshotai-Kimi-K3", provider: "command-code", id: "moonshotai/Kimi-K3", contextWindow: 1_000_000, reasoningEfforts: [] }, // No reasoning metadata: the model stays plain so omp applies its own defaults. { namespaced: "command-code/claude-fable-5", provider: "command-code", id: "claude-fable-5", contextWindow: 1_000_000 }, ], @@ -336,8 +338,8 @@ describe("omp", () => { defaultLevel: "high", }); const kimi = models.find(m => m.id === "command-code/moonshotai-Kimi-K3")!; - expect(kimi.reasoning).toBe(true); - expect(kimi.thinking).toEqual({ mode: "effort", efforts: ["high", "max"] }); + expect(kimi.reasoning).toBeUndefined(); + expect(kimi.thinking).toBeUndefined(); const fable = models.find(m => m.id === "command-code/claude-fable-5")!; expect(fable.thinking).toBeUndefined(); }); diff --git a/tests/command-code-provider.test.ts b/tests/command-code-provider.test.ts index cf87c5ae9..4220cbcbd 100644 --- a/tests/command-code-provider.test.ts +++ b/tests/command-code-provider.test.ts @@ -51,7 +51,6 @@ describe("Command Code provider", () => { expect(registry?.models).toBeUndefined(); expect(registry?.modelReasoningEfforts).toMatchObject({ "deepseek/deepseek-v4-flash": ["high", "max"], - "moonshotai/Kimi-K3": ["high", "max"], "zai-org/glm-5.2": ["high", "max"], }); expect(OAUTH_PROVIDERS["command-code"]?.providerConfig).toMatchObject({ From 97eb31048d583ee4cb3cd7ce04654e39759c890e Mon Sep 17 00:00:00 2001 From: Hanbin Noh <282618027+hanbinnoh@users.noreply.github.com> Date: Fri, 7 Aug 2026 09:50:14 +0900 Subject: [PATCH 7/8] fix(command-code): decode namespaced model ids before effort lookup omp dials POST /v1/chat/completions with the namespaced selector (command-code/deepseek-deepseek-v4-flash, inner '/' encoded as '-'), which the effort table lookup did not recognize, so reasoning_effort was dropped on the floor and the upstream call went out without it. Strip the provider prefix and decode the encoded id against the official effort table (plus compat aliases) before the lookup. Verified end-to-end: omp's reasoning_effort: high now reaches /alpha/generate as params.reasoning_effort. --- src/adapters/command-code.ts | 16 ++++++++++++++-- tests/command-code-provider.test.ts | 4 ++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/adapters/command-code.ts b/src/adapters/command-code.ts index ce20edf33..b866635be 100644 --- a/src/adapters/command-code.ts +++ b/src/adapters/command-code.ts @@ -8,7 +8,8 @@ import type { AdapterFetchContext, AdapterRequest, ProviderAdapter } from "./bas import type { TranslatorBudget } from "../lib/translator-budget"; import { readBoundedResponseBody } from "../lib/bounded-body"; import { configuredReasoningEfforts } from "../reasoning-effort"; -import { commandCodeReasoningEfforts, refreshCommandCodeReasoningEfforts } from "../providers/command-code-efforts"; +import { COMMAND_CODE_MODEL_REASONING_EFFORTS, commandCodeReasoningEfforts, refreshCommandCodeReasoningEfforts } from "../providers/command-code-efforts"; +import { decodeRoutedModelId } from "../providers/slug-codec"; import { identifyRoutedModel } from "./identity"; import { buildNonOpenAIToolCatalogNudgeForTools } from "./tool-catalog-nudge"; import { parseDataUrl } from "./image"; @@ -318,7 +319,18 @@ function supportedCommandCodeEffort(provider: OcxProviderConfig, modelId: string // Compatibility ids (deepseek-v4-flash / glm-5.2) must resolve to their canonical // Command Code id before the effort lookup, or legacy requests silently lose the // reasoning effort because the official table is keyed by the canonical ids. - const canonicalId = COMMAND_CODE_MODEL_ALIASES[modelId] ?? modelId; + // omp and other OpenAI-compatible clients dial with the namespaced selector + // (command-code/deepseek-deepseek-v4-flash, inner "/" encoded as "-"), so + // decode it back against the official effort table before the lookup. + const aliased = COMMAND_CODE_MODEL_ALIASES[modelId] ?? modelId; + const knownIds = [...new Set([ + ...Object.keys(COMMAND_CODE_MODEL_REASONING_EFFORTS), + ...Object.values(COMMAND_CODE_MODEL_ALIASES), + ])]; + // Strip the provider prefix first: decodeRoutedModelId expects the encoded + // id portion (deepseek-deepseek-v4-flash), not the full command-code/ slug. + const encodedId = aliased.startsWith("command-code/") ? aliased.slice("command-code/".length) : aliased; + const canonicalId = decodeRoutedModelId(encodedId, knownIds); const supported = commandCodeReasoningEfforts(canonicalId) ?? configuredReasoningEfforts(provider, canonicalId); if (!supported) return undefined; // Command Code's official profiles describe xhigh and ultra as the CLI labels that map to diff --git a/tests/command-code-provider.test.ts b/tests/command-code-provider.test.ts index 4220cbcbd..997548843 100644 --- a/tests/command-code-provider.test.ts +++ b/tests/command-code-provider.test.ts @@ -212,6 +212,10 @@ describe("Command Code provider", () => { // Legacy compatibility id resolves to the canonical effort table before the lookup. const legacy = await builtRequest({ ...parsed(), modelId: "deepseek-v4-flash" }); expect(JSON.parse(legacy.body).params.reasoning_effort).toBe("high"); + // omp dials with the namespaced selector (inner "/" encoded as "-"); the + // effort lookup must decode it back against the official table. + const ompNamespaced = await builtRequest({ ...parsed(), modelId: "command-code/deepseek-deepseek-v4-flash" }); + expect(JSON.parse(ompNamespaced.body).params.reasoning_effort).toBe("high"); }); test("filters tool declarations when tool_choice disables tools", async () => { From 4537997ddec609ce6c88c06e99ac4f784ef9a245 Mon Sep 17 00:00:00 2001 From: Hanbin Noh <282618027+hanbinnoh@users.noreply.github.com> Date: Fri, 7 Aug 2026 15:51:11 +0900 Subject: [PATCH 8/8] fix(omp): honor models.yaml fallback and preserve reasoning metadata --- src/cli/export-command.ts | 9 +++++- src/clients/config-export.ts | 13 ++++---- src/server/management/model-rows.ts | 30 +++++++++++++------ tests/cli-export-command.test.ts | 15 ++++++++++ .../client-config-export-new-clients.test.ts | 20 +++++++++++-- tests/management-client-config-route.test.ts | 14 +++++++++ 6 files changed, 83 insertions(+), 18 deletions(-) diff --git a/src/cli/export-command.ts b/src/cli/export-command.ts index d7d074fb5..2d359502c 100644 --- a/src/cli/export-command.ts +++ b/src/cli/export-command.ts @@ -62,7 +62,11 @@ export interface ExportCommandDeps extends RuntimeApiDeps { * `/api/models` row plus the modality list Pi consumes. The launcher's row type predates * the Pi exporter and stops at the fields OpenCode needs. */ -type ExportProxyModelRow = OpencodeProxyModelRow & { inputModalities?: string[] }; +type ExportProxyModelRow = OpencodeProxyModelRow & { + inputModalities?: string[]; + reasoningEfforts?: string[]; + defaultReasoningEffort?: string; +}; /** Same authoritativeness rule the serializers apply, for the degraded-count line. */ function hasContextLimit(model: ExportModel): boolean { @@ -101,6 +105,9 @@ export function exportModelsFromProxyRows( if (entry.contextWindow !== undefined) model.contextWindow = entry.contextWindow; const input = modalities.get(entry.namespaced); if (input) model.inputModalities = input; + const source = rows.find(row => row.namespaced?.trim() === entry.namespaced && row.disabled !== true); + if (source?.reasoningEfforts) model.reasoningEfforts = [...source.reasoningEfforts]; + if (source?.defaultReasoningEffort) model.defaultReasoningEffort = source.defaultReasoningEffort; return model; }); } diff --git a/src/clients/config-export.ts b/src/clients/config-export.ts index 9707baa64..2fa42a22e 100644 --- a/src/clients/config-export.ts +++ b/src/clients/config-export.ts @@ -345,13 +345,10 @@ export function gajaeConfigPath(env: OpencodeLaunchEnv = process.env, home: stri return join(gajaeHomeDir(env, home), "agent", "models.yml"); } -/** - * omp's config root: `~/.omp` (legacy `PI_CONFIG_DIR`/`.pi` no longer used by - * oh-my-pi 17.x; the agent directory moved to `~/.omp/agent`). - */ +/** omp's config root, matching oh-my-pi's `path.join(homedir(), PI_CONFIG_DIR || ".omp")`. */ export function ompHomeDir(env: OpencodeLaunchEnv = process.env, home: string = homedir()): string { const override = env.PI_CONFIG_DIR?.trim(); - return override && override.length > 0 ? override : join(home, ".omp"); + return join(home, override && override.length > 0 ? override : ".omp"); } /** @@ -384,7 +381,11 @@ export function ompAgentDir(env: OpencodeLaunchEnv = process.env, home: string = * legacy `~/.pi/agent/models.json` the old Pi exporter targets. */ export function ompConfigPath(env: OpencodeLaunchEnv = process.env, home: string = homedir()): string { - return join(ompAgentDir(env, home), "models.yml"); + const agentDir = ompAgentDir(env, home); + const yml = join(agentDir, "models.yml"); + if (existsSync(yml)) return yml; + const yaml = join(agentDir, "models.yaml"); + return existsSync(yaml) ? yaml : yml; } /** diff --git a/src/server/management/model-rows.ts b/src/server/management/model-rows.ts index b5e34075a..ae4af40d9 100644 --- a/src/server/management/model-rows.ts +++ b/src/server/management/model-rows.ts @@ -9,7 +9,13 @@ * Bodies are unchanged from their previous home; only `export` was added. */ import type { CatalogModel } from "../../codex/catalog"; -import { catalogModelSlug, nativeModelRows, uniqueCatalogModelsForPublicList } from "../../codex/catalog"; +import { + catalogModelSlug, + nativeDefaultReasoningEffort, + nativeModelRows, + nativeReasoningEfforts, + uniqueCatalogModelsForPublicList, +} from "../../codex/catalog"; import type { ExportModel } from "../../clients/config-export"; import { providerContextCap } from "../../providers/context-cap"; import { routedSlug, slugEquals } from "../../providers/slug-codec"; @@ -41,14 +47,20 @@ export async function listManagementModelRows(config: OcxConfig): Promise ({ - provider: "openai", - id: row.slug, - namespaced: row.slug, - disabled: row.disabled, - native: true, - ...(row.contextWindow !== undefined ? { contextWindow: row.contextWindow } : {}), - })); + const native: ManagementModelRow[] = nativeModelRows(config).map(row => { + const reasoningEfforts = nativeReasoningEfforts(row.slug); + const defaultReasoningEffort = nativeDefaultReasoningEffort(row.slug); + return { + provider: "openai", + id: row.slug, + namespaced: row.slug, + disabled: row.disabled, + native: true, + ...(row.contextWindow !== undefined ? { contextWindow: row.contextWindow } : {}), + ...(reasoningEfforts.length > 0 ? { reasoningEfforts } : {}), + ...(defaultReasoningEffort ? { defaultReasoningEffort } : {}), + }; + }); const customModels: ManagementModelRow[] = (config.customModels ?? []).map(cm => { const namespaced = routedSlug(cm.provider, cm.modelId); return { diff --git a/tests/cli-export-command.test.ts b/tests/cli-export-command.test.ts index ca7140965..40df59a93 100644 --- a/tests/cli-export-command.test.ts +++ b/tests/cli-export-command.test.ts @@ -329,4 +329,19 @@ describe("export row filtering", () => { expect(models[0]!.namespaced).toBe("a/two"); expect(models[0]!.inputModalities).toEqual(["text", "image"]); }); + + test("preserves reasoning metadata from /api/models rows", () => { + const [model] = exportModelsFromProxyRows([ + { + provider: "command-code", + id: "deepseek/deepseek-v4-flash", + namespaced: "command-code/deepseek-deepseek-v4-flash", + disabled: false, + reasoningEfforts: ["high", "max"], + defaultReasoningEffort: "high", + }, + ], config()); + expect(model?.reasoningEfforts).toEqual(["high", "max"]); + expect(model?.defaultReasoningEffort).toBe("high"); + }); }); diff --git a/tests/client-config-export-new-clients.test.ts b/tests/client-config-export-new-clients.test.ts index f80ac50d5..7089b2480 100644 --- a/tests/client-config-export-new-clients.test.ts +++ b/tests/client-config-export-new-clients.test.ts @@ -1,4 +1,6 @@ import { describe, expect, test } from "bun:test"; +import { mkdirSync, rmSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; import { join } from "node:path"; import { EXPORT_CLIENTS, @@ -278,8 +280,22 @@ describe("omp", () => { }); test("PI_CONFIG_DIR relocates the whole root, agent directory included", () => { - expect(ompConfigPath({ PI_CONFIG_DIR: "/srv/omp" }, "/home/u")) - .toBe(join("/srv/omp", "agent", "models.yml")); + expect(ompConfigPath({ PI_CONFIG_DIR: "custom-omp" }, "/home/u")) + .toBe(join("/home/u", "custom-omp", "agent", "models.yml")); + }); + + test("an existing models.yaml is honored when models.yml is absent", () => { + const home = join(tmpdir(), `ocx-omp-${crypto.randomUUID()}`); + const agent = join(home, ".omp", "agent"); + mkdirSync(agent, { recursive: true }); + writeFileSync(join(agent, "models.yaml"), "providers: {}\n", "utf8"); + try { + expect(ompConfigPath({}, home)).toBe(join(agent, "models.yaml")); + writeFileSync(join(agent, "models.yml"), "providers: {}\n", "utf8"); + expect(ompConfigPath({}, home)).toBe(join(agent, "models.yml")); + } finally { + rmSync(home, { recursive: true, force: true }); + } }); test("PI_CODING_AGENT_DIR overrides the agent directory outright", () => { diff --git a/tests/management-client-config-route.test.ts b/tests/management-client-config-route.test.ts index cc18ee3b4..a3c5b2411 100644 --- a/tests/management-client-config-route.test.ts +++ b/tests/management-client-config-route.test.ts @@ -183,6 +183,20 @@ describe("GET /api/client-config", () => { expect(provider.models.map(model => model.id)).toContain("a/m1"); }, 15_000); + test("native model rows carry reasoning metadata into omp exports", async () => { + const rows = await modelRows(baseConfig()); + const native = rows.find(row => row.native && (row.reasoningEfforts?.length ?? 0) > 0); + expect(native).toBeDefined(); + const doc = buildClientConfig("omp", { + baseUrl: "http://127.0.0.1:10100/v1", + models: [toExportModel(native!)], + config: baseConfig(), + }) as OmpGeneratedConfig; + const exported = doc.providers[OPENCODE_PROVIDER_ID]!.models[0]!; + expect(exported.reasoning).toBe(true); + expect(exported.thinking?.efforts.length).toBeGreaterThan(0); + }, 15_000); + test("counts describe the emitted document, including models without limits", async () => { const config = baseConfig(); const opencode = await (await clientConfigApi(config, "?client=opencode")).json() as ClientConfigEnvelope;