From 5f9ef626f1f1ee06949dcb56a7f5208ebd7a1bf6 Mon Sep 17 00:00:00 2001 From: Egor Deev Date: Mon, 5 Oct 2026 23:24:29 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B,=20CI,=20=D0=BF?= =?UTF-8?q?=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BD?= =?UTF-8?q?=D0=B0=20PyPI=20=D0=B8=20Docker=20=D0=BF=D0=BE=20=D1=82=D0=B5?= =?UTF-8?q?=D0=B3=D1=83,=20=D0=BB=D0=B8=D1=86=D0=B5=D0=BD=D0=B7=D0=B8?= =?UTF-8?q?=D1=8F=20MIT,=20README=20=D0=BD=D0=B0=20=D1=80=D1=83=D1=81?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D0=BC=20=D0=B8=20=D0=B0=D0=BD=D0=B3=D0=BB?= =?UTF-8?q?=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Тесты проверяют номер страницы, шрифт заголовков, списки, структурные заголовки, таблицы, CLI, защиту от zip-бомбы и разбор архива. По тегу v* пакет md2gost уходит на PyPI, образ бота — в GHCR и dcr.deev.su. В requirements.txt убраны неиспользуемые aiohttp, aiofiles, certifi. --- .env.example | 2 + .github/workflows/ci.yml | 27 ++++ .github/workflows/release.yml | 61 ++++++++++ .gitignore | 7 ++ Dockerfile | 15 +++ LICENSE | 21 ++++ README.en.md | 92 ++++++++++++++ README.md | 223 ++++++++++++---------------------- compose.yaml | 6 + docs/demo.png | Bin 0 -> 100615 bytes requirements-dev.txt | 4 + requirements.txt | 7 +- tests/conftest.py | 4 + tests/test_bot_helpers.py | 41 +++++++ tests/test_md2gost.py | 105 ++++++++++++++++ 15 files changed, 467 insertions(+), 148 deletions(-) create mode 100644 .env.example create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.en.md create mode 100644 compose.yaml create mode 100644 docs/demo.png create mode 100644 requirements-dev.txt create mode 100644 tests/conftest.py create mode 100644 tests/test_bot_helpers.py create mode 100644 tests/test_md2gost.py diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..7fcca50 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +# Токен бота от @BotFather +BOT_TOKEN=123456:your-token diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0f42965 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.9", "3.12", "3.13"] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - run: pip install pytest==8.4.2 ruff==0.14.0 build python-docx + - run: ruff check --select E9,F,B . + - name: Тесты пакета md2gost + run: pytest -q tests/test_md2gost.py + - name: Тесты бота + if: matrix.python-version != '3.9' + run: pip install -r requirements.txt && pytest -q tests/test_bot_helpers.py + - name: Сборка пакета + run: python -m build && pip install dist/*.whl && md2gost --version diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..81ded37 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,61 @@ +name: Release + +on: + push: + tags: ["v*"] + +jobs: + pypi: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - run: pip install build + - run: python -m build + - name: Публикация md2gost на PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_API_TOKEN }} + - name: Пакет в релиз GitHub + env: + GH_TOKEN: ${{ github.token }} + run: gh release upload "$GITHUB_REF_NAME" dist/* --clobber || true + + image: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v4 + - uses: docker/setup-buildx-action@v3 + - uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - uses: docker/login-action@v3 + with: + registry: dcr.deev.su + username: ${{ secrets.ZOT_USERNAME }} + password: ${{ secrets.ZOT_PASSWORD }} + - id: meta + uses: docker/metadata-action@v5 + with: + images: | + ghcr.io/edeev/my_converterbot + dcr.deev.su/edeev/my_converterbot + tags: | + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=raw,value=latest + - uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f35938 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.env +__pycache__/ +*.pyc +.pytest_cache/ +dist/ +build/ +*.egg-info/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e981e8a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.12-slim + +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 + +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY bot.py rep_to_txt.py ./ +COPY md2gost/ md2gost/ +RUN useradd --create-home --uid 1000 app && chown -R app:app /app +USER app + +CMD ["python", "bot.py"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..36fc243 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Egor Deev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..e58832e --- /dev/null +++ b/README.en.md @@ -0,0 +1,92 @@ +# My Converter Bot · md2gost + +[Русский](https://github.com/EDeev/my_converterbot/blob/main/README.md) · **English** + +[![CI](https://github.com/EDeev/my_converterbot/actions/workflows/ci.yml/badge.svg)](https://github.com/EDeev/my_converterbot/actions/workflows/ci.yml) +[![PyPI](https://img.shields.io/pypi/v/md2gost)](https://pypi.org/project/md2gost/) +[![Python](https://img.shields.io/pypi/pyversions/md2gost)](https://pypi.org/project/md2gost/) +[![License](https://img.shields.io/github/license/EDeev/my_converterbot)](https://github.com/EDeev/my_converterbot/blob/main/LICENSE) + +A Markdown to DOCX converter that follows GOST 7.32-2017 (the Russian standard for research and student +reports), plus a Telegram bot for study routine: send a `.md` and get a report ready to submit, send a +project `.zip` and get a `.txt` with the folder tree and file contents. The converter is installable on its +own as the `md2gost` package on PyPI. The bot speaks Russian. + +**Status:** personal project, maintained · bot [@my_convbot](https://t.me/my_convbot) · +package [md2gost](https://pypi.org/project/md2gost/) + +![Pages of a report built with md2gost](https://raw.githubusercontent.com/EDeev/my_converterbot/main/docs/demo.png) + +**Stack:** Python 3.9+ · python-docx · aiogram 3 · Docker + +## md2gost — Markdown → DOCX per GOST + +```bash +pip install md2gost +md2gost report.md # writes report.docx next to it +md2gost report.md -o out.docx --no-heading-numbers +``` + +What it does to the document: + +- margins: left 30 mm, right 15, top and bottom 20; Times New Roman 14 pt, 1.5 line spacing, 1.25 cm first-line indent, justified text +- page numbers at the bottom center, none on the title page +- section numbering `1.`, `1.1.`, `1.1.1.`; structural elements ("Введение", "Заключение", "Список + литературы" and others) unnumbered, uppercase, centered +- a page break before every second-level section +- bulleted lists with dashes and nesting, numbered lists as `1)` with numbering restarted per list +- tables with a "Таблица N" caption on the top left, code blocks and inline code in a monospace font, + quotes, footnotes `[^1]`, bold and italic + +Command-line options: `--font`, `--size`, `--spacing`, `--no-heading-numbers`, `--no-page-numbers`, +`--number-title-page`. From Python: + +```python +from md2gost import DocumentSettings, MarkdownToDocxConverter + +settings = DocumentSettings() +settings.auto_numbering_headings = True +MarkdownToDocxConverter(settings).convert("report.md", "report.docx") +``` + +The Markdown parser is custom and line-based: nested tables and lists inside tables are not supported. + +## The bot + +| Send | Get | +|---|---| +| `.md` | a GOST-formatted `.docx` (the same md2gost, with heading numbers) | +| project `.zip` | a `.txt`: folder tree and contents of text files with line numbers, handy for an LLM or a report appendix | + +Files up to 20 MB. Archives are checked before extraction: at most 5000 files and 200 MB unpacked. Service +folders (`.git`, `node_modules`, `__pycache__`, `build`…) and binary files are skipped. Conversion runs in +a separate thread, so the bot never freezes on big files. + +```bash +git clone https://github.com/EDeev/my_converterbot.git && cd my_converterbot +cp .env.example .env # BOT_TOKEN from @BotFather +docker compose up -d +``` + +Prebuilt image: `docker pull ghcr.io/edeev/my_converterbot` or `docker pull dcr.deev.su/edeev/my_converterbot`. +Without Docker: `pip install -r requirements.txt`, then `BOT_TOKEN=… python bot.py`. + +`rep_to_txt.py` also works on its own: `python rep_to_txt.py path/to/project`. + +## Development + +```bash +pip install -r requirements-dev.txt +ruff check --select E9,F,B . && pytest +``` + +CI tests the package on Python 3.9, 3.12 and 3.13 and builds it. On `v*` tags the package is published to +PyPI and the bot's Docker image to GitHub Packages and `dcr.deev.su`. + +## License + +MIT — see [LICENSE](https://github.com/EDeev/my_converterbot/blob/main/LICENSE). + +## Author + +**Egor Deev** — [GitHub](https://github.com/EDeev) · [Telegram](https://t.me/DeevEgor) · [egor@deev.space](mailto:egor@deev.space) diff --git a/README.md b/README.md index 1dcdb5b..e2e039c 100644 --- a/README.md +++ b/README.md @@ -1,171 +1,108 @@ -# 📄 My Converter Bot +# My Converter Bot · md2gost -[![Python](https://img.shields.io/badge/Python-3.10+-blue.svg)](https://www.python.org/) -[![aiogram](https://img.shields.io/badge/aiogram-3.x-00ADD8.svg)](https://docs.aiogram.dev/) -[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) +**Русский** · [English](README.en.md) -Телеграм-бот для автоматизированной конвертации документов с поддержкой форматирования по ГОСТ 7.32-2017 и анализа структуры проектов. +[![CI](https://github.com/EDeev/my_converterbot/actions/workflows/ci.yml/badge.svg)](https://github.com/EDeev/my_converterbot/actions/workflows/ci.yml) +[![PyPI](https://img.shields.io/pypi/v/md2gost)](https://pypi.org/project/md2gost/) +[![Python](https://img.shields.io/pypi/pyversions/md2gost)](https://pypi.org/project/md2gost/) +[![License](https://img.shields.io/github/license/EDeev/my_converterbot)](LICENSE) -## 🎯 Функциональные возможности +Конвертер Markdown в DOCX по ГОСТ 7.32-2017 и Telegram-бот для учебной рутины: присылаешь `.md` — +получаешь отчёт, готовый к сдаче, присылаешь `.zip` с проектом — получаешь `.txt` с деревом папок и +содержимым файлов. Конвертер ставится отдельно, пакетом `md2gost` с PyPI. -### Конвертация Markdown → DOCX -- **Полная поддержка ГОСТ 7.32-2017**: автоматическое форматирование научно-технической документации -- **Интеллектуальная обработка синтаксиса**: заголовки, списки, таблицы, блоки кода -- **Автоматическая нумерация**: иерархическая нумерация разделов (1.1.1, 1.1.2) -- **Управление сносками**: интеграция footnotes с автоматическим форматированием -- **Настраиваемая типографика**: Times New Roman 14pt, межстрочный интервал 1.5 +**Статус:** личный проект, поддерживается · бот [@my_convbot](https://t.me/my_convbot) · +пакет [md2gost](https://pypi.org/project/md2gost/) -### Анализ архивов → TXT -- **Древовидная визуализация**: полная структура проекта с UTF-8 оформлением -- **Извлечение содержимого**: автоматический экспорт кода из всех текстовых файлов -- **Интеллектуальная фильтрация**: игнорирование служебных директорий (node_modules, __pycache__) -- **Обработка бинарных файлов**: детектирование и генерация placeholder для медиа +![Страницы отчёта, собранного md2gost](docs/demo.png) -## 🔧 Технологический стек +**Стек:** Python 3.9+ · python-docx · aiogram 3 · Docker -| Компонент | Технология | Назначение | -|-----------|------------|------------| -| **Bot Framework** | aiogram 3.x | Асинхронная обработка Telegram API | -| **Document Processing** | python-docx | Генерация DOCX с программным управлением стилями | -| **Parsing Engine** | re (regex) | Парсинг Markdown синтаксиса | -| **Archive Handling** | zipfile | Распаковка и анализ архивов | -| **Async Runtime** | asyncio | Конкурентная обработка запросов | - -## 📦 Установка и развертывание - -### Системные требования -- Python 3.10 или выше -- pip package manager -- Telegram Bot Token (получить у [@BotFather](https://t.me/botfather)) - -### Процедура установки +## md2gost — Markdown → DOCX по ГОСТ ```bash -# Клонирование репозитория -git clone https://github.com/EDeev/my_converterbot.git -cd my_converterbot - -# Установка зависимостей -pip install -r requirements.txt - -# Конфигурация токена -# Отредактируйте bot.py, установите ваш BOT_TOKEN -# BOT_TOKEN = "your_telegram_bot_token_here" - -# Запуск бота -python bot.py +pip install md2gost +md2gost report.md # рядом появится report.docx +md2gost report.md -o out.docx --no-heading-numbers ``` -## 🚀 Использование +Что делает с документом: -### Базовые команды -- `/start` — инициализация и приветственное сообщение -- `/help` — детальная документация по функциям +- поля: левое 30 мм, правое 15, верхнее и нижнее 20; Times New Roman 14 пт, интервал 1,5, абзацный отступ 1,25 см, выравнивание по ширине +- номера страниц внизу по центру, без номера на титульном листе +- нумерация разделов `1.`, `1.1.`, `1.1.1.`; «Введение», «Заключение», «Список литературы» и другие + структурные элементы — без номера, прописными, по центру +- разрыв страницы перед каждым разделом второго уровня +- маркированные списки с тире и вложенностью, нумерованные — `1)`, своя нумерация у каждого списка +- таблицы с подписью «Таблица N» слева сверху, блоки и вставки кода моноширинным шрифтом, цитаты, + сноски `[^1]`, жирный и курсив -### Рабочий процесс - -#### Markdown → DOCX конвертация -1. Отправьте `.md` файл боту -2. Система автоматически применит ГОСТ форматирование -3. Получите готовый `.docx` документ - -**Пример входного Markdown:** -```markdown -# Введение - -Основной текст с **жирным** и *курсивным* форматированием[^1]. - -## 1. Методология - -- Пункт списка 1 -- Пункт списка 2 - -[^1]: Текст сноски -``` - -#### ZIP → TXT анализ -1. Отправьте `.zip` архив с проектом -2. Бот извлечет и проанализирует структуру -3. Получите `project_structure.txt` с полным содержимым - -## ⚙️ Архитектурные особенности - -### Модульная структура - -``` -my_converterbot/ -├── bot.py # Основной модуль Telegram бота -├── md_to_docx.py # Конвертер Markdown с ГОСТ движком -├── rep_to_txt.py # Анализатор проектных структур -├── requirements.txt # Спецификация зависимостей -└── README.md # Текущая документация -``` - -### DocumentSettings: Параметрическая конфигурация - -Класс `DocumentSettings` обеспечивает гранулярное управление: -- Размеры шрифтов (14pt основной текст, 16pt заголовки первого уровня) -- Отступы документа (левый: 3.0 см для переплета) -- Режимы нумерации (decimal: 1.1.1 или simple: 1) -- Позиционирование номеров страниц - -### Интеллектуальная обработка - -**Алгоритм обработки списков:** -- Распознавание вложенности через отступы -- Автоматическая замена bullet points на длинное тире (ГОСТ) -- Сохранение иерархической структуры - -**Система обработки сносок:** -- Inline маркеры `[^1]` → верхний индекс в тексте -- Автоматическая агрегация определений -- Размещение в конце документа с разделителем - -## 🔒 Ограничения и constraints - -- **Максимальный размер файла**: 20 МБ (Telegram API limitation) -- **Поддерживаемые форматы входных данных**: `.md`, `.zip` -- **Кодировки**: UTF-8, UTF-8-sig, CP1251, Latin1 (fallback цепочка) - -## 📊 Производительность - -- **Обработка Markdown**: ~0.5-2 сек для документов до 50 страниц -- **Анализ ZIP архивов**: ~1-5 сек для проектов до 1000 файлов -- **Конкурентная обработка**: до 10 одновременных запросов - -## 🛠️ Расширение функциональности - -### Кастомизация ГОСТ параметров +Параметры командной строки: `--font`, `--size`, `--spacing`, `--no-heading-numbers`, `--no-page-numbers`, +`--number-title-page`. Из Python: ```python -from md_to_docx import MarkdownToDocxConverter, DocumentSettings +from md2gost import DocumentSettings, MarkdownToDocxConverter settings = DocumentSettings() -settings.font_name = "Times New Roman" -settings.font_size = 14 -settings.line_spacing = 1.5 -settings.margin_left = 3.0 settings.auto_numbering_headings = True -settings.numbering_format = "decimal" - -converter = MarkdownToDocxConverter(settings) -converter.convert("input.md", "output.docx") +MarkdownToDocxConverter(settings).convert("report.md", "report.docx") ``` -## 📄 Лицензия +Разбор Markdown свой и построчный: вложенные таблицы и списки внутри таблиц не поддерживаются. -Этот проект является некоммерческим и распространяется под лицензией MIT. +## Бот -## 👨‍💻 Автор +| Прислать | Получить | +|---|---| +| `.md` | `.docx` по ГОСТ (тот же md2gost с нумерацией заголовков) | +| `.zip` с проектом | `.txt`: дерево папок и содержимое текстовых файлов с номерами строк — удобно отдать в LLM или приложить к отчёту | -**Деев Егор Викторович** - Backend Developer -- GitHub: [@EDeev](https://github.com/EDeev) -- Email: egor@deev.space -- Telegram: [@Egor_Deev](https://t.me/Egor_Deev) +Файлы — до 20 МБ. Архив проверяется до распаковки: не больше 5000 файлов и 200 МБ в распакованном виде. +Служебные папки (`.git`, `node_modules`, `__pycache__`, `build`…) и бинарные файлы пропускаются. +Конвертация идёт в отдельном потоке, поэтому бот не замирает на больших файлах. + +```bash +git clone https://github.com/EDeev/my_converterbot.git && cd my_converterbot +cp .env.example .env # BOT_TOKEN от @BotFather +docker compose up -d +``` + +Готовый образ: `docker pull ghcr.io/edeev/my_converterbot` или `docker pull dcr.deev.su/edeev/my_converterbot`. +Без Docker: `pip install -r requirements.txt`, затем `BOT_TOKEN=… python bot.py`. + +`rep_to_txt.py` работает и сам по себе: `python rep_to_txt.py путь/к/проекту`. + +## Структура + +``` +md2gost/converter.py конвертер: настройки DocumentSettings и MarkdownToDocxConverter +md2gost/cli.py командная строка md2gost +bot.py Telegram-бот +rep_to_txt.py дерево проекта и содержимое файлов в один .txt +tests/ тесты конвертера и бота +``` + +## Разработка + +```bash +pip install -r requirements-dev.txt +ruff check --select E9,F,B . && pytest +``` + +CI проверяет пакет на Python 3.9, 3.12 и 3.13 и собирает его. По тегу `v*` пакет публикуется на PyPI, а +Docker-образ бота — в GitHub Packages и `dcr.deev.su`. + +## Лицензия + +MIT — см. [LICENSE](LICENSE). + +## Автор + +**Деев Егор Викторович** — [GitHub](https://github.com/EDeev) · [Telegram](https://t.me/DeevEgor) · [egor@deev.space](mailto:egor@deev.space) ---
- ⭐ Если проект оказался полезным, поставьте звездочку на GitHub! -

