From a5d26db5c0679832a00836c5b05c997517787a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Wed, 8 Jul 2026 13:51:05 +0800 Subject: [PATCH] Add files via upload --- plugins/README.md | 28 +- .../cyberstrikeai-browser-extension/README.md | 72 ++ .../README.zh-CN.md | 231 +++++ .../background/service-worker.js | 143 +++ .../devtools.html | 9 + .../devtools.js | 69 ++ .../dist/cyberstrikeai-browser-extension.zip | Bin 0 -> 55551 bytes .../icons/icon128.png | Bin 0 -> 21109 bytes .../icons/icon16.png | Bin 0 -> 633 bytes .../icons/icon48.png | Bin 0 -> 3597 bytes .../lib/api.js | 153 +++ .../lib/capture.js | 103 ++ .../lib/catalog-cache.js | 39 + .../lib/constants.js | 17 + .../lib/formatter.js | 47 + .../lib/http-normalize.js | 104 ++ .../lib/markdown.js | 135 +++ .../lib/storage.js | 114 +++ .../manifest.json | 21 + .../package.sh | 9 + .../panel/panel.css | 867 ++++++++++++++++ .../panel/panel.html | 143 +++ .../panel/panel.js | 947 ++++++++++++++++++ .../popup/popup.css | 94 ++ .../popup/popup.html | 31 + .../popup/popup.js | 28 + 26 files changed, 3398 insertions(+), 6 deletions(-) create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/README.md create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/README.zh-CN.md create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/background/service-worker.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/devtools.html create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/devtools.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/dist/cyberstrikeai-browser-extension.zip create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/icons/icon128.png create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/icons/icon16.png create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/icons/icon48.png create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/lib/api.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/lib/capture.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/lib/catalog-cache.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/lib/constants.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/lib/formatter.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/lib/http-normalize.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/lib/markdown.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/lib/storage.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/manifest.json create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/package.sh create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/panel/panel.css create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/panel/panel.html create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/panel/panel.js create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/popup/popup.css create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/popup/popup.html create mode 100644 plugins/browser-extension/cyberstrikeai-browser-extension/popup/popup.js diff --git a/plugins/README.md b/plugins/README.md index a33e6f2a..c3896a05 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -1,12 +1,28 @@ ## Plugins -This directory contains optional plugins/extensions that integrate CyberStrikeAI with other tools. +Optional integrations that connect CyberStrikeAI with other tools. -- `burp-suite/`: Burp Suite extensions - -### Burp Suite Extension +### Burp Suite - **Path**: `plugins/burp-suite/cyberstrikeai-burp-extension/` -- **Build output**: `plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar` -- **Docs**: see the plugin folder `README.md` / `README.zh-CN.md` +- **Build**: `bash build-mvn.sh` → `dist/cyberstrikeai-burp-extension.jar` +- **Docs**: `README.md` / `README.zh-CN.md` +### Browser (Chrome / Edge) + +- **Path**: `plugins/browser-extension/cyberstrikeai-browser-extension/` +- **Version**: **0.3.5** +- **Install**: `chrome://extensions/` → Load unpacked → F12 → **CyberStrikeAI** tab +- **Package**: `bash package.sh` → `dist/cyberstrikeai-browser-extension.zip` +- **Docs**: `README.zh-CN.md` (full) / `README.md` (summary) + +#### Highlights (v0.3.x) + +| Feature | Description | +|---------|-------------| +| Capture pause | **● Capturing** / **○ Paused** — stop recording without closing DevTools | +| HTTP/1.1 display | Raw HAR in memory; UI + AI prompt normalized (no `:method` pseudo-headers) | +| Collapsible conn bar | Host/Port/Validate collapses after success | +| Popup | Read-only endpoint + connection status | +| Performance | XHR-only filter, no body read for static assets, rAF-throttled stream UI | +| Data caps | 200 captures/tab, 50 test runs, 512KB progress — all in-memory | diff --git a/plugins/browser-extension/cyberstrikeai-browser-extension/README.md b/plugins/browser-extension/cyberstrikeai-browser-extension/README.md new file mode 100644 index 00000000..33b93a0e --- /dev/null +++ b/plugins/browser-extension/cyberstrikeai-browser-extension/README.md @@ -0,0 +1,72 @@ +## CyberStrikeAI Browser Extension + +**Version 0.3.5** — Full docs: **README.zh-CN.md** + +Chromium DevTools extension: capture Network traffic and send it to CyberStrikeAI for AI-assisted security testing. Aligned with the Burp Suite plugin. + +### Quick install + +1. `chrome://extensions/` → Developer mode → **Load unpacked** +2. Select `plugins/browser-extension/cyberstrikeai-browser-extension/` +3. Open target page → **F12** → **CyberStrikeAI** tab → **Validate** +4. Select a captured request → **Send** → view **Output** + +### Popup vs DevTools panel + +| Location | Purpose | +|----------|---------| +| **DevTools panel** | Connection, Validate, capture, Send, Output (primary UI) | +| **Extension popup** | Read-only connection status + version + guide | + +### Key features + +- **Capture toggle**: **● Capturing** / **○ Paused** — pause stops `getContent` and list updates; Send still works on existing entries +- **Collapsible connection bar** — collapses to `https://host:port` after Validate +- **HTTP/1.1 normalization** — raw HAR stored; display and AI prompt strip HTTP/2 pseudo-headers (`:method`, etc.) +- **Test History** (50 runs) + **Captured Requests** (200/tab, XHR/Fetch filter) +- **SSE streaming** — Progress capped at 512KB; Final uncapped for active run +- **Deferred Markdown** — plain text while streaming; render after done; skip above 100KB +- **Stop** — abort local stream + server cancel via `conversationId` +- **Latest XHR**, **Copy**, project/role/agent send dialog +- Session token + optional host permissions + +### Data limits (no unbounded growth) + +| Data | Limit | Storage | +|------|-------|---------| +| Captures | 200 / tab | In-memory | +| Tabs tracked | 20 | In-memory | +| Test runs | 50 | Panel memory | +| Config / token | Small | `chrome.storage` | + +Closing DevTools clears panel data. Closing the browser invalidates the session token. + +### Performance + +- **DevTools closed** → zero impact on page load +- **Capture paused** → near-zero overhead +- **Capturing + XHR only** → light overhead on matching requests only + +### Troubleshooting + +After reloading the extension, close DevTools completely and reopen (F12) if you see `chrome.runtime.connect` errors — the old panel context is invalidated. + +### Package + +```bash +bash package.sh +# → dist/cyberstrikeai-browser-extension.zip +``` + +### Layout + +```text +manifest.json +background/service-worker.js +devtools.js +panel/ # main UI +popup/ # read-only status +lib/ # api, storage, capture, http-normalize, markdown, … +icons/ +package.sh +``` diff --git a/plugins/browser-extension/cyberstrikeai-browser-extension/README.zh-CN.md b/plugins/browser-extension/cyberstrikeai-browser-extension/README.zh-CN.md new file mode 100644 index 00000000..be6a652b --- /dev/null +++ b/plugins/browser-extension/cyberstrikeai-browser-extension/README.zh-CN.md @@ -0,0 +1,231 @@ +## CyberStrikeAI 浏览器扩展 + +**当前版本:0.3.5** + +Chrome / Edge(Chromium)DevTools 扩展:在开发者工具中捕获 **Network** 流量,发送到 CyberStrikeAI 进行 AI 辅助安全测试。能力与 Burp Suite 插件对齐,并按生产场景做了性能与体验优化。 + +--- + +### 快速开始 + +1. `chrome://extensions/` → 开发者模式 → **加载已解压的扩展程序** +2. 选择目录:`plugins/browser-extension/cyberstrikeai-browser-extension/` +3. 打开目标页面 → **F12** → 顶部 Tab **CyberStrikeAI** +4. 填写 Host / Port / Password → **Validate**(首次会请求访问服务器地址权限) +5. 左侧选中捕获请求 → **Send** → 在 **Output** 查看 AI 结果 + +点击浏览器工具栏图标可查看 **只读连接状态**;完整配置与操作均在 DevTools 面板内完成。 + +--- + +### 界面说明 + +``` +┌─ 连接栏(Validate 成功后可收起)────────────────────────────┐ +│ Logo │ https://host:port │ 连接设置 │ ● OK │ +├─ 操作栏 ────────────────────────────────────────────────────┤ +│ Send │ Latest XHR │ Stop │ Copy │ Clear │ ●捕获中/○已暂停 │ +│ XHR/Fetch only │ Debug │ Markdown │ +├──────────────┬──────────────────────────────────────────────┤ +│ Test History │ Output │ Request │ Response │ +│ Captured Req │ Progress + Final Response │ +└──────────────┴──────────────────────────────────────────────┘ +``` + +| 区域 | 说明 | +|------|------| +| **连接栏** | Host、Port、HTTPS、Password、Validate;成功后收起为 `https://host:port` 摘要 | +| **Test History** | 最多 50 次 Send 记录,可回看 Progress / Final | +| **Captured Requests** | 当前 Tab 捕获列表,最多 200 条,支持搜索 | +| **Output** | 默认 Tab:流式 Progress + Final Response | +| **Request / Response** | 查看选中流量的 HTTP/1.1 格式原文 | + +--- + +### 功能一览 + +#### 捕获 + +- **Background 中枢**:`devtools.js` 监听 Network → `service-worker` 队列 → Panel 订阅 +- 默认 **XHR/Fetch only**(可关闭以捕获更多类型) +- 静态资源 URL / MIME **预过滤**,命中前不读响应体 +- **● 捕获中 / ○ 已暂停**:暂停后零开销,已有列表仍可 Send +- 单条截断:请求体 **64KB**、响应 **4KB** + +#### HTTP 展示与 AI Prompt + +- **存储**:内存中保留原始 HAR(含 HTTP/2 伪首部 `:method` 等) +- **展示 / Prompt**:归一化为 **HTTP/1.1**(与 Burp 插件一致) + +```http +GET /api/foo HTTP/1.1 +Host: example.com +Cookie: ... +``` + +#### 发送到 CyberStrikeAI + +- 弹窗选择:**项目 / 角色 / 对话模式**(动态 API)+ 测试指令 +- 支持 **Eino Single**、**Deep**、**Plan-Execute**、**Supervisor** +- **Latest XHR**:一键选中最近 API 请求并打开发送弹窗 +- **Stop**:中止本地 SSE + 调用服务端 `/api/agent-loop/cancel` + +#### 流式输出 + +- Progress 日志上限 **512KB**(超出截断) +- **Final Response 不截断**(当前进行中的测试) +- 历史 run 切换后 Final 软截断 **100KB** +- **Markdown**:流式阶段纯文本;结束后 `requestIdleCallback` 渲染;超 **100KB** 降级纯文本 +- **Copy**:复制当前 Request / Response / Final + +#### 安全与权限 + +- Token 存 **chrome.storage.session**(关浏览器失效) +- **optional_host_permissions**:Validate 时按需授权 CyberStrikeAI 地址 +- Markdown iframe 使用 `sandbox` + +--- + +### 按钮与选项 + +| 控件 | 作用 | +|------|------| +| **Validate** | 登录并校验 Token;进行中再次点击为 Cancel | +| **连接设置 / 收起** | 展开或折叠 Host/Port/Password 表单 | +| **Send** | 对选中捕获发起到 CyberStrikeAI | +| **Latest XHR** | 选中最近 XHR/Fetch 并 Send | +| **Stop** | 停止当前 AI 流(本地 + 服务端) | +| **Clear Output** | 清空当前 run 的 Progress / Final | +| **● 捕获中 / ○ 已暂停** | 启用或暂停 Network 捕获 | +| **XHR/Fetch only** | 只捕获 API 类请求 | +| **Debug events** | 在 Progress 显示更多 SSE 事件 | +| **Markdown** | Final 完成后渲染富文本 | +| **Clear All** | 清空 Test History | +| **Clear** | 清空当前 Tab 捕获列表 | + +--- + +### 数据与内存(不会无限增长) + +| 数据 | 上限 | 位置 | 清理时机 | +|------|------|------|----------| +| 捕获请求 | 200 条 / Tab | Background + Panel 内存 | 超出丢弃最旧;可手动 Clear | +| Tab 捕获槽 | 20 个 Tab | Background 内存 | 超出丢弃非当前 Tab | +| 测试历史 | 50 条 | Panel 内存 | 超出丢弃最旧;Clear All | +| Progress | 512KB / run | Panel 内存 | 超出截断 | +| Final(进行中) | 无硬上限 | Panel 内存 | — | +| Final(历史) | 100KB 软截断 | Panel 内存 | 切换到其他 run 时 | +| 配置 + Token | 极小 | chrome.storage | 手动改配置 | + +- 关闭 **DevTools** → Panel 内存清空 +- 关闭 **浏览器** → Session Token 失效 +- Service Worker 被回收 → Background 捕获队列清空 + +--- + +### 性能说明 + +| 场景 | 影响 | +|------|------| +| 未开 DevTools | **无影响**(不监听 Network) | +| DevTools 开 + 捕获暂停 | **几乎无影响** | +| DevTools 开 + 捕获中 + XHR only | 仅匹配请求有轻微开销 | +| 高流量 SPA | 建议保持 **XHR/Fetch only**,不需要时点 **已暂停** | + +已做优化:过滤器内存缓存、静态资源不读 body、列表增量插入、搜索防抖、rAF 节流流式 UI。 + +--- + +### 常见问题 + +**扩展更新后报错 `chrome.runtime.connect` undefined?** +扩展重载后旧 DevTools 面板上下文失效。请:**关闭 DevTools → 重新加载扩展 → 再开 F12**。 + +**Request 里为什么曾经有 `:authority`、`:method`?** +HTTP/2 伪首部。展示与 AI Prompt 已归一化为 HTTP/1.1;原始 HAR 仍保存在内存 entry 中。 + +**Console 里 localhost CORS 报错是插件造成的吗?** +不是。那是页面自身请求本机服务被浏览器拦截,与扩展无关。 + +**Test History 很多会挡住 Captured Requests 吗?** +不会。历史区最高占侧边栏 **42%**,超出部分区域内滚动;捕获区占剩余空间。 + +**会拖慢网页吗?** +日常浏览(不开 DevTools)无影响。调试时可用 **已暂停** 完全停止捕获。 + +--- + +### Popup 与 DevTools 分工 + +| 位置 | 用途 | +|------|------| +| **DevTools 面板** | 连接、Validate、捕获、Send、Output(主工作区) | +| **扩展 Popup** | 只读连接状态 + 版本号 + 打开 DevTools 引导 | + +不在 Popup 中重复完整配置表单,避免与主流程脱节。 + +--- + +### 打包发布 + +```bash +bash plugins/browser-extension/cyberstrikeai-browser-extension/package.sh +# → dist/cyberstrikeai-browser-extension.zip +``` + +图标从项目根 `images/logo.png` 生成: + +```bash +LOGO="images/logo.png" +ICONS="plugins/browser-extension/cyberstrikeai-browser-extension/icons" +for size in 16 48 128; do + sips -z $size $size "$LOGO" --out "$ICONS/icon${size}.png" +done +``` + +--- + +### 限制 + +- Chrome **不提供** Network 面板右键菜单 API → 使用 **Latest XHR** + 自建列表 +- Firefox 需 `about:debugging` 临时加载;`storage.session` 不可用时 Token 回退 `local` +- 无法一键从 Popup 跳转到 DevTools 指定面板(Chrome API 限制) + +--- + +### 目录结构 + +```text +manifest.json # MV3 清单 +background/service-worker.js # 捕获队列、Panel Port、全局开关 +devtools.js # Network 监听(最早过滤) +devtools.html +panel/ + panel.html / panel.js / panel.css # 主 UI +popup/ + popup.html / popup.js / popup.css # 只读状态 +lib/ + api.js # 登录、SSE、项目/角色 API + storage.js # 配置与 session token + capture.js # HAR 摘要、静态过滤 + http-normalize.js # HTTP/2 → HTTP/1.1 展示/Prompt + formatter.js # toPrompt 组装 + markdown.js # Final Markdown 渲染 + catalog-cache.js # 项目/角色 5 分钟缓存 + constants.js # 上限常量 +icons/ # 16 / 48 / 128 +package.sh +``` + +--- + +### 与 Burp 插件对比 + +| 能力 | Burp 插件 | 浏览器扩展 | +|------|-----------|------------| +| 流量来源 | Proxy 历史 | DevTools Network | +| 连接配置 | Tab 内 | Tab 内(可折叠) | +| HTTP 格式 | HTTP/1.1 | 展示/Prompt 归一化为 HTTP/1.1 | +| 项目/角色/模式 | Send 弹窗 | Send 弹窗 | +| SSE 输出 | Progress + Final | Progress + Final | +| 捕获开关 | — | ● 捕获中 / ○ 已暂停 | diff --git a/plugins/browser-extension/cyberstrikeai-browser-extension/background/service-worker.js b/plugins/browser-extension/cyberstrikeai-browser-extension/background/service-worker.js new file mode 100644 index 00000000..3d39cb2b --- /dev/null +++ b/plugins/browser-extension/cyberstrikeai-browser-extension/background/service-worker.js @@ -0,0 +1,143 @@ +/* global chrome, CSAI_LIMITS, shouldCaptureEntry */ + +importScripts('../lib/constants.js', '../lib/capture.js'); + +/** Background hub: per-tab capture queue + panel subscriptions. */ + +const capturesByTab = new Map(); +const portsByTab = new Map(); +const filterApiByTab = new Map(); +let captureEnabled = true; + +function getCaptures(tabId) { + if (!capturesByTab.has(tabId)) capturesByTab.set(tabId, []); + return capturesByTab.get(tabId); +} + +function trimCaptures(list) { + if (list.length > CSAI_LIMITS.MAX_CAPTURED) { + list.length = CSAI_LIMITS.MAX_CAPTURED; + } +} + +function broadcastTab(tabId, message) { + const ports = portsByTab.get(tabId); + if (!ports) return; + for (const port of ports) { + try { + port.postMessage(message); + } catch (_) { + ports.delete(port); + } + } +} + +function cleanupOldTabs(activeTabId) { + if (capturesByTab.size <= CSAI_LIMITS.MAX_TAB_CAPTURES) return; + for (const tabId of capturesByTab.keys()) { + if (tabId !== activeTabId) { + capturesByTab.delete(tabId); + portsByTab.delete(tabId); + filterApiByTab.delete(tabId); + } + if (capturesByTab.size <= CSAI_LIMITS.MAX_TAB_CAPTURES) break; + } +} + +chrome.runtime.onConnect.addListener((port) => { + if (port.name !== 'cyberstrike-panel') return; + + port.onDisconnect.addListener(() => { + for (const [tabId, set] of portsByTab.entries()) { + set.delete(port); + if (set.size === 0) portsByTab.delete(tabId); + } + }); + + port.onMessage.addListener((msg) => { + if (!msg || msg.type !== 'subscribe') return; + const tabId = msg.tabId; + if (tabId == null) return; + + if (!portsByTab.has(tabId)) portsByTab.set(tabId, new Set()); + portsByTab.get(tabId).add(port); + + if (typeof msg.filterApiOnly === 'boolean') { + filterApiByTab.set(tabId, msg.filterApiOnly); + } + + port.postMessage({ type: 'list', entries: getCaptures(tabId) }); + cleanupOldTabs(tabId); + }); +}); + +chrome.runtime.onMessage.addListener((msg, _sender, sendResponse) => { + if (!msg || !msg.type) return false; + + if (msg.type === 'capture-entry') { + const tabId = msg.tabId; + if (tabId == null) return false; + if (!captureEnabled) { + sendResponse({ ok: true, skipped: true }); + return false; + } + const filterApi = filterApiByTab.has(tabId) ? filterApiByTab.get(tabId) : true; + const entry = msg.entry; + if (!shouldCaptureEntry(entry, filterApi)) { + sendResponse({ ok: true, skipped: true }); + return false; + } + const list = getCaptures(tabId); + list.unshift(entry); + trimCaptures(list); + broadcastTab(tabId, { type: 'entry', entry }); + sendResponse({ ok: true }); + return false; + } + + if (msg.type === 'clear-captures') { + const tabId = msg.tabId; + if (tabId != null) { + capturesByTab.set(tabId, []); + broadcastTab(tabId, { type: 'list', entries: [] }); + } + sendResponse({ ok: true }); + return false; + } + + if (msg.type === 'set-filter-api') { + const tabId = msg.tabId; + if (tabId != null && typeof msg.filterApiOnly === 'boolean') { + filterApiByTab.set(tabId, msg.filterApiOnly); + } + sendResponse({ ok: true }); + return false; + } + + if (msg.type === 'set-capture-enabled') { + if (typeof msg.enabled === 'boolean') { + captureEnabled = msg.enabled; + } + sendResponse({ ok: true }); + return false; + } + + if (msg.type === 'get-latest-api') { + const tabId = msg.tabId; + const list = getCaptures(tabId); + const latest = list.find((e) => { + const rt = (e.resourceType || '').toLowerCase(); + return rt === 'xhr' || rt === 'fetch'; + }); + sendResponse({ entry: latest || null }); + return false; + } + + return false; +}); + +chrome.runtime.onInstalled.addListener(() => { + if (chrome.contextMenus && chrome.contextMenus.removeAll) { + chrome.contextMenus.removeAll(); + } +}); diff --git a/plugins/browser-extension/cyberstrikeai-browser-extension/devtools.html b/plugins/browser-extension/cyberstrikeai-browser-extension/devtools.html new file mode 100644 index 00000000..ad7821fb --- /dev/null +++ b/plugins/browser-extension/cyberstrikeai-browser-extension/devtools.html @@ -0,0 +1,9 @@ + + +
+ + + + + + diff --git a/plugins/browser-extension/cyberstrikeai-browser-extension/devtools.js b/plugins/browser-extension/cyberstrikeai-browser-extension/devtools.js new file mode 100644 index 00000000..9a5f909c --- /dev/null +++ b/plugins/browser-extension/cyberstrikeai-browser-extension/devtools.js @@ -0,0 +1,69 @@ +/* global chrome, summarizeHarEntry, inferResourceType, mightCaptureRequest */ + +const FILTER_STORAGE_KEY = 'csai_filter_api_only'; +const CAPTURE_ENABLED_KEY = 'csai_capture_enabled'; + +/** In-memory flags — avoids storage read on every network request. */ +let filterApiOnly = true; +let captureEnabled = true; + +function syncFromStorage(data) { + filterApiOnly = (data && data[FILTER_STORAGE_KEY]) !== false; + captureEnabled = (data && data[CAPTURE_ENABLED_KEY]) !== false; +} + +chrome.storage.local.get([FILTER_STORAGE_KEY, CAPTURE_ENABLED_KEY], (data) => { + syncFromStorage(data); +}); + +chrome.storage.onChanged.addListener((changes, area) => { + if (area !== 'local') return; + if (changes[FILTER_STORAGE_KEY]) { + filterApiOnly = changes[FILTER_STORAGE_KEY].newValue !== false; + } + if (changes[CAPTURE_ENABLED_KEY]) { + captureEnabled = changes[CAPTURE_ENABLED_KEY].newValue !== false; + } +}); + +chrome.runtime.onMessage.addListener((msg) => { + if (!msg || !msg.type) return; + if (msg.type === 'set-filter-api' && typeof msg.filterApiOnly === 'boolean') { + filterApiOnly = msg.filterApiOnly; + } + if (msg.type === 'set-capture-enabled' && typeof msg.enabled === 'boolean') { + captureEnabled = msg.enabled; + } +}); + +chrome.devtools.network.onRequestFinished.addListener((request) => { + if (!captureEnabled) return; + + const tabId = chrome.devtools.inspectedWindow.tabId; + const req = request.request || {}; + const res = request.response || {}; + const url = req.url || ''; + const resourceType = + (request._resourceType || request.resourceType || inferResourceType(url, res.headers) || 'other') + .toLowerCase(); + + if (!mightCaptureRequest(url, resourceType, filterApiOnly)) { + return; + } + + request.getContent((body) => { + const entry = summarizeHarEntry(request, body, resourceType); + chrome.runtime.sendMessage({ + type: 'capture-entry', + tabId, + entry, + }); + }); +}); + +chrome.devtools.panels.create( + 'CyberStrikeAI', + 'icons/icon48.png', + 'panel/panel.html', + () => {} +); diff --git a/plugins/browser-extension/cyberstrikeai-browser-extension/dist/cyberstrikeai-browser-extension.zip b/plugins/browser-extension/cyberstrikeai-browser-extension/dist/cyberstrikeai-browser-extension.zip new file mode 100644 index 0000000000000000000000000000000000000000..5c708c99143423f7310f6422b90e3baa933da468 GIT binary patch literal 55551 zcmafbW3VjTlI5}Qv2F7n+qQX+ZQHhO+qP}nw#~WU>z?VJ*Ap=nk-O?g?To0%thFll zUaRCJfkB`E{&@(fo@)K;#eXi)0N4QfdIlCI_BKw|hIGnGkO07)ozmtoUDD=GuFwF0 zAWwh*03gVJ-!Atz$v@8!04Y|dTDiYoOeH}8007|t{-*f9k~kRIJDV98(YV;yTNv5X znmha}>-2%N`OM$=x2#>N(l#4x@LeCOQnX2lO-bCGPG~aeg1#Vs7PWKv;6W0Znwyd- zXvCYGG=E-j;`4c^*{{H^o)IIk<8Qj$7!B#B^|Fo-Ch)gIJwpsywI^+IuB~ruQX&{e zrL~R6n5mQ~ZiA`nLLMUK$hT11`8C0f^=h~gq~;;p>@?TI2@dJ3Yf96?8_>4ANqiVt;^_eL zBTv7|e{vbw*xV)Qe(tR_?ec)UFIrVc?|`U+L}7H{=jAQT|AjP|X4p zk4<37!PX1Znee5u`>&MdvX3%BF^j0D?4%k_HqWW8^B+p%#7d+Xx`*t>h|u=_8ArGW z1@jp=m<0TePon7z<6Fzvr4!xUFX(>&>OW9U @Pss+SoeT{s+Jf{Qm%M-ttt- z+=>A{=P&lT00RKP{-6E-%JRP 1A;T>EeQ8>D3=^hgZIArHTB4IvC>5KaNBX(5Ax z5AmCHZD%g(y4#F#%S&GE;?sVoE%L|F(!xS*5@gK@9h?QkLbB)`T;m=s9PaPQF&}0!~1K+<-s;+d2%5LX={Y$}j~nf4&oIGE+IB z=N4@u+H=woWih3%238HV`_Ab!T8~}u8$!^O%vg&n==+SEi2s=e-ywo|O48Kii{eNJ zASCiKhU%w;iDFcm%OtmRNgTACHV?<@B4+o8D!-& YF%IUf=$LCH5H0B`#C8O$q1to_PR{ z5|dp&yOKY7|9-oDbu#%m+LJikLG#hW`%Vsj0Q)Z eSFKf5gRc%Sj zv4Il9Co<)UiIo-}3DO977Vam8A|CZ9)m>!1LccOf!`s%Gm~4AI7&BLBX>`d~Z*Fx$ zHJ8d) ?|Ujc{ y-kp?_uOmkqaB{u> zqe1H)9mH1>mtfxzzDCnG%A&o-XPcASuQE4(GzvtTOcT$Rz$i`>wSP=v<%hXOH5IOH zUG9fLRvqA*iUuwn*Ci!CO}wy2zW^1~C@T=!$$^O0Uh0rYHGQN@n@p^)5Xt0o@`nvm zI(TPV1CQ~kzmp(?4ah8EuZ)*1JJQ|zBV^|Tq@q>c?$5ZM`z-+*`p zE!XO&dj(S&N_pZnd?|P;T%YyrbXY zS|w+Xo4SKY4NnDylp|Q=j-t2w+_*OUP;=jY(b5;F-@Ghd1QGDUGC5+6N@D|`zy7P| z{(+W#;aTaxzdiRG3;+P`-+Io#;Xi&ZY5r}ufAHnsS}sXRIwpf2zU!u@wz0fE&KByJ z@lfGOt}G;5 5!lvH}&{KvzJevPj_B#BTMH)f~P?E#GR4fM-H;FQ=^=Y;(6 z>$;Qi1XwxA)ZuVLP?R0bDyabfe41QrI8mXw3o`EdlX-OzVxigs;3DFBZ#VBI%Jikj z^o}FbCshlsN;@y!*ZW7yO>9BM;Fm-qYDH|661zLBX|K2;Q6%bz#F)W^bSt&=^2WkK zal%&J0J9vd`R-KEHKzNR{912sI7_~H9X+#CG?b}_9E;Z6v~3o1NZO@`8@i?|03Ga- zoWHnHw3<9^G#I19R))LU%DCg1lKwmxc?ua4pP&5rE}=5R`@YBM7mIf@uK7|QfVJ?T z#%GZHrnssnko=O!_TtOUuwEjlpuH3Xi{arncp_>&j$DbOWG^0`G!z*%Nm`F)A}lE= z)LOIJOC#_3%*91v+d4^uwOzVT?tc70{?}pi*Nfj2{R6)R4OZVABYdde78W^G3rWWk z0c|`vPOmH&C?n`1jQ#6CquKT1r~_D$5`C%uKDXLSjY`MMk+`VJg5i8f)W~-Vr!&Sz zu%_!_IVfc0(KdqZNBk^(zGQEoL!hg%vLIYh+|!@hZi0hs-f^P4cfGZj?~_d&V8<7s zTQDB?!4|V~vV#JR#;?i7?k!x_y|NklD1SCJj^p;0uG2^CgW-@?zj;~-mXJs_Y_h$O z2zox2etMnM8S65V?<)W;xyN}5@~QKvbp1bzw)A|N +83 zS&+9;EFF$Qp;1^aSEgr;FQS=6w-xkW5oSXEM>r=XZ7pqWt)t))`D+%P!RF*B%_RFJ z&CS^Jt4cQ$WyB6OQf5M*5R6}Ca7-pHr|^JZZfGXx-3wcFzw37ga21%}XoWh(Hck0^ z9yytra*;4kD FcCz5=OjLSYpaCw%iBV{~)?D33Impb6VQc);b zNPaowD*3c1VTTtiITxA{$_o8Bk0To0`ET4M>$_*Tmuo!SEsxp`7kY^EeF9w$Bfc=U zFcbBzoB@Cagl0UDgjUaFWRo|&J8SMSu)gWO=kK|#FOQE9@IK9z8m%!QoJiB_J{4Pr zokF0v6(dSYa<|Vw$#HdSZxuqM0u5r1*;`LuzjV)JBj>FG_3On#H|C=9f!Ect@(2^c zka+Ewo|qB1i2CMq0E+n&{f||hZCvTO?k&OPLiXu5;%UmhqXJhA;GUQJS2iRFm{Ib@ z!hL(kcB<$I4EhWDtk8KNNa9I7^B9oXf -w|$*wHt>l+p{d{&7J6PhC_`aN zZMs&_tDL~p0P1m%{;WHR%m@&wznCmigqZB%C;ganwfS8aTfpOx15s6v!Gf2}?7++w zfs0!Vbfqx#AzzNnB4Ccam@lKw(Jn?73q^^F$oR?Yc@{+rsH@96%#=l)7;sGpFSClp z3GcV@)rf2}o>SxNIH@7^2 am<$Gfd8?_$ z@dfO?bn5(>-FN{Y{(<8%eNFg6t$kIwXtrw{s0wTFm&p8C(qrwwNU+98a!n7j{L1&> z-q%NCjbab))}GY$vqESjA;VyavKQ`9=%R8=?xd!UwEYZssy2!*oS+i<&-$!{<{-gV zr2aXdAafDDfwH>TpY9)7yx}anIW1A!ip}AxSU$9;Ujb2gmU5zF6(y>4=tpn2?@twI zY|oyqPe6H-In8WAgKHiPQT%raa-(?1j~Dr)(FgG-bi9~GS_vdx>>SAxgfYS6=}%6D zoS#$^`(~iSU`i@*Td}*X({4(yecb3Wj2uej+`c*Z$xqI|64|qt=+(4}@7jSj1bwD> z |YZV^n{>F`nF?bb7vzPkP**&V0VFCuBXWK8_JM6|-BV zFxfJbsToQsC8f&83Bmhh09iU3G4x Ew{Wz{Ch2?gkyw-*2_iGamIi%hZ` z50FButI_4?SHx%0QtBetCh%?ex}+|#ZC{<+>D|&SaU=9A}o!2;Zh+gXy;US&H0iP0V0_iA^lHSa)Wk8{BG6 z=1W2T8*v|k!~pGG*v$?#9$$X0tCc58;?@du&`GzxF#ogf @XlbB-Y)`SiQp?kI7_m`-ivdQq|x4r$E?)&FakfE z@H=&2mYjam+R!Sz^xHv!JdyA9$IM+J T zpw7Q*2(XK9oRx;A7WBh4*?9HSI^2BDmR>TiL)(RM;Ao!n(ujgHn>woZ(cg2aP_j_L zT> zLvNYfX* p>PUob^X$6xs=?&_^)ADBh z{xq$`{mq8Pc!nWr#x?w^UUB((XFzjTxy)EO$^dYjeF|%^t4x2Ppk%G54N{PPHp@r> z`3T6e0dqFx{7M_>ULiFDz8^pqHt~saQsmMJj88;<2oxe}U`nQN`vfG6PpQ(;Om5dn)1?nnzzMxGPVPjg1;lu<-l26{9RaBZ1DhitU-Jr zdTh#QxHp6Nx?*+U=c *4P_QG!N1 zauf-=yhk4(pR%De22C%-dUa7v(Soncx0pEn0{DZX;+@1P8NT16T7+=Z=0Q3T$0Id* z3r~g6cvP1WhM=GFv|)YQ(eQP9+a>DJQNekKa!T&SSulQ$8eUY`bZqW%bVY5zh}>8B zqK~f~%7Yddh|p*mxn3}5Y`m*M8 ttNxv;vJaAg>l*XuCHL{s zN;bql0;%S!=pT&|P8F~#a6AI=5safHysU19r)l5EWW(Y?IDpd=T&M8GnsrTuMT6u! zWfY^wMC7AB< k{T%VBbb`pR3AOF>aB3a;aN}M zi$@Eo^kQtYk&ukYG4-zSVmZhrv5-nasECzAtarchD;9Nc9A40bIly(34v|3g)FZCD z8AYyXIFUf5pnkM|KtKGM-=~La{?6 5%1K{ErjmJ0J#*y+u}vW#;unQ*l;d)LhD|+*pPw?JpZa2E zSS#$__HzN=70>H#_dRI*p1Z$97FpOu@!?v=x)z{!V^+l$7@+29Bb$vYkfeNV3dnCb zA(b%H$_!{-_Il~9)tbilQhp6A5mgTP`y&rOfF7&R;7P!T#zhbl(hWdxMoe`&)dX_^ zCO4q)>0#jI#YNPY&q+J=(>;d1vT=mcMh2{DhekES+6<)mLZnsM-*rePYj%+t0;f8O z!_QLFE$hMIh^H0iGJ}|4I~%L9*P@a^{(6TN%zs!>8C>c-=~AwnxoDS}9810bEPJF@ zccnNG2^xS2ybu!sH5p>qpQAk@(1{2TqX-L0-rD(-jQHg*miSO|fhEoTVLzpZsY7v= z(-*WjD^d8wWjf2$J4o^r&n`Z6A@;M6E< wyWTh98O?JHhuvM&PYTqR^|*IX6} z>-AP_k*RQA%6)bIw%+hbJE^rq(DD;2K`| G(+e`fYgRIg hJZYS7G#tM|8%7~Id>x$Qo{54SWkV xNDNnqp%M8VE zm4e461#nX+M`6&9l(;OvKr-&um*wdosfWhov`lxkZmXfT=qX_)<2H?KyM|ESr}M3; zr -Nr< zxToFrb;M}M^`eB)CI?P_BbnRmyIx6uECtE(n6M7IA>s4bj5;FH2Sd~G3Uc<%2hX?fQ3GXr4u JNhY@u`^(e zkq6Tk?P=r`x1ct|+yatBQE!dB9j^abaM^exlNVWkOE2qWC2Y*iT+fAUYS`3LpeO>) ze?v{1u|-4WG>WNSMXH&CH>A$jV`mt7B7{+X&^q+WfXb~IgS<>{iYy$O^Jo`ID48Y- z#+tIh>lWZ&vnN1xAYeWEC(3xCwR}2U!CJMPjwIVqCX2~!Cuv(QIuDkw5LD%LP1Q^J zzz^3`SCO-Po}rZ#ax!6h=2qG9yob1Qa2(&QWehV`&)i*2CCpHM*)1w0?woFX9wuv- zahzfT28U5Py7~ztZ;EpN{4zLA)vK*ALd4W8ihLXWLMC&58u6N#AQ`Fqj$UqT!x%3D zb9ig$O+Q}FGcIeRd`H3NhvZ;_s=K2v$!Nns0;^AqBGA_?w}8~Ew};Ka(Vwhj_>Y|j zg_hI>Xxksp$J|l~9gfu0(Mwv|CKINx-<_DngR|33e#h?s2p7nFS>2%o(P9t#r9gxx z{cTge$P8g|0-ow|`%{DAAbqrANaycca=`pF_z=o9Vn}Y#6xD`3l;z=J5P~wM;>uj( zNZXE~p a(G=O(jJ$dls ziu{@+B(LZZ?q7b8ap_xBh*>xOzx1xcTnaqAG{tOcZMQt%Qhr{~C+K> N%p$-ohL)4LZtl}&4Zf~hzy9UUhNwT8#WS7*^ z(|T-Aq`V-2!7*6mK%Qw;+AcDt+!2Nn1+JdMBU)Qu^#*QciYlsi)f|@K%s5sEi+XM* zI@e}p2QxH{*U!~7RmWptv@n-X4`K2vmdc3L3#ifPK24L#jiog>&`#SsBgr5eJPw;q znpX*9gnGYByA@PjdsM0oYZgPH*cG8__c7K|#6lO_L)f zt;^L;)2zwDj1SML#6{H z5rQ7#v7Dc)B`>RAp8&~|z842MXdQ=hc#X!sDJ|DdOXhCG72|0vq|MD9qtV&3jciM^ zY5h%G%-&+-L;>}@ll;B8qF>oK{g`YhVb_`=oRLEQw!}AD+;Dn__vM(S$|tG~3aC-R zbDx%gJw hw_&5lRCFbP9+}| zB^=;ySoRLFUbI_P(P6ox3Ellml%`wTn%A1Zh-*hTPYso+kOaF+!!9m-aE|<`zU^6d zFTA@guAK<~yuHEGtlygyYR Ll=wp&WB*u6ZZ%YnUM!};A| zH_MNJZKC+=rxJ!)2e+NQfqQK1aMQwFkXqBzz|cPpt@nc-)W4~QJ^uh!B}jf?R`9qC z9r)xetwAyVIw)7-q<4cr>JL%Y4K|1%r-~autD+kb;E=(JLi*VYuiCC4Skky^$@$D< zrFVHvrf!T+6XFUY!ElMVze+Ab>7K6ckB^W|zg7uP {vI6m5Wc47=c`cXwca {FYF=-xiXQPvs`IKEQO;tG z lba=PD#NbCBxoAC&Q z$!=-jJJ(oh{-uQ1q&V|56 jYaSGSwif*V)MV!3WGYbWFZ|COJDdA_L;P^v=JslCf& zr6ZsyjpDhZ2}g_iz!K!LATeGkZ5YsxJNE9J?+#gZIUd+vKx}@(G(FNkj&(75nzth5 zM(Mh5N!61OwnOoeHQyumO_!otY%eY`qnQSan6J&c`-w|`NAmK9Du#_`XRK>fSklI# z64!>{cXZ>AX!-P;TqJP&O}u{XM;>4Y2}vTnOX9{22qk^1NR-ywQ-d~ZE#DAm6Kv6B zIcqX00T 2k{Sj2F!>ezubI%h zrqr*_u%xP%L++n8pfslaj~VpFYckAAED#$Xn}M)^+o|KTHk7i72IcT4KWAf>s4q5Q zI4`fkUsD!Ca+G*X7QUP2-WLy6rXd)u*v$99G6Fg-$9&Pxg~)6Y6sjrT${j&9fU%Vq zl3gs=P9HtLMqg-sg9r8Nb>HC0ea}@OguA?`=C-;kuc8B%d17)(4$w=nqv{>qwFZq4 zvyv!u97;ZN&!@d6p4rA88YpJ9)UkNU&Yo}#L*Bk&yUey)TR3#yiIeI(QZNEJa6PJf zDeLCHZ6TE~STSo$Ks?r+KAOWIt3+GMq9_(#c|Du4gL{>knpr?vdmi5(HXY}#r24J% zS<)tFS6=GB`nx&bDV(oq8u~W=C@^u&7A2ibe;G!<7JZZr+QCI5M>@VR;i_wp+C}GG zu>w@0rL^~{c~78s(-upfMsT{5>J* |&i(rJ)$hGcg8~lF9lgnKjugHLZOeHP ztH+L6Pa-%=N9r6Ae6$g1m! 174v72LO0Q`%hWJf4f!tKeC2@ %-<)vLqF5JyD*V5D8Rhq4LLR+TC@k>xkk;0< fM_|jsOie#_VaaMs%0%;4s_@Pi}BZ8Qa z@Iby+F)tJ*uX;XieKNcoB1{EghK8aL46|!iePrcGHpU5Bga(OOH~YhcvtaebjmY2! zG5F=iLJeafu)tmhKm4j = z&9pa`JXhXdBiB{nr{wCX2btoFU)Sf?LsaQ{SMDwrMm82ttKYz p08>rXNE<+Pgo1XOf5Ad3zW)xPvORrq z(T#Cl7lW!Xla^*CuN^zQ$s16VUu}jr-c^FeXwd+N^@D@30w4dR9dE?2dC1p=^rloi zEv+l(Suym=O=GqP45Q-5&>YT!MV)A4jEImCj>e)I`qfa;KZx19f5k$CsxX1jx+!-^ zSqg6^(Sc(N85ayX#G($A#sf$|GfB+1 )m`me|je^rxE2$ wC;vHi*UbOj!ZQ@4+MBNR!lwpX<*=AazUFyS}$d+v>k1aGuOU|9*#RLjnh9pZe^ z82%agh?!k!jz4}DFN7Cy5t%wi;_~-CXG5>DvVj~6uu)Nc3J}9Jh&cY<*F6RqqV?m@ z9piy)e7NYr^sOF`FY5UukX6*6eq~WJu!Vw71B}o;pK^3E8H_&$K2A-{2n4Q0qf~ye zaEU&s-H*>j5D^OWZ@q!B(kJbCCqn+hMQPD6^z+#Y&5Kf(qv7eLl8qVMNHKqV?1xgG z=#Z3Z0Z3E%;?P<8 zhiG$5L(}amCcrib4(CrhO7HNY&Kb0U_k;8D*fjAl+h>x8-^E{I`mSjsYq{)EB!h}R z623cMesmwD50>pE2|69Er<<6RQHAq3iMx6mX$#8xY(a?ljXRV2an-afmIxvCVtf~2 zTVUhVP0{o!393V`K{KfsCWCU%rP(A3dS9TmE?Op+aV-4s&k;5jsTc_{JRE}E;eBHD z%N%c(>BTmI24WhVxq8*YQ`*jVwvV6(&q3F3coyk)RcDHNNa;SEXAvxbV05);pwYom z^uffOoFC!n&tkn8ARY_p(x`JLCNiBGZ%ddr4hGxdI}s5Bp1fOPzsbbuuEH13${@0A zn!*ZdsVp?yyCWR)bbS4P9e_3K0gju_<58QK=AgqX9LhA+WilmhXX=R95)f(lzA<-y zlf4LEu2bCm8*;X>nn=Kg1%}EiNBi|xqspygZ#E}TaYd&4w>aTdu<`2oftip_C6dPI zZ7<7&d?EUmhn}Y`IpPIfp#NeJY-0~8urQO*+#O=Lbxdyr*|db#YOgqyDm~Z;CiHNM zwXF(N0cN#`HE9(!)pEXC vWC&}aN`Lm(!!G*8X)6`WoczyhkHPr!(Xom&Xw?{a^f=S!; zayUPI9JPHEvEj3`v!QWSZF8-y8AQ}USM9P={g|D()79GjWnb_z@X%G&gk9||*z3Q` zgN@l=2%k|0;|IN)8N<{bNk5_-%#LnzJTAXdJwC 1Hb{n1;ZLQ zhkZ=ZDFq}WzTKavL45Q11NdLEuDrjTo1muq$_Wbq5GwGWvabKex&K?%we^>BxBsV< zWk_=?dZQJkJEug~1>TUf30pmx8y60$u_FQi+R{4xx%?EAM!uP&zEt9Vvb7KB1O6lM zgP8jhg+iV;yYTE<3Na4ZZF=wRZJOZe8|Qtmljx|VT?%hZ$6J6mzNAM!UAeTEeQfro z=R3IG(Wg{i3ej`?93$NBEi_vpGCZERu(C7Mxbd<4lrI{j%frX1iH4$T?u06ki>}=E ze2<*atxI?Xq=v=&arXKS_AxAR77ui {9p*ur?9b}fTab%gp@?21=1~_}RGIkRsy&F1o zwvim>&q4ajDOqkX=>$J#&-V8b6hQW9mM1XUq1$Gq(?-~K9ESJF)xa-gV%Q^i1t+3j zt)}9SA%occm)y-DPcTy0Gd{krr*$$8Q`lr=`M!!>-Ar5Dm+T^zRYaY78N9X$@o2)) zkbCLK%<8i909>KGMB;k7uR8Z}44zdWY^dM08 y25fps4}`%F}I z)H!VAwr11fO+F77`U5luwsN$|gR+SwW0|lrRv6W82IehQ{jvxX |7#PS#aoV}hqc8a+}B-`>f(!JRFQ)?!Db*o(gs-^&O-frpti-swoQ+tb`fQC z5rsQsY%ny#W!p{g y24kS|GI&z$dx5v%kN@aZ z%`rKM&YUY}?!EmerB=C~pEQF*u!9eC2dxE>Kt=I38VNuJ9(zY5=4;W}*Y_Da%rNG6 zz*ZFwlhZ<8!oC+N!yMVnXL&u;989&ki~=nMEs22KFlL R<76SWeyUH{X?2q`*R%1k9f17V|B?e+$qyYPt|`ea zBZ;^~Vf4Y@u)uIK@ACuu^}SJZ8-V@@U{i<-C^c!Z_SlvKc7|^a{xnvY7PB{yRnC#- z9QfQiOAx9V+9;C1vF%9pC}n?;^qA&wsD0jMxKPilj-;wf7gQ^sW^PIACFLM% jBfw=m9TS)39bMT&9CDb*uV|1RnmruxW%IOg;9;L_^jjFThJektM zUS;!c+@7SUTtaku-DXohovK|Ph4aiDLlplzS;_%oV^A?;p#iCwRfDZ_ZhZv|VsAgy z*u=sLwF QO*4J(+B{| eWD*mo08Q7m39nDK%k#F{!c_{;~8Pv(4lwssoXY_YLZLijYQAY5&SJzyQET zG$U`94|X9I^bu0XK$zMK>3u}m`yxe7BcmAGAD;bX2vE#9{G~CrnLUk!+~{PDpKVK~ z70|8%NfSfK &B4 _MCnY!f#;2xx*;5Ky9rZ^Jl_FlP3bF{>O zI4ctDQ9L`UtHShyf-wbP00VO5MkeP~M%@WYrD?hypsMh3z*DY;=yk%2 X;<478SnV}1qPQ~;$k9k(t zqReT4n)+Ck35d&1b5>b0Ze(K<4wHxYo*$BEjtDPW*#J#7!ByLVJRP(-17_8V 7+%9nBqGoFQ&dg@Llvpztb(-uW{4e5|4 zI;@ed6W~^;(L$J=at$0AgEt+dVMpsuHS@~+Z8SEFbe=R+wml2=zF8BZGq _L-4ubq_9ZQ | zDai`@R|)Pl+G#hPN~}X!zG9Wd-;0*MxeHcrpf3xmj8g3=qbpUj4#w{Xn{=sVYZX{? zckWN*Egex$ibi^v?jJzicvm*eY$(c!eG>-BPC56ze!jp8uxCK1{p25P;|?@SbMuUP z6ExYffdiPxXLzP9(9&WPB_So*Zc(zU5^$ESEMRAV!9V?T2G38o9co}0r j-gzOmky=`t2R;e^lP~a**4}TrJ(E zwXM*Pd(KS525v|W?_xJj>5ux5D*&PjGVF?cPk^3&ocpw_aJeiGmr*$}Wn9~8P;%GX z>mEC`+{%*iIlOTC4e|T6C{Wa1M#7Ug$uMs2sweI4?}gJUnkAe5u*t#e(K-JnmZ{dw z% o0)HVVKl4)x|!5sU5_J;
$GACwv>1n{o%|qI@?d0$Vdo7L8v$7Ag%!YmsNZzWumvKt<)4RxG657J92WdUh4sD%tijbC>0k_#fcJn Wb;|oFe3}O%LpOtXIhJ6;+t8jE?wR8m+izoS{O>9 z6M T_g5V @4AD_sjmPqAKjYJyPl>OHAq z8x*RV SXyu*1w~cuxtytm7{l0nanfqn#cJH*AR@Ic^4mwj+*Iys#ii#nHvGCn zN1Pdgq1M6Dgw`r61)1b-5j2vPPnRaDz`*VNW60CUE13D7VAN3-Fmoyasbj#{JM~E< zb)4bZwQUtcMg#30Mum*#l12V8 Z*tMDp;zXBP&1#xzFLb?& zlpbT#Z*6O{&LS%I0Yr925$AY!C<;*O0LQ?~PM)!4s~+Vb9`$;__CRvdwur*;po@6Q zoHYKAGo=j>uAgQCk+;!lgWc!EjTt6dkE{L2$bEf&q#T+TQ9VTFQD#v04(-Vbo}K4V z4HLC7oaD<$^tfKt2ad{(3D&*@Rps29oQ+N~kWK$iE`X>hC>p*ehhk@;QcpqrJgfeJ zB^-sPa!N^YqYffJPiqcG)Zo%dH{IytOGY%+--c!D**LALaOr(2)|8d6SJwFo75Pxe zmRJSry7T#OGibHisTM*9D}(!AllJ7_`1RLXWN75 L3VeO kCKl~)g9FP$(MyuIJ2~sk%U2wVT1_}m60?{6p@& RqDsOhjKX=g@KY3375U16c;8Z z9iE)zVwn`c*#XY->xu&Zw}b0{hUh~nJYc-P-YCDnemuy(A3#BvUr1V**2?f-M!bJU z=iUD~KL1geu->4D?|h&_y&Y1a8FP-6v<|xh5?)x23dj_Wu!x`+uJ;^t+7*<2^Uc>u zr8|?jFDQcr(&21iZ0N$3dZBWh*gZtG;qA*} cY45yUNuzc~f>ydbbTKMcoHMGhW zkYAZuc1JpMH+cF0w5{zk0Fxt+Avv`uqU(`J{1OZux_)mTAv8jYK`pO`fv+@=)PZ=q zs=Tbki&?<+$Qw--VDQ9QwP?9p@q8RcMd8|8JrPtl*Wb{it5zNN&fVKZp~-FQE9|)J z8VJl;cyd!;Xh7&0!xssjidj{*16Ii7PQyCD_ysRvE$G;&mX9j pX0= zGJXk$!8PBIjN>UB0Mr3hHs7}`v Cj8 zO}K8qTYn19(j|Q^dm7`yv(-;P4DY^Pe6EGUKCQYvOnT-ap-W8D@stslja+?V7ei9- zH)a<0GrJLQ-~|H6BcRq|w)4T*31{uJ<*A=dc5{JDg9K_3^YZW&1yK-jlYGegzIvG{ zI#-;OW|$kjX1jF(fk%u%_M0v?BvtN>g+ESh&wm+~*fjs|zd!iL7;I)>W9{%Ch9%Ac zY4d;L-@Y6Fb<9Kecfa+y-jMCz4t4t*|2RhfWB)%Z0}HLKwaLF4mGW;EpWXkF=>q1~ z;p8ZOUtd>u_vz6V5@;R>f3gpRm`rMt9#|oAi2qs!=3;uR6U1Iifrx9t(+i`~*Af=& zuM7_iH5L&+SswuK7&H=QQWqh26^OL8vKPo01gmhCxbYS#_G5Knh(SoOk#&^yC*05X z@+!( 3M!D(<{b=OQ-+O*RJox z@EG1p>IojFB?6E1$&IJrjhiOtyjC$r_1{a_x0xrgpid&;ka`C$yOZN#k9B7slPp}C zrmlB-pM>`j?2KyF4j!2 ~;T(wRemWrHi@-+qP}nHg4OtZFk?cZQHhOo40M-=JfMTGT*$JN#@V|*g2?5 zovLKl*;yOwY?>b@NA1acdm6qEX38zP{Md4}eh=SQTZ||)qy7`^{7L?&lAF p$fHY* zHOpE2+gQ|mb0{`<+3WrN;PGj?xU)%>6E!QBM|5f9MwSx0(tqx A5hwR6gy%tnh_;kBUOc|^FoeYuv*n*&n|6%)&n$;x27otWwY%{TY!_;3FbBrRkL zPu1VjQn^pZqx)EZn)SCA@~SpvW(A3ewOi>Moj;%&Xvw23 ;eij)tD-?1U<{ zw$B5%=!P_1DL>SQmp-IE?RDqZl4#E!^(O~r>hxW;r7sI>SE<_;@=cx{@9kAilIB4F zYj6EOOXC02+_`6m9oSz7<$v-&HJ63s|4Vbj ZSp|JjY7_5Z2h~jU{@Si~Z{sjQ5 z`nGew4WN^vm=HkC49?l_K*U5{!c;~Efa b(J9x_<#5RyK#fv8s>LVHwh6zWp&7Gbqj0lf2cX^H`AHk^`lx@95GjE zaYGszODqD45du}TqSXOZPvnX!3XuKu;y)=16;xje<%*RR=M@DhqRPths8A5ifJg+9 z1euAe;V<=OBaPkc56eC$n=ji@xTmq(BrjV>SvOuMn@*|WC~%dwW3b+?@j^ed%6?D$ zOTg(au;Z|lHB#0jkQ0RSXhch5{Tv`9;YB2$djmEF6Pnu?{cS*@e|Rv{^l6tbhtM?z zqdkD)is~@lX%t%I=7|~7O5iCWp?QXQm8US7^yP$Mrk&;tSs^yf3#PZhLrTQLnlTlc z2m}R;H<$;w=!isDd*WUTsDr-tTzKWY0^tOA07Twxg#5t|k>AeY>tYAcLc>-4Io`-_ zgG1QcVj|=24>|D4AhPHA66L@NXGs=<1Bm3kWO>N-0Zt7HZr1jX2sC X*b> zaL8KcQ6UEAPX0BJjAuI?0xIWAnRW|R$Jl0;kY7&LW2KW?#-KR1*kWN{Vy$FEr>xx? zEs|}iK4{gg>oPH(VqZMATydCs1ETfzTPXsguS8It=Xbkp#HduWsc@cwKY+36@3>|$ zup=Qg$w!6}tk+nz*T~$Jjx|HaX4V)DJcS`C96}sxuQ+QHXP$Sww1}A=(=TIbD$7h5 zWEAXgJooaf`a=;z#e$;F>jMh* GVs9z9+z9La|*qko5LQx^=4wp`-kt>#3S z#bcL<4!3M-7ItW6_k8tr*Z!Qmb(Fj~+qu$!o6*Z-YU~aQ>4)l&C*sw@25|)tJa<#; zW$|%yI=KJDY{+`u&p6)w<;mdcdZ{eTw9}=T(eCmwE$3L7v)T>d=pVc7i?Q4KSjE@% zv@LF8X|iyGs6=-hXoAa|79=P8jD^!8+EaQ6Xz-Uupc4Eg&XBxMZvEz2<#zta0mmV3 zDE57Q{MYLHvo4qUXDgLV`nPi6&2H!ARd4%q*lSOckDVqIb<)EBkDH~j!4(WiSONry z6Y{wr*&Im?9RAV|6n{{#yttL++ofN@5S{jyzU^CTXA5392XHWHw*^byTsCf-#fAvq zMyZ9&XiMy+_vzDtZ$<`hA;q0B&x!moXN=KK>(8iV(Z#{pPRJO}YT>QUP<0;CZv;hm z?3J01^t>`&oo=i0PkfqWv94zMlr(J*|GLx0(C&)cHBOI*^^4)&dpmV$eNtg2Ihtze z4(|hdktW$%AWmx)+5n=fA#x@@<~g4=_l(yYNZ 36~?*?3E zteM!Sty=78nRbaSnp)-AcXWz2k3a2u%^N}H+o`v}7ZedpY;B$E6h=c0(%mY9NX}*- zX3*%hGrkdDcyLCjeS&l<(CP$X`AtzFCfF@DT!fYMto79=vV#jaqnERI>J?s_=Comp zX;+BwJ@Fz%>)?grZ1g?>7%*NBF*oTcn2|%$mH({Z%nYD$=J`R<2GB0LuQE;z%2S zNI+2tf<4seu3t{Zs?R3dti$D|DF<)mB?~obI-`*3Mk%EShfw*@N8ub+1G@sv@UOuSv#LDEh-kQ*BJGBQ0Hg;i zmT#M &m6--eQjz?$~XQ zci7u?B1nJ)s7b=Kt}!HW8I1rWiZer?)8f3iFb4D(=h+?71%VJMiZ O~lz?{vgPsS0cdc9>gI4*!xU}P>rwmbAS9S zS4*Aa@9{);I&ajbL1sB%lv7yrK*E?wP6C^WtDf%roE(!{e6pkwsuGbOjWDY6c-IX| z0u5SpiIN7IeLc8~)6?dFREb7s-Rr EDXBY ?H)mqg1}n+;m%7hr!^Gj^FMneU6kNkq~P z7kd&ssbEqbDG)RTKw1?Q6B*;=;hle~l%Dz e2~9Y_9^kDAMgN-L+K;H;oPVYk+B 3_bUiFY8S zoTCSbU;}} Fpnz4`yTGuO>_W(oJQ3jXUvkJTJWzR&W4~apFwC z^V&aBzuaVIXL=lm&XORH`{(pab6IiI4h~_``jK$NNxG_JGNambFdI-pi_&m8hEXb# z#Wxt7ai|Q_?8rcNfzRsj^VNSvHaAZUis46@9ctNf2FV=W=)MiB{cyY$j~k8VEHq)s z9yvCv*CfF#%A>GWjMNQvg~e3tPT$lh^Y@1X2-l5N9<7Ob4n72)>PNE}!QRY-CDdJ# z<&;{AfEq5E>u7bPNx10saCl#yl@g|fnT;K2Vy3D!YXUx5m(W*KG!*S)(bXmojl YEY-ptJy$QEQsPGLb0r<4)rt~PC9KqwW J(@Y9~by| fykOq! M;P8u1s$CH_s#A zC`1ItKY@e?^%mH!%=4#tADml^tgwD4+{upflD%w~j9o@)g{25fH-yG+Ue%B$4PM(A z-eGxiqxEVuqbB8K_yUH6fO?1%C&xomY8JU ~?p?nTdQiSPEoP{ZT!!XukSGes(^VTb)D@B>_>0hO*)b zF(67TDXEV6V&wd_Z_Bl4&YJa(O0-4*)~bLVd(GIFuagr|N-v!^Q2P(eEi#NK4Ienz zv-FVNXp00X(d?A>x}}967c> 7E$QD=?H zLA*3k3UyL#a^-{jZ)$fQIaLdO5~YWH+|srFjm*Iyc(baB>z$&o*1_<-VIY7)6bP{@ zGBOHb#$KO0QUG-|mgb(}fg@3aL`s3X)?Rv-? 2m~DS)|?(E?0zsB>f3Pl8In8G7C;f*4Qe`bXFXaR=b~T`|r8X z6<;R{M7!`!`4w7y;_=s``MIeA+bT>l*-Eq+$4ib_Sov29{fi(8=wbYd^vyp)EdB$G zkO3qR;gFxJ0HweiF>pn0Uk8c!d%n6P62%*U$PEEfP;B ZgMc)~Q<~ zj>!3J@QnD{HMk@o9(Fl|-7VC65wgRcp`PTr{142o3;|_^M*U6E*u=*2e2It|hX)bv z?l-=OF@146x2k^V&;#4R(KrZ0>5jW_Pa>n4&F>9`(ElR0|BV&pQTBzi2M3@4(F*BH zXNVdI!-T+%xtFvFCjx{afK29JFOhoh)rJaxrDcdD1jKPD0Aa=gK5Yye1^V~ZFzojK z9pV8BAb?=3W|N$=9E21ZIiHFWxPQP(DiU(*1|hG#ZJ7?=>wbx2hoYqiZQC>0BmO+V zYE_TRzo-Hzgguychw#rrxRvFAPno9}48DtTgRC^jx_XyD& RV @8JIzT Arrv zH>k=+U3iFsh9XI<&W?4?gSpUkcrbP}28s*-Ln#&!uVNkmvuUiouvEY$cXtB~GTuAM zn}K01G_DaGyk=dMmj{8ubXN+}$6eGvB+-cGtn8>WC(6PHDlsmk1sed0+bq5MWT55M zF68uQ)=>(CB|r=SHD1d;iUv~xN=wo{(;Dr0npi&0q%UH)t?FndlcD$s(sFG6kG-^h zlHoXVV@_GckkBv?NZYv#RsI-{7vwT1n5DM12@}bd`eTMIgAHJojccPby+|J3)x61o zQHx@je=N7Z{BCY^Zd)8=6>83Z&C}W1ob;VzIUw;=)%~ zQ+%a@KY?hnK*ishY1(4KHWC39X(;8PJi70C87%9#P(Jga0dOs1#W?9&irF0WCfs=% zs+cj{z# Xq0mtL|PZ+c}ijt z4G`0K_eZXKbuv)XE(#9j-7WFh3TN3}ki9Mwn|%dXAbx3d6$}Uw<9{1SD*H0y#>4;< zCna(5#H}{9gowuyq%Cdoggu#tfq#y&aS(^K3p^ijy #hp2>ye8sQpUN&vUwTv?@((r&^SSjk%kbmuQrD )vx0aua`=N`9r zEF4-BhX!mq2Ey@c!w#_`q6Z1c`%^5|ZuNnyV~vpGL|~(IorT<*_brr1hZp|QR4Ay) zRKf?ir(pm_d2ayLprisqb|jby>;km+LRQV2YXWNKIXE42u{VH$VYWcZH^sTvB9qaT z(P-`|O~jpTPe<%pD&Di4f(Q!}2189zmS_P}ASqxZ4M-J$(Gfs^)2TpM=q#$MM38Vn zXrsa|iQACMvQwN2k;T>y*JtX-A`LaQl-4z kDC s_U`Kj%^!mYkP4l5Oeu!;$5A9Vuz`-sMhgeXPk1iR zN_A=MX^f#oWa*a|6HR)Fl&P4tJISq% S z^xswALbm?7`D_0O%tCv-+?E)7WkY{5K~**q^Ktk=`6-W%4CYI4cw^01803jhbC7PE zZTUf+sl7$|hH`KV>J}D8kd8ecY<6~oz}uY-)1OpczXsF!=y57sfPV{Te}XNI-32!K z5nVS)-D%sy^5_Z`7(%GcBhnc}IHU=~5d$FofT2Lbj05w3W3ls0n4Exw3X1zM5qyg} zXm2+%H{qaMq@**|29kj~7oOQ-3?#(jqzD6SL} !%{uHw) zeRk>OS wZpzk&p)df#b18;lq4I zSIGJPq!9*#P7??jCS;j{ %-L1WX*H>g)#aSZEg# zJkPkful9322ckCu#84bUg7TzGzA*%cP-M&m57Pn9l`v3sl5CVut$3m+6_oV{F@_+d zNYMl-`I=Vq3zJai >CkXf zN`J!leo-4C6Z`tS$BwHTHMFTNh$%ybMLceU0eO+?{dzNSvP15p%OWKs3=RWD^v^#4 zERe+4NFp87RYi_ymaAI*0+~pNJ_hRI0XCRW$J>!pw3w>fARRf4-@!XiwK5gYC2?3{ z;@pWul0~m|oOfx25WsdfJ o;76acY)%gZT64VQc47#Suzf~tvvhG1w%=WpG!mXh^ZxNI57 zWqq|_L|Tqg5^V6&p^&9p$m0Mqpvou#NR?3Zwz>SJjU;HGGX4Z2Wv- `m0Pd50otfDTGs#) z9eNXwU~CpB_os5G01d+Ai(PCopwc9TZBAkv3G4q^D?q#INYE&(faTQ^6e+7XEpM>; zJA@c#oWGy0wkd>wb;A4Q plCT$XssseK@#SKAs?=;-TU4Gbgy2EQgXh zo{_JGwALbF$Z(u}6=uy0x2GhH2?`ke{g;b}{5BqDl1qieF9Y2BMoGan@4#aJU5IUr zGZtcK;5KX!UaN%I7lJs^c7-G_-@q@R351q)krdzxQb-6Th$8$|EQLJDrh&rR2_S`} zbUl4njA87%>b-sEV=5b1xclc@?}sNlBL+2@Ww|9KMOgsGtYFxItstRPTx&=blACav zIioPUxvgL6ZyAxyg@!qSLlZ l23xC42Tae#S5{XPg3hARv3|*TO=-PY6h%*-}%X%osgKhHyCbe}i2(ki !T0eiy)@xau5=ty8I_mI|J{xo5jIm+}Fy5O++H-qwyYK!) 05df6rFeDYiKc<+$HG_6iUIbyL!0}S_2S#MPaMRk6>I#jR?sKu8 zOHByHer=|TTI;6q9tY})kV$AZZ+wdK2^5`2F_|-4x5s+k5A^W7ZYMS`-$jKdej)zI z%b!UF1gu_ EkF2PoU8*PRn%L_7msOsx%z+^&KWutXo^YrvfY2xF5Rbm%J uLalPTWE zbqrcsTR7AM;!|~Exll}N UD; zS^@^^gm|MnWI#o!*;!#5feWvG>}SAhI-f^>9qi!jUwd4}df%wKbqZSH^^D#fviK2( z nuvbst(v Q9ul|xuXDa@PV_uK2Vm{q`jYiJoCkm2YCC)H z#!@;>O-qo6i|zQHzE*Va=~Yzz^?II`?C?Df&U||}B={Qn^?f$x-Tw_^hg#YkQg~^I zzWF-${4Hg9c=0_j!=Er_non1!QPozN4@*=f0GvTGe_tDrCh{j0Hx2sbev!8>iS18_ z72*pen5c&kAyH!n#n$6+ pcX8>3-nO7H0XaW>eYGM?@9`YNh9@Q5D1^p7< zszl3S$j-5?vdYfF -!oKDfjn t^NI#TvM-qzils=Z&RQV_E}&rSKHBN-X#|{)>4<&u8ny=l;BBTCe>qBfQ)p z*I+I!y EkTq8u$An@cP}9 cJAz%bTjlgyRj5VMv2UAJOi5NYH^Rv-xmo_W> z<%9%x%9#qLw#*b6`mE0Tkl0N`sUiOFz{wY!zpVTp>R%3yD(O{=1B2!mC
OXKd;Tt${ydzoyzu4b{zmy#QdSBH zQyrSq_R!;^k^%vcIe1V|QDtOg3cdFS;8jywd2jbm$Vxr}$dh33JOWP15Ec5G-spim zS%xCCZG|@!&74<^iL6zUqal(h;f(}1%GQbWUxAJ>PVwut69btR=bg+2CmU9t?QCXR z1PK(h8_d7YuRL=``*tUk4lJ>T$BqN(eSe0(Ui9j}GjDj`o|_x(e0Q5`UEucg5emlx zlwDN5j?8)wCY*MZ)O0>xk9&PCN^|9=qm+}`^i8mHaYFwsh%~fx-Qm-Jo<;;u_IyXi z^0yq#6gI#+wLxksYRk?>8Xh1A)@9RF7hngs#f=1jN!>|jAj7pLmnarOW6iXGzUFSe z?2m?$-;$ctPtzLv%YG1!Ia)a_ElffVl1PNbZIkpD{gY2*qCpUvXC(I{n3S#nj1#BV zNF*Udn$tHBr?WYh7)q5v&v}e#mx2EI=*M3EEvNPx3dRg&e&^+Bch-sc&11)&W_7CR z@Y;GBPYCI??fkyeVJ~SMwDVnTzUe$a03P)2ZND+|-FoEz64ns}*4iDz-+ZB@>bbJY z)Z1!3%j|vii|G(c^Lq-(Xy^IqpC{)1x7BK=y5%M9kpqW{CM^@|@^qE1)cBpTc$1Zr zer!X!sg;o)j+*iuW!-yI919bTKZdU$bfWsq<5p0zkeu0Bv^Z-nARVXkHAyRoz$^&m z1alkT9_Iu5$2gQ2`DjOkMY5^&Vy?2ZriUUqV@LzRl!9ouzO|*Iz1*O!(ai3*6kyvP z$+#7-=PUY~d{*}{xDm}~FGw`Cn$M|=N#ia%*XM3_cC*^khLHs8o((e%?172fdr!hH zb0W(3WhHmS$B2&_X>deB(4nCT3wIOi{A?$b!l-YrYmeWTgeawNYGgh#SNbnlDllka z^SCH_)%*9C7C#eL_>D~(g`Y6EuQY0D*0j`{e~*`AfrJ&kA3?BSI1);Rz`?NF5OLmj zKphJQ9tnZr=isO|deu~fjZm4xws)PUn?+YwOM`>6S6nA_)&Nh|I2$`n8BMLQ5|)_C zCb}3|$BoYsvYd d+tJirHc+RI08So;Hpb!q>$5bO{Xkv}hiuP-?o|n0! z 8KuEUqg7Q@SY1kAFy(0Y2#aXC9N_ z21E1&N&lnR)EM-hry^9Tl2JEts49+=*Ns4@1b_@4dJ79()F|>?BIFu(!9>fnuH!#a zyZ23*R9)Z6lhF}}>!77h!4;ug6b|sQ#|6-fU%uh|EpWXEG^lkXvI}cL4+~bb_nIDW zEW*vQiV!Z_{C#Xj7 4WSV_U}LWZ~3AkP=j>An=o-SqzRR8MJ1SG*)~_#WYArby!hk@ZCu6TrS)3 zbYbEx%$!-qk27hghsvs=f?@+gaCRn2@Ka&56-m~cj#DG{&zDp@k7wP?C;#wj>(E0m zU&HZ+h0vT%Vj4u0*kiJQVOX$Jm**>kXXuFAZerU!I2gA_c-)eouFPq`G71Z!iFN|Y z8%#X>y3By2Y{}Rb)~r_3ZBGQieu-jKvH;e~PkA9pAl}&26%uq%ID1G(jArdI (D>9bH3dT7wwzQB_3QAzV{%O>;3|x_0FR`Y9k(I5{~m=u%r;=sp2mz*Uf|r0|Uxf zFHJA-u}{m&Y^lkrCUrn2Y0DD{WYQ=&@M(^FR*{UmaYanXR+>9Inr;=cXk#UENe? 7$A59pR`03)SU&)XE{<#qSBRR#<4Ed>3OoI-L7PMK)aD8^tTooe)4 z<%MSSxG8WoAzUBNc-PyiI`e)yfDPC9gX!sut09Fi&))6BL4EJ5J=8ykKqHbcS@ZC* zFnd6m-{WGLkS(+QH)l&IGhPK6kkkl4pNEeSDd?AIy8(0ZTPd{SgSf@`WE|TQjQ0_Y zeSmqlK}LMK8GXgt*8pUJj*@p92#2sB8Wggrf$ed;&RK}7|2PwI02O7r1@ ac8r7?h`^=H@D@P!586M7-17hlhXo;jlA1h6mJy| zv}5*MSNmuFd+QOCWNh_=3KKSikma*PtYfT?JPZZw$|%_e=6I7LJoFHy#e+7&H0dQf z_1F1<0VJR9LBidAVwEef%Ra{vnt4CFX}A}D%&jeE&v Dv+wj10{xYY`LUB+PHm9exT=nkTBH^vhoSpB~mUbyD%M4F&IHFz% z7Be7t&klU4|6NCOdC}S-;B6MJQ z;{;^{;T-gmW+j4_HM+mXY8GwZC&VPHF=`YDY6Hq&-vK65bJI)Xw^qvapAg0jCG%*G zb}_Ji8C=M?$h;RT_$HkAdqf1!r)Z&}cmJzAQYK+L#;#3-2w*tqEZU65L$TYI WnfDq+GMUOikOWu-;O-za|_5D#ULnuuOw6%k3iB#O!u?4>yPk< z dXmw{ar;z55tta-8-Bw?!CXXQZ^~PqBDj-_f}-vd{Yw24XAO zXOHd(dvukXQ2HeV+3D65n*6o4h1rPllExY;*fE`S55sH}lEJ5sVGGV+#%Gr3N{)e4 zN9ll&8CgN1`9(6KLlTJ3Bp|u6+JE~sF6i11?lR$CE{7Cjwz}L-cT=w9bREu{+csAU z@$VuUxU}ci^QC>#m}tk;n2*3ji}`6xVQkpu)T+!w^(llqZZa*)OSKt@AjJb)cI|E6 zKHn$a;CsJocTrGEa@HNbo(J8QRc8dZ- L#uZd{L5aFT3DAyF#+X@g~kfqozVm(T9b{e$2$>fm8 zv7d#enCBoQY)Y0vA)iEMoxOhJjOpgM@b=nxn!RqXFLnjRL)dS|*izVIX=KKiw-3&$ zs8na_Ja&)5=U^gb%!mt7gBl@bBB(UbK$^m%+yrKc6nzp2JQxQ 5p6mTOVHX?q 3_oVQa|eaV>;O>r+xy(WaP1cS9D-fkaxAR8g=F?`<$$v?>WVIlpDG{r(+ z*bB(wfP yRC$@6tK?7t^i z724Mc%GIPD*SUNh{Z8=h`Th}aL*qk7aDn?d1(DNq21eRHYGnOT5EKv+?-kJokJf)x z|21SR7&%;#L73!1Nn*v0w9pxVkE4uEoczm1Oex_>niI)E`SZO=HY`*KeGi6m4G2Sq z5)*tJ{D}gge%%=aL~9=BeVpMNg*x){zF+OZXHgX%vPHMe>wY`p$@h}p`dL(M@$XKG z{r8BJkOL4B^)yMMMxlH)%QBOiLAiwidkk)IAzZHK{y*D|R@LU>B=HxVA$F=Wy 1^qec-7gG bu*>qGGW4MU$z>Z|Nbplu1LXWJe zC^-$a{zfeJ!cNn997hyENS6bx_Y3RD=sK=>7jw(qvAbnfpYmE{`Zcd>SMWUF6SzC= z&(8-b*=zHj2rGU=4JLGX$0;!BVb+uwp;4-;NYk*X2baeffUrExv@3H8svnRuRG+%G-%+u7M}fN49KLV?5Zz~bF>bMnO%6Pi{DJy3|bd~?`baSzg` z#-4$OJaB0+po7VHW6FUfEqEzx$L%O{EO37 ~= zPh(1bSj?V32do*d)g}@AiFT&7bG$jPY9?VT&9fS!M2Rl_OQNXQVEsX)wF(W*3FfT4 z9Q)(qIUC#1}9SDyERX-|6WcS}ayd|d3kT4mV@$HCi;VTJp%0o^+6wF=5Dvpe-q zeh(UiagbCx2{ZJ;6KnvCyU1eZX oo;-mY+&E#++Mj>4DUvv|alm7bAlK zhJhQSaf!Gs8|xd&pYiYZ;G S}uGZ%v~u5b#FQnh)H2`OJiDaZv3XvDBV z`#S uRV<&r6ep37G^Vjr{{x|PfZDost!zdd80}hyi11v9o z-sM|TPrU!R3{c__p)<2D1i~;xBtzewP1z}kXbd+>q&X{@2&iPo+R0ZHq)oM77)L6D z{TVLi^4xuy&}0fhI)REtgQr+gL18}MY$pnZQ_@|m6dB7b+?)Xw*{BZ8jGK$%RO|dK zv#kk^>PH@h&4)%FC3aMaGV2*45b00~fq$NEyY4hl?z+Rr^FwDbeg6FL)5tV?i}Mld zdeLUx>1%GNN5yI9LJxPLjKD*XK}ChFl}3R*9&1 #hZ8X8&Vve_&zn?z`_O z Q7_NkzYhnUux#WQH`=jMnTTx1q2!{ zM6H!TK`T2nN*3bue1z)Iyn&f*k@#f}BTgQz4-(NNViY{^W(`yl>to>JG95u`75e90 zk<#nV&{lq8uL(R>*5&H#uXH21=l*Y|n7prRL!19HOf7>?-OZhhofkJRv%mA+y$oL8 zsI-DXSA#Vkh?A&Oc#S;zFga9a5d)JuYFm*b018&isbj#L_ZhXa3#ozSE=HThbgfn( zb%pm9z2pW5kcbjeS((t0wTg#K7Xu^TxE)|O1{7C&u>y`0(|&@f0-$($Nra|BQxO>D zIe|Qn@CujP-hD7NT+0nU7T&H2I&K3l?Evjivi;~T-3O4Z!Qk4{cySx!%by!!^ 0hv!d6;eji!dWe;~ZmJ-Ax_MaN8At#@2M?35 za~Pd}1j0Xt4>Dw2;4wGe6;=KP6Si<6JsniJEYb?A$>V5QIJhX>k!uScD2KXa?00z3 zEY6||>hqnq61lD>tHtk_Ez$bdebC9t#AK-Wzs@mqc@TOneJ(}_g64F>5{1awx{E36 zd9x_wNTby}7OqAQ{((C9pP@HrqwX PnvhW9bX0i&)>*@S|)zDUL-_XmK7kMit#U zoclEF>(ZhU-W~-8&IO* s`AxCqEBzJ+HU-%m3uMob`U>$#VuS zFL}ER&(7bfBP}a0q@>(|8%X@2rH+HSLqEzf!`PgR>E^se3O)@6B;=7}LpWcg*sJ)m z< |08U!d zs3hVWSV_K7D{Zz4RwYKxX^v!UCSc+|LlBVKuOfQVz4hvJhw|BfiS~BAaJQ*NBwqCA z_pG$^uC6ad=;YV9s(Lg4%| 2zPsT6^yc-@NUE-sG@qb~H0gl9z=K2b>l91%ys~4|p_}+FrB~vj%S1b5TR?W9joD z$1Z|L3tAiB_tns8lUsc))oMrHZTS^1!t{Bv`Uw&{C&<`{%iEv+&F4kA=aqM6xCh!x z7-k#ZYYXu!5bSO!LX<;|m3bl@56Dm1Kmam Dxd*r8%IH-w}ch0Z-(UO&{i8Drz{M}Du=+t z+z8|3bx{tCDB0aC>>bC45W4I92s*D?Yqk%Xf 7_^iZGg>#PNthT=2=nBd3$8YDzu#=_9>BYbB?_ z&$kCIF76hdPHx?)6F?Y-iuNF5CDQr|b;0qN>kp-LMrI&DQ=t!jMU#F%R#sjO1>MR> zNFHhSmfDwDsHBTz-g+oe$ie~gpc`P^Db44i@p%=Z&&NIyf#J46x|SjN$!-Qcktim0 zBsm}(u0UjC6iKZKW1wHtye?R1SBH-5CAvWw&00NZ qR992t<8EG8)l^lVZ!pb>?)_}^({Xv2 zkdP8sTwFYEeE+fY^)@zlIHr#7ifC?$k;Zh1Kb=#46(+VCv}DMcD1?Y-nw44Z)8) zBs>HY&&~TYUV!!2wzZ wygI1b$C6O^$h9_c-NcFpM}Rq5m67=nfSf{m@ogL zHPOJo&IrVsnh7|#S9TfyytYHEdY+5zXt-%}els4upV!Q?97cHEe$Ga)eVpp7sB?b& z4=|QO)=NxAt8`i~hmImuTUe%PV@B_8+3*mDi&1mxq=uy2^YKPEtZx0v%(km7i4HL4 z)cH$&>wrhY(=UyQbd~hlQTXqy@!f5`pp2%vRkt-JPV $U^~6GOChdA z^6LEA+h0p5{C{qS`0{}7H%;)rZeEOcTt8nh2nCD8L3|ie|JkF4?fSRndVi D;h-c4vb@U*)Qua&t>cGp!@U3Iat>$Y7Vhg6_S*N{pM5K7&yX{!K% zCKt*l0M%6k-T^Ac8W|lNcoMy%B z5GKz*&KrH43IPFAG0G@{kLZR6AVwU(;^n^Y zk-pwdanrxT*yit!fwj-y^$2@@_ 9y;uTUQDc~uImcqi$6}x`@v0E{ zYHo6B_lyqhid>PIU&ZK(u)<_mjnH L-&fY-M5AE(D0n&VL z3&cFqBtaQ1SLHM=fRdku?Y23$_k-B(>z#b(Ej!chXJmBn=-uJ}G`Ud>;FZ1SycWY2`^!ai8hp3)|ndx6uqp#l0+xS#HPr%vs=x7<~*Jv^x z6s4e2T&40e>#nkTTUVp2%Z!SN^Na}*pa(cRRLU??Lr~^mWFus6^_34U&v$Ncv3Gm* zfC3`1YYSjsns;8(HdNH+z`-pD6Ef~C_6FouqT9N-0v66n;@`+CfFQygN6%*7Wc5-E z2ZYqDaWt*Ocmt@6FyveI6pT?!3aU}5Dxwy+6gH2E-g%Y;gr=&)ABVx}T;7W|YQFcD z3p|hSoD)6Y0^ir$)uG)JzV?^9(H!@a&Ycd+e--@OcN_jS_1pQ+qdA{a>bil8K=p3{ z-LJu^>}MpavRQFjH1t#U4h{uvZB+=ZQw-;Wz}>*v>PL@GFjKZT5$%_|RbcQ%`{>5* zmKeRuwdLkGco*0>XU$?Iv}AuS!w1umby@p)1=c7qur?y~T=6&o9A!hbi#L%2VV~i# zAz%Yw8QaBR{KA28LHF4t&k38k*ojr(6bkg6E6{7Tq*8XJwK+CJAHmu4`ijgPEcG%d z250{&yf*P|!v+RkE)6Nwep*b%jL!1z;b+KY#^R&GN5i^4UUk2f^1q+W`fhG6z>IJA z=zhlVT>|zMN-Rs$clM)dmyw+^M} &+8Jp&?@vZpXs#!apS+@VwxPhnstr)?g?{K-L& za&YO)SsWl`ua_A>zfBbXH|6J+VB;t}1i+j)vHNvi&P4-RHGh1GV)nUglK&95^pit| zMvm<6udH+vhHM*@A;)xIY|F$%!d(GI%7*{EFz8}^a-{5f$3;3~HQs9RI(+M-=Da$f z&-u*e1R)zsNnI4l1UX~#Y 8H*V&ys&GHVVs{l-(gFS z!no<^o#!!ST)XcW5b(<`qiq;rN2P*1OEMl_=J`-<5+O2_lBmowOCe?@8ka4)J6jM= z-sVRD5C|xzW`+&n)27K3x+S(fV2!`$Xo;r-cUeJ`EmLskXB&QBkRVp8UfmMT{;VJ0#fz4({iM4AP1L zm&Z}fh0<6PhpIm8{+Ua~BIaRqFb6})BVD9tIp!n)hdpHKSk!lH^45z#35c$rS$0A? zU0QJAJy#}dgIMhcJ_Ns@maCGPy~16WLPeh@x>2g2Y?mW4h5b9meoAfC&E_8!1nJEp zug<>C7waTRbNo7@)7XsA=Pr;rxOO |{b fYT zmVu`ylo}Kie4Fe?Tlf1~?pIxOEbOKS+{3U=hE_3#m6L_V`n>($VG>{Ui6=eR^B``~ zk-v0MJ2A2Q7g#zCH1;N 6y7|UO2UQ4pCd(3OFY)ZdS>q zp{1=IW70A*HlF9_0fbvefTo1Ly dNmqy!TxOmwD_apWe z{XnEe$o3j4B}eXTOvw1SLp%afJ=`r1pdE5X+M4IAwz&+rrDocVw2~4PGq2}d$I|Vs zo@ijUj)|CI*^zc@uCx$hTlyhT*5KTx!e`45LG&``uMz|(106oCA}nGfDz^X;E--dC zxIRT4jv791pVx@q9aQ|HR)mLP7Y(DG8g~Z=X}Y_CyT%KJvl`S>)R|bOM)2;AQ^-k4 z&n!IZ%phH_PiN+yg&1=2hb3^JYuIEAfLRwOEX%E`$t&bi)RIXh>bqlQp<|;TcebOs z0Yg4PxUa|PVL5V4{lM3ck=WQas3=CrVWt!b)X{T_r1;M94iN|L7B()(zd{{8)m-yw z^@wdoveLXWP*w@jecT9))wFw><7&Dciin9kOneuKv^p{ZOsx$)_hNR;=G47s3P+Q= z#9Rf3gu4Tt3fULf*1~wysD&Ed RW0frQ%P~QJ_4T;w96OlPrY$&K_q$ov?7%|3;M{ENZgzt3heCS- z;5<}8uQQZ383oglaZf1d1Y`3fOqf`HJ0+GJW9VNdhyxbWe2Ig#prV?T*j7Vi-y6;| z8
k~4|n`x5Df{Cl;zTGx?tC)ugq2|ZL&;jV*K zG`3K@uws0ezPX>}W^m)!qeKzW_H^K(V4pW< M&ax{;2pB@XPa9u&eA5Q{JqfmFM>>7!v_B37hnwp_LqCdTbxOB5*9jIayL+031Y zxzFRR1bf$Kaq$642{vQ!d|&{uJJHd-5FgolGoUPNl YeQFo&xXm)pE|HKjG{WjaUe4x4Fg0ev3|Vz)3BH>-8AS=)18 zHAcJrx=~x>=YDj;6Q=hE|7zHZA>Mo|6o$+_4J=K8UIXW_3rzhCBsKu~brDP JMhw*_GJ3K^Lg zIH(&|EED4-orAydqnu_F!-^lWZor;2I#jp@`A1{92GB5mN@ZYx`;JIBcc4L2xl!D$He$C3* z=isaDDEy&-^7(W^!5V^QXmJIcDHk>qGgVI_M0-Z#9Z5Y&)2^Vz39FCR|21TQ97M9& zfv`rFyoMvuN)N)sq7vg|Mi=VDz5If^To7V=>~Ee@T7wY;GJdp990L4j=*B^W?J$_Y zAtD{W)|MR+4eJ#GE`?^q&6&?re{V$Oscf!B%Pao|lxr@4@&QovpKH$EQ=7A2XLHwI zCq`P=BAoUzQ92@e$Q#lRJSpj>xvc8*BRbN?dTit4Odm%XYWKN`sgM%kU@E<-@SW_E z`8KIUAX)pvfQkG=m&=6#A0Q0}9kfw^(DA=|{olsBv&d44&@wOA@L>y5Hr2I!)`7Jj z7kTCP2?MHK!wN5x1ZsgRZ3chlfHY{n##(e3a&o _8v1ir0Wd+uwp-Vy>N;Nk z`o6T~ac*^?!$;6FTQ~?2e$eYv)-%pIOa@5lW#5LI#EJ{6S+cI0;|e57>ziouOex6^ zt{huO7sC|Z4M2t9DIoDZ)MahUb77C^s`G8Vg+dCitFh&C!Q3&YRuTZx&+;i9t3vJM zqwWwt*d Ha-@Xo!=(4WERMC-jLC&N7!OX!nau%8`(ZiQo9CmFjso0g9CYEH z%M-7)(02LG4L8;a11tqLgbG(wEsH^{j3Wo|doN+P^)7Us2e(>XP{%=X33%#07;-;7 zuSvNbHU#Y__~!5$D(< ^8veN;5D~L2PIZbXv-JL-0yyXo%lEmO$ z6h#Q|NTDbKjV%C1(4GfHbqpd{w|7XlQzGnR%jTuhZTW}g5r$N~1mSj_gBi596q4=# zM)1Z%cO9H2PdR&KBKDxz6Bz@@M~
f@XB4Ntz=+poEVblrVCH4rb`#v>VyJR+ z-B63jSX$9rX4`79xsiIkfP@@c3c3%jf>jLTh}9lG_~gK$ppR(_Jy#}&XJ<~p%68D{ zzVoq4%hpm_4^$(TlZHF2p)Q`<_V&x5d!dh(v)2lRm^8l? G znLd!fBG?as`T}!ZL9bVTBzwyBg*!IQHqiY l;T@lmK~cgawg8s`u9KL=MhG^AQou!CN_T)4OD>A zI9>vk(@jx+hPu+W@BlIoBO@eB#g{Khf|q+t&CTy$#bk b(+5rFy|(3TYJp1B z>{k87WX=a0-|G<_gW$OPO@F{wnBEwRT4Oa*Tn0Zn8+kiXK|7bTTx~-ge>EW_>k!-= zD54%X>8$$SRA+%ozjk0fNuxWC`Q9MvVgdeKYBdlO8H9EH+WDhu7ARJ0P|$mQcoAEA zE9=vo&_rbYXt7pIz_ARF1X^H(P?!lEhRD&fk6V@F2 Y&15T^c+0T zM=N~SR(_Z-#J9hJ$Vg?q9m>Z98JHKDm>K;ML!fF~&v+uaVFXSoEE6X3NkA~uN2rBo zcW=KJ&I4+{+3eq9DxAuF(DgiKv `m9W@UaOG@_Fpyhg=?RR5icX(bkQMP7l z*=}bYbY4UYIBFAxxiJj!*qP4)si7@_12~MbfD9H3K^cBg9>iCWjvoUhXxdB7y8_s= zd)k~h6=tI{>Wglf4h;03qA}-kmR%R8J@5QxYOeCjfBB5D`!%V0z4g+_LzkPG8%lG1 z=Xe}LShM9Z1gKxy*xk_KJAkZZcXhEFGem w5;M~Kl)Twn*{vsw*Ld9~NOot#0vJa0 zP6r!HRY^6QFTLSL1hSF0@yN3SavBaSJD&9q^JK<(@|i3 F(K` 1$y*}LNJ20@c9cM~f@Pn0SfC7<#hA%`3sT+Ch$C?978JjcsNbvS3)IV>Wo#tW z3#OpN>NYe?%=Rv9kG1spnIGKlJkwU8;qOL)?});wrXAje0BK*7A>BR5d6{{6*^%W` zR+!sbX*OBUVqSf1>TSP-Z!a{Jr?Z{lQi~c$eFgs9HuBk@Sk?AE7-Plpn(3DZw+*1c zrH3{P3_3}7gu{Al*)zWVX@IEextx#69sbD|YyCWspJUw$9N`TW6922eO3}+bFHshT z3c%qDH#bm%3F}B-dL)TaEsmtUn2)e%Sx*vQ;>SC6R%lO%g*DHt5LjQLP?CzCl&o1! zB5KhYntqpNS*iPT2ZM{X@2;tE*!@qnh*m3~AkDTqodk;Cl~JGj=Y(0V`<)u (&CVSkc$aPv_H#Y N@pq z%biW#4ZqF3wcPHb!R_Tl&_52X52rGH%klmA+D`}o5UHM@r|x#V$3f(DUG2S{fTvuz zVdOup2}?geSHGLmFjqfGz(W|xYsVlz^N$G%yl1;|TOID3BNga5>+%f0cC$@rt{a}U zCRo+mXh 8;#bpCSG2-XPBc&Dy{8KIm46w zE_!jqiuiB=!GZXB&C4`>N9}Xj4d0dT8&t);Re$G)=C)q8o {%B7 zI8}&_f{%^8<`-q8u1cmXPNtfGAQ36S$ue=PSkIdkHN_6E1)x}+GWAT>O%X_zhw|`O zo=C_h)%4Mp;tOOc8m9vb>60>)MGL15SH;?N)VmpD|C)F1VrCx $rQdT0Fk4^uUpdbOJ~>SP z`uywajiUw=hVJi1pjCu%s_(d1>4D+L>04)0edkUi<4P-Mq&WF#VtO3w1W)q;WNn#z z*?k`c )(moAD>+!y4 z0N?^4kB}~S6yspg8HPpmapuUU91`7h3cRcZ!5EzaDvq+^c1L?>KHGM1MuR)0$IwZm z9na4h8(4BT_$y!Q)2E-y9=d&ijb^RpkfLv zp%*82h~Nei@ 2_b2+ZjnMy)eP-;dYofxz zTfnZulv!9sm0Lixz|uI*fYIVJs zrfqPc0)oQZctcIhW$_=NT`}Cq3|f< z_a34;USX>L3 wBwyWF>veUia*_`!lG;|^)R@$*>rBY0DB(E%|-&PPL;+lCqh1WYh4g9S|- zF@pgq!IWp?3A*Cx5&bDR0Oe^SMOcS!+eOgf@z&NXTo-9*Eg*^TOqvPPtDsjHMTqZd z5}6qmB_=}vbUdto70nooL(4Cwk}VnYIPGk}%gjZ8`Yx5Zi1!nsP<0E;bPMi6V~+#i z*B2&ne~B$^#co`LQW-7*S0or>Ax?A-KkCmzFekAb^Cu;{gqs=(nruD rG9iuf_k+p!&Vyu#=xp|FeGo{-a*zsC(K}R4X0A;4ojuFw zWr@SDs #lYKdYNUYe*Ku9#2w>+% zgUYDI1>t8Kfrw#*(&>C$q^FG6*z$C&G bD}P~e8x9z!O<<4~9uG-vGN z=UVhH08EiK>wv9)RbZe2oPYBt?DZ^-_6;_GHE4j;u^%~I3C#t`a
^kzUw>u(23Nq2k;0 z4?fMFicc2{ABZ) }q2UO^j-M4sc)ywnoaCx$WivtL z5m00~Urw@?0{^ tlh1rAe}V#Y!S$^a*$ rm&hOMZNN7-Y6X=rF@S~z$Q>nCUVNsg95!)(DqbR3y9= U&Z00?!+Q1ZdoOH?ql;SFTq8eg&5F zxi)qJCL`gv0biqKI|(>)@he87L|QT<>vCHr_o3!gd!U1af4`Ds6G6lZ39X}eF#*y^ zMSEgH>N&XiQ+K3yELH%Zv@D7>4v)1rbVoLv#bg8v&JYPDC W|D}4a|M)ebQ1hZ$GdY(5R6$$~8jZ7~j`%V20 zyW&PnW{%p?L +C1G4= zae7Y_3lgx5d@-d`DS|yP3jqZxW*l{b% KX>NGRC^Gxas3q{>@V02g5np&T1XV@h#&LqrN8vYCeY?6FhON@vN9 zy0VKD^uW>mvGv>Z#@v@hkIlmAe0%wbKQg!{3_)-0aKwR-*$fTcLBWrJRJBEs;lMz{ z3 bLg2 z=@H~15fSzBmSAucjgv4@q}})cxgP+;7#|9 4?AK zy@4CECyTvdCrE2yxsPT#r4_R9)E$syDBM~@{=xvxUkf74*%*Xs3xQ$A+3xWj=?BnS zm7`aNg9B~giT}d0=*U%w1Bg)8Pq6;Rq>VFb)t2)YEvUO!t`;ZM+mgl_p((eKNM>n+ zioD8JVAPq=pK<4p@}>_2O9TWUY)2ZjM{%WXK?IB;uxsX?V%Gmq+W!k2J(`SuxCZO> zkLBb4_OC?wd4>S^2RUOCPqD`O10hiUK^gqR%&{@BwJ ?C%t^ch5 z!v(QXn6e%G2RnnB8V8Z6NFlg|kmgvWY^#EbIVPcvw7IeEk8rSS#Z|z)JT=M1l$+Bs z2R!Od9Q_ML(N*4m1FP3~Nr52RJlXE`y; Ql5L}uF}J5ba}JW}^=B!LFx$<5eCn(Csu(f7m5M&u~ff>S!od)P3{XLEZ8 zvV(4*mF(rdNsRlXjoZAUu_&Y`5aFU!(#vrxVFKRK?;NQo_;R=UWkQ8;W5cYm)@6VU zZ&BUu&o-ol($|ku5$t@UR@F=1bP#KxMR}6PfwTup4lUmL`ay0^H}3*oxHkrCJB;uD z0v7%A G?pY72Qj}h1{g0h`v2u@&@-T z7AshIW)6;z=c}8|%|iiVCP0Opd1VVtoX*hk2!kuLTh9< =%y7UR=o8Ilvx~~6kJ&wg4c$f5{GNhT2qHk zL0PmK%{w8-TCKUF{oqOhL+)! c4foXlHQbA{}63BphT^ z&C=x*We<8_ojdRoW^h$?VAEQs?}@O~j_avL4*}N8QILtIeTC(lgQ-I2VejfdUL(0= zEx|HTfW}=|*KRzi*JoI&I>BB2qPK5jA~o%yCVtFPOlL>Q$j5wucL0Mo ;L0ZLpLsi?v(Z24 zcWeHr)zkR0 0PQ(2S9GcVxuGU(q-HFGAjn_3=9Q`m81i{8K5O!iEUMa(IkhPASO)qn1Ue8bT5jNIkI{SC;2geDo{1nt&N|I->E-v|0^k9 zVHOZj+gQxlWYi~n-Z #A~Y0OYb&@parki~!qSm&%5aW>5tV! &4*I04-IV^b?$!xxhC<-OMf4Jv2?s4FvtE~Rn+Jw!PI~@JtGsAc=X8)C~ z(YI8PEfXxO`#CMG 82mTfhAkr2LbY4`4y>$fCdVf9d1{T0lr11Igj1xIw5-`>MNN zNJ7Z=jD gQyr)&7zL-2AE6!0Q>sN zm`e&4F-az*1mDx0tg-u7Sf9um$O`>#R~c?WLr(zO?UADe5$O!yQgA>trQN(hUq~*c z^kLA50a~~o@LJv`-!g+O!F`ALm$|gL_WzgG1@cpztt|}ylhx%sB4hc_`ad=KU#u>` zA8Tr-suk_4|Ktn(2l42ixBtO?IUCqIJN?x6|ETT@gEE$jKkNT|Nhd+h4oLuG^u{~# zMU_+)K}v~`$2x7q77F_M*Efev>UM#3Czp_EsUeF@WJCd^D3Sz=MKrn+yskLBO|{MA zR6BL{J1S28kDL9>M{m;U3-?WNq6B>=tH`fc-8}~|R@VU$Sg%!dks$d!84wrA4HyM} zI`+Y7;@4j!N|0gtqXMiXzo{xrelzRi>XHIXE-Fc-R+`GFL2-;1FS*%fdde_4#^1V557udbYdvhyG<0#zf#9@*B6!dxYX5z20}qV;Cljl?hyRz @q+HdQ~!s((OP|D=tnouiF`v$Kigf2WPx zPx86{djj?-D#-n83VnC$+R0l*hT#1%fWyTFlYhMZg;KBPLl QFUd$%-gs;#k_FO3QQ96dA}dV{ zN`0XQ-yQ?nqmY)_O#9pzBSNsATIWRpRP2pe5x^>m2)D`~=Pv<%oh2IL^&NyO1b{0P z03h*5%sNQHDSGQ8R!CA`LdiZ0U<}$!(LHXkRH2!c@`KC2bTSt7m0G>yjC`VwOl7{y z81kk^7erJ!bdt{PePDa@b?3_ub$}ouVm|vS9U)aX(F#|MRF@Q5RQ?rWS)2F>yHbID zrr1%Z!dAAFE(ehrP1xN_p2kv^f|Kklx(o_Mi#_}R9;Lh&9Hcz_VE?f{>wiIlW|&rQ ztU7_qNhFktGxN0VzmT&N6<|{CC(=_)JiYfZ`kphrtgJp7>g=I$L5{3{E)_c7dZ$#| zjB3K8k;VmaEMtxUEiE_%vf^GE$ee4LuWQ;Yoc{VV#Z~G`^A%PwvjB5q&EP`THH$Mq z)f{UASW~U)=F-6+xA}PV^}ooI|0s?9rNivo50Oj@8UO(Gzk+V=>}*eK`%mPpEj&&B zJM#a?j_bcienxfEc2g9=XH_j4keI|KrSXG8g?@`U90;R!pJH4{McK;1#8!&-_qK_( z+P)PZL0&rD#Pp8v2>S526dp`c7n7OkZ0^wSy*&W3rSp+JGj*#SlqWe-Gf=hLx4&|> zhwOY{8da!O!+z7@nuCq1@(?|>Yq<0p{pZ-~Rh})ZoHql2{iIz16X&GtB(Q>ktSvvI zVd)11Z{WjvzeCiabdT)m&z@3awAC+JlrrV44>IDl%ixSB?PS2R@cIi=H-yg^KJQK; z)GA7rZB)|1o{)C1NRM2|@p*lNNhTbvwbPyHmB^Vm#&M|p)df4nIyg>h6t%_JiH(QE zTz3Pa4$!PN=n0{HKRy^`LM2!u5m0WYFk*XUUtmxFh^AFkK@hA*!sBMv4hNQr`BcWg zp}q570#{{jvsXGojCBRn*c6TMjmQ)kmvdaS;09u==+K)uN5b2>7F~0L+m3>fCx3$N z=;SKIm(9fNCkz3Y)XX4cW`Bp-u1+TliDzZwnF~VGi!)wgsIiz?DtOB8wqIeRP49`m ztFb4@PpL^H_Ku0t=Lsdj$`7P{?uLdn@kL*V2l+SgN@CPr9L!GACL%h|@buTI^t_TE zBT+i&sH?2GU99mQ3F_r1>mA%_D!j8^?MT$(%n!TikKsJw&0p~paNTZuPjyad7Y^<0 zTST{!pD~`{P*xv+sct2^1Tff6^(i9P>B%G^h|m~Di#4Af%~1#=9OgiHUcnT+x+pQA z&X_T!=f0AtTG$qGmC{Tk_`X_;*{Bj4Q8;;?Y1UNQvH#A0+FCYyd{4BDPm>ciXf3NtlA@L~Z3G)gp?6Ea z?zk%E^3-|1Rx7&Vp$88^mNnigN4Sw2^)Wg5z& E7^0)(f=3ZOz zgeyzvM3G9GC0_{)5Bl2&wqA7SCTqZ7wr4@qgeMx>tx?Z1<`$LSygJ%tO7_B5@VVO( zZ^4)(u`(+*@W&38Ddrom>JJN4G~fP{`NgT{Dxuqq)XseE;oc;|3Ag|tP7L1N3cNWH zn{*>=I1h;7j(C!1&(r=Z1@;L4)U8KT=K)k-;pruJiaO;Yv5@gcFlH{X!)p3aS @%mMSHg>YF@m48~v3LR)|5_+I348$s4BM%;$+Ow@=XP)@abn z>?|oqAG^;Nlvt!%V3$YzQbsnE(w)JUHgUMlJ>kP`)j)%bNNfI(`+?=wWQz9+Vrx_} zi{IS{m`(oi0$P2{K2xpc#^u3KG)EJ6SfdzthuxG?l} zqwhyY;QmWTj126ZT^#>MKt=~-EXRM=|JiZGsP5Zli6eaHm8B;Y0#!s6 ~PmwkypPBY?L(++q*l4PUPx6iC z*KPgbm$f5nuAX)*pLFf062_oev~h4llfF-pm{lHmr8Z{<`n{tMx@WZ}wQJpbICNfb zz8{~I_9W=wu-QSPL@s3744$H?DbYoMKBEZ4WiSUG@?xNvGt#?$EpjVrQe-vZ+yFfd zG@St=GJWwNXU8a^?t(` I!=z3WPaY_g;Lz)W@qt<}Ra$Gk}S znyYY9Xw+&UR!Kw!O?BA&`#ue@WRrQCJ~(qQ)@|CT9aq4ieR;8RBk*V3fz^}kY_?J_ zEHdd#fwsFjx#mdi4T2s-W C#>qn+aN