Создано с ❤️ от вашего дорогого - deev.space ©

+ ⭐ Если проект оказался полезным, поставьте звёздочку на GitHub! +

Сделано с ❤️ — deev.space

diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..e1a67f1 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,6 @@ +services: + bot: + build: . + image: ghcr.io/edeev/my_converterbot:latest + env_file: .env + restart: unless-stopped diff --git a/docs/demo.png b/docs/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0ced72ceed32b6de9fd7813de8550dba6a1a90 GIT binary patch literal 100615 zcmeFZX*iW{+cvIW6QPtugqE=~CR2vgLP&;EW{FDXDN}@!jG09UnNvyT3{goF%9MGY zBC`-$`0uOxdG7c5Kij))?}zux^Wk0hki=TobzaAL9Q(2F`*8+psw>g%VBSGNK|!mc ztZ<%!V!Iy&#b$BJfAF0L|J=;M9|x}}pI4)xaOa_*xa~_pv5Ifq9;2Xe7N(&1d6|Mj z>LCRMqy3|@b29jcZKkS93KSdU|2%%36@~9m*(>YaprD}ML;l~UrXDX6zPa5=MNM)0 z&mCJC_ieqg9_o&7(Oof7ccGy8$A|p!`1{}2dq;+`noOk(^5J;RxashY z6#uK<-gPsHb|+NcT;4R(oBN~MKkQ{(Phw0@-BlOAnio$v{_{ier(DtnRi*#(_jR4e zs?7iE@9|V+>6`xj*T-@HeXA7z1Ml^J+~WVg z3;KUyLf$d|Yp=xLH+dKnN=~U1B+k!;PFpDYH-66zeGFrlYii@)r>du?XJBA(?py@j zc|EV_WXIe_Ypom*U9#y+}s((#WA*x4GsPFk|YYBGMA|% z-1pe4DJa%QOs`xqD6;%s>FJR-6Z7D~YmeVw-@ZK+DgWB@PjO*kp=zvPXJ@BC;&bn? zSFc_P7!+IgRT}B&{2r_c-o1Nwx$8`feP4HXca}yn4-e0!GN;4h;@ax!FEX??BZKCq zrlu||EZ|~|jEv~%=~G-4XXc3^eW9$BTT~JI+ zOfZ(OMKdG!rpzT%Q&TKSS($r@ZO_$f*Qf}Ff)WJ6oo(Tfkv}_&tkl)j_4M}lq^768 zH_cC>kIMz$1k2c-Nc zy!Nr5xYb_f{OsPnn%kQ;?>rzWeB}d;v-6@#6wk#AQGg+jp@! zIXdRQe2EXTx^(Fhr}RAMG4qDUSg}1skz>bnp6i;Jm>jk3eibWZTfLc9fiJYOr!4u=@X@#nU6cBb16N`$zc_~{06t#`ogHI>F^(&qoSg>)>ao& z6@vvYRlITz z<>lq2qN0*Ydy%Mo`SRnGlz~UbZ@jCn-oTIA*i5bc`AtuJWoWCZNhhnLtII^-;^w|K z-Cc@b#B&S_4z^0a$jAImBl$$4qyzb>G&Rkyul>Q5rP}-)sg3>B)#4*dLH<1Z{x>g- z%6Zh{7nbLSVgw~_o4tMUBy!gHtf9ze3b`iyEEPf4ec`cpQ(riK{FCt6bLV!i)p@Nh z1e!e5D=^zl?C$BY_+;Btwws7I`XJX5PLSUcHaR-FkCnB4*Ugpr5uxcrd-wa9xJ-2_ zQtp>>I<)qy&DfjUmtXhg?e(~rn9S$T&r)_&+$?CPpsBvkE|*kqR^lYSnWTHv;d5l4 zfdiwTciiCM;QnJ~lG4)jM7#|*b3ej~Py6{n-zU$WsXD$1W)#}VCiBoQ_vus1@rAW# zE#JT6n#U0KR8&-ZrX!=H(^FIP-4}oM_xEE9#;9+)&Gd?TGwFheh{$MNoV>A+?#q); zZnifVU3xN?@ZiBU8=JL-ajmzUGu@?8#nJoy;zX|PAY2{!@?b$D#bpd1m!6SPUte!! zWi=jy%tTN8nk@HC_^g-L`bOXJr9QtSAwQn$6})E)*=_!PM@^K;Lqs_pad>28Jeg?o z6KP_)r<}StTal&5dt=Sj-rim{mgS9(Ws?yTy((;G}C8DCD%ULm)YK#-Bse)ay|&Fad(HI9#^3SrSJTj_a+@=?u*fbdDoRLT39dov@65keiyDF4 zx4iP}`mSBOr1tArTl2GS)JT}T+d}+=-9f!$2a{i3Vc{cDi#@a?Jl5J+A)SjCi|qQm zn$lIUzVu%-wr}?@vFnS8jcu+A3<+7A9oXDsYhkf+_ZfPETN+qKY1irW+>wzHD#GI8 zBFVL;cjO)dthBV06d9UYz7oafK^H*db{_qF{~C@yd7 zMvYkki_|;Zs*$0gLe@4;Uwg>|Qold>QqdO{73uM7t6s-_k&YqSQLLON+Z~XJeZ%Q_ z)f=W*rCnrPrynIJCzq9#RaSZ_D+eSev#-T1HD#!7+qR8*A3r56t+S(JP-tjod7)k3 z2~p9O_wR?l$!#qB`Zdv#O}}vvfh;8@MY>zzy|E5VfINvi*^h)>aQ)lz+_`h-KG)UZ zhdt&7?*#^`5Q#p?$;Q^!*1xBF*k#=MfBg78J5Y^)Kt#2D{VI6mND$rN`1ne#P}O~8 zn8lypohgo`q-x4IklFadDxYXHSzm7>rnR^bu7}A5BHHTGcq!+>FevuTQJsIcMW$ zKcJT2H#!QgH^0F?)OlfO(VU5g9-o}thYRg0wqapmNr;Oh-`fRk?XvRnnT`T~x;+OD zSYNyLAU^)*)D-Lf{VRBXlniX4jkVu>SWVw>+^NU!X$wos)s>a4Tegf%Oq5tOfB5!o zrvL3-e2{<<_a=(R76{Ob7cVw9HwziQvPZJn$tuOKUl>sN9Z6J^NF-KytpRD>TTP=P zVE@ormhH%X`ZTp(clFxIm&dKm&6Ozw0|T>jbF-dF>?SJ28t-Xwd$xoJx?sr7%}vWX zfW3tuFfH%7DZ?iFs=U1X(W3*W9o}wG-jCe2JdRyygipYg12_!XOXlU}Io0iT{xzz` z7M7JsegPaDbC<{{w&`-2AO76b)O2U__8n|5Gc!+PaZhKy{pKMry@xnIKfh1VP}vxH zD!51X=uwpV1;7PU-q&R}f0^m)Gpp&SUKc<(M?I2q4ieXTT~Q%!-ENQcgIysnFMspq zO}~ zF9d~za&ZfkdHMN2zdvgOC>Z^k=&`zB;pw@CcmF-rg{b~oSI5uAmHy%dKI{cbA`q98 zvnkNx{{8!DX+uuk-FENZJz$eMpaLv2wjyo=mx2&d(a=bixhaz9DJ?8K`@7GZ{kS6+ zt8PwC&eZfY`LnaLRXA0Q8#ZZU5wBglrWD48x1H)L5n{bd26p%=Sgri>D7%!?ll*+g zmM7;B_!8pcNT9R8e%Mv`O4xB&dHeS5T3XFoS?W{mdGe~Ns;5rfsW&SxEp0T;MFK)> zO-)W7U}Xh9|Fbwz;yQC_mH*e%i_d;eOl+)92wk}{gzM%zbcnRrW-RZ&6N!tDkdB0a zU_j`yhE$=DAznPa$ZyH z;PhG{FIaF7(bCe=>(5jPpU#U%a^9B~da#!OOZO1RW;!S~I2*WWXPXaHFTls?E~e{AGu=tnBNS5#D>6z^c0 z9dFJGk!x;g2=%2yR-$GUY-q!UWKOA^G8Fs`U?uA~OzFw2)6$-I1>vN2rMF2Bw8jS4 zrcImhhzpg@pF5XVR4zG*Cc>=a79Ta0}KEJaDcmPL3YCIF{b zNh>#yh3NO}8LdxHDo$z)*yziN`M_BqTK?PT-Q2O{8-~VMbC!z0Q8}1bO)M z*!`goAwyM}^?$IXR1LG}Dv=ww%OHJR8QM`4lB0Bm4pb{k+$sY8j4DoDjY642wv1?bBcaqG_ zJ$#4$p&&KaCz0`bhf?T)xuvDhurTl0{!J16f*O>iUTdonoJ!g``eInKSFa?!T*a$} zj~_pdLKO1I>3zWNLRQOb*A{V`PoExHH*or_fPZvntb#+HMnp6wO1n}LSR`z%pXkxf&fG2AIs5Bp zcj+-g`t#?{A3r`hCUEiMcOaA9MDr+v@T8<9U^G1cWevW*N>76^-fMXZuF>z~j$H?& zN9I|m3HM%KxsFb)CYaGcL<5h=_{PP*O4- zHGPk|x_R^FD#1LU!c^KGv;@7SH+a$U9zB|eF5H(cFUK6ggj#F(+IMi|!+l`tio!grcJ2LYCpVV`g=9KXc6Tbg@bcqksh+EenR`%uzX%U71U--5KcUP8v5yXe=!)Ddd;S zaP#qbj5QGU1v{hZe);kxHf;rvJ4$k7i9Mr$etKr+J|-sR>)**AesexOI=Tg=vP$rr zn$7nwpFW`p(RudKUPeYhq~=mqv=TDc zzUXJ)mt=dD|VLqp?|hj;A?Lw@7q>tBUw=$V<%`0v8)OY`vfv0ZIURU985C*3_D?eZLCgy-r)L`)2u$kk8abe8k* zR%x6$2nXH@|{0e}MG>+`+r0YP2_i|p7=a#}!vq#~eE6tw`Il-bk3C}@aUxXtLk4I0?TiPZ@Xg$_M{l>`ZQf$$7?=*+yL6~4HviRl)>}L;FBb6?iZw))hczJNh&U0DkQ`Igv_T;r5py|`}p{L zn3?}Q)AvKd3#sA~%DZq~cj*laEvJEZ_ke~G22a3y{;};U4)K~BYt89G`d4ImN>hzS zz6^{OQ0R@(I%7WM$XDEfl61 zo;hRr_0e&}wPl4`y`2*xrTH#E49eB_w{KH2YH9oV#Kr~dOm#?AD^AR@F>zgK2^OlZ zDVs^PM`^H5cnJYczxrphVxK9~>30lX6|Y~19XLKe-6Q>WlO93|&kM|8mU^P)`0zg@ z>Y7T8qtgxRL+7UGTo3!Nug zBiVhc2lnpWTWI+`Xg!oK5RfWa%K7KJd(>e0nwy&Tl--Sujz)$*#K+fHaq|Wk4{*=Z zZMp0OuEU43Z~XX*r4yWAg~@jn|b8Wp~t~e;ug6-e_DzssQq9W;QI@h z2kiLy`K=F`*3{JG=jW%=-$kS_GBTp4@)Nv5Im02p}^uB+^w1uNy_bhXp92T9$uEhPwPQ&!1b%)2air?vLZSWnENQDCIJFXyNwD zh=_A|1Yo4~r65So%H63kr4lgV9WHk|{p%aI=qZ1+wX7oi$HAi`esd+I{i{=~Saw)^ zf6CyQlAeCm)Rg!KT^m|GWZX!nTLrq${aO_wHHWNDiYcJMUeK`zzvVq5HDKf(X1rmwFL{ZNJ$Sp=YHcrJW~xxdePZm`C*q?sWEVq$+6 zz#>*uWzTtV6y{9MNI3>ltABsIo;K}&w%+)EDS7E{s}>eu-TL=lffj5<1XwrGrGd&n zdNiWa_WRQZFJ9O>I5?a-wW$Z9KM#l=Di=et}-$@+S$=D z)l*(lRu)f($KVQbj+#1nc=#$?SX)!xW_%<#EyPf5jDQC^b7bB%5=s9*KJrG2%>edd zPw9;x07K&9;y_EF-UL{MZf{TlDayJ|cas~F3b(wgpZ8#2$As=CS(!vHd{aJs`a?~P z;-yQKh?~==Py2==!JsD46a99vhZ35g;TAazeL&h?1dPn!{Hr9%ae5iJH9S5Ar05$C zB4+}*egCl!)zxVkSGLd2WIcVl3W7W!AOMO5pc)yfINk3zrZ#HYxB%4w&0|AD!^30O zLt|q05r%;hva_=njP?bO3=YnNIY(VY+lEhVoJvVaK~E3%2LOMm76#Is!}noALR)KVQ}mI;hxfCvAZMRZQ8`L; zWAHr{vtOns5GN`c@z2ss-v(F)WIw(mM}DFe2oA0V&hd>r?)>utm<3$Y3GeksCQPVp zt4{aFQsSe7KyLy`Fz(xjcTj&MnTP%yC6h5hF)}(dHkOev{N({(V`C#4XVlH(0??QGDD(?9Q#Um12J4iOp3Zajp{AA= zy482Wb zipkse&9~FI!ZT-rYD`s_*0HToN)Uf&4iOS49rQeB%~4LYwOi2yqDuy&YiML-(LXyo z`|u&tsy@m#m>N7NqK$-#`kAUFYQgAtrg?re`}geMuV-wW`{cq1y|*q>0QM7YGr;yfSz~DHY;9kdYrVk3Chb!KpvFz1CV{?L*?#~2 z{acGaAE2G}_xDFAbA3L{&o6Uh^em{F%*;{H$RJG=46b8I3qu~~D&*7l`i z3v&f7UtV^@9UvHVE?fvG4pd0s1^WWvlb~5rhx<|pE>|fsniqvKJC1-Lk+~-eE1f4r z52K^GI?tzFH_6j2d`C}=jEbs$_YUP3_#b=0g8CVfs+y$<1lpO-qGynPk=3TBr;(WY zbgveE*dfNyVZDSbCwU;$-+%km4j^u*gYkeOAtChumiP4g5IUf)BYYy{3Gi;^H-C+` z)f6DvUjOBqNZ@3mEDv{c@IrX613P)8r9FBpZkp0h4-Dj8e(U4w>x)$c9QzA`?JO*A4!qmC(;u7c6nJ6m z%UtD3^B8f4`WMj~gV$r*nR_)yAusx|+0@62v9YnyR3jzsXJ$5oxW>zCWnqER95ni1 zEGBbwLnqx8TOUOjh#-tjRzz4>()s7!YGKqg1Qg*XBR80{18tQWorXk)L-lL3qo zWu|;r~hM9Qm)TT(c{t-VBxbI1kT<&Q5pm zF5i;ne$UNWJSnQRb7-(@ByPXTl!cx)a`1t0)V=eanziSISI}CdeTMPG9!M4C5zhj- zFFrQ*qi`LbC7M1sG9<7X`r8${6igF%Q+q^AgUhqI&ZcE$UB7yDxZ>uo4`J*ZKfm+2 zy1HiGX-#d9iNDPEV09$c*j(tNPRYypU%$}8ej0H^+RI5xi;9n5ol@lKypVphrJ${QHLqpY3uR%d3L`0mDz%>EoQe_%B0Wr+9wzS-5I!aVjyau`yj5UKA`t6^%G+0Go zBYF-L2|8DFZwSx1^XK);U2>wM_p<6-x_FUWUt(+{GFtuS&6T%zx8pe-;^n<=Wz_`_ z2wArm9Y)DSqf4X={7b%Nv7pAF(lGMt9z?gDo4WxKPxL}17<}-fRfh0KL1DN%%4J5_G~y*ks?5 z`K3Tx3(IwHBX{5gV4Tt6;X?a?cW4rJ69F*b?aVc zZxlbgyJ`&oZkdCGVK6Ckb90d;J8`R!U+k2Wl%#@MzkXG>o~UbVB#Z3)`)a$p9~Dzl z5|Gn?1%Q4@ccxO+0{xiN_n75to?)>(9%OS5ag5IbQRM3S8?ld8Up&DRF^PKc`OB9w z2x5c#Z0G}Rk^)?60|cfsTW?V{lO0Gfz=3u^R<^R500S-Fq`%iDn`$)7T+q{qTGhy? z2hz-$Gf$D?0dgck@s=>gnQKLmO4d9U#?Jj^p<#7E9B2;1b^+$=q^jXU8rMxdO6N_1 zHbTKUR7m}3#ZeImzGQD#P0hX2{4z2X2zsCu7*j|=UxXI)Cu@e;x6r$iIIo$RZQHsP zPcW2B7Awb|ydM?@_e_C#KU^rlZNJAFufW-~kQY$}b{Clwr~tNZlFR~ zyr>AMODM!vs99)I5qO>@pgG{AK(cgdz15lUp$&CreFEHHpZA6**e1Y(K|6>KSd}L9 z4foW`Osf6RF2IqrI5Ajp^>ZXGi+G`JkG{EnBpITE3`E^w6uOjd09Nx}=3TlT3E)EX zu$R1l{rZIu=8La`a^@g;U|mK{^rU=a_#^CM!g~nd1J(Y3ZcVMNnG!Yks2O+Mi%xgK zRZmPz)M&F{4_12qS^e_|J+?b=KT5rCID|BS3g+#N?-=;W31r{iy&&%s_zPGhChnzou z-l)v!CR9w#d&Be|4iw8Sa0+s8z#?`Yc;5Opgl+MJo`#W;;Brta5?&4yc#QXHDxYqm zc(aj;m2E0bry`)IXOXnO41L45MDfOrUy8x|Aif5B9p?500gnvd)CS;!cRqG3>g(l( zY%Simo{C+zeSC`84EQ!LFZRrJfG_kyXz=d8F=Y3#Aq%j$^Av?S-k*DIraruXe?ZQw zyRA)UEFA_aejy>$&hp{8vuDnv^6Bp;qKB@pt0T(GD;it})(nF)#AT9+b-P-hCmM{q zcklK$DkSWQHotp;NIYzlKJp3$9jLQenA8K7Zy&$zEP5r>Y&>n*6DN{tNAU1KjB9Ia zH=R-@X2itB9WK7fQEYI!@RfzqlB>oLO5;{ni;AK{(Faynk&ckcV>dNfmiBn2wV}SjI>>OSCqimgWQILRl>GgnKDk!yAtgS ztRpLo^`I`q#ERJWcHs;3@bBIck&7UntEtr^-sbyqva=Cd>X0x0`R5-QSy>h-%Gg?? z{HveYy-5*CNrJC>8XNPFRtwDP0i;5JmU>=6;)VAFeE%)yN4#er+Jk!s5QiUy+BR9j zE(xEFt%UepSzq%2eF-R;va+uD`{KEC7TAD8Lk$+|fP2*H@!guD@o-dF;laa13(bg> z9qIyE+ZgDA3Md=xDD&EZ;8CbX9+*#yiT!JzAq_%OadL1t z?lyaHE$AfW-0Un97BTv;7BJgsZwtoGbA{(&mH~5eQCoZdZsU_3`&@@sc$OR+8)`Q7 zv)uFd|FgOZ-n#PUFTV|WR%4jkVBJ|;Tl1%7`LJQATq%t-4(CceWEpzma?~iel1rtI z;J3Vx8Ssl^k(lauSyBRva~Fc5tH_F1#cij*yhjwCkNQjj(OB}cchxcfd-rIWgiqQV zt905L`zPth%U^+=33(G@G6Y080p;Xww-@Ie%F8jra|V(H8n_H)m-O}b?5w?>UdOfC z7_ML@~VDA*G$AlAvVhr3hY7XWPIpzZme@$siqOgW4# z!*}ppN7oBs9oiqN{@`yYCOz+9hoTqIgBxKzyw~n@IuqmfynU9&yYupKxUXQT0vAOHxv+V6C2{TU+ssu{8ytSKvKn^HBYFV<u`XX8FWSU#Zi)JsN>CT{LRt+Ag!#TTaZt-G|N+goiR zBclbuA^?Kcu=B4V(IBqH#FCIa@R_4woCIIdCaEiVx?oBXtFR2Drz-%YnV+ii+w+5Sxi(;0IrtA~AE%CL_QcaF%;|+0A2zgrv_Jw` zizmn}?pO>FK>Y-Oo;sIy+S4OKtm(odL@3G(48!-NuEINk%Me`9ohs>f-PD-8e|gzC zEhSzU-3yunkW^Ai+o39b1gcv{zvANJ(#KXZv%X?!#^nC%*wgInjw)|&ctAi|Emsww z)89iBx9f$gvKxLt5Uh<*MH(7j;sQW*!;1s*4b&p;58MQ_HGuMk&pyCp(Xp{G$|3%K z!{Go12sv%6t7HZ-1eX7tmR7Y{0ov5f|NK+Q@f7m5X+Z~pK){?^(D zUpsOFPO`UeO#spk?9768j0QvO=uw1mAn5e4u&f&su&_Z}RyuXc1lyWd{ZV*SRJp^@ zX`~!n^XV`)qYD=nW(VYvl>i*jMj&IMZ3D~G@UU4c41YtQqvB=CO&>mVh>mDJk3DMs z>yqP4U)2WsUnrum{Ci?6LyZP^1SUJbV-jF*%hs(}4LI?oMMNBdH2^)O3BzFjaR+EP zU=V*cR*ASkegMxf_W0CYKnlbS9u@{NINn|b3!ZrV#)sNkyte@is>r6G;ORY{@MMf2 zgaPreXTd(;n-k4h-(UcuA}pkn_~#cFAG~xTt0#^lU!du=x9jrpJ<0%(cqV$d8q>(u$SI)Z>aaDm+c~-5$@Ou`VTBRZVR~&R9!F zhmoCK4mvz~c1R{&ot+TjQ5w5HeNq<9RVWcf*&CEk3=i+0nc2YB@%7yzmGrK@-Ubo? zt~D|y2Ij*1P$+in_)=fL20q}{EfP4@@la#ZCloFqC=WL`__7bn$t8arT7&(`Hykmc z22hM@gd_y(4#{eFBI_i2D1b;l0Re`baDZ|;4~NHhSt%;--Mzcn$llPrjA9#&R>k@3;d58mNRNFk87ff6J{Mbp)kQdoPsyTLExUJNxg-w5BwbVs^M z6z&cRwc_Tp@uK4}u#w(?UZR5SD@+#oxCNs0^XKU|xUiR?08>MEHwn%u-*Av)5H^}N z>EQ|Y_V(86+(A~fn(KOpP7Zkyd>v?Ud<;S&auU442p$tw0>}Unj}nEOT}0UhV~2#4 zDClL~ z=5Xu1a8`zWq^6;faTweZToW&9(G_Aj9`n|HY&JdlAtgW3j|hKK_^ zX5pdmq)6Ir_VRi*P)ikV0438V=qmk`0kaedU|jgDYkLg z`N0CyU?|+&-4Q#;J=4;e5p*yhls|d$1Z(=*YpoNGeCxZ>Y}!vUKG@ww1j3)4qgRlL zP8K6w+S=kgJfqJHbb;|P0|sFqiMMKfbpm4(Re7HfIEo2DP`Airtf(k_rwy2y0Ee;; zIur0GJe&?`5Zew@K2VOp@T`A)NwzewbE^pQh@SB=I=L{!sV|{mMby;P1UCmb2`mii z1|w+o7G2Q*FfF_TKhfg!HWm0TU2FxmuQ< zJ`6;>fErCO$}i471M#i4w#q|B={{2)lmW0kP$kz-uaYkOy570#-H0PBE8M%j4cL<{ zJEr*|XjhI13a*FFJq@6B=4bmhuXv9OO2JJN2jh^c@;MOTVB4~fw? zuHVjQ-eDG08O5;AI<(&fXP9fJj#zT#z8}35HD9GtY}YqEI*JW+L0|vKD_LZc>H*4; zr~TKmRM=N=Nm&1s5ZoRf(4XCbmR@T5*O*)flH>k*tg(Gf`)GIW`Td3Q+lG=x1{|{1>0$G<_!F7IyBYxl8@j@J>k9(uya$|L{6|D8f26{ z9$%;dpvIgg+au_ZGL5vf3gccPK>}J(vc2u-I4&w0y}K=XdAjoT$nrq-cCTwzPt>?#E|;8@ubCPdVPIwL zv9{Q2DInhDv^H&NWi=kYGV}1j=yl5@;^!r{SP^fmb_nvQl~G@bUXZ(=md3euE}D)* zvJ0$hSwlm#N?+*5Au3sYZm^?iY0U>ZTKIvG-Q?@#LCg@p?`XIF%NmR~>2tzXUk`4Is7ujKbSz_aJiTgv=L7-plIDBd_* zXdB=cLE;n=@2j*;61(kPf=vo06+i`f7wpC_Oql_x7$Q3%{a}DelYOhqapzR;4%O$XsS`Q0&7R0 zLEi#+L46T@85;T(=>nh>WIHzN*lP`BZ4lwLwN{X1Nt-?a{$%ai1)dlKk|!i2V&ydT z)zzmFZJ=EiR>tDvnTY{t*=YL!ap2qmFoB^BsjAakEqUc}g!LgV@&p5BY~xNOWrKec z64DUL!P@~wAh|V6O8a+>+9)> z889mv1k;KcRY~I+QfaiLbNtDU52F1Z60@qgL1K(LeOYkao9XTP^JH!0Kq%XgY{%(~ zC^kg;&R3%aI8w+q`i&DB6TluI@17HkD@Gz)D3~K2Jg6C(8n7uM8?F!lxOv`Qf^Wl!6-?C2yn|KF*r?cq zpv{42qP%;-c~Q~x;8*?RQpCePO2eoJeL5@a2eO~<*F%`ngp`AMqb|EDwAU|m^L*&w zy03+s^6W$50r*{f1{B*Y=vX4f@1kJq8W_|L*!w!>VwM7flzsWFN3r<9MYcVdZfx{1 zK(~s-zr?C>>bf1~m2uyDDtOoV(5k`tqGMl+P+1S;Y^p3%YteMjcqn{lC#U&t^K4Hg zVo;52UW8nsrhJtsCy#>?_@E@0iX` zee@`~9y*Z}#4$RS&ZjA|RWNQi9ooWrty>a}FrpGV1nw16iN>=z0FX!?Bvd~9F`NvD ztO1F6X==w;vE!I&K>G)31S1%_V0b_d`_k?7FF=|_TZa)Uz~T0~x=DZuz(fO#ZU7FF zXSY39xtKH1W02Jx%z)}**>V^_z=}D}a`~*kmAzN5vv? zRasH-UPCExmh<5Izz;eB|4`iC&~q}9ek*`GiL6`VI}VE<5G#OUc1CmO0YgJW-(t!| z%?+(v&IwOa25p;Mt7diz6wQo1o7g70bp}RF5RLt^getwyE4-G6A z=C-z9h0huq9`II$xB2&EhnA7i)c8337{^=K z5ErP->F6{XSTI0WV7owT6op}VXcp)q`2_^F(=Z7GiXw|5STIjPM+Af*+mwj`fRZI8 zu8?{`QDCx};44_g20t-nDVi0;)YuYGHZ&UR-inS7AIxBq1?89zUJQ>P>>|_#c}k3G zlmW~GOMkq-AF;$y7HW!Y3;P-*zUo29x2@%THZd~eL?!Ap&!A9q}O&SX8y4iZp8c4mv zBatg=|9$uaYh^{Ixz>PS_u$iK&w#mD;&z@mc1+8_pge_}z4Da@=Z+maP%ZAUk)Sy~ zg+$U*R@BgLatbkpl|>2JlQf3ihEBn!z(thGzZ%kQ8ptIq@mM)c_3)1$aB$5li8c#h zPGgXF3Y~$R)0n20S7m;_2w@nT4v!L$81n1h9aIzt_x(NRL?A=O)dcf*xXfh{GLI=8 zE$uYc@M+I`_s9Fa=( z_2sD&N**;8mCxV5KUh+tC-P_{JqOB$X2Oi~Z}3_#eOW;ue?i)dbv`V)QWPJrfAZw* zF_}j4cPVDW`~)q?Uo0PPZ*Qlxi9;l-Dv^)pp`fTdcD5Tv(f@qaZ^3NFzh4b!F^cu? zzft@j|8aKn$nY?-`Y0w*aYg~2iPiWRDSapViAnh1k+Nb!DQ{`O2(h%dn33C-W8jJ= z9fn2nN4(kPFx4r>$QX<6p~y*rY?R$>)HIt0C(XOwUb0;aMGIs^0tDO5 zGKdMJag<`zY1nIoX^vqS9TSHDBIt;a2>~)n%gXi;L*b*kc(F#K4Ys@s7cbr$>{I?4 zz&49k8g4x4oAXx@&j4T0y)kY>Nq{pGPkGd_6uJPY7Ea&)W=RB)McsaA!nFPt)0-j1 z4V8tp82s&MZvF+$54;X!YgS47e&nk#R%x_2Em&5>28PP=R%VecA;Ms~5fUaQyOBf4 z1|WD;fmnf2A^uX`;I_1mbCr>0{(g%)1PJ&*H!zi9SeHv7s3ho+iN=S-m z0vwQpkz#$r(FNVUO@ZEF1`>$@aN>e&TmJJkK?2};6^;W?1t`I@3k#yc!UugT5R`yqsAgdJ zFc)BX`SQWUTV`k&v8o6KPT%`%vYl_6wInn}0iQm(h zcEdd$TQk|EJ_~7+_wuYWs)Txy43MD(CXz6X2zH*Rj8H-eL&4YOZw2B48o_gJfS)06 z020J9#5sEUD3CW$A^`pYHCrK8c){%hk8*G@wQM7FP5fL#iJdXxlq{p(ocHaMnQTn+ z2j0;P*0652Mj`|=1h|9h16a9(lJZGTPSMMkPqMRDOr_ODM-fA-%X6G^w^6trJh=mz%)BP4tWkQvhe{a2w?fDnVFxjFQwTKPH91_*Q#lJ2e~08MjJEX zPR`B-Wp6f7cnP~GKJeWz9gK|IxCsGJ8a^;=W_TMRaR8a__k-mp;q_}zIDirF0BhiD zF@J-Fn4FqI4+J*=%n}YO^Vj@Lkm;?htP&z4{{CBpPraVc=*r_)7O}**6?nugZPV5<}3w;o!OF-73&D6zK9Jr?{6f@M$ZnsO%}9Sojf9RziULPP!2c!7dABw+9P~wR4mB9c@4pVO8L;;w z4f(9RqOO*3iHtX4%4ch2tki(Ru(i?4&)0DM!Ir zY4e7It3&Tm(y0hIAfn%~6m|n%-#Y9a6g^vG_$*-rwZjxW#_&Y{!Yl}s_$<)@n(BtY zBy2J$jOl4zJz(2_tpYan<{9!B z+jXW;*rCsJb92FZ_f@XpbP;%( zsR-nRvM?3_!=}1=X!|TpHD<1mbdQ`ku?|c+0~Of6+Jq?+&;@af`bkrbQAe_m3@%5K z7Tn-)?gN;8c=P7A#p4>@c2TT2`&x|K@~p`^`Q#%Mv9XB{T@I#KkVdc}j)R~_(nU}O z6_22wsJBaj)B=?y=I?PvIJWCKE)dN>S_+Im{)elTz{Sr$370thLzroOj7$eo0l$qR zQ4i{6Tx2_ic|K3iy`!;C%`bKN!65>~;Dw64zWEGTHeiJtj*j~1V&M^@B#@1eVpcKe zr;ruH!oGoyHAiErh;$3~=FV^p2o1ZW75aNxiJL=rS)2hfoau>Uu{K^F)Gj*jz~5hu@>FD`no zj4(1^gd;7UoNh#IQ~%62D{e{JUGDMQ7FYvKDT)k)KC%YnH-Bn&18J+V4PX`F4|oZa z18Pr*oI8$>Le_yVi-n3zc>z}7zi`&x!sHG%8-^$_V{;mV5&r&4*eriXow1b)VJN{> z;*_FYtWp>B^o|1-BXhuSf-?4SrxLd>6AKG0b3#UC(R7ZaWruyiAYzZ=Y%yqasIo9_ zRNh*NTz{heXA9y9H3D?P57^i!Bch^^vnnwISOn-`FuIt^fPd>afDD9VwMUZYP^s9oQ7rK1hvW~BY$1(c^JEVBV1GhD7;oQ> z1xH9@SFFa<4bIGHP?F92NC#*RQ9Uayzdr>Zg}wd^0s@)EhRjKeCK&Xh2wHHsG{6a+ z!o^z;%pcQ2RXTJCGokmr1@rJ!kvwtqhSC*v*WbT?UuQCdUWs?P#$<-)f;T91HTc`4 zm?A3ij7l)>qN%C-^71Bv@6L~vNDo3)B=YE)vO|D2h1V%7OG~(S8}E?tX{NOSbome$ zP#7>WMi#4qet|o)FFr|`QhWW6s#hL)Wb1Y=hKcphpC23@<>BNU!f*gM0cK`2?Ka4Z zK*)``9RL&v91#hLDoj+g&n{>}eu2BKqtHUj!C?+Q1}ehn=qO5I;S^4RQGr=DrT78B zOHvYBPkZ`4c2AJ;TdO$4dqe42exdLK`l71gpc;JxgI`_qK7aCc$zuM0HDns$*d72k z*ye#L_|$3u>oJ+Z{F4uIjIg*k9xAw-LxO^~49~g{;9^!7-B@ z6T`DNa)~v#M*?{T>i`#vnzAyqwDcJq7BP?gjlB5v^XE882ab(UbxIsaG2K;?i?fAL z=*fc?f7+hFmUL^K6h}8dSVN6e!+aFnve$bY3TI}9IadyEMud*a;5Xi-+ced)t~#i^ zO-)F-wTQ=0pLFxDQV|sJ6F83M@ZrzMo}t})6L@c>{%PW*J|U-g7vn6=mobj*w2dZj z9M&>A%=i!Zuqbtk;z;W8R=2Zc-RHD#=#?sp8vI(UOM>M2bg0_M8)@E6SFt5~2nBJfaBY80ADg%rW`}|gv%$QD( zy+nUuSb6IvIK}1UZUAmH0L!46K&hkr;$$3?A%?Vw9WOyjA&DUo8(IbhSfnADwY4-Ae_q~!8N8hYwQG0JggoF_$riwT??`0?b1QHip#=C z4sf4(v5-Ab$Xsz4X2A>@nhO-k@g*EKxz1?!G-V%}u|H!9_9$sS0{~VylI}OC4xHws zZ0{jIC7E{^$B@0c%+zViU=sqS8=|+jw>O$vEENJziu<7Vk~+F=5N4tai(&!-HgA2l zVz!X%{TZS?iz7HTIjMMGN3AS0I0IK6w5FF)rPOh%skQiE8_C9)dQD5I3 z)d05(E@Vg}Ow}351y$B*ep3oPD1-(=2r5$AZ?lwuMx!yVQXj6cs`ky`M3P+ecCej7 zdHeb`^y`UJ$O=!%*1!7YiK?6tL zpfQKk5W*~WX6#v*E<7D*M?gH&$3NGjWEDI4XVP5zS$1~g*6dQl7nhZ#?gc;rYB$;< zkC6bJEAq;M7?7VokI=(|jg5&R8^hj)UIyZY_rLwer?ANKa_Pi2A|30fHxgJ1cL4?v z$P6^h$&_pq#s=^#ve>T@gb>1h1P^iGcj|fg(hOf- zJ_S(~@Nhf^w|CFimweO==Ejl!2mLRcJ9k(>;PuU4Jgn`ilvrKDgcH$ZN4sf4$TMJUdDQVtjio^kDUH0;N_8t33B%b0l!I!58wbb zpd6+gBqN+SrGrV_xk2;vf8cL>10xW2HcSe%ip&3mQU~wmMz}oUI+_JB7QTWx81(=Fn6Gz^Vidz>NMl`WVe$Ka zH7RC2Yau-u#B4Ox<-yPy*xS21I^yU!mYZ#_UQNd~Vf^h0pL9XN4V>WVIe1C*4TvUC z80EY2BpzY-c84DNdh?eKrN>g;BL z_u$2HvdsAqIIT*#0u2LgCix^#UTq#tb`vodRo918%4&z^PKPin`iEyziOM*80g4-pR_MBXi9sQO!|&OSW6xt04Yx6kLpD&)z+NufHGT`$>^n+Ghb`AB z;^YY^YY00~(_ljo;Ok3}Kz9?DIngT>YQw2T#ae)YA@FJ-dxFBkHqgl-uX-($cgR}I z!B%h$3OXl-+crtL`F<@YE{-)0fsLKS$rZr!E7Wr6@N`hkI5kd#^3^Jm2TOui-q;>%4Z48R)}HB=>`k_f^o*(o&bYfNz~x zu=Ql7Qj%5KAf2Y+*-UkMIX*npd-BvZ&5}s0dk%$$_BRUH>KIC~Kg`Hzdwbn=H)vLo z0JLe-rZ$$_f9lkGw4Fm1WvhFI0<;shzTWLP*?RF8VbxLl{u~x)hsQi$>9BKH5ikYg zS)V}8aFsJYw8QYt=LJV+>L)8ezPRHLW*T69KevT1d{t-DGd z;N@8}+Q}P%u^>>1iBOtMs1ziySh6l#_7UwGoYwccPbnrQCf*R2pmU4{!urzo*U#TA zyqUHO7ve)mc;GG&??6{@k7>+?(-UEKv#Xb>F$5)29`E`u;1GNo+B!O3+yJJ+_;sMN zs5}-qe85Ge+cwbXh9&L<|3e7kLn zD(OstK3XY4zI)@g3lfWcs~d3^E_NW5%LAaRfx$T@RNvDc(sXQYC;f~=i5nn*dj z;o4IlD}V~1F5nwo%X|#(6Ar@!J}A@3H7j-{uI$%TM@s2bimUq{=EP07%nqY?h-wqL%|<<7By|r;+iInsN}czn>G)15xwh z#p6TLkB$R_z;{bwS0K_4${jA{RZbg~dd{*k=B_g9UMRPEL7( zW~Ce7$UFzKHO4jR*_RFP*Z$2vZEeW;QQf!h?$NdDABz{`Wooz0v24_8&V!I{Iylmp zP_?yguQFN&j~8^EG5H@pd;m0YId|>i#Wh}DW{pP)RJ?F$0ALxvDK<9t2O>_83A~XR zDQDiE!ENE}1MGh7+BJWFD<&^Nu+)%y!glS`S%YU3G_P7BKxsE5L5hlL8581$t$+>z zzXtUL$xB$0yIWqLN{fiXxIRIG@B!JGQ&@;KwWhgw(evkF@)Gk3wBM>yKziZOR5^*G zU8%jz@wzSWsEkfSn;BDw+y#~h}OQ7~aol;SN$VS(F3;e*dAHiIa`P~YJ+#195ndhlk|DP(9E zR7FJzkZa7*JDOGYP7F&f^-N(l;N#ht7GA<9?EL;4LNA*V%EKXAC18%!I}epj`#@>@b4ZO5*TJC@FdmfpPimeRwI zvBno{p`-z;Hh0X+vT>pazizwtw&Gc-7iBIof;Xk5IYBrg-@AKPyz_haw#$Dl&(VbY z9A~yg8UP~3O^a~vZS~52V2i(a)QNo${EkI9RSQuerdRzSORu=at>ZpT-D#50SXCl( zQ|yB%_FtjY5Ory`&eDalUgg>Y2Tq|wn>6X(qeq|yN*;wX4Ul|2;0*{@`RZKDcl=K> zR{enTRzJ%WBcBD0*D*JDs91eaa-!~4?#$#Hd(<;NVN@vBJa=0(*3;8;PUyt#&uWGW zg^IC3pv{;uZ+!)m%4MrIE#4KN-mt63B(8CS`D7qrzE&Vi>-1pLw(TDW1%tjy+qh07 zbw$TzGt+je?iR06NHNx8j@U84?QK#DAwyJ2KV`FpIDZ{E`7vfd$ zC4Br>|E?qa=P8eIlc>|`dn@w1v%bsaV|=CQiX2y|c6>iWY#aYnN*Oa{m&eVzEN!#6 z!666L>&Acm-ZdhNM7izq(Uj>pZu8W5t|^x`A2<%01HmWMrWjTo%lSq7E!Hf&Kgv066tvjN2+y$K-9tQv0-AL>cz>d`wYIA2h`>WG*TL)Pe^4h1A2;(S`+lJ) z0nT+Pw{2lCi?Dvsh*xWEJdyfaSR7R3G2~kE=~Gem{n|~y5l!G>q&LIMJ9I+jv|aci z1ck%rLbPT{X14V4?xquh`aO+bk>EDE*!ww3e+*CQG>g`qr!m760WBya5y89lTeL{f zYof6~o4(xp(p$)kK^=s#1;2-p8Df9p#fxX){7`eYZ@>SuD!`E2?mDD0)y}s z_*sJqyc6{qU@RDV)#uO5(Jr*QE7K5(tOHOQT0r0mKDpZ7CPf`)8P4_bmV{0K}QG^B{##(dpE5LyX43uU*o{Lgw@N?AyN z@isPN$ChT41E3?bccE-24e|yjO=z5JgD9z9WEXi5(5s>0P+pqXP~B2n3>`QkhFjn_@bWU8;A+boGn@p zx(npMK&~kFm`~dP=$tuiUb7L1J$y4$70t>Drq<>;I|nmFPbftbvCR>=MeKwFeN;+e z6tVCkRnn?wKYHZKtS4toE>+0AhYqF1%tG~gV^)G_{-wag#X=p^u_@{ZxVnAes22?x5RSypjmB?4$xN@}mK)R#0 z$)WO6PSxZ3P%gV&GDS3dg86|i_OB#2iJdBb<{=L+GNgF%qJ~sBI$v6`DfML~)f{M| zo*HttSDK^ypES7t|7@3}prrKUe{uZ*e9GCkJ9IbH!pE3P${C=KR_b2eeEq3+L}eqK zVKCVM>H+&9_qUxsQDP~PwETJXQgX8U`={0khaQCv9_6Yq8yBkM$G2a{!~MtCuYts; zlLwuw9^AYsBztnHXef-0jKr7^!HD6C_21uh^-X0`@UXvH>6C+zQ`@r@AqlKqmj}E@6FF9?))YYZw&LlijJ-zdMY#gP3nty;d4olTzum*Eu zGt}=`@TpnRM zapQnR0E0sxP1(l5$9snW*-cqlcy&95VvI$$fik39V!}PZG4y|vrT>F(4Nn)v#)Jtw zFJ2U`zPzoEB_*kPkI?ADkuZ%(o z3d)$t44#cMI7E|;C?YsrY8NKdvyR;5gx?9ip{C zu%se$Gtv$rq9R%gH{^KpQ@=YJ+RdM<`0v9Te{Hz+H+ z%$tY1ZrqypGk7@LrVOmw48MMvu+q^0a-cm|aa=b5NZsGU7p68MvGmR&|V#g~I&7KYi) zB-{5fNq5D>|IP)d0~01dNG+T>w01~~Uje++71125aC57mY+$(ufEE4ojh8F_htb7; z`3rnBKyZ}zOve!F|AP@Z2QO)9*mvarApf#ELHYWvX>&9>tTA`<;{ZlJSVHg)EzuWx8J@J zqs6*~P%&ji+b0d6$l`;c2THD^Z6)WNWuS)DH?*-(Jk#VWw@UXa*=t)w5KRE^nkNYP z@svSqkFc_|T=(PSoKXY1UQ;zd=+k?>m?G|Yq3pLwfv5U&c3brODE{f9-vs1up+AyguzVooUgfl}8BTgnN2?YSq~~xkW_|xN}~( zkbV2M^zpPw*cANO&t@oO8V7&Lx`yg+76^jXmGb5GPjA4lUK=&}8xrXYG@AHz1)LXgin^ z?Y0PuX(ebKov2V4Gh-AZ%ScA!^?R8^d*yiw7`IHOM}c#1NF(I>70fhPLEHc#73*{` zFa@p9F);~W#v$%{@*rv|KA6gHaLH<#nz@rq6@>mAc<`on^nT9eR7%i@He6eAVlFKwYNj(y#%71*q4s;rp3t$=FHI=rdJ-V!A^_s479Gr&SW~d?c}ljI!-3x9t;%tB@+EYC$|h$vIwf+*K*is-c|>hhRrr%sBvJEH#q zsXPKeS`Q4dDUv_q*C-93Mqr**W*hHk=G3W2ey*(Fm;JikWhg%mFjJCgU`L+{3oIY` z%5}RyK0SO`w2@qatgD^UBXym%%qL6bkxEi@LB+N2ZFZI0Pae~hN_~Av(mM8u6@-EI z5f+`mNEq^E`_15j6|XHSdz8)6)7u zE;4}K7)%RImw^tqERx7pucHm7N)Eh+;AP^UxQg?o)TPUx)t6ydU;xrTmGqN(ppd|k z5*{##r9)DM4jnsw%0A{#_F>~fMA!%!^3D14nED)9{Y$%#Wfc_@WE2WkQb`ag5~gY~ zb55w?y-;OC3A~LhxOeY3XFoa??irNz=c}VV>a{-P#C8l%kNM^&j{Bnr52AAhPjz@? z>lNK1=&37mJ&2jXQZsh;2d$QVZ^GYl#+S(%iXxE^}AhyX?|4{^CV0 zq)y7(>8t2esX+)5yB3_D_omCh0g~@s-r$*@TL$)>Gkx;tpP;Jw!M3oo- zPxLoX2|7n;=N+?5gQkg*G1^8{AE@fK`}ye`8lrmUY*8OjgD~F(MapYSP|{UX6958P z7ICzj&lym9%u%?<8rs?sM99va=Pz1xnUqf>3R^gok{HbdJkb9bQZ5ftfd~D!F=AX& z690Ip$j}B)g~?x-BDh@q-_ifR6H;S`6w;bdg`lz_;~@`6(1}Rz_QV&C2%t&3=xOru z^SMZ*B^(yEr`tx2Cf5j)N{Flbff_tr)P6#p#reTpkg3~Ly}ykPR;^i60PxIR1=V7V zWB_BQ@GNM?p628Tr5=z&bX+ppIJMV=L23(f*$YTO6O@(U9myb`z$vP#KCKl8 ze%ZEpNS8*E7#6)ua?R(%1o_b=h40*{HDG{3xIB+J>Ug#~1NcS^z->EvEbYxIqT<`) zVm$~ayFOGN93)OHx0?2wx=&ynn!){s_wVn*dv^MjJVbuO>{Q4P(a-VbsbT=NwD3?k zbC5@eV&M?LJ==Ytu8}+w`09ky`i4GXHQXCCgSZgKd~*g(aoHQQAxes&OnRN+{_s6({BzkgJeBm5QX1j;HNamUe4 zU^+1`K96!=88k$xuWq89-%q!?>T3E+FDgME0$3d)=ML@L|KyPqZ&hlQ{pQL;#HkGI z5Z8NsRL4~iC!=+J(pT*jyN|sM6|Y2(zjb)gfy<`J2NK<+L`bj2{{&{MH7WbQ(#TPP zGVCDJ;Rd3_W<)x%IE@yC@qzvW2FUhu1cl=fC_E31j64?=HL^5esZ108JD=wS3aGL3 z1Mz^`U_XlNS+nrEOD!VGpCk$^`%>cp8ev;YUY6X0T|(9;bQ%IUw6^v-&l{jR&(ZVX zLnO6I;_U#t!99nX#ko?O@I58_f-QIdg`M;3;=1KeiVizU!cKQaq>-a=fypZS^Yb=6 z+kIyYjrlBuCkaa~eVJFJ(O|7lfkDeAMhxhwMvjc?_So{a05_&j@0#u|+Y!<&m~siG z|67tA`z+8|fYzu5PM`RWsV$nB{q?h?RJP=h206`iAIDHo36eY5n?MTrRhu<5g0i>i z$n27@+pDBe)$-Yt6-s;nE(4lIc164!(HU{>4zou(ef#E|onsQUYqNb>i&Q4tDGQ@M z8umG_=+qY}K}xm!wf-G^k8lB@3@%MhP_ku0?{Uf_);$!V6^@$cbR`aO=(mlV1|ZYW zb$7yPX@~QjnK-yaTc`%bIdy)bzIg|B;j>W$hClCZEwlIh!zl*OlJ2IQSU3ET%h`rW zPTtWji>FT}Tj#{?DGo+G^m)(cI}c_-p1xTHy28aWr1)9Bv%cdUr?_T%`_k;QWqB4; zMT03LyYcLuxlPGdWs^>MKQi5xGP!M(-)}maa#qHTAMd1$S=nf}9&JJ%;&)35oWUe< z?%9Y#hu9o-tT=jv2PXndY}ajdOj9wOSz$$I^xIus)U2^bk1`PjclagcQ1&jjIM=ve zS2KG|%CZ_io)=T?@0Rm{Xe5`)3{AUTflP0_F_+Zcu^n<0%K>Hs8pUuAx6-9Vkv+P9 zuox}EF%%?<;mYyZJG9D(GmPpD*3)Bqpu@M@!DitM@Doi9up6y?c3mB68ia#z+^bV3 zadO@=rB&6p(-6o{F1Pox`tC|Sdq(Wv{~c%#O#!u0{QAI}YwTAP+iR9}Gjt7oz2!86 zBJ7`VW?I7NacwO6F(syWm<^)CF_xQs`rLI@4n>Q4nb1o|WXZFb)_8yvBs;AGk))jq z3wzErA)67A&~(sVF)B-eZ$D*Gk0vxesBK$|X zO3Wz1jA_Xddk#8}Ohx6n;TUEMuJzD(pSTDp`{%L&a8b?M`XL?^gNNE3|i?WX*-LB&9Fx)`>OPxTs*bt?Cjcy($ z0JnBsf(^{-kuke!SC+Q)Y3#XfLDTMWc6_h`VG2URJx-|DSP0Xp6Uq&%B-k-6A!vQ| z@?}(Ptk_A*cEOo4Hy7CRrZj+ThoyUD zul4-VuDhehjT?aJV22UNR!r8s3!0a4j_Q$6fg#YyQQ10+kX@n_ns7jWt31-q&ya9_ z?&E-au;B4hlQOJ+f~E!*fz~#kh7s(HlOn4|DgoUR5*)Bk=uns_ zw6ui$*yZQf$>TjQg~~mLC(v3>SxD+=*xPB3jz_JuEhf%B#mlp#v;Z^Q#_z=6B-gw? z)n^e)e%KQ;`1O}{QhC8s5l^v7#kkQUr!l-C@)``APBqDt$*d-e{u~-wIQiDC zS_K6MbCW=7sb&}yEs3t9_4@fw;-G1I4A&H(auBns58dk{2I5(up}|pLWr(Y5MOhgr zxG*Nu30VU8yJU%#429B_6)#)*rZO_N7R%W78Jalta#~NG9N(t;+q&URe8onIOsbyH zSDZZg$`_-(%Qzl2Z9Ax-;)1Hc8ybp)XgFy`&UW??@G{w%{1p@#u9+u$ZFTAHGW`06 zkgPZlgfX`jKl%I-6wnxANQLJT&O}wkH-F`jaMujXp3FzkmA(Qtkn&7yUQ_%K5upI~O;xZ~O247|^epDBb_UUx>1UPX z<(bt1xp-Yx#xKm+BUvq`Dep?Xm)j|8cA4Bcj?c zdS6x#UxXHf-4o>kp^dxD9dUR;(8*=@DOIq(KJFpx-<{tq9S3o`gdH?p8m4(c0Reg( zFj8yQ9FjhO;KRS@g=T;3gP;RcwzR6Ij8e;YQdD#Y&?Ytfw*|W45VIy5_Uf7%MEwFs zs;ODOZk?XozJmuR$h;I=rPy36u|z;|Zg@Z5Ts*kSFD@e}~pJc(1}vysBXb+a$ORSrkfCE)yNnd5w+Sg^fjkDCNAxIn4{MWeHxhTI7 zJ|&VEpDXJ%XtUslzwQ}MH=>daN$J{CKD}GqR<`@vF-F+CjYm4>8LjyUc)W_F*?KqQ9_Uyrx{;s0?(@|#b&7OQv6w%b7~|mBP;J( z_vsH(fBW>WE8(m$n!^HteRML*7?CgoqCs?}GOU7sqIP}CjIFRd*7n{ZffEH^UcO^` z33SUO5)6lW+B7U{0narqJ%~OovQe9k{WLUasj%n}OD)VBYxW@KxqP_>v;f@+V>2xI z97+qR=&xb)7H9Feyb8hC9y``-+AQoNr~<%05_(V$w(ih_B@%8ldcXYIntAz6^4U}u z9Qd4J6V#iAe<0M^D>J9f6#S}n0>_n%YIL}`xU1(Jc6EYkp%Twrc}a-!)F@D}8{;=p zdEvJ#`(aRJN@nJ&EN!Q(H_ruXMTKYFGWp9WjHRhv!uoKalPTFgfO%9d5{tmasKG%a z;Lgxc7a&k4r&}Edxb+8Cn$d2n>w+I?B|?IRu5mhZ`HT@^{fV|bMJu*HXNs~$(f^NS z%e+uF5cuZ4+&ArmM%x>*fb|qW{3}s|tvvIW2hf%(}4T=HKTz&hD-D z-<6>>^%^J-r-#C4zreO{zFgr_s-h;1(HJ(Y1}h5&t~dOw9nx2?V=BSTVvpE=L61Vb zXC(gm-nla;LmU~wCor1{K4h6Bkax6gSWhCSLHFiAmPVv&comkF4HNV?Z(3BpdiCm> z%bJF#KzY`(b0gWR@0D*;86wk$BxUsG=809vL;oG*UZ$?*Hv5|(6N<~W`KbaO9zR5M z1YDSk>cQ;ykwg8SnqDVB!n|`X=X`Z~b?VF+Vf|A2=z#F|kXXWBu+<2{#&c%bRMntw z^$r_2R!!?+W43O^SW8TjZEe}^$uC(47ah<1Pv_?dHma~vhmllH1>Jc4BVe<~C^cl& zc-!))&sv|%x32v=!TOI1sa!j+NqgP3bLUaMU8fQ!_-jZ#IV`}(gd%yniR`z(!0Rnq zRYQ|xE;;u^ zYCx0%R@y8yWzKd{9*Pv_83$lqr4$F*Ky-^V!pmW_L;zkOv*NSV$oLGa4dK|M8BN3mKvRs`2@%V% zVR^V)AW;ZZk1TpJD6|TbXD>~YNPzBLjg)7=@mZELXi>9m6unb|C?5s@`+E~}^d?~s>R4Ky@ljO04YpWoe} zl9sNDiIT9kx-fpB&D^<#=#Vg|WHb(#r3Px2*y?pnLyFwsH2jkMg=GcCHzRw5P5ZY% zqxmFTp?av$Vj}FJIUBjKRX=2US7ECJT_#km7YNM2aP7{>tc6}$K5P-QgL5KwreM0I zYh)BEFDy&>jB|FmeSJ#%;KiUh@dzO_-6P3|FGw64n{yf7*rK97G322Tm?*dSBe&hV zvA;l?C++nCJQBffb+YY{C&;z%k?dZM4GZZKdkC>Dr!oWkPa(TfLsA|P8R?B=jn|pu zmEA8fJjLb3uOoR1r{ zQqrc;X;wSNmU+9B8@yLn1@`ICR8C#t|7>1LW5Y(|f4qE56ErRfDV~_uc@apeMLRL> zl_GA4^r&qg-$!B-$};bTlH~^{4JI>C@`H;q%^VF&;j~ua zWV3yx`2IK~yCJjHf_LQq5%7PiMfV;16B67;En)x+9kehPrfDX*vi2N(A%A3PX<2eW zRYQXh?*wYaF$fdV(r{3*jxgRYKLsZit{)`;NH5kHb}K@F0ah9v1PDdAfVvW$5!+N@ ztbiKt(fP=)5<4jF{Y_7p@-leEVD$Na`O#h#Wr|-0H4;+?fI^6E&}{VS+ZU7xdFi5A zFaeBR&F+T4A9|09Zzr}-bo4OBlnpQx@7}&OWR`(2JI>0A85!`o%-vRD#tqjg??4Q2 z-shU_@%OinceY0Hz!U@X73cxk3%FVmx@Jm=xoqb zLwMuGrQEICtSM7&Imfd{3N#0<4RI#b?`!s<{5Skx%mJgJI6D0mMKQUZa(~6DRqS_g zq+CRC1k6Foz?y}ZIXb?UHaA*R#c0LhX9YX}mw^bu`DDEZ<2KRzw)SO87 zJlMbh$99omx}TUSP6%(rHxD)+Sd*;zm<@m)01nXmqY-nC-yamDyiMWJ4H|EJm9G#3_wE(OG}K3|8N$>9 z%HXZ0HzN=Xmh>31I0!h80*DOB|9IwCiuWD&hx66FTesiZv?1>#U%mPQaD~DaW^T|R zf5nxI5lrg2V)g3I>D{saL-6eXPyfJRB36L=j*Ohyd_N|BlVUU9ndmM*C7 zq2#dhiISMO$j$v-u5a>;1tsj-Ch?{$>yXD!1zJeUpg6kY45@fAT+M76pN0RO=+1ka zW?$_%k@pgwoA03&6LX~9EE&pzKiOB?COqtk^%RUwDXtAluhW3?7ZD!Js zuJszj>Ak(U`&?y;(t&J#;aEjKML*9s`!*>2?eq20dql@v zbEw|M9?`Od1YMnu)laAaYkE$g(3f=1^*Ta%?6L9mb@p+-eQ#WH{aEkufjcQm7f;bF zN%|pN3hh4IP@pd#J}+LO;xlrS#qZWViE&=D&$6)hN!AoC>|WYgt0jl0p|WTiC!s9p zX;JnYvA>0&?)|W1M~ADezL4576>5WC-%TE}fCDYSRr*}iY$v(7`RLbsb5R@jc5)@sSLR-=C_SDkar@5Yqi z3nnS%Z-0Ee@<~UvUu%OJuZg=CUILHNj-U8A^}CQw^5vuZo7$olJ{h#iI>GX3g@tSg zX-Id5lhwu!D{ITI)f=vPHy)bUcNrZ=m5n_Y`v(=fWIHZ4@9TboSV1?>V>SzExa(H% zc&7MjSPylysP!)n@{t*oaQ6Hu5-;HqQ32Qe8=7t7k>t3w0XKf{{U$Wm1_<44Ml%Wu(uB)ZZqmPBIj0L-`=Jh+!#p1 zC_~hC{m0un;uDFgbE1t+#^c8wWMr6YV<)k~&jEYx+9$YVu{{$1FjRav3TE(f4-Q`+ z*yP>}n29kt@)>yvS6rA|uw$=QJJUgpn@j&EOl}|)%zswq@LK@}4`tK{8~B(p z&N`K}1QCs;$thHr6z;nZJydMw(mz5GadR0EAvp9bIAXZN&o7MSGq@68u4%N%eP2?N zLwSQ{fvm8`?Nh@@P7{kRXRw~Y{^M$KS-jgzo1Q@U7n(EOSr-Hq4tTF7oz!IwpYMRF zF*2ie5$B;jbnq$8$~rJ?H9iHekUoiZ^&7=t%7NYiAnD;J7wwT z6F4epwa5Ihufylx(VV$3pZb&wfI*!T*=K#p6^s$9-0Yz;u~rdoK{r*E?qGh$V!?YN|T)cx*7H2n{*d8=jJE{O8lByfZKvVG-PN(~T!jE)q%l z^}`}$F=eBuXUEH`aRp(pUwx~gwE+?-wTH=rw0O zvw;AE%(5!9qJ9_KmdbX3Fu5AqpT@Bxo4?WD56l7PXC+g3pUxuNVuLeRI;-*4TZm~6 z8ucP&ALq}G&eJnGKI(M$OqT(2v0iO1NcP#se`1+? z2fR6S)+aO4&HGfAYi&A0LJAziJld9<%9znW4?J6{Tfvn0GF#iwvK2HtRG}I*zo|<{ zj~PQ1ADQk9ZHS^BrP{^~8<3iFCgYI?(G12G4crUV0eVOu#9yQFQIM3G{jMy>6DLSw zOk(AA1S~;pCNBMkK8yLeiIHY=92}O$H86TvWPf!b#+jU^Er78{YLj6Xl%TJMXD_~`9vSb zCVkz;jqoB+K6C_>tW&#OL=Z%0L-}&|_HE|2xZ*OcS|Uj|?%B#>a*^kco*@r8Q0*Ki{OZZ=~sZ_9qK|y-;68 zYfv$2N-4}E%sg4MK4*@$I}pwT035NkuW2RcpdY>V+(oz*j@jbRaG$5pF}E3?#XX7^ zqjH*Mp%v@~R+)t)LFhv?IoR=LLp|MJ+{I%3#*IX4^&vw!NKIW`j_2Y2i{a&F>j?K20(OiQfdf&@ z0i-i5MVmc)!sI`BlL7|uX0dKH&J2Fhh&si36b7S-JTe*k7c5?^A}_BxP6*CE;`+5ONUKs)r%=K0%~O}7e!>=*Pabe zZcP=O{Sl9+Q@3&_|}h?&M&icj+>{aOe#Z9Tfv>0 zII)A;0`3`?nX%QJr%$UO_2cHZQCk4(!U5zv=?W|Ddu!M%&{HPhkh|dWc|mR+K023< zt+a6rk=_lAt^abjH&8dbn{a9RgjoZcBdRaQ<;&5a!0-tzs&l$Z)<_|dXOInvJQWwQ zkBBNZKcj@2Fd--~@HsdoGTDAOT-+g{N`*IWwFU`N(fvygWffnzjw&sRmt+(8Kvr0^ocsF=7D*@)aFb3z^AS=*NS4UWdso8^j_fQXle^B<-f=|&G(3QKnyT^F9yMRIyhylCmC~&#A$A~2ZE(;Iu z8%ojuAtdyeFUFm4U;t*xD(eI#xr9%KVP0ZlGR}PQv6!1-2MeyWkj8*#=4LpTIWm=k z8Ivcg35Vt^$HUB4a#$oX5&l(h67(V64PEsN46d$txfwI>e3M3Og}I8Lo7pve)YBQp z2IYe$Lyk3m;zWKBi0~2fPVQUeFTm}ihHUs*CprWYf1svc;w;LtvGeow%_9#^;g$oC zQny}Qd5=2tmP>^Ep1a6f-c{&*~LW_Jn| zXm4SkjOhyu!dkXw&s_$AYy2dYjA#))P)DZ_(v7_ciPZnjS8hAUBdFI0?u1Xss!Vqq zsy-@}j2gZEnXKB(v$F|Q_58(da%nXC<+muyfw{5m&c<+S?#fz|i;k(Sag41MLv6A- z)7w!;VE1?87*0ddkOmeBm@Vm0zE;*RLg(~l9v``t(l%@5g6E}$Rnbz15j--soxMD_ zS4NFi_g4C+TW0>A?`73Et8ih`0Nx#-BpF(V*&os2dL3c&Ygv?#aO02h?9%Jp#ZV|T zPk`%y1>TOcIXEr6yLDPC4${zVUcZJiXZ*VGHJb}4$)4II@vjL9FOZ7S_aGA`UE(c2 zdbHGqO^QIQC1lQQb3kJdPMLEJuypJ#7{SU~A`N}$kIG8djiuzt6e^gf?~&zDT!S)$ z%rN9)kl$Xi9j7OBGUVWRO+P~<@11MAx-UHtX*2Nzp2Peiy#-a{_;$CjIZ(Y?#*P+N zKNZ4{k@*0agz?#j0>;!CQYod>6I6L+rSs#1mx0zfDYa8Kjrh!K+Nm<+By}C|0Tte} ztLx*-j&jPgX7%gu7dCWxuZTZE7HW}E(XqtjjFgvP9%C^y)$r8*jVC@lQI;D+?R#Lt zTdFzfR-zUV$m53(J1==h0Rcqar66rk8s6fMA1|Y-bDO&+YY%=g>Ides#2}HPI9h|z zEi%8;${KPpB#i*T(BDNBWyO+=Po3)CsZ$?2UQ0>-$u<2cMi2>|8l zdg)c~{2w{ShfZ)t>vMUwPDEGVs>?~&`oC1lEG(SsYRH%-y-+*j&5=Pt0*GarG;aAd zxIQk%=Pnqrz%*qRoye#iW7Y7cvx0)KW1-203 zs(Gy#o`nG8I*nPwfBMPQP^Z?X_5Kz2Nr1K=*=>G2@1DOLt zkb-L<@;+gKgI3IQ+~Z&{2TV zFp*iNmvHXfCqfVPkgQmv0rG^cH#0@3h*?1>_?m$Og++(WRp9)H4V$Bn^ZfB{8;e&lGaDZ@!a$I?D_7dtJ?AF_)bt;Qg+J3Og&%UyMS|*s zRX|hmJi$}oCeU+LBWvP4?l>C}8CgUR!lPm94sQvc*bq)uJ%l(KaxjwFcm#q&@EjvE zQgCzkzY}=y7#i^n6-=;bkHg}eVMl3*5i4GS4;hz_?}lX2ki}^x?yjUgx2+T|!gK<2 zE1KLRKSpC0A@k!89IeFoY)(#2UfzLpXWXjU8w$&9I$*#e3KibaY@Lv^vu4kBb##nd z^=3T8@VYOrKyQRc*Xh#}F0~Ub`vBSF^bE)|>12R!bzeh_QnD<9gBezAq~Scx7msM2)46TEBiV(BhbRhq`ZB zcAiG@(xr90839V*^+~oZo0Hlk)2*$p#-&Xc2)7G^8LMtS_x0CiC*a zl=JC5ckSFsvk7_$k|5-z;G>Dh&d9y=d*1&Wa>=W?crfzxar=}@6y;AFe-FHjNUqJc^MiF z4FAKee;FzC>wpGGDlz9tAM&C~Oy96pCm}I$Syd2~i%tlJ!cT%5rgoW*f9Ju2FxRh0 z>*zS)BC~n}0kZnz;vx00yCvNDBz;?z$c)l&HPV1!LmB=K>w+c+B__JZ%dTcH5`>rT zDF0FntraDA+i^KHODN z@dCttWb4QbF^2lueC1(eEJz+Vr8`^cB%Plb`6%pbM!IAE^19&bK20jCe)|S&*u#P6 zx61Atp9As5r)t$%qcXQ4ZOLyx(=6^MS$hro+=T#L)<5!lmo%M4K8?Xt@uwY92ox!? z`+mpus7_|BhPNVuJH?LCL%MH_E@8I}LId~h*d5(IduxHdh%5KwdG6}ozvNZbFjaUo zbxQgnVM1IL(q3O#4k(P(GG>vwinm>@CQOBHRlc?CHwdnu>8^6Ek9=RxcGSkx4tcmR z*U&mFo^Nn|*ULJ?8Fgc!7y0TWK~G%n`9MNfek`Z6_tW;OwQro_Y|lt%!HV84oHa1- zlud2v+t2Z13M!NW4Ay20HAyfmtn&V_{OSykuWQYlN|N5I#{F8K#O%b5pBop`KK&rN z@AUJdV79ikede%i0q1h*&K8Llps+~gXn1U&e_Z|?LYL%Jn02kX4V5Sf!Y%=frx0(0 zBX!>|*7b21!B6+`9<2VcMRi6V2a0qWXQfiyd$YH`m>-z@Z_ih}lIAZL&3hU@yOH1b zvF%=0*Bt32HU?O7Pz*!FZT0p2R^x$Akgz}j2>F@+>=`8y+V6vAp2nu8bC~$g%bUfH zIl)x7#|9wUDD@>!WV`U_LE8;=POo4b0)~~IjiH7+ z!uks$77cq7cpd|nN}cgKfcZEOCN%bpM6zUt3a#wN9{=`LloAw)!3Vv2?a6)MMEpm< z&{@J#N?lNbXV1!ti_wW;2eguL6=tcxKi95Z`*H=}0Hk;B%o+Tw(b{~%-nxD!P2FBV z=7sTjd;o0l0ad>S)=6yHy7kW5B2TvV>JCdFAfih0v);^TMHBYC&DYnL9!u>gYg8yq zoU9BN+zSwzc+a{Scp0-eE zAS(XFK#{;k$)r_UWvV8^TzOj_4@r}MOU9dvlflQyfGzDT1K3E@s7wKRn7t&t@gvBX zJZh4Sjz>uif+6CO0rEJ>J(@QZeAq=o^LKh4Fou6pkw*?+ ze}RvYT7`P-$XF1@@pq5Ns!<4mgTT)ydXBvuAO8*avNHJ(RE{Xn*^Z%U{QIr8298_7 zr+=~m43dozxkb^j$w9;<^ z?_HGBj~){kOkP6o%6=0BSx`bO22fT|P|FKKC`mzv{RL$;^a>|~i|V&dwBJo%3FgwH z<{h`(1S6CNG$V$YcW+5*L(R7D+}W%@-GQeJ9zP(n=3Geho&a6|PFP{|_NpFfZy$bh zp5Qs{>|ia^@7#IAprKSA44j_^NFp!cWDHsM!YKIjc6+0(Iqy7Zl;X8X-P`0>jF8?vvy;75Y{S|`M50E5 z32`fleu8KOfe>k$UE6esvT6eF`u-ixUCa$oYVq*+`8+?q?eb+9hxJyYmbiDiUHh~m zkg|wAXeN8&soR+Wl?EWTVGsaPi57;w=^XomcRg(0T*d>>YzVkia_-XlZ_XSD;?Mcl zbW32X(f~|Svo$FFxYrZjHg>GdQCI*b^h!2`+f(Lw8xV{kla($m$G2?R!ZBab?i)7- z{8{W@K79BvlL*4l;J>gTU!x}JGWSRtfORoe5`1*vHCYd3uZR(9%BBOj+c4twJtCfd z5$wBy6PT}WMQ=nQK^s`PhnP(qt{fclkf$Pl=0!ySKhI+7lmva-`!%sFv_g&=aaL7} zX@5KB`oThQtp#znFqz#nGc!UMK%#1JUF33W|AYU;m*~)G>^=e$F=*k1ZP%bv1BS^; z0|3(Ay;}@5O~uIfjMJILXaagI@(5ROfM4L%i&AsHAy0xe#Kyy>uj*Je^`Ci%hOh5~ z84V3QxPnYO00rUvDzhG<-ObHF4a(&hD0{r!*)wPUh|iPClM!*+?#ap*+Gxz(1N zE0)VgI3WDluLIuOM~Z?E53}uwZ$Ey#j!A~(9yGYcuNMN}vMr{p>{2uNfZ#3R*kTS4 zJ}B>L3%dIf>?ATI_I)8Cv17;nI1t@`(+JfWm-Eyp&ydB{!D+e8*fpc|pka*(z#v3{ zP7(;wty@Ww=mQ?#yH}QbPJji{H{4^2AYR$xy77F7G@3F)&2p|@yT&{KA&Rj4fKxKW zB*9s8le|9T2$c7XnO9<6f_t57s5Agbh|#U(c^8=AUy97^jN6pcCk)T3{Pp;5n77?w zVwTUT;wskMUku{LX=nO>>GB##VG*D9KpoIV6bR29;iLALQ%DbCN@Q@{!MOzJrnf8V z7KG-GSkKl=yAwx_9UH>qOH5jXLBFeOJ?vTSU3_m@kM=hzVsYX6>j1bwDkH3O3Yftm zZoRW=AMEVt7=h5I+|@w&&09|C+vIlWeQjNy&-3rpK=;a!=C# zRMx?Jet*A#T3WO|LNA4yEz8c5{Lp9EXR=GnS+A zVud#BW;ef|?M5|}wjQLR@q~$mxOE0+;B;WwzqSwP(P6AIf^#;EQH*DQDRcIHTA`j$ zP+F)QdGNlslghvJ)p*!!z1_2CIcJM_LXYzffRzAPehYzsk57wVf8Bx@b@#`4CN;Ib zvu$makwh>!0UpG_rgu)}ziw)a7SB63;l3W@sx?!^oBGYhk>+Uk=G%W4xU9ruWa96L z#$S<@{Bu9(MERyIr_Ddn$9;1X5pl!&4wdSQf&w6}XIVX)UbRo7PLuAbMZ+M9KPoq& zi2v_DQxOxO*r^5m5xIYi)>}+;435or(d}KhBFSD`oRYt!B`Q3kPZ7q!?ux+H8-dc zhoGOiHo%ZOGD_LrMZG}uRApF%RnJtN0RFrcMm?1tUnahC-Y_WTSpS#W=@&Ki!Gpg* zP#*2?cYQQbgpvh?HbI;;SAL5h0t`7BGj^IUr(YF599nUdckT7%)mFq4_|s4a-kt&d zRSf_P!UHHmJ7;5QiJgOj7x1YO+BFO$8P%4^c+O|Ibll?%!Z{Oh^c0%bl}J{`jM7_wM{bK|ujq;Y{h*Y#y^^Z_ge?QX9s4?-M7WIHg^a zR+sGG@EnN^6eWOaWy9#HKjp=jGLs~5Ntu`5YN!nhaqeO^oBUYT0I7dFEiL)V z6`*>QT>=gM80AvA9+esD0@2pR{~9GbHW`tId1L)*!~j$;?}+-#mYpq|g@`bT5{+pq zISp>;EISm|x9uiAtTp%zZlCXIf`nQVu(D3liViUq1)4Qm!k@c!4yTlYuoOK^TVj?9@p(v+QnYiikJ7RhnZ`r0>mnW$)gh zcHoOUnzLRHLDsM(PqjEXOnB2ou^29MKaDY}J&Pp`G_4$8F@{Oz8#K&d^gdTTWjROd zmxH(5%*@J)W1T$fv3~sMC@0tDCs1kIx)pq&L=2>POz3u&KseCpz*?W1a|J=k|LEqf zh zm#lbX$ZT1qspuvrz>yPFH@@W8&=F7$ z`gJAzg4QQ^y`oK`X)K$MO*jN!tr5F5umFx8f~*qr6ArviaEsTUP;4s{+^~0WfKL4i zk=tbH!H7%WitvElyB||z)BjntW3no2sW&4#)b0h>JvUnQ3^*;{tJmDglSj(z*uC43 zeG7qs7ZMV>nBIB*+?ej0l#JJuJYy*W?->L`i7~Fs-8D3G%}NO@&>3%FcMtcAkDeaN zF=qF+ZLJ5KaBgTc#0s4;3rcuFnAM$Ti<)o-y>i-MLq~m2*0^gMj@YoX<)&gNa+I$^ zR&e5kg8Ot=ud-W!tc>eqDcTv&arL9xQFEUoxktB8N!bIezqt7DsZ*RXEAIzRanH?U z#nWry(4+aNH!h*wrt(u9L`188y#v^lkY2eG6A0XaJP$IY9qhC2pH#2I$$SPbZnetv zFf+%61%3Ua$B$#Im{cG_+@8pYGCyPKA`kFT&@Z6dpQqcBT#>S=iA&zCx|(`LQwN0dN+C{PsBEG!R%1^3w%FQ#7NO$tc)iV zDOT1aHsFHpYrJy$R$H$0nW1!B`;i5jd)5ZsoL2$4^t}dTpB;?z>_ytRZE0nd5jNyK z1P8S~&f=~m$D8VkhDDZ5>&riHWQcJ&IbkBT_!@abCJKf;G7g4!T-V{Ra*nj2Za} z?Ohm6uw|#>(=?YI|Kg^DbYnn8*~6Bw5AuT$UD>@IGATX_i}!$c=H!}VnZt1Qz(5oR zDgVmCrk+hJ@pN=oNMbiSD>Jo3RUm8!TRo#fLUK_ufh`e0u!y1{@doDP zhv5|z?xp0w;{uX~L1L=A3Mo3c+5S6DWWiIcm!-?$6cgoH9}b~@^qgce67%yTR6qat zp((w(;XCeKK4ufGtTsZ@Jlj5KEGKaDG*wBScd?;5$nYv;*dI(I>?a&)&ZmjWsF?;ARFL&e~lZKXvN9 zrkOgV@33#5@{=-H=y&KFFBQ&@+C^YbsOBjoX=!%v+QldNw|5=$&s2(AP#-hpOCDe8ecttA;gWtOiEzMJU~c*lOUvzWov-VGSb%{^gE`@sD65b* zvdaDU`#D5#_1Nw5ecb0H`%*11!O)#?gYy~mfJDd%C}V8Hn#R0*+*6BZ(4;}tl5nZ7%g z#&L(?Gg#-%PSBW`s{6G#&Ji(~l>phI9M%3~ql-5YX12~u%o!TkqX8Rqk}enp$)gN{?!n^)B+PlaiVH$Tgj4MV+^hGn z&A$7t^M}{cNl*pWpZ=@sx~BcbMY5e}-t#)K>*t17uw{bE9v+sqK%ZM|-p%#R3Zv*n z*YjMf%oXU(Tox_5cp+8*v@>TW9b0E$dgG~J*f^1KL45_`H8!`RJn~>PdV8T5I9aCk zrKX;sk?=KaytuYL?mkUD(ug+Q0mvePj(lJ|4pa-dSZ77Wr&aMnukI8Fid&S`cUcyg z(*QqXlowp@u|JN@0s8X)!#WNJ8Vv4E=cNts+r1ln;)G z^Krl>de&mATjt%GSi`0k)~!qPlM&w`j)B7edq>y&tt}EdH}`PO|9Ut=RlVugH2>>| zR!o8Y{pF%5GwyF3vBe0Jk^f(t$bbE$|9^gEpTAnoGzM_*q@{I|(7m$OH6$pAJloeV zn#z?Lg$9lPfwog?gCE~Vp93H#Mw}RaKQ)svS=}b?9svi!W!O9!H8MZnCD(dBB@uxh zB_0l(XRcnYM}*g2PL6KKYW#TVQZACHROxYHqbQJ2u+e4$N)eiNW0WA%iXIk-gCL8Y zAIZu&KJP!6Flhi&t|UfCB)UOV@n)cu&x)Cm#q5a}&VIl?PdiI20ez9DaM6Bi$u4*? z8bbap-_5GDu@`2NL5NXD`k!oer3DK=gMl2#D^>3N`A3qHh89EukAYfQ^Fpc8qyZp$ z%r*dl)6df$k;7>(K@SpJ{=>9{7T%^Hot64)s3eE%K2}{UYUAl^X z%#rpV?<&FIYXjvd2E#PcpRU(U#3`O)leu~;m%k+Reo3i5DkpdgyRMNzSyc-M5pjPzXbV z{CxnVj6_p=@zEhy>1SkQ>*_apm<|a|8V!_VKwi2|G&NW+4eGQdm*#1Oi>!lLozH9g_IP9NQNkpOr^57Wgar@ zgjAY@kTl6qq_!~)N)!^JBuYtW_&wfhIcM*)&$)ls^}T+->;B{0bzkQ=x2)mw`Mh7l z^Z9%|Uy8lpxo(Gx6TM`T)nF@)H;t9-`|B71&9X#>YVursJhB8JQ=-S* z=tVz!I9#lUN8u_KFPI-xT!AkZ29jv)&}M@I?^SN0fZKn@X771=V1BgRn?HIr)U8D& z0s6Mc9RrH&hYtaenzNURs=hE*aimPF4y6o76=x{nX{+LYmY8CND;Ae37pj5KBEH#l z?U_pga0qiuiA1r`Ne9l(PLNwY`1hv0r|=$O)x_az^F+J!E?`Bgo(-Yj1{B70#REPR zyoa$AFyQ1P!9VakL5grvZcx)v#-$dy^wLOSB>*G|d!ZjcrW!jsYN)PmIu8Pn%)`?! zTS?^~-@QAmbBj4=!fZB6!Ny0T5k}`XB1=2Zv@nq3$*1$Sm)1kw^;^pSt*>Vy zJ;wFA$ysL;k0o*E_wN_$F;l8niqv`4>mN#Zwoz>)aUBWcw9^?Vzi-^wI*JmFzUvl? zOej02O!?W+%ym8UUaV9C8iUK}OAn2aV4e^_P@$qhFX>A9_`JaryoN8q_uabn28HM1 zyN5Elizvn~PW>w#SQ4?VXsNWW;$O1^Ro;9}Nj2|*uvh&T!1iE^Upf@7!$FRm#QW5FE0 z-jfflV60R=aqQUdm;sMo?9G%n6)h0Q%&*Dk94AcpgKUBSW);m|p-W8nzYYWRR@8j? zvZvF~cdXJ9eO29f?!~A;+iBB|5qO5kIH1J5OU(At2jE{gCO7@=U9>v2jE`%XjFG@Y z)3NO=-fVqwhD7!+Nj|HHrbhdN6<5-x6XJ9%pJu7}hM` zfACAUEva@ME>R*8JhR39od4d~AiN>bOzv!>*{6@hTUfNyO9L>YHQ{tMy(0wsgi;1Q zz1#PH&TS&$wpk{+fEHt0$(egmD!yIM7IN$E9qJzfD9uP0WZ1D%gnLu5+U6rehyjW? zho$p8FgrCj!KDaBw73#0KsgseDvtils=ph=(PE=ovBCAPY}{6l~5Mx zyw#T3)0wy?FPubsAlAn|FDha+{BnR?BsiI4%Pmo(ynh(=0++!2i>tNf*r|NbNhywx z&WC+mRWf5i^rJML-Bi8d;iA!kPF)XPjWlFOa7vt}i4G{YOcvzTQ15hk2D+!TA{Qh$ z7v^32zHoLE^q7pmpGB6l-{0Bcj7?WvzqI8gTZnbcVfK&-OOWJ(5iw7dFjb?D-;SIv z;DA#T>aygfD)sjMlbRA4@*b|+++jHH_i-2(&=>gyz#~+Wp+ILkI0y=Q+kJNoZ-+ zir^EJ0g+fmGVta4_QGy@#?Z586S4D(+VwM8BGIL22iJ6k9i0k4sU!Nm0ZIp%{c@TW zAgCYhc*?%aUEZOwvK;H!q+_Q} zwC!v?Bg^YppYb82(Q`iL38ezM)q);~j^=dOVdphxY%u-+f_jGc&AQQomwu33k`4NfU;6!3@&w-NQ8>NEBI!>qMQA zBWvm7xzg%bCIjvh5dcOig4bnb>aAPf2ge0Je8DAvbdNt0tJ5EE{cf6&P7z-lO*8S?at=0s%Qcm?orxe6gYi) zCGV!9zsZy|o8Amca8jy{zhF9*A(An!smxI0`K2S3u(rw#O;+Pgvf(m#mJLAR#7Sfn z)20b+gx8l64e)xPj1TKZ%7v}ES54thQN3_EUd3TsxpJS64>L)WpPwPb$Vx}9%%FFg zC~5LffieZ2w5(^{$-h88$xZh!6RTyT^0%K|j~miok(*;-of64qjAq?OwsDhi;8vhNwjcICud{-#$7)$j&T?h#j5#Zk}jo_k3H+9>r;Q0=0B>?p?p$qeqXB zrb9|WCj~jp{w0Hhxm^*Ls#@|T$^wUil_I~t(z5Z+{we` z3?f@5=5P=TCD+~kSi5%lx=EbIu57ku`6RIhUUU$=hwiX3jYe(;MICW_vB73Uu;PqX zG89@{^z1aX<(1tr+KCp@b03G0_eUSDdH()WC>J~ZHIsjWc7p428g2IW%qH3}5~|(m z@tacj!-de-*1M!*ae{!HADcjF=3LxqP%KEieg_(kk8iiASxbX>pKX1$3wKAL?LiIAl&w#mcw4?t=2*W7P+6!@Ukm(*ZU6~xO4aJg#!+Q8zA)n-e<4@z?s14Sdv8? zptLbytEZtEpdf2Tqn7v?xK&LwHpamOeudIYv6p5FMICJ*YVd~;z?STge*`*#DCN>6 zcXYJH$^1PlYdEla?RUWiauu|#V}y&wc~9C_sskbv-mh#Xc=Gr$bnv|*7gkN?qN*+{ zODkLdZq7sRY!Rj{_WJ?4ipf?vE!-eVV+g#`lUd8AYRh@E~ zq>+^sx+1ZarIq?NN<_ajM(vn5nZW2PIVvzP&^{VqDtPgv2kq*p!|$NdnPz5oc)-FP zZ1lF#8Npa3HR#Rjxq=H<`<(*@4}=BM)7} zRd7wCC8sxMz>rFkod*&x}(wp}XQn+f=C4JAbII zo_pRNf1Wp3&hP;B>KFL8MjhJ-J{^xPfHE)~mEuG*HQzg8uzuF84u)oc*;FEA4xC!x z<<$%UgcB}ae2|@ulwYhC{{Gi)7+U;0)Nt_^I*IVeOU&6~f3hQZyw-ifvP4X&5sT>0 ziBT_H5}3jUXlSF}(!=gmgLG~xQWM7ZT>U}Os0%zkWKqVEs>rQnAa`JbhxhIsBY_DU z2@FEZfck#`7)qwePe1*%^Ip)ob4WZnB1A$8rX<&rR)%K$(@xN4C@qoMvIP*92doEP zE5p1F`n#$$7x<%u^h`5`&Jl?;+@#|WcWim9HlxZ83l4VSD1EuX2Zejq890y~^Ys)> zYKCWKMkPOb^cnbqUq-#&$ZqW^BDkxk~e{);CDO!mYf zTE^!Si^F-?XU8ltgR`Pg+q0*|lROPwH`X=WDypeWA5CQkVNi0A#<%a~qMpu;Z#0im7%l7s7De;WJufT-CmGic zb5I5-4nxzLV$5Mz*b+UemH}@%Zuo@V?Or4C#r696RZ1CUjO#C6MN{=Uik4t`hiRNy*eD)fcNOcrU{Kzf0+L7Dvr=O1L5J)-xNG zVZqgQRL#+d_oL)}`&Kl(==fje@dvB=`ry^HK?<9ol9!hW&x*a+p0bqcn}a8*fiOD< zTRXZNiHx{Q>TE#^ead(ec8s9~f0g!vtp$!~IT;As%SF|%|~XO3|@ zR8!2xu+O$MdeJy0C@60!nsNL+L^rFUdj%{4^9b$)_waPs5RM-Wsz2skNT~>TgKdl) z-xRNBB~IH377mz}Ve~R}>e)wMg28JZIS%oF)dTNZ`SK=aY{JQFrzLu`R$Ep&@aJDz zwAjP$xWR+lv>kBxF7XCm{mkv>O6(ty-vJ@Ce-5WJJdhS=Zd=tuzO8(1o3s|y2X=46 z>f;MD#T9Ly z4hICxoim4l5FvQZYzn?Z{SxZUU?Xfb#6QzUcp}6i=HNmR-)O%HPB5tKEK^ABoSjX( z)=r_`@-+27mvZl(4!>n!P`AqO2m=TtB$CsV*Bh3Ii$uf_JtH6O!7^(Mr6MAPE7I4K z53@1tmC9)wN-S>5xs=Dfe$L=ACf0Po&aC_f)tD{nJ@}$SgM`5kd6^$Ohe7`mb473RuHpu$1nR0QSwRFD1M<&($0RM2L20Ux)YQ%QmVsQf<9hI~ zh<3aPTe8?7=T0m~P))_^hWJjD7mP}=i>O^YA;M_W2A{{va2ANZ5C`x`7123ULK3S( zrf;4tq(-eecGMi%qDhmWuhLGPY?x89?N3ak;5aLlO7#$gFmKEZVKY;VElOeh`M)6$ z{=_{%i|s8=J&MTaiiGK#Ha_^eb4eEQhI~NCp@`VNdv`BI#wF@xpi}3uge{Yhlz(#4QX0f-Gn20JpAd;)4P`VmtU z?Ajyvj?8ftNGw?*d9O$G&~eeZXiG?o?ufw{YDAeX}ck&Y!E6^kfL*J}0c%Np3d8%)(@iW@HoSh4-r z4ulFmddt3P>nR(?5>Qm4^+2E3!q*O5=CVmd0`Q>mTLYnM<= zJ%;AsGId8>)v4XNy%arr_ZCqQ49RQ0abZ&PKNS@(m16JWd1n*@5Hj*JDq?Vpt(Cug zoX*4+G0^FB=dN7~C`A}z#^$76Xe;ce&81x-(TGXw4R{BdK49#9>5!5gJ$oPcoGSzu z)ZuX!D2@1WbdNrh>)W~BcF9YgaUs>f?Tx|J>_6tlR$N3uM@VkBTq!Bs=+!}`MtF7y z2M8=q_4M>4&6~e1POOb2P=jXyN9pH8o z8Q2$UVBz~?^hu)pq>1xYdXO>8m`VMB-8{xVNg?{GiI9fIs=wT@g(GXfXwi;?;?TLf zBexn&XhYnBE$EXcSI8$-;b6Y#D#N@v0szuFSPVPPC(@AmYc?dJx%2VKAsB%!!^n{s zLm6oVIL4`t?wlx*aOo0kJ8Xy{j8ty!P_PIFu;u`+1U)D1yS*b z^r3nYJ%D2rH9rUVadvi!UDUA7_kf9!s*KllV;kT_e**5G3JYc@Vy2>KX1b9sfyDNQ zch^8nSIjm1uFObrV<~&Kqed@Zs_NFtn-;kJe{jDHVd=&OC~;B|mZhM+O4UG{&Yd5V z!I5MzJ4^nzWqRRkEr26H`^tpJR9pnx*sx?KsYwN(yioLnkLog;9l^*}AYAdjKEL6! z3$hK&dv*jL>^F$lf0H9YAAdINjb-9@(m%o!KlE z^Mjfpd5PfBbn#otmZ}P_XmN*S59k??7*|$S`W-n!`CrmRrm(Mvlx6|TOh3S~@O;M- z*I&m>V`&%SJ2yMOIj6ZSz@G4hukb0GW@+j9>7D)d_IbM{<8LyGHf|0_ z)YnB@`MzCm;{W?>yGGJKjS>$%%9O3-wrq56jygRjXE1n)vR7LyW{v+#Q|MZR&n3Jk zSp{8Ru47y|AA$w4$Dp|xyd|?P=ef*fU5^!w4*%1dhN5N5v64p=pgcF5^9)Q2>Y0A@aa7SjaGo zpc1P};3w%ygAa^Zi~73AW%Iyp);eqYIZz3qS>e~&zgSQpc2&DBjBXek-!1RnH@U%! zgHt)E%sJ3|9)M#r*@;Iq$q2n8O&;X{jZyEoV%22x$hJ+JH+RLQdd-?edhKB^c~9-1 zFF%SfslFUG)mW#$c+juL|ESsxUZ2a+pjzo;$sEBO%$&b$r`u|I+%1EpZ0z3lMl-{6 zo1$sbmKcZ=9*Z`mas-Bq$rOiEH-M?oeJP}E#b<)T7RJf|GPpyL9-Ax^J;BjoW>nG- z<@WY3DUpe*wAb!c#j?E9)cP;I?LPM1(Ot2vg*FV?sHu}C9qzwi%S#J3(u?vLmY0#2 zy2qa(TZvr3q8e@@qjNixjnGCl1npEBj(e+EH3C!S=)n-fd2x=^)vvIBWxk&sn);Cd zo6w>r)sItB6r-@aWO+rXH`CgjovF4lK7YSB|An^R@PXCPK1i&-2IImD@_@HHiV_|r6AE#x@I*m`g9cdRYa%2XC1{WU z;JC44e?4*}k3whk@TRxEP&Gi&al!VF6P?opv&}UdJeeoqsXpZIU)S!Ht#T6i)NUU% zvVTr2$9R5$zXKul)wbb#M_IPL!zLEEW+4xTcA+}}aZ1f&C0L-p{~U^|{HK+FogE(B zD^h2@n~A@g&GRI^Tgt$w-t61+;!7Nj`v+ITG@$q|d@v1y^h4qGpI|X?VzG{XBqv5P z0yAG?KAFV9_rhkJc?TM0WCUknS{eDXvtt-&iLmzd`G;&g2g<}`89f9yT)S^yv>xbZ zLl!)8lFbUdB{Yb&bVkABzG4$b&yI_TebYTuJ2V#TtJ(0un%Q?ybv3QdgO+5#Kj%Hn zM}Q3gbzVE1l@crpZ2+&OgLQIG$@*z`|1A$|DW{P3@dUj~qz{?lAbJSLbgalDA3O=Mgl z9t)I?99=anVv#QvUz`iXmy4a9F~z;Wnm*E;{3Z_&PdiU&A|9ULJ9OoYR-y9{qecrC z@4m(#1ib8x{mgwg$`>saochu+Wd8$nUHdP zG+_RZbU5(4BxC*I!-e1E`t{6f$5&W7ta+xr+T3xwDKa)%Vr`o^s_$)e0ZPs8v(l9R zSuWnrxvgoTGne~E<_*`*aL$h_1J0*#Q}Y~wt1ypZi>*B@FW9B-K)k6`t0c@mt7m^Y zG?W~l!^Swu{iM!L07*1AHL1$<^J^G)DNF)xx2NoMU85F|AW3u zY@hjiJ4zJ0Nm~ibjJ5Y_wmIPxmpJ8vB}0Xn9wy!I#hg#vjS!oYI0Y=uoLg7as1KIq zdh<3yqtNUNru)`9oDa;*_D$Vgmm5=27593egFe9Mkh50G>}@mRmR*$8n=X)iEy2o& zKh*Z1Zl%A~wH|=a4!6Xl?T}92|CN+{TO71uK2k+0ItCEPL+gw_sW$TEbz1Z7H7F-j zjlb|JZM}~-^E2=uqB*U%dK$k3%1ix;>bHya9`^dbM4A1+*!w6WI|BW`z2(V0%E7g( zx!clT(~X>l00Lo5v&1I>LWhA(yCUKfvNReJS_iTzPSgi-$$^|Vl&H*nVOxJ-e{w^R zs$EKItGbul+&{dWL@9L0?NK^cnq;Del!|8ZY@uLr8%_C9L)bmO{J_59$KcloTLMWUz>6 z-PH_ttLs0&BUSo=3qY~Nrf}4V>?OgL8Q$kH7Io6(d3tJUYGi9hXb|~uethv^l;BRv zLEVM`e!^Yyi2Xq<#nGKv|a`@XE*6h`H9o)U#A3>nvP8MC65@V;f=N_Y$v|41e~ z{@ZWKbPzys-BdnZjPOGVqQ;YNgGP|czpu0TjuHY!^j1E}p$ojE=!02x$S^SKSD0PE zI7C}bWK^M4O1v6uc4@J@5(Iu0k%C{}3$Kbv9mG6PjOM7mA!X^7BR3~45@54(qU(_< zt>;(?%dRJDX$y=`v6mN#x0nz3rPxc`WbDc2s%Ir7lO(esQ4sp8Bu2##tAL;xSZSb< z`{}2jdLIDnyz!y}y>Am4a7_VvYneU1lWK+-@L~R~R8Vti)cd64A{`MikYNW`*UONX zGJ8t0+zLA zx@c@0A6Ace9YZbo&B&yBmUTQt*ChsQap&SzYbbc0{6~8|eefWT8_0cE>?NHtV#nT# z8OUvz5&%C}NNGUH2TGi-W*Ba> za>a^mJ9fNbBAM(?&pP6ZPUD*Nza%lGTYjU&%Ty{jkSyWefayA%Y;h$X2Q{+~J?N@< z{^b*e%DbwBFV}fgU{^J@@se2=RulqYz%O&#dPpT~XkieIyeE;-$?#Ua6>v$d<)8w^ zP~F)=pteG9>vepH-C)c?31E~YGQnQQ9YcAE8Rz@=uT~68b{XR5fA}!l%BEk$#$a!Y z*7`UNTU&$fZa?0?uahEDOqEmZ^dE&25JK13U7} zd-vWE@pw&oMQ$X|0E9EXSi$KWEEkZK6)ToFIs$vVEzXyUDEn-gLgklX+ur*|WmVN% z42IwvOZqI0CYUNK+(5@^Mn+r3ekFbRO%4u#g_ec}S7E9I3yb8X4A`Juy@D$krKX|j zr-}-hBEzAVM8+{!>_tP5&mdLmh(=TLX=V77W5e^LGp0|E2DIgo%341XH3OW5g9B6o zUIfX>d`~%j<=fNr#b69;-egberyn=di$WWejNPJjAxwS0Y@Xr%ho67z#+#y4Yeu-n z&frTt4K&M2-$))zC}vU^p`f5Gf-^&YrpI*8X1j!63+yE?W=3#mHRn^c51T zqegG2*BVV4Ki0yg7#;_+W7-DxNaGhFWf8zqw*%+fN7ZM1-C5E<&VR*JiHrp-!mFHu z{1^2RFH1|cPBXI0LXTMtJ997ZcL-xysj-^jlgsM|3c0QJ?x)&QCH;pE#Zo{_{o5oB zGT89N_q(d<6(dGYkqAnMI4%|gb9%u$JRfXRUa0yWDx;N}81@!`z_RJ?{3BBk0nBxV zuv%P>Jjay6pPrJoj>-ArU0G=XqxdY#mX(s(0!OSip4nbqy^a_iRSk+EA-Oj1tE0n2 zBdVNEzxKjz37VI3Cd($s0hM;zqGqNmm7oa&Kdqk3pTbmzUG$^<`j?m)kaY}?J9jSQ z!Go#B#%$ShT9^f@&~I1Hj#j1K;2-GGxo%?K*{Y|G&K}S2ddRTeeMI9C6m$*9p@sQ< zs(XzoN2;hTNI2U9Oaebb5Je3k*;6{GuUu}(?QSB}OOVsR{^VL9q2S%f5e|rz+z+b@ zmDiiH0MeGZm_+j&|UeL*o= z@rdNK7*~Y)t{7!W_2*19GZRKBM`@ceQwB%kn3iHsMgaVhwj&1jCnpYoV7|`H`xT&h z)24AmS;naaJ~m=T1zk2|*jSB+NT#*BJA8E6?%WL zX$rSW#57!V5ww~&pFDBmF`Em>wn^aR{5jKS27s91anKJ`n^ng|p!4|m(Q5)Jj=$0C zGPM_V(Av$pPA5lmv^g~(Ogz@0e9sX5&|vY1AeHYgpU83q00YDPPnDIOnAZm}M_9%A zC`QQN4%b&i{PVkllF)NeSs*u>%#sW(tFux$?_fo&fwkm&!MQy^v_v-xsC{K!MR!?G z_UG^=c*ryq4E^2j^bkk`gE3PH?`JxHzD$;azcyYn5PIqZ7wy7c0@pi6_0m~dB5EHr z&O+<9D@S=pyKVWOWx2Xf`voMc6O|c7et7fdi7=tfC)d!js+9&2k^`7(=MTm}(W(B#KQfvBhFF=^?*XLAseS{PfK zKTQo&GB!blQ8Vs&*G&1P8`XCGMviSX^<$;9Uz+8#X%|ph(iQQ9({qrl#7xH0dJ*R1 z9HC!P$UG!2)NjAXBg!e(C`oeR-WUB_pgHmUY_{D6~2HCU5W4$JZ3$=ZUCW%-|I zAgD0ya)>Illl+8*)?aJ5B{um{NK*S5rK@Z)ug3qR#A|CBXH+aPLouPDn0;vt)?-LW zmcrQpQBzNMB8Y(SVJd!ns{hjY^T!I2ExitYW&rPZ?vxS<`)O%GY`woQ`yJ#O6%P~5 zOxf9?$t)>ZPbdXY{9023mQhGUG_s2`-VUUoVBhMBiUcY;ygvW(nN(|@I{opY!jrK8 zvJ%doQaS96Xfa=SkEVg}!p)ASSs|tRV$}_cH-r_tQraPQP*XKisS@MhlL>RcWc*Ks zl#fFo=Zm~5D$*tZ6IvUlRsW*AOB)+{D>>q4orbJ@o_x0Q0xBJLJZD{2s@~%E(nPgd&a9?O;@E0sj);4j4!GlHR{ad!WGofB@39O z((y&MMjZzP@GwEBZuRE>W}lD&c?Hp;efXcoko7H8pUDO%zi_-97u{`7ad$B#Gqb;e zf&VCsf@98~5AJg+C}`|kR=zF4*O96zF53lWLplG;G64^aUzMNfneC5}Ls4gMbRI{@ zB9xOlxJlUAAarCGIf|Il_wOS^LoL{`=j%I^m5}t;G<{sVJ?;C;!I-(~OyYG@j6|GG z>(3-6;v3J=*MgiLvH}66OMqwSDC+Z~%ILb^EQDQ-Q=D2?}+8FmIL)Kmyhn{sJ z-0IH4U|Dly{bOJ{`>PwjV{Wov+h!F@zTL+b-x!Sr{1u>x`V-Zm-sq*Fk`&bcg65a} zx96P-P`jGcIyyvO^(B=5+0f?y)ZSoYCfOs1*%AOVBVCPT5flt>cQlzu0H zT9+W<1*)^>o#RiKf>Ac@>xbSXBP%P|d-U)?#oo7X-$EaVeRIg0I&^3$N1e-a?04lv zKtLD2w0Ffp;yWfa{RUiiRWn3D@DO9TKmJ%mWraYP#0Sn)d_UY9a-B*LR%gUT?~L!z z<1;8N9FZxZ*QF92

yyS{`U^9^f!U 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⋙&O#3nWm&;=Mt2`VnPFAa; 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 d`=3.9.0 -aiofiles>=23.0.0 -certifi>=2023.0.0 +aiogram==3.23.0 +python-docx==1.2.0 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..52e486a --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,4 @@ +import os +import sys + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) diff --git a/tests/test_bot_helpers.py b/tests/test_bot_helpers.py new file mode 100644 index 0000000..a29010e --- /dev/null +++ b/tests/test_bot_helpers.py @@ -0,0 +1,41 @@ +import io +import os +import zipfile + +import pytest + +os.environ.setdefault("BOT_TOKEN", "123456:TEST") + +import bot # noqa: E402 +from rep_to_txt import generate_complete_project_structure # noqa: E402 + + +def test_zip_bomb_is_rejected(tmp_path, monkeypatch): + monkeypatch.setattr(bot, "MAX_UNPACKED_SIZE", 1000) + archive = tmp_path / "a.zip" + with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as z: + z.writestr("big.txt", "0" * 10_000) + with pytest.raises(bot.ArchiveTooLarge): + bot.analyze_archive(str(archive), str(tmp_path)) + + +def test_archive_structure(tmp_path): + archive = tmp_path / "p.zip" + with zipfile.ZipFile(archive, "w") as z: + z.writestr("proj/main.py", "print(1)\n") + z.writestr("proj/img.png", b"\x89PNG\x00") + z.writestr("proj/node_modules/x.js", "ignored") + text = open(bot.analyze_archive(str(archive), str(tmp_path)), encoding="utf-8").read() + assert "main.py" in text and " 1 | print(1)" in text + assert "[Image - content not displayed]" in text and "node_modules" not in text + + +def test_structure_of_missing_path(): + assert generate_complete_project_structure("/no/such/dir").startswith("Error") + + +def test_docx_conversion_in_bot(tmp_path): + md = tmp_path / "a.md" + md.write_text("# Тест\n", encoding="utf-8") + out = bot.convert_md_to_docx(str(md), str(tmp_path)) + assert zipfile.is_zipfile(io.BytesIO(open(out, "rb").read())) diff --git a/tests/test_md2gost.py b/tests/test_md2gost.py new file mode 100644 index 0000000..4b2d816 --- /dev/null +++ b/tests/test_md2gost.py @@ -0,0 +1,105 @@ +import zipfile + +from docx import Document + +from md2gost import DocumentSettings, MarkdownToDocxConverter +from md2gost.cli import main as cli_main + +SAMPLE = """# Отчёт о практике + +## Введение + +Абзац с **жирным**, *курсивом*, `кодом` и сноской[^1]. + +### Цели + +- Первый пункт +- Второй пункт + - Вложенный пункт + +1. Раз +2. Два + +Второй список: + +1. Снова один +2. Снова два + +| Параметр | Значение | +|---|---| +| A | 1 | + +Строка с | вертикальной чертой, но не таблица. + +## Список литературы + +1. Иванов И. И. Книга. — М., 2020. +2. Петров П. П. Статья. — СПб., 2021. + +[^1]: Текст сноски. +""" + + +def convert(tmp_path, text=SAMPLE, **options): + src = tmp_path / "in.md" + src.write_text(text, encoding="utf-8") + settings = DocumentSettings() + settings.auto_numbering_headings = True + for key, value in options.items(): + setattr(settings, key, value) + out = tmp_path / "out.docx" + MarkdownToDocxConverter(settings).convert(str(src), str(out)) + return out + + +def texts(path): + return [p.text for p in Document(str(path)).paragraphs if p.text.strip()] + + +def test_page_number_field_and_title_page(tmp_path): + out = convert(tmp_path) + with zipfile.ZipFile(out) as z: + footers = [z.read(n).decode() for n in z.namelist() if n.startswith("word/footer")] + document = z.read("word/document.xml").decode() + assert any("PAGE" in f for f in footers) + assert "" in document + + +def test_heading_font_is_not_theme_font(tmp_path): + out = convert(tmp_path) + with zipfile.ZipFile(out) as z: + styles = z.read("word/styles.xml").decode() + heading = styles[styles.index('w:styleId="Heading1"'):] + heading = heading[:heading.index("")] + assert "asciiTheme" not in heading and 'w:ascii="Times New Roman"' in heading + + +def test_lists_have_single_dash_nesting_and_restart(tmp_path): + lines = texts(convert(tmp_path)) + assert "– Первый пункт" in lines + nested = next(p for p in Document(str(convert(tmp_path))).paragraphs if p.text == "– Вложенный пункт") + assert nested.paragraph_format.left_indent.cm > 0 + assert lines.count("1) Раз") == 1 and "1) Снова один" in lines + + +def test_structural_headings_are_not_numbered(tmp_path): + lines = texts(convert(tmp_path)) + assert "ВВЕДЕНИЕ" in lines and "СПИСОК ЛИТЕРАТУРЫ" in lines + assert "1.1. Цели" in lines # нумерация разделов идёт мимо «Введения» + assert "1. Иванов И. И. Книга. — М., 2020." in lines + + +def test_table_and_pipe_paragraph(tmp_path): + out = convert(tmp_path) + doc = Document(str(out)) + assert len(doc.tables) == 1 and doc.tables[0].cell(1, 1).text == "1" + assert "Строка с | вертикальной чертой, но не таблица." in texts(out) + + +def test_cli(tmp_path, capsys): + src = tmp_path / "doc.md" + src.write_text("# Заголовок\n\nТекст\n", encoding="utf-8") + assert cli_main([str(src), "--no-heading-numbers"]) == 0 + out = tmp_path / "doc.docx" + assert out.exists() and "Заголовок" in texts(out) + assert cli_main([str(tmp_path / "nope.md")]) == 1